aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Alc/ALc.c4
-rw-r--r--Alc/hrtf.c527
-rw-r--r--Alc/hrtf_tables.inc1685
-rw-r--r--Alc/mixer_c.c6
-rw-r--r--Alc/mixer_inc.c17
-rw-r--r--Alc/mixer_neon.c6
-rw-r--r--Alc/mixer_sse.c109
-rw-r--r--OpenAL32/Include/alMain.h6
-rw-r--r--hrtf.txt76
-rw-r--r--utils/makehrtf.c2705
10 files changed, 3492 insertions, 1649 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index 77316843..48dc3a0f 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -836,8 +836,6 @@ static void alc_initconfig(void)
}
FillCPUCaps(capfilter);
- InitHrtf();
-
#ifdef _WIN32
RTPrioLevel = 1;
#else
@@ -1034,7 +1032,7 @@ static void alc_deinit_safe(void)
{
alc_cleanup();
- FreeHrtf();
+ FreeHrtfs();
FreeALConfig();
ThunkExit();
diff --git a/Alc/hrtf.c b/Alc/hrtf.c
index 31321101..d4c74c0c 100644
--- a/Alc/hrtf.c
+++ b/Alc/hrtf.c
@@ -27,56 +27,75 @@
#include "AL/alc.h"
#include "alMain.h"
#include "alSource.h"
+#include "alu.h"
+/* Current data set limits defined by the makehrtf utility. */
+#define MIN_IR_SIZE (8)
+#define MAX_IR_SIZE (128)
+#define MOD_IR_SIZE (8)
-static const ALchar magicMarker[8] = "MinPHR00";
+#define MIN_EV_COUNT (5)
+#define MAX_EV_COUNT (128)
-#define HRIR_COUNT 828
-#define ELEV_COUNT 19
+#define MIN_AZ_COUNT (1)
+#define MAX_AZ_COUNT (128)
-static const ALushort evOffset[ELEV_COUNT] = { 0, 1, 13, 37, 73, 118, 174, 234, 306, 378, 450, 522, 594, 654, 710, 755, 791, 815, 827 };
-static const ALubyte azCount[ELEV_COUNT] = { 1, 12, 24, 36, 45, 56, 60, 72, 72, 72, 72, 72, 60, 56, 45, 36, 24, 12, 1 };
+struct Hrtf {
+ ALuint sampleRate;
+ ALuint irSize;
+ ALubyte evCount;
+ const ALubyte *azCount;
+ const ALushort *evOffset;
+ const ALshort *coeffs;
+ const ALubyte *delays;
-static const struct Hrtf {
- ALuint sampleRate;
- ALshort coeffs[HRIR_COUNT][HRIR_LENGTH];
- ALubyte delays[HRIR_COUNT];
-} DefaultHrtf = {
- 44100,
-#include "hrtf_tables.inc"
+ struct Hrtf *next;
};
-static struct Hrtf *LoadedHrtfs = NULL;
-static ALuint NumLoadedHrtfs = 0;
+static const ALchar magicMarker[8] = "MinPHR01";
+
+/* Define the default HRTF:
+ * ALubyte defaultAzCount [DefaultHrtf.evCount]
+ * ALushort defaultEvOffset [DefaultHrtf.evCount]
+ * ALshort defaultCoeffs [DefaultHrtf.irCount * defaultHrtf.irSize]
+ * ALubyte defaultDelays [DefaultHrtf.irCount]
+ *
+ * struct Hrtf DefaultHrtf
+ */
+#include "hrtf_tables.inc"
+static struct Hrtf *LoadedHrtfs = NULL;
-// Calculate the elevation indices given the polar elevation in radians.
-// This will return two indices between 0 and (ELEV_COUNT-1) and an
-// interpolation factor between 0.0 and 1.0.
-static void CalcEvIndices(ALfloat ev, ALuint *evidx, ALfloat *evmu)
+/* Calculate the elevation indices given the polar elevation in radians.
+ * This will return two indices between 0 and (Hrtf->evCount - 1) and an
+ * interpolation factor between 0.0 and 1.0.
+ */
+static void CalcEvIndices(const struct Hrtf *Hrtf, ALfloat ev, ALuint *evidx, ALfloat *evmu)
{
- ev = (F_PI_2 + ev) * (ELEV_COUNT-1) / F_PI;
+ ev = (F_PI_2 + ev) * (Hrtf->evCount-1) / F_PI;
evidx[0] = fastf2u(ev);
- evidx[1] = minu(evidx[0] + 1, ELEV_COUNT-1);
+ evidx[1] = minu(evidx[0] + 1, Hrtf->evCount-1);
*evmu = ev - evidx[0];
}
-// Calculate the azimuth indices given the polar azimuth in radians. This
-// will return two indices between 0 and (azCount [ei] - 1) and an
-// interpolation factor between 0.0 and 1.0.
-static void CalcAzIndices(ALuint evidx, ALfloat az, ALuint *azidx, ALfloat *azmu)
+/* Calculate the azimuth indices given the polar azimuth in radians. This
+ * will return two indices between 0 and (Hrtf->azCount[ei] - 1) and an
+ * interpolation factor between 0.0 and 1.0.
+ */
+static void CalcAzIndices(const struct Hrtf *Hrtf, ALuint evidx, ALfloat az, ALuint *azidx, ALfloat *azmu)
{
- az = (F_PI*2.0f + az) * azCount[evidx] / (F_PI*2.0f);
- azidx[0] = fastf2u(az) % azCount[evidx];
- azidx[1] = (azidx[0] + 1) % azCount[evidx];
+ az = (F_PI*2.0f + az) * Hrtf->azCount[evidx] / (F_PI*2.0f);
+ azidx[0] = fastf2u(az) % Hrtf->azCount[evidx];
+ azidx[1] = (azidx[0] + 1) % Hrtf->azCount[evidx];
*azmu = az - floorf(az);
}
-// Calculates the normalized HRTF transition factor (delta) from the changes
-// in gain and listener to source angle between updates. The result is a
-// normalized delta factor than can be used to calculate moving HRIR stepping
-// values.
+/* Calculates the normalized HRTF transition factor (delta) from the changes
+ * in gain and listener to source angle between updates. The result is a
+ * normalized delta factor that can be used to calculate moving HRIR stepping
+ * values.
+ */
ALfloat CalcHrtfDelta(ALfloat oldGain, ALfloat newGain, const ALfloat olddir[3], const ALfloat newdir[3])
{
ALfloat gainChange, angleChange, change;
@@ -106,10 +125,11 @@ ALfloat CalcHrtfDelta(ALfloat oldGain, ALfloat newGain, const ALfloat olddir[3],
return minf(change, 1.0f);
}
-// Calculates static HRIR coefficients and delays for the given polar
-// elevation and azimuth in radians. Linear interpolation is used to
-// increase the apparent resolution of the HRIR dataset. The coefficients
-// are also normalized and attenuated by the specified gain.
+/* Calculates static HRIR coefficients and delays for the given polar
+ * elevation and azimuth in radians. Linear interpolation is used to
+ * increase the apparent resolution of the HRIR data set. The coefficients
+ * are also normalized and attenuated by the specified gain.
+ */
void GetLerpedHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat gain, ALfloat (*coeffs)[2], ALuint *delays)
{
ALuint evidx[2], azidx[2];
@@ -118,78 +138,90 @@ void GetLerpedHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azi
ALuint i;
// Claculate elevation indices and interpolation factor.
- CalcEvIndices(elevation, evidx, &mu[2]);
+ CalcEvIndices(Hrtf, elevation, evidx, &mu[2]);
// Calculate azimuth indices and interpolation factor for the first
// elevation.
- CalcAzIndices(evidx[0], azimuth, azidx, &mu[0]);
+ CalcAzIndices(Hrtf, evidx[0], azimuth, azidx, &mu[0]);
// Calculate the first set of linear HRIR indices for left and right
// channels.
- lidx[0] = evOffset[evidx[0]] + azidx[0];
- lidx[1] = evOffset[evidx[0]] + azidx[1];
- ridx[0] = evOffset[evidx[0]] + ((azCount[evidx[0]]-azidx[0]) % azCount[evidx[0]]);
- ridx[1] = evOffset[evidx[0]] + ((azCount[evidx[0]]-azidx[1]) % azCount[evidx[0]]);
+ lidx[0] = Hrtf->evOffset[evidx[0]] + azidx[0];
+ lidx[1] = Hrtf->evOffset[evidx[0]] + azidx[1];
+ ridx[0] = Hrtf->evOffset[evidx[0]] + ((Hrtf->azCount[evidx[0]]-azidx[0]) % Hrtf->azCount[evidx[0]]);
+ ridx[1] = Hrtf->evOffset[evidx[0]] + ((Hrtf->azCount[evidx[0]]-azidx[1]) % Hrtf->azCount[evidx[0]]);
// Calculate azimuth indices and interpolation factor for the second
// elevation.
- CalcAzIndices(evidx[1], azimuth, azidx, &mu[1]);
+ CalcAzIndices(Hrtf, evidx[1], azimuth, azidx, &mu[1]);
// Calculate the second set of linear HRIR indices for left and right
// channels.
- lidx[2] = evOffset[evidx[1]] + azidx[0];
- lidx[3] = evOffset[evidx[1]] + azidx[1];
- ridx[2] = evOffset[evidx[1]] + ((azCount[evidx[1]]-azidx[0]) % azCount[evidx[1]]);
- ridx[3] = evOffset[evidx[1]] + ((azCount[evidx[1]]-azidx[1]) % azCount[evidx[1]]);
+ lidx[2] = Hrtf->evOffset[evidx[1]] + azidx[0];
+ lidx[3] = Hrtf->evOffset[evidx[1]] + azidx[1];
+ ridx[2] = Hrtf->evOffset[evidx[1]] + ((Hrtf->azCount[evidx[1]]-azidx[0]) % Hrtf->azCount[evidx[1]]);
+ ridx[3] = Hrtf->evOffset[evidx[1]] + ((Hrtf->azCount[evidx[1]]-azidx[1]) % Hrtf->azCount[evidx[1]]);
- /* Calculate 4 blending weights for 2D bilinear interpolation */
+ /* Calculate 4 blending weights for 2D bilinear interpolation. */
blend[0] = (1.0f-mu[0]) * (1.0f-mu[2]);
blend[1] = ( mu[0]) * (1.0f-mu[2]);
blend[2] = (1.0f-mu[1]) * ( mu[2]);
blend[3] = ( mu[1]) * ( mu[2]);
- // Calculate the normalized and attenuated HRIR coefficients using linear
- // interpolation when there is enough gain to warrant it. Zero the
- // coefficients if gain is too low.
+ /* Calculate the HRIR delays using linear interpolation. */
+ delays[0] = fastf2u(Hrtf->delays[lidx[0]]*blend[0] + Hrtf->delays[lidx[1]]*blend[1] +
+ Hrtf->delays[lidx[2]]*blend[2] + Hrtf->delays[lidx[3]]*blend[3] +
+ 0.5f) << HRTFDELAY_BITS;
+ delays[1] = fastf2u(Hrtf->delays[ridx[0]]*blend[0] + Hrtf->delays[ridx[1]]*blend[1] +
+ Hrtf->delays[ridx[2]]*blend[2] + Hrtf->delays[ridx[3]]*blend[3] +
+ 0.5f) << HRTFDELAY_BITS;
+
+ /* Calculate the sample offsets for the HRIR indices. */
+ lidx[0] *= Hrtf->irSize;
+ lidx[1] *= Hrtf->irSize;
+ lidx[2] *= Hrtf->irSize;
+ lidx[3] *= Hrtf->irSize;
+ ridx[0] *= Hrtf->irSize;
+ ridx[1] *= Hrtf->irSize;
+ ridx[2] *= Hrtf->irSize;
+ ridx[3] *= Hrtf->irSize;
+
+ /* Calculate the normalized and attenuated HRIR coefficients using linear
+ * interpolation when there is enough gain to warrant it. Zero the
+ * coefficients if gain is too low.
+ */
if(gain > 0.0001f)
{
gain *= 1.0f/32767.0f;
- for(i = 0;i < HRIR_LENGTH;i++)
+ for(i = 0;i < Hrtf->irSize;i++)
{
- coeffs[i][0] = (Hrtf->coeffs[lidx[0]][i]*blend[0] +
- Hrtf->coeffs[lidx[1]][i]*blend[1] +
- Hrtf->coeffs[lidx[2]][i]*blend[2] +
- Hrtf->coeffs[lidx[3]][i]*blend[3]) * gain;
- coeffs[i][1] = (Hrtf->coeffs[ridx[0]][i]*blend[0] +
- Hrtf->coeffs[ridx[1]][i]*blend[1] +
- Hrtf->coeffs[ridx[2]][i]*blend[2] +
- Hrtf->coeffs[ridx[3]][i]*blend[3]) * gain;
+ coeffs[i][0] = (Hrtf->coeffs[lidx[0]+i]*blend[0] +
+ Hrtf->coeffs[lidx[1]+i]*blend[1] +
+ Hrtf->coeffs[lidx[2]+i]*blend[2] +
+ Hrtf->coeffs[lidx[3]+i]*blend[3]) * gain;
+ coeffs[i][1] = (Hrtf->coeffs[ridx[0]+i]*blend[0] +
+ Hrtf->coeffs[ridx[1]+i]*blend[1] +
+ Hrtf->coeffs[ridx[2]+i]*blend[2] +
+ Hrtf->coeffs[ridx[3]+i]*blend[3]) * gain;
}
}
else
{
- for(i = 0;i < HRIR_LENGTH;i++)
+ for(i = 0;i < Hrtf->irSize;i++)
{
coeffs[i][0] = 0.0f;
coeffs[i][1] = 0.0f;
}
}
-
- // Calculate the HRIR delays using linear interpolation.
- delays[0] = fastf2u(Hrtf->delays[lidx[0]]*blend[0] + Hrtf->delays[lidx[1]]*blend[1] +
- Hrtf->delays[lidx[2]]*blend[2] + Hrtf->delays[lidx[3]]*blend[3] +
- 0.5f) << HRTFDELAY_BITS;
- delays[1] = fastf2u(Hrtf->delays[ridx[0]]*blend[0] + Hrtf->delays[ridx[1]]*blend[1] +
- Hrtf->delays[ridx[2]]*blend[2] + Hrtf->delays[ridx[3]]*blend[3] +
- 0.5f) << HRTFDELAY_BITS;
}
-// Calculates the moving HRIR target coefficients, target delays, and
-// stepping values for the given polar elevation and azimuth in radians.
-// Linear interpolation is used to increase the apparent resolution of the
-// HRIR dataset. The coefficients are also normalized and attenuated by the
-// specified gain. Stepping resolution and count is determined using the
-// given delta factor between 0.0 and 1.0.
+/* Calculates the moving HRIR target coefficients, target delays, and
+ * stepping values for the given polar elevation and azimuth in radians.
+ * Linear interpolation is used to increase the apparent resolution of the
+ * HRIR data set. The coefficients are also normalized and attenuated by the
+ * specified gain. Stepping resolution and count is determined using the
+ * given delta factor between 0.0 and 1.0.
+ */
ALuint GetMovingHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat gain, ALfloat delta, ALint counter, ALfloat (*coeffs)[2], ALuint *delays, ALfloat (*coeffStep)[2], ALint *delayStep)
{
ALuint evidx[2], azidx[2];
@@ -200,45 +232,73 @@ ALuint GetMovingHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat a
ALuint i;
// Claculate elevation indices and interpolation factor.
- CalcEvIndices(elevation, evidx, &mu[2]);
+ CalcEvIndices(Hrtf, elevation, evidx, &mu[2]);
// Calculate azimuth indices and interpolation factor for the first
// elevation.
- CalcAzIndices(evidx[0], azimuth, azidx, &mu[0]);
+ CalcAzIndices(Hrtf, evidx[0], azimuth, azidx, &mu[0]);
// Calculate the first set of linear HRIR indices for left and right
// channels.
- lidx[0] = evOffset[evidx[0]] + azidx[0];
- lidx[1] = evOffset[evidx[0]] + azidx[1];
- ridx[0] = evOffset[evidx[0]] + ((azCount[evidx[0]]-azidx[0]) % azCount[evidx[0]]);
- ridx[1] = evOffset[evidx[0]] + ((azCount[evidx[0]]-azidx[1]) % azCount[evidx[0]]);
+ lidx[0] = Hrtf->evOffset[evidx[0]] + azidx[0];
+ lidx[1] = Hrtf->evOffset[evidx[0]] + azidx[1];
+ ridx[0] = Hrtf->evOffset[evidx[0]] + ((Hrtf->azCount[evidx[0]]-azidx[0]) % Hrtf->azCount[evidx[0]]);
+ ridx[1] = Hrtf->evOffset[evidx[0]] + ((Hrtf->azCount[evidx[0]]-azidx[1]) % Hrtf->azCount[evidx[0]]);
// Calculate azimuth indices and interpolation factor for the second
// elevation.
- CalcAzIndices(evidx[1], azimuth, azidx, &mu[1]);
+ CalcAzIndices(Hrtf, evidx[1], azimuth, azidx, &mu[1]);
// Calculate the second set of linear HRIR indices for left and right
// channels.
- lidx[2] = evOffset[evidx[1]] + azidx[0];
- lidx[3] = evOffset[evidx[1]] + azidx[1];
- ridx[2] = evOffset[evidx[1]] + ((azCount[evidx[1]]-azidx[0]) % azCount[evidx[1]]);
- ridx[3] = evOffset[evidx[1]] + ((azCount[evidx[1]]-azidx[1]) % azCount[evidx[1]]);
+ lidx[2] = Hrtf->evOffset[evidx[1]] + azidx[0];
+ lidx[3] = Hrtf->evOffset[evidx[1]] + azidx[1];
+ ridx[2] = Hrtf->evOffset[evidx[1]] + ((Hrtf->azCount[evidx[1]]-azidx[0]) % Hrtf->azCount[evidx[1]]);
+ ridx[3] = Hrtf->evOffset[evidx[1]] + ((Hrtf->azCount[evidx[1]]-azidx[1]) % Hrtf->azCount[evidx[1]]);
// Calculate the stepping parameters.
delta = maxf(floorf(delta*(Hrtf->sampleRate*0.015f) + 0.5f), 1.0f);
step = 1.0f / delta;
- /* Calculate 4 blending weights for 2D bilinear interpolation */
+ /* Calculate 4 blending weights for 2D bilinear interpolation. */
blend[0] = (1.0f-mu[0]) * (1.0f-mu[2]);
blend[1] = ( mu[0]) * (1.0f-mu[2]);
blend[2] = (1.0f-mu[1]) * ( mu[2]);
blend[3] = ( mu[1]) * ( mu[2]);
- // Calculate the normalized and attenuated target HRIR coefficients using
- // linear interpolation when there is enough gain to warrant it. Zero
- // the target coefficients if gain is too low. Then calculate the
- // coefficient stepping values using the target and previous running
- // coefficients.
+ /* Calculate the HRIR delays using linear interpolation. Then calculate
+ * the delay stepping values using the target and previous running
+ * delays.
+ */
+ left = (ALfloat)(delays[0] - (delayStep[0] * counter));
+ right = (ALfloat)(delays[1] - (delayStep[1] * counter));
+
+ delays[0] = fastf2u(Hrtf->delays[lidx[0]]*blend[0] + Hrtf->delays[lidx[1]]*blend[1] +
+ Hrtf->delays[lidx[2]]*blend[2] + Hrtf->delays[lidx[3]]*blend[3] +
+ 0.5f) << HRTFDELAY_BITS;
+ delays[1] = fastf2u(Hrtf->delays[ridx[0]]*blend[0] + Hrtf->delays[ridx[1]]*blend[1] +
+ Hrtf->delays[ridx[2]]*blend[2] + Hrtf->delays[ridx[3]]*blend[3] +
+ 0.5f) << HRTFDELAY_BITS;
+
+ delayStep[0] = fastf2i(step * (delays[0] - left));
+ delayStep[1] = fastf2i(step * (delays[1] - right));
+
+ /* Calculate the sample offsets for the HRIR indices. */
+ lidx[0] *= Hrtf->irSize;
+ lidx[1] *= Hrtf->irSize;
+ lidx[2] *= Hrtf->irSize;
+ lidx[3] *= Hrtf->irSize;
+ ridx[0] *= Hrtf->irSize;
+ ridx[1] *= Hrtf->irSize;
+ ridx[2] *= Hrtf->irSize;
+ ridx[3] *= Hrtf->irSize;
+
+ /* Calculate the normalized and attenuated target HRIR coefficients using
+ * linear interpolation when there is enough gain to warrant it. Zero
+ * the target coefficients if gain is too low. Then calculate the
+ * coefficient stepping values using the target and previous running
+ * coefficients.
+ */
if(gain > 0.0001f)
{
gain *= 1.0f/32767.0f;
@@ -247,14 +307,14 @@ ALuint GetMovingHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat a
left = coeffs[i][0] - (coeffStep[i][0] * counter);
right = coeffs[i][1] - (coeffStep[i][1] * counter);
- coeffs[i][0] = (Hrtf->coeffs[lidx[0]][i]*blend[0] +
- Hrtf->coeffs[lidx[1]][i]*blend[1] +
- Hrtf->coeffs[lidx[2]][i]*blend[2] +
- Hrtf->coeffs[lidx[3]][i]*blend[3]) * gain;
- coeffs[i][1] = (Hrtf->coeffs[ridx[0]][i]*blend[0] +
- Hrtf->coeffs[ridx[1]][i]*blend[1] +
- Hrtf->coeffs[ridx[2]][i]*blend[2] +
- Hrtf->coeffs[ridx[3]][i]*blend[3]) * gain;
+ coeffs[i][0] = (Hrtf->coeffs[lidx[0]+i]*blend[0] +
+ Hrtf->coeffs[lidx[1]+i]*blend[1] +
+ Hrtf->coeffs[lidx[2]+i]*blend[2] +
+ Hrtf->coeffs[lidx[3]+i]*blend[3]) * gain;
+ coeffs[i][1] = (Hrtf->coeffs[ridx[0]+i]*blend[0] +
+ Hrtf->coeffs[ridx[1]+i]*blend[1] +
+ Hrtf->coeffs[ridx[2]+i]*blend[2] +
+ Hrtf->coeffs[ridx[3]+i]*blend[3]) * gain;
coeffStep[i][0] = step * (coeffs[i][0] - left);
coeffStep[i][1] = step * (coeffs[i][1] - right);
@@ -275,82 +335,63 @@ ALuint GetMovingHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat a
}
}
- // Calculate the HRIR delays using linear interpolation. Then calculate
- // the delay stepping values using the target and previous running
- // delays.
- left = (ALfloat)(delays[0] - (delayStep[0] * counter));
- right = (ALfloat)(delays[1] - (delayStep[1] * counter));
-
- delays[0] = fastf2u(Hrtf->delays[lidx[0]]*blend[0] + Hrtf->delays[lidx[1]]*blend[1] +
- Hrtf->delays[lidx[2]]*blend[2] + Hrtf->delays[lidx[3]]*blend[3] +
- 0.5f) << HRTFDELAY_BITS;
- delays[1] = fastf2u(Hrtf->delays[ridx[0]]*blend[0] + Hrtf->delays[ridx[1]]*blend[1] +
- Hrtf->delays[ridx[2]]*blend[2] + Hrtf->delays[ridx[3]]*blend[3] +
- 0.5f) << HRTFDELAY_BITS;
-
- delayStep[0] = fastf2i(step * (delays[0] - left));
- delayStep[1] = fastf2i(step * (delays[1] - right));
-
- // The stepping count is the number of samples necessary for the HRIR to
- // complete its transition. The mixer will only apply stepping for this
- // many samples.
+ /* The stepping count is the number of samples necessary for the HRIR to
+ * complete its transition. The mixer will only apply stepping for this
+ * many samples.
+ */
return fastf2u(delta);
}
-const struct Hrtf *GetHrtf(ALCdevice *device)
-{
- if(device->FmtChans == DevFmtStereo)
- {
- ALuint i;
- for(i = 0;i < NumLoadedHrtfs;i++)
- {
- if(device->Frequency == LoadedHrtfs[i].sampleRate)
- return &LoadedHrtfs[i];
- }
- if(device->Frequency == DefaultHrtf.sampleRate)
- return &DefaultHrtf;
- }
- ERR("Incompatible format: %s %uhz\n",
- DevFmtChannelsString(device->FmtChans), device->Frequency);
- return NULL;
-}
-
-void InitHrtf(void)
+static struct Hrtf *LoadHrtf(ALuint deviceRate)
{
- char *fnamelist=NULL, *next=NULL;
- const char *val;
+ const char *fnamelist = NULL;
+ char rateStr[16 + 1];
+ ALsizei rateLen;
- if(ConfigValueStr(NULL, "hrtf_tables", &val))
- next = fnamelist = strdup(val);
- while(next && *next)
+ rateLen = minu(snprintf(rateStr, 16, "%u", deviceRate), 16);
+ ConfigValueStr(NULL, "hrtf_tables", &fnamelist);
+ while(*fnamelist != '\0')
{
const ALubyte maxDelay = SRC_HISTORY_LENGTH-1;
- struct Hrtf newdata;
+ struct Hrtf *Hrtf = NULL;
ALboolean failed;
ALchar magic[9];
ALsizei i, j;
- char *fname;
+ ALuint rate = 0, irCount;
+ ALubyte irSize = 0, evCount = 0, *azCount, *delays;
+ ALushort *evOffset;
+ ALshort *coeffs;
+ char fname[256 + 1];
FILE *f;
- fname = next;
- next = strchr(fname, ',');
- if(next)
+ while(isspace(*fnamelist) || *fnamelist == ',')
+ fnamelist++;
+ i = 0;
+ while(*fnamelist != '\0' && *fnamelist != ',')
{
- while(next != fname)
+ if(i < 256)
{
- next--;
- if(!isspace(*next))
+ if(*fnamelist == '%' && *(fnamelist+1) == 'r')
+ {
+ strncpy(&fname[i], rateStr, minu(rateLen, 256-i));
+ i += minu(rateLen, 256-i);
+ fnamelist++;
+ }
+ else
{
- *(next++) = '\0';
- break;
+ fname[i] = *fnamelist;
+ i++;
}
}
- while(isspace(*next) || *next == ',')
- next++;
+ fnamelist++;
}
+ while(isspace(fname[i-1]))
+ i--;
+ fname[i] = '\0';
- if(!fname[0])
+ if(fname[0] == '\0')
continue;
+
TRACE("Loading %s\n", fname);
f = fopen(fname, "rb");
if(f == NULL)
@@ -360,6 +401,10 @@ void InitHrtf(void)
}
failed = AL_FALSE;
+ azCount = NULL;
+ evOffset = NULL;
+ coeffs = NULL;
+ delays = NULL;
if(fread(magic, 1, sizeof(magicMarker), f) != sizeof(magicMarker))
{
ERR("Failed to read magic marker\n");
@@ -374,40 +419,55 @@ void InitHrtf(void)
if(!failed)
{
- ALushort hrirCount, hrirSize;
- ALubyte evCount;
-
- newdata.sampleRate = fgetc(f);
- newdata.sampleRate |= fgetc(f)<<8;
- newdata.sampleRate |= fgetc(f)<<16;
- newdata.sampleRate |= fgetc(f)<<24;
+ rate = fgetc(f);
+ rate |= fgetc(f)<<8;
+ rate |= fgetc(f)<<16;
+ rate |= fgetc(f)<<24;
- hrirCount = fgetc(f);
- hrirCount |= fgetc(f)<<8;
-
- hrirSize = fgetc(f);
- hrirSize |= fgetc(f)<<8;
+ irSize = fgetc(f);
evCount = fgetc(f);
- if(hrirCount != HRIR_COUNT || hrirSize != HRIR_LENGTH || evCount != ELEV_COUNT)
+ if(rate != deviceRate)
+ {
+ ERR("HRIR rate does not match device rate: rate=%d (%d)\n",
+ rate, deviceRate);
+ failed = AL_TRUE;
+ }
+ if(irSize < MIN_IR_SIZE || irSize > MAX_IR_SIZE || (irSize%MOD_IR_SIZE))
+ {
+ ERR("Unsupported HRIR size: irSize=%d (%d to %d by %d)\n",
+ irSize, MIN_IR_SIZE, MAX_IR_SIZE, MOD_IR_SIZE);
+ failed = AL_TRUE;
+ }
+ if(evCount < MIN_EV_COUNT || evCount > MAX_EV_COUNT)
+ {
+ ERR("Unsupported elevation count: evCount=%d (%d to %d)\n",
+ evCount, MIN_EV_COUNT, MAX_EV_COUNT);
+ failed = AL_TRUE;
+ }
+ }
+
+ if(!failed)
+ {
+ azCount = malloc(sizeof(azCount[0])*evCount);
+ evOffset = malloc(sizeof(evOffset[0])*evCount);
+ if(azCount == NULL || evOffset == NULL)
{
- ERR("Unsupported value: hrirCount=%d (%d), hrirSize=%d (%d), evCount=%d (%d)\n",
- hrirCount, HRIR_COUNT, hrirSize, HRIR_LENGTH, evCount, ELEV_COUNT);
+ ERR("Out of memory.\n");
failed = AL_TRUE;
}
}
if(!failed)
{
- for(i = 0;i < ELEV_COUNT;i++)
+ for(i = 0;i < evCount;i++)
{
- ALushort offset;
- offset = fgetc(f);
- offset |= fgetc(f)<<8;
- if(offset != evOffset[i])
+ azCount[i] = fgetc(f);
+ if(azCount[i] < MIN_AZ_COUNT || azCount[i] > MAX_AZ_COUNT)
{
- ERR("Unsupported evOffset[%d] value: %d (%d)\n", i, offset, evOffset[i]);
+ ERR("Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n",
+ i, azCount[i], MIN_AZ_COUNT, MAX_AZ_COUNT);
failed = AL_TRUE;
}
}
@@ -415,24 +475,41 @@ void InitHrtf(void)
if(!failed)
{
- for(i = 0;i < HRIR_COUNT;i++)
+ evOffset[0] = 0;
+ irCount = azCount[0];
+ for(i = 1;i < evCount;i++)
+ {
+ evOffset[i] = evOffset[i-1] + azCount[i-1];
+ irCount += azCount[i];
+ }
+
+ coeffs = malloc(sizeof(coeffs[0])*irSize*irCount);
+ delays = malloc(sizeof(delays[0])*irCount);
+ if(coeffs == NULL || delays == NULL)
+ {
+ ERR("Out of memory.\n");
+ failed = AL_TRUE;
+ }
+ }
+
+ if(!failed)
+ {
+ for(i = 0;i < (ALsizei)(irCount*irSize);i+=irSize)
{
- for(j = 0;j < HRIR_LENGTH;j++)
+ for(j = 0;j < (ALsizei)irSize;j++)
{
ALshort coeff;
coeff = fgetc(f);
coeff |= fgetc(f)<<8;
- newdata.coeffs[i][j] = coeff;
+ coeffs[i+j] = coeff;
}
}
- for(i = 0;i < HRIR_COUNT;i++)
+ for(i = 0;i < (ALsizei)irCount;i++)
{
- ALubyte delay;
- delay = fgetc(f);
- newdata.delays[i] = delay;
- if(delay > maxDelay)
+ delays[i] = fgetc(f);
+ if(delays[i] > maxDelay)
{
- ERR("Invalid delay[%d]: %d (%d)\n", i, delay, maxDelay);
+ ERR("Invalid delays[%d]: %d (%d)\n", i, delays[i], maxDelay);
failed = AL_TRUE;
}
}
@@ -449,25 +526,81 @@ void InitHrtf(void)
if(!failed)
{
- void *temp = realloc(LoadedHrtfs, (NumLoadedHrtfs+1)*sizeof(LoadedHrtfs[0]));
- if(temp != NULL)
+ Hrtf = malloc(sizeof(struct Hrtf));
+ if(Hrtf == NULL)
{
- LoadedHrtfs = temp;
- TRACE("Loaded HRTF support for format: %s %uhz\n",
- DevFmtChannelsString(DevFmtStereo), newdata.sampleRate);
- LoadedHrtfs[NumLoadedHrtfs++] = newdata;
+ ERR("Out of memory.\n");
+ failed = AL_TRUE;
}
}
+
+ if(!failed)
+ {
+ Hrtf->sampleRate = rate;
+ Hrtf->irSize = irSize;
+ Hrtf->evCount = evCount;
+ Hrtf->azCount = azCount;
+ Hrtf->evOffset = evOffset;
+ Hrtf->coeffs = coeffs;
+ Hrtf->delays = delays;
+ Hrtf->next = LoadedHrtfs;
+ LoadedHrtfs = Hrtf;
+ TRACE("Loaded HRTF support for format: %s %uhz\n",
+ DevFmtChannelsString(DevFmtStereo), Hrtf->sampleRate);
+ return Hrtf;
+ }
else
+ {
+ free(azCount);
+ free(evOffset);
+ free(coeffs);
+ free(delays);
ERR("Failed to load %s\n", fname);
+ }
+ }
+ return NULL;
+}
+
+const struct Hrtf *GetHrtf(ALCdevice *device)
+{
+ if(device->FmtChans == DevFmtStereo)
+ {
+ struct Hrtf *Hrtf = LoadedHrtfs;
+ while(Hrtf != NULL)
+ {
+ if(device->Frequency == Hrtf->sampleRate)
+ return Hrtf;
+ Hrtf = Hrtf->next;
+ }
+
+ Hrtf = LoadHrtf(device->Frequency);
+ if(Hrtf != NULL)
+ return Hrtf;
+
+ if(device->Frequency == DefaultHrtf.sampleRate)
+ return &DefaultHrtf;
+ }
+ ERR("Incompatible format: %s %uhz\n",
+ DevFmtChannelsString(device->FmtChans), device->Frequency);
+ return NULL;
+}
+
+void FreeHrtfs(void)
+{
+ struct Hrtf *Hrtf = NULL;
+
+ while((Hrtf=LoadedHrtfs) != NULL)
+ {
+ LoadedHrtfs = Hrtf->next;
+ free((void*)Hrtf->azCount);
+ free((void*)Hrtf->evOffset);
+ free((void*)Hrtf->coeffs);
+ free((void*)Hrtf->delays);
+ free(Hrtf);
}
- free(fnamelist);
- fnamelist = NULL;
}
-void FreeHrtf(void)
+ALuint GetHrtfIrSize (const struct Hrtf *Hrtf)
{
- NumLoadedHrtfs = 0;
- free(LoadedHrtfs);
- LoadedHrtfs = NULL;
+ return Hrtf->irSize;
}
diff --git a/Alc/hrtf_tables.inc b/Alc/hrtf_tables.inc
index 4ba1416e..19e4c458 100644
--- a/Alc/hrtf_tables.inc
+++ b/Alc/hrtf_tables.inc
@@ -1,839 +1,850 @@
-/* This data is Copyright 1994 by the MIT Media Laboratory. It is provided free
- * with no restrictions on use, provided the authors are cited when the data is
- * used in any research or commercial application. */
-/* Bill Gardner <[email protected]> and Keith Martin <[email protected]> */
+/* Elevation metrics */
+static const ALubyte defaultAzCount[19] = { 1, 12, 24, 36, 45, 56, 60, 72, 72, 72, 72, 72, 60, 56, 45, 36, 24, 12, 1, };
+static const ALushort defaultEvOffset[19] = { 0, 1, 13, 37, 73, 118, 174, 234, 306, 378, 450, 522, 594, 654, 710, 755, 791, 815, 827, };
- /* HRIR Coefficients */
- {
- { +5817, +7833, +3253, +2795, +1080, +403, +948, -690, -2207, -1110, +658, -33, -481, -949, -839, -287, -146, -103, +7, -47, -269, -105, -316, -221, -304, -497, -373, -231, -114, -14, +66, -62, },
- { +6586, +8107, +2781, +3167, +1095, +99, +922, -641, -2255, -1457, +602, +170, -469, -781, -818, -773, -258, +8, -111, -125, -368, -216, -345, -265, -298, -447, -408, -158, -22, +0, +63, -96, },
- { +5986, +7570, +2713, +2756, +1080, +403, +921, -758, -2112, -1067, +565, -93, -431, -738, -604, -361, -238, +10, +63, -88, -302, -101, -306, -243, -358, -488, -341, -224, -98, -1, +79, -55, },
- { +5571, +7005, +2499, +2549, +974, +438, +959, -688, -1966, -793, +755, -35, -305, -631, -545, -165, -118, -72, +26, -36, -228, -36, -253, -158, -261, -436, -311, -197, -85, +11, +82, -47, },
- { +5472, +6865, +2460, +2524, +978, +492, +1057, -561, -1857, -706, +813, -3, -353, -739, -587, -120, -98, -94, +21, -32, -228, -31, -232, -119, -204, -399, -293, -197, -124, -45, +34, -81, },
- { +5627, +7081, +2487, +2449, +858, +396, +981, -676, -2051, -899, +820, +82, -332, -774, -643, -127, -26, -14, +72, +27, -183, -16, -234, -142, -240, -422, -289, -151, -36, +63, +108, -65, },
- { +6172, +7677, +2541, +2564, +874, +397, +966, -927, -2421, -1117, +905, +38, -545, -990, -785, -200, -66, -60, +50, +17, -244, -35, -244, -146, -246, -433, -290, -139, -42, +40, +108, -37, },
- { +6521, +8320, +2827, +2690, +909, +230, +917, -1084, -2525, -1115, +652, -122, -480, -974, -823, -289, -150, +21, +73, -58, -296, -90, -299, -198, -317, -480, -327, -206, -64, +25, +103, -47, },
- { +6956, +8505, +2738, +3040, +1131, +209, +719, -1389, -2419, -516, +530, -857, -697, -801, -443, -77, -328, -117, +128, -70, -281, -49, -356, -233, -419, -579, -344, -271, -169, -16, +76, -98, },
- { +7928, +9215, +2040, +2470, +595, +264, +1348, -1308, -2698, -258, +1302, -836, -1179, -1210, -483, +125, -403, -370, +81, -61, -416, -45, -378, -208, -426, -708, -383, -223, -150, -20, +82, -119, },
- { +8205, +9593, +2241, +2306, +197, +241, +1480, -1080, -3081, -704, +1757, -153, -1144, -1906, -912, +311, -4, -441, -129, -99, -476, -104, -467, -207, -379, -660, -412, -194, -106, -31, +48, -172, },
- { +7822, +9388, +3008, +2690, +349, +155, +1066, -976, -3351, -1396, +1366, +202, -165, -1794, -1686, +63, +209, -110, -81, -164, -375, -114, -487, -174, -394, -771, -456, -312, -109, +27, +100, -71, },
- { +7342, +9001, +2833, +2968, +859, +118, +830, -1009, -2609, -1583, +1030, +177, -566, -888, -1564, -882, +55, +78, +62, +48, -275, -224, -531, -354, -242, -534, -487, -241, -107, +31, +92, -76, },
- { +7420, +8277, +2251, +3723, +1049, -308, +945, -518, -2311, -1945, +592, +496, -502, -565, -848, -1420, -265, +189, -293, -192, -468, -339, -342, -319, -275, -379, -474, -58, +77, -10, +55, -134, },
- { +6584, +7746, +2495, +3374, +1000, -52, +897, -756, -2030, -1406, +280, +34, -398, -477, -456, -856, -571, +107, +104, -158, -435, -199, -286, -253, -345, -425, -316, -178, -107, -66, +74, -62, },
- { +6049, +7215, +2251, +2809, +1129, +395, +858, -790, -1953, -1091, +399, -101, -343, -474, -371, -537, -334, +183, +103, -155, -328, -94, -287, -281, -418, -457, -307, -226, -82, +10, +91, -45, },
- { +5611, +6654, +2026, +2614, +1122, +421, +846, -730, -1795, -787, +486, -181, -199, -331, -331, -290, -184, +57, +64, -94, -264, -59, -241, -160, -276, -381, -321, -242, -63, +33, +98, -44, },
- { +5099, +6036, +1921, +2401, +945, +508, +937, -640, -1638, -506, +755, -23, -74, -266, -268, -108, -114, -39, +41, -26, -172, +33, -185, -102, -220, -366, -254, -174, -58, +33, +94, -28, },
- { +4863, +5622, +1644, +2154, +818, +547, +1098, -307, -1280, -210, +982, +96, -111, -376, -319, -58, -43, -22, +51, -10, -188, -3, -174, -47, -165, -316, -201, -114, -14, +20, +16, -134, },
- { +4874, +5742, +1871, +2357, +961, +630, +1147, -376, -1424, -337, +863, +34, -193, -499, -332, +8, -81, -97, +36, -13, -175, +46, -137, -17, -102, -297, -226, -178, -147, -83, +1, -91, },
- { +4960, +5827, +1797, +2194, +842, +622, +1162, -376, -1492, -421, +910, +56, -246, -568, -430, +32, +120, +83, +106, +18, -182, -19, -208, -85, -152, -240, -94, -64, -84, -82, -30, -123, },
- { +5228, +6194, +1872, +2175, +707, +445, +1001, -617, -1837, -723, +933, +227, -167, -586, -451, +10, +86, +68, +127, +106, -88, +66, -146, -70, -175, -339, -208, -74, +41, +139, +139, -76, },
- { +5697, +6722, +1953, +2283, +727, +469, +969, -882, -2258, -1037, +972, +175, -413, -806, -593, -28, +130, +87, +177, +163, -115, +43, -180, -84, -142, -297, -156, -24, +4, +49, +85, -29, },
- { +6473, +7408, +1826, +2417, +711, +442, +966, -1188, -2613, -1118, +1193, +107, -644, -1020, -716, -117, +16, -26, +92, +89, -223, +39, -164, -76, -190, -362, -208, -46, +24, +86, +145, -12, },
- { +7101, +8208, +1841, +2445, +711, +357, +985, -1505, -2879, -1121, +1181, +70, -658, -1173, -814, -168, -29, +29, +47, +36, -265, -40, -293, -166, -283, -429, -229, -63, +43, +81, +160, -20, },
- { +7271, +8783, +2298, +2617, +755, +48, +900, -1532, -2806, -1083, +615, -189, -449, -1001, -807, -311, -150, +184, +122, -88, -322, -71, -273, -179, -335, -451, -278, -188, -9, +60, +138, -32, },
- { +7519, +8972, +2519, +3099, +1077, -70, +527, -1818, -2665, -568, +208, -889, -424, -657, -398, -291, -483, +67, +222, -56, -219, -19, -307, -204, -436, -529, -306, -304, -126, +27, +128, -48, },
- { +8267, +9086, +2039, +3441, +1167, -66, +449, -2175, -2478, +261, +170, -1844, -741, -537, +19, +68, -620, -86, +289, -131, -285, +19, -414, -244, -560, -647, -289, -330, -230, -5, +89, -141, },
- { +9334, +10020, +1039, +2681, +800, -36, +1253, -2153, -2906, +675, +921, -2082, -1336, -748, +118, +362, -708, -352, +305, -89, -430, +16, -461, -267, -609, -817, -292, -288, -287, -70, +134, -107, },
- { +10490, +10443, +234, +2319, +106, +215, +1880, -2162, -3146, +928, +1870, -2011, -1861, -1339, +44, +548, -846, -647, +252, -93, -597, +65, -464, -180, -581, -943, -344, -209, -200, -20, +104, -191, },
- { +11090, +10859, +176, +1929, -492, +415, +2257, -1899, -3660, +617, +2693, -1436, -2083, -2245, -339, +944, -576, -854, +49, -173, -603, +64, -607, -194, -525, -910, -310, -113, -162, +10, +55, -268, },
- { +11123, +11231, +589, +1885, -762, +272, +2193, -1677, -4087, +10, +3036, -569, -1972, -2950, -747, +1099, +20, -922, -216, -122, -721, -53, -651, -153, -474, -845, -423, -135, -107, -57, +30, -304, },
- { +10803, +11222, +1474, +2265, -883, +91, +1845, -1667, -4470, -728, +2793, +190, -972, -3366, -1480, +1091, +471, -617, -486, -175, -639, -113, -591, -51, -507, -934, -502, -309, -106, -118, +53, -177, },
- { +10246, +10868, +2402, +2554, -531, +31, +1268, -1323, -4728, -1500, +2335, +359, +174, -2966, -2559, +743, +585, -219, -198, -287, -474, -103, -696, -72, -517, -1094, -493, -391, -81, +78, +133, -87, },
- { +9638, +10459, +2554, +3136, -109, -170, +1213, -1306, -4339, -2094, +2099, +264, +202, -1798, -3312, -170, +781, +126, +63, -260, -424, +20, -759, -504, -338, -983, -510, -236, -85, +153, +125, -96, },
- { +9150, +10114, +2114, +3243, +563, -199, +731, -1335, -3018, -2131, +1610, +397, -733, -785, -2524, -1463, +491, +266, +80, +156, -304, -383, -768, -471, -118, -592, -631, -225, -95, +87, +113, -96, },
- { +8454, +9243, +2047, +3497, +881, -249, +701, -1042, -2617, -2062, +1294, +712, -942, -676, -1397, -1797, -57, +250, -231, -14, -250, -237, -521, -454, -179, -387, -649, -192, -30, +13, +161, -121, },
- { +8323, +8323, +1685, +4494, +893, -823, +1049, -315, -2397, -2598, +672, +957, -622, -284, -950, -2240, -109, +425, -567, -229, -570, -475, -300, -391, -228, -295, -579, +83, +176, -48, +44, -175, },
- { +7274, +7900, +2262, +4107, +785, -714, +918, -662, -1986, -1894, +51, +378, -372, -108, -420, -1664, -750, +303, +73, -176, -577, -344, -248, -256, -255, -331, -406, -129, -13, -101, +50, -88, },
- { +6560, +7256, +2146, +3528, +960, -9, +858, -751, -1783, -1572, +54, +101, -313, -181, -229, -1133, -648, +400, +128, -265, -444, -160, -232, -331, -449, -399, -265, -206, -153, -62, +116, -28, },
- { +5980, +6790, +1905, +2935, +1217, +364, +757, -764, -1730, -1213, +165, -24, -228, -158, -154, -831, -410, +428, +110, -247, -340, -86, -256, -338, -480, -399, -278, -238, -61, +18, +103, -30, },
- { +5480, +6206, +1692, +2736, +1300, +391, +709, -692, -1565, -861, +226, -147, -68, -24, -127, -550, -217, +281, +49, -181, -257, -43, -247, -249, -345, -298, -274, -270, -50, +56, +119, -43, },
- { +4953, +5620, +1632, +2478, +1119, +519, +800, -639, -1430, -598, +380, -73, +141, +70, -109, -295, -151, +126, +65, -105, -195, +54, -97, -104, -271, -314, -265, -208, -14, +48, +99, +5, },
- { +4358, +4972, +1588, +2310, +986, +595, +869, -526, -1223, -277, +652, +34, +216, +141, -22, -120, -122, +1, +49, -14, -101, +99, -108, -54, -180, -284, -207, -160, -31, +53, +104, -2, },
- { +4049, +4526, +1367, +2016, +774, +619, +1057, -193, -943, +8, +975, +238, +224, +73, -43, -96, -105, -16, +104, +54, -140, +64, -50, +12, -174, -276, -142, -78, +11, +66, +70, -116, },
- { +3893, +4241, +1180, +1972, +964, +806, +1165, +33, -630, +212, +995, +139, -10, -165, -98, +59, +41, +7, +5, -42, -115, +70, -77, +64, -30, -184, -140, -90, -15, -39, -72, -166, },
- { +3974, +4515, +1563, +2245, +1024, +802, +1202, -117, -913, -34, +802, +109, -1, -233, -83, +92, -89, -104, +51, +9, -107, +121, -30, +82, +5, -192, -173, -173, -183, -127, -31, -91, },
- { +4054, +4585, +1487, +2101, +966, +877, +1249, -118, -989, -177, +776, +97, -55, -258, -131, +135, +150, +93, +56, -19, -114, +43, -129, +22, -1, -45, +2, -139, -203, -156, -63, -102, },
- { +4259, +4784, +1375, +1894, +699, +649, +1161, -136, -1098, -231, +956, +281, +11, -419, -371, +109, +241, +228, +268, +110, -100, +71, -147, -93, -92, -157, -42, +95, +87, -12, -90, -205, },
- { +4579, +5216, +1470, +1933, +626, +538, +991, -498, -1568, -608, +1002, +425, +4, -387, -268, +119, +196, +143, +174, +193, +16, +138, -48, -8, -110, -248, -134, +1, +116, +214, +157, -94, },
- { +5066, +5749, +1521, +2044, +640, +538, +926, -811, -2022, -949, +1051, +371, -252, -591, -377, +160, +302, +178, +234, +199, -60, +136, -88, +2, -40, -201, -104, +47, +67, +67, +148, +54, },
- { +5824, +6357, +1417, +2188, +604, +584, +938, -1093, -2439, -1140, +1270, +283, -550, -828, -547, +25, +209, +96, +231, +241, -75, +150, -72, -37, -72, -173, -85, +78, +65, +65, +106, -26, },
- { +6705, +7034, +1139, +2353, +584, +531, +931, -1467, -2777, -1121, +1528, +169, -787, -1030, -630, -42, +104, -4, +133, +171, -212, +119, -74, -14, -133, -284, -130, +49, +82, +127, +179, +14, },
- { +7494, +7838, +930, +2406, +628, +447, +939, -1854, -3086, -1058, +1655, +110, -889, -1206, -690, -58, +26, -36, +86, +157, -264, +21, -209, -75, -225, -353, -152, +18, +88, +139, +234, +25, },
- { +7942, +8659, +1161, +2413, +549, +251, +1028, -2079, -3182, -1091, +1258, +58, -663, -1281, -862, -154, +30, +213, +47, +25, -289, -45, -300, -173, -306, -391, -167, -32, +123, +117, +202, -22, },
- { +8068, +9218, +1660, +2593, +617, -151, +900, -2038, -3036, -1021, +535, -219, -391, -1036, -790, -354, -141, +391, +141, -138, -345, -47, -238, -167, -360, -407, -230, -180, +55, +90, +173, -18, },
- { +8265, +9463, +2020, +3087, +909, -384, +486, -2292, -2858, -489, -42, -958, -218, -589, -423, -435, -531, +296, +255, -79, -195, -39, -305, -178, -439, -471, -257, -338, -66, +74, +175, -25, },
- { +8828, +9479, +1858, +3692, +1200, -444, +108, -2595, -2598, +225, -443, -1837, -211, -338, +130, -297, -878, +233, +403, -155, -160, +68, -348, -198, -618, -577, -252, -401, -165, +50, +123, -106, },
- { +9769, +9532, +1154, +4053, +1153, -433, +152, -3044, -2341, +1209, -501, -2958, -549, -180, +526, +122, -1023, +24, +484, -243, -273, +98, -497, -249, -730, -696, -208, -420, -294, +24, +104, -194, },
- { +10963, +10314, -18, +3480, +928, -378, +839, -3146, -2679, +1815, +181, -3477, -1184, -280, +767, +456, -1173, -196, +557, -284, -445, +171, -561, -316, -811, -844, -191, -379, -352, -44, +133, -183, },
- { +12437, +11094, -1445, +2785, +310, -110, +1926, -3295, -3171, +2280, +1217, -3589, -1908, -710, +881, +724, -1458, -605, +653, -147, -678, +163, -557, -237, -805, -1040, -224, -349, -355, -12, +190, -216, },
- { +13565, +11394, -2213, +2503, -423, +267, +2542, -3317, -3490, +2485, +2267, -3594, -2432, -1318, +735, +938, -1508, -888, +536, -170, -812, +241, -591, -131, -780, -1195, -241, -201, -267, -8, +131, -283, },
- { +14365, +11785, -2502, +2065, -1128, +690, +3071, -3145, -4082, +2294, +3294, -3126, -2782, -2332, +449, +1450, -1337, -1152, +323, -232, -796, +274, -707, -133, -760, -1160, -175, -77, -224, +1, +81, -344, },
- { +14713, +12188, -2245, +1714, -1545, +697, +3166, -2769, -4728, +1796, +4066, -2366, -3022, -3257, +104, +1860, -844, -1416, +119, -254, -847, +177, -909, -97, -642, -1112, -239, -41, -190, +38, +3, -445, },
- { +14645, +12610, -1772, +1687, -1818, +544, +3067, -2552, -5197, +1109, +4450, -1369, -2921, -4051, -284, +2048, -140, -1537, -208, -123, -1018, +64, -886, -45, -602, -1050, -397, -58, -122, -90, +12, -460, },
- { +14311, +12744, -823, +2013, -2087, +348, +2751, -2573, -5594, +298, +4380, -359, -2003, -4793, -1003, +2181, +482, -1298, -654, -93, -995, -9, -758, +71, -678, -1141, -461, -235, -94, -220, +50, -343, },
- { +13776, +12639, +346, +2236, -2014, +116, +2251, -2236, -6147, -504, +3963, +239, -615, -5033, -2049, +2178, +726, -876, -698, -265, -701, -87, -865, +185, -648, -1310, -522, -464, -75, -87, +92, -171, },
- { +13149, +12169, +1402, +2459, -1565, +84, +1536, -1759, -6362, -1341, +3564, +365, +555, -4522, -3382, +1810, +905, -453, -324, -409, -562, -71, -953, +103, -691, -1468, -465, -480, -26, +135, +160, -111, },
- { +12380, +11681, +1885, +3275, -1333, -131, +1419, -1701, -5961, -2232, +3308, +405, +924, -3382, -4610, +1021, +1316, -94, -127, -370, -464, +43, -1042, -366, -474, -1380, -504, -384, +12, +312, +117, -135, },
- { +11903, +11393, +1499, +3646, -589, -712, +1361, -1471, -5102, -2585, +2953, +277, +167, -1768, -4726, -478, +1438, +247, +197, -198, -524, -85, -1094, -602, -205, -1156, -495, -151, -147, +245, +126, -155, },
- { +11277, +11106, +1068, +3696, +162, -535, +662, -1668, -3438, -2767, +2450, +580, -999, -611, -3766, -1971, +1197, +402, +51, +288, -364, -586, -1018, -564, +72, -690, -805, -170, -83, +153, +125, -123, },
- { +10588, +10248, +1041, +3990, +549, -596, +503, -1508, -2940, -2531, +2104, +852, -1356, -383, -2481, -2696, +537, +474, -251, +251, -199, -459, -926, -574, +197, -420, -1013, -187, +29, +54, +181, -131, },
- { +9521, +9264, +1317, +4316, +722, -767, +764, -816, -2661, -2833, +1508, +1326, -1203, -394, -1458, -2679, +165, +492, -606, -94, -331, -324, -381, -536, -231, -294, -717, -35, +53, -16, +190, -183, },
- { +9295, +8224, +1109, +5503, +566, -1438, +1272, -36, -2542, -3436, +897, +1558, -877, +95, -1150, -3243, +276, +686, -962, -210, -683, -628, -208, -496, -150, -199, -735, +279, +265, -118, +39, -219, },
- { +7955, +7915, +2062, +4941, +392, -1429, +1053, -497, -1939, -2532, -124, +882, -416, +352, -483, -2672, -726, +593, -30, -164, -732, -489, -159, -285, -145, -245, -559, -60, +99, -150, +30, -106, },
- { +7031, +7277, +2031, +4336, +697, -646, +955, -623, -1641, -2182, -233, +535, -317, +229, -165, -1960, -826, +699, +101, -378, -580, -260, -151, -369, -398, -280, -286, -150, -143, -139, +125, -38, },
- { +6295, +6730, +1892, +3559, +1033, +63, +744, -685, -1521, -1804, -171, +306, -225, +149, +4, -1512, -648, +773, +80, -370, -396, -159, -189, -414, -539, -344, -273, -228, -102, -44, +122, +2, },
- { +5567, +6186, +1652, +2969, +1443, +344, +573, -641, -1422, -1343, -105, +121, -57, +247, +28, -1174, -348, +731, +56, -360, -317, -47, -217, -426, -532, -288, -251, -274, -18, +48, +118, -19, },
- { +4996, +5539, +1497, +2838, +1501, +319, +538, -541, -1215, -962, -91, -26, +159, +383, +48, -835, -191, +492, -4, -250, -216, -31, -205, -289, -352, -182, -273, -311, -10, +79, +133, -33, },
- { +4369, +4911, +1493, +2561, +1337, +470, +618, -484, -1046, -662, +27, +2, +405, +487, +57, -528, -160, +283, +46, -156, -163, +53, -43, -114, -258, -209, -289, -247, +29, +65, +110, +22, },
- { +3634, +4210, +1572, +2321, +1183, +650, +679, -395, -859, -352, +291, +111, +541, +545, +126, -276, -117, +132, +29, -68, -30, +169, -23, -64, -184, -195, -205, -180, +9, +60, +105, +51, },
- { +3016, +3577, +1500, +2051, +987, +707, +858, -234, -596, +114, +631, +273, +558, +609, +229, -166, -145, -29, +96, +94, -41, +113, +28, +51, -118, -204, -138, -123, -4, +88, +117, +1, },
- { +2776, +3142, +1225, +1761, +847, +791, +1067, +272, -238, +302, +902, +413, +488, +421, +138, -130, -62, +38, +115, +77, -79, +99, +64, +85, -110, -151, -69, -33, +59, +61, +9, -164, },
- { +2597, +2855, +1075, +1771, +1129, +1005, +1152, +473, +68, +492, +881, +270, +197, +161, +118, +79, +88, +32, -20, -32, -27, +115, +32, +153, +68, -66, -90, -62, +9, -70, -139, -184, },
- { +2669, +3145, +1471, +2033, +1221, +1035, +1183, +275, -243, +270, +725, +249, +159, +52, +151, +138, -51, -81, +23, -1, -18, +190, +86, +173, +118, -82, -134, -156, -186, -160, -81, -98, },
- { +2819, +3343, +1567, +2048, +1169, +1075, +1248, +244, -402, -85, +455, +306, +297, +79, +134, +124, +55, +91, +34, -77, +10, +181, -46, +108, +219, +134, -56, -289, -273, -145, -92, -88, },
- { +2900, +3386, +1384, +1773, +1008, +1084, +1261, +225, -495, +12, +783, +242, +37, -53, -9, +253, +383, +202, +102, +70, -62, +11, -40, +64, +31, +110, +190, -6, -190, -236, -126, -117, },
- { +3231, +3701, +1275, +1612, +705, +788, +1133, +122, -729, -179, +937, +566, +221, -206, -199, +166, +308, +308, +335, +202, +36, +131, -62, -37, -38, -83, +43, +191, +169, +38, -106, -235, },
- { +3635, +4205, +1339, +1662, +626, +662, +937, -299, -1254, -578, +1037, +699, +166, -176, -99, +200, +312, +211, +211, +294, +129, +195, +63, +39, -40, -148, -70, +74, +192, +288, +163, -117, },
- { +4194, +4783, +1346, +1788, +630, +642, +840, -677, -1766, -952, +1124, +635, -123, -376, -187, +304, +462, +242, +276, +259, +18, +219, +17, +71, +61, -99, -59, +121, +125, +97, +206, +113, },
- { +4979, +5362, +1202, +1940, +602, +719, +840, -1009, -2235, -1155, +1361, +510, -477, -624, -359, +169, +423, +212, +324, +400, +17, +168, -5, +20, +47, -58, +31, +174, +74, +79, +86, +27, },
- { +6045, +6030, +859, +2185, +506, +725, +848, -1395, -2650, -1218, +1701, +338, -794, -842, -492, +56, +296, +67, +259, +328, -97, +236, +42, +27, -10, -99, -27, +180, +116, +105, +139, -10, },
- { +7127, +6787, +391, +2413, +495, +620, +850, -1887, -2997, -1109, +1985, +195, -1031, -1079, -541, +28, +148, +5, +155, +227, -224, +200, +4, -1, -101, -203, -81, +123, +136, +165, +254, +85, },
- { +8041, +7641, +54, +2482, +542, +525, +873, -2340, -3303, -988, +2101, +103, -1125, -1253, -590, +7, +85, -30, +110, +254, -288, +69, -159, -33, -202, -285, -79, +104, +146, +180, +291, +49, },
- { +8670, +8596, +151, +2444, +429, +355, +1004, -2691, -3423, -1007, +1694, +127, -881, -1445, -767, -93, +121, +297, -11, +97, -290, +1, -294, -164, -296, -328, -78, +89, +211, +122, +240, -5, },
- { +8845, +9339, +619, +2533, +443, -115, +1042, -2670, -3312, -1004, +882, -48, -483, -1247, -888, -243, +10, +511, +67, -76, -337, -56, -239, -164, -351, -335, -149, -114, +174, +149, +241, -25, },
- { +8992, +9809, +1188, +2897, +625, -583, +690, -2700, -3089, -635, -11, -646, -104, -790, -618, -507, -344, +619, +168, -148, -236, -69, -262, -132, -414, -375, -196, -304, +74, +121, +206, -26, },
- { +9299, +9977, +1439, +3466, +927, -820, +224, -3016, -2800, -12, -737, -1360, +110, -354, -169, -639, -802, +553, +363, -141, -128, +0, -287, -205, -550, -443, -225, -438, -58, +99, +221, -4, },
- { +10058, +9879, +1163, +4263, +1177, -922, -219, -3311, -2434, +862, -1303, -2457, +248, -70, +493, -501, -1236, +540, +538, -275, -74, +119, -379, -193, -775, -553, -189, -513, -161, +91, +140, -128, },
- { +11144, +9761, +369, +4862, +1071, -936, -203, -3855, -2065, +1997, -1565, -3828, +38, +198, +979, -90, -1513, +341, +661, -404, -156, +165, -600, -237, -878, -660, -142, -564, -301, +70, +104, -215, },
- { +12546, +10246, -966, +4691, +927, -833, +309, -4199, -2112, +2959, -1144, -4789, -535, +243, +1329, +364, -1689, +85, +795, -505, -386, +288, -677, -309, -1025, -827, -61, -516, -419, +27, +137, -278, },
- { +14045, +11382, -2788, +3760, +580, -650, +1686, -4408, -2934, +3566, -51, -5174, -1321, +73, +1428, +705, -1911, -307, +891, -369, -599, +281, -731, -286, -1048, -1082, -16, -454, -510, -50, +248, -211, },
- { +15970, +11714, -4486, +3446, -223, -120, +2672, -4778, -3223, +4216, +1130, -5477, -2203, -468, +1756, +960, -2402, -712, +1105, -303, -935, +391, -711, -185, -1048, -1265, -82, -424, -432, +54, +241, -341, },
- { +17220, +11916, -5327, +3210, -1072, +444, +3327, -4843, -3644, +4439, +2382, -5600, -2783, -1154, +1580, +1254, -2411, -1038, +941, -324, -1057, +499, -778, -47, -1032, -1459, -61, -214, -352, +22, +162, -398, },
- { +18240, +12274, -5799, +2731, -1899, +1079, +3952, -4749, -4376, +4334, +3662, -5208, -3266, -2349, +1378, +1910, -2296, -1381, +715, -370, -1038, +545, -912, -20, -1028, -1437, +31, -67, -319, +18, +102, -464, },
- { +18833, +12668, -5683, +2184, -2439, +1329, +4171, -4328, -5232, +3901, +4824, -4546, -3741, -3476, +1105, +2561, -1914, -1779, +533, -418, -1036, +485, -1184, +14, -859, -1412, +1, +27, -315, +91, +5, -584, },
- { +19008, +13162, -5318, +1926, -2788, +1224, +4180, -3950, -5962, +3321, +5549, -3543, -3998, -4445, +848, +2902, -1193, -2106, +263, -305, -1180, +327, -1267, +112, -828, -1285, -169, +16, -197, +33, -71, -637, },
- { +18737, +13681, -4618, +1963, -3145, +1044, +4007, -3789, -6476, +2407, +5985, -2289, -3707, -5492, +344, +3198, -328, -2230, -228, -74, -1401, +254, -1150, +181, -810, -1310, -322, -25, -144, -179, +21, -629, },
- { +18348, +13822, -3468, +2221, -3496, +867, +3623, -3756, -6961, +1517, +5968, -1098, -2716, -6475, -416, +3438, +367, -2015, -778, +7, -1351, +154, -986, +288, -914, -1395, -403, -225, -85, -331, +78, -475, },
- { +17731, +13756, -2024, +2354, -3509, +578, +3074, -3309, -7685, +628, +5586, -260, -1146, -7037, -1592, +3604, +681, -1553, -946, -177, -966, +4, -1088, +448, -897, -1594, -473, -493, -35, -196, +111, -266, },
- { +16988, +13672, -858, +2219, -2857, +446, +2261, -2723, -8186, -143, +5173, +8, +354, -6856, -3083, +3505, +877, -1058, -660, -442, -746, +8, -1186, +419, -932, -1761, -398, -679, +86, +39, +115, -97, },
- { +16138, +12803, +575, +2903, -2738, +274, +1624, -2112, -8167, -1458, +4911, +239, +1463, -6034, -4971, +3030, +1336, -611, -295, -547, -554, +6, -1339, +184, -852, -1914, -351, -543, +76, +333, +176, -169, },
- { +15265, +12532, +737, +3734, -2365, -148, +1753, -2212, -7519, -2381, +4804, +154, +1395, -4336, -6360, +1992, +1942, -242, -104, -546, -503, +190, -1457, -473, -403, -1767, -438, -339, +44, +430, +96, -165, },
- { +14708, +12215, +282, +4265, -1521, -1002, +1719, -1840, -6421, -2928, +4336, +115, +445, -2293, -6587, +102, +2286, +140, +231, -302, -617, -45, -1479, -669, -78, -1505, -452, -92, -181, +382, +108, -202, },
- { +13989, +12100, -300, +4352, -584, -894, +751, -1879, -4250, -3597, +3863, +484, -1133, -527, -5742, -1882, +2289, +370, +107, +366, -557, -756, -1254, -675, +260, -958, -884, -49, -127, +270, +110, -168, },
- { +13107, +11235, -316, +4649, +46, -886, +387, -2126, -3083, -3291, +3067, +1077, -1914, +82, -4188, -3391, +1793, +547, -349, +600, -246, -893, -1266, -562, +499, -574, -1293, -81, +40, +122, +177, -141, },
- { +12123, +10207, -26, +5040, +240, -1159, +554, -1339, -3049, -3489, +2834, +1553, -2088, +86, -2702, -3839, +1078, +690, -758, +264, -223, -525, -820, -718, +257, -322, -1226, +21, +75, +12, +282, -234, },
- { +10747, +9168, +566, +5397, +351, -1371, +926, -546, -2786, -3752, +1902, +1979, -1557, -9, -1749, -3706, +668, +745, -1061, -69, -419, -453, -245, -659, -216, -192, -848, +155, +137, -64, +205, -239, },
- { +10338, +7957, +561, +6771, -2, -2128, +1652, +306, -2773, -4474, +1333, +2284, -1324, +617, -1488, -4429, +966, +918, -1497, -98, -822, -796, -54, -649, -27, -96, -951, +551, +331, -223, +48, -268, },
- { +8720, +7871, +1937, +5955, -252, -2274, +1362, -265, -1942, -3385, -195, +1599, -597, +942, -704, -3945, -437, +923, -232, -93, -938, -655, -8, -340, +19, -166, -798, +69, +242, -236, +6, -124, },
- { +7602, +7369, +1980, +5375, +188, -1525, +1271, -440, -1548, -3046, -447, +1237, -466, +757, -218, -3077, -861, +1080, +8, -496, -751, -394, -12, -415, -286, -141, -377, -40, -114, -262, +138, -57, },
- { +6659, +6622, +2031, +4526, +599, -537, +864, -488, -1252, -2664, -491, +837, -265, +650, -6, -2474, -736, +1187, -23, -536, -523, -192, -58, -543, -514, -195, -232, -228, -227, -106, +203, +4, },
- { +5900, +6258, +1847, +3648, +1138, +55, +581, -518, -1216, -2232, -426, +663, -175, +546, +190, -2072, -582, +1218, -57, -487, -330, -182, -121, -530, -618, -248, -293, -250, -52, -43, +131, +41, },
- { +5056, +5699, +1640, +3073, +1682, +223, +366, -415, -1093, -1701, -428, +436, +76, +685, +156, -1697, -250, +1101, -72, -482, -271, -35, -164, -545, -578, -155, -255, -314, +31, +57, +129, +2, },
- { +4420, +5031, +1526, +2971, +1795, +154, +317, -287, -871, -1279, -467, +257, +332, +803, +167, -1309, -82, +802, -141, -342, -151, -34, -185, -411, -382, -26, -278, -370, +32, +101, +150, -29, },
- { +3741, +4414, +1550, +2755, +1697, +240, +358, -209, -641, -963, -482, +156, +636, +955, +153, -952, -130, +526, -22, -234, -141, -29, -17, -156, -225, -73, -393, -324, +91, +81, +127, +14, },
- { +2974, +3771, +1714, +2268, +1466, +609, +473, -195, -532, -642, -208, +371, +868, +928, +168, -618, -68, +350, +7, -152, -30, +198, +164, -106, -265, -109, -239, -204, +88, +59, +101, +117, },
- { +2091, +3036, +1907, +2129, +1391, +724, +464, -41, -262, -310, +40, +365, +939, +1032, +282, -384, -88, +174, -12, -37, +129, +229, +41, -48, -98, -70, -190, -179, +36, +72, +111, +99, },
- { +1445, +2433, +1850, +1781, +1171, +805, +720, +119, +17, +232, +387, +551, +917, +1092, +388, -310, -142, -4, +121, +154, +38, +139, +164, +94, -72, -106, -103, -116, +22, +112, +121, +28, },
- { +1185, +1993, +1603, +1441, +986, +909, +956, +692, +298, +365, +753, +730, +851, +889, +295, -301, -75, +80, +163, +139, -24, +148, +231, +110, -113, -59, -17, -3, +88, +93, +26, -171, },
- { +929, +1455, +1263, +1389, +1207, +1075, +1117, +1195, +937, +623, +608, +551, +588, +631, +253, -42, +158, +103, +4, +39, +49, +61, +131, +212, +119, +81, -26, +0, +138, -59, -235, -232, },
- { +822, +1583, +1506, +1563, +1699, +1350, +1018, +900, +685, +649, +736, +432, +188, +378, +360, +160, +134, -13, -136, -75, +123, +246, +203, +257, +240, +33, -106, -86, -100, -185, -187, -131, },
- { +1055, +2056, +2052, +1866, +1431, +1170, +1157, +723, +299, +248, +365, +522, +438, +367, +368, +108, -145, -117, +92, +69, +74, +249, +238, +249, +240, +27, -128, -200, -286, -220, -88, -53, },
- { +1205, +2171, +1980, +1773, +1441, +1300, +1201, +725, +193, -127, +142, +624, +550, +387, +335, +108, +110, +159, +2, -95, +146, +227, +29, +177, +403, +337, -41, -376, -330, -171, -140, -61, },
- { +1241, +2158, +1760, +1464, +1328, +1398, +1227, +684, +95, +70, +568, +408, +149, +304, +228, +314, +526, +203, +21, +102, +15, -27, +94, +161, +134, +344, +341, -75, -343, -352, -143, -62, },
- { +1622, +2444, +1530, +1228, +926, +1008, +1151, +744, -34, -42, +764, +765, +377, -38, -176, +304, +572, +431, +399, +163, +15, +139, +7, -83, +139, +174, +132, +311, +140, -144, -288, -260, },
- { +1988, +2810, +1493, +1199, +762, +896, +984, +329, -524, -369, +974, +1088, +421, +50, +39, +109, +262, +367, +396, +394, +294, +181, +60, +66, -63, -115, +123, +273, +319, +228, -43, -271, },
- { +2526, +3457, +1538, +1318, +724, +747, +744, -154, -1107, -804, +1097, +1060, +234, +52, +56, +324, +531, +217, +162, +419, +225, +256, +263, +67, +92, -2, -93, +88, +240, +428, +251, -76, },
- { +3196, +4012, +1429, +1473, +720, +771, +686, -545, -1618, -1131, +1253, +952, -133, -206, -51, +422, +646, +293, +343, +345, +85, +287, +111, +124, +185, +14, -5, +226, +158, +71, +246, +198, },
- { +4055, +4548, +1209, +1653, +679, +876, +676, -915, -2105, -1296, +1540, +778, -521, -439, -221, +267, +627, +274, +404, +557, +82, +190, +96, +57, +173, +67, +122, +268, +75, +91, +69, +85, },
- { +5274, +5182, +788, +1972, +519, +928, +689, -1324, -2574, -1398, +1954, +556, -880, -663, -380, +149, +471, +122, +381, +459, +18, +339, +145, +8, +122, +110, +27, +301, +132, +67, +132, +6, },
- { +6463, +5753, +204, +2322, +409, +883, +685, -1827, -2887, -1237, +2299, +272, -1164, -830, -425, +53, +394, -18, +257, +435, -217, +313, +174, +118, +26, -101, +42, +280, +156, +192, +176, +19, },
- { +7727, +6595, -464, +2628, +421, +701, +721, -2439, -3227, -1064, +2569, +149, -1378, -1132, -432, +91, +148, +15, +160, +263, -252, +291, +71, -34, -78, -110, -65, +186, +193, +201, +372, +187, },
- { +8674, +7441, -887, +2687, +475, +615, +762, -2918, -3490, -885, +2619, +32, -1422, -1271, -474, +50, +151, -43, +133, +383, -345, +103, -122, +5, -192, -218, -4, +192, +197, +219, +350, +56, },
- { +9426, +8468, -909, +2618, +320, +470, +937, -3379, -3580, -906, +2153, +153, -1146, -1581, -641, -54, +224, +390, -97, +193, -307, +44, -287, -162, -284, -252, +7, +204, +290, +112, +287, +9, },
- { +9648, +9372, -545, +2609, +289, -35, +1177, -3423, -3509, -971, +1312, +111, -652, -1474, -971, -83, +171, +613, -45, +26, -344, -79, -230, -165, -334, -249, -69, -50, +303, +195, +309, -45, },
- { +9794, +9998, +39, +2769, +379, -638, +980, -3266, -3261, -859, +205, -83, -237, -1162, -748, -518, -59, +946, +29, -268, -354, +5, -131, -183, -422, -257, -155, -194, +224, +120, +248, +7, },
- { +9981, +10397, +622, +3286, +610, -1141, +509, -3403, -3000, -195, -811, -998, +359, -548, -477, -751, -558, +952, +151, -164, -95, -136, -277, -86, -487, -322, -168, -469, +127, +155, +238, -39, },
- { +10400, +10438, +745, +3939, +894, -1363, +3, -3769, -2585, +471, -1670, -1614, +581, -153, +52, -948, -1056, +930, +424, -236, -31, +17, -267, -241, -666, -379, -196, -563, -20, +129, +269, +14, },
- { +11293, +10206, +442, +4923, +1094, -1505, -530, -3996, -2130, +1419, -2437, -2806, +924, +121, +806, -871, -1571, +1001, +618, -424, +58, +151, -379, -185, -956, -481, -127, -651, -119, +140, +160, -149, },
- { +12405, +9835, -281, +5828, +885, -1582, -583, -4592, -1654, +2615, -2996, -4362, +959, +504, +1380, -564, -2020, +895, +761, -610, +81, +185, -720, -204, -1012, -549, -116, -759, -235, +116, +85, -201, },
- { +13934, +9778, -1546, +6319, +686, -1381, -382, -5271, -1119, +3944, -3172, -5767, +686, +682, +1741, +77, -2181, +507, +979, -721, -237, +318, -773, -227, -1265, -756, +92, -716, -477, +162, +134, -400, },
- { +15591, +10583, -3448, +5772, +592, -1315, +577, -5494, -1701, +4790, -2265, -6627, -93, +745, +2160, +357, -2547, +377, +1130, -881, -407, +529, -934, -349, -1319, -885, +105, -673, -507, +45, +171, -344, },
- { +17313, +11801, -5808, +4851, +227, -980, +2385, -6012, -2746, +5567, -996, -7076, -952, +586, +2154, +773, -2812, -169, +1297, -600, -709, +461, -948, -242, -1337, -1246, +226, -600, -658, -10, +354, -281, },
- { +19637, +11754, -7792, +4845, -732, -208, +3348, -6604, -2889, +6378, +241, -7587, -1944, +32, +2714, +992, -3500, -540, +1647, -590, -1131, +670, -931, -134, -1354, -1421, +144, -583, -536, +136, +307, -469, },
- { +21056, +11745, -8787, +4783, -1622, +469, +3944, -6753, -3241, +6740, +1590, -8058, -2609, -411, +2588, +1199, -3554, -896, +1543, -588, -1309, +826, -1017, +54, -1317, -1707, +140, -326, -455, +92, +212, -518, },
- { +22470, +11991, -9701, +4389, -2684, +1431, +4782, -6942, -4015, +6909, +3084, -7923, -3158, -1809, +2522, +1950, -3598, -1289, +1296, -609, -1331, +920, -1125, +160, -1425, -1754, +339, -152, -445, +42, +154, -583, },
- { +23333, +12284, -9893, +3816, -3344, +2109, +5145, -6669, -4930, +6673, +4509, -7499, -3802, -2971, +2448, +2729, -3461, -1700, +1131, -635, -1249, +918, -1341, +144, -1300, -1646, +329, -23, -418, +82, +75, -652, },
- { +23907, +12687, -9670, +3149, -3819, +2297, +5278, -6129, -6015, +6230, +5855, -6823, -4412, -4207, +2246, +3493, -3012, -2245, +989, -670, -1278, +815, -1685, +265, -1083, -1694, +279, +79, -444, +187, -65, -803, },
- { +24068, +13242, -9317, +2853, -4157, +2181, +5293, -5711, -6874, +5677, +6685, -5741, -4828, -5227, +2103, +3851, -2196, -2705, +724, -483, -1476, +639, -1724, +395, -1100, -1511, +43, +72, -276, +84, -146, -836, },
- { +23835, +13868, -8722, +2737, -4517, +2057, +5139, -5437, -7512, +4767, +7374, -4441, -4873, -6362, +1764, +4214, -1258, -3060, +266, -145, -1812, +589, -1602, +416, -1030, -1500, -192, +122, -223, -168, -12, -862, },
- { +23307, +14493, -7616, +2886, -5061, +1805, +4905, -5438, -8024, +3633, +7772, -2910, -4088, -7840, +1069, +4716, -316, -3023, -501, +151, -1943, +531, -1399, +596, -1194, -1653, -168, -131, -123, -407, +123, -804, },
- { +22971, +14195, -6115, +3007, -5341, +1777, +4268, -5238, -8637, +2925, +7500, -1787, -2907, -8792, +313, +4922, +197, -2731, -1003, +162, -1684, +337, -1204, +594, -1286, -1645, -381, -303, -37, -516, +148, -504, },
- { +22070, +14375, -4392, +2868, -5223, +1286, +3714, -4447, -9674, +1907, +7159, -860, -973, -9579, -1209, +5344, +421, -2142, -1115, -130, -1112, +96, -1456, +898, -1239, -2004, -343, -667, +59, -231, +163, -308, },
- { +21240, +14393, -3174, +2492, -4298, +1094, +2745, -3688, -10265, +1178, +6777, -618, +645, -9443, -2927, +5381, +636, -1617, -791, -478, -882, +115, -1535, +816, -1293, -2149, -223, -878, +246, +6, +122, -102, },
- { +20341, +13345, -1099, +2866, -4191, +914, +1804, -2626, -10582, -327, +6635, -287, +2111, -8876, -5214, +5209, +1109, -1120, -336, -736, -608, +24, -1715, +729, -1303, -2434, -80, -706, +170, +364, +230, -221, },
- { +19164, +13059, -468, +4105, -4326, +617, +1911, -2785, -9817, -1770, +6595, -131, +2540, -7381, -7331, +4587, +2019, -857, -311, -599, -501, +196, -1861, -41, -744, -2295, -231, -641, +296, +624, -2, -206, },
- { +18422, +13001, -808, +4597, -3422, -211, +2249, -2884, -9087, -2495, +6668, -543, +1814, -4858, -8725, +3134, +2718, -437, +54, -836, -508, +440, -2036, -713, -94, -2244, -301, -159, -24, +549, +64, -190, },
- { +17855, +12583, -1366, +5362, -2553, -1443, +2178, -2151, -7613, -3290, +5904, -270, +528, -2457, -8756, +644, +3333, -90, +363, -320, -761, -106, -1922, -663, +147, -1870, -338, +6, -294, +558, +55, -269, },
- { +16989, +12653, -2050, +5407, -1459, -1174, +828, -2193, -4917, -4430, +5563, +243, -1454, -249, -7905, -1684, +3547, +136, +95, +521, -741, -985, -1507, -732, +567, -1249, -1016, +108, -174, +393, +77, -205, },
- { +15955, +11844, -2035, +5709, -643, -1173, +284, -2723, -3123, -4229, +4384, +1201, -2654, +769, -6230, -3909, +3368, +375, -503, +1015, -370, -1372, -1549, -501, +871, -801, -1619, +110, +41, +191, +164, -153, },
- { +15076, +10787, -1651, +6161, -494, -1528, +363, -1853, -3374, -4091, +4325, +1345, -2786, +774, -4553, -4709, +2401, +708, -854, +734, -248, -874, -1363, -746, +954, -560, -1815, +201, +149, +40, +297, -250, },
- { +13619, +9790, -1075, +6480, -296, -1830, +805, -986, -3179, -4836, +3833, +2526, -3239, +844, -2857, -5293, +1983, +856, -1538, +348, -255, -582, -521, -965, +224, -130, -1436, +334, +56, -57, +433, -405, },
- { +11990, +8803, -122, +6797, -290, -2053, +1262, -151, -2986, -4897, +2471, +2765, -2059, +507, -2148, -4881, +1467, +956, -1677, +43, -545, -596, -9, -842, -196, -59, -1007, +415, +207, -148, +219, -297, },
- { +12081, +7961, -53, +8316, -2153, -3098, +1599, -1374, -4780, -3918, +6091, +1729, -1658, +3619, -1653, -4298, +1906, +240, -2274, -904, -1646, -475, -581, -1417, -48, -621, -760, +583, -70, -397, +372, +38, },
- { +10221, +7710, +913, +7396, -744, -3594, +288, -1159, -3490, -2578, +4228, +2100, -676, +2348, -1090, -3898, +283, +166, -1419, -166, -1389, -451, +154, -1605, +30, -242, -1341, +92, +30, -175, +146, +10, },
- { +8688, +6964, +1507, +6729, -314, -2703, +315, -1206, -2584, -2071, +3004, +1882, -602, +1784, -753, -3344, +27, -28, -1040, +36, -1038, -169, +101, -1356, +51, -283, -1249, -154, -166, -180, +96, -77, },
- { +7115, +6222, +2194, +6013, +21, -1813, +346, -984, -1850, -1758, +2164, +1394, -547, +1436, -539, -2734, -356, -16, -801, -44, -393, +279, +133, -1115, -80, -420, -1086, -375, -460, -339, +102, +64, },
- { +5945, +5731, +2369, +5160, +628, -1311, +172, -355, -1302, -1644, +1506, +1052, -512, +980, -248, -2308, -600, +61, -662, +216, +230, +430, +21, -924, -262, -525, -975, -595, -515, -352, +24, +58, },
- { +4951, +5289, +2362, +4475, +1066, -1021, +399, +107, -1048, -1369, +919, +662, -450, +769, -110, -1957, -639, +150, -163, +531, +305, +258, +28, -774, -421, -578, -897, -479, -486, -369, -53, -38, },
- { +4363, +4902, +2175, +3906, +1203, -661, +681, +254, -736, -1138, +362, +420, -286, +700, -78, -1616, -376, +371, +225, +620, +133, +107, -31, -735, -442, -346, -613, -527, -506, -305, -33, +11, },
- { +3887, +4410, +1997, +3432, +1166, -200, +836, +280, -488, -1038, -68, +289, -94, +640, +127, -1246, -284, +556, +413, +412, -66, +15, -158, -547, -132, -220, -649, -561, -395, -212, +21, +92, },
- { +3376, +3956, +1885, +2975, +1204, +193, +869, +327, -309, -968, -279, +153, +258, +942, +175, -1108, -255, +727, +480, +101, -239, +78, +89, -338, -137, -200, -570, -519, -230, -33, +148, +121, },
- { +2882, +3708, +1714, +2272, +1421, +628, +806, +292, -242, -915, -154, +676, +462, +684, +167, -864, -170, +750, +347, -82, -16, +193, +144, -210, -259, -192, -347, -281, -16, +141, -8, -250, },
- { +2046, +3121, +1820, +2057, +1654, +693, +650, +385, +140, -232, -150, +593, +684, +440, +155, -506, -275, +602, +454, -11, +56, +206, +86, -187, -110, +2, -156, -45, +18, -158, -271, -285, },
- { +1488, +2866, +1983, +1297, +1310, +1249, +896, +455, +406, +318, +200, +433, +517, +126, +107, -107, -188, +504, +467, +57, +7, +98, +167, +102, +54, +69, +57, -187, -324, -266, -204, -157, },
- { +1053, +2185, +1754, +1283, +1374, +1384, +1276, +1018, +579, +445, +413, +125, +270, +305, -100, -39, +315, +357, +242, +93, +19, +226, +393, +295, +143, -27, -218, -292, -266, -226, -155, -132, },
- { +1057, +1688, +1471, +1786, +1766, +1650, +1060, +783, +933, +472, +248, +183, +76, +69, +137, +183, +238, +233, +230, +317, +365, +313, +253, +237, +26, -223, -314, -259, -170, -175, -164, -190, },
- { +1484, +2348, +1611, +1846, +1758, +1472, +1102, +423, +268, +233, +403, +262, +27, +176, +309, +97, -27, +318, +563, +614, +474, +195, -31, -203, -192, -193, -175, -172, -180, -189, -226, -227, },
- { +1189, +2150, +2013, +2091, +1722, +1365, +885, +462, +260, +102, +413, +490, +320, +96, +1, +58, +212, +334, +486, +716, +577, +224, -92, -268, -289, -245, -180, -118, -126, -201, -214, -200, },
- { +1538, +2422, +1826, +1858, +1328, +1049, +982, +559, +11, +288, +803, +359, +369, +46, -142, +244, +201, +241, +677, +674, +409, +408, -39, -390, -282, -219, -225, -163, -112, -102, -144, -262, },
- { +1451, +2242, +1550, +1542, +1259, +1129, +1099, +613, +12, +373, +659, +432, +541, +134, +290, +219, +14, +256, +292, +393, +633, +888, +287, -211, -275, -432, -238, -88, -138, -127, -59, -184, },
- { +1889, +2552, +1389, +1386, +798, +799, +1037, +440, -97, +313, +902, +615, +250, +224, +305, +196, +454, +188, +213, +467, +218, +428, +693, +519, -184, -445, -344, -230, -88, -89, -79, -137, },
- { +2363, +3156, +1398, +1195, +447, +518, +860, +263, -393, +80, +1073, +455, +343, +419, -4, +307, +535, +250, +536, +315, -34, +496, +401, +321, +495, -3, -404, -292, -153, -89, -99, -128, },
- { +2825, +3421, +1231, +1466, +685, +599, +704, -461, -1098, +100, +1264, +329, +295, +180, +24, +419, +226, +386, +756, +380, +127, +240, +62, +328, +348, +131, +263, +30, -341, -335, -68, -108, },
- { +3491, +4043, +1102, +1542, +710, +589, +566, -937, -1530, +137, +1469, +122, -70, -161, -43, +468, +450, +426, +430, +401, +160, +372, +284, +90, +60, +56, +234, +293, +163, -117, -305, -271, },
- { +4318, +4870, +895, +1479, +603, +516, +626, -1326, -2005, +237, +1656, -115, -219, -418, -328, +396, +406, +377, +591, +338, -178, +469, +312, +158, +217, -234, -8, +329, +210, +69, +187, -16, },
- { +5303, +5497, +566, +1592, +649, +557, +509, -1916, -2395, +604, +1814, -332, -334, -762, -437, +361, +208, +350, +554, +119, -140, +409, +18, +313, +179, -239, +98, -40, +40, +299, +419, +154, },
- { +6339, +6214, +236, +1676, +646, +546, +369, -2580, -2680, +1136, +1943, -586, -423, -1111, -529, +411, +162, +286, +376, -36, -255, +422, +29, +77, +2, -290, -43, +175, +135, +31, +367, +299, },
- { +7425, +6991, -61, +1742, +482, +489, +257, -3260, -2805, +1599, +1929, -688, -450, -1459, -633, +395, +140, +359, +251, -272, -354, +408, -47, +55, -274, -528, -51, +174, +73, +63, +482, +141, },
- { +8275, +7928, -159, +1756, +330, +237, +226, -3790, -2846, +1890, +1754, -690, -422, -1605, -800, +248, +185, +442, +143, -377, -482, +428, -180, -145, -222, -605, -186, -18, +24, +140, +387, +163, },
- { +8779, +8969, +132, +1669, +354, -215, +82, -3976, -2837, +1984, +1471, -648, -422, -1570, -842, -60, +130, +630, +84, -403, -597, +177, +30, -221, -403, -610, -358, +87, -64, -83, +409, +63, },
- { +8644, +10014, +1089, +1453, +493, -603, -298, -3906, -2820, +1754, +1240, -552, -546, -1453, -849, -345, +44, +672, +148, -531, -682, +196, +32, -233, -584, -609, -409, -84, -103, -217, +378, +199, },
- { +8306, +10593, +2458, +1598, +488, -758, -657, -3861, -2849, +1369, +1000, -322, -680, -1443, -722, -668, -37, +677, -45, -127, -673, -156, +70, -281, -443, -635, -631, -315, -160, -54, +479, +139, },
- { +8399, +10550, +3351, +2403, +311, -794, -759, -3852, -2757, +792, +477, +47, -726, -1554, -558, -902, -349, +816, +82, -285, -484, -159, +82, -356, -623, -644, -824, -243, +7, -98, +292, +151, },
- { +8816, +10302, +3569, +3594, +382, -1029, -763, -3770, -2393, +191, -597, +339, -557, -1492, -281, -1488, -279, +1005, -143, -84, -408, -266, +120, -345, -812, -549, -772, -407, -193, -80, +533, +172, },
- { +9548, +9994, +3253, +4643, +623, -1187, -749, -3597, -1800, -143, -2200, +304, -135, -1804, +254, -1488, -709, +1187, -140, -38, -318, -470, +133, -281, -894, -381, -819, -627, -170, -88, +384, +19, },
- { +10751, +9616, +2488, +5649, +553, -1161, -620, -3463, -848, -358, -3996, +121, +130, -2080, +871, -1563, -750, +1416, -465, -119, -39, -417, +70, -275, -1074, -309, -632, -645, -410, -224, +390, -12, },
- { +12014, +9312, +1365, +6755, +300, -1330, -113, -3321, +199, -72, -5935, -749, +987, -2491, +1095, -1087, -1039, +1478, -609, -197, +278, -296, -103, -265, -1088, -288, -651, -818, -474, -102, +420, -351, },
- { +13420, +9342, -277, +7865, +178, -2087, +567, -3307, +1525, +754, -7969, -2060, +1804, -2289, +1011, -875, -1158, +1512, -570, -399, +356, -20, -88, -202, -1219, -576, -573, -671, -574, -252, +223, -435, },
- { +14807, +9961, -2295, +8150, +567, -2864, +1147, -3390, +2627, +2008, -9297, -3776, +2200, -1711, +807, -518, -1276, +1360, -541, -609, +222, +438, +75, -495, -1315, -653, -426, -658, -1054, -304, +558, -512, },
- { +16799, +11079, -4722, +7037, +966, -2929, +1994, -3796, +2704, +3553, -9595, -5358, +1866, -912, +909, -200, -1483, +979, -455, -806, +207, +669, +68, -725, -1243, -745, -665, -630, -1077, -219, +691, -658, },
- { +18748, +11700, -6587, +6122, +943, -2914, +2664, -4426, +2804, +5554, -10085, -6616, +1486, -372, +1328, -285, -1517, +471, -396, -837, +75, +587, +104, -751, -1461, -967, -816, -312, -988, -264, +684, -677, },
- { +20863, +12866, -8572, +4385, +266, -1602, +3832, -5716, +2704, +6971, -9876, -6842, +1023, -479, +1689, -35, -1641, +123, -340, -939, -107, +662, +89, -932, -1675, -1081, -768, +37, -888, -310, +796, -570, },
- { +22765, +13783, -10202, +2941, -746, -81, +4256, -6846, +2898, +7803, -8917, -6979, +238, -972, +2079, +576, -1912, -370, -306, -915, -363, +634, -131, -948, -1776, -1303, -718, +235, -798, -279, +1030, -691, },
- { +24585, +14272, -11287, +1831, -1784, +1157, +4160, -7450, +3079, +8440, -7630, -7341, -269, -1716, +2654, +1114, -2449, -581, -181, -975, -680, +550, -325, -686, -1945, -1634, -616, +402, -659, -135, +1021, -867, },
- { +25869, +14987, -12073, +934, -2610, +1696, +3918, -7361, +2532, +9076, -6029, -7754, -590, -2620, +3019, +1624, -2920, -652, -46, -1264, -966, +600, -472, -467, -2153, -1908, -503, +517, -451, -126, +848, -860, },
- { +26886, +15454, -12309, +371, -3390, +1840, +3592, -7055, +1669, +9594, -4128, -8018, -1017, -3459, +3063, +2189, -3137, -722, +61, -1655, -1121, +760, -729, -326, -2158, -2099, -462, +648, -404, -166, +686, -817, },
- { +27684, +15653, -11980, +24, -4099, +1713, +3246, -6955, +802, +10113, -2356, -7981, -1587, -4226, +3032, +2573, -2987, -885, +150, -1954, -1167, +794, -988, -168, -2014, -2167, -434, +666, -569, -144, +540, -855, },
- { +27741, +16216, -11243, -193, -4856, +1352, +3238, -7293, -125, +10598, -852, -7518, -2157, -4853, +2670, +2868, -2470, -1300, +205, -1901, -1416, +672, -1092, +16, -1804, -2095, -591, +514, -688, -235, +476, -797, },
- { +27272, +16910, -10056, -159, -5917, +966, +3706, -8117, -996, +10790, +336, -6433, -2511, -5475, +1946, +3049, -1685, -1717, +71, -1629, -1727, +569, -1061, +184, -1403, -2279, -872, +450, -920, -127, +585, -861, },
- { +26292, +17598, -8440, +25, -7051, +509, +4314, -9076, -1994, +10815, +1175, -4930, -2295, -6533, +1145, +3192, -1111, -1763, -328, -1487, -1778, +538, -867, +358, -1413, -2301, -1193, +94, -600, -21, +592, -845, },
- { +24908, +18211, -6510, +265, -7874, +12, +4724, -9478, -3509, +10716, +2192, -3778, -1219, -7880, +248, +3471, -999, -1541, -792, -1628, -1421, +841, -1035, +457, -1363, -2591, -1213, -67, -308, +27, +657, -759, },
- { +23173, +18778, -4279, +420, -8200, -952, +4606, -8583, -5614, +10055, +3892, -3343, +694, -8935, -1196, +3813, -1288, -1146, -860, -1990, -933, +977, -1325, +807, -1645, -2747, -714, -417, -75, +218, +548, -805, },
- { +22000, +18365, -2003, +631, -8453, -1561, +3477, -6891, -7183, +8672, +5645, -3122, +2529, -8996, -3276, +3955, -1630, -956, -275, -2341, -1164, +1321, -1481, +629, -1309, -2933, -330, -280, -173, +221, +483, -718, },
- { +21112, +17584, -502, +1334, -8158, -2273, +2292, -5787, -7662, +7007, +7216, -2614, +3372, -7775, -5664, +3835, -1591, -1170, +244, -2374, -1158, +1090, -1550, +627, -758, -3019, +93, -274, -410, +438, +348, -800, },
- { +20632, +17088, -637, +2364, -7070, -3739, +1695, -4935, -8217, +5848, +8673, -2173, +3453, -6082, -7678, +3590, -1152, -1978, +580, -2279, -1275, +1124, -1750, +530, -17, -2783, -114, -166, -296, +284, +223, -679, },
- { +20783, +15919, -1263, +4036, -6965, -4754, +1892, -4346, -8539, +4539, +9671, -1610, +3670, -4797, -8663, +2624, -468, -2009, +28, -2355, -1460, +1576, -1563, +142, +565, -2599, -176, -95, -480, +333, +227, -736, },
- { +19898, +14834, -883, +5611, -7741, -5058, +2778, -4286, -8109, +2022, +9952, -268, +3452, -2598, -9652, +1195, +498, -1859, -458, -2733, -1925, +1990, -998, -244, +1156, -2794, -697, +541, -558, +197, +87, -769, },
- { +18353, +13734, -294, +6773, -7182, -5247, +2895, -3546, -8000, -248, +9510, +1071, +3101, -432, -9279, -621, +1397, -1978, -692, -2518, -2682, +1633, -584, +363, +1428, -3524, -1018, +1348, -563, -124, +38, -581, },
- { +17879, +12019, -1720, +8332, -4976, -5136, +2334, -3753, -7617, -1708, +9554, +1908, +1367, +1443, -7575, -1992, +1783, -1645, -1254, -2425, -2861, +887, -188, +457, +1489, -3426, -1450, +1731, -415, -317, +8, -369, },
- { +16652, +10730, -1605, +9069, -4100, -5114, +2342, -2722, -7212, -3184, +9140, +2114, -706, +3732, -5117, -4057, +2505, -1340, -2078, -1590, -2693, +151, -496, -93, +1733, -2286, -1942, +1173, +71, -202, +59, -356, },
- { +15156, +9682, -934, +8954, -3661, -4339, +2035, -2043, -6405, -3988, +8467, +1700, -1521, +4564, -3502, -4488, +2506, -991, -2469, -1109, -2320, -118, -899, -916, +1437, -1210, -1567, +612, -176, -55, +492, -295, },
- { +13768, +8771, -687, +8850, -3021, -3693, +1828, -1815, -5404, -4221, +7310, +1847, -1818, +4247, -2573, -4214, +2383, -697, -2275, -1002, -2080, -223, -830, -1342, +608, -827, -917, +655, -473, -208, +715, -175, },
- { +14260, +8470, -4402, +9252, +637, -4904, +113, -702, -4629, -3590, +7432, -364, -3180, +3406, -815, -2084, +3326, +846, -1128, +174, -1402, -361, -2087, -2634, -411, -921, -1460, -69, -168, +123, +619, -314, },
- { +12203, +8042, -2103, +8153, +36, -4209, +166, -837, -3973, -3102, +5672, +328, -1860, +2823, -972, -1947, +2514, +629, -644, +18, -1399, -247, -1603, -2116, -289, -1032, -1262, -81, -282, -111, +472, -81, },
- { +9978, +7761, -851, +7167, +518, -3404, +616, -905, -3552, -2875, +4478, +661, -1312, +2289, -665, -1823, +1788, +811, -693, -46, -1135, -436, -1105, -1539, -267, -710, -1155, -219, -156, -293, +133, -138, },
- { +8252, +7011, +325, +6475, +571, -2476, +1105, -925, -3370, -2437, +3577, +876, -1052, +1795, -250, -1885, +1251, +954, -652, -129, -973, -426, -862, -997, +85, -618, -1083, -201, -130, -385, -107, -293, },
- { +6990, +6408, +794, +5771, +1007, -1732, +1092, -813, -2841, -2294, +2966, +1185, -1180, +1392, +18, -1807, +929, +855, -550, -195, -860, -345, -413, -570, +52, -503, -888, -152, -282, -552, -210, -339, },
- { +6315, +5794, +807, +5067, +1552, -954, +511, -614, -2056, -2084, +2442, +1235, -1125, +916, +7, -1376, +711, +581, -457, -233, -563, +16, -83, -537, -90, -310, -669, -307, -465, -561, -130, -413, },
- { +5495, +5067, +1235, +4594, +1625, -330, +383, -413, -1595, -1679, +1966, +934, -895, +616, -4, -1020, +465, +389, -292, +92, -212, +95, -14, -517, -157, -268, -599, -430, -445, -406, -157, -409, },
- { +4664, +4577, +1540, +4071, +1781, +42, +302, -196, -1100, -1341, +1290, +763, -650, +297, +59, -796, +256, +526, +78, +88, -122, +237, -54, -604, -266, -281, -530, -328, -364, -356, -110, -313, },
- { +3851, +4119, +1861, +3768, +1681, +225, +590, +32, -804, -1149, +865, +588, -638, +296, +218, -632, +437, +631, +5, +112, +96, +233, -258, -721, -220, -100, -390, -319, -297, -172, -5, -185, },
- { +3336, +3750, +1919, +3488, +1574, +321, +813, +276, -570, -1058, +527, +383, -558, +511, +605, -444, +230, +571, +103, +183, +137, -15, -469, -450, -1, -70, -317, -262, -110, +31, -67, -427, },
- { +3049, +3510, +1714, +3215, +1488, +383, +1012, +442, -405, -1074, +260, +303, -38, +921, +427, -524, +201, +517, +216, +135, -99, -116, -221, -179, +46, -34, -244, -78, -50, -204, -303, -502, },
- { +2844, +3234, +1490, +2937, +1418, +496, +1224, +481, -359, -986, +230, +762, +253, +708, +333, -527, +155, +538, +90, +24, +59, +6, -45, -70, +130, +103, -256, -256, -271, -304, -297, -325, },
- { +2647, +2909, +1294, +2675, +1363, +698, +1331, +460, -184, -366, +335, +522, +431, +628, +210, -521, -47, +509, +303, +218, +56, +23, +150, +170, +182, -200, -553, -341, -197, -165, -211, -392, },
- { +2534, +2823, +1022, +1970, +1429, +1221, +1392, +703, +196, -392, +319, +726, +304, +316, -41, -517, +273, +763, +274, +109, +137, +366, +348, -105, -308, -391, -404, -192, -101, -238, -327, -356, },
- { +1989, +2468, +1081, +1801, +1546, +1331, +1957, +1126, +247, -246, -18, +528, +333, +129, -70, -149, +414, +761, +386, +169, +318, +372, +30, -395, -334, -284, -295, -143, -195, -279, -332, -341, },
- { +1620, +2490, +1471, +1655, +2013, +1585, +1301, +1138, +603, -161, -181, -90, -24, +524, +502, +148, +414, +612, +427, +246, +105, +30, -174, -325, -240, -291, -355, -203, -136, -260, -309, -267, },
- { +1263, +2410, +2075, +1764, +1891, +1970, +1489, +641, +109, -195, -152, +183, +214, +240, +589, +646, +460, +466, +334, +34, -111, -86, -179, -264, -241, -257, -328, -326, -184, -161, -161, -211, },
- { +1659, +2476, +1676, +2229, +1972, +1422, +1669, +708, -448, -272, +296, +223, +206, +469, +501, +694, +819, +331, -104, -205, -133, -45, -56, -253, -357, -286, -277, -167, -214, -215, -128, -196, },
- { +1539, +2551, +1891, +1969, +1762, +1252, +1228, +862, +110, -20, +303, +230, +166, +358, +647, +849, +752, +128, -158, -145, -243, -82, -52, -123, -279, -382, -292, -181, -163, -170, -155, -213, },
- { +1700, +2807, +1619, +1270, +1372, +1179, +1161, +1231, +504, +52, +504, +136, +92, +640, +736, +453, +675, +669, -252, -473, -51, +20, -170, -152, -154, -240, -345, -332, -109, -89, -138, -173, },
- { +1694, +2657, +1452, +968, +771, +1023, +1613, +1199, +359, +667, +624, -76, +382, +536, +594, +753, +564, +532, +330, -84, -457, -257, +116, +14, -260, -224, -186, -331, -270, -123, -32, -136, },
- { +1868, +2708, +1232, +929, +844, +827, +1033, +736, +424, +738, +823, +481, +179, +246, +857, +667, +444, +613, +612, +119, -110, -152, -501, -78, +116, -202, -290, -173, -262, -254, -131, -141, },
- { +2010, +2795, +1111, +875, +1109, +1106, +857, -4, -401, +861, +1319, +394, +265, +408, +467, +655, +737, +455, +536, +705, +304, -158, -205, -280, -395, +24, +44, -233, -199, -207, -233, -158, },
- { +2330, +2991, +964, +1027, +1208, +1180, +792, -487, -765, +646, +1124, +466, +294, +78, +501, +769, +452, +561, +675, +354, +514, +630, -115, -307, -312, -411, -176, +29, -28, -209, -223, -273, },
- { +2824, +3565, +965, +943, +1112, +1083, +667, -717, -987, +738, +1121, +2, +110, +106, +412, +576, +458, +606, +513, +519, +535, +409, +396, +221, -406, -363, -190, -297, -93, +42, -95, -282, },
- { +3349, +3983, +872, +1076, +1173, +1134, +531, -1288, -1216, +1017, +1171, -131, -155, -369, +349, +670, +365, +458, +453, +375, +399, +660, +331, +266, +204, -128, -309, -306, -200, -192, -42, -94, },
- { +3961, +4442, +707, +1254, +1277, +1123, +361, -1769, -1366, +1301, +1136, -328, -227, -538, +131, +409, +403, +542, +281, +118, +332, +560, +285, +456, +66, +169, +247, -283, -261, -198, -228, -289, },
- { +4686, +5052, +536, +1343, +1245, +1005, +207, -2188, -1265, +1645, +926, -588, -346, -640, +177, +285, +106, +548, +311, +27, +151, +303, +255, +325, +75, +299, +196, +155, +118, -260, -236, -300, },
- { +5534, +5563, +318, +1536, +1252, +806, -127, -2646, -995, +2082, +649, -787, -525, -824, +252, +141, +115, +500, +81, -14, +111, +227, +28, +135, -85, +201, +321, +171, +203, +214, -19, -500, },
- { +6386, +6175, +93, +1727, +1236, +541, -519, -3046, -559, +2421, +322, -926, -609, -965, +269, -57, +33, +671, -21, -197, +21, +165, +4, +40, -436, +106, +232, +49, +425, +144, +66, +0, },
- { +7130, +6925, -88, +1879, +1277, +209, -950, -3419, -58, +2693, -41, -998, -710, -991, +321, -320, -82, +770, -64, -189, -88, -19, +13, -38, -523, -42, -30, +68, +150, +89, +365, -23, },
- { +7792, +7702, -133, +1956, +1357, -128, -1415, -3772, +482, +2874, -375, -1048, -862, -936, +402, -512, -233, +760, -129, -149, -81, -155, -78, -100, -630, -36, -59, -442, +95, +280, +185, +75, },
- { +8084, +8648, +147, +1800, +1588, -465, -1801, -4057, +739, +3060, -585, -1055, -1095, -889, +484, -597, -294, +651, -254, -145, -54, -182, -110, -282, -564, -209, -393, -202, +61, +14, +171, +1, },
- { +7950, +9589, +964, +1429, +1845, -635, -2157, -4183, +602, +3177, -602, -1039, -1301, -965, +529, -614, -333, +613, -355, -295, -22, -253, -53, -255, -948, -322, -205, -347, -6, +31, +59, -71, },
- { +7608, +10215, +2256, +1215, +1866, -509, -2499, -4150, +252, +3102, -462, -1007, -1377, -1131, +543, -620, -361, +628, -344, -407, -176, -143, -39, -636, -843, -265, -361, -355, -99, +51, +143, +45, },
- { +7478, +10350, +3382, +1641, +1562, -364, -2671, -4182, +82, +2795, -422, -952, -1415, -1234, +496, -705, -369, +637, -288, -460, -139, -421, -273, -301, -1004, -427, -393, -387, -99, +121, +207, -128, },
- { +7601, +10277, +3938, +2546, +1409, -546, -2604, -4195, -39, +2430, -446, -937, -1542, -1235, +449, -844, -397, +623, -239, -176, -592, -583, -41, -478, -953, -587, -540, -343, +32, +110, -10, -156, },
- { +7999, +10060, +3982, +3415, +1699, -807, -2609, -3807, -190, +1946, -508, -758, -1860, -1306, +494, -1071, -466, +696, -160, -448, -342, -561, -316, -440, -936, -533, -717, -285, -33, -87, +138, +52, },
- { +8868, +9667, +3696, +4220, +1884, -786, -2974, -3169, -25, +1022, -611, -333, -2076, -1587, +587, -1486, -187, +551, -545, +152, -427, -718, -238, -557, -971, -356, -742, -544, -186, +78, +286, -144, },
- { +10008, +9228, +3019, +5173, +1730, -514, -3173, -2654, +674, -266, -982, +303, -2059, -1915, +478, -1617, -384, +327, -296, +313, -485, -639, -255, -549, -996, -197, -986, -652, +62, -23, +48, -97, },
- { +11234, +8968, +1867, +6284, +1449, -576, -2850, -2320, +1671, -1457, -1966, +1061, -1777, -2251, +610, -2387, -502, +717, -908, +856, -362, -807, -179, -457, -950, -356, -981, -565, +70, -205, +52, -184, },
- { +12424, +9043, +307, +7301, +1477, -1225, -2226, -1811, +2733, -2240, -3502, +1512, -1095, -2186, +52, -2767, -416, +476, -1043, +1163, -163, -967, -182, -310, -939, -309, -1033, -648, +172, -197, -66, -313, },
- { +13850, +9410, -1577, +7710, +1903, -2007, -1727, -1126, +3784, -2445, -5373, +1368, +274, -2547, -214, -2859, -931, +830, -1404, +1283, +192, -1142, -131, -304, -939, -130, -968, -870, +367, -211, -179, -446, },
- { +15689, +10650, -4191, +6439, +2855, -1819, -1216, -1122, +4356, -1735, -7082, +796, +1337, -2613, -354, -3165, -1020, +960, -1511, +1143, +338, -957, -254, -411, -1003, +93, -787, -961, +276, -120, -242, -590, },
- { +17568, +11974, -6732, +4560, +3824, -1109, -754, -1349, +4606, -843, -8100, -287, +1911, -2056, -658, -3260, -1157, +899, -1412, +975, +487, -915, -443, -511, -909, +161, -686, -992, +148, +70, -223, -830, },
- { +19484, +13084, -9012, +2638, +4382, +24, -354, -1619, +4661, +92, -8630, -1472, +1971, -1185, -834, -3443, -1007, +624, -1325, +1001, +434, -935, -492, -574, -862, +109, -756, -815, +84, +193, -327, -1033, },
- { +21524, +13678, -10956, +1222, +4385, +1297, -139, -2069, +5017, +1156, -9307, -2582, +2096, -601, -528, -3661, -796, +152, -1389, +1321, +257, -1041, -461, -535, -1092, +104, -751, -637, +26, +127, -265, -1109, },
- { +23605, +13718, -12574, +568, +3860, +2238, -103, -2760, +6167, +2019, -10424, -3226, +2099, -412, +299, -3787, -992, -294, -1323, +1597, -108, -1067, -318, -600, -1468, +200, -723, -642, -34, +135, -184, -1205, },
- { +25071, +14148, -13932, +471, +3008, +2768, -76, -3611, +7895, +2700, -11593, -3451, +1646, -185, +1383, -3748, -1496, -431, -1263, +1534, -312, -957, -121, -752, -1802, +171, -636, -694, -65, +159, -201, -1248, },
- { +26816, +13743, -14786, +862, +1921, +2946, -342, -4385, +10015, +2577, -12171, -3354, +671, +309, +2238, -3598, -1940, -465, -1278, +1149, -315, -796, +17, -1000, -2051, +76, -546, -729, -117, +138, -282, -1090, },
- { +27951, +14104, -15590, +1273, +860, +2927, -633, -4986, +11529, +2744, -11887, -3827, +2, +498, +2997, -3184, -2478, -171, -1514, +556, -142, -469, -72, -1148, -2207, -3, -362, -847, -143, +170, -197, -1176, },
- { +28803, +14580, -16123, +1472, -187, +3073, -1250, -5325, +12182, +3270, -11190, -4406, -641, +391, +3646, -2789, -2835, +205, -1933, -111, +62, -112, -330, -1167, -2390, +48, -212, -1112, -86, +341, -303, -1353, },
- { +30323, +13889, -15910, +1407, -1171, +3553, -2383, -5267, +12463, +3540, -10099, -4882, -1197, +116, +4331, -2625, -2785, +375, -2274, -723, +301, +72, -494, -1132, -2662, +359, -286, -1255, +88, +360, -528, -1375, },
- { +30968, +14210, -15671, +1048, -1781, +3667, -3019, -5566, +12074, +4371, -8903, -5378, -1555, -380, +4891, -2272, -2787, +479, -2516, -1197, +410, +143, -580, -995, -2832, +409, -254, -1218, +75, +188, -590, -1406, },
- { +30975, +15165, -15312, +546, -2218, +3398, -2954, -6444, +11217, +5687, -7852, -5572, -1909, -880, +5215, -1819, -2692, +359, -2645, -1443, +355, +103, -656, -709, -2922, +164, -25, -1239, -84, +72, -690, -1273, },
- { +30424, +16368, -14573, +92, -2674, +2748, -2205, -7930, +10058, +7372, -7052, -5344, -2312, -1403, +5238, -1260, -2430, -1, -2723, -1529, +312, -177, -560, -464, -2980, -55, -69, -1190, -231, -99, -594, -932, },
- { +29455, +17526, -13363, -127, -3235, +1964, -1140, -9860, +8781, +9245, -6389, -4845, -2498, -2034, +4995, -530, -2084, -491, -2825, -1345, +221, -559, -398, -274, -2983, -380, -142, -1168, -371, +10, -384, -724, },
- { +28118, +18400, -11563, -157, -4012, +1308, -199, -11792, +7222, +10997, -5639, -4233, -2301, -2934, +4504, +364, -1845, -1024, -2737, -1299, +240, -966, -422, -53, -3194, -483, -435, -1176, -132, +127, -258, -452, },
- { +26552, +19152, -9368, -160, -4867, +986, +473, -13162, +5114, +12399, -4354, -3860, -1375, -4191, +3967, +1296, -1787, -1124, -2703, -1337, +286, -1074, -1007, +244, -3127, -928, -436, -993, +94, +254, +31, -338, },
- { +24559, +20217, -7367, -220, -5053, +163, +912, -13440, +2241, +12957, -1945, -4140, -3, -5230, +2779, +2633, -1975, -895, -2652, -1685, +399, -1133, -1787, +451, -3100, -1099, -141, -1148, +476, +550, +59, -556, },
- { +23258, +20668, -6394, +41, -4001, -1343, +259, -12280, -447, +12376, +814, -4410, +990, -5553, +1277, +3778, -1842, -823, -2296, -2428, +66, -675, -2623, +69, -2488, -1174, +108, -1212, +763, +685, -33, -620, },
- { +23142, +19464, -5694, +1043, -3149, -2286, -1288, -10731, -2354, +11827, +2425, -4171, +1875, -6154, +693, +4142, -1325, -613, -2234, -3206, -20, -772, -3178, +251, -2328, -913, +289, -1277, +940, +736, -150, -671, },
- { +22552, +18662, -5393, +2289, -1879, -3683, -2436, -8894, -4473, +11069, +4563, -5019, +3166, -6153, -527, +5142, -1047, -592, -2109, -3335, -857, -775, -3407, +489, -1798, -1280, +535, -1129, +1014, +574, -236, -416, },
- { +22401, +17758, -5842, +3364, -812, -4784, -3176, -6717, -5712, +8976, +6974, -6176, +3397, -4371, -2591, +6388, -734, -1317, -1243, -3549, -1586, -824, -3469, +452, -886, -1990, +679, -751, +619, +748, -301, -324, },
- { +22309, +16537, -6181, +4660, -360, -5405, -3571, -5406, -6202, +6988, +8656, -6084, +2058, -2265, -3682, +6212, +772, -2272, -843, -3239, -2023, -881, -3727, +370, -424, -2103, +394, -539, +433, +863, -135, -441, },
- { +21791, +15541, -6192, +5616, -505, -5546, -3072, -4658, -6616, +5207, +9841, -5865, +904, -1208, -3643, +5823, +1664, -2499, -798, -2591, -2431, -478, -3918, -635, -47, -1868, +308, -596, +226, +890, +22, -361, },
- { +21324, +14642, -6583, +6799, -1051, -6105, -1417, -3904, -7362, +3483, +10991, -5815, -496, +549, -4041, +4979, +2787, -2309, -896, -2206, -2499, +60, -3674, -2156, -266, -1362, +446, -246, -422, +573, +555, -41, },
- { +20752, +13927, -7556, +7887, -383, -7140, -472, -2508, -7640, +1050, +11820, -4742, -2329, +2225, -4014, +3077, +4488, -1969, -1094, -1484, -3038, +789, -3176, -3637, -596, -1084, +354, +499, -803, -174, +1114, +269, },
- { +19965, +13135, -8141, +8473, +760, -7513, -787, -971, -6960, -1942, +12233, -3129, -3764, +3112, -3442, +1359, +4791, -618, -1183, -1102, -2895, +601, -2684, -3990, -954, -1401, +153, +1055, -625, -482, +888, +405, },
- { +19143, +11685, -8033, +9384, +754, -7209, -418, -807, -6484, -2771, +11238, -2375, -3772, +3580, -3133, +167, +4612, -12, -608, -927, -2580, +196, -2728, -3474, -1079, -1676, -444, +1107, -287, -167, +508, -54, },
- { +17857, +10290, -7109, +9878, +454, -6436, -46, -1046, -5905, -3006, +10009, -1912, -3542, +3960, -2520, -1113, +4554, +356, -838, +40, -2468, -172, -2487, -3471, -559, -1557, -1179, +703, -47, +127, +577, -318, },
- { +16296, +9009, -5714, +9900, +226, -5547, +70, -922, -5384, -3238, +8823, -1282, -3406, +3868, -1537, -1923, +3996, +793, -1145, +249, -1720, -492, -2325, -3083, -467, -1071, -1564, +201, -55, +203, +765, -336, },
- { +15841, +6997, -6669, +11869, +1968, -7696, -859, +385, -4403, -1539, +6206, -3126, -2033, +3213, -1498, -707, +2441, -260, -30, +640, -527, +1221, -934, -1381, +294, -1105, -1226, -270, -1487, -1152, -350, -611, },
- { +13568, +6667, -4985, +10337, +1992, -6022, -629, +40, -3621, -1574, +5221, -2329, -1990, +2774, -1185, -903, +2184, +6, -131, +493, -301, +1057, -963, -1225, +288, -1053, -961, -56, -1078, -893, -506, -522, },
- { +11497, +6501, -3490, +8587, +2327, -4433, -803, -59, -2956, -1671, +4442, -1603, -1990, +2273, -678, -964, +1803, +277, -100, +341, -258, +879, -733, -1205, +106, -817, -829, +182, -726, -774, -439, -507, },
- { +9657, +6295, -2357, +7055, +2839, -3195, -922, +87, -2426, -1717, +3756, -1022, -1971, +1799, -285, -852, +1503, +322, +17, +329, -329, +745, -562, -1092, +21, -498, -600, +37, -450, -530, -354, -499, },
- { +8080, +5958, -1527, +5929, +3206, -2314, -807, +279, -2098, -1713, +3210, -663, -1953, +1446, +14, -682, +1140, +403, +168, +150, -283, +600, -477, -850, +175, -366, -595, +17, -334, -374, -332, -390, },
- { +6742, +5563, -934, +5119, +3472, -1654, -579, +468, -1830, -1693, +2733, -440, -1854, +1199, +270, -615, +927, +597, +39, +58, -146, +541, -282, -642, +203, -260, -523, -66, -324, -342, -189, -288, },
- { +5645, +5082, -470, +4564, +3569, -1149, -280, +632, -1648, -1657, +2279, -195, -1747, +997, +500, -550, +854, +535, -56, +205, +54, +502, -244, -453, +284, -250, -567, -159, -320, -231, -40, -147, },
- { +4739, +4548, -15, +4161, +3424, -612, +92, +576, -1502, -1483, +1923, -133, -1573, +1049, +513, -481, +827, +418, +204, +407, -41, +456, -23, -319, +105, -295, -566, -165, -125, -78, -45, -303, },
- { +4000, +4116, +315, +3739, +3361, -78, +141, +471, -1088, -1423, +1428, +104, -1192, +778, +494, -118, +776, +531, +352, +301, +46, +496, -16, -403, -75, -250, -372, +7, -75, -290, -272, -334, },
- { +3315, +3731, +744, +3252, +3208, +505, +104, +326, -724, -1258, +1022, +253, -920, +621, +766, +320, +638, +429, +479, +312, +62, +342, -149, -425, +78, -14, -324, -163, -364, -342, -177, -191, },
- { +2721, +3507, +1076, +2691, +3219, +926, -155, +334, -235, -1266, +533, +565, -478, +790, +1052, +241, +481, +577, +434, +197, -68, +166, +67, -116, +62, -279, -535, -276, -242, -195, -120, -171, },
- { +2164, +3272, +1472, +2240, +2998, +1160, -8, +380, -347, -1061, +577, +981, +39, +670, +997, +273, +443, +502, +183, +101, +156, +367, +108, -320, -359, -368, -337, -186, -156, -185, -219, -252, },
- { +1934, +3190, +1503, +1841, +2991, +1228, -234, +344, -22, -479, +868, +985, +160, +811, +840, +155, +222, +329, +446, +340, +153, +57, -306, -454, -236, -196, -253, -198, -267, -270, -212, -218, },
- { +1850, +2863, +1570, +2109, +2264, +770, +377, +952, +272, -269, +977, +887, +259, +859, +502, -89, +465, +710, +360, -49, -274, -104, -140, -299, -180, -223, -354, -327, -223, -222, -195, -175, },
- { +1880, +2606, +1259, +1967, +2141, +1272, +1090, +983, +171, -143, +1137, +1038, +78, +386, +659, +433, +428, +299, -214, -286, +0, +94, -163, -340, -274, -342, -349, -267, -185, -155, -161, -219, },
- { +1397, +2225, +1498, +2218, +2597, +1375, +970, +1179, +446, +55, +983, +782, +92, +766, +779, +21, -117, -30, -43, +45, +38, -51, -292, -398, -291, -331, -321, -187, -130, -199, -179, -163, },
- { +1635, +3062, +2249, +1880, +1916, +1343, +1114, +965, +534, +333, +634, +1026, +601, -88, -96, -36, +19, +140, +79, -54, -187, -223, -327, -363, -331, -232, -228, -189, -124, -136, -165, -244, },
- { +1621, +2982, +2331, +1859, +1672, +1505, +1317, +1168, +916, +338, +486, +1012, +283, -527, -167, +103, +151, +173, -30, -202, -207, -185, -337, -340, -290, -264, -241, -183, -115, -121, -178, -226, },
- { +1602, +2643, +1775, +1564, +1563, +1546, +1646, +1829, +1322, +708, +618, +118, +151, +107, -304, -55, +284, +102, -151, -125, -138, -202, -309, -317, -234, -259, -302, -184, -120, -109, -170, -206, },
- { +1689, +2725, +1687, +1342, +1018, +1221, +1839, +1792, +1379, +895, +468, +478, +768, +67, -215, -9, -169, +55, +46, -227, -303, -177, -209, -261, -200, -191, -162, -205, -213, -154, -174, -239, },
- { +1884, +2685, +1171, +1190, +1175, +880, +977, +1283, +1525, +1401, +1097, +684, +686, +975, +274, -642, -241, -46, -48, +8, -211, -255, -203, -172, -169, -156, -217, -131, -186, -249, -160, -234, },
- { +1711, +2523, +1308, +1090, +1055, +1174, +1022, +299, +477, +1301, +1459, +1119, +863, +804, +1042, +601, -340, -501, -204, -29, -21, -94, -220, -196, -156, -184, -116, -170, -201, -183, -255, -271, },
- { +1817, +2536, +946, +809, +944, +1085, +1157, +217, -175, +767, +1098, +779, +1147, +1424, +1313, +1026, +631, +198, -302, -492, -270, -64, -131, -189, -253, -238, -160, -88, -70, -213, -184, -209, },
- { +2191, +2839, +854, +984, +1168, +1002, +768, -219, -19, +1063, +561, +60, +636, +861, +1348, +1294, +885, +891, +475, -73, -432, -506, -288, -67, -118, -220, -240, -103, -74, -138, -148, -245, },
- { +2451, +2833, +673, +1459, +1780, +1173, +305, -947, -35, +1449, +504, -211, +108, +410, +948, +640, +824, +1192, +884, +675, +272, -177, -565, -472, -224, -108, -84, -125, -187, -164, -89, -188, },
- { +3086, +3702, +648, +1075, +1515, +1169, +441, -1098, -143, +1309, +271, -221, +106, +208, +526, +378, +428, +792, +941, +752, +488, +344, +62, -247, -504, -376, -181, +22, -47, -250, -217, -168, },
- { +3569, +4097, +532, +1316, +1840, +1093, -29, -1514, +254, +1604, -129, -469, -58, +189, +685, +94, +33, +566, +399, +418, +683, +566, +398, +298, -51, -324, -429, -122, -77, -175, -112, -284, },
- { +4125, +4461, +378, +1609, +2191, +994, -587, -1865, +674, +1689, -401, -500, -250, +88, +680, -19, +36, +317, +78, +227, +154, +381, +584, +347, +348, +259, -144, -157, -249, -295, -182, -189, },
- { +4867, +5214, +256, +1466, +2150, +866, -894, -1915, +1051, +1495, -779, -414, -262, +45, +633, -205, +3, +311, -89, +0, -11, +125, +199, +237, +418, +383, +270, +312, -107, -370, -261, -364, },
- { +5316, +5480, +203, +2110, +2686, +411, -1842, -1931, +1799, +1361, -1123, -406, -380, +95, +608, -401, +32, +304, -272, -6, -184, -72, +198, -153, +69, +403, +277, +536, +348, -42, -176, -397, },
- { +5892, +6233, +160, +2100, +2860, +142, -2433, -1800, +2326, +963, -1427, -273, -439, +158, +610, -591, -43, +281, -390, -16, -246, -165, +68, -360, -9, +156, +82, +484, +326, +166, +189, -170, },
- { +6296, +6975, +282, +2083, +3088, -133, -3093, -1657, +2878, +590, -1820, -143, -472, +190, +638, -719, -106, +233, -510, -92, -328, -237, +113, -522, -223, +109, -26, +254, +179, +32, +200, +156, },
- { +6592, +7845, +648, +1757, +3189, -161, -3619, -1575, +3255, +370, -2151, -143, -426, +168, +727, -779, -195, +244, -572, -180, -428, -336, +66, -505, -282, -26, -117, +217, +77, -98, +16, -149, },
- { +6774, +8708, +1082, +1524, +3240, -264, -3922, -1540, +3434, +295, -2349, -304, -372, +149, +756, -675, -383, +223, -505, -236, -520, -494, -9, -552, -315, -62, -148, +121, +173, -299, -365, -62, },
- { +6908, +9422, +1625, +1424, +3190, -389, -4004, -1611, +3471, +335, -2543, -391, -396, +68, +811, -604, -534, +182, -441, -272, -536, -643, -94, -634, -428, -131, -91, +267, -223, -392, -234, -275, },
- { +7138, +10189, +2126, +1133, +2968, -382, -3722, -1762, +3018, +580, -2559, -606, -255, -134, +669, -325, -681, -12, -293, -317, -621, -648, -141, -715, -656, -53, -111, -126, -38, -347, -470, -236, },
- { +7313, +10455, +2943, +1070, +2390, +272, -3497, -2310, +2731, +755, -2380, -670, -474, -246, +602, -255, -558, -320, -482, -158, -477, -799, -319, -604, -503, -410, -501, +108, -160, -398, -359, -347, },
- { +7826, +10161, +3173, +1967, +2130, +423, -3555, -2463, +2451, +634, -1952, -839, -706, -181, +512, -312, -450, -587, -636, +17, -569, -882, -377, -371, -655, -672, -473, -170, -109, -345, -438, -377, },
- { +8467, +9477, +3103, +3430, +2024, +440, -3655, -2401, +2236, -26, -1277, -712, -1114, -26, +375, -495, -221, -726, -826, +29, -851, -620, -323, -809, -370, -647, -794, -102, -163, -412, -424, -337, },
- { +9286, +8516, +2179, +5700, +2660, -483, -3558, -1721, +1619, -1074, -311, -359, -1649, +39, +247, -528, -41, -857, -1059, -36, -827, -638, -733, -625, -208, -781, -693, -299, -176, -287, -276, -526, },
- { +10487, +8297, +724, +7001, +3276, -1546, -2976, -375, +714, -2874, +551, +663, -2103, -61, +34, -604, +320, -1061, -1370, +301, -1334, -957, -278, -1039, -89, -630, -732, -236, -218, -112, -316, -769, },
- { +11694, +8483, -1085, +7688, +4377, -2639, -2748, +1388, +290, -5170, +695, +2234, -2233, -376, -167, -879, +703, -1107, -1401, -21, -1755, -792, -436, -1099, +19, -701, -676, +56, -177, -420, -299, -499, },
- { +12813, +8986, -2960, +7720, +5822, -3441, -2888, +3186, +503, -7344, -143, +3835, -1619, -861, -365, -1277, +915, -643, -1945, -184, -1723, -1371, -165, -1036, -149, -608, -623, +361, -273, -675, -81, -360, },
- { +14282, +9854, -5144, +6666, +7543, -3247, -3573, +4303, +1159, -8673, -1552, +4734, -435, -1066, -737, -1669, +1323, -711, -2400, +154, -2059, -1735, -117, -896, -79, -641, -571, +431, -255, -662, -37, -376, },
- { +15850, +10514, -7059, +5564, +8654, -2773, -4154, +5402, +1737, -9668, -3061, +5015, +1018, -866, -1440, -1886, +1527, -978, -2388, +41, -2052, -1988, -323, -629, -13, -650, -699, +444, -203, -546, -140, -354, },
- { +17808, +11057, -9134, +4383, +9339, -1778, -4546, +6062, +2149, -10167, -4257, +4712, +2487, -456, -1988, -2239, +1739, -1173, -2546, +134, -2148, -2055, -395, -540, +91, -587, -935, +488, -19, -574, -174, -369, },
- { +20383, +11132, -11423, +3225, +9645, -449, -4728, +6097, +2297, -10259, -4895, +4011, +3369, +308, -2432, -2790, +2050, -1452, -2764, +266, -2368, -1811, -610, -479, +220, -714, -1063, +583, +89, -687, -231, -413, },
- { +22418, +11798, -13840, +2373, +9532, +812, -4649, +5776, +2876, -10183, -5672, +3197, +3848, +1355, -2692, -3324, +2269, -1738, -2840, +474, -2481, -1785, -640, -534, +229, -841, -1060, +727, -62, -819, -169, -447, },
- { +24894, +11396, -15645, +2370, +8933, +1292, -4281, +5629, +3954, -10488, -6364, +2682, +3969, +2394, -2882, -3405, +2175, -2174, -2424, +697, -2794, -1803, -440, -660, +159, -906, -842, +819, -413, -760, -126, -429, },
- { +26219, +12293, -17420, +2685, +7926, +1207, -3924, +5306, +5940, -10486, -7929, +2418, +4103, +2810, -2438, -3395, +1620, -2289, -1991, +723, -2963, -1849, -215, -902, +78, -722, -742, +870, -694, -718, -23, -517, },
- { +28416, +11175, -18030, +3639, +6517, +524, -3997, +5626, +7964, -10885, -9328, +2435, +4025, +2769, -1736, -3204, +870, -2252, -1569, +634, -3242, -1541, -240, -1235, +91, -529, -623, +850, -941, -678, +99, -756, },
- { +29176, +11689, -18551, +4399, +5252, -160, -4585, +5761, +10465, -11051, -10563, +2051, +3915, +2524, -384, -3448, +237, -1642, -1718, +678, -3401, -1225, -371, -1551, +5, -226, -521, +663, -896, -768, +144, -1146, },
- { +29021, +13077, -18841, +4810, +4427, -776, -5593, +5564, +12643, -10486, -11302, +1156, +3758, +2201, +1006, -3601, -405, -695, -2158, +611, -3242, -1002, -587, -1809, -96, +32, -433, +355, -533, -1081, -66, -1282, },
- { +30639, +12013, -18276, +5087, +3533, -892, -7519, +6359, +13438, -9871, -11200, +130, +3528, +2142, +1859, -3611, -530, -415, -2173, +244, -2952, -752, -1000, -1830, -214, +226, -496, +424, -528, -1428, -247, -1261, },
- { +31129, +12133, -17589, +4753, +3258, -1123, -8951, +6078, +13955, -8365, -10965, -1246, +3253, +2362, +2106, -3221, -543, -421, -2041, -9, -2564, -798, -1213, -1842, -312, +214, -362, +364, -897, -1374, -502, -1281, },
- { +30719, +13121, -16780, +4200, +3198, -1555, -9649, +4676, +14307, -6216, -10726, -2675, +2883, +2776, +1878, -2607, -273, -769, -1833, +57, -2369, -947, -1301, -1967, -305, +248, -529, +122, -1019, -1330, -719, -996, },
- { +29697, +14733, -15818, +3462, +3061, -1780, -9577, +2144, +14501, -3727, -10382, -3699, +2209, +3218, +1410, -1818, +264, -1375, -1409, +257, -2249, -1183, -1411, -1971, -160, -60, -974, +340, -1284, -1182, -516, -1030, },
- { +28002, +16846, -14478, +2412, +2676, -1519, -8873, -1372, +14440, -1063, -9859, -4131, +1096, +3328, +1195, -1203, +1073, -1927, -1076, +655, -2259, -1480, -1460, -1775, -599, -341, -1181, +468, -1245, -932, -470, -1164, },
- { +25869, +18455, -12266, +1637, +1978, -1262, -8280, -4934, +14128, +1672, -9443, -4041, -152, +2529, +1995, -1259, +1882, -1726, -1545, +1491, -2530, -1653, -1433, -2120, -1079, -408, -1374, +717, -856, -1223, -178, -1188, },
- { +24864, +17912, -9358, +1641, +576, -357, -8615, -7257, +13351, +3934, -9073, -3482, -838, +841, +3250, -1322, +2217, -796, -2111, +1754, -2153, -2158, -1467, -2434, -1624, -253, -1302, +874, -576, -1341, -96, -1263, },
- { +23420, +17860, -6501, +1165, -717, +588, -8140, -9637, +11644, +6449, -8639, -3126, -461, -1536, +4057, -378, +1614, +434, -2303, +1248, -1439, -2499, -1782, -2484, -2002, -134, -998, +651, -243, -1476, -235, -998, },
- { +22006, +18635, -5893, +1609, -295, -1121, -6611, -10352, +8438, +8556, -7366, -3845, +1086, -3469, +3525, +1549, +597, +1088, -1819, +227, -740, -2416, -2356, -1773, -2500, -256, -642, +230, -150, -1358, -351, -903, },
- { +22224, +17778, -6386, +3076, +518, -3282, -6409, -9035, +5543, +9128, -5573, -4587, +2339, -4194, +2628, +2481, +473, +849, -1362, -75, -999, -1551, -2497, -1277, -2514, -1057, -402, -20, +22, -1408, -555, -809, },
- { +22103, +17015, -6884, +4461, +1233, -5006, -6070, -7906, +2832, +9189, -3231, -5657, +3433, -4282, +1463, +3242, -717, +1493, -1177, -711, -254, -881, -2411, -866, -2491, -1884, -465, -353, +374, -1387, -1115, -592, },
- { +22560, +15777, -7251, +5550, +797, -5686, -5009, -7186, +427, +9113, -1133, -6601, +3854, -2859, -422, +3276, -587, +291, -113, -529, +173, -114, -2517, -809, -1886, -2312, -1324, -304, +246, -1137, -1252, -701, },
- { +22731, +15350, -9222, +6868, +2173, -7663, -4747, -4975, -1211, +7055, +1768, -6971, +2930, -1113, -1589, +2833, -506, -636, +510, +745, -151, +413, -2257, -1147, -1254, -2415, -1827, -858, -136, -928, -699, -812, },
- { +23304, +14017, -11279, +9072, +3099, -9814, -4178, -2550, -2580, +4834, +3988, -6788, +1843, +177, -2381, +2443, -295, -988, +882, +1070, +364, +564, -2129, -1074, -1171, -2223, -1782, -1409, -1115, -600, -62, -717, },
- { +23618, +12255, -12665, +11454, +3209, -11235, -3282, -912, -3248, +2468, +5358, -5978, +1078, +518, -3093, +2872, +91, -1576, +1462, +574, +484, +1620, -2554, -835, -966, -2532, -1116, -1629, -2136, -622, +243, -448, },
- { +23507, +10176, -12976, +13613, +2604, -11794, -2177, +221, -4379, +941, +6866, -5844, +60, +1571, -3421, +2227, +1420, -1610, +744, +868, +160, +1913, -1757, -1375, -527, -2462, -1299, -900, -2681, -1245, +284, -163, },
- { +22437, +8395, -11784, +14554, +1462, -10835, -1161, -107, -4923, +595, +7185, -5944, -419, +2664, -3581, +1327, +2496, -1354, +156, +805, -57, +1910, -1336, -1388, -199, -2269, -1525, -558, -2342, -1654, -242, -88, },
- { +20519, +7379, -9918, +14135, +1130, -9407, -1215, -80, -4674, -389, +7077, -5070, -1127, +3004, -2779, +575, +2442, -923, +375, +352, -401, +2124, -1583, -1128, +325, -2275, -1384, -459, -2045, -1486, -593, -444, },
- { +18163, +7171, -8342, +13120, +1703, -8708, -1203, +485, -4645, -1323, +6947, -3981, -1909, +3255, -1914, -231, +2372, -512, +246, +503, -605, +1638, -1102, -1353, +431, -1611, -1452, -256, -1866, -1326, -460, -644, },
- { +14734, +5366, -4938, +13261, +853, -8371, +138, +318, -3336, +134, +2204, -3293, +1697, +2006, -2237, -277, +1106, -520, -774, +253, -99, +68, -412, +780, +809, +219, +346, -370, -906, -336, -779, -1298, },
- { +12591, +5345, -3597, +11397, +1333, -6737, -45, +46, -2876, +145, +2069, -2657, +1229, +1805, -1739, -516, +791, -312, -657, +44, -12, +385, -291, +437, +830, +261, +90, -313, -700, -424, -611, -816, },
- { +10805, +5339, -2604, +9725, +1921, -5525, -310, +43, -2429, +58, +1959, -2032, +690, +1674, -1216, -766, +650, -159, -575, +29, +105, +445, -262, +423, +590, +102, +242, -169, -667, -426, -434, -541, },
- { +9340, +5201, -1982, +8478, +2304, -4592, -320, +86, -2009, +7, +1880, -1679, +320, +1616, -995, -817, +572, -17, -496, +83, +280, +281, -168, +371, +343, +122, +380, -5, -602, -322, -317, -483, },
- { +8188, +4843, -1495, +7540, +2395, -3667, -312, +176, -1589, -77, +1770, -1446, +114, +1442, -804, -782, +564, +82, -423, +254, +211, +181, -62, +208, +366, +208, +389, +140, -452, -279, -247, -426, },
- { +7139, +4447, -1005, +6621, +2495, -2780, -305, +313, -1320, -50, +1606, -1337, +16, +1312, -654, -711, +624, +129, -237, +218, +117, +290, -83, +217, +421, +287, +411, +153, -317, -192, -175, -342, },
- { +6157, +4147, -661, +5795, +2719, -2091, -278, +447, -1015, -108, +1345, -1106, -12, +1133, -544, -455, +616, +156, -87, +162, +222, +352, -56, +280, +494, +294, +391, +184, -187, +6, -183, -528, },
- { +5279, +3795, -302, +5095, +2792, -1423, -200, +524, -834, -167, +1181, -897, -46, +946, -299, -307, +520, +329, -7, +248, +337, +305, +68, +311, +476, +300, +386, +295, -101, -189, -428, -616, },
- { +4525, +3459, -28, +4546, +2834, -885, -89, +549, -694, -192, +1043, -644, -76, +759, -74, -153, +593, +505, +119, +343, +347, +334, +158, +340, +453, +359, +386, +40, -308, -328, -435, -568, },
- { +3930, +3246, +221, +4012, +2721, -518, +143, +558, -699, -125, +1073, -572, -271, +859, +240, +26, +775, +548, +199, +453, +346, +378, +240, +360, +327, +89, +121, -123, -319, -354, -529, -642, },
- { +3660, +3270, +329, +3382, +2495, -259, +336, +625, -667, -168, +978, -390, -146, +1158, +544, +64, +837, +706, +404, +422, +317, +415, +105, -19, +35, +69, +43, -172, -504, -539, -442, -551, },
- { +3142, +2802, +557, +3432, +2389, -71, +540, +456, -686, +42, +1063, -160, +119, +1196, +649, +468, +1015, +684, +339, +353, +244, +13, -220, -126, +48, +81, -160, -332, -500, -382, -372, -555, },
- { +2901, +2760, +686, +3156, +2256, -27, +369, +564, -227, +172, +1095, +54, +380, +1501, +986, +535, +850, +558, +60, -34, -144, -62, -229, -185, +27, -136, -229, -282, -406, -348, -382, -501, },
- { +2508, +2594, +1005, +2823, +1909, +401, +624, +677, +80, +149, +1195, +622, +765, +1450, +899, +441, +488, -3, -301, -63, -155, -197, -378, -249, +15, -114, -216, -325, -386, -326, -435, -465, },
- { +2206, +2342, +933, +2683, +2333, +903, +669, +761, +492, +499, +1258, +984, +954, +1127, +508, -78, +61, +24, -139, -253, -442, -276, -171, -30, -76, -244, -225, -191, -331, -440, -399, -321, },
- { +1974, +2815, +1553, +2323, +2233, +1046, +992, +1282, +753, +707, +1323, +599, +390, +690, +158, -204, -61, -149, -350, -307, -284, -187, -98, -47, -143, -282, -239, -272, -323, -315, -319, -272, },
- { +1654, +2776, +1836, +2401, +3022, +1959, +967, +1094, +948, +444, +652, +267, +140, +546, +166, -270, -194, -277, -387, -222, -184, -102, -101, -213, -211, -214, -174, -207, -336, -339, -249, -198, },
- { +1869, +3354, +2494, +2832, +2716, +1654, +1450, +1127, +173, -258, +546, +432, -146, +288, +167, -560, -266, -9, -321, -261, -193, -155, -101, -190, -238, -205, -240, -223, -233, -279, -241, -223, },
- { +2251, +4370, +3095, +2273, +2143, +1471, +1134, +828, +318, +171, +218, -108, -7, +202, -108, -329, -135, -186, -250, -123, -231, -173, -170, -206, -184, -240, -217, -223, -224, -243, -163, -183, },
- { +2659, +4415, +2723, +1899, +1660, +1369, +1422, +927, +331, +708, +366, -215, -222, -87, +228, -79, -456, -205, +38, -181, -201, -158, -281, -171, -233, -218, -175, -209, -188, -206, -158, -146, },
- { +2110, +3925, +2617, +1488, +1521, +1321, +1000, +1375, +1006, +577, +1002, +281, -242, +99, -57, -249, -82, -20, -257, -120, -41, -272, -333, -251, -182, -210, -176, -126, -157, -179, -176, -194, },
- { +1815, +3251, +2187, +1550, +1381, +941, +1057, +773, +515, +1445, +1370, +807, +715, +171, +116, +49, -344, -256, +25, -69, -365, -300, -115, -199, -312, -112, -74, -117, -199, -216, -192, -267, },
- { +1453, +2017, +1172, +1714, +1993, +1501, +661, -199, +441, +1198, +925, +1207, +1374, +1313, +1201, +202, -18, +29, -479, -298, -15, -198, -383, -148, -84, -172, -178, -112, -77, -224, -241, -216, },
- { +1882, +2639, +981, +885, +1287, +1149, +657, -264, +342, +1130, +630, +742, +1292, +1636, +1472, +886, +568, +182, -94, -158, -412, -373, +6, -144, -402, -52, +23, -169, -270, -217, -171, -242, },
- { +2138, +2960, +1101, +1064, +1446, +1136, +291, -438, +715, +1105, +64, +265, +594, +767, +1266, +1060, +858, +969, +438, -42, -101, -297, -344, -218, -121, -114, -231, -67, -73, -307, -272, -133, },
- { +2460, +3291, +1078, +1222, +1735, +1211, -80, -710, +954, +1086, -141, +205, +328, +431, +693, +253, +688, +1146, +655, +645, +331, -174, -61, -188, -361, -99, -16, -187, -277, -187, -156, -227, },
- { +2893, +3811, +1105, +1203, +1818, +1171, -395, -714, +1243, +818, -421, +245, +254, +371, +579, -124, +129, +613, +507, +652, +517, +400, +268, -71, -95, -9, -228, -164, -144, -359, -299, -148, },
- { +3308, +4221, +1114, +1356, +2071, +1044, -891, -658, +1576, +583, -594, +223, +142, +308, +585, -177, -43, +346, +34, +199, +317, +405, +505, +368, +236, +145, +52, -93, -322, -363, -224, -252, },
- { +3900, +4867, +998, +1260, +2220, +839, -1162, -422, +1621, +246, -664, +254, +85, +242, +512, -240, -75, +270, -146, -7, -102, +10, +325, +287, +509, +621, +248, +30, -87, -358, -365, -226, },
- { +4379, +5375, +1025, +1329, +2414, +620, -1641, -92, +1872, -196, -752, +327, -63, +215, +556, -301, -147, +211, -180, -88, -262, -176, -67, -67, +404, +602, +521, +379, +47, -155, -101, -270, },
- { +4917, +5923, +933, +1451, +2663, +215, -2061, +412, +1970, -661, -792, +379, -89, +99, +514, -309, -198, +208, -222, -155, -360, -296, -176, -258, +109, +365, +340, +336, +360, +108, +10, -101, },
- { +5325, +6387, +1044, +1617, +2857, -114, -2569, +894, +2226, -1191, -880, +471, -93, +10, +443, -288, -328, +216, -163, -257, -444, -325, -267, -361, +2, +132, +152, +154, +168, +115, +205, +89, },
- { +5680, +6946, +1250, +1595, +2986, -178, -3103, +1203, +2516, -1694, -900, +579, -179, -49, +355, -219, -348, +53, -131, -293, -494, -294, -363, -474, -96, +59, +126, -24, -77, -107, +65, +185, },
- { +6420, +7593, +839, +1808, +3146, -725, -3065, +1505, +2329, -1963, -819, +612, -243, -161, +340, -128, -458, -62, -108, -328, -544, -296, -472, -531, -38, -40, +40, -115, -239, -173, -70, -95, },
- { +6890, +8125, +798, +2033, +3239, -1037, -3175, +1581, +2439, -2196, -937, +706, -276, -254, +344, -74, -579, -163, -59, -291, -673, -428, -436, -541, -74, -59, -108, -153, -248, -283, -175, -228, },
- { +7112, +8504, +1011, +2420, +3353, -1361, -3255, +1549, +2556, -2243, -1200, +741, -167, -319, +199, +28, -584, -316, +19, -391, -797, -406, -435, -548, -248, -164, +60, -169, -402, -374, -175, -285, },
- { +7285, +8820, +1447, +2597, +3239, -1169, -3229, +1126, +2635, -2125, -1498, +885, -99, -519, +165, +47, -347, -428, -288, -299, -829, -481, -398, -641, -383, -145, +82, -141, -416, -423, -333, -478, },
- { +7520, +8869, +2021, +2814, +2876, -582, -3127, +494, +2536, -1844, -1576, +724, +34, -625, -7, +239, -155, -630, -485, -225, -859, -553, -623, -612, -241, -315, +42, -51, -367, -610, -501, -479, },
- { +7879, +8478, +2398, +3646, +2683, -425, -3110, +367, +2156, -1723, -1287, +263, +38, -359, -259, +217, +107, -737, -613, -82, -1068, -775, -685, -547, -228, -402, +0, +62, -472, -776, -425, -752, },
- { +8205, +7639, +2366, +5376, +3131, -1245, -3272, +1332, +1408, -2244, -393, -194, -320, +234, -603, -6, +519, -774, -631, -35, -1347, -848, -738, -677, -167, -469, +8, -127, -364, -733, -690, -706, },
- { +9071, +7121, +1359, +7044, +3754, -2464, -2808, +2381, +60, -2776, +793, -372, -1036, +563, -545, -275, +838, -803, -718, +19, -1374, -976, -1066, -680, +3, -628, -230, -55, -414, -742, -545, -882, },
- { +10148, +7203, -207, +7831, +4875, -3407, -2535, +3529, -1225, -3617, +2016, -129, -1945, +583, -98, -688, +1031, -623, -939, +116, -1314, -1178, -1259, -633, -72, -818, -379, -21, -446, -673, -502, -1013, },
- { +11044, +7769, -1943, +7882, +6483, -3989, -2591, +4784, -2149, -4901, +3054, +635, -2734, +50, +522, -825, +921, -244, -1180, +190, -1284, -1180, -1357, -904, -121, -897, -516, -101, -271, -733, -400, -911, },
- { +11990, +8411, -3500, +7279, +8002, -4096, -2789, +6028, -2844, -6395, +3677, +1736, -3160, -867, +846, -555, +671, +81, -1262, +34, -1076, -1221, -1513, -1089, -353, -964, -456, -261, -256, -672, -256, -770, },
- { +13335, +8653, -4769, +6560, +8870, -3919, -2715, +7255, -3621, -7665, +3846, +2827, -3088, -1854, +732, -91, +613, +191, -1151, -200, -889, -1355, -1616, -1202, -620, -945, -484, -248, -378, -527, -120, -768, },
- { +14852, +8670, -5913, +6073, +9001, -3654, -2195, +8358, -4463, -8616, +3590, +3721, -2575, -2699, +236, +272, +868, +133, -945, -394, -1059, -1238, -1780, -1341, -641, -1048, -561, -27, -440, -570, -19, -740, },
- { +16451, +8693, -7064, +5832, +8573, -3576, -1333, +9514, -5301, -9295, +3094, +4207, -1784, -3244, -399, +318, +1449, +54, -659, -662, -1314, -1021, -2073, -1203, -803, -1212, -404, +103, -451, -722, -56, -638, },
- { +18423, +8132, -8075, +6128, +7681, -4035, +138, +10573, -6216, -9800, +2747, +4350, -1192, -3295, -1042, +104, +2016, +289, -589, -954, -1505, -917, -2153, -1097, -1071, -1185, -298, +285, -530, -966, -69, -449, },
- { +20202, +8717, -10102, +5865, +7549, -3841, +390, +11057, -6161, -10160, +2346, +4324, -998, -3105, -1402, -423, +2652, +520, -1022, -905, -1505, -1084, -2016, -1271, -995, -1072, -334, +432, -570, -1222, +2, -286, },
- { +22529, +8456, -11824, +5892, +7303, -4055, +930, +11197, -5866, -10497, +2199, +4298, -1350, -2705, -1409, -1011, +2979, +873, -1590, -561, -1535, -1262, -1879, -1318, -879, -952, -350, +491, -720, -1269, +134, -272, },
- { +23974, +9134, -13513, +5844, +7038, -4057, +615, +11611, -4790, -11317, +1983, +4325, -1634, -2352, -1084, -1939, +3123, +1383, -1969, -242, -1583, -1428, -1611, -1435, -861, -839, -383, +423, -787, -1337, +408, -512, },
- { +25044, +9817, -14614, +5833, +6675, -4269, -71, +12212, -3614, -11890, +1484, +4440, -1786, -1990, -859, -2687, +2944, +1877, -2005, -175, -1440, -1495, -1418, -1531, -909, -716, -428, +289, -816, -1306, +466, -753, },
- { +26536, +9314, -14645, +5829, +6191, -4884, -796, +12908, -2788, -12074, +1081, +4219, -1691, -1613, -960, -3033, +2556, +2030, -1647, -335, -1214, -1268, -1603, -1435, -985, -580, -535, +122, -796, -1260, +177, -737, },
- { +27183, +9606, -14376, +5620, +5875, -5416, -2052, +13586, -1628, -12058, +571, +3654, -1110, -1358, -1213, -3155, +2048, +1957, -895, -643, -907, -799, -1977, -1199, -984, -549, -700, +25, -836, -1353, +35, -751, },
- { +27148, +10286, -13645, +5373, +5534, -6103, -3440, +14036, -378, -11705, -177, +2878, -226, -1089, -1747, -3125, +1710, +1453, +80, -816, -863, -89, -2314, -1012, -907, -744, -724, -326, -1037, -1054, -249, -864, },
- { +26584, +11121, -12486, +5232, +5105, -6806, -4740, +13839, +1078, -11022, -1066, +2034, +722, -813, -2405, -2897, +1499, +637, +937, -473, -1208, +661, -2238, -1145, -718, -867, -1215, -685, -932, -951, -292, -941, },
- { +25805, +11950, -11123, +5119, +4637, -7115, -6017, +12797, +2771, -10082, -1948, +1322, +1341, -452, -2821, -2640, +1355, -222, +1382, +402, -1584, +1029, -1649, -1467, -434, -1354, -1712, -685, -1153, -608, -115, -1081, },
- { +24754, +12672, -9499, +5075, +3967, -6831, -7500, +11069, +4769, -9261, -2671, +911, +1238, +136, -2811, -2628, +1336, -1074, +1459, +1369, -1523, +816, -817, -1570, -995, -1254, -2045, -954, -1214, -280, +201, -1144, },
- { +23625, +13743, -8416, +5130, +3177, -5952, -8511, +8195, +6835, -8201, -3226, +701, +799, +463, -2132, -2701, +1161, -1431, +1042, +2182, -1162, +681, -474, -1699, -1321, -1011, -2142, -1212, -1223, -47, +480, -1192, },
- { +22165, +15115, -7785, +5546, +2568, -5733, -8429, +4589, +8489, -6649, -4078, +663, +623, +133, -953, -2723, +670, -1020, -128, +2751, -525, +300, -532, -1412, -1518, -711, -1869, -1605, -920, -465, +529, -917, },
- { +22262, +14424, -6906, +6480, +1678, -6039, -7848, +2265, +8205, -4418, -5059, +773, +1015, -648, +127, -2327, +238, -660, -1047, +2455, +302, -278, -464, -941, -1372, -464, -1422, -1493, -1408, -881, +595, -495, },
- { +21426, +14579, -5798, +6478, +1251, -5676, -7497, -360, +8046, -2301, -6017, +896, +1618, -1474, +1197, -1714, -587, -84, -1747, +1143, +1103, -253, -569, -193, -1153, -2, -1077, -1593, -1678, -1403, +210, -122, },
- { +19944, +15360, -4754, +5956, +1176, -5025, -7238, -2954, +7860, -653, -6260, +621, +2153, -1709, +1912, -1547, -1249, +742, -2688, +57, +1079, +401, -432, +447, -710, -64, -484, -1682, -1600, -2206, -540, +94, },
- { +20147, +14018, -3775, +6372, +90, -4104, -7066, -4495, +7159, +825, -6523, +620, +3112, -2199, +2066, -1581, -1430, +939, -2947, -332, +348, +613, +1047, +312, -702, +618, -378, -1616, -1651, -2440, -1434, -218, },
- { +19984, +13391, -3853, +7072, -294, -4065, -6337, -5631, +5959, +2227, -6012, -65, +4276, -2601, +1149, -793, -2128, +1041, -2372, -946, +540, +152, +1289, +1452, -1002, +964, +82, -1959, -1450, -2309, -2165, -747, },
- { +20430, +12454, -5495, +8998, +65, -5776, -5336, -5251, +4459, +2909, -5003, -707, +4833, -2860, -19, +113, -2229, +469, -1412, -634, +320, -217, +361, +2809, -484, +184, +1137, -2340, -1770, -1410, -2528, -1555, },
- { +21692, +10456, -7798, +12335, +68, -8763, -3715, -3473, +2378, +2906, -3129, -2190, +5102, -2356, -1660, +915, -1539, -297, -715, +276, -315, -459, +27, +2282, +814, +228, +658, -1653, -2043, -1236, -2088, -2094, },
- { +22414, +8463, -8975, +14734, -856, -9903, -2019, -2434, +827, +2536, -1717, -3048, +4909, -1972, -2551, +1285, -549, -637, -715, +674, -143, -626, -627, +1991, +1177, +722, +464, -1119, -1865, -1815, -1391, -1829, },
- { +22530, +6646, -9511, +16483, -1322, -11024, -644, -496, -1479, +1598, +531, -3996, +3822, -711, -2705, +845, +188, -390, -681, +346, -68, -65, -1383, +1684, +1452, +284, +1178, -797, -2128, -1411, -1375, -1644, },
- { +21322, +5400, -8796, +17260, -1500, -11305, +474, +113, -2907, +1438, +1455, -4669, +3322, +481, -2925, +742, +471, -590, -202, +63, -265, +281, -1317, +1179, +1229, +431, +1123, -441, -2004, -992, -1149, -2020, },
- { +19175, +5030, -7462, +16622, -929, -10530, +416, +343, -3120, +766, +1767, -4343, +2822, +1079, -2638, +519, +570, -563, -289, +165, -315, +82, -803, +997, +763, +599, +901, -468, -1286, -794, -1066, -1838, },
- { +16819, +5384, -6370, +14965, +290, -9700, +208, +612, -3392, +183, +2183, -3797, +2080, +1803, -2493, -16, +1023, -550, -707, +329, -153, -121, -550, +1037, +727, +224, +746, -397, -1126, -361, -1019, -1629, },
- { +14912, +6709, -4328, +10591, -498, -7109, +111, -741, -770, +328, -733, -960, +2191, +30, -1474, -311, +350, -380, -1280, +108, +235, +180, +74, +223, +54, +624, +423, -99, +35, -79, -285, -105, },
- { +12603, +6186, -2629, +9885, -405, -6060, +108, -976, -537, +418, -737, -896, +2184, +171, -1454, -339, +212, -324, -1080, +111, +88, +93, +170, +250, +211, +621, +320, -131, +116, -1, -403, -106, },
- { +10408, +5748, -848, +8724, -167, -4613, -400, -1217, -70, +524, -929, -678, +2111, +202, -1239, -402, +223, -337, -970, +153, +57, +16, +164, +314, +375, +524, +121, +6, +131, -34, -146, -32, },
- { +8810, +5752, -110, +7195, +525, -3549, -713, -1201, +150, +589, -802, -524, +1697, +366, -971, -531, +153, -232, -820, +124, +74, +31, +92, +425, +518, +160, +114, +336, +59, -121, +192, +176, },
- { +7707, +5602, +35, +6275, +1122, -3180, -685, -740, +80, +415, -374, -403, +1135, +566, -689, -718, +117, -57, -675, +45, +161, +35, +47, +597, +362, +73, +358, +355, +34, +128, +414, +95, },
- { +7097, +5535, -192, +5388, +1340, -2724, -316, -506, -92, +415, +68, -445, +787, +694, -670, -663, +194, +20, -606, +105, +221, -83, +318, +654, +165, +211, +501, +464, +163, +305, +282, -143, },
- { +6452, +5181, -188, +4851, +1397, -2250, -47, -387, -147, +524, +273, -528, +602, +655, -502, -522, +157, +53, -489, +203, +143, +158, +611, +321, +242, +571, +633, +422, +125, +234, -5, -218, },
- { +5779, +4631, +28, +4565, +1363, -1816, +67, -196, +8, +488, +200, -488, +649, +572, -444, -381, +184, +6, -287, +343, +218, +465, +530, +350, +563, +605, +532, +190, +1, +83, -90, -218, },
- { +5208, +4384, +145, +3924, +1403, -1285, +290, -147, -75, +540, +306, -396, +492, +507, -283, -289, +166, +176, +48, +344, +475, +764, +468, +481, +475, +299, +347, +79, -73, +8, -92, -335, },
- { +4512, +3969, +359, +3651, +1556, -960, +277, -42, +99, +522, +205, -303, +469, +444, -138, -122, +272, +416, +283, +588, +781, +710, +302, +187, +175, +216, +260, +77, -143, -145, -168, -400, },
- { +3801, +3629, +701, +3369, +1505, -562, +487, -64, +147, +580, +155, -276, +520, +581, +54, +7, +535, +858, +532, +711, +669, +180, +6, +159, +92, +196, +192, -93, -202, -135, -272, -498, },
- { +3442, +3530, +703, +2812, +1660, -44, +424, -101, +187, +562, +336, -54, +523, +647, +416, +546, +884, +888, +356, +303, +242, +72, +10, +71, +14, +72, +66, -163, -241, -221, -397, -501, },
- { +2690, +3000, +1279, +2876, +1515, +205, +493, -52, +442, +658, +264, +192, +1000, +1052, +635, +643, +744, +413, +42, +208, +138, +112, -80, -143, -63, -30, +7, -171, -300, -327, -429, -392, },
- { +2478, +3269, +1270, +2133, +1692, +521, +531, +45, +514, +1060, +829, +686, +1118, +1030, +491, +45, +183, +420, +250, +132, -125, -159, -155, -121, -114, -108, -174, -265, -205, -328, -363, -352, },
- { +1870, +2687, +1568, +2459, +1988, +651, +612, +481, +1093, +1477, +1114, +836, +591, +278, +48, +164, +470, +379, -76, -182, +38, -195, -357, -228, -185, -143, -188, -137, -211, -282, -321, -361, },
- { +2002, +3298, +2072, +1782, +1264, +1387, +2004, +1233, +1029, +1042, +338, -15, +176, +284, +423, +207, -57, +116, -13, -210, -269, -453, -350, -132, -143, -177, -143, -97, -213, -359, -341, -306, },
- { +2146, +3307, +2355, +2752, +2119, +1859, +2021, +710, +97, +234, +110, +124, +235, +191, +340, -11, -121, +97, -245, -337, -346, -487, -277, -43, -78, -145, -151, -149, -204, -284, -366, -347, },
- { +2369, +3977, +3947, +3602, +1697, +1277, +778, -51, +139, +274, +157, +44, -14, +65, +388, -56, -226, -108, -386, -368, -349, -275, -166, -135, -161, -68, -48, -184, -269, -324, -303, -300, },
- { +2991, +5611, +4893, +2413, +32, +530, +1206, +716, -81, -249, -72, +167, +231, -189, +96, +62, -289, -321, -341, -226, -287, -249, -289, -147, -48, -120, -84, -169, -256, -385, -287, -211, },
- { +3480, +5919, +3215, +1230, +711, +1536, +1856, +445, -348, +146, +147, -235, +202, -60, -65, -10, -330, -145, -168, -321, -230, -233, -366, -152, -34, -139, -131, -161, -196, -267, -285, -233, },
- { +2004, +3234, +1971, +1898, +2099, +2208, +2155, +993, +558, +802, +440, -18, -153, -3, +129, -234, -279, -55, -99, -109, -245, -275, -242, -234, -224, -178, -205, -148, -89, -176, -206, -280, },
- { +1279, +2318, +1457, +1126, +1665, +2069, +1778, +1033, +1441, +1718, +1054, +741, +475, +244, +79, -171, -166, -218, -231, -69, -145, -125, -126, -248, -153, -180, -287, -235, -255, -196, -120, -109, },
- { +1453, +2492, +1452, +1154, +1435, +1406, +842, +362, +1287, +1720, +1252, +1179, +1008, +731, +566, +64, -227, -101, -154, -275, -230, -121, -97, -71, -157, -175, -212, -268, -250, -286, -220, -166, },
- { +1879, +2842, +1125, +1084, +1653, +1253, +390, -18, +973, +1151, +667, +1023, +1287, +1158, +966, +422, +174, +136, -200, -125, -209, -336, -116, -116, -96, -37, -181, -264, -245, -282, -257, -233, },
- { +2149, +3242, +1318, +1052, +1535, +1017, +118, +168, +1096, +645, +127, +653, +733, +907, +1209, +756, +503, +444, +179, +76, -160, -223, -173, -251, -109, -40, -121, -158, -228, -282, -247, -243, },
- { +2317, +3435, +1467, +1216, +1790, +944, -476, +147, +1327, +465, +25, +491, +329, +437, +651, +458, +687, +794, +439, +296, +209, +11, -156, -194, -142, -157, -160, -145, -173, -218, -241, -271, },
- { +2632, +3865, +1576, +1194, +1850, +818, -747, +351, +1336, +91, -24, +570, +326, +220, +377, +87, +100, +501, +607, +596, +401, +255, +179, -41, -117, -38, -173, -278, -200, -177, -186, -241, },
- { +2913, +4307, +1690, +1174, +1997, +721, -1042, +507, +1361, -158, -88, +596, +317, +156, +293, -13, -74, +80, +115, +344, +456, +579, +399, +152, +182, +78, -95, -162, -227, -292, -160, -212, },
- { +3419, +4851, +1663, +1035, +2035, +628, -1177, +737, +1236, -536, -64, +690, +334, +51, +172, -13, -135, -42, -10, -2, -68, +347, +513, +426, +347, +211, +168, -24, -193, -236, -186, -272, },
- { +3767, +5304, +1782, +1016, +2102, +463, -1378, +1048, +1239, -936, -179, +746, +362, +62, +89, -105, -187, -70, -33, -113, -245, -31, +98, +248, +442, +396, +305, +172, +12, -165, -166, -183, },
- { +4285, +5774, +1650, +1174, +2192, +50, -1405, +1467, +1118, -1334, -217, +829, +333, +12, +50, -124, -225, -140, -22, -146, -307, -135, -82, -31, +86, +236, +387, +312, +118, +25, +51, -123, },
- { +4848, +6188, +1491, +1445, +2261, -490, -1401, +1942, +965, -1671, -300, +836, +385, -47, +8, -178, -306, -200, +51, -186, -351, -153, -292, -30, +25, -103, +13, +150, +219, +188, +112, +17, },
- { +5454, +6649, +1314, +1669, +2321, -943, -1366, +2334, +803, -1890, -325, +781, +385, -83, +115, -228, -488, -225, +76, -126, -377, -187, -365, -53, +30, -174, -150, -173, -42, +89, +185, +106, },
- { +5926, +7107, +1339, +1747, +2383, -1252, -1530, +2755, +780, -2246, -303, +735, +323, -85, +73, -145, -589, -384, +135, -187, -469, -43, -386, -191, +46, -215, -180, -236, -326, -211, +7, +83, },
- { +6333, +7526, +1384, +2014, +2467, -1782, -1590, +3195, +714, -2494, -349, +719, +280, -145, +55, -69, -636, -504, +150, -221, -574, -43, -314, -228, -37, -138, -204, -369, -416, -299, -97, -205, },
- { +6696, +8017, +1498, +2006, +2624, -2005, -1798, +3417, +748, -2614, -432, +706, +173, -173, +53, -56, -573, -718, +132, -67, -717, -164, -301, -196, -38, -159, -197, -465, -469, -327, -185, -358, },
- { +6930, +8687, +1750, +1599, +2863, -1765, -2210, +3311, +900, -2491, -605, +596, +191, -265, +91, -35, -551, -808, +27, +34, -661, -338, -391, -71, -59, -282, -167, -426, -499, -386, -346, -349, },
- { +7032, +9112, +2294, +1319, +2928, -1295, -2725, +3058, +1141, -2349, -736, +409, +218, -319, +37, -5, -474, -896, -105, +108, -719, -327, -414, -210, -8, -342, -280, -290, -610, -529, -264, -398, },
- { +7290, +9148, +2788, +1517, +2890, -1004, -3145, +2936, +1182, -2207, -713, +170, +226, -310, -137, +66, -236, -1052, -288, +218, -703, -396, -407, -298, -61, -288, -332, -407, -637, -624, -99, -427, },
- { +8295, +8777, +2246, +2812, +2858, -1707, -2793, +3041, +460, -1834, -416, -196, +229, -361, -255, +143, -68, -1152, -427, +236, -539, -557, -489, -199, -168, -280, -301, -623, -729, -417, -190, -475, },
- { +8813, +8385, +2070, +3791, +3408, -2249, -3089, +3581, -338, -1829, +311, -486, -198, -209, -270, -126, +417, -1313, -692, +394, -483, -630, -627, -124, -246, -308, -391, -642, -737, -489, -253, -480, },
- { +9480, +7764, +1344, +5665, +3938, -3530, -2582, +4359, -1779, -1905, +1349, -610, -594, -360, -91, -401, +691, -1075, -1088, +435, -349, -619, -660, -124, -373, -324, -465, -444, -823, -782, -95, -634, },
- { +10219, +7759, +108, +6635, +4903, -4328, -2227, +5026, -3212, -2275, +2513, -596, -1046, -594, +196, -690, +587, -537, -1473, +302, -113, -638, -684, -100, -439, -459, -480, -472, -766, -889, -314, -724, },
- { +11359, +8080, -1537, +6725, +6202, -4589, -2055, +5443, -4331, -2746, +3483, -358, -1535, -803, +500, -787, +107, +0, -1473, -127, +202, -644, -687, +80, -605, -513, -488, -741, -549, -859, -768, -615, },
- { +12561, +8515, -3181, +6443, +7273, -4422, -1771, +5642, -5238, -3343, +4113, +235, -1988, -1143, +783, -757, -401, +173, -1070, -614, +288, -431, -703, +306, -751, -608, -594, -870, -585, -862, -824, -695, },
- { +13637, +9078, -4327, +5307, +8230, -3683, -1700, +6016, -6052, -3983, +4365, +989, -2192, -1647, +1018, -629, -785, -62, -507, -850, +26, -33, -720, +529, -810, -802, -657, -1006, -784, -809, -610, -865, },
- { +14620, +9720, -5196, +3985, +8621, -2703, -1406, +6384, -6867, -4537, +4323, +1689, -2163, -2167, +1076, -438, -1009, -536, -136, -784, -345, +300, -530, +532, -827, -847, -766, -1246, -914, -773, -428, -804, },
- { +16072, +9930, -6183, +3360, +8255, -2295, -119, +6470, -7878, -4616, +4153, +2063, -2029, -2471, +1020, -386, -950, -1040, -67, -497, -520, +425, -98, +296, -886, -669, -1038, -1392, -1030, -835, -225, -497, },
- { +17538, +10139, -7275, +3167, +7496, -2312, +1507, +6655, -8887, -4746, +4122, +2161, -1895, -2506, +749, -326, -908, -1248, -345, -284, -377, +510, +186, +31, -841, -583, -1261, -1430, -1259, -849, -50, -134, },
- { +18795, +10599, -8283, +2946, +6835, -2703, +2875, +7278, -9742, -5079, +4325, +2043, -1829, -2306, +376, -514, -590, -1442, -695, -362, +63, +785, +55, -22, -629, -692, -1264, -1504, -1464, -809, +17, +195, },
- { +19828, +11378, -9267, +2629, +6374, -3347, +3612, +8402, -10339, -5537, +4515, +1859, -1884, -1929, -100, -800, -262, -1561, -976, -577, +410, +1421, -419, +34, -250, -981, -1080, -1605, -1632, -802, +11, +380, },
- { +21206, +11505, -9851, +2389, +6035, -4347, +4232, +9433, -10759, -5759, +4577, +1581, -1877, -1583, -452, -1192, +46, -1648, -1025, -873, +537, +2263, -927, +52, +224, -1290, -882, -1564, -1935, -752, -159, +454, },
- { +21951, +12180, -10180, +1892, +5955, -5226, +3946, +10828, -10791, -5984, +4342, +1308, -1588, -1445, -711, -1558, +306, -1741, -844, -1199, +362, +3030, -1015, -204, +814, -1397, -873, -1354, -2329, -849, -416, +417, },
- { +22506, +12779, -10294, +1612, +5688, -5970, +3299, +11834, -10475, -5915, +3858, +872, -1070, -1438, -1116, -1691, +435, -1836, -594, -1442, -11, +3401, -605, -538, +1220, -1085, -1193, -1113, -2738, -1072, -644, +153, },
- { +23186, +13097, -10391, +2031, +4838, -6522, +2825, +12019, -9671, -5661, +3239, +340, -378, -1439, -1649, -1540, +599, -1995, -278, -1529, -462, +3340, +152, -492, +1137, -401, -1605, -1222, -2820, -1325, -987, -68, },
- { +22882, +14119, -9689, +1389, +4734, -6999, +1524, +12257, -8386, -5521, +2330, +28, +188, -1505, -1990, -1510, +944, -2230, -172, -1187, -1194, +2809, +1343, -197, +605, +402, -2099, -1365, -2620, -1824, -1038, -503, },
- { +21870, +15422, -8022, +32, +4928, -6961, -638, +12423, -6481, -5741, +1679, -358, +537, -1263, -2316, -1338, +1170, -2350, -127, -788, -1648, +1934, +2335, +603, -234, +775, -1895, -1692, -2402, -2007, -1134, -816, },
- { +21377, +15848, -6611, -135, +4095, -6589, -2340, +11613, -4347, -6089, +1401, -892, +589, -722, -2599, -1204, +1299, -2460, -64, -474, -1793, +1309, +2278, +1468, -710, +729, -1381, -1948, -2200, -1989, -1059, -1104, },
- { +21825, +15338, -6288, +1723, +2245, -6807, -2394, +9743, -2760, -5631, +785, -1266, +822, -455, -2395, -1291, +1244, -2162, -287, +63, -1716, +759, +1340, +2033, -170, +136, -645, -1936, -2205, -1413, -1181, -1687, },
- { +22088, +14986, -6294, +3940, +475, -7388, -1931, +7563, -1485, -4751, -302, -1228, +1282, -606, -1733, -1685, +1011, -1322, -834, +679, -1560, -371, +652, +2168, +634, +122, -548, -1338, -1967, -1463, -1230, -1785, },
- { +21218, +15763, -6154, +5244, -207, -8203, -1741, +5343, +1, -4070, -1324, -1042, +1940, -1042, -1041, -1719, +173, +234, -1546, +421, -980, -1263, -189, +2163, +1362, +537, -295, -894, -1836, -1649, -862, -1860, },
- { +20943, +15351, -5193, +5824, -681, -8421, -2182, +3733, +912, -3280, -2125, -629, +2393, -1338, -793, -1272, -318, +619, -1449, -542, -613, -929, -1049, +1622, +1869, +1834, -606, -1014, -899, -1858, -1052, -1583, },
- { +20467, +15036, -4299, +6074, -972, -8163, -2993, +2103, +1953, -2525, -2906, +84, +2478, -1496, -381, -1209, -661, +522, -1431, -1137, -494, -29, -1724, +1410, +1857, +2078, +198, -1222, -492, -1845, -1016, -1459, },
- { +19997, +14492, -3439, +6231, -1292, -7499, -3870, +428, +3016, -1672, -3589, +505, +3009, -1682, -424, -1271, -888, +168, -1633, -640, -998, +512, -655, +572, +1038, +2022, +1564, -1436, -837, -970, -1064, -1590, },
- { +19121, +13891, -1956, +5864, -1769, -5712, -5524, -1209, +4728, -1224, -4384, +1529, +2886, -1835, -216, -2037, -717, +368, -2459, +62, -470, -20, +501, +397, +27, +1794, +1472, -406, -774, -1035, -530, -1651, },
- { +18795, +12787, -866, +5679, -2785, -3778, -6009, -3416, +6104, -148, -5120, +1968, +2942, -2232, -361, -2334, -318, +255, -2810, +772, +147, -722, +931, +1048, -622, +926, +926, +464, +8, -1388, -195, -1234, },
- { +19769, +11583, -2448, +6778, -3321, -3974, -5178, -3690, +5661, +410, -4626, +1587, +2861, -2687, -704, -1965, -264, +354, -2735, +728, +431, -372, +846, +890, -556, +313, +642, +248, +534, -654, -743, -572, },
- { +20742, +9918, -4333, +9177, -3673, -5562, -3412, -3017, +4558, +903, -4422, +932, +3308, -2821, -1440, -1193, +107, +341, -2476, +352, +665, +234, +482, +681, -223, -107, +450, +161, +378, +311, -786, -592, },
- { +20393, +8513, -5551, +11591, -3341, -7618, -1960, -1344, +2974, +225, -3410, +284, +3332, -2616, -1768, -458, +23, +66, -1947, +502, +187, +334, +642, +553, -324, +98, +28, -212, +831, +137, -320, -307, },
- { +19863, +7195, -5891, +13080, -3237, -8975, -179, -735, +1159, +597, -2780, -566, +3377, -1932, -1835, -26, +57, -431, -1301, +563, -286, +265, +803, +515, -423, +180, +122, -246, +644, +165, -191, +77, },
- { +18658, +6850, -5751, +12388, -2703, -7823, +255, -1504, +610, +770, -2248, -983, +3161, -1268, -1738, +128, -21, -478, -1161, +338, -70, +251, +391, +591, -323, +20, +528, -36, +54, +115, -36, +34, },
- { +17076, +6736, -5238, +11355, -1525, -7217, -40, -1078, -147, +458, -1371, -990, +2637, -628, -1439, -189, +204, -339, -1390, +203, +285, +214, +63, +453, -132, +311, +558, +23, -66, -152, +62, -43, },
- { +13623, +7663, -736, +5443, -2593, -2244, -1530, -1649, +1729, -32, -2266, +999, +1978, -1230, -677, -1107, +219, -259, -1521, +393, -253, -340, +340, +425, +603, +1120, -212, -683, -191, -585, -148, +387, },
- { +11820, +7583, -426, +4965, -1356, -2529, -1167, -1245, +983, +124, -1778, +794, +1769, -842, -700, -980, +259, -378, -1380, +412, -355, -376, +513, +422, +537, +830, -258, -264, -158, -658, +7, +383, },
- { +10321, +7312, -105, +4864, -813, -2658, -650, -1140, +594, +154, -1345, +747, +1470, -560, -589, -773, +109, -428, -1061, +264, -409, -228, +464, +450, +557, +455, -229, +107, -87, -614, +63, +459, },
- { +8832, +6788, +754, +4529, -737, -2058, -537, -1141, +593, +102, -1073, +689, +1331, -427, -481, -535, -57, -390, -871, +136, -280, -172, +355, +496, +482, +211, +7, +299, +18, -389, +32, +568, },
- { +7264, +6341, +1804, +3830, -547, -1150, -702, -1198, +746, +193, -1033, +629, +1243, -340, -243, -463, -211, -272, -673, +38, -232, -89, +255, +491, +349, +237, +305, +440, +181, -306, +96, +481, },
- { +5764, +5793, +2760, +3310, -250, -431, -863, -1206, +942, +277, -1025, +490, +1124, +11, -135, -654, -133, +3, -652, -89, -115, -120, +324, +473, +214, +489, +656, +578, +94, -300, +162, +271, },
- { +4877, +5432, +2934, +2887, +9, -98, -665, -1051, +773, +328, -754, +397, +892, +204, -54, -717, +22, +137, -707, -136, -8, -16, +384, +457, +358, +804, +826, +406, -152, -241, +83, +160, },
- { +4273, +4974, +2996, +2688, +19, +236, -317, -1082, +645, +529, -499, +171, +725, +487, -28, -702, +171, +109, -663, +33, +8, +168, +685, +509, +520, +907, +639, +123, -222, -249, +142, +242, },
- { +3881, +4471, +2801, +2721, +214, +232, -276, -784, +726, +443, -495, +187, +790, +514, -89, -624, +292, +140, -590, +200, +269, +545, +770, +316, +532, +788, +265, -82, -82, -100, +41, +29, },
- { +3766, +4300, +2408, +2391, +333, +347, -106, -602, +651, +407, -345, +364, +720, +250, +52, -284, +220, +186, -143, +547, +529, +560, +390, +206, +482, +471, +188, -7, -119, -170, +39, -9, },
- { +3436, +3912, +2322, +2385, +450, +371, -77, -417, +729, +455, -307, +332, +707, +317, +188, -91, +487, +565, +170, +463, +431, +296, +60, +230, +424, +421, +106, -107, -113, -167, +28, -121, },
- { +3183, +3685, +2212, +2271, +537, +324, +19, -108, +778, +330, -270, +582, +667, +327, +729, +405, +569, +537, +26, +242, +252, -24, +148, +398, +218, +251, +64, -101, -137, -167, -61, -180, },
- { +2975, +3602, +2238, +1946, +368, +615, +350, -208, +659, +572, -66, +604, +1024, +904, +959, +291, +202, +264, -144, +133, +221, +2, +109, +243, +252, +133, -64, -129, -180, -137, -144, -273, },
- { +2802, +3321, +2156, +2179, +535, +317, +283, +375, +791, +445, +493, +1260, +1224, +697, +585, -84, -52, +130, -53, +215, +5, -34, +157, +233, +121, -41, -96, -197, -124, -177, -272, -304, },
- { +2567, +3351, +2539, +1843, +97, +744, +689, +452, +1235, +1224, +767, +951, +804, +213, +156, -203, +95, +139, -182, +93, +76, +25, +66, +145, -99, -130, -124, -168, -143, -326, -266, -289, },
- { +2718, +3449, +2308, +1797, +208, +761, +1522, +1644, +1223, +789, +460, +314, +454, -11, +113, +21, -170, +13, +13, +85, +59, -34, -70, +29, -183, -196, -119, -202, -174, -262, -320, -243, },
- { +2540, +3343, +2399, +2066, +1062, +1501, +1604, +1736, +1082, -140, -197, +490, +498, -164, -13, -43, -88, +38, +21, +50, -52, -74, -79, -137, -262, -173, -156, -121, -156, -298, -206, -189, },
- { +2234, +3727, +3392, +2599, +1296, +1388, +1575, +990, +120, +142, -3, +141, +343, -173, +83, -53, -176, +87, -65, -57, -14, -108, -214, -261, -285, -100, -90, -157, -152, -234, -209, -204, },
- { +2985, +5564, +3761, +1458, +757, +1364, +784, +451, +634, -7, -242, +3, +522, +51, -283, +33, -103, -187, +6, +14, -99, -195, -315, -245, -150, -121, -75, -132, -198, -215, -225, -243, },
- { +3536, +5654, +3321, +1733, +414, +394, +1272, +1090, -2, -98, +317, +30, +224, +141, -65, -151, -228, -176, -28, +9, -112, -143, -326, -205, -121, -146, -154, -155, -169, -220, -257, -233, },
- { +2423, +4490, +3856, +2307, +306, +542, +1485, +1042, +272, +121, +367, +345, +305, +76, +54, -98, -197, -211, -235, -76, +30, -102, -249, -110, -163, -144, -218, -256, -176, -211, -237, -223, },
- { +2207, +4508, +3055, +1310, +930, +958, +1117, +900, +798, +352, +193, +679, +614, +197, +54, +57, -131, -330, -215, -106, -182, -79, -43, -101, -76, -110, -233, -306, -312, -262, -203, -241, },
- { +2155, +4216, +2568, +1005, +1213, +966, +459, +898, +1067, +401, +559, +752, +475, +636, +473, -23, -19, +1, -327, -285, -98, -96, -180, -15, +129, -115, -171, -209, -363, -372, -286, -209, },
- { +2070, +3883, +2353, +1160, +1380, +728, +99, +912, +928, +215, +528, +873, +808, +593, +419, +448, +247, -17, -66, -137, -244, -204, -83, -38, -42, +64, -18, -242, -235, -315, -412, -310, },
- { +2125, +3872, +2333, +1117, +1382, +652, -82, +932, +929, -32, +165, +810, +760, +591, +704, +380, +171, +402, +223, -173, -55, +18, -230, -138, +84, +9, -127, -88, -152, -290, -286, -341, },
- { +2204, +3829, +2303, +1430, +1528, +266, -259, +1194, +944, -279, +37, +705, +496, +385, +633, +421, +252, +297, +317, +192, +43, +66, +57, +9, -58, -33, -24, -181, -247, -150, -214, -284, },
- { +2377, +4116, +2337, +1342, +1538, +248, -324, +1198, +907, -340, -9, +552, +446, +300, +373, +259, +71, +202, +429, +213, +40, +308, +228, +122, +212, +69, -122, -224, -230, -240, -255, -174, },
- { +2547, +4334, +2430, +1433, +1566, +87, -418, +1351, +878, -486, -33, +547, +363, +146, +403, +264, -240, -131, +304, +205, +66, +265, +312, +373, +311, +248, +138, -166, -373, -314, -205, -258, },
- { +2830, +4723, +2442, +1353, +1596, +57, -445, +1370, +794, -551, +26, +483, +302, +84, +326, +353, -232, -336, -50, +55, -20, +99, +386, +443, +376, +430, +300, -2, -200, -321, -318, -255, },
- { +3101, +5094, +2484, +1317, +1620, -48, -486, +1479, +713, -731, +26, +531, +246, -26, +207, +395, -120, -435, -199, -118, -261, -82, +201, +404, +445, +420, +397, +148, -80, -175, -230, -288, },
- { +3513, +5583, +2388, +1169, +1692, -102, -510, +1532, +632, -825, +39, +484, +162, -19, +107, +357, -62, -406, -271, -220, -305, -288, -44, +301, +381, +318, +417, +216, -33, -33, -125, -197, },
- { +3971, +6063, +2297, +1049, +1754, -235, -496, +1678, +453, -941, +114, +521, +25, -141, +100, +323, -30, -393, -314, -245, -341, -357, -157, +129, +280, +188, +259, +194, -7, -19, -69, -59, },
- { +4462, +6601, +2162, +929, +1825, -406, -449, +1847, +245, -1033, +198, +531, -55, -243, +34, +274, -46, -317, -280, -344, -378, -331, -147, -22, +200, +127, +86, +97, -172, -74, +29, -12, },
- { +4929, +7134, +2067, +832, +1905, -671, -420, +2107, +13, -1176, +285, +566, -115, -373, -56, +231, -88, -317, -242, -369, -432, -373, -60, -90, +32, +212, -22, -102, -274, -226, -80, -18, },
- { +5380, +7722, +2007, +689, +2018, -933, -447, +2383, -171, -1301, +369, +562, -128, -427, -220, +187, -78, -332, -233, -409, -419, -408, -34, +5, -132, +185, +51, -252, -327, -342, -282, -98, },
- { +5728, +8332, +2054, +461, +2152, -1109, -551, +2612, -297, -1395, +446, +591, -229, -430, -303, +22, -78, -336, -214, -416, -470, -471, -25, +180, -147, -54, +113, -193, -423, -380, -487, -230, },
- { +6113, +8894, +2133, +278, +2235, -1274, -667, +2769, -471, -1368, +504, +562, -301, -464, -281, -179, -193, -277, -163, -442, -520, -538, -26, +230, -9, -150, -82, -60, -486, -442, -508, -419, },
- { +6822, +9262, +1874, +539, +2127, -1579, -524, +2787, -765, -1217, +595, +512, -360, -580, -126, -403, -358, -224, -134, -389, -601, -579, +2, +211, +8, +23, -240, -219, -412, -487, -530, -498, },
- { +7515, +9472, +1708, +950, +1940, -1744, -475, +2685, -890, -1100, +601, +523, -322, -777, -22, -467, -558, -250, -104, -316, -558, -673, -18, +285, -56, +161, -229, -389, -420, -494, -565, -489, },
- { +7940, +9637, +1858, +1251, +1898, -1722, -763, +2646, -912, -1044, +619, +459, -176, -902, -97, -399, -684, -474, -18, -221, -503, -687, -201, +491, -97, +79, -100, -413, -500, -584, -564, -465, },
- { +8437, +9625, +1884, +1715, +2059, -1879, -1105, +2725, -1064, -1040, +741, +338, -154, -826, -248, -438, -648, -774, -57, -33, -524, -628, -313, +497, +49, -120, -60, -285, -620, -701, -513, -517, },
- { +9220, +9383, +1442, +2663, +2411, -2496, -1180, +2907, -1426, -1017, +899, +285, -271, -686, -239, -660, -556, -895, -297, +126, -442, -632, -203, +342, +145, -93, -144, -242, -638, -729, -500, -582, },
- { +9906, +8999, +886, +4046, +2822, -3537, -956, +3303, -2122, -1097, +1212, +287, -466, -677, -82, -821, -584, -919, -622, +120, -110, -798, -101, +317, +50, +139, -325, -314, -494, -726, -682, -494, },
- { +10165, +8622, +635, +5498, +3208, -4703, -409, +3974, -3274, -1343, +1812, +349, -758, -791, +168, -846, -676, -904, -937, -105, +296, -819, -186, +443, -101, +357, -353, -431, -390, -698, -845, -370, },
- { +10778, +9125, -461, +5499, +4480, -4885, -762, +4363, -3869, -1600, +2274, +309, -1021, -799, +442, -989, -823, -718, -1054, -519, +402, -449, -376, +548, -68, +372, -259, -484, -358, -718, -919, -405, },
- { +11808, +9598, -1631, +4810, +5752, -4539, -1177, +4391, -4229, -1790, +2570, +358, -1408, -786, +715, -1102, -1041, -581, -992, -885, +191, -44, -368, +438, +142, +323, -208, -398, -399, -804, -937, -537, },
- { +12864, +10102, -2814, +4041, +6509, -3716, -1366, +4112, -4371, -1965, +2757, +499, -1803, -807, +909, -1173, -1234, -559, -856, -1084, -225, +261, -140, +202, +383, +376, -191, -207, -486, -953, -891, -645, },
- { +13770, +10842, -3762, +2948, +6944, -2626, -1423, +3706, -4498, -2054, +2738, +733, -2151, -912, +1063, -1203, -1347, -631, -679, -1132, -639, +290, +229, +18, +464, +552, -134, -53, -593, -1082, -910, -725, },
- { +14673, +11578, -4475, +1691, +7096, -1713, -1082, +3280, -4814, -1919, +2563, +861, -2306, -1111, +1114, -1240, -1354, -818, -528, -1086, -897, +19, +528, +85, +343, +790, +8, -1, -705, -1107, -997, -856, },
- { +15287, +12615, -5054, +450, +7031, -997, -525, +3136, -5350, -1613, +2407, +806, -2180, -1353, +994, -1181, -1315, -1000, -400, -980, -938, -358, +637, +322, +261, +1020, +234, -8, -727, -1060, -1088, -991, },
- { +16341, +13198, -5831, -183, +6631, -925, +450, +3048, -6132, -1100, +2328, +438, -1973, -1456, +665, -1224, -1147, -1229, -302, -819, -969, -597, +502, +511, +258, +1295, +390, -116, -684, -1059, -1180, -1113, },
- { +17889, +13289, -7003, +251, +5613, -1102, +1630, +2856, -6736, -544, +2351, -201, -1577, -1545, +280, -1291, -936, -1371, -191, -616, -996, -677, +307, +583, +290, +1693, +557, -380, -523, -1129, -1279, -1128, },
- { +19421, +13294, -8130, +984, +4304, -1338, +2588, +2708, -7031, -194, +2313, -845, -1057, -1787, -127, -1222, -940, -1254, -198, -479, -881, -843, +201, +539, +228, +2168, +760, -747, -401, -1194, -1459, -1011, },
- { +20606, +13470, -8907, +1610, +3084, -1671, +3262, +2674, -6933, -54, +2126, -1222, -615, -2058, -501, -1073, -920, -1108, -226, -364, -678, -985, +112, +592, +23, +2550, +1067, -1061, -439, -1160, -1596, -844, },
- { +21678, +13397, -9105, +1972, +1964, -2147, +3689, +2647, -6634, +29, +1710, -1374, -333, -2266, -901, -865, -791, -1224, -108, -330, -517, -988, -65, +848, -297, +2505, +1436, -1115, -771, -1020, -1548, -824, },
- { +22043, +13828, -8808, +1968, +1087, -2691, +3735, +2813, -6153, -63, +1327, -1523, -22, -2413, -1231, -625, -620, -1517, +116, -296, -490, -687, -330, +1228, -654, +1883, +1897, -817, -1166, -848, -1353, -842, },
- { +21862, +14553, -8083, +1733, +298, -3191, +3378, +3080, -5574, -270, +1014, -1790, +389, -2456, -1466, -480, -483, -1820, +297, -178, -667, -4, -656, +1283, -726, +917, +2011, -106, -1245, -999, -903, -756, },
- { +21352, +15281, -6885, +1395, -334, -3665, +2670, +3546, -5077, -445, +803, -2146, +977, -2334, -1692, -440, -333, -2064, +440, -23, -774, +810, -1201, +1101, -364, -194, +1769, +892, -1065, -1132, -267, -995, },
- { +20861, +15614, -5482, +1081, -870, -4341, +1898, +3930, -4851, -435, +471, -2413, +1653, -2264, -1871, -605, -244, -2109, +276, +437, -945, +994, -1311, +557, +83, -748, +1003, +1546, -293, -1147, -222, -1064, },
- { +20341, +15837, -4243, +1301, -1450, -5105, +1347, +3961, -4522, -413, +325, -2497, +2316, -2115, -2138, -652, -297, -1870, +211, +677, -1276, +1047, -1153, -118, +720, -740, -74, +2033, +582, -1274, -145, -714, },
- { +19636, +16119, -3188, +1683, -1865, -5991, +823, +3722, -4115, -322, +190, -2340, +2786, -2019, -2280, -876, -206, -1208, -519, +732, -1211, +541, -669, -258, +512, +140, -566, +1174, +1263, -677, -170, -802, },
- { +18858, +16285, -2143, +1991, -1980, -6784, +50, +3403, -3485, -245, +189, -2095, +3079, -1823, -2721, -438, -196, -1206, -875, +432, -1124, +431, -376, -252, +414, +1193, -856, -296, +1960, -172, -317, -664, },
- { +18488, +15830, -1291, +2547, -2229, -7386, -730, +2796, -2460, -104, -268, -1138, +2825, -2015, -2015, -709, -496, -920, -1536, +112, -516, +216, -578, +707, +252, +875, +136, -1180, +1044, +302, +130, -464, },
- { +18032, +15462, -771, +3171, -2446, -7862, -1764, +2636, -1567, +5, -496, -701, +2816, -1760, -1991, -874, -746, -1167, -1739, +343, -701, +364, +15, +532, +203, +973, +810, -1570, -221, +371, +695, -210, },
- { +18183, +14237, -213, +3919, -3116, -7974, -2292, +2020, -153, +42, -1423, +627, +2562, -2113, -1333, -1554, -1186, -770, -1762, -91, -66, +691, -288, +385, +793, +1048, +304, -885, -866, -584, +1104, +190, },
- { +17916, +13240, +200, +4684, -3796, -7718, -2760, +1604, +850, +225, -1927, +1081, +2619, -2191, -1377, -2216, -746, -653, -2263, +733, +68, +56, +169, +482, +600, +1299, +31, -544, -723, -1663, +902, +562, },
- { +17044, +12267, +1399, +4803, -4676, -5966, -3841, +281, +3320, -114, -3303, +2279, +2401, -2496, -1283, -2365, -671, -464, -1900, +808, -230, -25, +729, +96, +303, +1800, +66, -835, -309, -1837, -28, +731, },
- { +17131, +11616, +1113, +3708, -4510, -4182, -4413, -204, +4141, -354, -3431, +2353, +1909, -2319, -1067, -2887, -24, -22, -2046, +700, -301, +199, +609, -123, +449, +1846, +102, -822, -495, -1668, -259, +595, },
- { +17804, +10827, -833, +4161, -4620, -3463, -2984, -1411, +4085, +122, -3689, +2063, +1883, -2404, -1128, -2081, +2, -158, -1877, +784, -113, -307, +389, +403, +575, +1373, +163, -658, -728, -1403, -144, +238, },
- { +17770, +9675, -2120, +5437, -4251, -3736, -2292, -788, +3134, -434, -2948, +1807, +1772, -2590, -638, -1520, -124, -311, -1778, +1073, -328, -581, +430, +559, +654, +1248, -5, -604, -701, -1222, +85, +89, },
- { +16983, +8744, -2777, +6694, -3792, -4443, -901, -815, +1755, -54, -2575, +1415, +1766, -2182, -536, -1198, -147, -428, -1414, +749, -461, -344, +355, +328, +855, +1312, -290, -626, -512, -1025, +51, +365, },
- { +15530, +7980, -1979, +6512, -3528, -3269, -860, -1658, +1879, -8, -2551, +1210, +1950, -1724, -587, -1052, -96, -226, -1441, +427, -306, -235, +212, +345, +877, +1182, -243, -745, -344, -674, -107, +390, },
- { +13644, +7839, +340, +4237, -4066, -2089, +181, -157, -98, -716, -1664, +1617, +1169, -1811, +342, -1102, -326, +22, -1305, +431, -226, -614, +436, +265, -325, +880, +370, -95, +206, -791, -194, -105, },
- { +11477, +7542, +1372, +3307, -3045, -1070, -418, -498, +213, -531, -1761, +1305, +1366, -1451, +150, -939, -219, -56, -1110, +275, -259, -524, +318, +167, -195, +840, +316, +6, -31, -753, +66, +40, },
- { +9185, +7569, +2375, +2356, -1914, -448, -695, -709, +367, -353, -1571, +1152, +1173, -975, +111, -735, -206, -120, -786, +213, -329, -455, +368, +102, -13, +690, +287, +199, -74, -549, +265, +253, },
- { +7687, +7172, +2505, +2384, -1188, -623, -434, -481, +255, -398, -1198, +1009, +1022, -762, +89, -484, -279, -47, -579, +42, -268, -226, +195, +11, +172, +581, +417, +303, -47, -184, +406, +81, },
- { +6794, +6483, +2410, +2627, -840, -796, -81, -127, -26, -355, -786, +799, +900, -672, +188, -249, -386, -6, -336, -8, -247, -119, +38, +96, +339, +606, +665, +312, -3, +47, +278, -125, },
- { +5907, +5826, +2525, +2670, -555, -752, +41, +149, -99, -234, -613, +533, +888, -428, +180, -214, -321, +180, -187, -225, -103, +27, -39, +368, +489, +694, +754, +175, -13, +28, +125, -216, },
- { +5068, +5227, +2668, +2678, -280, -715, +86, +472, -115, -212, -504, +385, +890, -299, +204, -116, -199, +274, -206, -202, +165, +190, +121, +464, +488, +765, +530, -95, +33, +85, +32, -285, },
- { +4430, +4893, +2607, +2422, +45, -558, +143, +594, -112, -70, -407, +181, +893, +9, +138, -80, -17, +293, -18, +126, +441, +150, +103, +549, +369, +433, +333, -10, +90, +43, -106, -245, },
- { +3711, +4345, +2802, +2585, +142, -598, +212, +846, -12, -130, -349, +202, +915, +136, +144, +26, +282, +585, +264, +261, +271, +98, +65, +247, +259, +366, +292, +2, +95, +26, -184, -171, },
- { +3270, +4161, +2763, +2345, +192, -419, +378, +857, +49, -39, -256, +254, +934, +196, +366, +592, +573, +461, +232, +248, -23, -159, +76, +241, +206, +248, +207, +95, +139, -106, -191, -197, },
- { +2943, +3918, +2802, +2227, +112, -304, +629, +924, +29, +150, -154, +182, +1323, +752, +534, +526, +437, +413, +22, -194, -72, +85, -38, +83, +224, +251, +213, +42, +65, -167, -226, -198, },
- { +2772, +3851, +2788, +1975, +65, -69, +845, +1077, -57, +182, +530, +759, +1311, +513, +472, +465, +64, +67, -3, -148, -49, +2, -85, +278, +204, -7, +177, +109, -60, -207, -187, -266, },
- { +2741, +3962, +2753, +1658, -41, +420, +934, +1003, +697, +759, +554, +442, +1100, +376, +43, +199, +55, +12, -47, -241, +16, +219, -40, +38, -37, +66, +191, +16, -90, -266, -234, -204, },
- { +3100, +4428, +2177, +1205, +75, +902, +1974, +1358, +427, +424, +567, +206, +484, +165, +130, +95, -110, -9, -43, +93, +142, -69, -204, -13, -9, +23, +198, -26, -264, -205, -104, -146, },
- { +3210, +4553, +1862, +1097, +1209, +1702, +1662, +1004, +308, +184, +225, +17, +388, +79, +50, +47, -163, +200, +252, -95, -147, -45, -164, -179, -57, +145, +35, -75, -120, -139, -145, -187, },
- { +2744, +4295, +2964, +2006, +764, +1468, +1817, +756, +4, +41, +245, +14, +163, +49, +70, +100, +168, +231, -53, -108, -40, -137, -327, -125, -50, -25, +121, +79, -87, -207, -216, -224, },
- { +3644, +5506, +2291, +880, +1111, +1504, +1276, +605, -113, -2, +218, +64, +212, -104, +192, +519, +136, -208, +41, +48, -219, -274, -268, -122, -133, +102, +215, +67, -186, -291, -229, -287, },
- { +3729, +5991, +1991, +263, +1099, +1310, +1186, +802, +62, -222, +346, +155, +106, +141, +330, +491, +26, -42, +16, -23, -226, -214, -280, -265, -52, +117, +214, +32, -128, -310, -288, -270, },
- { +2626, +5352, +3385, +581, +252, +872, +1262, +1271, +175, -237, +438, +384, +61, +61, +469, +546, +232, -19, -21, +71, -83, -296, -233, -189, -195, +42, +177, +99, -95, -207, -255, -295, },
- { +2086, +4619, +3769, +1305, +139, +491, +966, +1193, +432, -210, +327, +607, +212, +43, +405, +422, +412, +221, +64, +98, -131, -143, -94, -220, -249, -9, +178, +14, -136, -131, -163, -256, },
- { +2139, +4433, +3497, +1555, +347, +189, +878, +1324, +318, -496, +231, +753, +258, +26, +394, +493, +349, +186, +248, +240, -44, -89, -49, -142, -57, -56, +21, +118, -122, -273, -226, -136, },
- { +2311, +4528, +3281, +1515, +485, +155, +824, +1324, +265, -492, +160, +527, +142, +7, +422, +391, +265, +431, +202, +86, +149, +36, +38, -14, +14, +37, +95, +88, -115, -263, -276, -244, },
- { +2483, +4762, +3179, +1400, +563, +131, +828, +1336, +202, -523, +128, +527, +103, -226, +171, +342, +142, +412, +338, +45, +92, -94, +172, +187, +6, +205, +202, +105, -77, -196, -299, -324, },
- { +2726, +5137, +3097, +1180, +674, +184, +755, +1346, +184, -531, +98, +477, +195, -246, -36, +193, -87, +205, +506, +62, -30, -76, +59, +215, +91, +296, +329, +186, +97, -139, -324, -248, },
- { +3045, +5527, +3012, +1062, +756, +111, +709, +1423, +99, -641, +145, +477, +146, -204, -123, +100, -177, -119, +444, +91, -147, -88, -72, +196, +100, +177, +408, +293, +113, +30, -141, -297, },
- { +3436, +6020, +2910, +889, +868, +57, +655, +1504, +22, -713, +161, +469, +124, -165, -125, -15, -195, -258, +287, +219, -316, -262, -35, +129, +77, +61, +409, +298, +70, +141, -16, -144, },
- { +3894, +6586, +2783, +668, +954, -13, +635, +1573, -146, -783, +246, +445, +2, -172, -63, -91, -294, -318, +133, +279, -237, -506, -107, +75, +8, +47, +226, +248, +95, +53, -4, -57, },
- { +4405, +7200, +2656, +443, +1039, -128, +662, +1690, -398, -841, +393, +450, -138, -226, +1, -146, -386, -359, +40, +223, -89, -563, -227, +109, -110, -3, +147, +88, +56, +29, -5, -116, },
- { +4876, +7873, +2612, +205, +1070, -269, +712, +1849, -697, -944, +597, +475, -291, -315, +82, -190, -515, -429, -4, +168, -34, -473, -351, +121, -57, -127, +140, -117, -82, +81, -67, -139, },
- { +5345, +8532, +2640, -20, +1042, -466, +776, +2045, -1057, -1078, +828, +511, -446, -439, +123, -190, -656, -517, -117, +119, +9, -405, -323, -39, +71, -105, -9, -130, -314, -1, -54, -197, },
- { +5755, +9172, +2804, -162, +957, -687, +828, +2288, -1359, -1285, +1083, +619, -595, -549, +140, -166, -730, -627, -255, +75, +66, -414, -171, -94, -6, +93, -105, -228, -284, -205, -114, -134, },
- { +6053, +9828, +3094, -338, +874, -821, +750, +2423, -1504, -1522, +1217, +797, -715, -693, +145, -172, -790, -680, -456, -66, +242, -494, -151, +117, -189, +150, +39, -395, -358, -190, -293, -70, },
- { +6365, +10439, +3396, -513, +841, -814, +596, +2360, -1502, -1631, +1210, +940, -723, -805, +124, -197, -871, -667, -563, -359, +324, -281, -332, +308, -121, -25, +252, -378, -573, -197, -328, -115, },
- { +6691, +10976, +3599, -570, +917, -864, +376, +2212, -1463, -1679, +1089, +1036, -703, -886, +72, -213, -1017, -664, -582, -629, +140, +41, -340, +170, +189, -205, +228, -137, -721, -390, -282, -214, },
- { +7655, +11301, +2983, -165, +1190, -1185, +265, +2137, -1680, -1486, +973, +1045, -655, -1003, +145, -320, -1056, -774, -554, -718, -142, +148, -1, -9, +263, -7, +1, +12, -602, -637, -348, -173, },
- { +8725, +11372, +2035, +795, +1645, -1977, +191, +2335, -2001, -1434, +933, +1003, -589, -1155, +213, -455, -1024, -893, -641, -701, -356, -16, +344, +128, +51, +231, -87, -31, -405, -710, -562, -171, },
- { +9575, +11154, +1237, +2394, +2028, -3285, +418, +2886, -2551, -1615, +1186, +934, -650, -1197, +283, -624, -1011, -875, -759, -706, -442, -240, +477, +441, -54, +319, -30, -127, -305, -565, -677, -372, },
- { +10190, +10640, +774, +4347, +2002, -4744, +1042, +3458, -3410, -1873, +1669, +748, -934, -1066, +314, -877, -1066, -778, -875, -839, -432, -417, +363, +615, +59, +388, -7, -218, -333, -323, -683, -569, },
- { +11656, +10948, -887, +4545, +3052, -4722, +604, +3331, -3530, -1765, +1917, +460, -1170, -858, +331, -1145, -1038, -801, -770, -934, -391, -415, +118, +836, +219, +336, +68, -117, -415, -229, -603, -466, },
- { +13296, +11164, -2472, +4349, +3911, -4234, +37, +3058, -3561, -1609, +2035, +238, -1451, -733, +380, -1485, -961, -904, -594, -975, -451, -230, -189, +825, +484, +313, +29, -4, -374, -223, -531, -267, },
- { +14547, +11879, -3970, +3666, +4639, -3257, -708, +2677, -3398, -1566, +2096, +56, -1592, -844, +432, -1787, -948, -1000, -471, -858, -654, +26, -371, +599, +668, +477, -138, +127, -242, -320, -341, -194, },
- { +16244, +12044, -5188, +3051, +4787, -2203, -1047, +2078, -3288, -1206, +1927, -153, -1529, -1122, +410, -1934, -1051, -951, -400, -689, -749, +91, -214, +211, +759, +692, -292, +255, -104, -432, -82, -239, },
- { +17280, +12976, -6370, +2340, +4641, -1173, -1098, +1398, -2972, -1077, +1787, -398, -1249, -1610, +388, -1966, -1197, -775, -431, -518, -766, +52, -3, +3, +536, +1033, -423, +244, +74, -499, +32, -201, },
- { +18875, +13104, -7286, +2064, +3976, -486, -755, +780, -2840, -753, +1487, -511, -1136, -1879, +201, -1926, -1197, -654, -442, -429, -635, -89, +257, -23, +237, +1321, -511, +32, +268, -506, +24, +2, },
- { +20130, +13417, -7954, +1823, +3146, -160, -302, +339, -2656, -706, +1344, -730, -995, -2122, -28, -1814, -1115, -678, -496, -246, -631, -73, +307, +224, -38, +1338, -479, -375, +351, -455, +133, +122, },
- { +20900, +14050, -8284, +1502, +2221, -215, +187, +146, -2582, -775, +1230, -1057, -723, -2335, -281, -1549, -1106, -814, -527, -46, -662, -26, +311, +623, -314, +1032, -275, -849, +139, -141, +262, +150, },
- { +21506, +14520, -8163, +1322, +1076, -434, +702, +70, -2585, -746, +944, -1321, -256, -2471, -490, -1259, -1129, -1001, -507, +204, -799, +188, +407, +732, -431, +631, -175, -1085, -90, -20, +511, +450, },
- { +22045, +14638, -7551, +1339, -401, -605, +1069, +20, -2608, -672, +522, -1429, +425, -2597, -667, -990, -1249, -1112, -381, +216, -660, +423, +180, +808, -430, +149, -101, -901, -420, -144, +988, +646, },
- { +22374, +14605, -6584, +1379, -2012, -818, +1269, -52, -2715, -579, +90, -1306, +1138, -2771, -762, -975, -1284, -1081, -478, +502, -689, +317, +67, +770, -529, -3, +37, -932, -233, -321, +645, +1063, },
- { +21971, +14982, -5381, +1465, -3401, -1307, +1361, -157, -2826, -434, -42, -1263, +1888, -2842, -1101, -790, -1377, -899, -394, +320, -814, +398, -273, +728, -246, -176, +85, -530, -151, -691, +222, +1349, },
- { +21578, +15032, -3953, +1480, -4478, -2119, +1347, -259, -2912, +19, -196, -1128, +2559, -2963, -1432, -703, -946, -870, -888, +371, -914, +216, -287, +839, -198, -30, +401, -611, -215, -354, -239, +533, },
- { +20935, +14892, -2350, +1522, -5169, -3135, +939, +47, -2856, +331, -223, -886, +3031, -3198, -1627, +82, -1303, -1105, -934, +12, -879, +350, -351, +790, +317, +101, -59, -207, +109, -776, -140, -183, },
- { +19989, +14916, -1024, +1608, -5475, -4473, +295, +1065, -2834, +220, +84, -593, +2619, -2455, -1492, -396, -1160, -1373, -1255, +21, -642, +54, -86, +1220, -111, +160, +248, -322, +230, -981, +131, -465, },
- { +19442, +14440, -244, +2209, -5944, -5867, +441, +1708, -2969, +837, -323, -569, +3451, -2723, -1540, -344, -1757, -1134, -1142, -251, -519, +531, -17, +686, +62, +600, -73, -568, +824, -1013, -326, +77, },
- { +19215, +13282, +497, +2823, -6861, -6114, +314, +2076, -2340, +432, -449, +228, +3074, -2653, -1482, -1155, -1421, -644, -1745, -8, +375, -76, -205, +1100, -38, +316, +113, -497, +839, -778, -681, +216, },
- { +18399, +12398, +1273, +2931, -6997, -6116, +179, +2120, -1724, +857, -1704, +1041, +3221, -3315, -1375, -1169, -1113, -795, -1352, +352, -102, -102, +206, +701, -238, +511, +174, -405, +646, -548, -516, -399, },
- { +17103, +12076, +1628, +2442, -6317, -5062, -1021, +2253, +17, -617, -1910, +2032, +2182, -3218, -758, -1593, -918, +124, -1676, +57, +262, -74, -107, +549, -37, +456, +200, -287, +594, -479, -420, -621, },
- { +17339, +11281, -244, +2822, -5940, -4177, +36, +1140, -56, -183, -2196, +2015, +1763, -3155, -461, -1392, -347, -94, -1944, +612, +306, -660, +4, +659, -17, +432, +20, -3, +720, -783, -494, -283, },
- { +16567, +9681, +78, +3330, -6088, -2392, -403, +490, +834, -1104, -2339, +2535, +1400, -3259, +240, -1123, -378, -183, -1760, +840, -40, -771, +203, +636, -208, +524, +221, -45, +609, -787, -453, -228, },
- { +15277, +8488, +278, +3885, -5037, -2468, -191, +698, +82, -1238, -1833, +2336, +911, -2516, +590, -1228, -341, -135, -1481, +650, -204, -726, +413, +395, -341, +823, +281, -147, +494, -733, -476, -140, },
- { +14508, +10388, +2390, +614, -9568, -3171, +2824, +3138, -360, -1806, -3125, +365, +1587, -1832, +1166, -336, -464, +624, -617, +527, +1, -567, -177, -592, -325, +573, -499, -34, +977, -258, +261, -46, },
- { +12204, +10145, +3137, +1381, -8141, -4350, +1999, +2595, +500, -763, -2949, -365, +1128, -983, +987, -357, -350, +719, -509, +347, +303, -394, -148, -488, -492, +295, -634, +121, +1110, -75, +436, -20, },
- { +10618, +9407, +3284, +1743, -6720, -3899, +1478, +1813, +596, -356, -2413, -640, +1096, -622, +604, -220, -317, +679, -315, +187, +316, -151, -180, -467, -394, +122, -486, +261, +994, +154, +417, -67, },
- { +8737, +8566, +3830, +1870, -5294, -3295, +668, +1407, +736, -98, -1874, -761, +1017, -457, +347, -65, -252, +598, -129, +108, +374, +35, -238, -389, -303, +101, -170, +351, +816, +261, +307, -90, },
- { +7322, +7990, +4204, +1759, -4233, -2859, +204, +1225, +706, +89, -1428, -779, +812, -371, +310, +13, -255, +576, +48, +68, +394, +93, -230, -185, -105, +97, -62, +325, +596, +234, +208, -140, },
- { +5934, +7313, +4453, +1864, -3250, -2602, -73, +1073, +737, +266, -1100, -695, +649, -339, +267, +163, -183, +531, +195, +93, +388, +271, +42, +55, -87, -115, -13, +235, +333, +198, +167, -56, },
- { +5000, +6676, +4573, +2086, -2672, -2459, -188, +999, +803, +304, -865, -518, +450, -355, +364, +251, -120, +548, +192, +279, +680, +344, +32, +73, -196, -341, +1, +192, +208, +250, +135, -143, },
- { +4456, +6275, +4433, +1984, -2322, -2108, -127, +872, +815, +394, -642, -454, +355, -269, +459, +303, -78, +714, +511, +458, +618, +237, -33, -56, -404, -289, +129, +56, +240, +141, -2, +127, },
- { +3914, +5714, +4351, +2080, -2013, -1928, -97, +902, +872, +413, -420, -323, +306, -177, +447, +601, +422, +769, +448, +347, +442, +17, -200, -32, -412, -202, +177, -120, +89, +302, +138, +79, },
- { +3687, +5529, +4104, +1830, -1878, -1601, +73, +886, +904, +439, -190, -238, +213, +104, +832, +826, +315, +493, +327, +220, +233, -30, -126, -120, -318, -150, -96, +60, +301, +96, +30, +144, },
- { +3580, +5372, +3781, +1521, -1776, -1190, +327, +859, +987, +532, -67, +9, +629, +331, +636, +568, +95, +278, +193, +191, +184, -23, -203, -172, -324, -16, +176, -130, +89, +51, +115, +194, },
- { +3492, +5329, +3471, +1350, -1561, -940, +597, +949, +959, +721, +441, +128, +352, +175, +389, +425, +9, +204, +280, +156, +63, -22, -262, -158, +108, -5, -216, -107, +108, +31, +78, +239, },
- { +3432, +5245, +3183, +1194, -1128, -596, +840, +1170, +1253, +888, +199, -114, +53, +17, +302, +263, +132, +181, +140, +117, +66, -50, -59, +236, -176, -301, -113, -66, -72, -13, +269, +19, },
- { +3390, +5248, +2963, +1119, -596, -247, +1125, +1471, +935, +484, +120, -201, +1, -69, +296, +276, +64, +116, +141, +246, -26, +224, +239, -232, -240, -143, -165, -208, -22, +53, +4, +96, },
- { +3459, +5308, +2829, +1096, -226, +235, +1196, +1070, +638, +314, +33, -149, +26, -184, +259, +284, -110, +166, +359, +85, +180, +500, -207, -255, -125, -253, -294, -112, -3, -243, +82, +267, },
- { +3444, +5608, +3052, +1048, -153, +152, +952, +951, +500, +280, +174, -297, -12, -51, +82, +247, +11, +278, +212, +303, +571, -23, -220, +24, -291, -435, -178, -82, -257, -114, +197, +358, },
- { +3631, +5987, +3171, +840, -377, -261, +737, +1132, +564, +264, +192, -346, -126, +1, +155, +186, +152, +235, +119, +688, +415, -209, -47, -46, -307, -433, -160, -284, -252, +134, +257, +168, },
- { +3555, +6368, +3416, +601, -552, -585, +576, +1098, +540, +380, +255, -412, -120, +84, +90, +257, +276, +51, +139, +958, +303, -229, +70, -105, -327, -291, -183, -450, -241, +244, +389, -20, },
- { +3304, +6445, +3877, +542, -780, -691, +604, +1149, +403, +125, +220, -232, -86, +58, +247, +261, +126, +140, +91, +859, +535, -186, +15, -49, -295, -232, -192, -427, -225, +175, +356, +33, },
- { +3095, +6398, +4320, +718, -1060, -852, +617, +1319, +551, -131, -94, -318, -227, +167, +484, +239, +130, +167, -116, +734, +786, -134, -76, +64, -201, -204, -176, -362, -225, +158, +343, -8, },
- { +3043, +6443, +4566, +841, -1213, -1017, +635, +1471, +644, -187, -192, -362, -461, -72, +479, +445, +148, +181, -13, +421, +845, +87, -217, -18, -79, -55, -112, -366, -227, +211, +309, +49, },
- { +3132, +6650, +4683, +897, -1394, -1203, +748, +1560, +723, -251, -284, -272, -531, -243, +278, +347, +138, +203, +193, +288, +760, +331, -284, -258, -57, +43, +11, -256, -228, +216, +280, +136, },
- { +3367, +6988, +4849, +842, -1674, -1375, +807, +1795, +719, -420, -285, -270, -512, -280, +138, +254, -47, -57, +304, +307, +642, +594, -125, -511, -291, +9, +125, -134, -237, +289, +287, +139, },
- { +3586, +7407, +5080, +656, -1907, -1495, +823, +2057, +683, -633, -291, -228, -494, -258, +64, +194, -36, -286, +173, +318, +479, +623, +210, -460, -540, -128, +140, -101, -240, +315, +252, +163, },
- { +3913, +8036, +5294, +392, -2186, -1751, +902, +2457, +567, -915, -352, -187, -458, -275, +94, +106, -67, -364, +29, +257, +307, +466, +372, -273, -572, -259, +20, -46, -279, +200, +193, +90, },
- { +4032, +8688, +5666, +129, -2445, -1998, +927, +2764, +585, -1205, -445, -136, -465, -297, +145, +30, -86, -398, -75, +234, +196, +315, +365, -111, -602, -339, +4, +2, -305, +120, +111, -149, },
- { +4592, +9563, +5846, -404, -2900, -2105, +1130, +3189, +362, -1558, -421, -109, -448, -336, +218, +21, -218, -346, -123, +178, +175, +130, +357, -19, -545, -388, -95, -2, -115, +87, -12, -264, },
- { +5108, +10372, +5960, -878, -3340, -2212, +1378, +3487, +158, -1928, -397, -33, -497, -372, +269, +15, -353, -346, -123, +153, +121, -36, +345, +17, -453, -394, -151, -80, -129, +237, -86, -306, },
- { +5903, +11205, +5822, -1373, -3825, -2282, +1849, +3676, -196, -2204, -349, +96, -588, -398, +334, +40, -480, -394, -80, +155, +103, -202, +283, +76, -376, -305, -191, -130, -153, +273, -64, -333, },
- { +6463, +12077, +6105, -1736, -4427, -2497, +2172, +3937, -457, -2637, -316, +269, -650, -515, +328, +128, -574, -464, -145, +165, +112, -359, +102, +133, -284, -189, -158, -224, -158, +175, +22, -412, },
- { +6842, +12772, +6370, -1805, -4912, -2802, +2482, +4054, -577, -3009, -381, +505, -711, -614, +320, +143, -632, -456, -212, +124, +133, -429, -89, +129, -159, -163, +4, -302, -109, +98, -9, -351, },
- { +7495, +13436, +6402, -1641, -5389, -3222, +2902, +4096, -819, -3320, -508, +760, -709, -801, +367, +144, -733, -443, -242, +90, +109, -405, -353, -3, +96, -160, +135, -243, -147, +159, -109, -342, },
- { +8302, +13982, +6007, -1545, -5551, -3449, +3272, +3931, -1108, -3384, -659, +902, -637, -984, +381, +171, -829, -414, -266, +67, +40, -321, -455, -318, +312, -35, +128, -72, -215, +189, -55, -445, },
- { +9896, +14670, +4570, -1730, -5262, -3249, +3511, +3414, -1572, -3150, -826, +851, -414, -1191, +310, +159, -852, -430, -228, +45, -97, -288, -414, -643, +337, +260, +1, +181, -141, +21, +120, -543, },
- { +11175, +14744, +3448, -993, -4976, -3811, +3696, +3441, -2038, -3160, -852, +834, -325, -1343, +248, +102, -877, -401, -118, -49, -199, -292, -342, -788, +115, +605, -66, +267, +58, -136, +206, -540, },
- { +12433, +14644, +2289, -11, -4664, -4428, +3847, +3503, -2546, -3196, -721, +719, -321, -1413, +201, -27, -944, -298, +67, -214, -293, -242, -375, -807, -141, +822, +24, +219, +276, -175, +133, -469, },
- { +14253, +15077, +91, +194, -3679, -4227, +3554, +3173, -2873, -3182, -505, +510, -236, -1531, +106, -141, -941, -242, +293, -223, -457, -200, -494, -638, -319, +772, +318, +229, +335, -59, -21, -432, },
- { +16147, +15220, -1962, +114, -2901, -3609, +3134, +2739, -3044, -3270, -314, +358, -218, -1704, +85, -332, -895, -157, +414, -203, -648, -134, -650, -486, -341, +596, +483, +347, +229, -1, -55, -568, },
- { +17862, +15961, -4207, -422, -1951, -2655, +2484, +2264, -2914, -3618, -117, +208, -161, -1924, +25, -473, -800, -35, +478, -79, -937, -17, -769, -367, -225, +425, +413, +582, +113, -133, +87, -734, },
- { +19449, +16392, -5859, -1112, -1427, -1629, +1942, +1918, -2765, -3978, -8, +84, -134, -2062, -13, -566, -654, +37, +477, +32, -1157, +83, -816, -331, +13, +340, +96, +768, +67, -341, +213, -694, },
- { +21050, +17015, -7348, -2198, -1140, -508, +1499, +1662, -2610, -4451, +6, -138, -34, -2121, -29, -596, -503, +48, +407, +189, -1351, +208, -923, -200, +286, +156, -272, +696, +143, -514, +278, -464, },
- { +22180, +17691, -8318, -3153, -1264, +222, +1444, +1546, -2552, -4822, -136, -360, +172, -2054, -32, -523, -483, -7, +341, +375, -1419, +217, -913, -27, +273, +51, -545, +431, +314, -476, +252, -284, },
- { +23145, +18305, -8899, -3912, -1872, +754, +1676, +1457, -2542, -5140, -436, -571, +593, -1943, -18, -391, -590, -105, +360, +600, -1486, +265, -834, -64, +157, -1, -808, +207, +535, -343, +188, -148, },
- { +24201, +18791, -9169, -4533, -3193, +1197, +2201, +1353, -2588, -5477, -898, -646, +1316, -1907, +112, -361, -830, -56, +459, +703, -1301, +324, -1128, -106, +17, -169, -828, +111, +625, -123, +274, -146, },
- { +25039, +18854, -8960, -4922, -4675, +1488, +2597, +1309, -2785, -5629, -1226, -537, +1894, -1872, +177, -569, -818, +47, +414, +930, -1141, -66, -1306, -147, -197, -117, -643, -26, +588, +205, +269, -377, },
- { +25483, +18997, -8159, -5303, -6464, +1415, +3101, +1247, -3048, -5328, -1549, -448, +2627, -1908, -26, -525, -721, +144, +628, +830, -1334, -263, -1576, -203, -94, -5, -521, -41, +604, +221, +328, -313, },
- { +25310, +19394, -7240, -5364, -8082, +861, +3602, +1021, -2853, -4841, -1925, -274, +3034, -1996, -184, -315, -585, +480, +190, +564, -1199, -604, -1602, -1, -64, +5, -267, -39, +307, +300, +702, -524, },
- { +25187, +19126, -5747, -5306, -10048, +5, +3816, +1259, -2439, -4328, -2144, -285, +3285, -2132, -193, +313, -577, +11, -100, +308, -1123, -638, -1463, +80, -40, +174, -302, -152, +368, +273, +817, -512, },
- { +24584, +19059, -4370, -5103, -11540, -1206, +4149, +1948, -2239, -3792, -2260, -463, +3232, -1933, +310, +264, -1049, -39, -461, +305, -807, -683, -1310, +216, -69, -19, -134, -7, +199, +192, +1012, -495, },
- { +24229, +18498, -3219, -4673, -13052, -2239, +4802, +2529, -2152, -3029, -2527, -945, +3759, -1608, +81, +180, -1445, -83, -369, +279, -585, -589, -996, -15, -262, +176, +17, -164, +214, +234, +1010, -493, },
- { +23479, +17761, -2169, -4054, -14542, -2764, +5166, +3024, -1593, -2674, -3100, -489, +3855, -1932, +199, -475, -1408, +376, -646, +385, -160, -507, -1201, -125, -73, +89, +2, -134, +277, +184, +889, -456, },
- { +22902, +16611, -1241, -3921, -14659, -3126, +5151, +3820, -1738, -2209, -3026, -680, +3843, -2076, -205, -376, -1050, +290, -561, +675, -171, -734, -967, -54, -279, +107, +127, -143, +289, +105, +906, -440, },
- { +21520, +15491, -466, -3170, -14169, -3623, +5060, +3934, -933, -1908, -3770, -160, +3317, -2389, +45, -293, -930, +570, -302, +294, -117, -531, -816, -259, -393, +309, +177, -338, +355, +325, +623, -455, },
- { +20196, +14258, -26, -2087, -13378, -3959, +4522, +4579, -753, -2187, -3650, -282, +3062, -2403, +220, -314, -596, +900, -834, +333, +193, -640, -766, -353, -377, +474, -67, -401, +722, +187, +352, -286, },
- { +18562, +12495, +606, -395, -12713, -4067, +4718, +3983, -631, -1865, -4106, +267, +2676, -2530, +544, -90, -270, +517, -885, +629, +178, -816, -539, -358, -375, +420, -176, -225, +814, +58, +205, -176, },
- { +16507, +11335, +1670, +425, -11680, -3415, +3753, +3482, -140, -2175, -3676, +452, +2142, -2340, +899, +31, -525, +540, -719, +620, +74, -768, -288, -458, -444, +527, -237, -258, +969, -83, +155, -100, },
- { +15749, +11088, +540, -1465, -10587, +5, +4768, +1482, -1271, -1294, -2408, -204, +2109, -2180, +700, +142, -524, +394, -343, +524, -78, -510, -510, -119, -176, +83, +45, -8, -121, -132, +846, -57, },
- { +12780, +11168, +3101, -713, -10375, -2419, +3165, +2486, +741, -926, -2637, -901, +1193, -1380, +1171, +201, -695, +683, -287, +203, +326, -265, -402, +216, -760, -316, +56, -240, +385, +349, +800, +38, },
- { +10481, +10174, +3731, +12, -8189, -2627, +2287, +2162, +639, -620, -1980, -947, +827, -877, +947, +162, -591, +622, -179, +124, +414, -151, -214, +218, -687, -257, +155, -179, +273, +413, +653, +58, },
- { +8668, +9236, +4001, +664, -6447, -2669, +1688, +1709, +604, -245, -1509, -943, +653, -570, +711, +170, -456, +560, -83, +116, +460, +30, -144, +259, -390, -222, +102, -244, +172, +370, +519, +108, },
- { +7283, +8384, +4111, +1067, -5156, -2491, +1257, +1309, +661, +29, -1138, -850, +514, -376, +522, +237, -336, +496, +41, +153, +499, +232, +59, +319, -295, -329, -17, -275, -28, +319, +573, +102, },
- { +6272, +7691, +4060, +1222, -4187, -2162, +939, +1051, +723, +183, -806, -720, +436, -270, +454, +290, -208, +496, +100, +362, +696, +335, +52, +222, -281, -423, -148, -305, -83, +332, +591, +108, },
- { +5580, +7158, +3875, +1174, -3460, -1834, +755, +904, +761, +294, -524, -552, +331, -184, +477, +333, -134, +601, +379, +449, +583, +227, -20, +147, -340, -469, -157, -333, -172, +385, +542, +14, },
- { +5099, +6769, +3611, +1012, -2865, -1522, +671, +853, +823, +385, -298, -392, +284, -75, +496, +488, +66, +592, +366, +331, +409, +167, -75, +79, -239, -485, -266, -327, -145, +317, +622, +200, },
- { +4774, +6505, +3318, +801, -2367, -1254, +708, +915, +878, +465, -124, -221, +265, +118, +634, +457, -4, +374, +332, +279, +241, +173, -17, +50, -250, -474, -271, -392, +13, +518, +389, +79, },
- { +4533, +6373, +3052, +547, -1931, -979, +831, +1054, +874, +581, -34, -52, +431, +69, +479, +349, -93, +183, +314, +308, +170, +203, +2, -44, -122, -409, -440, -16, +135, +84, +235, +185, },
- { +4382, +6335, +2815, +384, -1572, -712, +951, +1234, +846, +634, +201, -204, +344, +11, +311, +320, -174, +46, +261, +434, +123, +92, +101, +62, -245, -261, -49, -321, -116, +108, +125, +189, },
- { +4310, +6316, +2697, +377, -1265, -560, +1000, +1283, +976, +592, +177, -342, +94, +124, +234, +277, -211, -42, +322, +339, +136, +155, +187, -53, -7, +128, -468, -481, -77, +89, +78, +112, },
- { +4220, +6370, +2803, +455, -1043, -593, +884, +1257, +898, +647, +131, -407, +17, -24, +259, +268, -143, -71, +248, +315, +54, +318, +56, +134, +452, -358, -580, -280, -245, +17, +207, +32, },
- { +4238, +6578, +2947, +418, -979, -561, +705, +1063, +778, +509, +327, -311, -141, -2, +117, +252, +15, +34, +169, +147, +205, +145, +62, +724, +153, -621, -342, -314, -253, +63, +216, -198, },
- { +4312, +6878, +3119, +203, -1024, -566, +664, +1052, +477, +317, +296, -326, +41, -20, +78, +256, -64, +129, +238, +109, +104, +11, +281, +812, -119, -527, -289, -348, -126, +151, +43, -331, },
- { +4243, +7275, +3432, -18, -1154, -711, +722, +1244, +373, +111, +88, -498, -48, +145, +283, +267, -58, +72, +167, +174, +186, -87, +222, +896, -239, -530, -150, -376, +16, +248, -104, -319, },
- { +4240, +7629, +3820, -212, -1418, -875, +841, +1446, +395, +35, -59, -651, -337, +57, +348, +394, +138, +74, +125, +94, +212, -51, +148, +896, -296, -557, -109, -348, +139, +310, -89, -337, },
- { +4267, +8079, +4161, -358, -1708, -1137, +1013, +1624, +419, -13, -148, -667, -486, -153, +260, +306, +109, +213, +291, +100, +122, +47, -84, +791, +19, -750, -253, -252, +190, +325, -24, -265, },
- { +4428, +8579, +4533, -649, -2161, -1157, +1152, +1818, +471, -285, -99, -625, -629, -167, +110, +208, -67, +58, +397, +149, +182, +241, -312, +521, +338, -764, -423, -220, +99, +352, +41, -277, },
- { +4663, +9147, +5017, -957, -2713, -1191, +1270, +2062, +456, -561, -64, -490, -728, -151, +48, +95, -93, -149, +333, +236, +4, +377, -80, +107, +501, -359, -693, -415, +113, +346, +3, -240, },
- { +4794, +9798, +5715, -1328, -3293, -1331, +1372, +2391, +376, -861, -165, -318, -751, -218, +113, -43, -176, -257, +208, +326, -101, +123, +104, -60, +376, +187, -610, -661, -80, +210, +60, -231, },
- { +4706, +10404, +6857, -1587, -4043, -1501, +1416, +2768, +428, -1274, -318, -83, -773, -321, +190, -68, -276, -333, +89, +301, +70, -126, -66, -7, +48, +426, +52, -740, -438, +212, -62, -314, },
- { +5492, +11533, +6802, -2410, -4639, -1493, +1942, +3028, +51, -1662, -327, +15, -748, -355, +194, -55, -404, -364, +59, +221, +123, -131, -285, -124, -44, +334, +429, -330, -642, -6, -1, -451, },
- { +5983, +12434, +7309, -2945, -5475, -1428, +2301, +3203, -66, -2148, -439, +316, -869, -393, +284, -166, -434, -371, -45, +257, +65, -121, -270, -467, -42, +274, +467, +199, -506, -380, +16, -415, },
- { +6553, +13345, +7759, -3488, -6279, -1393, +2735, +3371, -353, -2547, -584, +610, -877, -578, +354, -136, -577, -381, +10, +115, +137, -230, -229, -570, -338, +370, +460, +362, -28, -508, -363, -242, },
- { +7471, +14327, +7633, -4021, -6946, -1337, +3324, +3391, -814, -2875, -657, +809, -860, -751, +399, -191, -586, -460, +66, +94, +17, -214, -308, -558, -507, +258, +589, +343, +231, -149, -748, -423, },
- { +8279, +15118, +7553, -4198, -7540, -1469, +3893, +3301, -1178, -3117, -875, +1005, -790, -1000, +413, -197, -660, -436, +72, +94, -104, -258, -361, -556, -505, +12, +646, +436, +181, +263, -660, -907, },
- { +9124, +15874, +7171, -4175, -7769, -1782, +4384, +3236, -1562, -3240, -1066, +1125, -708, -1207, +337, -154, -693, -392, +105, +118, -192, -387, -322, -628, -341, -94, +398, +659, +143, +329, -199, -1184, },
- { +10600, +16582, +5950, -4368, -7541, -1867, +4737, +3086, -2067, -3335, -1044, +1123, -740, -1306, +237, -176, -627, -343, +172, +164, -330, -475, -330, -675, -210, +76, +40, +658, +284, +168, +174, -1087, },
- { +12376, +17175, +4171, -4522, -7036, -1733, +4785, +2866, -2442, -3529, -868, +972, -750, -1432, +142, -233, -536, -280, +203, +260, -566, -441, -421, -666, -125, +321, -234, +424, +421, +32, +318, -810, },
- { +14090, +17881, +2149, -4729, -6335, -1510, +4556, +2689, -2622, -3826, -676, +683, -672, -1544, +43, -207, -493, -179, +161, +384, -803, -320, -525, -640, -11, +437, -358, +48, +480, -16, +337, -499, },
- { +16479, +18100, -251, -5038, -5617, -895, +4158, +2494, -2872, -4087, -506, +369, -589, -1544, +53, -264, -351, -200, +196, +385, -925, -184, -637, -545, +96, +400, -519, -169, +313, +46, +383, -236, },
- { +18719, +18354, -2535, -5382, -5077, -235, +3760, +2374, -3095, -4427, -427, +22, -354, -1411, +7, -243, -275, -312, +263, +406, -941, -99, -688, -428, +90, +202, -566, -359, +122, +172, +472, -78, },
- { +20632, +18711, -4603, -5686, -4881, +473, +3484, +2242, -3308, -4836, -393, -315, +167, -1349, -10, -178, -419, -353, +354, +511, -957, -1, -751, -448, -19, +72, -604, -458, +57, +275, +400, +168, },
- { +22360, +19050, -6299, -6014, -5124, +1226, +3414, +2007, -3540, -5278, -311, -473, +850, -1407, +137, -306, -606, -202, +424, +682, -953, +71, -1092, -494, -36, -56, -597, -263, -49, +181, +480, +340, },
- { +23853, +19254, -7494, -6434, -5724, +1855, +3501, +1649, -3877, -5514, -94, -559, +1541, -1479, +150, -510, -585, -3, +419, +893, -1016, -259, -1392, -389, -165, +23, -418, -178, -252, +244, +451, +239, },
- { +25329, +18892, -8176, -6707, -6565, +2362, +3636, +1174, -4256, -5023, -220, -362, +2101, -1684, +93, -508, -345, +44, +530, +734, -1282, -474, -1490, -397, +61, +190, -464, -83, -222, +71, +299, +421, },
- { +26132, +18615, -8557, -6606, -7720, +2662, +3828, +564, -4070, -4493, -377, -142, +2382, -2009, +159, -193, -269, +57, +124, +489, -1273, -596, -1558, -23, +257, +40, -292, +5, -420, -52, +361, +377, },
- { +26097, +18760, -8279, -6563, -9338, +2395, +4427, +354, -3683, -4052, -417, -411, +2686, -2127, +394, +208, -612, -267, -183, +547, -1260, -477, -1400, +110, +235, +53, -183, -98, -337, -206, +404, +296, },
- { +26298, +17883, -7539, -6429, -11135, +2349, +5208, +297, -3531, -3208, -932, -479, +3059, -2027, +586, +52, -1210, -243, -201, +410, -847, -361, -1398, +182, +205, +3, -91, -95, -338, -279, +476, +239, },
- { +25890, +16998, -6703, -6158, -12691, +2616, +5823, +131, -2985, -2746, -1498, -267, +3567, -2288, +598, -395, -1379, +90, -420, +614, -490, -504, -1389, +217, +123, -23, -40, -116, -280, -344, +578, +55, },
- { +24947, +16037, -5788, -5689, -13461, +2608, +6096, +412, -2813, -2278, -1596, -192, +3523, -2540, +252, -341, -1212, +134, -205, +703, -394, -619, -1225, +253, -81, +26, +22, -90, -211, -394, +628, +37, },
- { +23244, +14939, -4628, -4799, -13452, +2196, +6207, +481, -2338, -1733, -1999, -166, +3296, -2924, +380, -214, -1290, +655, -260, +536, -282, -573, -1003, -3, -66, +82, +42, -31, -237, -351, +712, -93, },
- { +21175, +13481, -2942, -3774, -12857, +1570, +5657, +1162, -1877, -1714, -2063, -297, +2743, -2620, +466, -249, -749, +711, -463, +451, -19, -579, -1025, +20, -106, +79, +79, -61, -143, -304, +645, -60, },
- { +18636, +12183, -1209, -2590, -11846, +582, +5371, +1609, -1826, -1340, -2309, -463, +2623, -2468, +485, +42, -543, +537, -540, +593, +20, -722, -705, -39, -175, +121, +49, +1, -116, -325, +749, +25, },
- { +14783, +9489, -2982, -1023, -3993, +3280, +1929, -1888, -1700, +251, +285, -164, +1356, -1971, +151, -32, -982, +252, -342, +144, -27, -417, -521, +840, -3, +115, +200, -545, +44, -370, -154, +120, },
- { +12635, +9338, -1709, -1092, -3762, +2615, +2298, -1249, -1537, +64, +39, -164, +1209, -1626, +74, +120, -732, +178, -175, +161, -27, -373, -563, +683, +104, +109, +334, -384, -11, -279, -152, +39, },
- { +10824, +8969, -613, -1061, -3373, +2063, +2390, -782, -1282, -126, -128, -73, +1005, -1268, +42, +226, -527, +136, -29, +165, -13, -304, -520, +542, +230, +129, +323, -272, -56, -204, -196, -8, },
- { +9429, +8572, +94, -1038, -2958, +1688, +2332, -399, -1026, -257, -166, -8, +812, -970, +100, +281, -355, +129, +93, +200, -9, -181, -418, +422, +262, +108, +261, -198, -85, -190, -163, -35, },
- { +8397, +8228, +487, -1075, -2536, +1429, +2193, -104, -809, -286, -144, +0, +671, -693, +170, +287, -214, +140, +163, +259, +27, -77, -357, +258, +245, +93, +144, -149, -82, -138, -162, -157, },
- { +7612, +7949, +682, -1088, -2127, +1227, +2044, +150, -627, -240, -104, +9, +638, -490, +230, +309, -107, +161, +239, +304, +6, -19, -321, +91, +206, +63, +62, -59, -63, -155, -170, -131, },
- { +6952, +7827, +766, -1099, -1787, +1048, +1937, +367, -509, -160, +31, -46, +675, -344, +225, +366, -39, +163, +218, +347, -43, -35, -270, -73, +151, +125, +10, -31, -65, -114, -144, -245, },
- { +6683, +7602, +752, -1154, -1469, +1022, +1800, +518, -463, -59, +237, -126, +665, -182, +167, +400, +1, +65, +208, +350, -66, -128, -244, -86, +66, +169, -26, -43, +21, -177, -95, +91, },
- { +6328, +7603, +798, -1168, -1193, +1003, +1709, +558, -362, -97, +468, -68, +448, +37, +143, +230, +82, +36, +95, +341, -19, -201, -272, +32, -38, +101, +81, -48, -56, +78, +109, -161, },
- { +6163, +7555, +882, -1153, -951, +1060, +1636, +512, -380, -40, +469, +81, +403, -73, +284, +126, -61, +146, +60, +209, +16, -67, -335, -42, +24, +86, +40, -88, +270, +181, -136, -94, },
- { +6061, +7646, +945, -1152, -751, +1127, +1592, +462, -481, -102, +513, +8, +479, -8, +120, +232, -121, -17, +188, +182, -85, +28, -226, -217, -8, +203, -144, +134, +478, -84, -37, -109, },
- { +6159, +7784, +897, -1252, -582, +1290, +1597, +367, -567, -244, +423, +7, +359, +71, +248, +105, -133, +44, +12, +207, +16, -67, -239, -155, +10, -42, -17, +448, +145, -81, +130, -268, },
- { +6295, +8059, +874, -1507, -476, +1456, +1680, +362, -767, -349, +394, -179, +254, +82, +233, +237, -141, -70, +113, +103, -91, +65, -321, -165, +80, -154, +82, +449, -28, -5, +49, -241, },
- { +6464, +8458, +884, -1785, -437, +1608, +1780, +391, -878, -494, +409, -232, +50, -6, +273, +208, -116, +68, +65, +99, -84, -65, -354, -36, +94, -209, +217, +427, -208, -3, +52, -229, },
- { +6683, +8970, +878, -2165, -376, +1753, +1869, +420, -1047, -513, +453, -325, -68, -78, +177, +166, -163, +34, +201, +156, -170, -62, -410, -135, +213, -121, +156, +486, -231, -110, -45, -202, },
- { +7075, +9466, +776, -2530, -318, +1953, +1897, +349, -1235, -528, +610, -389, -209, -190, +180, +87, -332, -2, +206, +167, -129, -48, -464, -135, +204, -153, +111, +606, -167, -304, -61, -230, },
- { +7586, +10041, +588, -2915, -206, +2202, +1934, +234, -1428, -528, +819, -402, -344, -230, +142, +32, -392, -123, +176, +151, -193, +34, -366, -138, +241, -59, -155, +594, +203, -426, -180, -174, },
- { +8284, +10637, +233, -3349, -82, +2488, +1888, +4, -1707, -479, +1011, -436, -518, -321, +180, -80, -546, -130, +97, -3, -257, -57, -259, -35, +170, +42, -299, +295, +418, -294, -381, -148, },
- { +9095, +11203, -132, -3724, +50, +2818, +1819, -242, -2019, -371, +1236, -443, -675, -423, +213, -107, -683, -188, +152, -197, -308, -122, -264, +206, +142, +61, -245, -25, +422, +25, -540, -195, },
- { +9889, +11877, -498, -4104, +128, +3146, +1756, -530, -2290, -350, +1519, -489, -802, -515, +198, -156, -758, -285, +204, -324, -438, -107, -349, +396, +198, +14, -193, -173, +148, +358, -427, -465, },
- { +10582, +12562, -764, -4376, +91, +3406, +1737, -827, -2467, -415, +1769, -548, -939, -576, +195, -234, -826, -350, +190, -335, -585, -69, -435, +512, +288, -37, -200, -225, -129, +406, -34, -688, },
- { +11306, +13237, -1039, -4536, -26, +3591, +1718, -1098, -2614, -469, +1956, -571, -1083, -632, +173, -288, -912, -416, +136, -318, -675, -9, -461, +518, +395, -47, -243, -278, -292, +231, +360, -602, },
- { +12126, +13732, -1324, -4530, -169, +3644, +1688, -1289, -2721, -525, +2075, -627, -1199, -662, +140, -328, -973, -491, +59, -292, -671, -19, -361, +462, +431, -38, -247, -401, -359, +38, +478, -239, },
- { +13174, +14048, -1834, -4351, -231, +3530, +1631, -1424, -2802, -592, +2109, -667, -1235, -700, +112, -376, -980, -597, +19, -296, -588, -73, -240, +447, +337, +12, -264, -517, -447, +2, +295, +152, },
- { +13912, +14689, -2549, -4087, -276, +3213, +1690, -1511, -2845, -778, +2173, -760, -1162, -780, +32, -364, -1053, -628, -102, -130, -603, -57, -165, +414, +214, +87, -300, -593, -470, -60, +82, +348, },
- { +15735, +14399, -3901, -3481, -192, +2964, +1469, -1601, -3017, -661, +2045, -910, -920, -980, +113, -561, -1039, -685, -48, -104, -573, +16, -218, +402, +105, +138, -407, -536, -465, -206, -44, +459, },
- { +17507, +14116, -5426, -2751, -192, +2764, +1237, -1736, -3152, -642, +2056, -1032, -638, -1128, +153, -726, -1046, -569, -51, -121, -478, +1, -396, +547, -27, +111, -333, -501, -516, -340, +19, +317, },
- { +19177, +13698, -6887, -1985, -243, +2671, +917, -1892, -3302, -557, +2196, -1213, -249, -1266, +144, -850, -933, -377, -271, +44, -521, -211, -328, +623, -195, +277, -239, -659, -459, -299, -118, +155, },
- { +20876, +12896, -8162, -1221, -405, +2653, +504, -2083, -3425, -193, +2142, -1312, +212, -1534, +162, -820, -758, -426, -316, +25, -728, -166, -380, +694, -108, +401, -373, -670, -277, -461, -291, +192, },
- { +22269, +11988, -9087, -514, -824, +2741, +141, -2324, -3367, +226, +1930, -1209, +579, -1900, +451, -737, -828, -320, -621, -37, -648, -370, -319, +1024, -166, +363, -328, -614, -348, -565, -333, +183, },
- { +22436, +12036, -9756, +12, -1484, +2839, +192, -2651, -3134, +304, +2024, -1272, +960, -2016, +603, -606, -966, -471, -868, +179, -932, -258, -187, +1149, -274, +472, -264, -806, -269, -673, -333, +115, },
- { +22976, +10737, -9315, +116, -2333, +3251, +276, -2916, -2945, +644, +1634, -1050, +1433, -2250, +799, -568, -1370, -360, -902, +24, -701, -266, -133, +1143, -162, +431, -320, -856, -257, -656, -421, +206, },
- { +22156, +10670, -8825, +31, -3255, +3766, +558, -3195, -2534, +719, +1180, -629, +1637, -2399, +832, -768, -1413, -237, -975, +241, -538, -329, -188, +1315, -228, +362, -275, -900, -124, -757, -357, +287, },
- { +21278, +9846, -7554, -398, -3803, +4159, +764, -3114, -2412, +808, +1003, -456, +1754, -2523, +558, -585, -1493, -124, -765, +323, -452, -399, -154, +1291, -276, +265, -134, -876, -130, -701, -238, +296, },
- { +19461, +9711, -6136, -768, -4103, +4127, +1289, -3000, -2181, +873, +525, -145, +1756, -2618, +563, -484, -1372, +57, -547, +215, -362, -384, -264, +1161, -298, +275, -17, -893, -58, -554, -229, +265, },
- { +17277, +9611, -4621, -998, -4208, +3875, +1658, -2589, -1841, +534, +392, -46, +1442, -2298, +316, -236, -1201, +192, -408, +85, -140, -396, -437, +993, -150, +202, +81, -782, +50, -474, -177, +231, },
- { +14172, +9673, -3573, -888, -1759, +2079, +423, -1986, -1744, +555, +790, -69, +1145, -1353, +372, +59, -818, -47, -210, +85, -314, -228, -308, +651, -194, +55, +187, -514, -187, -359, -318, -25, },
- { +12049, +9447, -2228, -1231, -1752, +1946, +840, -1465, -1503, +155, +682, -24, +949, -1008, +142, +192, -555, +85, -44, +97, -161, -260, -418, +506, -91, +11, +275, -348, -145, -288, -275, -84, },
- { +10303, +9142, -1241, -1401, -1603, +1679, +1080, -926, -1326, -100, +605, -40, +855, -692, +34, +292, -275, +96, +72, +212, -127, -202, -437, +334, -5, -31, +233, -223, -120, -232, -200, -174, },
- { +9017, +8838, -619, -1486, -1392, +1440, +1205, -522, -1133, -209, +558, -14, +754, -391, +50, +313, -71, +90, +164, +296, -77, -139, -435, +174, +4, -91, +133, -78, -72, -176, -176, -213, },
- { +8142, +8597, -267, -1538, -1157, +1261, +1254, -258, -963, -244, +541, +75, +679, -187, +160, +270, +1, +140, +187, +302, -55, -83, -444, +4, -35, -132, +106, +52, -76, -189, -49, -190, },
- { +7622, +8383, -48, -1578, -899, +1181, +1234, -71, -944, -214, +551, +137, +707, -144, +260, +320, -94, +109, +245, +239, -123, -2, -426, -196, -30, -52, +38, -6, +17, -57, -187, -8, },
- { +7332, +8319, +57, -1601, -631, +1238, +1135, +21, -967, -327, +659, +76, +672, +38, +199, +349, -41, -97, +208, +331, -233, -127, -295, -155, -164, -26, -20, -11, +90, -178, +192, +245, },
- { +7317, +8418, -7, -1642, -367, +1419, +1147, -111, -974, -384, +550, +84, +565, +94, +364, +313, -68, -10, +86, +197, -143, -149, -385, -44, -17, -229, -53, +121, -114, +140, +435, -168, },
- { +7367, +8733, -36, -1826, -124, +1616, +1200, -184, -1158, -452, +570, -113, +408, +131, +319, +450, -22, -49, +185, +112, -380, -100, -266, -117, -72, -71, +10, -213, +51, +444, +58, -226, },
- { +7780, +9068, -243, -2044, +77, +1858, +1206, -274, -1289, -551, +596, -178, +200, -29, +344, +432, -90, +103, +283, +41, -414, -210, -414, +8, +0, -140, +15, -152, +111, +292, -78, -206, },
- { +8345, +9580, -574, -2318, +346, +2040, +1168, -408, -1458, -527, +676, -258, +1, -124, +320, +310, -183, +87, +370, +84, -415, -236, -480, -21, -74, -20, +45, -230, +106, +351, -132, -434, },
- { +9094, +10154, -1025, -2554, +632, +2229, +994, -595, -1621, -437, +874, -416, -132, -257, +352, +267, -420, +47, +366, +3, -398, -143, -510, +98, -129, -195, +92, -138, -60, +248, +111, -492, },
- { +10041, +10768, -1614, -2719, +916, +2381, +756, -898, -1763, -304, +1151, -599, -325, -310, +358, +208, -536, -91, +282, -46, -529, -37, -456, +197, -31, -321, -13, -176, -156, +116, +291, -363, },
- { +11107, +11413, -2234, -2770, +1108, +2450, +521, -1208, -1885, -154, +1431, -759, -498, -367, +419, +97, -627, -128, +121, -90, -589, -28, -356, +273, +33, -279, -81, -291, -313, -16, +331, +7, },
- { +12280, +12021, -2906, -2717, +1134, +2377, +314, -1466, -2001, -37, +1641, -947, -595, -443, +445, +1, -745, -215, +22, -112, -652, -10, -293, +280, +22, -180, -159, -383, -467, -188, +208, +307, },
- { +13475, +12606, -3625, -2517, +1014, +2161, +183, -1625, -2084, +8, +1791, -1103, -612, -507, +435, -57, -847, -324, -41, -71, -678, +57, -282, +263, -37, -62, -209, -455, -522, -398, +113, +417, },
- { +14812, +13011, -4511, -2154, +806, +1834, +70, -1725, -2175, +16, +1867, -1208, -532, -590, +417, -130, -929, -396, -58, -66, -662, +121, -368, +291, -144, -1, -180, -513, -541, -616, +106, +375, },
- { +16380, +13067, -5650, -1592, +605, +1495, -131, -1780, -2290, +40, +2010, -1367, -305, -662, +396, -248, -905, -354, -222, +46, -645, +6, -354, +338, -292, +124, -80, -658, -520, -638, -12, +271, },
- { +17982, +12702, -6846, -878, +421, +1177, -463, -1808, -2473, +274, +2108, -1572, +121, -826, +355, -267, -731, -513, -308, +176, -908, +60, -376, +313, -223, +268, -136, -780, -340, -699, -278, +268, },
- { +19157, +12247, -7860, -132, +149, +912, -724, -1957, -2452, +536, +2076, -1557, +521, -1124, +525, -122, -855, -442, -535, +76, -863, -69, -379, +601, -217, +257, -79, -739, -389, -790, -342, +200, },
- { +19711, +11522, -8169, +401, -329, +905, -928, -2048, -2370, +752, +2017, -1467, +767, -1174, +691, -185, -760, -679, -713, +177, -1039, -25, -158, +692, -291, +423, -59, -878, -408, -762, -397, +110, },
- { +19465, +10779, -7703, +460, -893, +1187, -817, -2234, -2246, +1019, +1640, -1190, +1218, -1460, +857, -119, -1111, -511, -817, +81, -770, -57, -137, +805, -201, +370, -136, -863, -389, -713, -437, +67, },
- { +18333, +10203, -6584, +85, -1382, +1684, -563, -2346, -2049, +928, +1357, -671, +1226, -1413, +733, -229, -1009, -521, -666, +153, -618, -188, -102, +925, -315, +267, -79, -795, -334, -687, -385, +130, },
- { +16441, +9946, -5138, -473, -1669, +2005, -91, -2252, -1996, +837, +1093, -412, +1392, -1542, +535, -11, -1080, -203, -475, +134, -478, -260, -105, +753, -285, +165, +32, -670, -301, -515, -295, +22, },
- { +13089, +9529, -4017, -237, +483, +1183, -334, -1490, -1552, +647, +1264, -471, +629, -605, +562, -36, -643, -387, -501, +84, -371, -60, -86, +640, -100, +137, -1, -574, -350, -440, -324, -139, },
- { +11898, +9621, -3405, -1165, +243, +1679, +179, -1312, -1709, +64, +1140, -239, +692, -458, +479, +250, -561, -188, -174, +41, -320, -165, -304, +589, -101, -43, +124, -435, -309, -354, -282, -103, },
- { +10997, +9658, -2780, -1802, -26, +1783, +569, -947, -1662, -248, +967, -127, +729, -294, +466, +390, -354, -145, +46, +95, -329, -112, -479, +387, +17, -149, +90, -226, -277, -280, -149, -147, },
- { +10403, +9825, -2433, -2099, -53, +1814, +738, -808, -1574, -372, +873, -167, +701, -213, +490, +502, -294, -53, +103, +45, -399, -57, -537, +124, +113, -120, +21, -185, -188, -248, -114, -74, },
- { +10392, +9882, -2497, -2112, +324, +1944, +702, -937, -1618, -322, +898, -262, +449, -113, +460, +482, -188, -10, +186, -20, -556, -166, -451, +104, +9, -20, +13, -185, -148, -338, -76, +107, },
- { +10862, +9834, -2867, -1780, +884, +2063, +422, -1170, -1644, -165, +979, -389, +198, -268, +566, +314, -335, +218, +172, -127, -560, -306, -505, +230, +61, -85, -17, -114, -234, -393, -69, +141, },
- { +11578, +9958, -3241, -1267, +1305, +1835, +61, -1353, -1523, +172, +1158, -610, -59, -256, +501, +100, -434, +87, +156, -173, -554, -216, -452, +238, -8, +72, -57, -233, -279, -439, -54, +128, },
- { +12590, +10282, -3669, -831, +1213, +1299, -204, -1324, -1305, +642, +1310, -929, -150, -265, +378, -166, -511, -226, -25, -77, -591, -30, -316, +195, -77, +192, -79, -444, -281, -501, -173, +158, },
- { +13820, +10820, -4370, -641, +688, +719, -208, -1170, -1120, +1054, +1422, -1268, +60, -395, +126, -158, -785, -547, -55, -15, -622, +139, -270, +187, +11, +211, -203, -518, -250, -711, -272, +251, },
- { +14973, +10840, -5035, -319, +215, +327, -180, -1056, -1001, +1357, +1436, -1376, +373, -623, +75, -133, -1012, -696, -148, +89, -603, +166, -149, +257, +111, +201, -249, -478, -375, -806, -271, +241, },
- { +15155, +10582, -5238, +16, +115, +211, -361, -1141, -1066, +1374, +1522, -1325, +512, -561, +33, -137, -860, -968, -261, +174, -757, +281, -16, +297, +93, +272, -236, -631, -384, -770, -341, +145, },
- { +14475, +9926, -4814, +144, +323, +523, -528, -1336, -1319, +1198, +1433, -1025, +675, -646, +308, -70, -834, -739, -508, +86, -551, +161, +29, +400, +61, +248, -225, -631, -389, -587, -390, -22, },
- { +11096, +9607, -2841, -481, +1236, +612, -162, -1033, -885, +1058, +1197, -645, +47, -150, +202, +5, -433, -652, -254, -16, -605, +40, +33, +357, +315, +288, -273, -769, -633, -453, +2, +259, },
- },
+/* HRIR Coefficients */
+static const ALshort defaultCoeffs[848700] =
+{
+ +6245, +8418, +3440, +2877, +1077, +321, +880, -856, -2486, -1290, +621, -142, -628, -1106, -998, -404, -239, -201, -81, -135, -380, -198, -420, -329, -410, -617, -487, -329, -204, -95, -4, -149,
+ +7068, +8719, +2927, +3268, +1110, +3, +858, -795, -2531, -1655, +570, +83, -609, -924, -969, -915, -357, -74, -200, -216, -480, -309, -445, -371, -399, -558, -515, -245, -99, -75, -3, -178,
+ +6451, +8122, +2856, +2844, +1080, +328, +858, -917, -2379, -1238, +535, -199, -565, -867, -743, -480, -324, -73, -16, -174, -409, -186, -405, -349, -462, -601, -447, -313, -181, -75, +14, -136,
+ +6005, +7530, +2626, +2615, +965, +360, +889, -851, -2222, -945, +726, -137, -431, -766, -696, -280, -210, -171, -61, -128, -339, -128, -358, -270, -370, -557, -425, -296, -176, -72, +6, -139,
+ +5901, +7415, +2589, +2576, +975, +440, +1005, -724, -2103, -837, +800, -110, -477, -864, -728, -232, -185, -178, -62, -115, -329, -108, -325, -219, -302, -510, -403, -296, -214, -119, -34, -170,
+ +6052, +7627, +2614, +2491, +844, +328, +920, -847, -2308, -1037, +806, -24, -468, -911, -783, -232, -111, -99, -9, -60, -289, -101, -337, -252, -341, -535, -398, -249, -124, -15, +33, -158,
+ +6620, +8247, +2669, +2627, +863, +314, +903, -1105, -2712, -1294, +889, -63, -693, -1144, -937, -306, -151, -152, -31, -63, -350, -121, -341, -249, -345, -548, -397, -229, -127, -38, +40, -122,
+ +6996, +8933, +2972, +2755, +894, +130, +842, -1278, -2828, -1297, +616, -240, -626, -1129, -981, -404, -242, -67, -8, -144, -410, -179, -402, -307, -421, -599, -436, -300, -150, -53, +35, -132,
+ +7457, +9131, +2871, +3122, +1130, +94, +618, -1611, -2724, -662, +479, -1040, -865, -944, -582, -183, -437, -223, +46, -164, -402, -141, -467, -352, -536, -711, -461, -372, -267, -101, +5, -189,
+ +8480, +9905, +2116, +2494, +562, +144, +1293, -1519, -3031, -395, +1312, -1023, -1397, -1386, -632, +32, -522, -499, -8, -150, -552, -140, -490, -327, -542, -851, -505, -322, -248, -108, +11, -214,
+ +8821, +10232, +2219, +2289, +171, +161, +1467, -1300, -3370, -716, +1772, -481, -1441, -2013, -979, +224, -226, -593, -172, -207, -582, -179, -591, -332, -504, -804, -505, -281, -204, -89, -26, -270,
+ +8392, +10097, +3157, +2756, +303, +55, +1014, -1170, -3704, -1588, +1387, +114, -299, -1997, -1900, -26, +150, -207, -175, -250, -495, -203, -598, -279, -499, -907, -574, -407, -193, -47, +38, -153,
+ +7873, +9673, +2984, +3038, +833, -1, +737, -1187, -2912, -1805, +1016, +72, -730, -1038, -1772, -1044, -23, -5, -26, -31, -385, -324, -652, -477, -342, -655, -608, -336, -194, -45, +24, -163,
+ +7963, +8909, +2349, +3857, +1082, -426, +884, -653, -2586, -2172, +567, +441, -639, -693, -992, -1601, -365, +130, -387, -286, -577, -433, -437, -421, -369, -478, -577, -132, +11, -80, -9, -213,
+ +7088, +8312, +2629, +3511, +1008, -142, +848, -895, -2282, -1591, +247, -50, -516, -581, -573, -992, -673, +41, +42, -238, -540, -278, -374, -348, -434, -524, -408, -255, -181, -133, +18, -134,
+ +6550, +7715, +2358, +2914, +1132, +331, +797, -938, -2203, -1255, +372, -201, -462, -570, -492, -668, -410, +120, +32, -242, -430, -171, -380, -385, -518, -561, -406, -306, -158, -57, +32, -120,
+ +6051, +7124, +2109, +2694, +1116, +337, +771, -894, -2045, -946, +437, -301, -319, -441, -466, -416, -279, -35, -27, -195, -380, -154, -348, -273, -384, -500, -439, -342, -155, -51, +22, -136,
+ +5531, +6481, +2000, +2461, +934, +439, +862, -795, -1862, -633, +727, -115, -171, -380, -412, -224, -207, -138, -47, -123, -282, -57, -290, -216, -332, -483, -371, -276, -150, -54, +13, -126,
+ +5307, +6102, +1712, +2189, +827, +501, +1059, -450, -1484, -286, +980, +20, -192, -501, -477, -159, -126, -105, -23, -94, -286, -69, -250, -141, -268, -436, -301, -194, -108, -67, -52, -215,
+ +5293, +6248, +1948, +2383, +968, +620, +1103, -537, -1628, -419, +864, -75, -290, -590, -460, -106, -157, -166, -44, -93, -262, -17, -219, -109, -191, -398, -332, -281, -238, -150, -65, -183,
+ +5385, +6315, +1850, +2226, +851, +577, +1120, -532, -1715, -495, +904, -62, -367, -699, -544, -36, +43, -3, +26, -91, -293, -88, -305, -186, -238, -342, -201, -173, -184, -163, -114, -221,
+ +5638, +6693, +1944, +2180, +690, +402, +942, -796, -2063, -816, +934, +122, -290, -702, -573, -86, +10, -5, +51, +20, -188, -13, -249, -181, -272, -443, -314, -174, -46, +64, +58, -179,
+ +6114, +7238, +2050, +2331, +704, +388, +918, -1030, -2503, -1188, +965, +90, -540, -934, -715, -105, +72, +17, +109, +96, -208, -29, -265, -175, -230, -400, -252, -104, -71, -20, +18, -113,
+ +6935, +7953, +1896, +2468, +697, +360, +906, -1378, -2915, -1291, +1201, +15, -795, -1173, -858, -212, -59, -113, +18, +18, -326, -41, -254, -172, -283, -471, -308, -128, -56, +12, +78, -96,
+ +7601, +8811, +1906, +2482, +692, +256, +913, -1724, -3211, -1304, +1182, -33, -817, -1340, -971, -271, -112, -58, -35, -43, -376, -128, -396, -272, -384, -544, -332, -147, -37, +5, +94, -106,
+ +7797, +9420, +2394, +2668, +729, -71, +816, -1753, -3133, -1262, +578, -315, -591, -1153, -964, -423, -238, +107, +47, -178, -438, -157, -375, -285, -439, -567, -383, -279, -91, -14, +73, -117,
+ +8053, +9622, +2623, +3172, +1065, -217, +400, -2074, -2995, -724, +131, -1079, -572, -789, -539, -411, -605, -29, +147, -152, -338, -109, -420, -324, -555, -661, -422, -410, -225, -55, +57, -140,
+ +8851, +9745, +2104, +3535, +1168, -221, +311, -2456, -2799, +164, +89, -2116, -916, -655, -97, -31, -753, -200, +217, -236, -417, -70, -535, -373, -689, -790, -406, -438, -338, -92, +19, -241,
+ +10001, +10749, +1039, +2721, +790, -170, +1186, -2415, -3251, +615, +908, -2368, -1553, -873, +21, +285, -836, -480, +239, -182, -571, -68, -574, -392, -737, -965, -404, -384, -392, -158, +73, -199,
+ +11192, +11235, +153, +2294, +53, +55, +1850, -2431, -3536, +860, +1922, -2309, -2146, -1523, -82, +478, -1002, -809, +168, -186, -762, -27, -586, -311, -708, -1110, -469, -309, -306, -115, +36, -298,
+ +11809, +11711, +77, +1867, -579, +250, +2258, -2153, -4082, +506, +2806, -1687, -2391, -2495, -503, +903, -715, -1039, -64, -271, -772, -23, -738, -331, -647, -1076, -428, -203, -263, -84, -12, -381,
+ +11971, +11889, +293, +1793, -789, +205, +2246, -1978, -4372, +215, +3069, -1191, -2402, -2949, -706, +1022, -377, -1109, -184, -266, -815, -107, -806, -293, -619, -1011, -483, -214, -219, -82, -57, -415,
+ +11574, +12059, +1513, +2279, -995, -31, +1837, -1879, -4919, -876, +2927, +93, -1163, -3678, -1691, +1085, +434, -760, -602, -258, -781, -202, -705, -146, -613, -1083, -621, -398, -191, -201, -8, -264,
+ +10990, +11697, +2481, +2605, -624, -80, +1239, -1554, -5168, -1689, +2431, +284, +52, -3237, -2831, +704, +562, -324, -302, -369, -604, -185, -815, -170, -622, -1253, -610, -481, -158, +9, +82, -169,
+ +10555, +11320, +2762, +3120, -513, -192, +1135, -1539, -4989, -2203, +2188, +310, +337, -2676, -3485, +231, +735, -122, -192, -330, -532, -143, -866, -434, -560, -1201, -635, -465, -125, +124, +58, -190,
+ +9802, +10869, +2210, +3301, +512, -356, +611, -1517, -3346, -2405, +1631, +297, -919, -921, -2794, -1674, +447, +196, -14, +88, -414, -495, -907, -605, -207, -716, -761, -316, -177, +15, +47, -185,
+ +9057, +9928, +2131, +3616, +888, -390, +610, -1218, -2926, -2309, +1302, +662, -1118, -817, -1588, -2019, -149, +193, -331, -96, -346, -335, -638, -572, -269, -491, -774, -283, -103, -59, +100, -203,
+ +8930, +8967, +1731, +4675, +942, -971, +994, -424, -2675, -2863, +659, +945, -763, -394, -1087, -2472, -201, +396, -675, -326, -676, -573, -386, -491, -316, -379, -679, +20, +123, -116, -16, -249,
+ +7813, +8477, +2388, +4316, +806, -849, +879, -767, -2219, -2102, +3, +324, -471, -173, -522, -1846, -865, +265, +22, -252, -680, -423, -325, -340, -330, -414, -491, -192, -73, -163, -2, -152,
+ +7113, +7766, +2257, +3666, +953, -58, +822, -884, -2033, -1759, +42, +41, -423, -269, -324, -1270, -735, +354, +71, -342, -536, -230, -318, -424, -532, -487, -348, -279, -220, -116, +70, -98,
+ +6517, +7218, +1996, +3067, +1220, +312, +694, -898, -1961, -1378, +137, -113, -327, -221, -261, -981, -469, +384, +43, -337, -435, -153, -345, -441, -577, -491, -370, -311, -131, -41, +49, -100,
+ +5969, +6595, +1755, +2846, +1294, +318, +632, -842, -1795, -1017, +178, -253, -167, -98, -251, -690, -286, +206, -39, -281, -362, -127, -350, -362, -449, -397, -387, -360, -132, -14, +50, -130,
+ +5322, +6018, +1689, +2550, +1120, +439, +723, -795, -1649, -743, +317, -191, +41, -22, -232, -425, -258, +29, -36, -217, -317, -43, -206, -223, -390, -440, -387, -319, -114, -45, +12, -94,
+ +4776, +5321, +1638, +2372, +976, +539, +781, -664, -1410, -384, +617, -40, +147, +48, -165, -240, -215, -99, -39, -118, -206, +9, -214, -171, -295, -398, -328, -264, -126, -35, +14, -103,
+ +4506, +4919, +1389, +2021, +793, +582, +984, -324, -1076, -3, +971, +190, +185, -40, -235, -201, -158, -67, +40, -54, -217, -4, -156, -100, -251, -363, -242, -159, -66, -14, -33, -216,
+ +4319, +4656, +1200, +2031, +995, +770, +1154, -83, -772, +181, +967, +64, -58, -269, -220, -23, -57, -87, -63, -101, -197, +13, -123, -8, -137, -309, -224, -169, -123, -121, -129, -238,
+ +4369, +4971, +1600, +2249, +1049, +841, +1157, -276, -1063, -67, +806, -2, -62, -287, -201, -29, -154, -156, -29, -66, -179, +72, -101, -2, -77, -280, -278, -282, -274, -184, -97, -188,
+ +4476, +5031, +1506, +2121, +989, +855, +1208, -271, -1176, -207, +772, -16, -152, -367, -219, +91, +76, -17, -38, -110, -204, -21, -213, -56, -67, -153, -135, -246, -292, -239, -153, -192,
+ +4639, +5194, +1393, +1878, +700, +662, +1133, -302, -1285, -248, +978, +165, -111, -541, -477, +44, +176, +172, +206, -4, -220, -9, -244, -189, -190, -256, -118, -13, -29, -100, -175, -310,
+ +4960, +5659, +1500, +1902, +616, +527, +927, -682, -1752, -657, +1008, +322, -103, -479, -371, +29, +129, +84, +101, +105, -74, +62, -153, -120, -201, -342, -237, -102, +33, +143, +69, -206,
+ +5462, +6227, +1580, +2043, +602, +475, +871, -959, -2219, -1054, +1044, +277, -366, -680, -461, +94, +249, +118, +165, +124, -142, +84, -166, -99, -131, -293, -196, -32, +4, +3, +73, -42,
+ +6237, +6825, +1467, +2239, +586, +515, +895, -1255, -2710, -1307, +1289, +216, -684, -959, -664, -49, +153, +25, +170, +186, -163, +81, -152, -125, -158, -267, -175, +5, -11, -14, +36, -112,
+ +7175, +7546, +1154, +2401, +569, +453, +873, -1670, -3088, -1292, +1563, +86, -945, -1180, -760, -127, +37, -84, +65, +109, -312, +47, -155, -103, -221, -387, -222, -27, +6, +54, +115, -69,
+ +8013, +8415, +928, +2447, +619, +356, +875, -2085, -3421, -1230, +1699, +19, -1056, -1366, -828, -144, -47, -120, +15, +95, -368, -56, -300, -169, -316, -457, -244, -55, +17, +71, +177, -55,
+ +8488, +9288, +1164, +2434, +520, +128, +950, -2340, -3543, -1276, +1264, -52, -823, -1455, -1025, -253, -51, +137, -33, -57, -404, -135, -405, -282, -407, -505, -265, -112, +46, +42, +137, -110,
+ +8646, +9874, +1703, +2636, +583, -290, +809, -2293, -3383, -1196, +493, -351, -525, -1188, -947, -466, -225, +327, +73, -231, -461, -130, -338, -272, -463, -518, -331, -269, -23, +19, +111, -103,
+ +8853, +10138, +2084, +3158, +891, -550, +355, -2572, -3197, -634, -129, -1152, -342, -708, -562, -559, -648, +219, +191, -172, -309, -123, -415, -292, -552, -594, -365, -441, -159, -2, +112, -115,
+ +9437, +10146, +1878, +3766, +1172, -665, -90, -2930, -2956, +99, -587, -2129, -359, -456, -1, -433, -1044, +126, +329, -280, -299, -28, -484, -339, -764, -730, -377, -526, -282, -42, +43, -217,
+ +10447, +10213, +1137, +4174, +1154, -637, -25, -3387, -2669, +1174, -634, -3329, -710, -265, +433, +25, -1187, -91, +425, -363, -416, +16, -630, -390, -871, -847, -323, -535, -413, -62, +34, -304,
+ +11721, +11077, -114, +3551, +935, -562, +733, -3473, -3031, +1828, +120, -3880, -1392, -361, +696, +390, -1336, -325, +510, -398, -600, +102, -686, -455, -954, -1001, -302, -479, -470, -133, +72, -289,
+ +13305, +11901, -1648, +2799, +283, -279, +1889, -3627, -3557, +2329, +1228, -4012, -2176, -824, +822, +671, -1648, -764, +613, -246, -851, +89, -679, -373, -945, -1209, -336, -448, -473, -99, +136, -321,
+ +14444, +12277, -2508, +2451, -488, +64, +2550, -3661, -3934, +2511, +2356, -4038, -2779, -1493, +639, +894, -1717, -1084, +469, -266, -1015, +159, -723, -273, -918, -1391, -365, -300, -385, -109, +68, -404,
+ +15198, +12811, -2860, +1938, -1206, +435, +3140, -3495, -4574, +2236, +3478, -3539, -3174, -2585, +288, +1456, -1554, -1381, +203, -331, -1021, +201, -853, -298, -892, -1370, -288, -175, -338, -112, +20, -477,
+ +15696, +13113, -2550, +1614, -1699, +535, +3215, -3080, -5247, +1775, +4272, -2708, -3412, -3575, -29, +1877, -1006, -1656, +15, -357, -1045, +99, -1060, -233, -770, -1291, -355, -120, -297, -56, -64, -573,
+ +15775, +13235, -2403, +1565, -1825, +497, +3198, -2969, -5459, +1584, +4448, -2362, -3447, -3879, -132, +1954, -758, -1725, -74, -331, -1087, +33, -1083, -197, -769, -1239, -410, -134, -255, -72, -97, -586,
+ +15315, +13686, -979, +1970, -2274, +213, +2788, -2847, -6149, +217, +4622, -522, -2288, -5206, -1197, +2253, +434, -1504, -787, -169, -1179, -99, -885, -25, -795, -1313, -583, -317, -185, -316, -11, -446,
+ +14757, +13592, +311, +2256, -2169, -3, +2289, -2464, -6707, -621, +4205, +161, -774, -5439, -2295, +2265, +731, -1041, -813, -337, -845, -159, -984, +117, -751, -1480, -635, -546, -150, -159, +48, -250,
+ +14099, +13109, +1375, +2502, -1715, -27, +1537, -2039, -6901, -1509, +3753, +294, +444, -4880, -3708, +1849, +916, -577, -437, -486, -705, -144, -1082, +14, -797, -1654, -577, -566, -95, +74, +121, -193,
+ +13262, +12537, +1897, +3368, -1508, -307, +1394, -1986, -6518, -2492, +3444, +342, +833, -3712, -5037, +981, +1349, -203, -238, -453, -598, -55, -1191, -502, -582, -1555, -634, -479, -65, +248, +62, -221,
+ +12720, +12253, +1532, +3700, -712, -943, +1265, -1640, -5596, -2927, +3082, +158, +23, -1947, -5179, -634, +1488, +154, +106, -280, -666, -176, -1256, -758, -293, -1321, -628, -228, -234, +183, +65, -253,
+ +12070, +11939, +1086, +3750, +84, -735, +519, -1847, -3796, -3103, +2526, +483, -1215, -727, -4118, -2228, +1208, +342, -53, +235, -474, -713, -1177, -708, -2, -818, -946, -254, -161, +85, +61, -214,
+ +11330, +11014, +1046, +4132, +549, -776, +394, -1702, -3271, -2812, +2165, +817, -1561, -502, -2738, -2989, +493, +445, -356, +194, -280, -572, -1071, -697, +138, -516, -1161, -276, -32, -10, +124, -208,
+ +10191, +9951, +1338, +4487, +733, -956, +675, -965, -2978, -3138, +1529, +1324, -1396, -524, -1647, -2962, +82, +460, -732, -185, -425, -427, -491, -652, -324, -391, -841, -115, -12, -87, +129, -265,
+ +9970, +8874, +1100, +5752, +626, -1629, +1233, -114, -2825, -3755, +907, +1600, -1034, +6, -1285, -3539, +207, +692, -1093, -309, -782, -731, -283, -594, -232, -265, -836, +232, +226, -187, -18, -288,
+ +8533, +8501, +2182, +5222, +413, -1611, +1037, -566, -2161, -2776, -176, +878, -500, +324, -573, -2912, -838, +591, -76, -234, -830, -570, -224, -357, -203, -311, -643, -113, +59, -206, -17, -163,
+ +7611, +7773, +2151, +4556, +689, -731, +931, -721, -1867, -2402, -259, +508, -411, +185, -245, -2146, -924, +685, +59, -460, -671, -326, -221, -451, -470, -353, -358, -210, -203, -191, +86, -99,
+ +6903, +7101, +2009, +3730, +1006, +34, +678, -798, -1751, -2004, -190, +246, -321, +112, -89, -1700, -705, +755, +18, -460, -485, -225, -270, -513, -629, -426, -353, -293, -166, -97, +75, -61,
+ +6115, +6519, +1741, +3129, +1456, +308, +507, -754, -1624, -1508, -137, +49, -127, +225, -68, -1343, -379, +709, -9, -457, -397, -105, -301, -528, -626, -362, -338, -340, -79, -1, +69, -82,
+ +5494, +5823, +1558, +2975, +1490, +252, +450, -676, -1421, -1121, -154, -119, +82, +344, -73, -997, -243, +425, -95, -357, -314, -116, -308, -402, -455, -270, -390, -397, -90, +12, +64, -120,
+ +4722, +5222, +1542, +2654, +1338, +390, +526, -627, -1240, -813, -63, -106, +331, +423, -63, -678, -264, +194, -58, -277, -283, -47, -151, -234, -379, -329, -416, -360, -70, -27, +20, -78,
+ +3982, +4466, +1633, +2397, +1172, +596, +585, -523, -1035, -466, +218, +30, +490, +473, -7, -410, -214, +24, -79, -181, -136, +68, -135, -185, -310, -316, -334, -291, -98, -38, +10, -54,
+ +3437, +3829, +1528, +2087, +998, +677, +738, -338, -682, +38, +606, +268, +533, +528, +69, -285, -241, -102, +39, -20, -138, +38, -65, -74, -226, -292, -257, -229, -77, +6, +12, -103,
+ +3220, +3446, +1223, +1748, +897, +783, +1001, +165, -307, +348, +881, +395, +496, +306, -70, -219, -102, -1, +55, -36, -136, +45, -28, -19, -181, -238, -159, -104, -25, -22, -94, -257,
+ +3000, +3192, +1065, +1840, +1182, +988, +1157, +379, -10, +504, +825, +220, +193, +66, +6, +5, -16, -56, -79, -81, -98, +69, +11, +89, -46, -192, -159, -137, -110, -151, -187, -250,
+ +3038, +3530, +1470, +2059, +1273, +1084, +1143, +146, -313, +283, +688, +147, +146, +18, +50, +25, -119, -132, -54, -57, -69, +145, +31, +106, +37, -167, -229, -267, -279, -209, -151, -192,
+ +3226, +3750, +1594, +2026, +1187, +1116, +1201, +85, -554, -85, +479, +218, +213, +8, +55, +82, -6, -61, -70, -93, -60, +81, -93, +76, +155, -10, -220, -365, -342, -252, -169, -160,
+ +3278, +3743, +1338, +1792, +1075, +1079, +1224, +86, -625, +52, +740, +112, -30, -162, -63, +236, +299, +124, +19, -77, -152, -16, -142, -28, -22, +32, +67, -142, -296, -305, -239, -221,
+ +3553, +4064, +1278, +1551, +714, +830, +1078, -48, -841, -139, +949, +446, +110, -313, -296, +102, +260, +279, +274, +69, -84, +51, -163, -131, -123, -170, -40, +66, +53, -45, -202, -352,
+ +3968, +4591, +1339, +1593, +633, +691, +854, -485, -1386, -585, +1037, +600, +77, -243, -185, +110, +255, +167, +138, +203, +50, +122, -44, -74, -122, -230, -174, -35, +114, +220, +63, -238,
+ +4551, +5215, +1377, +1741, +594, +607, +777, -821, -1911, -1023, +1108, +542, -217, -427, -238, +241, +413, +193, +206, +181, -47, +184, -58, -40, -30, -176, -147, +40, +73, +37, +118, +7,
+ +5337, +5787, +1252, +1970, +570, +657, +806, -1134, -2447, -1303, +1381, +462, -595, -725, -442, +121, +396, +163, +270, +355, -58, +111, -69, -54, -26, -139, -52, +110, +9, +15, +19, -56,
+ +6460, +6461, +861, +2241, +491, +667, +802, -1581, -2946, -1392, +1753, +281, -945, -976, -601, -16, +244, -3, +203, +282, -186, +171, -29, -58, -91, -187, -111, +112, +41, +27, +68, -97,
+ +7612, +7281, +348, +2465, +484, +542, +791, -2115, -3323, -1278, +2055, +119, -1204, -1229, -661, -47, +86, -72, +93, +173, -323, +135, -70, -86, -185, -298, -167, +53, +66, +97, +195, +7,
+ +8585, +8204, -17, +2527, +538, +433, +810, -2598, -3655, -1152, +2180, +15, -1306, -1412, -717, -70, +19, -111, +45, +202, -391, -5, -243, -121, -289, -383, -162, +39, +79, +116, +239, -28,
+ +9245, +9221, +70, +2455, +399, +222, +924, -2995, -3809, -1191, +1730, +21, -1060, -1629, -927, -185, +44, +226, -94, +19, -407, -88, -401, -274, -397, -439, -170, +14, +140, +43, +175, -97,
+ +9459, +10001, +577, +2560, +404, -265, +955, -2965, -3686, -1180, +866, -170, -624, -1413, -1052, -345, -65, +454, -4, -166, -455, -141, -341, -270, -451, -442, -241, -197, +103, +81, +181, -111,
+ +9637, +10487, +1186, +2953, +581, -764, +568, -3005, -3447, -787, -95, -818, -215, -924, -767, -633, -442, +566, +102, -248, -351, -153, -370, -239, -523, -488, -298, -402, -9, +51, +145, -117,
+ +9945, +10685, +1454, +3554, +914, -1031, +64, -3342, -3145, -126, -872, -1593, +14, -451, -298, -774, -939, +490, +312, -245, -240, -78, -399, -323, -671, -568, -330, -549, -154, +26, +160, -94,
+ +10738, +10561, +1112, +4355, +1137, -1207, -463, -3703, -2801, +768, -1514, -2815, +132, -169, +370, -654, -1436, +442, +473, -420, -220, +24, -527, -345, -936, -714, -317, -648, -288, -4, +58, -250,
+ +11908, +10455, +284, +5029, +1070, -1195, -413, -4249, -2385, +2015, -1773, -4274, -73, +149, +905, -197, -1711, +242, +620, -540, -297, +93, -746, -382, -1026, -814, -253, -686, -426, -10, +36, -332,
+ +13394, +10999, -1157, +4830, +936, -1088, +142, -4604, -2449, +3044, -1309, -5315, -695, +205, +1274, +290, -1897, -40, +764, -647, -551, +229, -821, -465, -1183, -995, -168, -631, -552, -60, +74, -401,
+ +15025, +12199, -3090, +3840, +583, -868, +1628, -4807, -3315, +3710, -123, -5726, -1535, +33, +1405, +649, -2117, -453, +874, -489, -776, +224, -862, -430, -1205, -1255, -112, -551, -641, -139, +206, -320,
+ +17055, +12582, -4938, +3472, -257, -334, +2678, -5201, -3644, +4395, +1143, -6071, -2502, -552, +1736, +924, -2665, -895, +1100, -416, -1145, +334, -845, -333, -1199, -1460, -190, -526, -564, -33, +196, -464,
+ +18307, +12877, -5894, +3168, -1145, +191, +3392, -5286, -4140, +4593, +2494, -6227, -3173, -1302, +1519, +1232, -2691, -1262, +903, -430, -1302, +437, -926, -201, -1180, -1687, -178, -313, -483, -85, +106, -538,
+ +19326, +13348, -6450, +2622, -2000, +801, +4083, -5212, -4919, +4417, +3881, -5819, -3702, -2590, +1264, +1949, -2593, -1642, +625, -479, -1305, +497, -1076, -193, -1173, -1678, -70, -162, -447, -100, +47, -615,
+ +19996, +13748, -6316, +2066, -2593, +1109, +4312, -4745, -5822, +3979, +5117, -5078, -4210, -3794, +997, +2635, -2164, -2070, +440, -522, -1284, +441, -1362, -143, -992, -1629, -99, -50, -435, -14, -49, -738,
+ +20313, +14104, -5872, +1810, -3025, +1078, +4277, -4344, -6598, +3421, +5846, -4007, -4476, -4843, +762, +2984, -1388, -2414, +176, -418, -1417, +253, -1441, -19, -969, -1483, -286, -53, -315, -64, -146, -782,
+ +20087, +14584, -5094, +1850, -3425, +923, +4069, -4173, -7151, +2483, +6290, -2662, -4160, -5971, +239, +3309, -466, -2543, -337, -177, -1647, +163, -1315, +68, -956, -1506, -453, -96, -261, -285, -54, -764,
+ +19625, +14847, -3837, +2169, -3754, +739, +3719, -4099, -7635, +1528, +6330, -1330, -3062, -6995, -580, +3609, +310, -2283, -916, -55, -1573, +78, -1125, +203, -1041, -1591, -521, -300, -178, -434, +25, -586,
+ +18985, +14801, -2243, +2365, -3737, +469, +3173, -3595, -8370, +601, +5958, -383, -1350, -7570, -1814, +3803, +690, -1778, -1067, -237, -1135, -57, -1216, +397, -1008, -1786, -581, -567, -110, -273, +78, -350,
+ +18171, +14716, -1000, +2234, -3067, +314, +2309, -2987, -8895, -261, +5510, -80, +243, -7375, -3421, +3691, +902, -1254, -776, -512, -917, -48, -1328, +367, -1053, -1971, -500, -763, +18, -24, +84, -174,
+ +17316, +13795, +411, +2991, -2980, +164, +1650, -2493, -8802, -1619, +5171, +163, +1382, -6484, -5400, +3135, +1389, -749, -422, -614, -704, -70, -1490, +83, -958, -2129, -459, -627, +18, +279, +142, -258,
+ +16323, +13465, +644, +3858, -2589, -349, +1754, -2534, -8192, -2660, +5060, +82, +1315, -4713, -6920, +2011, +2041, -367, -215, -622, -650, +105, -1628, -622, -498, -1970, -565, -423, -29, +371, +48, -251,
+ +15702, +13151, +214, +4323, -1699, -1288, +1632, -2000, -7023, -3323, +4572, -30, +303, -2486, -7187, -23, +2416, +24, +138, -379, -775, -131, -1671, -839, -148, -1697, -586, -156, -270, +329, +49, -308,
+ +14967, +12994, -376, +4381, -720, -1135, +560, -2027, -4680, -4041, +4055, +347, -1385, -614, -6246, -2152, +2394, +290, -4, +327, -694, -900, -1436, -844, +206, -1110, -1032, -118, -211, +205, +45, -268,
+ +14008, +12119, -417, +4798, +5, -1133, +277, -2330, -3409, -3628, +3165, +1052, -2172, +4, -4535, -3749, +1841, +536, -479, +574, -315, -1040, -1435, -685, +460, -675, -1459, -163, -10, +62, +118, -218,
+ +12965, +10967, -107, +5258, +240, -1393, +449, -1511, -3398, -3837, +2948, +1577, -2342, -12, -2966, -4213, +1064, +693, -899, +206, -294, -647, -958, -841, +203, -410, -1384, -55, +24, -53, +229, -313,
+ +11494, +9851, +526, +5640, +353, -1616, +847, -667, -3116, -4125, +1949, +2028, -1775, -121, -1950, -4061, +610, +742, -1220, -162, -508, -568, -346, -774, -310, -277, -976, +86, +84, -137, +142, -321,
+ +11087, +8602, +495, +7108, +58, -2371, +1639, +266, -3071, -4860, +1381, +2391, -1511, +558, -1623, -4806, +939, +962, -1664, -195, -913, -908, -114, -747, -101, -143, -1057, +522, +304, -294, -8, -330,
+ +9333, +8473, +2058, +6323, -244, -2521, +1385, -290, -2159, -3681, -244, +1661, -675, +955, -787, -4263, -532, +965, -283, -153, -1031, -743, -56, -400, -22, -215, -884, +31, +224, -288, -38, -167,
+ +8201, +7850, +2127, +5711, +161, -1682, +1271, -488, -1744, -3323, -500, +1254, -541, +772, -297, -3344, -963, +1116, -25, -591, -845, -455, -63, -491, -349, -197, -438, -85, -170, -321, +106, -106,
+ +7291, +7028, +2167, +4731, +565, -540, +845, -581, -1482, -2901, -473, +852, -365, +616, -56, -2667, -804, +1195, -68, -613, -593, -252, -129, -623, -576, -254, -298, -288, -278, -139, +171, -53,
+ +6561, +6470, +2013, +3852, +1082, +54, +479, -595, -1430, -2454, -449, +615, -254, +563, +94, -2320, -595, +1227, -130, -587, -411, -244, -196, -635, -713, -320, -371, -307, -114, -94, +84, -13,
+ +5623, +5919, +1762, +3266, +1692, +205, +288, -499, -1267, -1883, -465, +390, +31, +706, +63, -1900, -244, +1100, -142, -585, -335, -87, -243, -649, -668, -209, -339, -372, -25, +18, +83, -55,
+ +4953, +5180, +1625, +3144, +1770, +106, +214, -395, -1052, -1454, -538, +193, +277, +808, +43, -1500, -92, +747, -238, -450, -232, -115, -286, -525, -480, -91, -398, -447, -40, +46, +83, -112,
+ +4115, +4608, +1619, +2888, +1683, +161, +244, -330, -812, -1140, -599, +67, +592, +924, +29, -1137, -210, +448, -129, -364, -251, -133, -121, -278, -339, -178, -529, -429, -2, -6, +38, -83,
+ +3177, +4025, +1785, +2341, +1485, +535, +375, -316, -680, -796, -328, +285, +819, +879, +56, -781, -189, +258, -113, -285, -153, +95, +56, -236, -404, -236, -370, -334, -20, -46, -3, +11,
+ +2413, +3136, +2012, +2211, +1366, +700, +342, -131, -396, -413, -56, +329, +935, +974, +137, -527, -171, +55, -126, -152, +41, +118, -73, -172, -228, -183, -327, -289, -78, -27, +10, -10,
+ +1837, +2561, +1897, +1806, +1200, +797, +563, +60, +7, +156, +349, +603, +924, +1021, +216, -432, -238, -65, +75, +24, -47, +67, +76, -40, -176, -178, -230, -225, -40, +26, +1, -74,
+ +1621, +2181, +1603, +1393, +1074, +915, +849, +621, +321, +470, +695, +763, +907, +765, +42, -376, -77, +71, +101, -2, -40, +87, +110, -1, -147, -122, -112, -69, +18, +9, -117, -268,
+ +1298, +1691, +1268, +1399, +1306, +1124, +1131, +1104, +892, +667, +566, +575, +629, +506, +105, -107, +52, +23, -45, -25, -34, +54, +160, +131, -29, -57, -79, -54, -15, -157, -247, -286,
+ +1179, +1847, +1466, +1730, +1761, +1292, +1046, +857, +730, +698, +565, +381, +236, +319, +320, +91, +9, -97, -187, -79, +91, +171, +187, +224, +142, -75, -156, -189, -211, -232, -263, -202,
+ +1352, +2405, +2052, +1821, +1528, +1334, +1063, +585, +298, +291, +336, +420, +473, +384, +246, -40, -172, -129, -4, +7, +44, +226, +187, +178, +172, -32, -241, -326, -370, -251, -163, -160,
+ +1579, +2518, +2004, +1719, +1482, +1383, +1140, +573, +87, -86, +163, +549, +481, +335, +281, +87, +50, -31, -101, -73, +80, +110, +11, +171, +343, +171, -228, -430, -394, -298, -216, -121,
+ +1583, +2449, +1680, +1499, +1448, +1389, +1183, +570, +27, +165, +463, +283, +129, +199, +219, +326, +423, +122, -72, -74, -44, -21, -19, +73, +115, +276, +185, -228, -439, -409, -284, -161,
+ +1893, +2687, +1507, +1157, +987, +1136, +1120, +582, -124, +57, +765, +642, +287, -137, -232, +275, +511, +406, +350, +8, -95, +73, -79, -165, +36, +100, +97, +173, -6, -227, -385, -374,
+ +2210, +3190, +1518, +1044, +774, +939, +848, +161, -496, -289, +949, +973, +315, -36, -74, +18, +255, +387, +315, +239, +180, +91, -63, -33, -109, -193, -12, +129, +232, +155, -164, -407,
+ +2814, +3764, +1508, +1223, +776, +836, +646, -347, -1218, -801, +1084, +986, +184, +34, +8, +229, +466, +169, +88, +354, +189, +192, +161, -56, +5, -65, -184, -15, +178, +365, +142, -203,
+ +3495, +4412, +1460, +1384, +688, +753, +615, -666, -1709, -1197, +1221, +876, -213, -224, -73, +364, +610, +259, +273, +267, +38, +270, +44, +9, +100, -45, -90, +150, +122, +14, +148, +90,
+ +4347, +4934, +1271, +1661, +644, +827, +646, -1008, -2278, -1448, +1567, +759, -634, -516, -277, +237, +622, +239, +354, +523, +20, +141, +46, -6, +111, -2, +45, +214, +20, +34, +1, +5,
+ +5622, +5544, +799, +2031, +503, +891, +654, -1493, -2859, -1584, +2033, +531, -1031, -782, -469, +89, +432, +59, +341, +429, -60, +280, +82, -74, +47, +39, -52, +241, +57, -19, +58, -78,
+ +6893, +6162, +149, +2383, +396, +828, +623, -2048, -3199, -1408, +2392, +212, -1345, -961, -526, -17, +350, -90, +203, +396, -312, +252, +115, +45, -53, -188, -37, +217, +86, +121, +108, -65,
+ +8235, +7079, -573, +2694, +416, +618, +659, -2698, -3570, -1229, +2683, +78, -1575, -1280, -540, +24, +87, -57, +104, +215, -351, +233, +5, -119, -157, -195, -147, +124, +129, +136, +322, +117,
+ +9244, +7992, -1030, +2743, +479, +518, +696, -3209, -3858, -1043, +2739, -57, -1623, -1427, -588, -20, +90, -120, +74, +343, -450, +32, -201, -77, -274, -310, -77, +135, +135, +157, +303, -20,
+ +10028, +9089, -1078, +2630, +294, +324, +854, -3730, -3984, -1086, +2220, +49, -1345, -1774, -793, -139, +148, +326, -184, +120, -427, -45, -395, -273, -383, -359, -78, +135, +222, +29, +222, -85,
+ +10293, +10035, -677, +2629, +251, -197, +1099, -3767, -3908, -1145, +1326, -1, -805, -1656, -1141, -170, +106, +562, -120, -58, -462, -168, -332, -269, -431, -351, -155, -128, +240, +130, +253, -134,
+ +10483, +10681, -44, +2812, +331, -823, +878, -3595, -3636, -1021, +145, -213, -350, -1319, -900, -635, -134, +920, -37, -376, -472, -69, -227, -286, -526, -355, -246, -282, +155, +54, +191, -76,
+ +10698, +11090, +572, +3361, +554, -1371, +356, -3757, -3360, -323, -955, -1204, +284, -663, -624, -896, -669, +915, +86, -271, -203, -225, -393, -193, -602, -435, -270, -578, +42, +88, +177, -137,
+ +11106, +11175, +705, +4050, +883, -1629, -181, -4141, -2926, +389, -1871, -1877, +527, -232, -68, -1099, -1212, +889, +384, -352, -140, -55, -382, -365, -794, -501, -300, -681, -118, +60, +213, -78,
+ +12036, +10895, +311, +5032, +1034, -1871, -823, -4446, -2502, +1348, -2741, -3215, +856, +30, +682, -1055, -1807, +920, +556, -599, -92, +53, -545, -351, -1136, -650, -258, -803, -256, +44, +72, -285,
+ +13249, +10534, -420, +6055, +877, -1901, -821, -5027, -1957, +2680, -3300, -4856, +928, +485, +1323, -695, -2250, +831, +739, -767, -47, +126, -880, -349, -1161, -699, -221, -890, -359, +46, +17, -320,
+ +14864, +10459, -1802, +6566, +665, -1731, -636, -5767, -1404, +4092, -3512, -6402, +621, +675, +1689, -26, -2440, +393, +956, -898, -408, +254, -946, -392, -1446, -931, -11, -856, -629, +80, +66, -543,
+ +16627, +11397, -3841, +5963, +612, -1625, +441, -5965, -2043, +5011, -2485, -7306, -214, +766, +2141, +296, -2809, +261, +1139, -1052, -587, +504, -1092, -517, -1488, -1064, +12, -789, -650, -40, +118, -479,
+ +18518, +12634, -6335, +4990, +230, -1245, +2367, -6507, -3133, +5859, -1129, -7799, -1128, +599, +2174, +719, -3075, -318, +1316, -740, -910, +426, -1093, -394, -1508, -1432, +146, -700, -803, -95, +327, -401,
+ +20973, +12619, -8501, +4952, -770, -461, +3392, -7135, -3315, +6719, +196, -8369, -2213, +2, +2744, +962, -3843, -722, +1691, -731, -1369, +644, -1082, -292, -1520, -1633, +51, -690, -686, +59, +271, -607,
+ +22297, +12837, -9690, +4807, -1656, +105, +4092, -7312, -3771, +7038, +1693, -8910, -3011, -482, +2558, +1188, -3920, -1129, +1549, -692, -1611, +793, -1184, -115, -1466, -1976, +35, -437, -598, -23, +170, -683,
+ +23979, +12856, -10608, +4408, -2867, +1228, +4914, -7539, -4561, +7253, +3209, -8778, -3558, -1999, +2512, +1964, -3979, -1552, +1290, -764, -1611, +895, -1299, +0, -1604, -2009, +249, -236, -602, -61, +99, -744,
+ +24530, +13686, -11035, +3704, -3405, +1666, +5462, -7290, -5568, +6806, +4891, -8340, -4324, -3233, +2311, +2879, -3884, -2013, +1022, -727, -1605, +925, -1552, -68, -1433, -1948, +261, -131, -552, -62, +43, -847,
+ +25398, +13807, -10660, +3086, -4031, +2086, +5507, -6662, -6694, +6473, +6231, -7550, -4945, -4555, +2202, +3628, -3339, -2592, +933, -785, -1566, +810, -1901, +111, -1220, -1934, +196, +16, -581, +86, -112, -983,
+ +25699, +14205, -10203, +2770, -4453, +2045, +5466, -6220, -7611, +5939, +7067, -6399, -5381, -5665, +2085, +3997, -2469, -3079, +674, -607, -1758, +593, -1929, +265, -1251, -1734, -62, +13, -408, -16, -219, -1005,
+ +25576, +14678, -9512, +2627, -4889, +1979, +5230, -5940, -8312, +5035, +7731, -5019, -5436, -6902, +1757, +4370, -1481, -3464, +202, -277, -2109, +514, -1803, +302, -1202, -1716, -328, +67, -366, -277, -95, -1022,
+ +24917, +15554, -8325, +2832, -5406, +1692, +5071, -5895, -8820, +3797, +8251, -3316, -4559, -8453, +986, +4981, -444, -3381, -625, +99, -2240, +475, -1566, +517, -1341, -1880, -276, -194, -234, -524, +73, -946,
+ +24561, +15279, -6687, +3008, -5680, +1684, +4432, -5658, -9447, +3055, +7996, -2071, -3263, -9450, +188, +5223, +138, -3058, -1138, +122, -1935, +284, -1347, +532, -1421, -1864, -486, -371, -126, -625, +111, -613,
+ +23629, +15486, -4782, +2917, -5523, +1209, +3879, -4787, -10506, +1990, +7668, -1020, -1164, -10263, -1409, +5687, +432, -2423, -1224, -173, -1295, +57, -1598, +885, -1359, -2223, -434, -735, -7, -301, +149, -391,
+ +22705, +15511, -3490, +2520, -4580, +975, +2844, -3997, -11139, +1149, +7254, -750, +545, -10124, -3274, +5721, +657, -1874, -901, -538, -1079, +82, -1697, +797, -1433, -2391, -307, -961, +186, -54, +103, -179,
+ +21834, +14435, -1480, +2989, -4502, +876, +1866, -3115, -11297, -386, +7024, -399, +2039, -9446, -5658, +5465, +1168, -1290, -471, -783, -782, -19, -1878, +658, -1411, -2695, -157, -782, +129, +319, +216, -316,
+ +20536, +13992, -709, +4280, -4744, +441, +1971, -3236, -10625, -1984, +6922, -198, +2505, -7991, -7935, +4778, +2128, -1049, -448, -664, -658, +85, -2052, -179, -858, -2528, -356, -736, +238, +571, -51, -298,
+ +19638, +14025, -1030, +4777, -3658, -452, +2275, -3224, -9891, -2809, +7103, -661, +1733, -5222, -9488, +3226, +2913, -583, -45, -907, -673, +389, -2239, -882, -152, -2484, -417, -220, -102, +497, +26, -273,
+ +19049, +13571, -1555, +5415, -2800, -1809, +2085, -2244, -8328, -3763, +6265, -489, +379, -2622, -9535, +546, +3560, -255, +273, -392, -941, -193, -2156, -846, +104, -2093, -473, -40, -391, +519, -10, -393,
+ +18168, +13590, -2249, +5443, -1644, -1456, +603, -2301, -5416, -4970, +5891, +61, -1742, -291, -8568, -1959, +3758, +29, -29, +506, -898, -1149, -1711, -913, +543, -1423, -1174, +55, -260, +334, +10, -312,
+ +17034, +12828, -2282, +5894, -727, -1488, +185, -2933, -3444, -4639, +4541, +1191, -2978, +751, -6689, -4331, +3534, +367, -665, +1029, -430, -1559, -1739, -617, +855, -907, -1807, +43, +3, +134, +105, -230,
+ +16108, +11604, -1858, +6453, -516, -1811, +245, -2044, -3754, -4481, +4546, +1368, -3096, +726, -4933, -5159, +2492, +733, -1012, +721, -307, -1028, -1536, -867, +956, -651, -2015, +138, +117, -22, +248, -320,
+ +14556, +10523, -1243, +6804, -315, -2136, +723, -1119, -3547, -5279, +4013, +2629, -3573, +780, -3116, -5768, +2017, +890, -1738, +290, -312, -714, -642, -1091, +162, -204, -1599, +276, +13, -124, +387, -489,
+ +12811, +9468, -223, +7139, -314, -2364, +1208, -231, -3341, -5354, +2556, +2879, -2315, +420, -2361, -5323, +1455, +982, -1883, -46, -627, -728, -94, -958, -294, -130, -1142, +362, +164, -228, +154, -375,
+ +13067, +8368, -144, +8731, -2405, -3459, +1449, -1503, -5332, -4279, +6474, +1713, -1900, +3709, -1903, -4706, +1918, +119, -2550, -1092, -1849, -621, -724, -1599, -147, -744, -876, +539, -152, -508, +318, -28,
+ +10904, +8242, +864, +7747, -891, -4072, +129, -1350, -3922, -2892, +4428, +2115, -886, +2372, -1297, -4344, +153, +77, -1658, -317, -1588, -606, +53, -1826, -84, -336, -1527, -11, -42, -272, +58, -75,
+ +9280, +7451, +1519, +7064, -406, -3080, +177, -1385, -2926, -2333, +3123, +1899, -775, +1781, -925, -3718, -102, -119, -1234, -81, -1199, -290, +2, -1550, -49, -379, -1429, -263, -245, -271, +10, -161,
+ +7668, +6712, +2160, +6267, +55, -2125, +134, -1111, -2049, -2036, +2189, +1460, -699, +1339, -689, -3010, -497, -120, -970, -142, -497, +186, +36, -1292, -183, -526, -1266, -502, -546, -437, +10, -9,
+ +6368, +6134, +2493, +5438, +623, -1514, +73, -449, -1506, -1847, +1544, +1043, -644, +954, -347, -2562, -737, -6, -786, +148, +175, +380, -63, -1068, -366, -637, -1120, -713, -616, -442, -44, +0,
+ +5309, +5690, +2464, +4700, +1133, -1190, +300, +59, -1193, -1566, +900, +654, -559, +720, -198, -2167, -766, +93, -248, +495, +263, +194, -54, -903, -530, -692, -1037, -585, -576, -463, -126, -99,
+ +4672, +5240, +2272, +4089, +1225, -820, +599, +183, -902, -1333, +289, +349, -411, +639, -189, -1832, -504, +306, +144, +562, +48, +10, -141, -891, -579, -467, -751, -658, -628, -412, -121, -72,
+ +4304, +4613, +2145, +3629, +1143, -236, +799, +248, -609, -1181, -105, +233, -151, +634, +31, -1399, -325, +523, +389, +368, -139, -41, -257, -648, -199, -313, -763, -658, -481, -282, -35, +38,
+ +3884, +4122, +1999, +3084, +1217, +244, +813, +307, -391, -1122, -309, +165, +292, +912, +46, -1197, -223, +714, +439, +55, -299, +55, +13, -400, -192, -282, -674, -589, -277, -72, +113, +76,
+ +3262, +3879, +1811, +2399, +1483, +675, +762, +273, -287, -1048, -181, +700, +490, +674, +70, -952, -158, +743, +295, -119, -44, +157, +90, -269, -320, -271, -420, -327, -57, +99, -64, -313,
+ +2385, +3308, +1933, +2190, +1682, +725, +639, +372, +136, -285, -143, +637, +683, +410, +103, -565, -256, +619, +422, -39, +27, +180, +54, -232, -135, -53, -203, -73, -29, -218, -320, -330,
+ +1874, +3072, +1941, +1419, +1419, +1279, +890, +485, +398, +297, +231, +464, +469, +136, +85, -228, -106, +538, +410, +40, -28, +98, +145, +77, +19, +55, +21, -272, -370, -309, -247, -206,
+ +1591, +2376, +1629, +1368, +1570, +1437, +1230, +1007, +583, +432, +297, +204, +298, +145, -139, +13, +312, +339, +220, +17, +14, +285, +382, +202, +100, -100, -334, -332, -302, -286, -184, -194,
+ +1469, +1788, +1502, +1986, +1912, +1545, +1044, +878, +865, +432, +198, +85, +13, +100, +93, +100, +251, +177, +190, +346, +299, +250, +251, +132, -108, -286, -401, -335, -238, -260, -239, -257,
+ +1914, +2454, +1663, +1957, +1845, +1522, +942, +380, +248, +262, +332, +129, +21, +126, +219, +6, -12, +304, +516, +586, +402, +87, -170, -256, -296, -306, -261, -267, -279, -273, -326, -326,
+ +1650, +2454, +1992, +2081, +1838, +1444, +722, +274, +245, +202, +344, +371, +259, +83, -82, -61, +209, +337, +514, +666, +465, +145, -229, -454, -372, -308, -238, -216, -281, -231, -312, -372,
+ +1973, +2726, +1615, +1874, +1445, +1065, +881, +238, +51, +429, +512, +299, +333, -156, -231, +93, +178, +234, +473, +660, +391, +136, -261, -513, -399, -381, -423, -222, -224, -323, -267, -374,
+ +1944, +2570, +1404, +1599, +1310, +1156, +867, +373, +249, +452, +528, +453, +471, +0, +55, +192, +128, +154, +283, +435, +598, +713, +68, -320, -396, -509, -294, -216, -242, -219, -187, -272,
+ +2213, +2848, +1259, +1255, +996, +980, +849, +259, -31, +445, +817, +479, +246, +265, +193, +76, +464, +202, +102, +348, +222, +450, +618, +396, -308, -564, -443, -327, -185, -168, -163, -249,
+ +2698, +3455, +1227, +1212, +572, +517, +849, +102, -387, +192, +924, +490, +415, +250, -27, +333, +487, +237, +455, +307, -44, +360, +408, +349, +368, -97, -484, -382, -224, -207, -147, -177,
+ +3119, +3716, +1221, +1448, +755, +623, +603, -563, -1136, +136, +1257, +247, +286, +170, -38, +383, +231, +374, +710, +325, +100, +204, -8, +284, +322, +68, +177, -36, -414, -444, -150, -173,
+ +3790, +4330, +1097, +1568, +785, +588, +464, -1060, -1653, +106, +1502, +73, -127, -238, -106, +460, +436, +368, +402, +389, +91, +308, +250, +37, -31, -22, +198, +247, +67, -211, -380, -375,
+ +4621, +5180, +929, +1542, +621, +504, +583, -1497, -2232, +214, +1743, -187, -311, -506, -412, +361, +389, +344, +576, +293, -268, +437, +269, +95, +161, -323, -90, +279, +152, -2, +128, -96,
+ +5682, +5925, +575, +1588, +608, +491, +478, -2071, -2626, +570, +1878, -446, -438, -854, -522, +332, +169, +295, +523, +68, -219, +381, -38, +251, +114, -336, +25, -102, -23, +247, +376, +74,
+ +6767, +6665, +204, +1705, +662, +498, +302, -2825, -2958, +1151, +2041, -709, -533, -1231, -642, +378, +123, +236, +348, -96, -351, +388, -30, +4, -59, -378, -119, +126, +76, -40, +329, +247,
+ +7914, +7509, -124, +1761, +489, +419, +174, -3558, -3105, +1640, +2029, -834, -566, -1606, -767, +362, +95, +310, +212, -352, -461, +375, -112, -23, -352, -633, -127, +127, +9, -4, +456, +80,
+ +8830, +8494, -246, +1751, +304, +130, +112, -4142, -3165, +1945, +1824, -857, -548, -1777, -958, +191, +133, +386, +88, -480, -608, +386, -264, -246, -302, -723, -280, -83, -51, +74, +351, +96,
+ +9314, +9665, +71, +1634, +345, -371, -34, -4329, -3176, +2029, +1537, -817, -548, -1732, -1017, -133, +66, +592, +24, -505, -733, +117, -40, -327, -495, -730, -460, +24, -137, -165, +372, -4,
+ +9167, +10764, +1096, +1384, +467, -796, -470, -4273, -3170, +1770, +1273, -725, -692, -1625, -1028, -452, -36, +630, +83, -652, -833, +127, -43, -349, -696, -736, -514, -168, -181, -313, +337, +139,
+ +8845, +11350, +2560, +1552, +433, -952, -869, -4243, -3192, +1361, +998, -475, -838, -1625, -887, -800, -125, +636, -124, -228, -816, -255, -7, -394, -552, -761, -754, -414, -246, -132, +444, +75,
+ +8964, +11306, +3527, +2437, +253, -981, -962, -4229, -3083, +756, +442, -71, -869, -1741, -700, -1038, -454, +793, +26, -389, -605, -243, +7, -463, -738, -764, -952, -329, -59, -171, +252, +95,
+ +9402, +11033, +3733, +3695, +307, -1270, -992, -4163, -2722, +92, -735, +218, -696, -1699, -423, -1673, -402, +985, -230, -199, -530, -372, +29, -463, -956, -681, -906, -518, -290, -161, +495, +103,
+ +10183, +10713, +3389, +4821, +578, -1450, -980, -3974, -2095, -265, -2456, +170, -229, -2033, +140, -1657, -868, +1176, -218, -154, -435, -585, +36, -393, -1039, -506, -950, -752, -269, -163, +335, -62,
+ +11469, +10305, +2547, +5880, +499, -1454, -859, -3842, -1100, -510, -4401, -50, +59, -2342, +781, -1732, -924, +1406, -568, -258, -144, -529, -49, -396, -1237, -446, -756, -781, -537, -315, +337, -106,
+ +12812, +9997, +1333, +7068, +256, -1648, -309, -3675, +7, -197, -6478, -1001, +993, -2771, +1003, -1205, -1229, +1461, -712, -345, +195, -392, -236, -388, -1245, -430, -776, -965, -608, -183, +370, -471,
+ +14298, +10025, -465, +8212, +115, -2512, +382, -3673, +1377, +663, -8685, -2459, +1860, -2563, +871, -988, -1367, +1466, -685, -581, +254, -110, -242, -346, -1398, -758, -715, -816, -729, -361, +153, -578,
+ +15790, +10811, -2666, +8435, +623, -3270, +1069, -3748, +2503, +2079, -10027, -4330, +2301, -1900, +666, -579, -1479, +1296, -627, -770, +124, +401, -52, -652, -1473, -822, -552, -788, -1234, -414, +539, -654,
+ +17964, +11856, -5205, +7310, +1000, -3364, +1911, -4138, +2659, +3649, -10394, -6002, +1938, -1051, +778, -288, -1663, +895, -566, -1000, +86, +652, -41, -918, -1418, -920, -815, -755, -1255, -324, +672, -812,
+ +20009, +12520, -7252, +6282, +961, -3398, +2584, -4836, +2730, +5770, -10939, -7408, +1509, -473, +1185, -387, -1734, +333, -519, -1043, -71, +553, -28, -952, -1661, -1165, -990, -424, -1170, -377, +656, -839,
+ +22176, +13865, -9457, +4361, +274, -2050, +3805, -6177, +2512, +7329, -10722, -7725, +990, -610, +1551, -139, -1889, -64, -465, -1164, -297, +596, -38, -1172, -1903, -1306, -955, -76, -1070, -458, +771, -741,
+ +24346, +14807, -11064, +2916, -761, -281, +4364, -7368, +2909, +8264, -9605, -7788, +243, -1094, +2044, +575, -2131, -537, -396, -1094, -499, +632, -243, -1137, -1963, -1495, -849, +190, -940, -374, +1054, -831,
+ +26147, +15550, -12302, +1684, -1809, +966, +4288, -7960, +2974, +9042, -8219, -8190, -317, -1893, +2641, +1162, -2716, -788, -273, -1141, -848, +531, -445, -868, -2136, -1851, -736, +365, -774, -243, +1065, -1025,
+ +27659, +16152, -13062, +756, -2711, +1615, +4053, -7901, +2526, +9678, -6491, -8602, -661, -2830, +3049, +1720, -3199, -833, -90, -1451, -1162, +618, -586, -618, -2345, -2143, -611, +510, -567, -204, +872, -1008,
+ +28304, +17219, -13451, +40, -3447, +1563, +3862, -7612, +1463, +10219, -4267, -9080, -1078, -3763, +2992, +2434, -3478, -882, -14, -1844, -1412, +822, -876, -470, -2327, -2410, -559, +602, -472, -315, +732, -992,
+ +29182, +17405, -13115, -304, -4240, +1457, +3452, -7491, +538, +10766, -2404, -8990, -1703, -4595, +2982, +2816, -3292, -1057, +74, -2171, -1478, +872, -1166, -287, -2196, -2468, -549, +634, -663, -287, +578, -1042,
+ +29321, +17828, -12348, -557, -5122, +1070, +3364, -7878, -466, +11248, -888, -8471, -2373, -5292, +2598, +3059, -2744, -1532, +107, -2141, -1752, +698, -1290, -110, -1997, -2388, -740, +468, -816, -385, +487, -984,
+ +28806, +18574, -11075, -519, -6255, +620, +3883, -8757, -1416, +11447, +404, -7311, -2750, -5966, +1821, +3239, -1903, -1967, -52, -1837, -2085, +568, -1247, +63, -1562, -2578, -1050, +400, -1056, -281, +613, -1052,
+ +27711, +19424, -9278, -279, -7397, +88, +4632, -9741, -2488, +11491, +1417, -5692, -2453, -7072, +957, +3435, -1270, -1977, -464, -1645, -2124, +549, -1019, +267, -1537, -2600, -1364, +16, -688, -160, +641, -1022,
+ +26524, +19728, -7060, +30, -8340, -267, +5003, -10176, -3987, +11428, +2435, -4361, -1321, -8478, +66, +3719, -1132, -1735, -895, -1807, -1690, +885, -1190, +400, -1479, -2883, -1377, -122, -393, -59, +689, -901,
+ +24731, +20270, -4630, +239, -8725, -1229, +4844, -9185, -6220, +10730, +4243, -3815, +673, -9540, -1505, +4099, -1429, -1336, -946, -2166, -1163, +1047, -1494, +767, -1758, -3042, -836, -473, -155, +165, +571, -940,
+ +23477, +19815, -2244, +479, -9026, -1899, +3619, -7399, -7877, +9200, +6108, -3552, +2583, -9590, -3747, +4198, -1760, -1193, -322, -2539, -1400, +1397, -1635, +542, -1400, -3228, -438, -316, -265, +162, +499, -846,
+ +22603, +18972, -668, +1271, -8641, -2639, +2334, -6179, -8348, +7432, +7801, -2940, +3458, -8248, -6240, +4034, -1687, -1397, +219, -2550, -1400, +1180, -1707, +570, -817, -3296, +14, -296, -507, +401, +364, -923,
+ +21959, +18535, -765, +2387, -7488, -4223, +1716, -5274, -8935, +6110, +9408, -2449, +3539, -6393, -8447, +3758, -1179, -2278, +577, -2419, -1529, +1177, -1880, +421, +15, -3052, -213, -188, -381, +229, +230, -792,
+ +22177, +17184, -1463, +4152, -7417, -5322, +1895, -4670, -9301, +4734, +10403, -1838, +3744, -5091, -9470, +2688, -467, -2307, -47, -2507, -1716, +1644, -1713, +19, +585, -2840, -290, -132, -583, +270, +216, -863,
+ +21282, +15947, -1059, +5846, -8290, -5644, +2857, -4639, -8856, +2099, +10641, -385, +3528, -2821, -10459, +1131, +531, -2118, -590, -2948, -2183, +2054, -1090, -388, +1198, -3027, -868, +545, -650, +116, +61, -895,
+ +19684, +14621, -397, +7001, -7790, -5817, +2880, -3842, -8800, -339, +10153, +960, +3167, -586, -10099, -823, +1446, -2278, -872, -2756, -2996, +1653, -697, +272, +1463, -3850, -1195, +1381, -669, -245, -12, -700,
+ +19043, +12870, -2025, +8716, -5341, -5810, +2282, -4136, -8408, -1971, +10181, +1931, +1229, +1394, -8275, -2326, +1832, -1907, -1520, -2677, -3204, +830, -254, +370, +1503, -3747, -1696, +1787, -501, -463, -64, -480,
+ +17772, +11495, -1906, +9489, -4457, -5781, +2322, -3030, -7953, -3525, +9683, +2137, -956, +3838, -5603, -4565, +2548, -1531, -2419, -1809, -2980, +13, -611, -211, +1746, -2508, -2211, +1172, +20, -342, -25, -448,
+ +16172, +10332, -1198, +9289, -3999, -4949, +1874, -2281, -7098, -4475, +8984, +1666, -1886, +4718, -3908, -5051, +2520, -1200, -2844, -1330, -2610, -280, -1071, -1113, +1424, -1376, -1811, +550, -259, -177, +417, -403,
+ +14861, +9191, -895, +9322, -3450, -4202, +1794, -2120, -6076, -4509, +7671, +1778, -2042, +4286, -2908, -4647, +2359, -879, -2602, -1241, -2298, -404, -1009, -1514, +521, -983, -1056, +584, -581, -324, +663, -264,
+ +15155, +9134, -4909, +9650, +695, -5568, -98, -861, -5127, -4048, +7836, -470, -3638, +3507, -971, -2438, +3395, +805, -1417, +30, -1654, -576, -2362, -2979, -580, -1077, -1683, -192, -259, +23, +565, -430,
+ +12671, +9049, -2546, +8370, +348, -5007, +73, -1080, -4272, -3672, +5900, +445, -2327, +2893, -1066, -2332, +2478, +666, -950, -81, -1657, -456, -1795, -2452, -453, -1165, -1496, -205, -372, -241, +405, -163,
+ +10640, +8312, -1030, +7498, +499, -3857, +462, -1057, -3977, -3221, +4691, +603, -1571, +2324, -824, -2114, +1780, +753, -897, -192, -1342, -619, -1308, -1779, -404, -858, -1348, -343, -250, -418, +43, -237,
+ +8848, +7462, +273, +6813, +520, -2798, +1007, -1063, -3776, -2717, +3752, +822, -1253, +1807, -376, -2145, +1226, +906, -817, -265, -1156, -585, -1035, -1175, -21, -761, -1256, -312, -232, -510, -203, -397,
+ +7576, +6766, +783, +6094, +949, -1930, +961, -935, -3199, -2533, +3115, +1137, -1364, +1381, -101, -2040, +907, +789, -690, -333, -1020, -479, -554, -709, -42, -639, -1047, -254, -387, -684, -316, -446,
+ +6758, +6213, +818, +5337, +1626, -1136, +433, -711, -2304, -2323, +2540, +1251, -1296, +891, -62, -1566, +663, +551, -579, -337, -682, -77, -179, -658, -185, -408, -797, -413, -574, -679, -218, -506,
+ +5676, +5613, +1211, +4774, +1859, -560, +347, -565, -1759, -1969, +1959, +1004, -1099, +526, -52, -1206, +350, +370, -437, -6, -319, -22, -95, -656, -284, -373, -741, -564, -561, -531, -260, -513,
+ +4839, +5040, +1570, +4252, +1971, -105, +267, -311, -1226, -1572, +1266, +789, -799, +206, +13, -943, +147, +507, -9, +9, -222, +150, -127, -742, -390, -377, -652, -447, -470, -468, -202, -404,
+ +3971, +4513, +1934, +3945, +1836, +92, +582, -64, -938, -1357, +811, +579, -793, +201, +182, -781, +328, +623, -92, +16, -1, +148, -353, -881, -357, -190, -506, -444, -413, -282, -89, -284,
+ +3487, +4144, +1924, +3589, +1775, +195, +713, +196, -634, -1287, +388, +393, -687, +361, +568, -535, +97, +503, -1, +99, +32, -150, -611, -592, -111, -190, -456, -383, -216, -81, -181, -552,
+ +3301, +3728, +1796, +3379, +1524, +332, +959, +397, -543, -1254, +192, +235, -128, +879, +351, -653, +117, +446, +130, +39, -216, -238, -343, -291, -61, -147, -363, -182, -162, -325, -425, -636,
+ +3158, +3429, +1575, +3069, +1415, +510, +1197, +428, -495, -1108, +222, +720, +168, +681, +275, -639, +80, +477, +20, -67, -36, -85, -122, -161, +45, -6, -361, -356, -380, -418, -409, -428,
+ +2928, +3069, +1345, +2818, +1417, +711, +1294, +445, -262, -477, +279, +511, +400, +568, +118, -617, -114, +444, +240, +164, -34, -71, +77, +112, +93, -334, -675, -432, -304, -274, -306, -496,
+ +2770, +2980, +1085, +2081, +1491, +1282, +1414, +707, +136, -481, +296, +711, +259, +268, -123, -615, +244, +741, +217, +46, +80, +320, +286, -194, -408, -501, -505, -280, -185, -331, -422, -456,
+ +2145, +2721, +1166, +1872, +1628, +1355, +2017, +1189, +249, -296, -84, +491, +281, +68, -114, -178, +404, +756, +354, +121, +266, +316, -30, -468, -423, -383, -385, -212, -270, -357, -406, -426,
+ +1842, +2680, +1516, +1848, +2106, +1608, +1341, +1171, +512, -174, -238, -168, -14, +492, +474, +113, +382, +614, +414, +165, +91, -47, -298, -385, -349, -381, -404, -278, -199, -320, -431, -344,
+ +1494, +2674, +2068, +1864, +2114, +2048, +1472, +644, +13, -248, -148, +107, +178, +299, +556, +611, +503, +444, +237, -14, -145, -179, -250, -338, -297, -335, -447, -377, -226, -244, -239, -266,
+ +1925, +2823, +1706, +2247, +2162, +1533, +1572, +666, -433, -362, +211, +211, +263, +498, +470, +699, +812, +253, -219, -217, -141, -158, -177, -305, -385, -386, -363, -199, -282, -325, -189, -200,
+ +1895, +2794, +1934, +2044, +1845, +1355, +1196, +800, +59, -4, +248, +165, +196, +408, +651, +831, +697, +66, -242, -221, -251, -169, -144, -185, -354, -464, -369, -235, -233, -217, -227, -253,
+ +2070, +3085, +1525, +1327, +1530, +1218, +1047, +1206, +562, -3, +387, +199, +131, +543, +658, +484, +722, +457, -347, -458, -174, -78, -254, -222, -258, -371, -405, -378, -222, -139, -199, -289,
+ +2158, +2952, +1155, +903, +1034, +1184, +1499, +1127, +501, +624, +479, -49, +332, +596, +587, +621, +630, +547, +175, -291, -470, -235, -85, -53, -279, -367, -303, -368, -324, -237, -98, -174,
+ +2202, +2907, +1140, +946, +996, +914, +968, +770, +506, +769, +808, +471, +170, +297, +837, +684, +510, +566, +581, +137, -151, -326, -508, -27, -10, -284, -284, -236, -358, -292, -160, -181,
+ +2227, +3055, +1095, +862, +1273, +1155, +755, +13, -358, +880, +1377, +402, +198, +406, +514, +671, +747, +487, +515, +663, +288, -200, -289, -329, -435, -55, -29, -272, -238, -284, -289, -192,
+ +2611, +3292, +974, +954, +1270, +1231, +755, -497, -749, +618, +1057, +493, +366, +40, +465, +809, +420, +495, +737, +416, +453, +550, -173, -404, -427, -456, -170, -36, -153, -282, -273, -363,
+ +3071, +3880, +1049, +902, +1063, +1098, +721, -719, -1095, +709, +1109, -48, +105, +119, +411, +545, +413, +578, +522, +543, +532, +361, +329, +140, -499, -431, -240, -372, -190, -30, -170, -356,
+ +3643, +4399, +965, +971, +1042, +1110, +628, -1277, -1336, +963, +1150, -204, -183, -383, +345, +664, +317, +410, +437, +373, +393, +662, +275, +180, +133, -200, -382, -376, -282, -286, -116, -163,
+ +4308, +4895, +774, +1152, +1170, +1121, +456, -1796, -1513, +1267, +1131, -396, -245, -566, +93, +374, +376, +540, +287, +94, +297, +541, +252, +438, +35, +128, +202, -369, -356, -263, -280, -355,
+ +5086, +5494, +565, +1262, +1167, +1002, +246, -2296, -1419, +1649, +899, -695, -390, -688, +139, +229, +43, +522, +313, -4, +101, +250, +192, +281, +42, +281, +150, +88, +29, -357, -310, -372,
+ +5947, +6051, +326, +1498, +1238, +800, -127, -2806, -1134, +2148, +639, -918, -589, -888, +221, +107, +63, +476, +59, -50, +73, +200, -36, +80, -133, +176, +308, +138, +146, +162, -75, -593,
+ +6826, +6643, +77, +1786, +1321, +526, -620, -3298, -661, +2560, +320, -1067, -693, -1063, +227, -96, -4, +672, -52, -262, -29, +140, -44, -11, -506, +61, +206, +7, +401, +111, +23, -57,
+ +7619, +7442, -126, +1928, +1357, +155, -1100, -3708, -137, +2845, -82, -1161, -807, -1101, +269, -383, -139, +769, -105, -266, -156, -64, -45, -100, -607, -105, -83, +19, +101, +46, +338, -87,
+ +8307, +8292, -181, +1995, +1444, -218, -1606, -4093, +424, +3041, -445, -1224, -972, -1052, +349, -589, -311, +757, -179, -230, -152, -212, -149, -170, -724, -104, -113, -530, +37, +251, +145, +14,
+ +8643, +9272, +110, +1817, +1666, -587, -2047, -4412, +705, +3223, -687, -1244, -1233, -1012, +428, -695, -382, +631, -323, -238, -130, -251, -192, -373, -663, -294, -482, -278, -3, -42, +122, -69,
+ +8492, +10281, +986, +1410, +1924, -770, -2444, -4559, +552, +3340, -710, -1233, -1461, -1100, +472, -720, -429, +587, -438, -400, -99, -332, -136, -347, -1076, -421, -281, -434, -79, -24, +3, -146,
+ +8125, +10927, +2344, +1150, +1900, -669, -2843, -4563, +156, +3228, -594, -1224, -1574, -1302, +463, -750, -483, +580, -448, -544, -288, -236, -139, -776, -987, -370, -466, -463, -189, -19, +78, -37,
+ +7991, +11060, +3529, +1603, +1542, -534, -3046, -4622, -35, +2876, -563, -1181, -1626, -1431, +403, -853, -505, +584, -405, -608, -264, -541, -401, -425, -1162, -560, -503, -504, -197, +50, +141, -227,
+ +8113, +10987, +4130, +2562, +1380, -746, -2976, -4642, -186, +2488, -599, -1166, -1769, -1438, +351, -1005, -540, +563, -350, -314, -744, -724, -153, -611, -1117, -727, -662, -454, -56, +39, -92, -255,
+ +8541, +10760, +4178, +3497, +1698, -1029, -2983, -4221, -351, +1962, -666, -970, -2111, -1516, +401, -1246, -615, +645, -262, -603, -476, -696, -449, -571, -1094, -667, -850, -390, -123, -170, +69, -29,
+ +9463, +10347, +3864, +4361, +1905, -1016, -3375, -3542, -178, +969, -787, -512, -2341, -1829, +501, -1687, -324, +497, -681, +38, -559, -871, -368, -689, -1137, -482, -873, -676, -284, +7, +225, -241,
+ +10675, +9874, +3106, +5362, +1728, -766, -3609, -3014, +542, -431, -1221, +153, -2335, -2209, +365, -1836, -555, +243, -427, +197, -633, -802, -399, -696, -1174, -325, -1146, -802, -31, -109, -43, -198,
+ +11979, +9620, +1868, +6561, +1461, -834, -3246, -2641, +1610, -1691, -2280, +975, -2011, -2575, +506, -2638, -686, +670, -1066, +774, -478, -978, -319, -586, -1118, -498, -1131, -708, -19, -296, -39, -290,
+ +13202, +9745, +156, +7625, +1518, -1581, -2587, -2110, +2716, -2532, -3961, +1423, -1263, -2535, -109, -3054, -615, +404, -1229, +1095, -263, -1158, -337, -435, -1108, -467, -1188, -813, +84, -299, -171, -443,
+ +14767, +10075, -1860, +8018, +1955, -2430, -2104, -1371, +3819, -2798, -5967, +1234, +173, -2925, -421, -3162, -1161, +752, -1619, +1210, +94, -1348, -307, -445, -1114, -283, -1143, -1053, +275, -314, -302, -598,
+ +16745, +11407, -4631, +6674, +3019, -2190, -1544, -1323, +4470, -2021, -7768, +628, +1347, -2957, -573, -3465, -1242, +901, -1708, +1083, +267, -1131, -420, -544, -1164, -33, -939, -1139, +189, -205, -362, -752,
+ +18725, +12859, -7381, +4619, +4068, -1418, -1078, -1555, +4711, -1054, -8878, -549, +1949, -2355, -915, -3588, -1380, +838, -1609, +894, +412, -1079, -618, -661, -1074, +37, -839, -1169, +44, -14, -345, -1018,
+ +20617, +14277, -9830, +2481, +4741, -180, -623, -1859, +4753, +24, -9421, -1888, +2095, -1424, -1077, -3757, -1263, +564, -1542, +933, +391, -1114, -672, -723, -1014, -9, -886, -995, +4, +106, -421, -1228,
+ +22971, +14648, -11936, +1010, +4670, +1159, -432, -2360, +5156, +1040, -10169, -3061, +2153, -790, -797, -4032, -999, +16, -1618, +1256, +164, -1227, -657, -702, -1281, -23, -914, -801, -89, +34, -392, -1315,
+ +25011, +15028, -13659, +283, +4193, +2237, -295, -3037, +6357, +2181, -11345, -3814, +2283, -583, +157, -4078, -1204, -373, -1568, +1582, -149, -1215, -486, -730, -1676, +101, -841, -809, -115, +31, -256, -1422,
+ +26770, +15203, -15115, +213, +3256, +2746, -306, -3980, +8275, +2754, -12585, -4021, +1747, -335, +1270, -4084, -1750, -583, -1464, +1491, -428, -1113, -281, -912, -2028, +54, -759, -857, -174, +85, -303, -1462,
+ +28266, +15342, -16204, +581, +2139, +2849, -458, -4839, +10384, +2924, -13188, -4104, +831, +89, +2199, -3879, -2349, -501, -1511, +1039, -430, -928, -129, -1132, -2297, -63, -611, -925, -176, +40, -337, -1316,
+ +29815, +15252, -16897, +1083, +956, +2943, -891, -5378, +12109, +2999, -12962, -4417, +24, +359, +3011, -3485, -2819, -228, -1736, +411, -242, -574, -195, -1310, -2449, -114, -452, -1000, -246, +122, -273, -1376,
+ +30704, +15809, -17499, +1266, -67, +2972, -1442, -5841, +12884, +3439, -12108, -5096, -635, +266, +3715, -2998, -3240, +128, -2153, -287, -25, -181, -492, -1366, -2616, -99, -271, -1307, -189, +298, -393, -1579,
+ +31617, +16165, -17687, +1138, -966, +3161, -2242, -6103, +13031, +3994, -10855, -5813, -1133, -113, +4440, -2575, -3472, +440, -2571, -925, +179, +65, -731, -1305, -2901, +117, -239, -1557, +33, +256, -573, -1665,
+ +32352, +16428, -17456, +790, -1672, +3290, -2963, -6398, +12570, +4836, -9537, -6363, -1497, -663, +5053, -2203, -3513, +551, -2850, -1412, +253, +166, -881, -1140, -3110, +167, -209, -1531, +21, +58, -646, -1719,
+ +32443, +17279, -16999, +234, -2176, +3032, -2969, -7266, +11610, +6215, -8405, -6559, -1896, -1197, +5401, -1762, -3376, +385, -2989, -1689, +179, +134, -975, -845, -3214, -83, +9, -1520, -177, -60, -769, -1566,
+ +31891, +18480, -16118, -275, -2656, +2352, -2206, -8781, +10332, +8021, -7513, -6313, -2324, -1754, +5425, -1170, -3047, -34, -3062, -1781, +143, -159, -877, -571, -3281, -290, -54, -1442, -346, -232, -675, -1187,
+ +30789, +19781, -14760, -547, -3199, +1460, -1025, -10798, +8893, +10055, -6731, -5810, -2497, -2430, +5133, -347, -2659, -572, -3168, -1583, +53, -565, -706, -355, -3272, -631, -135, -1411, -495, -111, -434, -956,
+ +29203, +20906, -12769, -647, -3913, +632, +128, -12834, +7098, +11980, -5814, -5212, -2227, -3391, +4539, +673, -2372, -1120, -3072, -1521, +51, -954, -748, -83, -3467, -767, -413, -1439, -216, +11, -266, -671,
+ +27370, +21887, -10303, -720, -4689, +134, +1043, -14260, +4701, +13487, -4266, -4865, -1191, -4653, +3796, +1775, -2279, -1199, -3034, -1526, +71, -1028, -1357, +220, -3301, -1300, -375, -1263, +68, +148, +71, -545,
+ +25667, +22491, -8131, -702, -4924, -592, +1193, -14384, +1826, +13880, -1754, -4990, +69, -5585, +2484, +3061, -2364, -1028, -2909, -1942, +216, -1132, -2116, +370, -3234, -1473, -105, -1358, +437, +510, +66, -746,
+ +24446, +22593, -6915, -408, -4078, -1908, +267, -13242, -892, +13193, +1079, -5161, +987, -5936, +932, +4119, -2150, -1024, -2530, -2728, -156, -699, -2959, -77, -2635, -1479, +97, -1389, +719, +673, -84, -801,
+ +24036, +21606, -6203, +627, -3019, -3028, -1362, -11604, -2945, +12413, +3083, -5038, +1938, -6484, +130, +4637, -1658, -795, -2484, -3507, -351, -683, -3613, +80, -2401, -1272, +355, -1477, +898, +717, -205, -855,
+ +23746, +20456, -5957, +1984, -1938, -4318, -2728, -9545, -5053, +11530, +5123, -5779, +3222, -6434, -1059, +5532, -1261, -867, -2359, -3656, -1163, -839, -3785, +271, -1845, -1591, +565, -1292, +952, +517, -310, -562,
+ +23960, +19174, -6448, +3094, -1039, -5367, -3543, -7115, -6318, +9365, +7377, -6842, +3456, -4600, -3042, +6646, -852, -1642, -1444, -3885, -1943, -946, -3872, +319, -958, -2244, +620, -863, +527, +698, -367, -469,
+ +23568, +18274, -6811, +4251, -385, -6084, -3975, -5591, -6825, +6911, +9454, -6770, +1918, -2143, -4372, +6456, +836, -2708, -1024, -3507, -2456, -992, -4101, +133, -368, -2407, +310, -628, +322, +830, -178, -596,
+ +23144, +16836, -6904, +5729, -532, -6290, -3460, -5161, -7194, +5338, +10494, -6385, +648, -1274, -4124, +6012, +1743, -2865, -1093, -2839, -2832, -627, -4267, -880, -83, -2118, +211, -692, +147, +839, -37, -502,
+ +22711, +15715, -7208, +6876, -1112, -6812, -1895, -4170, -8095, +3463, +11810, -6439, -831, +595, -4557, +5102, +2952, -2723, -1144, -2460, -2917, -72, -4033, -2508, -347, -1558, +340, -324, -567, +508, +520, -161,
+ +21883, +15260, -8429, +8063, -235, -8167, -638, -2887, -8284, +800, +12560, -5049, -2930, +2356, -4439, +2991, +4720, -2205, -1490, -1641, -3457, +612, -3420, -4139, -735, -1238, +241, +437, -924, -343, +1119, +203,
+ +21335, +14054, -8898, +8815, +779, -8299, -1119, -1074, -7650, -2228, +13016, -3460, -4273, +3242, -3776, +1237, +5045, -804, -1470, -1298, -3268, +458, -2964, -4426, -1138, -1554, +51, +1032, -730, -629, +877, +351,
+ +20365, +12657, -8776, +9749, +928, -8030, -658, -913, -7055, -3196, +11979, -2564, -4312, +3780, -3422, -40, +4858, -93, -856, -1070, -2919, +46, -2986, -3875, -1261, -1840, -597, +1113, -367, -281, +474, -132,
+ +19013, +11105, -7802, +10307, +543, -7199, -275, -1182, -6482, -3415, +10634, -2108, -4043, +4152, -2778, -1409, +4761, +292, -1108, -72, -2792, -367, -2751, -3869, -722, -1726, -1380, +656, -107, +32, +533, -417,
+ +17238, +9877, -6359, +10304, +397, -6314, -103, -1088, -5868, -3730, +9349, -1363, -3939, +4046, -1704, -2280, +4126, +803, -1449, +148, -1982, -709, -2585, -3458, -636, -1205, -1796, +107, -115, +107, +736, -435,
+ +16850, +7680, -7300, +12521, +2285, -8479, -1088, +427, -4799, -1828, +6635, -3369, -2358, +3423, -1654, -893, +2570, -326, -160, +641, -662, +1201, -1048, -1604, +230, -1234, -1428, -364, -1650, -1332, -434, -718,
+ +14444, +7248, -5478, +10890, +2224, -6676, -847, +21, -3992, -1849, +5544, -2553, -2300, +2914, -1338, -1107, +2267, -65, -273, +451, -433, +1013, -1110, -1445, +209, -1201, -1151, -150, -1229, -1064, -618, -638,
+ +12262, +7034, -3827, +9064, +2556, -4911, -1001, -84, -3260, -1912, +4712, -1765, -2261, +2378, -778, -1142, +1867, +240, -212, +297, -363, +843, -852, -1395, +26, -936, -988, +116, -841, -918, -540, -612,
+ +10302, +6772, -2608, +7425, +3047, -3579, -1145, +38, -2705, -1968, +3948, -1166, -2245, +1845, -377, -1032, +1522, +265, -101, +261, -454, +682, -692, -1289, -82, -616, -753, -58, -567, -671, -471, -619,
+ +8655, +6443, -1690, +6216, +3422, -2584, -975, +289, -2316, -1952, +3369, -755, -2185, +1494, -27, -828, +1147, +375, +102, +100, -381, +549, -585, -1003, +110, -443, -720, -64, -432, -489, -423, -481,
+ +7221, +6029, -1043, +5350, +3703, -1861, -720, +491, -2015, -1931, +2856, -505, -2069, +1231, +249, -749, +916, +588, -27, +3, -232, +492, -372, -774, +147, -330, -639, -152, -420, -447, -267, -367,
+ +6149, +5337, -522, +4891, +3704, -1299, -409, +654, -1897, -1812, +2394, -328, -1930, +1021, +456, -664, +862, +483, -128, +133, -8, +452, -351, -564, +223, -354, -685, -251, -417, -328, -121, -233,
+ +5346, +4864, -12, +4345, +3331, -784, +8, +681, -1712, -1654, +1950, -310, -1698, +1129, +489, -581, +779, +295, +168, +368, -71, +403, -166, -481, +1, -380, -643, -238, -238, -203, -161, -400,
+ +4514, +4458, +326, +3863, +3291, -212, +50, +538, -1286, -1649, +1414, -7, -1273, +808, +432, -246, +709, +464, +342, +239, -48, +380, -169, -546, -158, -339, -484, -109, -208, -423, -383, -436,
+ +3737, +4010, +796, +3404, +3195, +416, -11, +338, -901, -1430, +1023, +156, -1025, +610, +727, +265, +594, +356, +422, +204, -29, +258, -264, -566, -22, -137, -442, -273, -489, -465, -295, -302,
+ +3244, +3768, +1129, +2910, +3135, +691, -252, +385, -417, -1326, +522, +399, -524, +860, +1067, +205, +375, +459, +340, +112, -87, +107, -72, -266, -80, -420, -615, -363, -338, -320, -248, -281,
+ +2573, +3501, +1542, +2421, +3011, +997, -87, +399, -529, -1166, +615, +926, +4, +728, +932, +166, +369, +429, +132, +29, +89, +269, -37, -460, -486, -479, -438, -286, -265, -300, -340, -358,
+ +2232, +3443, +1514, +2039, +3101, +1062, -319, +337, -153, -486, +938, +903, +105, +774, +780, +97, +164, +295, +371, +235, +56, -55, -435, -564, -350, -311, -370, -314, -370, -380, -308, -324,
+ +2099, +3104, +1627, +2260, +2331, +675, +356, +997, +219, -292, +974, +821, +240, +833, +457, -122, +408, +649, +268, -133, -357, -209, -248, -398, -297, -330, -451, -420, -307, -346, -285, -263,
+ +2122, +2790, +1338, +2074, +2184, +1299, +1099, +1022, +95, -225, +1143, +1001, +35, +360, +626, +337, +351, +218, -314, -387, -93, +1, -291, -457, -392, -443, -464, -372, -292, -249, -256, -321,
+ +1707, +2474, +1550, +2358, +2684, +1381, +926, +1181, +372, +33, +972, +722, +126, +726, +654, -120, -189, -79, -126, -78, -57, -130, -419, -521, -424, -414, -422, -289, -193, -281, -292, -290,
+ +2010, +3270, +2262, +2062, +1939, +1368, +1100, +994, +458, +277, +709, +981, +479, -169, -162, -155, -18, +79, -54, -119, -290, -340, -416, -496, -423, -327, -303, -303, -180, -220, -288, -319,
+ +2009, +3310, +2282, +1882, +1851, +1562, +1336, +1209, +776, +362, +614, +893, +95, -536, -229, +27, +139, +104, -126, -295, -281, -261, -428, -460, -356, -327, -324, -262, -176, -197, -243, -323,
+ +1917, +2863, +1699, +1659, +1731, +1613, +1700, +1958, +1364, +660, +516, +154, +109, -111, -308, -60, +186, +34, -209, -177, -239, -292, -369, -420, -336, -324, -384, -275, -150, -207, -229, -271,
+ +2083, +2983, +1506, +1368, +1260, +1246, +1869, +2064, +1340, +758, +550, +543, +648, -21, -249, -121, -176, +3, -57, -271, -389, -248, -240, -368, -274, -211, -264, -298, -253, -208, -277, -316,
+ +2198, +2901, +1109, +1182, +1319, +951, +937, +1441, +1654, +1337, +1100, +824, +681, +876, +212, -700, -324, -123, -65, -79, -310, -307, -251, -254, -244, -202, -273, -191, -288, -315, -204, -334,
+ +2056, +2797, +1107, +1111, +1387, +1207, +805, +382, +604, +1281, +1542, +1132, +811, +895, +1118, +443, -493, -486, -255, -140, -40, -153, -379, -280, -154, -282, -256, -140, -245, -319, -313, -273,
+ +2227, +2815, +713, +806, +1268, +1147, +860, +283, +11, +687, +1123, +928, +1193, +1393, +1389, +1012, +514, +125, -365, -591, -318, -109, -213, -289, -293, -274, -243, -88, -186, -280, -239, -272,
+ +2486, +3077, +731, +1027, +1384, +982, +653, -127, +18, +995, +563, +72, +590, +932, +1479, +1270, +871, +925, +447, -201, -501, -563, -415, -115, -142, -319, -311, -121, -170, -248, -174, -287,
+ +2776, +3185, +632, +1393, +1798, +1196, +295, -934, -91, +1380, +529, -194, +56, +370, +981, +652, +864, +1271, +871, +556, +177, -277, -677, -548, -265, -205, -165, -196, -285, -237, -144, -267,
+ +3354, +3953, +622, +1158, +1617, +1211, +384, -1193, -171, +1339, +277, -317, +73, +202, +504, +358, +412, +813, +940, +760, +456, +303, +14, -360, -589, -474, -252, -42, -107, -338, -311, -211,
+ +3850, +4360, +508, +1397, +1995, +1082, -118, -1646, +204, +1679, -168, -602, -109, +183, +636, +35, +21, +529, +357, +402, +649, +526, +381, +247, -153, -411, -536, -225, -139, -252, -213, -373,
+ +4411, +4791, +384, +1661, +2324, +1023, -690, -2047, +661, +1765, -479, -607, -315, +44, +662, -69, -18, +283, +30, +176, +102, +353, +561, +306, +304, +207, -224, -237, -341, -387, -267, -275,
+ +5196, +5589, +252, +1520, +2294, +876, -1040, -2104, +1074, +1564, -889, -524, -327, -4, +615, -266, -55, +275, -152, -65, -69, +83, +148, +190, +385, +348, +231, +269, -184, -470, -345, -462,
+ +5718, +5975, +175, +2056, +2782, +431, -1978, -2127, +1813, +1397, -1261, -507, -450, +38, +583, -484, -39, +267, -347, -79, -259, -143, +146, -225, +11, +369, +235, +504, +304, -118, -274, -506,
+ +6315, +6715, +139, +2136, +3019, +110, -2674, -1983, +2426, +977, -1603, -369, -506, +112, +585, -693, -116, +248, -464, -85, -325, -245, +4, -438, -63, +109, +23, +445, +292, +122, +139, -256,
+ +6745, +7502, +263, +2111, +3266, -192, -3399, -1846, +3012, +575, -2029, -233, -551, +130, +609, -828, -184, +190, -609, -176, -413, -318, +53, -619, -304, +55, -89, +206, +130, -30, +148, +100,
+ +7134, +8455, +527, +1754, +3383, -341, -3912, -1715, +3303, +346, -2377, -280, -478, +72, +667, -865, -308, +174, -675, -304, -524, -416, -31, -618, -370, -108, -188, +167, -7, -184, -47, -244,
+ +7313, +9336, +990, +1538, +3441, -503, -4294, -1670, +3509, +231, -2617, -467, -433, +52, +676, -779, -520, +145, -610, -380, -642, -599, -117, -669, -413, -164, -232, +55, +96, -400, -472, -157,
+ +7365, +10104, +1618, +1432, +3412, -640, -4433, -1790, +3563, +295, -2857, -582, -471, -46, +731, -713, -693, +94, -547, -429, -666, -773, -215, -762, -547, -236, -183, +203, -336, -503, -328, -397,
+ +7627, +10885, +2189, +1074, +3085, -555, -4178, -2011, +3118, +501, -2883, -799, -373, -262, +585, -456, -843, -134, -420, -460, -781, -795, -263, -872, -798, -152, -218, -231, -138, -460, -588, -350,
+ +7806, +11222, +3061, +1026, +2510, +140, -3881, -2574, +2792, +741, -2670, -863, -572, -375, +525, -340, -707, -443, -594, -288, -600, -934, -448, -729, -618, -528, -615, +40, -258, -504, -448, -459,
+ +8364, +10906, +3309, +2010, +2236, +305, -3930, -2743, +2508, +616, -2211, -1029, -819, -300, +442, -403, -584, -720, -758, -88, -693, -1026, -497, -479, -771, -804, -579, -256, -196, -436, -533, -482,
+ +9029, +10207, +3227, +3604, +2125, +318, -3991, -2699, +2282, -65, -1507, -869, -1243, -147, +313, -594, -347, -843, -960, -75, -980, -749, -428, -937, -470, -770, -924, -178, -240, -504, -518, -435,
+ +9921, +9094, +2287, +6033, +2825, -664, -3977, -1941, +1633, -1240, -452, -499, -1858, -63, +175, -661, -142, -1005, -1221, -134, -966, -783, -875, -745, -300, -914, -823, -398, -257, -376, -364, -633,
+ +11206, +8923, +714, +7385, +3503, -1786, -3331, -478, +668, -3181, +480, +632, -2341, -175, -40, -735, +255, -1209, -1564, +238, -1495, -1119, -374, -1178, -177, -742, -854, -326, -295, -188, -407, -888,
+ +12500, +9128, -1225, +8120, +4706, -2957, -3096, +1430, +223, -5655, +633, +2334, -2476, -521, -246, -1020, +659, -1250, -1599, -101, -1941, -946, -536, -1242, -56, -809, -795, -8, -246, -516, -388, -591,
+ +13675, +9715, -3224, +8145, +6300, -3785, -3252, +3384, +498, -7984, -273, +4084, -1795, -1035, -440, -1428, +900, -738, -2168, -270, -1884, -1560, -244, -1157, -224, -702, -726, +327, -338, -781, -147, -432,
+ +15154, +10710, -5566, +6974, +8141, -3612, -4028, +4575, +1225, -9451, -1863, +5047, -505, -1304, -850, -1886, +1317, -801, -2679, +65, -2243, -1967, -191, -1025, -170, -751, -681, +395, -330, -789, -111, -452,
+ +16752, +11590, -7670, +5697, +9423, -3002, -4671, +5673, +1937, -10472, -3507, +5316, +1125, -1097, -1563, -2113, +1531, -1067, -2688, -22, -2225, -2260, -408, -718, -89, -729, -829, +416, -248, -657, -207, -430,
+ +19048, +11932, -9851, +4534, +10090, -1984, -5054, +6462, +2293, -11027, -4690, +5000, +2637, -594, -2197, -2457, +1788, -1314, -2837, +89, -2336, -2296, -498, -623, +34, -681, -1067, +461, -56, -677, -250, -446,
+ +21615, +12284, -12393, +3217, +10448, -514, -5263, +6449, +2499, -11073, -5489, +4214, +3637, +192, -2622, -3086, +2129, -1593, -3108, +259, -2535, -2080, -721, -584, +167, -802, -1230, +548, +77, -823, -301, -503,
+ +23814, +13114, -14900, +2298, +10402, +898, -5100, +6132, +3297, -10979, -6159, +3330, +4213, +1402, -2845, -3633, +2405, -1780, -3198, +506, -2619, -1974, -705, -585, +213, -896, -1168, +724, -33, -929, -208, -500,
+ +26386, +12828, -16969, +2277, +9704, +1342, -4736, +5967, +4345, -11169, -7039, +2751, +4327, +2441, -3053, -3808, +2333, -2300, -2830, +716, -2946, -2030, -466, -758, +120, -951, -975, +827, -419, -898, -159, -497,
+ +27944, +13492, -18792, +2616, +8678, +1184, -4342, +5611, +6446, -11342, -8609, +2447, +4449, +2909, -2639, -3721, +1664, -2446, -2294, +738, -3192, -2075, -285, -1010, +17, -802, -857, +863, -754, -843, -70, -604,
+ +29685, +13245, -19820, +3525, +7289, +438, -4363, +5714, +8745, -11618, -10243, +2318, +4494, +2831, -1739, -3622, +798, -2251, -1924, +676, -3494, -1847, -281, -1396, -10, -574, -760, +810, -964, -876, +90, -884,
+ +30876, +13227, -20231, +4465, +5889, -396, -4997, +6035, +11191, -11731, -11570, +2001, +4359, +2565, -390, -3809, +115, -1644, -2030, +672, -3671, -1475, -428, -1750, -81, -277, -627, +610, -945, -950, +127, -1298,
+ +31278, +13827, -20217, +5005, +4867, -1003, -6199, +6113, +13378, -11329, -12203, +1134, +4093, +2242, +985, -3912, -507, -786, -2404, +550, -3518, -1128, -733, -1984, -168, -11, -527, +311, -627, -1202, -142, -1425,
+ +31764, +14605, -20212, +4922, +4300, -1333, -7821, +5935, +15019, -10487, -12297, -243, +3893, +2146, +1899, -3669, -996, -218, -2645, +277, -3187, -960, -1050, -2098, -246, +126, -509, +270, -478, -1664, -296, -1412,
+ +32060, +15062, -19624, +4534, +3996, -1550, -9300, +5401, +15705, -8935, -11962, -1826, +3577, +2336, +2149, -3207, -1062, -199, -2558, +23, -2815, -963, -1296, -2112, -372, +106, -371, +213, -866, -1643, -554, -1454,
+ +31594, +16147, -18709, +3873, +3953, -1965, -10021, +3855, +16002, -6586, -11620, -3362, +3110, +2802, +1915, -2574, -711, -590, -2348, +118, -2606, -1104, -1413, -2223, -396, +185, -559, -36, -1027, -1582, -772, -1167,
+ +30561, +17638, -17451, +3093, +3825, -2310, -9959, +1290, +16030, -3804, -11273, -4403, +2329, +3335, +1432, -1843, -11, -1291, -1875, +345, -2492, -1351, -1563, -2198, -273, -81, -1105, +216, -1300, -1438, -528, -1223,
+ +29054, +19377, -15810, +1898, +3337, -2040, -9228, -2236, +15568, -882, -10760, -4753, +1128, +3444, +1193, -1335, +948, -1929, -1502, +722, -2539, -1679, -1648, -1977, -761, -419, -1352, +362, -1270, -1184, -487, -1396,
+ +27602, +19983, -13329, +1384, +2220, -1554, -8967, -5440, +14956, +1793, -10256, -4555, -131, +2570, +2016, -1408, +1844, -1853, -1851, +1473, -2793, -1890, -1631, -2377, -1270, -515, -1540, +663, -950, -1428, -260, -1351,
+ +25630, +20290, -10250, +1324, +1106, -1113, -8917, -8485, +14115, +4666, -9858, -4276, -756, +605, +3452, -1301, +1865, -566, -2709, +1878, -2367, -2459, -1746, -2676, -1920, -341, -1413, +665, -508, -1676, -65, -1467,
+ +23903, +20682, -7285, +510, -377, -53, -7841, -11201, +11907, +7374, -9145, -4088, -105, -1982, +4053, -57, +1078, +860, -2851, +1241, -1622, -2794, -2102, -2673, -2293, -321, -1039, +386, -95, -1780, -277, -1191,
+ +22823, +20724, -6390, +1261, +39, -1707, -6905, -11539, +8653, +9408, -7732, -4726, +1287, -3835, +3357, +1929, +303, +1233, -2157, +97, -910, -2589, -2708, -1999, -2763, -485, -648, +75, -135, -1612, -438, -1073,
+ +23287, +19704, -6984, +2707, +769, -3874, -6807, -9891, +5577, +9767, -5818, -5461, +2601, -4494, +2384, +2776, +168, +930, -1602, -158, -1263, -1698, -2884, -1468, -2697, -1301, -449, -207, -5, -1619, -620, -970,
+ +23121, +19254, -7570, +3875, +1564, -5614, -6214, -8565, +2642, +9601, -3111, -6569, +3743, -4319, +944, +3692, -1043, +1591, -1282, -839, -479, -979, -2699, -1087, -2536, -2253, -519, -531, +376, -1513, -1259, -735,
+ +23895, +17231, -7927, +5604, +1021, -6359, -5558, -7729, +247, +9659, -1110, -7380, +4030, -2980, -753, +3497, -675, +211, -226, -662, -12, -138, -2841, -1008, -2053, -2616, -1508, -418, +202, -1307, -1387, -863,
+ +24342, +16470, -9991, +7124, +2358, -8387, -5330, -5313, -1440, +7467, +1852, -7623, +3025, -1190, -1869, +2925, -544, -837, +462, +723, -294, +355, -2495, -1378, -1396, -2679, -2066, -975, -223, -1078, -798, -950,
+ +24671, +15431, -12280, +9289, +3620, -10801, -4709, -2736, -2869, +4919, +4375, -7415, +1743, +298, -2786, +2517, -328, -1185, +786, +1117, +235, +533, -2350, -1333, -1275, -2503, -2002, -1593, -1255, -755, -98, -852,
+ +25053, +13472, -13784, +11904, +3737, -12350, -3755, -973, -3561, +2410, +5791, -6487, +903, +638, -3499, +2946, +122, -1824, +1428, +634, +327, +1655, -2796, -1081, -1079, -2818, -1321, -1807, -2367, -782, +236, -571,
+ +25116, +10992, -14059, +14344, +2920, -12891, -2578, +299, -4831, +848, +7344, -6354, -114, +1687, -3786, +2244, +1525, -1852, +674, +890, +28, +1938, -1938, -1637, -642, -2711, -1530, -1027, -2947, -1437, +260, -246,
+ +23985, +9052, -12781, +15373, +1674, -11878, -1467, -65, -5434, +490, +7676, -6470, -621, +2840, -3942, +1269, +2660, -1562, +29, +815, -200, +1923, -1492, -1644, -301, -2509, -1768, -675, -2585, -1873, -316, -164,
+ +21931, +7983, -10773, +14942, +1323, -10330, -1497, -40, -5152, -561, +7563, -5510, -1366, +3202, -3067, +472, +2598, -1082, +279, +329, -550, +2170, -1750, -1358, +265, -2505, -1617, -565, -2256, -1696, -689, -544,
+ +19430, +7714, -9051, +13884, +1898, -9550, -1480, +550, -5119, -1545, +7411, -4342, -2190, +3446, -2123, -381, +2504, -635, +149, +475, -753, +1639, -1244, -1582, +373, -1789, -1678, -352, -2064, -1521, -554, -754,
+ +15748, +5880, -5424, +14057, +1055, -9151, +6, +395, -3697, +26, +2380, -3599, +1708, +2154, -2492, -381, +1177, -628, -908, +222, -184, +13, -491, +744, +823, +168, +287, -447, -1046, -444, -892, -1473,
+ +13423, +5792, -3948, +12100, +1503, -7413, -200, +63, -3203, +36, +2193, -2943, +1203, +1914, -1964, -650, +802, -428, -791, -11, -101, +328, -385, +363, +831, +203, -6, -415, -837, -549, -728, -965,
+ +11548, +5784, -2873, +10302, +2118, -6063, -463, +56, -2707, -44, +2080, -2249, +640, +1764, -1387, -908, +655, -242, -693, -30, +33, +406, -343, +363, +575, +39, +171, -247, -794, -542, -534, -664,
+ +9991, +5645, -2205, +8952, +2517, -5038, -462, +97, -2247, -98, +1994, -1860, +246, +1696, -1146, -964, +569, -79, -606, +23, +219, +235, -243, +317, +304, +54, +319, -69, -720, -431, -412, -602,
+ +8782, +5267, -1688, +7925, +2587, -4032, -444, +186, -1796, -190, +1866, -1606, +28, +1498, -941, -932, +555, +33, -524, +199, +141, +119, -129, +148, +324, +141, +325, +78, -560, -385, -344, -545,
+ +7730, +4882, -1178, +6873, +2651, -3039, -408, +339, -1509, -166, +1693, -1465, -62, +1352, -781, -864, +627, +110, -304, +152, +23, +235, -129, +182, +391, +216, +338, +93, -398, -277, -266, -464,
+ +6682, +4405, -731, +6123, +2845, -2299, -386, +458, -1188, -175, +1392, -1251, -72, +1145, -660, -560, +621, +100, -161, +96, +165, +307, -117, +225, +452, +234, +339, +124, -277, -83, -286, -652,
+ +5690, +4114, -370, +5337, +2959, -1598, -302, +540, -968, -273, +1210, -1020, -123, +963, -389, -419, +496, +293, -68, +199, +276, +242, +0, +258, +446, +243, +317, +225, -197, -287, -537, -753,
+ +4885, +3784, -77, +4739, +3008, -1004, -171, +567, -808, -296, +1071, -732, -151, +763, -144, -243, +584, +495, +70, +295, +286, +281, +109, +300, +419, +303, +318, -42, -409, -429, -542, -696,
+ +4226, +3501, +214, +4230, +2888, -620, +78, +571, -807, -208, +1096, -674, -362, +873, +201, -44, +765, +519, +142, +419, +299, +326, +177, +298, +271, +18, +43, -215, -432, -470, -647, -770,
+ +3932, +3487, +332, +3583, +2646, -337, +286, +626, -783, -250, +992, -485, -226, +1185, +515, -8, +833, +682, +354, +372, +256, +357, +26, -114, -52, -14, -48, -274, -631, -669, -560, -678,
+ +3418, +3033, +572, +3583, +2497, -132, +513, +449, -821, -42, +1093, -214, +64, +1207, +613, +421, +1025, +662, +270, +267, +156, -77, -316, -230, -49, -15, -270, -450, -632, -506, -490, -682,
+ +3181, +2996, +715, +3280, +2345, -67, +347, +573, -324, +109, +1137, +26, +360, +1541, +983, +491, +841, +521, -22, -138, -250, -143, -314, -277, -62, -240, -335, -379, -510, -455, -497, -624,
+ +2727, +2771, +1072, +2985, +1995, +391, +619, +698, +15, +103, +1229, +617, +773, +1489, +882, +385, +452, -79, -395, -154, -251, -293, -476, -335, -58, -202, -314, -426, -485, -422, -544, -579,
+ +2494, +2557, +1043, +2808, +2364, +870, +612, +793, +495, +543, +1308, +959, +906, +1098, +463, -159, -22, -96, -247, -364, -543, -373, -260, -108, -160, -351, -341, -303, -434, -541, -495, -423,
+ +2245, +2929, +1653, +2497, +2295, +1063, +990, +1336, +681, +722, +1327, +514, +346, +641, +45, -321, -153, -280, -469, -425, -401, -290, -203, -148, -250, -400, -344, -392, -437, -432, -427, -381,
+ +2036, +3031, +1906, +2584, +3061, +1893, +991, +1134, +770, +385, +555, +135, +139, +440, -13, -447, -353, -398, -486, -346, -328, -238, -230, -305, -339, -347, -307, -358, -441, -468, -365, -304,
+ +2260, +3620, +2531, +2996, +2841, +1692, +1372, +1050, +54, -313, +437, +310, -186, +172, -16, -693, -347, -145, -476, -381, -270, -292, -232, -289, -368, -327, -359, -335, -337, -419, -363, -301,
+ +2676, +4645, +3140, +2419, +2169, +1462, +1102, +750, +195, +85, +102, -264, -85, +79, -270, -444, -278, -319, -366, -268, -355, -287, -309, -327, -319, -353, -353, -348, -337, -368, -283, -304,
+ +2949, +4690, +2841, +1992, +1690, +1410, +1436, +860, +276, +660, +273, -352, -345, -180, +121, -193, -594, -314, -69, -302, -301, -297, -387, -283, -358, -330, -294, -303, -318, -316, -248, -265,
+ +2663, +4196, +2447, +1658, +1599, +1196, +1150, +1391, +833, +702, +922, +75, -262, -13, -178, -354, -145, -141, -372, -189, -145, -407, -452, -309, -320, -299, -252, -248, -234, -287, -278, -279,
+ +2398, +3447, +2004, +1729, +1358, +984, +1029, +669, +683, +1466, +1326, +833, +548, +61, +123, -144, -513, -263, -43, -259, -496, -310, -241, -380, -321, -210, -198, -194, -288, -326, -349, -282,
+ +1987, +2518, +1256, +1701, +1770, +1374, +485, -160, +666, +1238, +1117, +1441, +1411, +1139, +952, +102, -154, -107, -472, -390, -130, -295, -423, -224, -149, -220, -273, -143, -187, -306, -316, -312,
+ +2278, +2838, +857, +1090, +1530, +1254, +445, -170, +485, +946, +625, +786, +1275, +1596, +1572, +803, +425, +213, -154, -308, -514, -316, -104, -287, -376, -113, -80, -229, -296, -347, -243, -268,
+ +2476, +3090, +1058, +1201, +1523, +1181, +155, -419, +779, +1084, +35, +242, +607, +801, +1329, +1038, +902, +963, +366, -99, -204, -377, -433, -306, -177, -196, -313, -134, -129, -427, -342, -186,
+ +2867, +3436, +953, +1406, +1896, +1116, -227, -669, +1005, +1052, -201, +161, +322, +441, +626, +250, +722, +1109, +690, +570, +251, -239, -145, -318, -437, -151, -137, -254, -368, -287, -235, -307,
+ +3223, +4037, +1058, +1328, +1970, +1123, -494, -725, +1262, +822, -504, +196, +268, +345, +542, -168, +80, +604, +515, +609, +511, +379, +188, -138, -158, -106, -291, -239, -239, -438, -390, -237,
+ +3605, +4512, +1093, +1462, +2230, +986, -1011, -692, +1601, +583, -689, +153, +137, +264, +549, -230, -112, +307, -5, +127, +287, +386, +455, +334, +189, +65, -9, -169, -441, -448, -309, -360,
+ +4213, +5204, +1001, +1333, +2363, +812, -1317, -467, +1657, +218, -775, +195, +55, +193, +477, -310, -143, +221, -206, -91, -167, -47, +272, +246, +485, +587, +199, -40, -178, -454, -468, -320,
+ +4698, +5773, +1037, +1391, +2580, +571, -1811, -137, +1930, -248, -877, +278, -103, +158, +530, -367, -232, +173, -250, -175, -332, -251, -144, -126, +369, +579, +501, +334, -24, -229, -186, -366,
+ +5288, +6344, +926, +1515, +2836, +115, -2275, +404, +2021, -766, -921, +321, -140, +29, +469, -385, -290, +150, -298, -257, -450, -381, -272, -339, +51, +315, +301, +289, +305, +49, -70, -193,
+ +5727, +6819, +1097, +1667, +3025, -179, -2850, +907, +2339, -1355, -1018, +450, -163, -64, +414, -378, -412, +166, -244, -346, -541, -414, -353, -452, -62, +81, +100, +97, +117, +54, +154, +24,
+ +6152, +7423, +1241, +1704, +3193, -343, -3363, +1287, +2593, -1875, -1019, +557, -240, -122, +320, -289, -434, +1, -201, -386, -581, -376, -457, -561, -160, +6, +81, -90, -141, -171, +11, +136,
+ +6828, +8180, +892, +1847, +3362, -806, -3382, +1529, +2487, -2165, -973, +617, -316, -246, +307, -187, -550, -125, -176, -413, -641, -381, -559, -633, -99, -94, -15, -180, -313, -244, -131, -157,
+ +7339, +8744, +842, +2085, +3460, -1151, -3508, +1614, +2597, -2421, -1102, +713, -354, -349, +308, -133, -681, -240, -127, -375, -785, -525, -527, -642, -141, -117, -177, -223, -324, -365, -249, -301,
+ +7574, +9153, +1067, +2490, +3582, -1505, -3603, +1572, +2713, -2474, -1389, +742, -241, -425, +146, -29, -689, -411, -49, -483, -922, -508, -527, -656, -327, -237, +1, -242, -493, -466, -249, -364,
+ +7771, +9477, +1525, +2681, +3443, -1315, -3581, +1119, +2776, -2355, -1714, +883, -172, -648, +99, -15, -446, -536, -387, -395, -961, -596, -497, -760, -479, -221, +19, -221, -514, -523, -422, -580,
+ +8021, +9527, +2129, +2912, +3042, -704, -3474, +429, +2652, -2057, -1808, +694, -37, -770, -99, +184, -246, -762, -608, -326, -1000, -680, -746, -737, -332, -407, -32, -127, -468, -730, -607, -585,
+ +8403, +9096, +2503, +3786, +2807, -577, -3480, +264, +2211, -1960, -1522, +174, -64, -508, -392, +127, +9, -898, -776, -193, -1244, -945, -831, -687, -337, -523, -94, -26, -596, -925, -547, -887,
+ +8807, +8295, +2417, +5558, +3297, -1392, -3612, +1274, +1418, -2497, -542, -285, -448, +137, -734, -107, +473, -920, -800, -132, -1516, -1021, -875, -819, -259, -572, -76, -222, -470, -870, -816, -826,
+ +9722, +7749, +1319, +7321, +3992, -2723, -3178, +2421, -19, -3130, +727, -464, -1243, +477, -681, -417, +819, -960, -919, -87, -1552, -1159, -1230, -838, -91, -743, -335, -154, -534, -892, -664, -1013,
+ +10871, +7707, -280, +8285, +5199, -3800, -2869, +3710, -1419, -4018, +2055, -221, -2213, +513, -187, -856, +1016, -762, -1123, +25, -1499, -1381, -1442, -764, -168, -955, -494, -100, -557, -805, -617, -1159,
+ +11833, +8327, -2135, +8341, +6953, -4401, -2931, +5076, -2394, -5396, +3185, +626, -3054, -51, +495, -988, +897, -337, -1368, +121, -1460, -1366, -1543, -1048, -218, -1030, -640, -180, -362, -865, -501, -1048,
+ +12829, +9031, -3811, +7669, +8589, -4509, -3176, +6410, -3118, -7036, +3841, +1818, -3527, -1043, +839, -699, +617, +2, -1464, -51, -1246, -1422, -1712, -1252, -469, -1107, -577, -355, -342, -806, -350, -891,
+ +14193, +9389, -5196, +6871, +9549, -4272, -3139, +7728, -3897, -8441, +3998, +3031, -3442, -2123, +727, -198, +556, +112, -1327, -318, -1041, -1563, -1814, -1380, -747, -1085, -601, -340, -468, -645, -199, -888,
+ +15661, +9657, -6466, +6233, +9750, -3870, -2723, +8960, -4625, -9557, +3686, +4006, -2824, -3064, +219, +187, +873, +40, -1085, -476, -1214, -1459, -1967, -1537, -758, -1196, -696, -105, -519, -711, -84, -847,
+ +17612, +9339, -7641, +6081, +9246, -3958, -1635, +10145, -5733, -10179, +3232, +4461, -2053, -3596, -499, +236, +1471, -53, -824, -784, -1512, -1204, -2322, -1376, -936, -1375, -530, +50, -558, -860, -124, -756,
+ +19464, +9218, -8894, +6261, +8414, -4281, -362, +11373, -6530, -10787, +2802, +4643, -1343, -3682, -1194, -40, +2158, +139, -767, -1071, -1683, -1101, -2364, -1296, -1186, -1329, -395, +234, -591, -1146, -125, -556,
+ +21650, +9391, -10921, +6081, +8229, -4221, +203, +11812, -6629, -11097, +2478, +4559, -1182, -3435, -1548, -555, +2784, +461, -1205, -1026, -1705, -1257, -2251, -1430, -1147, -1205, -447, +400, -669, -1392, -60, -370,
+ +23618, +9864, -13022, +6004, +8047, -4224, +416, +12157, -6101, -11655, +2262, +4560, -1406, -3057, -1487, -1343, +3208, +954, -1820, -705, -1697, -1484, -2065, -1532, -1034, -1119, -451, +413, -760, -1496, +104, -350,
+ +25507, +10090, -14632, +6037, +7728, -4436, +358, +12536, -5173, -12312, +2011, +4630, -1786, -2621, -1213, -2223, +3338, +1463, -2228, -359, -1728, -1658, -1788, -1625, -1025, -963, -485, +363, -873, -1530, +387, -596,
+ +26627, +10861, -15853, +5976, +7294, -4687, -371, +13071, -3740, -13127, +1550, +4642, -1970, -2334, -931, -3003, +3016, +1971, -2297, -263, -1620, -1706, -1630, -1719, -1043, -847, -523, +201, -913, -1492, +419, -862,
+ +27530, +11440, -16338, +5806, +6853, -5062, -1537, +13788, -2342, -13609, +1025, +4352, -1778, -2113, -835, -3462, +2444, +2246, -1905, -448, -1344, -1486, -1806, -1634, -1064, -761, -595, -37, -809, -1508, +121, -852,
+ +28224, +11700, -16026, +5571, +6480, -5602, -2945, +14553, -1154, -13550, +444, +3704, -1208, -1832, -1081, -3648, +1918, +2131, -1093, -757, -1070, -950, -2221, -1384, -1073, -729, -775, -143, -847, -1640, -17, -887,
+ +28214, +12317, -15132, +5335, +6093, -6384, -4399, +15062, +169, -13141, -349, +2865, -289, -1493, -1676, -3631, +1626, +1567, -67, -870, -1084, -138, -2566, -1203, -1005, -902, -816, -488, -1098, -1320, -264, -1047,
+ +27674, +13198, -13952, +5049, +5724, -7018, -5818, +14657, +1734, -12326, -1239, +1914, +642, -1155, -2395, -3373, +1426, +664, +785, -410, -1487, +642, -2474, -1372, -799, -1007, -1378, -898, -968, -1200, -318, -1143,
+ +26652, +14012, -12267, +5200, +5058, -7686, -7095, +13622, +3660, -11442, -2233, +1137, +1363, -744, -2921, -3117, +1275, -215, +1171, +578, -1924, +1016, -1812, -1727, -552, -1507, -1936, -883, -1217, -880, -117, -1273,
+ +25475, +14976, -10646, +5041, +4464, -7267, -8564, +11374, +5951, -10470, -2967, +696, +1267, -122, -2915, -3040, +1233, -1048, +1136, +1691, -1848, +783, -937, -1783, -1189, -1393, -2258, -1210, -1264, -527, +247, -1345,
+ +24419, +15887, -9484, +5107, +3650, -6572, -9308, +8065, +7947, -9122, -3697, +547, +799, +235, -2298, -3040, +979, -1401, +662, +2459, -1414, +581, -596, -1924, -1571, -1185, -2341, -1527, -1293, -276, +512, -1388,
+ +23795, +16122, -8471, +5677, +2738, -6335, -9272, +4878, +8930, -7283, -4533, +587, +584, -11, -1141, -3044, +596, -1168, -297, +2828, -664, +169, -697, -1636, -1755, -862, -2122, -1839, -1085, -591, +469, -1064,
+ +23181, +16389, -7740, +6442, +2203, -6741, -8435, +1898, +8932, -4751, -5617, +579, +1155, -849, +75, -2508, -62, -547, -1447, +2588, +244, -428, -620, -1078, -1599, -628, -1538, -1799, -1522, -1117, +586, -607,
+ +22030, +16813, -6551, +6364, +1905, -6491, -7923, -1053, +8741, -2377, -6611, +562, +1892, -1729, +1052, -1623, -1078, +91, -2144, +1122, +1074, -291, -801, -281, -1301, -212, -1096, -1926, -1797, -1687, +155, -224,
+ +21252, +16563, -5226, +6101, +1299, -5618, -7959, -3288, +8275, -753, -6864, +469, +2279, -1970, +1852, -1721, -1502, +720, -2997, -86, +1065, +347, -610, +374, -839, -206, -612, -1925, -1830, -2459, -670, -2,
+ +21059, +15707, -4300, +6487, +399, -4731, -7511, -5182, +7533, +993, -7052, +281, +3472, -2462, +1927, -1517, -1924, +1110, -3284, -499, +295, +614, +990, +278, -801, +497, -387, -1895, -1824, -2714, -1624, -343,
+ +21308, +14470, -4242, +7388, -252, -4583, -6956, -6093, +6238, +2376, -6556, -258, +4580, -2860, +1045, -858, -2359, +1013, -2617, -1139, +487, +118, +1238, +1478, -1143, +904, +15, -2196, -1671, -2549, -2403, -913,
+ +21749, +13551, -6011, +9422, +239, -6449, -5832, -5695, +4659, +3069, -5378, -989, +5204, -3101, -229, +148, -2474, +414, -1566, -777, +246, -263, +270, +2911, -520, +45, +1169, -2578, -2021, -1583, -2763, -1790,
+ +22949, +11670, -8631, +12918, +409, -9741, -4092, -3756, +2386, +3036, -3324, -2593, +5421, -2472, -2045, +992, -1722, -439, -884, +258, -443, -545, -80, +2347, +873, +112, +639, -1838, -2302, -1431, -2266, -2373,
+ +23912, +9195, -9741, +15652, -753, -10899, -2348, -2548, +736, +2645, -1865, -3419, +5193, -2092, -2914, +1332, -608, -827, -806, +689, -265, -734, -758, +2025, +1240, +683, +402, -1265, -2108, -2026, -1547, -2057,
+ +24116, +7252, -10353, +17452, -1244, -12053, -838, -452, -1756, +1609, +584, -4398, +4020, -759, -3062, +840, +208, -518, -792, +316, -183, -122, -1534, +1708, +1528, +202, +1161, -889, -2381, -1597, -1536, -1866,
+ +22898, +6010, -9724, +18156, -1387, -12297, +387, +197, -3319, +1402, +1628, -5089, +3452, +505, -3306, +713, +563, -709, -310, -27, -425, +285, -1418, +1158, +1255, +363, +1114, -493, -2226, -1184, -1308, -2262,
+ +20564, +5546, -8225, +17550, -828, -11491, +295, +434, -3523, +690, +1926, -4748, +2908, +1152, -2974, +468, +624, -706, -391, +101, -448, +40, -907, +960, +763, +546, +863, -551, -1476, -956, -1217, -2071,
+ +18013, +5811, -6919, +15896, +403, -10591, +67, +716, -3781, +91, +2335, -4161, +2129, +1920, -2779, -103, +1086, -690, -833, +298, -250, -202, -650, +1014, +731, +167, +703, -483, -1293, -477, -1156, -1837,
+ +15954, +7279, -4695, +11256, -415, -7760, +15, -732, -923, +300, -780, -1111, +2315, +31, -1667, -359, +362, -475, -1405, +76, +201, +160, +30, +184, +33, +618, +403, -142, -19, -131, -351, -177,
+ +13494, +6706, -2871, +10506, -334, -6611, +26, -1001, -670, +405, -783, -1035, +2308, +178, -1638, -389, +219, -411, -1191, +78, +47, +72, +135, +215, +199, +619, +296, -179, +63, -50, -473, -173,
+ +11237, +6344, -1097, +9099, -68, -4982, -505, -1322, -183, +562, -966, -830, +2203, +226, -1398, -487, +211, -401, -1067, +110, +8, -13, +137, +291, +364, +507, +81, -35, +85, -87, -212, -94,
+ +9435, +6226, -171, +7621, +609, -3889, -842, -1290, +78, +594, -877, -638, +1779, +371, -1115, -611, +132, -304, -919, +84, +28, -9, +48, +403, +517, +118, +63, +313, +10, -189, +147, +127,
+ +8281, +6134, -53, +6558, +1253, -3449, -792, -803, +3, +411, -397, -490, +1169, +584, -800, -816, +96, -90, -761, -7, +124, +9, +14, +591, +350, +19, +335, +355, -11, +74, +386, +51,
+ +7626, +5926, -212, +5733, +1440, -2973, -409, -538, -154, +402, +53, -527, +813, +715, -773, -751, +187, -25, -687, +71, +196, -126, +302, +655, +141, +178, +495, +459, +123, +278, +255, -206,
+ +6929, +5539, -213, +5155, +1491, -2470, -128, -422, -216, +513, +263, -626, +604, +665, -597, -610, +136, +1, -569, +170, +102, +123, +603, +290, +210, +557, +624, +396, +74, +188, -68, -300,
+ +6185, +4979, +11, +4843, +1477, -2007, +4, -218, -47, +475, +187, -580, +653, +583, -532, -454, +163, -44, -352, +323, +185, +454, +520, +322, +554, +597, +512, +149, -58, +28, -156, -302,
+ +5578, +4710, +139, +4160, +1511, -1429, +247, -168, -133, +534, +301, -478, +483, +511, -357, -354, +144, +139, +8, +323, +460, +774, +453, +457, +460, +265, +311, +30, -141, -56, -156, -426,
+ +4834, +4248, +381, +3890, +1666, -1076, +239, -53, +65, +514, +187, -374, +470, +445, -203, -178, +260, +403, +263, +582, +785, +717, +278, +143, +133, +173, +220, +36, -212, -220, -241, -492,
+ +4112, +3866, +738, +3569, +1573, -632, +461, -98, +98, +570, +131, -353, +509, +570, +1, -44, +534, +858, +514, +701, +653, +128, -67, +95, +33, +141, +132, -176, -297, -216, -361, -612,
+ +3730, +3751, +748, +2995, +1739, -73, +398, -129, +157, +561, +323, -107, +526, +653, +397, +536, +911, +895, +332, +268, +196, +17, -51, +13, -44, +15, +3, -239, -324, -299, -490, -606,
+ +2892, +3209, +1362, +3059, +1608, +183, +476, -76, +432, +660, +242, +160, +1035, +1083, +626, +639, +747, +381, -9, +163, +81, +56, -147, -221, -132, -95, -61, -252, -388, -412, -526, -492,
+ +2751, +3422, +1354, +2300, +1711, +558, +501, +0, +522, +1109, +816, +681, +1164, +1033, +441, -20, +152, +356, +205, +72, -219, -249, -231, -203, -210, -180, -256, -370, -298, -417, -459, -470,
+ +2213, +3015, +1710, +2495, +1858, +590, +641, +620, +1215, +1482, +1046, +755, +541, +267, +10, +86, +387, +325, -148, -273, -65, -313, -466, -314, -242, -224, -295, -239, -315, -373, -410, -471,
+ +2378, +3632, +1950, +1794, +1539, +1418, +1931, +1408, +1041, +906, +325, -55, +58, +281, +416, +72, -140, +104, -126, -337, -346, -567, -457, -177, -236, -294, -192, -169, -347, -458, -408, -412,
+ +2533, +3615, +2312, +2872, +2388, +1873, +1923, +741, -5, +118, +68, +58, +150, +130, +263, -116, -210, +0, -357, -464, -470, -596, -379, -114, -162, -283, -238, -201, -344, -427, -422, -456,
+ +2942, +4614, +3781, +3595, +1951, +1001, +577, -2, -9, +177, +100, -150, -79, +34, +232, -191, -343, -241, -526, -515, -470, -365, -285, -260, -253, -164, -168, -307, -404, -446, -401, -430,
+ +3532, +6353, +4765, +2112, +192, +502, +1060, +740, -280, -482, -6, +65, -4, -231, +34, -123, -424, -424, -500, -331, -405, -410, -380, -233, -194, -220, -155, -328, -390, -470, -422, -333,
+ +3755, +6377, +3303, +1175, +770, +1523, +1808, +406, -520, -9, +89, -402, +39, -135, -211, -179, -439, -280, -348, -438, -354, -411, -499, -252, -187, -273, -219, -307, -346, -365, -422, -391,
+ +2292, +3472, +1957, +1995, +2278, +2297, +2103, +987, +507, +705, +356, -151, -300, -91, -5, -385, -390, -195, -226, -195, -415, -448, -286, -389, -411, -244, -292, -350, -179, -229, -400, -416,
+ +1818, +2519, +1138, +1324, +2015, +2068, +1584, +1227, +1540, +1526, +1078, +598, +319, +222, -134, -344, -223, -355, -392, -97, -288, -313, -172, -348, -336, -273, -365, -453, -322, -244, -282, -244,
+ +1991, +2736, +1264, +1355, +1697, +1270, +711, +599, +1244, +1618, +1273, +1003, +935, +769, +343, -110, -218, -251, -265, -318, -400, -273, -132, -258, -316, -231, -397, -402, -299, -400, -335, -209,
+ +2251, +2967, +994, +1270, +1800, +1182, +279, +84, +961, +1169, +719, +996, +1350, +1194, +875, +354, +177, -36, -281, -180, -385, -407, -152, -263, -174, -84, -340, -346, -297, -435, -353, -294,
+ +2480, +3473, +1165, +1200, +1737, +845, +57, +329, +1003, +611, +199, +547, +758, +1002, +1150, +732, +519, +336, +111, +41, -306, -318, -220, -391, -191, -72, -253, -256, -285, -408, -356, -288,
+ +2649, +3711, +1311, +1382, +2036, +687, -508, +326, +1208, +456, +68, +382, +353, +462, +569, +468, +723, +755, +406, +258, +136, -72, -225, -267, -245, -225, -240, -248, -225, -296, -369, -333,
+ +2964, +4131, +1489, +1331, +2033, +617, -808, +460, +1251, +52, -30, +483, +328, +176, +291, +68, +30, +458, +630, +520, +346, +230, +65, -124, -180, -162, -252, -369, -325, -244, -287, -364,
+ +3239, +4590, +1669, +1277, +2157, +578, -1141, +581, +1323, -227, -123, +554, +289, +101, +235, -70, -151, +21, +68, +288, +434, +552, +333, +96, +114, -5, -178, -258, -330, -382, -258, -310,
+ +3730, +5196, +1638, +1123, +2169, +498, -1273, +754, +1210, -629, -139, +669, +292, -39, +121, -92, -233, -100, -101, -83, -136, +287, +479, +374, +279, +151, +86, -119, -292, -349, -283, -381,
+ +4118, +5685, +1731, +1125, +2229, +300, -1467, +1077, +1205, -1062, -262, +742, +304, -24, +37, -204, -274, -138, -131, -188, -340, -115, +44, +179, +403, +348, +235, +111, -82, -266, -257, -291,
+ +4622, +6186, +1694, +1242, +2320, -46, -1538, +1517, +1128, -1483, -305, +842, +294, -67, +5, -202, -308, -201, -102, -217, -386, -222, -141, -100, +22, +201, +346, +265, +66, -53, -11, -199,
+ +5193, +6638, +1554, +1499, +2388, -594, -1568, +2012, +985, -1863, -401, +847, +343, -128, -50, -264, -391, -279, -25, -258, -446, -236, -373, -107, -36, -173, -57, +100, +162, +131, +55, -58,
+ +5824, +7125, +1374, +1702, +2443, -1077, -1576, +2426, +805, -2126, -439, +769, +323, -176, +40, -325, -603, -328, -5, -213, -488, -283, -470, -142, -46, -264, -242, -261, -123, +12, +119, +34,
+ +6334, +7628, +1407, +1800, +2526, -1396, -1736, +2892, +798, -2493, -400, +739, +274, -165, +15, -222, -694, -481, +71, -261, -571, -118, -475, -277, -17, -290, -261, -317, -412, -297, -56, +28,
+ +6760, +8075, +1459, +2066, +2610, -1965, -1827, +3359, +727, -2782, -456, +714, +208, -231, -19, -148, -746, -627, +81, -302, -698, -121, -406, -325, -108, -219, -293, -467, -520, -392, -175, -289,
+ +7156, +8607, +1581, +2067, +2784, -2202, -2040, +3602, +768, -2900, -540, +707, +103, -260, -9, -128, -676, -844, +64, -130, -840, -252, -381, -284, -108, -232, -281, -564, -569, -421, -262, -447,
+ +7410, +9322, +1839, +1630, +3032, -1960, -2477, +3477, +917, -2765, -737, +578, +126, -373, +30, -107, -668, -935, -60, -33, -777, -451, -481, -148, -144, -362, -257, -531, -598, -498, -435, -436,
+ +7600, +9758, +2318, +1422, +3068, -1530, -2951, +3204, +1134, -2618, -848, +362, +152, -422, -49, -52, -609, -1027, -173, +13, -822, -438, -526, -270, -107, -428, -361, -411, -697, -655, -353, -474,
+ +8105, +9762, +2543, +1907, +2992, -1493, -3124, +3108, +1008, -2376, -800, +85, +226, -462, -208, +76, -423, -1155, -329, +103, -790, -491, -527, -345, -142, -392, -384, -536, -745, -704, -191, -505,
+ +8909, +9413, +2318, +2985, +3008, -1947, -3051, +3169, +425, -2046, -542, -271, +167, -483, -337, +79, -155, -1299, -550, +185, -644, -695, -584, -288, -261, -359, -405, -740, -843, -531, -265, -573,
+ +9427, +9025, +2181, +4009, +3640, -2472, -3408, +3778, -384, -2061, +273, -562, -295, -283, -347, -202, +399, -1463, -822, +375, -577, -753, -724, -199, -322, -386, -483, -747, -846, -589, -325, -571,
+ +10107, +8385, +1399, +6014, +4224, -3845, -2895, +4634, -1925, -2185, +1408, -690, -736, -444, -159, -497, +691, -1213, -1255, +419, -429, -744, -766, -202, -456, -411, -561, -543, -937, -907, -161, -738,
+ +10943, +8372, +46, +7111, +5244, -4698, -2467, +5335, -3432, -2575, +2680, -669, -1221, -664, +154, -796, +595, -632, -1639, +276, -169, -751, -786, -163, -512, -555, -561, -561, -871, -1006, -392, -823,
+ +12145, +8721, -1664, +7094, +6723, -4973, -2355, +5841, -4655, -3092, +3715, -398, -1752, -902, +492, -913, +75, -59, -1626, -197, +171, -746, -800, +31, -700, -608, -585, -845, -649, -980, -876, -718,
+ +13449, +9172, -3433, +6797, +7857, -4808, -2042, +6051, -5634, -3740, +4383, +233, -2243, -1264, +789, -884, -471, +114, -1202, -709, +234, -518, -817, +265, -856, -713, -702, -983, -689, -985, -936, -805,
+ +14554, +9844, -4693, +5589, +8877, -3969, -1995, +6452, -6471, -4465, +4658, +1064, -2464, -1807, +1041, -734, -892, -141, -587, -969, -47, -87, -823, +496, -903, -929, -758, -1133, -899, -927, -701, -988,
+ +15499, +10691, -5588, +4019, +9371, -2825, -1817, +6925, -7238, -5143, +4618, +1819, -2390, -2377, +1112, -528, -1081, -687, -143, -864, -452, +270, -610, +501, -920, -980, -875, -1386, -1039, -897, -491, -927,
+ +17184, +10743, -6654, +3457, +8941, -2496, -296, +6959, -8428, -5130, +4434, +2200, -2278, -2677, +1040, -466, -1059, -1190, -112, -563, -633, +396, -146, +257, -999, -773, -1177, -1541, -1165, -956, -285, -586,
+ +18439, +11433, -7884, +3086, +8225, -2331, +1153, +7363, -9381, -5432, +4475, +2300, -2058, -2773, +773, -429, -923, -1487, -412, -319, -458, +489, +179, +4, -920, -665, -1379, -1592, -1380, -990, -70, -198,
+ +20042, +11572, -8926, +2926, +7481, -2933, +2814, +7901, -10432, -5634, +4628, +2163, -2082, -2501, +322, -606, -659, -1666, -796, -419, +2, +772, +28, -85, -714, -788, -1426, -1661, -1631, -933, -18, +154,
+ +21100, +12438, -9991, +2657, +6925, -3598, +3640, +9112, -11048, -6264, +4925, +1936, -2083, -2127, -90, -1005, -241, -1755, -1109, -655, +353, +1477, -496, -26, -322, -1102, -1237, -1772, -1805, -950, -17, +341,
+ +22219, +13016, -10683, +2237, +6616, -4544, +3961, +10465, -11476, -6709, +4989, +1692, -2097, -1740, -470, -1509, +171, -1892, -1172, -1009, +446, +2362, -1006, -81, +206, -1447, -1059, -1718, -2147, -946, -187, +378,
+ +23160, +13514, -10970, +1648, +6564, -5582, +3717, +11855, -11585, -6852, +4668, +1416, -1887, -1527, -832, -1885, +423, -2021, -993, -1360, +247, +3144, -1088, -388, +816, -1544, -1102, -1487, -2586, -1059, -470, +328,
+ +23984, +13865, -11141, +1506, +6153, -6455, +3221, +12729, -11274, -6683, +4149, +879, -1352, -1514, -1322, -1967, +481, -2107, -736, -1620, -134, +3538, -695, -707, +1213, -1214, -1434, -1269, -3013, -1292, -736, +72,
+ +24781, +14121, -11236, +1961, +5252, -7111, +2788, +12881, -10420, -6360, +3471, +291, -601, -1551, -1881, -1800, +634, -2271, -408, -1692, -623, +3484, +103, -645, +1121, -483, -1861, -1402, -3095, -1550, -1114, -153,
+ +24479, +15178, -10478, +1270, +5126, -7637, +1415, +13107, -9036, -6195, +2475, -42, +4, -1634, -2241, -1772, +999, -2518, -301, -1320, -1403, +2910, +1377, -318, +543, +368, -2378, -1572, -2885, -2072, -1188, -611,
+ +23337, +16618, -8704, -222, +5298, -7564, -969, +13263, -6981, -6465, +1742, -449, +352, -1377, -2595, -1623, +1239, -2650, -286, -900, -1897, +1935, +2438, +529, -376, +751, -2162, -1941, -2664, -2274, -1304, -958,
+ +22711, +17229, -7216, -356, +4385, -7099, -2808, +12388, -4620, -6839, +1426, -974, +423, -777, -2826, -1527, +1423, -2735, -246, -515, -2069, +1272, +2387, +1470, -861, +696, -1581, -2206, -2448, -2243, -1214, -1282,
+ +22892, +17053, -6908, +1550, +2504, -7309, -2981, +10387, -2761, -6477, +846, -1461, +747, -527, -2541, -1652, +1330, -2326, -580, +130, -2018, +687, +1356, +2089, -262, +54, -772, -2199, -2423, -1678, -1280, -1949,
+ +22957, +16964, -6995, +3862, +804, -8094, -2421, +7964, -1266, -5600, -222, -1546, +1311, -700, -1892, -1941, +925, -1306, -1223, +806, -1823, -506, +576, +2233, +644, +9, -621, -1589, -2130, -1758, -1313, -2053,
+ +22795, +16810, -6664, +5414, -230, -8963, -2057, +5716, -141, -4502, -1496, -1224, +1967, -1203, -1238, -1944, +128, +141, -1763, +375, -1152, -1441, -294, +2235, +1382, +482, -422, -1049, -2082, -1864, -1014, -2074,
+ +22157, +16820, -5736, +5914, -531, -9248, -2575, +3914, +921, -3656, -2320, -842, +2476, -1480, -1051, -1439, -455, +615, -1691, -640, -771, -1051, -1219, +1624, +1961, +1863, -702, -1229, -1009, -2136, -1192, -1810,
+ +21421, +16784, -4798, +6154, -663, -9035, -3372, +2101, +2124, -2833, -3111, -132, +2640, -1602, -637, -1248, -923, +605, -1675, -1250, -659, -53, -1901, +1334, +2038, +2065, +272, -1486, -538, -2096, -1157, -1644,
+ +21360, +15630, -3751, +6529, -1324, -8214, -4324, +465, +3133, -1841, -3943, +436, +3186, -1861, -582, -1384, -979, +78, -1818, -753, -1148, +489, -779, +521, +1069, +2102, +1599, -1602, -997, -1118, -1205, -1803,
+ +20329, +15117, -2198, +6125, -1778, -6323, -6027, -1388, +5002, -1330, -4769, +1469, +3125, -2056, -349, -2178, -853, +366, -2722, -22, -541, -98, +456, +351, -12, +1825, +1554, -532, -894, -1194, -631, -1855,
+ +20062, +13940, -1074, +5902, -2919, -4148, -6484, -3763, +6394, -77, -5570, +1977, +3169, -2468, -501, -2482, -419, +182, -3076, +750, +151, -824, +890, +1089, -685, +923, +962, +419, -68, -1542, -261, -1391,
+ +21164, +12567, -2644, +7196, -3419, -4374, -5592, -3940, +6004, +491, -4990, +1626, +3132, -2898, -841, -2060, -308, +352, -2927, +725, +461, -401, +853, +946, -597, +287, +687, +245, +522, -713, -834, -655,
+ +22180, +10753, -4743, +9693, -3820, -6163, -3751, -3238, +4763, +962, -4787, +856, +3567, -3083, -1668, -1292, +74, +282, -2679, +318, +653, +206, +433, +673, -272, -199, +426, +115, +323, +278, -898, -730,
+ +21833, +9209, -6007, +12315, -3453, -8357, -2209, -1381, +3075, +220, -3684, +200, +3572, -2831, -2011, -494, +18, -33, -2095, +471, +146, +334, +627, +538, -357, +45, -19, -271, +825, +112, -395, -410,
+ +21223, +7853, -6427, +13903, -3313, -9841, -311, -717, +1106, +600, -2989, -731, +3597, -2074, -2106, -29, +34, -557, -1423, +552, -366, +238, +799, +489, -473, +119, +72, -314, +617, +131, -262, -2,
+ +19960, +7457, -6255, +13164, -2750, -8575, +168, -1541, +524, +795, -2410, -1167, +3370, -1359, -1980, +130, -37, -601, -1271, +321, -134, +240, +366, +573, -360, -39, +508, -76, -10, +76, -84, -39,
+ +18264, +7315, -5697, +12058, -1513, -7912, -155, -1098, -277, +440, -1475, -1163, +2792, -681, -1653, -227, +195, -448, -1526, +168, +244, +191, +5, +420, -167, +267, +536, -17, -142, -216, +12, -120,
+ +14575, +8295, -837, +5766, -2716, -2519, -1691, -1773, +1780, -39, -2463, +993, +2121, -1349, -803, -1187, +196, -324, -1655, +367, -300, -398, +308, +424, +622, +1154, -257, -779, -260, -661, -211, +363,
+ +12640, +8177, -515, +5233, -1426, -2829, -1333, -1356, +968, +95, -1951, +761, +1867, -950, -840, -1080, +224, -469, -1525, +376, -426, -453, +484, +403, +530, +830, -326, -345, -235, -760, -55, +349,
+ +11043, +7882, -148, +5139, -839, -2941, -772, -1231, +563, +130, -1471, +726, +1551, -636, -706, -854, +77, -515, -1177, +230, -480, -289, +444, +438, +558, +438, -292, +64, -149, -711, +13, +439,
+ +9447, +7316, +777, +4790, -766, -2291, -640, -1239, +565, +79, -1184, +670, +1401, -496, -585, -600, -102, -473, -973, +97, -342, -226, +328, +486, +480, +176, -39, +272, -35, -470, -18, +555,
+ +7783, +6813, +1920, +4053, -580, -1299, -807, -1308, +741, +179, -1142, +615, +1308, -404, -320, -524, -263, -345, -755, -10, -289, -134, +224, +482, +338, +206, +285, +426, +141, -378, +51, +463,
+ +6153, +6246, +2936, +3515, -266, -523, -964, -1329, +954, +278, -1137, +467, +1183, -27, -199, -727, -187, -39, -737, -146, -161, -167, +296, +467, +192, +475, +663, +574, +50, -370, +118, +235,
+ +5216, +5838, +3132, +3059, +1, -158, -755, -1165, +778, +326, -848, +373, +928, +178, -109, -801, -20, +105, -796, -199, -47, -58, +361, +449, +343, +811, +846, +385, -219, -311, +33, +114,
+ +4597, +5368, +3150, +2849, +46, +177, -393, -1164, +651, +523, -571, +156, +748, +468, -67, -778, +131, +87, -748, -18, -19, +143, +684, +511, +515, +926, +645, +76, -295, -313, +101, +200,
+ +4160, +4800, +2975, +2879, +214, +184, -345, -878, +720, +433, -576, +142, +805, +499, -153, -717, +261, +104, -688, +154, +246, +527, +763, +288, +509, +781, +226, -156, -160, -171, -28, -42,
+ +4047, +4610, +2554, +2522, +345, +309, -161, -678, +639, +395, -412, +331, +730, +220, -6, -352, +190, +142, -205, +534, +515, +539, +361, +158, +449, +447, +134, -82, -193, -249, -37, -78,
+ +3682, +4202, +2459, +2522, +468, +335, -124, -483, +721, +451, -371, +293, +718, +293, +137, -144, +474, +548, +124, +441, +403, +249, +2, +182, +384, +387, +48, -193, -191, -244, -51, -204,
+ +3418, +3957, +2332, +2407, +560, +275, -15, -147, +764, +317, -331, +555, +678, +300, +712, +391, +554, +506, -31, +194, +199, -93, +90, +358, +159, +198, +0, -186, -221, -249, -146, -268,
+ +3294, +3885, +2237, +2055, +440, +494, +330, -194, +594, +558, -93, +563, +1070, +916, +914, +255, +158, +176, -223, +86, +143, -89, +60, +179, +169, +70, -152, -245, -264, -222, -260, -373,
+ +3036, +3530, +2299, +2284, +540, +283, +250, +364, +784, +421, +481, +1287, +1245, +677, +546, -172, -123, +52, -133, +151, -76, -120, +88, +167, +38, -127, -185, -302, -217, -273, -383, -412,
+ +2951, +3684, +2445, +1883, +210, +636, +675, +547, +1249, +1227, +765, +965, +798, +87, +79, -228, +0, +38, -227, +30, -27, -41, +25, +54, -221, -185, -201, -303, -217, -403, -410, -382,
+ +2949, +3671, +2453, +1862, +191, +765, +1578, +1710, +1229, +774, +414, +255, +396, -103, +37, -66, -268, -80, -64, -3, -34, -116, -164, -71, -281, -295, -229, -302, -271, -378, -433, -340,
+ +2843, +3566, +2453, +2149, +1120, +1466, +1682, +1795, +927, -254, -261, +372, +403, -274, -165, -161, -185, -112, -89, -48, -201, -200, -182, -289, -413, -274, -296, -255, -268, -442, -347, -289,
+ +2563, +4102, +3460, +2646, +1411, +1411, +1574, +983, +12, +28, -27, +70, +225, -244, +2, -163, -265, +10, -151, -167, -100, -187, -351, -373, -357, -211, -194, -232, -258, -357, -289, -290,
+ +3244, +5970, +3949, +1504, +763, +1387, +766, +391, +604, -91, -362, -55, +452, -41, -366, -80, -184, -274, -111, -48, -195, -322, -399, -359, -259, -193, -183, -224, -289, -329, -316, -345,
+ +3784, +6054, +3526, +1790, +390, +352, +1278, +1092, -88, -195, +259, -60, +139, +65, -156, -257, -333, -279, -121, -81, -211, -243, -442, -311, -216, -247, -254, -250, -269, -326, -358, -335,
+ +2822, +5085, +3846, +2068, +436, +648, +1401, +1021, +237, -6, +342, +351, +171, -40, +33, -201, -361, -272, -303, -204, -29, -187, -396, -180, -216, -301, -314, -303, -310, -326, -288, -334,
+ +2707, +4856, +2990, +1363, +947, +1040, +1088, +968, +768, +256, +226, +683, +564, +111, +39, -39, -212, -414, -274, -194, -240, -136, -134, -139, -172, -174, -321, -402, -386, -336, -286, -323,
+ +2574, +4550, +2481, +1104, +1330, +907, +475, +1039, +988, +424, +619, +680, +540, +614, +434, -72, -59, -64, -397, -357, -134, -140, -286, +11, +51, -192, -195, -312, -434, -438, -355, -280,
+ +2422, +4172, +2327, +1283, +1472, +648, +125, +1006, +878, +225, +547, +905, +832, +557, +435, +418, +215, -78, -116, -201, -319, -252, -141, -84, -96, +29, -86, -311, -304, -394, -494, -381,
+ +2457, +4168, +2312, +1257, +1473, +567, -48, +1024, +904, -67, +190, +851, +772, +615, +723, +347, +178, +387, +191, -226, -98, -7, -307, -173, +63, -43, -182, -124, -212, -363, -347, -400,
+ +2478, +4135, +2340, +1561, +1610, +193, -247, +1300, +910, -338, +80, +690, +508, +388, +636, +433, +220, +291, +302, +164, +8, +20, +32, -36, -110, -68, -84, -238, -295, -215, -282, -332,
+ +2625, +4416, +2419, +1461, +1611, +191, -334, +1253, +922, -411, -37, +568, +431, +276, +367, +239, +20, +195, +411, +163, +23, +267, +195, +90, +160, +35, -197, -292, -298, -316, -321, -246,
+ +2856, +4661, +2449, +1599, +1644, -51, -369, +1425, +847, -543, -64, +578, +334, +105, +437, +207, -300, -148, +267, +191, +21, +246, +304, +342, +299, +210, +97, -234, -457, -374, -272, -328,
+ +3188, +5067, +2423, +1526, +1665, -114, -379, +1419, +746, -615, -22, +514, +243, +35, +350, +283, -292, -397, -114, +36, -95, +70, +387, +395, +370, +407, +245, -45, -297, -399, -392, -347,
+ +3392, +5463, +2575, +1426, +1704, -141, -510, +1546, +697, -819, -15, +542, +205, -81, +197, +362, -171, -518, -262, -166, -339, -129, +172, +383, +434, +397, +375, +107, -151, -238, -310, -366,
+ +3778, +5985, +2547, +1224, +1790, -132, -598, +1610, +646, -931, +5, +483, +129, -67, +80, +336, -105, -481, -339, -275, -375, -354, -91, +281, +363, +296, +402, +184, -83, -89, -184, -263,
+ +4238, +6509, +2468, +1078, +1860, -269, -601, +1756, +466, -1068, +75, +520, -26, -200, +61, +301, -74, -470, -390, -308, -413, -437, -213, +89, +251, +155, +226, +157, -56, -78, -126, -115,
+ +4790, +7086, +2291, +968, +1933, -472, -530, +1935, +232, -1157, +164, +537, -118, -309, +1, +239, -85, -391, -352, -407, -462, -398, -205, -72, +171, +88, +45, +57, -238, -128, -20, -65,
+ +5298, +7658, +2182, +874, +2017, -753, -495, +2218, -12, -1312, +266, +578, -182, -440, -94, +196, -122, -393, -301, -436, -512, -440, -113, -135, -14, +189, -69, -157, -336, -293, -129, -64,
+ +5772, +8287, +2119, +702, +2132, -1043, -540, +2501, -218, -1458, +343, +564, -207, -512, -279, +141, -129, -411, -313, -482, -510, -494, -83, -55, -189, +146, -1, -321, -412, -420, -357, -159,
+ +6157, +8940, +2162, +465, +2269, -1223, -654, +2753, -350, -1565, +440, +588, -308, -513, -366, -30, -129, -410, -289, -486, -561, -558, -72, +139, -207, -105, +71, -262, -507, -464, -575, -293,
+ +6742, +9492, +2028, +425, +2287, -1512, -625, +2856, -609, -1494, +499, +541, -410, -555, -338, -271, -243, -365, -236, -522, -637, -613, -89, +199, -78, -218, -130, -145, -572, -543, -605, -493,
+ +7455, +9892, +1818, +673, +2164, -1783, -525, +2878, -875, -1368, +612, +482, -471, -664, -187, -495, -429, -294, -209, -463, -713, -670, -40, +162, -42, -27, -316, -285, -509, -579, -619, -593,
+ +8019, +10193, +1825, +947, +2060, -1894, -617, +2838, -973, -1270, +603, +513, -418, -883, -78, -555, -645, -329, -167, -385, -660, -777, -75, +251, -110, +117, -296, -475, -509, -590, -658, -580,
+ +8489, +10357, +1976, +1266, +2014, -1887, -920, +2788, -1005, -1210, +617, +441, -269, -1020, -165, -487, -784, -575, -78, -287, -605, -795, -271, +464, -154, +23, -163, -501, -600, -692, -661, -559,
+ +9032, +10338, +2002, +1761, +2191, -2067, -1283, +2871, -1173, -1207, +746, +311, -250, -937, -329, -531, -744, -896, -124, -85, -627, -738, -386, +468, +0, -187, -126, -361, -727, -819, -607, -613,
+ +9863, +10089, +1523, +2776, +2578, -2733, -1372, +3074, -1562, -1189, +921, +252, -375, -787, -321, -772, -647, -1026, -380, +85, -536, -747, -275, +305, +98, -159, -216, -317, -747, -851, -594, -682,
+ +10598, +9700, +940, +4275, +3058, -3832, -1123, +3535, -2289, -1266, +1285, +275, -567, -753, -135, -923, -658, -1034, -712, +96, -164, -900, -153, +300, +14, +105, -392, -377, -575, -830, -774, -577,
+ +10877, +9347, +643, +5808, +3527, -5043, -576, +4279, -3492, -1535, +1952, +349, -873, -857, +152, -940, -756, -1006, -1030, -132, +274, -915, -235, +451, -136, +335, -408, -493, -454, -795, -947, -438,
+ +11510, +9866, -518, +5808, +4861, -5268, -966, +4692, -4147, -1854, +2440, +299, -1178, -888, +429, -1109, -919, -824, -1174, -605, +384, -530, -455, +537, -108, +344, -321, -566, -435, -822, -1034, -492,
+ +12635, +10353, -1761, +5074, +6220, -4898, -1390, +4718, -4535, -2049, +2754, +364, -1594, -868, +722, -1229, -1148, -680, -1098, -988, +153, -84, -438, +418, +119, +302, -273, -468, -478, -916, -1048, -631,
+ +13738, +10932, -3039, +4229, +7036, -3993, -1627, +4426, -4684, -2246, +2950, +515, -2021, -897, +929, -1302, -1368, -645, -957, -1207, -291, +233, -188, +154, +373, +357, -257, -270, -569, -1080, -1003, -747,
+ +14744, +11698, -4040, +3066, +7514, -2832, -1645, +3985, -4806, -2328, +2928, +769, -2368, -997, +1104, -1338, -1463, -742, -746, -1258, -738, +270, +219, -27, +460, +565, -183, -98, -674, -1208, -1014, -824,
+ +15662, +12564, -4799, +1712, +7684, -1797, -1303, +3561, -5129, -2181, +2756, +927, -2516, -1207, +1168, -1348, -1484, -914, -576, -1200, -996, -13, +556, +58, +345, +830, -11, -35, -778, -1230, -1098, -956,
+ +16364, +13609, -5416, +358, +7606, -1081, -694, +3364, -5714, -1852, +2574, +824, -2410, -1460, +1028, -1324, -1426, -1134, -453, -1080, -1063, -425, +646, +305, +235, +1058, +210, -50, -832, -1188, -1211, -1112,
+ +17300, +14491, -6249, -381, +7171, -884, +239, +3371, -6504, -1382, +2548, +400, -2128, -1591, +701, -1356, -1209, -1399, -313, -902, -1082, -684, +504, +523, +231, +1360, +397, -162, -777, -1178, -1301, -1239,
+ +19091, +14421, -7538, +120, +6088, -1186, +1567, +3111, -7219, -739, +2539, -295, -1757, -1656, +234, -1423, -1033, -1536, -233, -695, -1129, -780, +293, +569, +268, +1771, +558, -456, -624, -1262, -1421, -1267,
+ +20805, +14336, -8736, +919, +4704, -1493, +2648, +2925, -7561, -327, +2504, -972, -1224, -1900, -205, -1369, -1023, -1413, -247, -538, -1011, -940, +175, +531, +207, +2290, +771, -842, -494, -1328, -1609, -1150,
+ +22109, +14485, -9555, +1595, +3404, -1874, +3400, +2878, -7467, -159, +2320, -1375, -756, -2192, -602, -1235, -971, -1286, -262, -419, -788, -1088, +81, +595, -8, +2708, +1096, -1169, -534, -1286, -1751, -974,
+ +22911, +14859, -9889, +1890, +2262, -2414, +3752, +2934, -7127, -226, +1986, -1630, -415, -2450, -1052, -1037, -826, -1433, -165, -366, -647, -1068, -155, +882, -368, +2615, +1525, -1241, -905, -1146, -1703, -979,
+ +23246, +15363, -9606, +1856, +1322, -3040, +3776, +3099, -6633, -350, +1568, -1819, -102, -2618, -1436, -795, -654, -1756, +41, -319, -654, -746, -459, +1267, -739, +1911, +2006, -927, -1339, -995, -1484, -1027,
+ +23048, +16129, -8809, +1596, +486, -3595, +3405, +3364, -5993, -578, +1227, -2110, +339, -2651, -1697, -632, -515, -2057, +200, -157, -869, -13, -785, +1298, -793, +869, +2114, -162, -1404, -1180, -995, -926,
+ +22809, +16473, -7467, +1280, -304, -4095, +2691, +3770, -5530, -657, +858, -2440, +917, -2540, -1937, -596, -383, -2336, +377, -58, -950, +797, -1346, +1071, -434, -290, +1798, +898, -1234, -1327, -340, -1166,
+ +22286, +16760, -6019, +906, -956, -4847, +1807, +4136, -5332, -671, +435, -2757, +1592, -2484, -2177, -772, -332, -2402, +180, +396, -1147, +952, -1488, +458, +8, -899, +941, +1569, -431, -1371, -331, -1254,
+ +21687, +17121, -4653, +1201, -1531, -5605, +1235, +4224, -4907, -618, +334, -2825, +2340, -2255, -2444, -778, -344, -2120, +138, +691, -1477, +1035, -1281, -255, +720, -853, -198, +2119, +560, -1484, -236, -840,
+ +20812, +17572, -3517, +1604, -1924, -6559, +655, +3983, -4426, -559, +260, -2689, +2858, -2122, -2599, -1006, -245, -1380, -668, +770, -1403, +491, -756, -403, +501, +93, -695, +1167, +1322, -839, -247, -943,
+ +20138, +17539, -2371, +1932, -2101, -7422, -134, +3611, -3810, -413, +186, -2382, +3168, -1970, -3047, -567, -230, -1405, -1029, +419, -1307, +376, -467, -375, +381, +1214, -1001, -412, +2034, -275, -429, -799,
+ +19752, +17051, -1458, +2573, -2383, -8049, -965, +2984, -2716, -235, -326, -1320, +2916, -2172, -2295, -826, -571, -1105, -1712, +61, -637, +159, -683, +667, +232, +865, +68, -1323, +1025, +254, +67, -588,
+ +19313, +16611, -863, +3251, -2597, -8556, -2035, +2815, -1746, -84, -572, -839, +2943, -1918, -2228, -1013, -802, -1378, -1915, +318, -813, +322, -33, +499, +178, +995, +794, -1733, -312, +323, +698, -311,
+ +19431, +15374, -281, +4094, -3296, -8664, -2599, +2170, -226, -29, -1543, +594, +2692, -2283, -1543, -1686, -1307, -903, -1916, -152, -126, +697, -359, +340, +826, +1064, +272, -992, -998, -689, +1129, +142,
+ +19162, +14270, +164, +4902, -4023, -8419, -3080, +1713, +839, +173, -2096, +1066, +2771, -2396, -1584, -2406, -841, -783, -2456, +724, +24, +8, +114, +460, +603, +1330, -23, -639, -845, -1849, +899, +543,
+ +18185, +13295, +1396, +5056, -4976, -6538, -4216, +256, +3477, -142, -3597, +2330, +2565, -2743, -1487, -2543, -786, -568, -2073, +767, -278, -87, +712, +47, +285, +1855, +49, -975, -401, -2019, -109, +720,
+ +18313, +12559, +1145, +3914, -4788, -4611, -4800, -248, +4385, -385, -3737, +2445, +2059, -2542, -1236, -3086, -90, -60, -2227, +678, -343, +170, +589, -167, +444, +1928, +89, -944, -588, -1828, -344, +588,
+ +19047, +11702, -954, +4365, -4894, -3853, -3267, -1533, +4299, +133, -4009, +2113, +2029, -2634, -1305, -2227, -56, -224, -2038, +768, -150, -367, +344, +393, +585, +1413, +142, -763, -845, -1547, -217, +198,
+ +19015, +10464, -2335, +5731, -4481, -4150, -2526, -849, +3280, -472, -3208, +1847, +1902, -2823, -780, -1623, -182, -396, -1924, +1079, -377, -665, +393, +566, +673, +1279, -35, -701, -813, -1353, +32, +44,
+ +18162, +9491, -3043, +7090, -3965, -4906, -1033, -851, +1797, -67, -2783, +1425, +1900, -2370, -665, -1270, -198, -516, -1533, +746, -521, -405, +331, +314, +898, +1359, -339, -718, -601, -1137, +5, +342,
+ +16599, +8667, -2195, +6902, -3696, -3649, -980, -1770, +1920, -12, -2768, +1203, +2094, -1882, -722, -1120, -152, -296, -1570, +398, -363, -288, +171, +327, +917, +1214, -294, -849, -425, -762, -168, +362,
+ +14573, +8453, +257, +4430, -4364, -2407, +102, -220, -223, -831, -1853, +1615, +1202, -2021, +252, -1215, -443, -65, -1454, +368, -312, -727, +373, +216, -411, +849, +338, -186, +129, -916, -295, -195,
+ +12278, +8141, +1428, +3486, -3243, -1248, -493, -561, +165, -592, -1924, +1327, +1449, -1596, +92, -1010, -283, -108, -1213, +238, -312, -594, +290, +150, -236, +853, +318, -36, -85, -842, +20, -4,
+ +9818, +8135, +2487, +2441, -2083, -590, -822, -829, +308, -432, -1752, +1141, +1209, -1118, +28, -831, -297, -203, -900, +149, -415, -552, +316, +48, -76, +666, +250, +139, -159, -658, +207, +196,
+ +8218, +7701, +2637, +2474, -1307, -764, -546, -579, +191, -485, -1350, +993, +1042, -888, +8, -568, -372, -126, -680, -31, -355, -306, +131, -53, +120, +551, +381, +251, -131, -271, +357, +9,
+ +7260, +6952, +2528, +2728, -947, -957, -177, -207, -119, -454, -915, +761, +894, -799, +107, -330, -495, -96, -429, -94, -345, -204, -44, +24, +288, +566, +633, +251, -96, -40, +209, -227,
+ +6313, +6252, +2666, +2793, -629, -891, -32, +101, -184, -315, -717, +492, +887, -524, +110, -285, -415, +113, -262, -316, -185, -37, -118, +319, +459, +666, +731, +113, -104, -55, +52, -322,
+ +5416, +5613, +2827, +2817, -328, -837, +27, +456, -189, -286, -591, +343, +896, -378, +145, -174, -275, +223, -276, -285, +108, +145, +59, +428, +461, +747, +496, -173, -49, +14, -43, -390,
+ +4737, +5252, +2775, +2552, +28, -656, +97, +596, -173, -129, -477, +136, +905, -38, +86, -133, -68, +253, -71, +75, +414, +107, +44, +523, +339, +396, +291, -77, +23, -24, -184, -340,
+ +3981, +4690, +2974, +2705, +128, -674, +190, +863, -75, -188, -396, +171, +925, +95, +102, -7, +257, +567, +231, +228, +237, +47, +2, +204, +229, +330, +243, -63, +38, -31, -271, -262,
+ +3640, +4461, +2925, +2330, +166, -439, +387, +823, -29, -56, -316, +227, +932, +175, +339, +566, +570, +436, +184, +185, -96, -221, +16, +187, +153, +208, +144, +27, +71, -187, -281, -294,
+ +3259, +4171, +2983, +2255, +68, -367, +662, +923, -75, +112, -202, +162, +1330, +741, +514, +484, +402, +355, -62, -284, -156, +5, -119, +24, +146, +186, +148, -37, -32, -267, -323, -308,
+ +3121, +4119, +2899, +1944, +0, -99, +883, +1021, -181, +160, +514, +746, +1264, +473, +424, +352, -23, -31, -118, -264, -167, -97, -185, +192, +98, -115, +91, +11, -209, -322, -297, -412,
+ +3236, +4302, +2624, +1570, +77, +285, +882, +1185, +546, +613, +652, +402, +924, +370, -46, -8, +19, -58, -265, -364, +11, +81, -230, +0, -128, -117, +119, -34, -321, -410, -266, -386,
+ +3390, +4724, +2245, +1203, +58, +908, +2020, +1398, +335, +357, +538, +113, +387, +95, +39, -33, -209, -107, -174, -4, +61, -200, -339, -97, -126, -102, +122, -132, -427, -315, -197, -297,
+ +3432, +4882, +1947, +1109, +1265, +1747, +1687, +1007, +236, +85, +163, -83, +292, +0, -42, -69, -271, +123, +154, -210, -251, -155, -292, -287, -164, +37, -57, -179, -247, -251, -248, -317,
+ +3102, +4702, +2964, +1974, +929, +1541, +1764, +745, -58, -59, +188, -44, +87, -46, -3, +55, +100, +125, -120, -181, -166, -232, -401, -239, -150, -71, +43, -36, -164, -288, -357, -320,
+ +3895, +5905, +2447, +896, +1160, +1573, +1310, +595, -174, -63, +180, +1, +163, -166, +141, +494, +87, -290, -24, -10, -305, -361, -351, -199, -210, +43, +163, +6, -270, -382, -312, -376,
+ +4112, +6381, +2052, +274, +1153, +1396, +1209, +828, +6, -261, +330, +111, +75, +100, +332, +466, -14, -98, -25, -77, -295, -278, -352, -332, -105, +81, +175, -17, -194, -388, -360, -345,
+ +3094, +5773, +3360, +570, +281, +923, +1379, +1273, +83, -226, +437, +376, -9, +55, +501, +519, +211, -84, -46, +41, -165, -351, -289, -252, -244, +17, +144, +53, -154, -278, -318, -363,
+ +2581, +5083, +3748, +1204, +166, +555, +1049, +1251, +301, -211, +397, +598, +127, +67, +436, +384, +437, +173, +39, +52, -182, -179, -150, -288, -292, -4, +118, -12, -206, -178, -213, -333,
+ +2553, +4951, +3531, +1371, +349, +359, +971, +1272, +183, -444, +321, +678, +210, +58, +442, +429, +340, +218, +210, +181, -63, -123, -120, -162, -112, -103, +24, +72, -221, -301, -276, -208,
+ +2666, +4956, +3357, +1461, +481, +249, +878, +1297, +212, -508, +149, +506, +100, +12, +412, +341, +306, +405, +140, +63, +128, -4, -43, -39, -12, -31, +66, +40, -174, -339, -363, -294,
+ +2911, +5170, +3202, +1418, +527, +218, +908, +1324, +135, -544, +154, +493, +75, -267, +194, +281, +179, +422, +266, +64, +20, -96, +137, +155, -18, +190, +177, +50, -98, -282, -367, -378,
+ +3106, +5511, +3157, +1270, +655, +172, +827, +1392, +102, -594, +108, +461, +164, -334, -24, +135, -125, +218, +461, +52, -105, -110, +31, +176, +56, +283, +299, +145, +62, -224, -389, -316,
+ +3368, +5931, +3118, +1145, +758, +78, +765, +1468, +37, -716, +137, +456, +122, -290, -145, +63, -257, -130, +404, +65, -206, -153, -100, +153, +60, +155, +385, +264, +71, -31, -197, -376,
+ +3733, +6455, +3057, +942, +889, +25, +681, +1553, -16, -819, +148, +458, +69, -210, -191, -47, -265, -322, +274, +168, -372, -346, -72, +88, +21, +33, +375, +281, +11, +99, -69, -219,
+ +4188, +7066, +2966, +692, +995, -34, +635, +1650, -187, -887, +236, +436, -43, -228, -100, -139, -354, -381, +96, +266, -305, -583, -157, +39, -38, +7, +204, +218, +59, +5, -47, -109,
+ +4745, +7726, +2803, +458, +1071, -162, +663, +1760, -459, -963, +394, +430, -203, -287, -42, -200, -465, -426, -10, +199, -147, -659, -282, +63, -164, -52, +107, +49, +5, -22, -56, -176,
+ +5294, +8424, +2691, +199, +1075, -351, +721, +1883, -811, -1091, +593, +431, -407, -393, +10, -267, -632, -524, -74, +108, -103, -595, -428, +56, -135, -199, +70, -190, -167, +13, -143, -226,
+ +5863, +9141, +2667, +40, +1053, -544, +868, +2094, -1173, -1177, +878, +498, -546, -486, +104, -257, -732, -597, -152, +93, -39, -474, -388, -65, +22, -142, -51, -184, -372, -49, -91, -264,
+ +6256, +9829, +2894, -163, +970, -781, +878, +2373, -1515, -1407, +1130, +610, -713, -628, +125, -251, -817, -728, -318, +48, +2, -480, -237, -140, -63, +59, -165, -300, -348, -285, -158, -207,
+ +6594, +10537, +3189, -331, +879, -911, +803, +2529, -1666, -1658, +1306, +785, -813, -791, +151, -249, -880, -762, -546, -74, +191, -561, -201, +88, -248, +129, -8, -470, -417, -264, -342, -126,
+ +6838, +11210, +3625, -582, +872, -887, +583, +2487, -1631, -1803, +1272, +974, -838, -899, +105, -254, -971, -754, -648, -415, +301, -345, -394, +287, -167, -70, +230, -446, -660, -259, -391, -167,
+ +7304, +11779, +3694, -565, +931, -973, +428, +2282, -1611, -1824, +1167, +1061, -833, -962, +48, -273, -1134, -738, -667, -707, +131, -22, -389, +150, +155, -244, +197, -185, -827, -453, -344, -269,
+ +8235, +12147, +3165, -179, +1250, -1280, +244, +2247, -1802, -1646, +1035, +1095, -763, -1092, +127, -372, -1162, -865, -623, -801, -184, +121, -30, -44, +247, -32, -42, -15, -686, -727, -402, -227,
+ +9296, +12266, +2226, +788, +1787, -2114, +102, +2511, -2139, -1612, +995, +1052, -666, -1269, +199, -511, -1124, -992, -711, -777, -421, -49, +341, +106, +24, +220, -124, -69, -468, -801, -639, -219,
+ +10147, +12082, +1354, +2462, +2228, -3535, +292, +3116, -2724, -1863, +1269, +952, -737, -1330, +259, -696, -1131, -995, -849, -796, -534, -300, +461, +439, -103, +300, -73, -177, -378, -650, -774, -450,
+ +10810, +11594, +848, +4554, +2308, -5081, +960, +3783, -3595, -2130, +1833, +790, -1017, -1161, +325, -938, -1148, -869, -943, -907, -502, -461, +354, +653, +38, +401, -28, -244, -390, -373, -748, -646,
+ +12469, +11803, -956, +4782, +3328, -5108, +523, +3591, -3808, -2000, +2053, +456, -1328, -944, +308, -1270, -1148, -914, -864, -1036, -476, -486, +86, +849, +201, +318, +26, -162, -496, -299, -684, -555,
+ +14105, +12175, -2678, +4503, +4312, -4564, -150, +3310, -3818, -1885, +2202, +220, -1631, -822, +354, -1654, -1063, -1037, -690, -1076, -553, -275, -262, +847, +478, +306, -28, -32, -461, -290, -612, -344,
+ +15495, +12899, -4263, +3780, +5080, -3530, -900, +2884, -3628, -1827, +2258, +23, -1763, -952, +442, -1975, -1049, -1114, -557, -941, -769, +0, -445, +598, +677, +483, -198, +95, -302, -403, -399, -267,
+ +17119, +13318, -5618, +3045, +5263, -2373, -1298, +2236, -3472, -1545, +2113, -219, -1690, -1270, +432, -2146, -1157, -1068, -494, -762, -890, +68, -297, +184, +742, +729, -384, +229, -161, -524, -141, -308,
+ +18484, +13997, -6862, +2360, +5043, -1327, -1316, +1483, -3224, -1274, +1889, -488, -1425, -1754, +346, -2173, -1331, -893, -514, -607, -886, +7, -57, -56, +526, +1062, -512, +202, +21, -599, -22, -276,
+ +19663, +14809, -7930, +1852, +4472, -629, -944, +742, -2897, -1130, +1684, -715, -1189, -2160, +165, -2109, -1399, -724, -586, -442, -816, -87, +159, -21, +135, +1402, -576, -74, +265, -623, -30, -70,
+ +21117, +15042, -8650, +1664, +3562, -302, -432, +305, -2731, -998, +1478, -896, -1082, -2373, -86, -2000, -1271, -758, -612, -252, -784, -74, +231, +244, -129, +1411, -530, -488, +338, -544, +87, +69,
+ +22154, +15465, -8959, +1402, +2531, -346, +86, +156, -2718, -965, +1298, -1196, -837, -2538, -368, -1716, -1223, -911, -611, -53, -781, -33, +268, +653, -384, +1073, -318, -958, +89, -192, +241, +105,
+ +22859, +15907, -8819, +1234, +1298, -584, +637, +94, -2745, -893, +981, -1474, -344, -2666, -592, -1403, -1232, -1113, -586, +219, -920, +190, +386, +764, -500, +647, -216, -1201, -157, -61, +515, +428,
+ +23325, +16162, -8220, +1233, -271, -831, +1044, +5, -2761, -848, +546, -1645, +393, -2819, -806, -1116, -1381, -1231, -482, +245, -797, +445, +127, +832, -496, +109, -143, -1012, -512, -218, +1023, +635,
+ +23496, +16327, -7279, +1261, -1984, -1154, +1281, -134, -2863, -819, +135, -1617, +1192, -3031, -954, -1076, -1473, -1177, -642, +567, -851, +320, -9, +770, -595, -103, +21, -1077, -317, -427, +637, +1059,
+ +23095, +16684, -5960, +1381, -3467, -1694, +1417, -257, -2996, -671, +48, -1597, +2018, -3064, -1351, -839, -1582, -979, -545, +371, -989, +403, -350, +689, -256, -299, +78, -651, -208, -823, +184, +1358,
+ +23064, +16194, -4345, +1406, -4773, -2459, +1310, -309, -3246, -87, -265, -1329, +2641, -3203, -1669, -828, -1062, -1045, -1017, +328, -1074, +156, -379, +808, -265, -111, +348, -721, -326, -461, -318, +477,
+ +22166, +16308, -2721, +1514, -5503, -3602, +868, +57, -3168, +189, -262, -1102, +3166, -3419, -1892, +19, -1444, -1300, -1087, -50, -1052, +281, -441, +743, +297, +10, -121, -326, +61, -941, -205, -296,
+ +21370, +16041, -1198, +1537, -5866, -4986, +180, +1090, -3147, +120, +47, -771, +2710, -2687, -1727, -510, -1300, -1589, -1417, -44, -786, -13, -172, +1223, -173, +86, +190, -419, +152, -1135, +62, -581,
+ +20588, +15763, -447, +2264, -6363, -6502, +295, +1839, -3313, +733, -314, -780, +3610, -2936, -1825, -471, -1918, -1347, -1285, -340, -634, +490, -62, +635, +28, +549, -117, -722, +817, -1170, -429, +0,
+ +20517, +14351, +399, +2894, -7362, -6720, +201, +2187, -2610, +382, -512, +111, +3192, -2865, -1734, -1281, -1564, -809, -1920, -87, +326, -151, -301, +1085, -74, +249, +48, -597, +811, -904, -810, +141,
+ +19676, +13346, +1269, +2990, -7494, -6742, +83, +2236, -1955, +838, -1854, +980, +3382, -3609, -1607, -1296, -1241, -963, -1499, +307, -189, -170, +133, +680, -312, +475, +115, -499, +603, -657, -632, -513,
+ +18294, +12994, +1651, +2477, -6776, -5594, -1192, +2361, -74, -729, -2110, +2060, +2281, -3521, -924, -1755, -1040, +4, -1831, -24, +218, -146, -194, +523, -88, +412, +148, -369, +547, -584, -520, -749,
+ +18558, +12124, -346, +2881, -6362, -4645, -61, +1182, -164, -263, -2409, +2049, +1834, -3454, -615, -1527, -434, -207, -2100, +563, +264, -774, -78, +638, -64, +370, -41, -65, +677, -906, -609, -386,
+ +17684, +10481, -40, +3472, -6519, -2739, -509, +476, +793, -1229, -2572, +2593, +1477, -3576, +141, -1207, -498, -277, -1926, +798, -90, -893, +128, +624, -265, +466, +195, -122, +568, -901, -565, -323,
+ +16309, +9200, +185, +4082, -5385, -2804, -279, +711, -5, -1374, -2021, +2396, +953, -2774, +531, -1321, -456, -212, -1630, +612, -268, -841, +361, +373, -412, +796, +264, -229, +451, -839, -585, -226,
+ +15570, +11265, +2380, +477, -10208, -3446, +3000, +3275, -500, -1929, -3348, +266, +1652, -1984, +1185, -361, -580, +610, -665, +484, -71, -639, -236, -683, -414, +551, -552, -98, +973, -314, +228, -107,
+ +13108, +10999, +3185, +1281, -8696, -4696, +2113, +2705, +415, -825, -3163, -516, +1161, -1069, +991, -408, -449, +725, -558, +276, +252, -441, -210, -595, -598, +265, -696, +50, +1118, -107, +413, -96,
+ +11345, +10102, +3443, +1763, -7242, -4319, +1504, +1898, +542, -443, -2643, -793, +1114, -726, +553, -274, -403, +642, -397, +112, +267, -217, -281, -580, -486, +53, -590, +202, +993, +105, +363, -159,
+ +9334, +9180, +4026, +1892, -5737, -3666, +628, +1442, +687, -180, -2080, -923, +1012, -562, +272, -128, -344, +546, -210, +22, +313, -34, -350, -508, -403, +18, -266, +291, +786, +197, +233, -195,
+ +7824, +8565, +4449, +1794, -4593, -3175, +141, +1251, +671, +30, -1593, -927, +797, -460, +246, -39, -339, +533, -12, -10, +342, +33, -331, -282, -185, +21, -145, +273, +557, +171, +140, -240,
+ +6337, +7830, +4716, +1909, -3553, -2897, -162, +1081, +702, +211, -1249, -839, +617, -436, +195, +112, -268, +479, +134, +13, +326, +212, -46, -34, -176, -218, -106, +167, +265, +121, +85, -158,
+ +5342, +7157, +4878, +2189, -2904, -2714, -263, +1026, +803, +277, -973, -621, +426, -432, +323, +229, -177, +522, +156, +235, +666, +315, -37, +12, -270, -439, -68, +144, +155, +197, +77, -226,
+ +4764, +6718, +4704, +2043, -2555, -2349, -212, +867, +792, +353, -756, -573, +303, -362, +406, +259, -157, +679, +474, +400, +570, +170, -132, -157, -525, -408, +47, -27, +159, +58, -97, +33,
+ +4181, +6119, +4610, +2150, -2224, -2162, -181, +901, +847, +364, -518, -436, +242, -269, +392, +571, +370, +732, +394, +271, +373, -75, -323, -138, -536, -325, +92, -220, -12, +223, +49, -25,
+ +4015, +5982, +4272, +1824, -2039, -1791, +35, +933, +871, +389, -235, -338, +149, +74, +825, +805, +274, +456, +264, +150, +178, -130, -231, -189, -435, -269, -151, -8, +202, +33, -30, +38,
+ +3935, +5782, +3946, +1507, -1917, -1335, +322, +927, +964, +503, -86, -55, +602, +325, +626, +523, +61, +239, +129, +138, +142, -108, -297, -234, -423, -98, +144, -211, +3, +11, +60, +102,
+ +3902, +5745, +3557, +1311, -1656, -1076, +627, +1068, +893, +711, +517, +29, +272, +228, +356, +318, +27, +184, +167, +139, +51, -157, -345, -161, +13, -101, -238, -186, +13, +17, +21, +148,
+ +3628, +5656, +3399, +1257, -1212, -703, +858, +1219, +1302, +913, +184, -182, +3, -29, +266, +240, +92, +138, +97, +70, +9, -110, -118, +189, -242, -389, -175, -136, -135, -76, +225, -40,
+ +3635, +5628, +3156, +1153, -667, -304, +1151, +1542, +949, +463, +85, -275, -67, -128, +265, +231, +19, +64, +88, +200, -88, +175, +188, -310, -330, -217, -245, -285, -93, -9, -61, +33,
+ +3750, +5695, +2977, +1126, -254, +216, +1220, +1142, +606, +287, +8, -221, -48, -225, +233, +224, -143, +121, +322, +32, +156, +458, -282, -324, -203, -336, -371, -173, -80, -308, +26, +219,
+ +3708, +6006, +3252, +1083, -197, +131, +973, +976, +486, +260, +136, -369, -69, -107, +44, +210, -33, +245, +172, +272, +554, -86, -293, -37, -371, -529, -251, -143, -337, -184, +155, +321,
+ +3944, +6404, +3364, +855, -444, -301, +745, +1177, +555, +245, +158, -421, -186, -49, +127, +143, +129, +193, +83, +689, +383, -278, -109, -102, -393, -521, -225, -363, -322, +85, +221, +118,
+ +3964, +6788, +3552, +597, -676, -626, +588, +1137, +499, +391, +207, -514, -153, +22, +71, +197, +286, -40, +124, +984, +226, -285, +0, -154, -442, -353, -267, -541, -312, +209, +363, -112,
+ +3772, +6899, +3947, +501, -938, -727, +636, +1168, +339, +109, +160, -312, -141, -3, +244, +179, +123, +46, +73, +884, +451, -250, -58, -111, -413, -290, -294, -524, -288, +122, +331, -75,
+ +3462, +6881, +4503, +695, -1202, -904, +655, +1374, +519, -170, -142, -383, -287, +151, +492, +188, +134, +104, -152, +774, +760, -195, -124, +19, -278, -261, -247, -438, -285, +128, +318, -80,
+ +3402, +6923, +4776, +801, -1378, -1083, +663, +1538, +601, -245, -249, -452, -541, -124, +493, +404, +124, +134, -71, +426, +838, +18, -286, -74, -154, -110, -193, -452, -296, +175, +269, -23,
+ +3560, +7157, +4845, +843, -1601, -1247, +802, +1630, +678, -335, -316, -377, -611, -300, +272, +319, +97, +183, +134, +296, +749, +284, -376, -324, -110, -14, -47, -351, -274, +169, +254, +67,
+ +3781, +7519, +5063, +781, -1879, -1426, +862, +1887, +678, -490, -323, -360, -585, -338, +123, +226, -92, -89, +273, +305, +647, +581, -207, -590, -354, -33, +88, -215, -275, +256, +260, +92,
+ +4023, +8013, +5261, +521, -2127, -1536, +905, +2109, +621, -684, -366, -337, -545, -334, +31, +151, -89, -326, +98, +315, +484, +601, +137, -552, -624, -186, +89, -177, -281, +257, +227, +119,
+ +4437, +8671, +5471, +188, -2425, -1778, +1005, +2535, +471, -985, -417, -281, -536, -313, +39, +69, -119, -424, -33, +239, +301, +445, +325, -371, -638, -349, -13, -119, -335, +161, +140, +69,
+ +4952, +9350, +5538, -178, -2758, -2012, +1220, +2888, +279, -1277, -463, -211, -592, -301, +102, -3, -170, -481, -75, +194, +168, +301, +340, -242, -691, -395, -6, -106, -358, +112, +26, -204,
+ +5239, +10282, +5946, -647, -3196, -2227, +1310, +3316, +160, -1681, -491, -174, -595, -373, +170, -45, -294, -440, -174, +125, +127, +78, +330, -124, -648, -478, -149, -83, -175, +23, -84, -361,
+ +5839, +11149, +6004, -1122, -3667, -2325, +1613, +3627, -71, -2066, -430, -100, -638, -410, +250, -60, -422, -436, -166, +116, +55, -74, +317, -60, -558, -474, -197, -174, -156, +173, -146, -406,
+ +6264, +12031, +6260, -1503, -4165, -2511, +1901, +3881, -220, -2442, -428, +50, -706, -495, +321, -10, -559, -492, -145, +113, +44, -260, +229, +45, -481, -381, -266, -204, -218, +219, -114, -429,
+ +6813, +12945, +6569, -1945, -4849, -2783, +2187, +4128, -522, -2950, -444, +204, -809, -654, +274, +57, -695, -599, -243, +84, +38, -470, +11, +64, -398, -293, -252, -329, -253, +97, -54, -527,
+ +7210, +13716, +6921, -1967, -5316, -3089, +2544, +4308, -606, -3304, -484, +501, -832, -729, +300, +116, -725, -556, -280, +70, +98, -513, -156, +85, -225, -237, -53, -373, -183, +50, -70, -428,
+ +7995, +14426, +6885, -1822, -5826, -3511, +3029, +4353, -912, -3621, -593, +764, -830, -920, +357, +120, -838, -534, -310, +43, +63, -482, -430, -53, +50, -227, +88, -309, -218, +114, -168, -425,
+ +8882, +15071, +6410, -1835, -5965, -3674, +3408, +4119, -1227, -3661, -763, +899, -746, -1111, +359, +151, -942, -515, -330, +18, -16, -403, -536, -393, +279, -94, +77, -120, -292, +139, -109, -538,
+ +10567, +15752, +4910, -1936, -5684, -3567, +3669, +3637, -1745, -3454, -929, +846, -521, -1336, +279, +136, -971, -533, -297, -6, -169, -365, -497, -749, +299, +224, -60, +141, -209, -43, +74, -643,
+ +11943, +15860, +3693, -1168, -5343, -4151, +3859, +3672, -2240, -3456, -946, +824, -414, -1484, +211, +82, -987, -499, -174, -99, -273, -362, -415, -899, +70, +599, -127, +237, +12, -204, +166, -634,
+ +13286, +15772, +2438, -128, -4985, -4823, +4009, +3749, -2785, -3502, -799, +697, -412, -1557, +156, -56, -1055, -395, +30, -275, -377, -306, -449, -922, -205, +832, -22, +180, +242, -241, +88, -562,
+ +15204, +16245, +67, +60, -3931, -4644, +3668, +3392, -3153, -3517, -579, +452, -338, -1691, +34, -193, -1068, -348, +257, -295, -574, -273, -592, -758, -403, +758, +278, +181, +290, -131, -88, -539,
+ +17245, +16424, -2121, -12, -3063, -3961, +3235, +2949, -3315, -3590, -360, +311, -301, -1855, +21, -379, -1001, -238, +408, -257, -763, -186, -741, -584, -408, +586, +464, +329, +189, -58, -105, -674,
+ +19118, +17193, -4525, -594, -2040, -2926, +2541, +2436, -3174, -3954, -153, +153, -239, -2083, -35, -538, -893, -103, +477, -125, -1066, -61, -862, -457, -281, +408, +388, +585, +66, -198, +48, -844,
+ +20721, +17776, -6299, -1369, -1441, -1849, +1964, +2056, -2977, -4357, -42, +20, -203, -2214, -95, -625, -746, -20, +462, +11, -1311, +50, -913, -421, -25, +317, +55, +772, +39, -438, +197, -804,
+ +22510, +18391, -7885, -2507, -1142, -610, +1491, +1800, -2820, -4825, -35, -196, -92, -2263, -99, -656, -568, +0, +406, +173, -1495, +186, -1013, -271, +276, +136, -342, +715, +119, -603, +265, -543,
+ +23765, +19077, -8921, -3522, -1277, +188, +1429, +1690, -2770, -5201, -193, -427, +127, -2191, -88, -582, -533, -58, +344, +366, -1556, +193, -996, -85, +266, +23, -631, +431, +300, -554, +231, -344,
+ +24818, +19733, -9528, -4328, -1918, +769, +1689, +1610, -2757, -5522, -511, -645, +586, -2066, -55, -439, -632, -162, +378, +612, -1616, +251, -901, -119, +151, -31, -906, +195, +544, -404, +173, -191,
+ +25941, +20257, -9828, -5006, -3336, +1228, +2252, +1491, -2816, -5884, -1016, -737, +1357, -2027, +76, -409, -894, -119, +476, +718, -1428, +314, -1223, -177, -2, -217, -933, +91, +633, -169, +261, -194,
+ +26806, +20369, -9612, -5428, -4921, +1516, +2696, +1428, -3017, -6053, -1361, -633, +1984, -1980, +130, -617, -894, -5, +427, +963, -1257, -100, -1422, -216, -233, -164, -732, -56, +588, +188, +254, -445,
+ +27209, +20584, -8793, -5847, -6861, +1389, +3245, +1326, -3299, -5756, -1709, -571, +2761, -2008, -124, -571, -812, +84, +639, +855, -1484, -320, -1727, -286, -129, -52, -610, -82, +598, +192, +318, -394,
+ +26893, +21151, -7832, -5915, -8592, +716, +3831, +1044, -3057, -5275, -2082, -435, +3209, -2094, -314, -337, -686, +445, +148, +579, -1361, -677, -1772, -79, -84, -62, -327, -96, +288, +255, +729, -627,
+ +26953, +20649, -6193, -5838, -10705, -129, +4026, +1350, -2673, -4656, -2332, -399, +3477, -2269, -280, +332, -639, -64, -135, +292, -1261, -711, -1610, +23, -62, +135, -367, -196, +342, +254, +838, -600,
+ +26223, +20702, -4717, -5564, -12303, -1452, +4410, +2099, -2420, -4083, -2432, -599, +3438, -2035, +238, +318, -1138, -105, -495, +284, -907, -749, -1436, +173, -78, -80, -176, -33, +172, +164, +1063, -574,
+ +25928, +19969, -3484, -5142, -13936, -2550, +5094, +2717, -2373, -3260, -2725, -1115, +3984, -1704, +8, +193, -1565, -173, -413, +253, -689, -651, -1111, -74, -301, +129, -24, -206, +175, +212, +1049, -581,
+ +25176, +19122, -2331, -4480, -15530, -3096, +5493, +3261, -1783, -2863, -3339, -611, +4094, -2065, +150, -498, -1520, +307, -691, +346, -212, -559, -1329, -184, -92, +42, -36, -161, +240, +170, +921, -543,
+ +24482, +17971, -1386, -4296, -15672, -3521, +5483, +4107, -1927, -2384, -3245, -840, +4078, -2208, -307, -382, -1158, +233, -618, +669, -228, -810, -1084, -112, -313, +49, +102, -187, +256, +76, +933, -523,
+ +23018, +16730, -559, -3502, -15157, -4049, +5380, +4222, -1076, -2064, -4052, -287, +3517, -2565, -43, -296, -1036, +526, -341, +256, -182, -590, -933, -334, -446, +264, +150, -398, +318, +312, +624, -549,
+ +21613, +15388, -81, -2337, -14308, -4400, +4805, +4912, -877, -2367, -3924, -403, +3244, -2585, +155, -320, -674, +881, -904, +291, +164, -705, -883, -429, -425, +443, -109, -465, +713, +169, +331, -368,
+ +19858, +13490, +594, -510, -13594, -4524, +5020, +4279, -755, -2024, -4414, +179, +2842, -2732, +498, -73, -330, +471, -962, +609, +150, -899, -638, -432, -427, +380, -224, -283, +814, +30, +167, -248,
+ +17741, +12322, +1537, +214, -12422, -3675, +4012, +3613, -293, -2292, -3921, +331, +2251, -2515, +892, +37, -642, +510, -768, +582, +10, -855, -357, -540, -530, +491, -271, -331, +960, -122, +114, -172,
+ +16821, +11926, +464, -1705, -11381, -169, +5057, +1525, -1491, -1440, -2645, -359, +2192, -2391, +636, +123, -644, +317, -421, +472, -173, -610, -638, -210, -252, -7, -25, -80, -217, -217, +830, -148,
+ +13657, +11995, +3237, -882, -11164, -2746, +3338, +2610, +688, -1042, -2888, -1082, +1212, -1540, +1161, +190, -818, +635, -355, +124, +274, -342, -515, +151, -872, -436, -4, -321, +327, +309, +783, -46,
+ +11207, +10924, +3943, -82, -8816, -2935, +2399, +2271, +597, -709, -2174, -1111, +823, -991, +937, +143, -694, +585, -236, +50, +377, -218, -303, +163, -792, -362, +105, -251, +214, +380, +633, -19,
+ +9243, +9942, +4245, +657, -6940, -2975, +1760, +1792, +578, -303, -1654, -1098, +644, -655, +690, +159, -542, +528, -131, +56, +430, -13, -221, +212, -470, -319, +51, -319, +111, +335, +494, +43,
+ +7776, +9004, +4362, +1074, -5565, -2771, +1288, +1355, +633, -19, -1266, -995, +487, -456, +486, +214, -418, +456, -9, +92, +463, +193, -7, +266, -379, -438, -88, -360, -112, +272, +545, +29,
+ +6749, +8329, +4226, +1199, -4454, -2378, +955, +1109, +723, +140, -897, -820, +428, -339, +428, +307, -281, +463, +95, +331, +672, +328, +10, +167, -357, -510, -212, -392, -152, +320, +576, +31,
+ +5988, +7654, +4115, +1168, -3765, -2039, +744, +915, +738, +259, -623, -668, +284, -262, +443, +295, -206, +565, +342, +403, +543, +170, -105, +69, -443, -593, -251, -434, -271, +333, +502, -76,
+ +5467, +7251, +3847, +1019, -3109, -1692, +669, +871, +822, +370, -366, -485, +246, -133, +475, +473, +20, +568, +337, +288, +369, +117, -149, +13, -324, -593, -357, -414, -226, +270, +602, +139,
+ +5122, +6973, +3542, +803, -2565, -1390, +715, +946, +894, +463, -171, -291, +235, +81, +633, +446, -49, +345, +309, +241, +200, +133, -77, -8, -323, -573, -353, -474, -46, +494, +363, +16,
+ +4855, +6836, +3247, +531, -2098, -1104, +841, +1094, +883, +578, -75, -122, +402, +26, +454, +321, -151, +130, +276, +269, +118, +152, -61, -115, -199, -507, -538, -84, +76, +24, +184, +126,
+ +4687, +6806, +3020, +381, -1698, -796, +985, +1300, +880, +654, +194, -260, +326, -17, +295, +312, -217, +6, +244, +427, +89, +60, +69, +22, -305, -328, -97, -385, -172, +69, +91, +154,
+ +4632, +6769, +2880, +360, -1378, -630, +1031, +1346, +1008, +602, +156, -415, +53, +92, +208, +253, -265, -94, +301, +315, +94, +118, +153, -110, -60, +84, -557, -570, -137, +42, +28, +66,
+ +4540, +6825, +2991, +442, -1144, -667, +903, +1315, +922, +656, +102, -489, -33, -69, +234, +239, -194, -129, +219, +288, +5, +292, +9, +89, +429, -440, -684, -355, -314, -43, +169, -24,
+ +4566, +7042, +3133, +397, -1091, -629, +698, +1104, +781, +505, +301, -392, -209, -56, +80, +210, -27, -26, +131, +96, +164, +95, +10, +714, +96, -727, -439, -389, -342, +8, +167, -278,
+ +4628, +7376, +3329, +176, -1132, -632, +658, +1097, +468, +307, +275, -395, -11, -63, +41, +226, -104, +83, +213, +65, +61, -40, +255, +815, -180, -624, -369, -423, -195, +109, -11, -411,
+ +4617, +7800, +3586, -62, -1282, -805, +761, +1266, +342, +103, +9, -566, -109, +88, +289, +207, -103, +37, +104, +148, +142, -173, +221, +878, -328, -612, -244, -446, -46, +197, -163, -417,
+ +4660, +8175, +3966, -277, -1581, -951, +885, +1487, +357, +17, -137, -743, -411, +6, +351, +358, +99, +41, +67, +55, +183, -145, +158, +876, -392, -638, -194, -414, +89, +273, -162, -420,
+ +4721, +8662, +4295, -438, -1910, -1208, +1075, +1666, +396, -63, -206, -777, -575, -198, +233, +289, +60, +190, +261, +38, +105, -42, -108, +795, -76, -840, -343, -310, +149, +287, -90, -347,
+ +4872, +9194, +4729, -774, -2386, -1224, +1197, +1899, +429, -347, -151, -739, -726, -230, +86, +165, -114, +11, +383, +94, +154, +195, -392, +530, +269, -869, -518, -280, +55, +315, -14, -367,
+ +5066, +9824, +5269, -1107, -2955, -1313, +1336, +2151, +396, -624, -133, -598, -828, -241, +25, +41, -162, -202, +298, +184, -39, +335, -145, +68, +455, -442, -820, -502, +69, +301, -62, -320,
+ +5153, +10511, +6095, -1484, -3587, -1457, +1423, +2505, +356, -976, -218, -397, -875, -285, +78, -92, -239, -324, +171, +296, -162, +79, +61, -118, +344, +143, -711, -771, -136, +164, +7, -304,
+ +5278, +11274, +7005, -1898, -4347, -1576, +1570, +2874, +318, -1413, -325, -192, -897, -360, +145, -110, -363, -399, +61, +261, +18, -192, -117, -56, -8, +422, -34, -873, -481, +162, -137, -389,
+ +6056, +12428, +7018, -2743, -5016, -1594, +2092, +3133, -74, -1835, -368, -83, -887, -433, +158, -124, -505, -444, +1, +177, +57, -207, -372, -191, -115, +296, +399, -455, -738, -64, -86, -546,
+ +6550, +13417, +7566, -3351, -5855, -1575, +2466, +3360, -263, -2321, -481, +200, -992, -483, +233, -212, -561, -458, -83, +173, +18, -197, -386, -532, -130, +222, +460, +109, -613, -457, -73, -510,
+ +7012, +14309, +8271, -3829, -6827, -1561, +2860, +3524, -456, -2804, -697, +575, -1040, -701, +327, -213, -693, -487, -59, +49, +67, -318, -318, -681, -441, +322, +421, +317, -108, -624, -463, -339,
+ +8016, +15373, +8120, -4424, -7513, -1498, +3500, +3558, -967, -3144, -753, +778, -1014, -874, +372, -263, -697, -566, +8, +39, -65, -293, -390, -676, -607, +208, +558, +311, +172, -238, -863, -535,
+ +8871, +16240, +8062, -4588, -8131, -1637, +4115, +3491, -1345, -3390, -963, +992, -922, -1120, +392, -247, -762, -535, +34, +54, -184, -324, -432, -661, -593, -41, +628, +427, +134, +215, -755, -1041,
+ +9741, +17020, +7673, -4577, -8426, -1999, +4610, +3393, -1757, -3551, -1212, +1114, -850, -1379, +300, -218, -824, -500, +46, +52, -283, -489, -415, -741, -446, -173, +355, +642, +79, +272, -284, -1350,
+ +11312, +17790, +6363, -4799, -8173, -2097, +4973, +3237, -2302, -3658, -1190, +1112, -886, -1482, +185, -249, -754, -451, +116, +102, -440, -579, -427, -793, -304, +9, -28, +635, +235, +100, +113, -1240,
+ +13178, +18484, +4498, -4941, -7591, -1947, +5033, +3047, -2673, -3844, -991, +967, -868, -1595, +107, -286, -640, -361, +165, +232, -672, -530, -499, -772, -195, +286, -298, +389, +407, -34, +288, -927,
+ +15061, +19221, +2299, -5197, -6823, -1696, +4782, +2845, -2872, -4171, -778, +659, -799, -1706, -5, -267, -588, -255, +120, +357, -928, -400, -614, -747, -73, +414, -441, -8, +458, -77, +301, -594,
+ +17417, +19661, -219, -5533, -6027, -1096, +4357, +2667, -3091, -4449, -601, +308, -685, -1718, -14, -283, -463, -238, +123, +408, -1064, -243, -712, -651, +62, +367, -574, -269, +316, -31, +381, -321,
+ +19867, +19942, -2699, -5916, -5419, -357, +3942, +2529, -3314, -4769, -533, -58, -432, -1577, -31, -272, -359, -356, +204, +452, -1089, -118, -778, -497, +50, +184, -641, -439, +102, +121, +489, -150,
+ +22001, +20273, -4928, -6245, -5184, +423, +3656, +2388, -3536, -5191, -499, -409, +124, -1485, -39, -208, -489, -410, +327, +557, -1092, -5, -842, -510, -62, +53, -686, -527, +27, +248, +411, +121,
+ +23867, +20630, -6764, -6611, -5436, +1220, +3584, +2131, -3789, -5664, -426, -579, +849, -1543, +114, -346, -693, -253, +401, +738, -1087, +70, -1208, -570, -76, -89, -681, -321, -83, +141, +498, +304,
+ +25427, +20921, -8048, -7062, -6069, +1883, +3693, +1755, -4142, -5892, -211, -678, +1594, -1605, +126, -548, -678, -24, +394, +981, -1152, -265, -1531, -447, -207, -3, -478, -227, -289, +201, +485, +186,
+ +26670, +20956, -8820, -7362, -6968, +2286, +3960, +1160, -4415, -5482, -257, -596, +2261, -1828, +18, -485, -493, +96, +432, +895, -1493, -446, -1664, -451, +33, +175, -509, -148, -228, -15, +348, +351,
+ +27247, +21029, -9279, -7221, -8185, +2443, +4316, +433, -4111, -5058, -277, -461, +2624, -2136, +9, -68, -471, +173, -51, +659, -1495, -577, -1725, -95, +296, -25, -297, -75, -411, -174, +431, +303,
+ +27901, +20314, -8903, -7183, -9921, +2432, +4704, +385, -3981, -4367, -495, -493, +2857, -2264, +375, +207, -680, -338, -224, +556, -1409, -535, -1535, +66, +227, +14, -233, -136, -399, -267, +410, +269,
+ +27608, +19994, -8273, -6961, -11862, +2111, +5728, +206, -3669, -3624, -949, -749, +3371, -2159, +511, +127, -1428, -250, -334, +461, -1028, -384, -1566, +110, +210, -87, -105, -185, -370, -401, +500, +178,
+ +27622, +18454, -7307, -6733, -13561, +2584, +6219, +128, -3284, -2980, -1630, -394, +3760, -2467, +529, -440, -1518, +12, -480, +602, -588, -563, -1536, +166, +104, -88, -90, -163, -356, -425, +580, -7,
+ +26713, +17270, -6277, -6285, -14362, +2609, +6501, +414, -3111, -2460, -1750, -325, +3747, -2769, +191, -403, -1347, +68, -259, +700, -500, -685, -1381, +215, -121, -47, -21, -142, -291, -475, +627, -31,
+ +24769, +16230, -5111, -5256, -14398, +2104, +6670, +475, -2600, -1910, -2145, -355, +3491, -3153, +320, -230, -1416, +584, -304, +502, -383, -651, -1150, -88, -115, +8, -17, -90, -320, -449, +713, -174,
+ +22530, +14663, -3328, -4140, -13801, +1448, +6058, +1179, -2107, -1892, -2240, -499, +2901, -2827, +364, -277, -887, +650, -524, +392, -96, -669, -1178, -67, -149, -9, +23, -125, -229, -396, +626, -144,
+ +19896, +13154, -1419, -2898, -12708, +438, +5719, +1679, -2070, -1481, -2521, -641, +2755, -2677, +403, +34, -653, +479, -618, +547, -55, -827, -838, -119, -237, +37, -10, -61, -203, -413, +734, -50,
+ +15812, +10165, -3307, -1259, -4293, +3358, +1973, -2111, -1944, +199, +220, -307, +1351, -2192, +64, -117, -1126, +153, -436, +61, -138, -521, -663, +804, -85, +18, +120, -673, -64, -484, -254, +27,
+ +13540, +9962, -1923, -1328, -4062, +2675, +2356, -1429, -1777, +2, -53, -301, +1191, -1815, -25, +30, -864, +65, -256, +68, -137, -483, -700, +634, +28, +18, +256, -496, -125, -392, -252, -65,
+ +11634, +9561, -699, -1265, -3629, +2135, +2473, -897, -1471, -173, -210, -167, +1001, -1415, -33, +172, -615, +54, -77, +97, -91, -392, -628, +503, +183, +59, +265, -359, -148, -297, -278, -94,
+ +10115, +9195, +84, -1190, -3167, +1755, +2452, -457, -1160, -296, -214, -73, +824, -1068, +57, +267, -417, +80, +68, +164, -63, -236, -495, +399, +241, +63, +228, -256, -152, -254, -222, -96,
+ +8972, +8866, +505, -1211, -2723, +1473, +2316, -138, -917, -335, -184, -64, +678, -767, +131, +280, -268, +100, +140, +231, -22, -123, -428, +221, +225, +45, +105, -204, -143, -199, -220, -223,
+ +8143, +8551, +717, -1227, -2288, +1267, +2149, +132, -719, -286, -144, -50, +640, -553, +197, +300, -154, +119, +220, +279, -44, -62, -392, +43, +177, +16, +15, -111, -123, -218, -231, -197,
+ +7519, +8353, +812, -1237, -1913, +1117, +2025, +376, -587, -178, -2, -83, +684, -392, +218, +357, -61, +126, +213, +332, -84, -71, -329, -119, +124, +96, -34, -69, -118, -161, -197, -307,
+ +7138, +8194, +813, -1279, -1576, +1065, +1901, +540, -518, -86, +237, -176, +679, -205, +146, +407, -23, +34, +193, +347, -106, -167, -290, -132, +40, +147, -63, -80, -14, -227, -138, +56,
+ +6765, +8189, +868, -1293, -1277, +1051, +1805, +585, -406, -124, +487, -109, +448, +29, +127, +224, +68, +6, +74, +339, -52, -243, -320, +1, -68, +74, +56, -81, -93, +49, +86, -209,
+ +6619, +8107, +943, -1282, -1022, +1118, +1714, +529, -436, -64, +479, +47, +396, -99, +275, +103, -93, +117, +36, +186, -20, -106, -394, -85, -11, +56, +2, -128, +248, +156, -186, -146,
+ +6506, +8197, +996, -1294, -823, +1179, +1651, +460, -560, -146, +509, -45, +461, -45, +85, +200, -171, -76, +155, +144, -147, -20, -290, -290, -61, +166, -210, +91, +456, -144, -99, -174,
+ +6582, +8378, +972, -1388, -630, +1361, +1678, +372, -631, -288, +431, -32, +347, +59, +235, +84, -171, +10, -18, +188, -18, -105, -290, -206, -27, -83, -59, +442, +120, -134, +100, -328,
+ +6729, +8661, +933, -1675, -529, +1529, +1750, +353, -860, -416, +386, -244, +217, +58, +206, +210, -193, -125, +74, +64, -150, +24, -388, -232, +36, -212, +35, +433, -79, -63, +4, -312,
+ +6890, +9095, +950, -1986, -500, +1683, +1850, +374, -983, -586, +394, -308, -13, -44, +240, +174, -176, +14, +14, +51, -151, -125, -431, -102, +45, -279, +168, +405, -279, -73, +3, -310,
+ +7139, +9634, +937, -2393, -434, +1845, +1940, +402, -1164, -606, +441, -410, -140, -122, +139, +125, -224, -21, +162, +114, -244, -122, -493, -210, +170, -183, +102, +465, -306, -188, -102, -278,
+ +7579, +10152, +809, -2790, -376, +2061, +1958, +319, -1378, -620, +599, -484, -299, -248, +140, +30, -407, -65, +165, +116, -204, -115, -553, -215, +159, -225, +52, +588, -240, -399, -127, -310,
+ +8098, +10747, +572, -3257, -296, +2282, +1951, +145, -1629, -671, +778, -545, -491, -335, +55, -74, -517, -231, +85, +61, -318, -69, -486, -260, +155, -163, -275, +533, +117, -571, -295, -288,
+ +8856, +11416, +228, -3687, -132, +2625, +1937, -64, -1889, -582, +1022, -543, -643, -393, +130, -159, -646, -204, +39, -69, -349, -126, -336, -110, +114, -19, -390, +244, +381, -387, -478, -229,
+ +9699, +12034, -166, -4108, -4, +2964, +1854, -341, -2231, -486, +1257, -561, -826, -509, +158, -201, -807, -277, +87, -284, -418, -203, -354, +140, +75, -7, -344, -105, +372, -51, -654, -293,
+ +10543, +12775, -545, -4511, +88, +3327, +1796, -636, -2510, -452, +1566, -593, -961, -600, +157, -239, -879, -366, +152, -404, -549, -174, -436, +353, +148, -50, -278, -255, +87, +310, -515, -581,
+ +11200, +13601, -758, -4804, +50, +3619, +1817, -936, -2667, -528, +1866, -619, -1077, -659, +152, -290, -948, -410, +136, -381, -707, -103, -513, +487, +275, -90, -256, -300, -184, +365, -57, -808,
+ +11971, +14336, -1048, -4982, -71, +3819, +1799, -1223, -2824, -587, +2067, -657, -1229, -698, +130, -343, -1036, -478, +86, -363, -801, -48, -526, +479, +402, -111, -295, -362, -352, +169, +366, -705,
+ +12952, +14791, -1412, -4962, -193, +3875, +1746, -1433, -2953, -614, +2172, -717, -1346, -744, +115, -409, -1087, -568, +16, -356, -786, -59, -429, +439, +419, -86, -316, -480, -442, -15, +471, -306,
+ +13912, +15283, -1897, -4796, -288, +3732, +1713, -1565, -3031, -703, +2247, -785, -1394, -783, +55, -431, -1126, -661, -50, -311, -721, -96, -299, +422, +338, -39, -314, -612, -519, -71, +297, +99,
+ +14855, +15824, -2739, -4516, -304, +3388, +1722, -1674, -3102, -886, +2277, -893, -1326, -878, -28, -456, -1188, -726, -166, -183, -719, -109, -220, +375, +189, +35, -371, -698, -563, -131, +48, +307,
+ +16338, +16004, -4096, -3971, -182, +3015, +1641, -1812, -3218, -959, +2300, -1061, -1053, -1053, -11, -552, -1253, -711, -212, -61, -765, +9, -306, +360, +92, +64, -446, -677, -521, -329, -53, +380,
+ +18251, +15738, -5808, -3186, -134, +2789, +1385, -1959, -3407, -900, +2346, -1243, -701, -1229, +43, -724, -1268, -588, -226, -65, -699, +24, -533, +533, -56, +37, -377, -633, -576, -478, +14, +228,
+ +20109, +15230, -7463, -2359, -182, +2679, +993, -2134, -3629, -757, +2465, -1466, -282, -1397, +30, -890, -1149, -414, -454, +69, -740, -221, -483, +616, -260, +207, -288, -809, -541, -426, -149, +45,
+ +21818, +14565, -8920, -1528, -324, +2634, +590, -2360, -3741, -407, +2485, -1626, +256, -1680, +36, -834, -978, -443, -529, +76, -986, -153, -548, +694, -157, +334, -410, -839, -327, -605, -328, +75,
+ +23103, +13939, -10069, -742, -746, +2659, +301, -2677, -3587, -100, +2395, -1612, +709, -2069, +297, -673, -1108, -277, -884, +31, -908, -351, -498, +1045, -176, +251, -316, -803, -379, -726, -360, +57,
+ +23945, +13085, -10547, -173, -1474, +2865, +165, -2907, -3400, +226, +2202, -1526, +1023, -2204, +554, -678, -1107, -548, -997, +158, -1090, -304, -261, +1166, -310, +417, -308, -940, -344, -784, -395, +50,
+ +24254, +12118, -10244, -14, -2425, +3265, +309, -3204, -3182, +647, +1733, -1352, +1566, -2480, +734, -600, -1582, -399, -1020, +24, -846, -257, -241, +1202, -199, +373, -345, -1003, -312, -776, -467, +128,
+ +23710, +11519, -9530, -150, -3390, +3856, +551, -3483, -2790, +732, +1250, -842, +1752, -2633, +801, -862, -1583, -318, -1087, +207, -657, -373, -274, +1352, -271, +301, -334, -1032, -203, -866, -432, +236,
+ +22428, +11142, -8405, -495, -4041, +4230, +888, -3448, -2615, +727, +1070, -661, +1947, -2748, +487, -620, -1698, -171, -896, +282, -582, -460, -268, +1324, -317, +161, -147, -1048, -191, -834, -297, +217,
+ +20762, +10556, -6722, -939, -4366, +4259, +1327, -3271, -2441, +887, +519, -254, +1808, -2852, +481, -564, -1534, -32, -625, +157, -458, -456, -349, +1174, -357, +206, -68, -1024, -143, -652, -305, +204,
+ +18483, +10323, -5052, -1231, -4489, +3999, +1699, -2850, -2084, +522, +345, -173, +1484, -2533, +230, -316, -1365, +115, -496, +11, -245, -474, -558, +986, -218, +123, +13, -912, -46, -574, -264, +160,
+ +15151, +10407, -3904, -1083, -1882, +2118, +367, -2185, -1951, +541, +789, -174, +1157, -1491, +303, +11, -942, -141, -277, +14, -417, -306, -402, +620, -260, -26, +127, -616, -290, -452, -405, -110,
+ +12885, +10153, -2447, -1435, -1886, +1994, +820, -1625, -1686, +115, +677, -117, +951, -1123, +70, +151, -655, +6, -99, +32, -248, -339, -518, +467, -154, -64, +222, -439, -239, -376, -360, -168,
+ +11025, +9816, -1374, -1603, -1731, +1726, +1083, -1042, -1489, -152, +594, -120, +851, -782, -35, +259, -349, +25, +24, +164, -206, -275, -534, +286, -59, -104, +181, -299, -204, -314, -276, -259,
+ +9637, +9479, -717, -1704, -1525, +1462, +1204, -626, -1292, -289, +532, -105, +727, -476, -30, +265, -147, +9, +101, +239, -167, -229, -547, +98, -70, -181, +55, -161, -165, -274, -267, -317,
+ +8752, +9178, -333, -1744, -1267, +1297, +1255, -331, -1104, -307, +516, +6, +655, -255, +107, +218, -57, +67, +139, +248, -132, -161, -550, -74, -107, -216, +36, -14, -163, -279, -125, -283,
+ +8141, +9001, -85, -1784, -996, +1205, +1246, -133, -1072, -292, +536, +70, +685, -204, +206, +280, -165, +40, +195, +187, -211, -72, -529, -292, -102, -127, -37, -75, -59, -137, -271, -88,
+ +7821, +8935, +30, -1810, -715, +1265, +1137, -39, -1096, -420, +649, +5, +641, -10, +137, +306, -111, -184, +148, +284, -330, -213, -387, -248, -250, -102, -97, -86, +22, -266, +130, +187,
+ +7807, +9027, -50, -1866, -441, +1451, +1138, -195, -1117, -490, +518, +1, +517, +36, +305, +255, -153, -102, +7, +127, -244, -246, -497, -139, -99, -332, -144, +48, -205, +61, +388, -266,
+ +7882, +9353, -83, -2058, -175, +1671, +1191, -268, -1312, -554, +542, -204, +353, +81, +267, +402, -95, -140, +119, +42, -495, -191, -362, -215, -155, -154, -73, -308, -29, +393, -17, -332,
+ +8308, +9732, -295, -2292, +42, +1933, +1204, -364, -1445, -663, +574, -270, +132, -85, +297, +391, -164, +30, +228, -27, -529, -302, -515, -77, -71, -224, -66, -236, +37, +234, -157, -305,
+ +8910, +10273, -662, -2606, +321, +2117, +1146, -522, -1639, -652, +647, -370, -95, -197, +260, +249, -275, +1, +311, +8, -541, -340, -596, -115, -162, -109, -41, -330, +22, +288, -224, -561,
+ +9704, +10884, -1159, -2877, +618, +2308, +940, -736, -1826, -569, +847, -551, -253, -349, +282, +190, -539, -54, +298, -89, -533, -247, -636, +1, -229, -304, +0, -239, -164, +168, +30, -627,
+ +10728, +11543, -1792, -3052, +930, +2476, +682, -1054, -1977, -418, +1146, -742, -458, -399, +294, +129, -657, -196, +215, -135, -669, -129, -568, +111, -116, -432, -108, -274, -260, +32, +232, -480,
+ +11881, +12254, -2434, -3089, +1164, +2572, +449, -1357, -2085, -231, +1467, -892, -621, -437, +381, +31, -732, -213, +65, -161, -709, -101, -437, +212, -27, -369, -165, -379, -412, -90, +292, -64,
+ +13138, +12911, -3156, -3038, +1198, +2492, +221, -1628, -2211, -103, +1692, -1093, -728, -513, +408, -70, -856, -307, -37, -187, -772, -78, -368, +224, -34, -258, -244, -476, -574, -271, +164, +260,
+ +14397, +13579, -3910, -2827, +1091, +2265, +96, -1784, -2287, -52, +1872, -1249, -736, -567, +402, -117, -956, -409, -93, -132, -795, +4, -347, +214, -84, -123, -282, -545, -622, -487, +75, +387,
+ +15830, +13982, -4898, -2472, +855, +1875, -58, -1917, -2412, -67, +1931, -1394, -673, -678, +358, -220, -1063, -511, -132, -147, -800, +56, -461, +223, -217, -78, -273, -624, -663, -738, +49, +326,
+ +17467, +14082, -6145, -1897, +642, +1483, -285, -1984, -2544, -63, +2082, -1574, -443, -758, +315, -348, -1053, -474, -315, -35, -792, -78, -455, +263, -380, +41, -168, -788, -651, -764, -87, +204,
+ +19205, +13691, -7428, -1121, +470, +1145, -634, -1989, -2737, +205, +2197, -1786, +24, -918, +276, -357, -852, -637, -398, +113, -1061, -13, -469, +246, -296, +209, -220, -910, -450, -820, -365, +209,
+ +20434, +13224, -8549, -341, +181, +828, -923, -2160, -2726, +469, +2160, -1789, +445, -1242, +435, -205, -1000, -575, -650, -4, -1028, -157, -482, +541, -293, +180, -168, -873, -513, -928, -442, +126,
+ +21071, +12404, -8865, +244, -319, +824, -1131, -2243, -2636, +724, +2101, -1684, +726, -1293, +625, -268, -883, -829, -829, +106, -1203, -105, -238, +652, -370, +370, -142, -1017, -532, -885, -493, +33,
+ +20789, +11662, -8363, +333, -912, +1139, -985, -2429, -2493, +1026, +1714, -1379, +1228, -1581, +804, -171, -1256, -633, -926, +10, -904, -125, -209, +782, -255, +313, -208, -993, -502, -824, -526, -6,
+ +19597, +11015, -7149, -55, -1441, +1677, -696, -2554, -2277, +940, +1406, -818, +1246, -1537, +684, -289, -1142, -645, -761, +96, -739, -255, -172, +923, -378, +208, -146, -916, -439, -791, -470, +65,
+ +17572, +10706, -5606, -660, -1779, +2016, -198, -2475, -2231, +834, +1109, -554, +1413, -1692, +462, -70, -1228, -319, -565, +62, -599, -344, -188, +729, -362, +89, -38, -790, -416, -617, -383, -61,
+ +13984, +10255, -4374, -388, +520, +1170, -465, -1651, -1739, +620, +1300, -599, +593, -691, +506, -106, -758, -501, -601, +13, -483, -134, -165, +604, -170, +64, -79, -688, -462, -544, -416, -230,
+ +12759, +10312, -3687, -1356, +269, +1734, +98, -1443, -1893, +26, +1172, -328, +678, -523, +452, +209, -644, -277, -230, -19, -407, -233, -377, +567, -155, -105, +72, -516, -400, -435, -355, -174,
+ +11716, +10426, -3021, -2051, -39, +1840, +529, -1069, -1835, -336, +989, -214, +710, -348, +419, +365, -440, -232, -16, +40, -430, -185, -574, +331, -34, -238, +26, -307, -370, -375, -220, -235,
+ +11134, +10529, -2663, -2372, -80, +1872, +687, -929, -1759, -465, +868, -263, +669, -278, +447, +463, -381, -148, +38, -29, -515, -135, -648, +44, +49, -206, -64, -270, -287, -346, -195, -162,
+ +11075, +10637, -2726, -2396, +319, +2005, +654, -1076, -1801, -428, +898, -371, +394, -170, +406, +444, -275, -101, +119, -98, -685, -259, -554, +18, -62, -104, -68, -278, -240, -444, -157, +31,
+ +11612, +10554, -3128, -2035, +925, +2136, +342, -1322, -1833, -254, +980, -508, +127, -339, +524, +262, -428, +145, +113, -216, -692, -401, -616, +161, -3, -171, -99, -195, -333, -499, -145, +70,
+ +12375, +10683, -3543, -1496, +1375, +1878, -63, -1523, -1716, +99, +1163, -755, -160, -336, +443, +22, -544, +0, +88, -274, -692, -317, -565, +160, -85, -9, -148, -334, -390, -555, -137, +51,
+ +13451, +11028, -4018, -1046, +1271, +1285, -362, -1500, -1496, +592, +1317, -1109, -271, -352, +295, -274, -636, -343, -118, -176, -739, -127, -424, +105, -165, +113, -179, -567, -399, -628, -271, +78,
+ +14734, +11620, -4802, -879, +696, +632, -388, -1350, -1318, +1007, +1423, -1500, -74, -505, -4, -283, -944, -711, -165, -124, -791, +38, -389, +76, -82, +117, -326, -662, -381, -868, -391, +163,
+ +15985, +11631, -5517, -531, +203, +208, -355, -1214, -1189, +1341, +1443, -1616, +268, -744, -62, -254, -1182, -868, -260, -11, -769, +72, -260, +154, +25, +109, -377, -616, -515, -967, -388, +157,
+ +16168, +11376, -5735, -168, +103, +84, -542, -1300, -1254, +1362, +1545, -1557, +422, -670, -104, -248, -1014, -1157, -378, +90, -927, +197, -107, +203, +14, +189, -355, -777, -516, -924, -458, +58,
+ +15468, +10670, -5248, +0, +348, +441, -693, -1492, -1502, +1200, +1468, -1209, +625, -746, +219, -158, -964, -894, -624, +11, -688, +93, -44, +335, -3, +183, -326, -757, -508, -710, -494, -108,
+ +11864, +10339, -3078, -621, +1333, +598, -269, -1143, -1003, +1077, +1244, -765, -16, -194, +146, -60, -510, -758, -332, -71, -718, -16, -15, +315, +287, +251, -356, -886, -747, -549, -54, +217,
+};
- /* HRIR Delays */
- { 12, 12, 13, 14, 14, 14, 13, 12, 11, 10, 10, 10, 11, 12, 13, 14, 15, 15, 16, 16, 16, 15, 15, 14, 13, 12, 11, 10, 9, 8, 8, 8, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 18, 18, 18, 18, 17, 16, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 7, 6, 6, 6, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 19, 20, 20, 20, 20, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 8, 7, 6, 5, 5, 5, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 21, 22, 22, 22, 22, 22, 21, 21, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 6, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 23, 24, 24, 24, 24, 24, 23, 22, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 24, 25, 26, 26, 26, 26, 26, 25, 24, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 6, 5, 4, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 28, 28, 27, 26, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 28, 28, 27, 26, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 24, 25, 26, 26, 26, 26, 26, 25, 24, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 6, 5, 4, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 23, 24, 24, 24, 24, 24, 23, 22, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 21, 22, 22, 22, 22, 22, 21, 21, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 6, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 19, 20, 20, 20, 20, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 8, 7, 6, 5, 5, 5, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 18, 18, 18, 18, 17, 16, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 7, 6, 6, 6, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 16, 16, 16, 15, 15, 14, 13, 12, 11, 10, 9, 8, 8, 8, 8, 8, 9, 10, 11, 12, 13, 14, 14, 14, 13, 12, 11, 10, 10, 10, 11, 12, }
+/* HRIR Delays */
+static const ALubyte defaultDelays[828] =
+{
+ 12, 12, 13, 14, 14, 14, 13, 12, 11, 10, 10, 10, 11, 12, 13, 14, 15, 15, 16, 16, 16, 15, 15, 14, 13, 12, 11, 10, 9, 8, 8, 8, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 18, 18, 18, 18, 17, 16, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 7, 6, 6, 6, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 19, 20, 20, 20, 20, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 8, 7, 6, 5, 5, 5, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 21, 22, 22, 22, 22, 22, 21, 21, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 6, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 23, 24, 24, 24, 24, 24, 23, 22, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 24, 25, 26, 26, 26, 26, 26, 25, 24, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 6,
+ 5, 4, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 28, 28, 27, 26, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 28, 28, 27, 26, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 24, 25, 26, 26, 26, 26, 26, 25, 24, 24, 23, 22, 21, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6
+, 6, 5, 4, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 23, 24, 24, 24, 24, 24, 23, 22, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 21, 22, 22, 22, 22, 22, 21, 21, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 6, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 19, 20, 20, 20, 20, 20, 19, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 8, 7, 6, 5, 5, 5, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 18, 18, 18, 18, 17, 16, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 7, 6, 6, 6, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 16, 16, 16, 15, 15, 14, 13, 12, 11, 10, 9, 8, 8, 8, 8, 8, 9, 10, 11, 12, 13, 14, 14, 14, 13, 12, 11, 10, 10, 10, 11, 12,
+};
+
+/* Default HRTF Definition */
+static const struct Hrtf DefaultHrtf = {
+ 44100, 32, 19, defaultAzCount, defaultEvOffset,
+ defaultCoeffs, defaultDelays, NULL
+};
diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c
index aecf03a5..fab13c0f 100644
--- a/Alc/mixer_c.c
+++ b/Alc/mixer_c.c
@@ -7,12 +7,13 @@
static __inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*RESTRICT Values)[2],
+ const ALuint IrSize,
ALfloat (*RESTRICT Coeffs)[2],
ALfloat (*RESTRICT CoeffStep)[2],
ALfloat left, ALfloat right)
{
ALuint c;
- for(c = 0;c < HRIR_LENGTH;c++)
+ for(c = 0;c < IrSize;c++)
{
const ALuint off = (Offset+c)&HRIR_MASK;
Values[off][0] += Coeffs[c][0] * left;
@@ -23,11 +24,12 @@ static __inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*RESTRICT Values)[2
}
static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2],
+ const ALuint IrSize,
ALfloat (*RESTRICT Coeffs)[2],
ALfloat left, ALfloat right)
{
ALuint c;
- for(c = 0;c < HRIR_LENGTH;c++)
+ for(c = 0;c < IrSize;c++)
{
const ALuint off = (Offset+c)&HRIR_MASK;
Values[off][0] += Coeffs[c][0] * left;
diff --git a/Alc/mixer_inc.c b/Alc/mixer_inc.c
index 359662cc..c3df342e 100644
--- a/Alc/mixer_inc.c
+++ b/Alc/mixer_inc.c
@@ -24,10 +24,12 @@
static __inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*RESTRICT Values)[2],
+ const ALuint irSize,
ALfloat (*RESTRICT Coeffs)[2],
ALfloat (*RESTRICT CoeffStep)[2],
ALfloat left, ALfloat right);
static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2],
+ const ALuint irSize,
ALfloat (*RESTRICT Coeffs)[2],
ALfloat left, ALfloat right);
@@ -38,6 +40,7 @@ void MixDirect_Hrtf(ALsource *Source, ALCdevice *Device, DirectParams *params,
ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize)
{
const ALint *RESTRICT DelayStep = params->Hrtf.DelayStep;
+ const ALuint IrSize = GetHrtfIrSize(Device->Hrtf);
ALfloat (*RESTRICT DryBuffer)[MaxChannels];
ALfloat *RESTRICT ClickRemoval, *RESTRICT PendingClicks;
ALfloat (*RESTRICT CoeffStep)[2] = params->Hrtf.CoeffStep;
@@ -61,7 +64,7 @@ void MixDirect_Hrtf(ALsource *Source, ALCdevice *Device, DirectParams *params,
DryFilter = &params->iirFilter;
pos = 0;
- for(c = 0;c < HRIR_LENGTH;c++)
+ for(c = 0;c < IrSize;c++)
{
Coeffs[c][0] = TargetCoeffs[c][0] - (CoeffStep[c][0]*Counter);
Coeffs[c][1] = TargetCoeffs[c][1] - (CoeffStep[c][1]*Counter);
@@ -102,11 +105,11 @@ void MixDirect_Hrtf(ALsource *Source, ALCdevice *Device, DirectParams *params,
Delay[0] += DelayStep[0];
Delay[1] += DelayStep[1];
- Values[Offset&HRIR_MASK][0] = 0.0f;
- Values[Offset&HRIR_MASK][1] = 0.0f;
+ Values[(Offset+IrSize)&HRIR_MASK][0] = 0.0f;
+ Values[(Offset+IrSize)&HRIR_MASK][1] = 0.0f;
Offset++;
- ApplyCoeffsStep(Offset, Values, Coeffs, CoeffStep, left, right);
+ ApplyCoeffsStep(Offset, Values, IrSize, Coeffs, CoeffStep, left, right);
DryBuffer[OutPos][FrontLeft] += Values[Offset&HRIR_MASK][0];
DryBuffer[OutPos][FrontRight] += Values[Offset&HRIR_MASK][1];
@@ -124,11 +127,11 @@ void MixDirect_Hrtf(ALsource *Source, ALCdevice *Device, DirectParams *params,
left = History[(Offset-Delay[0])&SRC_HISTORY_MASK];
right = History[(Offset-Delay[1])&SRC_HISTORY_MASK];
- Values[Offset&HRIR_MASK][0] = 0.0f;
- Values[Offset&HRIR_MASK][1] = 0.0f;
+ Values[(Offset+IrSize)&HRIR_MASK][0] = 0.0f;
+ Values[(Offset+IrSize)&HRIR_MASK][1] = 0.0f;
Offset++;
- ApplyCoeffs(Offset, Values, Coeffs, left, right);
+ ApplyCoeffs(Offset, Values, IrSize, Coeffs, left, right);
DryBuffer[OutPos][FrontLeft] += Values[Offset&HRIR_MASK][0];
DryBuffer[OutPos][FrontRight] += Values[Offset&HRIR_MASK][1];
diff --git a/Alc/mixer_neon.c b/Alc/mixer_neon.c
index f7a9fed5..0dedb885 100644
--- a/Alc/mixer_neon.c
+++ b/Alc/mixer_neon.c
@@ -11,12 +11,13 @@
static __inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*RESTRICT Values)[2],
+ const ALuint IrSize,
ALfloat (*RESTRICT Coeffs)[2],
ALfloat (*RESTRICT CoeffStep)[2],
ALfloat left, ALfloat right)
{
ALuint c;
- for(c = 0;c < HRIR_LENGTH;c++)
+ for(c = 0;c < IrSize;c++)
{
const ALuint off = (Offset+c)&HRIR_MASK;
Values[off][0] += Coeffs[c][0] * left;
@@ -27,6 +28,7 @@ static __inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*RESTRICT Values)[2
}
static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2],
+ const ALuint IrSize,
ALfloat (*RESTRICT Coeffs)[2],
ALfloat left, ALfloat right)
{
@@ -38,7 +40,7 @@ static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2],
leftright2 = vset_lane_f32(right, leftright2, 1);
leftright4 = vcombine_f32(leftright2, leftright2);
}
- for(c = 0;c < HRIR_LENGTH;c += 2)
+ for(c = 0;c < IrSize;c += 2)
{
const ALuint o0 = (Offset+c)&HRIR_MASK;
const ALuint o1 = (o0+1)&HRIR_MASK;
diff --git a/Alc/mixer_sse.c b/Alc/mixer_sse.c
index 443209bc..27b550e0 100644
--- a/Alc/mixer_sse.c
+++ b/Alc/mixer_sse.c
@@ -14,53 +14,116 @@
static __inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*RESTRICT Values)[2],
+ const ALuint IrSize,
ALfloat (*RESTRICT Coeffs)[2],
ALfloat (*RESTRICT CoeffStep)[2],
ALfloat left, ALfloat right)
{
const __m128 lrlr = { left, right, left, right };
+ __m128 coeffs, deltas, imp0, imp1;
__m128 vals = _mm_setzero_ps();
- __m128 coeffs, coeffstep;
- ALuint c;
- for(c = 0;c < HRIR_LENGTH;c += 2)
+ ALuint i;
+
+ if((Offset&1))
{
- const ALuint o0 = (Offset++)&HRIR_MASK;
- const ALuint o1 = (Offset++)&HRIR_MASK;
+ const ALuint o0 = Offset&HRIR_MASK;
+ const ALuint o1 = (Offset+IrSize-1)&HRIR_MASK;
- coeffs = _mm_load_ps(&Coeffs[c][0]);
+ coeffs = _mm_load_ps(&Coeffs[0][0]);
+ deltas = _mm_load_ps(&CoeffStep[0][0]);
vals = _mm_loadl_pi(vals, (__m64*)&Values[o0][0]);
- vals = _mm_loadh_pi(vals, (__m64*)&Values[o1][0]);
-
- vals = _mm_add_ps(vals, _mm_mul_ps(coeffs, lrlr));
+ imp0 = _mm_mul_ps(lrlr, coeffs);
+ coeffs = _mm_add_ps(coeffs, deltas);
+ vals = _mm_add_ps(imp0, vals);
+ _mm_store_ps(&Coeffs[0][0], coeffs);
_mm_storel_pi((__m64*)&Values[o0][0], vals);
- _mm_storeh_pi((__m64*)&Values[o1][0], vals);
-
- coeffstep = _mm_load_ps(&CoeffStep[c][0]);
- coeffs = _mm_add_ps(coeffs, coeffstep);
- _mm_store_ps(&Coeffs[c][0], coeffs);
+ for(i = 1;i < IrSize-1;i += 2)
+ {
+ const ALuint o2 = (Offset+i)&HRIR_MASK;
+
+ coeffs = _mm_load_ps(&Coeffs[i+1][0]);
+ deltas = _mm_load_ps(&CoeffStep[i+1][0]);
+ vals = _mm_load_ps(&Values[o2][0]);
+ imp1 = _mm_mul_ps(lrlr, coeffs);
+ coeffs = _mm_add_ps(coeffs, deltas);
+ imp0 = _mm_shuffle_ps(imp0, imp1, _MM_SHUFFLE(1, 0, 3, 2));
+ vals = _mm_add_ps(imp0, vals);
+ _mm_store_ps(&Coeffs[i+1][0], coeffs);
+ _mm_store_ps(&Values[o2][0], vals);
+ imp0 = imp1;
+ }
+ vals = _mm_loadl_pi(vals, (__m64*)&Values[o1][0]);
+ imp0 = _mm_movehl_ps(imp0, imp0);
+ vals = _mm_add_ps(imp0, vals);
+ _mm_storel_pi((__m64*)&Values[o1][0], vals);
+ }
+ else
+ {
+ for(i = 0;i < IrSize;i += 2)
+ {
+ const ALuint o = (Offset + i)&HRIR_MASK;
+
+ coeffs = _mm_load_ps(&Coeffs[i][0]);
+ deltas = _mm_load_ps(&CoeffStep[i][0]);
+ vals = _mm_load_ps(&Values[o][0]);
+ imp0 = _mm_mul_ps(lrlr, coeffs);
+ coeffs = _mm_add_ps(coeffs, deltas);
+ vals = _mm_add_ps(imp0, vals);
+ _mm_store_ps(&Coeffs[i][0], coeffs);
+ _mm_store_ps(&Values[o][0], vals);
+ }
}
}
static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2],
+ const ALuint IrSize,
ALfloat (*RESTRICT Coeffs)[2],
ALfloat left, ALfloat right)
{
const __m128 lrlr = { left, right, left, right };
__m128 vals = _mm_setzero_ps();
__m128 coeffs;
- ALuint c;
- for(c = 0;c < HRIR_LENGTH;c += 2)
+ ALuint i;
+
+ if((Offset&1))
{
- const ALuint o0 = (Offset++)&HRIR_MASK;
- const ALuint o1 = (Offset++)&HRIR_MASK;
+ const ALuint o0 = Offset&HRIR_MASK;
+ const ALuint o1 = (Offset+IrSize-1)&HRIR_MASK;
+ __m128 imp0, imp1;
- coeffs = _mm_load_ps(&Coeffs[c][0]);
+ coeffs = _mm_load_ps(&Coeffs[0][0]);
vals = _mm_loadl_pi(vals, (__m64*)&Values[o0][0]);
- vals = _mm_loadh_pi(vals, (__m64*)&Values[o1][0]);
-
- vals = _mm_add_ps(vals, _mm_mul_ps(coeffs, lrlr));
+ imp0 = _mm_mul_ps(lrlr, coeffs);
+ vals = _mm_add_ps(imp0, vals);
_mm_storel_pi((__m64*)&Values[o0][0], vals);
- _mm_storeh_pi((__m64*)&Values[o1][0], vals);
+ for(i = 1;i < IrSize-1;i += 2)
+ {
+ const ALuint o2 = (Offset+i)&HRIR_MASK;
+
+ coeffs = _mm_load_ps(&Coeffs[i+1][0]);
+ vals = _mm_load_ps(&Values[o2][0]);
+ imp1 = _mm_mul_ps(lrlr, coeffs);
+ imp0 = _mm_shuffle_ps(imp0, imp1, _MM_SHUFFLE(1, 0, 3, 2));
+ vals = _mm_add_ps(imp0, vals);
+ _mm_store_ps(&Values[o2][0], vals);
+ imp0 = imp1;
+ }
+ vals = _mm_loadl_pi(vals, (__m64*)&Values[o1][0]);
+ imp0 = _mm_movehl_ps(imp0, imp0);
+ vals = _mm_add_ps(imp0, vals);
+ _mm_storel_pi((__m64*)&Values[o1][0], vals);
+ }
+ else
+ {
+ for(i = 0;i < IrSize;i += 2)
+ {
+ const ALuint o = (Offset + i)&HRIR_MASK;
+
+ coeffs = _mm_load_ps(&Coeffs[i][0]);
+ vals = _mm_load_ps(&Values[o][0]);
+ vals = _mm_add_ps(vals, _mm_mul_ps(lrlr, coeffs));
+ _mm_store_ps(&Values[o][0], vals);
+ }
}
}
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
index b87d3526..e32e2313 100644
--- a/OpenAL32/Include/alMain.h
+++ b/OpenAL32/Include/alMain.h
@@ -761,15 +761,15 @@ void SetDefaultWFXChannelOrder(ALCdevice *device);
const ALCchar *DevFmtTypeString(enum DevFmtType type);
const ALCchar *DevFmtChannelsString(enum DevFmtChannels chans);
-#define HRIR_BITS (5)
+#define HRIR_BITS (7)
#define HRIR_LENGTH (1<<HRIR_BITS)
#define HRIR_MASK (HRIR_LENGTH-1)
#define HRTFDELAY_BITS (20)
#define HRTFDELAY_FRACONE (1<<HRTFDELAY_BITS)
#define HRTFDELAY_MASK (HRTFDELAY_FRACONE-1)
-void InitHrtf(void);
-void FreeHrtf(void);
const struct Hrtf *GetHrtf(ALCdevice *device);
+void FreeHrtfs(void);
+ALuint GetHrtfIrSize (const struct Hrtf *Hrtf);
ALfloat CalcHrtfDelta(ALfloat oldGain, ALfloat newGain, const ALfloat olddir[3], const ALfloat newdir[3]);
void GetLerpedHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat gain, ALfloat (*coeffs)[2], ALuint *delays);
ALuint GetMovingHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat gain, ALfloat delta, ALint counter, ALfloat (*coeffs)[2], ALuint *delays, ALfloat (*coeffStep)[2], ALint *delayStep);
diff --git a/hrtf.txt b/hrtf.txt
index e318af00..f0f0d073 100644
--- a/hrtf.txt
+++ b/hrtf.txt
@@ -12,9 +12,9 @@ placement of sounds, making it seem as though they are coming from all around,
including above and below the listener, instead of just to the front, back, and
sides.
-The built-in data set is based on the KEMAR HRTF diffuse data provided by MIT,
-which can be found at <http://sound.media.mit.edu/resources/KEMAR.html>. It's
-only available when using 44100hz playback.
+The built-in data set is based on the KEMAR HRTF data provided by MIT, which
+can be found at <http://sound.media.mit.edu/resources/KEMAR.html>. It's only
+available when using 44100hz playback.
External HRTF Data Sets
@@ -26,68 +26,48 @@ own data sets, which could be better suited for their heads, or to work with
stereo speakers instead of headphones, or to support more playback sample
rates, for example.
-The file format for the data sets is specified below. It uses little-endian
-byte order. Certain data fields are restricted to specific values (these
-restriction may be lifted in future versions of the lib).
+The file format is specified below. It uses little-endian byte order.
==
-ALchar magic[8] = "MinPHR00";
+ALchar magic[8] = "MinPHR01";
ALuint sampleRate;
-ALushort hrirCount; /* Required value: 828 */
-ALushort hrirSize; /* Required value: 32 */
-ALubyte evCount; /* Required value: 19 */
+ALushort hrirSize; /* Can be 8 to 128. */
+ALubyte evCount; /* Can be 5 to 128. */
-ALushort evOffset[evCount]; /* Required values:
- { 0, 1, 13, 37, 73, 118, 174, 234, 306, 378, 450, 522, 594, 654, 710, 755,
- 791, 815, 827 } */
+ALushort azCount[evCount]; /* Each can be 1 to 128. */
ALshort coefficients[hrirCount][hrirSize];
-ALubyte delays[hrirCount]; /* Element values must not exceed 127 */
+ALubyte delays[hrirCount]; /* Each can be 0 to 63. */
==
The data is described as thus:
-The file first starts with the 8-byte marker, "MinPHR00", to identify it as an
+The file first starts with the 8-byte marker, "MinPHR01", to identify it as an
HRTF data set. This is followed by an unsigned 32-bit integer, specifying the
sample rate the data set is designed for (OpenAL Soft will not use it if the
output device's playback rate doesn't match).
-Afterward, an unsigned 16-bit integer specifies the total number of HRIR sets
-(each HRIR set is a collection of impulse responses forming the coefficients
-for a convolution filter). The next unsigned 16-bit integer specifies how many
-samples are in each HRIR set (the number of coefficients in the filter). The
-following unsigned 8-bit integer specifies the number of elevations used by the
-data set. The elevations start at the bottom, and increment upwards.
+Afterward, an unsigned 16-bit integer specifies how many sample points (or
+finite impulse response filter coefficients) make up each HRIR.
-Following this is an array of unsigned 16-bit integers, one for each elevation
-which specifies the index offset to the start of the HRIR sets for each given
-elevation (the number of HRIR sets at each elevation is infered by the offset
-to the next elevation, or by the total count for the last elevation).
+The following unsigned 8-bit integer specifies the number of elevations used
+by the data set. The elevations start at the bottom (-90 degrees), and
+increment upwards. Following this is an array of unsigned 16-bit integers, one
+for each elevation which specifies the number of azimuths (and thus HRIRs) that
+make up each elevation. Azimuths start clockwise from the front, constructing
+a full circle for the left ear only. The right ear uses the same HRIRs but in
+reverse (ie, left = angle, right = 360-angle).
The actual coefficients follow. Each coefficient is a signed 16-bit sample,
-with each HRIR set being a consecutive number of samples. For each elevation,
-the HRIR sets first start with a neutral "in-front" set (that is, one that is
-applied equally to the left and right outputs). After this, the sets follow a
-clockwise pattern, constructing a full circle for the left ear only. The right
-ear uses the same sets but in reverse (ie, left = angle, right = 360-angle).
-
-After the coefficients is an array of unsigned 8-bit delay values, one for each
-HRIR set. This is the delay, in samples, after recieving an input sample before
-before it's added in to the convolution filter that the corresponding HRIR set
-operates on and gets heard.
-
-
-Note that the HRTF data is expected to be minimum-phase reconstructed. The
-time delays are handled by OpenAL Soft according to the specified delay[]
-values, and afterward the samples are fed into the convolution filter using the
-corresponding coefficients. This allows for less processing by using a shorter
-convolution filter, as it skips the first coefficients that do little more than
-cause a timed delay, as well as the tailing coefficients that are used to
-equalize the length of all the sets and contribute nothing.
-
-For reference, the built-in data set uses a 32-sample convolution filter while
+with each HRIR being a consecutive number of sample points. The HRIRs must be
+minimum-phase. This allows the use of a smaller filter length, reducing
+computation. For reference, the built-in data set uses a 32-point filter while
even the smallest data set provided by MIT used a 128-sample filter (a 4x
reduction by applying minimum-phase reconstruction). Theoretically, one could
-further reduce the minimum-phase version down to a 16-sample convolution filter
-with little quality loss.
+further reduce the minimum-phase version down to a 16-point filter with only a
+small reduction in quality.
+
+After the coefficients is an array of unsigned 8-bit delay values, one for
+each HRIR. This is the propagation delay (in samples) a signal must wait before
+being convolved with the corresponding minimum-phase HRIR filter.
diff --git a/utils/makehrtf.c b/utils/makehrtf.c
index 9f0a5d95..08861fb8 100644
--- a/utils/makehrtf.c
+++ b/utils/makehrtf.c
@@ -1,571 +1,1734 @@
-/**
+/*
* HRTF utility for producing and demonstrating the process of creating an
* OpenAL Soft compatible HRIR data set.
*
- * It can currently make use of the 44.1 KHz diffuse and compact KEMAR HRIRs
- * provided by MIT at:
+ * Copyright (C) 2011-2012 Christopher Fitzgerald
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Or visit: http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ *
+ * --------------------------------------------------------------------------
+ *
+ * A big thanks goes out to all those whose work done in the field of
+ * binaural sound synthesis using measured HRTFs makes this utility and the
+ * OpenAL Soft implementation possible.
+ *
+ * The algorithm for diffuse-field equalization was adapted from the work
+ * done by Rio Emmanuel and Larcher Veronique of IRCAM and Bill Gardner of
+ * MIT Media Laboratory. It operates as follows:
+ *
+ * 1. Take the FFT of each HRIR and only keep the magnitude responses.
+ * 2. Calculate the diffuse-field power-average of all HRIRs weighted by
+ * their contribution to the total surface area covered by their
+ * measurement.
+ * 3. Take the diffuse-field average and limit its magnitude range.
+ * 4. Equalize the responses by using the inverse of the diffuse-field
+ * average.
+ * 5. Reconstruct the minimum-phase responses.
+ * 5. Zero the DC component.
+ * 6. IFFT the result and truncate to the desired-length minimum-phase FIR.
+ *
+ * The spherical head algorithm for calculating propagation delay was adapted
+ * from the paper:
+ *
+ * Modeling Interaural Time Difference Assuming a Spherical Head
+ * Joel David Miller
+ * Music 150, Musical Acoustics, Stanford University
+ * December 2, 2001
*
- * http://sound.media.mit.edu/resources/KEMAR.html
*/
#include <stdio.h>
#include <stdlib.h>
-#include <math.h>
+#include <stdarg.h>
#include <string.h>
+#include <ctype.h>
+#include <math.h>
+
+// Needed for 64-bit unsigned integer.
+#include "config.h"
+// Rely (if naively) on OpenAL's header for the types used for serialization.
#include "AL/al.h"
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
-#ifdef _MSC_VER
-static double round(double val)
-{
- if(val < 0.0)
- return ceil(val - 0.5);
- return floor(val + 0.5);
-}
-#endif
+// The epsilon used to maintain signal stability.
+#define EPSILON (1e-15)
+
+// Constants for accessing the token reader's ring buffer.
+#define TR_RING_BITS (16)
+#define TR_RING_SIZE (1 << TR_RING_BITS)
+#define TR_RING_MASK (TR_RING_SIZE - 1)
+
+// The token reader's load interval in bytes.
+#define TR_LOAD_SIZE (TR_RING_SIZE >> 2)
+
+// The maximum identifier length used when processing the data set
+// definition.
+#define MAX_IDENT_LEN (16)
+
+// The maximum path length used when processing filenames.
+#define MAX_PATH_LEN (256)
+
+// The limits for the sample 'rate' metric in the data set definition.
+#define MIN_RATE (32000)
+#define MAX_RATE (96000)
+
+// The limits for the HRIR 'points' metric in the data set definition.
+#define MIN_POINTS (16)
+#define MAX_POINTS (8192)
+
+// The limits to the number of 'azimuths' listed in the data set definition.
+#define MIN_EV_COUNT (5)
+#define MAX_EV_COUNT (128)
+
+// The limits for each of the 'azimuths' listed in the data set definition.
+#define MIN_AZ_COUNT (1)
+#define MAX_AZ_COUNT (128)
+
+// The limits for the listener's head 'radius' in the data set definition.
+#define MIN_RADIUS (0.05)
+#define MAX_RADIUS (0.15)
+
+// The limits for the 'distance' from source to listener in the definition
+// file.
+#define MIN_DISTANCE (0.5)
+#define MAX_DISTANCE (2.5)
+
+// The maximum number of channels that can be addressed for a WAVE file
+// source listed in the data set definition.
+#define MAX_WAVE_CHANNELS (65535)
+
+// The limits to the byte size for a binary source listed in the definition
+// file.
+#define MIN_BIN_SIZE (2)
+#define MAX_BIN_SIZE (4)
+
+// The minimum number of significant bits for binary sources listed in the
+// data set definition. The maximum is calculated from the byte size.
+#define MIN_BIN_BITS (16)
+
+// The limits to the number of significant bits for an ASCII source listed in
+// the data set definition.
+#define MIN_ASCII_BITS (16)
+#define MAX_ASCII_BITS (32)
+
+// The limits to the FFT window size override on the command line.
+#define MIN_FFTSIZE (512)
+#define MAX_FFTSIZE (16384)
+
+// The limits to the equalization range limit on the command line.
+#define MIN_LIMIT (2.0)
+#define MAX_LIMIT (120.0)
+
+// The limits to the truncation window size on the command line.
+#define MIN_TRUNCSIZE (8)
+#define MAX_TRUNCSIZE (128)
+
+// The truncation window size must be a multiple of the below value to allow
+// for vectorized convolution.
+#define MOD_TRUNCSIZE (8)
+
+// The defaults for the command line options.
+#define DEFAULT_EQUALIZE (1)
+#define DEFAULT_SURFACE (1)
+#define DEFAULT_LIMIT (24.0)
+#define DEFAULT_TRUNCSIZE (32)
+
+// The four-character-codes for RIFF/RIFX WAVE file chunks.
+#define FOURCC_RIFF (0x46464952) // 'RIFF'
+#define FOURCC_RIFX (0x58464952) // 'RIFX'
+#define FOURCC_WAVE (0x45564157) // 'WAVE'
+#define FOURCC_FMT (0x20746D66) // 'fmt '
+#define FOURCC_DATA (0x61746164) // 'data'
+#define FOURCC_LIST (0x5453494C) // 'LIST'
+#define FOURCC_WAVL (0x6C766177) // 'wavl'
+#define FOURCC_SLNT (0x746E6C73) // 'slnt'
+
+// The supported wave formats.
+#define WAVE_FORMAT_PCM (0x0001)
+#define WAVE_FORMAT_IEEE_FLOAT (0x0003)
+#define WAVE_FORMAT_EXTENSIBLE (0xFFFE)
+
+// The maximum propagation delay value supported by OpenAL Soft.
+#define MAX_HRTD (63.0)
-// The sample rate of the MIT HRIR data sets.
-#define MIT_IR_RATE (44100)
+// The OpenAL Soft HRTF format marker. It stands for minimum-phase head
+// response protocol 01.
+#define MHR_FORMAT ("MinPHR01")
+
+// Byte order for the serialization routines.
+enum ByteOrderT {
+ BO_NONE = 0,
+ BO_LITTLE ,
+ BO_BIG
+};
-// The total number of used impulse responses from the MIT HRIR data sets.
-#define MIT_IR_COUNT (828)
+// Source format for the references listed in the data set definition.
+enum SourceFormatT {
+ SF_NONE = 0,
+ SF_WAVE , // RIFF/RIFX WAVE file.
+ SF_BIN_LE , // Little-endian binary file.
+ SF_BIN_BE , // Big-endian binary file.
+ SF_ASCII // ASCII text file.
+};
-// The size (in samples) of each HRIR in the MIT data sets.
-#define MIT_IR_SIZE (128)
+// Element types for the references listed in the data set definition.
+enum ElementTypeT {
+ ET_NONE = 0,
+ ET_INT , // Integer elements.
+ ET_FP // Floating-point elements.
+};
-// The total number of elevations given a step of 10 degrees.
-#define MIT_EV_COUNT (19)
+// Desired output format from the command line.
+enum OutputFormatT {
+ OF_NONE = 0,
+ OF_MHR , // OpenAL Soft MHR data set file.
+ OF_TABLE // OpenAL Soft built-in table file (used when compiling).
+};
-// The first elevation that the MIT data sets have HRIRs for.
-#define MIT_EV_START (5)
+// Unsigned integer type.
+typedef unsigned int uint;
-// The head radius (in meters) used by the MIT data sets.
-#define MIT_RADIUS (0.09f)
+// Serialization types. The trailing digit indicates the number of bytes.
+typedef ALubyte uint1;
-// The source to listener distance (in meters) used by the MIT data sets.
-#define MIT_DISTANCE (1.4f)
+typedef ALint int4;
+typedef ALuint uint4;
-// The resulting size (in samples) of a mininum-phase reconstructed HRIR.
-#define MIN_IR_SIZE (32)
+#if defined (HAVE_STDINT_H)
+#include <stdint.h>
-// The size (in samples) of the real cepstrum used in reconstruction. This
-// needs to be large enough to reduce inaccuracy.
-#define CEP_SIZE (8192)
+typedef uint64_t uint8;
+#elif defined (HAVE___INT64)
+typedef unsigned __int64 uint8;
+#elif (SIZEOF_LONG == 8)
+typedef unsigned long uint8;
+#elif (SIZEOF_LONG_LONG == 8)
+typedef unsigned long long uint8;
+#endif
-// The OpenAL Soft HRTF format marker. It stands for minimum-phase head
-// response protocol 00.
-#define MHR_FORMAT ("MinPHR00")
+typedef enum ByteOrderT ByteOrderT;
+typedef enum SourceFormatT SourceFormatT;
+typedef enum ElementTypeT ElementTypeT;
+typedef enum OutputFormatT OutputFormatT;
-typedef struct ComplexT ComplexT;
+typedef struct TokenReaderT TokenReaderT;
+typedef struct SourceRefT SourceRefT;
typedef struct HrirDataT HrirDataT;
-// A complex number type.
-struct ComplexT {
- float mVec [2];
+// Token reader state for parsing the data set definition.
+struct TokenReaderT {
+ FILE * mFile;
+ const char * mName;
+ uint mLine,
+ mColumn;
+ char mRing [TR_RING_SIZE];
+ size_t mIn,
+ mOut;
};
-// The HRIR data definition. This can be used to add support for new HRIR
-// sources in the future.
+// Source reference state used when loading sources.
+struct SourceRefT {
+ SourceFormatT mFormat;
+ ElementTypeT mType;
+ uint mSize;
+ int mBits;
+ uint mChannel,
+ mSkip,
+ mOffset;
+ char mPath [MAX_PATH_LEN + 1];
+};
+
+// The HRIR metrics and data set used when loading, processing, and storing
+// the resulting HRTF.
struct HrirDataT {
- int mIrRate,
- mIrCount,
- mIrSize,
- mEvCount,
- mEvStart;
- const int * mEvOffset,
- * mAzCount;
- float mRadius,
+ uint mIrRate,
+ mIrCount;
+ size_t mIrSize,
+ mIrPoints,
+ mFftSize;
+ uint mEvCount,
+ mEvStart,
+ mAzCount [MAX_EV_COUNT],
+ mEvOffset [MAX_EV_COUNT];
+ double mRadius,
mDistance,
* mHrirs,
* mHrtds,
mMaxHrtd;
};
-// The linear index of the first HRIR for each elevation of the MIT data set.
-static const int MIT_EV_OFFSET [MIT_EV_COUNT] = {
- 0, 1, 13, 37, 73, 118, 174, 234, 306, 378, 450, 522, 594, 654, 710, 755, 791, 815, 827
-},
+/* Token reader routines for parsing text files. Whitespace is not
+ * significant. It can process tokens as identifiers, numbers (integer and
+ * floating-point), strings, and operators. Strings must be encapsulated by
+ * double-quotes and cannot span multiple lines.
+ */
-// The count of distinct azimuth steps for each elevation in the MIT data
-// set.
- MIT_AZ_COUNT [MIT_EV_COUNT] = {
- 1, 12, 24, 36, 45, 56, 60, 72, 72, 72, 72, 72, 60, 56, 45, 36, 24, 12, 1
-};
+// Setup the reader on the given file. The filename can be NULL if no error
+// output is desired.
+static void TrSetup (FILE * fp, const char * filename, TokenReaderT * tr) {
+ const char * name = NULL;
+ char ch;
+
+ tr -> mFile = fp;
+ name = filename;
+ // If a filename was given, store a pointer to the base name.
+ if (filename != NULL) {
+ while ((ch = (* filename)) != '\0') {
+ if ((ch == '/') || (ch == '\\'))
+ name = filename + 1;
+ filename ++;
+ }
+ }
+ tr -> mName = name;
+ tr -> mLine = 1;
+ tr -> mColumn = 1;
+ tr -> mIn = 0;
+ tr -> mOut = 0;
+}
-// Performs a forward Fast Fourier Transform.
-static void FftProc (int n, const ComplexT * fftIn, ComplexT * fftOut) {
- int m2, rk, k, m;
- float a, b;
- int i;
- float wx, wy;
- int j, km2;
- float tx, ty, wyd;
-
- // Data copy and bit-reversal ordering.
- m2 = (n >> 1);
- rk = 0;
- for (k = 0; k < n; k ++) {
- fftOut [rk] . mVec [0] = fftIn [k] . mVec [0];
- fftOut [rk] . mVec [1] = fftIn [k] . mVec [1];
- if (k < (n - 1)) {
- m = m2;
- while (rk >= m) {
- rk -= m;
- m >>= 1;
- }
- rk += m;
- }
+// Prime the reader's ring buffer, and return a result indicating that there
+// is text to process.
+static int TrLoad (TokenReaderT * tr) {
+ size_t toLoad, in, count;
+
+ toLoad = TR_RING_SIZE - (tr -> mIn - tr -> mOut);
+ if ((toLoad >= TR_LOAD_SIZE) && (! feof (tr -> mFile))) {
+ // Load TR_LOAD_SIZE (or less if at the end of the file) per read.
+ toLoad = TR_LOAD_SIZE;
+ in = tr -> mIn & TR_RING_MASK;
+ count = TR_RING_SIZE - in;
+ if (count < toLoad) {
+ tr -> mIn += fread (& tr -> mRing [in], 1, count, tr -> mFile);
+ tr -> mIn += fread (& tr -> mRing [0], 1, toLoad - count, tr -> mFile);
+ } else {
+ tr -> mIn += fread (& tr -> mRing [in], 1, toLoad, tr -> mFile);
+ }
+ if (tr -> mOut >= TR_RING_SIZE) {
+ tr -> mOut -= TR_RING_SIZE;
+ tr -> mIn -= TR_RING_SIZE;
+ }
+ }
+ if (tr -> mIn > tr -> mOut)
+ return (1);
+ return (0);
+}
+
+// Error display routine. Only displays when the base name is not NULL.
+static void TrErrorVA (const TokenReaderT * tr, uint line, uint column, const char * format, va_list argPtr) {
+ if (tr -> mName != NULL) {
+ fprintf (stderr, "Error (%s:%d:%d): ", tr -> mName, line, column);
+ vfprintf (stderr, format, argPtr);
+ }
+}
+
+// Used to display an error at a saved line/column.
+static void TrErrorAt (const TokenReaderT * tr, uint line, uint column, const char * format, ...) {
+ va_list argPtr;
+
+ va_start (argPtr, format);
+ TrErrorVA (tr, line, column, format, argPtr);
+ va_end (argPtr);
+}
+
+// Used to display an error at the current line/column.
+static void TrError (const TokenReaderT * tr, const char * format, ...) {
+ va_list argPtr;
+
+ va_start (argPtr, format);
+ TrErrorVA (tr, tr -> mLine, tr -> mColumn, format, argPtr);
+ va_end (argPtr);
+}
+
+// Skips to the next line.
+static void TrSkipLine (TokenReaderT * tr) {
+ char ch;
+
+ while (TrLoad (tr)) {
+ ch = tr -> mRing [tr -> mOut & TR_RING_MASK];
+ tr -> mOut ++;
+ if (ch == '\n') {
+ tr -> mLine ++;
+ tr -> mColumn = 1;
+ break;
+ }
+ tr -> mColumn ++;
+ }
+}
+
+// Skips to the next token.
+static int TrSkipWhitespace (TokenReaderT * tr) {
+ char ch;
+
+ while (TrLoad (tr)) {
+ ch = tr -> mRing [tr -> mOut & TR_RING_MASK];
+ if (isspace (ch)) {
+ tr -> mOut ++;
+ if (ch == '\n') {
+ tr -> mLine ++;
+ tr -> mColumn = 1;
+ } else {
+ tr -> mColumn ++;
+ }
+ } else if (ch == '#') {
+ TrSkipLine (tr);
+ } else {
+ return (1);
+ }
+ }
+ return (0);
+}
+
+// Get the line and/or column of the next token (or the end of input).
+static void TrIndication (TokenReaderT * tr, uint * line, uint * column) {
+ TrSkipWhitespace (tr);
+ if (line != NULL)
+ (* line) = tr -> mLine;
+ if (column != NULL)
+ (* column) = tr -> mColumn;
+}
+
+// Checks to see if a token is the given operator. It does not display any
+// errors and will not proceed to the next token.
+static int TrIsOperator (TokenReaderT * tr, const char * op) {
+ size_t out, len;
+ char ch;
+
+ if (! TrSkipWhitespace (tr))
+ return (0);
+ out = tr -> mOut;
+ len = 0;
+ while ((op [len] != '\0') && (out < tr -> mIn)) {
+ ch = tr -> mRing [out & TR_RING_MASK];
+ if (ch != op [len])
+ break;
+ len ++;
+ out ++;
+ }
+ if (op [len] == '\0')
+ return (1);
+ return (0);
+}
+
+/* The TrRead*() routines obtain the value of a matching token type. They
+ * display type, form, and boundary errors and will proceed to the next
+ * token.
+ */
+
+// Reads and validates an identifier token.
+static int TrReadIdent (TokenReaderT * tr, const size_t maxLen, char * ident) {
+ uint col;
+ size_t len;
+ char ch;
+
+ col = tr -> mColumn;
+ if (TrSkipWhitespace (tr)) {
+ col = tr -> mColumn;
+ ch = tr -> mRing [tr -> mOut & TR_RING_MASK];
+ if ((ch == '_') || isalpha (ch)) {
+ len = 0;
+ do {
+ if (len < maxLen)
+ ident [len] = ch;
+ len ++;
+ tr -> mOut ++;
+ if (! TrLoad (tr))
+ break;
+ ch = tr -> mRing [tr -> mOut & TR_RING_MASK];
+ } while ((ch == '_') || isdigit (ch) || isalpha (ch));
+ tr -> mColumn += len;
+ if (len > maxLen) {
+ TrErrorAt (tr, tr -> mLine, col, "Identifier is too long.\n");
+ return (0);
+ }
+ ident [len] = '\0';
+ return (1);
+ }
}
- // Perform the FFT.
- m2 = 1;
- for (m = 2; m <= n; m <<= 1) {
- a = sin (M_PI / m);
- a = 2.0f * a * a;
- b = sin (2.0f * M_PI / m);
- for (i = 0; i < n; i += m) {
- wx = 1.0f;
- wy = 0.0f;
- for (k = i, j = 0; j < m2; k ++, j ++) {
- km2 = k + m2;
- tx = (wx * fftOut [km2] . mVec [0]) - (wy * fftOut [km2] . mVec [1]);
- ty = (wx * fftOut [km2] . mVec [1]) + (wy * fftOut [km2] . mVec [0]);
- fftOut [km2] . mVec [0] = fftOut [k] . mVec [0] - tx;
- fftOut [km2] . mVec [1] = fftOut [k] . mVec [1] - ty;
- fftOut [k] . mVec [0] += tx;
- fftOut [k] . mVec [1] += ty;
- wyd = (a * wy) - (b * wx);
- wx -= (a * wx) + (b * wy);
- wy -= wyd;
+ TrErrorAt (tr, tr -> mLine, col, "Expected an identifier.\n");
+ return (0);
+}
+
+// Reads and validates (including bounds) an integer token.
+static int TrReadInt (TokenReaderT * tr, const int loBound, const int hiBound, int * value) {
+ uint col, digis;
+ size_t len;
+ char ch, temp [64 + 1];
+
+ col = tr -> mColumn;
+ if (TrSkipWhitespace (tr)) {
+ col = tr -> mColumn;
+ len = 0;
+ ch = tr -> mRing [tr -> mOut & TR_RING_MASK];
+ if ((ch == '+') || (ch == '-')) {
+ temp [len] = ch;
+ len ++;
+ tr -> mOut ++;
+ }
+ digis = 0;
+ while (TrLoad (tr)) {
+ ch = tr -> mRing [tr -> mOut & TR_RING_MASK];
+ if (! isdigit (ch))
+ break;
+ if (len < 64)
+ temp [len] = ch;
+ len ++;
+ digis ++;
+ tr -> mOut ++;
+ }
+ tr -> mColumn += len;
+ if ((digis > 0) && (ch != '.') && (! isalpha (ch))) {
+ if (len > 64) {
+ TrErrorAt (tr, tr -> mLine, col, "Integer is too long.");
+ return (0);
+ }
+ temp [len] = '\0';
+ (* value) = strtol (temp, NULL, 10);
+ if (((* value) < loBound) || ((* value) > hiBound)) {
+ TrErrorAt (tr, tr -> mLine, col, "Expected a value from %d to %d.\n", loBound, hiBound);
+ return (0);
+ }
+ return (1);
+ }
+ }
+ TrErrorAt (tr, tr -> mLine, col, "Expected an integer.\n");
+ return (0);
+}
+
+// Reads and validates (including bounds) a float token.
+static int TrReadFloat (TokenReaderT * tr, const double loBound, const double hiBound, double * value) {
+ uint col, digis;
+ size_t len;
+ char ch, temp [64 + 1];
+
+ col = tr -> mColumn;
+ if (TrSkipWhitespace (tr)) {
+ col = tr -> mColumn;
+ len = 0;
+ ch = tr -> mRing [tr -> mOut & TR_RING_MASK];
+ if ((ch == '+') || (ch == '-')) {
+ temp [len] = ch;
+ len ++;
+ tr -> mOut ++;
+ }
+ digis = 0;
+ while (TrLoad (tr)) {
+ ch = tr -> mRing [tr -> mOut & TR_RING_MASK];
+ if (! isdigit (ch))
+ break;
+ if (len < 64)
+ temp [len] = ch;
+ len ++;
+ digis ++;
+ tr -> mOut ++;
+ }
+ if (ch == '.') {
+ if (len < 64)
+ temp [len] = ch;
+ len ++;
+ tr -> mOut ++;
+ }
+ while (TrLoad (tr)) {
+ ch = tr -> mRing [tr -> mOut & TR_RING_MASK];
+ if (! isdigit (ch))
+ break;
+ if (len < 64)
+ temp [len] = ch;
+ len ++;
+ digis ++;
+ tr -> mOut ++;
+ }
+ if (digis > 0) {
+ if ((ch == 'E') || (ch == 'e')) {
+ if (len < 64)
+ temp [len] = ch;
+ len ++;
+ digis = 0;
+ tr -> mOut ++;
+ if ((ch == '+') || (ch == '-')) {
+ if (len < 64)
+ temp [len] = ch;
+ len ++;
+ tr -> mOut ++;
+ }
+ while (TrLoad (tr)) {
+ ch = tr -> mRing [tr -> mOut & TR_RING_MASK];
+ if (! isdigit (ch))
+ break;
+ if (len < 64)
+ temp [len] = ch;
+ len ++;
+ digis ++;
+ tr -> mOut ++;
+ }
+ }
+ tr -> mColumn += len;
+ if ((digis > 0) && (ch != '.') && (! isalpha (ch))) {
+ if (len > 64) {
+ TrErrorAt (tr, tr -> mLine, col, "Float is too long.");
+ return (0);
+ }
+ temp [len] = '\0';
+ (* value) = strtod (temp, NULL);
+ if (((* value) < loBound) || ((* value) > hiBound)) {
+ TrErrorAt (tr, tr -> mLine, col, "Expected a value from %f to %f.\n", loBound, hiBound);
+ return (0);
+ }
+ return (1);
+ }
+ } else {
+ tr -> mColumn += len;
+ }
+ }
+ TrErrorAt (tr, tr -> mLine, col, "Expected a float.\n");
+ return (0);
+}
+
+// Reads and validates a string token.
+static int TrReadString (TokenReaderT * tr, const size_t maxLen, char * text) {
+ uint col;
+ size_t len;
+ char ch;
+
+ col = tr -> mColumn;
+ if (TrSkipWhitespace (tr)) {
+ col = tr -> mColumn;
+ ch = tr -> mRing [tr -> mOut & TR_RING_MASK];
+ if (ch == '\"') {
+ tr -> mOut ++;
+ len = 0;
+ while (TrLoad (tr)) {
+ ch = tr -> mRing [tr -> mOut & TR_RING_MASK];
+ tr -> mOut ++;
+ if (ch == '\"')
+ break;
+ if (ch == '\n') {
+ TrErrorAt (tr, tr -> mLine, col, "Unterminated string at end of line.\n");
+ return (0);
}
- }
- m2 = m;
- }
-}
-
-// Performs an inverse Fast Fourier Transform.
-static void FftInvProc (int n, const ComplexT * fftIn, ComplexT * fftOut) {
- int m2, rk, k, m;
- float a, b;
- int i;
- float wx, wy;
- int j, km2;
- float tx, ty, wyd, invn;
-
- // Data copy and bit-reversal ordering.
- m2 = (n >> 1);
- rk = 0;
- for (k = 0; k < n; k ++) {
- fftOut [rk] . mVec [0] = fftIn [k] . mVec [0];
- fftOut [rk] . mVec [1] = fftIn [k] . mVec [1];
- if (k < (n - 1)) {
- m = m2;
- while (rk >= m) {
- rk -= m;
- m >>= 1;
- }
- rk += m;
- }
+ if (len < maxLen)
+ text [len] = ch;
+ len ++;
+ }
+ if (ch != '\"') {
+ tr -> mColumn += 1 + len;
+ TrErrorAt (tr, tr -> mLine, col, "Unterminated string at end of input.\n");
+ return (0);
+ }
+ tr -> mColumn += 2 + len;
+ if (len > maxLen) {
+ TrErrorAt (tr, tr -> mLine, col, "String is too long.\n");
+ return (0);
+ }
+ text [len] = '\0';
+ return (1);
+ }
+ }
+ TrErrorAt (tr, tr -> mLine, col, "Expected a string.\n");
+ return (0);
+}
+
+// Reads and validates the given operator.
+static int TrReadOperator (TokenReaderT * tr, const char * op) {
+ uint col;
+ size_t len;
+ char ch;
+
+ col = tr -> mColumn;
+ if (TrSkipWhitespace (tr)) {
+ col = tr -> mColumn;
+ len = 0;
+ while ((op [len] != '\0') && TrLoad (tr)) {
+ ch = tr -> mRing [tr -> mOut & TR_RING_MASK];
+ if (ch != op [len])
+ break;
+ len ++;
+ tr -> mOut ++;
+ }
+ tr -> mColumn += len;
+ if (op [len] == '\0')
+ return (1);
}
- // Perform the IFFT.
- m2 = 1;
- for (m = 2; m <= n; m <<= 1) {
- a = sin (M_PI / m);
- a = 2.0f * a * a;
- b = -sin (2.0f * M_PI / m);
- for (i = 0; i < n; i += m) {
- wx = 1.0f;
- wy = 0.0f;
- for (k = i, j = 0; j < m2; k ++, j ++) {
- km2 = k + m2;
- tx = (wx * fftOut [km2] . mVec [0]) - (wy * fftOut [km2] . mVec [1]);
- ty = (wx * fftOut [km2] . mVec [1]) + (wy * fftOut [km2] . mVec [0]);
- fftOut [km2] . mVec [0] = fftOut [k] . mVec [0] - tx;
- fftOut [km2] . mVec [1] = fftOut [k] . mVec [1] - ty;
- fftOut [k] . mVec [0] += tx;
- fftOut [k] . mVec [1] += ty;
- wyd = (a * wy) - (b * wx);
- wx -= (a * wx) + (b * wy);
- wy -= wyd;
+ TrErrorAt (tr, tr -> mLine, col, "Expected '%s' operator.\n", op);
+ return (0);
+}
+
+/* Performs a string substitution. Any case-insensitive occurrences of the
+ * pattern string are replaced with the replacement string. The result is
+ * truncated if necessary.
+ */
+static int StrSubst (const char * in, const char * pat, const char * rep, const size_t maxLen, char * out) {
+ size_t inLen, patLen, repLen;
+ size_t si, di;
+ int truncated;
+
+ inLen = strlen (in);
+ patLen = strlen (pat);
+ repLen = strlen (rep);
+ si = 0;
+ di = 0;
+ truncated = 0;
+ while ((si < inLen) && (di < maxLen)) {
+ if (patLen <= (inLen - si)) {
+ if (strncasecmp (& in [si], pat, patLen) == 0) {
+ if (repLen > (maxLen - di)) {
+ repLen = maxLen - di;
+ truncated = 1;
}
- }
- m2 = m;
+ strncpy (& out [di], rep, repLen);
+ si += patLen;
+ di += repLen;
+ }
+ }
+ out [di] = in [si];
+ si ++;
+ di ++;
}
- // Normalize the samples.
- invn = 1.0f / n;
- for (i = 0; i < n; i ++) {
- fftOut [i] . mVec [0] *= invn;
- fftOut [i] . mVec [1] *= invn;
+ if (si < inLen)
+ truncated = 1;
+ out [di] = '\0';
+ return (! truncated);
+}
+
+// Provide missing math routines for MSVC.
+#ifdef _MSC_VER
+static double round (double val) {
+ if (val < 0.0)
+ return (ceil (val - 0.5));
+ return (floor (val + 0.5));
+}
+
+static double fmin (double a, double b) {
+ return ((a < b) ? a : b);
+}
+
+static double fmax (double a, double b) {
+ return ((a > b) ? a : b);
+}
+#endif
+
+// Simple clamp routine.
+static double Clamp (const double val, const double lower, const double upper) {
+ return (fmin (fmax (val, lower), upper));
+}
+
+// Performs linear interpolation.
+static double Lerp (const double a, const double b, const double f) {
+ return (a + (f * (b - a)));
+}
+
+// Performs a high-passed triangular probability density function dither from
+// a double to an integer. It assumes the input sample is already scaled.
+static int HpTpdfDither (const double in, int * hpHist) {
+ const double PRNG_SCALE = 1.0 / RAND_MAX;
+ int prn;
+ double out;
+
+ prn = rand ();
+ out = round (in + (PRNG_SCALE * (prn - (* hpHist))));
+ (* hpHist) = prn;
+ return ((int) out);
+}
+
+// Allocates an array of doubles.
+static double * CreateArray (const size_t n) {
+ double * a = NULL;
+
+ a = (double *) calloc (n, sizeof (double));
+ if (a == NULL) {
+ fprintf (stderr, "Error: Out of memory.\n");
+ exit (-1);
}
+ return (a);
}
-// Complex absolute value.
-static void ComplexAbs (const ComplexT * in, ComplexT * out) {
- out -> mVec [0] = sqrt ((in -> mVec [0] * in -> mVec [0]) + (in -> mVec [1] * in -> mVec [1]));
- out -> mVec [1] = 0.0f;
+// Frees an array of doubles.
+static void DestroyArray (const double * a) {
+ free ((void *) a);
}
-// Complex logarithm.
-static void ComplexLog (const ComplexT * in, ComplexT * out) {
- float r, t;
+// Complex number routines. All outputs must be non-NULL.
+
+// Magnitude/absolute value.
+static double ComplexAbs (const double r, const double i) {
+ return (sqrt ((r * r) + (i * i)));
+}
- r = sqrt ((in -> mVec [0] * in -> mVec [0]) + (in -> mVec [1] * in -> mVec [1]));
- t = atan2 (in -> mVec [1], in -> mVec [0]);
- if (t < 0.0f)
- t += 2.0f * M_PI;
- out -> mVec [0] = log (r);
- out -> mVec [1] = t;
+// Multiply.
+static void ComplexMul (const double aR, const double aI, const double bR, const double bI, double * outR, double * outI) {
+ (* outR) = (aR * bR) - (aI * bI);
+ (* outI) = (aI * bR) + (aR * bI);
}
-// Complex exponent.
-static void ComplexExp (const ComplexT * in, ComplexT * out) {
- float e;
+// Base-e exponent.
+static void ComplexExp (const double inR, const double inI, double * outR, double * outI) {
+ double e;
- e = exp (in -> mVec [0]);
- out -> mVec [0] = e * cos (in -> mVec [1]);
- out -> mVec [1] = e * sin (in -> mVec [1]);
+ e = exp (inR);
+ (* outR) = e * cos (inI);
+ (* outI) = e * sin (inI);
}
-// Calculates the real cepstrum of a given impulse response. It currently
-// uses a fixed cepstrum size. To make this more robust, it should be
-// rewritten to handle a variable size cepstrum.
-static void RealCepstrum (int irSize, const float * ir, float cep [CEP_SIZE]) {
- ComplexT in [CEP_SIZE], out [CEP_SIZE];
- int index;
+/* Fast Fourier transform routines. The number of points must be a power of
+ * two. In-place operation is possible only if both the real and imaginary
+ * parts are in-place together.
+ */
- for (index = 0; index < irSize; index ++) {
- in [index] . mVec [0] = ir [index];
- in [index] . mVec [1] = 0.0f;
+// Performs bit-reversal ordering.
+static void FftArrange (const size_t n, const double * inR, const double * inI, double * outR, double * outI) {
+ size_t rk, k, m;
+ double tempR, tempI;
+
+ if ((inR == outR) && (inI == outI)) {
+ // Handle in-place arrangement.
+ rk = 0;
+ for (k = 0; k < n; k ++) {
+ if (rk > k) {
+ tempR = inR [rk];
+ tempI = inI [rk];
+ outR [rk] = inR [k];
+ outI [rk] = inI [k];
+ outR [k] = tempR;
+ outI [k] = tempI;
+ }
+ m = n;
+ while (rk & (m >>= 1))
+ rk &= ~m;
+ rk |= m;
+ }
+ } else {
+ // Handle copy arrangement.
+ rk = 0;
+ for (k = 0; k < n; k ++) {
+ outR [rk] = inR [k];
+ outI [rk] = inI [k];
+ m = n;
+ while (rk & (m >>= 1))
+ rk &= ~m;
+ rk |= m;
+ }
}
- for (; index < CEP_SIZE; index ++) {
- in [index] . mVec [0] = 0.0f;
- in [index] . mVec [1] = 0.0f;
+}
+
+// Performs the summation.
+static void FftSummation (const size_t n, const double s, double * re, double * im) {
+ double pi;
+ size_t m, m2;
+ double vR, vI, wR, wI;
+ size_t i, k, mk;
+ double tR, tI;
+
+ pi = s * M_PI;
+ for (m = 1, m2 = 2; m < n; m <<= 1, m2 <<= 1) {
+ // v = Complex (-2.0 * sin (0.5 * pi / m) * sin (0.5 * pi / m), -sin (pi / m))
+ vR = sin (0.5 * pi / m);
+ vR = -2.0 * vR * vR;
+ vI = -sin (pi / m);
+ // w = Complex (1.0, 0.0)
+ wR = 1.0;
+ wI = 0.0;
+ for (i = 0; i < m; i ++) {
+ for (k = i; k < n; k += m2) {
+ mk = k + m;
+ // t = ComplexMul (w, out [km2])
+ tR = (wR * re [mk]) - (wI * im [mk]);
+ tI = (wR * im [mk]) + (wI * re [mk]);
+ // out [mk] = ComplexSub (out [k], t)
+ re [mk] = re [k] - tR;
+ im [mk] = im [k] - tI;
+ // out [k] = ComplexAdd (out [k], t)
+ re [k] += tR;
+ im [k] += tI;
+ }
+ // t = ComplexMul (v, w)
+ tR = (vR * wR) - (vI * wI);
+ tI = (vR * wI) + (vI * wR);
+ // w = ComplexAdd (w, t)
+ wR += tR;
+ wI += tI;
+ }
}
- FftProc (CEP_SIZE, in, out);
- for (index = 0; index < CEP_SIZE; index ++) {
- ComplexAbs (& out [index], & out [index]);
- if (out [index] . mVec [0] < 0.000001f)
- out [index] . mVec [0] = 0.000001f;
- ComplexLog (& out [index], & in [index]);
+}
+
+// Performs a forward FFT.
+static void FftForward (const size_t n, const double * inR, const double * inI, double * outR, double * outI) {
+ FftArrange (n, inR, inI, outR, outI);
+ FftSummation (n, 1.0, outR, outI);
+}
+
+// Performs an inverse FFT.
+static void FftInverse (const size_t n, const double * inR, const double * inI, double * outR, double * outI) {
+ double f;
+ size_t i;
+
+ FftArrange (n, inR, inI, outR, outI);
+ FftSummation (n, -1.0, outR, outI);
+ f = 1.0 / n;
+ for (i = 0; i < n; i ++) {
+ outR [i] *= f;
+ outI [i] *= f;
}
- FftInvProc (CEP_SIZE, in, out);
- for (index = 0; index < CEP_SIZE; index ++)
- cep [index] = out [index] . mVec [0];
}
-// Reconstructs the minimum-phase impulse response for a given real cepstrum.
-// Like the above function, this should eventually be modified to handle a
-// variable size cepstrum.
-static void MinimumPhase (const float cep [CEP_SIZE], int irSize, float * mpIr) {
- ComplexT in [CEP_SIZE], out [CEP_SIZE];
- int index;
+/* Calculate the complex helical sequence (or discrete-time analytical
+ * signal) of the given input using the Hilbert transform. Given the
+ * negative natural logarithm of a signal's magnitude response, the imaginary
+ * components can be used as the angles for minimum-phase reconstruction.
+ */
+static void Hilbert (const size_t n, const double * in, double * outR, double * outI) {
+ size_t i;
+
+ if (in == outR) {
+ // Handle in-place operation.
+ for (i = 0; i < n; i ++)
+ outI [i] = 0.0;
+ } else {
+ // Handle copy operation.
+ for (i = 0; i < n; i ++) {
+ outR [i] = in [i];
+ outI [i] = 0.0;
+ }
+ }
+ FftForward (n, outR, outI, outR, outI);
+ /* Currently the Fourier routines operate only on point counts that are
+ * powers of two. If that changes and n is odd, the following conditional
+ * should be: i < (n + 1) / 2.
+ */
+ for (i = 1; i < (n / 2); i ++) {
+ outR [i] *= 2.0;
+ outI [i] *= 2.0;
+ }
+ // If n is odd, the following increment should be skipped.
+ i ++;
+ for (; i < n; i ++) {
+ outR [i] = 0.0;
+ outI [i] = 0.0;
+ }
+ FftInverse (n, outR, outI, outR, outI);
+}
+
+/* Calculate the magnitude response of the given input. This is used in
+ * place of phase decomposition, since the phase residuals are discarded for
+ * minimum phase reconstruction. The mirrored half of the response is also
+ * discarded.
+ */
+static void MagnitudeResponse (const size_t n, const double * inR, const double * inI, double * out) {
+ const size_t m = 1 + (n / 2);
+ size_t i;
+
+ for (i = 0; i < m; i ++)
+ out [i] = fmax (ComplexAbs (inR [i], inI [i]), EPSILON);
+}
- in [0] . mVec [0] = cep [0];
- for (index = 1; index < (CEP_SIZE / 2); index ++)
- in [index] . mVec [0] = 2.0f * cep [index];
- if ((CEP_SIZE % 2) != 1) {
- in [index] . mVec [0] = cep [index];
- index ++;
+/* Apply a range limit (in dB) to the given magnitude response. This is used
+ * to adjust the effects of the diffuse-field average on the equalization
+ * process.
+ */
+static void LimitMagnitudeResponse (const size_t n, const double limit, const double * in, double * out) {
+ const size_t m = 1 + (n / 2);
+ double halfLim;
+ size_t i, lower, upper;
+ double ave;
+
+ halfLim = limit / 2.0;
+ // Convert the response to dB.
+ for (i = 0; i < m; i ++)
+ out [i] = 20.0 * log10 (in [i]);
+ // Use six octaves to calculate the average magnitude of the signal.
+ lower = ((size_t) ceil (n / pow (2.0, 8.0))) - 1;
+ upper = ((size_t) floor (n / pow (2.0, 2.0))) - 1;
+ ave = 0.0;
+ for (i = lower; i <= upper; i ++)
+ ave += out [i];
+ ave /= upper - lower + 1;
+ // Keep the response within range of the average magnitude.
+ for (i = 0; i < m; i ++)
+ out [i] = Clamp (out [i], ave - halfLim, ave + halfLim);
+ // Convert the response back to linear magnitude.
+ for (i = 0; i < m; i ++)
+ out [i] = pow (10.0, out [i] / 20.0);
+}
+
+/* Reconstructs the minimum-phase component for the given magnitude response
+ * of a signal. This is equivalent to phase recomposition, sans the missing
+ * residuals (which were discarded). The mirrored half of the response is
+ * reconstructed.
+ */
+static void MinimumPhase (const size_t n, const double * in, double * outR, double * outI) {
+ const size_t m = 1 + (n / 2);
+ double * mags = NULL;
+ size_t i;
+ double aR, aI;
+
+ mags = CreateArray (n);
+ for (i = 0; i < m; i ++) {
+ mags [i] = fmax (in [i], EPSILON);
+ outR [i] = -log (mags [i]);
}
- for (; index < CEP_SIZE; index ++)
- in [index] . mVec [0] = 0.0f;
- for (index = 0; index < CEP_SIZE; index ++)
- in [index] . mVec [1] = 0.0f;
- FftProc (CEP_SIZE, in, out);
- for (index = 0; index < CEP_SIZE; index ++)
- ComplexExp (& out [index], & in [index]);
- FftInvProc (CEP_SIZE, in, out);
- for (index = 0; index < irSize; index ++)
- mpIr [index] = out [index] . mVec [0];
+ for (; i < n; i ++) {
+ mags [i] = mags [n - i];
+ outR [i] = outR [n - i];
+ }
+ Hilbert (n, outR, outR, outI);
+ // Remove any DC offset the filter has.
+ outR [0] = 0.0;
+ outI [0] = 0.0;
+ for (i = 1; i < n; i ++) {
+ ComplexExp (0.0, outI [i], & aR, & aI);
+ ComplexMul (mags [i], 0.0, aR, aI, & outR [i], & outI [i]);
+ }
+ DestroyArray (mags);
}
-// Calculate the left-ear time delay using a spherical head model.
-static float CalcLTD (float ev, float az, float rad, float dist) {
- float azp, dlp, l, al;
+// Read a binary value of the specified byte order and byte size from a file,
+// storing it as a 32-bit unsigned integer.
+static int ReadBin4 (FILE * fp, const char * filename, const ByteOrderT order, const uint bytes, uint4 * out) {
+ uint1 in [4];
+ uint4 accum;
+ uint i;
- azp = asin (cos (ev) * sin (az));
- dlp = sqrt ((dist * dist) + (rad * rad) + (2.0f * dist * rad * sin (azp)));
- l = sqrt ((dist * dist) - (rad * rad));
- al = (0.5f * M_PI) + azp;
- if (dlp > l)
- dlp = l + (rad * (al - acos (rad / dist)));
- return (dlp / 343.3f);
+ if (fread (in, 1, bytes, fp) != bytes) {
+ fprintf (stderr, "Error: Bad read from file '%s'.\n", filename);
+ return (0);
+ }
+ accum = 0;
+ switch (order) {
+ case BO_LITTLE :
+ for (i = 0; i < bytes; i ++)
+ accum = (accum << 8) | in [bytes - i - 1];
+ break;
+ case BO_BIG :
+ for (i = 0; i < bytes; i ++)
+ accum = (accum << 8) | in [i];
+ break;
+ default :
+ break;
+ }
+ (* out) = accum;
+ return (1);
}
-// Read a 16-bit little-endian integer from a file and convert it to a 32-bit
-// floating-point value in the range of -1.0 to 1.0.
-static int ReadInt16LeAsFloat32 (const char * fileName, FILE * fp, float * val) {
- ALubyte vb [2];
- ALushort vw;
+// Read a binary value of the specified byte order from a file, storing it as
+// a 64-bit unsigned integer.
+static int ReadBin8 (FILE * fp, const char * filename, const ByteOrderT order, uint8 * out) {
+ uint1 in [8];
+ uint8 accum;
+ uint i;
- if (fread (vb, 1, sizeof (vb), fp) != sizeof (vb)) {
- fclose (fp);
- fprintf (stderr, "Error reading from file, '%s'.\n", fileName);
+ if (fread (in, 1, 8, fp) != 8) {
+ fprintf (stderr, "Error: Bad read from file '%s'.\n", filename);
return (0);
}
- vw = (((unsigned short) vb [1]) << 8) | vb [0];
- (* val) = ((short) vw) / 32768.0f;
+ accum = 0ULL;
+ switch (order) {
+ case BO_LITTLE :
+ for (i = 0; i < 8; i ++)
+ accum = (accum << 8) | in [8 - i - 1];
+ break;
+ case BO_BIG :
+ for (i = 0; i < 8; i ++)
+ accum = (accum << 8) | in [i];
+ break;
+ default :
+ break;
+ }
+ (* out) = accum;
return (1);
}
-// Write a string to a file.
-static int WriteString (const char * val, const char * fileName, FILE * fp) {
+// Write an ASCII string to a file.
+static int WriteAscii (const char * out, FILE * fp, const char * filename) {
size_t len;
- len = strlen (val);
- if (fwrite (val, 1, len, fp) != len) {
+ len = strlen (out);
+ if (fwrite (out, 1, len, fp) != len) {
fclose (fp);
- fprintf (stderr, "Error writing to file, '%s'.\n", fileName);
+ fprintf (stderr, "Error: Bad write to file '%s'.\n", filename);
return (0);
}
return (1);
}
-// Write a 32-bit floating-point value in the range of -1.0 to 1.0 to a file
-// as a 16-bit little-endian integer.
-static int WriteFloat32AsInt16Le (float val, const char * fileName, FILE * fp) {
- ALshort vw;
- ALubyte vb [2];
-
- vw = (short) round (32767.0f * val);
- vb [0] = vw & 0x00FF;
- vb [1] = (vw >> 8) & 0x00FF;
- if (fwrite (vb, 1, sizeof (vb), fp) != sizeof (vb)) {
- fclose (fp);
- fprintf (stderr, "Error writing to file, '%s'.\n", fileName);
+// Write a binary value of the given byte order and byte size to a file,
+// loading it from a 32-bit unsigned integer.
+static int WriteBin4 (const ByteOrderT order, const uint bytes, const uint4 in, FILE * fp, const char * filename) {
+ uint1 out [4];
+ uint i;
+
+ switch (order) {
+ case BO_LITTLE :
+ for (i = 0; i < bytes; i ++)
+ out [i] = (in >> (i * 8)) & 0x000000FF;
+ break;
+ case BO_BIG :
+ for (i = 0; i < bytes; i ++)
+ out [bytes - i - 1] = (in >> (i * 8)) & 0x000000FF;
+ break;
+ default :
+ break;
+ }
+ if (fwrite (out, 1, bytes, fp) != bytes) {
+ fprintf (stderr, "Error: Bad write to file '%s'.\n", filename);
return (0);
}
return (1);
}
-// Write a 32-bit little-endian unsigned integer to a file.
-static int WriteUInt32Le (ALuint val, const char * fileName, FILE * fp) {
- ALubyte vb [4];
+/* Read a binary value of the specified type, byte order, and byte size from
+ * a file, converting it to a double. For integer types, the significant
+ * bits are used to normalize the result. The sign of bits determines
+ * whether they are padded toward the MSB (negative) or LSB (positive).
+ * Floating-point types are not normalized.
+ */
+static int ReadBinAsDouble (FILE * fp, const char * filename, const ByteOrderT order, const ElementTypeT type, const uint bytes, const int bits, double * out) {
+ union {
+ uint4 ui;
+ int4 i;
+ float f;
+ } v4;
+ union {
+ uint8 ui;
+ double f;
+ } v8;
+
+ (* out) = 0.0;
+ if (bytes > 4) {
+ if (! ReadBin8 (fp, filename, order, & v8 . ui))
+ return (0);
+ if (type == ET_FP)
+ (* out) = v8 . f;
+ } else {
+ if (! ReadBin4 (fp, filename, order, bytes, & v4 . ui))
+ return (0);
+ if (type == ET_FP) {
+ (* out) = (double) v4 . f;
+ } else {
+ if (bits > 0)
+ v4 . ui >>= (8 * bytes) - bits;
+ else
+ v4 . ui &= (0xFFFFFFFF >> (32 + bits));
+ if (v4 . ui & (1 << (abs (bits) - 1)))
+ v4 . ui |= (0xFFFFFFFF << abs (bits));
+ (* out) = v4 . i / ((double) (1 << (abs (bits) - 1)));
+ }
+ }
+ return (1);
+}
+
+/* Read an ascii value of the specified type from a file, converting it to a
+ * double. For integer types, the significant bits are used to normalize the
+ * result. The sign of the bits should always be positive. This also skips
+ * up to one separator character before the element itself.
+ */
+static int ReadAsciiAsDouble (TokenReaderT * tr, const char * filename, const ElementTypeT type, const uint bits, double * out) {
+ int v;
+
+ if (TrIsOperator (tr, ","))
+ TrReadOperator (tr, ",");
+ else if (TrIsOperator (tr, ":"))
+ TrReadOperator (tr, ":");
+ else if (TrIsOperator (tr, ";"))
+ TrReadOperator (tr, ";");
+ else if (TrIsOperator (tr, "|"))
+ TrReadOperator (tr, "|");
+ if (type == ET_FP) {
+ if (! TrReadFloat (tr, -1.0 / 0.0, 1.0 / 0.0, out)) {
+ fprintf (stderr, "Error: Bad read from file '%s'.\n", filename);
+ return (0);
+ }
+ } else {
+ if (! TrReadInt (tr, -(1 << (bits - 1)), (1 << (bits - 1)) - 1, & v)) {
+ fprintf (stderr, "Error: Bad read from file '%s'.\n", filename);
+ return (0);
+ }
+ (* out) = v / ((double) ((1 << (bits - 1)) - 1));
+ }
+ return (1);
+}
- vb [0] = val & 0x000000FF;
- vb [1] = (val >> 8) & 0x000000FF;
- vb [2] = (val >> 16) & 0x000000FF;
- vb [3] = (val >> 24) & 0x000000FF;
- if (fwrite (vb, 1, sizeof (vb), fp) != sizeof (vb)) {
- fclose (fp);
- fprintf (stderr, "Error writing to file, '%s'.\n", fileName);
+// Read the RIFF/RIFX WAVE format chunk from a file, validating it against
+// the source parameters and data set metrics.
+static int ReadWaveFormat (FILE * fp, const ByteOrderT order, const uint hrirRate, SourceRefT * src) {
+ uint4 fourCC, chunkSize;
+ uint4 format, channels, rate, dummy, block, size, bits;
+
+ chunkSize = 0;
+ do {
+ if (chunkSize > 0)
+ fseek (fp, chunkSize, SEEK_CUR);
+ if ((! ReadBin4 (fp, src -> mPath, BO_LITTLE, 4, & fourCC)) ||
+ (! ReadBin4 (fp, src -> mPath, order, 4, & chunkSize)))
+ return (0);
+ } while (fourCC != FOURCC_FMT);
+ if ((! ReadBin4 (fp, src -> mPath, order, 2, & format)) ||
+ (! ReadBin4 (fp, src -> mPath, order, 2, & channels)) ||
+ (! ReadBin4 (fp, src -> mPath, order, 4, & rate)) ||
+ (! ReadBin4 (fp, src -> mPath, order, 4, & dummy)) ||
+ (! ReadBin4 (fp, src -> mPath, order, 2, & block)))
+ return (0);
+ block /= channels;
+ if (chunkSize > 14) {
+ if (! ReadBin4 (fp, src -> mPath, order, 2, & size))
+ return (0);
+ size /= 8;
+ if (block > size)
+ size = block;
+ } else {
+ size = block;
+ }
+ if (format == WAVE_FORMAT_EXTENSIBLE) {
+ fseek (fp, 2, SEEK_CUR);
+ if (! ReadBin4 (fp, src -> mPath, order, 2, & bits))
+ return (0);
+ if (bits == 0)
+ bits = 8 * size;
+ fseek (fp, 4, SEEK_CUR);
+ if (! ReadBin4 (fp, src -> mPath, order, 2, & format))
+ return (0);
+ fseek (fp, chunkSize - 26, SEEK_CUR);
+ } else {
+ bits = 8 * size;
+ if (chunkSize > 14)
+ fseek (fp, chunkSize - 16, SEEK_CUR);
+ else
+ fseek (fp, chunkSize - 14, SEEK_CUR);
+ }
+ if ((format != WAVE_FORMAT_PCM) && (format != WAVE_FORMAT_IEEE_FLOAT)) {
+ fprintf (stderr, "Error: Unsupported WAVE format in file '%s'.\n", src -> mPath);
return (0);
}
+ if (src -> mChannel >= channels) {
+ fprintf (stderr, "Error: Missing source channel in WAVE file '%s'.\n", src -> mPath);
+ return (0);
+ }
+ if (rate != hrirRate) {
+ fprintf (stderr, "Error: Mismatched source sample rate in WAVE file '%s'.\n", src -> mPath);
+ return (0);
+ }
+ if (format == WAVE_FORMAT_PCM) {
+ if ((size < 2) || (size > 4)) {
+ fprintf (stderr, "Error: Unsupported sample size in WAVE file '%s'.\n", src -> mPath);
+ return (0);
+ }
+ if ((bits < 16) || (bits > (8 * size))) {
+ fprintf (stderr, "Error: Bad significant bits in WAVE file '%s'.\n", src -> mPath);
+ return (0);
+ }
+ src -> mType = ET_INT;
+ } else {
+ if ((size != 4) && (size != 8)) {
+ fprintf (stderr, "Error: Unsupported sample size in WAVE file '%s'.\n", src -> mPath);
+ return (0);
+ }
+ src -> mType = ET_FP;
+ }
+ src -> mSize = size;
+ src -> mBits = (int) bits;
+ src -> mSkip = channels;
return (1);
}
-// Write a 16-bit little-endian unsigned integer to a file.
-static int WriteUInt16Le (ALushort val, const char * fileName, FILE * fp) {
- ALubyte vb [2];
+// Read a RIFF/RIFX WAVE data chunk, converting all elements to doubles.
+static int ReadWaveData (FILE * fp, const SourceRefT * src, const ByteOrderT order, const size_t n, double * hrir) {
+ int pre, post, skip;
+ size_t i;
- vb [0] = val & 0x00FF;
- vb [1] = (val >> 8) & 0x00FF;
- if (fwrite (vb, 1, sizeof (vb), fp) != sizeof (vb)) {
- fclose (fp);
- fprintf (stderr, "Error writing to file, '%s'.\n", fileName);
+ pre = (int) (src -> mSize * src -> mChannel);
+ post = (int) (src -> mSize * (src -> mSkip - src -> mChannel - 1));
+ skip = 0;
+ for (i = 0; i < n; i ++) {
+ skip += pre;
+ if (skip > 0)
+ fseek (fp, skip, SEEK_CUR);
+ if (! ReadBinAsDouble (fp, src -> mPath, order, src -> mType, src -> mSize, src -> mBits, & hrir [i]))
+ return (0);
+ skip = post;
+ }
+ if (skip > 0)
+ fseek (fp, skip, SEEK_CUR);
+ return (1);
+}
+
+// Read the RIFF/RIFX WAVE list or data chunk, converting all elements to
+// doubles.
+static int ReadWaveList (FILE * fp, const SourceRefT * src, const ByteOrderT order, const size_t n, double * hrir) {
+ uint4 fourCC, chunkSize, listSize;
+ size_t block, skip, count, offset, i;
+ double lastSample;
+
+ for (;;) {
+ if ((! ReadBin4 (fp, src -> mPath, BO_LITTLE, 4, & fourCC)) ||
+ (! ReadBin4 (fp, src -> mPath, order, 4, & chunkSize)))
+ return (0);
+ if (fourCC == FOURCC_DATA) {
+ block = src -> mSize * src -> mSkip;
+ count = chunkSize / block;
+ if (count < (src -> mOffset + n)) {
+ fprintf (stderr, "Error: Bad read from file '%s'.\n", src -> mPath);
+ return (0);
+ }
+ fseek (fp, src -> mOffset * block, SEEK_CUR);
+ if (! ReadWaveData (fp, src, order, n, & hrir [0]))
+ return (0);
+ return (1);
+ } else if (fourCC == FOURCC_LIST) {
+ if (! ReadBin4 (fp, src -> mPath, BO_LITTLE, 4, & fourCC))
+ return (0);
+ chunkSize -= 4;
+ if (fourCC == FOURCC_WAVL)
+ break;
+ }
+ if (chunkSize > 0)
+ fseek (fp, chunkSize, SEEK_CUR);
+ }
+ listSize = chunkSize;
+ block = src -> mSize * src -> mSkip;
+ skip = src -> mOffset;
+ offset = 0;
+ lastSample = 0.0;
+ while ((offset < n) && (listSize > 8)) {
+ if ((! ReadBin4 (fp, src -> mPath, BO_LITTLE, 4, & fourCC)) ||
+ (! ReadBin4 (fp, src -> mPath, order, 4, & chunkSize)))
+ return (0);
+ listSize -= 8 + chunkSize;
+ if (fourCC == FOURCC_DATA) {
+ count = chunkSize / block;
+ if (count > skip) {
+ fseek (fp, skip * block, SEEK_CUR);
+ chunkSize -= skip * block;
+ count -= skip;
+ skip = 0;
+ if (count > (n - offset))
+ count = n - offset;
+ if (! ReadWaveData (fp, src, order, count, & hrir [offset]))
+ return (0);
+ chunkSize -= count * block;
+ offset += count;
+ lastSample = hrir [offset - 1];
+ } else {
+ skip -= count;
+ count = 0;
+ }
+ } else if (fourCC == FOURCC_SLNT) {
+ if (! ReadBin4 (fp, src -> mPath, order, 4, & count))
+ return (0);
+ chunkSize -= 4;
+ if (count > skip) {
+ count -= skip;
+ skip = 0;
+ if (count > (n - offset))
+ count = n - offset;
+ for (i = 0; i < count; i ++)
+ hrir [offset + i] = lastSample;
+ offset += count;
+ } else {
+ skip -= count;
+ count = 0;
+ }
+ }
+ if (chunkSize > 0)
+ fseek (fp, chunkSize, SEEK_CUR);
+ }
+ if (offset < n) {
+ fprintf (stderr, "Error: Bad read from file '%s'.\n", src -> mPath);
return (0);
}
return (1);
}
-// Write an 8-bit unsigned integer to a file.
-static int WriteUInt8 (ALubyte val, const char * fileName, FILE * fp) {
- if (fwrite (& val, 1, sizeof (val), fp) != sizeof (val)) {
- fclose (fp);
- fprintf (stderr, "Error writing to file, '%s'.\n", fileName);
+// Load a source HRIR from a RIFF/RIFX WAVE file.
+static int LoadWaveSource (FILE * fp, SourceRefT * src, const uint hrirRate, const size_t n, double * hrir) {
+ uint4 fourCC, dummy;
+ ByteOrderT order;
+
+ if ((! ReadBin4 (fp, src -> mPath, BO_LITTLE, 4, & fourCC)) ||
+ (! ReadBin4 (fp, src -> mPath, BO_LITTLE, 4, & dummy)))
+ return (0);
+ if (fourCC == FOURCC_RIFF) {
+ order = BO_LITTLE;
+ } else if (fourCC == FOURCC_RIFX) {
+ order = BO_BIG;
+ } else {
+ fprintf (stderr, "Error: No RIFF/RIFX chunk in file '%s'.\n", src -> mPath);
+ return (0);
+ }
+ if (! ReadBin4 (fp, src -> mPath, BO_LITTLE, 4, & fourCC))
+ return (0);
+ if (fourCC != FOURCC_WAVE) {
+ fprintf (stderr, "Error: Not a RIFF/RIFX WAVE file '%s'.\n", src -> mPath);
return (0);
}
+ if (! ReadWaveFormat (fp, order, hrirRate, src))
+ return (0);
+ if (! ReadWaveList (fp, src, order, n, hrir))
+ return (0);
return (1);
}
-// Load the MIT HRIRs. This loads the entire diffuse or compact set starting
-// counter-clockwise up at the bottom elevation and clockwise at the forward
-// azimuth.
-static int LoadMitHrirs (const char * baseName, HrirDataT * hData) {
- const int EV_ANGLE [MIT_EV_COUNT] = {
- -90, -80, -70, -60, -50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90
- };
- int e, a;
- char fileName [1024];
- FILE * fp = NULL;
- int j0, j1, i;
- float s;
-
- for (e = MIT_EV_START; e < MIT_EV_COUNT; e ++) {
- for (a = 0; a < MIT_AZ_COUNT [e]; a ++) {
- // The data packs the first 180 degrees in the left channel, and
- // the last 180 degrees in the right channel.
- if (round ((360.0f / MIT_AZ_COUNT [e]) * a) > 180.0f)
- break;
- // Determine which file to open.
- snprintf (fileName, 1023, "%s%d/H%de%03da.wav", baseName, EV_ANGLE [e], EV_ANGLE [e], (int) round ((360.0f / MIT_AZ_COUNT [e]) * a));
- if ((fp = fopen (fileName, "rb")) == NULL) {
- fprintf (stderr, "Could not open file, '%s'.\n", fileName);
+// Load a source HRIR from a binary file.
+static int LoadBinarySource (FILE * fp, const SourceRefT * src, const ByteOrderT order, const size_t n, double * hrir) {
+ size_t i;
+
+ fseek (fp, src -> mOffset, SEEK_SET);
+ for (i = 0; i < n; i ++) {
+ if (! ReadBinAsDouble (fp, src -> mPath, order, src -> mType, src -> mSize, src -> mBits, & hrir [i]))
+ return (0);
+ if (src -> mSkip > 0)
+ fseek (fp, src -> mSkip, SEEK_CUR);
+ }
+ return (1);
+}
+
+// Load a source HRIR from an ASCII text file containing a list of elements
+// separated by whitespace or common list operators (',', ';', ':', '|').
+static int LoadAsciiSource (FILE * fp, const SourceRefT * src, const size_t n, double * hrir) {
+ TokenReaderT tr;
+ size_t i, j;
+ double dummy;
+
+ TrSetup (fp, NULL, & tr);
+ for (i = 0; i < src -> mOffset; i ++) {
+ if (! ReadAsciiAsDouble (& tr, src -> mPath, src -> mType, src -> mBits, & dummy))
+ return (0);
+ }
+ for (i = 0; i < n; i ++) {
+ if (! ReadAsciiAsDouble (& tr, src -> mPath, src -> mType, src -> mBits, & hrir [i]))
+ return (0);
+ for (j = 0; j < src -> mSkip; j ++) {
+ if (! ReadAsciiAsDouble (& tr, src -> mPath, src -> mType, src -> mBits, & dummy))
return (0);
- }
- // Assuming they have not changed format, skip the .WAV header.
- fseek (fp, 44, SEEK_SET);
- // Map the left and right channels to their appropriate azimuth
- // offsets.
- j0 = (MIT_EV_OFFSET [e] + a) * MIT_IR_SIZE;
- j1 = (MIT_EV_OFFSET [e] + ((MIT_AZ_COUNT [e] - a) % MIT_AZ_COUNT [e])) * MIT_IR_SIZE;
- // Read in the data, converting it to floating-point.
- for (i = 0; i < MIT_IR_SIZE; i ++) {
- if (! ReadInt16LeAsFloat32 (fileName, fp, & s))
- return (0);
- hData -> mHrirs [j0 + i] = s;
- if (! ReadInt16LeAsFloat32 (fileName, fp, & s))
- return (0);
- hData -> mHrirs [j1 + i] = s;
- }
- fclose (fp);
}
}
return (1);
}
-// Performs the minimum phase reconstruction for a given HRIR data set. The
-// cepstrum size should be made configureable at some point in the future.
-static void ReconstructHrirs (int minIrSize, HrirDataT * hData) {
- int start, end, step, j;
- float cep [CEP_SIZE];
+// Load a source HRIR from a supported file type.
+static int LoadSource (SourceRefT * src, const uint hrirRate, const size_t n, double * hrir) {
+ FILE * fp = NULL;
+ int result;
+
+ if (src -> mFormat == SF_ASCII)
+ fp = fopen (src -> mPath, "r");
+ else
+ fp = fopen (src -> mPath, "rb");
+ if (fp == NULL) {
+ fprintf (stderr, "Error: Could not open source file '%s'.\n", src -> mPath);
+ return (0);
+ }
+ if (src -> mFormat == SF_WAVE)
+ result = LoadWaveSource (fp, src, hrirRate, n, hrir);
+ else if (src -> mFormat == SF_BIN_LE)
+ result = LoadBinarySource (fp, src, BO_LITTLE, n, hrir);
+ else if (src -> mFormat == SF_BIN_BE)
+ result = LoadBinarySource (fp, src, BO_BIG, n, hrir);
+ else
+ result = LoadAsciiSource (fp, src, n, hrir);
+ fclose (fp);
+ return (result);
+}
- start = hData -> mEvOffset [hData -> mEvStart];
- end = hData -> mIrCount;
- step = hData -> mIrSize;
- for (j = start; j < end; j ++) {
- RealCepstrum (step, & hData -> mHrirs [j * step], cep);
- MinimumPhase (cep, minIrSize, & hData -> mHrirs [j * minIrSize]);
+// Calculate the magnitude response of an HRIR and average it with any
+// existing responses for its elevation and azimuth.
+static void AverageHrirMagnitude (const double * hrir, const double f, const uint ei, const uint ai, const HrirDataT * hData) {
+ double * re = NULL, * im = NULL;
+ size_t n, m, i, j;
+
+ n = hData -> mFftSize;
+ re = CreateArray (n);
+ im = CreateArray (n);
+ for (i = 0; i < hData -> mIrPoints; i ++) {
+ re [i] = hrir [i];
+ im [i] = 0.0;
}
- hData -> mIrSize = minIrSize;
+ for (; i < n; i ++) {
+ re [i] = 0.0;
+ im [i] = 0.0;
+ }
+ FftForward (n, re, im, re, im);
+ MagnitudeResponse (n, re, im, re);
+ m = 1 + (n / 2);
+ j = (hData -> mEvOffset [ei] + ai) * hData -> mIrSize;
+ for (i = 0; i < m; i ++)
+ hData -> mHrirs [j + i] = Lerp (hData -> mHrirs [j + i], re [i], f);
+ DestroyArray (im);
+ DestroyArray (re);
}
-// Renormalize the entire HRIR data set, and attenutate it slightly.
-static void RenormalizeHrirs (const HrirDataT * hData) {
- int step, start, end;
- float norm;
- int j, i;
+/* Calculate the contribution of each HRIR to the diffuse-field average based
+ * on the area of its surface patch. All patches are centered at the HRIR
+ * coordinates on the unit sphere and are measured by solid angle.
+ */
+static void CalculateDfWeights (const HrirDataT * hData, double * weights) {
+ uint ei;
+ double evs, sum, ev, up_ev, down_ev, solidAngle;
+
+ evs = 90.0 / (hData -> mEvCount - 1);
+ sum = 0.0;
+ for (ei = hData -> mEvStart; ei < hData -> mEvCount; ei ++) {
+ // For each elevation, calculate the upper and lower limits of the
+ // patch band.
+ ev = -90.0 + (ei * 2.0 * evs);
+ if (ei < (hData -> mEvCount - 1))
+ up_ev = (ev + evs) * M_PI / 180.0;
+ else
+ up_ev = M_PI / 2.0;
+ if (ei > 0)
+ down_ev = (ev - evs) * M_PI / 180.0;
+ else
+ down_ev = -M_PI / 2.0;
+ // Calculate the area of the patch band.
+ solidAngle = 2.0 * M_PI * (sin (up_ev) - sin (down_ev));
+ // Each weight is the area of one patch.
+ weights [ei] = solidAngle / hData -> mAzCount [ei];
+ // Sum the total surface area covered by the HRIRs.
+ sum += solidAngle;
+ }
+ // Normalize the weights given the total surface coverage.
+ for (ei = hData -> mEvStart; ei < hData -> mEvCount; ei ++)
+ weights [ei] /= sum;
+}
+/* Calculate the diffuse-field average from the given magnitude responses of
+ * the HRIR set. Weighting can be applied to compensate for the varying
+ * surface area covered by each HRIR. The final average can then be limited
+ * by the specified magnitude range (in positive dB; 0.0 to skip).
+ */
+static void CalculateDiffuseFieldAverage (const HrirDataT * hData, const int weighted, const double limit, double * dfa) {
+ double * weights = NULL;
+ uint ei, ai;
+ size_t count, step, start, end, m, j, i;
+ double weight;
+
+ weights = CreateArray (hData -> mEvCount);
+ if (weighted) {
+ // Use coverage weighting to calculate the average.
+ CalculateDfWeights (hData, weights);
+ } else {
+ // If coverage weighting is not used, the weights still need to be
+ // averaged by the number of HRIRs.
+ count = 0;
+ for (ei = hData -> mEvStart; ei < hData -> mEvCount; ei ++)
+ count += hData -> mAzCount [ei];
+ for (ei = hData -> mEvStart; ei < hData -> mEvCount; ei ++)
+ weights [ei] = 1.0 / count;
+ }
+ ei = hData -> mEvStart;
+ ai = 0;
step = hData -> mIrSize;
- start = hData -> mEvOffset [hData -> mEvStart] * step;
+ start = hData -> mEvOffset [ei] * step;
end = hData -> mIrCount * step;
- norm = 0.0f;
+ m = 1 + (hData -> mFftSize / 2);
+ for (i = 0; i < m; i ++)
+ dfa [i] = 0.0;
for (j = start; j < end; j += step) {
- for (i = 0; i < step; i ++) {
- if (fabs (hData -> mHrirs [j + i]) > norm)
- norm = fabs (hData -> mHrirs [j + i]);
+ // Get the weight for this HRIR's contribution.
+ weight = weights [ei];
+ // Add this HRIR's weighted power average to the total.
+ for (i = 0; i < m; i ++)
+ dfa [i] += weight * hData -> mHrirs [j + i] * hData -> mHrirs [j + i];
+ // Determine the next weight to use.
+ ai ++;
+ if (ai >= hData -> mAzCount [ei]) {
+ ei ++;
+ ai = 0;
}
}
- if (norm > 0.000001f)
- norm = 1.0f / norm;
- norm *= 0.95f;
+ // Finish the average calculation and keep it from being too small.
+ for (i = 0; i < m; i ++)
+ dfa [i] = fmax (sqrt (dfa [i]), EPSILON);
+ // Apply a limit to the magnitude range of the diffuse-field average if
+ // desired.
+ if (limit > 0.0)
+ LimitMagnitudeResponse (hData -> mFftSize, limit, dfa, dfa);
+ DestroyArray (weights);
+}
+
+// Perform diffuse-field equalization on the magnitude responses of the HRIR
+// set using the given average response.
+static void DiffuseFieldEqualize (const double * dfa, const HrirDataT * hData) {
+ size_t step, start, end, m, j, i;
+
+ step = hData -> mIrSize;
+ start = hData -> mEvOffset [hData -> mEvStart] * step;
+ end = hData -> mIrCount * step;
+ m = 1 + (hData -> mFftSize / 2);
for (j = start; j < end; j += step) {
- for (i = 0; i < step; i ++)
- hData -> mHrirs [j + i] *= norm;
+ for (i = 0; i < m; i ++)
+ hData -> mHrirs [j + i] /= dfa [i];
}
}
-// Given an elevation offset and azimuth, calculates two offsets for
-// addressing the HRIRs buffer and their interpolation factor.
-static void CalcAzIndices (const HrirDataT * hData, int oi, float az, int * j0, int * j1, float * jf) {
- int ai;
+// Perform minimum-phase reconstruction using the magnitude responses of the
+// HRIR set.
+static void ReconstructHrirs (const HrirDataT * hData) {
+ double * re = NULL, * im = NULL;
+ size_t step, start, end, n, j, i;
- az = fmod ((2.0f * M_PI) + az, 2.0f * M_PI) * hData -> mAzCount [oi] / (2.0f * M_PI);
- ai = (int) az;
- az -= ai;
- (* j0) = hData -> mEvOffset [oi] + ai;
- (* j1) = hData -> mEvOffset [oi] + ((ai + 1) % hData -> mAzCount [oi]);
- (* jf) = az;
+ step = hData -> mIrSize;
+ start = hData -> mEvOffset [hData -> mEvStart] * step;
+ end = hData -> mIrCount * step;
+ n = hData -> mFftSize;
+ re = CreateArray (n);
+ im = CreateArray (n);
+ for (j = start; j < end; j += step) {
+ MinimumPhase (n, & hData -> mHrirs [j], re, im);
+ FftInverse (n, re, im, re, im);
+ for (i = 0; i < hData -> mIrPoints; i ++)
+ hData -> mHrirs [j + i] = re [i];
+ }
+ DestroyArray (im);
+ DestroyArray (re);
}
-// Perform a linear interpolation.
-static float Lerp (float a, float b, float f) {
- return (a + (f * (b - a)));
+/* Given an elevation index and an azimuth, calculate the indices of the two
+ * HRIRs that bound the coordinate along with a factor for calculating the
+ * continous HRIR using interpolation.
+ */
+static void CalcAzIndices (const HrirDataT * hData, const uint ei, const double az, uint * j0, uint * j1, double * jf) {
+ double af;
+ uint ai;
+
+ af = ((2.0 * M_PI) + az) * hData -> mAzCount [ei] / (2.0 * M_PI);
+ ai = ((uint) af) % hData -> mAzCount [ei];
+ af -= floor (af);
+ (* j0) = hData -> mEvOffset [ei] + ai;
+ (* j1) = hData -> mEvOffset [ei] + ((ai + 1) % hData -> mAzCount [ei]);
+ (* jf) = af;
}
-// Attempt to synthesize any missing HRIRs at the bottom elevations. Right
-// now this just blends the lowest elevation HRIRs together and applies some
-// attenuates and high frequency damping. It's not a realistic model to use,
-// but it is simple.
+/* Attempt to synthesize any missing HRIRs at the bottom elevations. Right
+ * now this just blends the lowest elevation HRIRs together and applies some
+ * attenuation and high frequency damping. It is a simple, if inaccurate
+ * model.
+ */
static void SynthesizeHrirs (HrirDataT * hData) {
- int step, oi, i, a, j, e;
- float of;
- int j0, j1;
- float jf;
- float lp [4], s0, s1;
+ uint oi, a, e;
+ size_t step, n, i, j;
+ double of;
+ size_t j0, j1;
+ double jf;
+ double lp [4], s0, s1;
if (hData -> mEvStart <= 0)
return;
step = hData -> mIrSize;
oi = hData -> mEvStart;
- for (i = 0; i < step; i ++)
- hData -> mHrirs [i] = 0.0f;
+ n = hData -> mIrPoints;
+ for (i = 0; i < n; i ++)
+ hData -> mHrirs [i] = 0.0;
for (a = 0; a < hData -> mAzCount [oi]; a ++) {
j = (hData -> mEvOffset [oi] + a) * step;
- for (i = 0; i < step; i ++)
+ for (i = 0; i < n; i ++)
hData -> mHrirs [i] += hData -> mHrirs [j + i] / hData -> mAzCount [oi];
}
for (e = 1; e < hData -> mEvStart; e ++) {
- of = ((float) e) / hData -> mEvStart;
+ of = ((double) e) / hData -> mEvStart;
for (a = 0; a < hData -> mAzCount [e]; a ++) {
j = (hData -> mEvOffset [e] + a) * step;
- CalcAzIndices (hData, oi, a * 2.0f * M_PI / hData -> mAzCount [e], & j0, & j1, & jf);
+ CalcAzIndices (hData, oi, a * 2.0 * M_PI / hData -> mAzCount [e], & j0, & j1, & jf);
j0 *= step;
j1 *= step;
- lp [0] = 0.0f;
- lp [1] = 0.0f;
- lp [2] = 0.0f;
- lp [3] = 0.0f;
- for (i = 0; i < step; i ++) {
+ lp [0] = 0.0;
+ lp [1] = 0.0;
+ lp [2] = 0.0;
+ lp [3] = 0.0;
+ for (i = 0; i < n; i ++) {
s0 = hData -> mHrirs [i];
s1 = Lerp (hData -> mHrirs [j0 + i], hData -> mHrirs [j1 + i], jf);
s0 = Lerp (s0, s1, of);
- lp [0] = Lerp (s0, lp [0], 0.15f - (0.15f * of));
- lp [1] = Lerp (lp [0], lp [1], 0.15f - (0.15f * of));
- lp [2] = Lerp (lp [1], lp [2], 0.15f - (0.15f * of));
- lp [3] = Lerp (lp [2], lp [3], 0.15f - (0.15f * of));
+ lp [0] = Lerp (s0, lp [0], 0.15 - (0.15 * of));
+ lp [1] = Lerp (lp [0], lp [1], 0.15 - (0.15 * of));
+ lp [2] = Lerp (lp [1], lp [2], 0.15 - (0.15 * of));
+ lp [3] = Lerp (lp [2], lp [3], 0.15 - (0.15 * of));
hData -> mHrirs [j + i] = lp [3];
}
}
}
- lp [0] = 0.0f;
- lp [1] = 0.0f;
- lp [2] = 0.0f;
- lp [3] = 0.0f;
- for (i = 0; i < step; i ++) {
+ lp [0] = 0.0;
+ lp [1] = 0.0;
+ lp [2] = 0.0;
+ lp [3] = 0.0;
+ for (i = 0; i < n; i ++) {
s0 = hData -> mHrirs [i];
- lp [0] = Lerp (s0, lp [0], 0.15f);
- lp [1] = Lerp (lp [0], lp [1], 0.15f);
- lp [2] = Lerp (lp [1], lp [2], 0.15f);
- lp [3] = Lerp (lp [2], lp [3], 0.15f);
+ lp [0] = Lerp (s0, lp [0], 0.15);
+ lp [1] = Lerp (lp [0], lp [1], 0.15);
+ lp [2] = Lerp (lp [1], lp [2], 0.15);
+ lp [3] = Lerp (lp [2], lp [3], 0.15);
hData -> mHrirs [i] = lp [3];
}
hData -> mEvStart = 0;
}
+// The following routines assume a full set of HRIRs for all elevations.
+
+// Normalize the HRIR set and slightly attenuate the result.
+static void NormalizeHrirs (const HrirDataT * hData) {
+ size_t step, end, n, j, i;
+ double maxLevel;
+
+ step = hData -> mIrSize;
+ end = hData -> mIrCount * step;
+ n = hData -> mIrPoints;
+ maxLevel = 0.0;
+ for (j = 0; j < end; j += step) {
+ for (i = 0; i < n; i ++)
+ maxLevel = fmax (fabs (hData -> mHrirs [j + i]), maxLevel);
+ }
+ maxLevel = 1.01 * maxLevel;
+ for (j = 0; j < end; j += step) {
+ for (i = 0; i < n; i ++)
+ hData -> mHrirs [j + i] /= maxLevel;
+ }
+}
+
+// Calculate the left-ear time delay using a spherical head model.
+static double CalcLTD (const double ev, const double az, const double rad, const double dist) {
+ double azp, dlp, l, al;
+
+ azp = asin (cos (ev) * sin (az));
+ dlp = sqrt ((dist * dist) + (rad * rad) + (2.0 * dist * rad * sin (azp)));
+ l = sqrt ((dist * dist) - (rad * rad));
+ al = (0.5 * M_PI) + azp;
+ if (dlp > l)
+ dlp = l + (rad * (al - acos (rad / dist)));
+ return (dlp / 343.3);
+}
+
// Calculate the effective head-related time delays for the each HRIR, now
// that they are minimum-phase.
static void CalculateHrtds (HrirDataT * hData) {
- float minHrtd, maxHrtd;
- int e, a, j;
- float t;
+ double minHrtd, maxHrtd;
+ uint e, a, j;
+ double t;
- minHrtd = 1000.0f;
- maxHrtd = -1000.0f;
+ minHrtd = 1000.0;
+ maxHrtd = -1000.0;
for (e = 0; e < hData -> mEvCount; e ++) {
for (a = 0; a < hData -> mAzCount [e]; a ++) {
j = hData -> mEvOffset [e] + a;
- t = CalcLTD ((-90.0f + (e * 180.0f / (hData -> mEvCount - 1))) * M_PI / 180.0f,
- (a * 360.0f / hData -> mAzCount [e]) * M_PI / 180.0f,
+ t = CalcLTD ((-90.0 + (e * 180.0 / (hData -> mEvCount - 1))) * M_PI / 180.0,
+ (a * 360.0 / hData -> mAzCount [e]) * M_PI / 180.0,
hData -> mRadius, hData -> mDistance);
hData -> mHrtds [j] = t;
- if (t > maxHrtd)
- maxHrtd = t;
- if (t < minHrtd)
- minHrtd = t;
+ maxHrtd = fmax (t, maxHrtd);
+ minHrtd = fmin (t, minHrtd);
}
}
maxHrtd -= minHrtd;
@@ -574,180 +1737,668 @@ static void CalculateHrtds (HrirDataT * hData) {
hData -> mMaxHrtd = maxHrtd;
}
-// Save the OpenAL Soft HRTF data set.
-static int SaveMhr (const HrirDataT * hData, const char * fileName) {
+// Store the OpenAL Soft HRTF data set.
+static int StoreMhr (const HrirDataT * hData, const char * filename) {
FILE * fp = NULL;
- int e, step, end, j, i;
+ uint e;
+ size_t step, end, n, j, i;
+ int hpHist, v;
- if ((fp = fopen (fileName, "wb")) == NULL) {
- fprintf (stderr, "Could not create file, '%s'.\n", fileName);
+ if ((fp = fopen (filename, "wb")) == NULL) {
+ fprintf (stderr, "Error: Could not open MHR file '%s'.\n", filename);
return (0);
}
- if (! WriteString (MHR_FORMAT, fileName, fp))
- return (0);
- if (! WriteUInt32Le ((ALuint) hData -> mIrRate, fileName, fp))
+ if (! WriteAscii (MHR_FORMAT, fp, filename))
return (0);
- if (! WriteUInt16Le ((ALushort) hData -> mIrCount, fileName, fp))
+ if (! WriteBin4 (BO_LITTLE, 4, (uint4) hData -> mIrRate, fp, filename))
return (0);
- if (! WriteUInt16Le ((ALushort) hData -> mIrSize, fileName, fp))
+ if (! WriteBin4 (BO_LITTLE, 1, (uint4) hData -> mIrPoints, fp, filename))
return (0);
- if (! WriteUInt8 ((ALubyte) hData -> mEvCount, fileName, fp))
+ if (! WriteBin4 (BO_LITTLE, 1, (uint4) hData -> mEvCount, fp, filename))
return (0);
for (e = 0; e < hData -> mEvCount; e ++) {
- if (! WriteUInt16Le ((ALushort) hData -> mEvOffset [e], fileName, fp))
+ if (! WriteBin4 (BO_LITTLE, 1, (uint4) hData -> mAzCount [e], fp, filename))
return (0);
}
step = hData -> mIrSize;
end = hData -> mIrCount * step;
+ n = hData -> mIrPoints;
+ srand (0x31DF840C);
for (j = 0; j < end; j += step) {
- for (i = 0; i < step; i ++) {
- if (! WriteFloat32AsInt16Le (hData -> mHrirs [j + i], fileName, fp))
+ hpHist = 0;
+ for (i = 0; i < n; i ++) {
+ v = HpTpdfDither (32767.0 * hData -> mHrirs [j + i], & hpHist);
+ if (! WriteBin4 (BO_LITTLE, 2, (uint4) v, fp, filename))
return (0);
}
}
for (j = 0; j < hData -> mIrCount; j ++) {
- i = (int) round (44100.0f * hData -> mHrtds [j]);
- if (i > 127)
- i = 127;
- if (! WriteUInt8 ((ALubyte) i, fileName, fp))
+// v = (int) fmin (round (44100.0 * hData -> mHrtds [j]), MAX_HRTD);
+v = fmin (hData -> mHrtds [j], MAX_HRTD);
+ if (! WriteBin4 (BO_LITTLE, 1, (uint4) v, fp, filename))
return (0);
}
fclose (fp);
return (1);
}
-// Save the OpenAL Soft built-in table.
-static int SaveTab (const HrirDataT * hData, const char * fileName) {
+// Store the OpenAL Soft built-in table.
+static int StoreTable (const HrirDataT * hData, const char * filename) {
FILE * fp = NULL;
- int step, end, j, i;
- char text [16];
+ size_t step, end, n, j, i;
+ int hpHist, v;
+ char text [128 + 1];
- if ((fp = fopen (fileName, "wb")) == NULL) {
- fprintf (stderr, "Could not create file, '%s'.\n", fileName);
+ if ((fp = fopen (filename, "wb")) == NULL) {
+ fprintf (stderr, "Error: Could not open table file '%s'.\n", filename);
return (0);
}
- if (! WriteString ("/* This data is Copyright 1994 by the MIT Media Laboratory. It is provided free\n"
- " * with no restrictions on use, provided the authors are cited when the data is\n"
- " * used in any research or commercial application. */\n"
- "/* Bill Gardner <[email protected]> and Keith Martin <[email protected]> */\n"
- "\n"
- " /* HRIR Coefficients */\n"
- " {\n", fileName, fp))
+ snprintf (text, 128, "/* Elevation metrics */\n"
+ "static const ALubyte defaultAzCount[%u] = { ", hData -> mEvCount);
+ if (! WriteAscii (text, fp, filename))
return (0);
+ for (i = 0; i < hData -> mEvCount; i ++) {
+ snprintf (text, 128, "%u, ", hData -> mAzCount [i]);
+ if (! WriteAscii (text, fp, filename))
+ return (0);
+ }
+ snprintf (text, 128, "};\n"
+ "static const ALushort defaultEvOffset[%u] = { ", hData -> mEvCount);
+ if (! WriteAscii (text, fp, filename))
+ return (0);
+ for (i = 0; i < hData -> mEvCount; i ++) {
+ snprintf (text, 128, "%u, ", hData -> mEvOffset [i]);
+ if (! WriteAscii (text, fp, filename))
+ return (0);
+ }
step = hData -> mIrSize;
end = hData -> mIrCount * step;
+ n = hData -> mIrPoints;
+ snprintf (text, 128, "};\n\n"
+ "/* HRIR Coefficients */\n"
+ "static const ALshort defaultCoeffs[%u] =\n{\n", end);
+ if (! WriteAscii (text, fp, filename))
+ return (0);
+ srand (0x31DF840C);
for (j = 0; j < end; j += step) {
- if (! WriteString (" { ", fileName, fp))
+ if (! WriteAscii (" ", fp, filename))
return (0);
- for (i = 0; i < step; i ++) {
- snprintf (text, 15, "%+d, ", (int) round (32767.0f * hData -> mHrirs [j + i]));
- if (! WriteString (text, fileName, fp))
+ hpHist = 0;
+ for (i = 0; i < n; i ++) {
+ v = HpTpdfDither (32767.0 * hData -> mHrirs [j + i], & hpHist);
+ snprintf (text, 128, "%+d, ", v);
+ if (! WriteAscii (text, fp, filename))
return (0);
}
- if (! WriteString ("},\n", fileName, fp))
+ if (! WriteAscii ("\n", fp, filename))
return (0);
}
- if (! WriteString (" },\n"
- "\n"
- " /* HRIR Delays */\n"
- " { ", fileName, fp))
+ snprintf (text, 128, "};\n\n"
+ "/* HRIR Delays */\n"
+ "static const ALubyte defaultDelays[%d] =\n{\n"
+ " ", hData -> mIrCount);
+ if (! WriteAscii (text, fp, filename))
return (0);
for (j = 0; j < hData -> mIrCount; j ++) {
- snprintf (text, 15, "%d, ", (int) round (44100.0f * hData -> mHrtds [j]));
- if (! WriteString (text, fileName, fp))
+ v = (int) fmin (round (44100.0 * hData -> mHrtds [j]), MAX_HRTD);
+ snprintf (text, 128, "%d, ", v);
+ if (! WriteAscii (text, fp, filename))
return (0);
}
- if (! WriteString ("}\n", fileName, fp))
+ if (! WriteAscii ("\n};\n\n"
+ "/* Default HRTF Definition */\n", fp, filename))
+ return (0);
+ snprintf (text, 128, "static const struct Hrtf DefaultHrtf = {\n"
+ " %u, %u, %u, defaultAzCount, defaultEvOffset,\n",
+ hData -> mIrRate, hData -> mIrPoints, hData -> mEvCount);
+ if (! WriteAscii (text, fp, filename))
+ return (0);
+ if (! WriteAscii (" defaultCoeffs, defaultDelays, NULL\n"
+ "};\n", fp, filename))
return (0);
fclose (fp);
return (1);
}
-// Loads and processes an MIT data set. At present, the HRIR and HRTD data
-// is loaded and processed in a static buffer. That should change to using
-// heap allocated memory in the future. A cleanup function will then be
-// required.
-static int MakeMit(const char *baseInName, HrirDataT *hData)
-{
- static float hrirs[MIT_IR_COUNT * MIT_IR_SIZE];
- static float hrtds[MIT_IR_COUNT];
-
- hData->mIrRate = MIT_IR_RATE;
- hData->mIrCount = MIT_IR_COUNT;
- hData->mIrSize = MIT_IR_SIZE;
- hData->mEvCount = MIT_EV_COUNT;
- hData->mEvStart = MIT_EV_START;
- hData->mEvOffset = MIT_EV_OFFSET;
- hData->mAzCount = MIT_AZ_COUNT;
- hData->mRadius = MIT_RADIUS;
- hData->mDistance = MIT_DISTANCE;
- hData->mHrirs = hrirs;
- hData->mHrtds = hrtds;
- fprintf(stderr, "Loading base HRIR data...\n");
- if(!LoadMitHrirs(baseInName, hData))
- return 0;
- fprintf(stderr, "Performing minimum phase reconstruction and truncation...\n");
- ReconstructHrirs(MIN_IR_SIZE, hData);
- fprintf(stderr, "Renormalizing minimum phase HRIR data...\n");
- RenormalizeHrirs(hData);
- fprintf(stderr, "Synthesizing missing elevations...\n");
- SynthesizeHrirs(hData);
- fprintf(stderr, "Calculating impulse delays...\n");
- CalculateHrtds(hData);
- return 1;
-}
-
-// Simple dispatch. Provided a command, the path to the MIT set of choice,
-// and an optional output filename, this will produce an OpenAL Soft
-// compatible HRTF set in the chosen format.
-int main(int argc, char *argv[])
-{
- char baseName[1024];
- const char *outName = NULL;
- HrirDataT hData;
-
- if(argc < 3 || strcmp(argv [1], "-h") == 0 || strcmp (argv [1], "--help") == 0)
- {
- fprintf(stderr, "Usage: %s <command> <path of MIT set> [ <output file> ]\n\n", argv[0]);
- fprintf(stderr, "Commands:\n");
- fprintf(stderr, " -m, --make-mhr Makes an OpenAL Soft compatible HRTF data set.\n");
- fprintf(stderr, " Defaults output to: ./oal_soft_hrtf_44100.mhr\n");
- fprintf(stderr, " -t, --make-tab Makes the built-in table used when compiling OpenAL Soft.\n");
- fprintf(stderr, " Defaults output to: ./hrtf_tables.inc\n");
- fprintf(stderr, " -h, --help Displays this help information.\n");
- return 0;
+// Process the data set definition to read and validate the data set metrics.
+static int ProcessMetrics (TokenReaderT * tr, const size_t fftSize, const size_t truncSize, HrirDataT * hData) {
+ char ident [MAX_IDENT_LEN + 1];
+ uint line, col;
+ int intVal;
+ size_t points;
+ double fpVal;
+ int hasRate = 0, hasPoints = 0, hasAzimuths = 0;
+ int hasRadius = 0, hasDistance = 0;
+
+ while (! (hasRate && hasPoints && hasAzimuths && hasRadius && hasDistance)) {
+ TrIndication (tr, & line, & col);
+ if (! TrReadIdent (tr, MAX_IDENT_LEN, ident))
+ return (0);
+ if (strcasecmp (ident, "rate") == 0) {
+ if (hasRate) {
+ TrErrorAt (tr, line, col, "Redefinition of 'rate'.\n");
+ return (0);
+ }
+ if (! TrReadOperator (tr, "="))
+ return (0);
+ if (! TrReadInt (tr, MIN_RATE, MAX_RATE, & intVal))
+ return (0);
+ hData -> mIrRate = intVal;
+ hasRate = 1;
+ } else if (strcasecmp (ident, "points") == 0) {
+ if (hasPoints) {
+ TrErrorAt (tr, line, col, "Redefinition of 'points'.\n");
+ return (0);
+ }
+ if (! TrReadOperator (tr, "="))
+ return (0);
+ TrIndication (tr, & line, & col);
+ if (! TrReadInt (tr, MIN_POINTS, MAX_POINTS, & intVal))
+ return (0);
+ points = (size_t) intVal;
+ if ((fftSize > 0) && (points > fftSize)) {
+ TrErrorAt (tr, line, col, "Value exceeds the overriden FFT size.\n");
+ return (0);
+ }
+ if (points < truncSize) {
+ TrErrorAt (tr, line, col, "Value is below the truncation size.\n");
+ return (0);
+ }
+ hData -> mIrPoints = points;
+ hData -> mFftSize = fftSize;
+ if (fftSize <= 0) {
+ points = 1;
+ while (points < (4 * hData -> mIrPoints))
+ points <<= 1;
+ hData -> mFftSize = points;
+ hData -> mIrSize = 1 + (points / 2);
+ } else {
+ hData -> mFftSize = fftSize;
+ hData -> mIrSize = 1 + (fftSize / 2);
+ if (points > hData -> mIrSize)
+ hData -> mIrSize = points;
+ }
+ hasPoints = 1;
+ } else if (strcasecmp (ident, "azimuths") == 0) {
+ if (hasAzimuths) {
+ TrErrorAt (tr, line, col, "Redefinition of 'azimuths'.\n");
+ return (0);
+ }
+ if (! TrReadOperator (tr, "="))
+ return (0);
+ hData -> mIrCount = 0;
+ hData -> mEvCount = 0;
+ hData -> mEvOffset [0] = 0;
+ for (;;) {
+ if (! TrReadInt (tr, MIN_AZ_COUNT, MAX_AZ_COUNT, & intVal))
+ return (0);
+ hData -> mAzCount [hData -> mEvCount] = intVal;
+ hData -> mIrCount += intVal;
+ hData -> mEvCount ++;
+ if (! TrIsOperator (tr, ","))
+ break;
+ if (hData -> mEvCount >= MAX_EV_COUNT) {
+ TrError (tr, "Exceeded the maximum of %d elevations.\n", MAX_EV_COUNT);
+ return (0);
+ }
+ hData -> mEvOffset [hData -> mEvCount] = hData -> mEvOffset [hData -> mEvCount - 1] + intVal;
+ TrReadOperator (tr, ",");
+ }
+ if (hData -> mEvCount < MIN_EV_COUNT) {
+ TrErrorAt (tr, line, col, "Did not reach the minimum of %d azimuth counts.\n", MIN_EV_COUNT);
+ return (0);
+ }
+ hasAzimuths = 1;
+ } else if (strcasecmp (ident, "radius") == 0) {
+ if (hasRadius) {
+ TrErrorAt (tr, line, col, "Redefinition of 'radius'.\n");
+ return (0);
+ }
+ if (! TrReadOperator (tr, "="))
+ return (0);
+ if (! TrReadFloat (tr, MIN_RADIUS, MAX_RADIUS, & fpVal))
+ return (0);
+ hData -> mRadius = fpVal;
+ hasRadius = 1;
+ } else if (strcasecmp (ident, "distance") == 0) {
+ if (hasDistance) {
+ TrErrorAt (tr, line, col, "Redefinition of 'distance'.\n");
+ return (0);
+ }
+ if (! TrReadOperator (tr, "="))
+ return (0);
+ if (! TrReadFloat (tr, MIN_DISTANCE, MAX_DISTANCE, & fpVal))
+ return (0);
+ hData -> mDistance = fpVal;
+ hasDistance = 1;
+ } else {
+ TrErrorAt (tr, line, col, "Expected a metric name.\n");
+ return (0);
}
+ TrSkipWhitespace (tr);
+ }
+ return (1);
+}
- snprintf(baseName, sizeof(baseName), "%s/elev", argv[2]);
- if(strcmp(argv[1], "-m") == 0 || strcmp(argv[1], "--make-mhr") == 0)
- {
- if(argc > 3)
- outName = argv[3];
- else
- outName = "./oal_soft_hrtf_44100.mhr";
- if(!MakeMit(baseName, &hData))
- return -1;
- fprintf(stderr, "Creating data set file...\n");
- if(!SaveMhr(&hData, outName))
- return -1;
- }
- else if(strcmp(argv[1], "-t") == 0 || strcmp(argv[1], "--make-tab") == 0)
- {
- if(argc > 3)
- outName = argv[3];
- else
- outName = "./hrtf_tables.inc";
- if(!MakeMit(baseName, &hData))
- return -1;
- fprintf(stderr, "Creating table file...\n");
- if(!SaveTab(&hData, outName))
- return -1;
+// Parse an index pair from the data set definition.
+static int ReadIndexPair (TokenReaderT * tr, const HrirDataT * hData, uint * ei, uint * ai) {
+ int intVal;
+
+ if (! TrReadInt (tr, 0, hData -> mEvCount, & intVal))
+ return (0);
+ (* ei) = (uint) intVal;
+ if (! TrReadOperator (tr, ","))
+ return (0);
+ if (! TrReadInt (tr, 0, hData -> mAzCount [(* ei)], & intVal))
+ return (0);
+ (* ai) = (uint) intVal;
+ return (1);
+}
+
+// Match the source format from a given identifier.
+static SourceFormatT MatchSourceFormat (const char * ident) {
+ if (strcasecmp (ident, "wave") == 0)
+ return (SF_WAVE);
+ else if (strcasecmp (ident, "bin_le") == 0)
+ return (SF_BIN_LE);
+ else if (strcasecmp (ident, "bin_be") == 0)
+ return (SF_BIN_BE);
+ else if (strcasecmp (ident, "ascii") == 0)
+ return (SF_ASCII);
+ return (SF_NONE);
+}
+
+// Match the source element type from a given identifier.
+static ElementTypeT MatchElementType (const char * ident) {
+ if (strcasecmp (ident, "int") == 0)
+ return (ET_INT);
+ else if (strcasecmp (ident, "fp") == 0)
+ return (ET_FP);
+ return (ET_NONE);
+}
+
+// Parse and validate a source reference from the data set definition.
+static int ReadSourceRef (TokenReaderT * tr, SourceRefT * src) {
+ uint line, col;
+ char ident [MAX_IDENT_LEN + 1];
+ int intVal;
+
+ TrIndication (tr, & line, & col);
+ if (! TrReadIdent (tr, MAX_IDENT_LEN, ident))
+ return (0);
+ src -> mFormat = MatchSourceFormat (ident);
+ if (src -> mFormat == SF_NONE) {
+ TrErrorAt (tr, line, col, "Expected a source format.\n");
+ return (0);
+ }
+ if (! TrReadOperator (tr, "("))
+ return (0);
+ if (src -> mFormat == SF_WAVE) {
+ if (! TrReadInt (tr, 0, MAX_WAVE_CHANNELS, & intVal))
+ return (0);
+ src -> mType = ET_NONE;
+ src -> mSize = 0;
+ src -> mBits = 0;
+ src -> mChannel = (uint) intVal;
+ src -> mSkip = 0;
+ } else {
+ TrIndication (tr, & line, & col);
+ if (! TrReadIdent (tr, MAX_IDENT_LEN, ident))
+ return (0);
+ src -> mType = MatchElementType (ident);
+ if (src -> mType == ET_NONE) {
+ TrErrorAt (tr, line, col, "Expected a source element type.\n");
+ return (0);
+ }
+ if ((src -> mFormat == SF_BIN_LE) || (src -> mFormat == SF_BIN_BE)) {
+ if (! TrReadOperator (tr, ","))
+ return (0);
+ if (src -> mType == ET_INT) {
+ if (! TrReadInt (tr, MIN_BIN_SIZE, MAX_BIN_SIZE, & intVal))
+ return (0);
+ src -> mSize = intVal;
+ if (TrIsOperator (tr, ",")) {
+ TrReadOperator (tr, ",");
+ TrIndication (tr, & line, & col);
+ if (! TrReadInt (tr, 0x80000000, 0x7FFFFFFF, & intVal))
+ return (0);
+ if ((abs (intVal) < MIN_BIN_BITS) || (abs (intVal) > (8 * src -> mSize))) {
+ TrErrorAt (tr, line, col, "Expected a value of (+/-) %d to %d.\n", MIN_BIN_BITS, 8 * src -> mSize);
+ return (0);
+ }
+ src -> mBits = intVal;
+ } else {
+ src -> mBits = 8 * src -> mSize;
+ }
+ } else {
+ TrIndication (tr, & line, & col);
+ if (! TrReadInt (tr, 0x80000000, 0x7FFFFFFF, & intVal))
+ return (0);
+ if ((intVal != 4) && (intVal != 8)) {
+ TrErrorAt (tr, line, col, "Expected a value of 4 or 8.\n");
+ return (0);
+ }
+ src -> mSize = (uint) intVal;
+ src -> mBits = 0;
+ }
+ } else if ((src -> mFormat == SF_ASCII) && (src -> mType == ET_INT)) {
+ if (! TrReadOperator (tr, ","))
+ return (0);
+ if (! TrReadInt (tr, MIN_ASCII_BITS, MAX_ASCII_BITS, & intVal))
+ return (0);
+ src -> mSize = 0;
+ src -> mBits = intVal;
+ } else {
+ src -> mSize = 0;
+ src -> mBits = 0;
+ }
+ if (TrIsOperator (tr, ";")) {
+ TrReadOperator (tr, ";");
+ if (! TrReadInt (tr, 0, 0x7FFFFFFF, & intVal))
+ return (0);
+ src -> mSkip = (uint) intVal;
+ } else {
+ src -> mSkip = 0;
+ }
+ }
+ if (! TrReadOperator (tr, ")"))
+ return (0);
+ if (TrIsOperator (tr, "@")) {
+ TrReadOperator (tr, "@");
+ if (! TrReadInt (tr, 0, 0x7FFFFFFF, & intVal))
+ return (0);
+ src -> mOffset = (uint) intVal;
+ } else {
+ src -> mOffset = 0;
+ }
+ if (! TrReadOperator (tr, ":"))
+ return (0);
+ if (! TrReadString (tr, MAX_PATH_LEN, src -> mPath))
+ return (0);
+ return (1);
+}
+
+// Process the list of sources in the data set definition.
+static int ProcessSources (TokenReaderT * tr, HrirDataT * hData) {
+ uint * setCount = NULL, * setFlag = NULL;
+ double * hrir = NULL;
+ uint line, col, ei, ai;
+ SourceRefT src;
+ double factor;
+
+ setCount = (uint *) calloc (hData -> mEvCount, sizeof (uint));
+ setFlag = (uint *) calloc (hData -> mIrCount, sizeof (uint));
+ hrir = CreateArray (hData -> mIrPoints);
+ while (TrIsOperator (tr, "[")) {
+ TrIndication (tr, & line, & col);
+ TrReadOperator (tr, "[");
+ if (ReadIndexPair (tr, hData, & ei, & ai)) {
+ if (TrReadOperator (tr, "]")) {
+ if (! setFlag [hData -> mEvOffset [ei] + ai]) {
+ if (TrReadOperator (tr, "=")) {
+ factor = 1.0;
+ for (;;) {
+ if (ReadSourceRef (tr, & src)) {
+ if (LoadSource (& src, hData -> mIrRate, hData -> mIrPoints, hrir)) {
+ AverageHrirMagnitude (hrir, 1.0 / factor, ei, ai, hData);
+ factor += 1.0;
+ if (! TrIsOperator (tr, "+"))
+ break;
+ TrReadOperator (tr, "+");
+ continue;
+ }
+ }
+ DestroyArray (hrir);
+ free (setFlag);
+ free (setCount);
+ return (0);
+ }
+ setFlag [hData -> mEvOffset [ei] + ai] = 1;
+ setCount [ei] ++;
+ continue;
+ }
+ } else {
+ TrErrorAt (tr, line, col, "Redefinition of source.\n");
+ }
+ }
}
- else
- {
- fprintf(stderr, "Invalid command '%s'\n", argv[1]);
- return -1;
+ DestroyArray (hrir);
+ free (setFlag);
+ free (setCount);
+ return (0);
+ }
+ ei = 0;
+ while ((ei < hData -> mEvCount) && (setCount [ei] < 1))
+ ei ++;
+ if (ei < hData -> mEvCount) {
+ hData -> mEvStart = ei;
+ while ((ei < hData -> mEvCount) && (setCount [ei] == hData -> mAzCount [ei]))
+ ei ++;
+ if (ei >= hData -> mEvCount) {
+ if (! TrLoad (tr)) {
+ DestroyArray (hrir);
+ free (setFlag);
+ free (setCount);
+ return (1);
+ } else {
+ TrError (tr, "Errant data at end of source list.\n");
+ }
+ } else {
+ TrError (tr, "Missing sources for elevation index %d.\n", ei);
+ }
+ } else {
+ TrError (tr, "Missing source references.\n");
+ }
+ DestroyArray (hrir);
+ free (setFlag);
+ free (setCount);
+ return (0);
+}
+
+/* Parse the data set definition and process the source data, storing the
+ * resulting data set as desired. If the input name is NULL it will read
+ * from standard input.
+ */
+static int ProcessDefinition (const char * inName, const size_t fftSize, const int equalize, const int surface, const double limit, const size_t truncSize, const OutputFormatT outFormat, const char * outName) {
+ FILE * fp = NULL;
+ TokenReaderT tr;
+ HrirDataT hData;
+ double * dfa = NULL;
+ char rateStr [8 + 1], expName [MAX_PATH_LEN];
+
+ hData.mIrRate = 0;
+ hData.mIrPoints = 0;
+ hData.mFftSize = 0;
+ hData.mIrSize = 0;
+ hData.mIrCount = 0;
+ hData.mEvCount = 0;
+ hData.mRadius = 0;
+ hData.mDistance = 0;
+
+ fprintf (stdout, "Reading HRIR definition...\n");
+ if (inName != NULL) {
+ fp = fopen (inName, "r");
+ if (fp == NULL) {
+ fprintf (stderr, "Error: Could not open definition file '%s'\n", inName);
+ return (0);
+ }
+ TrSetup (fp, inName, & tr);
+ } else {
+ fp = stdin;
+ TrSetup (fp, "<stdin>", & tr);
+ }
+ if (! ProcessMetrics (& tr, fftSize, truncSize, & hData)) {
+ if (inName != NULL)
+ fclose (fp);
+ return (0);
+ }
+ hData . mHrirs = CreateArray (hData . mIrCount * hData . mIrSize);
+ hData . mHrtds = CreateArray (hData . mIrCount);
+ if (! ProcessSources (& tr, & hData)) {
+ DestroyArray (hData . mHrtds);
+ DestroyArray (hData . mHrirs);
+ if (inName != NULL)
+ fclose (fp);
+ return (0);
+ }
+ if (inName != NULL)
+ fclose (fp);
+ if (equalize) {
+ dfa = CreateArray (1 + (hData . mFftSize / 2));
+ fprintf (stdout, "Calculating diffuse-field average...\n");
+ CalculateDiffuseFieldAverage (& hData, surface, limit, dfa);
+ fprintf (stdout, "Performing diffuse-field equalization...\n");
+ DiffuseFieldEqualize (dfa, & hData);
+ DestroyArray (dfa);
+ }
+ fprintf (stdout, "Performing minimum phase reconstruction...\n");
+ ReconstructHrirs (& hData);
+ fprintf (stdout, "Truncating minimum-phase HRIRs...\n");
+ hData . mIrPoints = truncSize;
+ fprintf (stdout, "Synthesizing missing elevations...\n");
+ SynthesizeHrirs (& hData);
+ fprintf (stdout, "Normalizing final HRIRs...\n");
+ NormalizeHrirs (& hData);
+ fprintf (stdout, "Calculating impulse delays...\n");
+ CalculateHrtds (& hData);
+ snprintf (rateStr, 8, "%u", hData . mIrRate);
+ StrSubst (outName, "%r", rateStr, MAX_PATH_LEN, expName);
+ switch (outFormat) {
+ case OF_MHR :
+ fprintf (stdout, "Creating MHR data set file...\n");
+ if (! StoreMhr (& hData, expName))
+ return (0);
+ break;
+ case OF_TABLE :
+ fprintf (stderr, "Creating OpenAL Soft table file...\n");
+ if (! StoreTable (& hData, expName))
+ return (0);
+ break;
+ default :
+ break;
+ }
+ DestroyArray (hData . mHrtds);
+ DestroyArray (hData . mHrirs);
+ return (1);
+}
+
+// Standard command line dispatch.
+int main (const int argc, const char * argv []) {
+ const char * inName = NULL, * outName = NULL;
+ OutputFormatT outFormat;
+ int argi;
+ size_t fftSize;
+ int equalize, surface;
+ double limit;
+ size_t truncSize;
+ char * end = NULL;
+
+ if (argc < 2) {
+ fprintf (stderr, "Error: No command specified. See '%s -h' for help.\n", argv [0]);
+ return (-1);
+ }
+ if ((strcmp (argv [1], "--help") == 0) || (strcmp (argv [1], "-h") == 0)) {
+ fprintf (stdout, "HRTF Processing and Composition Utility\n\n");
+ fprintf (stdout, "Usage: %s <command> [<option>...]\n\n", argv [0]);
+ fprintf (stdout, "Commands:\n");
+ fprintf (stdout, " -m, --make-mhr Makes an OpenAL Soft compatible HRTF data set.\n");
+ fprintf (stdout, " Defaults output to: ./oalsoft_hrtf_%%r.mhr\n");
+ fprintf (stdout, " -t, --make-tab Makes the built-in table used when compiling OpenAL Soft.\n");
+ fprintf (stdout, " Defaults output to: ./hrtf_tables.inc\n");
+ fprintf (stdout, " -h, --help Displays this help information.\n\n");
+ fprintf (stdout, "Options:\n");
+ fprintf (stdout, " -f=<points> Override the FFT window size (defaults to the first power-\n");
+ fprintf (stdout, " of-two that fits four times the number of HRIR points).\n");
+ fprintf (stdout, " -e={on|off} Toggle diffuse-field equalization (default: %s).\n", (DEFAULT_EQUALIZE ? "on" : "off"));
+ fprintf (stdout, " -s={on|off} Toggle surface-weighted diffuse-field average (default: %s).\n", (DEFAULT_SURFACE ? "on" : "off"));
+ fprintf (stdout, " -l={<dB>|none} Specify a limit to the magnitude range of the diffuse-field\n");
+ fprintf (stdout, " average (default: %.2f).\n", DEFAULT_LIMIT);
+ fprintf (stdout, " -w=<points> Specify the size of the truncation window that's applied\n");
+ fprintf (stdout, " after minimum-phase reconstruction (default: %d).\n", DEFAULT_TRUNCSIZE);
+ fprintf (stdout, " -i=<filename> Specify an HRIR definition file to use (defaults to stdin).\n");
+ fprintf (stdout, " -o=<filename> Specify an output file. Overrides command-selected default.\n");
+ fprintf (stdout, " Use of '%%r' will be substituted with the data set sample rate.\n");
+ return (0);
+ }
+ if ((strcmp (argv [1], "--make-mhr") == 0) || (strcmp (argv [1], "-m") == 0)) {
+ if (argc > 3)
+ outName = argv [3];
+ else
+ outName = "./oalsoft_hrtf_%r.mhr";
+ outFormat = OF_MHR;
+ } else if ((strcmp (argv [1], "--make-tab") == 0) || (strcmp (argv [1], "-t") == 0)) {
+ if (argc > 3)
+ outName = argv [3];
+ else
+ outName = "./hrtf_tables.inc";
+ outFormat = OF_TABLE;
+ } else {
+ fprintf (stderr, "Error: Invalid command '%s'.\n", argv [1]);
+ return (-1);
+ }
+ argi = 2;
+ fftSize = 0;
+ equalize = DEFAULT_EQUALIZE;
+ surface = DEFAULT_SURFACE;
+ limit = DEFAULT_LIMIT;
+ truncSize = DEFAULT_TRUNCSIZE;
+ while (argi < argc) {
+ if (strncmp (argv [argi], "-f=", 3) == 0) {
+ fftSize = strtoul (& argv [argi] [3], & end, 10);
+ if ((end [0] != '\0') || (fftSize & (fftSize - 1)) || (fftSize < MIN_FFTSIZE) || (fftSize > MAX_FFTSIZE)) {
+ fprintf (stderr, "Error: Expected a power-of-two value from %d to %d for '-f'.\n", MIN_FFTSIZE, MAX_FFTSIZE);
+ return (-1);
+ }
+ } else if (strncmp (argv [argi], "-e=", 3) == 0) {
+ if (strcmp (& argv [argi] [3], "on") == 0) {
+ equalize = 1;
+ } else if (strcmp (& argv [argi] [3], "off") == 0) {
+ equalize = 0;
+ } else {
+ fprintf (stderr, "Error: Expected 'on' or 'off' for '-e'.\n");
+ return (-1);
+ }
+ } else if (strncmp (argv [argi], "-s=", 3) == 0) {
+ if (strcmp (& argv [argi] [3], "on") == 0) {
+ surface = 1;
+ } else if (strcmp (& argv [argi] [3], "off") == 0) {
+ surface = 0;
+ } else {
+ fprintf (stderr, "Error: Expected 'on' or 'off' for '-s'.\n");
+ return (-1);
+ }
+ } else if (strncmp (argv [argi], "-l=", 3) == 0) {
+ if (strcmp (& argv [argi] [3], "none") == 0) {
+ limit = 0.0;
+ } else {
+ limit = strtod (& argv [argi] [3], & end);
+ if ((end [0] != '\0') || (limit < MIN_LIMIT) || (limit > MAX_LIMIT)) {
+ fprintf (stderr, "Error: Expected 'none' or a value from %.2f to %.2f for '-l'.\n", MIN_LIMIT, MAX_LIMIT);
+ return (-1);
+ }
+ }
+ } else if (strncmp (argv [argi], "-w=", 3) == 0) {
+ truncSize = strtoul (& argv [argi] [3], & end, 10);
+ if ((end [0] != '\0') || (truncSize < MIN_TRUNCSIZE) || (truncSize > MAX_TRUNCSIZE) || (truncSize % MOD_TRUNCSIZE)) {
+ fprintf (stderr, "Error: Expected a value from %d to %d in multiples of %d for '-w'.\n", MIN_TRUNCSIZE, MAX_TRUNCSIZE, MOD_TRUNCSIZE);
+ return (-1);
+ }
+ } else if (strncmp (argv [argi], "-i=", 3) == 0) {
+ inName = & argv [argi] [3];
+ } else if (strncmp (argv [argi], "-o=", 3) == 0) {
+ outName = & argv [argi] [3];
+ } else {
+ fprintf (stderr, "Error: Invalid option '%s'.\n", argv [argi]);
+ return (-1);
}
- fprintf(stderr, "Done.\n");
- return 0;
+ argi ++;
+ }
+ if (! ProcessDefinition (inName, fftSize, equalize, surface, limit, truncSize, outFormat, outName))
+ return (-1);
+ fprintf (stdout, "Operation completed.\n");
+ return (0);
}
+
+
+
+