ft2-clone

Fasttracker 2 clone
Log | Files | Refs | README | LICENSE

commit e5d197d470859f5f951fcbae17da7d6e99a53163
parent 0fe93d0068b6303b3367a825fe9012bc7dad0387
Author: Olav Sørensen <olav.sorensen@live.no>
Date:   Sun, 27 Sep 2020 18:47:41 +0200

Pushed v1.35 code

- Added an option to change interpolation mode to 2-tap linear, just to match
  real FT2. This interpolation method is of worse quality than the current one
  (4-tap cubic spline).
- Fixed some sample tap bugs with the cubic spline resampling interpolation
- Fixed an issue where unwanted sample data could be shown at the loop end
  point of a looped sample in the sample editor.
- Updated some parts of the help text
- Small code cleanup

Diffstat:
Msrc/ft2_about.c | 25+++++++++++++------------
Msrc/ft2_audio.c | 24+++++++++++++++++++-----
Msrc/ft2_audio.h | 10+++++++---
Msrc/ft2_checkboxes.c | 3+--
Msrc/ft2_checkboxes.h | 1-
Msrc/ft2_config.c | 72++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
Msrc/ft2_config.h | 8+++++++-
Msrc/ft2_header.h | 2+-
Msrc/ft2_main.c | 2--
Msrc/ft2_radiobuttons.c | 16+++++++++++-----
Msrc/ft2_radiobuttons.h | 8+++++++-
Msrc/ft2_replayer.c | 6++++--
Msrc/ft2_replayer.h | 5++++-
Msrc/ft2_sample_ed.c | 477++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Msrc/ft2_sample_ed.h | 4++--
Msrc/ft2_sample_saver.c | 152++++++++++++++++++++++++++++++++-----------------------------------------------
Msrc/helpdata/FT2.HLP | 23++++++++---------------
Msrc/helpdata/ft2_help_data.h | 2228+++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/mixer/ft2_center_mix.c | 944+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
Msrc/mixer/ft2_center_mix.h | 47+++++++++++++++++++++++++++++++++++------------
Dsrc/mixer/ft2_cubic.c | 59-----------------------------------------------------------
Dsrc/mixer/ft2_cubic.h | 22----------------------
Asrc/mixer/ft2_cubicspline.c | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/mixer/ft2_cubicspline.h | 22++++++++++++++++++++++
Msrc/mixer/ft2_mix.c | 1073+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
Msrc/mixer/ft2_mix.h | 2+-
Msrc/mixer/ft2_mix_macros.h | 172++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
Msrc/mixer/ft2_silence_mix.h | 3+++
Mvs2019_project/ft2-clone/ft2-clone.vcxproj | 12++++++------
Mvs2019_project/ft2-clone/ft2-clone.vcxproj.filters | 4++--
30 files changed, 3623 insertions(+), 1862 deletions(-)

diff --git a/src/ft2_about.c b/src/ft2_about.c @@ -37,6 +37,7 @@ static const uint8_t starColConv[24] = { 2,2,2,2,2,2,2,2, 2,2,2,1,1,1,3,3, 3,3,3 static int16_t hastighet; static int32_t lastStarScreenPos[NUM_STARS]; static uint32_t randSeed; +static double pi; static vector_t starcrd[NUM_STARS]; static rotate_t star_a; static matrix_t starmat; @@ -62,12 +63,12 @@ static void fixaMatris(rotate_t a, matrix_t *mat) int32_t sa, sb, sc, ca, cb, cc; // original code used a cos/sin table, but this only runs once per frame, no need... - sa = (int32_t)round(32767.0 * sin(a.x * (2.0 * M_PI / 65536.0))); - ca = (int32_t)round(32767.0 * cos(a.x * (2.0 * M_PI / 65536.0))); - sb = (int32_t)round(32767.0 * sin(a.y * (2.0 * M_PI / 65536.0))); - cb = (int32_t)round(32767.0 * cos(a.y * (2.0 * M_PI / 65536.0))); - sc = (int32_t)round(32767.0 * sin(a.z * (2.0 * M_PI / 65536.0))); - cc = (int32_t)round(32767.0 * cos(a.z * (2.0 * M_PI / 65536.0))); + sa = (int32_t)round(32767.0 * sin(a.x * (2.0 * pi / 65536.0))); + ca = (int32_t)round(32767.0 * cos(a.x * (2.0 * pi / 65536.0))); + sb = (int32_t)round(32767.0 * sin(a.y * (2.0 * pi / 65536.0))); + cb = (int32_t)round(32767.0 * cos(a.y * (2.0 * pi / 65536.0))); + sc = (int32_t)round(32767.0 * sin(a.z * (2.0 * pi / 65536.0))); + cc = (int32_t)round(32767.0 * cos(a.z * (2.0 * pi / 65536.0))); mat->x.x = (int16_t)(((ca * cc) >> 16) + ((sc * ((sa * sb) >> 16)) >> (16-1))); mat->y.x = (int16_t)((sa * cb) >> 16); @@ -94,6 +95,8 @@ static void aboutInit(void) int32_t r, n, w, h; double ww; + pi = 4.0 * atan(1.0); // M_PI can not be trusted + type = (uint8_t)random32(4); switch (type) { @@ -125,7 +128,7 @@ static void aboutInit(void) r = random32(30000); n = random32(5); w = ((2 * random32(2)) - 1) * sqr(random32(1000)); - ww = (((M_PI * 2.0) / 5.0) * n) + (r / 12000.0) + (w / 3000000.0); + ww = (((pi * 2.0) / 5.0) * n) + (r / 12000.0) + (w / 3000000.0); h = ((sqr(r) / 30000) * (random32(10000) - 5000)) / 12000; starcrd[i].x = (int16_t)(r * cos(ww)); @@ -146,9 +149,9 @@ static void aboutInit(void) w = random32(3000); ww = ((w * 8) + r) / 16.0; - const int32_t z = (int32_t)round(32767.0 * cos(w * (2.0 * M_PI / 1024.0))); - const int32_t y = (int32_t)round(32767.0 * sin(w * (2.0 * M_PI / 1024.0))); - const int32_t x = (int32_t)round(32767.0 * cos(ww * (2.0 * M_PI / 1024.0))) / 4; + const int32_t z = (int32_t)round(32767.0 * cos(w * (2.0 * pi / 1024.0))); + const int32_t y = (int32_t)round(32767.0 * sin(w * (2.0 * pi / 1024.0))); + const int32_t x = (int32_t)round(32767.0 * cos(ww * (2.0 * pi / 1024.0))) / 4; starcrd[i].z = (int16_t)((z * (w + r)) / 3500); starcrd[i].y = (int16_t)((y * (w + r)) / 3500); @@ -234,8 +237,6 @@ void aboutFrame(void) realStars(); } -extern uint32_t *unpackedData; - void showAboutScreen(void) // called once when About screen is opened { #define TEXT_BORDER_COL 0x202020 diff --git a/src/ft2_audio.c b/src/ft2_audio.c @@ -186,10 +186,10 @@ void audioSetVolRamp(bool volRamp) unlockMixerCallback(); } -void audioSetInterpolation(bool interpolation) +void audioSetInterpolationType(uint8_t interpolationType) { lockMixerCallback(); - audio.interpolationFlag = interpolation; + audio.interpolationType = interpolationType; unlockMixerCallback(); } @@ -321,13 +321,27 @@ static void voiceTrigger(int32_t i, sampleTyp *s, int32_t position) { v->base16 = (const int16_t *)s->pek; v->revBase16 = &v->base16[loopStart + loopEnd]; // for pingpong loops + + // first tap [-1] sample for special case: if (hasLooped && pos == loopStart) + if (loopType == 1) + v->fTapFixSample = v->base16[loopEnd-1]; + else if (loopType == 2) + v->fTapFixSample = v->base16[loopStart]; } else { v->base8 = s->pek; v->revBase8 = &v->base8[loopStart + loopEnd]; // for pingpong loops + + // first tap [-1] sample for special case: if (hasLooped && pos == loopStart) + if (loopType == 1) + v->fTapFixSample = v->base8[loopEnd-1]; + else if (loopType == 2) + v->fTapFixSample = v->base8[loopStart]; } + v->hasLooped = false; // for cubic interpolation special case (read fTapFixSample comment above) + v->backwards = false; v->loopType = loopType; v->end = (loopType > 0) ? loopEnd : length; @@ -343,7 +357,7 @@ static void voiceTrigger(int32_t i, sampleTyp *s, int32_t position) return; } - v->mixFuncOffset = (sampleIs16Bit * 6) + (audio.interpolationFlag * 3) + loopType; + v->mixFuncOffset = (sampleIs16Bit * 9) + (audio.interpolationType * 3) + loopType; v->active = true; } @@ -548,13 +562,13 @@ static void doChannelMixing(int32_t samplesToMix) centerMixFlag = v->fVolL == v->fVolR; } - mixFuncTab[(centerMixFlag * 24) + (volRampFlag * 12) + v->mixFuncOffset](v, samplesToMix); + mixFuncTab[(centerMixFlag * 36) + (volRampFlag * 18) + v->mixFuncOffset](v, samplesToMix); } if (r->active) // volume ramp fadeout-voice { const bool centerMixFlag = (r->fDestVolL == r->fDestVolR) && (r->fVolDeltaL == r->fVolDeltaR); - mixFuncTab[(centerMixFlag * 24) + 12 + r->mixFuncOffset](r, samplesToMix); + mixFuncTab[(centerMixFlag * 36) + 18 + r->mixFuncOffset](r, samplesToMix); } } } diff --git a/src/ft2_audio.h b/src/ft2_audio.h @@ -11,6 +11,8 @@ enum FREQ_TABLE_AMIGA = 1, }; +#define NUM_FIXED_TAP_SAMPLES 2 + #define MIN_AUDIO_FREQ 44100 #define MAX_AUDIO_FREQ 192000 @@ -27,8 +29,9 @@ typedef struct audio_t { char *currInputDevice, *currOutputDevice, *lastWorkingAudioDeviceName; char *inputDeviceNames[MAX_AUDIO_DEVICES], *outputDeviceNames[MAX_AUDIO_DEVICES]; - volatile bool locked, resetSyncTickTimeFlag, volumeRampingFlag, interpolationFlag; + volatile bool locked, resetSyncTickTimeFlag, volumeRampingFlag; bool linearFreqTable, rescanAudioDevicesSupported; + volatile uint8_t interpolationType; int32_t quickVolRampSamples, inputDeviceNum, outputDeviceNum, lastWorkingAudioFreq, lastWorkingAudioBits; uint32_t freq, audLatencyPerfValInt, audLatencyPerfValFrac, samplesPerTick, musicTimeSpeedVal; uint64_t tickTime64, tickTime64Frac, tickTimeLengthTab[MAX_BPM+1]; @@ -44,11 +47,12 @@ typedef struct { const int8_t *base8, *revBase8; const int16_t *base16, *revBase16; - bool active, backwards, isFadeOutVoice; + bool active, backwards, isFadeOutVoice, hasLooped; uint8_t mixFuncOffset, pan, loopType; int32_t pos, end, loopStart, loopLength; uint32_t volRampSamples, revDelta; uint64_t posFrac, delta; + float fTapFixSample; // if (loopStart > 0 && pos == loopStart) useThisForFirstTap(); float fVol, fDestVolL, fDestVolR, fVolL, fVolR, fVolDeltaL, fVolDeltaR; } voice_t; @@ -98,7 +102,7 @@ void setNewAudioFreq(uint32_t freq); void setBackOldAudioFreq(void); void setSpeed(uint16_t bpm); void audioSetVolRamp(bool volRamp); -void audioSetInterpolation(bool interpolation); +void audioSetInterpolationType(uint8_t interpolationType); void stopVoice(int32_t i); bool setupAudio(bool showErrorMsg); void closeAudio(void); diff --git a/src/ft2_checkboxes.c b/src/ft2_checkboxes.c @@ -81,8 +81,7 @@ checkBox_t checkBoxes[NUM_CHECKBOXES] = // ------ CONFIG CHECKBOXES ------ //x, y, w, h, funcOnUp { 3, 91, 77, 12, cbToggleAutoSaveConfig }, - { 389, 132, 90, 12, cbConfigInterpolation }, - { 389, 145, 107, 12, cbConfigVolRamp }, + { 389, 159, 107, 12, cbConfigVolRamp }, { 113, 14, 108, 12, cbConfigPattStretch }, { 113, 27, 117, 12, cbConfigHexCount }, { 113, 40, 81, 12, cbConfigAccidential }, diff --git a/src/ft2_checkboxes.h b/src/ft2_checkboxes.h @@ -54,7 +54,6 @@ enum // CHECKBOXES CB_CONF_AUTOSAVE, // CONFIG AUDIO - CB_CONF_INTERPOLATION, CB_CONF_VOL_RAMP, // CONFIG LAYOUT diff --git a/src/ft2_config.c b/src/ft2_config.c @@ -47,7 +47,7 @@ uint8_t configBuffer[CONFIG_FILE_SIZE]; static void xorConfigBuffer(uint8_t *ptr8) { for (int32_t i = 0; i < CONFIG_FILE_SIZE; i++) - ptr8[i] ^= (uint8_t)(i * 7); + ptr8[i] ^= i*7; } static int32_t calcChecksum(uint8_t *p, uint16_t len) // for nibbles highscore data @@ -141,6 +141,8 @@ static void loadConfigFromBuffer(void) config.recMIDIVolSens = CLAMP(config.recMIDIVolSens, 0, 200); config.recMIDIChn = CLAMP(config.recMIDIChn, 1, 16); + config.interpolation &= 3; // one extra bit used in FT2 clone (off, cubic, linear) + if (config.recTrueInsert > 1) config.recTrueInsert = 1; @@ -179,7 +181,7 @@ static void loadConfigFromBuffer(void) if (audio.dev != 0) setNewAudioSettings(); - audioSetInterpolation(config.interpolation ? true : false); + audioSetInterpolationType(config.interpolation); audioSetVolRamp((config.specialFlags & NO_VOLRAMP_FLAG) ? false : true); setAudioAmp(config.boostLevel, config.masterVol, config.specialFlags & BITDEPTH_32); setMouseShape(config.mouseType); @@ -827,6 +829,18 @@ void setConfigIORadioButtonStates(void) // accessed by other .c files radioButtons[tmpID].state = RADIOBUTTON_CHECKED; + // AUDIO INTERPOLATION + uncheckRadioButtonGroup(RB_GROUP_CONFIG_AUDIO_INTERPOLATION); + + if (config.interpolation == INTERPOLATION_NONE) + tmpID = RB_CONFIG_AUDIO_INTRP_NONE; + else if (config.interpolation == INTERPOLATION_LINEAR) + tmpID = RB_CONFIG_AUDIO_INTRP_LINEAR; + else + tmpID = RB_CONFIG_AUDIO_INTRP_CUBIC; + + radioButtons[tmpID].state = RADIOBUTTON_CHECKED; + // AUDIO FREQUENCY uncheckRadioButtonGroup(RB_GROUP_CONFIG_AUDIO_FREQ); switch (config.audioFreq) @@ -857,6 +871,7 @@ void setConfigIORadioButtonStates(void) // accessed by other .c files showRadioButtonGroup(RB_GROUP_CONFIG_SOUND_BUFF_SIZE); showRadioButtonGroup(RB_GROUP_CONFIG_AUDIO_BIT_DEPTH); + showRadioButtonGroup(RB_GROUP_CONFIG_AUDIO_INTERPOLATION); showRadioButtonGroup(RB_GROUP_CONFIG_AUDIO_FREQ); showRadioButtonGroup(RB_GROUP_CONFIG_AUDIO_INPUT_FREQ); showRadioButtonGroup(RB_GROUP_CONFIG_FREQ_TABLE); @@ -864,10 +879,7 @@ void setConfigIORadioButtonStates(void) // accessed by other .c files static void setConfigIOCheckButtonStates(void) { - checkBoxes[CB_CONF_INTERPOLATION].checked = config.interpolation; checkBoxes[CB_CONF_VOL_RAMP].checked = (config.specialFlags & NO_VOLRAMP_FLAG) ? false : true; - - showCheckBox(CB_CONF_INTERPOLATION); showCheckBox(CB_CONF_VOL_RAMP); } @@ -1110,9 +1122,9 @@ void showConfigScreen(void) drawFramework(110, 0, 276, 87, FRAMEWORK_TYPE1); drawFramework(110, 87, 276, 86, FRAMEWORK_TYPE1); - drawFramework(386, 0, 119, 73, FRAMEWORK_TYPE1); - drawFramework(386, 73, 119, 44, FRAMEWORK_TYPE1); - drawFramework(386, 117, 119, 56, FRAMEWORK_TYPE1); + drawFramework(386, 0, 119, 58, FRAMEWORK_TYPE1); + drawFramework(386, 58, 119, 44, FRAMEWORK_TYPE1); + drawFramework(386, 102, 119, 71, FRAMEWORK_TYPE1); drawFramework(505, 0, 127, 73, FRAMEWORK_TYPE1); drawFramework(505, 117, 127, 56, FRAMEWORK_TYPE1); @@ -1149,13 +1161,15 @@ void showConfigScreen(void) textOutShadow(406, 31, PAL_FORGRND, PAL_DSKTOP2, "Medium (default)"); textOutShadow(406, 45, PAL_FORGRND, PAL_DSKTOP2, "Large"); - textOutShadow(390, 76, PAL_FORGRND, PAL_DSKTOP2, "Audio bit depth:"); - textOutShadow(406, 90, PAL_FORGRND, PAL_DSKTOP2, "16-bit (default)"); - textOutShadow(406, 104, PAL_FORGRND, PAL_DSKTOP2, "32-bit float"); + textOutShadow(390, 61, PAL_FORGRND, PAL_DSKTOP2, "Audio bit depth:"); + textOutShadow(406, 75, PAL_FORGRND, PAL_DSKTOP2, "16-bit (default)"); + textOutShadow(406, 89, PAL_FORGRND, PAL_DSKTOP2, "32-bit float"); - textOutShadow(390, 120, PAL_FORGRND, PAL_DSKTOP2, "Mixer settings:"); - textOutShadow(406, 134, PAL_FORGRND, PAL_DSKTOP2, "Interpolation"); - textOutShadow(406, 147, PAL_FORGRND, PAL_DSKTOP2, "Volume ramping"); + textOutShadow(390, 105, PAL_FORGRND, PAL_DSKTOP2, "Interpolation:"); + textOutShadow(406, 118, PAL_FORGRND, PAL_DSKTOP2, "None"); + textOutShadow(406, 132, PAL_FORGRND, PAL_DSKTOP2, "Linear (FT2)"); + textOutShadow(406, 146, PAL_FORGRND, PAL_DSKTOP2, "Cubic spline"); + textOutShadow(406, 161, PAL_FORGRND, PAL_DSKTOP2, "Volume ramping"); textOutShadow(509, 3, PAL_FORGRND, PAL_DSKTOP2, "Mixing frequency:"); textOutShadow(525, 17, PAL_FORGRND, PAL_DSKTOP2, "44100Hz"); @@ -1398,10 +1412,10 @@ void hideConfigScreen(void) // CONFIG AUDIO hideRadioButtonGroup(RB_GROUP_CONFIG_SOUND_BUFF_SIZE); hideRadioButtonGroup(RB_GROUP_CONFIG_AUDIO_BIT_DEPTH); + hideRadioButtonGroup(RB_GROUP_CONFIG_AUDIO_INTERPOLATION); hideRadioButtonGroup(RB_GROUP_CONFIG_AUDIO_FREQ); hideRadioButtonGroup(RB_GROUP_CONFIG_AUDIO_INPUT_FREQ); hideRadioButtonGroup(RB_GROUP_CONFIG_FREQ_TABLE); - hideCheckBox(CB_CONF_INTERPOLATION); hideCheckBox(CB_CONF_VOL_RAMP); hidePushButton(PB_CONFIG_AUDIO_RESCAN); hidePushButton(PB_CONFIG_AUDIO_OUTPUT_DOWN); @@ -1591,6 +1605,27 @@ void rbConfigAudio24bit(void) setNewAudioSettings(); } +void rbConfigAudioIntrpNone(void) +{ + config.interpolation = INTERPOLATION_NONE; + audioSetInterpolationType(config.interpolation); + checkRadioButton(RB_CONFIG_AUDIO_INTRP_NONE); +} + +void rbConfigAudioIntrpLinear(void) +{ + config.interpolation = INTERPOLATION_LINEAR; + audioSetInterpolationType(config.interpolation); + checkRadioButton(RB_CONFIG_AUDIO_INTRP_LINEAR); +} + +void rbConfigAudioIntrpCubic(void) +{ + config.interpolation = INTERPOLATION_CUBIC; + audioSetInterpolationType(config.interpolation); + checkRadioButton(RB_CONFIG_AUDIO_INTRP_CUBIC); +} + void rbConfigAudio44kHz(void) { config.audioFreq = 44100; @@ -1651,13 +1686,6 @@ void cbToggleAutoSaveConfig(void) { config.cfg_AutoSave ^= 1; } - -void cbConfigInterpolation(void) -{ - config.interpolation ^= 1; - audioSetInterpolation(config.interpolation); -} - void cbConfigVolRamp(void) { config.specialFlags ^= NO_VOLRAMP_FLAG; diff --git a/src/ft2_config.h b/src/ft2_config.h @@ -18,6 +18,10 @@ enum CONFIG_HIDE_ERRORS = 0, CONFIG_SHOW_ERRORS = 1, + INTERPOLATION_NONE = 0, + INTERPOLATION_CUBIC = 1, + INTERPOLATION_LINEAR = 2, + MOUSE_IDLE_SHAPE_NICE = 0, MOUSE_IDLE_SHAPE_UGLY = 1, MOUSE_IDLE_SHAPE_AWFUL = 2, @@ -205,6 +209,9 @@ void rbConfigSbs1024(void); void rbConfigSbs2048(void); void rbConfigAudio16bit(void); void rbConfigAudio24bit(void); +void rbConfigAudioIntrpNone(void); +void rbConfigAudioIntrpLinear(void); +void rbConfigAudioIntrpCubic(void); void rbConfigAudio44kHz(void); void rbConfigAudio48kHz(void); void rbConfigAudio96kHz(void); @@ -238,7 +245,6 @@ void rbWinSize2x(void); void rbWinSize3x(void); void rbWinSize4x(void); void cbToggleAutoSaveConfig(void); -void cbConfigInterpolation(void); void cbConfigVolRamp(void); void cbConfigPattStretch(void); void cbConfigHexCount(void); diff --git a/src/ft2_header.h b/src/ft2_header.h @@ -12,7 +12,7 @@ #endif #include "ft2_replayer.h" -#define PROG_VER_STR "1.34" +#define PROG_VER_STR "1.35" // do NOT change these! It will only mess things up... diff --git a/src/ft2_main.c b/src/ft2_main.c @@ -33,7 +33,6 @@ #include "ft2_events.h" #include "ft2_bmp.h" #include "ft2_structs.h" -#include "mixer/ft2_cubic.h" #ifdef HAS_MIDI static SDL_Thread *initMidiThread; @@ -334,7 +333,6 @@ static void cleanUpAndExit(void) // never call this inside the main loop! closeAudio(); closeReplayer(); closeVideo(); - freeCubicTable(); freeSprites(); freeDiskOp(); clearCopyBuffer(); diff --git a/src/ft2_radiobuttons.c b/src/ft2_radiobuttons.c @@ -75,14 +75,20 @@ radioButton_t radioButtons[NUM_RADIOBUTTONS] = // audio buffer size //x, y, w, group, funcOnUp - { 390, 16, 46, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs512 }, - { 390, 30, 113, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs1024 }, - { 390, 44, 50, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs2048 }, + { 390, 16, 46, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs512 }, + { 390, 30, 113, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs1024 }, + { 390, 44, 50, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, rbConfigSbs2048 }, // audio bit depth //x, y, w, group, funcOnUp - { 390, 89, 107, RB_GROUP_CONFIG_AUDIO_BIT_DEPTH, rbConfigAudio16bit }, - { 390, 103, 83, RB_GROUP_CONFIG_AUDIO_BIT_DEPTH, rbConfigAudio24bit }, + { 390, 74, 107, RB_GROUP_CONFIG_AUDIO_BIT_DEPTH, rbConfigAudio16bit }, + { 390, 88, 83, RB_GROUP_CONFIG_AUDIO_BIT_DEPTH, rbConfigAudio24bit }, + + // audio interpolation + //x, y, w, group, funcOnUp + { 390, 117, 46, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpNone }, + { 390, 131, 91, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpLinear }, + { 390, 145, 86, RB_GROUP_CONFIG_AUDIO_INTERPOLATION, rbConfigAudioIntrpCubic }, // audio output frequency //x, y, w, group, funcOnUp diff --git a/src/ft2_radiobuttons.h b/src/ft2_radiobuttons.h @@ -50,10 +50,15 @@ enum // RADIOBUTTONS RB_CONFIG_SBS_1024, RB_CONFIG_SBS_2048, - // SOUND BIT DEPTH + // AUDIO BIT DEPTH RB_CONFIG_AUDIO_16BIT, RB_CONFIG_AUDIO_24BIT, + // AUDIO INTERPOLATION + RB_CONFIG_AUDIO_INTRP_NONE, + RB_CONFIG_AUDIO_INTRP_LINEAR, + RB_CONFIG_AUDIO_INTRP_CUBIC, + // AUDIO FREQUENCY RB_CONFIG_AUDIO_44KHZ, RB_CONFIG_AUDIO_48KHZ, @@ -166,6 +171,7 @@ enum // RADIOBUTTONS RB_GROUP_CONFIG_SELECT, RB_GROUP_CONFIG_SOUND_BUFF_SIZE, RB_GROUP_CONFIG_AUDIO_BIT_DEPTH, + RB_GROUP_CONFIG_AUDIO_INTERPOLATION, RB_GROUP_CONFIG_AUDIO_FREQ, RB_GROUP_CONFIG_AUDIO_INPUT_FREQ, RB_GROUP_CONFIG_FREQ_TABLE, diff --git a/src/ft2_replayer.c b/src/ft2_replayer.c @@ -20,14 +20,14 @@ #include "ft2_sample_loader.h" #include "ft2_tables.h" #include "ft2_structs.h" -#include "mixer/ft2_cubic.h" +#include "mixer/ft2_cubicspline.h" /* This is a mess, directly ported from the original FT2 code (with some modifications). ** You will experience a lot of headaches if you dig into it... ** If something looks to be off, it probably isn't! */ -// non-FT2 precalced stuff +// non-FT2 precalced stuff (these are kinda big...) static double dPeriod2HzTab[65536], dLogTab[768], dHz2MixDeltaMul; static uint32_t revMixDeltaTab[65536]; static bool bxxOverflow; @@ -2710,6 +2710,8 @@ void closeReplayer(void) free(instr[131]); instr[131] = NULL; } + + freeCubicTable(); } bool setupReplayer(void) diff --git a/src/ft2_replayer.h b/src/ft2_replayer.h @@ -4,6 +4,9 @@ #include <stdbool.h> #include "ft2_unicode.h" +// cubic spline requires 2 extra samples in the future to be read +#define NUM_FIXED_TAP_SAMPLES 2 + enum { // voice flags @@ -172,7 +175,7 @@ typedef struct sampleTyp_t bool fixed; int8_t fine, relTon, *pek, *origPek; uint8_t vol, typ, pan; - int16_t fixedSmp1, fixedSmp2; + int16_t fixedSmp[NUM_FIXED_TAP_SAMPLES]; int32_t fixedPos, len, repS, repL; } sampleTyp; diff --git a/src/ft2_sample_ed.c b/src/ft2_sample_ed.c @@ -10,7 +10,7 @@ #ifndef _WIN32 #include <unistd.h> // chdir() in UNICHAR_CHDIR() #endif -#if defined __APPLE__ || defined _WIN32 || defined __amd64__ || (defined __i386__ && defined __SSE2__) +#if defined _WIN32 || defined __amd64__ || (defined __i386__ && defined __SSE2__) #include <emmintrin.h> #endif #include "ft2_header.h" @@ -54,215 +54,172 @@ sampleTyp *getCurSample(void) return &instr[editor.curInstr]->samp[editor.curSmp]; } -// adds wrapped samples after loop/end (for branchless mixer interpolation) +// modifies samples before index 0, and after loop/end (for branchless mixer interpolation (kinda)) void fixSample(sampleTyp *s) { - uint8_t loopType; - int16_t *ptr16; - int32_t loopStart, loopLen, loopEnd, len; - assert(s != NULL); - if (s->origPek == NULL) + if (s->origPek == NULL || s->pek == NULL) + { + s->fixed = false; + s->fixedPos = 0; return; // empty sample + } - assert(s->pek != NULL); + const bool sample16Bit = (s->typ & 16) ? true : false; + int16_t *ptr16 = (int16_t *)s->pek; + uint8_t loopType = s->typ & 3; + int32_t len = s->len; + int32_t loopStart = s->repS; + int32_t loopLen = s->repL; + int32_t loopEnd = s->repS + s->repL; - loopType = s->typ & 3; - if (loopType == 0) + if (sample16Bit) { - len = s->len; + len >>= 1; + loopStart >>= 1; + loopLen >>= 1; + loopEnd >>= 1; + } - // no loop (don't mess with fixed, fixSpar of fixedPos) + if (len < 1) + { + s->fixed = false; + s->fixedPos = 0; + return; // empty sample + } - if (s->typ & 16) - { - if (len < 2) - return; + // disable loop if loopLen == 0 (FT2 does this) + if (loopType != 0 && loopLen == 0) + { + loopType = 0; + loopStart = loopLen = loopEnd = 0; + } - len >>= 1; - ptr16 = (int16_t *)s->pek; + /* The first and second tap (-1, 0) should be the same at sampling position #0 + ** (at sample trigger), until an eventual loop cycle, where the -1 tap has a + ** special case in the mixer. + */ + if (sample16Bit) + ptr16[-1] = ptr16[0]; + else + s->pek[-1] = s->pek[0]; - // write new values - ptr16[-1] = 0; - ptr16[len+0] = 0; - ptr16[len+1] = 0; + if (loopType == 0) + { + // no loop + if (sample16Bit) + { + for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++) + ptr16[len+i] = ptr16[len-1]; } else { - if (len < 1) - return; - - // write new values - s->pek[-1] = 0; - s->pek[len+0] = 0; - s->pek[len+1] = 0; + for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++) + s->pek[len+i] = s->pek[len-1]; } + s->fixedPos = 0; + s->fixed = false; // no fixed samples inside actual sample data return; } if (s->fixed) return; // already fixed - if (loopType == 1) - { - // forward loop + s->fixedPos = loopStart + loopLen; - if (s->typ & 16) + if (loopLen == 1) // too short for interpolation kernel size, fix in a different way + { + if (sample16Bit) { - // 16-bit sample - - if (s->repL < 2) - return; - - loopStart = s->repS >> 1; - loopEnd = (s->repS + s->repL) >> 1; - - ptr16 = (int16_t *)s->pek; - - // store old fix position and old values - s->fixedPos = s->repS + s->repL; - s->fixedSmp1 = ptr16[loopEnd+0]; - s->fixedSmp2 = ptr16[loopEnd+1]; - - // write new values - ptr16[loopEnd+0] = ptr16[loopStart+0]; - if (loopStart == 0 && loopEnd > 0) - ptr16[-1] = ptr16[loopEnd-1]; - else - ptr16[-1] = 0; - - ptr16[loopEnd+1] = ptr16[loopStart+1]; + for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++) + { + s->fixedSmp[i] = ptr16[loopEnd+i]; + ptr16[loopEnd+i] = ptr16[loopStart]; + } } else { - // 8-bit sample - - if (s->repL < 1) - return; - - loopStart = s->repS; - loopEnd = s->repS + s->repL; - - // store old fix position and old values - s->fixedPos = loopEnd; - s->fixedSmp1 = s->pek[loopEnd+0]; - s->fixedSmp2 = s->pek[loopEnd+1]; + for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++) + { + s->fixedSmp[i] = s->pek[loopEnd+i]; + s->pek[loopEnd+i] = s->pek[loopStart]; + } + } - // write new values - s->pek[loopEnd+0] = s->pek[loopStart+0]; - if (loopStart == 0 && loopEnd > 0) - s->pek[-1] = s->pek[loopEnd-1]; - else - s->pek[-1] = 0; + s->fixed = true; + return; + } - s->pek[loopEnd+1] = s->pek[loopStart+1]; + if (loopType == 1) + { + // forward loop + if (sample16Bit) + { + for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++) + { + s->fixedSmp[i] = ptr16[loopEnd+i]; + ptr16[loopEnd+i] = ptr16[loopStart+i]; + } + } + else + { + for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++) + { + s->fixedSmp[i] = s->pek[loopEnd+i]; + s->pek[loopEnd+i] = s->pek[loopStart+i]; + } } } else { // pingpong loop - - if (s->typ & 16) + if (sample16Bit) { - // 16-bit sample - - if (s->repL < 2) - return; - - loopStart = s->repS >> 1; - loopLen = s->repL >> 1; - - loopEnd = loopStart + loopLen; - ptr16 = (int16_t *)s->pek; - - // store old fix position and old values - s->fixedPos = s->repS + s->repL; - s->fixedSmp1 = ptr16[loopEnd+0]; - s->fixedSmp2 = ptr16[loopEnd+1]; - - // write new values - ptr16[loopEnd+0] = ptr16[loopEnd-1]; - if (loopStart == 0) - ptr16[-1] = ptr16[0]; - else - ptr16[-1] = 0; - - if (loopLen >= 2) - ptr16[loopEnd+1] = ptr16[loopEnd-2]; - else - ptr16[loopEnd+1] = ptr16[loopStart+0]; + for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++) + { + s->fixedSmp[i] = ptr16[loopEnd+i]; + ptr16[loopEnd+i] = ptr16[loopEnd-1-i]; + } } else { - // 8-bit sample - - if (s->repL < 1) - return; - - loopStart = s->repS; - loopLen = s->repL; - - loopEnd = loopStart + loopLen; - - // store old fix position and old values - s->fixedPos = loopEnd; - s->fixedSmp1 = s->pek[loopEnd+0]; - s->fixedSmp2 = s->pek[loopEnd+1]; - - // write new values - s->pek[loopEnd+0] = s->pek[loopEnd-1]; - if (loopStart == 0) - s->pek[-1] = s->pek[0]; - else - s->pek[-1] = 0; - - if (loopLen >= 2) - s->pek[loopEnd+1] = s->pek[loopEnd-2]; - else - s->pek[loopEnd+1] = s->pek[loopStart+0]; + for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++) + { + s->fixedSmp[i] = s->pek[loopEnd+i]; + s->pek[loopEnd+i] = s->pek[loopEnd-1-i]; + } } } + // -1 tap (right before loopStart) on forward/pingpong loops are handled in the mixer + s->fixed = true; } -// reverts wrapped samples after loop/end (for branchless mixer interpolation) +// restores interpolation tap samples after loop/end void restoreSample(sampleTyp *s) { - int16_t *ptr16; - int32_t fixedPos16; - assert(s != NULL); - if (s->origPek == NULL || s->len == 0 || (s->typ & 3) == 0 || !s->fixed) - return; // empty sample, no loop or not fixed - - assert(s->pek != NULL); - s->fixed = false; - - // clear pre-start bytes (this is safe, we have allocated room on the left for this) - s->pek[-4] = 0; - s->pek[-3] = 0; - s->pek[-2] = 0; - s->pek[-1] = 0; + if (s->origPek == NULL || s->pek == NULL || !s->fixed) + return; // empty sample or not fixed (f.ex. no loop) if (s->typ & 16) { // 16-bit sample - - ptr16 = (int16_t *)s->pek; - fixedPos16 = s->fixedPos >> 1; - - ptr16[fixedPos16+0] = s->fixedSmp1; - ptr16[fixedPos16+1] = s->fixedSmp2; + int16_t *ptr16 = (int16_t *)s->pek + s->fixedPos; + for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++) + ptr16[i] = s->fixedSmp[i]; } else { // 8-bit sample - - s->pek[s->fixedPos+0] = (int8_t)s->fixedSmp1; - s->pek[s->fixedPos+1] = (int8_t)s->fixedSmp2; + int8_t *ptr8 = s->pek + s->fixedPos; + for (int32_t i = 0; i < NUM_FIXED_TAP_SAMPLES; i++) + ptr8[i] = (int8_t)s->fixedSmp[i]; } + + s->fixed = false; } int16_t getSampleValue(int8_t *ptr, uint8_t typ, int32_t pos) @@ -317,7 +274,7 @@ int32_t getSampleMiddleCRate(sampleTyp *s) double dFTune = realFineTune * (1.0 / 16.0); // new range is -16..15 double dFreq = 8363.0 * exp2((s->relTon + dFTune) * (1.0 / 12.0)); - return (int32_t)(dFreq + 0.5); + return (int32_t)(dFreq + 0.5); // rounded } int32_t getSampleRangeStart(void) @@ -618,56 +575,39 @@ static void writeRange(void) } } -static int8_t getScaledSample(sampleTyp *s, int32_t index) +static int8_t getScaledSample(sampleTyp *s, int32_t index) // for drawing sample waveform in zoomed-in mode { - int8_t *ptr8, sample; + int8_t sample; int16_t *ptr16; int32_t tmp32; + const int32_t loopEnd = s->repS + s->repL; + if (s->pek == NULL || index < 0 || index >= s->len) - return 0; // return center value if overflown (e.g. sample is shorter than screen width) + return 0; if (s->typ & 16) { - ptr16 = (int16_t *)s->pek; - assert(!(index & 1)); + index >>= 1; - // restore fixed mixer interpolation sample(s) - if (s->fixed) - { - if (index == s->fixedPos) - tmp32 = s->fixedSmp1; - else if (index == s->fixedPos+2) - tmp32 = s->fixedSmp2; - else - tmp32 = ptr16[index >> 1]; - } + ptr16 = (int16_t *)s->pek; + + // don't read fixed mixer interpolation samples, read the prestine ones instead + if (index >= s->fixedPos && index < s->fixedPos+NUM_FIXED_TAP_SAMPLES && s->len > loopEnd && s->fixed) + tmp32 = s->fixedSmp[index-s->fixedPos]; else - { - tmp32 = ptr16[index >> 1]; - } + tmp32 = ptr16[index]; sample = (int8_t)((tmp32 * SAMPLE_AREA_HEIGHT) >> 16); } else { - ptr8 = s->pek; - - // restore fixed mixer interpolation sample(s) - if (s->fixed) - { - if (index == s->fixedPos) - tmp32 = s->fixedSmp1; - else if (index == s->fixedPos+1) - tmp32 = s->fixedSmp2; - else - tmp32 = ptr8[index]; - } + // don't read fixed mixer interpolation samples, read the prestine ones instead + if (index >= s->fixedPos && index < s->fixedPos+NUM_FIXED_TAP_SAMPLES && s->len > loopEnd && s->fixed) + tmp32 = s->fixedSmp[index-s->fixedPos]; else - { - tmp32 = ptr8[index]; - } + tmp32 = s->pek[index]; sample = (int8_t)((tmp32 * SAMPLE_AREA_HEIGHT) >> 8); } @@ -762,7 +702,7 @@ static void sampleLine(int16_t x1, int16_t x2, int16_t y1, int16_t y2) static void getMinMax16(const void *p, uint32_t scanLen, int16_t *min16, int16_t *max16) { -#if defined __APPLE__ || defined _WIN32 || defined __amd64__ || (defined __i386__ && defined __SSE2__) +#if defined _WIN32 || defined __amd64__ || (defined __i386__ && defined __SSE2__) if (cpu.hasSSE2) { /* Taken with permission from the OpenMPT project (and slightly modified). @@ -827,16 +767,14 @@ static void getMinMax16(const void *p, uint32_t scanLen, int16_t *min16, int16_t else #endif { - // non-SSE version (really slow for big samples, especially when scrolling!) - int16_t smp16, minVal, maxVal, *ptr16; - - minVal = 32767; - maxVal = -32768; + // non-SSE version (really slow for big samples while zoomed out) + int16_t minVal = 32767; + int16_t maxVal = -32768; - ptr16 = (int16_t *)p; + const int16_t *ptr16 = (const int16_t *)p; for (uint32_t i = 0; i < scanLen; i++) { - smp16 = ptr16[i]; + const int16_t smp16 = ptr16[i]; if (smp16 < minVal) minVal = smp16; if (smp16 > maxVal) maxVal = smp16; } @@ -848,7 +786,7 @@ static void getMinMax16(const void *p, uint32_t scanLen, int16_t *min16, int16_t static void getMinMax8(const void *p, uint32_t scanLen, int8_t *min8, int8_t *max8) { -#if defined __APPLE__ || defined _WIN32 || defined __amd64__ || (defined __i386__ && defined __SSE2__) +#if defined _WIN32 || defined __amd64__ || (defined __i386__ && defined __SSE2__) if (cpu.hasSSE2) { /* Taken with permission from the OpenMPT project (and slightly modified). @@ -924,16 +862,14 @@ static void getMinMax8(const void *p, uint32_t scanLen, int8_t *min8, int8_t *ma else #endif { - // non-SSE version (really slow for big samples, especially when scrolling!) - int8_t smp8, minVal, maxVal, *ptr8; + // non-SSE version (really slow for big samples while zoomed out) + int8_t minVal = 127; + int8_t maxVal = -128; - minVal = 127; - maxVal = -128; - - ptr8 = (int8_t *)p; + const int8_t *ptr8 = (const int8_t *)p; for (uint32_t i = 0; i < scanLen; i++) { - smp8 = ptr8[i]; + const int8_t smp8 = ptr8[i]; if (smp8 < minVal) minVal = smp8; if (smp8 > maxVal) maxVal = smp8; } @@ -943,12 +879,96 @@ static void getMinMax8(const void *p, uint32_t scanLen, int8_t *min8, int8_t *ma } } -static void getSampleDataPeak(sampleTyp *s, int32_t index, int32_t numBytes, int16_t *outMin, int16_t *outMax) +// for scanning sample data peak where loopEnd+NUM_FIXED_TAP_SAMPLES is within scan range (fixed interpolation tap samples) +static void getSpecialMinMax16(sampleTyp *s, int32_t index, int32_t scanEnd, int16_t *min16, int16_t *max16) +{ + int16_t minVal, maxVal, minVal2, maxVal2; + + const int16_t *ptr16 = (const int16_t *)s->pek; + + minVal = 32767; + maxVal = -32768; + + // read peak samples before fixed samples + if (index < s->fixedPos) + { + getMinMax16(&ptr16[index], s->fixedPos-index, &minVal, &maxVal); + index += s->fixedPos-index; + } + + // read fixed samples + int32_t tmpScanEnd = index+NUM_FIXED_TAP_SAMPLES; + if (tmpScanEnd > scanEnd) + tmpScanEnd = scanEnd; + + const int16_t *smpReadPtr = s->fixedSmp; + for (; index < tmpScanEnd; index++) + { + const int16_t smp16 = *smpReadPtr++; + if (smp16 < minVal) minVal = smp16; + if (smp16 > maxVal) maxVal = smp16; + } + + // read peak samples after fixed samples + if (index < scanEnd) + { + getMinMax16(&ptr16[index], scanEnd-index, &minVal2, &maxVal2); + if (minVal2 < minVal) minVal = minVal2; + if (maxVal2 > maxVal) maxVal = maxVal2; + } + + *min16 = minVal; + *max16 = maxVal; +} + +// for scanning sample data peak where loopEnd+NUM_FIXED_TAP_SAMPLES is within scan range (fixed interpolation tap samples) +static void getSpecialMinMax8(sampleTyp *s, int32_t index, int32_t scanEnd, int8_t *min8, int8_t *max8) +{ + int8_t minVal, maxVal, minVal2, maxVal2; + + const int8_t *ptr8 = (const int8_t *)s->pek; + + minVal = 127; + maxVal = -128; + + // read peak samples before fixed samples + if (index < s->fixedPos) + { + getMinMax8(&ptr8[index], s->fixedPos-index, &minVal, &maxVal); + index += s->fixedPos-index; + } + + // read fixed samples + int32_t tmpScanEnd = index+NUM_FIXED_TAP_SAMPLES; + if (tmpScanEnd > scanEnd) + tmpScanEnd = scanEnd; + + const int16_t *smpReadPtr = (const int16_t *)s->fixedSmp; + for (; index < tmpScanEnd; index++) + { + const int8_t smp8 = (int8_t)(*smpReadPtr++); + if (smp8 < minVal) minVal = smp8; + if (smp8 > maxVal) maxVal = smp8; + } + + // read peak samples after fixed samples + if (index < scanEnd) + { + getMinMax8(&ptr8[index], scanEnd-index, &minVal2, &maxVal2); + if (minVal2 < minVal) minVal = minVal2; + if (maxVal2 > maxVal) maxVal = maxVal2; + } + + *min8 = minVal; + *max8 = maxVal; +} + +static void getSampleDataPeak(sampleTyp *s, int32_t index, int32_t numSamples, int16_t *outMin, int16_t *outMax) { int8_t min8, max8; int16_t min16, max16; - if (numBytes == 0 || s->pek == NULL || s->len <= 0) + if (numSamples == 0 || s->pek == NULL || s->len <= 0) { *outMin = SAMPLE_AREA_Y_CENTER; *outMax = SAMPLE_AREA_Y_CENTER; @@ -957,21 +977,52 @@ static void getSampleDataPeak(sampleTyp *s, int32_t index, int32_t numBytes, int if (s->typ & 16) { - // 16-bit sample - assert(!(index & 1)); + index >>= 1; + numSamples >>= 1; + } - getMinMax16((int16_t *)&s->pek[index], numBytes >> 1, &min16, &max16); + if (s->fixed && s->len > s->repL+s->repS) + { + const int32_t scanEnd = index + numSamples; + /* If the scan area is including the fixed samples (for branchless mixer interpolation), + ** do a special procedure to scan the original non-touched samples when needed. + */ + const bool insideRange = index >= s->fixedPos && index < s->fixedPos+NUM_FIXED_TAP_SAMPLES; + if (insideRange || (index < s->fixedPos && scanEnd >= s->fixedPos)) + { + if (s->typ & 16) + { + // 16-bit sample + getSpecialMinMax16(s, index, scanEnd, &min16, &max16); + *outMin = SAMPLE_AREA_Y_CENTER - ((min16 * SAMPLE_AREA_HEIGHT) >> 16); + *outMax = SAMPLE_AREA_Y_CENTER - ((max16 * SAMPLE_AREA_HEIGHT) >> 16); + } + else + { + // 8-bit sample + getSpecialMinMax8(s, index, scanEnd, &min8, &max8); + *outMin = SAMPLE_AREA_Y_CENTER - ((min8 * SAMPLE_AREA_HEIGHT) >> 8); + *outMax = SAMPLE_AREA_Y_CENTER - ((max8 * SAMPLE_AREA_HEIGHT) >> 8); + } + + return; + } + } + + if (s->typ & 16) + { + // 16-bit sample + const int16_t *smpPtr16 = (int16_t *)s->pek; + getMinMax16(&smpPtr16[index], numSamples, &min16, &max16); *outMin = SAMPLE_AREA_Y_CENTER - ((min16 * SAMPLE_AREA_HEIGHT) >> 16); *outMax = SAMPLE_AREA_Y_CENTER - ((max16 * SAMPLE_AREA_HEIGHT) >> 16); } else { // 8-bit sample - - getMinMax8(&s->pek[index], numBytes, &min8, &max8); - + getMinMax8(&s->pek[index], numSamples, &min8, &max8); *outMin = SAMPLE_AREA_Y_CENTER - ((min8 * SAMPLE_AREA_HEIGHT) >> 8); *outMax = SAMPLE_AREA_Y_CENTER - ((max8 * SAMPLE_AREA_HEIGHT) >> 8); } @@ -2675,7 +2726,7 @@ void sampMin(void) if (okBox(1, "System request", "Minimize sample?") != 1) return; - bool hasLoop = s->typ & 3; + const bool hasLoop = s->typ & 3; if (hasLoop && s->len > s->repS+s->repL && s->repL < s->len) { lockMixerCallback(); diff --git a/src/ft2_sample_ed.h b/src/ft2_sample_ed.h @@ -8,8 +8,8 @@ #define SAMPLE_AREA_Y_CENTER 250 sampleTyp *getCurSample(void); -void fixSample(sampleTyp *s); // adds wrapped sample after loop/end (for branchless mixer interpolation) -void restoreSample(sampleTyp *s); // reverts wrapped sample after loop/end (for branchless mixer interpolation) +void fixSample(sampleTyp *s); // modifies samples before index 0, and after loop/end (for branchless mixer interpolation) +void restoreSample(sampleTyp *s); // restores samples after loop/end void clearSample(void); void clearCopyBuffer(void); int32_t getSampleMiddleCRate(sampleTyp *s); diff --git a/src/ft2_sample_saver.c b/src/ft2_sample_saver.c @@ -45,87 +45,68 @@ typedef struct mptExtraChunk_t uint8_t vibratoType, vibratoSweep, vibratoDepth, vibratoRate; } mptExtraChunk_t; -static const char rangedDataStr[] = "Ranged data from FT2"; +static const char *rangedDataStr = "Ranged data from FT2"; // thread data static bool saveRangeFlag; static SDL_Thread *thread; -// used to restore mixer interpolation fix .RAW/.IFF/.WAV files after save -static bool fileRestoreSampleData(UNICHAR *filenameU, int32_t sampleDataOffset, sampleTyp *smp) +// restores modified interpolation tap samples after loopEnd (for .RAW/.IFF/.WAV samples after save) +static void fileRestoreFixedSampleData(UNICHAR *filenameU, uint32_t sampleDataOffset, sampleTyp *s) { - int8_t fixedSmp; - FILE *f; + if (!s->fixed) + return; // nothing to restore - if (!smp->fixed) - return false; // nothing to fix - - f = UNICHAR_FOPEN(filenameU, "r+"); // open in read+update mode + FILE *f = UNICHAR_FOPEN(filenameU, "r+"); // open in read+update mode if (f == NULL) - return false; + return; - if (smp->typ & 16) - { - // 16-bit sample - if (smp->fixedPos < smp->len) - { - fseek(f, sampleDataOffset + smp->fixedPos, SEEK_SET); - fwrite(&smp->fixedSmp1, sizeof (int16_t), 1, f); - } + const bool sample16Bit = (s->typ & 16) ? true : false; - if (smp->fixedPos+2 < smp->len) - { - fseek(f, sampleDataOffset + (smp->fixedPos + 2), SEEK_SET); - fwrite(&smp->fixedSmp2, sizeof (int16_t), 1, f); - } - } - else - { - // 8-bit sample - if (smp->fixedPos < smp->len) - { - fseek(f, sampleDataOffset + smp->fixedPos, SEEK_SET); + uint32_t fixedPos = s->fixedPos; + if (sample16Bit) + fixedPos *= 2; - fixedSmp = (int8_t)smp->fixedSmp1; - if (editor.sampleSaveMode == SMP_SAVE_MODE_WAV) // on 8-bit WAVs the sample data is unsigned - fixedSmp ^= 0x80; + if (fixedPos >= (uint32_t)s->len) + return; - fwrite(&fixedSmp, sizeof (int8_t), 1, f); - } + uint32_t bytesToWrite = NUM_FIXED_TAP_SAMPLES * (sample16Bit+1); + if (fixedPos+bytesToWrite > (uint32_t)s->len) + bytesToWrite = s->len - fixedPos; - if (smp->fixedPos+1 < smp->len) + fseek(f, sampleDataOffset+fixedPos, SEEK_SET); + if (sample16Bit) + { + fwrite(s->fixedSmp, sizeof (int16_t), bytesToWrite / 2, f); + } + else + { + for (uint32_t i = 0; i < bytesToWrite; i++) { - fseek(f, sampleDataOffset + (smp->fixedPos + 1), SEEK_SET); - - fixedSmp = (int8_t)smp->fixedSmp2; + int8_t fixedSmp = (int8_t)s->fixedSmp[i]; if (editor.sampleSaveMode == SMP_SAVE_MODE_WAV) // on 8-bit WAVs the sample data is unsigned - fixedSmp ^= 0x80; + fixedSmp ^= 0x80; // signed -> unsigned fwrite(&fixedSmp, sizeof (int8_t), 1, f); } } fclose(f); - return true; } static bool saveRawSample(UNICHAR *filenameU, bool saveRangedData) { int8_t *samplePtr; uint32_t sampleLen; - FILE *f; - sampleTyp *smp; - if (instr[editor.curInstr] == NULL || - instr[editor.curInstr]->samp[editor.curSmp].pek == NULL || - instr[editor.curInstr]->samp[editor.curSmp].len == 0) + instrTyp *ins = instr[editor.curInstr]; + if (ins == NULL || ins->samp[editor.curSmp].pek == NULL || ins->samp[editor.curSmp].len == 0) { - okBoxThreadSafe(0, "System message", "Error saving sample: The sample is empty!"); + okBoxThreadSafe(0, "System message", "The sample is empty!"); return false; } - smp = &instr[editor.curInstr]->samp[editor.curSmp]; - + sampleTyp *smp = &instr[editor.curInstr]->samp[editor.curSmp]; if (saveRangedData) { samplePtr = &smp->pek[getSampleRangeStart()]; @@ -137,7 +118,7 @@ static bool saveRawSample(UNICHAR *filenameU, bool saveRangedData) samplePtr = smp->pek; } - f = UNICHAR_FOPEN(filenameU, "wb"); + FILE *f = UNICHAR_FOPEN(filenameU, "wb"); if (f == NULL) { okBoxThreadSafe(0, "System message", "General I/O error during saving! Is the file in use?"); @@ -153,8 +134,10 @@ static bool saveRawSample(UNICHAR *filenameU, bool saveRangedData) fclose(f); - // restore mixer interpolation fix - fileRestoreSampleData(filenameU, 0, smp); + // restore modified interpolation tap samples after loopEnd + const bool loopEnabled = (smp->typ & 3) ? true : false; + if (loopEnabled && smp->len > smp->repS+smp->repL) + fileRestoreFixedSampleData(filenameU, 0, smp); editor.diskOpReadDir = true; // force diskop re-read @@ -196,21 +179,18 @@ static bool saveIFFSample(UNICHAR *filenameU, bool saveRangedData) { char *smpNamePtr; int8_t *samplePtr; - uint32_t sampleLen, smpNameLen, chunkLen, tmp32, sampleDataPos; - FILE *f; - sampleTyp *smp; + uint32_t sampleLen, smpNameLen, chunkLen; - if (instr[editor.curInstr] == NULL || - instr[editor.curInstr]->samp[editor.curSmp].pek == NULL || - instr[editor.curInstr]->samp[editor.curSmp].len == 0) + instrTyp *ins = instr[editor.curInstr]; + if (ins == NULL || ins->samp[editor.curSmp].pek == NULL || ins->samp[editor.curSmp].len == 0) { - okBoxThreadSafe(0, "System message", "Error saving sample: The sample is empty!"); + okBoxThreadSafe(0, "System message", "The sample is empty!"); return false; } - smp = &instr[editor.curInstr]->samp[editor.curSmp]; + sampleTyp *smp = &instr[editor.curInstr]->samp[editor.curSmp]; - f = UNICHAR_FOPEN(filenameU, "wb"); + FILE *f = UNICHAR_FOPEN(filenameU, "wb"); if (f == NULL) { okBoxThreadSafe(0, "System message", "General I/O error during saving! Is the file in use?"); @@ -249,7 +229,7 @@ static bool saveIFFSample(UNICHAR *filenameU, bool saveRangedData) iffWriteUint32(f, 0); // samplesPerHiCycle // samplesPerSec - tmp32 = getSampleMiddleCRate(smp); + uint32_t tmp32 = getSampleMiddleCRate(smp); if (tmp32 == 0 || tmp32 > 65535) tmp32 = 16726; iffWriteUint16(f, (uint16_t)tmp32); @@ -294,7 +274,7 @@ static bool saveIFFSample(UNICHAR *filenameU, bool saveRangedData) // "BODY" chunk chunkLen = sampleLen; iffWriteChunkHeader(f, "BODY", chunkLen); - sampleDataPos = ftell(f); + const uint32_t sampleDataPos = ftell(f); iffWriteChunkData(f, samplePtr, chunkLen); // go back and fill in "FORM" chunk size @@ -304,8 +284,10 @@ static bool saveIFFSample(UNICHAR *filenameU, bool saveRangedData) fclose(f); - // restore interpolation sample fix (was used for audio mixer) - fileRestoreSampleData(filenameU, sampleDataPos, smp); + // restore modified interpolation tap samples after loopEnd + const bool loopEnabled = (smp->typ & 3) ? true : false; + if (loopEnabled && smp->len > smp->repS+smp->repL) + fileRestoreFixedSampleData(filenameU, sampleDataPos, smp); editor.diskOpReadDir = true; // force diskop re-read @@ -317,30 +299,21 @@ static bool saveWAVSample(UNICHAR *filenameU, bool saveRangedData) { char *smpNamePtr; int8_t *samplePtr; - uint8_t sampleBitDepth; - uint32_t i, sampleLen, riffChunkSize, smpNameLen, tmpLen, progNameLen, sampleDataPos; - FILE *f; - sampleTyp *smp; - instrTyp *ins; + uint32_t i, sampleLen, riffChunkSize, smpNameLen, tmpLen; wavHeader_t wavHeader; samplerChunk_t samplerChunk; mptExtraChunk_t mptExtraChunk; - ins = instr[editor.curInstr]; - if (ins == NULL) + instrTyp *ins = instr[editor.curInstr]; + if (ins == NULL || ins->samp[editor.curSmp].pek == NULL || ins->samp[editor.curSmp].len == 0) { - okBoxThreadSafe(0, "System message", "Error saving sample: The sample is empty!"); + okBoxThreadSafe(0, "System message", "The sample is empty!"); return false; } - smp = &ins->samp[editor.curSmp]; - if (smp->pek == NULL || smp->len == 0) - { - okBoxThreadSafe(0, "System message", "Error saving sample: The sample is empty!"); - return false; - } + sampleTyp *smp = &ins->samp[editor.curSmp]; - f = UNICHAR_FOPEN(filenameU, "wb"); + FILE *f = UNICHAR_FOPEN(filenameU, "wb"); if (f == NULL) { okBoxThreadSafe(0, "System message", "General I/O error during saving! Is the file in use?"); @@ -358,7 +331,7 @@ static bool saveWAVSample(UNICHAR *filenameU, bool saveRangedData) samplePtr = smp->pek; } - sampleBitDepth = (smp->typ & 16) ? 16 : 8; + const uint8_t sampleBitDepth = (smp->typ & 16) ? 16 : 8; wavHeader.chunkID = 0x46464952; // "RIFF" wavHeader.chunkSize = 0; // is filled later @@ -378,7 +351,7 @@ static bool saveWAVSample(UNICHAR *filenameU, bool saveRangedData) fwrite(&wavHeader, sizeof (wavHeader_t), 1, f); // write sample data - sampleDataPos = ftell(f); + const uint32_t sampleDataPos = ftell(f); if (sampleBitDepth == 16) { fwrite((int16_t *)samplePtr, sizeof (int16_t), sampleLen / 2, f); @@ -464,7 +437,7 @@ static bool saveWAVSample(UNICHAR *filenameU, bool saveRangedData) } } - progNameLen = sizeof (PROG_NAME_STR) - 1; + const uint32_t progNameLen = sizeof (PROG_NAME_STR) - 1; tmpLen = 4 + (4 + 4) + (progNameLen + 1 + ((progNameLen + 1) & 1)); if (smpNameLen > 0) @@ -500,8 +473,10 @@ static bool saveWAVSample(UNICHAR *filenameU, bool saveRangedData) fclose(f); - // restore mixer interpolation fix - fileRestoreSampleData(filenameU, sampleDataPos, smp); + // restore modified interpolation tap samples after loopEnd + const bool loopEnabled = (smp->typ & 3) ? true : false; + if (loopEnabled && smp->len > smp->repS+smp->repL) + fileRestoreFixedSampleData(filenameU, sampleDataPos, smp); editor.diskOpReadDir = true; // force diskop re-read @@ -511,17 +486,13 @@ static bool saveWAVSample(UNICHAR *filenameU, bool saveRangedData) static int32_t SDLCALL saveSampleThread(void *ptr) { - const UNICHAR *oldPathU; - - (void)ptr; - if (editor.tmpFilenameU == NULL) { okBoxThreadSafe(0, "System message", "General I/O error during saving! Is the file in use?"); return false; } - oldPathU = getDiskOpCurPath(); + const UNICHAR *oldPathU = getDiskOpCurPath(); // in "save range mode", we must enter the sample directory if (saveRangeFlag) @@ -538,6 +509,7 @@ static int32_t SDLCALL saveSampleThread(void *ptr) if (saveRangeFlag) UNICHAR_CHDIR(oldPathU); + (void)ptr; return true; } diff --git a/src/helpdata/FT2.HLP b/src/helpdata/FT2.HLP @@ -528,7 +528,7 @@ Use left ctrl. for A/X/C/V (mark all/cut/copy/paste) keys. END ;*************************************************************************** ;*************************************************************************** -@LHow to use Fasttracker 2.0 +@LHow to use Fasttracker II >@X040@C002 >All "not-too-trivial" functions are presented below (ordered in windows) with a short description. @@ -782,11 +782,12 @@ you exit the program. > >@X040@C001Interpolation: >@X060@C002 -The mixing routine interpolates the sample value between the -sample points to remove unwanted noise in the sound. Real FT2 uses -2-tap linear interpolation, while this clone uses 4-tap cubic spline -interpolation for improved high frequencies. Turning it off will make -the audio sharper, but it will also be noisier. +Selects what type of resampling interpolation to use. +"None" uses no interpolation (nearest neighbor), which will result in +aliasing (noise) in the sound. "Linear" is what real FT2 uses, which is a +mediocre interpolation type. "Cubic spline" is the recommended setting +for the best audio quality, although it may sometimes sound too filtered +on low-quality samples (f.ex. Amiga MODs). >@X040@C001Volume ramping: >@X060@C002 @@ -894,21 +895,13 @@ one and not attempt to create config dirs for the OS user. (portable mode) >@C002A: This is normal. This is a limitation in the nature of scaling. >@X020 >@C001Q: I found a bug! ->@C002A: Please send a mail to olav.sorensen@live.no and try to explain it. +>@C002A: Please send me a mail (found at 16-bits.org) and try to explain it. END ;*************************************************************************** ;*************************************************************************** @LKnown bugs >@X010 ->@C001Sample editor: ->@C002 ->@X010- When a looped sample is zoomed out in the sample editor, you could see ->@X021unexpected sample data at the loop-end point. This is because of a kludge -for the resampling interpolation to work faster in the audio mixer, and the -original FT2 has the same problem. I have made it so that if you zoom in to -see the individual sample points, it will look like normal. ->@X010 >@C001Mouse / keyboard: > >@C002- Linux: The mouse cursor graphics can be glitchy at times... diff --git a/src/helpdata/ft2_help_data.h b/src/helpdata/ft2_help_data.h @@ -3,9 +3,9 @@ #include <stdint.h> -#define HELP_DATA_LEN 27330 +#define HELP_DATA_LEN 26993 -const uint8_t helpData[27330] = +const uint8_t helpData[26993] = { 0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, @@ -1146,1145 +1146,1117 @@ const uint8_t helpData[27330] = 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x1C,0x40,0x4C,0x48,0x6F,0x77,0x20,0x74,0x6F,0x20,0x75,0x73, + 0x1B,0x40,0x4C,0x48,0x6F,0x77,0x20,0x74,0x6F,0x20,0x75,0x73, 0x65,0x20,0x46,0x61,0x73,0x74,0x74,0x72,0x61,0x63,0x6B,0x65, - 0x72,0x20,0x32,0x2E,0x30,0x0B,0x3E,0x40,0x58,0x30,0x34,0x30, - 0x40,0x43,0x30,0x30,0x32,0x40,0x3E,0x41,0x6C,0x6C,0x20,0x22, - 0x6E,0x6F,0x74,0x2D,0x74,0x6F,0x6F,0x2D,0x74,0x72,0x69,0x76, - 0x69,0x61,0x6C,0x22,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F, - 0x6E,0x73,0x20,0x61,0x72,0x65,0x20,0x70,0x72,0x65,0x73,0x65, - 0x6E,0x74,0x65,0x64,0x20,0x62,0x65,0x6C,0x6F,0x77,0x20,0x28, - 0x6F,0x72,0x64,0x65,0x72,0x65,0x64,0x20,0x69,0x6E,0x22,0x77, - 0x69,0x6E,0x64,0x6F,0x77,0x73,0x29,0x20,0x77,0x69,0x74,0x68, - 0x20,0x61,0x20,0x73,0x68,0x6F,0x72,0x74,0x20,0x64,0x65,0x73, - 0x63,0x72,0x69,0x70,0x74,0x69,0x6F,0x6E,0x2E,0x00,0x17,0x3E, - 0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x4D,0x61, - 0x69,0x6E,0x20,0x73,0x63,0x72,0x65,0x65,0x6E,0x3A,0x01,0x3E, - 0x22,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31, - 0x42,0x50,0x4D,0x20,0x28,0x42,0x65,0x61,0x74,0x73,0x20,0x70, - 0x65,0x72,0x20,0x6D,0x69,0x6E,0x75,0x74,0x65,0x29,0x3A,0x0B, - 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x40, - 0x54,0x68,0x65,0x20,0x42,0x50,0x4D,0x20,0x73,0x65,0x74,0x74, - 0x69,0x6E,0x67,0x20,0x64,0x65,0x66,0x69,0x6E,0x65,0x73,0x20, - 0x68,0x6F,0x77,0x20,0x66,0x61,0x73,0x74,0x20,0x28,0x74,0x69, - 0x63,0x6B,0x73,0x2F,0x73,0x65,0x63,0x6F,0x6E,0x64,0x29,0x20, - 0x74,0x68,0x65,0x20,0x6D,0x75,0x73,0x69,0x63,0x20,0x70,0x6C, - 0x61,0x79,0x65,0x72,0x1C,0x77,0x69,0x6C,0x6C,0x20,0x72,0x75, - 0x6E,0x2E,0x20,0x31,0x32,0x35,0x20,0x42,0x50,0x4D,0x20,0x3C, - 0x2D,0x3E,0x20,0x35,0x30,0x20,0x48,0x7A,0x2E,0x28,0x3E,0x4E, - 0x75,0x6D,0x62,0x65,0x72,0x20,0x6F,0x66,0x20,0x70,0x6C,0x61, - 0x79,0x65,0x72,0x20,0x74,0x69,0x63,0x6B,0x73,0x2F,0x73,0x65, - 0x63,0x6F,0x6E,0x64,0x20,0x3D,0x20,0x42,0x50,0x4D,0x2A,0x32, - 0x2F,0x35,0x00,0x16,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43, - 0x30,0x30,0x31,0x53,0x70,0x64,0x2C,0x20,0x53,0x70,0x65,0x65, - 0x64,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30, - 0x30,0x32,0x2C,0x53,0x70,0x65,0x65,0x64,0x20,0x3D,0x20,0x6E, - 0x75,0x6D,0x62,0x65,0x72,0x20,0x6F,0x66,0x20,0x70,0x6C,0x61, - 0x79,0x65,0x72,0x20,0x74,0x69,0x63,0x6B,0x73,0x2F,0x70,0x61, - 0x74,0x74,0x65,0x72,0x6E,0x20,0x6C,0x69,0x6E,0x65,0x2E,0x00, - 0x0F,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31, - 0x41,0x64,0x64,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40, - 0x43,0x30,0x30,0x32,0x3E,0x22,0x41,0x64,0x64,0x22,0x20,0x69, - 0x73,0x20,0x74,0x68,0x65,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72, - 0x20,0x6F,0x66,0x20,0x70,0x61,0x74,0x74,0x65,0x72,0x6E,0x20, - 0x6C,0x69,0x6E,0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x63,0x75, - 0x72,0x73,0x6F,0x72,0x20,0x6A,0x75,0x6D,0x70,0x73,0x20,0x77, - 0x68,0x65,0x6E,0x20,0x79,0x6F,0x75,0x0C,0x65,0x64,0x69,0x74, - 0x20,0x61,0x20,0x6E,0x6F,0x74,0x65,0x2E,0x00,0x0F,0x3E,0x40, - 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50,0x74,0x6E, + 0x72,0x20,0x49,0x49,0x0B,0x3E,0x40,0x58,0x30,0x34,0x30,0x40, + 0x43,0x30,0x30,0x32,0x40,0x3E,0x41,0x6C,0x6C,0x20,0x22,0x6E, + 0x6F,0x74,0x2D,0x74,0x6F,0x6F,0x2D,0x74,0x72,0x69,0x76,0x69, + 0x61,0x6C,0x22,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E, + 0x73,0x20,0x61,0x72,0x65,0x20,0x70,0x72,0x65,0x73,0x65,0x6E, + 0x74,0x65,0x64,0x20,0x62,0x65,0x6C,0x6F,0x77,0x20,0x28,0x6F, + 0x72,0x64,0x65,0x72,0x65,0x64,0x20,0x69,0x6E,0x22,0x77,0x69, + 0x6E,0x64,0x6F,0x77,0x73,0x29,0x20,0x77,0x69,0x74,0x68,0x20, + 0x61,0x20,0x73,0x68,0x6F,0x72,0x74,0x20,0x64,0x65,0x73,0x63, + 0x72,0x69,0x70,0x74,0x69,0x6F,0x6E,0x2E,0x00,0x17,0x3E,0x40, + 0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x4D,0x61,0x69, + 0x6E,0x20,0x73,0x63,0x72,0x65,0x65,0x6E,0x3A,0x01,0x3E,0x22, + 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x42, + 0x50,0x4D,0x20,0x28,0x42,0x65,0x61,0x74,0x73,0x20,0x70,0x65, + 0x72,0x20,0x6D,0x69,0x6E,0x75,0x74,0x65,0x29,0x3A,0x0B,0x3E, + 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x40,0x54, + 0x68,0x65,0x20,0x42,0x50,0x4D,0x20,0x73,0x65,0x74,0x74,0x69, + 0x6E,0x67,0x20,0x64,0x65,0x66,0x69,0x6E,0x65,0x73,0x20,0x68, + 0x6F,0x77,0x20,0x66,0x61,0x73,0x74,0x20,0x28,0x74,0x69,0x63, + 0x6B,0x73,0x2F,0x73,0x65,0x63,0x6F,0x6E,0x64,0x29,0x20,0x74, + 0x68,0x65,0x20,0x6D,0x75,0x73,0x69,0x63,0x20,0x70,0x6C,0x61, + 0x79,0x65,0x72,0x1C,0x77,0x69,0x6C,0x6C,0x20,0x72,0x75,0x6E, + 0x2E,0x20,0x31,0x32,0x35,0x20,0x42,0x50,0x4D,0x20,0x3C,0x2D, + 0x3E,0x20,0x35,0x30,0x20,0x48,0x7A,0x2E,0x28,0x3E,0x4E,0x75, + 0x6D,0x62,0x65,0x72,0x20,0x6F,0x66,0x20,0x70,0x6C,0x61,0x79, + 0x65,0x72,0x20,0x74,0x69,0x63,0x6B,0x73,0x2F,0x73,0x65,0x63, + 0x6F,0x6E,0x64,0x20,0x3D,0x20,0x42,0x50,0x4D,0x2A,0x32,0x2F, + 0x35,0x00,0x16,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30, + 0x30,0x31,0x53,0x70,0x64,0x2C,0x20,0x53,0x70,0x65,0x65,0x64, 0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30, - 0x32,0x1B,0x54,0x68,0x65,0x20,0x63,0x75,0x72,0x72,0x65,0x6E, - 0x74,0x20,0x70,0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x6E,0x75, - 0x6D,0x62,0x65,0x72,0x2E,0x00,0x0E,0x3E,0x40,0x58,0x30,0x34, - 0x30,0x40,0x43,0x30,0x30,0x31,0x4C,0x6E,0x3A,0x0B,0x3E,0x40, - 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x43,0x54,0x68, - 0x65,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x20,0x6F,0x66,0x20, - 0x6C,0x69,0x6E,0x65,0x73,0x20,0x66,0x6F,0x72,0x20,0x74,0x68, - 0x65,0x20,0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x20,0x70,0x61, - 0x74,0x74,0x65,0x72,0x6E,0x2E,0x20,0x55,0x70,0x20,0x74,0x6F, - 0x20,0x24,0x31,0x30,0x30,0x20,0x6C,0x69,0x6E,0x65,0x73,0x2E, - 0x20,0x4E,0x6F,0x74,0x65,0x40,0x74,0x68,0x61,0x74,0x20,0x46, - 0x54,0x32,0x20,0x77,0x6F,0x6E,0x27,0x74,0x20,0x77,0x61,0x72, - 0x6E,0x20,0x79,0x6F,0x75,0x20,0x69,0x66,0x20,0x79,0x6F,0x75, - 0x20,0x64,0x65,0x63,0x72,0x65,0x61,0x73,0x65,0x20,0x74,0x68, - 0x69,0x73,0x20,0x76,0x61,0x6C,0x75,0x65,0x2E,0x20,0x54,0x68, - 0x65,0x20,0x6E,0x6F,0x74,0x65,0x73,0x20,0x61,0x74,0x37,0x74, - 0x68,0x65,0x20,0x62,0x6F,0x74,0x74,0x6F,0x6D,0x20,0x6C,0x69, - 0x6E,0x65,0x20,0x77,0x69,0x6C,0x6C,0x20,0x62,0x65,0x20,0x74, - 0x68,0x72,0x6F,0x77,0x6E,0x20,0x6F,0x75,0x74,0x20,0x74,0x6F, - 0x20,0x74,0x68,0x65,0x20,0x62,0x69,0x6E,0x61,0x72,0x79,0x20, - 0x73,0x70,0x61,0x63,0x65,0x2E,0x00,0x10,0x3E,0x40,0x58,0x30, - 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x45,0x78,0x70,0x64,0x3A, + 0x32,0x2C,0x53,0x70,0x65,0x65,0x64,0x20,0x3D,0x20,0x6E,0x75, + 0x6D,0x62,0x65,0x72,0x20,0x6F,0x66,0x20,0x70,0x6C,0x61,0x79, + 0x65,0x72,0x20,0x74,0x69,0x63,0x6B,0x73,0x2F,0x70,0x61,0x74, + 0x74,0x65,0x72,0x6E,0x20,0x6C,0x69,0x6E,0x65,0x2E,0x00,0x0F, + 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x41, + 0x64,0x64,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43, + 0x30,0x30,0x32,0x3E,0x22,0x41,0x64,0x64,0x22,0x20,0x69,0x73, + 0x20,0x74,0x68,0x65,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x20, + 0x6F,0x66,0x20,0x70,0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x6C, + 0x69,0x6E,0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x63,0x75,0x72, + 0x73,0x6F,0x72,0x20,0x6A,0x75,0x6D,0x70,0x73,0x20,0x77,0x68, + 0x65,0x6E,0x20,0x79,0x6F,0x75,0x0C,0x65,0x64,0x69,0x74,0x20, + 0x61,0x20,0x6E,0x6F,0x74,0x65,0x2E,0x00,0x0F,0x3E,0x40,0x58, + 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50,0x74,0x6E,0x3A, 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32, - 0x44,0x45,0x78,0x70,0x61,0x6E,0x64,0x20,0x70,0x61,0x74,0x74, - 0x65,0x72,0x6E,0x2E,0x20,0x49,0x6E,0x73,0x65,0x72,0x74,0x73, - 0x20,0x61,0x20,0x62,0x6C,0x61,0x6E,0x6B,0x20,0x6C,0x69,0x6E, - 0x65,0x20,0x61,0x66,0x74,0x65,0x72,0x20,0x65,0x61,0x63,0x68, - 0x20,0x70,0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x6C,0x69,0x6E, - 0x65,0x2E,0x20,0x55,0x73,0x65,0x66,0x75,0x6C,0x3C,0x69,0x66, - 0x20,0x79,0x6F,0x75,0x20,0x77,0x61,0x6E,0x74,0x20,0x74,0x6F, - 0x20,0x63,0x6F,0x6E,0x76,0x65,0x72,0x74,0x20,0x61,0x20,0x70, - 0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x74,0x68,0x61,0x74,0x20, - 0x72,0x75,0x6E,0x73,0x20,0x69,0x6E,0x20,0x73,0x70,0x65,0x65, - 0x64,0x20,0x32,0x2A,0x78,0x20,0x74,0x6F,0x20,0x61,0x1D,0x70, - 0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x74,0x68,0x61,0x74,0x20, - 0x72,0x75,0x6E,0x73,0x20,0x69,0x6E,0x20,0x73,0x70,0x65,0x65, - 0x64,0x20,0x78,0x2E,0x00,0x10,0x3E,0x40,0x58,0x30,0x34,0x30, - 0x40,0x43,0x30,0x30,0x31,0x53,0x68,0x6E,0x6B,0x3A,0x0B,0x3E, - 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x2E,0x53, - 0x68,0x72,0x69,0x6E,0x6B,0x20,0x70,0x61,0x74,0x74,0x65,0x72, - 0x6E,0x2E,0x20,0x44,0x65,0x6C,0x65,0x74,0x65,0x73,0x20,0x61, - 0x6C,0x6C,0x20,0x6F,0x64,0x64,0x20,0x70,0x61,0x74,0x74,0x65, - 0x72,0x6E,0x20,0x6C,0x69,0x6E,0x65,0x73,0x2E,0x00,0x2A,0x3E, - 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x54,0x68, - 0x65,0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74, - 0x2F,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x73,0x65,0x6C,0x65, - 0x63,0x74,0x6F,0x72,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30, - 0x40,0x43,0x30,0x30,0x32,0x3A,0x54,0x68,0x65,0x20,0x69,0x6E, - 0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20,0x74,0x68,0x61, - 0x74,0x20,0x68,0x61,0x73,0x20,0x61,0x20,0x6D,0x61,0x72,0x6B, - 0x20,0x6F,0x6E,0x20,0x69,0x74,0x27,0x73,0x20,0x6E,0x61,0x6D, - 0x65,0x20,0x73,0x74,0x72,0x69,0x6E,0x67,0x2C,0x20,0x69,0x73, - 0x20,0x74,0x68,0x65,0x17,0x64,0x65,0x73,0x74,0x69,0x6E,0x61, - 0x74,0x69,0x6F,0x6E,0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D, - 0x65,0x6E,0x74,0x2E,0x3D,0x3E,0x54,0x68,0x65,0x20,0x69,0x6E, - 0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20,0x74,0x68,0x61, - 0x74,0x20,0x68,0x61,0x73,0x20,0x61,0x20,0x6D,0x61,0x72,0x6B, - 0x20,0x6F,0x6E,0x20,0x69,0x74,0x27,0x73,0x20,0x6E,0x75,0x6D, - 0x62,0x65,0x72,0x2C,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20, - 0x73,0x6F,0x75,0x72,0x63,0x65,0x0B,0x69,0x6E,0x73,0x74,0x72, - 0x75,0x6D,0x65,0x6E,0x74,0x2E,0x1F,0x3E,0x54,0x68,0x65,0x20, - 0x73,0x61,0x6D,0x65,0x20,0x67,0x6F,0x65,0x73,0x20,0x66,0x6F, - 0x72,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65, - 0x73,0x2E,0x42,0x3E,0x59,0x6F,0x75,0x20,0x63,0x68,0x61,0x6E, - 0x67,0x65,0x20,0x74,0x68,0x65,0x20,0x6E,0x61,0x6D,0x65,0x20, - 0x6F,0x6E,0x20,0x61,0x6E,0x20,0x69,0x6E,0x73,0x74,0x72,0x75, - 0x6D,0x65,0x6E,0x74,0x2F,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20, - 0x62,0x79,0x20,0x63,0x6C,0x69,0x63,0x6B,0x69,0x6E,0x67,0x20, - 0x74,0x68,0x65,0x20,0x72,0x69,0x67,0x68,0x74,0x07,0x62,0x75, - 0x74,0x74,0x6F,0x6E,0x2E,0x00,0x12,0x3E,0x40,0x58,0x30,0x32, - 0x30,0x40,0x43,0x30,0x30,0x31,0x53,0x63,0x6F,0x70,0x65,0x73, - 0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30, - 0x32,0x22,0x3E,0x4C,0x65,0x66,0x74,0x20,0x62,0x75,0x74,0x74, - 0x6F,0x6E,0x3A,0x20,0x54,0x75,0x72,0x6E,0x20,0x63,0x68,0x61, - 0x6E,0x6E,0x65,0x6C,0x20,0x6F,0x6E,0x2F,0x6F,0x66,0x66,0x2E, - 0x35,0x3E,0x52,0x69,0x67,0x68,0x74,0x20,0x62,0x75,0x74,0x74, - 0x6F,0x6E,0x3A,0x20,0x54,0x75,0x72,0x6E,0x20,0x63,0x68,0x61, - 0x6E,0x6E,0x65,0x6C,0x20,0x6D,0x75,0x6C,0x74,0x69,0x2D,0x72, - 0x65,0x63,0x6F,0x72,0x64,0x2F,0x65,0x64,0x69,0x74,0x20,0x6F, - 0x6E,0x2F,0x6F,0x66,0x66,0x2E,0x42,0x3E,0x4C,0x65,0x66,0x74, - 0x2B,0x72,0x69,0x67,0x68,0x74,0x20,0x62,0x75,0x74,0x74,0x6F, - 0x6E,0x3A,0x20,0x54,0x75,0x72,0x6E,0x20,0x61,0x6C,0x6C,0x20, - 0x63,0x68,0x61,0x6E,0x6E,0x65,0x6C,0x73,0x20,0x6F,0x66,0x66, - 0x20,0x65,0x78,0x63,0x65,0x70,0x74,0x20,0x74,0x68,0x65,0x20, - 0x73,0x65,0x6C,0x65,0x63,0x74,0x65,0x64,0x20,0x6F,0x6E,0x65, - 0x2E,0x00,0x1C,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30, - 0x31,0x49,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20, - 0x45,0x64,0x69,0x74,0x6F,0x72,0x3A,0x01,0x3E,0x22,0x3E,0x40, - 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x57,0x68,0x61, - 0x74,0x20,0x69,0x73,0x20,0x61,0x6E,0x20,0x69,0x6E,0x73,0x74, - 0x72,0x75,0x6D,0x65,0x6E,0x74,0x3F,0x3A,0x0B,0x3E,0x40,0x58, - 0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x1E,0x41,0x20,0x46, - 0x61,0x73,0x74,0x74,0x72,0x61,0x63,0x6B,0x65,0x72,0x20,0x32, - 0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20, - 0x69,0x73,0x3A,0x15,0x3E,0x20,0x20,0x20,0x31,0x20,0x56,0x6F, - 0x6C,0x75,0x6D,0x65,0x20,0x65,0x6E,0x76,0x65,0x6C,0x6F,0x70, - 0x65,0x16,0x3E,0x20,0x20,0x20,0x31,0x20,0x50,0x61,0x6E,0x6E, - 0x69,0x6E,0x67,0x20,0x65,0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65, - 0x1D,0x3E,0x20,0x20,0x20,0x31,0x20,0x41,0x75,0x74,0x6F,0x2D, - 0x76,0x69,0x62,0x72,0x61,0x74,0x6F,0x20,0x64,0x65,0x66,0x69, - 0x6E,0x69,0x74,0x69,0x6F,0x6E,0x13,0x3E,0x20,0x20,0x20,0x31, - 0x2E,0x2E,0x31,0x36,0x20,0x53,0x61,0x6D,0x70,0x6C,0x65,0x28, - 0x73,0x29,0x1F,0x3E,0x20,0x20,0x20,0x31,0x20,0x4B,0x65,0x79, - 0x62,0x6F,0x61,0x72,0x64,0x20,0x73,0x70,0x6C,0x69,0x74,0x20, - 0x64,0x65,0x66,0x69,0x6E,0x69,0x74,0x69,0x6F,0x6E,0x15,0x3E, - 0x20,0x20,0x20,0x31,0x20,0x4D,0x49,0x44,0x49,0x20,0x64,0x65, - 0x66,0x69,0x6E,0x69,0x74,0x69,0x6F,0x6E,0x00,0x1B,0x3E,0x41, - 0x20,0x46,0x61,0x73,0x74,0x74,0x72,0x61,0x63,0x6B,0x65,0x72, - 0x20,0x32,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x69,0x73, - 0x3A,0x29,0x3E,0x20,0x20,0x20,0x31,0x20,0x56,0x6F,0x6C,0x75, - 0x6D,0x65,0x2F,0x50,0x61,0x6E,0x6E,0x69,0x6E,0x67,0x2F,0x46, - 0x69,0x6E,0x65,0x2D,0x74,0x75,0x6E,0x65,0x20,0x64,0x65,0x66, - 0x69,0x6E,0x69,0x74,0x69,0x6F,0x6E,0x14,0x3E,0x20,0x20,0x20, - 0x31,0x20,0x52,0x65,0x6C,0x61,0x74,0x69,0x76,0x65,0x20,0x74, - 0x6F,0x6E,0x65,0x2E,0x10,0x3E,0x20,0x20,0x20,0x31,0x20,0x57, - 0x61,0x76,0x65,0x20,0x66,0x6F,0x72,0x6D,0x2E,0x00,0x1F,0x3E, - 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x54,0x68, - 0x65,0x20,0x76,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x65,0x6E,0x76, - 0x65,0x6C,0x6F,0x70,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36, - 0x30,0x40,0x43,0x30,0x30,0x32,0x40,0x3E,0x41,0x6E,0x20,0x69, - 0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x27,0x73,0x20, - 0x76,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x69,0x73,0x20,0x64,0x65, - 0x66,0x69,0x6E,0x65,0x64,0x20,0x62,0x79,0x20,0x69,0x74,0x73, - 0x20,0x65,0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65,0x20,0x63,0x75, - 0x72,0x76,0x65,0x2E,0x20,0x49,0x66,0x20,0x74,0x68,0x65,0x3E, - 0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20,0x68, - 0x61,0x73,0x20,0x61,0x20,0x73,0x75,0x73,0x74,0x61,0x69,0x6E, - 0x20,0x70,0x6F,0x69,0x6E,0x74,0x2C,0x20,0x74,0x68,0x65,0x20, - 0x65,0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65,0x20,0x77,0x69,0x6C, - 0x6C,0x20,0x73,0x74,0x6F,0x70,0x20,0x61,0x74,0x20,0x74,0x68, - 0x61,0x74,0x42,0x70,0x6F,0x69,0x6E,0x74,0x20,0x75,0x6E,0x74, - 0x69,0x6C,0x20,0x61,0x20,0x6B,0x65,0x79,0x2D,0x6F,0x66,0x66, - 0x20,0x6E,0x6F,0x74,0x65,0x20,0x68,0x61,0x73,0x20,0x62,0x65, - 0x65,0x6E,0x20,0x70,0x6C,0x61,0x79,0x65,0x64,0x2E,0x20,0x57, - 0x68,0x65,0x6E,0x20,0x61,0x20,0x6B,0x65,0x79,0x2D,0x6F,0x66, - 0x66,0x20,0x6E,0x6F,0x74,0x65,0x20,0x69,0x73,0x1D,0x70,0x6C, - 0x61,0x79,0x65,0x64,0x2C,0x20,0x74,0x68,0x65,0x20,0x22,0x66, - 0x61,0x64,0x65,0x6F,0x75,0x74,0x22,0x20,0x62,0x65,0x67,0x69, - 0x6E,0x73,0x2E,0x44,0x3E,0x4F,0x6E,0x65,0x20,0x70,0x69,0x78, - 0x65,0x6C,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x65,0x6E, - 0x76,0x65,0x6C,0x6F,0x70,0x65,0x20,0x77,0x69,0x6E,0x64,0x6F, - 0x77,0x20,0x63,0x6F,0x72,0x72,0x65,0x73,0x70,0x6F,0x6E,0x64, - 0x73,0x20,0x74,0x6F,0x20,0x6F,0x6E,0x65,0x20,0x70,0x6C,0x61, - 0x79,0x65,0x72,0x2D,0x74,0x69,0x63,0x6B,0x2E,0x20,0x49,0x66, - 0x3C,0x74,0x68,0x65,0x20,0x42,0x50,0x4D,0x20,0x69,0x73,0x20, - 0x31,0x32,0x35,0x2C,0x20,0x79,0x6F,0x75,0x27,0x6C,0x6C,0x20, - 0x63,0x6F,0x6E,0x73,0x75,0x6D,0x65,0x20,0x35,0x30,0x20,0x70, - 0x69,0x78,0x65,0x6C,0x2F,0x73,0x65,0x63,0x6F,0x6E,0x64,0x2E, - 0x20,0x54,0x68,0x65,0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x27, - 0x73,0x1A,0x22,0x73,0x69,0x7A,0x65,0x22,0x20,0x69,0x73,0x20, - 0x61,0x62,0x6F,0x75,0x74,0x20,0x36,0x20,0x73,0x65,0x63,0x6F, - 0x6E,0x64,0x73,0x2E,0x3E,0x3E,0x49,0x66,0x20,0x79,0x6F,0x75, - 0x20,0x70,0x72,0x65,0x73,0x73,0x20,0x74,0x68,0x65,0x20,0x72, - 0x69,0x67,0x68,0x74,0x20,0x6D,0x6F,0x75,0x73,0x65,0x20,0x62, - 0x75,0x74,0x74,0x6F,0x6E,0x20,0x61,0x74,0x20,0x74,0x68,0x65, - 0x20,0x70,0x72,0x65,0x64,0x65,0x66,0x69,0x6E,0x65,0x20,0x62, - 0x75,0x74,0x74,0x6F,0x6E,0x73,0x2C,0x3F,0x79,0x6F,0x75,0x27, - 0x6C,0x6C,0x20,0x73,0x74,0x6F,0x72,0x65,0x20,0x74,0x68,0x65, - 0x20,0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x20,0x65,0x6E,0x76, - 0x65,0x6C,0x6F,0x70,0x65,0x20,0x69,0x6E,0x74,0x6F,0x20,0x74, - 0x68,0x61,0x74,0x20,0x70,0x72,0x65,0x64,0x65,0x66,0x69,0x6E, - 0x65,0x20,0x63,0x65,0x6C,0x6C,0x2E,0x20,0x54,0x68,0x65,0x30, - 0x70,0x72,0x65,0x64,0x65,0x66,0x69,0x6E,0x65,0x73,0x20,0x61, - 0x72,0x65,0x20,0x73,0x74,0x6F,0x72,0x65,0x64,0x20,0x69,0x6E, - 0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75, - 0x72,0x61,0x74,0x69,0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x2E, - 0x43,0x3E,0x50,0x72,0x65,0x64,0x65,0x66,0x69,0x6E,0x65,0x20, - 0x6E,0x75,0x6D,0x62,0x65,0x72,0x20,0x31,0x20,0x69,0x73,0x20, - 0x74,0x68,0x65,0x20,0x64,0x65,0x66,0x61,0x75,0x6C,0x74,0x20, - 0x65,0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65,0x2E,0x20,0x54,0x68, - 0x69,0x73,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x74,0x68,0x61, - 0x74,0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x42,0x6C,0x6F,0x61, - 0x64,0x20,0x61,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x2C,0x20, - 0x69,0x74,0x20,0x77,0x69,0x6C,0x6C,0x20,0x67,0x65,0x74,0x20, - 0x61,0x6C,0x6C,0x20,0x65,0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65, - 0x20,0x69,0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6F,0x6E, - 0x20,0x66,0x72,0x6F,0x6D,0x20,0x70,0x72,0x65,0x64,0x65,0x66, - 0x69,0x6E,0x65,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x20,0x31, - 0x2C,0x20,0x69,0x6E,0x63,0x6C,0x75,0x64,0x69,0x6E,0x67,0x20, - 0x74,0x68,0x65,0x20,0x76,0x69,0x62,0x72,0x61,0x74,0x6F,0x2E, - 0x42,0x3E,0x4E,0x6F,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20, - 0x69,0x66,0x20,0x79,0x6F,0x75,0x20,0x74,0x75,0x72,0x6E,0x20, - 0x74,0x68,0x65,0x20,0x76,0x6F,0x6C,0x75,0x6D,0x65,0x2D,0x65, - 0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65,0x20,0x6F,0x66,0x66,0x2C, - 0x20,0x79,0x6F,0x75,0x20,0x64,0x6F,0x6E,0x27,0x74,0x20,0x74, - 0x75,0x72,0x6E,0x20,0x74,0x68,0x65,0x0C,0x76,0x69,0x62,0x72, - 0x61,0x74,0x6F,0x20,0x6F,0x66,0x66,0x2E,0x00,0x20,0x3E,0x40, + 0x1B,0x54,0x68,0x65,0x20,0x63,0x75,0x72,0x72,0x65,0x6E,0x74, + 0x20,0x70,0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x6E,0x75,0x6D, + 0x62,0x65,0x72,0x2E,0x00,0x0E,0x3E,0x40,0x58,0x30,0x34,0x30, + 0x40,0x43,0x30,0x30,0x31,0x4C,0x6E,0x3A,0x0B,0x3E,0x40,0x58, + 0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x43,0x54,0x68,0x65, + 0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x20,0x6F,0x66,0x20,0x6C, + 0x69,0x6E,0x65,0x73,0x20,0x66,0x6F,0x72,0x20,0x74,0x68,0x65, + 0x20,0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x20,0x70,0x61,0x74, + 0x74,0x65,0x72,0x6E,0x2E,0x20,0x55,0x70,0x20,0x74,0x6F,0x20, + 0x24,0x31,0x30,0x30,0x20,0x6C,0x69,0x6E,0x65,0x73,0x2E,0x20, + 0x4E,0x6F,0x74,0x65,0x40,0x74,0x68,0x61,0x74,0x20,0x46,0x54, + 0x32,0x20,0x77,0x6F,0x6E,0x27,0x74,0x20,0x77,0x61,0x72,0x6E, + 0x20,0x79,0x6F,0x75,0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x20, + 0x64,0x65,0x63,0x72,0x65,0x61,0x73,0x65,0x20,0x74,0x68,0x69, + 0x73,0x20,0x76,0x61,0x6C,0x75,0x65,0x2E,0x20,0x54,0x68,0x65, + 0x20,0x6E,0x6F,0x74,0x65,0x73,0x20,0x61,0x74,0x37,0x74,0x68, + 0x65,0x20,0x62,0x6F,0x74,0x74,0x6F,0x6D,0x20,0x6C,0x69,0x6E, + 0x65,0x20,0x77,0x69,0x6C,0x6C,0x20,0x62,0x65,0x20,0x74,0x68, + 0x72,0x6F,0x77,0x6E,0x20,0x6F,0x75,0x74,0x20,0x74,0x6F,0x20, + 0x74,0x68,0x65,0x20,0x62,0x69,0x6E,0x61,0x72,0x79,0x20,0x73, + 0x70,0x61,0x63,0x65,0x2E,0x00,0x10,0x3E,0x40,0x58,0x30,0x34, + 0x30,0x40,0x43,0x30,0x30,0x31,0x45,0x78,0x70,0x64,0x3A,0x0B, + 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x44, + 0x45,0x78,0x70,0x61,0x6E,0x64,0x20,0x70,0x61,0x74,0x74,0x65, + 0x72,0x6E,0x2E,0x20,0x49,0x6E,0x73,0x65,0x72,0x74,0x73,0x20, + 0x61,0x20,0x62,0x6C,0x61,0x6E,0x6B,0x20,0x6C,0x69,0x6E,0x65, + 0x20,0x61,0x66,0x74,0x65,0x72,0x20,0x65,0x61,0x63,0x68,0x20, + 0x70,0x61,0x74,0x74,0x65,0x72,0x6E,0x20,0x6C,0x69,0x6E,0x65, + 0x2E,0x20,0x55,0x73,0x65,0x66,0x75,0x6C,0x3C,0x69,0x66,0x20, + 0x79,0x6F,0x75,0x20,0x77,0x61,0x6E,0x74,0x20,0x74,0x6F,0x20, + 0x63,0x6F,0x6E,0x76,0x65,0x72,0x74,0x20,0x61,0x20,0x70,0x61, + 0x74,0x74,0x65,0x72,0x6E,0x20,0x74,0x68,0x61,0x74,0x20,0x72, + 0x75,0x6E,0x73,0x20,0x69,0x6E,0x20,0x73,0x70,0x65,0x65,0x64, + 0x20,0x32,0x2A,0x78,0x20,0x74,0x6F,0x20,0x61,0x1D,0x70,0x61, + 0x74,0x74,0x65,0x72,0x6E,0x20,0x74,0x68,0x61,0x74,0x20,0x72, + 0x75,0x6E,0x73,0x20,0x69,0x6E,0x20,0x73,0x70,0x65,0x65,0x64, + 0x20,0x78,0x2E,0x00,0x10,0x3E,0x40,0x58,0x30,0x34,0x30,0x40, + 0x43,0x30,0x30,0x31,0x53,0x68,0x6E,0x6B,0x3A,0x0B,0x3E,0x40, + 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x2E,0x53,0x68, + 0x72,0x69,0x6E,0x6B,0x20,0x70,0x61,0x74,0x74,0x65,0x72,0x6E, + 0x2E,0x20,0x44,0x65,0x6C,0x65,0x74,0x65,0x73,0x20,0x61,0x6C, + 0x6C,0x20,0x6F,0x64,0x64,0x20,0x70,0x61,0x74,0x74,0x65,0x72, + 0x6E,0x20,0x6C,0x69,0x6E,0x65,0x73,0x2E,0x00,0x2A,0x3E,0x40, 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x54,0x68,0x65, - 0x20,0x70,0x61,0x6E,0x6E,0x69,0x6E,0x67,0x20,0x65,0x6E,0x76, - 0x65,0x6C,0x6F,0x70,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36, - 0x30,0x40,0x43,0x30,0x30,0x32,0x40,0x3E,0x53,0x61,0x6D,0x65, - 0x20,0x61,0x73,0x20,0x61,0x62,0x6F,0x76,0x65,0x2C,0x20,0x65, - 0x78,0x63,0x65,0x70,0x74,0x20,0x66,0x72,0x6F,0x6D,0x20,0x74, - 0x68,0x61,0x74,0x20,0x74,0x68,0x65,0x20,0x76,0x69,0x62,0x72, - 0x61,0x74,0x6F,0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x63, - 0x6F,0x6E,0x6E,0x65,0x63,0x74,0x65,0x64,0x20,0x74,0x6F,0x15, - 0x74,0x68,0x65,0x20,0x70,0x61,0x6E,0x6E,0x69,0x6E,0x67,0x20, - 0x65,0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65,0x2E,0x00,0x10,0x3E, - 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x54,0x75, - 0x6E,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43, - 0x30,0x30,0x32,0x3F,0x3E,0x54,0x68,0x65,0x20,0x66,0x69,0x6E, - 0x65,0x2D,0x74,0x75,0x6E,0x65,0x20,0x72,0x65,0x73,0x6F,0x6C, - 0x75,0x74,0x69,0x6F,0x6E,0x20,0x68,0x61,0x73,0x20,0x62,0x65, - 0x65,0x6E,0x20,0x63,0x68,0x61,0x6E,0x67,0x65,0x64,0x20,0x66, - 0x72,0x6F,0x6D,0x20,0x61,0x20,0x73,0x69,0x67,0x6E,0x65,0x64, - 0x20,0x6E,0x69,0x62,0x62,0x6C,0x65,0x27,0x28,0x2D,0x38,0x2E, - 0x2E,0x2B,0x37,0x29,0x20,0x74,0x6F,0x20,0x61,0x20,0x73,0x69, - 0x67,0x6E,0x65,0x64,0x20,0x62,0x79,0x74,0x65,0x20,0x28,0x2D, - 0x31,0x32,0x38,0x2E,0x2E,0x2B,0x31,0x32,0x37,0x29,0x2E,0x00, - 0x13,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31, - 0x46,0x61,0x64,0x65,0x6F,0x75,0x74,0x3A,0x0B,0x3E,0x40,0x58, - 0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x1B,0x3E,0x54,0x68, - 0x69,0x73,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x66,0x61, - 0x64,0x65,0x6F,0x75,0x74,0x20,0x73,0x70,0x65,0x65,0x64,0x2E, - 0x00,0x19,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30, - 0x31,0x56,0x69,0x62,0x72,0x61,0x74,0x6F,0x20,0x73,0x77,0x65, - 0x65,0x70,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43, - 0x30,0x30,0x32,0x3E,0x3E,0x54,0x68,0x69,0x73,0x20,0x69,0x73, - 0x20,0x74,0x68,0x65,0x20,0x74,0x69,0x6D,0x65,0x20,0x28,0x69, - 0x6E,0x20,0x70,0x6C,0x61,0x79,0x65,0x72,0x20,0x74,0x69,0x63, - 0x6B,0x73,0x29,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x69,0x6C, - 0x6C,0x20,0x62,0x79,0x70,0x61,0x73,0x73,0x20,0x75,0x6E,0x74, - 0x69,0x6C,0x20,0x74,0x68,0x65,0x2D,0x61,0x75,0x74,0x6F,0x2D, - 0x76,0x69,0x62,0x72,0x61,0x74,0x6F,0x20,0x77,0x69,0x6C,0x6C, - 0x20,0x72,0x65,0x61,0x63,0x68,0x20,0x69,0x74,0x27,0x73,0x20, - 0x66,0x69,0x6E,0x61,0x6C,0x20,0x61,0x6D,0x70,0x6C,0x69,0x74, - 0x75,0x64,0x65,0x2E,0x00,0x1E,0x3E,0x40,0x58,0x30,0x34,0x30, - 0x40,0x43,0x30,0x30,0x31,0x54,0x68,0x65,0x20,0x70,0x69,0x61, - 0x6E,0x6F,0x20,0x6B,0x65,0x79,0x62,0x6F,0x61,0x72,0x64,0x3A, - 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32, - 0x3F,0x3E,0x54,0x68,0x65,0x20,0x70,0x69,0x61,0x6E,0x6F,0x20, - 0x6B,0x65,0x79,0x62,0x6F,0x61,0x72,0x64,0x20,0x64,0x65,0x66, - 0x69,0x6E,0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x6B,0x65,0x79, - 0x20,0x73,0x70,0x6C,0x69,0x74,0x20,0x66,0x6F,0x72,0x20,0x61, - 0x6E,0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74, - 0x2E,0x20,0x54,0x6F,0x3F,0x63,0x68,0x61,0x6E,0x67,0x65,0x20, - 0x74,0x68,0x65,0x20,0x6B,0x65,0x79,0x20,0x73,0x70,0x6C,0x69, - 0x74,0x2C,0x20,0x63,0x68,0x6F,0x6F,0x73,0x65,0x20,0x61,0x20, - 0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x77,0x69,0x74,0x68,0x69, - 0x6E,0x20,0x74,0x68,0x65,0x20,0x69,0x6E,0x73,0x74,0x72,0x75, - 0x6D,0x65,0x6E,0x74,0x20,0x61,0x6E,0x64,0x1C,0x74,0x68,0x65, - 0x6E,0x20,0x22,0x64,0x72,0x61,0x77,0x22,0x20,0x6F,0x6E,0x20, - 0x74,0x68,0x65,0x20,0x6B,0x65,0x79,0x62,0x6F,0x61,0x72,0x64, - 0x2E,0x42,0x3E,0x54,0x68,0x65,0x20,0x6E,0x6F,0x74,0x65,0x73, - 0x20,0x70,0x6C,0x61,0x79,0x65,0x64,0x20,0x77,0x69,0x74,0x68, - 0x20,0x74,0x68,0x65,0x20,0x63,0x75,0x72,0x72,0x65,0x6E,0x74, - 0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20, - 0x61,0x72,0x65,0x20,0x69,0x6E,0x64,0x69,0x63,0x61,0x74,0x65, - 0x64,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x09,0x6B,0x65,0x79, - 0x62,0x6F,0x61,0x72,0x64,0x2E,0x00,0x1A,0x3E,0x40,0x58,0x30, - 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x49,0x6D,0x70,0x6F,0x72, - 0x74,0x61,0x6E,0x74,0x20,0x6E,0x6F,0x74,0x65,0x3A,0x0B,0x3E, - 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x40,0x3E, - 0x54,0x68,0x65,0x20,0x76,0x6F,0x6C,0x75,0x6D,0x65,0x2C,0x20, - 0x70,0x61,0x6E,0x6E,0x69,0x6E,0x67,0x2C,0x20,0x74,0x75,0x6E, - 0x65,0x20,0x61,0x6E,0x64,0x20,0x72,0x65,0x6C,0x61,0x74,0x69, - 0x76,0x65,0x20,0x74,0x6F,0x6E,0x65,0x20,0x69,0x73,0x20,0x64, - 0x65,0x66,0x69,0x6E,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,0x45, - 0x41,0x43,0x48,0x41,0x53,0x41,0x4D,0x50,0x4C,0x45,0x20,0x69, + 0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x2F, + 0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x73,0x65,0x6C,0x65,0x63, + 0x74,0x6F,0x72,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40, + 0x43,0x30,0x30,0x32,0x3A,0x54,0x68,0x65,0x20,0x69,0x6E,0x73, + 0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20,0x74,0x68,0x61,0x74, + 0x20,0x68,0x61,0x73,0x20,0x61,0x20,0x6D,0x61,0x72,0x6B,0x20, + 0x6F,0x6E,0x20,0x69,0x74,0x27,0x73,0x20,0x6E,0x61,0x6D,0x65, + 0x20,0x73,0x74,0x72,0x69,0x6E,0x67,0x2C,0x20,0x69,0x73,0x20, + 0x74,0x68,0x65,0x17,0x64,0x65,0x73,0x74,0x69,0x6E,0x61,0x74, + 0x69,0x6F,0x6E,0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65, + 0x6E,0x74,0x2E,0x3D,0x3E,0x54,0x68,0x65,0x20,0x69,0x6E,0x73, + 0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20,0x74,0x68,0x61,0x74, + 0x20,0x68,0x61,0x73,0x20,0x61,0x20,0x6D,0x61,0x72,0x6B,0x20, + 0x6F,0x6E,0x20,0x69,0x74,0x27,0x73,0x20,0x6E,0x75,0x6D,0x62, + 0x65,0x72,0x2C,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x73, + 0x6F,0x75,0x72,0x63,0x65,0x0B,0x69,0x6E,0x73,0x74,0x72,0x75, + 0x6D,0x65,0x6E,0x74,0x2E,0x1F,0x3E,0x54,0x68,0x65,0x20,0x73, + 0x61,0x6D,0x65,0x20,0x67,0x6F,0x65,0x73,0x20,0x66,0x6F,0x72, + 0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x73, + 0x2E,0x42,0x3E,0x59,0x6F,0x75,0x20,0x63,0x68,0x61,0x6E,0x67, + 0x65,0x20,0x74,0x68,0x65,0x20,0x6E,0x61,0x6D,0x65,0x20,0x6F, 0x6E,0x20,0x61,0x6E,0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D, - 0x65,0x6E,0x74,0x2E,0x20,0x41,0x6C,0x6C,0x20,0x6F,0x74,0x68, - 0x65,0x72,0x20,0x69,0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69, - 0x6F,0x6E,0x20,0x69,0x73,0x20,0x64,0x65,0x66,0x69,0x6E,0x65, - 0x64,0x20,0x66,0x6F,0x72,0x20,0x74,0x68,0x65,0x12,0x65,0x6E, - 0x74,0x69,0x72,0x65,0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D, - 0x65,0x6E,0x74,0x2E,0x00,0x31,0x40,0x58,0x30,0x32,0x30,0x40, - 0x43,0x30,0x30,0x31,0x49,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65, - 0x6E,0x74,0x20,0x45,0x64,0x69,0x74,0x6F,0x72,0x20,0x45,0x78, - 0x74,0x65,0x6E,0x73,0x69,0x6F,0x6E,0x3A,0x20,0x28,0x49,0x2E, - 0x45,0x2E,0x45,0x78,0x74,0x2E,0x29,0x01,0x3E,0x10,0x3E,0x40, - 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x4D,0x49,0x44, - 0x49,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30, - 0x30,0x32,0x28,0x3E,0x27,0x70,0x2E,0x27,0x20,0x73,0x74,0x61, - 0x6E,0x64,0x73,0x20,0x66,0x6F,0x72,0x20,0x22,0x70,0x72,0x6F, - 0x67,0x72,0x61,0x6D,0x22,0x20,0x28,0x69,0x6E,0x73,0x74,0x72, - 0x75,0x6D,0x65,0x6E,0x74,0x29,0x2E,0x40,0x3E,0x53,0x65,0x76, - 0x65,0x72,0x61,0x6C,0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D, - 0x65,0x6E,0x74,0x73,0x20,0x63,0x61,0x6E,0x20,0x68,0x61,0x76, - 0x65,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x65,0x20,0x74, - 0x72,0x61,0x6E,0x73,0x6D,0x69,0x74,0x20,0x63,0x68,0x61,0x6E, - 0x6E,0x65,0x6C,0x20,0x62,0x75,0x74,0x20,0x77,0x69,0x74,0x68, - 0x33,0x64,0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x74,0x20,0x70, - 0x72,0x6F,0x67,0x72,0x61,0x6D,0x73,0x2E,0x20,0x46,0x54,0x32, - 0x20,0x63,0x68,0x61,0x6E,0x67,0x65,0x73,0x20,0x74,0x68,0x65, - 0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x73,0x20,0x6F,0x6E, - 0x20,0x74,0x68,0x65,0x43,0x4D,0x49,0x44,0x49,0x2D,0x63,0x68, - 0x61,0x6E,0x6E,0x65,0x6C,0x73,0x20,0x69,0x6E,0x73,0x74,0x61, - 0x6E,0x74,0x6C,0x79,0x20,0x64,0x75,0x72,0x69,0x6E,0x67,0x20, - 0x70,0x6C,0x61,0x79,0x20,0x69,0x66,0x20,0x64,0x69,0x66,0x66, - 0x65,0x72,0x65,0x6E,0x74,0x20,0x70,0x72,0x6F,0x67,0x72,0x61, - 0x6D,0x73,0x20,0x61,0x72,0x65,0x20,0x75,0x73,0x65,0x64,0x2E, - 0x3E,0x44,0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x74,0x20,0x70, - 0x72,0x6F,0x67,0x72,0x61,0x6D,0x73,0x20,0x63,0x61,0x6E,0x6E, - 0x6F,0x74,0x20,0x62,0x65,0x20,0x70,0x6C,0x61,0x79,0x65,0x64, - 0x20,0x61,0x74,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x65, - 0x20,0x63,0x68,0x61,0x6E,0x6E,0x65,0x6C,0x20,0x61,0x74,0x20, - 0x74,0x68,0x65,0x11,0x73,0x61,0x6D,0x65,0x20,0x74,0x69,0x6D, - 0x65,0x20,0x74,0x68,0x6F,0x75,0x67,0x68,0x2E,0x44,0x3E,0x49, - 0x66,0x20,0x79,0x6F,0x75,0x20,0x63,0x68,0x61,0x6E,0x67,0x65, - 0x20,0x74,0x68,0x69,0x73,0x20,0x76,0x61,0x6C,0x75,0x65,0x2C, - 0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D, - 0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x20,0x77,0x69,0x6C,0x6C, - 0x20,0x62,0x65,0x20,0x74,0x72,0x61,0x6E,0x73,0x6D,0x69,0x74, - 0x74,0x65,0x64,0x20,0x74,0x6F,0x1C,0x74,0x68,0x65,0x20,0x73, - 0x79,0x6E,0x74,0x68,0x65,0x73,0x69,0x7A,0x65,0x72,0x20,0x69, - 0x6D,0x6D,0x65,0x64,0x69,0x61,0x74,0x65,0x6C,0x79,0x2E,0x3E, - 0x3E,0x53,0x6F,0x6D,0x65,0x20,0x73,0x79,0x6E,0x74,0x68,0x65, - 0x73,0x69,0x7A,0x65,0x72,0x73,0x20,0x74,0x72,0x61,0x6E,0x73, - 0x6D,0x69,0x74,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20, - 0x63,0x68,0x61,0x6E,0x67,0x65,0x20,0x69,0x6E,0x66,0x6F,0x72, - 0x6D,0x61,0x74,0x69,0x6F,0x6E,0x2E,0x20,0x49,0x66,0x20,0x74, - 0x68,0x65,0x43,0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x20,0x69, - 0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20,0x69,0x6E, - 0x20,0x46,0x54,0x32,0x20,0x69,0x73,0x20,0x61,0x20,0x4D,0x49, - 0x44,0x49,0x2D,0x69,0x6E,0x73,0x74,0x72,0x2E,0x20,0x77,0x69, - 0x74,0x68,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x65,0x20, - 0x63,0x68,0x61,0x6E,0x6E,0x65,0x6C,0x20,0x61,0x73,0x3F,0x74, - 0x68,0x65,0x20,0x72,0x65,0x63,0x65,0x69,0x76,0x65,0x64,0x20, - 0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x63,0x68,0x61,0x6E, - 0x67,0x65,0x2C,0x20,0x69,0x74,0x27,0x73,0x20,0x4D,0x49,0x44, - 0x49,0x2D,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x77,0x69, - 0x6C,0x6C,0x20,0x62,0x65,0x20,0x63,0x68,0x61,0x6E,0x67,0x65, - 0x64,0x2E,0x40,0x3E,0x49,0x66,0x20,0x79,0x6F,0x75,0x72,0x20, - 0x73,0x79,0x6E,0x74,0x68,0x65,0x73,0x69,0x7A,0x65,0x72,0x20, - 0x64,0x6F,0x65,0x73,0x6E,0x27,0x74,0x20,0x74,0x72,0x61,0x6E, - 0x73,0x6D,0x69,0x74,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D, - 0x20,0x63,0x68,0x61,0x6E,0x67,0x65,0x2C,0x20,0x74,0x68,0x65, - 0x72,0x65,0x27,0x73,0x20,0x6E,0x6F,0x3E,0x70,0x6F,0x69,0x6E, - 0x74,0x20,0x69,0x6E,0x20,0x63,0x68,0x61,0x6E,0x67,0x69,0x6E, - 0x67,0x20,0x69,0x74,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x20, - 0x73,0x79,0x6E,0x74,0x68,0x65,0x73,0x69,0x7A,0x65,0x72,0x2C, - 0x20,0x64,0x6F,0x20,0x69,0x74,0x20,0x69,0x6E,0x20,0x46,0x54, - 0x32,0x20,0x69,0x6E,0x73,0x74,0x65,0x61,0x64,0x2E,0x00,0x18, - 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x42, - 0x65,0x6E,0x64,0x65,0x72,0x20,0x72,0x61,0x6E,0x67,0x65,0x3A, + 0x65,0x6E,0x74,0x2F,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x62, + 0x79,0x20,0x63,0x6C,0x69,0x63,0x6B,0x69,0x6E,0x67,0x20,0x74, + 0x68,0x65,0x20,0x72,0x69,0x67,0x68,0x74,0x07,0x62,0x75,0x74, + 0x74,0x6F,0x6E,0x2E,0x00,0x12,0x3E,0x40,0x58,0x30,0x32,0x30, + 0x40,0x43,0x30,0x30,0x31,0x53,0x63,0x6F,0x70,0x65,0x73,0x3A, 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32, - 0x38,0x3E,0x54,0x68,0x69,0x73,0x20,0x76,0x61,0x6C,0x75,0x65, - 0x20,0x64,0x65,0x66,0x69,0x6E,0x65,0x73,0x20,0x68,0x6F,0x77, - 0x20,0x6D,0x61,0x6E,0x79,0x20,0x6E,0x6F,0x74,0x65,0x73,0x20, - 0x74,0x68,0x65,0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65, - 0x6E,0x74,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x37,0x73,0x79, - 0x6E,0x74,0x68,0x65,0x73,0x69,0x7A,0x65,0x72,0x20,0x63,0x61, - 0x6E,0x20,0x62,0x65,0x20,0x70,0x69,0x74,0x63,0x68,0x62,0x65, - 0x6E,0x64,0x65,0x64,0x2E,0x20,0x46,0x54,0x32,0x20,0x75,0x73, - 0x65,0x73,0x20,0x74,0x68,0x69,0x73,0x20,0x76,0x61,0x6C,0x75, - 0x65,0x20,0x66,0x6F,0x72,0x37,0x74,0x72,0x61,0x6E,0x73,0x6D, - 0x69,0x74,0x74,0x69,0x6E,0x67,0x20,0x74,0x68,0x65,0x20,0x70, - 0x6F,0x72,0x74,0x61,0x6D,0x65,0x6E,0x74,0x6F,0x20,0x75,0x70, - 0x2F,0x64,0x6F,0x77,0x6E,0x20,0x61,0x6E,0x64,0x20,0x74,0x6F, - 0x6E,0x65,0x2D,0x70,0x6F,0x72,0x74,0x61,0x6D,0x65,0x6E,0x74, - 0x6F,0x13,0x63,0x6F,0x6D,0x6D,0x61,0x6E,0x64,0x73,0x20,0x63, - 0x6F,0x72,0x72,0x65,0x63,0x74,0x6C,0x79,0x2E,0x45,0x3E,0x54, - 0x68,0x65,0x20,0x4D,0x49,0x44,0x49,0x2D,0x70,0x69,0x74,0x63, - 0x68,0x62,0x65,0x6E,0x64,0x20,0x77,0x6F,0x72,0x6B,0x73,0x20, - 0x63,0x6F,0x72,0x72,0x65,0x63,0x74,0x6C,0x79,0x20,0x6F,0x6E, - 0x6C,0x79,0x20,0x77,0x69,0x74,0x68,0x20,0x6C,0x69,0x6E,0x65, - 0x61,0x72,0x20,0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79, - 0x20,0x74,0x61,0x62,0x6C,0x65,0x2E,0x00,0x18,0x40,0x58,0x30, - 0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x53,0x61,0x6D,0x70,0x6C, - 0x65,0x20,0x45,0x64,0x69,0x74,0x6F,0x72,0x3A,0x01,0x3E,0x2C, - 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50, - 0x6C,0x61,0x79,0x20,0x28,0x57,0x61,0x76,0x65,0x20,0x66,0x6F, - 0x72,0x6D,0x2C,0x20,0x72,0x61,0x6E,0x67,0x65,0x2C,0x20,0x64, - 0x69,0x73,0x70,0x6C,0x61,0x79,0x29,0x3A,0x0B,0x3E,0x40,0x58, - 0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3C,0x3E,0x50,0x6C, - 0x61,0x79,0x73,0x20,0x74,0x68,0x65,0x20,0x63,0x75,0x72,0x72, - 0x65,0x6E,0x74,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x77, - 0x69,0x74,0x68,0x20,0x74,0x6F,0x6E,0x65,0x20,0x64,0x69,0x73, - 0x70,0x6C,0x61,0x79,0x20,0x61,0x62,0x6F,0x76,0x65,0x20,0x74, - 0x68,0x65,0x20,0x22,0x73,0x74,0x6F,0x70,0x22,0x3D,0x62,0x75, - 0x74,0x74,0x6F,0x6E,0x2E,0x20,0x4E,0x6F,0x74,0x65,0x20,0x74, - 0x68,0x61,0x74,0x20,0x72,0x65,0x73,0x70,0x65,0x63,0x74,0x20, - 0x69,0x73,0x20,0x74,0x61,0x6B,0x65,0x6E,0x20,0x74,0x6F,0x20, - 0x74,0x68,0x65,0x20,0x70,0x61,0x72,0x74,0x69,0x63,0x75,0x6C, - 0x61,0x72,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x27,0x73,0x0E, - 0x72,0x65,0x6C,0x61,0x74,0x69,0x76,0x65,0x20,0x74,0x6F,0x6E, - 0x65,0x2E,0x00,0x16,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43, - 0x30,0x30,0x31,0x53,0x61,0x76,0x65,0x20,0x72,0x61,0x6E,0x67, + 0x22,0x3E,0x4C,0x65,0x66,0x74,0x20,0x62,0x75,0x74,0x74,0x6F, + 0x6E,0x3A,0x20,0x54,0x75,0x72,0x6E,0x20,0x63,0x68,0x61,0x6E, + 0x6E,0x65,0x6C,0x20,0x6F,0x6E,0x2F,0x6F,0x66,0x66,0x2E,0x35, + 0x3E,0x52,0x69,0x67,0x68,0x74,0x20,0x62,0x75,0x74,0x74,0x6F, + 0x6E,0x3A,0x20,0x54,0x75,0x72,0x6E,0x20,0x63,0x68,0x61,0x6E, + 0x6E,0x65,0x6C,0x20,0x6D,0x75,0x6C,0x74,0x69,0x2D,0x72,0x65, + 0x63,0x6F,0x72,0x64,0x2F,0x65,0x64,0x69,0x74,0x20,0x6F,0x6E, + 0x2F,0x6F,0x66,0x66,0x2E,0x42,0x3E,0x4C,0x65,0x66,0x74,0x2B, + 0x72,0x69,0x67,0x68,0x74,0x20,0x62,0x75,0x74,0x74,0x6F,0x6E, + 0x3A,0x20,0x54,0x75,0x72,0x6E,0x20,0x61,0x6C,0x6C,0x20,0x63, + 0x68,0x61,0x6E,0x6E,0x65,0x6C,0x73,0x20,0x6F,0x66,0x66,0x20, + 0x65,0x78,0x63,0x65,0x70,0x74,0x20,0x74,0x68,0x65,0x20,0x73, + 0x65,0x6C,0x65,0x63,0x74,0x65,0x64,0x20,0x6F,0x6E,0x65,0x2E, + 0x00,0x1C,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31, + 0x49,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20,0x45, + 0x64,0x69,0x74,0x6F,0x72,0x3A,0x01,0x3E,0x22,0x3E,0x40,0x58, + 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x57,0x68,0x61,0x74, + 0x20,0x69,0x73,0x20,0x61,0x6E,0x20,0x69,0x6E,0x73,0x74,0x72, + 0x75,0x6D,0x65,0x6E,0x74,0x3F,0x3A,0x0B,0x3E,0x40,0x58,0x30, + 0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x1E,0x41,0x20,0x46,0x61, + 0x73,0x74,0x74,0x72,0x61,0x63,0x6B,0x65,0x72,0x20,0x32,0x20, + 0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20,0x69, + 0x73,0x3A,0x15,0x3E,0x20,0x20,0x20,0x31,0x20,0x56,0x6F,0x6C, + 0x75,0x6D,0x65,0x20,0x65,0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65, + 0x16,0x3E,0x20,0x20,0x20,0x31,0x20,0x50,0x61,0x6E,0x6E,0x69, + 0x6E,0x67,0x20,0x65,0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65,0x1D, + 0x3E,0x20,0x20,0x20,0x31,0x20,0x41,0x75,0x74,0x6F,0x2D,0x76, + 0x69,0x62,0x72,0x61,0x74,0x6F,0x20,0x64,0x65,0x66,0x69,0x6E, + 0x69,0x74,0x69,0x6F,0x6E,0x13,0x3E,0x20,0x20,0x20,0x31,0x2E, + 0x2E,0x31,0x36,0x20,0x53,0x61,0x6D,0x70,0x6C,0x65,0x28,0x73, + 0x29,0x1F,0x3E,0x20,0x20,0x20,0x31,0x20,0x4B,0x65,0x79,0x62, + 0x6F,0x61,0x72,0x64,0x20,0x73,0x70,0x6C,0x69,0x74,0x20,0x64, + 0x65,0x66,0x69,0x6E,0x69,0x74,0x69,0x6F,0x6E,0x15,0x3E,0x20, + 0x20,0x20,0x31,0x20,0x4D,0x49,0x44,0x49,0x20,0x64,0x65,0x66, + 0x69,0x6E,0x69,0x74,0x69,0x6F,0x6E,0x00,0x1B,0x3E,0x41,0x20, + 0x46,0x61,0x73,0x74,0x74,0x72,0x61,0x63,0x6B,0x65,0x72,0x20, + 0x32,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x69,0x73,0x3A, + 0x29,0x3E,0x20,0x20,0x20,0x31,0x20,0x56,0x6F,0x6C,0x75,0x6D, + 0x65,0x2F,0x50,0x61,0x6E,0x6E,0x69,0x6E,0x67,0x2F,0x46,0x69, + 0x6E,0x65,0x2D,0x74,0x75,0x6E,0x65,0x20,0x64,0x65,0x66,0x69, + 0x6E,0x69,0x74,0x69,0x6F,0x6E,0x14,0x3E,0x20,0x20,0x20,0x31, + 0x20,0x52,0x65,0x6C,0x61,0x74,0x69,0x76,0x65,0x20,0x74,0x6F, + 0x6E,0x65,0x2E,0x10,0x3E,0x20,0x20,0x20,0x31,0x20,0x57,0x61, + 0x76,0x65,0x20,0x66,0x6F,0x72,0x6D,0x2E,0x00,0x1F,0x3E,0x40, + 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x54,0x68,0x65, + 0x20,0x76,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x65,0x6E,0x76,0x65, + 0x6C,0x6F,0x70,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30, + 0x40,0x43,0x30,0x30,0x32,0x40,0x3E,0x41,0x6E,0x20,0x69,0x6E, + 0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x27,0x73,0x20,0x76, + 0x6F,0x6C,0x75,0x6D,0x65,0x20,0x69,0x73,0x20,0x64,0x65,0x66, + 0x69,0x6E,0x65,0x64,0x20,0x62,0x79,0x20,0x69,0x74,0x73,0x20, + 0x65,0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65,0x20,0x63,0x75,0x72, + 0x76,0x65,0x2E,0x20,0x49,0x66,0x20,0x74,0x68,0x65,0x3E,0x69, + 0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20,0x68,0x61, + 0x73,0x20,0x61,0x20,0x73,0x75,0x73,0x74,0x61,0x69,0x6E,0x20, + 0x70,0x6F,0x69,0x6E,0x74,0x2C,0x20,0x74,0x68,0x65,0x20,0x65, + 0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65,0x20,0x77,0x69,0x6C,0x6C, + 0x20,0x73,0x74,0x6F,0x70,0x20,0x61,0x74,0x20,0x74,0x68,0x61, + 0x74,0x42,0x70,0x6F,0x69,0x6E,0x74,0x20,0x75,0x6E,0x74,0x69, + 0x6C,0x20,0x61,0x20,0x6B,0x65,0x79,0x2D,0x6F,0x66,0x66,0x20, + 0x6E,0x6F,0x74,0x65,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65, + 0x6E,0x20,0x70,0x6C,0x61,0x79,0x65,0x64,0x2E,0x20,0x57,0x68, + 0x65,0x6E,0x20,0x61,0x20,0x6B,0x65,0x79,0x2D,0x6F,0x66,0x66, + 0x20,0x6E,0x6F,0x74,0x65,0x20,0x69,0x73,0x1D,0x70,0x6C,0x61, + 0x79,0x65,0x64,0x2C,0x20,0x74,0x68,0x65,0x20,0x22,0x66,0x61, + 0x64,0x65,0x6F,0x75,0x74,0x22,0x20,0x62,0x65,0x67,0x69,0x6E, + 0x73,0x2E,0x44,0x3E,0x4F,0x6E,0x65,0x20,0x70,0x69,0x78,0x65, + 0x6C,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x65,0x6E,0x76, + 0x65,0x6C,0x6F,0x70,0x65,0x20,0x77,0x69,0x6E,0x64,0x6F,0x77, + 0x20,0x63,0x6F,0x72,0x72,0x65,0x73,0x70,0x6F,0x6E,0x64,0x73, + 0x20,0x74,0x6F,0x20,0x6F,0x6E,0x65,0x20,0x70,0x6C,0x61,0x79, + 0x65,0x72,0x2D,0x74,0x69,0x63,0x6B,0x2E,0x20,0x49,0x66,0x3C, + 0x74,0x68,0x65,0x20,0x42,0x50,0x4D,0x20,0x69,0x73,0x20,0x31, + 0x32,0x35,0x2C,0x20,0x79,0x6F,0x75,0x27,0x6C,0x6C,0x20,0x63, + 0x6F,0x6E,0x73,0x75,0x6D,0x65,0x20,0x35,0x30,0x20,0x70,0x69, + 0x78,0x65,0x6C,0x2F,0x73,0x65,0x63,0x6F,0x6E,0x64,0x2E,0x20, + 0x54,0x68,0x65,0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x27,0x73, + 0x1A,0x22,0x73,0x69,0x7A,0x65,0x22,0x20,0x69,0x73,0x20,0x61, + 0x62,0x6F,0x75,0x74,0x20,0x36,0x20,0x73,0x65,0x63,0x6F,0x6E, + 0x64,0x73,0x2E,0x3E,0x3E,0x49,0x66,0x20,0x79,0x6F,0x75,0x20, + 0x70,0x72,0x65,0x73,0x73,0x20,0x74,0x68,0x65,0x20,0x72,0x69, + 0x67,0x68,0x74,0x20,0x6D,0x6F,0x75,0x73,0x65,0x20,0x62,0x75, + 0x74,0x74,0x6F,0x6E,0x20,0x61,0x74,0x20,0x74,0x68,0x65,0x20, + 0x70,0x72,0x65,0x64,0x65,0x66,0x69,0x6E,0x65,0x20,0x62,0x75, + 0x74,0x74,0x6F,0x6E,0x73,0x2C,0x3F,0x79,0x6F,0x75,0x27,0x6C, + 0x6C,0x20,0x73,0x74,0x6F,0x72,0x65,0x20,0x74,0x68,0x65,0x20, + 0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x20,0x65,0x6E,0x76,0x65, + 0x6C,0x6F,0x70,0x65,0x20,0x69,0x6E,0x74,0x6F,0x20,0x74,0x68, + 0x61,0x74,0x20,0x70,0x72,0x65,0x64,0x65,0x66,0x69,0x6E,0x65, + 0x20,0x63,0x65,0x6C,0x6C,0x2E,0x20,0x54,0x68,0x65,0x30,0x70, + 0x72,0x65,0x64,0x65,0x66,0x69,0x6E,0x65,0x73,0x20,0x61,0x72, + 0x65,0x20,0x73,0x74,0x6F,0x72,0x65,0x64,0x20,0x69,0x6E,0x20, + 0x74,0x68,0x65,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72, + 0x61,0x74,0x69,0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x2E,0x43, + 0x3E,0x50,0x72,0x65,0x64,0x65,0x66,0x69,0x6E,0x65,0x20,0x6E, + 0x75,0x6D,0x62,0x65,0x72,0x20,0x31,0x20,0x69,0x73,0x20,0x74, + 0x68,0x65,0x20,0x64,0x65,0x66,0x61,0x75,0x6C,0x74,0x20,0x65, + 0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65,0x2E,0x20,0x54,0x68,0x69, + 0x73,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x74,0x68,0x61,0x74, + 0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x42,0x6C,0x6F,0x61,0x64, + 0x20,0x61,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x2C,0x20,0x69, + 0x74,0x20,0x77,0x69,0x6C,0x6C,0x20,0x67,0x65,0x74,0x20,0x61, + 0x6C,0x6C,0x20,0x65,0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65,0x20, + 0x69,0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6F,0x6E,0x20, + 0x66,0x72,0x6F,0x6D,0x20,0x70,0x72,0x65,0x64,0x65,0x66,0x69, + 0x6E,0x65,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x20,0x31,0x2C, + 0x20,0x69,0x6E,0x63,0x6C,0x75,0x64,0x69,0x6E,0x67,0x20,0x74, + 0x68,0x65,0x20,0x76,0x69,0x62,0x72,0x61,0x74,0x6F,0x2E,0x42, + 0x3E,0x4E,0x6F,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x69, + 0x66,0x20,0x79,0x6F,0x75,0x20,0x74,0x75,0x72,0x6E,0x20,0x74, + 0x68,0x65,0x20,0x76,0x6F,0x6C,0x75,0x6D,0x65,0x2D,0x65,0x6E, + 0x76,0x65,0x6C,0x6F,0x70,0x65,0x20,0x6F,0x66,0x66,0x2C,0x20, + 0x79,0x6F,0x75,0x20,0x64,0x6F,0x6E,0x27,0x74,0x20,0x74,0x75, + 0x72,0x6E,0x20,0x74,0x68,0x65,0x0C,0x76,0x69,0x62,0x72,0x61, + 0x74,0x6F,0x20,0x6F,0x66,0x66,0x2E,0x00,0x20,0x3E,0x40,0x58, + 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x54,0x68,0x65,0x20, + 0x70,0x61,0x6E,0x6E,0x69,0x6E,0x67,0x20,0x65,0x6E,0x76,0x65, + 0x6C,0x6F,0x70,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30, + 0x40,0x43,0x30,0x30,0x32,0x40,0x3E,0x53,0x61,0x6D,0x65,0x20, + 0x61,0x73,0x20,0x61,0x62,0x6F,0x76,0x65,0x2C,0x20,0x65,0x78, + 0x63,0x65,0x70,0x74,0x20,0x66,0x72,0x6F,0x6D,0x20,0x74,0x68, + 0x61,0x74,0x20,0x74,0x68,0x65,0x20,0x76,0x69,0x62,0x72,0x61, + 0x74,0x6F,0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x63,0x6F, + 0x6E,0x6E,0x65,0x63,0x74,0x65,0x64,0x20,0x74,0x6F,0x15,0x74, + 0x68,0x65,0x20,0x70,0x61,0x6E,0x6E,0x69,0x6E,0x67,0x20,0x65, + 0x6E,0x76,0x65,0x6C,0x6F,0x70,0x65,0x2E,0x00,0x10,0x3E,0x40, + 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x54,0x75,0x6E, 0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30, - 0x30,0x32,0x3C,0x3E,0x53,0x74,0x6F,0x72,0x65,0x73,0x20,0x74, - 0x68,0x65,0x20,0x72,0x61,0x6E,0x67,0x65,0x20,0x73,0x70,0x65, + 0x30,0x32,0x3F,0x3E,0x54,0x68,0x65,0x20,0x66,0x69,0x6E,0x65, + 0x2D,0x74,0x75,0x6E,0x65,0x20,0x72,0x65,0x73,0x6F,0x6C,0x75, + 0x74,0x69,0x6F,0x6E,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65, + 0x6E,0x20,0x63,0x68,0x61,0x6E,0x67,0x65,0x64,0x20,0x66,0x72, + 0x6F,0x6D,0x20,0x61,0x20,0x73,0x69,0x67,0x6E,0x65,0x64,0x20, + 0x6E,0x69,0x62,0x62,0x6C,0x65,0x27,0x28,0x2D,0x38,0x2E,0x2E, + 0x2B,0x37,0x29,0x20,0x74,0x6F,0x20,0x61,0x20,0x73,0x69,0x67, + 0x6E,0x65,0x64,0x20,0x62,0x79,0x74,0x65,0x20,0x28,0x2D,0x31, + 0x32,0x38,0x2E,0x2E,0x2B,0x31,0x32,0x37,0x29,0x2E,0x00,0x13, + 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x46, + 0x61,0x64,0x65,0x6F,0x75,0x74,0x3A,0x0B,0x3E,0x40,0x58,0x30, + 0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x1B,0x3E,0x54,0x68,0x69, + 0x73,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x66,0x61,0x64, + 0x65,0x6F,0x75,0x74,0x20,0x73,0x70,0x65,0x65,0x64,0x2E,0x00, + 0x19,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31, + 0x56,0x69,0x62,0x72,0x61,0x74,0x6F,0x20,0x73,0x77,0x65,0x65, + 0x70,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30, + 0x30,0x32,0x3E,0x3E,0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20, + 0x74,0x68,0x65,0x20,0x74,0x69,0x6D,0x65,0x20,0x28,0x69,0x6E, + 0x20,0x70,0x6C,0x61,0x79,0x65,0x72,0x20,0x74,0x69,0x63,0x6B, + 0x73,0x29,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x69,0x6C,0x6C, + 0x20,0x62,0x79,0x70,0x61,0x73,0x73,0x20,0x75,0x6E,0x74,0x69, + 0x6C,0x20,0x74,0x68,0x65,0x2D,0x61,0x75,0x74,0x6F,0x2D,0x76, + 0x69,0x62,0x72,0x61,0x74,0x6F,0x20,0x77,0x69,0x6C,0x6C,0x20, + 0x72,0x65,0x61,0x63,0x68,0x20,0x69,0x74,0x27,0x73,0x20,0x66, + 0x69,0x6E,0x61,0x6C,0x20,0x61,0x6D,0x70,0x6C,0x69,0x74,0x75, + 0x64,0x65,0x2E,0x00,0x1E,0x3E,0x40,0x58,0x30,0x34,0x30,0x40, + 0x43,0x30,0x30,0x31,0x54,0x68,0x65,0x20,0x70,0x69,0x61,0x6E, + 0x6F,0x20,0x6B,0x65,0x79,0x62,0x6F,0x61,0x72,0x64,0x3A,0x0B, + 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3F, + 0x3E,0x54,0x68,0x65,0x20,0x70,0x69,0x61,0x6E,0x6F,0x20,0x6B, + 0x65,0x79,0x62,0x6F,0x61,0x72,0x64,0x20,0x64,0x65,0x66,0x69, + 0x6E,0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x6B,0x65,0x79,0x20, + 0x73,0x70,0x6C,0x69,0x74,0x20,0x66,0x6F,0x72,0x20,0x61,0x6E, + 0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x2E, + 0x20,0x54,0x6F,0x3F,0x63,0x68,0x61,0x6E,0x67,0x65,0x20,0x74, + 0x68,0x65,0x20,0x6B,0x65,0x79,0x20,0x73,0x70,0x6C,0x69,0x74, + 0x2C,0x20,0x63,0x68,0x6F,0x6F,0x73,0x65,0x20,0x61,0x20,0x73, + 0x61,0x6D,0x70,0x6C,0x65,0x20,0x77,0x69,0x74,0x68,0x69,0x6E, + 0x20,0x74,0x68,0x65,0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D, + 0x65,0x6E,0x74,0x20,0x61,0x6E,0x64,0x1C,0x74,0x68,0x65,0x6E, + 0x20,0x22,0x64,0x72,0x61,0x77,0x22,0x20,0x6F,0x6E,0x20,0x74, + 0x68,0x65,0x20,0x6B,0x65,0x79,0x62,0x6F,0x61,0x72,0x64,0x2E, + 0x42,0x3E,0x54,0x68,0x65,0x20,0x6E,0x6F,0x74,0x65,0x73,0x20, + 0x70,0x6C,0x61,0x79,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20, + 0x74,0x68,0x65,0x20,0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x20, + 0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20,0x61, + 0x72,0x65,0x20,0x69,0x6E,0x64,0x69,0x63,0x61,0x74,0x65,0x64, + 0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x09,0x6B,0x65,0x79,0x62, + 0x6F,0x61,0x72,0x64,0x2E,0x00,0x1A,0x3E,0x40,0x58,0x30,0x34, + 0x30,0x40,0x43,0x30,0x30,0x31,0x49,0x6D,0x70,0x6F,0x72,0x74, + 0x61,0x6E,0x74,0x20,0x6E,0x6F,0x74,0x65,0x3A,0x0B,0x3E,0x40, + 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x40,0x3E,0x54, + 0x68,0x65,0x20,0x76,0x6F,0x6C,0x75,0x6D,0x65,0x2C,0x20,0x70, + 0x61,0x6E,0x6E,0x69,0x6E,0x67,0x2C,0x20,0x74,0x75,0x6E,0x65, + 0x20,0x61,0x6E,0x64,0x20,0x72,0x65,0x6C,0x61,0x74,0x69,0x76, + 0x65,0x20,0x74,0x6F,0x6E,0x65,0x20,0x69,0x73,0x20,0x64,0x65, + 0x66,0x69,0x6E,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,0x45,0x41, + 0x43,0x48,0x41,0x53,0x41,0x4D,0x50,0x4C,0x45,0x20,0x69,0x6E, + 0x20,0x61,0x6E,0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65, + 0x6E,0x74,0x2E,0x20,0x41,0x6C,0x6C,0x20,0x6F,0x74,0x68,0x65, + 0x72,0x20,0x69,0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6F, + 0x6E,0x20,0x69,0x73,0x20,0x64,0x65,0x66,0x69,0x6E,0x65,0x64, + 0x20,0x66,0x6F,0x72,0x20,0x74,0x68,0x65,0x12,0x65,0x6E,0x74, + 0x69,0x72,0x65,0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65, + 0x6E,0x74,0x2E,0x00,0x31,0x40,0x58,0x30,0x32,0x30,0x40,0x43, + 0x30,0x30,0x31,0x49,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E, + 0x74,0x20,0x45,0x64,0x69,0x74,0x6F,0x72,0x20,0x45,0x78,0x74, + 0x65,0x6E,0x73,0x69,0x6F,0x6E,0x3A,0x20,0x28,0x49,0x2E,0x45, + 0x2E,0x45,0x78,0x74,0x2E,0x29,0x01,0x3E,0x10,0x3E,0x40,0x58, + 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x4D,0x49,0x44,0x49, + 0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30, + 0x32,0x28,0x3E,0x27,0x70,0x2E,0x27,0x20,0x73,0x74,0x61,0x6E, + 0x64,0x73,0x20,0x66,0x6F,0x72,0x20,0x22,0x70,0x72,0x6F,0x67, + 0x72,0x61,0x6D,0x22,0x20,0x28,0x69,0x6E,0x73,0x74,0x72,0x75, + 0x6D,0x65,0x6E,0x74,0x29,0x2E,0x40,0x3E,0x53,0x65,0x76,0x65, + 0x72,0x61,0x6C,0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65, + 0x6E,0x74,0x73,0x20,0x63,0x61,0x6E,0x20,0x68,0x61,0x76,0x65, + 0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x65,0x20,0x74,0x72, + 0x61,0x6E,0x73,0x6D,0x69,0x74,0x20,0x63,0x68,0x61,0x6E,0x6E, + 0x65,0x6C,0x20,0x62,0x75,0x74,0x20,0x77,0x69,0x74,0x68,0x33, + 0x64,0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x74,0x20,0x70,0x72, + 0x6F,0x67,0x72,0x61,0x6D,0x73,0x2E,0x20,0x46,0x54,0x32,0x20, + 0x63,0x68,0x61,0x6E,0x67,0x65,0x73,0x20,0x74,0x68,0x65,0x20, + 0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x73,0x20,0x6F,0x6E,0x20, + 0x74,0x68,0x65,0x43,0x4D,0x49,0x44,0x49,0x2D,0x63,0x68,0x61, + 0x6E,0x6E,0x65,0x6C,0x73,0x20,0x69,0x6E,0x73,0x74,0x61,0x6E, + 0x74,0x6C,0x79,0x20,0x64,0x75,0x72,0x69,0x6E,0x67,0x20,0x70, + 0x6C,0x61,0x79,0x20,0x69,0x66,0x20,0x64,0x69,0x66,0x66,0x65, + 0x72,0x65,0x6E,0x74,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D, + 0x73,0x20,0x61,0x72,0x65,0x20,0x75,0x73,0x65,0x64,0x2E,0x3E, + 0x44,0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x74,0x20,0x70,0x72, + 0x6F,0x67,0x72,0x61,0x6D,0x73,0x20,0x63,0x61,0x6E,0x6E,0x6F, + 0x74,0x20,0x62,0x65,0x20,0x70,0x6C,0x61,0x79,0x65,0x64,0x20, + 0x61,0x74,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x65,0x20, + 0x63,0x68,0x61,0x6E,0x6E,0x65,0x6C,0x20,0x61,0x74,0x20,0x74, + 0x68,0x65,0x11,0x73,0x61,0x6D,0x65,0x20,0x74,0x69,0x6D,0x65, + 0x20,0x74,0x68,0x6F,0x75,0x67,0x68,0x2E,0x44,0x3E,0x49,0x66, + 0x20,0x79,0x6F,0x75,0x20,0x63,0x68,0x61,0x6E,0x67,0x65,0x20, + 0x74,0x68,0x69,0x73,0x20,0x76,0x61,0x6C,0x75,0x65,0x2C,0x20, + 0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20, + 0x6E,0x75,0x6D,0x62,0x65,0x72,0x20,0x77,0x69,0x6C,0x6C,0x20, + 0x62,0x65,0x20,0x74,0x72,0x61,0x6E,0x73,0x6D,0x69,0x74,0x74, + 0x65,0x64,0x20,0x74,0x6F,0x1C,0x74,0x68,0x65,0x20,0x73,0x79, + 0x6E,0x74,0x68,0x65,0x73,0x69,0x7A,0x65,0x72,0x20,0x69,0x6D, + 0x6D,0x65,0x64,0x69,0x61,0x74,0x65,0x6C,0x79,0x2E,0x3E,0x3E, + 0x53,0x6F,0x6D,0x65,0x20,0x73,0x79,0x6E,0x74,0x68,0x65,0x73, + 0x69,0x7A,0x65,0x72,0x73,0x20,0x74,0x72,0x61,0x6E,0x73,0x6D, + 0x69,0x74,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x63, + 0x68,0x61,0x6E,0x67,0x65,0x20,0x69,0x6E,0x66,0x6F,0x72,0x6D, + 0x61,0x74,0x69,0x6F,0x6E,0x2E,0x20,0x49,0x66,0x20,0x74,0x68, + 0x65,0x43,0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x20,0x69,0x6E, + 0x73,0x74,0x72,0x75,0x6D,0x65,0x6E,0x74,0x20,0x69,0x6E,0x20, + 0x46,0x54,0x32,0x20,0x69,0x73,0x20,0x61,0x20,0x4D,0x49,0x44, + 0x49,0x2D,0x69,0x6E,0x73,0x74,0x72,0x2E,0x20,0x77,0x69,0x74, + 0x68,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x65,0x20,0x63, + 0x68,0x61,0x6E,0x6E,0x65,0x6C,0x20,0x61,0x73,0x3F,0x74,0x68, + 0x65,0x20,0x72,0x65,0x63,0x65,0x69,0x76,0x65,0x64,0x20,0x70, + 0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x63,0x68,0x61,0x6E,0x67, + 0x65,0x2C,0x20,0x69,0x74,0x27,0x73,0x20,0x4D,0x49,0x44,0x49, + 0x2D,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x77,0x69,0x6C, + 0x6C,0x20,0x62,0x65,0x20,0x63,0x68,0x61,0x6E,0x67,0x65,0x64, + 0x2E,0x40,0x3E,0x49,0x66,0x20,0x79,0x6F,0x75,0x72,0x20,0x73, + 0x79,0x6E,0x74,0x68,0x65,0x73,0x69,0x7A,0x65,0x72,0x20,0x64, + 0x6F,0x65,0x73,0x6E,0x27,0x74,0x20,0x74,0x72,0x61,0x6E,0x73, + 0x6D,0x69,0x74,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20, + 0x63,0x68,0x61,0x6E,0x67,0x65,0x2C,0x20,0x74,0x68,0x65,0x72, + 0x65,0x27,0x73,0x20,0x6E,0x6F,0x3E,0x70,0x6F,0x69,0x6E,0x74, + 0x20,0x69,0x6E,0x20,0x63,0x68,0x61,0x6E,0x67,0x69,0x6E,0x67, + 0x20,0x69,0x74,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x20,0x73, + 0x79,0x6E,0x74,0x68,0x65,0x73,0x69,0x7A,0x65,0x72,0x2C,0x20, + 0x64,0x6F,0x20,0x69,0x74,0x20,0x69,0x6E,0x20,0x46,0x54,0x32, + 0x20,0x69,0x6E,0x73,0x74,0x65,0x61,0x64,0x2E,0x00,0x18,0x3E, + 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x42,0x65, + 0x6E,0x64,0x65,0x72,0x20,0x72,0x61,0x6E,0x67,0x65,0x3A,0x0B, + 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x38, + 0x3E,0x54,0x68,0x69,0x73,0x20,0x76,0x61,0x6C,0x75,0x65,0x20, + 0x64,0x65,0x66,0x69,0x6E,0x65,0x73,0x20,0x68,0x6F,0x77,0x20, + 0x6D,0x61,0x6E,0x79,0x20,0x6E,0x6F,0x74,0x65,0x73,0x20,0x74, + 0x68,0x65,0x20,0x69,0x6E,0x73,0x74,0x72,0x75,0x6D,0x65,0x6E, + 0x74,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x37,0x73,0x79,0x6E, + 0x74,0x68,0x65,0x73,0x69,0x7A,0x65,0x72,0x20,0x63,0x61,0x6E, + 0x20,0x62,0x65,0x20,0x70,0x69,0x74,0x63,0x68,0x62,0x65,0x6E, + 0x64,0x65,0x64,0x2E,0x20,0x46,0x54,0x32,0x20,0x75,0x73,0x65, + 0x73,0x20,0x74,0x68,0x69,0x73,0x20,0x76,0x61,0x6C,0x75,0x65, + 0x20,0x66,0x6F,0x72,0x37,0x74,0x72,0x61,0x6E,0x73,0x6D,0x69, + 0x74,0x74,0x69,0x6E,0x67,0x20,0x74,0x68,0x65,0x20,0x70,0x6F, + 0x72,0x74,0x61,0x6D,0x65,0x6E,0x74,0x6F,0x20,0x75,0x70,0x2F, + 0x64,0x6F,0x77,0x6E,0x20,0x61,0x6E,0x64,0x20,0x74,0x6F,0x6E, + 0x65,0x2D,0x70,0x6F,0x72,0x74,0x61,0x6D,0x65,0x6E,0x74,0x6F, + 0x13,0x63,0x6F,0x6D,0x6D,0x61,0x6E,0x64,0x73,0x20,0x63,0x6F, + 0x72,0x72,0x65,0x63,0x74,0x6C,0x79,0x2E,0x45,0x3E,0x54,0x68, + 0x65,0x20,0x4D,0x49,0x44,0x49,0x2D,0x70,0x69,0x74,0x63,0x68, + 0x62,0x65,0x6E,0x64,0x20,0x77,0x6F,0x72,0x6B,0x73,0x20,0x63, + 0x6F,0x72,0x72,0x65,0x63,0x74,0x6C,0x79,0x20,0x6F,0x6E,0x6C, + 0x79,0x20,0x77,0x69,0x74,0x68,0x20,0x6C,0x69,0x6E,0x65,0x61, + 0x72,0x20,0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x20, + 0x74,0x61,0x62,0x6C,0x65,0x2E,0x00,0x18,0x40,0x58,0x30,0x32, + 0x30,0x40,0x43,0x30,0x30,0x31,0x53,0x61,0x6D,0x70,0x6C,0x65, + 0x20,0x45,0x64,0x69,0x74,0x6F,0x72,0x3A,0x01,0x3E,0x2C,0x3E, + 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50,0x6C, + 0x61,0x79,0x20,0x28,0x57,0x61,0x76,0x65,0x20,0x66,0x6F,0x72, + 0x6D,0x2C,0x20,0x72,0x61,0x6E,0x67,0x65,0x2C,0x20,0x64,0x69, + 0x73,0x70,0x6C,0x61,0x79,0x29,0x3A,0x0B,0x3E,0x40,0x58,0x30, + 0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3C,0x3E,0x50,0x6C,0x61, + 0x79,0x73,0x20,0x74,0x68,0x65,0x20,0x63,0x75,0x72,0x72,0x65, + 0x6E,0x74,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x77,0x69, + 0x74,0x68,0x20,0x74,0x6F,0x6E,0x65,0x20,0x64,0x69,0x73,0x70, + 0x6C,0x61,0x79,0x20,0x61,0x62,0x6F,0x76,0x65,0x20,0x74,0x68, + 0x65,0x20,0x22,0x73,0x74,0x6F,0x70,0x22,0x3D,0x62,0x75,0x74, + 0x74,0x6F,0x6E,0x2E,0x20,0x4E,0x6F,0x74,0x65,0x20,0x74,0x68, + 0x61,0x74,0x20,0x72,0x65,0x73,0x70,0x65,0x63,0x74,0x20,0x69, + 0x73,0x20,0x74,0x61,0x6B,0x65,0x6E,0x20,0x74,0x6F,0x20,0x74, + 0x68,0x65,0x20,0x70,0x61,0x72,0x74,0x69,0x63,0x75,0x6C,0x61, + 0x72,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x27,0x73,0x0E,0x72, + 0x65,0x6C,0x61,0x74,0x69,0x76,0x65,0x20,0x74,0x6F,0x6E,0x65, + 0x2E,0x00,0x16,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30, + 0x30,0x31,0x53,0x61,0x76,0x65,0x20,0x72,0x61,0x6E,0x67,0x65, + 0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30, + 0x32,0x3C,0x3E,0x53,0x74,0x6F,0x72,0x65,0x73,0x20,0x74,0x68, + 0x65,0x20,0x72,0x61,0x6E,0x67,0x65,0x20,0x73,0x70,0x65,0x63, + 0x69,0x66,0x69,0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65, + 0x20,0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x20,0x73,0x61,0x6D, + 0x70,0x6C,0x65,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,0x72, + 0x79,0x2E,0x00,0x11,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43, + 0x30,0x30,0x31,0x50,0x61,0x73,0x74,0x65,0x3A,0x0B,0x3E,0x40, + 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x40,0x3E,0x54, + 0x68,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x64,0x61, + 0x74,0x61,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6F, + 0x70,0x79,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x20,0x69,0x73, + 0x20,0x73,0x74,0x6F,0x72,0x65,0x64,0x20,0x49,0x4E,0x54,0x4F, + 0x20,0x74,0x68,0x65,0x20,0x73,0x70,0x65,0x63,0x69,0x66,0x69, + 0x65,0x64,0x06,0x72,0x61,0x6E,0x67,0x65,0x2E,0x00,0x10,0x3E, + 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x43,0x72, + 0x6F,0x70,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43, + 0x30,0x30,0x32,0x3E,0x3E,0x43,0x75,0x74,0x73,0x20,0x65,0x76, + 0x65,0x72,0x79,0x74,0x68,0x69,0x6E,0x67,0x20,0x62,0x75,0x74, + 0x20,0x74,0x68,0x65,0x20,0x72,0x61,0x6E,0x67,0x65,0x2E,0x20, + 0x4E,0x6F,0x74,0x68,0x69,0x6E,0x67,0x20,0x69,0x73,0x20,0x63, + 0x68,0x61,0x6E,0x67,0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68, + 0x65,0x20,0x63,0x6F,0x70,0x79,0x19,0x62,0x75,0x66,0x66,0x65, + 0x72,0x20,0x62,0x79,0x20,0x74,0x68,0x69,0x73,0x20,0x6F,0x70, + 0x65,0x72,0x61,0x74,0x69,0x6F,0x6E,0x2E,0x00,0x12,0x3E,0x40, + 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x56,0x6F,0x6C, + 0x75,0x6D,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40, + 0x43,0x30,0x30,0x32,0x17,0x3E,0x4F,0x70,0x65,0x72,0x61,0x74, + 0x65,0x73,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x20,0x72,0x61, + 0x6E,0x67,0x65,0x2E,0x00,0x12,0x3E,0x40,0x58,0x30,0x34,0x30, + 0x40,0x43,0x30,0x30,0x31,0x58,0x2D,0x46,0x61,0x64,0x65,0x3A, + 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32, + 0x44,0x3E,0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x61,0x20, + 0x74,0x6F,0x6F,0x6C,0x20,0x66,0x6F,0x72,0x20,0x6D,0x61,0x6B, + 0x69,0x6E,0x67,0x20,0x73,0x6D,0x6F,0x6F,0x74,0x68,0x20,0x6C, + 0x6F,0x6F,0x70,0x73,0x2E,0x20,0x53,0x70,0x65,0x63,0x69,0x66, + 0x79,0x20,0x61,0x20,0x72,0x61,0x6E,0x67,0x65,0x20,0x74,0x68, + 0x61,0x74,0x20,0x63,0x6F,0x76,0x65,0x72,0x73,0x41,0x74,0x68, + 0x65,0x20,0x66,0x69,0x72,0x73,0x74,0x20,0x6C,0x6F,0x6F,0x70, + 0x20,0x70,0x6F,0x69,0x6E,0x74,0x2E,0x20,0x4D,0x61,0x6B,0x65, + 0x20,0x73,0x75,0x72,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x74, + 0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x61,0x73,0x20,0x6D, + 0x75,0x63,0x68,0x20,0x73,0x70,0x61,0x63,0x65,0x20,0x61,0x66, + 0x74,0x65,0x72,0x41,0x74,0x68,0x65,0x20,0x73,0x65,0x63,0x6F, + 0x6E,0x64,0x20,0x6C,0x6F,0x6F,0x70,0x20,0x70,0x6F,0x69,0x6E, + 0x74,0x20,0x61,0x73,0x20,0x74,0x68,0x65,0x20,0x72,0x61,0x6E, + 0x67,0x65,0x20,0x62,0x79,0x70,0x61,0x73,0x73,0x65,0x73,0x20, + 0x74,0x68,0x65,0x20,0x66,0x69,0x72,0x73,0x74,0x20,0x6C,0x6F, + 0x6F,0x70,0x20,0x70,0x6F,0x69,0x6E,0x74,0x2E,0x1F,0x50,0x72, + 0x65,0x73,0x73,0x20,0x74,0x68,0x65,0x20,0x58,0x2D,0x66,0x61, + 0x64,0x65,0x20,0x62,0x75,0x74,0x74,0x6F,0x6E,0x2E,0x20,0x45, + 0x6E,0x6A,0x6F,0x79,0x21,0x00,0x18,0x3E,0x40,0x58,0x30,0x34, + 0x30,0x40,0x43,0x30,0x30,0x31,0x38,0x2D,0x42,0x69,0x74,0x2F, + 0x31,0x36,0x2D,0x62,0x69,0x74,0x3A,0x0B,0x3E,0x40,0x58,0x30, + 0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x42,0x3E,0x49,0x66,0x20, + 0x79,0x6F,0x75,0x20,0x6C,0x6F,0x61,0x64,0x20,0x61,0x20,0x31, + 0x36,0x2D,0x62,0x69,0x74,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65, + 0x20,0x77,0x69,0x74,0x68,0x6F,0x75,0x74,0x20,0x68,0x65,0x61, + 0x64,0x65,0x72,0x2C,0x20,0x46,0x54,0x32,0x20,0x61,0x73,0x73, + 0x75,0x6D,0x65,0x73,0x20,0x74,0x68,0x61,0x74,0x20,0x69,0x74, + 0x27,0x73,0x3E,0x61,0x6E,0x20,0x38,0x2D,0x62,0x69,0x74,0x20, + 0x73,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x20,0x57,0x68,0x65,0x6E, + 0x20,0x70,0x72,0x65,0x73,0x73,0x69,0x6E,0x67,0x20,0x74,0x68, + 0x65,0x20,0x31,0x36,0x2D,0x62,0x69,0x74,0x20,0x62,0x75,0x74, + 0x74,0x6F,0x6E,0x2C,0x20,0x64,0x6F,0x20,0x6E,0x6F,0x74,0x20, + 0x70,0x72,0x65,0x73,0x73,0x23,0x22,0x63,0x6F,0x6E,0x76,0x65, + 0x72,0x74,0x22,0x20,0x77,0x68,0x65,0x6E,0x20,0x74,0x68,0x65, + 0x20,0x72,0x65,0x71,0x75,0x65,0x73,0x74,0x20,0x69,0x73,0x20, + 0x6D,0x61,0x64,0x65,0x2E,0x00,0x14,0x3E,0x40,0x58,0x30,0x34, + 0x30,0x40,0x43,0x30,0x30,0x31,0x4D,0x69,0x6E,0x69,0x6D,0x69, + 0x7A,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43, + 0x30,0x30,0x32,0x44,0x3E,0x54,0x68,0x69,0x73,0x20,0x66,0x75, + 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x75,0x74,0x73,0x20, + 0x74,0x68,0x65,0x20,0x70,0x61,0x72,0x74,0x20,0x6F,0x66,0x20, + 0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x74, + 0x68,0x61,0x74,0x20,0x69,0x73,0x20,0x62,0x65,0x79,0x6F,0x6E, + 0x64,0x20,0x74,0x68,0x65,0x20,0x73,0x65,0x63,0x6F,0x6E,0x64, + 0x0B,0x6C,0x6F,0x6F,0x70,0x20,0x70,0x6F,0x69,0x6E,0x74,0x2E, + 0x00,0x2D,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31, + 0x53,0x61,0x6D,0x70,0x6C,0x65,0x20,0x45,0x64,0x69,0x74,0x6F, + 0x72,0x20,0x45,0x78,0x74,0x65,0x6E,0x73,0x69,0x6F,0x6E,0x3A, + 0x20,0x28,0x53,0x2E,0x45,0x2E,0x45,0x78,0x74,0x2E,0x29,0x01, + 0x3E,0x27,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30, + 0x31,0x43,0x6F,0x70,0x79,0x2F,0x58,0x63,0x68,0x67,0x20,0x53, + 0x61,0x6D,0x70,0x6C,0x65,0x2F,0x49,0x6E,0x73,0x74,0x72,0x75, + 0x6D,0x65,0x6E,0x74,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30, + 0x40,0x43,0x30,0x30,0x32,0x3C,0x3E,0x54,0x68,0x65,0x20,0x73, + 0x6F,0x75,0x72,0x63,0x65,0x20,0x69,0x73,0x20,0x73,0x70,0x65, 0x63,0x69,0x66,0x69,0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68, - 0x65,0x20,0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x20,0x73,0x61, - 0x6D,0x70,0x6C,0x65,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F, - 0x72,0x79,0x2E,0x00,0x11,0x3E,0x40,0x58,0x30,0x34,0x30,0x40, - 0x43,0x30,0x30,0x31,0x50,0x61,0x73,0x74,0x65,0x3A,0x0B,0x3E, - 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x40,0x3E, - 0x54,0x68,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x64, - 0x61,0x74,0x61,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x63, - 0x6F,0x70,0x79,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x20,0x69, - 0x73,0x20,0x73,0x74,0x6F,0x72,0x65,0x64,0x20,0x49,0x4E,0x54, - 0x4F,0x20,0x74,0x68,0x65,0x20,0x73,0x70,0x65,0x63,0x69,0x66, - 0x69,0x65,0x64,0x06,0x72,0x61,0x6E,0x67,0x65,0x2E,0x00,0x10, - 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x43, - 0x72,0x6F,0x70,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40, - 0x43,0x30,0x30,0x32,0x3E,0x3E,0x43,0x75,0x74,0x73,0x20,0x65, - 0x76,0x65,0x72,0x79,0x74,0x68,0x69,0x6E,0x67,0x20,0x62,0x75, - 0x74,0x20,0x74,0x68,0x65,0x20,0x72,0x61,0x6E,0x67,0x65,0x2E, - 0x20,0x4E,0x6F,0x74,0x68,0x69,0x6E,0x67,0x20,0x69,0x73,0x20, - 0x63,0x68,0x61,0x6E,0x67,0x65,0x64,0x20,0x69,0x6E,0x20,0x74, - 0x68,0x65,0x20,0x63,0x6F,0x70,0x79,0x19,0x62,0x75,0x66,0x66, - 0x65,0x72,0x20,0x62,0x79,0x20,0x74,0x68,0x69,0x73,0x20,0x6F, - 0x70,0x65,0x72,0x61,0x74,0x69,0x6F,0x6E,0x2E,0x00,0x12,0x3E, - 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x56,0x6F, - 0x6C,0x75,0x6D,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30, - 0x40,0x43,0x30,0x30,0x32,0x17,0x3E,0x4F,0x70,0x65,0x72,0x61, - 0x74,0x65,0x73,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x20,0x72, - 0x61,0x6E,0x67,0x65,0x2E,0x00,0x12,0x3E,0x40,0x58,0x30,0x34, - 0x30,0x40,0x43,0x30,0x30,0x31,0x58,0x2D,0x46,0x61,0x64,0x65, + 0x65,0x20,0x6C,0x69,0x6E,0x65,0x20,0x6E,0x75,0x6D,0x62,0x65, + 0x72,0x69,0x6E,0x67,0x20,0x63,0x6F,0x6C,0x75,0x6D,0x6E,0x20, + 0x6F,0x66,0x20,0x74,0x68,0x65,0x40,0x69,0x6E,0x73,0x74,0x72, + 0x2E,0x2F,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x6C,0x69,0x73, + 0x74,0x73,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x75,0x70, + 0x70,0x65,0x72,0x2D,0x72,0x69,0x67,0x68,0x74,0x20,0x63,0x6F, + 0x72,0x6E,0x65,0x72,0x20,0x6F,0x66,0x20,0x74,0x68,0x65,0x20, + 0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x20,0x54,0x68,0x65,0x29, + 0x64,0x65,0x73,0x74,0x69,0x6E,0x61,0x74,0x69,0x6F,0x6E,0x20, + 0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x63,0x75,0x72,0x72,0x65, + 0x6E,0x74,0x20,0x69,0x6E,0x73,0x74,0x72,0x2E,0x2F,0x73,0x61, + 0x6D,0x70,0x6C,0x65,0x2E,0x00,0x15,0x3E,0x40,0x58,0x30,0x34, + 0x30,0x40,0x43,0x30,0x30,0x31,0x42,0x61,0x63,0x6B,0x77,0x61, + 0x72,0x64,0x73,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40, + 0x43,0x30,0x30,0x32,0x40,0x3E,0x4F,0x70,0x65,0x72,0x61,0x74, + 0x65,0x73,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x20,0x72,0x61, + 0x6E,0x67,0x65,0x20,0x28,0x6F,0x72,0x20,0x74,0x68,0x65,0x20, + 0x77,0x68,0x6F,0x6C,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65, + 0x20,0x69,0x66,0x20,0x6E,0x6F,0x20,0x72,0x61,0x6E,0x67,0x65, + 0x20,0x69,0x73,0x20,0x73,0x65,0x74,0x29,0x2E,0x00,0x13,0x3E, + 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x43,0x6F, + 0x6E,0x76,0x65,0x72,0x74,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36, + 0x30,0x40,0x43,0x30,0x30,0x32,0x34,0x3E,0x43,0x6F,0x6E,0x76, + 0x65,0x72,0x74,0x73,0x20,0x74,0x68,0x65,0x20,0x65,0x6E,0x74, + 0x69,0x72,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x66, + 0x72,0x6F,0x6D,0x2F,0x74,0x6F,0x20,0x73,0x69,0x67,0x6E,0x65, + 0x64,0x2F,0x75,0x6E,0x73,0x69,0x67,0x6E,0x65,0x64,0x2E,0x00, + 0x15,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31, + 0x43,0x6F,0x6E,0x76,0x65,0x72,0x74,0x20,0x57,0x3A,0x0B,0x3E, + 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3F,0x53, + 0x77,0x61,0x70,0x73,0x20,0x74,0x68,0x65,0x20,0x62,0x79,0x74, + 0x65,0x20,0x6F,0x72,0x64,0x65,0x72,0x20,0x74,0x6F,0x2F,0x66, + 0x72,0x6F,0x6D,0x20,0x49,0x6E,0x74,0x65,0x6C,0x20,0x66,0x72, + 0x6F,0x6D,0x2F,0x74,0x6F,0x20,0x4D,0x6F,0x74,0x6F,0x72,0x6F, + 0x6C,0x61,0x20,0x73,0x74,0x61,0x6E,0x64,0x61,0x72,0x64,0x20, + 0x6F,0x6E,0x12,0x74,0x68,0x65,0x20,0x65,0x6E,0x74,0x69,0x72, + 0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x44,0x59,0x6F, + 0x75,0x27,0x6C,0x6C,0x20,0x6E,0x65,0x65,0x64,0x20,0x74,0x68, + 0x69,0x73,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20, + 0x69,0x66,0x20,0x79,0x6F,0x75,0x20,0x69,0x6D,0x70,0x6F,0x72, + 0x74,0x20,0x31,0x36,0x2D,0x62,0x69,0x74,0x20,0x73,0x61,0x6D, + 0x70,0x6C,0x65,0x73,0x20,0x77,0x69,0x74,0x68,0x20,0x4D,0x6F, + 0x74,0x6F,0x72,0x6F,0x6C,0x61,0x2D,0x62,0x79,0x74,0x65,0x2D, + 0x6F,0x72,0x64,0x65,0x72,0x69,0x6E,0x67,0x20,0x28,0x66,0x2E, + 0x65,0x78,0x2E,0x20,0x4B,0x75,0x72,0x7A,0x77,0x65,0x69,0x6C, + 0x20,0x4B,0x32,0x30,0x30,0x30,0x20,0x73,0x61,0x6D,0x70,0x6C, + 0x65,0x73,0x2E,0x29,0x00,0x10,0x3E,0x40,0x58,0x30,0x34,0x30, + 0x40,0x43,0x30,0x30,0x31,0x45,0x63,0x68,0x6F,0x3A,0x0B,0x3E, + 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x1E,0x4F, + 0x70,0x65,0x72,0x61,0x74,0x65,0x73,0x20,0x6F,0x6E,0x20,0x74, + 0x68,0x65,0x20,0x65,0x6E,0x74,0x69,0x72,0x65,0x20,0x73,0x61, + 0x6D,0x70,0x6C,0x65,0x2E,0x00,0x12,0x3E,0x40,0x58,0x30,0x34, + 0x30,0x40,0x43,0x30,0x30,0x31,0x46,0x69,0x78,0x20,0x44,0x43, 0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30, - 0x32,0x44,0x3E,0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x61, - 0x20,0x74,0x6F,0x6F,0x6C,0x20,0x66,0x6F,0x72,0x20,0x6D,0x61, - 0x6B,0x69,0x6E,0x67,0x20,0x73,0x6D,0x6F,0x6F,0x74,0x68,0x20, - 0x6C,0x6F,0x6F,0x70,0x73,0x2E,0x20,0x53,0x70,0x65,0x63,0x69, - 0x66,0x79,0x20,0x61,0x20,0x72,0x61,0x6E,0x67,0x65,0x20,0x74, - 0x68,0x61,0x74,0x20,0x63,0x6F,0x76,0x65,0x72,0x73,0x41,0x74, - 0x68,0x65,0x20,0x66,0x69,0x72,0x73,0x74,0x20,0x6C,0x6F,0x6F, - 0x70,0x20,0x70,0x6F,0x69,0x6E,0x74,0x2E,0x20,0x4D,0x61,0x6B, - 0x65,0x20,0x73,0x75,0x72,0x65,0x20,0x74,0x68,0x61,0x74,0x20, - 0x74,0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x61,0x73,0x20, - 0x6D,0x75,0x63,0x68,0x20,0x73,0x70,0x61,0x63,0x65,0x20,0x61, - 0x66,0x74,0x65,0x72,0x41,0x74,0x68,0x65,0x20,0x73,0x65,0x63, - 0x6F,0x6E,0x64,0x20,0x6C,0x6F,0x6F,0x70,0x20,0x70,0x6F,0x69, - 0x6E,0x74,0x20,0x61,0x73,0x20,0x74,0x68,0x65,0x20,0x72,0x61, - 0x6E,0x67,0x65,0x20,0x62,0x79,0x70,0x61,0x73,0x73,0x65,0x73, - 0x20,0x74,0x68,0x65,0x20,0x66,0x69,0x72,0x73,0x74,0x20,0x6C, - 0x6F,0x6F,0x70,0x20,0x70,0x6F,0x69,0x6E,0x74,0x2E,0x1F,0x50, - 0x72,0x65,0x73,0x73,0x20,0x74,0x68,0x65,0x20,0x58,0x2D,0x66, - 0x61,0x64,0x65,0x20,0x62,0x75,0x74,0x74,0x6F,0x6E,0x2E,0x20, - 0x45,0x6E,0x6A,0x6F,0x79,0x21,0x00,0x18,0x3E,0x40,0x58,0x30, - 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x38,0x2D,0x42,0x69,0x74, - 0x2F,0x31,0x36,0x2D,0x62,0x69,0x74,0x3A,0x0B,0x3E,0x40,0x58, - 0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x42,0x3E,0x49,0x66, - 0x20,0x79,0x6F,0x75,0x20,0x6C,0x6F,0x61,0x64,0x20,0x61,0x20, - 0x31,0x36,0x2D,0x62,0x69,0x74,0x20,0x73,0x61,0x6D,0x70,0x6C, - 0x65,0x20,0x77,0x69,0x74,0x68,0x6F,0x75,0x74,0x20,0x68,0x65, - 0x61,0x64,0x65,0x72,0x2C,0x20,0x46,0x54,0x32,0x20,0x61,0x73, - 0x73,0x75,0x6D,0x65,0x73,0x20,0x74,0x68,0x61,0x74,0x20,0x69, - 0x74,0x27,0x73,0x3E,0x61,0x6E,0x20,0x38,0x2D,0x62,0x69,0x74, - 0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x20,0x57,0x68,0x65, - 0x6E,0x20,0x70,0x72,0x65,0x73,0x73,0x69,0x6E,0x67,0x20,0x74, - 0x68,0x65,0x20,0x31,0x36,0x2D,0x62,0x69,0x74,0x20,0x62,0x75, - 0x74,0x74,0x6F,0x6E,0x2C,0x20,0x64,0x6F,0x20,0x6E,0x6F,0x74, - 0x20,0x70,0x72,0x65,0x73,0x73,0x23,0x22,0x63,0x6F,0x6E,0x76, - 0x65,0x72,0x74,0x22,0x20,0x77,0x68,0x65,0x6E,0x20,0x74,0x68, - 0x65,0x20,0x72,0x65,0x71,0x75,0x65,0x73,0x74,0x20,0x69,0x73, - 0x20,0x6D,0x61,0x64,0x65,0x2E,0x00,0x14,0x3E,0x40,0x58,0x30, - 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x4D,0x69,0x6E,0x69,0x6D, - 0x69,0x7A,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40, - 0x43,0x30,0x30,0x32,0x44,0x3E,0x54,0x68,0x69,0x73,0x20,0x66, - 0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x20,0x63,0x75,0x74,0x73, - 0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x72,0x74,0x20,0x6F,0x66, - 0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20, - 0x74,0x68,0x61,0x74,0x20,0x69,0x73,0x20,0x62,0x65,0x79,0x6F, - 0x6E,0x64,0x20,0x74,0x68,0x65,0x20,0x73,0x65,0x63,0x6F,0x6E, - 0x64,0x0B,0x6C,0x6F,0x6F,0x70,0x20,0x70,0x6F,0x69,0x6E,0x74, - 0x2E,0x00,0x2D,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30, - 0x31,0x53,0x61,0x6D,0x70,0x6C,0x65,0x20,0x45,0x64,0x69,0x74, - 0x6F,0x72,0x20,0x45,0x78,0x74,0x65,0x6E,0x73,0x69,0x6F,0x6E, - 0x3A,0x20,0x28,0x53,0x2E,0x45,0x2E,0x45,0x78,0x74,0x2E,0x29, - 0x01,0x3E,0x27,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30, - 0x30,0x31,0x43,0x6F,0x70,0x79,0x2F,0x58,0x63,0x68,0x67,0x20, - 0x53,0x61,0x6D,0x70,0x6C,0x65,0x2F,0x49,0x6E,0x73,0x74,0x72, - 0x75,0x6D,0x65,0x6E,0x74,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36, - 0x30,0x40,0x43,0x30,0x30,0x32,0x3C,0x3E,0x54,0x68,0x65,0x20, - 0x73,0x6F,0x75,0x72,0x63,0x65,0x20,0x69,0x73,0x20,0x73,0x70, - 0x65,0x63,0x69,0x66,0x69,0x65,0x64,0x20,0x69,0x6E,0x20,0x74, - 0x68,0x65,0x20,0x6C,0x69,0x6E,0x65,0x20,0x6E,0x75,0x6D,0x62, - 0x65,0x72,0x69,0x6E,0x67,0x20,0x63,0x6F,0x6C,0x75,0x6D,0x6E, - 0x20,0x6F,0x66,0x20,0x74,0x68,0x65,0x40,0x69,0x6E,0x73,0x74, - 0x72,0x2E,0x2F,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x6C,0x69, - 0x73,0x74,0x73,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x75, - 0x70,0x70,0x65,0x72,0x2D,0x72,0x69,0x67,0x68,0x74,0x20,0x63, - 0x6F,0x72,0x6E,0x65,0x72,0x20,0x6F,0x66,0x20,0x74,0x68,0x65, - 0x20,0x73,0x63,0x72,0x65,0x65,0x6E,0x2E,0x20,0x54,0x68,0x65, - 0x29,0x64,0x65,0x73,0x74,0x69,0x6E,0x61,0x74,0x69,0x6F,0x6E, - 0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x63,0x75,0x72,0x72, - 0x65,0x6E,0x74,0x20,0x69,0x6E,0x73,0x74,0x72,0x2E,0x2F,0x73, - 0x61,0x6D,0x70,0x6C,0x65,0x2E,0x00,0x15,0x3E,0x40,0x58,0x30, - 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x42,0x61,0x63,0x6B,0x77, - 0x61,0x72,0x64,0x73,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30, - 0x40,0x43,0x30,0x30,0x32,0x40,0x3E,0x4F,0x70,0x65,0x72,0x61, - 0x74,0x65,0x73,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x20,0x72, - 0x61,0x6E,0x67,0x65,0x20,0x28,0x6F,0x72,0x20,0x74,0x68,0x65, - 0x20,0x77,0x68,0x6F,0x6C,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C, - 0x65,0x20,0x69,0x66,0x20,0x6E,0x6F,0x20,0x72,0x61,0x6E,0x67, - 0x65,0x20,0x69,0x73,0x20,0x73,0x65,0x74,0x29,0x2E,0x00,0x13, - 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x43, - 0x6F,0x6E,0x76,0x65,0x72,0x74,0x3A,0x0B,0x3E,0x40,0x58,0x30, - 0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x34,0x3E,0x43,0x6F,0x6E, - 0x76,0x65,0x72,0x74,0x73,0x20,0x74,0x68,0x65,0x20,0x65,0x6E, - 0x74,0x69,0x72,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20, - 0x66,0x72,0x6F,0x6D,0x2F,0x74,0x6F,0x20,0x73,0x69,0x67,0x6E, - 0x65,0x64,0x2F,0x75,0x6E,0x73,0x69,0x67,0x6E,0x65,0x64,0x2E, + 0x32,0x3D,0x41,0x74,0x74,0x65,0x6D,0x70,0x74,0x73,0x20,0x74, + 0x6F,0x20,0x63,0x65,0x6E,0x74,0x65,0x72,0x20,0x61,0x20,0x73, + 0x61,0x6D,0x70,0x6C,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x68, + 0x61,0x73,0x20,0x75,0x6E,0x77,0x61,0x6E,0x74,0x65,0x64,0x20, + 0x44,0x43,0x20,0x6F,0x66,0x66,0x73,0x65,0x74,0x2F,0x62,0x69, + 0x61,0x73,0x2E,0x43,0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x6E, + 0x6F,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x69,0x74,0x20, + 0x69,0x73,0x20,0x75,0x73,0x69,0x6E,0x67,0x20,0x61,0x20,0x63, + 0x72,0x75,0x64,0x65,0x20,0x61,0x6C,0x67,0x6F,0x72,0x69,0x74, + 0x68,0x6D,0x2C,0x20,0x73,0x6F,0x20,0x69,0x74,0x20,0x63,0x61, + 0x6E,0x20,0x73,0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,0x73,0x22, + 0x66,0x61,0x69,0x6C,0x20,0x64,0x65,0x70,0x65,0x6E,0x64,0x69, + 0x6E,0x67,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x20,0x73,0x61, + 0x6D,0x70,0x6C,0x65,0x20,0x64,0x61,0x74,0x61,0x2E,0x00,0x14, + 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x52, + 0x65,0x73,0x61,0x6D,0x70,0x6C,0x65,0x3A,0x0B,0x3E,0x40,0x58, + 0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3C,0x4F,0x70,0x65, + 0x72,0x61,0x74,0x65,0x73,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65, + 0x20,0x65,0x6E,0x74,0x69,0x72,0x65,0x20,0x73,0x61,0x6D,0x70, + 0x6C,0x65,0x2E,0x20,0x54,0x68,0x65,0x20,0x73,0x61,0x6D,0x70, + 0x6C,0x65,0x27,0x73,0x20,0x72,0x65,0x6C,0x61,0x74,0x69,0x76, + 0x65,0x20,0x74,0x6F,0x6E,0x65,0x20,0x69,0x73,0x2C,0x63,0x68, + 0x61,0x6E,0x67,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x72, + 0x65,0x73,0x70,0x65,0x63,0x74,0x20,0x74,0x6F,0x20,0x74,0x68, + 0x65,0x20,0x72,0x65,0x73,0x61,0x6D,0x70,0x6C,0x69,0x6E,0x67, + 0x20,0x72,0x61,0x74,0x65,0x2E,0x00,0x16,0x3E,0x40,0x58,0x30, + 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x4D,0x69,0x78,0x20,0x73, + 0x61,0x6D,0x70,0x6C,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36, + 0x30,0x40,0x43,0x30,0x30,0x32,0x35,0x3E,0x4D,0x69,0x78,0x65, + 0x73,0x20,0x74,0x68,0x65,0x20,0x73,0x6F,0x75,0x72,0x63,0x65, + 0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x68,0x65,0x20,0x64,0x65, + 0x73,0x74,0x69,0x6E,0x61,0x74,0x69,0x6F,0x6E,0x20,0x74,0x6F, + 0x20,0x74,0x68,0x65,0x20,0x73,0x6F,0x75,0x72,0x63,0x65,0x2E, 0x00,0x15,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30, - 0x31,0x43,0x6F,0x6E,0x76,0x65,0x72,0x74,0x20,0x57,0x3A,0x0B, - 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3F, - 0x53,0x77,0x61,0x70,0x73,0x20,0x74,0x68,0x65,0x20,0x62,0x79, - 0x74,0x65,0x20,0x6F,0x72,0x64,0x65,0x72,0x20,0x74,0x6F,0x2F, - 0x66,0x72,0x6F,0x6D,0x20,0x49,0x6E,0x74,0x65,0x6C,0x20,0x66, - 0x72,0x6F,0x6D,0x2F,0x74,0x6F,0x20,0x4D,0x6F,0x74,0x6F,0x72, - 0x6F,0x6C,0x61,0x20,0x73,0x74,0x61,0x6E,0x64,0x61,0x72,0x64, - 0x20,0x6F,0x6E,0x12,0x74,0x68,0x65,0x20,0x65,0x6E,0x74,0x69, - 0x72,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x2E,0x44,0x59, - 0x6F,0x75,0x27,0x6C,0x6C,0x20,0x6E,0x65,0x65,0x64,0x20,0x74, - 0x68,0x69,0x73,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E, - 0x20,0x69,0x66,0x20,0x79,0x6F,0x75,0x20,0x69,0x6D,0x70,0x6F, - 0x72,0x74,0x20,0x31,0x36,0x2D,0x62,0x69,0x74,0x20,0x73,0x61, - 0x6D,0x70,0x6C,0x65,0x73,0x20,0x77,0x69,0x74,0x68,0x20,0x4D, - 0x6F,0x74,0x6F,0x72,0x6F,0x6C,0x61,0x2D,0x62,0x79,0x74,0x65, - 0x2D,0x6F,0x72,0x64,0x65,0x72,0x69,0x6E,0x67,0x20,0x28,0x66, - 0x2E,0x65,0x78,0x2E,0x20,0x4B,0x75,0x72,0x7A,0x77,0x65,0x69, - 0x6C,0x20,0x4B,0x32,0x30,0x30,0x30,0x20,0x73,0x61,0x6D,0x70, - 0x6C,0x65,0x73,0x2E,0x29,0x00,0x10,0x3E,0x40,0x58,0x30,0x34, - 0x30,0x40,0x43,0x30,0x30,0x31,0x45,0x63,0x68,0x6F,0x3A,0x0B, - 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x1E, - 0x4F,0x70,0x65,0x72,0x61,0x74,0x65,0x73,0x20,0x6F,0x6E,0x20, - 0x74,0x68,0x65,0x20,0x65,0x6E,0x74,0x69,0x72,0x65,0x20,0x73, - 0x61,0x6D,0x70,0x6C,0x65,0x2E,0x00,0x12,0x3E,0x40,0x58,0x30, - 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x46,0x69,0x78,0x20,0x44, - 0x43,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30, - 0x30,0x32,0x3D,0x41,0x74,0x74,0x65,0x6D,0x70,0x74,0x73,0x20, - 0x74,0x6F,0x20,0x63,0x65,0x6E,0x74,0x65,0x72,0x20,0x61,0x20, - 0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x74,0x68,0x61,0x74,0x20, - 0x68,0x61,0x73,0x20,0x75,0x6E,0x77,0x61,0x6E,0x74,0x65,0x64, - 0x20,0x44,0x43,0x20,0x6F,0x66,0x66,0x73,0x65,0x74,0x2F,0x62, - 0x69,0x61,0x73,0x2E,0x43,0x50,0x6C,0x65,0x61,0x73,0x65,0x20, - 0x6E,0x6F,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x69,0x74, - 0x20,0x69,0x73,0x20,0x75,0x73,0x69,0x6E,0x67,0x20,0x61,0x20, - 0x63,0x72,0x75,0x64,0x65,0x20,0x61,0x6C,0x67,0x6F,0x72,0x69, - 0x74,0x68,0x6D,0x2C,0x20,0x73,0x6F,0x20,0x69,0x74,0x20,0x63, - 0x61,0x6E,0x20,0x73,0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,0x73, - 0x22,0x66,0x61,0x69,0x6C,0x20,0x64,0x65,0x70,0x65,0x6E,0x64, - 0x69,0x6E,0x67,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65,0x20,0x73, - 0x61,0x6D,0x70,0x6C,0x65,0x20,0x64,0x61,0x74,0x61,0x2E,0x00, - 0x14,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31, - 0x52,0x65,0x73,0x61,0x6D,0x70,0x6C,0x65,0x3A,0x0B,0x3E,0x40, - 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3C,0x4F,0x70, - 0x65,0x72,0x61,0x74,0x65,0x73,0x20,0x6F,0x6E,0x20,0x74,0x68, - 0x65,0x20,0x65,0x6E,0x74,0x69,0x72,0x65,0x20,0x73,0x61,0x6D, - 0x70,0x6C,0x65,0x2E,0x20,0x54,0x68,0x65,0x20,0x73,0x61,0x6D, - 0x70,0x6C,0x65,0x27,0x73,0x20,0x72,0x65,0x6C,0x61,0x74,0x69, - 0x76,0x65,0x20,0x74,0x6F,0x6E,0x65,0x20,0x69,0x73,0x2C,0x63, - 0x68,0x61,0x6E,0x67,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20, - 0x72,0x65,0x73,0x70,0x65,0x63,0x74,0x20,0x74,0x6F,0x20,0x74, - 0x68,0x65,0x20,0x72,0x65,0x73,0x61,0x6D,0x70,0x6C,0x69,0x6E, - 0x67,0x20,0x72,0x61,0x74,0x65,0x2E,0x00,0x16,0x3E,0x40,0x58, - 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x4D,0x69,0x78,0x20, - 0x73,0x61,0x6D,0x70,0x6C,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30, - 0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x35,0x3E,0x4D,0x69,0x78, - 0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x73,0x6F,0x75,0x72,0x63, - 0x65,0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x68,0x65,0x20,0x64, - 0x65,0x73,0x74,0x69,0x6E,0x61,0x74,0x69,0x6F,0x6E,0x20,0x74, - 0x6F,0x20,0x74,0x68,0x65,0x20,0x73,0x6F,0x75,0x72,0x63,0x65, - 0x2E,0x00,0x15,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30, - 0x30,0x31,0x44,0x72,0x61,0x77,0x20,0x6D,0x6F,0x64,0x65,0x3A, + 0x31,0x44,0x72,0x61,0x77,0x20,0x6D,0x6F,0x64,0x65,0x3A,0x0B, + 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x40, + 0x42,0x79,0x20,0x70,0x72,0x65,0x73,0x73,0x69,0x6E,0x67,0x20, + 0x74,0x68,0x65,0x20,0x72,0x69,0x67,0x68,0x74,0x20,0x6D,0x6F, + 0x75,0x73,0x65,0x20,0x62,0x75,0x74,0x74,0x6F,0x6E,0x20,0x69, + 0x6E,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65, + 0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x2C,0x20,0x79,0x6F,0x75, + 0x20,0x63,0x61,0x6E,0x1D,0x64,0x72,0x61,0x77,0x20,0x79,0x6F, + 0x75,0x72,0x20,0x77,0x61,0x76,0x65,0x66,0x6F,0x72,0x6D,0x73, + 0x20,0x6D,0x61,0x6E,0x75,0x61,0x6C,0x6C,0x79,0x2E,0x00,0x18, + 0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x43,0x6F, + 0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,0x3A, + 0x01,0x3E,0x15,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30, + 0x30,0x31,0x41,0x75,0x74,0x6F,0x20,0x73,0x61,0x76,0x65,0x3A, 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32, - 0x40,0x42,0x79,0x20,0x70,0x72,0x65,0x73,0x73,0x69,0x6E,0x67, - 0x20,0x74,0x68,0x65,0x20,0x72,0x69,0x67,0x68,0x74,0x20,0x6D, - 0x6F,0x75,0x73,0x65,0x20,0x62,0x75,0x74,0x74,0x6F,0x6E,0x20, - 0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C, - 0x65,0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x2C,0x20,0x79,0x6F, - 0x75,0x20,0x63,0x61,0x6E,0x1D,0x64,0x72,0x61,0x77,0x20,0x79, - 0x6F,0x75,0x72,0x20,0x77,0x61,0x76,0x65,0x66,0x6F,0x72,0x6D, - 0x73,0x20,0x6D,0x61,0x6E,0x75,0x61,0x6C,0x6C,0x79,0x2E,0x00, - 0x18,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x43, - 0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E, - 0x3A,0x01,0x3E,0x15,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43, - 0x30,0x30,0x31,0x41,0x75,0x74,0x6F,0x20,0x73,0x61,0x76,0x65, - 0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30, - 0x32,0x43,0x49,0x66,0x20,0x74,0x68,0x65,0x20,0x61,0x75,0x74, - 0x6F,0x20,0x73,0x61,0x76,0x65,0x20,0x69,0x73,0x20,0x6F,0x6E, - 0x2C,0x20,0x46,0x54,0x32,0x20,0x77,0x69,0x6C,0x6C,0x20,0x75, - 0x70,0x64,0x61,0x74,0x65,0x20,0x74,0x68,0x65,0x20,0x63,0x6F, - 0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,0x20, - 0x66,0x69,0x6C,0x65,0x20,0x77,0x68,0x65,0x6E,0x15,0x79,0x6F, - 0x75,0x20,0x65,0x78,0x69,0x74,0x20,0x74,0x68,0x65,0x20,0x70, - 0x72,0x6F,0x67,0x72,0x61,0x6D,0x2E,0x00,0x25,0x40,0x58,0x30, - 0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x43,0x6F,0x6E,0x66,0x69, - 0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x49,0x2F, - 0x4F,0x20,0x64,0x65,0x76,0x69,0x63,0x65,0x73,0x3A,0x01,0x3E, - 0x19,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31, - 0x49,0x6E,0x74,0x65,0x72,0x70,0x6F,0x6C,0x61,0x74,0x69,0x6F, - 0x6E,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30, - 0x30,0x32,0x3C,0x54,0x68,0x65,0x20,0x6D,0x69,0x78,0x69,0x6E, - 0x67,0x20,0x72,0x6F,0x75,0x74,0x69,0x6E,0x65,0x20,0x69,0x6E, - 0x74,0x65,0x72,0x70,0x6F,0x6C,0x61,0x74,0x65,0x73,0x20,0x74, - 0x68,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x76,0x61, - 0x6C,0x75,0x65,0x20,0x62,0x65,0x74,0x77,0x65,0x65,0x6E,0x20, - 0x74,0x68,0x65,0x42,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x70, - 0x6F,0x69,0x6E,0x74,0x73,0x20,0x74,0x6F,0x20,0x72,0x65,0x6D, - 0x6F,0x76,0x65,0x20,0x75,0x6E,0x77,0x61,0x6E,0x74,0x65,0x64, - 0x20,0x6E,0x6F,0x69,0x73,0x65,0x20,0x69,0x6E,0x20,0x74,0x68, - 0x65,0x20,0x73,0x6F,0x75,0x6E,0x64,0x2E,0x20,0x52,0x65,0x61, - 0x6C,0x20,0x46,0x54,0x32,0x20,0x75,0x73,0x65,0x73,0x45,0x32, - 0x2D,0x74,0x61,0x70,0x20,0x6C,0x69,0x6E,0x65,0x61,0x72,0x20, - 0x69,0x6E,0x74,0x65,0x72,0x70,0x6F,0x6C,0x61,0x74,0x69,0x6F, - 0x6E,0x2C,0x20,0x77,0x68,0x69,0x6C,0x65,0x20,0x74,0x68,0x69, - 0x73,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x20,0x75,0x73,0x65,0x73, - 0x20,0x34,0x2D,0x74,0x61,0x70,0x20,0x63,0x75,0x62,0x69,0x63, - 0x20,0x73,0x70,0x6C,0x69,0x6E,0x65,0x20,0x45,0x69,0x6E,0x74, - 0x65,0x72,0x70,0x6F,0x6C,0x61,0x74,0x69,0x6F,0x6E,0x20,0x66, - 0x6F,0x72,0x20,0x69,0x6D,0x70,0x72,0x6F,0x76,0x65,0x64,0x20, - 0x68,0x69,0x67,0x68,0x20,0x66,0x72,0x65,0x71,0x75,0x65,0x6E, - 0x63,0x69,0x65,0x73,0x2E,0x20,0x54,0x75,0x72,0x6E,0x69,0x6E, - 0x67,0x20,0x69,0x74,0x20,0x6F,0x66,0x66,0x20,0x77,0x69,0x6C, - 0x6C,0x20,0x6D,0x61,0x6B,0x65,0x2F,0x74,0x68,0x65,0x20,0x61, - 0x75,0x64,0x69,0x6F,0x20,0x73,0x68,0x61,0x72,0x70,0x65,0x72, - 0x2C,0x20,0x62,0x75,0x74,0x20,0x69,0x74,0x20,0x77,0x69,0x6C, - 0x6C,0x20,0x61,0x6C,0x73,0x6F,0x20,0x62,0x65,0x20,0x6E,0x6F, - 0x69,0x73,0x69,0x65,0x72,0x2E,0x00,0x1A,0x3E,0x40,0x58,0x30, - 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x56,0x6F,0x6C,0x75,0x6D, - 0x65,0x20,0x72,0x61,0x6D,0x70,0x69,0x6E,0x67,0x3A,0x0B,0x3E, - 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3B,0x45, - 0x6E,0x61,0x62,0x6C,0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x61, - 0x6E,0x74,0x69,0x2D,0x63,0x6C,0x69,0x63,0x6B,0x20,0x73,0x79, - 0x73,0x74,0x65,0x6D,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20, - 0x61,0x75,0x64,0x69,0x6F,0x20,0x6D,0x69,0x78,0x65,0x72,0x20, - 0x28,0x46,0x54,0x32,0x2E,0x30,0x38,0x2B,0x29,0x2E,0x3B,0x50, - 0x6C,0x65,0x61,0x73,0x65,0x20,0x6E,0x6F,0x74,0x65,0x20,0x74, - 0x68,0x61,0x74,0x20,0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C, - 0x20,0x46,0x54,0x32,0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x6C, - 0x6F,0x61,0x64,0x20,0x74,0x68,0x69,0x73,0x20,0x63,0x6F,0x6E, - 0x66,0x69,0x67,0x20,0x65,0x6E,0x74,0x72,0x79,0x2C,0x0B,0x63, - 0x6C,0x6F,0x6E,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x2E,0x00,0x19, - 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x41, - 0x6D,0x70,0x6C,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E, + 0x43,0x49,0x66,0x20,0x74,0x68,0x65,0x20,0x61,0x75,0x74,0x6F, + 0x20,0x73,0x61,0x76,0x65,0x20,0x69,0x73,0x20,0x6F,0x6E,0x2C, + 0x20,0x46,0x54,0x32,0x20,0x77,0x69,0x6C,0x6C,0x20,0x75,0x70, + 0x64,0x61,0x74,0x65,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x6E, + 0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,0x20,0x66, + 0x69,0x6C,0x65,0x20,0x77,0x68,0x65,0x6E,0x15,0x79,0x6F,0x75, + 0x20,0x65,0x78,0x69,0x74,0x20,0x74,0x68,0x65,0x20,0x70,0x72, + 0x6F,0x67,0x72,0x61,0x6D,0x2E,0x00,0x25,0x40,0x58,0x30,0x32, + 0x30,0x40,0x43,0x30,0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,0x67, + 0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x49,0x2F,0x4F, + 0x20,0x64,0x65,0x76,0x69,0x63,0x65,0x73,0x3A,0x01,0x3E,0x19, + 0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x49, + 0x6E,0x74,0x65,0x72,0x70,0x6F,0x6C,0x61,0x74,0x69,0x6F,0x6E, 0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30, - 0x32,0x46,0x41,0x6D,0x70,0x6C,0x69,0x66,0x69,0x65,0x73,0x20, - 0x74,0x68,0x65,0x20,0x76,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x77, - 0x68,0x65,0x6E,0x20,0x6D,0x69,0x78,0x69,0x6E,0x67,0x2E,0x20, - 0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x73,0x65,0x74,0x20,0x74, - 0x68,0x69,0x73,0x20,0x6F,0x6E,0x65,0x20,0x74,0x6F,0x6F,0x20, - 0x68,0x69,0x67,0x68,0x2C,0x20,0x79,0x6F,0x75,0x27,0x6C,0x6C, - 0x3A,0x67,0x65,0x74,0x20,0x64,0x69,0x73,0x74,0x6F,0x72,0x74, - 0x69,0x6F,0x6E,0x2E,0x20,0x33,0x32,0x58,0x20,0x65,0x71,0x75, - 0x61,0x6C,0x73,0x20,0x66,0x75,0x6C,0x6C,0x20,0x61,0x6D,0x70, - 0x6C,0x69,0x74,0x75,0x64,0x65,0x20,0x66,0x6F,0x72,0x20,0x6F, - 0x6E,0x65,0x20,0x63,0x68,0x61,0x6E,0x6E,0x65,0x6C,0x2E,0x00, - 0x1B,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31, - 0x46,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x20,0x74,0x61, - 0x62,0x6C,0x65,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40, - 0x43,0x30,0x30,0x32,0x40,0x54,0x68,0x65,0x20,0x6C,0x69,0x6E, - 0x65,0x61,0x72,0x20,0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63, - 0x79,0x20,0x74,0x61,0x62,0x6C,0x65,0x20,0x6D,0x61,0x6B,0x65, - 0x73,0x20,0x61,0x6C,0x6C,0x20,0x70,0x69,0x74,0x63,0x68,0x20, - 0x62,0x65,0x6E,0x64,0x73,0x20,0x72,0x75,0x6E,0x20,0x69,0x6E, - 0x20,0x63,0x6F,0x6E,0x73,0x74,0x61,0x6E,0x74,0x3F,0x73,0x70, - 0x65,0x65,0x64,0x2C,0x20,0x69,0x6E,0x64,0x65,0x70,0x65,0x6E, - 0x64,0x65,0x6E,0x74,0x20,0x6F,0x66,0x20,0x74,0x68,0x65,0x20, - 0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x20,0x66,0x72,0x65,0x71, - 0x75,0x65,0x6E,0x63,0x79,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F, - 0x75,0x20,0x73,0x77,0x69,0x74,0x63,0x68,0x20,0x74,0x68,0x69, - 0x73,0x41,0x6F,0x6E,0x65,0x2C,0x20,0x6F,0x6E,0x20,0x61,0x20, - 0x66,0x69,0x6E,0x69,0x73,0x68,0x65,0x64,0x20,0x73,0x6F,0x6E, - 0x67,0x2C,0x20,0x69,0x74,0x20,0x6D,0x69,0x67,0x68,0x74,0x20, - 0x73,0x6F,0x75,0x6E,0x64,0x20,0x73,0x74,0x72,0x61,0x6E,0x67, - 0x65,0x20,0x69,0x66,0x20,0x74,0x68,0x65,0x20,0x73,0x6F,0x75, - 0x6E,0x64,0x20,0x75,0x73,0x65,0x73,0x0D,0x70,0x6F,0x72,0x74, - 0x61,0x6D,0x65,0x6E,0x74,0x6F,0x65,0x73,0x2E,0x00,0x20,0x40, - 0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31,0x43,0x6F,0x6E, - 0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20, - 0x4C,0x61,0x79,0x6F,0x75,0x74,0x3A,0x01,0x3E,0x29,0x3E,0x40, - 0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50,0x61,0x74, - 0x74,0x65,0x72,0x6E,0x20,0x6C,0x61,0x79,0x6F,0x75,0x74,0x2C, - 0x20,0x68,0x65,0x78,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x69, - 0x6E,0x67,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43, - 0x30,0x30,0x32,0x41,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x75, - 0x73,0x65,0x20,0x70,0x61,0x74,0x74,0x65,0x72,0x6E,0x73,0x20, - 0x74,0x68,0x61,0x74,0x20,0x61,0x72,0x65,0x20,0x6C,0x6F,0x6E, - 0x67,0x65,0x72,0x20,0x74,0x68,0x61,0x6E,0x20,0x39,0x39,0x20, - 0x6C,0x69,0x6E,0x65,0x73,0x2C,0x20,0x79,0x6F,0x75,0x20,0x73, - 0x68,0x6F,0x75,0x6C,0x64,0x20,0x75,0x73,0x65,0x45,0x68,0x65, - 0x78,0x20,0x63,0x6F,0x75,0x6E,0x74,0x69,0x6E,0x67,0x20,0x73, - 0x69,0x6E,0x63,0x65,0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x61, - 0x72,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x32,0x20,0x64,0x69, - 0x67,0x69,0x74,0x73,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20, - 0x6C,0x69,0x6E,0x65,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x20, - 0x63,0x6F,0x6C,0x75,0x6D,0x6E,0x2E,0x00,0x12,0x3E,0x40,0x58, - 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x53,0x63,0x6F,0x70, - 0x65,0x73,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43, - 0x30,0x30,0x32,0x43,0x22,0x53,0x74,0x64,0x2E,0x22,0x20,0x28, - 0x73,0x74,0x61,0x6E,0x64,0x61,0x72,0x64,0x29,0x20,0x77,0x69, - 0x6C,0x6C,0x20,0x73,0x68,0x6F,0x77,0x20,0x74,0x68,0x65,0x20, - 0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x70,0x6F,0x69,0x6E,0x74, - 0x73,0x20,0x61,0x73,0x20,0x70,0x69,0x78,0x65,0x6C,0x73,0x20, - 0x28,0x6C,0x69,0x6B,0x65,0x20,0x46,0x54,0x32,0x29,0x2E,0x41, - 0x22,0x4C,0x69,0x6E,0x65,0x64,0x22,0x20,0x77,0x69,0x6C,0x6C, - 0x20,0x64,0x72,0x61,0x77,0x20,0x6C,0x69,0x6E,0x65,0x73,0x20, - 0x62,0x65,0x74,0x77,0x65,0x65,0x6E,0x20,0x74,0x68,0x65,0x20, - 0x70,0x6F,0x69,0x6E,0x74,0x73,0x2C,0x20,0x6C,0x69,0x6B,0x65, - 0x20,0x61,0x6E,0x20,0x6F,0x73,0x63,0x69,0x6C,0x6C,0x6F,0x73, - 0x63,0x6F,0x70,0x65,0x2E,0x00,0x27,0x40,0x58,0x30,0x32,0x30, - 0x40,0x43,0x30,0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75, - 0x72,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x4D,0x69,0x73,0x63, - 0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,0x75,0x73,0x3A,0x01,0x3E, - 0x15,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31, - 0x56,0x53,0x79,0x6E,0x63,0x20,0x6F,0x66,0x66,0x3A,0x0B,0x3E, - 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x3F,0x54, - 0x65,0x6C,0x6C,0x73,0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F, - 0x67,0x72,0x61,0x6D,0x20,0x74,0x6F,0x20,0x6E,0x6F,0x74,0x20, - 0x75,0x73,0x65,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x66,0x6F, - 0x72,0x20,0x76,0x69,0x64,0x65,0x6F,0x2E,0x20,0x49,0x66,0x20, - 0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72, - 0x27,0x73,0x40,0x72,0x65,0x66,0x72,0x65,0x73,0x68,0x20,0x72, - 0x61,0x74,0x65,0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x36, - 0x30,0x48,0x7A,0x20,0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A, - 0x29,0x2C,0x20,0x74,0x68,0x65,0x6E,0x20,0x56,0x53,0x79,0x6E, - 0x63,0x20,0x69,0x73,0x20,0x61,0x6C,0x77,0x61,0x79,0x73,0x20, - 0x6F,0x66,0x66,0x20,0x66,0x6F,0x72,0x45,0x74,0x68,0x69,0x73, - 0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x2E,0x20,0x4E,0x6F, - 0x74,0x20,0x68,0x61,0x76,0x69,0x6E,0x67,0x20,0x56,0x53,0x79, - 0x6E,0x63,0x20,0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x73,0x75, - 0x6C,0x74,0x20,0x69,0x6E,0x20,0x6C,0x65,0x73,0x73,0x20,0x69, - 0x6E,0x70,0x75,0x74,0x2F,0x76,0x69,0x64,0x65,0x6F,0x20,0x64, - 0x65,0x6C,0x61,0x79,0x2C,0x1E,0x62,0x75,0x74,0x20,0x61,0x6C, - 0x73,0x6F,0x20,0x70,0x6F,0x74,0x65,0x6E,0x74,0x69,0x61,0x6C, - 0x20,0x73,0x74,0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x2E, - 0x01,0x20,0x18,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30, - 0x30,0x31,0x50,0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74, - 0x65,0x72,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43, - 0x30,0x30,0x32,0x43,0x41,0x70,0x70,0x6C,0x69,0x65,0x73,0x20, - 0x61,0x20,0x73,0x75,0x62,0x70,0x69,0x78,0x65,0x6C,0x20,0x66, - 0x69,0x6C,0x74,0x65,0x72,0x20,0x74,0x68,0x61,0x74,0x20,0x69, - 0x73,0x20,0x75,0x73,0x65,0x64,0x20,0x77,0x68,0x65,0x6E,0x20, - 0x74,0x68,0x65,0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x69, - 0x73,0x20,0x75,0x70,0x73,0x63,0x61,0x6C,0x65,0x64,0x2E,0x43, - 0x54,0x68,0x69,0x73,0x20,0x61,0x6C,0x73,0x6F,0x20,0x6D,0x61, - 0x6B,0x65,0x73,0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65, - 0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x63,0x6F,0x6D,0x70, - 0x6C,0x65,0x74,0x65,0x6C,0x79,0x20,0x73,0x74,0x72,0x65,0x74, - 0x63,0x68,0x20,0x6F,0x75,0x74,0x20,0x69,0x66,0x20,0x69,0x74, - 0x20,0x64,0x69,0x64,0x6E,0x27,0x74,0x44,0x61,0x6C,0x72,0x65, - 0x61,0x64,0x79,0x2E,0x20,0x50,0x6C,0x65,0x61,0x73,0x65,0x20, - 0x6B,0x65,0x65,0x70,0x20,0x69,0x6E,0x20,0x6D,0x69,0x6E,0x64, - 0x20,0x74,0x68,0x61,0x74,0x20,0x74,0x68,0x69,0x73,0x20,0x77, - 0x69,0x6C,0x6C,0x20,0x6D,0x61,0x6B,0x65,0x20,0x70,0x69,0x78, - 0x65,0x6C,0x73,0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x62,0x6C,0x75, - 0x72,0x72,0x79,0x2E,0x00,0x23,0x40,0x58,0x30,0x32,0x30,0x40, - 0x43,0x30,0x30,0x31,0x41,0x64,0x76,0x61,0x6E,0x63,0x65,0x64, - 0x20,0x65,0x64,0x69,0x74,0x20,0x66,0x75,0x6E,0x63,0x74,0x69, - 0x6F,0x6E,0x73,0x3A,0x20,0x01,0x3E,0x1E,0x3E,0x40,0x58,0x30, - 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x43,0x6F,0x70,0x79,0x2F, - 0x50,0x61,0x73,0x74,0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E, - 0x67,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30, - 0x30,0x32,0x37,0x54,0x68,0x65,0x20,0x6D,0x61,0x73,0x6B,0x69, - 0x6E,0x67,0x20,0x69,0x73,0x20,0x75,0x73,0x65,0x64,0x20,0x66, - 0x6F,0x72,0x20,0x63,0x6F,0x70,0x79,0x69,0x6E,0x67,0x2F,0x70, - 0x61,0x73,0x74,0x69,0x6E,0x67,0x20,0x6F,0x6E,0x6C,0x79,0x20, - 0x70,0x61,0x72,0x74,0x73,0x20,0x6F,0x66,0x20,0x61,0x46,0x22, - 0x6E,0x6F,0x74,0x65,0x2D,0x63,0x65,0x6C,0x6C,0x22,0x2E,0x20, - 0x54,0x68,0x65,0x20,0x64,0x69,0x66,0x66,0x65,0x72,0x65,0x6E, - 0x74,0x20,0x70,0x61,0x72,0x74,0x73,0x20,0x6F,0x66,0x20,0x61, - 0x20,0x22,0x6E,0x6F,0x74,0x65,0x2D,0x63,0x65,0x6C,0x6C,0x22, - 0x20,0x69,0x73,0x20,0x4E,0x6F,0x74,0x65,0x2C,0x20,0x49,0x6E, - 0x73,0x74,0x72,0x2E,0x20,0x6E,0x72,0x2E,0x2C,0x20,0x56,0x6F, - 0x6C,0x75,0x6D,0x65,0x2C,0x20,0x45,0x66,0x66,0x65,0x63,0x74, - 0x20,0x6E,0x72,0x20,0x26,0x20,0x45,0x66,0x66,0x65,0x63,0x74, - 0x20,0x64,0x61,0x74,0x61,0x2E,0x34,0x3E,0x41,0x73,0x20,0x79, - 0x6F,0x75,0x20,0x63,0x61,0x6E,0x20,0x73,0x65,0x65,0x20,0x69, - 0x6E,0x20,0x74,0x68,0x65,0x20,0x77,0x69,0x6E,0x64,0x6F,0x77, - 0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x33, - 0x20,0x63,0x6F,0x6C,0x75,0x6D,0x6E,0x73,0x20,0x6F,0x66,0x3D, - 0x22,0x65,0x6E,0x61,0x62,0x6C,0x65,0x2F,0x64,0x69,0x73,0x61, - 0x62,0x6C,0x65,0x20,0x62,0x75,0x74,0x74,0x6F,0x6E,0x73,0x22, - 0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x68,0x61,0x73,0x20,0x74, - 0x68,0x65,0x20,0x6C,0x65,0x74,0x74,0x65,0x72,0x73,0x20,0x43, - 0x2C,0x50,0x20,0x26,0x20,0x54,0x20,0x61,0x62,0x6F,0x76,0x65, - 0x2E,0x45,0x3E,0x43,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x63, - 0x6F,0x70,0x79,0x2C,0x20,0x69,0x74,0x20,0x63,0x6F,0x6E,0x74, - 0x72,0x6F,0x6C,0x73,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x70, - 0x61,0x72,0x74,0x73,0x20,0x74,0x68,0x61,0x74,0x20,0x67,0x6F, - 0x65,0x73,0x20,0x69,0x6E,0x74,0x6F,0x20,0x74,0x68,0x65,0x20, - 0x63,0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x3E, - 0x3E,0x50,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x70,0x61,0x73, - 0x74,0x65,0x20,0x61,0x6E,0x64,0x20,0x63,0x6F,0x6E,0x74,0x72, - 0x6F,0x6C,0x73,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61, - 0x72,0x74,0x73,0x20,0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65, - 0x73,0x20,0x6F,0x75,0x74,0x20,0x66,0x72,0x6F,0x6D,0x20,0x74, - 0x68,0x65,0x0B,0x63,0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65, - 0x72,0x2E,0x45,0x3E,0x54,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20, - 0x74,0x72,0x61,0x6E,0x73,0x70,0x61,0x72,0x65,0x6E,0x63,0x79, - 0x2E,0x20,0x49,0x66,0x20,0x69,0x74,0x27,0x73,0x20,0x65,0x6E, - 0x61,0x62,0x6C,0x65,0x64,0x2C,0x20,0x74,0x68,0x65,0x20,0x70, - 0x61,0x73,0x74,0x69,0x6E,0x67,0x20,0x64,0x6F,0x65,0x73,0x6E, - 0x27,0x74,0x20,0x6F,0x76,0x65,0x72,0x77,0x72,0x69,0x74,0x65, - 0x3D,0x64,0x61,0x74,0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6E, - 0x69,0x6C,0x2D,0x69,0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69, - 0x6F,0x6E,0x2C,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x77,0x69,0x74, - 0x68,0x20,0x61,0x20,0x6E,0x6F,0x74,0x65,0x20,0x6F,0x72,0x20, - 0x61,0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x20,0x3C,0x3E,0x20, - 0x30,0x2E,0x01,0x3E,0x40,0x3E,0x54,0x68,0x65,0x20,0x63,0x75, - 0x74,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x20, - 0x77,0x6F,0x72,0x6B,0x73,0x20,0x6C,0x69,0x6B,0x65,0x20,0x70, - 0x61,0x73,0x74,0x69,0x6E,0x67,0x20,0x77,0x69,0x74,0x68,0x20, - 0x7A,0x65,0x72,0x6F,0x2D,0x64,0x61,0x74,0x61,0x2E,0x20,0x54, - 0x68,0x69,0x73,0x20,0x6D,0x65,0x61,0x6E,0x73,0x3B,0x74,0x68, - 0x61,0x74,0x20,0x74,0x68,0x65,0x20,0x63,0x75,0x74,0x74,0x69, - 0x6E,0x67,0x20,0x69,0x73,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F, - 0x6C,0x6C,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x50,0x2D, - 0x63,0x6F,0x6C,0x75,0x6D,0x6E,0x20,0x28,0x6F,0x72,0x20,0x54, - 0x2D,0x63,0x6F,0x6C,0x75,0x6D,0x6E,0x29,0x2E,0x3C,0x3E,0x57, - 0x68,0x65,0x6E,0x20,0x79,0x6F,0x75,0x20,0x63,0x6F,0x70,0x79, - 0x20,0x64,0x61,0x74,0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6D, - 0x61,0x73,0x6B,0x69,0x6E,0x67,0x2C,0x20,0x74,0x68,0x65,0x20, - 0x64,0x69,0x73,0x61,0x62,0x6C,0x65,0x64,0x20,0x70,0x61,0x72, - 0x74,0x73,0x20,0x61,0x72,0x65,0x20,0x6E,0x6F,0x74,0x43,0x63, - 0x6C,0x65,0x61,0x72,0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68, - 0x65,0x20,0x63,0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72, - 0x2E,0x20,0x28,0x4D,0x61,0x6B,0x69,0x6E,0x67,0x20,0x69,0x74, - 0x20,0x70,0x6F,0x73,0x73,0x69,0x62,0x6C,0x65,0x20,0x74,0x6F, - 0x20,0x63,0x6F,0x6C,0x6C,0x65,0x63,0x74,0x20,0x64,0x61,0x74, - 0x61,0x20,0x66,0x72,0x6F,0x6D,0x27,0x73,0x65,0x76,0x65,0x72, - 0x61,0x6C,0x20,0x6C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x73, - 0x20,0x69,0x6E,0x74,0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F, - 0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x29,0x00,0x03, - 0x45,0x4E,0x44,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x4C,0x3B,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x0E,0x40,0x4C,0x50,0x72,0x6F,0x62,0x6C,0x65,0x6D,0x73, - 0x2F,0x46,0x41,0x51,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x41, - 0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x43,0x61,0x6E, - 0x20,0x49,0x20,0x6D,0x61,0x6B,0x65,0x20,0x66,0x75,0x6C,0x6C, - 0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20, - 0x73,0x74,0x72,0x65,0x74,0x63,0x68,0x20,0x6F,0x75,0x74,0x20, - 0x74,0x68,0x65,0x20,0x77,0x68,0x6F,0x6C,0x65,0x20,0x73,0x63, - 0x72,0x65,0x65,0x6E,0x3F,0x3A,0x3E,0x40,0x43,0x30,0x30,0x32, - 0x41,0x3A,0x20,0x45,0x6E,0x61,0x62,0x6C,0x65,0x20,0x22,0x50, - 0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x22, - 0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D, - 0x3E,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65, - 0x6F,0x75,0x73,0x2E,0x4D,0x3E,0x40,0x58,0x30,0x33,0x35,0x49, - 0x74,0x20,0x77,0x6F,0x6E,0x27,0x74,0x20,0x6C,0x6F,0x6F,0x6B, - 0x20,0x70,0x72,0x65,0x74,0x74,0x79,0x2C,0x20,0x62,0x75,0x74, - 0x20,0x74,0x6F,0x20,0x73,0x6F,0x6D,0x65,0x20,0x70,0x65,0x6F, - 0x70,0x6C,0x65,0x20,0x69,0x74,0x27,0x73,0x20,0x6D,0x75,0x63, - 0x68,0x20,0x62,0x65,0x74,0x74,0x65,0x72,0x20,0x74,0x68,0x61, - 0x6E,0x20,0x6E,0x6F,0x74,0x68,0x69,0x6E,0x67,0x2E,0x06,0x3E, - 0x40,0x58,0x30,0x32,0x30,0x27,0x3E,0x40,0x43,0x30,0x30,0x31, - 0x51,0x3A,0x20,0x49,0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x75, - 0x73,0x65,0x20,0x41,0x4C,0x54,0x2B,0x46,0x34,0x20,0x61,0x6E, - 0x64,0x20,0x41,0x4C,0x54,0x2B,0x46,0x35,0x21,0x4E,0x3E,0x40, - 0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x57,0x69,0x6E,0x64,0x6F, - 0x77,0x73,0x3A,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x68, - 0x61,0x76,0x65,0x20,0x47,0x65,0x46,0x6F,0x72,0x63,0x65,0x20, - 0x45,0x78,0x70,0x65,0x72,0x69,0x65,0x6E,0x63,0x65,0x20,0x69, - 0x6E,0x73,0x74,0x61,0x6C,0x6C,0x65,0x64,0x2C,0x20,0x79,0x6F, - 0x75,0x20,0x6E,0x65,0x65,0x64,0x20,0x74,0x6F,0x20,0x63,0x68, - 0x61,0x6E,0x67,0x65,0x2B,0x3E,0x40,0x58,0x30,0x33,0x35,0x74, - 0x68,0x65,0x20,0x6B,0x65,0x79,0x62,0x69,0x6E,0x64,0x69,0x6E, - 0x67,0x73,0x20,0x69,0x6E,0x20,0x69,0x74,0x73,0x20,0x73,0x65, - 0x74,0x74,0x69,0x6E,0x67,0x73,0x20,0x70,0x61,0x67,0x65,0x2E, - 0x56,0x6D,0x61,0x63,0x4F,0x53,0x2F,0x4F,0x53,0x20,0x58,0x3A, - 0x20,0x43,0x68,0x61,0x6E,0x67,0x65,0x20,0x41,0x4C,0x54,0x2B, - 0x46,0x34,0x2F,0x41,0x4C,0x54,0x2B,0x46,0x35,0x20,0x6B,0x65, - 0x79,0x73,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x4F,0x53, - 0x20,0x74,0x6F,0x20,0x73,0x6F,0x6D,0x65,0x74,0x68,0x69,0x6E, - 0x67,0x20,0x65,0x6C,0x73,0x65,0x2E,0x20,0x41,0x6C,0x73,0x6F, - 0x20,0x66,0x6F,0x72,0x20,0x47,0x4E,0x55,0x2F,0x4C,0x69,0x6E, - 0x75,0x78,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x2B,0x3E, - 0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x54,0x68,0x65,0x20, - 0x6D,0x6F,0x75,0x73,0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72, - 0x20,0x69,0x73,0x20,0x64,0x65,0x6C,0x61,0x79,0x65,0x64,0x2F, - 0x6C,0x61,0x67,0x67,0x79,0x21,0x44,0x3E,0x40,0x43,0x30,0x30, - 0x32,0x41,0x3A,0x20,0x4D,0x61,0x6B,0x65,0x20,0x73,0x75,0x72, - 0x65,0x20,0x22,0x53,0x6F,0x66,0x74,0x77,0x61,0x72,0x65,0x20, - 0x6D,0x6F,0x75,0x73,0x65,0x22,0x20,0x69,0x73,0x20,0x64,0x69, - 0x73,0x61,0x62,0x6C,0x65,0x64,0x20,0x69,0x6E,0x20,0x43,0x6F, - 0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E,0x20,0x4C,0x61,0x79,0x6F, - 0x75,0x74,0x2E,0x4B,0x3E,0x40,0x58,0x30,0x33,0x35,0x41,0x6C, - 0x74,0x65,0x72,0x6E,0x61,0x74,0x69,0x76,0x65,0x6C,0x79,0x2C, - 0x20,0x79,0x6F,0x75,0x20,0x63,0x61,0x6E,0x20,0x65,0x6E,0x61, - 0x62,0x6C,0x65,0x20,0x22,0x56,0x53,0x79,0x6E,0x63,0x20,0x6F, - 0x66,0x66,0x22,0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69, - 0x67,0x20,0x2D,0x3E,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C, - 0x61,0x6E,0x65,0x6F,0x75,0x73,0x2E,0x46,0x3E,0x54,0x68,0x69, - 0x73,0x20,0x68,0x6F,0x77,0x65,0x76,0x65,0x72,0x2C,0x20,0x77, - 0x69,0x6C,0x6C,0x20,0x69,0x6E,0x74,0x72,0x6F,0x64,0x75,0x63, - 0x65,0x20,0x73,0x74,0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67, - 0x20,0x62,0x65,0x63,0x61,0x75,0x73,0x65,0x20,0x74,0x68,0x65, - 0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x69,0x6E,0x67,0x20,0x72, - 0x61,0x74,0x65,0x20,0x69,0x73,0x22,0x3E,0x6E,0x6F,0x74,0x20, - 0x65,0x78,0x61,0x63,0x74,0x20,0x74,0x6F,0x20,0x79,0x6F,0x75, - 0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x20, - 0x72,0x61,0x74,0x65,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30, - 0x33,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x57,0x69, - 0x6C,0x6C,0x20,0x79,0x6F,0x75,0x20,0x69,0x6D,0x70,0x6C,0x65, - 0x6D,0x65,0x6E,0x74,0x20,0x4D,0x49,0x44,0x49,0x20,0x6F,0x75, - 0x74,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x61,0x6C, - 0x69,0x74,0x79,0x3F,0x4D,0x3E,0x40,0x43,0x30,0x30,0x32,0x41, - 0x3A,0x20,0x4E,0x6F,0x2C,0x20,0x73,0x6F,0x72,0x72,0x79,0x2E, - 0x20,0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x76,0x65,0x72, - 0x79,0x20,0x64,0x69,0x66,0x66,0x69,0x63,0x75,0x6C,0x74,0x20, - 0x74,0x6F,0x20,0x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74, - 0x20,0x63,0x6F,0x72,0x72,0x65,0x63,0x74,0x6C,0x79,0x20,0x77, - 0x68,0x65,0x6E,0x20,0x68,0x61,0x76,0x69,0x6E,0x67,0x3C,0x3E, - 0x40,0x58,0x30,0x33,0x35,0x68,0x69,0x67,0x68,0x65,0x72,0x20, - 0x61,0x75,0x64,0x69,0x6F,0x20,0x62,0x75,0x66,0x66,0x65,0x72, - 0x20,0x73,0x69,0x7A,0x65,0x73,0x20,0x28,0x62,0x75,0x66,0x66, - 0x65,0x72,0x65,0x64,0x20,0x72,0x65,0x70,0x6C,0x61,0x79,0x65, - 0x72,0x20,0x74,0x69,0x63,0x6B,0x73,0x29,0x2E,0x2E,0x2E,0x06, - 0x3E,0x40,0x58,0x30,0x32,0x30,0x30,0x3E,0x40,0x43,0x30,0x30, - 0x31,0x51,0x3A,0x20,0x57,0x68,0x65,0x72,0x65,0x20,0x69,0x73, - 0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75, - 0x72,0x61,0x74,0x69,0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x20, - 0x73,0x74,0x6F,0x72,0x65,0x64,0x3F,0x3F,0x3E,0x40,0x43,0x30, - 0x30,0x32,0x41,0x3A,0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73, - 0x3A,0x20,0x5C,0x55,0x73,0x65,0x72,0x73,0x5C,0x55,0x53,0x45, - 0x52,0x5C,0x41,0x70,0x70,0x44,0x61,0x74,0x61,0x5C,0x52,0x6F, - 0x61,0x6D,0x69,0x6E,0x67,0x5C,0x46,0x54,0x32,0x20,0x63,0x6C, - 0x6F,0x6E,0x65,0x5C,0x46,0x54,0x32,0x2E,0x43,0x46,0x47,0x45, - 0x3E,0x40,0x58,0x30,0x33,0x35,0x4F,0x53,0x20,0x58,0x3A,0x20, - 0x2F,0x55,0x73,0x65,0x72,0x73,0x2F,0x55,0x53,0x45,0x52,0x2F, - 0x4C,0x69,0x62,0x72,0x61,0x72,0x79,0x2F,0x41,0x70,0x70,0x6C, - 0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x53,0x75,0x70,0x70, - 0x6F,0x72,0x74,0x2F,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E, - 0x65,0x2F,0x46,0x54,0x32,0x2E,0x43,0x46,0x47,0x2F,0x47,0x4E, - 0x55,0x2F,0x4C,0x69,0x6E,0x75,0x78,0x3A,0x20,0x2F,0x68,0x6F, - 0x6D,0x65,0x2F,0x55,0x53,0x45,0x52,0x2F,0x2E,0x63,0x6F,0x6E, - 0x66,0x69,0x67,0x2F,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E, - 0x65,0x2F,0x46,0x54,0x32,0x2E,0x43,0x46,0x47,0x01,0x3E,0x48, - 0x49,0x74,0x20,0x77,0x69,0x6C,0x6C,0x20,0x62,0x65,0x20,0x73, - 0x74,0x6F,0x72,0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65, - 0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x64,0x69,0x72, - 0x65,0x63,0x74,0x6F,0x72,0x79,0x20,0x69,0x66,0x20,0x74,0x68, - 0x65,0x20,0x70,0x61,0x74,0x68,0x20,0x63,0x6F,0x75,0x6C,0x64, - 0x6E,0x27,0x74,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x2E, - 0x4D,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x70,0x75,0x74,0x20, - 0x74,0x68,0x65,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72, - 0x61,0x74,0x69,0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x69, - 0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61, - 0x6D,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x2C, - 0x20,0x69,0x74,0x20,0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x61, - 0x64,0x20,0x74,0x68,0x61,0x74,0x4A,0x6F,0x6E,0x65,0x20,0x61, - 0x6E,0x64,0x20,0x6E,0x6F,0x74,0x20,0x61,0x74,0x74,0x65,0x6D, - 0x70,0x74,0x20,0x74,0x6F,0x20,0x63,0x72,0x65,0x61,0x74,0x65, - 0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x20,0x64,0x69,0x72,0x73, - 0x20,0x66,0x6F,0x72,0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20, - 0x75,0x73,0x65,0x72,0x2E,0x20,0x28,0x70,0x6F,0x72,0x74,0x61, - 0x62,0x6C,0x65,0x20,0x6D,0x6F,0x64,0x65,0x29,0x06,0x3E,0x40, - 0x58,0x30,0x32,0x30,0x42,0x3E,0x40,0x43,0x30,0x30,0x31,0x51, - 0x3A,0x20,0x43,0x61,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6C, - 0x6F,0x6E,0x65,0x20,0x72,0x65,0x61,0x64,0x20,0x46,0x54,0x32, - 0x2E,0x43,0x46,0x47,0x20,0x66,0x72,0x6F,0x6D,0x20,0x72,0x65, - 0x61,0x6C,0x20,0x46,0x54,0x32,0x2C,0x20,0x61,0x6E,0x64,0x20, - 0x76,0x69,0x63,0x65,0x20,0x76,0x65,0x72,0x73,0x61,0x3F,0x4C, - 0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x59,0x65,0x73, - 0x2C,0x20,0x69,0x74,0x20,0x73,0x68,0x6F,0x75,0x6C,0x64,0x20, - 0x77,0x6F,0x72,0x6B,0x20,0x6A,0x75,0x73,0x74,0x20,0x66,0x69, - 0x6E,0x65,0x2E,0x20,0x50,0x75,0x74,0x20,0x69,0x74,0x20,0x69, - 0x6E,0x20,0x74,0x68,0x65,0x20,0x64,0x69,0x72,0x65,0x63,0x74, - 0x6F,0x72,0x79,0x20,0x73,0x68,0x6F,0x77,0x6E,0x20,0x61,0x62, - 0x6F,0x76,0x65,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x52, - 0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x53,0x6D,0x70, - 0x2E,0x20,0x45,0x64,0x2E,0x3A,0x20,0x57,0x68,0x69,0x6C,0x65, - 0x20,0x7A,0x6F,0x6F,0x6D,0x69,0x6E,0x67,0x20,0x69,0x6E,0x2C, - 0x20,0x49,0x20,0x73,0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,0x73, - 0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x6D,0x61,0x72,0x6B,0x20, - 0x74,0x68,0x65,0x20,0x6C,0x61,0x73,0x74,0x20,0x73,0x61,0x6D, - 0x70,0x6C,0x65,0x20,0x70,0x6F,0x69,0x6E,0x74,0x21,0x47,0x3E, - 0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x54,0x68,0x69,0x73, - 0x20,0x69,0x73,0x20,0x6E,0x6F,0x72,0x6D,0x61,0x6C,0x2E,0x20, - 0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x61,0x20,0x6C,0x69, - 0x6D,0x69,0x74,0x61,0x74,0x69,0x6F,0x6E,0x20,0x69,0x6E,0x20, - 0x74,0x68,0x65,0x20,0x6E,0x61,0x74,0x75,0x72,0x65,0x20,0x6F, - 0x66,0x20,0x73,0x63,0x61,0x6C,0x69,0x6E,0x67,0x2E,0x06,0x3E, - 0x40,0x58,0x30,0x32,0x30,0x17,0x3E,0x40,0x43,0x30,0x30,0x31, - 0x51,0x3A,0x20,0x49,0x20,0x66,0x6F,0x75,0x6E,0x64,0x20,0x61, - 0x20,0x62,0x75,0x67,0x21,0x4B,0x3E,0x40,0x43,0x30,0x30,0x32, - 0x41,0x3A,0x20,0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x73,0x65, - 0x6E,0x64,0x20,0x61,0x20,0x6D,0x61,0x69,0x6C,0x20,0x74,0x6F, - 0x20,0x6F,0x6C,0x61,0x76,0x2E,0x73,0x6F,0x72,0x65,0x6E,0x73, - 0x65,0x6E,0x40,0x6C,0x69,0x76,0x65,0x2E,0x6E,0x6F,0x20,0x61, - 0x6E,0x64,0x20,0x74,0x72,0x79,0x20,0x74,0x6F,0x20,0x65,0x78, - 0x70,0x6C,0x61,0x69,0x6E,0x20,0x69,0x74,0x2E,0x00,0x03,0x45, - 0x4E,0x44,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, - 0x0C,0x40,0x4C,0x4B,0x6E,0x6F,0x77,0x6E,0x20,0x62,0x75,0x67, - 0x73,0x06,0x3E,0x40,0x58,0x30,0x31,0x30,0x14,0x3E,0x40,0x43, - 0x30,0x30,0x31,0x53,0x61,0x6D,0x70,0x6C,0x65,0x20,0x65,0x64, - 0x69,0x74,0x6F,0x72,0x3A,0x06,0x3E,0x40,0x43,0x30,0x30,0x32, - 0x4E,0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x57,0x68,0x65, - 0x6E,0x20,0x61,0x20,0x6C,0x6F,0x6F,0x70,0x65,0x64,0x20,0x73, - 0x61,0x6D,0x70,0x6C,0x65,0x20,0x69,0x73,0x20,0x7A,0x6F,0x6F, - 0x6D,0x65,0x64,0x20,0x6F,0x75,0x74,0x20,0x69,0x6E,0x20,0x74, - 0x68,0x65,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x65,0x64, - 0x69,0x74,0x6F,0x72,0x2C,0x20,0x79,0x6F,0x75,0x20,0x63,0x6F, - 0x75,0x6C,0x64,0x20,0x73,0x65,0x65,0x4F,0x3E,0x40,0x58,0x30, - 0x32,0x31,0x75,0x6E,0x65,0x78,0x70,0x65,0x63,0x74,0x65,0x64, - 0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20,0x64,0x61,0x74,0x61, - 0x20,0x61,0x74,0x20,0x74,0x68,0x65,0x20,0x6C,0x6F,0x6F,0x70, - 0x2D,0x65,0x6E,0x64,0x20,0x70,0x6F,0x69,0x6E,0x74,0x2E,0x20, - 0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x62,0x65,0x63,0x61, - 0x75,0x73,0x65,0x20,0x6F,0x66,0x20,0x61,0x20,0x6B,0x6C,0x75, - 0x64,0x67,0x65,0x4B,0x66,0x6F,0x72,0x20,0x74,0x68,0x65,0x20, - 0x72,0x65,0x73,0x61,0x6D,0x70,0x6C,0x69,0x6E,0x67,0x20,0x69, + 0x32,0x35,0x53,0x65,0x6C,0x65,0x63,0x74,0x73,0x20,0x77,0x68, + 0x61,0x74,0x20,0x74,0x79,0x70,0x65,0x20,0x6F,0x66,0x20,0x72, + 0x65,0x73,0x61,0x6D,0x70,0x6C,0x69,0x6E,0x67,0x20,0x69,0x6E, + 0x74,0x65,0x72,0x70,0x6F,0x6C,0x61,0x74,0x69,0x6F,0x6E,0x20, + 0x74,0x6F,0x20,0x75,0x73,0x65,0x2E,0x45,0x22,0x4E,0x6F,0x6E, + 0x65,0x22,0x20,0x75,0x73,0x65,0x73,0x20,0x6E,0x6F,0x20,0x69, 0x6E,0x74,0x65,0x72,0x70,0x6F,0x6C,0x61,0x74,0x69,0x6F,0x6E, - 0x20,0x74,0x6F,0x20,0x77,0x6F,0x72,0x6B,0x20,0x66,0x61,0x73, - 0x74,0x65,0x72,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x61, - 0x75,0x64,0x69,0x6F,0x20,0x6D,0x69,0x78,0x65,0x72,0x2C,0x20, - 0x61,0x6E,0x64,0x20,0x74,0x68,0x65,0x4B,0x6F,0x72,0x69,0x67, - 0x69,0x6E,0x61,0x6C,0x20,0x46,0x54,0x32,0x20,0x68,0x61,0x73, - 0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x65,0x20,0x70,0x72, - 0x6F,0x62,0x6C,0x65,0x6D,0x2E,0x20,0x49,0x20,0x68,0x61,0x76, - 0x65,0x20,0x6D,0x61,0x64,0x65,0x20,0x69,0x74,0x20,0x73,0x6F, - 0x20,0x74,0x68,0x61,0x74,0x20,0x69,0x66,0x20,0x79,0x6F,0x75, - 0x20,0x7A,0x6F,0x6F,0x6D,0x20,0x69,0x6E,0x20,0x74,0x6F,0x3B, - 0x73,0x65,0x65,0x20,0x74,0x68,0x65,0x20,0x69,0x6E,0x64,0x69, - 0x76,0x69,0x64,0x75,0x61,0x6C,0x20,0x73,0x61,0x6D,0x70,0x6C, - 0x65,0x20,0x70,0x6F,0x69,0x6E,0x74,0x73,0x2C,0x20,0x69,0x74, - 0x20,0x77,0x69,0x6C,0x6C,0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x6C, - 0x69,0x6B,0x65,0x20,0x6E,0x6F,0x72,0x6D,0x61,0x6C,0x2E,0x06, - 0x3E,0x40,0x58,0x30,0x31,0x30,0x17,0x3E,0x40,0x43,0x30,0x30, - 0x31,0x4D,0x6F,0x75,0x73,0x65,0x20,0x2F,0x20,0x6B,0x65,0x79, - 0x62,0x6F,0x61,0x72,0x64,0x3A,0x01,0x3E,0x43,0x3E,0x40,0x43, - 0x30,0x30,0x32,0x2D,0x20,0x4C,0x69,0x6E,0x75,0x78,0x3A,0x20, - 0x54,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,0x65,0x20,0x63,0x75, - 0x72,0x73,0x6F,0x72,0x20,0x67,0x72,0x61,0x70,0x68,0x69,0x63, - 0x73,0x20,0x63,0x61,0x6E,0x20,0x62,0x65,0x20,0x67,0x6C,0x69, - 0x74,0x63,0x68,0x79,0x20,0x61,0x74,0x20,0x74,0x69,0x6D,0x65, - 0x73,0x2E,0x2E,0x2E,0x06,0x3E,0x40,0x58,0x30,0x31,0x30,0x0C, - 0x3E,0x40,0x43,0x30,0x30,0x31,0x56,0x69,0x64,0x65,0x6F,0x3A, - 0x06,0x3E,0x40,0x43,0x30,0x30,0x32,0x50,0x3E,0x40,0x58,0x30, - 0x31,0x30,0x2D,0x20,0x46,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65, - 0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x63,0x61,0x6E,0x20, - 0x62,0x65,0x20,0x75,0x6E,0x62,0x65,0x61,0x72,0x61,0x62,0x6C, - 0x79,0x20,0x73,0x6C,0x6F,0x77,0x20,0x6F,0x6E,0x20,0x61,0x20, - 0x52,0x61,0x73,0x70,0x62,0x65,0x72,0x72,0x79,0x20,0x50,0x69, - 0x20,0x28,0x65,0x76,0x65,0x6E,0x20,0x6F,0x6E,0x20,0x52,0x50, - 0x69,0x20,0x34,0x29,0x01,0x3E,0x4A,0x3E,0x40,0x58,0x30,0x31, - 0x30,0x2D,0x20,0x54,0x68,0x65,0x20,0x73,0x63,0x6F,0x70,0x65, - 0x73,0x20,0x63,0x61,0x6E,0x20,0x6D,0x69,0x6C,0x64,0x6C,0x79, - 0x20,0x66,0x6C,0x69,0x63,0x6B,0x65,0x72,0x20,0x64,0x65,0x70, - 0x65,0x6E,0x64,0x69,0x6E,0x67,0x20,0x6F,0x6E,0x20,0x74,0x68, - 0x65,0x20,0x77,0x61,0x76,0x65,0x66,0x6F,0x72,0x6D,0x20,0x61, - 0x6E,0x64,0x20,0x70,0x69,0x74,0x63,0x68,0x2E,0x4D,0x3E,0x40, - 0x58,0x30,0x32,0x31,0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20, - 0x62,0x65,0x63,0x61,0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x69, - 0x72,0x20,0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x20, - 0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x63,0x6C,0x6F,0x63,0x6B, - 0x65,0x64,0x20,0x74,0x6F,0x20,0x65,0x78,0x61,0x63,0x74,0x6C, - 0x79,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x65,0x20,0x72, - 0x61,0x74,0x65,0x4D,0x3E,0x61,0x74,0x20,0x77,0x68,0x69,0x63, - 0x68,0x20,0x74,0x68,0x65,0x20,0x73,0x63,0x6F,0x70,0x65,0x73, - 0x20,0x61,0x72,0x65,0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x65, - 0x64,0x2E,0x20,0x49,0x74,0x27,0x73,0x20,0x63,0x6C,0x6F,0x73, - 0x65,0x2C,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x63,0x61,0x75, - 0x73,0x65,0x73,0x20,0x61,0x20,0x66,0x6C,0x69,0x63,0x6B,0x65, - 0x72,0x20,0x65,0x66,0x66,0x65,0x63,0x74,0x2E,0x01,0x3E,0x52, - 0x3E,0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x4E,0x6F,0x74,0x20, - 0x61,0x20,0x62,0x75,0x67,0x2C,0x20,0x62,0x75,0x74,0x20,0x69, - 0x66,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74, - 0x6F,0x72,0x27,0x73,0x20,0x72,0x65,0x66,0x72,0x65,0x73,0x68, - 0x20,0x72,0x61,0x74,0x65,0x20,0x69,0x73,0x20,0x6E,0x6F,0x74, - 0x20,0x73,0x65,0x74,0x20,0x74,0x6F,0x20,0x36,0x30,0x48,0x7A, - 0x20,0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,0x4F,0x3E, - 0x40,0x58,0x30,0x32,0x31,0x79,0x6F,0x75,0x20,0x6D,0x61,0x79, - 0x20,0x65,0x78,0x70,0x65,0x72,0x69,0x65,0x6E,0x63,0x65,0x20, - 0x76,0x69,0x73,0x75,0x61,0x6C,0x20,0x73,0x74,0x75,0x74,0x74, - 0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,0x63,0x61,0x75,0x73, - 0x65,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x77,0x69,0x6C,0x6C, - 0x20,0x6E,0x6F,0x74,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64, - 0x20,0x74,0x68,0x65,0x6E,0x2E,0x49,0x49,0x20,0x68,0x69,0x67, - 0x68,0x6C,0x79,0x20,0x72,0x65,0x63,0x6F,0x6D,0x6D,0x65,0x6E, - 0x64,0x20,0x72,0x75,0x6E,0x6E,0x69,0x6E,0x67,0x20,0x79,0x6F, - 0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x20,0x61, - 0x74,0x20,0x36,0x30,0x48,0x7A,0x20,0x69,0x66,0x20,0x79,0x6F, - 0x75,0x27,0x72,0x65,0x20,0x61,0x20,0x68,0x61,0x72,0x64,0x63, - 0x6F,0x72,0x65,0x20,0x75,0x73,0x65,0x72,0x10,0x6F,0x66,0x20, - 0x74,0x68,0x69,0x73,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D, - 0x2E,0x00,0x03,0x45,0x4E,0x44 + 0x20,0x28,0x6E,0x65,0x61,0x72,0x65,0x73,0x74,0x20,0x6E,0x65, + 0x69,0x67,0x68,0x62,0x6F,0x72,0x29,0x2C,0x20,0x77,0x68,0x69, + 0x63,0x68,0x20,0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x73,0x75, + 0x6C,0x74,0x20,0x69,0x6E,0x49,0x61,0x6C,0x69,0x61,0x73,0x69, + 0x6E,0x67,0x20,0x28,0x6E,0x6F,0x69,0x73,0x65,0x29,0x20,0x69, + 0x6E,0x20,0x74,0x68,0x65,0x20,0x73,0x6F,0x75,0x6E,0x64,0x2E, + 0x20,0x22,0x4C,0x69,0x6E,0x65,0x61,0x72,0x22,0x20,0x69,0x73, + 0x20,0x77,0x68,0x61,0x74,0x20,0x72,0x65,0x61,0x6C,0x20,0x46, + 0x54,0x32,0x20,0x75,0x73,0x65,0x73,0x2C,0x20,0x77,0x68,0x69, + 0x63,0x68,0x20,0x69,0x73,0x20,0x61,0x46,0x6D,0x65,0x64,0x69, + 0x6F,0x63,0x72,0x65,0x20,0x69,0x6E,0x74,0x65,0x72,0x70,0x6F, + 0x6C,0x61,0x74,0x69,0x6F,0x6E,0x20,0x74,0x79,0x70,0x65,0x2E, + 0x20,0x22,0x43,0x75,0x62,0x69,0x63,0x20,0x73,0x70,0x6C,0x69, + 0x6E,0x65,0x22,0x20,0x69,0x73,0x20,0x74,0x68,0x65,0x20,0x72, + 0x65,0x63,0x6F,0x6D,0x6D,0x65,0x6E,0x64,0x65,0x64,0x20,0x73, + 0x65,0x74,0x74,0x69,0x6E,0x67,0x48,0x66,0x6F,0x72,0x20,0x74, + 0x68,0x65,0x20,0x62,0x65,0x73,0x74,0x20,0x61,0x75,0x64,0x69, + 0x6F,0x20,0x71,0x75,0x61,0x6C,0x69,0x74,0x79,0x2C,0x20,0x61, + 0x6C,0x74,0x68,0x6F,0x75,0x67,0x68,0x20,0x69,0x74,0x20,0x6D, + 0x61,0x79,0x20,0x73,0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,0x73, + 0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x74,0x6F,0x6F,0x20,0x66, + 0x69,0x6C,0x74,0x65,0x72,0x65,0x64,0x2A,0x6F,0x6E,0x20,0x6C, + 0x6F,0x77,0x2D,0x71,0x75,0x61,0x6C,0x69,0x74,0x79,0x20,0x73, + 0x61,0x6D,0x70,0x6C,0x65,0x73,0x20,0x28,0x66,0x2E,0x65,0x78, + 0x2E,0x20,0x41,0x6D,0x69,0x67,0x61,0x20,0x4D,0x4F,0x44,0x73, + 0x29,0x2E,0x00,0x1A,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43, + 0x30,0x30,0x31,0x56,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x72,0x61, + 0x6D,0x70,0x69,0x6E,0x67,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36, + 0x30,0x40,0x43,0x30,0x30,0x32,0x3B,0x45,0x6E,0x61,0x62,0x6C, + 0x65,0x73,0x20,0x74,0x68,0x65,0x20,0x61,0x6E,0x74,0x69,0x2D, + 0x63,0x6C,0x69,0x63,0x6B,0x20,0x73,0x79,0x73,0x74,0x65,0x6D, + 0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x61,0x75,0x64,0x69, + 0x6F,0x20,0x6D,0x69,0x78,0x65,0x72,0x20,0x28,0x46,0x54,0x32, + 0x2E,0x30,0x38,0x2B,0x29,0x2E,0x3B,0x50,0x6C,0x65,0x61,0x73, + 0x65,0x20,0x6E,0x6F,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20, + 0x6F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x20,0x46,0x54,0x32, + 0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x6C,0x6F,0x61,0x64,0x20, + 0x74,0x68,0x69,0x73,0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x20, + 0x65,0x6E,0x74,0x72,0x79,0x2C,0x0B,0x63,0x6C,0x6F,0x6E,0x65, + 0x20,0x6F,0x6E,0x6C,0x79,0x2E,0x00,0x19,0x3E,0x40,0x58,0x30, + 0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x41,0x6D,0x70,0x6C,0x69, + 0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x3A,0x0B,0x3E,0x40, + 0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x46,0x41,0x6D, + 0x70,0x6C,0x69,0x66,0x69,0x65,0x73,0x20,0x74,0x68,0x65,0x20, + 0x76,0x6F,0x6C,0x75,0x6D,0x65,0x20,0x77,0x68,0x65,0x6E,0x20, + 0x6D,0x69,0x78,0x69,0x6E,0x67,0x2E,0x20,0x49,0x66,0x20,0x79, + 0x6F,0x75,0x20,0x73,0x65,0x74,0x20,0x74,0x68,0x69,0x73,0x20, + 0x6F,0x6E,0x65,0x20,0x74,0x6F,0x6F,0x20,0x68,0x69,0x67,0x68, + 0x2C,0x20,0x79,0x6F,0x75,0x27,0x6C,0x6C,0x3A,0x67,0x65,0x74, + 0x20,0x64,0x69,0x73,0x74,0x6F,0x72,0x74,0x69,0x6F,0x6E,0x2E, + 0x20,0x33,0x32,0x58,0x20,0x65,0x71,0x75,0x61,0x6C,0x73,0x20, + 0x66,0x75,0x6C,0x6C,0x20,0x61,0x6D,0x70,0x6C,0x69,0x74,0x75, + 0x64,0x65,0x20,0x66,0x6F,0x72,0x20,0x6F,0x6E,0x65,0x20,0x63, + 0x68,0x61,0x6E,0x6E,0x65,0x6C,0x2E,0x00,0x1B,0x3E,0x40,0x58, + 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x46,0x72,0x65,0x71, + 0x75,0x65,0x6E,0x63,0x79,0x20,0x74,0x61,0x62,0x6C,0x65,0x3A, + 0x0B,0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32, + 0x40,0x54,0x68,0x65,0x20,0x6C,0x69,0x6E,0x65,0x61,0x72,0x20, + 0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x20,0x74,0x61, + 0x62,0x6C,0x65,0x20,0x6D,0x61,0x6B,0x65,0x73,0x20,0x61,0x6C, + 0x6C,0x20,0x70,0x69,0x74,0x63,0x68,0x20,0x62,0x65,0x6E,0x64, + 0x73,0x20,0x72,0x75,0x6E,0x20,0x69,0x6E,0x20,0x63,0x6F,0x6E, + 0x73,0x74,0x61,0x6E,0x74,0x3F,0x73,0x70,0x65,0x65,0x64,0x2C, + 0x20,0x69,0x6E,0x64,0x65,0x70,0x65,0x6E,0x64,0x65,0x6E,0x74, + 0x20,0x6F,0x66,0x20,0x74,0x68,0x65,0x20,0x63,0x75,0x72,0x72, + 0x65,0x6E,0x74,0x20,0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63, + 0x79,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x73,0x77, + 0x69,0x74,0x63,0x68,0x20,0x74,0x68,0x69,0x73,0x41,0x6F,0x6E, + 0x65,0x2C,0x20,0x6F,0x6E,0x20,0x61,0x20,0x66,0x69,0x6E,0x69, + 0x73,0x68,0x65,0x64,0x20,0x73,0x6F,0x6E,0x67,0x2C,0x20,0x69, + 0x74,0x20,0x6D,0x69,0x67,0x68,0x74,0x20,0x73,0x6F,0x75,0x6E, + 0x64,0x20,0x73,0x74,0x72,0x61,0x6E,0x67,0x65,0x20,0x69,0x66, + 0x20,0x74,0x68,0x65,0x20,0x73,0x6F,0x75,0x6E,0x64,0x20,0x75, + 0x73,0x65,0x73,0x0D,0x70,0x6F,0x72,0x74,0x61,0x6D,0x65,0x6E, + 0x74,0x6F,0x65,0x73,0x2E,0x00,0x20,0x40,0x58,0x30,0x32,0x30, + 0x40,0x43,0x30,0x30,0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75, + 0x72,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x4C,0x61,0x79,0x6F, + 0x75,0x74,0x3A,0x01,0x3E,0x29,0x3E,0x40,0x58,0x30,0x34,0x30, + 0x40,0x43,0x30,0x30,0x31,0x50,0x61,0x74,0x74,0x65,0x72,0x6E, + 0x20,0x6C,0x61,0x79,0x6F,0x75,0x74,0x2C,0x20,0x68,0x65,0x78, + 0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x69,0x6E,0x67,0x3A,0x0B, + 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x41, + 0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x75,0x73,0x65,0x20,0x70, + 0x61,0x74,0x74,0x65,0x72,0x6E,0x73,0x20,0x74,0x68,0x61,0x74, + 0x20,0x61,0x72,0x65,0x20,0x6C,0x6F,0x6E,0x67,0x65,0x72,0x20, + 0x74,0x68,0x61,0x6E,0x20,0x39,0x39,0x20,0x6C,0x69,0x6E,0x65, + 0x73,0x2C,0x20,0x79,0x6F,0x75,0x20,0x73,0x68,0x6F,0x75,0x6C, + 0x64,0x20,0x75,0x73,0x65,0x45,0x68,0x65,0x78,0x20,0x63,0x6F, + 0x75,0x6E,0x74,0x69,0x6E,0x67,0x20,0x73,0x69,0x6E,0x63,0x65, + 0x20,0x74,0x68,0x65,0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x6F, + 0x6E,0x6C,0x79,0x20,0x32,0x20,0x64,0x69,0x67,0x69,0x74,0x73, + 0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x6C,0x69,0x6E,0x65, + 0x20,0x6E,0x75,0x6D,0x62,0x65,0x72,0x20,0x63,0x6F,0x6C,0x75, + 0x6D,0x6E,0x2E,0x00,0x12,0x3E,0x40,0x58,0x30,0x34,0x30,0x40, + 0x43,0x30,0x30,0x31,0x53,0x63,0x6F,0x70,0x65,0x73,0x3A,0x0B, + 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x43, + 0x22,0x53,0x74,0x64,0x2E,0x22,0x20,0x28,0x73,0x74,0x61,0x6E, + 0x64,0x61,0x72,0x64,0x29,0x20,0x77,0x69,0x6C,0x6C,0x20,0x73, + 0x68,0x6F,0x77,0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x70, + 0x6C,0x65,0x20,0x70,0x6F,0x69,0x6E,0x74,0x73,0x20,0x61,0x73, + 0x20,0x70,0x69,0x78,0x65,0x6C,0x73,0x20,0x28,0x6C,0x69,0x6B, + 0x65,0x20,0x46,0x54,0x32,0x29,0x2E,0x41,0x22,0x4C,0x69,0x6E, + 0x65,0x64,0x22,0x20,0x77,0x69,0x6C,0x6C,0x20,0x64,0x72,0x61, + 0x77,0x20,0x6C,0x69,0x6E,0x65,0x73,0x20,0x62,0x65,0x74,0x77, + 0x65,0x65,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x6F,0x69,0x6E, + 0x74,0x73,0x2C,0x20,0x6C,0x69,0x6B,0x65,0x20,0x61,0x6E,0x20, + 0x6F,0x73,0x63,0x69,0x6C,0x6C,0x6F,0x73,0x63,0x6F,0x70,0x65, + 0x2E,0x00,0x27,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30, + 0x31,0x43,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69, + 0x6F,0x6E,0x2C,0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61, + 0x6E,0x65,0x6F,0x75,0x73,0x3A,0x01,0x3E,0x15,0x3E,0x40,0x58, + 0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x56,0x53,0x79,0x6E, + 0x63,0x20,0x6F,0x66,0x66,0x3A,0x0B,0x3E,0x40,0x58,0x30,0x36, + 0x30,0x40,0x43,0x30,0x30,0x32,0x3F,0x54,0x65,0x6C,0x6C,0x73, + 0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D, + 0x20,0x74,0x6F,0x20,0x6E,0x6F,0x74,0x20,0x75,0x73,0x65,0x20, + 0x56,0x53,0x79,0x6E,0x63,0x20,0x66,0x6F,0x72,0x20,0x76,0x69, + 0x64,0x65,0x6F,0x2E,0x20,0x49,0x66,0x20,0x79,0x6F,0x75,0x72, + 0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x40,0x72, + 0x65,0x66,0x72,0x65,0x73,0x68,0x20,0x72,0x61,0x74,0x65,0x20, + 0x69,0x73,0x20,0x6E,0x6F,0x74,0x20,0x36,0x30,0x48,0x7A,0x20, + 0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,0x2C,0x20,0x74, + 0x68,0x65,0x6E,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x69,0x73, + 0x20,0x61,0x6C,0x77,0x61,0x79,0x73,0x20,0x6F,0x66,0x66,0x20, + 0x66,0x6F,0x72,0x45,0x74,0x68,0x69,0x73,0x20,0x70,0x72,0x6F, + 0x67,0x72,0x61,0x6D,0x2E,0x20,0x4E,0x6F,0x74,0x20,0x68,0x61, + 0x76,0x69,0x6E,0x67,0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x77, + 0x69,0x6C,0x6C,0x20,0x72,0x65,0x73,0x75,0x6C,0x74,0x20,0x69, + 0x6E,0x20,0x6C,0x65,0x73,0x73,0x20,0x69,0x6E,0x70,0x75,0x74, + 0x2F,0x76,0x69,0x64,0x65,0x6F,0x20,0x64,0x65,0x6C,0x61,0x79, + 0x2C,0x1E,0x62,0x75,0x74,0x20,0x61,0x6C,0x73,0x6F,0x20,0x70, + 0x6F,0x74,0x65,0x6E,0x74,0x69,0x61,0x6C,0x20,0x73,0x74,0x75, + 0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x2E,0x01,0x20,0x18,0x3E, + 0x40,0x58,0x30,0x34,0x30,0x40,0x43,0x30,0x30,0x31,0x50,0x69, + 0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x3A,0x0B, + 0x3E,0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x43, + 0x41,0x70,0x70,0x6C,0x69,0x65,0x73,0x20,0x61,0x20,0x73,0x75, + 0x62,0x70,0x69,0x78,0x65,0x6C,0x20,0x66,0x69,0x6C,0x74,0x65, + 0x72,0x20,0x74,0x68,0x61,0x74,0x20,0x69,0x73,0x20,0x75,0x73, + 0x65,0x64,0x20,0x77,0x68,0x65,0x6E,0x20,0x74,0x68,0x65,0x20, + 0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x69,0x73,0x20,0x75,0x70, + 0x73,0x63,0x61,0x6C,0x65,0x64,0x2E,0x43,0x54,0x68,0x69,0x73, + 0x20,0x61,0x6C,0x73,0x6F,0x20,0x6D,0x61,0x6B,0x65,0x73,0x20, + 0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65,0x6E,0x20,0x6D, + 0x6F,0x64,0x65,0x20,0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65, + 0x6C,0x79,0x20,0x73,0x74,0x72,0x65,0x74,0x63,0x68,0x20,0x6F, + 0x75,0x74,0x20,0x69,0x66,0x20,0x69,0x74,0x20,0x64,0x69,0x64, + 0x6E,0x27,0x74,0x44,0x61,0x6C,0x72,0x65,0x61,0x64,0x79,0x2E, + 0x20,0x50,0x6C,0x65,0x61,0x73,0x65,0x20,0x6B,0x65,0x65,0x70, + 0x20,0x69,0x6E,0x20,0x6D,0x69,0x6E,0x64,0x20,0x74,0x68,0x61, + 0x74,0x20,0x74,0x68,0x69,0x73,0x20,0x77,0x69,0x6C,0x6C,0x20, + 0x6D,0x61,0x6B,0x65,0x20,0x70,0x69,0x78,0x65,0x6C,0x73,0x20, + 0x6C,0x6F,0x6F,0x6B,0x20,0x62,0x6C,0x75,0x72,0x72,0x79,0x2E, + 0x00,0x23,0x40,0x58,0x30,0x32,0x30,0x40,0x43,0x30,0x30,0x31, + 0x41,0x64,0x76,0x61,0x6E,0x63,0x65,0x64,0x20,0x65,0x64,0x69, + 0x74,0x20,0x66,0x75,0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x3A, + 0x20,0x01,0x3E,0x1E,0x3E,0x40,0x58,0x30,0x34,0x30,0x40,0x43, + 0x30,0x30,0x31,0x43,0x6F,0x70,0x79,0x2F,0x50,0x61,0x73,0x74, + 0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x3A,0x0B,0x3E, + 0x40,0x58,0x30,0x36,0x30,0x40,0x43,0x30,0x30,0x32,0x37,0x54, + 0x68,0x65,0x20,0x6D,0x61,0x73,0x6B,0x69,0x6E,0x67,0x20,0x69, + 0x73,0x20,0x75,0x73,0x65,0x64,0x20,0x66,0x6F,0x72,0x20,0x63, + 0x6F,0x70,0x79,0x69,0x6E,0x67,0x2F,0x70,0x61,0x73,0x74,0x69, + 0x6E,0x67,0x20,0x6F,0x6E,0x6C,0x79,0x20,0x70,0x61,0x72,0x74, + 0x73,0x20,0x6F,0x66,0x20,0x61,0x46,0x22,0x6E,0x6F,0x74,0x65, + 0x2D,0x63,0x65,0x6C,0x6C,0x22,0x2E,0x20,0x54,0x68,0x65,0x20, + 0x64,0x69,0x66,0x66,0x65,0x72,0x65,0x6E,0x74,0x20,0x70,0x61, + 0x72,0x74,0x73,0x20,0x6F,0x66,0x20,0x61,0x20,0x22,0x6E,0x6F, + 0x74,0x65,0x2D,0x63,0x65,0x6C,0x6C,0x22,0x20,0x69,0x73,0x20, + 0x4E,0x6F,0x74,0x65,0x2C,0x20,0x49,0x6E,0x73,0x74,0x72,0x2E, + 0x20,0x6E,0x72,0x2E,0x2C,0x20,0x56,0x6F,0x6C,0x75,0x6D,0x65, + 0x2C,0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x6E,0x72,0x20, + 0x26,0x20,0x45,0x66,0x66,0x65,0x63,0x74,0x20,0x64,0x61,0x74, + 0x61,0x2E,0x34,0x3E,0x41,0x73,0x20,0x79,0x6F,0x75,0x20,0x63, + 0x61,0x6E,0x20,0x73,0x65,0x65,0x20,0x69,0x6E,0x20,0x74,0x68, + 0x65,0x20,0x77,0x69,0x6E,0x64,0x6F,0x77,0x20,0x74,0x68,0x65, + 0x72,0x65,0x20,0x61,0x72,0x65,0x20,0x33,0x20,0x63,0x6F,0x6C, + 0x75,0x6D,0x6E,0x73,0x20,0x6F,0x66,0x3D,0x22,0x65,0x6E,0x61, + 0x62,0x6C,0x65,0x2F,0x64,0x69,0x73,0x61,0x62,0x6C,0x65,0x20, + 0x62,0x75,0x74,0x74,0x6F,0x6E,0x73,0x22,0x20,0x77,0x68,0x69, + 0x63,0x68,0x20,0x68,0x61,0x73,0x20,0x74,0x68,0x65,0x20,0x6C, + 0x65,0x74,0x74,0x65,0x72,0x73,0x20,0x43,0x2C,0x50,0x20,0x26, + 0x20,0x54,0x20,0x61,0x62,0x6F,0x76,0x65,0x2E,0x45,0x3E,0x43, + 0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x63,0x6F,0x70,0x79,0x2C, + 0x20,0x69,0x74,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73, + 0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74,0x73, + 0x20,0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,0x69, + 0x6E,0x74,0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,0x79, + 0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x3E,0x3E,0x50,0x20,0x6D, + 0x65,0x61,0x6E,0x73,0x20,0x70,0x61,0x73,0x74,0x65,0x20,0x61, + 0x6E,0x64,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x73,0x20, + 0x77,0x68,0x69,0x63,0x68,0x20,0x70,0x61,0x72,0x74,0x73,0x20, + 0x74,0x68,0x61,0x74,0x20,0x67,0x6F,0x65,0x73,0x20,0x6F,0x75, + 0x74,0x20,0x66,0x72,0x6F,0x6D,0x20,0x74,0x68,0x65,0x0B,0x63, + 0x6F,0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x45,0x3E, + 0x54,0x20,0x6D,0x65,0x61,0x6E,0x73,0x20,0x74,0x72,0x61,0x6E, + 0x73,0x70,0x61,0x72,0x65,0x6E,0x63,0x79,0x2E,0x20,0x49,0x66, + 0x20,0x69,0x74,0x27,0x73,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65, + 0x64,0x2C,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x73,0x74,0x69, + 0x6E,0x67,0x20,0x64,0x6F,0x65,0x73,0x6E,0x27,0x74,0x20,0x6F, + 0x76,0x65,0x72,0x77,0x72,0x69,0x74,0x65,0x3D,0x64,0x61,0x74, + 0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6E,0x69,0x6C,0x2D,0x69, + 0x6E,0x66,0x6F,0x72,0x6D,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20, + 0x6F,0x6E,0x6C,0x79,0x20,0x77,0x69,0x74,0x68,0x20,0x61,0x20, + 0x6E,0x6F,0x74,0x65,0x20,0x6F,0x72,0x20,0x61,0x20,0x6E,0x75, + 0x6D,0x62,0x65,0x72,0x20,0x3C,0x3E,0x20,0x30,0x2E,0x01,0x3E, + 0x40,0x3E,0x54,0x68,0x65,0x20,0x63,0x75,0x74,0x20,0x66,0x75, + 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x73,0x20,0x77,0x6F,0x72,0x6B, + 0x73,0x20,0x6C,0x69,0x6B,0x65,0x20,0x70,0x61,0x73,0x74,0x69, + 0x6E,0x67,0x20,0x77,0x69,0x74,0x68,0x20,0x7A,0x65,0x72,0x6F, + 0x2D,0x64,0x61,0x74,0x61,0x2E,0x20,0x54,0x68,0x69,0x73,0x20, + 0x6D,0x65,0x61,0x6E,0x73,0x3B,0x74,0x68,0x61,0x74,0x20,0x74, + 0x68,0x65,0x20,0x63,0x75,0x74,0x74,0x69,0x6E,0x67,0x20,0x69, + 0x73,0x20,0x63,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x6C,0x65,0x64, + 0x20,0x77,0x69,0x74,0x68,0x20,0x50,0x2D,0x63,0x6F,0x6C,0x75, + 0x6D,0x6E,0x20,0x28,0x6F,0x72,0x20,0x54,0x2D,0x63,0x6F,0x6C, + 0x75,0x6D,0x6E,0x29,0x2E,0x3C,0x3E,0x57,0x68,0x65,0x6E,0x20, + 0x79,0x6F,0x75,0x20,0x63,0x6F,0x70,0x79,0x20,0x64,0x61,0x74, + 0x61,0x20,0x77,0x69,0x74,0x68,0x20,0x6D,0x61,0x73,0x6B,0x69, + 0x6E,0x67,0x2C,0x20,0x74,0x68,0x65,0x20,0x64,0x69,0x73,0x61, + 0x62,0x6C,0x65,0x64,0x20,0x70,0x61,0x72,0x74,0x73,0x20,0x61, + 0x72,0x65,0x20,0x6E,0x6F,0x74,0x43,0x63,0x6C,0x65,0x61,0x72, + 0x65,0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6F, + 0x70,0x79,0x62,0x75,0x66,0x66,0x65,0x72,0x2E,0x20,0x28,0x4D, + 0x61,0x6B,0x69,0x6E,0x67,0x20,0x69,0x74,0x20,0x70,0x6F,0x73, + 0x73,0x69,0x62,0x6C,0x65,0x20,0x74,0x6F,0x20,0x63,0x6F,0x6C, + 0x6C,0x65,0x63,0x74,0x20,0x64,0x61,0x74,0x61,0x20,0x66,0x72, + 0x6F,0x6D,0x27,0x73,0x65,0x76,0x65,0x72,0x61,0x6C,0x20,0x6C, + 0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x73,0x20,0x69,0x6E,0x74, + 0x6F,0x20,0x74,0x68,0x65,0x20,0x63,0x6F,0x70,0x79,0x62,0x75, + 0x66,0x66,0x65,0x72,0x2E,0x29,0x00,0x03,0x45,0x4E,0x44,0x4C, + 0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0E,0x40,0x4C, + 0x50,0x72,0x6F,0x62,0x6C,0x65,0x6D,0x73,0x2F,0x46,0x41,0x51, + 0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x41,0x3E,0x40,0x43,0x30, + 0x30,0x31,0x51,0x3A,0x20,0x43,0x61,0x6E,0x20,0x49,0x20,0x6D, + 0x61,0x6B,0x65,0x20,0x66,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65, + 0x65,0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x73,0x74,0x72,0x65, + 0x74,0x63,0x68,0x20,0x6F,0x75,0x74,0x20,0x74,0x68,0x65,0x20, + 0x77,0x68,0x6F,0x6C,0x65,0x20,0x73,0x63,0x72,0x65,0x65,0x6E, + 0x3F,0x3A,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x45, + 0x6E,0x61,0x62,0x6C,0x65,0x20,0x22,0x50,0x69,0x78,0x65,0x6C, + 0x20,0x66,0x69,0x6C,0x74,0x65,0x72,0x22,0x20,0x69,0x6E,0x20, + 0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E,0x20,0x4D,0x69, + 0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F,0x75,0x73,0x2E, + 0x4D,0x3E,0x40,0x58,0x30,0x33,0x35,0x49,0x74,0x20,0x77,0x6F, + 0x6E,0x27,0x74,0x20,0x6C,0x6F,0x6F,0x6B,0x20,0x70,0x72,0x65, + 0x74,0x74,0x79,0x2C,0x20,0x62,0x75,0x74,0x20,0x74,0x6F,0x20, + 0x73,0x6F,0x6D,0x65,0x20,0x70,0x65,0x6F,0x70,0x6C,0x65,0x20, + 0x69,0x74,0x27,0x73,0x20,0x6D,0x75,0x63,0x68,0x20,0x62,0x65, + 0x74,0x74,0x65,0x72,0x20,0x74,0x68,0x61,0x6E,0x20,0x6E,0x6F, + 0x74,0x68,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32, + 0x30,0x27,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x49, + 0x20,0x63,0x61,0x6E,0x27,0x74,0x20,0x75,0x73,0x65,0x20,0x41, + 0x4C,0x54,0x2B,0x46,0x34,0x20,0x61,0x6E,0x64,0x20,0x41,0x4C, + 0x54,0x2B,0x46,0x35,0x21,0x4E,0x3E,0x40,0x43,0x30,0x30,0x32, + 0x41,0x3A,0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,0x20, + 0x49,0x66,0x20,0x79,0x6F,0x75,0x20,0x68,0x61,0x76,0x65,0x20, + 0x47,0x65,0x46,0x6F,0x72,0x63,0x65,0x20,0x45,0x78,0x70,0x65, + 0x72,0x69,0x65,0x6E,0x63,0x65,0x20,0x69,0x6E,0x73,0x74,0x61, + 0x6C,0x6C,0x65,0x64,0x2C,0x20,0x79,0x6F,0x75,0x20,0x6E,0x65, + 0x65,0x64,0x20,0x74,0x6F,0x20,0x63,0x68,0x61,0x6E,0x67,0x65, + 0x2B,0x3E,0x40,0x58,0x30,0x33,0x35,0x74,0x68,0x65,0x20,0x6B, + 0x65,0x79,0x62,0x69,0x6E,0x64,0x69,0x6E,0x67,0x73,0x20,0x69, + 0x6E,0x20,0x69,0x74,0x73,0x20,0x73,0x65,0x74,0x74,0x69,0x6E, + 0x67,0x73,0x20,0x70,0x61,0x67,0x65,0x2E,0x56,0x6D,0x61,0x63, + 0x4F,0x53,0x2F,0x4F,0x53,0x20,0x58,0x3A,0x20,0x43,0x68,0x61, + 0x6E,0x67,0x65,0x20,0x41,0x4C,0x54,0x2B,0x46,0x34,0x2F,0x41, + 0x4C,0x54,0x2B,0x46,0x35,0x20,0x6B,0x65,0x79,0x73,0x20,0x69, + 0x6E,0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x74,0x6F,0x20, + 0x73,0x6F,0x6D,0x65,0x74,0x68,0x69,0x6E,0x67,0x20,0x65,0x6C, + 0x73,0x65,0x2E,0x20,0x41,0x6C,0x73,0x6F,0x20,0x66,0x6F,0x72, + 0x20,0x47,0x4E,0x55,0x2F,0x4C,0x69,0x6E,0x75,0x78,0x2E,0x06, + 0x3E,0x40,0x58,0x30,0x32,0x30,0x2B,0x3E,0x40,0x43,0x30,0x30, + 0x31,0x51,0x3A,0x20,0x54,0x68,0x65,0x20,0x6D,0x6F,0x75,0x73, + 0x65,0x20,0x63,0x75,0x72,0x73,0x6F,0x72,0x20,0x69,0x73,0x20, + 0x64,0x65,0x6C,0x61,0x79,0x65,0x64,0x2F,0x6C,0x61,0x67,0x67, + 0x79,0x21,0x44,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20, + 0x4D,0x61,0x6B,0x65,0x20,0x73,0x75,0x72,0x65,0x20,0x22,0x53, + 0x6F,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x6D,0x6F,0x75,0x73, + 0x65,0x22,0x20,0x69,0x73,0x20,0x64,0x69,0x73,0x61,0x62,0x6C, + 0x65,0x64,0x20,0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67, + 0x20,0x2D,0x3E,0x20,0x4C,0x61,0x79,0x6F,0x75,0x74,0x2E,0x4B, + 0x3E,0x40,0x58,0x30,0x33,0x35,0x41,0x6C,0x74,0x65,0x72,0x6E, + 0x61,0x74,0x69,0x76,0x65,0x6C,0x79,0x2C,0x20,0x79,0x6F,0x75, + 0x20,0x63,0x61,0x6E,0x20,0x65,0x6E,0x61,0x62,0x6C,0x65,0x20, + 0x22,0x56,0x53,0x79,0x6E,0x63,0x20,0x6F,0x66,0x66,0x22,0x20, + 0x69,0x6E,0x20,0x43,0x6F,0x6E,0x66,0x69,0x67,0x20,0x2D,0x3E, + 0x20,0x4D,0x69,0x73,0x63,0x65,0x6C,0x6C,0x61,0x6E,0x65,0x6F, + 0x75,0x73,0x2E,0x46,0x3E,0x54,0x68,0x69,0x73,0x20,0x68,0x6F, + 0x77,0x65,0x76,0x65,0x72,0x2C,0x20,0x77,0x69,0x6C,0x6C,0x20, + 0x69,0x6E,0x74,0x72,0x6F,0x64,0x75,0x63,0x65,0x20,0x73,0x74, + 0x75,0x74,0x74,0x65,0x72,0x69,0x6E,0x67,0x20,0x62,0x65,0x63, + 0x61,0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x20,0x72,0x65,0x6E, + 0x64,0x65,0x72,0x69,0x6E,0x67,0x20,0x72,0x61,0x74,0x65,0x20, + 0x69,0x73,0x22,0x3E,0x6E,0x6F,0x74,0x20,0x65,0x78,0x61,0x63, + 0x74,0x20,0x74,0x6F,0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F, + 0x6E,0x69,0x74,0x6F,0x72,0x27,0x73,0x20,0x72,0x61,0x74,0x65, + 0x2E,0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x33,0x3E,0x40,0x43, + 0x30,0x30,0x31,0x51,0x3A,0x20,0x57,0x69,0x6C,0x6C,0x20,0x79, + 0x6F,0x75,0x20,0x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74, + 0x20,0x4D,0x49,0x44,0x49,0x20,0x6F,0x75,0x74,0x20,0x66,0x75, + 0x6E,0x63,0x74,0x69,0x6F,0x6E,0x61,0x6C,0x69,0x74,0x79,0x3F, + 0x4D,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x4E,0x6F, + 0x2C,0x20,0x73,0x6F,0x72,0x72,0x79,0x2E,0x20,0x54,0x68,0x69, + 0x73,0x20,0x69,0x73,0x20,0x76,0x65,0x72,0x79,0x20,0x64,0x69, + 0x66,0x66,0x69,0x63,0x75,0x6C,0x74,0x20,0x74,0x6F,0x20,0x69, + 0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x20,0x63,0x6F,0x72, + 0x72,0x65,0x63,0x74,0x6C,0x79,0x20,0x77,0x68,0x65,0x6E,0x20, + 0x68,0x61,0x76,0x69,0x6E,0x67,0x3C,0x3E,0x40,0x58,0x30,0x33, + 0x35,0x68,0x69,0x67,0x68,0x65,0x72,0x20,0x61,0x75,0x64,0x69, + 0x6F,0x20,0x62,0x75,0x66,0x66,0x65,0x72,0x20,0x73,0x69,0x7A, + 0x65,0x73,0x20,0x28,0x62,0x75,0x66,0x66,0x65,0x72,0x65,0x64, + 0x20,0x72,0x65,0x70,0x6C,0x61,0x79,0x65,0x72,0x20,0x74,0x69, + 0x63,0x6B,0x73,0x29,0x2E,0x2E,0x2E,0x06,0x3E,0x40,0x58,0x30, + 0x32,0x30,0x30,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20, + 0x57,0x68,0x65,0x72,0x65,0x20,0x69,0x73,0x20,0x74,0x68,0x65, + 0x20,0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69, + 0x6F,0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x73,0x74,0x6F,0x72, + 0x65,0x64,0x3F,0x3F,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A, + 0x20,0x57,0x69,0x6E,0x64,0x6F,0x77,0x73,0x3A,0x20,0x5C,0x55, + 0x73,0x65,0x72,0x73,0x5C,0x55,0x53,0x45,0x52,0x5C,0x41,0x70, + 0x70,0x44,0x61,0x74,0x61,0x5C,0x52,0x6F,0x61,0x6D,0x69,0x6E, + 0x67,0x5C,0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x5C, + 0x46,0x54,0x32,0x2E,0x43,0x46,0x47,0x45,0x3E,0x40,0x58,0x30, + 0x33,0x35,0x4F,0x53,0x20,0x58,0x3A,0x20,0x2F,0x55,0x73,0x65, + 0x72,0x73,0x2F,0x55,0x53,0x45,0x52,0x2F,0x4C,0x69,0x62,0x72, + 0x61,0x72,0x79,0x2F,0x41,0x70,0x70,0x6C,0x69,0x63,0x61,0x74, + 0x69,0x6F,0x6E,0x20,0x53,0x75,0x70,0x70,0x6F,0x72,0x74,0x2F, + 0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46,0x54, + 0x32,0x2E,0x43,0x46,0x47,0x2F,0x47,0x4E,0x55,0x2F,0x4C,0x69, + 0x6E,0x75,0x78,0x3A,0x20,0x2F,0x68,0x6F,0x6D,0x65,0x2F,0x55, + 0x53,0x45,0x52,0x2F,0x2E,0x63,0x6F,0x6E,0x66,0x69,0x67,0x2F, + 0x46,0x54,0x32,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x2F,0x46,0x54, + 0x32,0x2E,0x43,0x46,0x47,0x01,0x3E,0x48,0x49,0x74,0x20,0x77, + 0x69,0x6C,0x6C,0x20,0x62,0x65,0x20,0x73,0x74,0x6F,0x72,0x65, + 0x64,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20,0x70,0x72,0x6F, + 0x67,0x72,0x61,0x6D,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F, + 0x72,0x79,0x20,0x69,0x66,0x20,0x74,0x68,0x65,0x20,0x70,0x61, + 0x74,0x68,0x20,0x63,0x6F,0x75,0x6C,0x64,0x6E,0x27,0x74,0x20, + 0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x2E,0x4D,0x49,0x66,0x20, + 0x79,0x6F,0x75,0x20,0x70,0x75,0x74,0x20,0x74,0x68,0x65,0x20, + 0x63,0x6F,0x6E,0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x69,0x6F, + 0x6E,0x20,0x66,0x69,0x6C,0x65,0x20,0x69,0x6E,0x20,0x74,0x68, + 0x65,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x64,0x69, + 0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x2C,0x20,0x69,0x74,0x20, + 0x77,0x69,0x6C,0x6C,0x20,0x72,0x65,0x61,0x64,0x20,0x74,0x68, + 0x61,0x74,0x4A,0x6F,0x6E,0x65,0x20,0x61,0x6E,0x64,0x20,0x6E, + 0x6F,0x74,0x20,0x61,0x74,0x74,0x65,0x6D,0x70,0x74,0x20,0x74, + 0x6F,0x20,0x63,0x72,0x65,0x61,0x74,0x65,0x20,0x63,0x6F,0x6E, + 0x66,0x69,0x67,0x20,0x64,0x69,0x72,0x73,0x20,0x66,0x6F,0x72, + 0x20,0x74,0x68,0x65,0x20,0x4F,0x53,0x20,0x75,0x73,0x65,0x72, + 0x2E,0x20,0x28,0x70,0x6F,0x72,0x74,0x61,0x62,0x6C,0x65,0x20, + 0x6D,0x6F,0x64,0x65,0x29,0x06,0x3E,0x40,0x58,0x30,0x32,0x30, + 0x42,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x43,0x61, + 0x6E,0x20,0x74,0x68,0x65,0x20,0x63,0x6C,0x6F,0x6E,0x65,0x20, + 0x72,0x65,0x61,0x64,0x20,0x46,0x54,0x32,0x2E,0x43,0x46,0x47, + 0x20,0x66,0x72,0x6F,0x6D,0x20,0x72,0x65,0x61,0x6C,0x20,0x46, + 0x54,0x32,0x2C,0x20,0x61,0x6E,0x64,0x20,0x76,0x69,0x63,0x65, + 0x20,0x76,0x65,0x72,0x73,0x61,0x3F,0x4C,0x3E,0x40,0x43,0x30, + 0x30,0x32,0x41,0x3A,0x20,0x59,0x65,0x73,0x2C,0x20,0x69,0x74, + 0x20,0x73,0x68,0x6F,0x75,0x6C,0x64,0x20,0x77,0x6F,0x72,0x6B, + 0x20,0x6A,0x75,0x73,0x74,0x20,0x66,0x69,0x6E,0x65,0x2E,0x20, + 0x50,0x75,0x74,0x20,0x69,0x74,0x20,0x69,0x6E,0x20,0x74,0x68, + 0x65,0x20,0x64,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x20, + 0x73,0x68,0x6F,0x77,0x6E,0x20,0x61,0x62,0x6F,0x76,0x65,0x2E, + 0x06,0x3E,0x40,0x58,0x30,0x32,0x30,0x52,0x3E,0x40,0x43,0x30, + 0x30,0x31,0x51,0x3A,0x20,0x53,0x6D,0x70,0x2E,0x20,0x45,0x64, + 0x2E,0x3A,0x20,0x57,0x68,0x69,0x6C,0x65,0x20,0x7A,0x6F,0x6F, + 0x6D,0x69,0x6E,0x67,0x20,0x69,0x6E,0x2C,0x20,0x49,0x20,0x73, + 0x6F,0x6D,0x65,0x74,0x69,0x6D,0x65,0x73,0x20,0x63,0x61,0x6E, + 0x27,0x74,0x20,0x6D,0x61,0x72,0x6B,0x20,0x74,0x68,0x65,0x20, + 0x6C,0x61,0x73,0x74,0x20,0x73,0x61,0x6D,0x70,0x6C,0x65,0x20, + 0x70,0x6F,0x69,0x6E,0x74,0x21,0x47,0x3E,0x40,0x43,0x30,0x30, + 0x32,0x41,0x3A,0x20,0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20, + 0x6E,0x6F,0x72,0x6D,0x61,0x6C,0x2E,0x20,0x54,0x68,0x69,0x73, + 0x20,0x69,0x73,0x20,0x61,0x20,0x6C,0x69,0x6D,0x69,0x74,0x61, + 0x74,0x69,0x6F,0x6E,0x20,0x69,0x6E,0x20,0x74,0x68,0x65,0x20, + 0x6E,0x61,0x74,0x75,0x72,0x65,0x20,0x6F,0x66,0x20,0x73,0x63, + 0x61,0x6C,0x69,0x6E,0x67,0x2E,0x06,0x3E,0x40,0x58,0x30,0x32, + 0x30,0x17,0x3E,0x40,0x43,0x30,0x30,0x31,0x51,0x3A,0x20,0x49, + 0x20,0x66,0x6F,0x75,0x6E,0x64,0x20,0x61,0x20,0x62,0x75,0x67, + 0x21,0x4C,0x3E,0x40,0x43,0x30,0x30,0x32,0x41,0x3A,0x20,0x50, + 0x6C,0x65,0x61,0x73,0x65,0x20,0x73,0x65,0x6E,0x64,0x20,0x6D, + 0x65,0x20,0x61,0x20,0x6D,0x61,0x69,0x6C,0x20,0x28,0x66,0x6F, + 0x75,0x6E,0x64,0x20,0x61,0x74,0x20,0x31,0x36,0x2D,0x62,0x69, + 0x74,0x73,0x2E,0x6F,0x72,0x67,0x29,0x20,0x61,0x6E,0x64,0x20, + 0x74,0x72,0x79,0x20,0x74,0x6F,0x20,0x65,0x78,0x70,0x6C,0x61, + 0x69,0x6E,0x20,0x69,0x74,0x2E,0x00,0x03,0x45,0x4E,0x44,0x4C, + 0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x4C,0x3B,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x0C,0x40,0x4C, + 0x4B,0x6E,0x6F,0x77,0x6E,0x20,0x62,0x75,0x67,0x73,0x06,0x3E, + 0x40,0x58,0x30,0x31,0x30,0x17,0x3E,0x40,0x43,0x30,0x30,0x31, + 0x4D,0x6F,0x75,0x73,0x65,0x20,0x2F,0x20,0x6B,0x65,0x79,0x62, + 0x6F,0x61,0x72,0x64,0x3A,0x01,0x3E,0x43,0x3E,0x40,0x43,0x30, + 0x30,0x32,0x2D,0x20,0x4C,0x69,0x6E,0x75,0x78,0x3A,0x20,0x54, + 0x68,0x65,0x20,0x6D,0x6F,0x75,0x73,0x65,0x20,0x63,0x75,0x72, + 0x73,0x6F,0x72,0x20,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73, + 0x20,0x63,0x61,0x6E,0x20,0x62,0x65,0x20,0x67,0x6C,0x69,0x74, + 0x63,0x68,0x79,0x20,0x61,0x74,0x20,0x74,0x69,0x6D,0x65,0x73, + 0x2E,0x2E,0x2E,0x06,0x3E,0x40,0x58,0x30,0x31,0x30,0x0C,0x3E, + 0x40,0x43,0x30,0x30,0x31,0x56,0x69,0x64,0x65,0x6F,0x3A,0x06, + 0x3E,0x40,0x43,0x30,0x30,0x32,0x50,0x3E,0x40,0x58,0x30,0x31, + 0x30,0x2D,0x20,0x46,0x75,0x6C,0x6C,0x73,0x63,0x72,0x65,0x65, + 0x6E,0x20,0x6D,0x6F,0x64,0x65,0x20,0x63,0x61,0x6E,0x20,0x62, + 0x65,0x20,0x75,0x6E,0x62,0x65,0x61,0x72,0x61,0x62,0x6C,0x79, + 0x20,0x73,0x6C,0x6F,0x77,0x20,0x6F,0x6E,0x20,0x61,0x20,0x52, + 0x61,0x73,0x70,0x62,0x65,0x72,0x72,0x79,0x20,0x50,0x69,0x20, + 0x28,0x65,0x76,0x65,0x6E,0x20,0x6F,0x6E,0x20,0x52,0x50,0x69, + 0x20,0x34,0x29,0x01,0x3E,0x4A,0x3E,0x40,0x58,0x30,0x31,0x30, + 0x2D,0x20,0x54,0x68,0x65,0x20,0x73,0x63,0x6F,0x70,0x65,0x73, + 0x20,0x63,0x61,0x6E,0x20,0x6D,0x69,0x6C,0x64,0x6C,0x79,0x20, + 0x66,0x6C,0x69,0x63,0x6B,0x65,0x72,0x20,0x64,0x65,0x70,0x65, + 0x6E,0x64,0x69,0x6E,0x67,0x20,0x6F,0x6E,0x20,0x74,0x68,0x65, + 0x20,0x77,0x61,0x76,0x65,0x66,0x6F,0x72,0x6D,0x20,0x61,0x6E, + 0x64,0x20,0x70,0x69,0x74,0x63,0x68,0x2E,0x4D,0x3E,0x40,0x58, + 0x30,0x32,0x31,0x54,0x68,0x69,0x73,0x20,0x69,0x73,0x20,0x62, + 0x65,0x63,0x61,0x75,0x73,0x65,0x20,0x74,0x68,0x65,0x69,0x72, + 0x20,0x66,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x79,0x20,0x69, + 0x73,0x20,0x6E,0x6F,0x74,0x20,0x63,0x6C,0x6F,0x63,0x6B,0x65, + 0x64,0x20,0x74,0x6F,0x20,0x65,0x78,0x61,0x63,0x74,0x6C,0x79, + 0x20,0x74,0x68,0x65,0x20,0x73,0x61,0x6D,0x65,0x20,0x72,0x61, + 0x74,0x65,0x4D,0x3E,0x61,0x74,0x20,0x77,0x68,0x69,0x63,0x68, + 0x20,0x74,0x68,0x65,0x20,0x73,0x63,0x6F,0x70,0x65,0x73,0x20, + 0x61,0x72,0x65,0x20,0x72,0x65,0x6E,0x64,0x65,0x72,0x65,0x64, + 0x2E,0x20,0x49,0x74,0x27,0x73,0x20,0x63,0x6C,0x6F,0x73,0x65, + 0x2C,0x20,0x77,0x68,0x69,0x63,0x68,0x20,0x63,0x61,0x75,0x73, + 0x65,0x73,0x20,0x61,0x20,0x66,0x6C,0x69,0x63,0x6B,0x65,0x72, + 0x20,0x65,0x66,0x66,0x65,0x63,0x74,0x2E,0x01,0x3E,0x52,0x3E, + 0x40,0x58,0x30,0x31,0x30,0x2D,0x20,0x4E,0x6F,0x74,0x20,0x61, + 0x20,0x62,0x75,0x67,0x2C,0x20,0x62,0x75,0x74,0x20,0x69,0x66, + 0x20,0x79,0x6F,0x75,0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F, + 0x72,0x27,0x73,0x20,0x72,0x65,0x66,0x72,0x65,0x73,0x68,0x20, + 0x72,0x61,0x74,0x65,0x20,0x69,0x73,0x20,0x6E,0x6F,0x74,0x20, + 0x73,0x65,0x74,0x20,0x74,0x6F,0x20,0x36,0x30,0x48,0x7A,0x20, + 0x28,0x6F,0x72,0x20,0x35,0x39,0x48,0x7A,0x29,0x4F,0x3E,0x40, + 0x58,0x30,0x32,0x31,0x79,0x6F,0x75,0x20,0x6D,0x61,0x79,0x20, + 0x65,0x78,0x70,0x65,0x72,0x69,0x65,0x6E,0x63,0x65,0x20,0x76, + 0x69,0x73,0x75,0x61,0x6C,0x20,0x73,0x74,0x75,0x74,0x74,0x65, + 0x72,0x69,0x6E,0x67,0x20,0x62,0x65,0x63,0x61,0x75,0x73,0x65, + 0x20,0x56,0x53,0x79,0x6E,0x63,0x20,0x77,0x69,0x6C,0x6C,0x20, + 0x6E,0x6F,0x74,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20, + 0x74,0x68,0x65,0x6E,0x2E,0x49,0x49,0x20,0x68,0x69,0x67,0x68, + 0x6C,0x79,0x20,0x72,0x65,0x63,0x6F,0x6D,0x6D,0x65,0x6E,0x64, + 0x20,0x72,0x75,0x6E,0x6E,0x69,0x6E,0x67,0x20,0x79,0x6F,0x75, + 0x72,0x20,0x6D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x20,0x61,0x74, + 0x20,0x36,0x30,0x48,0x7A,0x20,0x69,0x66,0x20,0x79,0x6F,0x75, + 0x27,0x72,0x65,0x20,0x61,0x20,0x68,0x61,0x72,0x64,0x63,0x6F, + 0x72,0x65,0x20,0x75,0x73,0x65,0x72,0x10,0x6F,0x66,0x20,0x74, + 0x68,0x69,0x73,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x2E, + 0x00,0x03,0x45,0x4E,0x44 }; #endif diff --git a/src/mixer/ft2_center_mix.c b/src/mixer/ft2_center_mix.c @@ -138,10 +138,10 @@ void centerMix8bBidiLoop(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -void centerMix8bNoLoopIntrp(voice_t *v, uint32_t numSamples) +void centerMix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples) { const int8_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; uint32_t i, samplesToMix, samplesLeft; uint64_t posFrac; @@ -158,19 +158,19 @@ void centerMix8bNoLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_CINTRP INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_CINTRP INC_POS - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_CINTRP INC_POS - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_CINTRP INC_POS - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_CINTRP INC_POS } @@ -180,10 +180,145 @@ void centerMix8bNoLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -void centerMix8bLoopIntrp(voice_t *v, uint32_t numSamples) +void centerMix8bLoopCIntrp(voice_t *v, uint32_t numSamples) { const int8_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL_MONO + GET_MIXER_VARS + SET_BASE8 + PREPARE_TAP_FIX8 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + samplesLeft -= samplesToMix; + + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_MONO_CINTRP + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_MONO_CINTRP + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP + INC_POS + } + } + + WRAP_LOOP + } + + SET_BACK_MIXER_POS +} + +void centerMix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int8_t *base, *revBase, *smpPtr; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac, tmpDelta; + + GET_VOL_MONO + GET_MIXER_VARS + SET_BASE8_BIDI + PREPARE_TAP_FIX8 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + samplesLeft -= samplesToMix; + + START_BIDI + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS_BIDI + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS_BIDI + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS_BIDI + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS_BIDI + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_MONO_CINTRP + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_MONO_CINTRP + INC_POS_BIDI + RENDER_8BIT_SMP_MONO_CINTRP + INC_POS_BIDI + RENDER_8BIT_SMP_MONO_CINTRP + INC_POS_BIDI + RENDER_8BIT_SMP_MONO_CINTRP + INC_POS_BIDI + } + } + + END_BIDI + + WRAP_BIDI_LOOP + } + + SET_BACK_MIXER_POS +} + +void centerMix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples) +{ + const int8_t *base, *smpPtr; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; uint32_t i, samplesToMix, samplesLeft; uint64_t posFrac; @@ -200,19 +335,61 @@ void centerMix8bLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP INC_POS - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP INC_POS - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP INC_POS - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP + INC_POS + } + + HANDLE_SAMPLE_END + } + + SET_BACK_MIXER_POS +} + +void centerMix8bLoopLIntrp(voice_t *v, uint32_t numSamples) +{ + const int8_t *base, *smpPtr; + float fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL_MONO + GET_MIXER_VARS + SET_BASE8 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + samplesLeft -= samplesToMix; + + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_MONO_LINTRP + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_MONO_LINTRP + INC_POS + RENDER_8BIT_SMP_MONO_LINTRP + INC_POS + RENDER_8BIT_SMP_MONO_LINTRP + INC_POS + RENDER_8BIT_SMP_MONO_LINTRP INC_POS } @@ -222,10 +399,10 @@ void centerMix8bLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -void centerMix8bBidiLoopIntrp(voice_t *v, uint32_t numSamples) +void centerMix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples) { const int8_t *base, *revBase, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; uint32_t i, samplesToMix, samplesLeft; uint64_t posFrac, tmpDelta; @@ -243,19 +420,19 @@ void centerMix8bBidiLoopIntrp(voice_t *v, uint32_t numSamples) START_BIDI for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP INC_POS_BIDI } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP INC_POS_BIDI - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP INC_POS_BIDI - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP INC_POS_BIDI - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP INC_POS_BIDI } END_BIDI @@ -418,10 +595,220 @@ void centerMix8bRampBidiLoop(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -void centerMix8bRampNoLoopIntrp(voice_t *v, uint32_t numSamples) +void centerMix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int8_t *base, *smpPtr; + float fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + float fVolLDelta, fVolL; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL_MONO_RAMP + GET_MIXER_VARS_MONO_RAMP + SET_BASE8 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + LIMIT_MIX_NUM_MONO_RAMP + samplesLeft -= samplesToMix; + + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + } + + HANDLE_SAMPLE_END + } + + SET_VOL_BACK_MONO + SET_BACK_MIXER_POS +} + +void centerMix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int8_t *base, *smpPtr; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + float fVolLDelta, fVolL; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL_MONO_RAMP + GET_MIXER_VARS_MONO_RAMP + SET_BASE8 + PREPARE_TAP_FIX8 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + LIMIT_MIX_NUM_MONO_RAMP + samplesLeft -= samplesToMix; + + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + } + } + + WRAP_LOOP + } + + SET_VOL_BACK_MONO + SET_BACK_MIXER_POS +} + +void centerMix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int8_t *base, *revBase, *smpPtr; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + float fVolLDelta, fVolL; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac, tmpDelta; + + GET_VOL_MONO_RAMP + GET_MIXER_VARS_MONO_RAMP + SET_BASE8_BIDI + PREPARE_TAP_FIX8 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + LIMIT_MIX_NUM_MONO_RAMP + samplesLeft -= samplesToMix; + + START_BIDI + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS_BIDI + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS_BIDI + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS_BIDI + RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS_BIDI + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS_BIDI + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS_BIDI + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS_BIDI + RENDER_8BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS_BIDI + } + } + END_BIDI + + WRAP_BIDI_LOOP + } + + SET_VOL_BACK_MONO + SET_BACK_MIXER_POS +} + +void centerMix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples) { const int8_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; float fVolLDelta, fVolL; uint32_t i, samplesToMix, samplesLeft; @@ -440,23 +827,23 @@ void centerMix8bRampNoLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS } @@ -468,10 +855,10 @@ void centerMix8bRampNoLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -void centerMix8bRampLoopIntrp(voice_t *v, uint32_t numSamples) +void centerMix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples) { const int8_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; float fVolLDelta, fVolL; uint32_t i, samplesToMix, samplesLeft; @@ -490,23 +877,23 @@ void centerMix8bRampLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS } @@ -518,10 +905,10 @@ void centerMix8bRampLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -void centerMix8bRampBidiLoopIntrp(voice_t *v, uint32_t numSamples) +void centerMix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples) { const int8_t *base, *revBase, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; float fVolLDelta, fVolL; uint32_t i, samplesToMix, samplesLeft; @@ -541,23 +928,23 @@ void centerMix8bRampBidiLoopIntrp(voice_t *v, uint32_t numSamples) START_BIDI for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS_BIDI } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS_BIDI - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS_BIDI - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS_BIDI - RENDER_8BIT_SMP_MONO_INTRP + RENDER_8BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS_BIDI } @@ -570,8 +957,6 @@ void centerMix8bRampBidiLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } - - /* ----------------------------------------------------------------------- */ /* 16-BIT CENTER MIXING ROUTINES */ /* ----------------------------------------------------------------------- */ @@ -704,10 +1089,10 @@ void centerMix16bBidiLoop(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -void centerMix16bNoLoopIntrp(voice_t *v, uint32_t numSamples) +void centerMix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples) { const int16_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; uint32_t i, samplesToMix, samplesLeft; uint64_t posFrac; @@ -724,19 +1109,19 @@ void centerMix16bNoLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_CINTRP INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_CINTRP INC_POS - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_CINTRP INC_POS - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_CINTRP INC_POS - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_CINTRP INC_POS } @@ -746,10 +1131,144 @@ void centerMix16bNoLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -void centerMix16bLoopIntrp(voice_t *v, uint32_t numSamples) +void centerMix16bLoopCIntrp(voice_t *v, uint32_t numSamples) { const int16_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL_MONO + GET_MIXER_VARS + SET_BASE16 + PREPARE_TAP_FIX16 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + samplesLeft -= samplesToMix; + + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_MONO_CINTRP + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_MONO_CINTRP + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP + INC_POS + } + } + + WRAP_LOOP + } + + SET_BACK_MIXER_POS +} + +void centerMix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int16_t *base, *revBase, *smpPtr; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac, tmpDelta; + + GET_VOL_MONO + GET_MIXER_VARS + SET_BASE16_BIDI + PREPARE_TAP_FIX16 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + samplesLeft -= samplesToMix; + + START_BIDI + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS_BIDI + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS_BIDI + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS_BIDI + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + INC_POS_BIDI + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_MONO_CINTRP + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_MONO_CINTRP + INC_POS_BIDI + RENDER_16BIT_SMP_MONO_CINTRP + INC_POS_BIDI + RENDER_16BIT_SMP_MONO_CINTRP + INC_POS_BIDI + RENDER_16BIT_SMP_MONO_CINTRP + INC_POS_BIDI + } + } + END_BIDI + + WRAP_BIDI_LOOP + } + + SET_BACK_MIXER_POS +} + +void centerMix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples) +{ + const int16_t *base, *smpPtr; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; uint32_t i, samplesToMix, samplesLeft; uint64_t posFrac; @@ -766,19 +1285,61 @@ void centerMix16bLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP INC_POS - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP INC_POS - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP INC_POS - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP + INC_POS + } + + HANDLE_SAMPLE_END + } + + SET_BACK_MIXER_POS +} + +void centerMix16bLoopLIntrp(voice_t *v, uint32_t numSamples) +{ + const int16_t *base, *smpPtr; + float fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL_MONO + GET_MIXER_VARS + SET_BASE16 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + samplesLeft -= samplesToMix; + + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_MONO_LINTRP + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_MONO_LINTRP + INC_POS + RENDER_16BIT_SMP_MONO_LINTRP + INC_POS + RENDER_16BIT_SMP_MONO_LINTRP + INC_POS + RENDER_16BIT_SMP_MONO_LINTRP INC_POS } @@ -788,10 +1349,10 @@ void centerMix16bLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -void centerMix16bBidiLoopIntrp(voice_t *v, uint32_t numSamples) +void centerMix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples) { const int16_t *base, *revBase, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; uint32_t i, samplesToMix, samplesLeft; uint64_t posFrac, tmpDelta; @@ -809,19 +1370,19 @@ void centerMix16bBidiLoopIntrp(voice_t *v, uint32_t numSamples) START_BIDI for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP INC_POS_BIDI } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP INC_POS_BIDI - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP INC_POS_BIDI - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP INC_POS_BIDI - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP INC_POS_BIDI } END_BIDI @@ -832,6 +1393,7 @@ void centerMix16bBidiLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } + void centerMix16bRampNoLoop(voice_t *v, uint32_t numSamples) { const int16_t *base, *smpPtr; @@ -984,10 +1546,220 @@ void centerMix16bRampBidiLoop(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -void centerMix16bRampNoLoopIntrp(voice_t *v, uint32_t numSamples) +void centerMix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int16_t *base, *smpPtr; + float fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + float fVolLDelta, fVolL; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL_MONO_RAMP + GET_MIXER_VARS_MONO_RAMP + SET_BASE16 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + LIMIT_MIX_NUM_MONO_RAMP + samplesLeft -= samplesToMix; + + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + } + + HANDLE_SAMPLE_END + } + + SET_VOL_BACK_MONO + SET_BACK_MIXER_POS +} + +void centerMix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int16_t *base, *smpPtr; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + float fVolLDelta, fVolL; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL_MONO_RAMP + GET_MIXER_VARS_MONO_RAMP + SET_BASE16 + PREPARE_TAP_FIX16 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + LIMIT_MIX_NUM_MONO_RAMP + samplesLeft -= samplesToMix; + + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS + } + } + + WRAP_LOOP + } + + SET_VOL_BACK_MONO + SET_BACK_MIXER_POS +} + +void centerMix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int16_t *base, *revBase, *smpPtr; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + float fVolLDelta, fVolL; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac, tmpDelta; + + GET_VOL_MONO_RAMP + GET_MIXER_VARS_MONO_RAMP + SET_BASE16_BIDI + PREPARE_TAP_FIX16 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + LIMIT_MIX_NUM_MONO_RAMP + samplesLeft -= samplesToMix; + + START_BIDI + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS_BIDI + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS_BIDI + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS_BIDI + RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX + VOLUME_RAMPING_MONO + INC_POS_BIDI + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS_BIDI + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS_BIDI + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS_BIDI + RENDER_16BIT_SMP_MONO_CINTRP + VOLUME_RAMPING_MONO + INC_POS_BIDI + } + } + END_BIDI + + WRAP_BIDI_LOOP + } + + SET_VOL_BACK_MONO + SET_BACK_MIXER_POS +} + +void centerMix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples) { const int16_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; float fVolLDelta, fVolL; uint32_t i, samplesToMix, samplesLeft; @@ -1006,23 +1778,23 @@ void centerMix16bRampNoLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS } @@ -1034,10 +1806,10 @@ void centerMix16bRampNoLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -void centerMix16bRampLoopIntrp(voice_t *v, uint32_t numSamples) +void centerMix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples) { const int16_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; float fVolLDelta, fVolL; uint32_t i, samplesToMix, samplesLeft; @@ -1056,23 +1828,23 @@ void centerMix16bRampLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS } @@ -1084,10 +1856,10 @@ void centerMix16bRampLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -void centerMix16bRampBidiLoopIntrp(voice_t *v, uint32_t numSamples) +void centerMix16bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples) { const int16_t *base, *revBase, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; float fVolLDelta, fVolL; uint32_t i, samplesToMix, samplesLeft; @@ -1107,23 +1879,23 @@ void centerMix16bRampBidiLoopIntrp(voice_t *v, uint32_t numSamples) START_BIDI for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS_BIDI } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS_BIDI - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS_BIDI - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS_BIDI - RENDER_16BIT_SMP_MONO_INTRP + RENDER_16BIT_SMP_MONO_LINTRP VOLUME_RAMPING_MONO INC_POS_BIDI } diff --git a/src/mixer/ft2_center_mix.h b/src/mixer/ft2_center_mix.h @@ -3,27 +3,50 @@ #include <stdint.h> #include "../ft2_audio.h" +// no volume ramping + +// 8-bit void centerMix8bNoLoop(voice_t *v, uint32_t numSamples); void centerMix8bLoop(voice_t *v, uint32_t numSamples); void centerMix8bBidiLoop(voice_t *v, uint32_t numSamples); -void centerMix8bNoLoopIntrp(voice_t *v, uint32_t numSamples); -void centerMix8bLoopIntrp(voice_t *v, uint32_t numSamples); -void centerMix8bBidiLoopIntrp(voice_t *v, uint32_t numSamples); +void centerMix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples); +void centerMix8bLoopCIntrp(voice_t *v, uint32_t numSamples); +void centerMix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples); +void centerMix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples); +void centerMix8bLoopLIntrp(voice_t *v, uint32_t numSamples); +void centerMix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples); + +// 16-bit void centerMix16bNoLoop(voice_t *v, uint32_t numSamples); void centerMix16bLoop(voice_t *v, uint32_t numSamples); void centerMix16bBidiLoop(voice_t *v, uint32_t numSamples); -void centerMix16bNoLoopIntrp(voice_t *v, uint32_t numSamples); -void centerMix16bLoopIntrp(voice_t *v, uint32_t numSamples); -void centerMix16bBidiLoopIntrp(voice_t *v, uint32_t numSamples); +void centerMix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples); +void centerMix16bLoopCIntrp(voice_t *v, uint32_t numSamples); +void centerMix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples); +void centerMix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples); +void centerMix16bLoopLIntrp(voice_t *v, uint32_t numSamples); +void centerMix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples); + +// volume ramping + +// 8-bit void centerMix8bRampNoLoop(voice_t *v, uint32_t numSamples); void centerMix8bRampLoop(voice_t *v, uint32_t numSamples); void centerMix8bRampBidiLoop(voice_t *v, uint32_t numSamples); -void centerMix8bRampNoLoopIntrp(voice_t *v, uint32_t numSamples); -void centerMix8bRampLoopIntrp(voice_t *v, uint32_t numSamples); -void centerMix8bRampBidiLoopIntrp(voice_t *v, uint32_t numSamples); +void centerMix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples); +void centerMix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples); +void centerMix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples); +void centerMix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples); +void centerMix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples); +void centerMix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples); + +// 16bit void centerMix16bRampNoLoop(voice_t *v, uint32_t numSamples); void centerMix16bRampLoop(voice_t *v, uint32_t numSamples); void centerMix16bRampBidiLoop(voice_t *v, uint32_t numSamples); -void centerMix16bRampNoLoopIntrp(voice_t *v, uint32_t numSamples); -void centerMix16bRampLoopIntrp(voice_t *v, uint32_t numSamples); -void centerMix16bRampBidiLoopIntrp(voice_t *v, uint32_t numSamples); +void centerMix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples); +void centerMix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples); +void centerMix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples); +void centerMix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples); +void centerMix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples); +void centerMix16bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples); diff --git a/src/mixer/ft2_cubic.c b/src/mixer/ft2_cubic.c @@ -1,59 +0,0 @@ -#include <stdint.h> -#include <stdbool.h> -#include <stdlib.h> -#include "ft2_cubic.h" - -float *fCubicLUT8 = NULL; -float *fCubicLUT16 = NULL; - -/* 4-tap cubic spline interpolation (Horner's method) -** -** This simplified LUT formula has been used in several trackers, but -** I think it originates from ModPlug Tracker (not sure about this). -*/ - -static void calcCubicLUT(float *fLUTPtr, const double dSale) -{ - for (int32_t i = 0; i < CUBIC_PHASES; i++) - { - const double x = i * (1.0 / CUBIC_PHASES); - const double x2 = x * x; // x^2 - const double x3 = x2 * x; // x^3 - - *fLUTPtr++ = (float)((-0.5 * x3 + 1.0 * x2 - 0.5 * x) * dSale); - *fLUTPtr++ = (float)(( 1.5 * x3 - 2.5 * x2 + 1.0) * dSale); - *fLUTPtr++ = (float)((-1.5 * x3 + 2.0 * x2 + 0.5 * x) * dSale); - *fLUTPtr++ = (float)(( 0.5 * x3 - 0.5 * x2) * dSale); - } -} - -bool calcCubicTable(void) -{ - fCubicLUT8 = (float *)malloc(CUBIC_LUT_LEN * sizeof (float)); - if (fCubicLUT8 == NULL) - return false; - - fCubicLUT16 = (float *)malloc(CUBIC_LUT_LEN * sizeof (float)); - if (fCubicLUT16 == NULL) - return false; - - calcCubicLUT(fCubicLUT8, 1.0 / 128.0); // for 8-bit samples - calcCubicLUT(fCubicLUT16, 1.0 / 32768.0); // for 16-bit samples - - return true; -} - -void freeCubicTable(void) -{ - if (fCubicLUT8 != NULL) - { - free(fCubicLUT8); - fCubicLUT8 = NULL; - } - - if (fCubicLUT16 != NULL) - { - free(fCubicLUT16); - fCubicLUT16 = NULL; - } -} diff --git a/src/mixer/ft2_cubic.h b/src/mixer/ft2_cubic.h @@ -1,22 +0,0 @@ -#pragma once - -#include <stdbool.h> -#include "../ft2_audio.h" // MIXER_FRAC_BITS definition - -// if you change this, also change CUBIC_PHASES_BITS -#define CUBIC_PHASES 4096 -#define CUBIC_PHASES_BITS 12 /* log2(CUBIC_PHASES) */ - -// don't change these! - -#define CUBIC_WIDTH 4 -#define CUBIC_WIDTH_BITS 2 -#define CUBIC_LUT_LEN (CUBIC_WIDTH * CUBIC_PHASES) -#define CUBIC_FSHIFT (MIXER_FRAC_BITS-(CUBIC_PHASES_BITS+CUBIC_WIDTH_BITS)) -#define CUBIC_FMASK ((CUBIC_WIDTH*CUBIC_PHASES)-CUBIC_WIDTH) - -extern float *fCubicLUT8; -extern float *fCubicLUT16; - -bool calcCubicTable(void); -void freeCubicTable(void); diff --git a/src/mixer/ft2_cubicspline.c b/src/mixer/ft2_cubicspline.c @@ -0,0 +1,59 @@ +#include <stdint.h> +#include <stdbool.h> +#include <stdlib.h> +#include "ft2_cubicspline.h" + +float *fCubicSplineLUT8 = NULL; +float *fCubicSplineLUT16 = NULL; + +/* 4-tap cubic spline interpolation (Horner's method) +** +** This simplified LUT formula has been used in several trackers, but +** I think it originates from ModPlug Tracker (not sure about this). +*/ + +static void calcCubicLUT(float *fLUTPtr, const double dSale) +{ + for (int32_t i = 0; i < CUBIC_PHASES; i++) + { + const double x = i * (1.0 / CUBIC_PHASES); + const double x2 = x * x; // x^2 + const double x3 = x2 * x; // x^3 + + *fLUTPtr++ = (float)((-0.5 * x3 + 1.0 * x2 - 0.5 * x) * dSale); + *fLUTPtr++ = (float)(( 1.5 * x3 - 2.5 * x2 + 1.0) * dSale); + *fLUTPtr++ = (float)((-1.5 * x3 + 2.0 * x2 + 0.5 * x) * dSale); + *fLUTPtr++ = (float)(( 0.5 * x3 - 0.5 * x2) * dSale); + } +} + +bool calcCubicTable(void) +{ + fCubicSplineLUT8 = (float *)malloc(CUBIC_LUT_LEN * sizeof (float)); + if (fCubicSplineLUT8 == NULL) + return false; + + fCubicSplineLUT16 = (float *)malloc(CUBIC_LUT_LEN * sizeof (float)); + if (fCubicSplineLUT16 == NULL) + return false; + + calcCubicLUT(fCubicSplineLUT8, 1.0 / 128.0); // for 8-bit samples + calcCubicLUT(fCubicSplineLUT16, 1.0 / 32768.0); // for 16-bit samples + + return true; +} + +void freeCubicTable(void) +{ + if (fCubicSplineLUT8 != NULL) + { + free(fCubicSplineLUT8); + fCubicSplineLUT8 = NULL; + } + + if (fCubicSplineLUT16 != NULL) + { + free(fCubicSplineLUT16); + fCubicSplineLUT16 = NULL; + } +} diff --git a/src/mixer/ft2_cubicspline.h b/src/mixer/ft2_cubicspline.h @@ -0,0 +1,22 @@ +#pragma once + +#include <stdbool.h> +#include "../ft2_audio.h" // MIXER_FRAC_BITS definition + +// if you change this, also change CUBIC_PHASES_BITS +#define CUBIC_PHASES 4096 +#define CUBIC_PHASES_BITS 12 /* log2(CUBIC_PHASES) */ + +// don't change these! + +#define CUBIC_WIDTH 4 +#define CUBIC_WIDTH_BITS 2 +#define CUBIC_LUT_LEN (CUBIC_WIDTH * CUBIC_PHASES) +#define CUBIC_FSHIFT (MIXER_FRAC_BITS-(CUBIC_PHASES_BITS+CUBIC_WIDTH_BITS)) +#define CUBIC_FMASK ((CUBIC_WIDTH*CUBIC_PHASES)-CUBIC_WIDTH) + +extern float *fCubicSplineLUT8; +extern float *fCubicSplineLUT16; + +bool calcCubicTable(void); +void freeCubicTable(void); diff --git a/src/mixer/ft2_mix.c b/src/mixer/ft2_mix.c @@ -9,14 +9,14 @@ ** (Note: Mixing macros can be found in ft2_mix_macros.h) ** ** Specifications: -** - Fast 4-tap cubic interpolation through 32-bit float LUT (optional) -** - Linear volume ramping, matching FT2 (optional) -** - 32.32 fixed-point logic for position delta -** - 32-bit float logic for volumes/amplitudes +** - Either no interpolation, 2-tap linear interpolation (FT2) or 4-tap cubic interpolation +** - Linear volume ramping, matching FT2 (can be turned off) +** - 32.32 fixed-point logic for resampling delta +** - 32-bit single-precision float logic for mixing and interpolation ** ** This file has separate routines for EVERY possible sampling variation: -** Interpolation on/off, volumeramp on/off, 8-bit, 16-bit, no loop, loop, bidi. -** (24 mixing routines in total + another 24 for center-mixing) +** Interpolation none/cubic/linear, volumeramp on/off, 8-bit, 16-bit, no loop, loop, bidi. +** (36 mixing routines in total + another 36 for center-mixing) ** ** Every voice has a function pointer set to the according mixing routine on ** sample trigger (from replayer, but set in audio thread), using a function @@ -24,13 +24,6 @@ ** when changing any of the above attributes from the GUI, to prevent possible ** thread-related issues. ** -** There's one problem with the 4-tap cubic spline resampling interpolation... -** On looped samples where loopStart>0, the splines are not correct when reading -** from the loopStart (or +1?) sample point. The difference in audio is very -** minor, so it's not a big problem. It just has to stay like this the way the -** mixer works. In cases where loopStart=0, the sample before index 0 (yes, we -** allocate enough data and pre-increment main pointer to support negative -** look-up), is already pre-fixed so that the splines will be correct. ** ----------------------------------------------------------------------------- */ @@ -165,10 +158,10 @@ static void mix8bBidiLoop(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -static void mix8bNoLoopIntrp(voice_t *v, uint32_t numSamples) +static void mix8bNoLoopCIntrp(voice_t *v, uint32_t numSamples) { const int8_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; uint32_t i, samplesToMix, samplesLeft; uint64_t posFrac; @@ -185,19 +178,19 @@ static void mix8bNoLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_CINTRP INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_CINTRP INC_POS - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_CINTRP INC_POS - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_CINTRP INC_POS - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_CINTRP INC_POS } @@ -207,10 +200,186 @@ static void mix8bNoLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -static void mix8bLoopIntrp(voice_t *v, uint32_t numSamples) +static void mix8bLoopCIntrp(voice_t *v, uint32_t numSamples) { const int8_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL + GET_MIXER_VARS + SET_BASE8 + PREPARE_TAP_FIX8 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + samplesLeft -= samplesToMix; + + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_CINTRP_TAP_FIX + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_CINTRP_TAP_FIX + INC_POS + RENDER_8BIT_SMP_CINTRP_TAP_FIX + INC_POS + RENDER_8BIT_SMP_CINTRP_TAP_FIX + INC_POS + RENDER_8BIT_SMP_CINTRP_TAP_FIX + INC_POS + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_CINTRP + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_CINTRP + INC_POS + RENDER_8BIT_SMP_CINTRP + INC_POS + RENDER_8BIT_SMP_CINTRP + INC_POS + RENDER_8BIT_SMP_CINTRP + INC_POS + } + } + + WRAP_LOOP + } + + SET_BACK_MIXER_POS +} + +static void mix8bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int8_t *base, *revBase, *smpPtr; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac, tmpDelta; + + GET_VOL + GET_MIXER_VARS + SET_BASE8_BIDI + PREPARE_TAP_FIX8 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + samplesLeft -= samplesToMix; + + START_BIDI + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_CINTRP_TAP_FIX + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_CINTRP_TAP_FIX + INC_POS_BIDI + RENDER_8BIT_SMP_CINTRP_TAP_FIX + INC_POS_BIDI + RENDER_8BIT_SMP_CINTRP_TAP_FIX + INC_POS_BIDI + RENDER_8BIT_SMP_CINTRP_TAP_FIX + INC_POS_BIDI + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_CINTRP + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_CINTRP + INC_POS_BIDI + RENDER_8BIT_SMP_CINTRP + INC_POS_BIDI + RENDER_8BIT_SMP_CINTRP + INC_POS_BIDI + RENDER_8BIT_SMP_CINTRP + INC_POS_BIDI + } + } + END_BIDI + + WRAP_BIDI_LOOP + } + + SET_BACK_MIXER_POS +} + +static void mix8bNoLoopLIntrp(voice_t *v, uint32_t numSamples) +{ + const int8_t *base, *smpPtr; + float fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL + GET_MIXER_VARS + SET_BASE8 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + samplesLeft -= samplesToMix; + + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_LINTRP + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_LINTRP + INC_POS + RENDER_8BIT_SMP_LINTRP + INC_POS + RENDER_8BIT_SMP_LINTRP + INC_POS + RENDER_8BIT_SMP_LINTRP + INC_POS + } + + HANDLE_SAMPLE_END + } + + SET_BACK_MIXER_POS +} + +static void mix8bLoopLIntrp(voice_t *v, uint32_t numSamples) +{ + const int8_t *base, *smpPtr; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; uint32_t i, samplesToMix, samplesLeft; uint64_t posFrac; @@ -227,19 +396,19 @@ static void mix8bLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP INC_POS - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP INC_POS - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP INC_POS - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP INC_POS } @@ -249,10 +418,10 @@ static void mix8bLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -static void mix8bBidiLoopIntrp(voice_t *v, uint32_t numSamples) +static void mix8bBidiLoopLIntrp(voice_t *v, uint32_t numSamples) { const int8_t *base, *revBase, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; uint32_t i, samplesToMix, samplesLeft; uint64_t posFrac, tmpDelta; @@ -270,19 +439,19 @@ static void mix8bBidiLoopIntrp(voice_t *v, uint32_t numSamples) START_BIDI for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP INC_POS_BIDI } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP INC_POS_BIDI - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP INC_POS_BIDI - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP INC_POS_BIDI - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP INC_POS_BIDI } END_BIDI @@ -445,10 +614,10 @@ static void mix8bRampBidiLoop(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -static void mix8bRampNoLoopIntrp(voice_t *v, uint32_t numSamples) +static void mix8bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) { const int8_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; float fVolLDelta, fVolRDelta, fVolL, fVolR; uint32_t i, samplesToMix, samplesLeft; @@ -467,23 +636,23 @@ static void mix8bRampNoLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_CINTRP VOLUME_RAMPING INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_CINTRP VOLUME_RAMPING INC_POS - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_CINTRP VOLUME_RAMPING INC_POS - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_CINTRP VOLUME_RAMPING INC_POS - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_CINTRP VOLUME_RAMPING INC_POS } @@ -495,10 +664,220 @@ static void mix8bRampNoLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -static void mix8bRampLoopIntrp(voice_t *v, uint32_t numSamples) +static void mix8bRampLoopCIntrp(voice_t *v, uint32_t numSamples) { const int8_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + float fVolLDelta, fVolRDelta, fVolL, fVolR; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL_RAMP + GET_MIXER_VARS_RAMP + SET_BASE8 + PREPARE_TAP_FIX8 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + LIMIT_MIX_NUM_RAMP + samplesLeft -= samplesToMix; + + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS + RENDER_8BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS + RENDER_8BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS + RENDER_8BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + RENDER_8BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + RENDER_8BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + RENDER_8BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + } + } + + WRAP_LOOP + } + + SET_VOL_BACK + SET_BACK_MIXER_POS +} + +static void mix8bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int8_t *base, *revBase, *smpPtr; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + float fVolLDelta, fVolRDelta, fVolL, fVolR; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac, tmpDelta; + + GET_VOL_RAMP + GET_MIXER_VARS_RAMP + SET_BASE8_BIDI + PREPARE_TAP_FIX8 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + LIMIT_MIX_NUM_RAMP + samplesLeft -= samplesToMix; + + START_BIDI + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS_BIDI + RENDER_8BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS_BIDI + RENDER_8BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS_BIDI + RENDER_8BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS_BIDI + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS_BIDI + RENDER_8BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS_BIDI + RENDER_8BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS_BIDI + RENDER_8BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS_BIDI + } + } + END_BIDI + + WRAP_BIDI_LOOP + } + + SET_VOL_BACK + SET_BACK_MIXER_POS +} + +static void mix8bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples) +{ + const int8_t *base, *smpPtr; + float fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + float fVolLDelta, fVolRDelta, fVolL, fVolR; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL_RAMP + GET_MIXER_VARS_RAMP + SET_BASE8 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + LIMIT_MIX_NUM_RAMP + samplesLeft -= samplesToMix; + + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_8BIT_SMP_LINTRP + VOLUME_RAMPING + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_8BIT_SMP_LINTRP + VOLUME_RAMPING + INC_POS + RENDER_8BIT_SMP_LINTRP + VOLUME_RAMPING + INC_POS + RENDER_8BIT_SMP_LINTRP + VOLUME_RAMPING + INC_POS + RENDER_8BIT_SMP_LINTRP + VOLUME_RAMPING + INC_POS + } + + HANDLE_SAMPLE_END + } + + SET_VOL_BACK + SET_BACK_MIXER_POS +} + +static void mix8bRampLoopLIntrp(voice_t *v, uint32_t numSamples) +{ + const int8_t *base, *smpPtr; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; float fVolLDelta, fVolRDelta, fVolL, fVolR; uint32_t i, samplesToMix, samplesLeft; @@ -517,23 +896,23 @@ static void mix8bRampLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP VOLUME_RAMPING INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP VOLUME_RAMPING INC_POS - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP VOLUME_RAMPING INC_POS - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP VOLUME_RAMPING INC_POS - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP VOLUME_RAMPING INC_POS } @@ -545,10 +924,10 @@ static void mix8bRampLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -static void mix8bRampBidiLoopIntrp(voice_t *v, uint32_t numSamples) +static void mix8bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples) { const int8_t *base, *revBase, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; float fVolLDelta, fVolRDelta, fVolL, fVolR; uint32_t i, samplesToMix, samplesLeft; @@ -568,23 +947,23 @@ static void mix8bRampBidiLoopIntrp(voice_t *v, uint32_t numSamples) START_BIDI for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP VOLUME_RAMPING INC_POS_BIDI } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP VOLUME_RAMPING INC_POS_BIDI - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP VOLUME_RAMPING INC_POS_BIDI - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP VOLUME_RAMPING INC_POS_BIDI - RENDER_8BIT_SMP_INTRP + RENDER_8BIT_SMP_LINTRP VOLUME_RAMPING INC_POS_BIDI } @@ -597,8 +976,6 @@ static void mix8bRampBidiLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } - - /* ----------------------------------------------------------------------- */ /* 16-BIT MIXING ROUTINES */ /* ----------------------------------------------------------------------- */ @@ -731,10 +1108,10 @@ static void mix16bBidiLoop(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -static void mix16bNoLoopIntrp(voice_t *v, uint32_t numSamples) +static void mix16bNoLoopCIntrp(voice_t *v, uint32_t numSamples) { const int16_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; uint32_t i, samplesToMix, samplesLeft; uint64_t posFrac; @@ -751,19 +1128,19 @@ static void mix16bNoLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_CINTRP INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_CINTRP INC_POS - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_CINTRP INC_POS - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_CINTRP INC_POS - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_CINTRP INC_POS } @@ -773,10 +1150,186 @@ static void mix16bNoLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -static void mix16bLoopIntrp(voice_t *v, uint32_t numSamples) +static void mix16bLoopCIntrp(voice_t *v, uint32_t numSamples) { const int16_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL + GET_MIXER_VARS + SET_BASE16 + PREPARE_TAP_FIX16 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + samplesLeft -= samplesToMix; + + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_CINTRP_TAP_FIX + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_CINTRP_TAP_FIX + INC_POS + RENDER_16BIT_SMP_CINTRP_TAP_FIX + INC_POS + RENDER_16BIT_SMP_CINTRP_TAP_FIX + INC_POS + RENDER_16BIT_SMP_CINTRP_TAP_FIX + INC_POS + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_CINTRP + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_CINTRP + INC_POS + RENDER_16BIT_SMP_CINTRP + INC_POS + RENDER_16BIT_SMP_CINTRP + INC_POS + RENDER_16BIT_SMP_CINTRP + INC_POS + } + } + + WRAP_LOOP + } + + SET_BACK_MIXER_POS +} + +static void mix16bBidiLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int16_t *base, *revBase, *smpPtr; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac, tmpDelta; + + GET_VOL + GET_MIXER_VARS + SET_BASE16_BIDI + PREPARE_TAP_FIX16 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + samplesLeft -= samplesToMix; + + START_BIDI + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_CINTRP_TAP_FIX + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_CINTRP_TAP_FIX + INC_POS_BIDI + RENDER_16BIT_SMP_CINTRP_TAP_FIX + INC_POS_BIDI + RENDER_16BIT_SMP_CINTRP_TAP_FIX + INC_POS_BIDI + RENDER_16BIT_SMP_CINTRP_TAP_FIX + INC_POS_BIDI + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_CINTRP + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_CINTRP + INC_POS_BIDI + RENDER_16BIT_SMP_CINTRP + INC_POS_BIDI + RENDER_16BIT_SMP_CINTRP + INC_POS_BIDI + RENDER_16BIT_SMP_CINTRP + INC_POS_BIDI + } + } + END_BIDI + + WRAP_BIDI_LOOP + } + + SET_BACK_MIXER_POS +} + +static void mix16bNoLoopLIntrp(voice_t *v, uint32_t numSamples) +{ + const int16_t *base, *smpPtr; + float fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL + GET_MIXER_VARS + SET_BASE16 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + samplesLeft -= samplesToMix; + + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_LINTRP + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_LINTRP + INC_POS + RENDER_16BIT_SMP_LINTRP + INC_POS + RENDER_16BIT_SMP_LINTRP + INC_POS + RENDER_16BIT_SMP_LINTRP + INC_POS + } + + HANDLE_SAMPLE_END + } + + SET_BACK_MIXER_POS +} + +static void mix16bLoopLIntrp(voice_t *v, uint32_t numSamples) +{ + const int16_t *base, *smpPtr; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; uint32_t i, samplesToMix, samplesLeft; uint64_t posFrac; @@ -793,19 +1346,19 @@ static void mix16bLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP INC_POS - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP INC_POS - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP INC_POS - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP INC_POS } @@ -815,10 +1368,10 @@ static void mix16bLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -static void mix16bBidiLoopIntrp(voice_t *v, uint32_t numSamples) +static void mix16bBidiLoopLIntrp(voice_t *v, uint32_t numSamples) { const int16_t *base, *revBase, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; uint32_t i, samplesToMix, samplesLeft; uint64_t posFrac, tmpDelta; @@ -836,19 +1389,19 @@ static void mix16bBidiLoopIntrp(voice_t *v, uint32_t numSamples) START_BIDI for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP INC_POS_BIDI } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP INC_POS_BIDI - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP INC_POS_BIDI - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP INC_POS_BIDI - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP INC_POS_BIDI } END_BIDI @@ -1011,10 +1564,220 @@ static void mix16bRampBidiLoop(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -static void mix16bRampNoLoopIntrp(voice_t *v, uint32_t numSamples) +static void mix16bRampNoLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int16_t *base, *smpPtr; + float fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + float fVolLDelta, fVolRDelta, fVolL, fVolR; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL_RAMP + GET_MIXER_VARS_RAMP + SET_BASE16 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + LIMIT_MIX_NUM_RAMP + samplesLeft -= samplesToMix; + + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + } + + HANDLE_SAMPLE_END + } + + SET_VOL_BACK + SET_BACK_MIXER_POS +} + +static void mix16bRampLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int16_t *base, *smpPtr; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + float fVolLDelta, fVolRDelta, fVolL, fVolR; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac; + + GET_VOL_RAMP + GET_MIXER_VARS_RAMP + SET_BASE16 + PREPARE_TAP_FIX16 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + LIMIT_MIX_NUM_RAMP + samplesLeft -= samplesToMix; + + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS + RENDER_16BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS + RENDER_16BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS + RENDER_16BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS + } + } + + WRAP_LOOP + } + + SET_VOL_BACK + SET_BACK_MIXER_POS +} + +static void mix16bRampBidiLoopCIntrp(voice_t *v, uint32_t numSamples) +{ + const int16_t *base, *revBase, *smpPtr; + float s0, s1, s2, s3, fSample, *fMixBufferL, *fMixBufferR; + int32_t pos; + float fVolLDelta, fVolRDelta, fVolL, fVolR; + uint32_t i, samplesToMix, samplesLeft; + uint64_t posFrac, tmpDelta; + + GET_VOL_RAMP + GET_MIXER_VARS_RAMP + SET_BASE16_BIDI + PREPARE_TAP_FIX16 + + samplesLeft = numSamples; + while (samplesLeft > 0) + { + LIMIT_MIX_NUM + LIMIT_MIX_NUM_RAMP + samplesLeft -= samplesToMix; + + START_BIDI + if (v->hasLooped) // the interpolation's -1 tap needs a special case from now on + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS_BIDI + RENDER_16BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS_BIDI + RENDER_16BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS_BIDI + RENDER_16BIT_SMP_CINTRP_TAP_FIX + VOLUME_RAMPING + INC_POS_BIDI + } + } + else + { + for (i = 0; i < (samplesToMix & 3); i++) + { + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS_BIDI + } + samplesToMix >>= 2; + for (i = 0; i < samplesToMix; i++) + { + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS_BIDI + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS_BIDI + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS_BIDI + RENDER_16BIT_SMP_CINTRP + VOLUME_RAMPING + INC_POS_BIDI + } + } + END_BIDI + + WRAP_BIDI_LOOP + } + + SET_VOL_BACK + SET_BACK_MIXER_POS +} + +static void mix16bRampNoLoopLIntrp(voice_t *v, uint32_t numSamples) { const int16_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; float fVolLDelta, fVolRDelta, fVolL, fVolR; uint32_t i, samplesToMix, samplesLeft; @@ -1033,23 +1796,23 @@ static void mix16bRampNoLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS } @@ -1061,10 +1824,10 @@ static void mix16bRampNoLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -static void mix16bRampLoopIntrp(voice_t *v, uint32_t numSamples) +static void mix16bRampLoopLIntrp(voice_t *v, uint32_t numSamples) { const int16_t *base, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; float fVolLDelta, fVolRDelta, fVolL, fVolR; uint32_t i, samplesToMix, samplesLeft; @@ -1083,23 +1846,23 @@ static void mix16bRampLoopIntrp(voice_t *v, uint32_t numSamples) for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS } @@ -1111,10 +1874,10 @@ static void mix16bRampLoopIntrp(voice_t *v, uint32_t numSamples) SET_BACK_MIXER_POS } -static void mix16bRampBidiLoopIntrp(voice_t *v, uint32_t numSamples) +static void mix16bRampBidiLoopLIntrp(voice_t *v, uint32_t numSamples) { const int16_t *base, *revBase, *smpPtr; - float fSample, fSample2, fSample3, fSample4, *fMixBufferL, *fMixBufferR; + float fSample, *fMixBufferL, *fMixBufferR; int32_t pos; float fVolLDelta, fVolRDelta, fVolL, fVolR; uint32_t i, samplesToMix, samplesLeft; @@ -1134,23 +1897,23 @@ static void mix16bRampBidiLoopIntrp(voice_t *v, uint32_t numSamples) START_BIDI for (i = 0; i < (samplesToMix & 3); i++) { - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS_BIDI } samplesToMix >>= 2; for (i = 0; i < samplesToMix; i++) { - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS_BIDI - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS_BIDI - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS_BIDI - RENDER_16BIT_SMP_INTRP + RENDER_16BIT_SMP_LINTRP VOLUME_RAMPING INC_POS_BIDI } @@ -1165,57 +1928,113 @@ static void mix16bRampBidiLoopIntrp(voice_t *v, uint32_t numSamples) // ----------------------------------------------------------------------- -const mixFunc mixFuncTab[48] = +const mixFunc mixFuncTab[72] = { - // normal mixing (this file) + /* + ** --------------------------------- + ** stereo mixing (this file) + ** --------------------------------- + */ + + // no volume ramping + + // 8-bit (mixFunc)mix8bNoLoop, (mixFunc)mix8bLoop, (mixFunc)mix8bBidiLoop, - (mixFunc)mix8bNoLoopIntrp, - (mixFunc)mix8bLoopIntrp, - (mixFunc)mix8bBidiLoopIntrp, + (mixFunc)mix8bNoLoopCIntrp, + (mixFunc)mix8bLoopCIntrp, + (mixFunc)mix8bBidiLoopCIntrp, + (mixFunc)mix8bNoLoopLIntrp, + (mixFunc)mix8bLoopLIntrp, + (mixFunc)mix8bBidiLoopLIntrp, + + // 16-bit (mixFunc)mix16bNoLoop, (mixFunc)mix16bLoop, (mixFunc)mix16bBidiLoop, - (mixFunc)mix16bNoLoopIntrp, - (mixFunc)mix16bLoopIntrp, - (mixFunc)mix16bBidiLoopIntrp, + (mixFunc)mix16bNoLoopCIntrp, + (mixFunc)mix16bLoopCIntrp, + (mixFunc)mix16bBidiLoopCIntrp, + (mixFunc)mix16bNoLoopLIntrp, + (mixFunc)mix16bLoopLIntrp, + (mixFunc)mix16bBidiLoopLIntrp, + + // volume ramping + + // 8-bit (mixFunc)mix8bRampNoLoop, (mixFunc)mix8bRampLoop, (mixFunc)mix8bRampBidiLoop, - (mixFunc)mix8bRampNoLoopIntrp, - (mixFunc)mix8bRampLoopIntrp, - (mixFunc)mix8bRampBidiLoopIntrp, + (mixFunc)mix8bRampNoLoopCIntrp, + (mixFunc)mix8bRampLoopCIntrp, + (mixFunc)mix8bRampBidiLoopCIntrp, + (mixFunc)mix8bRampNoLoopLIntrp, + (mixFunc)mix8bRampLoopLIntrp, + (mixFunc)mix8bRampBidiLoopLIntrp, + + // 16-bit (mixFunc)mix16bRampNoLoop, (mixFunc)mix16bRampLoop, (mixFunc)mix16bRampBidiLoop, - (mixFunc)mix16bRampNoLoopIntrp, - (mixFunc)mix16bRampLoopIntrp, - (mixFunc)mix16bRampBidiLoopIntrp, - - // center mixing (ft2_center_mix.c) + (mixFunc)mix16bRampNoLoopCIntrp, + (mixFunc)mix16bRampLoopCIntrp, + (mixFunc)mix16bRampBidiLoopCIntrp, + (mixFunc)mix16bRampNoLoopLIntrp, + (mixFunc)mix16bRampLoopLIntrp, + (mixFunc)mix16bRampBidiLoopLIntrp, + + /* + ** --------------------------------- + ** center mixing (ft2_center_mix.c) + ** --------------------------------- + */ + + // no volume ramping + + // 8-bit (mixFunc)centerMix8bNoLoop, (mixFunc)centerMix8bLoop, (mixFunc)centerMix8bBidiLoop, - (mixFunc)centerMix8bNoLoopIntrp, - (mixFunc)centerMix8bLoopIntrp, - (mixFunc)centerMix8bBidiLoopIntrp, + (mixFunc)centerMix8bNoLoopCIntrp, + (mixFunc)centerMix8bLoopCIntrp, + (mixFunc)centerMix8bBidiLoopCIntrp, + (mixFunc)centerMix8bNoLoopLIntrp, + (mixFunc)centerMix8bLoopLIntrp, + (mixFunc)centerMix8bBidiLoopLIntrp, + + // 16-bit (mixFunc)centerMix16bNoLoop, (mixFunc)centerMix16bLoop, (mixFunc)centerMix16bBidiLoop, - (mixFunc)centerMix16bNoLoopIntrp, - (mixFunc)centerMix16bLoopIntrp, - (mixFunc)centerMix16bBidiLoopIntrp, + (mixFunc)centerMix16bNoLoopCIntrp, + (mixFunc)centerMix16bLoopCIntrp, + (mixFunc)centerMix16bBidiLoopCIntrp, + (mixFunc)centerMix16bNoLoopLIntrp, + (mixFunc)centerMix16bLoopLIntrp, + (mixFunc)centerMix16bBidiLoopLIntrp, + + // volume ramping + + // 8-bit (mixFunc)centerMix8bRampNoLoop, (mixFunc)centerMix8bRampLoop, (mixFunc)centerMix8bRampBidiLoop, - (mixFunc)centerMix8bRampNoLoopIntrp, - (mixFunc)centerMix8bRampLoopIntrp, - (mixFunc)centerMix8bRampBidiLoopIntrp, + (mixFunc)centerMix8bRampNoLoopCIntrp, + (mixFunc)centerMix8bRampLoopCIntrp, + (mixFunc)centerMix8bRampBidiLoopCIntrp, + (mixFunc)centerMix8bRampNoLoopLIntrp, + (mixFunc)centerMix8bRampLoopLIntrp, + (mixFunc)centerMix8bRampBidiLoopLIntrp, + + // 16-bit (mixFunc)centerMix16bRampNoLoop, (mixFunc)centerMix16bRampLoop, (mixFunc)centerMix16bRampBidiLoop, - (mixFunc)centerMix16bRampNoLoopIntrp, - (mixFunc)centerMix16bRampLoopIntrp, - (mixFunc)centerMix16bRampBidiLoopIntrp + (mixFunc)centerMix16bRampNoLoopCIntrp, + (mixFunc)centerMix16bRampLoopCIntrp, + (mixFunc)centerMix16bRampBidiLoopCIntrp, + (mixFunc)centerMix16bRampNoLoopLIntrp, + (mixFunc)centerMix16bRampLoopLIntrp, + (mixFunc)centerMix16bRampBidiLoopLIntrp }; diff --git a/src/mixer/ft2_mix.h b/src/mixer/ft2_mix.h @@ -5,4 +5,4 @@ typedef void (*mixFunc)(void *, int32_t); -extern const mixFunc mixFuncTab[48]; // ft2_mix.c +extern const mixFunc mixFuncTab[72]; // ft2_mix.c diff --git a/src/mixer/ft2_mix_macros.h b/src/mixer/ft2_mix_macros.h @@ -2,7 +2,7 @@ #include <assert.h> #include "../ft2_audio.h" -#include "ft2_cubic.h" +#include "ft2_cubicspline.h" /* ----------------------------------------------------------------------- */ /* GENERAL MIXER MACROS */ @@ -53,6 +53,14 @@ pos = v->pos; \ posFrac = v->posFrac; \ +#define PREPARE_TAP_FIX8 \ + const int8_t *loopStartPtr = &v->base8[v->loopStart]; \ + const float fTapFixSample = v->fTapFixSample; \ + +#define PREPARE_TAP_FIX16 \ + const int16_t *loopStartPtr = &v->base16[v->loopStart]; \ + const float fTapFixSample = v->fTapFixSample; \ + #define SET_BASE8 \ base = v->base8; \ smpPtr = base + pos; \ @@ -119,62 +127,132 @@ *fMixBufferL++ += fSample; \ *fMixBufferR++ += fSample; \ -// 4-tap cubic spline interpolation through LUT (mixer/ft2_cubic.c) +// 2-tap linear interpolation (like FT2) + +#define LINEAR_INTERPOLATION16(s, f) \ +{ \ + const float fFrac = (const float)((uint32_t)f * (1.0f / (UINT32_MAX+1.0f))); /* 0.0 .. 0.999f */ \ + fSample = ((s[0] + (s[1]-s[0]) * fFrac)) * (1.0f / 32768.0f); \ +} \ -#define INTERPOLATE(LUT, s0, s1, s2, s3, f) \ +#define LINEAR_INTERPOLATION8(s, f) \ { \ - const float *t = (const float *)LUT + ((f >> CUBIC_FSHIFT) & CUBIC_FMASK); \ - s0 = (s0 * t[0]) + (s1 * t[1]) + (s2 * t[2]) + (s3 * t[3]); \ + const float fFrac = (const float)((uint32_t)f * (1.0f / (UINT32_MAX+1.0f))); /* 0.0f .. 0.999f */ \ + fSample = ((s[0] + (s[1]-s[0]) * fFrac)) * (1.0f / 128.0f); \ } \ -/* 8bitbubsy: It may look like we are potentially going out of bounds by looking up sample point -** -1, 1 and 2, but the sample data is actually padded on both the left (negative) and right side, -** where correct samples are stored according to loop mode (or no loop). +#define RENDER_8BIT_SMP_LINTRP \ + assert(smpPtr >= base && smpPtr < base+v->end); \ + LINEAR_INTERPOLATION8(smpPtr, posFrac) \ + *fMixBufferL++ += fSample * fVolL; \ + *fMixBufferR++ += fSample * fVolR; \ + +#define RENDER_8BIT_SMP_MONO_LINTRP \ + assert(smpPtr >= base && smpPtr < base+v->end); \ + LINEAR_INTERPOLATION8(smpPtr, posFrac) \ + fSample *= fVolL; \ + *fMixBufferL++ += fSample; \ + *fMixBufferR++ += fSample; \ + +#define RENDER_16BIT_SMP_LINTRP \ + assert(smpPtr >= base && smpPtr < base+v->end); \ + LINEAR_INTERPOLATION16(smpPtr, posFrac) \ + *fMixBufferL++ += fSample * fVolL; \ + *fMixBufferR++ += fSample * fVolR; \ + +#define RENDER_16BIT_SMP_MONO_LINTRP \ + assert(smpPtr >= base && smpPtr < base+v->end); \ + LINEAR_INTERPOLATION16(smpPtr, posFrac) \ + fSample *= fVolL; \ + *fMixBufferL++ += fSample; \ + *fMixBufferR++ += fSample; \ + +// 4-tap cubic spline interpolation (better quality, through LUT: mixer/ft2_cubicspline.c) + +/* 8bitbubsy: It may look like we are potentially going out of bounds while looking up the sample points, +** but the sample data is actually padded on both the left (negative) and right side, where correct tap +** samples are stored according to loop mode (or no loop). +** +** The mixer is also reading the correct sample on the -1 tap after the sample has looped at least once. ** -** The only issue is that the -1 look-up gets wrong information if loopStart>0 on looped-samples, -** and the sample-position is at loopStart. The spline will get ever so slighty wrong because of this, -** but it's barely audible anyway. Doing it elsewise would require a refactoring of how the audio mixer -** works! */ -#define RENDER_8BIT_SMP_INTRP \ +#define CUBICSPLINE_INTERPOLATION(LUT, s, f) \ +{ \ + const float *t = (const float *)LUT + (((uint32_t)f >> CUBIC_FSHIFT) & CUBIC_FMASK); \ + fSample = (s[-1] * t[0]) + (s[0] * t[1]) + (s[1] * t[2]) + (s[2] * t[3]); \ +} \ + +#define CUBICSPLINE_INTERPOLATION_CUSTOM(LUT, f) \ +{ \ + const float *t = (const float *)LUT + (((uint32_t)f >> CUBIC_FSHIFT) & CUBIC_FMASK); \ + fSample = (s0 * t[0]) + (s1 * t[1]) + (s2 * t[2]) + (s3 * t[3]); \ +} \ + +#define RENDER_8BIT_SMP_CINTRP \ + assert(smpPtr >= base && smpPtr < base+v->end); \ + CUBICSPLINE_INTERPOLATION(fCubicSplineLUT8, smpPtr, posFrac) \ + *fMixBufferL++ += fSample * fVolL; \ + *fMixBufferR++ += fSample * fVolR; \ + +#define RENDER_8BIT_SMP_MONO_CINTRP \ + assert(smpPtr >= base && smpPtr < base+v->end); \ + CUBICSPLINE_INTERPOLATION(fCubicSplineLUT8, smpPtr, posFrac) \ + fSample *= fVolL; \ + *fMixBufferL++ += fSample; \ + *fMixBufferR++ += fSample; \ + +#define RENDER_16BIT_SMP_CINTRP \ + assert(smpPtr >= base && smpPtr < base+v->end); \ + CUBICSPLINE_INTERPOLATION(fCubicSplineLUT16, smpPtr, posFrac) \ + *fMixBufferL++ += fSample * fVolL; \ + *fMixBufferR++ += fSample * fVolR; \ + +#define RENDER_16BIT_SMP_MONO_CINTRP \ assert(smpPtr >= base && smpPtr < base+v->end); \ - fSample = smpPtr[-1]; \ - fSample2 = smpPtr[0]; \ - fSample3 = smpPtr[1]; \ - fSample4 = smpPtr[2]; \ - INTERPOLATE(fCubicLUT8, fSample, fSample2, fSample3, fSample4, posFrac) \ + CUBICSPLINE_INTERPOLATION(fCubicSplineLUT16, smpPtr, posFrac) \ + fSample *= fVolL; \ + *fMixBufferL++ += fSample; \ + *fMixBufferR++ += fSample; \ + +#define RENDER_8BIT_SMP_CINTRP_TAP_FIX \ + assert(smpPtr >= base && smpPtr < base+v->end); \ + s0 = (smpPtr != loopStartPtr) ? smpPtr[-1] : fTapFixSample; \ + s1 = smpPtr[0]; \ + s2 = smpPtr[1]; \ + s3 = smpPtr[2]; \ + CUBICSPLINE_INTERPOLATION_CUSTOM(fCubicSplineLUT8, posFrac) \ *fMixBufferL++ += fSample * fVolL; \ *fMixBufferR++ += fSample * fVolR; \ -#define RENDER_8BIT_SMP_MONO_INTRP \ +#define RENDER_8BIT_SMP_MONO_CINTRP_TAP_FIX \ assert(smpPtr >= base && smpPtr < base+v->end); \ - fSample = smpPtr[-1]; \ - fSample2 = smpPtr[0]; \ - fSample3 = smpPtr[1]; \ - fSample4 = smpPtr[2]; \ - INTERPOLATE(fCubicLUT8, fSample, fSample2, fSample3, fSample4, posFrac) \ + s0 = (smpPtr != loopStartPtr) ? smpPtr[-1] : fTapFixSample; \ + s1 = smpPtr[0]; \ + s2 = smpPtr[1]; \ + s3 = smpPtr[2]; \ + CUBICSPLINE_INTERPOLATION_CUSTOM(fCubicSplineLUT8, posFrac) \ fSample *= fVolL; \ *fMixBufferL++ += fSample; \ *fMixBufferR++ += fSample; \ -#define RENDER_16BIT_SMP_INTRP \ +#define RENDER_16BIT_SMP_CINTRP_TAP_FIX \ assert(smpPtr >= base && smpPtr < base+v->end); \ - fSample = smpPtr[-1]; \ - fSample2 = smpPtr[0]; \ - fSample3 = smpPtr[1]; \ - fSample4 = smpPtr[2]; \ - INTERPOLATE(fCubicLUT16, fSample, fSample2, fSample3, fSample4, posFrac) \ + s0 = (smpPtr != loopStartPtr) ? smpPtr[-1] : fTapFixSample; \ + s1 = smpPtr[0]; \ + s2 = smpPtr[1]; \ + s3 = smpPtr[2]; \ + CUBICSPLINE_INTERPOLATION_CUSTOM(fCubicSplineLUT16, posFrac) \ *fMixBufferL++ += fSample * fVolL; \ *fMixBufferR++ += fSample * fVolR; \ -#define RENDER_16BIT_SMP_MONO_INTRP \ +#define RENDER_16BIT_SMP_MONO_CINTRP_TAP_FIX \ assert(smpPtr >= base && smpPtr < base+v->end); \ - fSample = smpPtr[-1]; \ - fSample2 = smpPtr[0]; \ - fSample3 = smpPtr[1]; \ - fSample4 = smpPtr[2]; \ - INTERPOLATE(fCubicLUT16, fSample, fSample2, fSample3, fSample4, posFrac) \ + s0 = (smpPtr != loopStartPtr) ? smpPtr[-1] : fTapFixSample; \ + s1 = smpPtr[0]; \ + s2 = smpPtr[1]; \ + s3 = smpPtr[2]; \ + CUBICSPLINE_INTERPOLATION_CUSTOM(fCubicSplineLUT16, posFrac) \ fSample *= fVolL; \ *fMixBufferL++ += fSample; \ *fMixBufferR++ += fSample; \ @@ -262,15 +340,27 @@ #define WRAP_LOOP \ pos = (int32_t)(smpPtr - base); \ - while (pos >= v->end) \ - pos -= v->loopLength; \ + if (pos >= v->end) \ + { \ + do \ + { \ + pos -= v->loopLength; \ + } \ + while (pos >= v->end); \ + v->hasLooped = true; \ + } \ smpPtr = base + pos; \ #define WRAP_BIDI_LOOP \ - while (pos >= v->end) \ + if (pos >= v->end) \ { \ - pos -= v->loopLength; \ - v->backwards ^= 1; \ + do \ + { \ + pos -= v->loopLength; \ + v->backwards ^= 1; \ + } \ + while (pos >= v->end); \ + v->hasLooped = true; \ } \ #define END_BIDI \ diff --git a/src/mixer/ft2_silence_mix.h b/src/mixer/ft2_silence_mix.h @@ -27,6 +27,8 @@ pos = v->loopStart + ((pos - v->end) % v->loopLength); \ else \ pos = v->loopStart; \ + \ + v->hasLooped = true; \ } \ #define SILENCE_MIX_BIDI_LOOP \ @@ -45,6 +47,7 @@ { \ pos = v->loopStart; \ } \ + v->hasLooped = true; \ } \ void silenceMixRoutine(voice_t *v, int32_t numSamples); diff --git a/vs2019_project/ft2-clone/ft2-clone.vcxproj b/vs2019_project/ft2-clone/ft2-clone.vcxproj @@ -92,7 +92,7 @@ <Optimization>MaxSpeed</Optimization> <AdditionalIncludeDirectories> </AdditionalIncludeDirectories> - <PreprocessorDefinitions>__WINDOWS_MM__;NDEBUG;WIN32;_CRT_SECURE_NO_WARNINGS;_USE_MATH_DEFINES;HAVE_M_PI;HAS_MIDI</PreprocessorDefinitions> + <PreprocessorDefinitions>__WINDOWS_MM__;NDEBUG;WIN32;_CRT_SECURE_NO_WARNINGS;HAS_MIDI</PreprocessorDefinitions> <MultiProcessorCompilation>true</MultiProcessorCompilation> <IntrinsicFunctions>true</IntrinsicFunctions> <StringPooling>true</StringPooling> @@ -142,7 +142,7 @@ <Optimization>MaxSpeed</Optimization> <AdditionalIncludeDirectories> </AdditionalIncludeDirectories> - <PreprocessorDefinitions>__WINDOWS_MM__;NDEBUG;WIN32;_CRT_SECURE_NO_WARNINGS;_USE_MATH_DEFINES;HAVE_M_PI;HAS_MIDI</PreprocessorDefinitions> + <PreprocessorDefinitions>__WINDOWS_MM__;NDEBUG;WIN32;_CRT_SECURE_NO_WARNINGS;HAS_MIDI</PreprocessorDefinitions> <MultiProcessorCompilation>true</MultiProcessorCompilation> <IntrinsicFunctions>true</IntrinsicFunctions> <StringPooling>true</StringPooling> @@ -199,7 +199,7 @@ <WarningLevel>Level4</WarningLevel> <AdditionalIncludeDirectories> </AdditionalIncludeDirectories> - <PreprocessorDefinitions>__WINDOWS_MM__;_CRTDBG_MAP_ALLOC;DEBUG;_DEBUG;WIN32;_CRT_SECURE_NO_WARNINGS;_USE_MATH_DEFINES;HAVE_M_PI;HAS_MIDI</PreprocessorDefinitions> + <PreprocessorDefinitions>__WINDOWS_MM__;_CRTDBG_MAP_ALLOC;DEBUG;_DEBUG;WIN32;_CRT_SECURE_NO_WARNINGS;HAS_MIDI</PreprocessorDefinitions> <FloatingPointModel>Fast</FloatingPointModel> <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet> <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType> @@ -237,7 +237,7 @@ <WarningLevel>Level4</WarningLevel> <AdditionalIncludeDirectories> </AdditionalIncludeDirectories> - <PreprocessorDefinitions>__WINDOWS_MM__;_CRTDBG_MAP_ALLOC;DEBUG;_DEBUG;WIN32;_CRT_SECURE_NO_WARNINGS;_USE_MATH_DEFINES;HAVE_M_PI;HAS_MIDI</PreprocessorDefinitions> + <PreprocessorDefinitions>__WINDOWS_MM__;_CRTDBG_MAP_ALLOC;DEBUG;_DEBUG;WIN32;_CRT_SECURE_NO_WARNINGS;HAS_MIDI</PreprocessorDefinitions> <FloatingPointModel>Fast</FloatingPointModel> <StringPooling> </StringPooling> @@ -336,7 +336,7 @@ <ClCompile Include="..\..\src\gfxdata\ft2_bmp_instr.c" /> <ClCompile Include="..\..\src\gfxdata\ft2_bmp_looppins.c" /> <ClCompile Include="..\..\src\gfxdata\ft2_bmp_scopes.c" /> - <ClCompile Include="..\..\src\mixer\ft2_cubic.c" /> + <ClCompile Include="..\..\src\mixer\ft2_cubicspline.c" /> <ClCompile Include="..\..\src\mixer\ft2_mix.c" /> <ClCompile Include="..\..\src\mixer\ft2_center_mix.c" /> <ClCompile Include="..\..\src\mixer\ft2_silence_mix.c" /> @@ -400,7 +400,7 @@ <ClInclude Include="..\..\src\ft2_unicode.h" /> <ClInclude Include="..\..\src\ft2_video.h" /> <ClInclude Include="..\..\src\ft2_wav_renderer.h" /> - <ClInclude Include="..\..\src\mixer\ft2_cubic.h" /> + <ClInclude Include="..\..\src\mixer\ft2_cubicspline.h" /> <ClInclude Include="..\..\src\mixer\ft2_mix.h" /> <ClInclude Include="..\..\src\mixer\ft2_mix_macros.h" /> <ClInclude Include="..\..\src\mixer\ft2_center_mix.h" /> diff --git a/vs2019_project/ft2-clone/ft2-clone.vcxproj.filters b/vs2019_project/ft2-clone/ft2-clone.vcxproj.filters @@ -84,7 +84,7 @@ <ClCompile Include="..\..\src\mixer\ft2_silence_mix.c"> <Filter>mixer</Filter> </ClCompile> - <ClCompile Include="..\..\src\mixer\ft2_cubic.c"> + <ClCompile Include="..\..\src\mixer\ft2_cubicspline.c"> <Filter>mixer</Filter> </ClCompile> </ItemGroup> @@ -233,7 +233,7 @@ <ClInclude Include="..\..\src\mixer\ft2_silence_mix.h"> <Filter>mixer</Filter> </ClInclude> - <ClInclude Include="..\..\src\mixer\ft2_cubic.h"> + <ClInclude Include="..\..\src\mixer\ft2_cubicspline.h"> <Filter>mixer</Filter> </ClInclude> </ItemGroup>