diff --git a/.vscode/extensions.json b/.vscode/extensions.json index a05a320..a31e559 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,5 +2,6 @@ "recommendations": [ "davidschuldenfrei.gtest-adapter", "ms-vscode.cpptools", + "vadimcn.vscode-lldb" ] } \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 48f740f..f195046 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -79,6 +79,7 @@ "preLaunchTask": "buildTests-TapeLooperDSP", "osx": { + "type": "lldb", "MIMode": "lldb", }, "windows": { @@ -101,6 +102,7 @@ "preLaunchTask": "buildTests-TapeLooper", "osx": { + "type": "lldb", "MIMode": "lldb", }, "windows": { @@ -123,6 +125,7 @@ "preLaunchTask": "build plugin", "osx": { + "type": "lldb", "MIMode": "lldb", }, "windows": { @@ -144,6 +147,7 @@ "preLaunchTask": "build plugin", "osx": { + "type": "lldb", "MIMode": "lldb", "program": "${workspaceFolder}/plugin/build/TapeLooperPlugin_artefacts/Debug/Standalone/Tape Looper Plugin.app/Contents/MacOS/Tape Looper Plugin", }, diff --git a/dsp/CMakeLists.txt b/dsp/CMakeLists.txt index 46c1aa0..beeaa2a 100644 --- a/dsp/CMakeLists.txt +++ b/dsp/CMakeLists.txt @@ -16,8 +16,14 @@ set(HEADER_FILES add_subdirectory(lib/sprout) -add_library(${TARGET} INTERFACE) -target_include_directories(${TARGET} INTERFACE +add_library(${TARGET} + src/dsp/DspHelpers.cpp +) +target_include_directories(${TARGET} INTERFACE + src/ + ${CMAKE_CURRENT_SOURCE_DIR}/lib/sprout/ +) +target_include_directories(${TARGET} PRIVATE src/ ${CMAKE_CURRENT_SOURCE_DIR}/lib/sprout/ ) diff --git a/dsp/src/dsp/AudioBuffer.h b/dsp/src/dsp/AudioBuffer.h index a646e73..9a2dcb5 100644 --- a/dsp/src/dsp/AudioBuffer.h +++ b/dsp/src/dsp/AudioBuffer.h @@ -23,8 +23,8 @@ template class AudioBufferPtr { public: - AudioBufferPtr(FloatType* const* buffer, size_t numSamples) : - size_(numSamples) + AudioBufferPtr(FloatType* const* buffer, size_t numSamplesPerChannel) : + size_(numSamplesPerChannel) { for (size_t ch = 0; ch < numChannels; ch++) buffer_[ch] = buffer[ch]; @@ -37,11 +37,21 @@ class AudioBufferPtr return buffer_[channelIdx]; } - FloatType* operator[](size_t channelIdx) const + const FloatType* operator[](size_t channelIdx) const { return buffer_[channelIdx]; } + FloatType* const* getChannelPointers() + { + return buffer_; + } + + const FloatType* const* getChannelPointers() const + { + return buffer_; + } + operator AudioBufferPtr() const { return AudioBufferPtr(buffer_, size_); @@ -54,6 +64,25 @@ class AudioBufferPtr buffer_[ch][i] = value; } + void copyToChannel(size_t destChannel, const FloatType* const srcSamples, size_t numSamples) + { + for (size_t i = 0; i < std::min(numSamples, size_); i++) + buffer_[destChannel][i] = srcSamples[i]; + } + + void addToChannel(size_t destChannel, const FloatType* const srcSamples, size_t numSamples) + { + for (size_t i = 0; i < std::min(numSamples, size_); i++) + buffer_[destChannel][i] += srcSamples[i]; + } + + void applyGain(FloatType value) + { + for (size_t ch = 0; ch < numChannels; ch++) + for (size_t i = 0; i < size_; i++) + buffer_[ch][i] *= value; + } + AudioBufferPtr subBlock(size_t startSample, size_t length = size_t(-1)) const { const auto resultMaxLength = std::max(size_ - startSample, size_t(0)); @@ -64,15 +93,17 @@ class AudioBufferPtr return result; } - FloatType* buffer_[numChannels]; const size_t size_; protected: + // private ctor for use in subBlock() AudioBufferPtr(size_t numSamples) : size_(numSamples) {} + + FloatType* buffer_[numChannels]; }; -template +template class AudioBuffer : public AudioBufferPtr { public: diff --git a/dsp/src/dsp/DspHelpers.cpp b/dsp/src/dsp/DspHelpers.cpp new file mode 100644 index 0000000..172843f --- /dev/null +++ b/dsp/src/dsp/DspHelpers.cpp @@ -0,0 +1,141 @@ +#include "DspHelpers.h" + +/* original script taken from pichenettes/stmlib */ +const float pitchRatioHigh[257] = { + // clang-format off + 6.151958251e-04, 6.517772725e-04, 6.905339660e-04, 7.315952524e-04, + 7.750981699e-04, 8.211879055e-04, 8.700182794e-04, 9.217522585e-04, + 9.765625000e-04, 1.034631928e-03, 1.096154344e-03, 1.161335073e-03, + 1.230391650e-03, 1.303554545e-03, 1.381067932e-03, 1.463190505e-03, + 1.550196340e-03, 1.642375811e-03, 1.740036559e-03, 1.843504517e-03, + 1.953125000e-03, 2.069263856e-03, 2.192308688e-03, 2.322670146e-03, + 2.460783301e-03, 2.607109090e-03, 2.762135864e-03, 2.926381010e-03, + 3.100392680e-03, 3.284751622e-03, 3.480073118e-03, 3.687009034e-03, + 3.906250000e-03, 4.138527712e-03, 4.384617376e-03, 4.645340293e-03, + 4.921566601e-03, 5.214218180e-03, 5.524271728e-03, 5.852762019e-03, + 6.200785359e-03, 6.569503244e-03, 6.960146235e-03, 7.374018068e-03, + 7.812500000e-03, 8.277055425e-03, 8.769234752e-03, 9.290680586e-03, + 9.843133202e-03, 1.042843636e-02, 1.104854346e-02, 1.170552404e-02, + 1.240157072e-02, 1.313900649e-02, 1.392029247e-02, 1.474803614e-02, + 1.562500000e-02, 1.655411085e-02, 1.753846950e-02, 1.858136117e-02, + 1.968626640e-02, 2.085687272e-02, 2.209708691e-02, 2.341104808e-02, + 2.480314144e-02, 2.627801298e-02, 2.784058494e-02, 2.949607227e-02, + 3.125000000e-02, 3.310822170e-02, 3.507693901e-02, 3.716272234e-02, + 3.937253281e-02, 4.171374544e-02, 4.419417382e-02, 4.682209615e-02, + 4.960628287e-02, 5.255602595e-02, 5.568116988e-02, 5.899214454e-02, + 6.250000000e-02, 6.621644340e-02, 7.015387802e-02, 7.432544469e-02, + 7.874506562e-02, 8.342749089e-02, 8.838834765e-02, 9.364419230e-02, + 9.921256575e-02, 1.051120519e-01, 1.113623398e-01, 1.179842891e-01, + 1.250000000e-01, 1.324328868e-01, 1.403077560e-01, 1.486508894e-01, + 1.574901312e-01, 1.668549818e-01, 1.767766953e-01, 1.872883846e-01, + 1.984251315e-01, 2.102241038e-01, 2.227246795e-01, 2.359685782e-01, + 2.500000000e-01, 2.648657736e-01, 2.806155121e-01, 2.973017788e-01, + 3.149802625e-01, 3.337099635e-01, 3.535533906e-01, 3.745767692e-01, + 3.968502630e-01, 4.204482076e-01, 4.454493591e-01, 4.719371563e-01, + 5.000000000e-01, 5.297315472e-01, 5.612310242e-01, 5.946035575e-01, + 6.299605249e-01, 6.674199271e-01, 7.071067812e-01, 7.491535384e-01, + 7.937005260e-01, 8.408964153e-01, 8.908987181e-01, 9.438743127e-01, + 1.000000000e+00, 1.059463094e+00, 1.122462048e+00, 1.189207115e+00, + 1.259921050e+00, 1.334839854e+00, 1.414213562e+00, 1.498307077e+00, + 1.587401052e+00, 1.681792831e+00, 1.781797436e+00, 1.887748625e+00, + 2.000000000e+00, 2.118926189e+00, 2.244924097e+00, 2.378414230e+00, + 2.519842100e+00, 2.669679708e+00, 2.828427125e+00, 2.996614154e+00, + 3.174802104e+00, 3.363585661e+00, 3.563594873e+00, 3.775497251e+00, + 4.000000000e+00, 4.237852377e+00, 4.489848193e+00, 4.756828460e+00, + 5.039684200e+00, 5.339359417e+00, 5.656854249e+00, 5.993228308e+00, + 6.349604208e+00, 6.727171322e+00, 7.127189745e+00, 7.550994501e+00, + 8.000000000e+00, 8.475704755e+00, 8.979696386e+00, 9.513656920e+00, + 1.007936840e+01, 1.067871883e+01, 1.131370850e+01, 1.198645662e+01, + 1.269920842e+01, 1.345434264e+01, 1.425437949e+01, 1.510198900e+01, + 1.600000000e+01, 1.695140951e+01, 1.795939277e+01, 1.902731384e+01, + 2.015873680e+01, 2.135743767e+01, 2.262741700e+01, 2.397291323e+01, + 2.539841683e+01, 2.690868529e+01, 2.850875898e+01, 3.020397801e+01, + 3.200000000e+01, 3.390281902e+01, 3.591878555e+01, 3.805462768e+01, + 4.031747360e+01, 4.271487533e+01, 4.525483400e+01, 4.794582646e+01, + 5.079683366e+01, 5.381737058e+01, 5.701751796e+01, 6.040795601e+01, + 6.400000000e+01, 6.780563804e+01, 7.183757109e+01, 7.610925536e+01, + 8.063494719e+01, 8.542975067e+01, 9.050966799e+01, 9.589165292e+01, + 1.015936673e+02, 1.076347412e+02, 1.140350359e+02, 1.208159120e+02, + 1.280000000e+02, 1.356112761e+02, 1.436751422e+02, 1.522185107e+02, + 1.612698944e+02, 1.708595013e+02, 1.810193360e+02, 1.917833058e+02, + 2.031873347e+02, 2.152694823e+02, 2.280700718e+02, 2.416318240e+02, + 2.560000000e+02, 2.712225522e+02, 2.873502844e+02, 3.044370214e+02, + 3.225397888e+02, 3.417190027e+02, 3.620386720e+02, 3.835666117e+02, + 4.063746693e+02, 4.305389646e+02, 4.561401437e+02, 4.832636481e+02, + 5.120000000e+02, 5.424451043e+02, 5.747005687e+02, 6.088740429e+02, + 6.450795775e+02, 6.834380053e+02, 7.240773439e+02, 7.671332234e+02, + 8.127493386e+02, 8.610779292e+02, 9.122802874e+02, 9.665272962e+02, + 1.024000000e+03, 1.084890209e+03, 1.149401137e+03, 1.217748086e+03, + 1.290159155e+03, 1.366876011e+03, 1.448154688e+03, 1.534266447e+03, + // clang-format on +}; + +/* original script taken from pichenettes/stmlib */ +const float pitchRatioLow[257] = { + // clang-format off + 1.000000000e+00, 1.000225659e+00, 1.000451370e+00, 1.000677131e+00, + 1.000902943e+00, 1.001128806e+00, 1.001354720e+00, 1.001580685e+00, + 1.001806701e+00, 1.002032768e+00, 1.002258886e+00, 1.002485055e+00, + 1.002711275e+00, 1.002937546e+00, 1.003163868e+00, 1.003390242e+00, + 1.003616666e+00, 1.003843141e+00, 1.004069668e+00, 1.004296246e+00, + 1.004522874e+00, 1.004749554e+00, 1.004976285e+00, 1.005203068e+00, + 1.005429901e+00, 1.005656786e+00, 1.005883722e+00, 1.006110709e+00, + 1.006337747e+00, 1.006564836e+00, 1.006791977e+00, 1.007019169e+00, + 1.007246412e+00, 1.007473707e+00, 1.007701053e+00, 1.007928450e+00, + 1.008155898e+00, 1.008383398e+00, 1.008610949e+00, 1.008838551e+00, + 1.009066205e+00, 1.009293910e+00, 1.009521667e+00, 1.009749475e+00, + 1.009977334e+00, 1.010205245e+00, 1.010433207e+00, 1.010661221e+00, + 1.010889286e+00, 1.011117403e+00, 1.011345571e+00, 1.011573790e+00, + 1.011802061e+00, 1.012030384e+00, 1.012258758e+00, 1.012487183e+00, + 1.012715661e+00, 1.012944189e+00, 1.013172770e+00, 1.013401401e+00, + 1.013630085e+00, 1.013858820e+00, 1.014087607e+00, 1.014316445e+00, + 1.014545335e+00, 1.014774277e+00, 1.015003270e+00, 1.015232315e+00, + 1.015461411e+00, 1.015690560e+00, 1.015919760e+00, 1.016149011e+00, + 1.016378315e+00, 1.016607670e+00, 1.016837077e+00, 1.017066536e+00, + 1.017296046e+00, 1.017525609e+00, 1.017755223e+00, 1.017984889e+00, + 1.018214607e+00, 1.018444376e+00, 1.018674198e+00, 1.018904071e+00, + 1.019133996e+00, 1.019363973e+00, 1.019594002e+00, 1.019824083e+00, + 1.020054216e+00, 1.020284401e+00, 1.020514637e+00, 1.020744926e+00, + 1.020975266e+00, 1.021205659e+00, 1.021436104e+00, 1.021666600e+00, + 1.021897149e+00, 1.022127749e+00, 1.022358402e+00, 1.022589107e+00, + 1.022819863e+00, 1.023050672e+00, 1.023281533e+00, 1.023512446e+00, + 1.023743411e+00, 1.023974428e+00, 1.024205498e+00, 1.024436619e+00, + 1.024667793e+00, 1.024899019e+00, 1.025130297e+00, 1.025361627e+00, + 1.025593009e+00, 1.025824444e+00, 1.026055931e+00, 1.026287470e+00, + 1.026519061e+00, 1.026750705e+00, 1.026982401e+00, 1.027214149e+00, + 1.027445949e+00, 1.027677802e+00, 1.027909707e+00, 1.028141664e+00, + 1.028373674e+00, 1.028605736e+00, 1.028837851e+00, 1.029070017e+00, + 1.029302237e+00, 1.029534508e+00, 1.029766832e+00, 1.029999209e+00, + 1.030231638e+00, 1.030464119e+00, 1.030696653e+00, 1.030929239e+00, + 1.031161878e+00, 1.031394569e+00, 1.031627313e+00, 1.031860109e+00, + 1.032092958e+00, 1.032325859e+00, 1.032558813e+00, 1.032791820e+00, + 1.033024879e+00, 1.033257991e+00, 1.033491155e+00, 1.033724372e+00, + 1.033957641e+00, 1.034190964e+00, 1.034424338e+00, 1.034657766e+00, + 1.034891246e+00, 1.035124779e+00, 1.035358364e+00, 1.035592003e+00, + 1.035825694e+00, 1.036059437e+00, 1.036293234e+00, 1.036527083e+00, + 1.036760985e+00, 1.036994940e+00, 1.037228947e+00, 1.037463008e+00, + 1.037697121e+00, 1.037931287e+00, 1.038165506e+00, 1.038399777e+00, + 1.038634102e+00, 1.038868479e+00, 1.039102910e+00, 1.039337393e+00, + 1.039571929e+00, 1.039806518e+00, 1.040041160e+00, 1.040275855e+00, + 1.040510603e+00, 1.040745404e+00, 1.040980258e+00, 1.041215165e+00, + 1.041450125e+00, 1.041685138e+00, 1.041920204e+00, 1.042155323e+00, + 1.042390495e+00, 1.042625720e+00, 1.042860998e+00, 1.043096329e+00, + 1.043331714e+00, 1.043567151e+00, 1.043802642e+00, 1.044038185e+00, + 1.044273782e+00, 1.044509433e+00, 1.044745136e+00, 1.044980892e+00, + 1.045216702e+00, 1.045452565e+00, 1.045688481e+00, 1.045924450e+00, + 1.046160473e+00, 1.046396549e+00, 1.046632678e+00, 1.046868860e+00, + 1.047105096e+00, 1.047341385e+00, 1.047577727e+00, 1.047814123e+00, + 1.048050572e+00, 1.048287074e+00, 1.048523630e+00, 1.048760239e+00, + 1.048996902e+00, 1.049233618e+00, 1.049470387e+00, 1.049707210e+00, + 1.049944086e+00, 1.050181015e+00, 1.050417999e+00, 1.050655035e+00, + 1.050892125e+00, 1.051129269e+00, 1.051366466e+00, 1.051603717e+00, + 1.051841021e+00, 1.052078378e+00, 1.052315790e+00, 1.052553255e+00, + 1.052790773e+00, 1.053028345e+00, 1.053265971e+00, 1.053503650e+00, + 1.053741383e+00, 1.053979169e+00, 1.054217010e+00, 1.054454903e+00, + 1.054692851e+00, 1.054930852e+00, 1.055168907e+00, 1.055407016e+00, + 1.055645178e+00, 1.055883395e+00, 1.056121664e+00, 1.056359988e+00, + 1.056598366e+00, 1.056836797e+00, 1.057075282e+00, 1.057313821e+00, + 1.057552413e+00, 1.057791060e+00, 1.058029760e+00, 1.058268515e+00, + 1.058507323e+00, 1.058746185e+00, 1.058985101e+00, 1.059224071e+00, + // clang-format on +}; \ No newline at end of file diff --git a/dsp/src/dsp/DspHelpers.h b/dsp/src/dsp/DspHelpers.h index 43c692f..9869838 100644 --- a/dsp/src/dsp/DspHelpers.h +++ b/dsp/src/dsp/DspHelpers.h @@ -1,16 +1,16 @@ -/** +/** * Copyright (C) Johannes Elliesen, 2021 - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -184,3 +184,15 @@ MANUAL_INLINE constexpr Type limit(Type value, Type min, Type max) { return value < min ? min : (max < value ? max : value); } + +extern const float pitchRatioHigh[257]; +extern const float pitchRatioLow[257]; + +MANUAL_INLINE float semitonesToRatio(float semitones) +{ + float pitch = semitones + 128.0f; + int32_t integral = int32_t(pitch); + float fractional = pitch - float(integral); + + return pitchRatioHigh[integral] * pitchRatioLow[int32_t(fractional * 256.0f)]; +} \ No newline at end of file diff --git a/dsp/src/dsp/Player.h b/dsp/src/dsp/Player.h index ef06e84..eba2950 100644 --- a/dsp/src/dsp/Player.h +++ b/dsp/src/dsp/Player.h @@ -1,16 +1,16 @@ -/** +/** * Copyright (C) Johannes Elliesen, 2021 - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -95,6 +95,7 @@ class Player { const auto postGainTarget = (isPlaying_) ? paramPostProcessorGain : 0.0f; const auto speedTarget = limit(paramSpeed, minSpeed_, maxSpeed_); + const auto speedModulationAmtTarget = speedModulationAmt; if (playbackLength_ < 1) return; @@ -102,7 +103,7 @@ class Player for (size_t i = 0; i < outputToAddTo.size_; i++) { const auto postGain = postGainSmoother_.smooth(postGainTarget, postGainSmootherTimeConstant); - const auto speedModulation = speedModulator_.getAndAdvance() * speedModulationAmt; + const auto speedModulation = speedModulator_.getAndAdvance() * speedModulationAmtTarget; const auto speed = speedModulation + speedSmoother_.smooth(speedTarget, speedSmootherTimeConstant); // the final two samples we need to interpolate for the current output sample diff --git a/dsp/src/dsp/Recorder.h b/dsp/src/dsp/Recorder.h index 20ca5df..47fd6ff 100644 --- a/dsp/src/dsp/Recorder.h +++ b/dsp/src/dsp/Recorder.h @@ -76,7 +76,7 @@ class Recorder for (; i < input.size_; i++) { for (size_t ch = 0; ch < numChannels; ch++) - buffer_[ch][recHeadIdx_] = input.buffer_[ch][i]; + buffer_[ch][recHeadIdx_] = input[ch][i]; recHeadIdx_++; if (recHeadIdx_ == buffer_.size_) { @@ -93,7 +93,7 @@ class Recorder for (size_t ch = 0; ch < numChannels; ch++) { const auto xFadedSample = linMap(xfadePhase_, - input.buffer_[ch][i], + input[ch][i], buffer_[ch][recHeadIdx_]); buffer_[ch][recHeadIdx_] = xFadedSample; } diff --git a/dsp/src/dsp/TapeGrain.h b/dsp/src/dsp/TapeGrain.h index 8aa42b7..647cd3f 100644 --- a/dsp/src/dsp/TapeGrain.h +++ b/dsp/src/dsp/TapeGrain.h @@ -128,7 +128,7 @@ class TapeGrainProcessor private: static constexpr auto clockedNoiseFreq_ = FloatType(8000); static constexpr auto clockedNoiseJitter_ = FloatType(0.6); - static constexpr auto maxAmount_ = FloatType(12); + static constexpr auto maxAmount_ = FloatType(24); ClockedNoiseGenerator noise_; Biquad noiseFilter_; diff --git a/dsp/src/dsp/TapeLooper.h b/dsp/src/dsp/TapeLooper.h index 46908a8..788ec42 100644 --- a/dsp/src/dsp/TapeLooper.h +++ b/dsp/src/dsp/TapeLooper.h @@ -1,16 +1,16 @@ -/** +/** * Copyright (C) Johannes Elliesen, 2021 - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -38,6 +38,12 @@ struct LooperStoragePtr } }; +struct MonoOrStereoLooperStoragePtr : + public LooperStoragePtr<1>, + public LooperStoragePtr<2> +{ +}; + template class LooperStorage : public LooperStoragePtr { @@ -56,6 +62,27 @@ class LooperStorage : public LooperStoragePtr std::array, numChannels> storage_; }; +template +class MonoOrStereoLooperStorage : public MonoOrStereoLooperStoragePtr +{ +public: + MonoOrStereoLooperStorage() + { + storage_.fill(0.0f); + + this->LooperStoragePtr<1>::data[0] = storage_.data(); + this->LooperStoragePtr<1>::numSamples = sizeWhenMono; + + const auto sizePerChannel = sizeWhenMono / 2; + this->LooperStoragePtr<2>::data[0] = storage_.data(); + this->LooperStoragePtr<2>::data[1] = storage_.data() + sizePerChannel; + this->LooperStoragePtr<2>::numSamples = sizePerChannel; + } + +private: + std::array storage_; +}; + enum class LooperState { stopped, @@ -119,15 +146,21 @@ class TapeLooper const typename ProcessorType::Parameters& processorParameters, float paramPostGain, AudioBufferPtr input, - AudioBufferPtr outputToAddTo) + AudioBufferPtr outputToAddTo, + ExponentialSmoother::TimeConstant postGainSmootherTimeConstant = + ExponentialSmoother::TimeConstant(0.05f, sampleRate, 1), + ExponentialSmoother::TimeConstant speedSmootherTimeConstant = + ExponentialSmoother::TimeConstant(0.05f, sampleRate, 1)) { const auto mappedWowAndFlutterAmt = wowAndFlutterAmt * wowAndFlutterAmt; player_.process(paramSpeed, - mappedWowAndFlutterAmt * maxWowAndFlutterAmt_, + mappedWowAndFlutterAmt, direction, paramPostGain, processorParameters, - outputToAddTo); + outputToAddTo, + postGainSmootherTimeConstant, + speedSmootherTimeConstant); recorder_.process(input); const auto recordingStopped = state_ == LooperState::recording && !recorder_.isRecording(); @@ -142,7 +175,7 @@ class TapeLooper + storage_.getTotalSizeInBytes(); } - /** + /** * Saves the state of the looper */ template @@ -163,7 +196,7 @@ class TapeLooper return mem.writeItems(isPlaying); } - /** + /** * Stopps playback or recording and recalls the state of the looper, including * - the length of the current recording * - if the looper is currently playing @@ -192,7 +225,6 @@ class TapeLooper const LooperStoragePtr getSampleStoragePtr() const { return storage_; } private: - static constexpr float maxWowAndFlutterAmt_ = 0.025f; const LooperStoragePtr storage_; LooperState state_; PlayerType player_; diff --git a/dsp/src/dsp/TapeProcessor.h b/dsp/src/dsp/TapeProcessor.h index 1862622..846ffc1 100644 --- a/dsp/src/dsp/TapeProcessor.h +++ b/dsp/src/dsp/TapeProcessor.h @@ -1,16 +1,16 @@ -/** +/** * Copyright (C) Johannes Elliesen, 2021 - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -27,6 +27,12 @@ # define MANUAL_INLINE inline __attribute__((always_inline)) #endif +struct TapeProcessorParameters +{ + float driveGain; + float grainAmt; +}; + template class TapeProcessor { @@ -35,11 +41,7 @@ class TapeProcessor { } - struct Parameters - { - float driveGain; - float grainAmt; - }; + using Parameters = TapeProcessorParameters; void reset() { @@ -65,15 +67,17 @@ class TapeProcessor for (size_t ch = 0; ch < numChannels; ch++) { - // tape saturation auto& sample = inputAndOutput[ch]; + + // tape grain + sample = grainProcessors_[ch].process(grainAmt, sample); + + // tape saturation sample = emphasisEqs_[ch].processPreEmphasis(sample); sample *= driveGain; sample = TapeSaturator::saturate(sample); sample /= driveGain; sample = emphasisEqs_[ch].processDeEmphasis(sample); - // tape grain - sample = grainProcessors_[ch].process(grainAmt, sample); // apply tape EQ sample = tapeEqs_[ch].process(sample); } diff --git a/dsp/src/dsp/WowAndFlutter.h b/dsp/src/dsp/WowAndFlutter.h index fbd5b4f..4a3153c 100644 --- a/dsp/src/dsp/WowAndFlutter.h +++ b/dsp/src/dsp/WowAndFlutter.h @@ -46,13 +46,15 @@ class WowAndFlutterOscillator } private: + static constexpr FloatType globalScale_ = FloatType(0.025f); + static constexpr FloatType flutterCarrierSpeedInHz_ = FloatType(6.234); static constexpr FloatType flutterModulatorSpeedInHz_ = FloatType(4.8994); static constexpr FloatType flutterModulationDepth_ = FloatType(0.23); - static constexpr FloatType flutterAmplitude_ = FloatType(0.6); + static constexpr FloatType flutterAmplitude_ = FloatType(0.6) * globalScale_; static constexpr FloatType wowSpeedInHz_ = FloatType(0.4); - static constexpr FloatType wowAmplitude_ = FloatType(0.4); + static constexpr FloatType wowAmplitude_ = FloatType(0.4) * globalScale_; public: static constexpr FloatType maxOutput_ = 1.0f; diff --git a/dsp/tests/AudioBuffer_gtest.cpp b/dsp/tests/AudioBuffer_gtest.cpp new file mode 100644 index 0000000..07ab391 --- /dev/null +++ b/dsp/tests/AudioBuffer_gtest.cpp @@ -0,0 +1,193 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include "dsp/AudioBuffer.h" + +TEST(AudioBuffer, constructor_) +{ + constexpr size_t numSamplesPerChannel = 5; + std::array array; + array[2] = 4.0f; // set a single value before constructing the AudioBufferPtr + float* channelArray[2] = { &array[0], &array[numSamplesPerChannel] }; + const auto bufferPtr = AudioBufferPtr<2>(channelArray, numSamplesPerChannel); + + EXPECT_EQ(bufferPtr.getChannelPointers()[0], channelArray[0]); + EXPECT_EQ(bufferPtr.getChannelPointers()[1], channelArray[1]); + EXPECT_EQ(bufferPtr.size_, numSamplesPerChannel); + // the buffer is unchanged + EXPECT_EQ(bufferPtr[0][2], 4.0f); +} + +TEST(AudioBuffer, copyConstructor) +{ + constexpr size_t numSamplesPerChannel = 5; + std::array array; + float* channelArray[2] = { &array[0], &array[numSamplesPerChannel] }; + const auto bufferPtr1 = AudioBufferPtr<2>(channelArray, numSamplesPerChannel); + + const auto bufferPtr2 = AudioBufferPtr(bufferPtr1); + + EXPECT_EQ(bufferPtr2.getChannelPointers()[0], channelArray[0]); + EXPECT_EQ(bufferPtr2.getChannelPointers()[1], channelArray[1]); + EXPECT_EQ(bufferPtr2.size_, numSamplesPerChannel); +} + +TEST(AudioBuffer, conversionToConst) +{ + constexpr size_t numSamplesPerChannel = 5; + std::array array; + float* channelArray[2] = { &array[0], &array[numSamplesPerChannel] }; + const auto bufferPtr = AudioBufferPtr<2>(channelArray, numSamplesPerChannel); + const auto constBufferPtr = AudioBufferPtr<2, const float>(bufferPtr); + + EXPECT_EQ(constBufferPtr.getChannelPointers()[0], channelArray[0]); + EXPECT_EQ(constBufferPtr.getChannelPointers()[1], channelArray[1]); + EXPECT_EQ(constBufferPtr.size_, numSamplesPerChannel); +} + +TEST(AudioBuffer, indexOperator) +{ + constexpr size_t numSamplesPerChannel = 5; + std::array array; + float* channelArray[2] = { &array[0], &array[numSamplesPerChannel] }; + const auto bufferPtr = AudioBufferPtr<2>(channelArray, numSamplesPerChannel); + const auto constBufferPtr = AudioBufferPtr<2, const float>(bufferPtr); + + EXPECT_EQ(bufferPtr[0], channelArray[0]); + EXPECT_EQ(bufferPtr[1], channelArray[1]); + EXPECT_EQ(constBufferPtr[0], channelArray[0]); + EXPECT_EQ(constBufferPtr[1], channelArray[1]); +} + +TEST(AudioBuffer, fill) +{ + constexpr size_t numSamplesPerChannel = 5; + std::array array; + float* channelArray[4] = { &array[0], + &array[numSamplesPerChannel], + &array[2 * numSamplesPerChannel], + &array[3 * numSamplesPerChannel] }; + auto bufferPtr = AudioBufferPtr<4>(channelArray, numSamplesPerChannel); + + bufferPtr.fill(4.0f); + EXPECT_TRUE(std::all_of(array.begin(), + array.end(), + [](float val) + { return val == 4.0f; })); + bufferPtr.fill(1.0f); + EXPECT_TRUE(std::all_of(array.begin(), + array.end(), + [](float val) + { return val == 1.0f; })); +} + +TEST(AudioBuffer, subBlock) +{ + constexpr size_t numSamplesPerChannel = 5; + std::array array; + float* channelArray[2] = { &array[0], &array[numSamplesPerChannel] }; + const auto bufferPtr = AudioBufferPtr<2>(channelArray, numSamplesPerChannel); + + auto subBuffer1 = bufferPtr.subBlock(4); // no end provided => extend up to last sample + EXPECT_EQ(subBuffer1[0], &array[4]); + EXPECT_EQ(subBuffer1[1], &array[4 + numSamplesPerChannel]); + EXPECT_EQ(subBuffer1.size_, numSamplesPerChannel - 4); + + auto subBuffer2 = bufferPtr.subBlock(3, size_t(-1)); // extend up to last sample + EXPECT_EQ(subBuffer2[0], &array[3]); + EXPECT_EQ(subBuffer2[1], &array[3 + numSamplesPerChannel]); + EXPECT_EQ(subBuffer2.size_, numSamplesPerChannel - 3); + + auto subBuffer3 = bufferPtr.subBlock(2, 2); // specify end + EXPECT_EQ(subBuffer3[0], &array[2]); + EXPECT_EQ(subBuffer3[1], &array[2 + numSamplesPerChannel]); + EXPECT_EQ(subBuffer3.size_, 2ul); +} + +TEST(AudioBuffer, copyToChannel) +{ + constexpr size_t numSamplesPerChannel = 5; + std::array array; + float* channelArray[2] = { &array[0], &array[numSamplesPerChannel] }; + auto bufferPtr = AudioBufferPtr<2>(channelArray, numSamplesPerChannel); + + std::array srcSamples = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f }; + + // copy 2 samples to channel 1 + bufferPtr.copyToChannel(1, srcSamples.data(), 2); + EXPECT_EQ(std::vector(channelArray[1], channelArray[1] + 2), std::vector({ 1.0f, 2.0f })); + + bufferPtr.fill(0.0f); + + // copy more samples than fit one channel + bufferPtr.copyToChannel(0, srcSamples.data(), 7); + EXPECT_EQ(std::vector(channelArray[0], channelArray[0] + numSamplesPerChannel), + std::vector(srcSamples.begin(), srcSamples.begin() + numSamplesPerChannel)); + // the seconds channel should be untouched + EXPECT_TRUE(std::all_of(channelArray[1], + channelArray[1] + numSamplesPerChannel, + [](float val) + { return val == 0.0f; })); +} + +TEST(AudioBuffer, addToChannel) +{ + constexpr size_t numSamplesPerChannel = 5; + std::array array; + float* channelArray[2] = { &array[0], &array[numSamplesPerChannel] }; + auto bufferPtr = AudioBufferPtr<2>(channelArray, numSamplesPerChannel); + bufferPtr.fill(10.0f); + + std::array srcSamples = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f }; + + // add 2 samples to channel 1 + bufferPtr.addToChannel(1, srcSamples.data(), 2); + EXPECT_EQ(std::vector(channelArray[1], channelArray[1] + 2), std::vector({ 11.0f, 12.0f })); + + bufferPtr.fill(10.0f); + + // add more samples than fit one channel + bufferPtr.addToChannel(0, srcSamples.data(), 7); + EXPECT_EQ(std::vector(channelArray[0], channelArray[0] + numSamplesPerChannel), + std::vector({ 11.0f, 12.0f, 13.0f, 14.0f, 15.0f })); + // the seconds channel should be untouched + EXPECT_TRUE(std::all_of(channelArray[1], + channelArray[1] + numSamplesPerChannel, + [](float val) + { return val == 10.0f; })); +} +TEST(AudioBuffer, applyGain) +{ + constexpr size_t numSamplesPerChannel = 2; + std::array array; + float* channelArray[2] = { &array[0], &array[numSamplesPerChannel] }; + auto bufferPtr = AudioBufferPtr<2>(channelArray, numSamplesPerChannel); + bufferPtr.fill(1.0f); + + bufferPtr.applyGain(4.0f); + EXPECT_TRUE(std::all_of(array.begin(), + array.end(), + [](float val) + { return val == 4.0f; })); + bufferPtr.applyGain(0.5f); + EXPECT_TRUE(std::all_of(array.begin(), + array.end(), + [](float val) + { return val == 2.0f; })); +} \ No newline at end of file diff --git a/dsp/tests/Player_gtest.cpp b/dsp/tests/Player_gtest.cpp index bd7f027..87851df 100644 --- a/dsp/tests/Player_gtest.cpp +++ b/dsp/tests/Player_gtest.cpp @@ -87,7 +87,7 @@ class DSP_Player : public ::testing::Test DSP_Player() : player_(AudioBufferPtr( - buffer_.buffer_, + buffer_.getChannelPointers(), buffer_.size_)) { fillInputSequence(); @@ -103,7 +103,7 @@ class DSP_Player : public ::testing::Test static constexpr size_t sampleRate_ = 48000u; static constexpr size_t numChannels_ = 2; static constexpr size_t numSamples_ = 5; - AudioBuffer buffer_; + AudioBuffer buffer_; Player, @@ -152,7 +152,7 @@ TEST_F(DSP_Player, c_playForwardsNormalSpeed) // play the full buffer player_.startPlaying(numSamples_); - AudioBuffer outputBuffer; + AudioBuffer outputBuffer; outputBuffer.fill(0.0f); // process in two blocks player_.process(1.0f, // speed @@ -278,7 +278,7 @@ TEST_F(DSP_Player, d_playForwardsHalfSpeed) // play the full buffer player_.startPlaying(numSamples_); - AudioBuffer outputBuffer; + AudioBuffer outputBuffer; outputBuffer.fill(0.0f); // process in two blocks player_.process(0.5f, // speed @@ -393,7 +393,7 @@ TEST_F(DSP_Player, e_playForwardsDoubleSpeed) // play the full buffer player_.startPlaying(numSamples_); - AudioBuffer outputBuffer; + AudioBuffer outputBuffer; outputBuffer.fill(0.0f); // process in two blocks player_.process(2.0f, // speed @@ -514,7 +514,7 @@ TEST_F(DSP_Player, f_playBackwardsNormalSpeed) // play the full buffer player_.startPlaying(numSamples_); - AudioBuffer outputBuffer; + AudioBuffer outputBuffer; outputBuffer.fill(0.0f); // process in two blocks player_.process(1.0f, // speed @@ -640,7 +640,7 @@ TEST_F(DSP_Player, g_playBackwardsHalfSpeed) // play the full buffer player_.startPlaying(numSamples_); - AudioBuffer outputBuffer; + AudioBuffer outputBuffer; outputBuffer.fill(0.0f); // process in two blocks player_.process(0.5f, // speed @@ -753,7 +753,7 @@ TEST_F(DSP_Player, h_playBackwardsDoubleSpeed) // play the full buffer player_.startPlaying(numSamples_); - AudioBuffer outputBuffer; + AudioBuffer outputBuffer; outputBuffer.fill(0.0f); // process in two blocks player_.process(2.0f, // speed @@ -865,7 +865,7 @@ TEST_F(DSP_Player, i_applySmoothingToPostGain) const auto timeConstant = ExponentialSmoother::TimeConstant::fromRawValue(0.5f); const auto targetGain = 1.0f; - AudioBuffer outputBuffer; + AudioBuffer outputBuffer; outputBuffer.fill(0.0f); // process block (ramping the gain up) player_.process(1.0f, // speed @@ -941,7 +941,7 @@ TEST_F(DSP_Player, j_applySmoothingToSpeed) const auto targetSpeed1 = 0.5f; const auto targetSpeed2 = 1.0f; - AudioBuffer outputBuffer; + AudioBuffer outputBuffer; outputBuffer.fill(0.0f); // process block (ramping the speed down) player_.process(targetSpeed1, @@ -965,7 +965,7 @@ TEST_F(DSP_Player, j_applySmoothingToSpeed) // we expect the speed to ramp up/down exponentially with the supplied smoothing constant // we examine this from the output samples - since the raw playback buffer contains // increasing numbers 1, 2, 3, 4, ... we can easily see the phase increments here. - AudioBuffer expectedOutputSamples; + AudioBuffer expectedOutputSamples; for (size_t ch = 0; ch < numChannels_; ch++) { float currentSpeed = 0.0f; @@ -1002,7 +1002,7 @@ TEST_F(DSP_Player, k_applyNoSmoothingToProcessorParameters) const auto targetParamValue1 = 1.0f; const auto targetParamValue2 = 0.0f; - AudioBuffer outputBuffer; + AudioBuffer outputBuffer; outputBuffer.fill(0.0f); // process block with one parameter value player_.process(1.0f, // speed @@ -1053,7 +1053,7 @@ TEST_F(DSP_Player, l_useSpeedModulator) // play the full buffer player_.startPlaying(numSamples_); - AudioBuffer outputBuffer; + AudioBuffer outputBuffer; outputBuffer.fill(0.0f); // process block with speed modulator returning 1 EXPECT_CALL(player_.getSpeedModulator(), getAndAdvance()) @@ -1071,7 +1071,7 @@ TEST_F(DSP_Player, l_useSpeedModulator) EXPECT_CALL(player_.getSpeedModulator(), getAndAdvance()) .Times(::testing::Exactly(3)) .WillRepeatedly(::testing::Return(0.5)); - player_.process(1.0f, + player_.process(1.0f, // speed 2.0f, // speed modulation amount Direction::forwards, 1.0f, // post gain diff --git a/dsp/tests/Recorder_gtest.cpp b/dsp/tests/Recorder_gtest.cpp index 488cd97..efcd11c 100644 --- a/dsp/tests/Recorder_gtest.cpp +++ b/dsp/tests/Recorder_gtest.cpp @@ -45,8 +45,8 @@ class DSP_Recorder : public ::testing::Test static constexpr size_t numChannels_ = 2; static constexpr size_t numSamples_ = 2 * xFadeLengthInSamples_ + 10; - AudioBuffer storage_; - AudioBuffer inputSequence_; + AudioBuffer storage_; + AudioBuffer inputSequence_; Recorder<48000, numChannels_> recorder_; }; diff --git a/firmware/src/LooperController.h b/firmware/src/LooperController.h new file mode 100644 index 0000000..44a6a4e --- /dev/null +++ b/firmware/src/LooperController.h @@ -0,0 +1,300 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include +#include + +#include + +#include "constants.h" +#include "util/LateInitializedObject.h" + +enum class ChannelLayout +{ + mono, + stereo +}; + +enum class MotorAcceleration +{ + instantaneous = 0, + veryFast, + fast, + medium, + slow, + verySlow +}; + +template +class LooperController +{ +public: + using MonoLooperType = typename LooperTypes::MonoLooperType; + using StereoLooperType = typename LooperTypes::StereoLooperType; + using ParameterProviderType = typename LooperTypes::ParameterProvider; + + LooperController(std::array looperStorage, + AudioBufferPtr<1> monoDownmixBuffer, + AudioBufferPtr<1> temporaryBuffer, + const ParameterProviderType& paramProvider) : + looperStorage_(looperStorage), + monoDownmixBuffer_(monoDownmixBuffer), + temporaryBuffer_(temporaryBuffer), + paramProvider_(paramProvider) + { + for (size_t i = 0; i < numLoopers; i++) + loopers_[i].initializeToLayout(ChannelLayout::stereo, looperStorage_[i]); + } + + void setLooperState(size_t looperIdx, LooperState state) + { + if (loopers_[looperIdx].layout == ChannelLayout::mono) + loopers_[looperIdx].looper.template as().switchState(state); + else + loopers_[looperIdx].looper.template as().switchState(state); + } + + LooperState getLooperState(size_t looperIdx) const + { + if (loopers_[looperIdx].layout == ChannelLayout::mono) + return loopers_[looperIdx].looper.template as().getState(); + else + return loopers_[looperIdx].looper.template as().getState(); + } + + void saveTo(size_t looperIdx, size_t slot) + { + (void) (looperIdx); + (void) (slot); + // TODO + } + + void loadFrom(size_t looperIdx, size_t slot) + { + (void) (looperIdx); + (void) (slot); + // TODO + } + + void setChannelLayout(size_t looperIdx, ChannelLayout channelLayout) + { + loopers_[looperIdx].initializeToLayout(channelLayout, looperStorage_[looperIdx]); + } + ChannelLayout getChannelLayout(size_t looperIdx) const + { + return loopers_[looperIdx].layout; + } + + void setMotorAcceleration(size_t looperIdx, MotorAcceleration acceleration) + { + loopers_[looperIdx].acceleration = acceleration; + } + MotorAcceleration getMotorAcceleration(size_t looperIdx) const + { + return loopers_[looperIdx].acceleration; + } + + void setDirection(size_t looperIdx, Direction direction) + { + loopers_[looperIdx].direction = direction; + } + Direction getDirection(size_t looperIdx) const + { + return loopers_[looperIdx].direction; + } + + void process(AudioBufferPtr<2, const float> inputBuffer, AudioBufferPtr<2> outputBuffer) + { + outputBuffer.fill(0.0f); + + bool hasProcessedMonoDownmix = false; + for (size_t ch = 0; ch < numLoopers; ch++) + { + auto& looperChannel = loopers_[ch]; + + const auto processorParameters = + paramProvider_.getProcessorParameters(ch); + + if (looperChannel.layout == ChannelLayout::mono) + { + // input downmix + if (!hasProcessedMonoDownmix) + { + monoDownmixBuffer_.copyToChannel(0, inputBuffer[0], inputBuffer.size_); + monoDownmixBuffer_.addToChannel(0, inputBuffer[1], inputBuffer.size_); + monoDownmixBuffer_.applyGain(0.5f); + hasProcessedMonoDownmix = true; + } + // processing + temporaryBuffer_.fill(0.0f); + looperChannel.looper.template as().process( + paramProvider_.getSpeedParameter(ch), + paramProvider_.getWowAndFlutterAmtParameter(ch), + looperChannel.direction, + processorParameters, + paramProvider_.getGainParameter(ch), + monoDownmixBuffer_.subBlock(0, inputBuffer.size_), + temporaryBuffer_, + postGainSmootherTimeConstant_, + getMotorTimeConstant(looperChannel.acceleration)); + + // output upmix + outputBuffer.addToChannel(0, temporaryBuffer_[0], temporaryBuffer_.size_); + outputBuffer.addToChannel(1, temporaryBuffer_[0], temporaryBuffer_.size_); + } + else // stereo + { + looperChannel.looper.template as().process( + paramProvider_.getSpeedParameter(ch), + paramProvider_.getWowAndFlutterAmtParameter(ch), + looperChannel.direction, + processorParameters, + paramProvider_.getGainParameter(ch), + inputBuffer, + outputBuffer, + postGainSmootherTimeConstant_, + getMotorTimeConstant(looperChannel.acceleration)); + } + } + } + +private: + LooperController(const LooperController&) = delete; + LooperController& operator=(const LooperController&) {}; + + struct LooperWithSettings + { + LooperWithSettings() {} + ~LooperWithSettings() + { + if (layout == ChannelLayout::mono) + looper.template destroy(); + else + looper.template destroy(); + } + + ChannelLayout layout = ChannelLayout::stereo; + Direction direction = Direction::forwards; + MotorAcceleration acceleration = MotorAcceleration::medium; + LateInitializedObject looper; + + void initializeToLayout(const ChannelLayout newLayout, MonoOrStereoLooperStoragePtr& storage) + { + layout = newLayout; + if (layout == ChannelLayout::mono) + { + looper.template destroy(); + looper.template create(storage); + } + else + { + looper.template destroy(); + looper.template create(storage); + } + } + }; + + static constexpr float getMotorSmoothingTimeInSFor(MotorAcceleration acceleration) + { + constexpr float minLag = 0.1f; + constexpr float maxLag = 20.0f; + constexpr size_t numSteps = 5; + + // f(x) = a * e^(b * x) + // f(0) = minLag; + // f(numSteps-1) = maxLag; + // ------------------------- + // minLag = a * e^(b * 0) = a + // maxLag = a * e^(b * (numSteps-1)) + // ln(maxLag / minLag) = (numSteps-1) * b + // ln(maxLag / minLag) / (numSteps-1) = b + // log(maxLag / minLag) / ((numSteps-1) * log(e)) = b + constexpr auto a = minLag; + constexpr auto b = sprout::math::log(maxLag / minLag) / (float(numSteps - 1) * sprout::math::log(2.718281828f)); + + switch (acceleration) + { + case MotorAcceleration::instantaneous: + // not expected! + case MotorAcceleration::veryFast: + return a; + case MotorAcceleration::fast: + return a * sprout::exp(b); + case MotorAcceleration::medium: + return a * sprout::exp(2 * b); + case MotorAcceleration::slow: + return a * sprout::exp(3 * b); + case MotorAcceleration::verySlow: + return a * sprout::exp(4 * b); + } + } + + static constexpr ExponentialSmoother::TimeConstant + postGainSmootherTimeConstant_ = ExponentialSmoother::TimeConstant(0.1f, sampleRateHz, blockSize); + static constexpr ExponentialSmoother::TimeConstant + motorTimeConstantVeryFast_ = ExponentialSmoother::TimeConstant( + getMotorSmoothingTimeInSFor(MotorAcceleration::veryFast), + sampleRateHz, + blockSize); + static constexpr ExponentialSmoother::TimeConstant + motorTimeConstantFast_ = ExponentialSmoother::TimeConstant( + getMotorSmoothingTimeInSFor(MotorAcceleration::fast), + sampleRateHz, + blockSize); + static constexpr ExponentialSmoother::TimeConstant + motorTimeConstantMedium_ = ExponentialSmoother::TimeConstant( + getMotorSmoothingTimeInSFor(MotorAcceleration::medium), + sampleRateHz, + blockSize); + static constexpr ExponentialSmoother::TimeConstant + motorTimeConstantSlow_ = ExponentialSmoother::TimeConstant( + getMotorSmoothingTimeInSFor(MotorAcceleration::slow), + sampleRateHz, + blockSize); + static constexpr ExponentialSmoother::TimeConstant + motorTimeConstantVerySlow_ = ExponentialSmoother::TimeConstant( + getMotorSmoothingTimeInSFor(MotorAcceleration::verySlow), + sampleRateHz, + blockSize); + + static ExponentialSmoother::TimeConstant getMotorTimeConstant(MotorAcceleration acceleration) + { + switch (acceleration) + { + case MotorAcceleration::instantaneous: + return ExponentialSmoother::TimeConstant::instantaneous(); + case MotorAcceleration::veryFast: + return motorTimeConstantVeryFast_; + case MotorAcceleration::fast: + return motorTimeConstantFast_; + default: + case MotorAcceleration::medium: + return motorTimeConstantMedium_; + case MotorAcceleration::slow: + return motorTimeConstantSlow_; + case MotorAcceleration::verySlow: + return motorTimeConstantVerySlow_; + } + } + + std::array looperStorage_; + std::array loopers_; + AudioBufferPtr<1> monoDownmixBuffer_; + AudioBufferPtr<1> temporaryBuffer_; + const ParameterProviderType& paramProvider_; +}; \ No newline at end of file diff --git a/firmware/src/constants.h b/firmware/src/constants.h index 0e9df4b..bab8216 100644 --- a/firmware/src/constants.h +++ b/firmware/src/constants.h @@ -29,4 +29,4 @@ constexpr uint8_t numLoopers = 4; constexpr size_t sdramSize = 64 * 1024 * 1024; constexpr size_t totalLooperMemorySize = sdramSize - 256; -constexpr size_t looperSamplesPerChannel = totalLooperMemorySize / numChannelsPerLooper / numLoopers / sizeof(float); +constexpr size_t looperSamplesPerChannel = totalLooperMemorySize / numLoopers / sizeof(float); diff --git a/firmware/src/hardware/Buttons.h b/firmware/src/hardware/Buttons.h deleted file mode 100644 index c0185d7..0000000 --- a/firmware/src/hardware/Buttons.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (C) Johannes Elliesen, 2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once -#include -#include -#include -#include - -/** Button identifiers */ -enum class Buttons -{ - record = 0, - store, - load, - select0, - select1, - select2, - select3, - playAndDirection0, - playAndDirection1, - playAndDirection2, - playAndDirection3, - NUM_BUTTONS -}; - -/** A backend to read buttons for the ButtonMonitor class. */ -class ButtonReader -{ -public: - ButtonReader() - { - } - - ~ButtonReader() - { - // TODO - } - - void init() - { - // TODO - } - - bool IsButtonPressed(uint16_t buttonId) const - { - assert(buttonId < uint16_t(Buttons::NUM_BUTTONS)); // TODO: write my own assert macro with bkpt(); - return false; // TODO - } - -private: - ButtonReader(const ButtonReader&) = delete; - ButtonReader& operator=(const ButtonReader&) = delete; -}; diff --git a/firmware/src/hardware/Pots.h b/firmware/src/hardware/Pots.h deleted file mode 100644 index c00770b..0000000 --- a/firmware/src/hardware/Pots.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (C) Johannes Elliesen, 2021 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once -#include -#include -#include -#include - -/** Potentiometer identifiers */ -enum class PotsAndCVs -{ - speed = 0, - lofi, - NUM_POTS -}; - -/** A backend to read potentiometers and CV inputs for the PotMonitor class. - */ -class PotReader -{ -public: - PotReader() {} - - void init() - { - const dsy_gpio_pin adcPin[numAdcChannels_] = { - { DSY_GPIOC, 0 }, // Daisy Seed pin 16 - { DSY_GPIOA, 3 }, // Daisy Seed pin 17 - }; - - daisy::AdcChannelConfig channelCfg[numAdcChannels_]; - for (size_t i = 0; i < numAdcChannels_; i++) - channelCfg[i].InitSingle(adcPin[i]); - adc_.Init(channelCfg, numAdcChannels_, daisy::AdcHandle::OverSampling::OVS_128); - adc_.Start(); - } - - float GetPotValue(uint16_t potId) const - { - assert(potId < uint16_t(PotsAndCVs::NUM_POTS)); // TODO: write my own assert macro with bkpt(); - return adc_.GetFloat(potId); - } - -private: - static constexpr size_t numAdcChannels_ = 2; - - PotReader(const PotReader&) = delete; - PotReader& operator=(const PotReader&) = delete; - - daisy::AdcHandle adc_; -}; diff --git a/firmware/src/hardware/UiHardware.h b/firmware/src/hardware/UiHardware.h new file mode 100644 index 0000000..8eb5d9a --- /dev/null +++ b/firmware/src/hardware/UiHardware.h @@ -0,0 +1,490 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include +#include +#include + +#include + +#include + +#include "../constants.h" +#include "UiHardwareTypes.h" + +extern "C" +{ +#include "util/hal_map.h" +} + +class UiHardware +{ +public: + using LedDriverType = daisy::LedDriverPca9685<3, false>; + using LedDmaBufferType = LedDriverType::DmaBuffer; + + UiHardware(daisy::UiEventQueue& eventQueue, + LedDmaBufferType bufferA, + LedDmaBufferType bufferB, + daisy::MAX11300Types::DmaBuffer* maxDmaBuffer) + { + potMonitor_.Init(eventQueue, *this); + buttonMonitor_.Init(eventQueue, + *this, + 10, // debounce time ms + 500, // double click time ms + 0); // retriggering disabled + + initControls(maxDmaBuffer); + initLeds(bufferA, bufferB); + } + + void setLedFromRawValues(Led led, float brightnessRed, float brightnessGreen) + { + auto& cfg = ledCfgs_[size_t(led)]; + cfg.mode = LedSettings::Mode::rawRG; + cfg.r = 0.0f; + cfg.r = brightnessRed; + cfg.g = brightnessGreen; + } + + void setLed(Led led, LedColour colour) + { + auto& cfg = ledCfgs_[size_t(led)]; + cfg.mode = LedSettings::Mode::colour; + cfg.colour = colour; + } + + void clearLeds() + { + for (size_t i = 0; i < ledCfgs_.size(); i++) + ledCfgs_[i].clear(); + } + + void transmitLeds() + { + updateLedBrightnessValues(); + ledDriver_.SwapBuffersAndTransmit(); + } + + float getCvVolts(CvInput cv) const + { + switch (cv) + { + case CvInput::chA_speed: + return max11300_.ReadAnalogPinVolts(0, daisy::MAX11300Types::PIN_0); + case CvInput::chA_volume: + return max11300_.ReadAnalogPinVolts(0, daisy::MAX11300Types::PIN_2); + case CvInput::chB_speed: + return max11300_.ReadAnalogPinVolts(0, daisy::MAX11300Types::PIN_1); + case CvInput::chB_volume: + return max11300_.ReadAnalogPinVolts(0, daisy::MAX11300Types::PIN_3); + case CvInput::chC_speed: + return max11300_.ReadAnalogPinVolts(1, daisy::MAX11300Types::PIN_0); + case CvInput::chC_volume: + return max11300_.ReadAnalogPinVolts(1, daisy::MAX11300Types::PIN_2); + case CvInput::chD_speed: + return max11300_.ReadAnalogPinVolts(1, daisy::MAX11300Types::PIN_1); + case CvInput::chD_volume: + return max11300_.ReadAnalogPinVolts(1, daisy::MAX11300Types::PIN_3); + case CvInput::NUM_CVS: + break; + } + return 0.0f; + } + + // =================================================================== + // implements the button reader interface for the libDaisy UI system + // =================================================================== + + bool IsButtonPressed(uint16_t buttonId) const + { + assert(buttonId < uint16_t(Button::NUM_BUTTONS)); // TODO: write my own assert macro with bkpt(); + switch (Button(buttonId)) + { + case Button::save: + return !dsy_gpio_read(&commonGpios_.save); + case Button::load: + return !dsy_gpio_read(&commonGpios_.load); + case Button::settings: + return !dsy_gpio_read(&commonGpios_.settings); + case Button::record: + return !dsy_gpio_read(&commonGpios_.rec); + case Button::chA_play: + return !dsy_gpio_read(&chanAGpios_.play); + case Button::chA_up: + return !dsy_gpio_read(&chanAGpios_.up); + case Button::chA_down: + return !dsy_gpio_read(&chanAGpios_.down); + case Button::chB_play: + return !max11300_.ReadDigitalPin(0, daisy::MAX11300Types::PIN_17); + case Button::chB_up: + return !max11300_.ReadDigitalPin(0, daisy::MAX11300Types::PIN_15); + case Button::chB_down: + return !max11300_.ReadDigitalPin(0, daisy::MAX11300Types::PIN_16); + case Button::chC_play: + return !max11300_.ReadDigitalPin(1, daisy::MAX11300Types::PIN_18); + case Button::chC_up: + return !max11300_.ReadDigitalPin(1, daisy::MAX11300Types::PIN_14); + case Button::chC_down: + return !max11300_.ReadDigitalPin(1, daisy::MAX11300Types::PIN_16); + case Button::chD_play: + return !max11300_.ReadDigitalPin(1, daisy::MAX11300Types::PIN_19); + case Button::chD_up: + return !max11300_.ReadDigitalPin(1, daisy::MAX11300Types::PIN_15); + case Button::chD_down: + return !max11300_.ReadDigitalPin(1, daisy::MAX11300Types::PIN_17); + case Button::NUM_BUTTONS: + break; + } + return false; + } + + // =================================================================== + // implements the pot reader interface for the libDaisy UI system + // =================================================================== + + float GetPotValue(uint16_t potId) const + { + assert(potId < uint16_t(Pot::NUM_POTS)); // TODO: write my own assert macro with bkpt(); + switch (Pot(potId)) + { + case Pot::chA_speed: + return float(max11300_.ReadAnalogPinRaw(0, daisy::MAX11300Types::PIN_4)) / 4095.0f; + case Pot::chA_warbleAmt: + return float(max11300_.ReadAnalogPinRaw(0, daisy::MAX11300Types::PIN_12)) / 4095.0f; + case Pot::chA_grainAmt: + return float(max11300_.ReadAnalogPinRaw(0, daisy::MAX11300Types::PIN_10)) / 4095.0f; + case Pot::chA_driveAmt: + return float(max11300_.ReadAnalogPinRaw(0, daisy::MAX11300Types::PIN_8)) / 4095.0f; + case Pot::chA_volume: + return float(max11300_.ReadAnalogPinRaw(0, daisy::MAX11300Types::PIN_6)) / 4095.0f; + case Pot::chB_speed: + return float(max11300_.ReadAnalogPinRaw(0, daisy::MAX11300Types::PIN_5)) / 4095.0f; + case Pot::chB_warbleAmt: + return float(max11300_.ReadAnalogPinRaw(0, daisy::MAX11300Types::PIN_14)) / 4095.0f; + case Pot::chB_grainAmt: + return float(max11300_.ReadAnalogPinRaw(0, daisy::MAX11300Types::PIN_11)) / 4095.0f; + case Pot::chB_driveAmt: + return float(max11300_.ReadAnalogPinRaw(0, daisy::MAX11300Types::PIN_9)) / 4095.0f; + case Pot::chB_volume: + return float(max11300_.ReadAnalogPinRaw(0, daisy::MAX11300Types::PIN_7)) / 4095.0f; + case Pot::chC_speed: + return float(max11300_.ReadAnalogPinRaw(1, daisy::MAX11300Types::PIN_4)) / 4095.0f; + case Pot::chC_warbleAmt: + return float(max11300_.ReadAnalogPinRaw(1, daisy::MAX11300Types::PIN_12)) / 4095.0f; + case Pot::chC_grainAmt: + return float(max11300_.ReadAnalogPinRaw(1, daisy::MAX11300Types::PIN_10)) / 4095.0f; + case Pot::chC_driveAmt: + return float(max11300_.ReadAnalogPinRaw(1, daisy::MAX11300Types::PIN_8)) / 4095.0f; + case Pot::chC_volume: + return float(max11300_.ReadAnalogPinRaw(1, daisy::MAX11300Types::PIN_6)) / 4095.0f; + case Pot::chD_speed: + return float(max11300_.ReadAnalogPinRaw(1, daisy::MAX11300Types::PIN_5)) / 4095.0f; + case Pot::chD_warbleAmt: + return float(max11300_.ReadAnalogPinRaw(1, daisy::MAX11300Types::PIN_13)) / 4095.0f; + case Pot::chD_grainAmt: + return float(max11300_.ReadAnalogPinRaw(1, daisy::MAX11300Types::PIN_11)) / 4095.0f; + case Pot::chD_driveAmt: + return float(max11300_.ReadAnalogPinRaw(1, daisy::MAX11300Types::PIN_9)) / 4095.0f; + case Pot::chD_volume: + return float(max11300_.ReadAnalogPinRaw(1, daisy::MAX11300Types::PIN_7)) / 4095.0f; + case Pot::NUM_POTS: + break; + } + return 0.0f; + } + +private: + UiHardware(const UiHardware&) = delete; + UiHardware& operator=(const UiHardware&) = delete; + + void initControls(daisy::MAX11300Types::DmaBuffer* maxDmaBuffer) + { + daisy::MAX11300<2>::Config config; + config.transport_config.periph = daisy::SpiHandle::Config::Peripheral::SPI_1; + config.transport_config.baud_prescaler = daisy::SpiHandle::Config::BaudPrescaler::PS_2; + config.transport_config.pin_config.nss[0] = { DSY_GPIOC, 1 }; + config.transport_config.pin_config.nss[1] = { DSY_GPIOC, 4 }; + config.transport_config.pin_config.sclk = { DSY_GPIOA, 5 }; + config.transport_config.pin_config.miso = { DSY_GPIOA, 6 }; + config.transport_config.pin_config.mosi = { DSY_GPIOA, 7 }; + max11300_.Init(config, maxDmaBuffer); + + // Pitch CVs + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_0, daisy::MAX11300Types::AdcVoltageRange::NEGATIVE_5_TO_5); + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_1, daisy::MAX11300Types::AdcVoltageRange::NEGATIVE_5_TO_5); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_0, daisy::MAX11300Types::AdcVoltageRange::NEGATIVE_5_TO_5); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_1, daisy::MAX11300Types::AdcVoltageRange::NEGATIVE_5_TO_5); + // Volume CVs + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_2, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_10); + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_3, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_10); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_2, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_10); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_3, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_10); + // Pitch pots + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_4, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_5, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_4, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_5, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + // Volume sliders + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_6, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_7, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_6, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_7, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + // Drive pots + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_8, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_9, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_8, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_9, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + // Grain pots + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_10, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_11, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_10, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_11, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + // Warble pots + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_12, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(0, daisy::MAX11300Types::PIN_14, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_12, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + max11300_.ConfigurePinAsAnalogRead(1, daisy::MAX11300Types::PIN_13, daisy::MAX11300Types::AdcVoltageRange::ZERO_TO_2P5); + // Buttons for ch A + chanAGpios_.up.pin = { DSY_GPIOB, 14 }; + chanAGpios_.up.mode = DSY_GPIO_MODE_INPUT; + chanAGpios_.up.pull = DSY_GPIO_NOPULL; + dsy_gpio_init(&chanAGpios_.up); + chanAGpios_.down.pin = { DSY_GPIOA, 2 }; + chanAGpios_.down.mode = DSY_GPIO_MODE_INPUT; + chanAGpios_.down.pull = DSY_GPIO_NOPULL; + dsy_gpio_init(&chanAGpios_.down); + chanAGpios_.play.pin = { DSY_GPIOB, 15 }; + chanAGpios_.play.mode = DSY_GPIO_MODE_INPUT; + chanAGpios_.play.pull = DSY_GPIO_NOPULL; + dsy_gpio_init(&chanAGpios_.play); + // Buttons for ch B + max11300_.ConfigurePinAsDigitalRead(0, daisy::MAX11300Types::PIN_15, 1.5f); // up B + max11300_.ConfigurePinAsDigitalRead(0, daisy::MAX11300Types::PIN_16, 1.5f); // down B + max11300_.ConfigurePinAsDigitalRead(0, daisy::MAX11300Types::PIN_17, 1.5f); // play B + // Buttons for ch C / D + max11300_.ConfigurePinAsDigitalRead(1, daisy::MAX11300Types::PIN_14, 1.5f); // up C + max11300_.ConfigurePinAsDigitalRead(1, daisy::MAX11300Types::PIN_15, 1.5f); // up D + max11300_.ConfigurePinAsDigitalRead(1, daisy::MAX11300Types::PIN_16, 1.5f); // down C + max11300_.ConfigurePinAsDigitalRead(1, daisy::MAX11300Types::PIN_17, 1.5f); // down D + max11300_.ConfigurePinAsDigitalRead(1, daisy::MAX11300Types::PIN_18, 1.5f); // play C + max11300_.ConfigurePinAsDigitalRead(1, daisy::MAX11300Types::PIN_19, 1.5f); // play D + // common section buttons + commonGpios_.settings.pin = { DSY_GPIOB, 7 }; + commonGpios_.settings.mode = DSY_GPIO_MODE_INPUT; + commonGpios_.settings.pull = DSY_GPIO_NOPULL; + dsy_gpio_init(&commonGpios_.settings); + commonGpios_.save.pin = { DSY_GPIOG, 11 }; + commonGpios_.save.mode = DSY_GPIO_MODE_INPUT; + commonGpios_.save.pull = DSY_GPIO_NOPULL; + dsy_gpio_init(&commonGpios_.save); + commonGpios_.load.pin = { DSY_GPIOG, 10 }; + commonGpios_.load.mode = DSY_GPIO_MODE_INPUT; + commonGpios_.load.pull = DSY_GPIO_NOPULL; + dsy_gpio_init(&commonGpios_.load); + commonGpios_.rec.pin = { DSY_GPIOB, 12 }; + commonGpios_.rec.mode = DSY_GPIO_MODE_INPUT; + commonGpios_.rec.pull = DSY_GPIO_NOPULL; + dsy_gpio_init(&commonGpios_.rec); + + max11300_.Start(&updateComplete, this); + } + + void initLeds(LedDmaBufferType bufferA, + LedDmaBufferType bufferB) + { + daisy::I2CHandle i2c; + daisy::I2CHandle::Config i2cCfg; + i2cCfg.periph = daisy::I2CHandle::Config::Peripheral::I2C_1; + i2cCfg.pin_config.sda = { DSY_GPIOB, 9 }; + i2cCfg.pin_config.scl = { DSY_GPIOB, 8 }; + i2cCfg.speed = daisy::I2CHandle::Config::Speed::I2C_400KHZ; + i2cCfg.mode = daisy::I2CHandle::Config::Mode::I2C_MASTER; + i2c.Init(i2cCfg); + + ledDriver_.Init(i2c, { 0b00, 0b01, 0b10 }, bufferA, bufferB, { DSY_GPIOB, 6 }); + } + + void updateLedBrightnessValues() + { + const auto pulseIntensity = getIntensityForCurrentSystemTime(); + for (size_t i = 0; i < ledCfgs_.size(); i++) + { + const auto cfg = ledCfgs_[i]; + const auto ledGreenIdx = getLedGreenIndex(Led(i)); + if (cfg.mode == LedSettings::Mode::rawRG) + { + ledDriver_.SetLed(ledGreenIdx, cfg.g); + ledDriver_.SetLed(ledGreenIdx + 1, cfg.r); + } + else + { + auto g = 0.0f; + auto r = 0.0f; + switch (cfg.colour) + { + case LedColour::off: + break; + case LedColour::red: + r = 1.0f; + break; + case LedColour::green: + g = 1.0f; + break; + case LedColour::yellow: + g = r = 1.0f; + break; + case LedColour::pulsingRed: + r = pulseIntensity; + break; + case LedColour::pulsingGreen: + g = pulseIntensity; + break; + case LedColour::pulsingYellow: + g = r = pulseIntensity; + break; + } + ledDriver_.SetLed(ledGreenIdx, g); + ledDriver_.SetLed(ledGreenIdx + 1, r); + } + } + } + + float getIntensityForCurrentSystemTime() + { + const auto time = daisy::System::GetNow(); + constexpr uint32_t ledCycleTimeMs = 1000; + const float phase = float(time % ledCycleTimeMs) / float(ledCycleTimeMs); + return phase < 0.5f ? 2.0f * phase : (2.0f - 2.0f * phase); + } + + int getLedGreenIndex(Led led) + { + switch (led) + { + case Led::peakMeterInL: + return 46; + case Led::peakMeterInR: + return 44; + case Led::peakMeterOutL: + return 42; + case Led::peakMeterOutR: + return 40; + case Led::save: + return 36; + case Led::load: + return 34; + case Led::settings: + return 38; + case Led::record: + return 32; + case Led::chA_m2: + return 0; + case Led::chA_m1: + return 2; + case Led::chA_p1: + return 4; + case Led::chA_p2: + return 6; + case Led::chB_m2: + return 14; + case Led::chB_m1: + return 12; + case Led::chB_p1: + return 10; + case Led::chB_p2: + return 8; + case Led::chC_m2: + return 16; + case Led::chC_m1: + return 18; + case Led::chC_p1: + return 20; + case Led::chC_p2: + return 22; + case Led::chD_m2: + return 30; + case Led::chD_m1: + return 28; + case Led::chD_p1: + return 26; + case Led::chD_p2: + return 24; + default: + return 0; + } + } + + void processControls() + { + // transform raw inputs into UI Events + potMonitor_.Process(); + buttonMonitor_.Process(); + } + + static void updateComplete(void* context) + { + UiHardware* sender = reinterpret_cast(context); + sender->processControls(); + } + + daisy::MAX11300<2> max11300_; + struct + { + dsy_gpio up; + dsy_gpio down; + dsy_gpio play; + } chanAGpios_; + struct + { + dsy_gpio settings; + dsy_gpio save; + dsy_gpio load; + dsy_gpio rec; + } commonGpios_; + LedDriverType ledDriver_; + + struct LedSettings + { + LedSettings() + { + clear(); + } + + void clear() + { + mode = Mode::rawRG; + r = 0.0f; + g = 0.0f; + colour = LedColour::off; + } + + enum class Mode + { + rawRG, + colour + } mode; + float r, g; + LedColour colour; + }; + std::array ledCfgs_; + + daisy::PotMonitor potMonitor_; + daisy::ButtonMonitor buttonMonitor_; +}; \ No newline at end of file diff --git a/firmware/src/hardware/UiHardwareTypes.h b/firmware/src/hardware/UiHardwareTypes.h new file mode 100644 index 0000000..131b19a --- /dev/null +++ b/firmware/src/hardware/UiHardwareTypes.h @@ -0,0 +1,118 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +/** Button identifiers */ +enum class Button +{ + save = 0, + load, + settings, + record, + chA_play, + chA_up, + chA_down, + chB_play, + chB_up, + chB_down, + chC_play, + chC_up, + chC_down, + chD_play, + chD_up, + chD_down, + NUM_BUTTONS +}; + +enum class Led +{ + peakMeterInL = 0, + peakMeterInR, + peakMeterOutL, + peakMeterOutR, + save, + load, + settings, + record, + chA_m2, + chA_m1, + chA_p1, + chA_p2, + chB_m2, + chB_m1, + chB_p1, + chB_p2, + chC_m2, + chC_m1, + chC_p1, + chC_p2, + chD_m2, + chD_m1, + chD_p1, + chD_p2, + NUM_LEDS +}; + +enum class Pot +{ + chA_speed = 0, + chA_warbleAmt, + chA_grainAmt, + chA_driveAmt, + chA_volume, + chB_speed, + chB_warbleAmt, + chB_grainAmt, + chB_driveAmt, + chB_volume, + chC_speed, + chC_warbleAmt, + chC_grainAmt, + chC_driveAmt, + chC_volume, + chD_speed, + chD_warbleAmt, + chD_grainAmt, + chD_driveAmt, + chD_volume, + NUM_POTS +}; + +enum class CvInput +{ + chA_speed = 0, + chA_volume, + chB_speed, + chB_volume, + chC_speed, + chC_volume, + chD_speed, + chD_volume, + NUM_CVS +}; + +enum class LedColour +{ + off, + red, + yellow, + green, + pulsingRed, + pulsingYellow, + pulsingGreen, +}; \ No newline at end of file diff --git a/firmware/src/main.cpp b/firmware/src/main.cpp index d9c2e01..5c193c7 100644 --- a/firmware/src/main.cpp +++ b/firmware/src/main.cpp @@ -1,16 +1,16 @@ -/** +/** * Copyright (C) Johannes Elliesen, 2021 - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -21,47 +21,49 @@ #include "constants.h" #include "dsp/PeakMeter.h" -#include "hardware/Buttons.h" -#include "hardware/Leds.h" -#include "hardware/Pots.h" -#include "ui/UiBasePage.h" +#include "hardware/UiHardware.h" +#include "ui/TapeLooperUi.h" #include "dsp/TapeLooper.h" #include "util/LateInitializedObject.h" +#include "LooperController.h" +#include "ui/LooperParameterProvider.h" #define EXTERNAL_SDRAM_SECTION __attribute__((section(".sdram_bss"))) -// constants -constexpr uint16_t potIdleTimeoutMs = 500; // TODO: adjust -constexpr uint16_t buttonDebounceTimeoutMs = 50; // TODO: adjust -constexpr uint32_t buttonDoubleClickTimeoutMs = 500; // TODO: adjust -constexpr uint32_t retriggerTimeoutMs = 1000; // TODO: adjust -constexpr uint32_t retriggerPeriodMs = 50; // TODO: adjust +// type definitions +using LooperParameterProviderType = LooperParameterProvider; +struct LooperTypes +{ + using MonoLooperType = TapeLooper; + using StereoLooperType = TapeLooper; + using ParameterProvider = LooperParameterProviderType; +}; +using LooperControllerType = LooperController; +using TapeLooperUiType = TapeLooperUi, + LooperControllerType, + LooperParameterProviderType>; +using LooperStoragesType = std::array, numLoopers>; // hardware static objects daisy::DaisySeed seed; -PotReader potReader; -ButtonReader buttonReader; // ui static objects daisy::UiEventQueue uiEventQueue; -daisy::PotMonitor potMonitor; -daisy::ButtonMonitor buttonMonitor; - -LedDriverType::DmaBuffer DMA_BUFFER_MEM_SECTION ledDmaBufferA, ledDmaBufferB; -LedDriverType leds; +daisy::MAX11300Types::DmaBuffer DMA_BUFFER_MEM_SECTION max11300DmaBuffer; +UiHardware::LedDmaBufferType DMA_BUFFER_MEM_SECTION ledDmaBufferA, ledDmaBufferB; -PeakMeter peakMeterInL; -PeakMeter peakMeterInR; -PeakMeter peakMeterOutL; -PeakMeter peakMeterOutR; +LateInitializedObject uiHardware; +LateInitializedObject ui; // dsp static objects +std::array, 4> peakMeters; #define EXTERNAL_SDRAM_SECTION __attribute__((section(".sdram_bss"))) -using LooperType = TapeLooper; -using LooperStorageType = LooperStorage; - -std::array, numLoopers> EXTERNAL_SDRAM_SECTION looperStorages = {}; -std::array, numLoopers> loopers; +LateInitializedObject EXTERNAL_SDRAM_SECTION looperStorages; +LateInitializedObject looperParameterProvider; +AudioBuffer<1, blockSize> monoDownmixBuffer; +AudioBuffer<1, blockSize> temporaryBuffer; +LateInitializedObject looperController; // misc daisy::CpuLoadMeter cpuLoadMeter; @@ -70,47 +72,33 @@ daisy::CpuLoadMeter cpuLoadMeter; // UI // =================================================================== -daisy::UI ui; - -void clearDisplay(const daisy::UiCanvasDescriptor&) +void clearLedDisplay(const daisy::UiCanvasDescriptor&) { - leds.SetAllToRaw(0); + uiHardware->clearLeds(); } -void updateDisplay(const daisy::UiCanvasDescriptor&) +void flushLedDisplay(const daisy::UiCanvasDescriptor&) { - leds.SwapBuffersAndTransmit(); + uiHardware->transmitLeds(); } void initUi() { - // initialize the display - // TODO - - // add the led display canvas - daisy::UiCanvasDescriptor ledDisplayDescriptor; - ledDisplayDescriptor.id_ = 0; - ledDisplayDescriptor.handle_ = &leds; - ledDisplayDescriptor.updateRateMs_ = 50; - ledDisplayDescriptor.clearFunction_ = &clearDisplay; - ledDisplayDescriptor.flushFunction_ = &updateDisplay; - - // initialize the UI - ui.Init(uiEventQueue, - daisy::UI::SpecialControlIds {}, - { ledDisplayDescriptor }); -} - -// =================================================================== -// UI Pages -// =================================================================== - -BaseUiPage basePage; - -void initUiPages() -{ - // open the base UI page - ui.OpenPage(basePage); + // init the UI hardware + auto& hardware = *uiHardware.create(uiEventQueue, + ledDmaBufferA, + ledDmaBufferB, + &max11300DmaBuffer); + + // init the UI + ui.create( + hardware, + &clearLedDisplay, + &flushLedDisplay, + uiEventQueue, + peakMeters, + looperController, + looperParameterProvider); } // =================================================================== @@ -119,17 +107,26 @@ void initUiPages() void initDsp() { - for (size_t l = 0; l < numLoopers; l++) - { - looperStorages[l].create(); - loopers[l].create(*looperStorages[l]); - } + // init the parameter provider + looperParameterProvider.create(); + + // initialize the looper storage in SDRAM + const auto& rawStorages = *looperStorages.create(); + // build an array of storage pointers + std::array arrayOfStoragePtrs; + for (size_t i = 0; i < numLoopers; i++) + arrayOfStoragePtrs[i] = rawStorages[i]; + + // initialize the looper controller that contains/controls the loopers + looperController.create( + arrayOfStoragePtrs, + monoDownmixBuffer, + temporaryBuffer, + looperParameterProvider); // init peak meters - peakMeterInL.init(0.5f); - peakMeterInR.init(0.5f); - peakMeterOutL.init(0.5f); - peakMeterOutR.init(0.5f); + for (auto& peakMeter : peakMeters) + peakMeter.init(0.5f); // init CPU load meter cpuLoadMeter.Init(seed.AudioSampleRate(), seed.AudioBlockSize()); @@ -138,68 +135,31 @@ void initDsp() // =================================================================== // =================================================================== -void configureHardware() +void configurePlatform() { - // Configure and Initialize the Daisy Seed - // These are separate to allow reconfiguration of any of the internal - // components before initialization. seed.Configure(); seed.Init(true /* enable 480MHz boost */); seed.SetAudioBlockSize(blockSize); seed.SetAudioSampleRate(sampleRate); - - potReader.init(); - buttonReader.init(); - - // init leds - daisy::I2CHandle i2c; - i2c.Init({ daisy::I2CHandle::Config::Peripheral::I2C_1, - { { DSY_GPIOB, 8 }, { DSY_GPIOB, 9 } }, - daisy::I2CHandle::Config::Speed::I2C_100KHZ }); - leds.Init(i2c, - { 0 }, - ledDmaBufferA, - ledDmaBufferB, - { DSY_GPIOB, 6 }); -} - -void scanUiControls() -{ - potMonitor.Process(); - buttonMonitor.Process(); } void audioCallback(const float* const* in, float** out, size_t size) { cpuLoadMeter.OnBlockStart(); - scanUiControls(); // TODO: move to low prio timer? - // peak meters - peakMeterInL.readPeaks(in[0]); - peakMeterInR.readPeaks(in[1]); + peakMeters[0].readPeaks(in[0]); + peakMeters[1].readPeaks(in[1]); + // process AudioBufferPtr inputs(in, size); AudioBufferPtr outputs(out, size); outputs.fill(0.0f); - for (size_t l = 0; l < numLoopers; l++) - { - loopers[l]->process( - 4.0f, // speed - 1.0f, // wow & flutter amt - Direction::forwards, - { - 0.5f, // drive amt - 0.5f // grain amt - }, - 1.0f, // post gain - inputs, - outputs); - } + looperController->process(inputs, outputs); // peak meters - peakMeterOutL.readPeaks(out[0]); - peakMeterOutR.readPeaks(out[1]); + peakMeters[2].readPeaks(out[0]); + peakMeters[3].readPeaks(out[1]); // clip outputs // TODO @@ -212,39 +172,18 @@ void audioCallback(const float* const* in, float** out, size_t size) int main(void) { - configureHardware(); - - // init monitors - potMonitor.Init(uiEventQueue, - potReader, - potIdleTimeoutMs); - buttonMonitor.Init(uiEventQueue, - buttonReader, - buttonDebounceTimeoutMs, - buttonDoubleClickTimeoutMs, - retriggerTimeoutMs, - retriggerPeriodMs); - - initUi(); - initUiPages(); + configurePlatform(); initDsp(); + initUi(); + // start audio seed.StartAudio(&audioCallback); - for (size_t l = 0; l < numLoopers; l++) - loopers[l]->switchState(LooperState::recording); - seed.system.Delay(200); - for (size_t l = 0; l < numLoopers; l++) - loopers[l]->switchState(LooperState::playing); - // UI loop for (;;) { - ui.Process(); - - // Wait 5ms - seed.system.Delay(5); + ui->process(); } } diff --git a/firmware/src/ui/LooperParameterProvider.h b/firmware/src/ui/LooperParameterProvider.h new file mode 100644 index 0000000..69627b2 --- /dev/null +++ b/firmware/src/ui/LooperParameterProvider.h @@ -0,0 +1,153 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include + +#include "../util/PlateauMap.h" + +/** + * Consumes raw UI control inputs (potentiometer positions, etc.) + * and converts them to mapped DSP parameters for the LooperController + */ +template +class LooperParameterProvider +{ +public: + /** Called by the LooperController */ + float getSpeedParameter(size_t looperChannel) const + { + return limit(getUnclampedSpeedParameter(looperChannel), minSpeed_, maxSpeed_); + } + /** Called by the LooperController */ + float getWowAndFlutterAmtParameter(size_t looperChannel) const + { + return controlInputs_[looperChannel].wowAndFlutterAmt; + } + /** Called by the LooperController */ + float getGainParameter(size_t looperChannel) const + { + return volumeSliderToGainMultiplier(controlInputs_[looperChannel].volumeSliderPosition) + * volumeCvToGainMultiplier(controlInputs_[looperChannel].volumeCvVolts); + } + /** Called by the LooperController */ + TapeProcessorParameters getProcessorParameters(size_t looperChannel) const + { + TapeProcessorParameters results; + results.driveGain = drivePotToDriveGain(controlInputs_[looperChannel].driveAmt); + results.grainAmt = controlInputs_[looperChannel].grainAmt; + return results; + } + + enum class ValueRangeViolation + { + tooLow, + okay, + tooHigh + }; + + ValueRangeViolation getSpeedParameterRangeViolation(size_t looperChannel) const + { + const auto unclampedSpeed = getUnclampedSpeedParameter(looperChannel); + if (unclampedSpeed > maxSpeed_) + return ValueRangeViolation::tooHigh; + else if (unclampedSpeed < minSpeed_) + return ValueRangeViolation::tooLow; + return ValueRangeViolation::okay; + } + + struct ControlInputs + { + // -2 .. 2 + int8_t octave = 0; + + // 0 .. 10 + float volumeCvVolts = 0.0f; + // -5 .. 5 + float pitchCvVolts = 0.0f; + + // the rest here is 0..1 + float fineTunePosition = 0.5f; + float wowAndFlutterAmt = 0.0f; + float volumeSliderPosition = 0.0f; + float driveAmt = 0.0f; + float grainAmt = 0.0f; + }; + + /** Set from UI pages */ + std::array + controlInputs_; + +private: + static constexpr float minSpeed_ = 0.25f; + static constexpr float maxSpeed_ = 4.0f; + static constexpr float minDriveGain_ = 0.25f; + static constexpr float maxDriveGain_ = 100.0f; + static constexpr float maxSliderGain_ = 2.0f; + static constexpr float maxCvGain_ = 2.0f; + static constexpr size_t numPlateaus_ = 5; + static constexpr int minSemitones_ = -7; + static constexpr int maxSemitones_ = 7; + + static constexpr float semitoneToFineTuneKnobPosition(int semitone) + { + constexpr int range = maxSemitones_ - minSemitones_; + return float(semitone - minSemitones_) / float(range); + } + static constexpr PlateauMapParameters fineTunePlateauParams_ = + PlateauMapParameters({ semitoneToFineTuneKnobPosition(-5), + semitoneToFineTuneKnobPosition(-3), + semitoneToFineTuneKnobPosition(0), + semitoneToFineTuneKnobPosition(3), + semitoneToFineTuneKnobPosition(5) }); + + float pitchCvToSemitones(float cvVolts) const + { + (void) (cvVolts); + return 0.0f; // TODO + } + + float volumeSliderToGainMultiplier(float sliderValue) const + { + constexpr auto maxGain = 2.0f; + return sliderValue * sliderValue * maxGain; + } + + float volumeCvToGainMultiplier(float cvVolts) const + { + (void) (cvVolts); + return 1.0f; // TODO + } + + float getUnclampedSpeedParameter(size_t looperChannel) const + { + auto semitones = 12.0f * float(controlInputs_[looperChannel].octave); + semitones += pitchCvToSemitones(controlInputs_[looperChannel].pitchCvVolts); + auto mappedFintTuneKnobPosition = plateauMap( + controlInputs_[looperChannel].fineTunePosition, + fineTunePlateauParams_); + semitones += linMap(mappedFintTuneKnobPosition, float(minSemitones_), float(maxSemitones_)); + return semitonesToRatio(semitones); + } + + float drivePotToDriveGain(float normalizedInput) const + { + const auto mappedDriveGain = normalizedInput * normalizedInput * normalizedInput; + return linMap(mappedDriveGain, minDriveGain_, maxDriveGain_); + } +}; \ No newline at end of file diff --git a/firmware/src/ui/TapeLooperUi.h b/firmware/src/ui/TapeLooperUi.h new file mode 100644 index 0000000..e208ff6 --- /dev/null +++ b/firmware/src/ui/TapeLooperUi.h @@ -0,0 +1,104 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include + +#include +#include + +#include "LooperParameterProvider.h" +#include "UiBasePage.h" +#include "UiSettingsPage.h" +#include "UiSavePage.h" +#include "UiLoadPage.h" +#include "UiRecordingPage.h" + +template +class TapeLooperUi +{ +public: + TapeLooperUi(UiHardwareType& uiHardware, + daisy::UiCanvasDescriptor::ClearFuncPtr clearFunction, + daisy::UiCanvasDescriptor::FlushFuncPtr flushFunction, + daisy::UiEventQueue& eventQueue, + const std::array& peakMeters, + LooperControllerType& looperController, + ParameterProviderType& looperParameterProvider) : + uiHardware_(uiHardware), + eventQueue_(eventQueue), + settingsPage_(looperController, + looperParameterProvider), + savePage_(looperController), + loadPage_(looperController), + recordingPage_(looperController), + basePage_(peakMeters, + looperController, + looperParameterProvider, + settingsPage_, + savePage_, + loadPage_, + recordingPage_) + { + daisy::UiCanvasDescriptor ledCanvas; + ledCanvas.clearFunction_ = clearFunction; + ledCanvas.flushFunction_ = flushFunction; + ledCanvas.handle_ = &uiHardware_; + ledCanvas.id_ = 0; + ledCanvas.updateRateMs_ = 20; // 50Hz + + ui_.Init(eventQueue_, + daisy::UI::SpecialControlIds {}, + { ledCanvas }); + ui_.OpenPage(basePage_); + } + + void process() + { + ui_.Process(); + } + +private: + TapeLooperUi(const TapeLooperUi&) = delete; + TapeLooperUi& operator=(const TapeLooperUi&) = delete; + + UiHardwareType& uiHardware_; + daisy::UiEventQueue& eventQueue_; + daisy::UI ui_; + UiSettingsPage + settingsPage_; + UiSavePage + savePage_; + UiLoadPage + loadPage_; + UiRecordingPage + recordingPage_; + UiBasePage + basePage_; +}; \ No newline at end of file diff --git a/firmware/src/ui/UiBasePage.h b/firmware/src/ui/UiBasePage.h index 22432cd..f18a7a3 100644 --- a/firmware/src/ui/UiBasePage.h +++ b/firmware/src/ui/UiBasePage.h @@ -1,68 +1,279 @@ -/** +/** * Copyright (C) Johannes Elliesen, 2021 - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once -#include +#include +#include -#include "../constants.h" -#include "../hardware/Leds.h" +#include +#include -// defined in main.cpp -extern PeakMeter peakMeterInL; -extern PeakMeter peakMeterInR; -extern PeakMeter peakMeterOutL; -extern PeakMeter peakMeterOutR; +#include "../constants.h" +#include "../hardware/UiHardwareTypes.h" +#include "LooperParameterProvider.h" -class BaseUiPage : public daisy::UiPage +template +class UiBasePage : public daisy::UiPage { public: - BaseUiPage() + UiBasePage(const std::array& peakMeters, + LooperControllerType& looperController, + ParameterProviderType& looperParameterProvider, + daisy::UiPage& settingsPage, + daisy::UiPage& savePage, + daisy::UiPage& loadPage, + daisy::UiPage& recordPage) : + peakMeters_(peakMeters), + looperController_(looperController), + looperParameterProvider_(looperParameterProvider), + settingsPage_(settingsPage), + savePage_(savePage), + loadPage_(loadPage), + recordPage_(recordPage) { } - virtual ~BaseUiPage() {} + virtual ~UiBasePage() {} void Draw(const daisy::UiCanvasDescriptor& canvas) override { - if (canvas.id_ == ledCanvasId) + UiHardwareType& hardware = *((UiHardwareType*) canvas.handle_); + + // update peak meter LEDs + float red, green; + peakMeters_[0].getRedAndGreenValues(red, green); + hardware.setLedFromRawValues(Led::peakMeterInL, red, green); + peakMeters_[1].getRedAndGreenValues(red, green); + hardware.setLedFromRawValues(Led::peakMeterInR, red, green); + peakMeters_[2].getRedAndGreenValues(red, green); + hardware.setLedFromRawValues(Led::peakMeterOutL, red, green); + peakMeters_[3].getRedAndGreenValues(red, green); + hardware.setLedFromRawValues(Led::peakMeterOutR, red, green); + + // update channel octave LEDs + const auto updateChannelOctaveLeds = [&](size_t looperChannel, std::array ledIds) + { + // select colour + const auto looperState = looperController_.getLooperState(looperChannel); + auto colourToUse = LedColour::green; + if (looperState == LooperState::recording) + colourToUse = LedColour::pulsingRed; + else if (looperState == LooperState::playing) + colourToUse = LedColour::yellow; + + const auto octave = looperParameterProvider_.controlInputs_[looperChannel].octave; + hardware.setLed(ledIds[0], + octave == -2 ? colourToUse : LedColour::off); + hardware.setLed(ledIds[1], + (octave == -1) || (octave == 0) ? colourToUse : LedColour::off); + hardware.setLed(ledIds[2], + (octave == 1) || (octave == 0) ? colourToUse : LedColour::off); + hardware.setLed(ledIds[3], + octave == 2 ? colourToUse : LedColour::off); + }; + updateChannelOctaveLeds(0, { Led::chA_m2, Led::chA_m1, Led::chA_p1, Led::chA_p2 }); + updateChannelOctaveLeds(1, { Led::chB_m2, Led::chB_m1, Led::chB_p1, Led::chB_p2 }); + updateChannelOctaveLeds(2, { Led::chC_m2, Led::chC_m1, Led::chC_p1, Led::chC_p2 }); + updateChannelOctaveLeds(3, { Led::chD_m2, Led::chD_m1, Led::chD_p1, Led::chD_p2 }); + } + + bool OnButton(uint16_t buttonID, uint8_t numberOfPresses, bool isRetriggering) override + { + (void) (isRetriggering); // ignore this argument + + // swallow but ignore button-up messages + if (numberOfPresses < 1) + return true; + + const Button button = Button(buttonID); + switch (button) { - LedDriverType& leds = *((LedDriverType*) canvas.handle_); - - // update peak meter leds - float red, green; - peakMeterInL.getRedAndGreenValues(red, green); - leds.SetLed(0, green); - leds.SetLed(1, red); - peakMeterInR.getRedAndGreenValues(red, green); - leds.SetLed(2, green); - leds.SetLed(3, red); - peakMeterOutL.getRedAndGreenValues(red, green); - leds.SetLed(6, green); - leds.SetLed(7, red); - peakMeterOutR.getRedAndGreenValues(red, green); - leds.SetLed(8, green); - leds.SetLed(9, red); + // channel play buttons + case Button::chA_play: + onPlayButton(0); + break; + case Button::chB_play: + onPlayButton(1); + break; + case Button::chC_play: + onPlayButton(2); + break; + case Button::chD_play: + onPlayButton(3); + break; + // channel up rocker switch + case Button::chA_up: + onUpButton(0); + break; + case Button::chB_up: + onUpButton(1); + break; + case Button::chC_up: + onUpButton(2); + break; + case Button::chD_up: + onUpButton(3); + break; + // channel down rocker switch + case Button::chA_down: + onDownButton(0); + break; + case Button::chB_down: + onDownButton(1); + break; + case Button::chC_down: + onDownButton(2); + break; + case Button::chD_down: + onDownButton(3); + break; + // switch to sub pages + case Button::settings: + GetParentUI()->OpenPage(settingsPage_); + break; + case Button::save: + GetParentUI()->OpenPage(savePage_); + break; + case Button::load: + GetParentUI()->OpenPage(loadPage_); + break; + case Button::record: + GetParentUI()->OpenPage(recordPage_); + break; + default: + break; } + return true; } - bool OnButton(uint16_t, uint8_t, bool) override + bool OnPotMoved(uint16_t potID, float newPosition) override { - // TODO + // write raw user inputs to the looperParameterProvider + + const Pot pot = Pot(potID); + switch (pot) + { + // speed / pitch + case Pot::chA_speed: + looperParameterProvider_.controlInputs_[0].fineTunePosition = newPosition; + break; + case Pot::chB_speed: + looperParameterProvider_.controlInputs_[1].fineTunePosition = newPosition; + break; + case Pot::chC_speed: + looperParameterProvider_.controlInputs_[2].fineTunePosition = newPosition; + break; + case Pot::chD_speed: + looperParameterProvider_.controlInputs_[3].fineTunePosition = newPosition; + break; + // grain + case Pot::chA_grainAmt: + looperParameterProvider_.controlInputs_[0].grainAmt = newPosition; + break; + case Pot::chB_grainAmt: + looperParameterProvider_.controlInputs_[1].grainAmt = newPosition; + break; + case Pot::chC_grainAmt: + looperParameterProvider_.controlInputs_[2].grainAmt = newPosition; + break; + case Pot::chD_grainAmt: + looperParameterProvider_.controlInputs_[3].grainAmt = newPosition; + break; + // warble + case Pot::chA_warbleAmt: + looperParameterProvider_.controlInputs_[0].wowAndFlutterAmt = newPosition; + break; + case Pot::chB_warbleAmt: + looperParameterProvider_.controlInputs_[1].wowAndFlutterAmt = newPosition; + break; + case Pot::chC_warbleAmt: + looperParameterProvider_.controlInputs_[2].wowAndFlutterAmt = newPosition; + break; + case Pot::chD_warbleAmt: + looperParameterProvider_.controlInputs_[3].wowAndFlutterAmt = newPosition; + break; + // drive + case Pot::chA_driveAmt: + looperParameterProvider_.controlInputs_[0].driveAmt = newPosition; + break; + case Pot::chB_driveAmt: + looperParameterProvider_.controlInputs_[1].driveAmt = newPosition; + break; + case Pot::chC_driveAmt: + looperParameterProvider_.controlInputs_[2].driveAmt = newPosition; + break; + case Pot::chD_driveAmt: + looperParameterProvider_.controlInputs_[3].driveAmt = newPosition; + break; + // volume + case Pot::chA_volume: + looperParameterProvider_.controlInputs_[0].volumeSliderPosition = newPosition; + break; + case Pot::chB_volume: + looperParameterProvider_.controlInputs_[1].volumeSliderPosition = newPosition; + break; + case Pot::chC_volume: + looperParameterProvider_.controlInputs_[2].volumeSliderPosition = newPosition; + break; + case Pot::chD_volume: + looperParameterProvider_.controlInputs_[3].volumeSliderPosition = newPosition; + break; + default: + break; + } + return true; } + +private: + UiBasePage(const UiBasePage&) = delete; + UiBasePage& operator=(const UiBasePage&) = delete; + + void onPlayButton(size_t looperChannel) + { + const auto currentState = looperController_.getLooperState(looperChannel); + if (currentState == LooperState::playing) + looperController_.setLooperState(looperChannel, LooperState::stopped); + else if (currentState == LooperState::stopped) + looperController_.setLooperState(looperChannel, LooperState::playing); + else if (currentState == LooperState::recording) + looperController_.setLooperState(looperChannel, LooperState::playing); + } + + void onUpButton(size_t looperChannel) + { + auto& currentOctave = looperParameterProvider_.controlInputs_[looperChannel].octave; + if (currentOctave < 2) + currentOctave++; + } + + void onDownButton(size_t looperChannel) + { + auto& currentOctave = looperParameterProvider_.controlInputs_[looperChannel].octave; + if (currentOctave > -2) + currentOctave--; + } + + const std::array& peakMeters_; + LooperControllerType& looperController_; + ParameterProviderType& looperParameterProvider_; + daisy::UiPage& settingsPage_; + daisy::UiPage& savePage_; + daisy::UiPage& loadPage_; + daisy::UiPage& recordPage_; }; \ No newline at end of file diff --git a/firmware/src/ui/UiLoadPage.h b/firmware/src/ui/UiLoadPage.h new file mode 100644 index 0000000..58f3157 --- /dev/null +++ b/firmware/src/ui/UiLoadPage.h @@ -0,0 +1,102 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include +#include + +#include +#include + +#include "../constants.h" +#include "../hardware/UiHardwareTypes.h" +#include "LooperParameterProvider.h" + +template +class UiLoadPage : public daisy::UiPage +{ +public: + UiLoadPage(LooperControllerType& looperController) : + looperController_(looperController) + { + } + + virtual ~UiLoadPage() {} + + bool IsOpaque(const daisy::UiCanvasDescriptor&) override { return false; } + + void Draw(const daisy::UiCanvasDescriptor& canvas) override + { + UiHardwareType& hardware = *((UiHardwareType*) canvas.handle_); + + // light up the load page led + hardware.setLed(Led::load, LedColour::pulsingRed); + + // update channel octave LEDs to show the currently selected slot + // TODO + const auto updateChannelOctaveLeds = [&](size_t looperChannel, std::array ledIds) + { + (void) (looperChannel); + hardware.setLed(ledIds[0], LedColour::off); + hardware.setLed(ledIds[1], LedColour::off); + hardware.setLed(ledIds[2], LedColour::off); + hardware.setLed(ledIds[3], LedColour::off); + }; + updateChannelOctaveLeds(0, { Led::chA_m2, Led::chA_m1, Led::chA_p1, Led::chA_p2 }); + updateChannelOctaveLeds(1, { Led::chB_m2, Led::chB_m1, Led::chB_p1, Led::chB_p2 }); + updateChannelOctaveLeds(2, { Led::chC_m2, Led::chC_m1, Led::chC_p1, Led::chC_p2 }); + updateChannelOctaveLeds(3, { Led::chD_m2, Led::chD_m1, Led::chD_p1, Led::chD_p2 }); + } + + bool OnButton(uint16_t buttonID, uint8_t numberOfPresses, bool isRetriggering) override + { + (void) (isRetriggering); // ignore this argument + + // swallow but ignore button-up messages + if (numberOfPresses < 1) + return true; + + const Button button = Button(buttonID); + switch (button) + { + // channel play buttons + case Button::load: + Close(); // close this page + break; + case Button::record: + case Button::save: + case Button::settings: + Close(); // close this page + return false; // pass event to the page below to open the respective page + default: + break; + } + return true; + } + + bool OnPotMoved(uint16_t, float) override + { + return false; // passthrough pot events to the base page + } + +private: + UiLoadPage(const UiLoadPage&) = delete; + UiLoadPage& operator=(const UiLoadPage&) = delete; + + LooperControllerType& looperController_; +}; \ No newline at end of file diff --git a/firmware/src/ui/UiRecordingPage.h b/firmware/src/ui/UiRecordingPage.h new file mode 100644 index 0000000..ec917d8 --- /dev/null +++ b/firmware/src/ui/UiRecordingPage.h @@ -0,0 +1,126 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include +#include + +#include +#include + +#include "../constants.h" +#include "../hardware/UiHardwareTypes.h" +#include "LooperParameterProvider.h" + +template +class UiRecordingPage : public daisy::UiPage +{ +public: + UiRecordingPage(LooperControllerType& looperController) : + looperController_(looperController) + { + } + + virtual ~UiRecordingPage() {} + + bool IsOpaque(const daisy::UiCanvasDescriptor&) override { return false; } + + void Draw(const daisy::UiCanvasDescriptor& canvas) override + { + UiHardwareType& hardware = *((UiHardwareType*) canvas.handle_); + + // light up the record page led + hardware.setLed(Led::record, LedColour::pulsingRed); + + // update channel octave LEDs to reflect the recording state + const auto updateChannelOctaveLeds = [&](size_t looperChannel, std::array ledIds) + { + const auto colourToUse = looperController_.getLooperState(looperChannel) + == LooperState::recording + ? LedColour::pulsingRed + : LedColour::off; + hardware.setLed(ledIds[0], colourToUse); + hardware.setLed(ledIds[1], colourToUse); + hardware.setLed(ledIds[2], colourToUse); + hardware.setLed(ledIds[3], colourToUse); + }; + updateChannelOctaveLeds(0, { Led::chA_m2, Led::chA_m1, Led::chA_p1, Led::chA_p2 }); + updateChannelOctaveLeds(1, { Led::chB_m2, Led::chB_m1, Led::chB_p1, Led::chB_p2 }); + updateChannelOctaveLeds(2, { Led::chC_m2, Led::chC_m1, Led::chC_p1, Led::chC_p2 }); + updateChannelOctaveLeds(3, { Led::chD_m2, Led::chD_m1, Led::chD_p1, Led::chD_p2 }); + } + + bool OnButton(uint16_t buttonID, uint8_t numberOfPresses, bool isRetriggering) override + { + (void) (isRetriggering); // ignore this argument + + // swallow but ignore button-up messages + if (numberOfPresses < 1) + return true; + + const Button button = Button(buttonID); + switch (button) + { + // channel play buttons + case Button::chA_play: + onPlayButton(0); + break; + case Button::chB_play: + onPlayButton(1); + break; + case Button::chC_play: + onPlayButton(2); + break; + case Button::chD_play: + onPlayButton(3); + break; + case Button::record: + Close(); // close this page + break; + case Button::save: + case Button::load: + case Button::settings: + Close(); // close this page + return false; // pass event to the page below to open the respective page + break; + default: + break; + } + return true; + } + + bool OnPotMoved(uint16_t, float) override + { + return false; // passthrough pot events to the base page + } + +private: + UiRecordingPage(const UiRecordingPage&) = delete; + UiRecordingPage& operator=(const UiRecordingPage&) = delete; + + void onPlayButton(size_t looperChannel) + { + const auto currentState = looperController_.getLooperState(looperChannel); + if (currentState != LooperState::recording) + looperController_.setLooperState(looperChannel, LooperState::recording); + else + looperController_.setLooperState(looperChannel, LooperState::stopped); + } + + LooperControllerType& looperController_; +}; \ No newline at end of file diff --git a/firmware/src/ui/UiSavePage.h b/firmware/src/ui/UiSavePage.h new file mode 100644 index 0000000..338d50f --- /dev/null +++ b/firmware/src/ui/UiSavePage.h @@ -0,0 +1,102 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include +#include + +#include +#include + +#include "../constants.h" +#include "../hardware/UiHardwareTypes.h" +#include "LooperParameterProvider.h" + +template +class UiSavePage : public daisy::UiPage +{ +public: + UiSavePage(LooperControllerType& looperController) : + looperController_(looperController) + { + } + + virtual ~UiSavePage() {} + + bool IsOpaque(const daisy::UiCanvasDescriptor&) override { return false; } + + void Draw(const daisy::UiCanvasDescriptor& canvas) override + { + UiHardwareType& hardware = *((UiHardwareType*) canvas.handle_); + + // light up the save page led + hardware.setLed(Led::save, LedColour::pulsingRed); + + // update channel octave LEDs to show the currently selected slot + // TODO + const auto updateChannelOctaveLeds = [&](size_t looperChannel, std::array ledIds) + { + (void) (looperChannel); + hardware.setLed(ledIds[0], LedColour::off); + hardware.setLed(ledIds[1], LedColour::off); + hardware.setLed(ledIds[2], LedColour::off); + hardware.setLed(ledIds[3], LedColour::off); + }; + updateChannelOctaveLeds(0, { Led::chA_m2, Led::chA_m1, Led::chA_p1, Led::chA_p2 }); + updateChannelOctaveLeds(1, { Led::chB_m2, Led::chB_m1, Led::chB_p1, Led::chB_p2 }); + updateChannelOctaveLeds(2, { Led::chC_m2, Led::chC_m1, Led::chC_p1, Led::chC_p2 }); + updateChannelOctaveLeds(3, { Led::chD_m2, Led::chD_m1, Led::chD_p1, Led::chD_p2 }); + } + + bool OnButton(uint16_t buttonID, uint8_t numberOfPresses, bool isRetriggering) override + { + (void) (isRetriggering); // ignore this argument + + // swallow but ignore button-up messages + if (numberOfPresses < 1) + return true; + + const Button button = Button(buttonID); + switch (button) + { + // channel play buttons + case Button::save: + Close(); // close this page + break; + case Button::record: + case Button::load: + case Button::settings: + Close(); // close this page + return false; // pass event to the page below to open the respective page + default: + break; + } + return true; + } + + bool OnPotMoved(uint16_t, float) override + { + return false; // passthrough pot events to the base page + } + +private: + UiSavePage(const UiSavePage&) = delete; + UiSavePage& operator=(const UiSavePage&) = delete; + + LooperControllerType& looperController_; +}; \ No newline at end of file diff --git a/firmware/src/ui/UiSettingsPage.h b/firmware/src/ui/UiSettingsPage.h new file mode 100644 index 0000000..a880e38 --- /dev/null +++ b/firmware/src/ui/UiSettingsPage.h @@ -0,0 +1,271 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include +#include + +#include +#include + +#include "../constants.h" +#include "../LooperController.h" +#include "../hardware/UiHardwareTypes.h" +#include "LooperParameterProvider.h" + +template +class UiSettingsPage : public daisy::UiPage +{ +public: + UiSettingsPage(LooperControllerType& looperController, + LooperParameterProviderType& looperParameterProvider) : + looperController_(looperController), + looperParameterProvider_(looperParameterProvider) + { + } + + virtual ~UiSettingsPage() {} + + bool IsOpaque(const daisy::UiCanvasDescriptor&) override { return false; } + + void Draw(const daisy::UiCanvasDescriptor& canvas) override + { + UiHardwareType& hardware = *((UiHardwareType*) canvas.handle_); + + // light up the settings page led + if (currentSetting_ == Setting::direction) + hardware.setLed(Led::settings, LedColour::pulsingRed); + else if (currentSetting_ == Setting::numChannels) + hardware.setLed(Led::settings, LedColour::pulsingYellow); + else + hardware.setLed(Led::settings, LedColour::pulsingGreen); + + // update channel octave LEDs to show the currently selected setting + const auto updateChannelOctaveLeds = [&](size_t looperChannel, std::array ledIds) + { + if (currentSetting_ == Setting::direction) + { + if (looperController_.getDirection(looperChannel) == Direction::forwards) + { + hardware.setLed(ledIds[0], LedColour::off); + hardware.setLed(ledIds[1], LedColour::off); + hardware.setLed(ledIds[2], LedColour::red); + hardware.setLed(ledIds[3], LedColour::red); + } + else + { + hardware.setLed(ledIds[0], LedColour::red); + hardware.setLed(ledIds[1], LedColour::red); + hardware.setLed(ledIds[2], LedColour::off); + hardware.setLed(ledIds[3], LedColour::off); + } + } + else if (currentSetting_ == Setting::numChannels) + { + hardware.setLed(ledIds[0], LedColour::yellow); + hardware.setLed(ledIds[1], LedColour::yellow); + if (looperController_.getChannelLayout(looperChannel) == ChannelLayout::stereo) + { + hardware.setLed(ledIds[2], LedColour::yellow); + hardware.setLed(ledIds[3], LedColour::yellow); + } + else + { + hardware.setLed(ledIds[2], LedColour::off); + hardware.setLed(ledIds[3], LedColour::off); + } + } + else + { + const auto acceleration = looperController_.getMotorAcceleration(looperChannel); + hardware.setLed(ledIds[0], + acceleration == MotorAcceleration::verySlow + ? LedColour::green + : LedColour::off); + hardware.setLed(ledIds[1], + (acceleration == MotorAcceleration::slow) || (acceleration == MotorAcceleration::medium) + ? LedColour::green + : LedColour::off); + hardware.setLed(ledIds[2], + (acceleration == MotorAcceleration::medium) || (acceleration == MotorAcceleration::fast) + ? LedColour::green + : LedColour::off); + hardware.setLed(ledIds[3], + acceleration == MotorAcceleration::veryFast + ? LedColour::green + : LedColour::off); + } + }; + updateChannelOctaveLeds(0, { Led::chA_m2, Led::chA_m1, Led::chA_p1, Led::chA_p2 }); + updateChannelOctaveLeds(1, { Led::chB_m2, Led::chB_m1, Led::chB_p1, Led::chB_p2 }); + updateChannelOctaveLeds(2, { Led::chC_m2, Led::chC_m1, Led::chC_p1, Led::chC_p2 }); + updateChannelOctaveLeds(3, { Led::chD_m2, Led::chD_m1, Led::chD_p1, Led::chD_p2 }); + } + + void OnFocusGained() override + { + currentSetting_ = Setting::direction; + } + + bool OnButton(uint16_t buttonID, uint8_t numberOfPresses, bool isRetriggering) override + { + (void) (isRetriggering); // ignore this argument + + // swallow but ignore button-up messages + if (numberOfPresses < 1) + return true; + + const Button button = Button(buttonID); + switch (button) + { + // channel up rocker switch + case Button::chA_up: + onUpButton(0); + break; + case Button::chB_up: + onUpButton(1); + break; + case Button::chC_up: + onUpButton(2); + break; + case Button::chD_up: + onUpButton(3); + break; + // channel down rocker switch + case Button::chA_down: + onDownButton(0); + break; + case Button::chB_down: + onDownButton(1); + break; + case Button::chC_down: + onDownButton(2); + break; + case Button::chD_down: + onDownButton(3); + break; + // cycle through settings; then return to base page + case Button::settings: + if (currentSetting_ == Setting::direction) + currentSetting_ = Setting::numChannels; + else if (currentSetting_ == Setting::numChannels) + currentSetting_ = Setting::motorLag; + else if (currentSetting_ == Setting::motorLag) + Close(); // close this page + break; + case Button::record: + case Button::load: + case Button::save: + Close(); // close this page + return false; // pass event to the page below to open the respective page + default: + break; + } + return true; + } + + bool OnPotMoved(uint16_t, float) override + { + return false; // passthrough pot events to the base page + } + +private: + UiSettingsPage(const UiSettingsPage&) = delete; + UiSettingsPage& operator=(const UiSettingsPage&) = delete; + + void onUpButton(size_t looperChannel) + { + if (currentSetting_ == Setting::direction) + { + if (looperController_.getDirection(looperChannel) != Direction::forwards) + looperController_.setDirection(looperChannel, Direction::forwards); + } + else if (currentSetting_ == Setting::numChannels) + { + if (looperController_.getChannelLayout(looperChannel) != ChannelLayout::stereo) + looperController_.setChannelLayout(looperChannel, ChannelLayout::stereo); + } + else + { + auto currentAcceleration = looperController_.getMotorAcceleration(looperChannel); + switch (currentAcceleration) + { + case MotorAcceleration::verySlow: + looperController_.setMotorAcceleration(looperChannel, MotorAcceleration::slow); + break; + case MotorAcceleration::slow: + looperController_.setMotorAcceleration(looperChannel, MotorAcceleration::medium); + break; + case MotorAcceleration::medium: + looperController_.setMotorAcceleration(looperChannel, MotorAcceleration::fast); + break; + case MotorAcceleration::fast: + looperController_.setMotorAcceleration(looperChannel, MotorAcceleration::veryFast); + break; + default: + break; + } + } + } + + void onDownButton(size_t looperChannel) + { + if (currentSetting_ == Setting::direction) + { + if (looperController_.getDirection(looperChannel) != Direction::backwards) + looperController_.setDirection(looperChannel, Direction::backwards); + } + else if (currentSetting_ == Setting::numChannels) + { + if (looperController_.getChannelLayout(looperChannel) != ChannelLayout::mono) + looperController_.setChannelLayout(looperChannel, ChannelLayout::mono); + } + else + { + auto currentAcceleration = looperController_.getMotorAcceleration(looperChannel); + switch (currentAcceleration) + { + case MotorAcceleration::veryFast: + looperController_.setMotorAcceleration(looperChannel, MotorAcceleration::fast); + break; + case MotorAcceleration::fast: + looperController_.setMotorAcceleration(looperChannel, MotorAcceleration::medium); + break; + case MotorAcceleration::medium: + looperController_.setMotorAcceleration(looperChannel, MotorAcceleration::slow); + break; + case MotorAcceleration::slow: + looperController_.setMotorAcceleration(looperChannel, MotorAcceleration::verySlow); + break; + default: + break; + } + } + } + + enum class Setting + { + direction, + numChannels, + motorLag + }; + Setting currentSetting_ = Setting::direction; + + LooperControllerType& looperController_; + LooperParameterProviderType& looperParameterProvider_; +}; \ No newline at end of file diff --git a/firmware/src/util/LateInitializedObject.h b/firmware/src/util/LateInitializedObject.h index 9a80a8c..a62bcbe 100644 --- a/firmware/src/util/LateInitializedObject.h +++ b/firmware/src/util/LateInitializedObject.h @@ -1,16 +1,16 @@ -/** +/** * Copyright (C) Johannes Elliesen, 2021 - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -20,27 +20,83 @@ #include #include -template +template class LateInitializedObject { + template + struct IsOneOf : public std::false_type + { + }; + template + struct IsOneOf : + public std::conditional::value, + std::true_type, + IsOneOf>::type + { + }; + + template + using FirstTypeOf = + typename std::tuple_element<0, std::tuple>::type; + public: - LateInitializedObject() : - object_(nullptr) + LateInitializedObject() { } - template - void create(Args&&... args) + template , + typename... Args, + typename std::enable_if::value>::type* = nullptr> + T* create(Args&&... args) { object_ = new (::std::addressof(storage_)) T(std::forward(args)...); + return reinterpret_cast(object_); + } + + template ::value>::type* = nullptr> + void destroy() + { + if (object_) + { + // manually call destructor - no delete since we used placement new() + reinterpret_cast(object_)->~T(); + object_ = nullptr; + } + } + + template ::value>::type* = nullptr> + T& as() + { + return *reinterpret_cast(object_); + } + + template ::value>::type* = nullptr> + const T& as() const + { + return *reinterpret_cast(object_); } - operator T*() { return object_; } - operator const T*() const { return object_; } - T* operator->() { return object_; } - const T* operator->() const { return object_; } + /** operator->() for the first type in `Types` */ + FirstTypeOf* operator->() + { + return reinterpret_cast*>(object_); + } + const FirstTypeOf* operator->() const + { + return reinterpret_cast*>(object_); + } + + /** conversion operator for the first type in `Types` */ + operator FirstTypeOf&() + { + return *reinterpret_cast*>(object_); + } + operator const FirstTypeOf&() const + { + return *reinterpret_cast*>(object_); + } private: - typename std::aligned_storage::type storage_; - T* object_; + typename std::aligned_union<0, Types...>::type storage_; + void* object_; }; \ No newline at end of file diff --git a/firmware/src/util/PlateauMap.h b/firmware/src/util/PlateauMap.h index b2f57d2..232151c 100644 --- a/firmware/src/util/PlateauMap.h +++ b/firmware/src/util/PlateauMap.h @@ -36,8 +36,8 @@ class PlateauMapParameters { } - static constexpr size_t numPlateaus_ = numPlateaus; - static constexpr size_t numTransitions_ = numPlateaus + 1; + static constexpr size_t kNumPlateaus = numPlateaus; + static constexpr size_t kNumTransitions = numPlateaus + 1; const std::array plateauLevels_; struct TransitionParameters @@ -47,7 +47,7 @@ class PlateauMapParameters FloatType c = FloatType(0); FloatType d = FloatType(0); }; - using TransitionParameterSet = std::array; + using TransitionParameterSet = std::array; const TransitionParameterSet transitionParameterSet_; private: @@ -73,10 +73,10 @@ class PlateauMapParameters { TransitionParameterSet result {}; - for (size_t i = 0; i < numTransitions_; i++) + for (size_t i = 0; i < kNumTransitions; i++) { const auto isFirst = i == 0; - const auto isLast = i == (numTransitions_ - 1); + const auto isLast = i == (kNumTransitions - 1); // 1st & 2nd boundary condition: match plateau levels at both ends const FloatType levelLeft = isFirst ? FloatType(0) : plateauLevels[i - 1]; const FloatType levelRight = isLast ? FloatType(1) : plateauLevels[i]; @@ -169,7 +169,7 @@ constexpr FloatType plateauMap(FloatType input, PlateauMapParameters. + */ + +#include +#include + +#include "LooperController.h" +#include "../libDaisy/tests/TestIsolator.h" + +using ::testing::_; + +class StereoLooperMock; +class MonoLooperMock; +struct MockInstanceRegistry +{ + std::vector stereoLooperMockInstances; + std::vector monoLooperMockInstances; +}; +TestIsolator mockInstances; + +struct ProcessorParametersMock +{ + float param1 = 0.0f; + float param2 = 0.0f; + bool operator==(const ProcessorParametersMock& other) const + { + return param1 == other.param1 && param2 == other.param2; + } +}; + +class LooperMock +{ +public: + // MOCK_METHOD(ReturnType, MethodName, (Args...), (Specs...)); + MOCK_METHOD(void, switchState, (LooperState state), ()); + MOCK_METHOD(LooperState, getState, (), (const)); +}; + +class StereoLooperMock : public LooperMock +{ +public: + StereoLooperMock(LooperStoragePtr<2> storageToUse) : + storage_(storageToUse) + { + auto& registry = mockInstances.GetStateForCurrentTest()->stereoLooperMockInstances; + registry.push_back(this); + } + ~StereoLooperMock() + { + auto& registry = mockInstances.GetStateForCurrentTest()->stereoLooperMockInstances; + const auto foundInRegistry = std::find(registry.begin(), registry.end(), this); + if (foundInRegistry != registry.end()) + registry.erase(foundInRegistry); + } + + // clang-format off + MOCK_METHOD(void, process, ( + float speedParam, + float wowAndFlutterParam, + Direction direction, + ProcessorParametersMock processorParams, + float gainParam, + (AudioBufferPtr<2, const float>) input, + AudioBufferPtr<2> output, + ExponentialSmoother::TimeConstant postGainSmootherTimeConstant, + ExponentialSmoother::TimeConstant speedSmootherTimeConstant), ()); + // clang-format on + + const LooperStoragePtr<2> storage_; +}; +class MonoLooperMock : public LooperMock +{ +public: + MonoLooperMock(LooperStoragePtr<1> storageToUse) : + storage_(storageToUse) + { + auto& registry = mockInstances.GetStateForCurrentTest()->monoLooperMockInstances; + registry.push_back(this); + } + ~MonoLooperMock() + { + auto& registry = mockInstances.GetStateForCurrentTest()->monoLooperMockInstances; + const auto regEntry = std::find(registry.begin(), registry.end(), this); + if (regEntry != registry.end()) + registry.erase(regEntry); + } + + // clang-format off + MOCK_METHOD(void, process, ( + float speedParam, + float wowAndFlutterParam, + Direction direction, + ProcessorParametersMock processorParams, + float gainParam, + (AudioBufferPtr<1, const float>) input, + AudioBufferPtr<1> output, + ExponentialSmoother::TimeConstant postGainSmootherTimeConstant, + ExponentialSmoother::TimeConstant speedSmootherTimeConstant), ()); + // clang-format on + + const LooperStoragePtr<1> storage_; +}; + +class ParameterProviderMock +{ +public: + // MOCK_METHOD(ReturnType, MethodName, (Args...), (Specs...)); + MOCK_METHOD(float, getSpeedParameter, (size_t looperChannel), (const)); + MOCK_METHOD(float, getWowAndFlutterAmtParameter, (size_t looperChannel), (const)); + MOCK_METHOD(float, getGainParameter, (size_t looperChannel), (const)); + MOCK_METHOD(ProcessorParametersMock, getProcessorParameters, (size_t looperChannel), (const)); +}; + +struct LooperMockTypes +{ + using MonoLooperType = ::testing::NiceMock; + using StereoLooperType = ::testing::NiceMock; + using ParameterProvider = ::testing::NiceMock; +}; + +class LooperController_Test : public ::testing::Test +{ +protected: + LooperController_Test() : + controller_(storage_, + monoDownmixBuffer_, + temporaryBuffer_, + parameterProvider_) + { + } + + ~LooperController_Test() + { + mockInstances.CleanupCurrentTestState(); + } + + void reconfigureAllLoopersAs(ChannelLayout layout) + { + for (size_t i = 0; i < numLoopers_; i++) + controller_.setChannelLayout(i, layout); + } + + static constexpr size_t numLoopers_ = 2; + static constexpr size_t numSamples_ = 10; + static constexpr size_t numChannels_ = 2; + std::array storage_ = { + MonoOrStereoLooperStorage<100>(), + MonoOrStereoLooperStorage<100>(), + }; + AudioBuffer<1, numSamples_> monoDownmixBuffer_; + AudioBuffer<1, numSamples_> temporaryBuffer_; + ::testing::NiceMock parameterProvider_; + LooperController controller_; + MockInstanceRegistry& looperInstanceRegistry_ = *mockInstances.GetStateForCurrentTest(); +}; + +TEST_F(LooperController_Test, ctor_shouldInitLoopersToStereo) +{ + // expect: stereo looper instances were created + EXPECT_EQ(looperInstanceRegistry_.monoLooperMockInstances.size(), 0ul); + EXPECT_EQ(looperInstanceRegistry_.stereoLooperMockInstances.size(), numLoopers_); + // expect: the correct storages were passed during the creation + for (size_t i = 0; i < looperInstanceRegistry_.stereoLooperMockInstances.size(); i++) + EXPECT_EQ(looperInstanceRegistry_.stereoLooperMockInstances[i]->storage_.data[0], + storage_[i].LooperStoragePtr<2>::data[0]); +} + +TEST_F(LooperController_Test, setLooperState_shouldCallLooperWithCorrectSetting) +{ + // configure first looper to be mono; so that we have both + // a stereo and a mono looper in the test + controller_.setChannelLayout(0, ChannelLayout::mono); + + auto& mock0 = *looperInstanceRegistry_.monoLooperMockInstances[0]; + auto& mock1 = *looperInstanceRegistry_.stereoLooperMockInstances[0]; + + // This variable ensures the sequence order + ::testing::InSequence s; + + EXPECT_CALL(mock0, switchState(LooperState::recording)).Times(1); + EXPECT_CALL(mock1, switchState(LooperState::playing)).Times(1); + EXPECT_CALL(mock0, switchState(LooperState::stopped)).Times(1); + + controller_.setLooperState(0, LooperState::recording); + controller_.setLooperState(1, LooperState::playing); + controller_.setLooperState(0, LooperState::stopped); +} + +TEST_F(LooperController_Test, getLooperState_shouldGetResultFromCorrectLooper) +{ + // configure first looper to be mono; so that we have both + // a stereo and a mono looper in the test + controller_.setChannelLayout(0, ChannelLayout::mono); + + auto& mock0 = *looperInstanceRegistry_.monoLooperMockInstances[0]; + auto& mock1 = *looperInstanceRegistry_.stereoLooperMockInstances[0]; + + // This variable ensures the sequence order + ::testing::InSequence s; + + EXPECT_CALL(mock0, getState()).WillOnce(::testing::Return(LooperState::playing)); + EXPECT_CALL(mock1, getState()).WillOnce(::testing::Return(LooperState::stopped)); + + EXPECT_EQ(controller_.getLooperState(0), LooperState::playing); + EXPECT_EQ(controller_.getLooperState(1), LooperState::stopped); +} + +TEST_F(LooperController_Test, setChannelLayout_shouldReconfigureToMonoOrStereo) +{ + // initial state: both channels are stereo + EXPECT_EQ(controller_.getChannelLayout(0), ChannelLayout::stereo); + EXPECT_EQ(controller_.getChannelLayout(1), ChannelLayout::stereo); + + controller_.setChannelLayout(0, ChannelLayout::mono); + EXPECT_EQ(controller_.getChannelLayout(0), ChannelLayout::mono); + // expect: one of the two loopers was replaced with a mono looper + EXPECT_EQ(looperInstanceRegistry_.monoLooperMockInstances.size(), 1ul); + EXPECT_EQ(looperInstanceRegistry_.stereoLooperMockInstances.size(), 1ul); + + controller_.setChannelLayout(1, ChannelLayout::mono); + EXPECT_EQ(controller_.getChannelLayout(1), ChannelLayout::mono); + // expect: both loopers were replaced with a mono looper + EXPECT_EQ(looperInstanceRegistry_.monoLooperMockInstances.size(), 2ul); + EXPECT_EQ(looperInstanceRegistry_.stereoLooperMockInstances.size(), 0ul); + + controller_.setChannelLayout(0, ChannelLayout::stereo); + EXPECT_EQ(controller_.getChannelLayout(0), ChannelLayout::stereo); + // expect: one of the two loopers was replaced with a stereo looper again + EXPECT_EQ(looperInstanceRegistry_.monoLooperMockInstances.size(), 1ul); + EXPECT_EQ(looperInstanceRegistry_.stereoLooperMockInstances.size(), 1ul); +} + +TEST_F(LooperController_Test, process_shouldPassthroughParameters) +{ + controller_.setChannelLayout(0, ChannelLayout::mono); + controller_.setChannelLayout(1, ChannelLayout::stereo); + + // set parameters (we ignore the motor acceleration) + EXPECT_CALL(parameterProvider_, getSpeedParameter(0)).WillOnce(::testing::Return(0.01f)); + EXPECT_CALL(parameterProvider_, getSpeedParameter(1)).WillOnce(::testing::Return(0.11f)); + EXPECT_CALL(parameterProvider_, getWowAndFlutterAmtParameter(0)).WillOnce(::testing::Return(0.02f)); + EXPECT_CALL(parameterProvider_, getWowAndFlutterAmtParameter(1)).WillOnce(::testing::Return(0.12f)); + EXPECT_CALL(parameterProvider_, getGainParameter(0)).WillOnce(::testing::Return(0.03f)); + EXPECT_CALL(parameterProvider_, getGainParameter(1)).WillOnce(::testing::Return(0.13f)); + EXPECT_CALL(parameterProvider_, getProcessorParameters(0)).WillOnce(::testing::Return({ 0.04f, 0.05f })); + EXPECT_CALL(parameterProvider_, getProcessorParameters(1)).WillOnce(::testing::Return({ 0.14f, 0.15f })); + controller_.setDirection(0, Direction::backwards); + controller_.setDirection(1, Direction::forwards); + + auto& mock0 = *looperInstanceRegistry_.monoLooperMockInstances[0]; + auto& mock1 = *looperInstanceRegistry_.stereoLooperMockInstances[0]; + + // expect process() to be called with the correct parameters + EXPECT_CALL(mock0, process(0.01f, 0.02f, Direction::backwards, ProcessorParametersMock { 0.04f, 0.05f }, 0.03f, _, _, _, _)); + EXPECT_CALL(mock1, process(0.11f, 0.12f, Direction::forwards, ProcessorParametersMock { 0.14f, 0.15f }, 0.13f, _, _, _, _)); + + AudioBuffer<2, 10> input; + AudioBuffer<2, 10> output; + controller_.process(input, output); +} + +TEST_F(LooperController_Test, process_shouldUseCorrectMotorSpeedTimeConstants) +{ + controller_.setChannelLayout(0, ChannelLayout::mono); + controller_.setChannelLayout(1, ChannelLayout::stereo); + + auto& mock0 = *looperInstanceRegistry_.monoLooperMockInstances[0]; + auto& mock1 = *looperInstanceRegistry_.stereoLooperMockInstances[0]; + + // setup the looper mocks to capture the smoothing time using lambda functions + float monoSpeedTimeConstant = 0.0f; + float stereoSpeedTimeConstant = 0.0f; + const auto captureFuncArgumentsMono = + [&](float, + float, + Direction, + const ProcessorParametersMock&, + float, + AudioBufferPtr<1, const float>, + AudioBufferPtr<1, float>, + ExponentialSmoother::TimeConstant, + ExponentialSmoother::TimeConstant speedSmootherTimeConstant) + { + monoSpeedTimeConstant = speedSmootherTimeConstant.value_; + }; + const auto captureFuncArgumentsStereo = + [&](float, + float, + Direction, + const ProcessorParametersMock&, + float, + AudioBufferPtr<2, const float>, + AudioBufferPtr<2, float>, + ExponentialSmoother::TimeConstant, + ExponentialSmoother::TimeConstant speedSmootherTimeConstant) + { + stereoSpeedTimeConstant = speedSmootherTimeConstant.value_; + }; + EXPECT_CALL(mock0, process(_, _, _, _, _, _, _, _, _)).WillRepeatedly(testing::Invoke(captureFuncArgumentsMono)); + EXPECT_CALL(mock1, process(_, _, _, _, _, _, _, _, _)).WillRepeatedly(testing::Invoke(captureFuncArgumentsStereo)); + + // a lambda to capture the smoother time constants for a given setting + const auto captureTimeConstant = [&](MotorAcceleration acceleration) + { + controller_.setMotorAcceleration(0, acceleration); + controller_.setMotorAcceleration(1, acceleration); + + // process (mocks will capture the smoothing time) + AudioBuffer<2, 10> input; + AudioBuffer<2, 10> output; + controller_.process(input, output); + + // both loopers should have seen the same smoothing time + EXPECT_EQ(monoSpeedTimeConstant, stereoSpeedTimeConstant); + return monoSpeedTimeConstant; + }; + + // a lambda to transform captured time constants to smoothing times + const auto getSmoothingTimeFromTimeConstant = [](float timeConstant) + { + // those two come from the constants.h file + constexpr float expectedBlockSize = float(blockSize); + constexpr float expectedSampleRate = sampleRateHz; + // according to Udo Zoelzer: + // timeConstant = 1.0f - sprout::math::exp(-2.2f * float(expectedBlockSize) / expectedSampleRate / smoothingTimeInS); + // hence: + // ln(1.0f - timeConstant) = -2.2f * float(expectedBlockSize) / expectedSampleRate / smoothingTimeInS + // smoothingTime = -2.2f * float(expectedBlockSize) / expectedSampleRate * log(e) / log(1.0f - timeConstant) + return -2.2f * float(expectedBlockSize) / expectedSampleRate + * sprout::math::log(2.718281828f) / sprout::math::log(1.0f - timeConstant); + }; + + // finally capture the time constants for each acceleration setting + const auto accelerations = { MotorAcceleration::instantaneous, + MotorAcceleration::veryFast, + MotorAcceleration::fast, + MotorAcceleration::medium, + MotorAcceleration::slow, + MotorAcceleration::verySlow }; + std::map measuredSmoothingTimes; + for (const auto acceleration : accelerations) + measuredSmoothingTimes[acceleration] = getSmoothingTimeFromTimeConstant(captureTimeConstant(acceleration)); + + const float toleranceAmt = 0.01f; // 1% tolerance + // instantaneous setting should yield no smoothing at all + EXPECT_FLOAT_EQ(measuredSmoothingTimes[MotorAcceleration::instantaneous], 0.0f); + // expect minimum and maximum values + EXPECT_NEAR(measuredSmoothingTimes[MotorAcceleration::veryFast], 0.1f, 0.1f * toleranceAmt); + EXPECT_NEAR(measuredSmoothingTimes[MotorAcceleration::verySlow], 20.0f, 20.0f * toleranceAmt); + // expect the other times to be scaled exponentially in between (== constant factor) + constexpr float totalRange = 20.0f / 0.1f; + constexpr size_t numSettings = 5; + constexpr float expectedFactor = sprout::pow(totalRange, 1.0f / float(numSettings - 1)); + EXPECT_NEAR(measuredSmoothingTimes[MotorAcceleration::fast] + / measuredSmoothingTimes[MotorAcceleration::veryFast], + expectedFactor, + expectedFactor * toleranceAmt); + EXPECT_NEAR(measuredSmoothingTimes[MotorAcceleration::medium] + / measuredSmoothingTimes[MotorAcceleration::fast], + expectedFactor, + expectedFactor * toleranceAmt); + EXPECT_NEAR(measuredSmoothingTimes[MotorAcceleration::slow] + / measuredSmoothingTimes[MotorAcceleration::medium], + expectedFactor, + expectedFactor * toleranceAmt); + EXPECT_NEAR(measuredSmoothingTimes[MotorAcceleration::verySlow] + / measuredSmoothingTimes[MotorAcceleration::slow], + expectedFactor, + expectedFactor * toleranceAmt); +} + +TEST_F(LooperController_Test, process_shouldProvideCorrectSamples) +{ + controller_.setChannelLayout(0, ChannelLayout::mono); + controller_.setChannelLayout(1, ChannelLayout::stereo); + + auto& mock0 = *looperInstanceRegistry_.monoLooperMockInstances[0]; + auto& mock1 = *looperInstanceRegistry_.stereoLooperMockInstances[0]; + + // setup the looper mocks to capture the incoming audio samples + std::vector monoSamples; + std::vector stereoSamplesLeft, stereoSamplesRight; + const auto captureFuncArgumentsMono = + [&](float, + float, + Direction, + const ProcessorParametersMock&, + float, + AudioBufferPtr<1, const float> input, + AudioBufferPtr<1, float>, + ExponentialSmoother::TimeConstant, + ExponentialSmoother::TimeConstant) + { + for (size_t i = 0; i < input.size_; i++) + monoSamples.push_back(input.getChannelPointers()[0][i]); + }; + const auto captureFuncArgumentsStereo = + [&](float, + float, + Direction, + const ProcessorParametersMock&, + float, + AudioBufferPtr<2, const float> input, + AudioBufferPtr<2, float>, + ExponentialSmoother::TimeConstant, + ExponentialSmoother::TimeConstant) + { + for (size_t i = 0; i < input.size_; i++) + { + stereoSamplesLeft.push_back(input.getChannelPointers()[0][i]); + stereoSamplesRight.push_back(input.getChannelPointers()[1][i]); + } + }; + EXPECT_CALL(mock0, process(_, _, _, _, _, _, _, _, _)).WillRepeatedly(testing::Invoke(captureFuncArgumentsMono)); + EXPECT_CALL(mock1, process(_, _, _, _, _, _, _, _, _)).WillRepeatedly(testing::Invoke(captureFuncArgumentsStereo)); + + // prepare some dummy samples + AudioBuffer<2, 9> inputSamples; + for (size_t i = 0; i < inputSamples.size_; i++) + { + inputSamples[0][i] = float(i); // left channel: 0, 1, 2, 3, ... + inputSamples[1][i] = float(10 + i); // right channel: 10, 11, 12, 13, ... + } + + // process audio + AudioBuffer<2, 9> outputSamples; + controller_.process(inputSamples, outputSamples); + + // stereo samples are passed through + EXPECT_EQ(stereoSamplesLeft, std::vector(inputSamples[0], inputSamples[0] + inputSamples.size_)); + EXPECT_EQ(stereoSamplesRight, std::vector(inputSamples[1], inputSamples[1] + inputSamples.size_)); + // mono looper gets a downmix + AudioBuffer<1, 9> downmixedSamples; + for (size_t i = 0; i < inputSamples.size_; i++) + downmixedSamples[0][i] = (inputSamples[0][i] + inputSamples[1][i]) / 2.0f; + EXPECT_EQ(monoSamples, std::vector(downmixedSamples[0], downmixedSamples[0] + downmixedSamples.size_)); +} + +TEST_F(LooperController_Test, process_shouldMixTogetherOutputSamples) +{ + controller_.setChannelLayout(0, ChannelLayout::mono); + controller_.setChannelLayout(1, ChannelLayout::stereo); + + auto& mock0 = *looperInstanceRegistry_.monoLooperMockInstances[0]; + auto& mock1 = *looperInstanceRegistry_.stereoLooperMockInstances[0]; + + // generate some dummy output signals for our mocked loopers + std::array monoSamples; + std::array stereoSamplesLeft, stereoSamplesRight; + for (size_t i = 0; i < monoSamples.size(); i++) + { + monoSamples[i] = float(i); + stereoSamplesLeft[i] = float(10 + i); + stereoSamplesRight[i] = float(20 + i); + } + + // setup the looper mocks to play back the dummy signals + const auto playDummySignalMono = + [&](float, + float, + Direction, + const ProcessorParametersMock&, + float, + AudioBufferPtr<1, const float>, + AudioBufferPtr<1, float> output, + ExponentialSmoother::TimeConstant, + ExponentialSmoother::TimeConstant) + { + // the signals are added to the output channel! Not overwritten! + output.addToChannel(0, monoSamples.data(), std::min(monoSamples.size(), output.size_)); + }; + const auto playDummySignalStereo = + [&](float, + float, + Direction, + const ProcessorParametersMock&, + float, + AudioBufferPtr<2, const float>, + AudioBufferPtr<2, float> output, + ExponentialSmoother::TimeConstant, + ExponentialSmoother::TimeConstant) + { + // the signals are added to the output channel! Not overwritten! + output.addToChannel(0, stereoSamplesLeft.data(), std::min(stereoSamplesLeft.size(), output.size_)); + output.addToChannel(1, stereoSamplesRight.data(), std::min(stereoSamplesRight.size(), output.size_)); + }; + EXPECT_CALL(mock0, process(_, _, _, _, _, _, _, _, _)).WillRepeatedly(testing::Invoke(playDummySignalMono)); + EXPECT_CALL(mock1, process(_, _, _, _, _, _, _, _, _)).WillRepeatedly(testing::Invoke(playDummySignalStereo)); + + // process audio + AudioBuffer<2, 9> inputSamples; + AudioBuffer<2, 9> outputSamples; + outputSamples.fill(100.0f); // fill with crap - this should be overwritten + controller_.process(inputSamples, outputSamples); + + AudioBuffer<2, 9> expectedOutputSamples; + for (size_t i = 0; i < expectedOutputSamples.size_; i++) + { + expectedOutputSamples[0][i] = stereoSamplesLeft[i] + monoSamples[i]; // left channel + expectedOutputSamples[1][i] = stereoSamplesRight[i] + monoSamples[i]; // right channel + } + + // expect L & R signals to contain the upmixed mono looper signal + stereo looper signal. + // we use std::vector for the comparison because of the pretty printing in the test log + EXPECT_EQ(std::vector(outputSamples[0], outputSamples[0] + outputSamples.size_), + std::vector(expectedOutputSamples[0], expectedOutputSamples[0] + expectedOutputSamples.size_)); + EXPECT_EQ(std::vector(outputSamples[1], outputSamples[1] + outputSamples.size_), + std::vector(expectedOutputSamples[1], expectedOutputSamples[1] + expectedOutputSamples.size_)); +} \ No newline at end of file diff --git a/firmware/tests/Makefile b/firmware/tests/Makefile index c6812c3..042440b 100644 --- a/firmware/tests/Makefile +++ b/firmware/tests/Makefile @@ -36,6 +36,7 @@ COMPILE_FLAGS = -std=gnu++17 -Wall -Wextra -g -Werror -pthread -DUNIT_TEST=1 INCLUDES = -I /usr/local/include/ \ -I ../../dsp/lib/sprout/ \ -I ../../dsp/src/ \ + -I ../../lib/libDaisy/src/ \ -I ../../lib/googletest/ \ -I ../../lib/googletest/googlemock/ \ -I ../../lib/googletest/googlemock/include \ diff --git a/firmware/tests/Ui_gtest.cpp b/firmware/tests/Ui_gtest.cpp new file mode 100644 index 0000000..8f1da4f --- /dev/null +++ b/firmware/tests/Ui_gtest.cpp @@ -0,0 +1,944 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include <../tests/TestIsolator.h> // from libDaisy +#include // from libDaisy +#include "ui/TapeLooperUi.h" + +#include "mocks/LooperController_mock.h" +#include "mocks/ParameterProvider_mock.h" +#include "mocks/PeakMeter_mock.h" +#include "mocks/UiHardware_mock.h" + +// custom expecation macros for googletest +// we use macros not functions, to that the line numbers in the googletest +// console log are still pointing to the correct place. + +#define EXPECT_LED_COLOUR(led, expectedColour) \ + { \ + EXPECT_FALSE(uiHardware_.leds_[size_t(led)].setToRawValue); \ + EXPECT_EQ(uiHardware_.leds_[size_t(led)].colour, expectedColour); \ + } +#define EXPECT_LED_RAW(led, green, red) \ + { \ + EXPECT_TRUE(uiHardware_.leds_[size_t(led)].setToRawValue); \ + EXPECT_EQ(uiHardware_.leds_[size_t(led)].brightnessGreen, green); \ + EXPECT_EQ(uiHardware_.leds_[size_t(led)].brightnessRed, red); \ + } +#define EXPECT_OCTAVE_LED_PATTERN(channel, ledm2, ledm1, ledp1, ledp2) \ + { \ + const std::array expectedPattern({ ledm2, ledm1, ledp1, ledp2 }); \ + const auto values = getChannelOctaveLeds(channel); \ + std::array observedPattern; \ + std::transform(values.begin(), \ + values.end(), \ + observedPattern.begin(), \ + [](UiHardwareMock::LedState led) \ + { \ + EXPECT_FALSE(led.setToRawValue) << "expect led to set by colour"; \ + return led.colour; \ + }); \ + EXPECT_EQ(observedPattern, expectedPattern); \ + } + +// pretty printing for googletest +std::ostream& operator<<(std::ostream& out, LedColour colour) +{ + switch (colour) + { + case LedColour::off: + return out << "LedColour::off"; + case LedColour::green: + return out << "LedColour::green"; + case LedColour::yellow: + return out << "LedColour::yellow"; + case LedColour::red: + return out << "LedColour::red"; + case LedColour::pulsingGreen: + return out << "LedColour::pulsingGreen"; + case LedColour::pulsingYellow: + return out << "LedColour::pulsingYellow"; + case LedColour::pulsingRed: + return out << "LedColour::pulsingRed"; + } +} + +// the clear and flush functions of the UI cancas must be function pointers. +// to isolate tests that run in parallel, we use the daisy TestIsolator class +// to hold a implementation of these two functions for each test case. +struct UiTestMockFunctions +{ + std::function clearCanvasFunction; + std::function flushCanvasFunction; +}; +TestIsolator uiTestMockFunctionIsolator; + +void uiTestClearFunction(const daisy::UiCanvasDescriptor& desc) +{ + auto& callbackForThisTest = + uiTestMockFunctionIsolator.GetStateForCurrentTest()->clearCanvasFunction; + if (callbackForThisTest) + callbackForThisTest(desc); +} +void uiTestFlushFunction(const daisy::UiCanvasDescriptor& desc) +{ + auto& callbackForThisTest = + uiTestMockFunctionIsolator.GetStateForCurrentTest()->flushCanvasFunction; + if (callbackForThisTest) + callbackForThisTest(desc); +} + +// basic test fixture that sets up mocked versions of the +// LooperController, UiHardware, PeakMeters and LooperParaneterProvider +class UiFixture : public ::testing::Test +{ +protected: + UiFixture() : + ui_(uiHardware_, + &uiTestClearFunction, + &uiTestFlushFunction, + eventQueue_, + peakMeters_, + looperController_, + looperParameterProvider_) + { + uiTestMockFunctionIsolator.GetStateForCurrentTest()->clearCanvasFunction = + [&](const daisy::UiCanvasDescriptor&) + { + uiHardware_.clearLeds(); + }; + } + + // A little helper struct to simulate user input events + struct Event + { + enum class Type + { + buttonPressedAndReleased, + buttonPressed, + buttonReleased, + potTurned, + }; + + Event(Type type, Pot potId, float position) : + type(type), + id(uint16_t(potId)), + position(position) + { + } + + template + Event(Type type, IdType id) : + type(type), + id(uint16_t(id)), + position(0.0f) + { + } + + Type type; + uint16_t id; + float position; + }; + + // pushes a bunch of user input events into the event queue and makes + // the SUT process them + void simulateEvents(std::initializer_list events) + { + for (const auto& event : events) + { + switch (event.type) + { + case Event::Type::buttonPressed: + eventQueue_.AddButtonPressed(event.id, 1, false); + break; + case Event::Type::buttonReleased: + eventQueue_.AddButtonReleased(event.id); + break; + case Event::Type::buttonPressedAndReleased: + eventQueue_.AddButtonPressed(event.id, 1, false); + eventQueue_.AddButtonReleased(event.id); + break; + case Event::Type::potTurned: + eventQueue_.AddPotMoved(event.id, event.position); + break; + default: + FAIL(); + } + while (!eventQueue_.IsQueueEmpty()) + ui_.process(); + } + } + + // processes the SUT until the canvas was redrawn once. + void waitUntilDisplayDrawn() + { + // hook into the display flush function + auto& flushFunction = uiTestMockFunctionIsolator.GetStateForCurrentTest()->flushCanvasFunction; + auto originalFunction = flushFunction; + bool flushFunctionCalled = false; + flushFunction = [&](const daisy::UiCanvasDescriptor& desc) + { + if (originalFunction) + originalFunction(desc); + flushFunctionCalled = true; + }; + + // wait until the flush function is called once. + // This tells us that the canvas was redrawn + size_t numCycles = 0; + while (!flushFunctionCalled) + { + if (numCycles++ > 100) + FAIL() << "Display not redrawn after simulated 1000ms"; + ui_.process(); + // simulate 10ms passed + daisy::System::SetUsForUnitTest(daisy::System::GetUs() + 10000); + } + + flushFunction = originalFunction; + } + + // some helpers to get easier access to the buttons IDs for each channel + struct ChannelButtons + { + Button up; + Button down; + Button play; + }; + ChannelButtons getChannelButtons(size_t channel) const + { + return std::array { + ChannelButtons { Button::chA_up, Button::chA_down, Button::chA_play }, + ChannelButtons { Button::chB_up, Button::chB_down, Button::chB_play }, + ChannelButtons { Button::chC_up, Button::chC_down, Button::chC_play }, + ChannelButtons { Button::chD_up, Button::chD_down, Button::chD_play }, + }[channel]; + } + + // some helpers to get easier access to the potentiometer IDs for each channel + struct ChannelPots + { + Pot drive; + Pot grain; + Pot warble; + Pot speed; + Pot volume; + }; + ChannelPots getChannelPots(size_t channel) const + { + return std::array { + ChannelPots { Pot::chA_driveAmt, Pot::chA_grainAmt, Pot::chA_warbleAmt, Pot::chA_speed, Pot::chA_volume }, + ChannelPots { Pot::chB_driveAmt, Pot::chB_grainAmt, Pot::chB_warbleAmt, Pot::chB_speed, Pot::chB_volume }, + ChannelPots { Pot::chC_driveAmt, Pot::chC_grainAmt, Pot::chC_warbleAmt, Pot::chC_speed, Pot::chC_volume }, + ChannelPots { Pot::chD_driveAmt, Pot::chD_grainAmt, Pot::chD_warbleAmt, Pot::chD_speed, Pot::chD_volume }, + }[channel]; + } + + // for easier access to the octave LED IDs + const std::array, 4> channelOctaveLeds_ = { + std::array({ size_t(Led::chA_m2), size_t(Led::chA_m1), size_t(Led::chA_p1), size_t(Led::chA_p2) }), + std::array({ size_t(Led::chB_m2), size_t(Led::chB_m1), size_t(Led::chB_p1), size_t(Led::chB_p2) }), + std::array({ size_t(Led::chC_m2), size_t(Led::chC_m1), size_t(Led::chC_p1), size_t(Led::chC_p2) }), + std::array({ size_t(Led::chD_m2), size_t(Led::chD_m1), size_t(Led::chD_p1), size_t(Led::chD_p2) }), + }; + + std::array getChannelOctaveLeds(size_t channel) + { + std::array result; + for (size_t led = 0; led < 4; led++) + result[led] = uiHardware_.leds_[channelOctaveLeds_[channel][led]]; + return result; + } + + // shared tests (used for multiple pages) + + void runPotentiometerUpdateTest() + { + // checks if all potentiometers update their respective destination values + // in the LooperParameterProvider + + const auto expectPotUpdatesDestination = [&](Pot pot, float& destination) + { + for (float value : { 0.351f, 0.934f, 0.845f }) + { + simulateEvents({ Event(Event::Type::potTurned, pot, value) }); + EXPECT_EQ(destination, value); + } + }; + + for (size_t ch = 0; ch < numLoopers_; ch++) + { + expectPotUpdatesDestination(getChannelPots(ch).drive, looperParameterProvider_.controlInputs_[ch].driveAmt); + expectPotUpdatesDestination(getChannelPots(ch).grain, looperParameterProvider_.controlInputs_[ch].grainAmt); + expectPotUpdatesDestination(getChannelPots(ch).speed, looperParameterProvider_.controlInputs_[ch].fineTunePosition); + expectPotUpdatesDestination(getChannelPots(ch).warble, looperParameterProvider_.controlInputs_[ch].wowAndFlutterAmt); + expectPotUpdatesDestination(getChannelPots(ch).volume, looperParameterProvider_.controlInputs_[ch].volumeSliderPosition); + } + } + + void runPeakMeterTest() + { + // peak meter LEDs should display the peak meter values + + // let peak meter mocks produce some non-zero values + peakMeters_[0].green_ = 0.10f; + peakMeters_[0].red_ = 0.20f; + peakMeters_[1].green_ = 0.11f; + peakMeters_[1].red_ = 0.21f; + peakMeters_[2].green_ = 0.12f; + peakMeters_[2].red_ = 0.22f; + peakMeters_[3].green_ = 0.13f; + peakMeters_[3].red_ = 0.23f; + + waitUntilDisplayDrawn(); + + // expect peak meter values to be drawn to the UI + EXPECT_EQ(uiHardware_.leds_[size_t(Led::peakMeterInL)].brightnessGreen, 0.10f); + EXPECT_EQ(uiHardware_.leds_[size_t(Led::peakMeterInL)].brightnessRed, 0.20f); + EXPECT_EQ(uiHardware_.leds_[size_t(Led::peakMeterInR)].brightnessGreen, 0.11f); + EXPECT_EQ(uiHardware_.leds_[size_t(Led::peakMeterInR)].brightnessRed, 0.21f); + EXPECT_EQ(uiHardware_.leds_[size_t(Led::peakMeterOutL)].brightnessGreen, 0.12f); + EXPECT_EQ(uiHardware_.leds_[size_t(Led::peakMeterOutL)].brightnessRed, 0.22f); + EXPECT_EQ(uiHardware_.leds_[size_t(Led::peakMeterOutR)].brightnessGreen, 0.13f); + EXPECT_EQ(uiHardware_.leds_[size_t(Led::peakMeterOutR)].brightnessRed, 0.23f); + } + + static constexpr size_t numLoopers_ = 4; + UiHardwareMock uiHardware_; + daisy::UiEventQueue eventQueue_; + std::array peakMeters_; + LooperControllerMock looperController_; + ParameterProviderMock looperParameterProvider_; + TapeLooperUi, + ParameterProviderMock> + ui_; +}; + +// ======================================================================= +// base page tests +// ======================================================================= + +TEST_F(UiFixture, basePage_shouldDisplayPeakMeters) +{ + runPeakMeterTest(); +} + +TEST_F(UiFixture, basePage_commonSectionLedsShouldBeOff) +{ + waitUntilDisplayDrawn(); + + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); +} + +TEST_F(UiFixture, basePage_shouldDisplayOctave) +{ + // Octave LEDs should display the current octave setting + + // modify mock to simulate that all loopers are in a certain state + LooperState stateOfAllLoopers = LooperState::stopped; + looperController_.getLooperStateMock_ = [&](size_t) + { + return stateOfAllLoopers; + }; + + // a helper lambda to check if the octave led pattern has the correct colour in each looper state + const auto expectOctaveLedPatternsInColour = [&](LedColour onColour) + { + for (size_t ch = 0; ch < numLoopers_; ch++) + { + const auto off = LedColour::off; + const auto on = onColour; + looperParameterProvider_.controlInputs_[ch].octave = -2; + waitUntilDisplayDrawn(); + EXPECT_OCTAVE_LED_PATTERN(ch, on, off, off, off); + + looperParameterProvider_.controlInputs_[ch].octave = -1; + waitUntilDisplayDrawn(); + EXPECT_OCTAVE_LED_PATTERN(ch, off, on, off, off); + + looperParameterProvider_.controlInputs_[ch].octave = 0; + waitUntilDisplayDrawn(); + EXPECT_OCTAVE_LED_PATTERN(ch, off, on, on, off); + + looperParameterProvider_.controlInputs_[ch].octave = 1; + waitUntilDisplayDrawn(); + EXPECT_OCTAVE_LED_PATTERN(ch, off, off, on, off); + + looperParameterProvider_.controlInputs_[ch].octave = 2; + waitUntilDisplayDrawn(); + EXPECT_OCTAVE_LED_PATTERN(ch, off, off, off, on); + } + }; + + // expect octave leds to show the octave in green while stopped + stateOfAllLoopers = LooperState::stopped; + expectOctaveLedPatternsInColour(LedColour::green); + // expect octave leds to show the octave in orange while playing + stateOfAllLoopers = LooperState::playing; + expectOctaveLedPatternsInColour(LedColour::yellow); + // expect octave leds to show the octave in green while stopped + stateOfAllLoopers = LooperState::recording; + expectOctaveLedPatternsInColour(LedColour::pulsingRed); +} + +TEST_F(UiFixture, basePage_rockerSwitchesShouldModifyOctave) +{ + // use rocker switches; UI should modify the octave setting on the + // LooperParameterProvider + + for (size_t ch = 0; ch < numLoopers_; ch++) + { + const auto& buttons = getChannelButtons(ch); + const auto upButtonPressed = { Event(Event::Type::buttonPressedAndReleased, buttons.up) }; + const auto downButtonPressed = { Event(Event::Type::buttonPressedAndReleased, buttons.down) }; + + looperParameterProvider_.controlInputs_[ch].octave = -2; + simulateEvents(upButtonPressed); + EXPECT_EQ(looperParameterProvider_.controlInputs_[ch].octave, -1); + simulateEvents(upButtonPressed); + EXPECT_EQ(looperParameterProvider_.controlInputs_[ch].octave, 0); + simulateEvents(upButtonPressed); + EXPECT_EQ(looperParameterProvider_.controlInputs_[ch].octave, 1); + simulateEvents(upButtonPressed); + EXPECT_EQ(looperParameterProvider_.controlInputs_[ch].octave, 2); + simulateEvents(upButtonPressed); + EXPECT_EQ(looperParameterProvider_.controlInputs_[ch].octave, 2); // limited at the top + simulateEvents(downButtonPressed); + EXPECT_EQ(looperParameterProvider_.controlInputs_[ch].octave, 1); + simulateEvents(downButtonPressed); + EXPECT_EQ(looperParameterProvider_.controlInputs_[ch].octave, 0); + simulateEvents(downButtonPressed); + EXPECT_EQ(looperParameterProvider_.controlInputs_[ch].octave, -1); + simulateEvents(downButtonPressed); + EXPECT_EQ(looperParameterProvider_.controlInputs_[ch].octave, -2); + simulateEvents(downButtonPressed); + EXPECT_EQ(looperParameterProvider_.controlInputs_[ch].octave, -2); // limited at the bottom + } +} + +TEST_F(UiFixture, basePage_playButtonShouldStartAndStopPlayback) +{ + // the playback button should start/stop playback + + // make looper controller mock return values from an array + std::array looperStates = { LooperState::stopped }; + looperController_.getLooperStateMock_ = [&](size_t channel) + { + return looperStates[channel]; + }; + + for (size_t ch = 0; ch < numLoopers_; ch++) + { + std::string chStr = std::to_string(ch); + const auto playButtonPressed = { Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).play) }; + + // start playback when stopped + looperStates[ch] = LooperState::stopped; + simulateEvents(playButtonPressed); + EXPECT_EQ(looperController_.pullEvents(), "setLooperState(" + chStr + ", LooperState::playing)\n"); + + // stop playback when playing + looperStates[ch] = LooperState::playing; + simulateEvents(playButtonPressed); + EXPECT_EQ(looperController_.pullEvents(), "setLooperState(" + chStr + ", LooperState::stopped)\n"); + + // start playback when recording + looperStates[ch] = LooperState::recording; + simulateEvents(playButtonPressed); + EXPECT_EQ(looperController_.pullEvents(), "setLooperState(" + chStr + ", LooperState::playing)\n"); + } +} + +TEST_F(UiFixture, basePage_shouldUpdateParameterProviderWithPotValues) +{ + runPotentiometerUpdateTest(); +} + +// ======================================================================= +// record page tests +// ======================================================================= + +TEST_F(UiFixture, recordingPage_shouldUpdateParameterProviderWithPotValues) +{ + // enter recording page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::record) }); + // potentiometer updates should still get through + runPotentiometerUpdateTest(); +} + +TEST_F(UiFixture, recordingPage_shouldDisplayPeakMeters) +{ + // enter recording page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::record) }); + // peak meters are still functional + runPeakMeterTest(); +} + +TEST_F(UiFixture, recordingPage_onlyRecordLedShouldBeOn) +{ + // enter recording page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::record) }); + + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::pulsingRed); +} + +TEST_F(UiFixture, recordingPage_exitRecordPage) +{ + // enter recording page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::record) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::pulsingRed); + + // leave towards settings page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::pulsingRed); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); + + // enter recording page again + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::record) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::pulsingRed); + + // leave towards save page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::save) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::pulsingRed); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); + + // enter recording page again + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::record) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::pulsingRed); + + // leave towards load page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::load) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::pulsingRed); + EXPECT_LED_COLOUR(Led::record, LedColour::off); + + // enter recording page again + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::record) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::pulsingRed); + + // leave towards base page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::record) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); +} + +TEST_F(UiFixture, recordingPage_playButtonShouldStartAndStopRecording) +{ + // the playback button should start/stop recording + + // enter recording page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::record) }); + + // make looper controller mock return values from an array + std::array looperStates = { LooperState::stopped }; + looperController_.getLooperStateMock_ = [&](size_t channel) + { + return looperStates[channel]; + }; + + for (size_t ch = 0; ch < numLoopers_; ch++) + { + std::string chStr = std::to_string(ch); + const auto playButtonPressed = { Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).play) }; + + // start recording when stopped + looperStates[ch] = LooperState::stopped; + simulateEvents(playButtonPressed); + EXPECT_EQ(looperController_.pullEvents(), "setLooperState(" + chStr + ", LooperState::recording)\n"); + + // start recording when playing + looperStates[ch] = LooperState::playing; + simulateEvents(playButtonPressed); + EXPECT_EQ(looperController_.pullEvents(), "setLooperState(" + chStr + ", LooperState::recording)\n"); + + // stop recording when recording + looperStates[ch] = LooperState::recording; + simulateEvents(playButtonPressed); + EXPECT_EQ(looperController_.pullEvents(), "setLooperState(" + chStr + ", LooperState::stopped)\n"); + } +} + +TEST_F(UiFixture, recordingPage_leavingPageDoesntStopRecording) +{ + // the playback button should start/stop recording + + // enter recording page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::record) }); + + // make looper controller mock return LooperState::recording for all channels + looperController_.getLooperStateMock_ = [&](size_t) + { + return LooperState::recording; + }; + + // leave recording page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::record) }); + + // nothing happened, recording continues + EXPECT_EQ(looperController_.pullEvents(), ""); +} + +TEST_F(UiFixture, recordingPage_rockerSwitchesShouldHaveNoEffect) +{ + // the up/down switches don't do anything + + // enter recording page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::record) }); + + // activate the rocker switches a bunch of times + simulateEvents({ + Event(Event::Type::buttonPressedAndReleased, Button::chA_up), + Event(Event::Type::buttonPressedAndReleased, Button::chA_down), + Event(Event::Type::buttonPressedAndReleased, Button::chA_up), + Event(Event::Type::buttonPressedAndReleased, Button::chA_down), + + Event(Event::Type::buttonPressedAndReleased, Button::chB_up), + Event(Event::Type::buttonPressedAndReleased, Button::chB_down), + Event(Event::Type::buttonPressedAndReleased, Button::chB_up), + Event(Event::Type::buttonPressedAndReleased, Button::chB_down), + + Event(Event::Type::buttonPressedAndReleased, Button::chC_up), + Event(Event::Type::buttonPressedAndReleased, Button::chC_down), + Event(Event::Type::buttonPressedAndReleased, Button::chC_up), + Event(Event::Type::buttonPressedAndReleased, Button::chC_down), + + Event(Event::Type::buttonPressedAndReleased, Button::chD_up), + Event(Event::Type::buttonPressedAndReleased, Button::chD_down), + Event(Event::Type::buttonPressedAndReleased, Button::chD_up), + Event(Event::Type::buttonPressedAndReleased, Button::chD_down), + }); + + // nothing happened + EXPECT_EQ(looperController_.pullEvents(), ""); +} + +// ======================================================================= +// settings page tests +// ======================================================================= + +TEST_F(UiFixture, settingsPage_shouldUpdateParameterProviderWithPotValues) +{ + // enter settings page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + // potentiometer updates should still get through + runPotentiometerUpdateTest(); +} + +TEST_F(UiFixture, settingsPage_shouldDisplayPeakMeters) +{ + // enter settings page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + // peak meters are still functional + runPeakMeterTest(); +} + +TEST_F(UiFixture, settingsPage_settingsLedShouldCycleThroughColours) +{ + // enter settings page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::pulsingRed); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); + + // cycle to next setting + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::pulsingYellow); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); + + // cycle to next setting + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::pulsingGreen); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); + + // return to the base page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); +} + +TEST_F(UiFixture, settingsPage_exitSettingsPage) +{ + // enter settings page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::pulsingRed); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); + + // leave towards save page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::save) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::pulsingRed); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); + + // enter settings page again + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::pulsingRed); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); + + // leave towards load page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::load) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::pulsingRed); + EXPECT_LED_COLOUR(Led::record, LedColour::off); + + // enter settings page again + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::pulsingRed); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); + + // leave towards recording page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::record) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::pulsingRed); + + // enter settings page again + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::pulsingRed); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); + + // leave towards base page (cycle through settings, then return to base page) + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + waitUntilDisplayDrawn(); + EXPECT_LED_COLOUR(Led::settings, LedColour::off); + EXPECT_LED_COLOUR(Led::save, LedColour::off); + EXPECT_LED_COLOUR(Led::load, LedColour::off); + EXPECT_LED_COLOUR(Led::record, LedColour::off); +} + +TEST_F(UiFixture, settingsPage_adjustDirection) +{ + // enter settings page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + + // make looper controler mock return specific settings + std::array looperDirections; + looperController_.getDirectionMock_ = [&](size_t ch) + { + return looperDirections[ch]; + }; + + // check if rocker switches modify the value + for (size_t ch = 0; ch < numLoopers_; ch++) + { + const auto chStr = std::to_string(ch); + + looperDirections[ch] = Direction::forwards; + // nothing happens when pressing up while direction is already forwards + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).up) }); + EXPECT_EQ(looperController_.pullEvents(), ""); + // pressing down while direction is forward reverses playback + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).down) }); + EXPECT_EQ(looperController_.pullEvents(), "setDirection(" + chStr + ", Direction::backwards)\n"); + + looperDirections[ch] = Direction::backwards; + // nothing happens when pressing down while direction is already backwards + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).down) }); + EXPECT_EQ(looperController_.pullEvents(), ""); + // pressing up while direction is backwards reverses playback + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).up) }); + EXPECT_EQ(looperController_.pullEvents(), "setDirection(" + chStr + ", Direction::forwards)\n"); + } +} + +TEST_F(UiFixture, settingsPage_adjustChannelLayout) +{ + // enter settings page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + // cycle to the channel layout setting + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + + // make looper controler mock return specific settings + std::array looperChannelLayouts; + looperController_.getChannelLayoutMock_ = [&](size_t ch) + { + return looperChannelLayouts[ch]; + }; + + // check if rocker switches modify the value + for (size_t ch = 0; ch < numLoopers_; ch++) + { + const auto chStr = std::to_string(ch); + + looperChannelLayouts[ch] = ChannelLayout::stereo; + // nothing happens when pressing up while layout is already stereo + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).up) }); + EXPECT_EQ(looperController_.pullEvents(), ""); + // pressing down while layout is stereo switches to mono + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).down) }); + EXPECT_EQ(looperController_.pullEvents(), "setChannelLayout(" + chStr + ", ChannelLayout::mono)\n"); + + looperChannelLayouts[ch] = ChannelLayout::mono; + // nothing happens when pressing down while layout is already mono + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).down) }); + EXPECT_EQ(looperController_.pullEvents(), ""); + // pressing up while layout is mono switches to stereo + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).up) }); + EXPECT_EQ(looperController_.pullEvents(), "setChannelLayout(" + chStr + ", ChannelLayout::stereo)\n"); + } +} + +TEST_F(UiFixture, settingsPage_adjustMotorLag) +{ + // enter settings page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + // cycle to the motor lag setting + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + + // make looper controler mock return specific settings + std::array looperMotorAccelerations; + looperController_.getMotorAccelerationMock_ = [&](size_t ch) + { + return looperMotorAccelerations[ch]; + }; + + // check if rocker switches modify the value + for (size_t ch = 0; ch < numLoopers_; ch++) + { + const auto chStr = std::to_string(ch); + + looperMotorAccelerations[ch] = MotorAcceleration::verySlow; + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).down) }); + EXPECT_EQ(looperController_.pullEvents(), ""); // nothing happens, already slowest setting + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).up) }); + EXPECT_EQ(looperController_.pullEvents(), "setMotorAcceleration(" + chStr + ", MotorAcceleration::slow)\n"); + + looperMotorAccelerations[ch] = MotorAcceleration::slow; + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).down) }); + EXPECT_EQ(looperController_.pullEvents(), "setMotorAcceleration(" + chStr + ", MotorAcceleration::verySlow)\n"); + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).up) }); + EXPECT_EQ(looperController_.pullEvents(), "setMotorAcceleration(" + chStr + ", MotorAcceleration::medium)\n"); + + looperMotorAccelerations[ch] = MotorAcceleration::medium; + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).down) }); + EXPECT_EQ(looperController_.pullEvents(), "setMotorAcceleration(" + chStr + ", MotorAcceleration::slow)\n"); + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).up) }); + EXPECT_EQ(looperController_.pullEvents(), "setMotorAcceleration(" + chStr + ", MotorAcceleration::fast)\n"); + + looperMotorAccelerations[ch] = MotorAcceleration::fast; + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).down) }); + EXPECT_EQ(looperController_.pullEvents(), "setMotorAcceleration(" + chStr + ", MotorAcceleration::medium)\n"); + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).up) }); + EXPECT_EQ(looperController_.pullEvents(), "setMotorAcceleration(" + chStr + ", MotorAcceleration::veryFast)\n"); + + looperMotorAccelerations[ch] = MotorAcceleration::veryFast; + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).down) }); + EXPECT_EQ(looperController_.pullEvents(), "setMotorAcceleration(" + chStr + ", MotorAcceleration::fast)\n"); + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, getChannelButtons(ch).up) }); + EXPECT_EQ(looperController_.pullEvents(), ""); // nothing happens, already fastest setting + } +} + +TEST_F(UiFixture, settingsPage_playButtonsDoNothing) +{ + // enter settings page + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + + const auto pressPlayButtons = [&]() + { + simulateEvents({ + Event(Event::Type::buttonPressedAndReleased, Button::chA_play), + Event(Event::Type::buttonPressedAndReleased, Button::chB_play), + Event(Event::Type::buttonPressedAndReleased, Button::chC_play), + Event(Event::Type::buttonPressedAndReleased, Button::chD_play), + }); + }; + + // nothing happens when controlling the direction + pressPlayButtons(); + EXPECT_EQ(looperController_.pullEvents(), ""); + + // nothing happens when controlling the channel layout + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + pressPlayButtons(); + EXPECT_EQ(looperController_.pullEvents(), ""); + + // nothing happens when controlling the motor lag + simulateEvents({ Event(Event::Type::buttonPressedAndReleased, Button::settings) }); + pressPlayButtons(); + EXPECT_EQ(looperController_.pullEvents(), ""); +} diff --git a/firmware/tests/libDaisyCombined.cpp b/firmware/tests/libDaisyCombined.cpp new file mode 100644 index 0000000..1f590a7 --- /dev/null +++ b/firmware/tests/libDaisyCombined.cpp @@ -0,0 +1,4 @@ +// include unit-testable code from libDaisy +// which is required for some of the integration tests +// that use the daisy::UI class. +#include <../tests/libDaisyCombined.cpp> diff --git a/firmware/tests/mocks/LooperController_mock.h b/firmware/tests/mocks/LooperController_mock.h new file mode 100644 index 0000000..b3362f9 --- /dev/null +++ b/firmware/tests/mocks/LooperController_mock.h @@ -0,0 +1,153 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include + +#include + +#include +#include "LooperController.h" + +template +class LooperControllerMock +{ +public: + std::string events; + std::string pullEvents() + { + const auto result = events; + events.clear(); + return result; + } + + void setLooperState(size_t looperIdx, LooperState state) + { + std::ostringstream stringStream; + stringStream << "setLooperState(" << looperIdx << ", "; + switch (state) + { + case LooperState::playing: + stringStream << "LooperState::playing)"; + break; + case LooperState::stopped: + stringStream << "LooperState::stopped)"; + break; + case LooperState::recording: + stringStream << "LooperState::recording)"; + break; + }; + events += stringStream.str() + "\n"; + } + + std::function getLooperStateMock_; + LooperState getLooperState(size_t looperIdx) const + { + if (getLooperStateMock_) + return getLooperStateMock_(looperIdx); + else + return LooperState::stopped; + } + + void saveTo(size_t looperIdx, size_t slot) + { + std::ostringstream stringStream; + stringStream << "saveTo(" << looperIdx << ", " << slot << ")"; + events += stringStream.str() + "\n"; + } + + void loadFrom(size_t looperIdx, size_t slot) + { + std::ostringstream stringStream; + stringStream << "loadFrom(" << looperIdx << ", " << slot << ")"; + events += stringStream.str() + "\n"; + } + + void setChannelLayout(size_t looperIdx, ChannelLayout channelLayout) + { + std::ostringstream stringStream; + stringStream << "setChannelLayout(" + << looperIdx << ", ChannelLayout::" + << (channelLayout == ChannelLayout::stereo ? "stereo)" : "mono)"); + events += stringStream.str() + "\n"; + } + + std::function getChannelLayoutMock_; + ChannelLayout getChannelLayout(size_t looperIdx) const + { + if (getChannelLayoutMock_) + return getChannelLayoutMock_(looperIdx); + else + return ChannelLayout::stereo; + } + + void setMotorAcceleration(size_t looperIdx, MotorAcceleration acceleration) + { + std::ostringstream stringStream; + stringStream << "setMotorAcceleration(" << looperIdx << ", "; + switch (acceleration) + { + case MotorAcceleration::instantaneous: + stringStream << "MotorAcceleration::instantaneous)"; + break; + case MotorAcceleration::verySlow: + stringStream << "MotorAcceleration::verySlow)"; + break; + case MotorAcceleration::slow: + stringStream << "MotorAcceleration::slow)"; + break; + case MotorAcceleration::medium: + stringStream << "MotorAcceleration::medium)"; + break; + case MotorAcceleration::fast: + stringStream << "MotorAcceleration::fast)"; + break; + case MotorAcceleration::veryFast: + stringStream << "MotorAcceleration::veryFast)"; + break; + }; + events += stringStream.str() + "\n"; + } + + std::function getMotorAccelerationMock_; + MotorAcceleration getMotorAcceleration(size_t looperIdx) const + { + if (getMotorAccelerationMock_) + return getMotorAccelerationMock_(looperIdx); + else + return MotorAcceleration::medium; + } + + void setDirection(size_t looperIdx, Direction direction) + { + std::ostringstream stringStream; + stringStream << "setDirection(" + << looperIdx << ", Direction::" + << (direction == Direction::forwards ? "forwards)" : "backwards)"); + events += stringStream.str() + "\n"; + } + + std::function getDirectionMock_; + Direction getDirection(size_t looperIdx) const + { + if (getDirectionMock_) + return getDirectionMock_(looperIdx); + else + return Direction::forwards; + } +}; \ No newline at end of file diff --git a/firmware/tests/mocks/ParameterProvider_mock.h b/firmware/tests/mocks/ParameterProvider_mock.h new file mode 100644 index 0000000..8645b5f --- /dev/null +++ b/firmware/tests/mocks/ParameterProvider_mock.h @@ -0,0 +1,47 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include + +template +class ParameterProviderMock +{ +public: + struct ControlInputs + { + // -2 .. 2 + int8_t octave = 0; + + // 0 .. 10 + float volumeCvVolts = 0.0f; + // -5 .. 5 + float pitchCvVolts = 0.0f; + + // the rest here is 0..1 + float fineTunePosition = 0.5f; + float wowAndFlutterAmt = 0.0f; + float volumeSliderPosition = 0.0f; + float driveAmt = 0.0f; + float grainAmt = 0.0f; + }; + + /** Set from UI pages */ + std::array + controlInputs_; +}; \ No newline at end of file diff --git a/firmware/src/hardware/Leds.h b/firmware/tests/mocks/PeakMeter_mock.h similarity index 76% rename from firmware/src/hardware/Leds.h rename to firmware/tests/mocks/PeakMeter_mock.h index 86d1e15..f9a60dc 100644 --- a/firmware/src/hardware/Leds.h +++ b/firmware/tests/mocks/PeakMeter_mock.h @@ -1,23 +1,31 @@ -/** +/** * Copyright (C) Johannes Elliesen, 2021 - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once -#include +class PeakMeterMock +{ +public: + float red_ = 0.0f; + float green_ = 0.0f; -using LedDriverType = daisy::LedDriverPca9685<1>; -static constexpr uint8_t ledCanvasId = 0; \ No newline at end of file + void getRedAndGreenValues(float& red, float& green) const + { + red = red_; + green = green_; + } +}; \ No newline at end of file diff --git a/firmware/tests/mocks/UiHardware_mock.h b/firmware/tests/mocks/UiHardware_mock.h new file mode 100644 index 0000000..6e36396 --- /dev/null +++ b/firmware/tests/mocks/UiHardware_mock.h @@ -0,0 +1,59 @@ +/** + * Copyright (C) Johannes Elliesen, 2021 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include + +#include "hardware/UiHardwareTypes.h" + +class UiHardwareMock +{ +public: + struct LedState + { + bool setToRawValue = false; + LedColour colour = LedColour::off; + float brightnessRed = 0.0f; + float brightnessGreen = 0.0f; + }; + std::array leds_; + + void setLedFromRawValues(Led led, float brightnessRed, float brightnessGreen) + { + leds_[size_t(led)].brightnessRed = brightnessRed; + leds_[size_t(led)].brightnessGreen = brightnessGreen; + leds_[size_t(led)].setToRawValue = true; + } + + void setLed(Led led, LedColour colour) + { + leds_[size_t(led)].colour = colour; + leds_[size_t(led)].setToRawValue = false; + } + + void clearLeds() + { + for (auto& led : leds_) + { + led.brightnessRed = 0.0f; + led.brightnessGreen = 0.0f; + led.setToRawValue = false; + led.colour = LedColour::off; + } + } +}; \ No newline at end of file diff --git a/hardware/mainboard/AudioIO.sch b/hardware/mainboard/AudioIO.sch index f150d5b..7801805 100644 --- a/hardware/mainboard/AudioIO.sch +++ b/hardware/mainboard/AudioIO.sch @@ -91,7 +91,7 @@ AR Path="/619B044B/61C471BA" Ref="R?" Part="1" AR Path="/61C471BA" Ref="R?" Part="1" AR Path="/61C2C7F7/61C471BA" Ref="R14" Part="1" F 0 "R14" V 5850 1700 50 0000 C CNN -F 1 "24k" V 5950 1700 50 0000 C CNN +F 1 "10k" V 5950 1700 50 0000 C CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 5680 1700 50 0001 C CNN F 3 "" H 5750 1700 50 0001 C CNN 1 5750 1700 @@ -167,7 +167,7 @@ AR Path="/619B044B/61C471DD" Ref="R?" Part="1" AR Path="/61C471DD" Ref="R?" Part="1" AR Path="/61C2C7F7/61C471DD" Ref="R15" Part="1" F 0 "R15" V 5850 3050 50 0000 C CNN -F 1 "24k" V 5950 3050 50 0000 C CNN +F 1 "10k" V 5950 3050 50 0000 C CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 5680 3050 50 0001 C CNN F 3 "" H 5750 3050 50 0001 C CNN 1 5750 3050 @@ -218,7 +218,7 @@ AR Path="/619B044B/61C471F4" Ref="R?" Part="1" AR Path="/61C471F4" Ref="R?" Part="1" AR Path="/61C2C7F7/61C471F4" Ref="R6" Part="1" F 0 "R6" V 4150 4050 50 0000 C CNN -F 1 "24k" V 4250 4050 50 0000 C CNN +F 1 "10k" V 4250 4050 50 0000 C CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 3980 4050 50 0001 C CNN F 3 "" H 4050 4050 50 0001 C CNN 1 4050 4050 @@ -294,7 +294,7 @@ AR Path="/619B044B/61C47217" Ref="R?" Part="1" AR Path="/61C47217" Ref="R?" Part="1" AR Path="/61C2C7F7/61C47217" Ref="R7" Part="1" F 0 "R7" V 4150 5350 50 0000 C CNN -F 1 "24k" V 4250 5350 50 0000 C CNN +F 1 "10k" V 4250 5350 50 0000 C CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 3980 5350 50 0001 C CNN F 3 "" H 4050 5350 50 0001 C CNN 1 4050 5350 @@ -419,7 +419,7 @@ AR Path="/5EDCCDBA/61C47250" Ref="J?" Part="1" AR Path="/619B044B/61C47250" Ref="J?" Part="1" AR Path="/61C2C7F7/61C47250" Ref="J3" Part="1" F 0 "J3" H 3622 1584 50 0000 R CNN -F 1 "AUDIO_IN_L" H 3622 1675 50 0000 R CNN +F 1 "PJ398SM" H 3622 1675 50 0000 R CNN F 2 "ell_connectors:THONKICONN" H 4083 1883 50 0001 C CNN F 3 "" H 4200 1400 50 0000 C CNN 1 4100 1550 @@ -455,7 +455,7 @@ AR Path="/5EDCCDBA/61C47260" Ref="J?" Part="1" AR Path="/619B044B/61C47260" Ref="J?" Part="1" AR Path="/61C2C7F7/61C47260" Ref="J4" Part="1" F 0 "J4" H 3622 2934 50 0000 R CNN -F 1 "AUDIO_IN_R" H 3622 3025 50 0000 R CNN +F 1 "PJ398SM" H 3622 3025 50 0000 R CNN F 2 "ell_connectors:THONKICONN" H 4083 3233 50 0001 C CNN F 3 "" H 4200 2750 50 0000 C CNN 1 4100 2900 @@ -492,7 +492,7 @@ AR Path="/5EDCCDBA/61C47270" Ref="J?" Part="1" AR Path="/619B044B/61C47270" Ref="J?" Part="1" AR Path="/61C2C7F7/61C47270" Ref="J5" Part="1" F 0 "J5" H 5522 4034 50 0000 R CNN -F 1 "AUDIO_OUT_L" H 5522 4125 50 0000 R CNN +F 1 "PJ398SM" H 5522 4125 50 0000 R CNN F 2 "ell_connectors:THONKICONN" H 5983 4333 50 0001 C CNN F 3 "" H 6100 3850 50 0000 C CNN 1 6000 4000 @@ -528,7 +528,7 @@ AR Path="/5EDCCDBA/61C47280" Ref="J?" Part="1" AR Path="/619B044B/61C47280" Ref="J?" Part="1" AR Path="/61C2C7F7/61C47280" Ref="J6" Part="1" F 0 "J6" H 5522 5334 50 0000 R CNN -F 1 "AUDIO_OUT_R" H 5522 5425 50 0000 R CNN +F 1 "PJ398SM" H 5522 5425 50 0000 R CNN F 2 "ell_connectors:THONKICONN" H 5983 5633 50 0001 C CNN F 3 "" H 6100 5150 50 0000 C CNN 1 6000 5300 @@ -724,4 +724,12 @@ Connection ~ 4300 4250 Connection ~ 5100 4250 Connection ~ 5100 5550 Connection ~ 4300 5550 +Text Notes 3700 1400 0 50 ~ 0 +Audio In L\n +Text Notes 3700 2750 0 50 ~ 0 +Audio In R\n +Text Notes 6500 3950 0 50 ~ 0 +Audio Out L\n +Text Notes 6500 5250 0 50 ~ 0 +Audio Out R $EndSCHEMATC diff --git a/hardware/mainboard/Channel_ADCs.sch b/hardware/mainboard/Channel_ADCs.sch index 67c7543..ddcecab 100644 --- a/hardware/mainboard/Channel_ADCs.sch +++ b/hardware/mainboard/Channel_ADCs.sch @@ -16,616 +16,616 @@ $EndDescr $Comp L ell_digital_silicon:MAX11300_TQFP U? U 1 1 61FE9312 -P 8250 3500 +P 8100 3500 AR Path="/61D4151D/61FE9312" Ref="U?" Part="1" AR Path="/61FB9D3C/61FE9312" Ref="U9" Part="1" -F 0 "U9" H 8250 5415 50 0000 C CNN -F 1 "MAX11300_TQFP" H 8250 5324 50 0000 C CNN -F 2 "Package_QFP:TQFP-48_7x7mm_P0.5mm" H 8250 3600 50 0001 C CNN -F 3 "" H 8250 3600 50 0001 C CNN - 1 8250 3500 +F 0 "U9" H 8100 5415 50 0000 C CNN +F 1 "MAX11300_TQFP" H 8100 5324 50 0000 C CNN +F 2 "Package_QFP:TQFP-48_7x7mm_P0.5mm" H 8100 3600 50 0001 C CNN +F 3 "" H 8100 3600 50 0001 C CNN + 1 8100 3500 1 0 0 -1 $EndComp $Comp L ell_audio_conn:JACK_TS_3PINS J? U 1 1 61FE9318 -P 10400 850 +P 10250 850 AR Path="/61D4151D/61FE9318" Ref="J?" Part="1" AR Path="/61FB9D3C/61FE9318" Ref="J11" Part="1" -F 0 "J11" H 9922 884 50 0000 R CNN -F 1 "PITCH_C" H 9922 975 50 0000 R CNN -F 2 "ell_connectors:THONKICONN" H 10500 700 50 0001 C CNN -F 3 "" H 10500 700 50 0000 C CNN - 1 10400 850 +F 0 "J11" H 9772 884 50 0000 R CNN +F 1 "PJ398SM" H 9772 975 50 0000 R CNN +F 2 "ell_connectors:THONKICONN" H 10350 700 50 0001 C CNN +F 3 "" H 10350 700 50 0000 C CNN + 1 10250 850 -1 0 0 1 $EndComp $Comp L power:GNDA #PWR? U 1 1 61FE931E -P 9950 1100 +P 9800 1100 AR Path="/61D4151D/61FE931E" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE931E" Ref="#PWR0193" Part="1" -F 0 "#PWR0193" H 9950 850 50 0001 C CNN -F 1 "GNDA" H 9955 927 50 0000 C CNN -F 2 "" H 9950 1100 50 0001 C CNN -F 3 "" H 9950 1100 50 0001 C CNN - 1 9950 1100 +F 0 "#PWR0193" H 9800 850 50 0001 C CNN +F 1 "GNDA" H 9805 927 50 0000 C CNN +F 2 "" H 9800 1100 50 0001 C CNN +F 3 "" H 9800 1100 50 0001 C CNN + 1 9800 1100 1 0 0 -1 $EndComp Wire Wire Line - 10000 1050 9950 1050 + 9850 1050 9800 1050 Wire Wire Line - 9950 1050 9950 1100 + 9800 1050 9800 1100 Wire Wire Line - 10000 900 9950 900 + 9850 900 9800 900 Wire Wire Line - 9950 900 9950 1050 -Connection ~ 9950 1050 + 9800 900 9800 1050 +Connection ~ 9800 1050 $Comp L ell_audio_conn:JACK_TS_3PINS J? U 1 1 61FE9329 -P 10400 1500 +P 10250 1500 AR Path="/61D4151D/61FE9329" Ref="J?" Part="1" AR Path="/61FB9D3C/61FE9329" Ref="J12" Part="1" -F 0 "J12" H 9922 1534 50 0000 R CNN -F 1 "PITCH_D" H 9922 1625 50 0000 R CNN -F 2 "ell_connectors:THONKICONN" H 10500 1350 50 0001 C CNN -F 3 "" H 10500 1350 50 0000 C CNN - 1 10400 1500 +F 0 "J12" H 9772 1534 50 0000 R CNN +F 1 "PJ398SM" H 9772 1625 50 0000 R CNN +F 2 "ell_connectors:THONKICONN" H 10350 1350 50 0001 C CNN +F 3 "" H 10350 1350 50 0000 C CNN + 1 10250 1500 -1 0 0 1 $EndComp $Comp L power:GNDA #PWR? U 1 1 61FE932F -P 9950 1750 +P 9800 1750 AR Path="/61D4151D/61FE932F" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE932F" Ref="#PWR0194" Part="1" -F 0 "#PWR0194" H 9950 1500 50 0001 C CNN -F 1 "GNDA" H 9955 1577 50 0000 C CNN -F 2 "" H 9950 1750 50 0001 C CNN -F 3 "" H 9950 1750 50 0001 C CNN - 1 9950 1750 +F 0 "#PWR0194" H 9800 1500 50 0001 C CNN +F 1 "GNDA" H 9805 1577 50 0000 C CNN +F 2 "" H 9800 1750 50 0001 C CNN +F 3 "" H 9800 1750 50 0001 C CNN + 1 9800 1750 1 0 0 -1 $EndComp Wire Wire Line - 10000 1700 9950 1700 + 9850 1700 9800 1700 Wire Wire Line - 9950 1700 9950 1750 + 9800 1700 9800 1750 Wire Wire Line - 10000 1550 9950 1550 + 9850 1550 9800 1550 Wire Wire Line - 9950 1550 9950 1700 -Connection ~ 9950 1700 + 9800 1550 9800 1700 +Connection ~ 9800 1700 Wire Wire Line - 8900 2550 9000 2550 + 8750 2550 8850 2550 Wire Wire Line - 9000 2550 9000 800 + 8850 2550 8850 800 Wire Wire Line - 9000 800 9350 800 + 8850 800 9200 800 Wire Wire Line - 10000 1450 9650 1450 + 9850 1450 9500 1450 Wire Wire Line - 9100 1450 9100 2650 + 8950 1450 8950 2650 Wire Wire Line - 9100 2650 8900 2650 + 8950 2650 8750 2650 $Comp L ell_audio_conn:JACK_TS_3PINS J? U 1 1 61FE9340 -P 10400 2150 +P 10250 2150 AR Path="/61D4151D/61FE9340" Ref="J?" Part="1" AR Path="/61FB9D3C/61FE9340" Ref="J13" Part="1" -F 0 "J13" H 9922 2184 50 0000 R CNN -F 1 "VOL_C" H 9922 2275 50 0000 R CNN -F 2 "ell_connectors:THONKICONN" H 10500 2000 50 0001 C CNN -F 3 "" H 10500 2000 50 0000 C CNN - 1 10400 2150 +F 0 "J13" H 9772 2184 50 0000 R CNN +F 1 "PJ398SM" H 9772 2275 50 0000 R CNN +F 2 "ell_connectors:THONKICONN" H 10350 2000 50 0001 C CNN +F 3 "" H 10350 2000 50 0000 C CNN + 1 10250 2150 -1 0 0 1 $EndComp $Comp L power:GNDA #PWR? U 1 1 61FE9346 -P 9950 2400 +P 9800 2400 AR Path="/61D4151D/61FE9346" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE9346" Ref="#PWR0195" Part="1" -F 0 "#PWR0195" H 9950 2150 50 0001 C CNN -F 1 "GNDA" H 9955 2227 50 0000 C CNN -F 2 "" H 9950 2400 50 0001 C CNN -F 3 "" H 9950 2400 50 0001 C CNN - 1 9950 2400 +F 0 "#PWR0195" H 9800 2150 50 0001 C CNN +F 1 "GNDA" H 9805 2227 50 0000 C CNN +F 2 "" H 9800 2400 50 0001 C CNN +F 3 "" H 9800 2400 50 0001 C CNN + 1 9800 2400 1 0 0 -1 $EndComp Wire Wire Line - 10000 2350 9950 2350 + 9850 2350 9800 2350 Wire Wire Line - 9950 2350 9950 2400 + 9800 2350 9800 2400 Wire Wire Line - 10000 2200 9750 2200 + 9850 2200 9600 2200 Wire Wire Line - 9750 2200 9750 2000 + 9600 2200 9600 2000 $Comp L power:+5VA #PWR? U 1 1 61FE9350 -P 9750 2000 +P 9600 2000 AR Path="/61D4151D/61FE9350" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE9350" Ref="#PWR0191" Part="1" -F 0 "#PWR0191" H 9750 1850 50 0001 C CNN -F 1 "+5VA" H 9765 2173 50 0000 C CNN -F 2 "" H 9750 2000 50 0001 C CNN -F 3 "" H 9750 2000 50 0001 C CNN - 1 9750 2000 +F 0 "#PWR0191" H 9600 1850 50 0001 C CNN +F 1 "+5VA" H 9615 2173 50 0000 C CNN +F 2 "" H 9600 2000 50 0001 C CNN +F 3 "" H 9600 2000 50 0001 C CNN + 1 9600 2000 1 0 0 -1 $EndComp Wire Wire Line - 10000 2100 9650 2100 + 9850 2100 9500 2100 Wire Wire Line - 9200 2100 9200 2750 + 9050 2100 9050 2750 Wire Wire Line - 9200 2750 8900 2750 + 9050 2750 8750 2750 $Comp L ell_audio_conn:JACK_TS_3PINS J? U 1 1 61FE9359 -P 10400 2800 +P 10250 2800 AR Path="/61D4151D/61FE9359" Ref="J?" Part="1" AR Path="/61FB9D3C/61FE9359" Ref="J14" Part="1" -F 0 "J14" H 9922 2834 50 0000 R CNN -F 1 "VOL_D" H 9922 2925 50 0000 R CNN -F 2 "ell_connectors:THONKICONN" H 10500 2650 50 0001 C CNN -F 3 "" H 10500 2650 50 0000 C CNN - 1 10400 2800 +F 0 "J14" H 9772 2834 50 0000 R CNN +F 1 "PJ398SM" H 9772 2925 50 0000 R CNN +F 2 "ell_connectors:THONKICONN" H 10350 2650 50 0001 C CNN +F 3 "" H 10350 2650 50 0000 C CNN + 1 10250 2800 -1 0 0 1 $EndComp $Comp L power:GNDA #PWR? U 1 1 61FE935F -P 9950 3050 +P 9800 3050 AR Path="/61D4151D/61FE935F" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE935F" Ref="#PWR0196" Part="1" -F 0 "#PWR0196" H 9950 2800 50 0001 C CNN -F 1 "GNDA" H 9955 2877 50 0000 C CNN -F 2 "" H 9950 3050 50 0001 C CNN -F 3 "" H 9950 3050 50 0001 C CNN - 1 9950 3050 +F 0 "#PWR0196" H 9800 2800 50 0001 C CNN +F 1 "GNDA" H 9805 2877 50 0000 C CNN +F 2 "" H 9800 3050 50 0001 C CNN +F 3 "" H 9800 3050 50 0001 C CNN + 1 9800 3050 1 0 0 -1 $EndComp Wire Wire Line - 10000 3000 9950 3000 + 9850 3000 9800 3000 Wire Wire Line - 9950 3000 9950 3050 + 9800 3000 9800 3050 Wire Wire Line - 10000 2850 9750 2850 + 9850 2850 9600 2850 Wire Wire Line - 9750 2850 9750 2650 + 9600 2850 9600 2650 $Comp L power:+5VA #PWR? U 1 1 61FE9369 -P 9750 2650 +P 9600 2650 AR Path="/61D4151D/61FE9369" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE9369" Ref="#PWR0192" Part="1" -F 0 "#PWR0192" H 9750 2500 50 0001 C CNN -F 1 "+5VA" H 9765 2823 50 0000 C CNN -F 2 "" H 9750 2650 50 0001 C CNN -F 3 "" H 9750 2650 50 0001 C CNN - 1 9750 2650 +F 0 "#PWR0192" H 9600 2500 50 0001 C CNN +F 1 "+5VA" H 9615 2823 50 0000 C CNN +F 2 "" H 9600 2650 50 0001 C CNN +F 3 "" H 9600 2650 50 0001 C CNN + 1 9600 2650 1 0 0 -1 $EndComp Wire Wire Line - 10000 2750 9650 2750 + 9850 2750 9500 2750 Wire Wire Line - 9300 2750 9300 2850 + 9150 2750 9150 2850 Wire Wire Line - 9300 2850 8900 2850 + 9150 2850 8750 2850 Wire Wire Line - 8900 2950 9000 2950 -Text GLabel 9000 2950 2 50 Input ~ 0 + 8750 2950 8850 2950 +Text GLabel 8850 2950 2 50 Input ~ 0 POT_PITCH_C Wire Wire Line - 8900 3050 9000 3050 -Text GLabel 9000 3050 2 50 Input ~ 0 + 8750 3050 8850 3050 +Text GLabel 8850 3050 2 50 Input ~ 0 POT_PITCH_D Wire Wire Line - 8900 3350 9000 3350 -Text GLabel 9000 3350 2 50 Input ~ 0 + 8750 3350 8850 3350 +Text GLabel 8850 3350 2 50 Input ~ 0 POT_DRIVE_C Wire Wire Line - 8900 3450 9000 3450 -Text GLabel 9000 3450 2 50 Input ~ 0 + 8750 3450 8850 3450 +Text GLabel 8850 3450 2 50 Input ~ 0 POT_DRIVE_D Wire Wire Line - 8900 3550 9000 3550 -Text GLabel 9000 3550 2 50 Input ~ 0 + 8750 3550 8850 3550 +Text GLabel 8850 3550 2 50 Input ~ 0 POT_GRAIN_C Wire Wire Line - 8900 3650 9000 3650 -Text GLabel 9000 3650 2 50 Input ~ 0 + 8750 3650 8850 3650 +Text GLabel 8850 3650 2 50 Input ~ 0 POT_GRAIN_D Wire Wire Line - 8900 3150 9000 3150 -Text GLabel 9000 3150 2 50 Input ~ 0 + 8750 3150 8850 3150 +Text GLabel 8850 3150 2 50 Input ~ 0 POT_VOL_C Wire Wire Line - 8900 3250 9000 3250 -Text GLabel 9000 3250 2 50 Input ~ 0 + 8750 3250 8850 3250 +Text GLabel 8850 3250 2 50 Input ~ 0 POT_VOL_D Wire Wire Line - 8900 3750 9000 3750 -Text GLabel 9000 3750 2 50 Input ~ 0 + 8750 3750 8850 3750 +Text GLabel 8850 3750 2 50 Input ~ 0 POT_WARBLE_C Wire Wire Line - 8900 3850 9000 3850 -Text GLabel 9000 3850 2 50 Input ~ 0 + 8750 3850 8850 3850 +Text GLabel 8850 3850 2 50 Input ~ 0 POT_WARBLE_D Wire Wire Line - 8900 3950 9000 3950 -Text GLabel 9000 3950 2 50 Input ~ 0 + 8750 3950 8850 3950 +Text GLabel 8850 3950 2 50 Input ~ 0 BTTN_UP_C Wire Wire Line - 8900 4050 9000 4050 -Text GLabel 9000 4050 2 50 Input ~ 0 + 8750 4050 8850 4050 +Text GLabel 8850 4050 2 50 Input ~ 0 BTTN_UP_D Wire Wire Line - 8900 4150 9000 4150 -Text GLabel 9000 4150 2 50 Input ~ 0 + 8750 4150 8850 4150 +Text GLabel 8850 4150 2 50 Input ~ 0 BTTN_DOWN_C Wire Wire Line - 8900 4250 9000 4250 -Text GLabel 9000 4250 2 50 Input ~ 0 + 8750 4250 8850 4250 +Text GLabel 8850 4250 2 50 Input ~ 0 BTTN_DOWN_D Wire Wire Line - 8900 4350 9000 4350 -Text GLabel 9000 4350 2 50 Input ~ 0 + 8750 4350 8850 4350 +Text GLabel 8850 4350 2 50 Input ~ 0 BTTN_PLAY_C Wire Wire Line - 8900 4450 9000 4450 -Text GLabel 9000 4450 2 50 Input ~ 0 + 8750 4450 8850 4450 +Text GLabel 8850 4450 2 50 Input ~ 0 BTTN_PLAY_D -NoConn ~ 7600 4250 -NoConn ~ 7600 4850 -NoConn ~ 7600 4950 -NoConn ~ 7600 5050 -NoConn ~ 7600 5150 +NoConn ~ 7450 4250 +NoConn ~ 7450 4850 +NoConn ~ 7450 4950 +NoConn ~ 7450 5050 +NoConn ~ 7450 5150 $Comp L Device:C C? U 1 1 61FE9397 -P 6750 4900 +P 6600 4900 AR Path="/61D4151D/61FE9397" Ref="C?" Part="1" AR Path="/61FB9D3C/61FE9397" Ref="C53" Part="1" -F 0 "C53" H 6865 4946 50 0000 L CNN -F 1 "100n" H 6865 4855 50 0000 L CNN -F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 6788 4750 50 0001 C CNN -F 3 "~" H 6750 4900 50 0001 C CNN - 1 6750 4900 +F 0 "C53" H 6715 4946 50 0000 L CNN +F 1 "100n" H 6715 4855 50 0000 L CNN +F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 6638 4750 50 0001 C CNN +F 3 "~" H 6600 4900 50 0001 C CNN + 1 6600 4900 1 0 0 -1 $EndComp $Comp L Device:C C? U 1 1 61FE939D -P 7200 4900 +P 7050 4900 AR Path="/61D4151D/61FE939D" Ref="C?" Part="1" AR Path="/61FB9D3C/61FE939D" Ref="C54" Part="1" -F 0 "C54" H 7315 4946 50 0000 L CNN -F 1 "4u7" H 7315 4855 50 0000 L CNN -F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 7238 4750 50 0001 C CNN -F 3 "~" H 7200 4900 50 0001 C CNN - 1 7200 4900 +F 0 "C54" H 7165 4946 50 0000 L CNN +F 1 "4u7" H 7165 4855 50 0000 L CNN +F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 7088 4750 50 0001 C CNN +F 3 "~" H 7050 4900 50 0001 C CNN + 1 7050 4900 1 0 0 -1 $EndComp Wire Wire Line - 6750 4650 7200 4650 + 6600 4650 7050 4650 Wire Wire Line - 6750 4650 6750 4750 + 6600 4650 6600 4750 Wire Wire Line - 7200 4750 7200 4650 -Connection ~ 7200 4650 + 7050 4750 7050 4650 +Connection ~ 7050 4650 Wire Wire Line - 7200 4650 7600 4650 + 7050 4650 7450 4650 $Comp L power:GNDA #PWR? U 1 1 61FE93A8 -P 6750 5050 +P 6600 5050 AR Path="/61D4151D/61FE93A8" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE93A8" Ref="#PWR0183" Part="1" -F 0 "#PWR0183" H 6750 4800 50 0001 C CNN -F 1 "GNDA" H 6755 4877 50 0000 C CNN -F 2 "" H 6750 5050 50 0001 C CNN -F 3 "" H 6750 5050 50 0001 C CNN - 1 6750 5050 +F 0 "#PWR0183" H 6600 4800 50 0001 C CNN +F 1 "GNDA" H 6605 4877 50 0000 C CNN +F 2 "" H 6600 5050 50 0001 C CNN +F 3 "" H 6600 5050 50 0001 C CNN + 1 6600 5050 1 0 0 -1 $EndComp $Comp L power:GNDA #PWR? U 1 1 61FE93AE -P 7200 5050 +P 7050 5050 AR Path="/61D4151D/61FE93AE" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE93AE" Ref="#PWR0184" Part="1" -F 0 "#PWR0184" H 7200 4800 50 0001 C CNN -F 1 "GNDA" H 7205 4877 50 0000 C CNN -F 2 "" H 7200 5050 50 0001 C CNN -F 3 "" H 7200 5050 50 0001 C CNN - 1 7200 5050 +F 0 "#PWR0184" H 7050 4800 50 0001 C CNN +F 1 "GNDA" H 7055 4877 50 0000 C CNN +F 2 "" H 7050 5050 50 0001 C CNN +F 3 "" H 7050 5050 50 0001 C CNN + 1 7050 5050 1 0 0 -1 $EndComp $Comp L Device:C C? U 1 1 61FE93B4 -P 5800 4900 +P 5650 4900 AR Path="/61D4151D/61FE93B4" Ref="C?" Part="1" AR Path="/61FB9D3C/61FE93B4" Ref="C47" Part="1" -F 0 "C47" H 5915 4946 50 0000 L CNN -F 1 "100n" H 5915 4855 50 0000 L CNN -F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 5838 4750 50 0001 C CNN -F 3 "~" H 5800 4900 50 0001 C CNN - 1 5800 4900 +F 0 "C47" H 5765 4946 50 0000 L CNN +F 1 "100n" H 5765 4855 50 0000 L CNN +F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 5688 4750 50 0001 C CNN +F 3 "~" H 5650 4900 50 0001 C CNN + 1 5650 4900 1 0 0 -1 $EndComp $Comp L Device:C C? U 1 1 61FE93BA -P 6250 4900 +P 6100 4900 AR Path="/61D4151D/61FE93BA" Ref="C?" Part="1" AR Path="/61FB9D3C/61FE93BA" Ref="C50" Part="1" -F 0 "C50" H 6365 4946 50 0000 L CNN -F 1 "4u7" H 6365 4855 50 0000 L CNN -F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 6288 4750 50 0001 C CNN -F 3 "~" H 6250 4900 50 0001 C CNN - 1 6250 4900 +F 0 "C50" H 6215 4946 50 0000 L CNN +F 1 "4u7" H 6215 4855 50 0000 L CNN +F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 6138 4750 50 0001 C CNN +F 3 "~" H 6100 4900 50 0001 C CNN + 1 6100 4900 1 0 0 -1 $EndComp Wire Wire Line - 5800 4450 6250 4450 + 5650 4450 6100 4450 Wire Wire Line - 5800 4450 5800 4750 + 5650 4450 5650 4750 Wire Wire Line - 6250 4750 6250 4450 -Connection ~ 6250 4450 + 6100 4750 6100 4450 +Connection ~ 6100 4450 $Comp L power:GNDA #PWR? U 1 1 61FE93C4 -P 5800 5050 +P 5650 5050 AR Path="/61D4151D/61FE93C4" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE93C4" Ref="#PWR0173" Part="1" -F 0 "#PWR0173" H 5800 4800 50 0001 C CNN -F 1 "GNDA" H 5805 4877 50 0000 C CNN -F 2 "" H 5800 5050 50 0001 C CNN -F 3 "" H 5800 5050 50 0001 C CNN - 1 5800 5050 +F 0 "#PWR0173" H 5650 4800 50 0001 C CNN +F 1 "GNDA" H 5655 4877 50 0000 C CNN +F 2 "" H 5650 5050 50 0001 C CNN +F 3 "" H 5650 5050 50 0001 C CNN + 1 5650 5050 1 0 0 -1 $EndComp $Comp L power:GNDA #PWR? U 1 1 61FE93CA -P 6250 5050 +P 6100 5050 AR Path="/61D4151D/61FE93CA" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE93CA" Ref="#PWR0178" Part="1" -F 0 "#PWR0178" H 6250 4800 50 0001 C CNN -F 1 "GNDA" H 6255 4877 50 0000 C CNN -F 2 "" H 6250 5050 50 0001 C CNN -F 3 "" H 6250 5050 50 0001 C CNN - 1 6250 5050 +F 0 "#PWR0178" H 6100 4800 50 0001 C CNN +F 1 "GNDA" H 6105 4877 50 0000 C CNN +F 2 "" H 6100 5050 50 0001 C CNN +F 3 "" H 6100 5050 50 0001 C CNN + 1 6100 5050 1 0 0 -1 $EndComp Wire Wire Line - 6250 4450 7600 4450 -NoConn ~ 7600 4550 + 6100 4450 7450 4450 +NoConn ~ 7450 4550 Wire Wire Line - 7600 1950 7400 1950 + 7450 1950 7250 1950 $Comp L power:GND #PWR? U 1 1 61FE93D3 -P 7400 1950 +P 7250 1950 AR Path="/61D4151D/61FE93D3" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE93D3" Ref="#PWR0186" Part="1" -F 0 "#PWR0186" H 7400 1700 50 0001 C CNN -F 1 "GND" V 7400 1800 50 0000 R CNN -F 2 "" H 7400 1950 50 0001 C CNN -F 3 "" H 7400 1950 50 0001 C CNN - 1 7400 1950 +F 0 "#PWR0186" H 7250 1700 50 0001 C CNN +F 1 "GND" V 7250 1800 50 0000 R CNN +F 2 "" H 7250 1950 50 0001 C CNN +F 3 "" H 7250 1950 50 0001 C CNN + 1 7250 1950 0 1 1 0 $EndComp $Comp L power:+3V3 #PWR? U 1 1 61FE93D9 -P 7400 1850 +P 7250 1850 AR Path="/61D4151D/61FE93D9" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE93D9" Ref="#PWR0185" Part="1" -F 0 "#PWR0185" H 7400 1700 50 0001 C CNN -F 1 "+3V3" V 7400 2000 50 0000 L CNN -F 2 "" H 7400 1850 50 0001 C CNN -F 3 "" H 7400 1850 50 0001 C CNN - 1 7400 1850 +F 0 "#PWR0185" H 7250 1700 50 0001 C CNN +F 1 "+3V3" V 7250 2000 50 0000 L CNN +F 2 "" H 7250 1850 50 0001 C CNN +F 3 "" H 7250 1850 50 0001 C CNN + 1 7250 1850 0 -1 -1 0 $EndComp $Comp L power:+5VA #PWR? U 1 1 61FE93DF -P 7400 2100 +P 7250 2100 AR Path="/61D4151D/61FE93DF" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE93DF" Ref="#PWR0187" Part="1" -F 0 "#PWR0187" H 7400 1950 50 0001 C CNN -F 1 "+5VA" V 7400 2350 50 0000 C CNN -F 2 "" H 7400 2100 50 0001 C CNN -F 3 "" H 7400 2100 50 0001 C CNN - 1 7400 2100 +F 0 "#PWR0187" H 7250 1950 50 0001 C CNN +F 1 "+5VA" V 7250 2350 50 0000 C CNN +F 2 "" H 7250 2100 50 0001 C CNN +F 3 "" H 7250 2100 50 0001 C CNN + 1 7250 2100 0 -1 -1 0 $EndComp Wire Wire Line - 7400 2100 7500 2100 + 7250 2100 7350 2100 Wire Wire Line - 7400 1850 7600 1850 + 7250 1850 7450 1850 $Comp L power:GNDA #PWR? U 1 1 61FE93E7 -P 7400 2350 +P 7250 2350 AR Path="/61D4151D/61FE93E7" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE93E7" Ref="#PWR0188" Part="1" -F 0 "#PWR0188" H 7400 2100 50 0001 C CNN -F 1 "GNDA" V 7400 2200 50 0000 R CNN -F 2 "" H 7400 2350 50 0001 C CNN -F 3 "" H 7400 2350 50 0001 C CNN - 1 7400 2350 +F 0 "#PWR0188" H 7250 2100 50 0001 C CNN +F 1 "GNDA" V 7250 2200 50 0000 R CNN +F 2 "" H 7250 2350 50 0001 C CNN +F 3 "" H 7250 2350 50 0001 C CNN + 1 7250 2350 0 1 1 0 $EndComp Wire Wire Line - 7400 2350 7500 2350 + 7250 2350 7350 2350 Wire Wire Line - 7600 2550 7500 2550 + 7450 2550 7350 2550 Wire Wire Line - 7500 2550 7500 2450 -Connection ~ 7500 2350 + 7350 2550 7350 2450 +Connection ~ 7350 2350 Wire Wire Line - 7500 2350 7600 2350 + 7350 2350 7450 2350 Wire Wire Line - 7600 2450 7500 2450 -Connection ~ 7500 2450 + 7450 2450 7350 2450 +Connection ~ 7350 2450 Wire Wire Line - 7500 2450 7500 2350 + 7350 2450 7350 2350 Wire Wire Line - 7600 2200 7500 2200 + 7450 2200 7350 2200 Wire Wire Line - 7500 2200 7500 2100 -Connection ~ 7500 2100 + 7350 2200 7350 2100 +Connection ~ 7350 2100 Wire Wire Line - 7500 2100 7600 2100 + 7350 2100 7450 2100 Wire Wire Line - 7600 2700 7500 2700 + 7450 2700 7350 2700 $Comp L power:+12VA #PWR? U 1 1 61FE93FA -P 7400 2700 +P 7250 2700 AR Path="/61D4151D/61FE93FA" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE93FA" Ref="#PWR0189" Part="1" -F 0 "#PWR0189" H 7400 2550 50 0001 C CNN -F 1 "+12VA" V 7400 2850 50 0000 L CNN -F 2 "" H 7400 2700 50 0001 C CNN -F 3 "" H 7400 2700 50 0001 C CNN - 1 7400 2700 +F 0 "#PWR0189" H 7250 2550 50 0001 C CNN +F 1 "+12VA" V 7250 2850 50 0000 L CNN +F 2 "" H 7250 2700 50 0001 C CNN +F 3 "" H 7250 2700 50 0001 C CNN + 1 7250 2700 0 -1 -1 0 $EndComp Wire Wire Line - 7600 2800 7500 2800 + 7450 2800 7350 2800 Wire Wire Line - 7500 2800 7500 2700 -Connection ~ 7500 2700 + 7350 2800 7350 2700 +Connection ~ 7350 2700 Wire Wire Line - 7500 2700 7400 2700 + 7350 2700 7250 2700 Wire Wire Line - 7600 2950 7500 2950 + 7450 2950 7350 2950 $Comp L power:-12VA #PWR? U 1 1 61FE9405 -P 7400 2950 +P 7250 2950 AR Path="/61D4151D/61FE9405" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/61FE9405" Ref="#PWR0190" Part="1" -F 0 "#PWR0190" H 7400 2800 50 0001 C CNN -F 1 "-12VA" V 7415 3077 50 0000 L CNN -F 2 "" H 7400 2950 50 0001 C CNN -F 3 "" H 7400 2950 50 0001 C CNN - 1 7400 2950 +F 0 "#PWR0190" H 7250 2800 50 0001 C CNN +F 1 "-12VA" V 7265 3077 50 0000 L CNN +F 2 "" H 7250 2950 50 0001 C CNN +F 3 "" H 7250 2950 50 0001 C CNN + 1 7250 2950 0 -1 -1 0 $EndComp Wire Wire Line - 7600 3450 7500 3450 + 7450 3450 7350 3450 Wire Wire Line - 7500 3450 7500 3350 -Connection ~ 7500 2950 + 7350 3450 7350 3350 +Connection ~ 7350 2950 Wire Wire Line - 7500 2950 7400 2950 + 7350 2950 7250 2950 Wire Wire Line - 7600 3050 7500 3050 -Connection ~ 7500 3050 + 7450 3050 7350 3050 +Connection ~ 7350 3050 Wire Wire Line - 7500 3050 7500 2950 + 7350 3050 7350 2950 Wire Wire Line - 7600 3150 7500 3150 -Connection ~ 7500 3150 + 7450 3150 7350 3150 +Connection ~ 7350 3150 Wire Wire Line - 7500 3150 7500 3050 + 7350 3150 7350 3050 Wire Wire Line - 7600 3250 7500 3250 -Connection ~ 7500 3250 + 7450 3250 7350 3250 +Connection ~ 7350 3250 Wire Wire Line - 7500 3250 7500 3150 + 7350 3250 7350 3150 Wire Wire Line - 7600 3350 7500 3350 -Connection ~ 7500 3350 + 7450 3350 7350 3350 +Connection ~ 7350 3350 Wire Wire Line - 7500 3350 7500 3250 -Text GLabel 6650 3650 0 50 Input ~ 0 + 7350 3350 7350 3250 +Text GLabel 6500 3650 0 50 Input ~ 0 SPI_MOSI -Text GLabel 6650 3750 0 50 Input ~ 0 +Text GLabel 6500 3750 0 50 Input ~ 0 SPI_SCLK -Text GLabel 6650 3850 0 50 Input ~ 0 +Text GLabel 6500 3850 0 50 Input ~ 0 SPI_CS_CD -Text GLabel 6650 3950 0 50 Output ~ 0 +Text GLabel 6500 3950 0 50 Output ~ 0 SPI_MISO -NoConn ~ 7600 4050 +NoConn ~ 7450 4050 Wire Wire Line - 7600 3950 7150 3950 + 7450 3950 7000 3950 Wire Wire Line - 6650 3850 7200 3850 + 6500 3850 7050 3850 Wire Wire Line - 7600 3750 7150 3750 + 7450 3750 7000 3750 Wire Wire Line - 6650 3650 7200 3650 + 6500 3650 7050 3650 $Comp L Device:R R? U 1 1 61FE9424 -P 7350 3650 +P 7200 3650 AR Path="/61D4151D/61FE9424" Ref="R?" Part="1" AR Path="/61FB9D3C/61FE9424" Ref="R93" Part="1" -F 0 "R93" V 7143 3650 50 0000 C CNN -F 1 "20R" V 7234 3650 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7280 3650 50 0001 C CNN -F 3 "~" H 7350 3650 50 0001 C CNN - 1 7350 3650 +F 0 "R93" V 6993 3650 50 0000 C CNN +F 1 "20R" V 7084 3650 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7130 3650 50 0001 C CNN +F 3 "~" H 7200 3650 50 0001 C CNN + 1 7200 3650 0 1 1 0 $EndComp Wire Wire Line - 7500 3650 7600 3650 + 7350 3650 7450 3650 $Comp L Device:R R? U 1 1 61FE942B -P 7000 3750 +P 6850 3750 AR Path="/61D4151D/61FE942B" Ref="R?" Part="1" AR Path="/61FB9D3C/61FE942B" Ref="R91" Part="1" -F 0 "R91" V 6793 3750 50 0000 C CNN -F 1 "20R" V 6884 3750 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6930 3750 50 0001 C CNN -F 3 "~" H 7000 3750 50 0001 C CNN - 1 7000 3750 +F 0 "R91" V 6643 3750 50 0000 C CNN +F 1 "20R" V 6734 3750 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6780 3750 50 0001 C CNN +F 3 "~" H 6850 3750 50 0001 C CNN + 1 6850 3750 0 1 1 0 $EndComp Wire Wire Line - 6850 3750 6650 3750 + 6700 3750 6500 3750 $Comp L Device:R R? U 1 1 61FE9432 -P 7350 3850 +P 7200 3850 AR Path="/61D4151D/61FE9432" Ref="R?" Part="1" AR Path="/61FB9D3C/61FE9432" Ref="R94" Part="1" -F 0 "R94" V 7143 3850 50 0000 C CNN -F 1 "20R" V 7234 3850 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7280 3850 50 0001 C CNN -F 3 "~" H 7350 3850 50 0001 C CNN - 1 7350 3850 +F 0 "R94" V 6993 3850 50 0000 C CNN +F 1 "20R" V 7084 3850 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7130 3850 50 0001 C CNN +F 3 "~" H 7200 3850 50 0001 C CNN + 1 7200 3850 0 1 1 0 $EndComp Wire Wire Line - 7500 3850 7600 3850 + 7350 3850 7450 3850 $Comp L Device:R R? U 1 1 61FE9439 -P 7000 3950 +P 6850 3950 AR Path="/61D4151D/61FE9439" Ref="R?" Part="1" AR Path="/61FB9D3C/61FE9439" Ref="R92" Part="1" -F 0 "R92" V 6793 3950 50 0000 C CNN -F 1 "20R" V 6884 3950 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6930 3950 50 0001 C CNN -F 3 "~" H 7000 3950 50 0001 C CNN - 1 7000 3950 +F 0 "R92" V 6643 3950 50 0000 C CNN +F 1 "20R" V 6734 3950 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6780 3950 50 0001 C CNN +F 3 "~" H 6850 3950 50 0001 C CNN + 1 6850 3950 0 1 1 0 $EndComp Wire Wire Line - 6850 3950 6650 3950 + 6700 3950 6500 3950 $Comp L Device:C C? U 1 1 61FE9440 @@ -1117,724 +1117,724 @@ $EndComp $Comp L Device:R R? U 1 1 61FE953C -P 9500 2750 +P 9350 2750 AR Path="/61D4151D/61FE953C" Ref="R?" Part="1" AR Path="/61FB9D3C/61FE953C" Ref="R98" Part="1" -F 0 "R98" V 9293 2750 50 0000 C CNN -F 1 "1k" V 9384 2750 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 9430 2750 50 0001 C CNN -F 3 "~" H 9500 2750 50 0001 C CNN - 1 9500 2750 +F 0 "R98" V 9143 2750 50 0000 C CNN +F 1 "1k" V 9234 2750 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 9280 2750 50 0001 C CNN +F 3 "~" H 9350 2750 50 0001 C CNN + 1 9350 2750 0 1 1 0 $EndComp Wire Wire Line - 9350 2750 9300 2750 + 9200 2750 9150 2750 $Comp L Device:R R? U 1 1 61FE9543 -P 9500 2100 +P 9350 2100 AR Path="/61D4151D/61FE9543" Ref="R?" Part="1" AR Path="/61FB9D3C/61FE9543" Ref="R97" Part="1" -F 0 "R97" V 9293 2100 50 0000 C CNN -F 1 "1k" V 9384 2100 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 9430 2100 50 0001 C CNN -F 3 "~" H 9500 2100 50 0001 C CNN - 1 9500 2100 +F 0 "R97" V 9143 2100 50 0000 C CNN +F 1 "1k" V 9234 2100 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 9280 2100 50 0001 C CNN +F 3 "~" H 9350 2100 50 0001 C CNN + 1 9350 2100 0 1 1 0 $EndComp Wire Wire Line - 9350 2100 9200 2100 + 9200 2100 9050 2100 $Comp L Device:R R? U 1 1 61FE954A -P 9500 1450 +P 9350 1450 AR Path="/61D4151D/61FE954A" Ref="R?" Part="1" AR Path="/61FB9D3C/61FE954A" Ref="R96" Part="1" -F 0 "R96" V 9293 1450 50 0000 C CNN -F 1 "1k" V 9384 1450 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 9430 1450 50 0001 C CNN -F 3 "~" H 9500 1450 50 0001 C CNN - 1 9500 1450 +F 0 "R96" V 9143 1450 50 0000 C CNN +F 1 "1k" V 9234 1450 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 9280 1450 50 0001 C CNN +F 3 "~" H 9350 1450 50 0001 C CNN + 1 9350 1450 0 1 1 0 $EndComp Wire Wire Line - 9350 1450 9100 1450 + 9200 1450 8950 1450 $Comp L Device:R R? U 1 1 61FE9551 -P 9500 800 +P 9350 800 AR Path="/61D4151D/61FE9551" Ref="R?" Part="1" AR Path="/61FB9D3C/61FE9551" Ref="R95" Part="1" -F 0 "R95" V 9293 800 50 0000 C CNN -F 1 "1k" V 9384 800 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 9430 800 50 0001 C CNN -F 3 "~" H 9500 800 50 0001 C CNN - 1 9500 800 +F 0 "R95" V 9143 800 50 0000 C CNN +F 1 "1k" V 9234 800 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 9280 800 50 0001 C CNN +F 3 "~" H 9350 800 50 0001 C CNN + 1 9350 800 0 1 1 0 $EndComp Wire Wire Line - 9650 800 10000 800 + 9500 800 9850 800 $Comp L ell_digital_silicon:MAX11300_TQFP U? U 1 1 620BD366 -P 3400 3500 +P 3250 3500 AR Path="/61D4151D/620BD366" Ref="U?" Part="1" AR Path="/61FB9D3C/620BD366" Ref="U8" Part="1" -F 0 "U8" H 3400 5415 50 0000 C CNN -F 1 "MAX11300_TQFP" H 3400 5324 50 0000 C CNN -F 2 "Package_QFP:TQFP-48_7x7mm_P0.5mm" H 3400 3600 50 0001 C CNN -F 3 "" H 3400 3600 50 0001 C CNN - 1 3400 3500 +F 0 "U8" H 3250 5415 50 0000 C CNN +F 1 "MAX11300_TQFP" H 3250 5324 50 0000 C CNN +F 2 "Package_QFP:TQFP-48_7x7mm_P0.5mm" H 3250 3600 50 0001 C CNN +F 3 "" H 3250 3600 50 0001 C CNN + 1 3250 3500 1 0 0 -1 $EndComp $Comp L ell_audio_conn:JACK_TS_3PINS J? U 1 1 620BD36C -P 5550 850 +P 5400 850 AR Path="/61D4151D/620BD36C" Ref="J?" Part="1" AR Path="/61FB9D3C/620BD36C" Ref="J7" Part="1" -F 0 "J7" H 5072 884 50 0000 R CNN -F 1 "PITCH_A" H 5072 975 50 0000 R CNN -F 2 "ell_connectors:THONKICONN" H 5650 700 50 0001 C CNN -F 3 "" H 5650 700 50 0000 C CNN - 1 5550 850 +F 0 "J7" H 4922 884 50 0000 R CNN +F 1 "PJ398SM" H 4922 975 50 0000 R CNN +F 2 "ell_connectors:THONKICONN" H 5500 700 50 0001 C CNN +F 3 "" H 5500 700 50 0000 C CNN + 1 5400 850 -1 0 0 1 $EndComp $Comp L power:GNDA #PWR? U 1 1 620BD372 -P 5100 1100 +P 4950 1100 AR Path="/61D4151D/620BD372" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD372" Ref="#PWR0161" Part="1" -F 0 "#PWR0161" H 5100 850 50 0001 C CNN -F 1 "GNDA" H 5105 927 50 0000 C CNN -F 2 "" H 5100 1100 50 0001 C CNN -F 3 "" H 5100 1100 50 0001 C CNN - 1 5100 1100 +F 0 "#PWR0161" H 4950 850 50 0001 C CNN +F 1 "GNDA" H 4955 927 50 0000 C CNN +F 2 "" H 4950 1100 50 0001 C CNN +F 3 "" H 4950 1100 50 0001 C CNN + 1 4950 1100 1 0 0 -1 $EndComp Wire Wire Line - 5150 1050 5100 1050 + 5000 1050 4950 1050 Wire Wire Line - 5100 1050 5100 1100 + 4950 1050 4950 1100 Wire Wire Line - 5150 900 5100 900 + 5000 900 4950 900 Wire Wire Line - 5100 900 5100 1050 -Connection ~ 5100 1050 + 4950 900 4950 1050 +Connection ~ 4950 1050 $Comp L ell_audio_conn:JACK_TS_3PINS J? U 1 1 620BD37D -P 5550 1500 +P 5400 1500 AR Path="/61D4151D/620BD37D" Ref="J?" Part="1" AR Path="/61FB9D3C/620BD37D" Ref="J8" Part="1" -F 0 "J8" H 5072 1534 50 0000 R CNN -F 1 "PITCH_B" H 5072 1625 50 0000 R CNN -F 2 "ell_connectors:THONKICONN" H 5650 1350 50 0001 C CNN -F 3 "" H 5650 1350 50 0000 C CNN - 1 5550 1500 +F 0 "J8" H 4922 1534 50 0000 R CNN +F 1 "PJ398SM" H 4922 1625 50 0000 R CNN +F 2 "ell_connectors:THONKICONN" H 5500 1350 50 0001 C CNN +F 3 "" H 5500 1350 50 0000 C CNN + 1 5400 1500 -1 0 0 1 $EndComp $Comp L power:GNDA #PWR? U 1 1 620BD383 -P 5100 1750 +P 4950 1750 AR Path="/61D4151D/620BD383" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD383" Ref="#PWR0162" Part="1" -F 0 "#PWR0162" H 5100 1500 50 0001 C CNN -F 1 "GNDA" H 5105 1577 50 0000 C CNN -F 2 "" H 5100 1750 50 0001 C CNN -F 3 "" H 5100 1750 50 0001 C CNN - 1 5100 1750 +F 0 "#PWR0162" H 4950 1500 50 0001 C CNN +F 1 "GNDA" H 4955 1577 50 0000 C CNN +F 2 "" H 4950 1750 50 0001 C CNN +F 3 "" H 4950 1750 50 0001 C CNN + 1 4950 1750 1 0 0 -1 $EndComp Wire Wire Line - 5150 1700 5100 1700 + 5000 1700 4950 1700 Wire Wire Line - 5100 1700 5100 1750 + 4950 1700 4950 1750 Wire Wire Line - 5150 1550 5100 1550 + 5000 1550 4950 1550 Wire Wire Line - 5100 1550 5100 1700 -Connection ~ 5100 1700 + 4950 1550 4950 1700 +Connection ~ 4950 1700 Wire Wire Line - 4050 2550 4150 2550 + 3900 2550 4000 2550 Wire Wire Line - 4150 2550 4150 800 + 4000 2550 4000 800 Wire Wire Line - 4150 800 4500 800 + 4000 800 4350 800 Wire Wire Line - 5150 1450 4800 1450 + 5000 1450 4650 1450 Wire Wire Line - 4250 1450 4250 2650 + 4100 1450 4100 2650 Wire Wire Line - 4250 2650 4050 2650 + 4100 2650 3900 2650 $Comp L ell_audio_conn:JACK_TS_3PINS J? U 1 1 620BD394 -P 5550 2150 +P 5400 2150 AR Path="/61D4151D/620BD394" Ref="J?" Part="1" AR Path="/61FB9D3C/620BD394" Ref="J9" Part="1" -F 0 "J9" H 5072 2184 50 0000 R CNN -F 1 "VOL_A" H 5072 2275 50 0000 R CNN -F 2 "ell_connectors:THONKICONN" H 5650 2000 50 0001 C CNN -F 3 "" H 5650 2000 50 0000 C CNN - 1 5550 2150 +F 0 "J9" H 4922 2184 50 0000 R CNN +F 1 "PJ398SM" H 4922 2275 50 0000 R CNN +F 2 "ell_connectors:THONKICONN" H 5500 2000 50 0001 C CNN +F 3 "" H 5500 2000 50 0000 C CNN + 1 5400 2150 -1 0 0 1 $EndComp $Comp L power:GNDA #PWR? U 1 1 620BD39A -P 5100 2400 +P 4950 2400 AR Path="/61D4151D/620BD39A" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD39A" Ref="#PWR0163" Part="1" -F 0 "#PWR0163" H 5100 2150 50 0001 C CNN -F 1 "GNDA" H 5105 2227 50 0000 C CNN -F 2 "" H 5100 2400 50 0001 C CNN -F 3 "" H 5100 2400 50 0001 C CNN - 1 5100 2400 +F 0 "#PWR0163" H 4950 2150 50 0001 C CNN +F 1 "GNDA" H 4955 2227 50 0000 C CNN +F 2 "" H 4950 2400 50 0001 C CNN +F 3 "" H 4950 2400 50 0001 C CNN + 1 4950 2400 1 0 0 -1 $EndComp Wire Wire Line - 5150 2350 5100 2350 + 5000 2350 4950 2350 Wire Wire Line - 5100 2350 5100 2400 + 4950 2350 4950 2400 Wire Wire Line - 5150 2200 4900 2200 + 5000 2200 4750 2200 Wire Wire Line - 4900 2200 4900 2000 + 4750 2200 4750 2000 $Comp L power:+5VA #PWR? U 1 1 620BD3A4 -P 4900 2000 +P 4750 2000 AR Path="/61D4151D/620BD3A4" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD3A4" Ref="#PWR0159" Part="1" -F 0 "#PWR0159" H 4900 1850 50 0001 C CNN -F 1 "+5VA" H 4915 2173 50 0000 C CNN -F 2 "" H 4900 2000 50 0001 C CNN -F 3 "" H 4900 2000 50 0001 C CNN - 1 4900 2000 +F 0 "#PWR0159" H 4750 1850 50 0001 C CNN +F 1 "+5VA" H 4765 2173 50 0000 C CNN +F 2 "" H 4750 2000 50 0001 C CNN +F 3 "" H 4750 2000 50 0001 C CNN + 1 4750 2000 1 0 0 -1 $EndComp Wire Wire Line - 5150 2100 4800 2100 + 5000 2100 4650 2100 Wire Wire Line - 4350 2100 4350 2750 + 4200 2100 4200 2750 Wire Wire Line - 4350 2750 4050 2750 + 4200 2750 3900 2750 $Comp L ell_audio_conn:JACK_TS_3PINS J? U 1 1 620BD3AD -P 5550 2800 +P 5400 2800 AR Path="/61D4151D/620BD3AD" Ref="J?" Part="1" AR Path="/61FB9D3C/620BD3AD" Ref="J10" Part="1" -F 0 "J10" H 5072 2834 50 0000 R CNN -F 1 "VOL_B" H 5072 2925 50 0000 R CNN -F 2 "ell_connectors:THONKICONN" H 5650 2650 50 0001 C CNN -F 3 "" H 5650 2650 50 0000 C CNN - 1 5550 2800 +F 0 "J10" H 4922 2834 50 0000 R CNN +F 1 "PJ398SM" H 4922 2925 50 0000 R CNN +F 2 "ell_connectors:THONKICONN" H 5500 2650 50 0001 C CNN +F 3 "" H 5500 2650 50 0000 C CNN + 1 5400 2800 -1 0 0 1 $EndComp $Comp L power:GNDA #PWR? U 1 1 620BD3B3 -P 5100 3050 +P 4950 3050 AR Path="/61D4151D/620BD3B3" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD3B3" Ref="#PWR0164" Part="1" -F 0 "#PWR0164" H 5100 2800 50 0001 C CNN -F 1 "GNDA" H 5105 2877 50 0000 C CNN -F 2 "" H 5100 3050 50 0001 C CNN -F 3 "" H 5100 3050 50 0001 C CNN - 1 5100 3050 +F 0 "#PWR0164" H 4950 2800 50 0001 C CNN +F 1 "GNDA" H 4955 2877 50 0000 C CNN +F 2 "" H 4950 3050 50 0001 C CNN +F 3 "" H 4950 3050 50 0001 C CNN + 1 4950 3050 1 0 0 -1 $EndComp Wire Wire Line - 5150 3000 5100 3000 + 5000 3000 4950 3000 Wire Wire Line - 5100 3000 5100 3050 + 4950 3000 4950 3050 Wire Wire Line - 5150 2850 4900 2850 + 5000 2850 4750 2850 Wire Wire Line - 4900 2850 4900 2650 + 4750 2850 4750 2650 $Comp L power:+5VA #PWR? U 1 1 620BD3BD -P 4900 2650 +P 4750 2650 AR Path="/61D4151D/620BD3BD" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD3BD" Ref="#PWR0160" Part="1" -F 0 "#PWR0160" H 4900 2500 50 0001 C CNN -F 1 "+5VA" H 4915 2823 50 0000 C CNN -F 2 "" H 4900 2650 50 0001 C CNN -F 3 "" H 4900 2650 50 0001 C CNN - 1 4900 2650 +F 0 "#PWR0160" H 4750 2500 50 0001 C CNN +F 1 "+5VA" H 4765 2823 50 0000 C CNN +F 2 "" H 4750 2650 50 0001 C CNN +F 3 "" H 4750 2650 50 0001 C CNN + 1 4750 2650 1 0 0 -1 $EndComp Wire Wire Line - 5150 2750 4800 2750 + 5000 2750 4650 2750 Wire Wire Line - 4450 2750 4450 2850 + 4300 2750 4300 2850 Wire Wire Line - 4450 2850 4050 2850 + 4300 2850 3900 2850 Wire Wire Line - 4050 2950 4150 2950 -Text GLabel 4150 2950 2 50 Input ~ 0 + 3900 2950 4000 2950 +Text GLabel 4000 2950 2 50 Input ~ 0 POT_PITCH_A Wire Wire Line - 4050 3050 4150 3050 -Text GLabel 4150 3050 2 50 Input ~ 0 + 3900 3050 4000 3050 +Text GLabel 4000 3050 2 50 Input ~ 0 POT_PITCH_B Wire Wire Line - 4050 3350 4150 3350 -Text GLabel 4150 3350 2 50 Input ~ 0 + 3900 3350 4000 3350 +Text GLabel 4000 3350 2 50 Input ~ 0 POT_DRIVE_A Wire Wire Line - 4050 3450 4150 3450 -Text GLabel 4150 3450 2 50 Input ~ 0 + 3900 3450 4000 3450 +Text GLabel 4000 3450 2 50 Input ~ 0 POT_DRIVE_B Wire Wire Line - 4050 3550 4150 3550 -Text GLabel 4150 3550 2 50 Input ~ 0 + 3900 3550 4000 3550 +Text GLabel 4000 3550 2 50 Input ~ 0 POT_GRAIN_A Wire Wire Line - 4050 3650 4150 3650 -Text GLabel 4150 3650 2 50 Input ~ 0 + 3900 3650 4000 3650 +Text GLabel 4000 3650 2 50 Input ~ 0 POT_GRAIN_B Wire Wire Line - 4050 3150 4150 3150 -Text GLabel 4150 3150 2 50 Input ~ 0 + 3900 3150 4000 3150 +Text GLabel 4000 3150 2 50 Input ~ 0 POT_VOL_A Wire Wire Line - 4050 3250 4150 3250 -Text GLabel 4150 3250 2 50 Input ~ 0 + 3900 3250 4000 3250 +Text GLabel 4000 3250 2 50 Input ~ 0 POT_VOL_B Wire Wire Line - 4050 3750 4150 3750 -Text GLabel 4150 3750 2 50 Input ~ 0 + 3900 3750 4000 3750 +Text GLabel 4000 3750 2 50 Input ~ 0 POT_WARBLE_A Wire Wire Line - 4050 3950 4150 3950 -Text GLabel 4150 3950 2 50 Input ~ 0 + 3900 3950 4000 3950 +Text GLabel 4000 3950 2 50 Input ~ 0 POT_WARBLE_B Wire Wire Line - 4050 4050 4150 4050 -Text GLabel 4150 4050 2 50 Input ~ 0 + 3900 4050 4000 4050 +Text GLabel 4000 4050 2 50 Input ~ 0 BTTN_UP_B Wire Wire Line - 4050 4150 4150 4150 + 3900 4150 4000 4150 Wire Wire Line - 4050 4250 4150 4250 -Text GLabel 4150 4150 2 50 Input ~ 0 + 3900 4250 4000 4250 +Text GLabel 4000 4150 2 50 Input ~ 0 BTTN_DOWN_B -Text GLabel 4150 4250 2 50 Input ~ 0 +Text GLabel 4000 4250 2 50 Input ~ 0 BTTN_PLAY_B -NoConn ~ 2750 4250 -NoConn ~ 2750 4850 -NoConn ~ 2750 4950 -NoConn ~ 2750 5050 -NoConn ~ 2750 5150 +NoConn ~ 2600 4250 +NoConn ~ 2600 4850 +NoConn ~ 2600 4950 +NoConn ~ 2600 5050 +NoConn ~ 2600 5150 $Comp L Device:C C? U 1 1 620BD3EB -P 1900 4900 +P 1750 4900 AR Path="/61D4151D/620BD3EB" Ref="C?" Part="1" AR Path="/61FB9D3C/620BD3EB" Ref="C27" Part="1" -F 0 "C27" H 2015 4946 50 0000 L CNN -F 1 "100n" H 2015 4855 50 0000 L CNN -F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 1938 4750 50 0001 C CNN -F 3 "~" H 1900 4900 50 0001 C CNN - 1 1900 4900 +F 0 "C27" H 1865 4946 50 0000 L CNN +F 1 "100n" H 1865 4855 50 0000 L CNN +F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 1788 4750 50 0001 C CNN +F 3 "~" H 1750 4900 50 0001 C CNN + 1 1750 4900 1 0 0 -1 $EndComp $Comp L Device:C C? U 1 1 620BD3F1 -P 2350 4900 +P 2200 4900 AR Path="/61D4151D/620BD3F1" Ref="C?" Part="1" AR Path="/61FB9D3C/620BD3F1" Ref="C30" Part="1" -F 0 "C30" H 2465 4946 50 0000 L CNN -F 1 "4u7" H 2465 4855 50 0000 L CNN -F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 2388 4750 50 0001 C CNN -F 3 "~" H 2350 4900 50 0001 C CNN - 1 2350 4900 +F 0 "C30" H 2315 4946 50 0000 L CNN +F 1 "4u7" H 2315 4855 50 0000 L CNN +F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 2238 4750 50 0001 C CNN +F 3 "~" H 2200 4900 50 0001 C CNN + 1 2200 4900 1 0 0 -1 $EndComp Wire Wire Line - 1900 4650 2350 4650 + 1750 4650 2200 4650 Wire Wire Line - 1900 4650 1900 4750 + 1750 4650 1750 4750 Wire Wire Line - 2350 4750 2350 4650 -Connection ~ 2350 4650 + 2200 4750 2200 4650 +Connection ~ 2200 4650 Wire Wire Line - 2350 4650 2750 4650 + 2200 4650 2600 4650 $Comp L power:GNDA #PWR? U 1 1 620BD3FC -P 1900 5050 +P 1750 5050 AR Path="/61D4151D/620BD3FC" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD3FC" Ref="#PWR0123" Part="1" -F 0 "#PWR0123" H 1900 4800 50 0001 C CNN -F 1 "GNDA" H 1905 4877 50 0000 C CNN -F 2 "" H 1900 5050 50 0001 C CNN -F 3 "" H 1900 5050 50 0001 C CNN - 1 1900 5050 +F 0 "#PWR0123" H 1750 4800 50 0001 C CNN +F 1 "GNDA" H 1755 4877 50 0000 C CNN +F 2 "" H 1750 5050 50 0001 C CNN +F 3 "" H 1750 5050 50 0001 C CNN + 1 1750 5050 1 0 0 -1 $EndComp $Comp L power:GNDA #PWR? U 1 1 620BD402 -P 2350 5050 +P 2200 5050 AR Path="/61D4151D/620BD402" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD402" Ref="#PWR0128" Part="1" -F 0 "#PWR0128" H 2350 4800 50 0001 C CNN -F 1 "GNDA" H 2355 4877 50 0000 C CNN -F 2 "" H 2350 5050 50 0001 C CNN -F 3 "" H 2350 5050 50 0001 C CNN - 1 2350 5050 +F 0 "#PWR0128" H 2200 4800 50 0001 C CNN +F 1 "GNDA" H 2205 4877 50 0000 C CNN +F 2 "" H 2200 5050 50 0001 C CNN +F 3 "" H 2200 5050 50 0001 C CNN + 1 2200 5050 1 0 0 -1 $EndComp $Comp L Device:C C? U 1 1 620BD408 -P 950 4900 +P 800 4900 AR Path="/61D4151D/620BD408" Ref="C?" Part="1" AR Path="/61FB9D3C/620BD408" Ref="C21" Part="1" -F 0 "C21" H 1065 4946 50 0000 L CNN -F 1 "100n" H 1065 4855 50 0000 L CNN -F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 988 4750 50 0001 C CNN -F 3 "~" H 950 4900 50 0001 C CNN - 1 950 4900 +F 0 "C21" H 915 4946 50 0000 L CNN +F 1 "100n" H 915 4855 50 0000 L CNN +F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 838 4750 50 0001 C CNN +F 3 "~" H 800 4900 50 0001 C CNN + 1 800 4900 1 0 0 -1 $EndComp $Comp L Device:C C? U 1 1 620BD40E -P 1400 4900 +P 1250 4900 AR Path="/61D4151D/620BD40E" Ref="C?" Part="1" AR Path="/61FB9D3C/620BD40E" Ref="C24" Part="1" -F 0 "C24" H 1515 4946 50 0000 L CNN -F 1 "4u7" H 1515 4855 50 0000 L CNN -F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 1438 4750 50 0001 C CNN -F 3 "~" H 1400 4900 50 0001 C CNN - 1 1400 4900 +F 0 "C24" H 1365 4946 50 0000 L CNN +F 1 "4u7" H 1365 4855 50 0000 L CNN +F 2 "Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder" H 1288 4750 50 0001 C CNN +F 3 "~" H 1250 4900 50 0001 C CNN + 1 1250 4900 1 0 0 -1 $EndComp Wire Wire Line - 950 4450 1400 4450 + 800 4450 1250 4450 Wire Wire Line - 950 4450 950 4750 + 800 4450 800 4750 Wire Wire Line - 1400 4750 1400 4450 -Connection ~ 1400 4450 + 1250 4750 1250 4450 +Connection ~ 1250 4450 $Comp L power:GNDA #PWR? U 1 1 620BD418 -P 950 5050 +P 800 5050 AR Path="/61D4151D/620BD418" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD418" Ref="#PWR0113" Part="1" -F 0 "#PWR0113" H 950 4800 50 0001 C CNN -F 1 "GNDA" H 955 4877 50 0000 C CNN -F 2 "" H 950 5050 50 0001 C CNN -F 3 "" H 950 5050 50 0001 C CNN - 1 950 5050 +F 0 "#PWR0113" H 800 4800 50 0001 C CNN +F 1 "GNDA" H 805 4877 50 0000 C CNN +F 2 "" H 800 5050 50 0001 C CNN +F 3 "" H 800 5050 50 0001 C CNN + 1 800 5050 1 0 0 -1 $EndComp $Comp L power:GNDA #PWR? U 1 1 620BD41E -P 1400 5050 +P 1250 5050 AR Path="/61D4151D/620BD41E" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD41E" Ref="#PWR0118" Part="1" -F 0 "#PWR0118" H 1400 4800 50 0001 C CNN -F 1 "GNDA" H 1405 4877 50 0000 C CNN -F 2 "" H 1400 5050 50 0001 C CNN -F 3 "" H 1400 5050 50 0001 C CNN - 1 1400 5050 +F 0 "#PWR0118" H 1250 4800 50 0001 C CNN +F 1 "GNDA" H 1255 4877 50 0000 C CNN +F 2 "" H 1250 5050 50 0001 C CNN +F 3 "" H 1250 5050 50 0001 C CNN + 1 1250 5050 1 0 0 -1 $EndComp Wire Wire Line - 1400 4450 2750 4450 -NoConn ~ 2750 4550 + 1250 4450 2600 4450 +NoConn ~ 2600 4550 Wire Wire Line - 2750 1950 2550 1950 + 2600 1950 2400 1950 $Comp L power:GND #PWR? U 1 1 620BD427 -P 2550 1950 +P 2400 1950 AR Path="/61D4151D/620BD427" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD427" Ref="#PWR0132" Part="1" -F 0 "#PWR0132" H 2550 1700 50 0001 C CNN -F 1 "GND" V 2550 1800 50 0000 R CNN -F 2 "" H 2550 1950 50 0001 C CNN -F 3 "" H 2550 1950 50 0001 C CNN - 1 2550 1950 +F 0 "#PWR0132" H 2400 1700 50 0001 C CNN +F 1 "GND" V 2400 1800 50 0000 R CNN +F 2 "" H 2400 1950 50 0001 C CNN +F 3 "" H 2400 1950 50 0001 C CNN + 1 2400 1950 0 1 1 0 $EndComp $Comp L power:+3V3 #PWR? U 1 1 620BD42D -P 2550 1850 +P 2400 1850 AR Path="/61D4151D/620BD42D" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD42D" Ref="#PWR0131" Part="1" -F 0 "#PWR0131" H 2550 1700 50 0001 C CNN -F 1 "+3V3" V 2550 2000 50 0000 L CNN -F 2 "" H 2550 1850 50 0001 C CNN -F 3 "" H 2550 1850 50 0001 C CNN - 1 2550 1850 +F 0 "#PWR0131" H 2400 1700 50 0001 C CNN +F 1 "+3V3" V 2400 2000 50 0000 L CNN +F 2 "" H 2400 1850 50 0001 C CNN +F 3 "" H 2400 1850 50 0001 C CNN + 1 2400 1850 0 -1 -1 0 $EndComp $Comp L power:+5VA #PWR? U 1 1 620BD433 -P 2550 2100 +P 2400 2100 AR Path="/61D4151D/620BD433" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD433" Ref="#PWR0133" Part="1" -F 0 "#PWR0133" H 2550 1950 50 0001 C CNN -F 1 "+5VA" V 2550 2350 50 0000 C CNN -F 2 "" H 2550 2100 50 0001 C CNN -F 3 "" H 2550 2100 50 0001 C CNN - 1 2550 2100 +F 0 "#PWR0133" H 2400 1950 50 0001 C CNN +F 1 "+5VA" V 2400 2350 50 0000 C CNN +F 2 "" H 2400 2100 50 0001 C CNN +F 3 "" H 2400 2100 50 0001 C CNN + 1 2400 2100 0 -1 -1 0 $EndComp Wire Wire Line - 2550 2100 2650 2100 + 2400 2100 2500 2100 Wire Wire Line - 2550 1850 2750 1850 + 2400 1850 2600 1850 $Comp L power:GNDA #PWR? U 1 1 620BD43B -P 2550 2350 +P 2400 2350 AR Path="/61D4151D/620BD43B" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD43B" Ref="#PWR0134" Part="1" -F 0 "#PWR0134" H 2550 2100 50 0001 C CNN -F 1 "GNDA" V 2550 2200 50 0000 R CNN -F 2 "" H 2550 2350 50 0001 C CNN -F 3 "" H 2550 2350 50 0001 C CNN - 1 2550 2350 +F 0 "#PWR0134" H 2400 2100 50 0001 C CNN +F 1 "GNDA" V 2400 2200 50 0000 R CNN +F 2 "" H 2400 2350 50 0001 C CNN +F 3 "" H 2400 2350 50 0001 C CNN + 1 2400 2350 0 1 1 0 $EndComp Wire Wire Line - 2550 2350 2650 2350 + 2400 2350 2500 2350 Wire Wire Line - 2750 2550 2650 2550 + 2600 2550 2500 2550 Wire Wire Line - 2650 2550 2650 2450 -Connection ~ 2650 2350 + 2500 2550 2500 2450 +Connection ~ 2500 2350 Wire Wire Line - 2650 2350 2750 2350 + 2500 2350 2600 2350 Wire Wire Line - 2750 2450 2650 2450 -Connection ~ 2650 2450 + 2600 2450 2500 2450 +Connection ~ 2500 2450 Wire Wire Line - 2650 2450 2650 2350 + 2500 2450 2500 2350 Wire Wire Line - 2750 2200 2650 2200 + 2600 2200 2500 2200 Wire Wire Line - 2650 2200 2650 2100 -Connection ~ 2650 2100 + 2500 2200 2500 2100 +Connection ~ 2500 2100 Wire Wire Line - 2650 2100 2750 2100 + 2500 2100 2600 2100 Wire Wire Line - 2750 2700 2650 2700 + 2600 2700 2500 2700 $Comp L power:+12VA #PWR? U 1 1 620BD44E -P 2550 2700 +P 2400 2700 AR Path="/61D4151D/620BD44E" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD44E" Ref="#PWR0135" Part="1" -F 0 "#PWR0135" H 2550 2550 50 0001 C CNN -F 1 "+12VA" V 2550 2850 50 0000 L CNN -F 2 "" H 2550 2700 50 0001 C CNN -F 3 "" H 2550 2700 50 0001 C CNN - 1 2550 2700 +F 0 "#PWR0135" H 2400 2550 50 0001 C CNN +F 1 "+12VA" V 2400 2850 50 0000 L CNN +F 2 "" H 2400 2700 50 0001 C CNN +F 3 "" H 2400 2700 50 0001 C CNN + 1 2400 2700 0 -1 -1 0 $EndComp Wire Wire Line - 2750 2800 2650 2800 + 2600 2800 2500 2800 Wire Wire Line - 2650 2800 2650 2700 -Connection ~ 2650 2700 + 2500 2800 2500 2700 +Connection ~ 2500 2700 Wire Wire Line - 2650 2700 2550 2700 + 2500 2700 2400 2700 Wire Wire Line - 2750 2950 2650 2950 + 2600 2950 2500 2950 $Comp L power:-12VA #PWR? U 1 1 620BD459 -P 2550 2950 +P 2400 2950 AR Path="/61D4151D/620BD459" Ref="#PWR?" Part="1" AR Path="/61FB9D3C/620BD459" Ref="#PWR0136" Part="1" -F 0 "#PWR0136" H 2550 2800 50 0001 C CNN -F 1 "-12VA" V 2565 3077 50 0000 L CNN -F 2 "" H 2550 2950 50 0001 C CNN -F 3 "" H 2550 2950 50 0001 C CNN - 1 2550 2950 +F 0 "#PWR0136" H 2400 2800 50 0001 C CNN +F 1 "-12VA" V 2415 3077 50 0000 L CNN +F 2 "" H 2400 2950 50 0001 C CNN +F 3 "" H 2400 2950 50 0001 C CNN + 1 2400 2950 0 -1 -1 0 $EndComp Wire Wire Line - 2750 3450 2650 3450 + 2600 3450 2500 3450 Wire Wire Line - 2650 3450 2650 3350 -Connection ~ 2650 2950 + 2500 3450 2500 3350 +Connection ~ 2500 2950 Wire Wire Line - 2650 2950 2550 2950 + 2500 2950 2400 2950 Wire Wire Line - 2750 3050 2650 3050 -Connection ~ 2650 3050 + 2600 3050 2500 3050 +Connection ~ 2500 3050 Wire Wire Line - 2650 3050 2650 2950 + 2500 3050 2500 2950 Wire Wire Line - 2750 3150 2650 3150 -Connection ~ 2650 3150 + 2600 3150 2500 3150 +Connection ~ 2500 3150 Wire Wire Line - 2650 3150 2650 3050 + 2500 3150 2500 3050 Wire Wire Line - 2750 3250 2650 3250 -Connection ~ 2650 3250 + 2600 3250 2500 3250 +Connection ~ 2500 3250 Wire Wire Line - 2650 3250 2650 3150 + 2500 3250 2500 3150 Wire Wire Line - 2750 3350 2650 3350 -Connection ~ 2650 3350 + 2600 3350 2500 3350 +Connection ~ 2500 3350 Wire Wire Line - 2650 3350 2650 3250 -Text GLabel 1800 3650 0 50 Input ~ 0 + 2500 3350 2500 3250 +Text GLabel 1650 3650 0 50 Input ~ 0 SPI_MOSI -Text GLabel 1800 3750 0 50 Input ~ 0 +Text GLabel 1650 3750 0 50 Input ~ 0 SPI_SCLK -Text GLabel 1800 3850 0 50 Input ~ 0 +Text GLabel 1650 3850 0 50 Input ~ 0 SPI_CS_AB -Text GLabel 1800 3950 0 50 Output ~ 0 +Text GLabel 1650 3950 0 50 Output ~ 0 SPI_MISO -NoConn ~ 2750 4050 +NoConn ~ 2600 4050 Wire Wire Line - 2750 3950 2300 3950 + 2600 3950 2150 3950 Wire Wire Line - 1800 3850 2350 3850 + 1650 3850 2200 3850 Wire Wire Line - 2750 3750 2300 3750 + 2600 3750 2150 3750 Wire Wire Line - 1800 3650 2350 3650 + 1650 3650 2200 3650 $Comp L Device:R R? U 1 1 620BD478 -P 2500 3650 +P 2350 3650 AR Path="/61D4151D/620BD478" Ref="R?" Part="1" AR Path="/61FB9D3C/620BD478" Ref="R85" Part="1" -F 0 "R85" V 2293 3650 50 0000 C CNN -F 1 "20R" V 2384 3650 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 2430 3650 50 0001 C CNN -F 3 "~" H 2500 3650 50 0001 C CNN - 1 2500 3650 +F 0 "R85" V 2143 3650 50 0000 C CNN +F 1 "20R" V 2234 3650 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 2280 3650 50 0001 C CNN +F 3 "~" H 2350 3650 50 0001 C CNN + 1 2350 3650 0 1 1 0 $EndComp Wire Wire Line - 2650 3650 2750 3650 + 2500 3650 2600 3650 $Comp L Device:R R? U 1 1 620BD47F -P 2150 3750 +P 2000 3750 AR Path="/61D4151D/620BD47F" Ref="R?" Part="1" AR Path="/61FB9D3C/620BD47F" Ref="R83" Part="1" -F 0 "R83" V 1943 3750 50 0000 C CNN -F 1 "20R" V 2034 3750 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 2080 3750 50 0001 C CNN -F 3 "~" H 2150 3750 50 0001 C CNN - 1 2150 3750 +F 0 "R83" V 1793 3750 50 0000 C CNN +F 1 "20R" V 1884 3750 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 1930 3750 50 0001 C CNN +F 3 "~" H 2000 3750 50 0001 C CNN + 1 2000 3750 0 1 1 0 $EndComp Wire Wire Line - 2000 3750 1800 3750 + 1850 3750 1650 3750 $Comp L Device:R R? U 1 1 620BD486 -P 2500 3850 +P 2350 3850 AR Path="/61D4151D/620BD486" Ref="R?" Part="1" AR Path="/61FB9D3C/620BD486" Ref="R86" Part="1" -F 0 "R86" V 2293 3850 50 0000 C CNN -F 1 "20R" V 2384 3850 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 2430 3850 50 0001 C CNN -F 3 "~" H 2500 3850 50 0001 C CNN - 1 2500 3850 +F 0 "R86" V 2143 3850 50 0000 C CNN +F 1 "20R" V 2234 3850 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 2280 3850 50 0001 C CNN +F 3 "~" H 2350 3850 50 0001 C CNN + 1 2350 3850 0 1 1 0 $EndComp Wire Wire Line - 2650 3850 2750 3850 + 2500 3850 2600 3850 $Comp L Device:R R? U 1 1 620BD48D -P 2150 3950 +P 2000 3950 AR Path="/61D4151D/620BD48D" Ref="R?" Part="1" AR Path="/61FB9D3C/620BD48D" Ref="R84" Part="1" -F 0 "R84" V 1943 3950 50 0000 C CNN -F 1 "20R" V 2034 3950 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 2080 3950 50 0001 C CNN -F 3 "~" H 2150 3950 50 0001 C CNN - 1 2150 3950 +F 0 "R84" V 1793 3950 50 0000 C CNN +F 1 "20R" V 1884 3950 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 1930 3950 50 0001 C CNN +F 3 "~" H 2000 3950 50 0001 C CNN + 1 2000 3950 0 1 1 0 $EndComp Wire Wire Line - 2000 3950 1800 3950 + 1850 3950 1650 3950 $Comp L Device:R R? U 1 1 620BD494 -P 4650 2750 +P 4500 2750 AR Path="/61D4151D/620BD494" Ref="R?" Part="1" AR Path="/61FB9D3C/620BD494" Ref="R90" Part="1" -F 0 "R90" V 4443 2750 50 0000 C CNN -F 1 "1k" V 4534 2750 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4580 2750 50 0001 C CNN -F 3 "~" H 4650 2750 50 0001 C CNN - 1 4650 2750 +F 0 "R90" V 4293 2750 50 0000 C CNN +F 1 "1k" V 4384 2750 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4430 2750 50 0001 C CNN +F 3 "~" H 4500 2750 50 0001 C CNN + 1 4500 2750 0 1 1 0 $EndComp Wire Wire Line - 4500 2750 4450 2750 + 4350 2750 4300 2750 $Comp L Device:R R? U 1 1 620BD49B -P 4650 2100 +P 4500 2100 AR Path="/61D4151D/620BD49B" Ref="R?" Part="1" AR Path="/61FB9D3C/620BD49B" Ref="R89" Part="1" -F 0 "R89" V 4443 2100 50 0000 C CNN -F 1 "1k" V 4534 2100 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4580 2100 50 0001 C CNN -F 3 "~" H 4650 2100 50 0001 C CNN - 1 4650 2100 +F 0 "R89" V 4293 2100 50 0000 C CNN +F 1 "1k" V 4384 2100 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4430 2100 50 0001 C CNN +F 3 "~" H 4500 2100 50 0001 C CNN + 1 4500 2100 0 1 1 0 $EndComp Wire Wire Line - 4500 2100 4350 2100 + 4350 2100 4200 2100 $Comp L Device:R R? U 1 1 620BD4A2 -P 4650 1450 +P 4500 1450 AR Path="/61D4151D/620BD4A2" Ref="R?" Part="1" AR Path="/61FB9D3C/620BD4A2" Ref="R88" Part="1" -F 0 "R88" V 4443 1450 50 0000 C CNN -F 1 "1k" V 4534 1450 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4580 1450 50 0001 C CNN -F 3 "~" H 4650 1450 50 0001 C CNN - 1 4650 1450 +F 0 "R88" V 4293 1450 50 0000 C CNN +F 1 "1k" V 4384 1450 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4430 1450 50 0001 C CNN +F 3 "~" H 4500 1450 50 0001 C CNN + 1 4500 1450 0 1 1 0 $EndComp Wire Wire Line - 4500 1450 4250 1450 + 4350 1450 4100 1450 $Comp L Device:R R? U 1 1 620BD4A9 -P 4650 800 +P 4500 800 AR Path="/61D4151D/620BD4A9" Ref="R?" Part="1" AR Path="/61FB9D3C/620BD4A9" Ref="R87" Part="1" -F 0 "R87" V 4443 800 50 0000 C CNN -F 1 "1k" V 4534 800 50 0000 C CNN -F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4580 800 50 0001 C CNN -F 3 "~" H 4650 800 50 0001 C CNN - 1 4650 800 +F 0 "R87" V 4293 800 50 0000 C CNN +F 1 "1k" V 4384 800 50 0000 C CNN +F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4430 800 50 0001 C CNN +F 3 "~" H 4500 800 50 0001 C CNN + 1 4500 800 0 1 1 0 $EndComp Wire Wire Line - 4800 800 5150 800 + 4650 800 5000 800 $Comp L Device:C C? U 1 1 6212B546 @@ -2323,7 +2323,23 @@ F 3 "" H 6550 5950 50 0001 C CNN 1 6550 5950 1 0 0 -1 $EndComp -NoConn ~ 4050 3850 -NoConn ~ 4050 4350 -NoConn ~ 4050 4450 +NoConn ~ 3900 3850 +NoConn ~ 3900 4350 +NoConn ~ 3900 4450 +Text Notes 5900 800 0 50 ~ 0 +Pitch A +Text Notes 5900 1450 0 50 ~ 0 +Pitch B +Text Notes 5900 2100 0 50 ~ 0 +Volume A +Text Notes 5900 2700 0 50 ~ 0 +Volume B +Text Notes 10750 800 0 50 ~ 0 +Pitch C +Text Notes 10750 1450 0 50 ~ 0 +Pitch D +Text Notes 10750 2100 0 50 ~ 0 +Volume C +Text Notes 10750 2750 0 50 ~ 0 +Volume D $EndSCHEMATC diff --git a/hardware/mainboard/Channel_Buttons_And_Switches.sch b/hardware/mainboard/Channel_Buttons_And_Switches.sch index cef3686..d7dbc97 100644 --- a/hardware/mainboard/Channel_Buttons_And_Switches.sch +++ b/hardware/mainboard/Channel_Buttons_And_Switches.sch @@ -26,7 +26,7 @@ AR Path="/61D4151D/61F27F8E" Ref="SW?" Part="1" AR Path="/61D60973/61F27F8E" Ref="SW?" Part="1" AR Path="/61F0493E/61F27F8E" Ref="SW9" Part="1" F 0 "SW9" H 10300 1885 50 0000 C CNN -F 1 "BTTN_PLAY_A" H 10300 1794 50 0000 C CNN +F 1 "D6R90F1LFS " H 10300 1794 50 0000 C CNN F 2 "ell_special:CK-D6R_Pushbutton" H 10300 1650 50 0001 C CNN F 3 "~" H 10300 1650 50 0001 C CNN 1 10300 1650 @@ -206,7 +206,7 @@ AR Path="/61D4151D/61F27FCD" Ref="SW?" Part="1" AR Path="/61D60973/61F27FCD" Ref="SW?" Part="1" AR Path="/61F0493E/61F27FCD" Ref="SW10" Part="1" F 0 "SW10" H 10300 3135 50 0000 C CNN -F 1 "BTTN_PLAY_B" H 10300 3044 50 0000 C CNN +F 1 "D6R90F1LFS " H 10300 3044 50 0000 C CNN F 2 "ell_special:CK-D6R_Pushbutton" H 10300 2900 50 0001 C CNN F 3 "~" H 10300 2900 50 0001 C CNN 1 10300 2900 @@ -292,7 +292,7 @@ AR Path="/61D4151D/61F27FED" Ref="SW?" Part="1" AR Path="/61D60973/61F27FED" Ref="SW?" Part="1" AR Path="/61F0493E/61F27FED" Ref="SW6" Part="1" F 0 "SW6" H 8650 3250 50 0000 C CNN -F 1 "BTTN_SPEED_B" H 8800 3150 50 0000 C CNN +F 1 "C&K 7105SYCQE" H 8800 3150 50 0000 C CNN F 2 "ell_special:7105SYCQE-1P3T-SP3T-Switch" H 8650 2900 50 0001 C CNN F 3 "~" H 8650 2900 50 0001 C CNN 1 8650 2900 @@ -424,7 +424,7 @@ L Switch:SW_SPDT_MSM SW5 U 1 1 61F2801F P 8650 1650 F 0 "SW5" H 8650 2000 50 0000 C CNN -F 1 "BTTN_SPEED_A" H 8800 1900 50 0000 C CNN +F 1 "C&K 7105SYCQE" H 8800 1900 50 0000 C CNN F 2 "ell_special:7105SYCQE-1P3T-SP3T-Switch" H 8650 1650 50 0001 C CNN F 3 "~" H 8650 1650 50 0001 C CNN 1 8650 1650 @@ -475,7 +475,7 @@ AR Path="/61D4151D/61F28032" Ref="SW?" Part="1" AR Path="/61D60973/61F28032" Ref="SW?" Part="1" AR Path="/61F0493E/61F28032" Ref="SW11" Part="1" F 0 "SW11" H 10300 4385 50 0000 C CNN -F 1 "BTTN_PLAY_C" H 10300 4294 50 0000 C CNN +F 1 "D6R90F1LFS " H 10300 4294 50 0000 C CNN F 2 "ell_special:CK-D6R_Pushbutton" H 10300 4150 50 0001 C CNN F 3 "~" H 10300 4150 50 0001 C CNN 1 10300 4150 @@ -655,7 +655,7 @@ AR Path="/61D4151D/61F28071" Ref="SW?" Part="1" AR Path="/61D60973/61F28071" Ref="SW?" Part="1" AR Path="/61F0493E/61F28071" Ref="SW12" Part="1" F 0 "SW12" H 10300 5635 50 0000 C CNN -F 1 "BTTN_PLAY_D" H 10300 5544 50 0000 C CNN +F 1 "D6R90F1LFS " H 10300 5544 50 0000 C CNN F 2 "ell_special:CK-D6R_Pushbutton" H 10300 5400 50 0001 C CNN F 3 "~" H 10300 5400 50 0001 C CNN 1 10300 5400 @@ -741,7 +741,7 @@ AR Path="/61D4151D/61F28091" Ref="SW?" Part="1" AR Path="/61D60973/61F28091" Ref="SW?" Part="1" AR Path="/61F0493E/61F28091" Ref="SW8" Part="1" F 0 "SW8" H 8650 5750 50 0000 C CNN -F 1 "BTTN_SPEED_D" H 8800 5650 50 0000 C CNN +F 1 "C&K 7105SYCQE" H 8800 5650 50 0000 C CNN F 2 "ell_special:7105SYCQE-1P3T-SP3T-Switch" H 8650 5400 50 0001 C CNN F 3 "~" H 8650 5400 50 0001 C CNN 1 8650 5400 @@ -876,7 +876,7 @@ AR Path="/61D4151D/61F280C3" Ref="SW?" Part="1" AR Path="/61D60973/61F280C3" Ref="SW?" Part="1" AR Path="/61F0493E/61F280C3" Ref="SW7" Part="1" F 0 "SW7" H 8650 4500 50 0000 C CNN -F 1 "BTTN_SPEED_C" H 8800 4400 50 0000 C CNN +F 1 "C&K 7105SYCQE" H 8800 4400 50 0000 C CNN F 2 "ell_special:7105SYCQE-1P3T-SP3T-Switch" H 8650 4150 50 0001 C CNN F 3 "~" H 8650 4150 50 0001 C CNN 1 8650 4150 diff --git a/hardware/mainboard/Channel_LEDs.sch b/hardware/mainboard/Channel_LEDs.sch index da97193..cc245bb 100644 --- a/hardware/mainboard/Channel_LEDs.sch +++ b/hardware/mainboard/Channel_LEDs.sch @@ -126,7 +126,7 @@ AR Path="/61C541EA/61D9F741" Ref="D?" Part="1" AR Path="/61D4151D/61D9F741" Ref="D?" Part="1" AR Path="/61D60973/61D9F741" Ref="D12" Part="1" F 0 "D12" V 6050 1350 50 0000 L CNN -F 1 "LED_SPEED_+2_A" H 6850 1200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 6850 1200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 6300 1200 50 0001 C CNN F 3 "~" H 6300 1200 50 0001 C CNN 1 6250 1200 @@ -144,7 +144,7 @@ AR Path="/61C541EA/61D9F747" Ref="R?" Part="1" AR Path="/61D4151D/61D9F747" Ref="R?" Part="1" AR Path="/61D60973/61D9F747" Ref="R39" Part="1" F 0 "R39" H 4320 1696 50 0000 L CNN -F 1 "Rled" H 4320 1605 50 0000 L CNN +F 1 "330" H 4320 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4180 1650 50 0001 C CNN F 3 "~" H 4250 1650 50 0001 C CNN 1 4250 1650 @@ -162,7 +162,7 @@ AR Path="/61C541EA/61D9F74D" Ref="R?" Part="1" AR Path="/61D4151D/61D9F74D" Ref="R?" Part="1" AR Path="/61D60973/61D9F74D" Ref="R41" Part="1" F 0 "R41" H 4520 1696 50 0000 L CNN -F 1 "Rled" H 4520 1605 50 0000 L CNN +F 1 "330" H 4520 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4380 1650 50 0001 C CNN F 3 "~" H 4450 1650 50 0001 C CNN 1 4450 1650 @@ -200,7 +200,7 @@ AR Path="/61C541EA/61D9F75A" Ref="D?" Part="1" AR Path="/61D4151D/61D9F75A" Ref="D?" Part="1" AR Path="/61D60973/61D9F75A" Ref="D14" Part="1" F 0 "D14" V 5500 1350 50 0000 L CNN -F 1 "LED_SPEED_+1_A" H 6300 1200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 6300 1200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 5750 1200 50 0001 C CNN F 3 "~" H 5750 1200 50 0001 C CNN 1 5700 1200 @@ -218,7 +218,7 @@ AR Path="/61C541EA/61D9F760" Ref="R?" Part="1" AR Path="/61D4151D/61D9F760" Ref="R?" Part="1" AR Path="/61D60973/61D9F760" Ref="R43" Part="1" F 0 "R43" H 4870 1696 50 0000 L CNN -F 1 "Rled" H 4870 1605 50 0000 L CNN +F 1 "330" H 4870 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4730 1650 50 0001 C CNN F 3 "~" H 4800 1650 50 0001 C CNN 1 4800 1650 @@ -236,7 +236,7 @@ AR Path="/61C541EA/61D9F766" Ref="R?" Part="1" AR Path="/61D4151D/61D9F766" Ref="R?" Part="1" AR Path="/61D60973/61D9F766" Ref="R45" Part="1" F 0 "R45" H 5070 1696 50 0000 L CNN -F 1 "Rled" H 5070 1605 50 0000 L CNN +F 1 "330" H 5070 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4930 1650 50 0001 C CNN F 3 "~" H 5000 1650 50 0001 C CNN 1 5000 1650 @@ -274,7 +274,7 @@ AR Path="/61C541EA/61D9F773" Ref="D?" Part="1" AR Path="/61D4151D/61D9F773" Ref="D?" Part="1" AR Path="/61D60973/61D9F773" Ref="D16" Part="1" F 0 "D16" V 4700 1350 50 0000 L CNN -F 1 "LED_SPEED_-1_A" H 5500 1200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 5500 1200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 4950 1200 50 0001 C CNN F 3 "~" H 4950 1200 50 0001 C CNN 1 4900 1200 @@ -292,7 +292,7 @@ AR Path="/61C541EA/61D9F779" Ref="R?" Part="1" AR Path="/61D4151D/61D9F779" Ref="R?" Part="1" AR Path="/61D60973/61D9F779" Ref="R47" Part="1" F 0 "R47" H 5670 1696 50 0000 L CNN -F 1 "Rled" H 5670 1605 50 0000 L CNN +F 1 "330" H 5670 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 5530 1650 50 0001 C CNN F 3 "~" H 5600 1650 50 0001 C CNN 1 5600 1650 @@ -310,7 +310,7 @@ AR Path="/61C541EA/61D9F77F" Ref="R?" Part="1" AR Path="/61D4151D/61D9F77F" Ref="R?" Part="1" AR Path="/61D60973/61D9F77F" Ref="R49" Part="1" F 0 "R49" H 5870 1696 50 0000 L CNN -F 1 "Rled" H 5870 1605 50 0000 L CNN +F 1 "330" H 5870 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 5730 1650 50 0001 C CNN F 3 "~" H 5800 1650 50 0001 C CNN 1 5800 1650 @@ -348,7 +348,7 @@ AR Path="/61C541EA/61D9F78C" Ref="D?" Part="1" AR Path="/61D4151D/61D9F78C" Ref="D?" Part="1" AR Path="/61D60973/61D9F78C" Ref="D18" Part="1" F 0 "D18" V 4150 1350 50 0000 L CNN -F 1 "LED_SPEED_-2_A" H 4950 1200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 4950 1200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 4400 1200 50 0001 C CNN F 3 "~" H 4400 1200 50 0001 C CNN 1 4350 1200 @@ -366,7 +366,7 @@ AR Path="/61C541EA/61D9F792" Ref="R?" Part="1" AR Path="/61D4151D/61D9F792" Ref="R?" Part="1" AR Path="/61D60973/61D9F792" Ref="R51" Part="1" F 0 "R51" H 6220 1696 50 0000 L CNN -F 1 "Rled" H 6220 1605 50 0000 L CNN +F 1 "330" H 6220 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6080 1650 50 0001 C CNN F 3 "~" H 6150 1650 50 0001 C CNN 1 6150 1650 @@ -384,7 +384,7 @@ AR Path="/61C541EA/61D9F798" Ref="R?" Part="1" AR Path="/61D4151D/61D9F798" Ref="R?" Part="1" AR Path="/61D60973/61D9F798" Ref="R53" Part="1" F 0 "R53" H 6420 1696 50 0000 L CNN -F 1 "Rled" H 6420 1605 50 0000 L CNN +F 1 "330" H 6420 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6280 1650 50 0001 C CNN F 3 "~" H 6350 1650 50 0001 C CNN 1 6350 1650 @@ -438,7 +438,7 @@ AR Path="/61C541EA/61D9F7AD" Ref="D?" Part="1" AR Path="/61D4151D/61D9F7AD" Ref="D?" Part="1" AR Path="/61D60973/61D9F7AD" Ref="D20" Part="1" F 0 "D20" V 6800 1350 50 0000 L CNN -F 1 "LED_SPEED_+2_B" H 7600 1200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 7600 1200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 7050 1200 50 0001 C CNN F 3 "~" H 7050 1200 50 0001 C CNN 1 7000 1200 @@ -456,7 +456,7 @@ AR Path="/61C541EA/61D9F7B3" Ref="R?" Part="1" AR Path="/61D4151D/61D9F7B3" Ref="R?" Part="1" AR Path="/61D60973/61D9F7B3" Ref="R55" Part="1" F 0 "R55" H 6970 1696 50 0000 L CNN -F 1 "Rled" H 6970 1605 50 0000 L CNN +F 1 "330" H 6970 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6830 1650 50 0001 C CNN F 3 "~" H 6900 1650 50 0001 C CNN 1 6900 1650 @@ -474,7 +474,7 @@ AR Path="/61C541EA/61D9F7B9" Ref="R?" Part="1" AR Path="/61D4151D/61D9F7B9" Ref="R?" Part="1" AR Path="/61D60973/61D9F7B9" Ref="R57" Part="1" F 0 "R57" H 7170 1696 50 0000 L CNN -F 1 "Rled" H 7170 1605 50 0000 L CNN +F 1 "330" H 7170 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7030 1650 50 0001 C CNN F 3 "~" H 7100 1650 50 0001 C CNN 1 7100 1650 @@ -652,7 +652,7 @@ AR Path="/61C541EA/61D9F7F8" Ref="D?" Part="1" AR Path="/61D4151D/61D9F7F8" Ref="D?" Part="1" AR Path="/61D60973/61D9F7F8" Ref="D22" Part="1" F 0 "D22" V 7350 1350 50 0000 L CNN -F 1 "LED_SPEED_+1_B" H 8150 1200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 8150 1200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 7600 1200 50 0001 C CNN F 3 "~" H 7600 1200 50 0001 C CNN 1 7550 1200 @@ -670,7 +670,7 @@ AR Path="/61C541EA/61D9F7FE" Ref="R?" Part="1" AR Path="/61D4151D/61D9F7FE" Ref="R?" Part="1" AR Path="/61D60973/61D9F7FE" Ref="R59" Part="1" F 0 "R59" H 7520 1696 50 0000 L CNN -F 1 "Rled" H 7520 1605 50 0000 L CNN +F 1 "330" H 7520 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7380 1650 50 0001 C CNN F 3 "~" H 7450 1650 50 0001 C CNN 1 7450 1650 @@ -688,7 +688,7 @@ AR Path="/61C541EA/61D9F804" Ref="R?" Part="1" AR Path="/61D4151D/61D9F804" Ref="R?" Part="1" AR Path="/61D60973/61D9F804" Ref="R61" Part="1" F 0 "R61" H 7720 1696 50 0000 L CNN -F 1 "Rled" H 7720 1605 50 0000 L CNN +F 1 "330" H 7720 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7580 1650 50 0001 C CNN F 3 "~" H 7650 1650 50 0001 C CNN 1 7650 1650 @@ -734,7 +734,7 @@ AR Path="/61C541EA/61D9F815" Ref="D?" Part="1" AR Path="/61D4151D/61D9F815" Ref="D?" Part="1" AR Path="/61D60973/61D9F815" Ref="D24" Part="1" F 0 "D24" V 7900 1350 50 0000 L CNN -F 1 "LED_SPEED_-1_B" H 8700 1200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 8700 1200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 8150 1200 50 0001 C CNN F 3 "~" H 8150 1200 50 0001 C CNN 1 8100 1200 @@ -752,7 +752,7 @@ AR Path="/61C541EA/61D9F81B" Ref="R?" Part="1" AR Path="/61D4151D/61D9F81B" Ref="R?" Part="1" AR Path="/61D60973/61D9F81B" Ref="R63" Part="1" F 0 "R63" H 8070 1696 50 0000 L CNN -F 1 "Rled" H 8070 1605 50 0000 L CNN +F 1 "330" H 8070 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7930 1650 50 0001 C CNN F 3 "~" H 8000 1650 50 0001 C CNN 1 8000 1650 @@ -770,7 +770,7 @@ AR Path="/61C541EA/61D9F821" Ref="R?" Part="1" AR Path="/61D4151D/61D9F821" Ref="R?" Part="1" AR Path="/61D60973/61D9F821" Ref="R65" Part="1" F 0 "R65" H 8270 1696 50 0000 L CNN -F 1 "Rled" H 8270 1605 50 0000 L CNN +F 1 "330" H 8270 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 8130 1650 50 0001 C CNN F 3 "~" H 8200 1650 50 0001 C CNN 1 8200 1650 @@ -816,7 +816,7 @@ AR Path="/61C541EA/61D9F832" Ref="D?" Part="1" AR Path="/61D4151D/61D9F832" Ref="D?" Part="1" AR Path="/61D60973/61D9F832" Ref="D26" Part="1" F 0 "D26" V 8450 1350 50 0000 L CNN -F 1 "LED_SPEED_-2_B" H 9250 1200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 9250 1200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 8700 1200 50 0001 C CNN F 3 "~" H 8700 1200 50 0001 C CNN 1 8650 1200 @@ -834,7 +834,7 @@ AR Path="/61C541EA/61D9F838" Ref="R?" Part="1" AR Path="/61D4151D/61D9F838" Ref="R?" Part="1" AR Path="/61D60973/61D9F838" Ref="R67" Part="1" F 0 "R67" H 8620 1696 50 0000 L CNN -F 1 "Rled" H 8620 1605 50 0000 L CNN +F 1 "330" H 8620 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 8480 1650 50 0001 C CNN F 3 "~" H 8550 1650 50 0001 C CNN 1 8550 1650 @@ -852,7 +852,7 @@ AR Path="/61C541EA/61D9F83E" Ref="R?" Part="1" AR Path="/61D4151D/61D9F83E" Ref="R?" Part="1" AR Path="/61D60973/61D9F83E" Ref="R69" Part="1" F 0 "R69" H 8820 1696 50 0000 L CNN -F 1 "Rled" H 8820 1605 50 0000 L CNN +F 1 "330" H 8820 1605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 8680 1650 50 0001 C CNN F 3 "~" H 8750 1650 50 0001 C CNN 1 8750 1650 @@ -1005,7 +1005,7 @@ AR Path="/61C541EA/61E60BA4" Ref="D?" Part="1" AR Path="/61D4151D/61E60BA4" Ref="D?" Part="1" AR Path="/61D60973/61E60BA4" Ref="D13" Part="1" F 0 "D13" V 6050 4300 50 0000 L CNN -F 1 "LED_SPEED_+2_C" H 6850 4150 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 6850 4150 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 6300 4150 50 0001 C CNN F 3 "~" H 6300 4150 50 0001 C CNN 1 6250 4150 @@ -1023,7 +1023,7 @@ AR Path="/61C541EA/61E60BAA" Ref="R?" Part="1" AR Path="/61D4151D/61E60BAA" Ref="R?" Part="1" AR Path="/61D60973/61E60BAA" Ref="R40" Part="1" F 0 "R40" H 4320 4646 50 0000 L CNN -F 1 "Rled" H 4320 4555 50 0000 L CNN +F 1 "330" H 4320 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4180 4600 50 0001 C CNN F 3 "~" H 4250 4600 50 0001 C CNN 1 4250 4600 @@ -1041,32 +1041,12 @@ AR Path="/61C541EA/61E60BB0" Ref="R?" Part="1" AR Path="/61D4151D/61E60BB0" Ref="R?" Part="1" AR Path="/61D60973/61E60BB0" Ref="R42" Part="1" F 0 "R42" H 4520 4646 50 0000 L CNN -F 1 "Rled" H 4520 4555 50 0000 L CNN +F 1 "330" H 4520 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4380 4600 50 0001 C CNN F 3 "~" H 4450 4600 50 0001 C CNN 1 4450 4600 1 0 0 -1 $EndComp -Wire Wire Line - 4350 3850 4350 3750 -$Comp -L power:+3.3V #PWR? -U 1 1 61E60BB7 -P 4350 3750 -AR Path="/61A6EF5C/61E60BB7" Ref="#PWR?" Part="1" -AR Path="/61E60BB7" Ref="#PWR?" Part="1" -AR Path="/619A998C/61E60BB7" Ref="#PWR?" Part="1" -AR Path="/619A998C/61A0FB81/61E60BB7" Ref="#PWR?" Part="1" -AR Path="/61C541EA/61E60BB7" Ref="#PWR?" Part="1" -AR Path="/61D4151D/61E60BB7" Ref="#PWR?" Part="1" -AR Path="/61D60973/61E60BB7" Ref="#PWR074" Part="1" -F 0 "#PWR074" H 4350 3600 50 0001 C CNN -F 1 "+3.3V" H 4365 3923 50 0000 C CNN -F 2 "" H 4350 3750 50 0001 C CNN -F 3 "" H 4350 3750 50 0001 C CNN - 1 4350 3750 - 1 0 0 -1 -$EndComp $Comp L Device:LED_Dual_CAC D? U 1 1 61E60BBD @@ -1079,7 +1059,7 @@ AR Path="/61C541EA/61E60BBD" Ref="D?" Part="1" AR Path="/61D4151D/61E60BBD" Ref="D?" Part="1" AR Path="/61D60973/61E60BBD" Ref="D15" Part="1" F 0 "D15" V 5500 4300 50 0000 L CNN -F 1 "LED_SPEED_+1_C" H 6300 4150 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 6300 4150 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 5750 4150 50 0001 C CNN F 3 "~" H 5750 4150 50 0001 C CNN 1 5700 4150 @@ -1097,7 +1077,7 @@ AR Path="/61C541EA/61E60BC3" Ref="R?" Part="1" AR Path="/61D4151D/61E60BC3" Ref="R?" Part="1" AR Path="/61D60973/61E60BC3" Ref="R44" Part="1" F 0 "R44" H 4870 4646 50 0000 L CNN -F 1 "Rled" H 4870 4555 50 0000 L CNN +F 1 "330" H 4870 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4730 4600 50 0001 C CNN F 3 "~" H 4800 4600 50 0001 C CNN 1 4800 4600 @@ -1115,32 +1095,12 @@ AR Path="/61C541EA/61E60BC9" Ref="R?" Part="1" AR Path="/61D4151D/61E60BC9" Ref="R?" Part="1" AR Path="/61D60973/61E60BC9" Ref="R46" Part="1" F 0 "R46" H 5070 4646 50 0000 L CNN -F 1 "Rled" H 5070 4555 50 0000 L CNN +F 1 "330" H 5070 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4930 4600 50 0001 C CNN F 3 "~" H 5000 4600 50 0001 C CNN 1 5000 4600 1 0 0 -1 $EndComp -Wire Wire Line - 4900 3850 4900 3750 -$Comp -L power:+3.3V #PWR? -U 1 1 61E60BD0 -P 4900 3750 -AR Path="/61A6EF5C/61E60BD0" Ref="#PWR?" Part="1" -AR Path="/61E60BD0" Ref="#PWR?" Part="1" -AR Path="/619A998C/61E60BD0" Ref="#PWR?" Part="1" -AR Path="/619A998C/61A0FB81/61E60BD0" Ref="#PWR?" Part="1" -AR Path="/61C541EA/61E60BD0" Ref="#PWR?" Part="1" -AR Path="/61D4151D/61E60BD0" Ref="#PWR?" Part="1" -AR Path="/61D60973/61E60BD0" Ref="#PWR076" Part="1" -F 0 "#PWR076" H 4900 3600 50 0001 C CNN -F 1 "+3.3V" H 4915 3923 50 0000 C CNN -F 2 "" H 4900 3750 50 0001 C CNN -F 3 "" H 4900 3750 50 0001 C CNN - 1 4900 3750 - 1 0 0 -1 -$EndComp $Comp L Device:LED_Dual_CAC D? U 1 1 61E60BD6 @@ -1153,7 +1113,7 @@ AR Path="/61C541EA/61E60BD6" Ref="D?" Part="1" AR Path="/61D4151D/61E60BD6" Ref="D?" Part="1" AR Path="/61D60973/61E60BD6" Ref="D17" Part="1" F 0 "D17" V 4700 4300 50 0000 L CNN -F 1 "LED_SPEED_-1_C" H 5500 4150 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 5500 4150 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 4950 4150 50 0001 C CNN F 3 "~" H 4950 4150 50 0001 C CNN 1 4900 4150 @@ -1171,7 +1131,7 @@ AR Path="/61C541EA/61E60BDC" Ref="R?" Part="1" AR Path="/61D4151D/61E60BDC" Ref="R?" Part="1" AR Path="/61D60973/61E60BDC" Ref="R48" Part="1" F 0 "R48" H 5670 4646 50 0000 L CNN -F 1 "Rled" H 5670 4555 50 0000 L CNN +F 1 "330" H 5670 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 5530 4600 50 0001 C CNN F 3 "~" H 5600 4600 50 0001 C CNN 1 5600 4600 @@ -1189,32 +1149,12 @@ AR Path="/61C541EA/61E60BE2" Ref="R?" Part="1" AR Path="/61D4151D/61E60BE2" Ref="R?" Part="1" AR Path="/61D60973/61E60BE2" Ref="R50" Part="1" F 0 "R50" H 5870 4646 50 0000 L CNN -F 1 "Rled" H 5870 4555 50 0000 L CNN +F 1 "330" H 5870 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 5730 4600 50 0001 C CNN F 3 "~" H 5800 4600 50 0001 C CNN 1 5800 4600 1 0 0 -1 $EndComp -Wire Wire Line - 5700 3850 5700 3750 -$Comp -L power:+3.3V #PWR? -U 1 1 61E60BE9 -P 5700 3750 -AR Path="/61A6EF5C/61E60BE9" Ref="#PWR?" Part="1" -AR Path="/61E60BE9" Ref="#PWR?" Part="1" -AR Path="/619A998C/61E60BE9" Ref="#PWR?" Part="1" -AR Path="/619A998C/61A0FB81/61E60BE9" Ref="#PWR?" Part="1" -AR Path="/61C541EA/61E60BE9" Ref="#PWR?" Part="1" -AR Path="/61D4151D/61E60BE9" Ref="#PWR?" Part="1" -AR Path="/61D60973/61E60BE9" Ref="#PWR078" Part="1" -F 0 "#PWR078" H 5700 3600 50 0001 C CNN -F 1 "+3.3V" H 5715 3923 50 0000 C CNN -F 2 "" H 5700 3750 50 0001 C CNN -F 3 "" H 5700 3750 50 0001 C CNN - 1 5700 3750 - 1 0 0 -1 -$EndComp $Comp L Device:LED_Dual_CAC D? U 1 1 61E60BEF @@ -1227,7 +1167,7 @@ AR Path="/61C541EA/61E60BEF" Ref="D?" Part="1" AR Path="/61D4151D/61E60BEF" Ref="D?" Part="1" AR Path="/61D60973/61E60BEF" Ref="D19" Part="1" F 0 "D19" V 4150 4300 50 0000 L CNN -F 1 "LED_SPEED_-2_C" H 4950 4150 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 4950 4150 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 4400 4150 50 0001 C CNN F 3 "~" H 4400 4150 50 0001 C CNN 1 4350 4150 @@ -1245,7 +1185,7 @@ AR Path="/61C541EA/61E60BF5" Ref="R?" Part="1" AR Path="/61D4151D/61E60BF5" Ref="R?" Part="1" AR Path="/61D60973/61E60BF5" Ref="R52" Part="1" F 0 "R52" H 6220 4646 50 0000 L CNN -F 1 "Rled" H 6220 4555 50 0000 L CNN +F 1 "330" H 6220 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6080 4600 50 0001 C CNN F 3 "~" H 6150 4600 50 0001 C CNN 1 6150 4600 @@ -1263,32 +1203,12 @@ AR Path="/61C541EA/61E60BFB" Ref="R?" Part="1" AR Path="/61D4151D/61E60BFB" Ref="R?" Part="1" AR Path="/61D60973/61E60BFB" Ref="R54" Part="1" F 0 "R54" H 6420 4646 50 0000 L CNN -F 1 "Rled" H 6420 4555 50 0000 L CNN +F 1 "330" H 6420 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6280 4600 50 0001 C CNN F 3 "~" H 6350 4600 50 0001 C CNN 1 6350 4600 1 0 0 -1 $EndComp -Wire Wire Line - 6250 3850 6250 3750 -$Comp -L power:+3.3V #PWR? -U 1 1 61E60C02 -P 6250 3750 -AR Path="/61A6EF5C/61E60C02" Ref="#PWR?" Part="1" -AR Path="/61E60C02" Ref="#PWR?" Part="1" -AR Path="/619A998C/61E60C02" Ref="#PWR?" Part="1" -AR Path="/619A998C/61A0FB81/61E60C02" Ref="#PWR?" Part="1" -AR Path="/61C541EA/61E60C02" Ref="#PWR?" Part="1" -AR Path="/61D4151D/61E60C02" Ref="#PWR?" Part="1" -AR Path="/61D60973/61E60C02" Ref="#PWR080" Part="1" -F 0 "#PWR080" H 6250 3600 50 0001 C CNN -F 1 "+3.3V" H 6265 3923 50 0000 C CNN -F 2 "" H 6250 3750 50 0001 C CNN -F 3 "" H 6250 3750 50 0001 C CNN - 1 6250 3750 - 1 0 0 -1 -$EndComp Wire Wire Line 4250 4750 4250 4800 Wire Wire Line @@ -1317,7 +1237,7 @@ AR Path="/61C541EA/61E60C10" Ref="D?" Part="1" AR Path="/61D4151D/61E60C10" Ref="D?" Part="1" AR Path="/61D60973/61E60C10" Ref="D21" Part="1" F 0 "D21" V 6800 4300 50 0000 L CNN -F 1 "LED_SPEED_+2_D" H 7600 4150 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 7600 4150 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 7050 4150 50 0001 C CNN F 3 "~" H 7050 4150 50 0001 C CNN 1 7000 4150 @@ -1335,7 +1255,7 @@ AR Path="/61C541EA/61E60C16" Ref="R?" Part="1" AR Path="/61D4151D/61E60C16" Ref="R?" Part="1" AR Path="/61D60973/61E60C16" Ref="R56" Part="1" F 0 "R56" H 6970 4646 50 0000 L CNN -F 1 "Rled" H 6970 4555 50 0000 L CNN +F 1 "330" H 6970 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6830 4600 50 0001 C CNN F 3 "~" H 6900 4600 50 0001 C CNN 1 6900 4600 @@ -1353,32 +1273,12 @@ AR Path="/61C541EA/61E60C1C" Ref="R?" Part="1" AR Path="/61D4151D/61E60C1C" Ref="R?" Part="1" AR Path="/61D60973/61E60C1C" Ref="R58" Part="1" F 0 "R58" H 7170 4646 50 0000 L CNN -F 1 "Rled" H 7170 4555 50 0000 L CNN +F 1 "330" H 7170 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7030 4600 50 0001 C CNN F 3 "~" H 7100 4600 50 0001 C CNN 1 7100 4600 1 0 0 -1 $EndComp -Wire Wire Line - 7000 3850 7000 3750 -$Comp -L power:+3.3V #PWR? -U 1 1 61E60C23 -P 7000 3750 -AR Path="/61A6EF5C/61E60C23" Ref="#PWR?" Part="1" -AR Path="/61E60C23" Ref="#PWR?" Part="1" -AR Path="/619A998C/61E60C23" Ref="#PWR?" Part="1" -AR Path="/619A998C/61A0FB81/61E60C23" Ref="#PWR?" Part="1" -AR Path="/61C541EA/61E60C23" Ref="#PWR?" Part="1" -AR Path="/61D4151D/61E60C23" Ref="#PWR?" Part="1" -AR Path="/61D60973/61E60C23" Ref="#PWR082" Part="1" -F 0 "#PWR082" H 7000 3600 50 0001 C CNN -F 1 "+3.3V" H 7015 3923 50 0000 C CNN -F 2 "" H 7000 3750 50 0001 C CNN -F 3 "" H 7000 3750 50 0001 C CNN - 1 7000 3750 - 1 0 0 -1 -$EndComp Wire Wire Line 6900 4750 6900 5600 Wire Wire Line @@ -1531,7 +1431,7 @@ AR Path="/61C541EA/61E60C5B" Ref="D?" Part="1" AR Path="/61D4151D/61E60C5B" Ref="D?" Part="1" AR Path="/61D60973/61E60C5B" Ref="D23" Part="1" F 0 "D23" V 7350 4300 50 0000 L CNN -F 1 "LED_SPEED_+1_D" H 8150 4150 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 8150 4150 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 7600 4150 50 0001 C CNN F 3 "~" H 7600 4150 50 0001 C CNN 1 7550 4150 @@ -1549,7 +1449,7 @@ AR Path="/61C541EA/61E60C61" Ref="R?" Part="1" AR Path="/61D4151D/61E60C61" Ref="R?" Part="1" AR Path="/61D60973/61E60C61" Ref="R60" Part="1" F 0 "R60" H 7520 4646 50 0000 L CNN -F 1 "Rled" H 7520 4555 50 0000 L CNN +F 1 "330" H 7520 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7380 4600 50 0001 C CNN F 3 "~" H 7450 4600 50 0001 C CNN 1 7450 4600 @@ -1567,32 +1467,12 @@ AR Path="/61C541EA/61E60C67" Ref="R?" Part="1" AR Path="/61D4151D/61E60C67" Ref="R?" Part="1" AR Path="/61D60973/61E60C67" Ref="R62" Part="1" F 0 "R62" H 7720 4646 50 0000 L CNN -F 1 "Rled" H 7720 4555 50 0000 L CNN +F 1 "330" H 7720 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7580 4600 50 0001 C CNN F 3 "~" H 7650 4600 50 0001 C CNN 1 7650 4600 1 0 0 -1 $EndComp -Wire Wire Line - 7550 3850 7550 3750 -$Comp -L power:+3.3V #PWR? -U 1 1 61E60C6E -P 7550 3750 -AR Path="/61A6EF5C/61E60C6E" Ref="#PWR?" Part="1" -AR Path="/61E60C6E" Ref="#PWR?" Part="1" -AR Path="/619A998C/61E60C6E" Ref="#PWR?" Part="1" -AR Path="/619A998C/61A0FB81/61E60C6E" Ref="#PWR?" Part="1" -AR Path="/61C541EA/61E60C6E" Ref="#PWR?" Part="1" -AR Path="/61D4151D/61E60C6E" Ref="#PWR?" Part="1" -AR Path="/61D60973/61E60C6E" Ref="#PWR084" Part="1" -F 0 "#PWR084" H 7550 3600 50 0001 C CNN -F 1 "+3.3V" H 7565 3923 50 0000 C CNN -F 2 "" H 7550 3750 50 0001 C CNN -F 3 "" H 7550 3750 50 0001 C CNN - 1 7550 3750 - 1 0 0 -1 -$EndComp Wire Wire Line 7450 4750 7450 5800 Wire Wire Line @@ -1613,7 +1493,7 @@ AR Path="/61C541EA/61E60C78" Ref="D?" Part="1" AR Path="/61D4151D/61E60C78" Ref="D?" Part="1" AR Path="/61D60973/61E60C78" Ref="D25" Part="1" F 0 "D25" V 7900 4300 50 0000 L CNN -F 1 "LED_SPEED_-1_D" H 8700 4150 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 8700 4150 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 8150 4150 50 0001 C CNN F 3 "~" H 8150 4150 50 0001 C CNN 1 8100 4150 @@ -1631,7 +1511,7 @@ AR Path="/61C541EA/61E60C7E" Ref="R?" Part="1" AR Path="/61D4151D/61E60C7E" Ref="R?" Part="1" AR Path="/61D60973/61E60C7E" Ref="R64" Part="1" F 0 "R64" H 8070 4646 50 0000 L CNN -F 1 "Rled" H 8070 4555 50 0000 L CNN +F 1 "330" H 8070 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7930 4600 50 0001 C CNN F 3 "~" H 8000 4600 50 0001 C CNN 1 8000 4600 @@ -1649,32 +1529,12 @@ AR Path="/61C541EA/61E60C84" Ref="R?" Part="1" AR Path="/61D4151D/61E60C84" Ref="R?" Part="1" AR Path="/61D60973/61E60C84" Ref="R66" Part="1" F 0 "R66" H 8270 4646 50 0000 L CNN -F 1 "Rled" H 8270 4555 50 0000 L CNN +F 1 "330" H 8270 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 8130 4600 50 0001 C CNN F 3 "~" H 8200 4600 50 0001 C CNN 1 8200 4600 1 0 0 -1 $EndComp -Wire Wire Line - 8100 3850 8100 3750 -$Comp -L power:+3.3V #PWR? -U 1 1 61E60C8B -P 8100 3750 -AR Path="/61A6EF5C/61E60C8B" Ref="#PWR?" Part="1" -AR Path="/61E60C8B" Ref="#PWR?" Part="1" -AR Path="/619A998C/61E60C8B" Ref="#PWR?" Part="1" -AR Path="/619A998C/61A0FB81/61E60C8B" Ref="#PWR?" Part="1" -AR Path="/61C541EA/61E60C8B" Ref="#PWR?" Part="1" -AR Path="/61D4151D/61E60C8B" Ref="#PWR?" Part="1" -AR Path="/61D60973/61E60C8B" Ref="#PWR086" Part="1" -F 0 "#PWR086" H 8100 3600 50 0001 C CNN -F 1 "+3.3V" H 8115 3923 50 0000 C CNN -F 2 "" H 8100 3750 50 0001 C CNN -F 3 "" H 8100 3750 50 0001 C CNN - 1 8100 3750 - 1 0 0 -1 -$EndComp Wire Wire Line 8000 4750 8000 6000 Wire Wire Line @@ -1695,7 +1555,7 @@ AR Path="/61C541EA/61E60C95" Ref="D?" Part="1" AR Path="/61D4151D/61E60C95" Ref="D?" Part="1" AR Path="/61D60973/61E60C95" Ref="D27" Part="1" F 0 "D27" V 8450 4300 50 0000 L CNN -F 1 "LED_SPEED_-2_D" H 9250 4150 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 9250 4150 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 8700 4150 50 0001 C CNN F 3 "~" H 8700 4150 50 0001 C CNN 1 8650 4150 @@ -1713,7 +1573,7 @@ AR Path="/61C541EA/61E60C9B" Ref="R?" Part="1" AR Path="/61D4151D/61E60C9B" Ref="R?" Part="1" AR Path="/61D60973/61E60C9B" Ref="R68" Part="1" F 0 "R68" H 8620 4646 50 0000 L CNN -F 1 "Rled" H 8620 4555 50 0000 L CNN +F 1 "330" H 8620 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 8480 4600 50 0001 C CNN F 3 "~" H 8550 4600 50 0001 C CNN 1 8550 4600 @@ -1731,32 +1591,12 @@ AR Path="/61C541EA/61E60CA1" Ref="R?" Part="1" AR Path="/61D4151D/61E60CA1" Ref="R?" Part="1" AR Path="/61D60973/61E60CA1" Ref="R70" Part="1" F 0 "R70" H 8820 4646 50 0000 L CNN -F 1 "Rled" H 8820 4555 50 0000 L CNN +F 1 "330" H 8820 4555 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 8680 4600 50 0001 C CNN F 3 "~" H 8750 4600 50 0001 C CNN 1 8750 4600 1 0 0 -1 $EndComp -Wire Wire Line - 8650 3850 8650 3750 -$Comp -L power:+3.3V #PWR? -U 1 1 61E60CA8 -P 8650 3750 -AR Path="/61A6EF5C/61E60CA8" Ref="#PWR?" Part="1" -AR Path="/61E60CA8" Ref="#PWR?" Part="1" -AR Path="/619A998C/61E60CA8" Ref="#PWR?" Part="1" -AR Path="/619A998C/61A0FB81/61E60CA8" Ref="#PWR?" Part="1" -AR Path="/61C541EA/61E60CA8" Ref="#PWR?" Part="1" -AR Path="/61D4151D/61E60CA8" Ref="#PWR?" Part="1" -AR Path="/61D60973/61E60CA8" Ref="#PWR088" Part="1" -F 0 "#PWR088" H 8650 3600 50 0001 C CNN -F 1 "+3.3V" H 8665 3923 50 0000 C CNN -F 2 "" H 8650 3750 50 0001 C CNN -F 3 "" H 8650 3750 50 0001 C CNN - 1 8650 3750 - 1 0 0 -1 -$EndComp Wire Wire Line 8550 4750 8550 6200 Wire Wire Line @@ -1802,4 +1642,196 @@ Wire Wire Line 2600 2750 2600 2850 Wire Wire Line 4100 3350 8750 3350 +Text Notes 6300 850 0 50 ~ 0 ++2 A +Text Notes 5750 850 0 50 ~ 0 ++1 A +Text Notes 4950 850 0 50 ~ 0 +-1 A\n +Text Notes 4400 850 0 50 ~ 0 +-2 A +Text Notes 7050 850 0 50 ~ 0 ++2 B +Text Notes 7600 850 0 50 ~ 0 ++1 B +Text Notes 8150 850 0 50 ~ 0 +-1 B +Text Notes 8700 850 0 50 ~ 0 +-2 B +Wire Wire Line + 4350 3850 4350 3750 +$Comp +L power:+3.3V #PWR? +U 1 1 61AF3B86 +P 4350 3750 +AR Path="/61A6EF5C/61AF3B86" Ref="#PWR?" Part="1" +AR Path="/61AF3B86" Ref="#PWR?" Part="1" +AR Path="/619A998C/61AF3B86" Ref="#PWR?" Part="1" +AR Path="/619A998C/61A0FB81/61AF3B86" Ref="#PWR?" Part="1" +AR Path="/61C541EA/61AF3B86" Ref="#PWR?" Part="1" +AR Path="/61D4151D/61AF3B86" Ref="#PWR?" Part="1" +AR Path="/61D60973/61AF3B86" Ref="#PWR0124" Part="1" +F 0 "#PWR0124" H 4350 3600 50 0001 C CNN +F 1 "+3.3V" H 4365 3923 50 0000 C CNN +F 2 "" H 4350 3750 50 0001 C CNN +F 3 "" H 4350 3750 50 0001 C CNN + 1 4350 3750 + 1 0 0 -1 +$EndComp +Wire Wire Line + 4900 3850 4900 3750 +$Comp +L power:+3.3V #PWR? +U 1 1 61AF3B8D +P 4900 3750 +AR Path="/61A6EF5C/61AF3B8D" Ref="#PWR?" Part="1" +AR Path="/61AF3B8D" Ref="#PWR?" Part="1" +AR Path="/619A998C/61AF3B8D" Ref="#PWR?" Part="1" +AR Path="/619A998C/61A0FB81/61AF3B8D" Ref="#PWR?" Part="1" +AR Path="/61C541EA/61AF3B8D" Ref="#PWR?" Part="1" +AR Path="/61D4151D/61AF3B8D" Ref="#PWR?" Part="1" +AR Path="/61D60973/61AF3B8D" Ref="#PWR0125" Part="1" +F 0 "#PWR0125" H 4900 3600 50 0001 C CNN +F 1 "+3.3V" H 4915 3923 50 0000 C CNN +F 2 "" H 4900 3750 50 0001 C CNN +F 3 "" H 4900 3750 50 0001 C CNN + 1 4900 3750 + 1 0 0 -1 +$EndComp +Wire Wire Line + 5700 3850 5700 3750 +$Comp +L power:+3.3V #PWR? +U 1 1 61AF3B94 +P 5700 3750 +AR Path="/61A6EF5C/61AF3B94" Ref="#PWR?" Part="1" +AR Path="/61AF3B94" Ref="#PWR?" Part="1" +AR Path="/619A998C/61AF3B94" Ref="#PWR?" Part="1" +AR Path="/619A998C/61A0FB81/61AF3B94" Ref="#PWR?" Part="1" +AR Path="/61C541EA/61AF3B94" Ref="#PWR?" Part="1" +AR Path="/61D4151D/61AF3B94" Ref="#PWR?" Part="1" +AR Path="/61D60973/61AF3B94" Ref="#PWR0126" Part="1" +F 0 "#PWR0126" H 5700 3600 50 0001 C CNN +F 1 "+3.3V" H 5715 3923 50 0000 C CNN +F 2 "" H 5700 3750 50 0001 C CNN +F 3 "" H 5700 3750 50 0001 C CNN + 1 5700 3750 + 1 0 0 -1 +$EndComp +Wire Wire Line + 6250 3850 6250 3750 +$Comp +L power:+3.3V #PWR? +U 1 1 61AF3B9B +P 6250 3750 +AR Path="/61A6EF5C/61AF3B9B" Ref="#PWR?" Part="1" +AR Path="/61AF3B9B" Ref="#PWR?" Part="1" +AR Path="/619A998C/61AF3B9B" Ref="#PWR?" Part="1" +AR Path="/619A998C/61A0FB81/61AF3B9B" Ref="#PWR?" Part="1" +AR Path="/61C541EA/61AF3B9B" Ref="#PWR?" Part="1" +AR Path="/61D4151D/61AF3B9B" Ref="#PWR?" Part="1" +AR Path="/61D60973/61AF3B9B" Ref="#PWR0127" Part="1" +F 0 "#PWR0127" H 6250 3600 50 0001 C CNN +F 1 "+3.3V" H 6265 3923 50 0000 C CNN +F 2 "" H 6250 3750 50 0001 C CNN +F 3 "" H 6250 3750 50 0001 C CNN + 1 6250 3750 + 1 0 0 -1 +$EndComp +Wire Wire Line + 7000 3850 7000 3750 +$Comp +L power:+3.3V #PWR? +U 1 1 61AF3BA2 +P 7000 3750 +AR Path="/61A6EF5C/61AF3BA2" Ref="#PWR?" Part="1" +AR Path="/61AF3BA2" Ref="#PWR?" Part="1" +AR Path="/619A998C/61AF3BA2" Ref="#PWR?" Part="1" +AR Path="/619A998C/61A0FB81/61AF3BA2" Ref="#PWR?" Part="1" +AR Path="/61C541EA/61AF3BA2" Ref="#PWR?" Part="1" +AR Path="/61D4151D/61AF3BA2" Ref="#PWR?" Part="1" +AR Path="/61D60973/61AF3BA2" Ref="#PWR0165" Part="1" +F 0 "#PWR0165" H 7000 3600 50 0001 C CNN +F 1 "+3.3V" H 7015 3923 50 0000 C CNN +F 2 "" H 7000 3750 50 0001 C CNN +F 3 "" H 7000 3750 50 0001 C CNN + 1 7000 3750 + 1 0 0 -1 +$EndComp +Wire Wire Line + 7550 3850 7550 3750 +$Comp +L power:+3.3V #PWR? +U 1 1 61AF3BA9 +P 7550 3750 +AR Path="/61A6EF5C/61AF3BA9" Ref="#PWR?" Part="1" +AR Path="/61AF3BA9" Ref="#PWR?" Part="1" +AR Path="/619A998C/61AF3BA9" Ref="#PWR?" Part="1" +AR Path="/619A998C/61A0FB81/61AF3BA9" Ref="#PWR?" Part="1" +AR Path="/61C541EA/61AF3BA9" Ref="#PWR?" Part="1" +AR Path="/61D4151D/61AF3BA9" Ref="#PWR?" Part="1" +AR Path="/61D60973/61AF3BA9" Ref="#PWR0166" Part="1" +F 0 "#PWR0166" H 7550 3600 50 0001 C CNN +F 1 "+3.3V" H 7565 3923 50 0000 C CNN +F 2 "" H 7550 3750 50 0001 C CNN +F 3 "" H 7550 3750 50 0001 C CNN + 1 7550 3750 + 1 0 0 -1 +$EndComp +Wire Wire Line + 8100 3850 8100 3750 +$Comp +L power:+3.3V #PWR? +U 1 1 61AF3BB0 +P 8100 3750 +AR Path="/61A6EF5C/61AF3BB0" Ref="#PWR?" Part="1" +AR Path="/61AF3BB0" Ref="#PWR?" Part="1" +AR Path="/619A998C/61AF3BB0" Ref="#PWR?" Part="1" +AR Path="/619A998C/61A0FB81/61AF3BB0" Ref="#PWR?" Part="1" +AR Path="/61C541EA/61AF3BB0" Ref="#PWR?" Part="1" +AR Path="/61D4151D/61AF3BB0" Ref="#PWR?" Part="1" +AR Path="/61D60973/61AF3BB0" Ref="#PWR0167" Part="1" +F 0 "#PWR0167" H 8100 3600 50 0001 C CNN +F 1 "+3.3V" H 8115 3923 50 0000 C CNN +F 2 "" H 8100 3750 50 0001 C CNN +F 3 "" H 8100 3750 50 0001 C CNN + 1 8100 3750 + 1 0 0 -1 +$EndComp +Wire Wire Line + 8650 3850 8650 3750 +$Comp +L power:+3.3V #PWR? +U 1 1 61AF3BB7 +P 8650 3750 +AR Path="/61A6EF5C/61AF3BB7" Ref="#PWR?" Part="1" +AR Path="/61AF3BB7" Ref="#PWR?" Part="1" +AR Path="/619A998C/61AF3BB7" Ref="#PWR?" Part="1" +AR Path="/619A998C/61A0FB81/61AF3BB7" Ref="#PWR?" Part="1" +AR Path="/61C541EA/61AF3BB7" Ref="#PWR?" Part="1" +AR Path="/61D4151D/61AF3BB7" Ref="#PWR?" Part="1" +AR Path="/61D60973/61AF3BB7" Ref="#PWR0168" Part="1" +F 0 "#PWR0168" H 8650 3600 50 0001 C CNN +F 1 "+3.3V" H 8665 3923 50 0000 C CNN +F 2 "" H 8650 3750 50 0001 C CNN +F 3 "" H 8650 3750 50 0001 C CNN + 1 8650 3750 + 1 0 0 -1 +$EndComp +Text Notes 6300 3800 0 50 ~ 0 ++2 C +Text Notes 5750 3800 0 50 ~ 0 ++1 C +Text Notes 4950 3800 0 50 ~ 0 +-1 C +Text Notes 4400 3800 0 50 ~ 0 +-2 C\n +Text Notes 7050 3800 0 50 ~ 0 ++2 D +Text Notes 7600 3800 0 50 ~ 0 ++1 D +Text Notes 8150 3800 0 50 ~ 0 +-1 D +Text Notes 8700 3800 0 50 ~ 0 +-2 D $EndSCHEMATC diff --git a/hardware/mainboard/Common_LEDs_And_Buttons.sch b/hardware/mainboard/Common_LEDs_And_Buttons.sch index 2821243..6b7d312 100644 --- a/hardware/mainboard/Common_LEDs_And_Buttons.sch +++ b/hardware/mainboard/Common_LEDs_And_Buttons.sch @@ -20,7 +20,7 @@ P 5050 5800 AR Path="/61A6EF5C/61C6F729" Ref="SW3" Part="1" AR Path="/61C6F729" Ref="SW?" Part="1" F 0 "SW3" H 5050 6035 50 0000 C CNN -F 1 "BTTN_SAVE" H 5050 5944 50 0000 C CNN +F 1 "TL1105SPF250Q" H 5050 5944 50 0000 C CNN F 2 "Button_Switch_THT:SW_PUSH_6mm" H 5050 5800 50 0001 C CNN F 3 "~" H 5050 5800 50 0001 C CNN 1 5050 5800 @@ -87,7 +87,7 @@ P 5050 6800 AR Path="/61A6EF5C/61C6F749" Ref="SW4" Part="1" AR Path="/61C6F749" Ref="SW?" Part="1" F 0 "SW4" H 5050 7035 50 0000 C CNN -F 1 "BTTN_REC" H 5050 6944 50 0000 C CNN +F 1 "D6R40F1LFS " H 5050 6944 50 0000 C CNN F 2 "ell_special:CK-D6R_Pushbutton" H 5050 6800 50 0001 C CNN F 3 "~" H 5050 6800 50 0001 C CNN 1 5050 6800 @@ -154,7 +154,7 @@ P 3450 5800 AR Path="/61A6EF5C/61C6F769" Ref="SW1" Part="1" AR Path="/61C6F769" Ref="SW?" Part="1" F 0 "SW1" H 3450 6035 50 0000 C CNN -F 1 "BTTN_LOAD" H 3450 5944 50 0000 C CNN +F 1 "TL1105SPF250Q" H 3450 5944 50 0000 C CNN F 2 "Button_Switch_THT:SW_PUSH_6mm" H 3450 5800 50 0001 C CNN F 3 "~" H 3450 5800 50 0001 C CNN 1 3450 5800 @@ -221,7 +221,7 @@ P 3450 6800 AR Path="/61A6EF5C/61C6F789" Ref="SW2" Part="1" AR Path="/61C6F789" Ref="SW?" Part="1" F 0 "SW2" H 3450 7035 50 0000 C CNN -F 1 "BTTN_DIRECTION" H 3450 6944 50 0000 C CNN +F 1 "TL1105SPF250Q" H 3450 6944 50 0000 C CNN F 2 "Button_Switch_THT:SW_PUSH_6mm" H 3450 6800 50 0001 C CNN F 3 "~" H 3450 6800 50 0001 C CNN 1 3450 6800 @@ -280,7 +280,7 @@ F 3 "" H 3750 6900 50 0001 C CNN 1 0 0 -1 $EndComp Text GLabel 2900 6800 0 50 Output ~ 0 -BTTN_DIRECTION +BTTN_SETTINGS $Comp L Driver_LED:PCA9685PW U5 U 1 1 61C6F7A9 @@ -372,7 +372,7 @@ P 8450 1550 AR Path="/61A6EF5C/61C6F7D7" Ref="D4" Part="1" AR Path="/61C6F7D7" Ref="D?" Part="1" F 0 "D4" V 8250 1700 50 0000 L CNN -F 1 "LED_IN_L" H 9050 1550 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 9050 1550 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 8500 1550 50 0001 C CNN F 3 "~" H 8500 1550 50 0001 C CNN 1 8450 1550 @@ -385,7 +385,7 @@ P 8350 2000 AR Path="/61A6EF5C/61C6F7DD" Ref="R21" Part="1" AR Path="/61C6F7DD" Ref="R?" Part="1" F 0 "R21" H 8420 2046 50 0000 L CNN -F 1 "Rled" H 8420 1955 50 0000 L CNN +F 1 "330" H 8420 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 8280 2000 50 0001 C CNN F 3 "~" H 8350 2000 50 0001 C CNN 1 8350 2000 @@ -398,7 +398,7 @@ P 8550 2000 AR Path="/61A6EF5C/61C6F7E3" Ref="R22" Part="1" AR Path="/61C6F7E3" Ref="R?" Part="1" F 0 "R22" H 8620 2046 50 0000 L CNN -F 1 "Rled" H 8620 1955 50 0000 L CNN +F 1 "330" H 8620 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 8480 2000 50 0001 C CNN F 3 "~" H 8550 2000 50 0001 C CNN 1 8550 2000 @@ -426,7 +426,7 @@ P 7900 1550 AR Path="/61A6EF5C/61C6F7F0" Ref="D5" Part="1" AR Path="/61C6F7F0" Ref="D?" Part="1" F 0 "D5" V 7700 1700 50 0000 L CNN -F 1 "LED_IN_R" H 8500 1550 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 8500 1550 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 7950 1550 50 0001 C CNN F 3 "~" H 7950 1550 50 0001 C CNN 1 7900 1550 @@ -439,7 +439,7 @@ P 7800 2000 AR Path="/61A6EF5C/61C6F7F6" Ref="R23" Part="1" AR Path="/61C6F7F6" Ref="R?" Part="1" F 0 "R23" H 7870 2046 50 0000 L CNN -F 1 "Rled" H 7870 1955 50 0000 L CNN +F 1 "330" H 7870 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7730 2000 50 0001 C CNN F 3 "~" H 7800 2000 50 0001 C CNN 1 7800 2000 @@ -452,7 +452,7 @@ P 8000 2000 AR Path="/61A6EF5C/61C6F7FC" Ref="R26" Part="1" AR Path="/61C6F7FC" Ref="R?" Part="1" F 0 "R26" H 8070 2046 50 0000 L CNN -F 1 "Rled" H 8070 1955 50 0000 L CNN +F 1 "330" H 8070 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7930 2000 50 0001 C CNN F 3 "~" H 8000 2000 50 0001 C CNN 1 8000 2000 @@ -480,7 +480,7 @@ P 7350 1550 AR Path="/61A6EF5C/61C6F809" Ref="D6" Part="1" AR Path="/61C6F809" Ref="D?" Part="1" F 0 "D6" V 7150 1700 50 0000 L CNN -F 1 "LED_OUT_L" H 7950 1550 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 7950 1550 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 7400 1550 50 0001 C CNN F 3 "~" H 7400 1550 50 0001 C CNN 1 7350 1550 @@ -493,7 +493,7 @@ P 7250 2000 AR Path="/61A6EF5C/61C6F80F" Ref="R27" Part="1" AR Path="/61C6F80F" Ref="R?" Part="1" F 0 "R27" H 7320 2046 50 0000 L CNN -F 1 "Rled" H 7320 1955 50 0000 L CNN +F 1 "330" H 7320 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7180 2000 50 0001 C CNN F 3 "~" H 7250 2000 50 0001 C CNN 1 7250 2000 @@ -506,7 +506,7 @@ P 7450 2000 AR Path="/61A6EF5C/61C6F815" Ref="R28" Part="1" AR Path="/61C6F815" Ref="R?" Part="1" F 0 "R28" H 7520 2046 50 0000 L CNN -F 1 "Rled" H 7520 1955 50 0000 L CNN +F 1 "330" H 7520 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7380 2000 50 0001 C CNN F 3 "~" H 7450 2000 50 0001 C CNN 1 7450 2000 @@ -534,7 +534,7 @@ P 6800 1550 AR Path="/61A6EF5C/61C6F822" Ref="D7" Part="1" AR Path="/61C6F822" Ref="D?" Part="1" F 0 "D7" V 6600 1700 50 0000 L CNN -F 1 "LED_OUT_R" H 7400 1550 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 7400 1550 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 6850 1550 50 0001 C CNN F 3 "~" H 6850 1550 50 0001 C CNN 1 6800 1550 @@ -547,7 +547,7 @@ P 6700 2000 AR Path="/61A6EF5C/61C6F828" Ref="R29" Part="1" AR Path="/61C6F828" Ref="R?" Part="1" F 0 "R29" H 6770 2046 50 0000 L CNN -F 1 "Rled" H 6770 1955 50 0000 L CNN +F 1 "330" H 6770 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6630 2000 50 0001 C CNN F 3 "~" H 6700 2000 50 0001 C CNN 1 6700 2000 @@ -560,7 +560,7 @@ P 6900 2000 AR Path="/61A6EF5C/61C6F82E" Ref="R30" Part="1" AR Path="/61C6F82E" Ref="R?" Part="1" F 0 "R30" H 6970 2046 50 0000 L CNN -F 1 "Rled" H 6970 1955 50 0000 L CNN +F 1 "330" H 6970 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6830 2000 50 0001 C CNN F 3 "~" H 6900 2000 50 0001 C CNN 1 6900 2000 @@ -598,26 +598,13 @@ Wire Wire Line Wire Wire Line 4800 2700 3900 2700 $Comp -L Device:LED_Dual_CAC D8 -U 1 1 61C6F843 -P 4700 1550 -AR Path="/61A6EF5C/61C6F843" Ref="D8" Part="1" -AR Path="/61C6F843" Ref="D?" Part="1" -F 0 "D8" V 4500 1700 50 0000 L CNN -F 1 "LED_LOAD" H 5300 1550 50 0000 L CNN -F 2 "LED_THT:LED_D3.0mm-3" H 4750 1550 50 0001 C CNN -F 3 "~" H 4750 1550 50 0001 C CNN - 1 4700 1550 - 0 1 1 0 -$EndComp -$Comp L Device:R R31 U 1 1 61C6F849 P 4600 2000 AR Path="/61A6EF5C/61C6F849" Ref="R31" Part="1" AR Path="/61C6F849" Ref="R?" Part="1" F 0 "R31" H 4670 2046 50 0000 L CNN -F 1 "Rled" H 4670 1955 50 0000 L CNN +F 1 "330" H 4670 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4530 2000 50 0001 C CNN F 3 "~" H 4600 2000 50 0001 C CNN 1 4600 2000 @@ -630,7 +617,7 @@ P 4800 2000 AR Path="/61A6EF5C/61C6F84F" Ref="R32" Part="1" AR Path="/61C6F84F" Ref="R?" Part="1" F 0 "R32" H 4870 2046 50 0000 L CNN -F 1 "Rled" H 4870 1955 50 0000 L CNN +F 1 "330" H 4870 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4730 2000 50 0001 C CNN F 3 "~" H 4800 2000 50 0001 C CNN 1 4800 2000 @@ -864,7 +851,7 @@ P 5500 1550 AR Path="/61A6EF5C/61C93593" Ref="D9" Part="1" AR Path="/61C93593" Ref="D?" Part="1" F 0 "D9" V 5300 1700 50 0000 L CNN -F 1 "LED_SAVE" H 6100 1550 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 6100 1550 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 5550 1550 50 0001 C CNN F 3 "~" H 5550 1550 50 0001 C CNN 1 5500 1550 @@ -877,7 +864,7 @@ P 5400 2000 AR Path="/61A6EF5C/61C93599" Ref="R33" Part="1" AR Path="/61C93599" Ref="R?" Part="1" F 0 "R33" H 5470 2046 50 0000 L CNN -F 1 "Rled" H 5470 1955 50 0000 L CNN +F 1 "330" H 5470 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 5330 2000 50 0001 C CNN F 3 "~" H 5400 2000 50 0001 C CNN 1 5400 2000 @@ -890,7 +877,7 @@ P 5600 2000 AR Path="/61A6EF5C/61C9359F" Ref="R34" Part="1" AR Path="/61C9359F" Ref="R?" Part="1" F 0 "R34" H 5670 2046 50 0000 L CNN -F 1 "Rled" H 5670 1955 50 0000 L CNN +F 1 "330" H 5670 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 5530 2000 50 0001 C CNN F 3 "~" H 5600 2000 50 0001 C CNN 1 5600 2000 @@ -926,7 +913,7 @@ P 6050 1550 AR Path="/61A6EF5C/61C96285" Ref="D10" Part="1" AR Path="/61C96285" Ref="D?" Part="1" F 0 "D10" V 5850 1700 50 0000 L CNN -F 1 "LED_DIRECTION" H 6650 1550 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 6650 1550 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 6100 1550 50 0001 C CNN F 3 "~" H 6100 1550 50 0001 C CNN 1 6050 1550 @@ -939,7 +926,7 @@ P 5950 2000 AR Path="/61A6EF5C/61C9628B" Ref="R35" Part="1" AR Path="/61C9628B" Ref="R?" Part="1" F 0 "R35" H 6020 2046 50 0000 L CNN -F 1 "Rled" H 6020 1955 50 0000 L CNN +F 1 "330" H 6020 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 5880 2000 50 0001 C CNN F 3 "~" H 5950 2000 50 0001 C CNN 1 5950 2000 @@ -952,7 +939,7 @@ P 6150 2000 AR Path="/61A6EF5C/61C96291" Ref="R36" Part="1" AR Path="/61C96291" Ref="R?" Part="1" F 0 "R36" H 6220 2046 50 0000 L CNN -F 1 "Rled" H 6220 1955 50 0000 L CNN +F 1 "330" H 6220 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6080 2000 50 0001 C CNN F 3 "~" H 6150 2000 50 0001 C CNN 1 6150 2000 @@ -988,7 +975,7 @@ P 4150 1550 AR Path="/61A6EF5C/61C99EF2" Ref="D11" Part="1" AR Path="/61C99EF2" Ref="D?" Part="1" F 0 "D11" V 3950 1700 50 0000 L CNN -F 1 "LED_REC" H 4750 1550 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 4750 1550 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 4200 1550 50 0001 C CNN F 3 "~" H 4200 1550 50 0001 C CNN 1 4150 1550 @@ -1001,7 +988,7 @@ P 4050 2000 AR Path="/61A6EF5C/61C99EF8" Ref="R37" Part="1" AR Path="/61C99EF8" Ref="R?" Part="1" F 0 "R37" H 4120 2046 50 0000 L CNN -F 1 "Rled" H 4120 1955 50 0000 L CNN +F 1 "330" H 4120 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 3980 2000 50 0001 C CNN F 3 "~" H 4050 2000 50 0001 C CNN 1 4050 2000 @@ -1014,7 +1001,7 @@ P 4250 2000 AR Path="/61A6EF5C/61C99EFE" Ref="R38" Part="1" AR Path="/61C99EFE" Ref="R?" Part="1" F 0 "R38" H 4320 2046 50 0000 L CNN -F 1 "Rled" H 4320 1955 50 0000 L CNN +F 1 "330" H 4320 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4180 2000 50 0001 C CNN F 3 "~" H 4250 2000 50 0001 C CNN 1 4250 2000 @@ -1062,4 +1049,33 @@ Wire Wire Line 2500 3400 2250 3400 Wire Wire Line 2250 3400 2250 3300 +$Comp +L Device:LED_Dual_CAC D8 +U 1 1 61C6F843 +P 4700 1550 +AR Path="/61A6EF5C/61C6F843" Ref="D8" Part="1" +AR Path="/61C6F843" Ref="D?" Part="1" +F 0 "D8" V 4500 1700 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 5300 1550 50 0000 L CNN +F 2 "LED_THT:LED_D3.0mm-3" H 4750 1550 50 0001 C CNN +F 3 "~" H 4750 1550 50 0001 C CNN + 1 4700 1550 + 0 1 1 0 +$EndComp +Text Notes 4100 850 0 50 ~ 0 +Rec\n +Text Notes 4600 850 0 50 ~ 0 +Load\n +Text Notes 5400 850 0 50 ~ 0 +Save +Text Notes 5900 850 0 50 ~ 0 +Settings +Text Notes 6700 850 0 50 ~ 0 +Out R +Text Notes 7250 850 0 50 ~ 0 +Out L\n +Text Notes 7800 850 0 50 ~ 0 +In R +Text Notes 8350 850 0 50 ~ 0 +In L\n $EndSCHEMATC diff --git a/hardware/mainboard/LEDs.sch b/hardware/mainboard/LEDs.sch index 3c825a1..0db20de 100644 --- a/hardware/mainboard/LEDs.sch +++ b/hardware/mainboard/LEDs.sch @@ -126,7 +126,7 @@ AR Path="/61C541EA/61D9F741" Ref="D?" Part="1" AR Path="/61D4151D/61D9F741" Ref="D?" Part="1" AR Path="/61D60973/61D9F741" Ref="D?" Part="1" F 0 "D?" V 2650 1400 50 0000 L CNN -F 1 "LED_SPEED_+2_A" H 3450 1250 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 3450 1250 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 2900 1250 50 0001 C CNN F 3 "~" H 2900 1250 50 0001 C CNN 1 2850 1250 @@ -144,7 +144,7 @@ AR Path="/61C541EA/61D9F747" Ref="R?" Part="1" AR Path="/61D4151D/61D9F747" Ref="R?" Part="1" AR Path="/61D60973/61D9F747" Ref="R?" Part="1" F 0 "R?" H 2820 1746 50 0000 L CNN -F 1 "Rled" H 2820 1655 50 0000 L CNN +F 1 "330" H 2820 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 2680 1700 50 0001 C CNN F 3 "~" H 2750 1700 50 0001 C CNN 1 2750 1700 @@ -162,7 +162,7 @@ AR Path="/61C541EA/61D9F74D" Ref="R?" Part="1" AR Path="/61D4151D/61D9F74D" Ref="R?" Part="1" AR Path="/61D60973/61D9F74D" Ref="R?" Part="1" F 0 "R?" H 3020 1746 50 0000 L CNN -F 1 "Rled" H 3020 1655 50 0000 L CNN +F 1 "330" H 3020 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 2880 1700 50 0001 C CNN F 3 "~" H 2950 1700 50 0001 C CNN 1 2950 1700 @@ -200,7 +200,7 @@ AR Path="/61C541EA/61D9F75A" Ref="D?" Part="1" AR Path="/61D4151D/61D9F75A" Ref="D?" Part="1" AR Path="/61D60973/61D9F75A" Ref="D?" Part="1" F 0 "D?" V 3200 1400 50 0000 L CNN -F 1 "LED_SPEED_+1_A" H 4000 1250 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 4000 1250 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 3450 1250 50 0001 C CNN F 3 "~" H 3450 1250 50 0001 C CNN 1 3400 1250 @@ -218,7 +218,7 @@ AR Path="/61C541EA/61D9F760" Ref="R?" Part="1" AR Path="/61D4151D/61D9F760" Ref="R?" Part="1" AR Path="/61D60973/61D9F760" Ref="R?" Part="1" F 0 "R?" H 3370 1746 50 0000 L CNN -F 1 "Rled" H 3370 1655 50 0000 L CNN +F 1 "330" H 3370 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 3230 1700 50 0001 C CNN F 3 "~" H 3300 1700 50 0001 C CNN 1 3300 1700 @@ -236,7 +236,7 @@ AR Path="/61C541EA/61D9F766" Ref="R?" Part="1" AR Path="/61D4151D/61D9F766" Ref="R?" Part="1" AR Path="/61D60973/61D9F766" Ref="R?" Part="1" F 0 "R?" H 3570 1746 50 0000 L CNN -F 1 "Rled" H 3570 1655 50 0000 L CNN +F 1 "330" H 3570 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 3430 1700 50 0001 C CNN F 3 "~" H 3500 1700 50 0001 C CNN 1 3500 1700 @@ -274,7 +274,7 @@ AR Path="/61C541EA/61D9F773" Ref="D?" Part="1" AR Path="/61D4151D/61D9F773" Ref="D?" Part="1" AR Path="/61D60973/61D9F773" Ref="D?" Part="1" F 0 "D?" V 4000 1400 50 0000 L CNN -F 1 "LED_SPEED_-1_A" H 4800 1250 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 4800 1250 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 4250 1250 50 0001 C CNN F 3 "~" H 4250 1250 50 0001 C CNN 1 4200 1250 @@ -292,7 +292,7 @@ AR Path="/61C541EA/61D9F779" Ref="R?" Part="1" AR Path="/61D4151D/61D9F779" Ref="R?" Part="1" AR Path="/61D60973/61D9F779" Ref="R?" Part="1" F 0 "R?" H 4170 1746 50 0000 L CNN -F 1 "Rled" H 4170 1655 50 0000 L CNN +F 1 "330" H 4170 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 4030 1700 50 0001 C CNN F 3 "~" H 4100 1700 50 0001 C CNN 1 4100 1700 @@ -310,7 +310,7 @@ AR Path="/61C541EA/61D9F77F" Ref="R?" Part="1" AR Path="/61D4151D/61D9F77F" Ref="R?" Part="1" AR Path="/61D60973/61D9F77F" Ref="R?" Part="1" F 0 "R?" H 4370 1746 50 0000 L CNN -F 1 "Rled" H 4370 1655 50 0000 L CNN +F 1 "330" H 4370 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 4230 1700 50 0001 C CNN F 3 "~" H 4300 1700 50 0001 C CNN 1 4300 1700 @@ -348,7 +348,7 @@ AR Path="/61C541EA/61D9F78C" Ref="D?" Part="1" AR Path="/61D4151D/61D9F78C" Ref="D?" Part="1" AR Path="/61D60973/61D9F78C" Ref="D?" Part="1" F 0 "D?" V 4550 1400 50 0000 L CNN -F 1 "LED_SPEED_-2_A" H 5350 1250 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 5350 1250 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 4800 1250 50 0001 C CNN F 3 "~" H 4800 1250 50 0001 C CNN 1 4750 1250 @@ -366,7 +366,7 @@ AR Path="/61C541EA/61D9F792" Ref="R?" Part="1" AR Path="/61D4151D/61D9F792" Ref="R?" Part="1" AR Path="/61D60973/61D9F792" Ref="R?" Part="1" F 0 "R?" H 4720 1746 50 0000 L CNN -F 1 "Rled" H 4720 1655 50 0000 L CNN +F 1 "330" H 4720 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 4580 1700 50 0001 C CNN F 3 "~" H 4650 1700 50 0001 C CNN 1 4650 1700 @@ -384,7 +384,7 @@ AR Path="/61C541EA/61D9F798" Ref="R?" Part="1" AR Path="/61D4151D/61D9F798" Ref="R?" Part="1" AR Path="/61D60973/61D9F798" Ref="R?" Part="1" F 0 "R?" H 4920 1746 50 0000 L CNN -F 1 "Rled" H 4920 1655 50 0000 L CNN +F 1 "330" H 4920 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 4780 1700 50 0001 C CNN F 3 "~" H 4850 1700 50 0001 C CNN 1 4850 1700 @@ -438,7 +438,7 @@ AR Path="/61C541EA/61D9F7AD" Ref="D?" Part="1" AR Path="/61D4151D/61D9F7AD" Ref="D?" Part="1" AR Path="/61D60973/61D9F7AD" Ref="D?" Part="1" F 0 "D?" V 5300 1400 50 0000 L CNN -F 1 "LED_SPEED_+2_B" H 6100 1250 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 6100 1250 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 5550 1250 50 0001 C CNN F 3 "~" H 5550 1250 50 0001 C CNN 1 5500 1250 @@ -456,7 +456,7 @@ AR Path="/61C541EA/61D9F7B3" Ref="R?" Part="1" AR Path="/61D4151D/61D9F7B3" Ref="R?" Part="1" AR Path="/61D60973/61D9F7B3" Ref="R?" Part="1" F 0 "R?" H 5470 1746 50 0000 L CNN -F 1 "Rled" H 5470 1655 50 0000 L CNN +F 1 "330" H 5470 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 5330 1700 50 0001 C CNN F 3 "~" H 5400 1700 50 0001 C CNN 1 5400 1700 @@ -474,7 +474,7 @@ AR Path="/61C541EA/61D9F7B9" Ref="R?" Part="1" AR Path="/61D4151D/61D9F7B9" Ref="R?" Part="1" AR Path="/61D60973/61D9F7B9" Ref="R?" Part="1" F 0 "R?" H 5670 1746 50 0000 L CNN -F 1 "Rled" H 5670 1655 50 0000 L CNN +F 1 "330" H 5670 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 5530 1700 50 0001 C CNN F 3 "~" H 5600 1700 50 0001 C CNN 1 5600 1700 @@ -652,7 +652,7 @@ AR Path="/61C541EA/61D9F7F8" Ref="D?" Part="1" AR Path="/61D4151D/61D9F7F8" Ref="D?" Part="1" AR Path="/61D60973/61D9F7F8" Ref="D?" Part="1" F 0 "D?" V 5850 1400 50 0000 L CNN -F 1 "LED_SPEED_+1_B" H 6650 1250 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 6650 1250 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 6100 1250 50 0001 C CNN F 3 "~" H 6100 1250 50 0001 C CNN 1 6050 1250 @@ -670,7 +670,7 @@ AR Path="/61C541EA/61D9F7FE" Ref="R?" Part="1" AR Path="/61D4151D/61D9F7FE" Ref="R?" Part="1" AR Path="/61D60973/61D9F7FE" Ref="R?" Part="1" F 0 "R?" H 6020 1746 50 0000 L CNN -F 1 "Rled" H 6020 1655 50 0000 L CNN +F 1 "330" H 6020 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 5880 1700 50 0001 C CNN F 3 "~" H 5950 1700 50 0001 C CNN 1 5950 1700 @@ -688,7 +688,7 @@ AR Path="/61C541EA/61D9F804" Ref="R?" Part="1" AR Path="/61D4151D/61D9F804" Ref="R?" Part="1" AR Path="/61D60973/61D9F804" Ref="R?" Part="1" F 0 "R?" H 6220 1746 50 0000 L CNN -F 1 "Rled" H 6220 1655 50 0000 L CNN +F 1 "330" H 6220 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 6080 1700 50 0001 C CNN F 3 "~" H 6150 1700 50 0001 C CNN 1 6150 1700 @@ -734,7 +734,7 @@ AR Path="/61C541EA/61D9F815" Ref="D?" Part="1" AR Path="/61D4151D/61D9F815" Ref="D?" Part="1" AR Path="/61D60973/61D9F815" Ref="D?" Part="1" F 0 "D?" V 6400 1400 50 0000 L CNN -F 1 "LED_SPEED_-1_B" H 7200 1250 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 7200 1250 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 6650 1250 50 0001 C CNN F 3 "~" H 6650 1250 50 0001 C CNN 1 6600 1250 @@ -752,7 +752,7 @@ AR Path="/61C541EA/61D9F81B" Ref="R?" Part="1" AR Path="/61D4151D/61D9F81B" Ref="R?" Part="1" AR Path="/61D60973/61D9F81B" Ref="R?" Part="1" F 0 "R?" H 6570 1746 50 0000 L CNN -F 1 "Rled" H 6570 1655 50 0000 L CNN +F 1 "330" H 6570 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 6430 1700 50 0001 C CNN F 3 "~" H 6500 1700 50 0001 C CNN 1 6500 1700 @@ -770,7 +770,7 @@ AR Path="/61C541EA/61D9F821" Ref="R?" Part="1" AR Path="/61D4151D/61D9F821" Ref="R?" Part="1" AR Path="/61D60973/61D9F821" Ref="R?" Part="1" F 0 "R?" H 6770 1746 50 0000 L CNN -F 1 "Rled" H 6770 1655 50 0000 L CNN +F 1 "330" H 6770 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 6630 1700 50 0001 C CNN F 3 "~" H 6700 1700 50 0001 C CNN 1 6700 1700 @@ -816,7 +816,7 @@ AR Path="/61C541EA/61D9F832" Ref="D?" Part="1" AR Path="/61D4151D/61D9F832" Ref="D?" Part="1" AR Path="/61D60973/61D9F832" Ref="D?" Part="1" F 0 "D?" V 6950 1400 50 0000 L CNN -F 1 "LED_SPEED_-2_B" H 7750 1250 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 7750 1250 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 7200 1250 50 0001 C CNN F 3 "~" H 7200 1250 50 0001 C CNN 1 7150 1250 @@ -834,7 +834,7 @@ AR Path="/61C541EA/61D9F838" Ref="R?" Part="1" AR Path="/61D4151D/61D9F838" Ref="R?" Part="1" AR Path="/61D60973/61D9F838" Ref="R?" Part="1" F 0 "R?" H 7120 1746 50 0000 L CNN -F 1 "Rled" H 7120 1655 50 0000 L CNN +F 1 "330" H 7120 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 6980 1700 50 0001 C CNN F 3 "~" H 7050 1700 50 0001 C CNN 1 7050 1700 @@ -852,7 +852,7 @@ AR Path="/61C541EA/61D9F83E" Ref="R?" Part="1" AR Path="/61D4151D/61D9F83E" Ref="R?" Part="1" AR Path="/61D60973/61D9F83E" Ref="R?" Part="1" F 0 "R?" H 7320 1746 50 0000 L CNN -F 1 "Rled" H 7320 1655 50 0000 L CNN +F 1 "330" H 7320 1655 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 7180 1700 50 0001 C CNN F 3 "~" H 7250 1700 50 0001 C CNN 1 7250 1700 @@ -1007,7 +1007,7 @@ AR Path="/61C541EA/61E60BA4" Ref="D?" Part="1" AR Path="/61D4151D/61E60BA4" Ref="D?" Part="1" AR Path="/61D60973/61E60BA4" Ref="D?" Part="1" F 0 "D?" V 2650 4350 50 0000 L CNN -F 1 "LED_SPEED_+2_C" H 3450 4200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 3450 4200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 2900 4200 50 0001 C CNN F 3 "~" H 2900 4200 50 0001 C CNN 1 2850 4200 @@ -1025,7 +1025,7 @@ AR Path="/61C541EA/61E60BAA" Ref="R?" Part="1" AR Path="/61D4151D/61E60BAA" Ref="R?" Part="1" AR Path="/61D60973/61E60BAA" Ref="R?" Part="1" F 0 "R?" H 2820 4696 50 0000 L CNN -F 1 "Rled" H 2820 4605 50 0000 L CNN +F 1 "330" H 2820 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 2680 4650 50 0001 C CNN F 3 "~" H 2750 4650 50 0001 C CNN 1 2750 4650 @@ -1043,7 +1043,7 @@ AR Path="/61C541EA/61E60BB0" Ref="R?" Part="1" AR Path="/61D4151D/61E60BB0" Ref="R?" Part="1" AR Path="/61D60973/61E60BB0" Ref="R?" Part="1" F 0 "R?" H 3020 4696 50 0000 L CNN -F 1 "Rled" H 3020 4605 50 0000 L CNN +F 1 "330" H 3020 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 2880 4650 50 0001 C CNN F 3 "~" H 2950 4650 50 0001 C CNN 1 2950 4650 @@ -1081,7 +1081,7 @@ AR Path="/61C541EA/61E60BBD" Ref="D?" Part="1" AR Path="/61D4151D/61E60BBD" Ref="D?" Part="1" AR Path="/61D60973/61E60BBD" Ref="D?" Part="1" F 0 "D?" V 3200 4350 50 0000 L CNN -F 1 "LED_SPEED_+1_C" H 4000 4200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 4000 4200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 3450 4200 50 0001 C CNN F 3 "~" H 3450 4200 50 0001 C CNN 1 3400 4200 @@ -1099,7 +1099,7 @@ AR Path="/61C541EA/61E60BC3" Ref="R?" Part="1" AR Path="/61D4151D/61E60BC3" Ref="R?" Part="1" AR Path="/61D60973/61E60BC3" Ref="R?" Part="1" F 0 "R?" H 3370 4696 50 0000 L CNN -F 1 "Rled" H 3370 4605 50 0000 L CNN +F 1 "330" H 3370 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 3230 4650 50 0001 C CNN F 3 "~" H 3300 4650 50 0001 C CNN 1 3300 4650 @@ -1117,7 +1117,7 @@ AR Path="/61C541EA/61E60BC9" Ref="R?" Part="1" AR Path="/61D4151D/61E60BC9" Ref="R?" Part="1" AR Path="/61D60973/61E60BC9" Ref="R?" Part="1" F 0 "R?" H 3570 4696 50 0000 L CNN -F 1 "Rled" H 3570 4605 50 0000 L CNN +F 1 "330" H 3570 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 3430 4650 50 0001 C CNN F 3 "~" H 3500 4650 50 0001 C CNN 1 3500 4650 @@ -1155,7 +1155,7 @@ AR Path="/61C541EA/61E60BD6" Ref="D?" Part="1" AR Path="/61D4151D/61E60BD6" Ref="D?" Part="1" AR Path="/61D60973/61E60BD6" Ref="D?" Part="1" F 0 "D?" V 4000 4350 50 0000 L CNN -F 1 "LED_SPEED_-1_C" H 4800 4200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 4800 4200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 4250 4200 50 0001 C CNN F 3 "~" H 4250 4200 50 0001 C CNN 1 4200 4200 @@ -1173,7 +1173,7 @@ AR Path="/61C541EA/61E60BDC" Ref="R?" Part="1" AR Path="/61D4151D/61E60BDC" Ref="R?" Part="1" AR Path="/61D60973/61E60BDC" Ref="R?" Part="1" F 0 "R?" H 4170 4696 50 0000 L CNN -F 1 "Rled" H 4170 4605 50 0000 L CNN +F 1 "330" H 4170 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 4030 4650 50 0001 C CNN F 3 "~" H 4100 4650 50 0001 C CNN 1 4100 4650 @@ -1191,7 +1191,7 @@ AR Path="/61C541EA/61E60BE2" Ref="R?" Part="1" AR Path="/61D4151D/61E60BE2" Ref="R?" Part="1" AR Path="/61D60973/61E60BE2" Ref="R?" Part="1" F 0 "R?" H 4370 4696 50 0000 L CNN -F 1 "Rled" H 4370 4605 50 0000 L CNN +F 1 "330" H 4370 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 4230 4650 50 0001 C CNN F 3 "~" H 4300 4650 50 0001 C CNN 1 4300 4650 @@ -1229,7 +1229,7 @@ AR Path="/61C541EA/61E60BEF" Ref="D?" Part="1" AR Path="/61D4151D/61E60BEF" Ref="D?" Part="1" AR Path="/61D60973/61E60BEF" Ref="D?" Part="1" F 0 "D?" V 4550 4350 50 0000 L CNN -F 1 "LED_SPEED_-2_C" H 5350 4200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 5350 4200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 4800 4200 50 0001 C CNN F 3 "~" H 4800 4200 50 0001 C CNN 1 4750 4200 @@ -1247,7 +1247,7 @@ AR Path="/61C541EA/61E60BF5" Ref="R?" Part="1" AR Path="/61D4151D/61E60BF5" Ref="R?" Part="1" AR Path="/61D60973/61E60BF5" Ref="R?" Part="1" F 0 "R?" H 4720 4696 50 0000 L CNN -F 1 "Rled" H 4720 4605 50 0000 L CNN +F 1 "330" H 4720 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 4580 4650 50 0001 C CNN F 3 "~" H 4650 4650 50 0001 C CNN 1 4650 4650 @@ -1265,7 +1265,7 @@ AR Path="/61C541EA/61E60BFB" Ref="R?" Part="1" AR Path="/61D4151D/61E60BFB" Ref="R?" Part="1" AR Path="/61D60973/61E60BFB" Ref="R?" Part="1" F 0 "R?" H 4920 4696 50 0000 L CNN -F 1 "Rled" H 4920 4605 50 0000 L CNN +F 1 "330" H 4920 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 4780 4650 50 0001 C CNN F 3 "~" H 4850 4650 50 0001 C CNN 1 4850 4650 @@ -1319,7 +1319,7 @@ AR Path="/61C541EA/61E60C10" Ref="D?" Part="1" AR Path="/61D4151D/61E60C10" Ref="D?" Part="1" AR Path="/61D60973/61E60C10" Ref="D?" Part="1" F 0 "D?" V 5300 4350 50 0000 L CNN -F 1 "LED_SPEED_+2_D" H 6100 4200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 6100 4200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 5550 4200 50 0001 C CNN F 3 "~" H 5550 4200 50 0001 C CNN 1 5500 4200 @@ -1337,7 +1337,7 @@ AR Path="/61C541EA/61E60C16" Ref="R?" Part="1" AR Path="/61D4151D/61E60C16" Ref="R?" Part="1" AR Path="/61D60973/61E60C16" Ref="R?" Part="1" F 0 "R?" H 5470 4696 50 0000 L CNN -F 1 "Rled" H 5470 4605 50 0000 L CNN +F 1 "330" H 5470 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 5330 4650 50 0001 C CNN F 3 "~" H 5400 4650 50 0001 C CNN 1 5400 4650 @@ -1355,7 +1355,7 @@ AR Path="/61C541EA/61E60C1C" Ref="R?" Part="1" AR Path="/61D4151D/61E60C1C" Ref="R?" Part="1" AR Path="/61D60973/61E60C1C" Ref="R?" Part="1" F 0 "R?" H 5670 4696 50 0000 L CNN -F 1 "Rled" H 5670 4605 50 0000 L CNN +F 1 "330" H 5670 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 5530 4650 50 0001 C CNN F 3 "~" H 5600 4650 50 0001 C CNN 1 5600 4650 @@ -1533,7 +1533,7 @@ AR Path="/61C541EA/61E60C5B" Ref="D?" Part="1" AR Path="/61D4151D/61E60C5B" Ref="D?" Part="1" AR Path="/61D60973/61E60C5B" Ref="D?" Part="1" F 0 "D?" V 5850 4350 50 0000 L CNN -F 1 "LED_SPEED_+1_D" H 6650 4200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 6650 4200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 6100 4200 50 0001 C CNN F 3 "~" H 6100 4200 50 0001 C CNN 1 6050 4200 @@ -1551,7 +1551,7 @@ AR Path="/61C541EA/61E60C61" Ref="R?" Part="1" AR Path="/61D4151D/61E60C61" Ref="R?" Part="1" AR Path="/61D60973/61E60C61" Ref="R?" Part="1" F 0 "R?" H 6020 4696 50 0000 L CNN -F 1 "Rled" H 6020 4605 50 0000 L CNN +F 1 "330" H 6020 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 5880 4650 50 0001 C CNN F 3 "~" H 5950 4650 50 0001 C CNN 1 5950 4650 @@ -1569,7 +1569,7 @@ AR Path="/61C541EA/61E60C67" Ref="R?" Part="1" AR Path="/61D4151D/61E60C67" Ref="R?" Part="1" AR Path="/61D60973/61E60C67" Ref="R?" Part="1" F 0 "R?" H 6220 4696 50 0000 L CNN -F 1 "Rled" H 6220 4605 50 0000 L CNN +F 1 "330" H 6220 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 6080 4650 50 0001 C CNN F 3 "~" H 6150 4650 50 0001 C CNN 1 6150 4650 @@ -1615,7 +1615,7 @@ AR Path="/61C541EA/61E60C78" Ref="D?" Part="1" AR Path="/61D4151D/61E60C78" Ref="D?" Part="1" AR Path="/61D60973/61E60C78" Ref="D?" Part="1" F 0 "D?" V 6400 4350 50 0000 L CNN -F 1 "LED_SPEED_-1_D" H 7200 4200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 7200 4200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 6650 4200 50 0001 C CNN F 3 "~" H 6650 4200 50 0001 C CNN 1 6600 4200 @@ -1633,7 +1633,7 @@ AR Path="/61C541EA/61E60C7E" Ref="R?" Part="1" AR Path="/61D4151D/61E60C7E" Ref="R?" Part="1" AR Path="/61D60973/61E60C7E" Ref="R?" Part="1" F 0 "R?" H 6570 4696 50 0000 L CNN -F 1 "Rled" H 6570 4605 50 0000 L CNN +F 1 "330" H 6570 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 6430 4650 50 0001 C CNN F 3 "~" H 6500 4650 50 0001 C CNN 1 6500 4650 @@ -1651,7 +1651,7 @@ AR Path="/61C541EA/61E60C84" Ref="R?" Part="1" AR Path="/61D4151D/61E60C84" Ref="R?" Part="1" AR Path="/61D60973/61E60C84" Ref="R?" Part="1" F 0 "R?" H 6770 4696 50 0000 L CNN -F 1 "Rled" H 6770 4605 50 0000 L CNN +F 1 "330" H 6770 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 6630 4650 50 0001 C CNN F 3 "~" H 6700 4650 50 0001 C CNN 1 6700 4650 @@ -1697,7 +1697,7 @@ AR Path="/61C541EA/61E60C95" Ref="D?" Part="1" AR Path="/61D4151D/61E60C95" Ref="D?" Part="1" AR Path="/61D60973/61E60C95" Ref="D?" Part="1" F 0 "D?" V 6950 4350 50 0000 L CNN -F 1 "LED_SPEED_-2_D" H 7750 4200 50 0000 L CNN +F 1 "LED_RED_GREEN_CA" H 7750 4200 50 0000 L CNN F 2 "LED_THT:LED_D3.0mm-3" H 7200 4200 50 0001 C CNN F 3 "~" H 7200 4200 50 0001 C CNN 1 7150 4200 @@ -1715,7 +1715,7 @@ AR Path="/61C541EA/61E60C9B" Ref="R?" Part="1" AR Path="/61D4151D/61E60C9B" Ref="R?" Part="1" AR Path="/61D60973/61E60C9B" Ref="R?" Part="1" F 0 "R?" H 7120 4696 50 0000 L CNN -F 1 "Rled" H 7120 4605 50 0000 L CNN +F 1 "330" H 7120 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 6980 4650 50 0001 C CNN F 3 "~" H 7050 4650 50 0001 C CNN 1 7050 4650 @@ -1733,7 +1733,7 @@ AR Path="/61C541EA/61E60CA1" Ref="R?" Part="1" AR Path="/61D4151D/61E60CA1" Ref="R?" Part="1" AR Path="/61D60973/61E60CA1" Ref="R?" Part="1" F 0 "R?" H 7320 4696 50 0000 L CNN -F 1 "Rled" H 7320 4605 50 0000 L CNN +F 1 "330" H 7320 4605 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad1.05x0.95mm_HandSolder" V 7180 4650 50 0001 C CNN F 3 "~" H 7250 4650 50 0001 C CNN 1 7250 4650 diff --git a/hardware/mainboard/TapeLooper_BOM.ods b/hardware/mainboard/TapeLooper_BOM.ods new file mode 100644 index 0000000..8482381 Binary files /dev/null and b/hardware/mainboard/TapeLooper_BOM.ods differ diff --git a/hardware/mainboard/TapeLooper_MainBoard.kicad_pcb b/hardware/mainboard/TapeLooper_MainBoard.kicad_pcb index b142f4b..221a748 100644 --- a/hardware/mainboard/TapeLooper_MainBoard.kicad_pcb +++ b/hardware/mainboard/TapeLooper_MainBoard.kicad_pcb @@ -11,14 +11,14 @@ (page A4) (layers - (0 F.Cu signal) + (0 F.Cu signal hide) (31 B.Cu signal) (32 B.Adhes user) (33 F.Adhes user) (34 B.Paste user) (35 F.Paste user) (36 B.SilkS user) - (37 F.SilkS user) + (37 F.SilkS user hide) (38 B.Mask user) (39 F.Mask user) (40 Dwgs.User user) @@ -615,7 +615,7 @@ (fp_text reference SW4 (at -7.13408 -4.17126) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BTTN_REC (at 0 -0.5) (layer F.Fab) + (fp_text value "D6R40F1LFS " (at 0 -0.5) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 0 -6) (layer F.SilkS) (width 0.15)) @@ -637,7 +637,7 @@ (fp_text reference SW12 (at -4.78574 -5.9611) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BTTN_PLAY_D (at 0 -0.5) (layer F.Fab) + (fp_text value "D6R90F1LFS " (at 0 -0.5) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 0 -6) (layer F.SilkS) (width 0.15)) @@ -659,7 +659,7 @@ (fp_text reference SW11 (at -4.93608 -5.8738) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BTTN_PLAY_C (at 0 -0.5) (layer F.Fab) + (fp_text value "D6R90F1LFS " (at 0 -0.5) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 0 -6) (layer F.SilkS) (width 0.15)) @@ -681,7 +681,7 @@ (fp_text reference SW10 (at -5.1788 -5.86364) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BTTN_PLAY_B (at 0 -0.5) (layer F.Fab) + (fp_text value "D6R90F1LFS " (at 0 -0.5) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 0 -6) (layer F.SilkS) (width 0.15)) @@ -703,7 +703,7 @@ (fp_text reference SW9 (at -6.73422 4.03636) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BTTN_PLAY_A (at 0 -0.5) (layer F.Fab) + (fp_text value "D6R90F1LFS " (at 0 -0.5) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 0 -6) (layer F.SilkS) (width 0.15)) @@ -725,7 +725,7 @@ (fp_text reference SW8 (at 4.19648 0.02156 90) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BTTN_SPEED_D (at 0 -0.5) (layer F.Fab) + (fp_text value "C&K 7105SYCQE" (at 0 -0.5) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 3.175 0) (layer F.SilkS) (width 0.12)) @@ -747,7 +747,7 @@ (fp_text reference SW7 (at 4.27408 0.32918 90) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BTTN_SPEED_C (at 0 -0.5) (layer F.Fab) + (fp_text value "C&K 7105SYCQE" (at 0 -0.5) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 3.175 0) (layer F.SilkS) (width 0.12)) @@ -769,7 +769,7 @@ (fp_text reference SW6 (at 4.33136 -0.17082 90) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BTTN_SPEED_B (at 0 -0.5) (layer F.Fab) + (fp_text value "C&K 7105SYCQE" (at 0 -0.5) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 3.175 0) (layer F.SilkS) (width 0.12)) @@ -791,7 +791,7 @@ (fp_text reference SW5 (at 4.1861 0.2368 90) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BTTN_SPEED_A (at 0 -0.5) (layer F.Fab) + (fp_text value "C&K 7105SYCQE" (at 0 -0.5) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 3.175 0) (layer F.SilkS) (width 0.12)) @@ -1935,7 +1935,7 @@ (fp_text reference J14 (at 3.81 6) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value VOL_D (at 0 -7.62) (layer F.Fab) hide + (fp_text value PJ398SM (at 0 -7.62) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 1.3 0) (layer F.SilkS) (width 0.15)) @@ -1968,7 +1968,7 @@ (fp_text reference J13 (at 3.81 6) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value VOL_C (at 0 -7.62) (layer F.Fab) hide + (fp_text value PJ398SM (at 0 -7.62) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 1.3 0) (layer F.SilkS) (width 0.15)) @@ -2001,7 +2001,7 @@ (fp_text reference J12 (at 3.81 6) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value PITCH_D (at 0 -7.62) (layer F.Fab) hide + (fp_text value PJ398SM (at 0 -7.62) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 1.3 0) (layer F.SilkS) (width 0.15)) @@ -2034,7 +2034,7 @@ (fp_text reference J11 (at 3.81 6) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value PITCH_C (at 0 -7.62) (layer F.Fab) hide + (fp_text value PJ398SM (at 0 -7.62) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 1.3 0) (layer F.SilkS) (width 0.15)) @@ -2067,7 +2067,7 @@ (fp_text reference J10 (at 3.81 6) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value VOL_B (at 0 -7.62) (layer F.Fab) hide + (fp_text value PJ398SM (at 0 -7.62) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 1.3 0) (layer F.SilkS) (width 0.15)) @@ -2100,7 +2100,7 @@ (fp_text reference J9 (at 3.81 6 90) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value VOL_A (at 0 -7.62 90) (layer F.Fab) hide + (fp_text value PJ398SM (at 0 -7.62 90) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 1.3 0) (layer F.SilkS) (width 0.15)) @@ -2133,7 +2133,7 @@ (fp_text reference J8 (at 3.81 6) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value PITCH_B (at 0 -7.62) (layer F.Fab) hide + (fp_text value PJ398SM (at 0 -7.62) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 1.3 0) (layer F.SilkS) (width 0.15)) @@ -2166,7 +2166,7 @@ (fp_text reference J7 (at 3.81 6) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value PITCH_A (at 0 -7.62) (layer F.Fab) hide + (fp_text value PJ398SM (at 0 -7.62) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 0 0) (end 1.3 0) (layer F.SilkS) (width 0.15)) @@ -3700,7 +3700,7 @@ (fp_text reference R70 (at -3.04292 -0.07684) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -3736,7 +3736,7 @@ (fp_text reference R69 (at -2.9905 -0.08314) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -3772,7 +3772,7 @@ (fp_text reference R68 (at -3.03784 -0.03988) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -3808,7 +3808,7 @@ (fp_text reference R67 (at -2.98924 -0.04364) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -3844,7 +3844,7 @@ (fp_text reference R66 (at -3.04166 -0.10546) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -3880,7 +3880,7 @@ (fp_text reference R65 (at -2.98542 -0.01176) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -3916,7 +3916,7 @@ (fp_text reference R64 (at -3.04102 -0.06596) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -3952,7 +3952,7 @@ (fp_text reference R63 (at -2.9886 -0.0748) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -3988,7 +3988,7 @@ (fp_text reference R62 (at -3.04292 -0.02646) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4024,7 +4024,7 @@ (fp_text reference R61 (at -2.98796 -0.04292) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4060,7 +4060,7 @@ (fp_text reference R60 (at -3.04292 -0.09204) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4096,7 +4096,7 @@ (fp_text reference R59 (at -2.9905 -0.00596) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4132,7 +4132,7 @@ (fp_text reference R58 (at -3.04292 -0.05762) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4168,7 +4168,7 @@ (fp_text reference R57 (at -2.98162 -0.07662) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4204,7 +4204,7 @@ (fp_text reference R56 (at -3.04292 -0.02828) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4240,7 +4240,7 @@ (fp_text reference R55 (at -2.98288 -0.03712) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4276,7 +4276,7 @@ (fp_text reference R54 (at -9.16436 0.2105) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4312,7 +4312,7 @@ (fp_text reference R53 (at -2.83776 -0.02384) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4348,7 +4348,7 @@ (fp_text reference R52 (at -9.16754 0.14492) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4384,7 +4384,7 @@ (fp_text reference R51 (at -2.83522 0.01312) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4420,7 +4420,7 @@ (fp_text reference R50 (at -9.16944 0.07934) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4456,7 +4456,7 @@ (fp_text reference R49 (at -2.84284 0.04754) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4492,7 +4492,7 @@ (fp_text reference R48 (at -9.17198 0.01884) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4528,7 +4528,7 @@ (fp_text reference R47 (at -2.84284 0.0845) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4564,7 +4564,7 @@ (fp_text reference R46 (at -9.17198 -0.04166) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4600,7 +4600,7 @@ (fp_text reference R45 (at -2.84158 0.024) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4636,7 +4636,7 @@ (fp_text reference R44 (at -9.17452 -0.10216) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4672,7 +4672,7 @@ (fp_text reference R43 (at -2.83904 -0.04412) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4708,7 +4708,7 @@ (fp_text reference R42 (at -9.1796 -0.16266) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4744,7 +4744,7 @@ (fp_text reference R41 (at -2.8403 -0.01224) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4780,7 +4780,7 @@ (fp_text reference R40 (at -9.17706 -0.2257) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4816,7 +4816,7 @@ (fp_text reference R39 (at -2.84284 -0.07782) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start 1.65 -0.73) (end -1.65 -0.73) (layer B.CrtYd) (width 0.05)) @@ -4851,7 +4851,7 @@ (fp_text reference D27 (at 7.64664 0.02128) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_-2_D (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -4888,7 +4888,7 @@ (fp_text reference D26 (at 7.65612 0.01366) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_-2_B (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -4925,7 +4925,7 @@ (fp_text reference D25 (at 7.73394 0.2548) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_-1_D (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -4962,7 +4962,7 @@ (fp_text reference D24 (at 7.66882 -0.04774) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_-1_B (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -4999,7 +4999,7 @@ (fp_text reference D23 (at 7.73902 -0.00152) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_+1_D (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -5036,7 +5036,7 @@ (fp_text reference D22 (at 7.76882 -0.09136) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_+1_B (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -5073,7 +5073,7 @@ (fp_text reference D21 (at 7.75172 0.02852) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_+2_D (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -5110,7 +5110,7 @@ (fp_text reference D20 (at 7.76882 0.02852) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_+2_B (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -5147,7 +5147,7 @@ (fp_text reference D19 (at 7.70138 -0.06856) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_-2_C (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -5184,7 +5184,7 @@ (fp_text reference D18 (at 7.82102 0.13906) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_-2_A (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -5221,7 +5221,7 @@ (fp_text reference D17 (at 7.70392 0.0802) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_-1_C (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -5258,7 +5258,7 @@ (fp_text reference D16 (at 7.90832 -0.12742) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_-1_A (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -5295,7 +5295,7 @@ (fp_text reference D15 (at 7.79376 -0.08374) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_+1_C (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -5332,7 +5332,7 @@ (fp_text reference D14 (at 7.72356 0.10102) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_+1_A (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -5369,7 +5369,7 @@ (fp_text reference D13 (at 7.70138 0.03106) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_+2_C (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -5406,7 +5406,7 @@ (fp_text reference D12 (at 7.72102 0.82344) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SPEED_+2_A (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 6.25 -2.25) (end -1.15 -2.25) (layer F.CrtYd) (width 0.05)) @@ -7048,7 +7048,7 @@ (fp_text reference SW3 (at 8.73922 2.11224 180) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BTTN_SAVE (at 3.75 6.7 90) (layer F.Fab) + (fp_text value TL1105SPF250Q (at 3.75 6.7 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 3.25 -0.75) (end 6.25 -0.75) (layer F.Fab) (width 0.1)) @@ -7099,7 +7099,7 @@ (fp_text reference SW2 (at 8.71852 2.39954 180) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BTTN_DIRECTION (at 3.75 6.7 90) (layer F.Fab) + (fp_text value TL1105SPF250Q (at 3.75 6.7 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 3.25 -0.75) (end 6.25 -0.75) (layer F.Fab) (width 0.1)) @@ -7150,7 +7150,7 @@ (fp_text reference SW1 (at -2.43088 2.21224 180) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value BTTN_LOAD (at 3.75 6.7 90) (layer F.Fab) + (fp_text value TL1105SPF250Q (at 3.75 6.7 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start 3.25 -0.75) (end 6.25 -0.75) (layer F.Fab) (width 0.1)) @@ -7202,7 +7202,7 @@ (fp_text reference R38 (at 0.8875 -1.41) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7238,7 +7238,7 @@ (fp_text reference R37 (at -0.0908 -1.57694 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7274,7 +7274,7 @@ (fp_text reference R36 (at -2.9673 1.07846) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43) (layer B.Fab) + (fp_text value 330 (at 0 -1.43) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7310,7 +7310,7 @@ (fp_text reference R35 (at 0 1.43 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7346,7 +7346,7 @@ (fp_text reference R34 (at 0 1.43 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7382,7 +7382,7 @@ (fp_text reference R33 (at 0 1.43 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7490,7 +7490,7 @@ (fp_text reference R32 (at 0 1.43 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7526,7 +7526,7 @@ (fp_text reference R31 (at -3.08368 -0.03874 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7562,7 +7562,7 @@ (fp_text reference R30 (at -0.25 -1.8 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7598,7 +7598,7 @@ (fp_text reference R29 (at -3.204 -0.06002 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7634,7 +7634,7 @@ (fp_text reference R28 (at 1.65504 1.54324 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7742,7 +7742,7 @@ (fp_text reference R27 (at -3.19638 0.00928 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7778,7 +7778,7 @@ (fp_text reference R26 (at 3.20076 -0.05858 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7814,7 +7814,7 @@ (fp_text reference R23 (at -3.1167 -0.03826 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7850,7 +7850,7 @@ (fp_text reference R22 (at 3.19568 -0.0604 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -7886,7 +7886,7 @@ (fp_text reference R21 (at -3.12686 -0.02484 90) (layer B.SilkS) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) - (fp_text value Rled (at 0 -1.43 90) (layer B.Fab) + (fp_text value 330 (at 0 -1.43 90) (layer B.Fab) (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) ) (fp_line (start -0.8 -0.4125) (end -0.8 0.4125) (layer B.Fab) (width 0.1)) @@ -8721,7 +8721,7 @@ (fp_text reference J6 (at 3.81 6) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value AUDIO_OUT_R (at 0 -7.62) (layer F.Fab) hide + (fp_text value PJ398SM (at 0 -7.62) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start -4.445 3.81) (end -1.905 3.81) (layer F.SilkS) (width 0.15)) @@ -8753,7 +8753,7 @@ (fp_text reference J5 (at 3.81 6) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value AUDIO_OUT_L (at 0 -7.62) (layer F.Fab) hide + (fp_text value PJ398SM (at 0 -7.62) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start -4.445 3.81) (end -1.905 3.81) (layer F.SilkS) (width 0.15)) @@ -8785,7 +8785,7 @@ (fp_text reference J4 (at 3.81 6) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value AUDIO_IN_R (at 0 -7.62) (layer F.Fab) hide + (fp_text value PJ398SM (at 0 -7.62) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start -4.445 3.81) (end -1.905 3.81) (layer F.SilkS) (width 0.15)) @@ -8818,7 +8818,7 @@ (fp_text reference J3 (at 3.81 6) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value AUDIO_IN_L (at 0 -7.62) (layer F.Fab) hide + (fp_text value PJ398SM (at 0 -7.62) (layer F.Fab) hide (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start -4.445 3.81) (end -1.905 3.81) (layer F.SilkS) (width 0.15)) @@ -8925,7 +8925,7 @@ (fp_text reference D11 (at 4.87116 3.26858) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_REC (at 2.54 2.96) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 2.54 0) (end 4.04 0) (layer F.Fab) (width 0.1)) @@ -8962,7 +8962,7 @@ (fp_text reference D10 (at 7.70478 0.12224 90) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_DIRECTION (at 2.54 2.96 90) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 2.54 0) (end 4.04 0) (layer F.Fab) (width 0.1)) @@ -8999,7 +8999,7 @@ (fp_text reference D9 (at 7.24326 0.02732 90) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_SAVE (at 2.54 2.96 90) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 2.54 0) (end 4.04 0) (layer F.Fab) (width 0.1)) @@ -9036,7 +9036,7 @@ (fp_text reference D8 (at -2.38272 0.01208 90) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_LOAD (at 2.54 2.96 90) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 2.54 0) (end 4.04 0) (layer F.Fab) (width 0.1)) @@ -9073,7 +9073,7 @@ (fp_text reference D7 (at 7.47278 0.13172 90) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_OUT_R (at 2.54 2.96 90) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 2.54 0) (end 4.04 0) (layer F.Fab) (width 0.1)) @@ -9110,7 +9110,7 @@ (fp_text reference D6 (at 7.37532 -0.0071 90) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_OUT_L (at 2.54 2.96 90) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 2.54 0) (end 4.04 0) (layer F.Fab) (width 0.1)) @@ -9147,7 +9147,7 @@ (fp_text reference D5 (at 7.27532 0.13282 90) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_IN_R (at 2.54 2.96 90) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 2.54 0) (end 4.04 0) (layer F.Fab) (width 0.1)) @@ -9184,7 +9184,7 @@ (fp_text reference D4 (at 7.17532 0.00924 90) (layer F.SilkS) (effects (font (size 1 1) (thickness 0.15))) ) - (fp_text value LED_IN_L (at 2.54 2.96 90) (layer F.Fab) + (fp_text value LED_RED_GREEN_CA (at 2.54 2.96 90) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_circle (center 2.54 0) (end 4.04 0) (layer F.Fab) (width 0.1)) @@ -11042,11 +11042,6 @@ (via (at 105.456719 96.77908) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 31)) (segment (start 101.9302 98.0567) (end 104.179099 98.0567) (width 0.25) (layer B.Cu) (net 31)) (segment (start 104.179099 98.0567) (end 105.456719 96.77908) (width 0.25) (layer B.Cu) (net 31)) - (segment (start 105.133555 80.704116) (end 106.876691 78.96098) (width 0.25) (layer F.Cu) (net 31)) - (segment (start 105.456719 84.590665) (end 105.133555 84.267501) (width 0.25) (layer F.Cu) (net 31)) - (segment (start 105.133555 84.267501) (end 105.133555 80.704116) (width 0.25) (layer F.Cu) (net 31)) - (segment (start 105.456719 96.77908) (end 105.456719 84.590665) (width 0.25) (layer F.Cu) (net 31)) - (segment (start 106.876691 78.96098) (end 136.54786 78.96098) (width 0.25) (layer F.Cu) (net 31)) (segment (start 136.64549 78.86335) (end 136.64549 78.15834) (width 0.25) (layer F.Cu) (net 31)) (segment (start 137.73404 78.11136) (end 136.69247 78.11136) (width 0.25) (layer B.Cu) (net 31)) (via (at 136.64549 78.15834) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 31)) @@ -11057,46 +11052,38 @@ (segment (start 136.54786 78.96098) (end 137.268863 78.239977) (width 0.25) (layer F.Cu) (net 31)) (segment (start 162.9664 78.2282) (end 161.954638 78.2282) (width 0.25) (layer B.Cu) (net 31)) (segment (start 137.268863 78.239977) (end 161.942861 78.239977) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 136.38576 79.12308) (end 136.426489 79.082351) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 129.046201 79.112055) (end 129.057226 79.12308) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 106.714591 79.12308) (end 121.335974 79.12308) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 105.456719 84.590665) (end 105.133555 84.267501) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 121.335974 79.12308) (end 121.346999 79.112055) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 129.057226 79.12308) (end 136.38576 79.12308) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 121.346999 79.112055) (end 129.046201 79.112055) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 105.133555 80.704116) (end 106.714591 79.12308) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 105.456719 96.77908) (end 105.456719 84.590665) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 136.426489 79.082351) (end 136.54786 78.96098) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 105.133555 84.267501) (end 105.133555 80.704116) (width 0.25) (layer F.Cu) (net 31)) (via (at 106.280883 100.073299) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 32)) - (segment (start 106.280883 100.073299) (end 106.280883 98.890675) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 106.933599 81.729131) (end 107.599877 81.062853) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 124.527565 81.017133) (end 124.632599 80.912099) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 106.933599 83.521901) (end 106.933599 81.729131) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 107.599877 81.062853) (end 121.941845 81.062853) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 121.941845 81.062853) (end 122.092599 80.912099) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 106.280883 98.890675) (end 108.0897 97.081858) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 123.325635 81.017133) (end 124.527565 81.017133) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 108.0897 97.081858) (end 108.0897 84.678002) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 108.0897 84.678002) (end 106.933599 83.521901) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 122.092599 80.912099) (end 123.220601 80.912099) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 123.220601 80.912099) (end 123.325635 81.017133) (width 0.25) (layer F.Cu) (net 32)) (via (at 139.192 81.2165) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 32)) (segment (start 139.23772 81.17078) (end 139.192 81.2165) (width 0.25) (layer B.Cu) (net 32)) (segment (start 139.23772 78.12532) (end 139.23772 81.17078) (width 0.25) (layer B.Cu) (net 32)) - (segment (start 139.496401 80.912099) (end 139.672459 80.912099) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 139.192 81.2165) (end 139.496401 80.912099) (width 0.25) (layer F.Cu) (net 32)) - (segment (start 124.632599 80.912099) (end 139.672459 80.912099) (width 0.25) (layer F.Cu) (net 32)) (segment (start 106.50914 100.58146) (end 106.280883 100.073299) (width 0.25) (layer B.Cu) (net 32)) (segment (start 106.50914 100.67308) (end 106.50914 100.58146) (width 0.25) (layer B.Cu) (net 32)) + (segment (start 128.311626 80.923124) (end 138.898624 80.923124) (width 0.25) (layer F.Cu) (net 32)) + (segment (start 128.300601 80.912099) (end 128.311626 80.923124) (width 0.25) (layer F.Cu) (net 32)) + (segment (start 138.898624 80.923124) (end 139.192 81.2165) (width 0.25) (layer F.Cu) (net 32)) + (segment (start 108.0897 97.081858) (end 108.0897 84.678002) (width 0.25) (layer F.Cu) (net 32)) + (segment (start 106.933599 81.729131) (end 107.739606 80.923124) (width 0.25) (layer F.Cu) (net 32)) + (segment (start 106.280883 100.073299) (end 106.280883 98.890675) (width 0.25) (layer F.Cu) (net 32)) + (segment (start 108.0897 84.678002) (end 106.933599 83.521901) (width 0.25) (layer F.Cu) (net 32)) + (segment (start 106.280883 98.890675) (end 108.0897 97.081858) (width 0.25) (layer F.Cu) (net 32)) + (segment (start 106.933599 83.521901) (end 106.933599 81.729131) (width 0.25) (layer F.Cu) (net 32)) + (segment (start 122.081574 80.923124) (end 122.092599 80.912099) (width 0.25) (layer F.Cu) (net 32)) + (segment (start 122.092599 80.912099) (end 128.300601 80.912099) (width 0.25) (layer F.Cu) (net 32)) + (segment (start 107.739606 80.923124) (end 122.081574 80.923124) (width 0.25) (layer F.Cu) (net 32)) (via (at 105.957969 106.19629) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 33)) - (segment (start 107.189678 85.050802) (end 106.033577 83.894701) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 105.10587 105.344191) (end 105.10587 98.792866) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 126.799799 80.012077) (end 126.812499 79.999377) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 106.033577 81.356333) (end 107.227079 80.162831) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 105.10587 98.792866) (end 107.189678 96.709058) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 105.957969 106.19629) (end 105.10587 105.344191) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 107.189678 96.709058) (end 107.189678 85.050802) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 107.227079 80.162831) (end 121.569045 80.162831) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 121.719799 80.012077) (end 123.593401 80.012077) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 121.569045 80.162831) (end 121.719799 80.012077) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 123.593401 80.012077) (end 123.698435 80.117111) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 123.698435 80.117111) (end 124.154765 80.117111) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 124.154765 80.117111) (end 124.259799 80.012077) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 106.033577 83.894701) (end 106.033577 81.356333) (width 0.25) (layer F.Cu) (net 33)) - (segment (start 124.259799 80.012077) (end 126.799799 80.012077) (width 0.25) (layer F.Cu) (net 33)) (segment (start 140.7033 79.80934) (end 140.893337 79.999377) (width 0.25) (layer B.Cu) (net 33)) (segment (start 140.7033 78.12786) (end 140.7033 79.80934) (width 0.25) (layer B.Cu) (net 33)) - (segment (start 126.812499 79.999377) (end 140.893337 79.999377) (width 0.25) (layer F.Cu) (net 33)) (via (at 140.893337 79.999377) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 33)) (segment (start 142.661084 79.889758) (end 161.8587 79.889758) (width 0.25) (layer F.Cu) (net 33)) (segment (start 140.893337 79.999377) (end 141.168327 80.274367) (width 0.25) (layer F.Cu) (net 33)) @@ -11111,6 +11098,19 @@ (segment (start 162.300899 79.447559) (end 163.163419 79.447559) (width 0.25) (layer F.Cu) (net 33)) (segment (start 106.25914 105.92308) (end 105.957969 106.19629) (width 0.25) (layer B.Cu) (net 33)) (segment (start 106.50914 105.6894) (end 106.25914 105.92308) (width 0.25) (layer B.Cu) (net 33)) + (segment (start 107.189678 96.709058) (end 107.189678 85.050802) (width 0.25) (layer F.Cu) (net 33)) + (segment (start 121.708774 80.023102) (end 121.719799 80.012077) (width 0.25) (layer F.Cu) (net 33)) + (segment (start 106.033577 81.356331) (end 107.366806 80.023102) (width 0.25) (layer F.Cu) (net 33)) + (segment (start 106.033577 83.894701) (end 106.033577 81.356331) (width 0.25) (layer F.Cu) (net 33)) + (segment (start 121.719799 80.012077) (end 128.673401 80.012077) (width 0.25) (layer F.Cu) (net 33)) + (segment (start 107.189678 85.050802) (end 106.033577 83.894701) (width 0.25) (layer F.Cu) (net 33)) + (segment (start 107.366806 80.023102) (end 121.708774 80.023102) (width 0.25) (layer F.Cu) (net 33)) + (segment (start 105.10587 105.344191) (end 105.10587 98.792866) (width 0.25) (layer F.Cu) (net 33)) + (segment (start 105.10587 98.792866) (end 107.189678 96.709058) (width 0.25) (layer F.Cu) (net 33)) + (segment (start 128.673401 80.012077) (end 128.684426 80.023102) (width 0.25) (layer F.Cu) (net 33)) + (segment (start 140.869612 80.023102) (end 140.893337 79.999377) (width 0.25) (layer F.Cu) (net 33)) + (segment (start 128.684426 80.023102) (end 140.869612 80.023102) (width 0.25) (layer F.Cu) (net 33)) + (segment (start 105.957969 106.19629) (end 105.10587 105.344191) (width 0.25) (layer F.Cu) (net 33)) (via (at 141.928474 79.549366) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 34)) (segment (start 142.16888 79.30896) (end 141.928474 79.549366) (width 0.25) (layer B.Cu) (net 34)) (segment (start 142.16888 78.12914) (end 142.16888 79.30896) (width 0.25) (layer B.Cu) (net 34)) @@ -11120,21 +11120,25 @@ (segment (start 167.386 78.71206) (end 166.77894 79.31912) (width 0.25) (layer B.Cu) (net 34)) (segment (start 166.424799 78.964979) (end 166.77894 79.31912) (width 0.25) (layer F.Cu) (net 34)) (segment (start 142.89942 79.268751) (end 143.070416 79.439747) (width 0.25) (layer F.Cu) (net 34)) - (segment (start 140.270346 79.549366) (end 140.550961 79.268751) (width 0.25) (layer F.Cu) (net 34)) - (segment (start 106.387687 84.885222) (end 105.583566 84.081101) (width 0.25) (layer F.Cu) (net 34)) - (segment (start 107.204134 79.549366) (end 140.270346 79.549366) (width 0.25) (layer F.Cu) (net 34)) - (segment (start 105.583566 81.169934) (end 107.204134 79.549366) (width 0.25) (layer F.Cu) (net 34)) (segment (start 143.070416 79.439747) (end 161.6723 79.439747) (width 0.25) (layer F.Cu) (net 34)) (segment (start 161.6723 79.439747) (end 162.147068 78.964979) (width 0.25) (layer F.Cu) (net 34)) - (segment (start 105.583566 84.081101) (end 105.583566 81.169934) (width 0.25) (layer F.Cu) (net 34)) (segment (start 162.147068 78.964979) (end 166.424799 78.964979) (width 0.25) (layer F.Cu) (net 34)) - (segment (start 106.387687 95.003692) (end 106.387687 84.885222) (width 0.25) (layer F.Cu) (net 34)) (segment (start 141.928474 79.330926) (end 141.990649 79.268751) (width 0.25) (layer F.Cu) (net 34)) (segment (start 141.928474 79.549366) (end 141.928474 79.330926) (width 0.25) (layer F.Cu) (net 34)) (segment (start 141.990649 79.268751) (end 142.89942 79.268751) (width 0.25) (layer F.Cu) (net 34)) - (segment (start 140.550961 79.268751) (end 141.990649 79.268751) (width 0.25) (layer F.Cu) (net 34)) (segment (start 106.50914 95.125145) (end 106.387687 95.003692) (width 0.25) (layer B.Cu) (net 34)) (segment (start 106.50914 95.50146) (end 106.50914 95.125145) (width 0.25) (layer B.Cu) (net 34)) + (segment (start 128.859801 79.562066) (end 128.870826 79.573091) (width 0.25) (layer F.Cu) (net 34)) + (segment (start 105.583566 81.169931) (end 107.180406 79.573091) (width 0.25) (layer F.Cu) (net 34)) + (segment (start 136.8765 79.268751) (end 141.990649 79.268751) (width 0.25) (layer F.Cu) (net 34)) + (segment (start 105.583566 84.081101) (end 105.583566 81.169931) (width 0.25) (layer F.Cu) (net 34)) + (segment (start 106.387687 95.003692) (end 106.387687 84.885222) (width 0.25) (layer F.Cu) (net 34)) + (segment (start 106.387687 84.885222) (end 105.583566 84.081101) (width 0.25) (layer F.Cu) (net 34)) + (segment (start 136.57216 79.573091) (end 136.8765 79.268751) (width 0.25) (layer F.Cu) (net 34)) + (segment (start 107.180406 79.573091) (end 121.522374 79.573091) (width 0.25) (layer F.Cu) (net 34)) + (segment (start 128.870826 79.573091) (end 136.57216 79.573091) (width 0.25) (layer F.Cu) (net 34)) + (segment (start 121.522374 79.573091) (end 121.533399 79.562066) (width 0.25) (layer F.Cu) (net 34)) + (segment (start 121.533399 79.562066) (end 128.859801 79.562066) (width 0.25) (layer F.Cu) (net 34)) (segment (start 101.0031 45.5117) (end 99.65946 45.5117) (width 0.25) (layer B.Cu) (net 35)) (segment (start 97.96018 47.21098) (end 97.96018 47.35448) (width 0.25) (layer B.Cu) (net 35)) (segment (start 99.65946 45.5117) (end 97.96018 47.21098) (width 0.25) (layer B.Cu) (net 35)) @@ -12187,31 +12191,27 @@ (segment (start 166.323033 75.338953) (end 167.386 76.40192) (width 0.25) (layer B.Cu) (net 169)) (via (at 105.9688 103.51913) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 170)) (via (at 162.651009 80.20955) (size 0.8) (drill 0.4) (layers F.Cu B.Cu) (net 170)) - (segment (start 121.755445 80.612842) (end 121.906199 80.462088) (width 0.25) (layer F.Cu) (net 170)) + (segment (start 164.43706 78.423499) (end 162.651009 80.20955) (width 0.25) (layer B.Cu) (net 170)) + (segment (start 164.43706 78.22438) (end 164.43706 78.423499) (width 0.25) (layer B.Cu) (net 170)) + (segment (start 106.25914 103.30323) (end 105.9688 103.51913) (width 0.25) (layer B.Cu) (net 170)) + (segment (start 106.50914 103.17308) (end 106.25914 103.30323) (width 0.25) (layer B.Cu) (net 170)) + (segment (start 142.462875 80.724378) (end 142.847484 80.339769) (width 0.25) (layer F.Cu) (net 170)) (segment (start 105.9688 103.51913) (end 105.555881 103.106211) (width 0.25) (layer F.Cu) (net 170)) (segment (start 107.639689 96.895458) (end 107.639689 84.864402) (width 0.25) (layer F.Cu) (net 170)) + (segment (start 106.483588 83.708301) (end 106.483588 81.542731) (width 0.25) (layer F.Cu) (net 170)) + (segment (start 107.553206 80.473113) (end 121.895174 80.473113) (width 0.25) (layer F.Cu) (net 170)) + (segment (start 106.483588 81.542731) (end 107.553206 80.473113) (width 0.25) (layer F.Cu) (net 170)) (segment (start 107.639689 84.864402) (end 106.483588 83.708301) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 124.446199 80.462088) (end 126.986199 80.462088) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 140.545336 80.724378) (end 142.462875 80.724378) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 106.483588 83.708301) (end 106.483588 81.542732) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 106.483588 81.542732) (end 107.413478 80.612842) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 124.341165 80.567122) (end 124.446199 80.462088) (width 0.25) (layer F.Cu) (net 170)) + (segment (start 128.487001 80.462088) (end 128.498026 80.473113) (width 0.25) (layer F.Cu) (net 170)) (segment (start 105.555881 103.106211) (end 105.555881 98.979266) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 126.986199 80.462088) (end 126.998899 80.449388) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 140.270346 80.449388) (end 140.545336 80.724378) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 164.43706 78.423499) (end 162.651009 80.20955) (width 0.25) (layer B.Cu) (net 170)) - (segment (start 126.998899 80.449388) (end 140.270346 80.449388) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 105.555881 98.979266) (end 107.639689 96.895458) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 142.462875 80.724378) (end 142.847484 80.339769) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 164.43706 78.22438) (end 164.43706 78.423499) (width 0.25) (layer B.Cu) (net 170)) - (segment (start 123.512035 80.567122) (end 124.341165 80.567122) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 121.906199 80.462088) (end 123.407001 80.462088) (width 0.25) (layer F.Cu) (net 170)) + (segment (start 140.294071 80.473113) (end 140.545336 80.724378) (width 0.25) (layer F.Cu) (net 170)) + (segment (start 140.545336 80.724378) (end 142.462875 80.724378) (width 0.25) (layer F.Cu) (net 170)) + (segment (start 128.498026 80.473113) (end 140.294071 80.473113) (width 0.25) (layer F.Cu) (net 170)) (segment (start 162.52079 80.339769) (end 162.651009 80.20955) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 123.407001 80.462088) (end 123.512035 80.567122) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 107.413478 80.612842) (end 121.755445 80.612842) (width 0.25) (layer F.Cu) (net 170)) (segment (start 142.847484 80.339769) (end 162.52079 80.339769) (width 0.25) (layer F.Cu) (net 170)) - (segment (start 106.25914 103.30323) (end 105.9688 103.51913) (width 0.25) (layer B.Cu) (net 170)) - (segment (start 106.50914 103.17308) (end 106.25914 103.30323) (width 0.25) (layer B.Cu) (net 170)) + (segment (start 121.906199 80.462088) (end 128.487001 80.462088) (width 0.25) (layer F.Cu) (net 170)) + (segment (start 121.895174 80.473113) (end 121.906199 80.462088) (width 0.25) (layer F.Cu) (net 170)) + (segment (start 105.555881 98.979266) (end 107.639689 96.895458) (width 0.25) (layer F.Cu) (net 170)) (segment (start 168.88816 64.34182) (end 167.183642 64.34182) (width 0.25) (layer B.Cu) (net 171)) (segment (start 163.412579 65.5208) (end 163.412579 71.021209) (width 0.25) (layer B.Cu) (net 171)) (segment (start 164.758797 64.174581) (end 163.412579 65.5208) (width 0.25) (layer B.Cu) (net 171)) @@ -18289,8 +18289,7 @@ (xy 110.360581 88.817301) (xy 110.084853 88.914981) (xy 109.947443 88.988428) (xy 109.869808 89.237503) (xy 108.5917 89.237503) (xy 108.5917 84.702645) (xy 108.594127 84.678002) (xy 108.591902 84.655413) (xy 108.929675 84.612625) (xy 109.281862 84.494994) (xy 109.516686 84.369477) (xy 109.6426 84.079505) (xy 108.5086 82.945505) (xy 108.494458 82.959648) (xy 108.314853 82.780043) - (xy 108.328995 82.7659) (xy 108.314853 82.751758) (xy 108.494458 82.572153) (xy 108.5086 82.586295) (xy 108.522743 82.572153) - (xy 108.702348 82.751758) (xy 108.688205 82.7659) (xy 109.822205 83.8999) (xy 110.112177 83.773986) (xy 110.278033 83.441774) + (xy 108.328995 82.7659) (xy 108.688205 82.7659) (xy 109.822205 83.8999) (xy 110.112177 83.773986) (xy 110.278033 83.441774) (xy 110.37589 83.083588) (xy 110.376862 83.0698) (xy 110.404624 83.111349) (xy 110.512851 83.219576) (xy 110.640112 83.304609) (xy 110.781517 83.363181) (xy 110.931632 83.39304) (xy 111.084688 83.39304) (xy 111.234803 83.363181) (xy 111.376208 83.304609) (xy 111.503469 83.219576) (xy 111.605005 83.11804) (xy 113.832986 83.11804) (xy 118.22454 87.509595) (xy 118.22454 87.653188) @@ -18301,914 +18300,915 @@ (xy 119.369588 86.888091) (xy 119.228183 86.829519) (xy 119.078068 86.79966) (xy 118.934475 86.79966) (xy 116.21432 84.079505) (xy 116.8746 84.079505) (xy 117.000514 84.369477) (xy 117.332726 84.535333) (xy 117.690912 84.63319) (xy 118.061306 84.659289) (xy 118.429675 84.612625) (xy 118.781862 84.494994) (xy 119.016686 84.369477) (xy 119.1426 84.079505) (xy 118.0086 82.945505) - (xy 116.8746 84.079505) (xy 116.21432 84.079505) (xy 114.413322 82.278508) (xy 114.397604 82.259356) (xy 114.321165 82.196623) - (xy 114.233956 82.150009) (xy 114.139329 82.121304) (xy 114.065573 82.11404) (xy 114.065563 82.11404) (xy 114.04092 82.111613) - (xy 114.016277 82.11404) (xy 111.605005 82.11404) (xy 111.503469 82.012504) (xy 111.376208 81.927471) (xy 111.234803 81.868899) - (xy 111.084688 81.83904) (xy 110.931632 81.83904) (xy 110.781517 81.868899) (xy 110.640112 81.927471) (xy 110.512851 82.012504) - (xy 110.404624 82.120731) (xy 110.321852 82.244608) (xy 110.237694 81.992638) (xy 110.112177 81.757814) (xy 109.822207 81.631901) - (xy 109.889255 81.564853) (xy 116.627945 81.564853) (xy 116.694993 81.631901) (xy 116.405023 81.757814) (xy 116.239167 82.090026) - (xy 116.14131 82.448212) (xy 116.115211 82.818606) (xy 116.161875 83.186975) (xy 116.279506 83.539162) (xy 116.405023 83.773986) - (xy 116.694995 83.8999) (xy 117.828995 82.7659) (xy 117.814853 82.751758) (xy 117.994458 82.572153) (xy 118.0086 82.586295) - (xy 118.022743 82.572153) (xy 118.202348 82.751758) (xy 118.188205 82.7659) (xy 119.322205 83.8999) (xy 119.612177 83.773986) - (xy 119.778033 83.441774) (xy 119.867172 83.115497) (xy 121.807808 83.115497) (xy 121.885443 83.364572) (xy 122.149483 83.490471) - (xy 122.433011 83.562439) (xy 122.725131 83.577711) (xy 123.014619 83.535699) (xy 123.290347 83.438019) (xy 123.427757 83.364572) - (xy 123.505392 83.115497) (xy 122.6566 82.266705) (xy 121.807808 83.115497) (xy 119.867172 83.115497) (xy 119.87589 83.083588) - (xy 119.901989 82.713194) (xy 119.855325 82.344825) (xy 119.737694 81.992638) (xy 119.612177 81.757814) (xy 119.322207 81.631901) - (xy 119.389255 81.564853) (xy 121.260443 81.564853) (xy 121.253229 81.579983) (xy 121.181261 81.863511) (xy 121.165989 82.155631) - (xy 121.208001 82.445119) (xy 121.305681 82.720847) (xy 121.379128 82.858257) (xy 121.628203 82.935892) (xy 122.476995 82.0871) - (xy 122.462853 82.072958) (xy 122.642458 81.893353) (xy 122.6566 81.907495) (xy 122.670743 81.893353) (xy 122.850348 82.072958) - (xy 122.836205 82.0871) (xy 123.684997 82.935892) (xy 123.934072 82.858257) (xy 124.059971 82.594217) (xy 124.067034 82.566391) - (xy 124.109247 82.668302) (xy 124.243527 82.869267) (xy 124.414433 83.040173) (xy 124.615398 83.174453) (xy 124.838697 83.266947) - (xy 125.075751 83.3141) (xy 125.317449 83.3141) (xy 125.554503 83.266947) (xy 125.777802 83.174453) (xy 125.978767 83.040173) - (xy 126.149673 82.869267) (xy 126.283953 82.668302) (xy 126.376447 82.445003) (xy 126.4236 82.207949) (xy 126.4236 81.966251) - (xy 126.376447 81.729197) (xy 126.283953 81.505898) (xy 126.222615 81.414099) (xy 126.710585 81.414099) (xy 126.649247 81.505898) - (xy 126.556753 81.729197) (xy 126.5096 81.966251) (xy 126.5096 82.207949) (xy 126.556753 82.445003) (xy 126.649247 82.668302) - (xy 126.783527 82.869267) (xy 126.954433 83.040173) (xy 127.109601 83.143852) (xy 127.1096 88.233888) (xy 126.884512 88.458976) - (xy 126.0869 88.458976) (xy 126.012995 88.466255) (xy 125.94193 88.487812) (xy 125.876437 88.522819) (xy 125.819031 88.569931) - (xy 125.771919 88.627337) (xy 125.736912 88.69283) (xy 125.715355 88.763895) (xy 125.708076 88.8378) (xy 125.708076 90.5878) - (xy 125.715355 90.661705) (xy 125.736912 90.73277) (xy 125.771919 90.798263) (xy 125.819031 90.855669) (xy 125.876437 90.902781) - (xy 125.94193 90.937788) (xy 126.012995 90.959345) (xy 126.0869 90.966624) (xy 127.8369 90.966624) (xy 127.910805 90.959345) - (xy 127.98187 90.937788) (xy 128.047363 90.902781) (xy 128.104769 90.855669) (xy 128.151881 90.798263) (xy 128.186888 90.73277) - (xy 128.208445 90.661705) (xy 128.215724 90.5878) (xy 128.215724 89.859435) (xy 130.356467 92.000179) (xy 130.3761 92.024102) - (xy 130.471573 92.102454) (xy 130.580498 92.160676) (xy 130.662835 92.185652) (xy 130.698687 92.196528) (xy 130.8216 92.208634) - (xy 130.852394 92.205601) (xy 138.392065 92.205601) (xy 138.422859 92.208634) (xy 138.453653 92.205601) (xy 138.545772 92.196528) - (xy 138.663962 92.160676) (xy 138.772887 92.102454) (xy 138.86836 92.024102) (xy 138.887997 92.000174) (xy 139.418979 91.469193) - (xy 139.602011 91.5056) (xy 139.843709 91.5056) (xy 140.080763 91.458447) (xy 140.304062 91.365953) (xy 140.505027 91.231673) - (xy 140.675933 91.060767) (xy 140.779612 90.9056) (xy 143.990227 90.9056) (xy 144.082372 90.967169) (xy 144.223777 91.025741) - (xy 144.373892 91.0556) (xy 144.526948 91.0556) (xy 144.677063 91.025741) (xy 144.818468 90.967169) (xy 144.910613 90.9056) - (xy 145.232109 90.9056) (xy 146.185542 91.859033) (xy 146.205179 91.882961) (xy 146.300651 91.961312) (xy 146.300652 91.961313) - (xy 146.409576 92.019535) (xy 146.527767 92.055387) (xy 146.65068 92.067493) (xy 146.681474 92.06446) (xy 149.158646 92.06446) - (xy 149.18944 92.067493) (xy 149.220234 92.06446) (xy 149.312353 92.055387) (xy 149.430543 92.019535) (xy 149.539468 91.961313) - (xy 149.634941 91.882961) (xy 149.654578 91.859033) (xy 150.196454 91.317157) (xy 157.761508 91.317157) (xy 157.839143 91.566232) - (xy 158.103183 91.692131) (xy 158.386711 91.764099) (xy 158.678831 91.779371) (xy 158.968319 91.737359) (xy 159.244047 91.639679) - (xy 159.381457 91.566232) (xy 159.459092 91.317157) (xy 158.6103 90.468365) (xy 157.761508 91.317157) (xy 150.196454 91.317157) - (xy 150.544448 90.969164) (xy 151.78656 90.969164) (xy 151.860465 90.961885) (xy 151.93153 90.940328) (xy 151.997023 90.905321) - (xy 152.054429 90.858209) (xy 152.101541 90.800803) (xy 152.136548 90.73531) (xy 152.158105 90.664245) (xy 152.165384 90.59034) - (xy 152.165384 90.34234) (xy 152.255766 90.34234) (xy 152.28656 90.345373) (xy 152.317354 90.34234) (xy 152.409473 90.333267) - (xy 152.527663 90.297415) (xy 152.636588 90.239193) (xy 152.732061 90.160841) (xy 152.751698 90.136913) (xy 153.40696 89.481652) - (xy 157.448169 89.481652) (xy 157.332828 89.517603) (xy 157.206929 89.781643) (xy 157.134961 90.065171) (xy 157.119689 90.357291) - (xy 157.161701 90.646779) (xy 157.259381 90.922507) (xy 157.332828 91.059917) (xy 157.581903 91.137552) (xy 158.430695 90.28876) - (xy 158.416553 90.274618) (xy 158.596158 90.095013) (xy 158.6103 90.109155) (xy 158.624443 90.095013) (xy 158.804048 90.274618) - (xy 158.789905 90.28876) (xy 159.638697 91.137552) (xy 159.887772 91.059917) (xy 160.013671 90.795877) (xy 160.020734 90.768051) - (xy 160.062947 90.869962) (xy 160.197227 91.070927) (xy 160.368133 91.241833) (xy 160.569098 91.376113) (xy 160.792397 91.468607) - (xy 161.029451 91.51576) (xy 161.271149 91.51576) (xy 161.508203 91.468607) (xy 161.731502 91.376113) (xy 161.932467 91.241833) - (xy 162.103373 91.070927) (xy 162.237653 90.869962) (xy 162.330147 90.646663) (xy 162.3773 90.409609) (xy 162.3773 90.167911) - (xy 162.330147 89.930857) (xy 162.248448 89.733619) (xy 162.499707 89.984879) (xy 162.4633 90.167911) (xy 162.4633 90.409609) - (xy 162.510453 90.646663) (xy 162.602947 90.869962) (xy 162.737227 91.070927) (xy 162.908133 91.241833) (xy 163.109098 91.376113) - (xy 163.332397 91.468607) (xy 163.569451 91.51576) (xy 163.811149 91.51576) (xy 163.991493 91.479887) (xy 163.99638 91.485842) - (xy 164.091853 91.564194) (xy 164.200778 91.622416) (xy 164.318968 91.658268) (xy 164.44188 91.670374) (xy 164.472674 91.667341) - (xy 172.153285 91.667341) (xy 172.184079 91.670374) (xy 172.214873 91.667341) (xy 172.306992 91.658268) (xy 172.425182 91.622416) - (xy 172.534107 91.564194) (xy 172.62958 91.485842) (xy 172.649217 91.461914) (xy 172.821914 91.289217) (xy 181.718788 91.289217) - (xy 181.796423 91.538292) (xy 182.060463 91.664191) (xy 182.343991 91.736159) (xy 182.636111 91.751431) (xy 182.925599 91.709419) - (xy 183.201327 91.611739) (xy 183.338737 91.538292) (xy 183.416372 91.289217) (xy 182.56758 90.440425) (xy 181.718788 91.289217) - (xy 172.821914 91.289217) (xy 173.630256 90.480876) (xy 173.630256 90.59034) (xy 173.637535 90.664245) (xy 173.659092 90.73531) - (xy 173.694099 90.800803) (xy 173.741211 90.858209) (xy 173.798617 90.905321) (xy 173.86411 90.940328) (xy 173.935175 90.961885) - (xy 174.00908 90.969164) (xy 175.75908 90.969164) (xy 175.832985 90.961885) (xy 175.90405 90.940328) (xy 175.969543 90.905321) - (xy 176.026949 90.858209) (xy 176.074061 90.800803) (xy 176.109068 90.73531) (xy 176.130625 90.664245) (xy 176.137904 90.59034) - (xy 176.137904 90.329351) (xy 181.076969 90.329351) (xy 181.118981 90.618839) (xy 181.216661 90.894567) (xy 181.290108 91.031977) - (xy 181.539183 91.109612) (xy 182.387975 90.26082) (xy 182.747185 90.26082) (xy 183.595977 91.109612) (xy 183.845052 91.031977) - (xy 183.970951 90.767937) (xy 183.978014 90.740111) (xy 184.020227 90.842022) (xy 184.154507 91.042987) (xy 184.325413 91.213893) - (xy 184.526378 91.348173) (xy 184.749677 91.440667) (xy 184.986731 91.48782) (xy 185.228429 91.48782) (xy 185.465483 91.440667) - (xy 185.688782 91.348173) (xy 185.889747 91.213893) (xy 186.060653 91.042987) (xy 186.194933 90.842022) (xy 186.287427 90.618723) - (xy 186.33458 90.381669) (xy 186.33458 90.139971) (xy 186.42058 90.139971) (xy 186.42058 90.381669) (xy 186.467733 90.618723) - (xy 186.560227 90.842022) (xy 186.694507 91.042987) (xy 186.865413 91.213893) (xy 187.066378 91.348173) (xy 187.289677 91.440667) - (xy 187.526731 91.48782) (xy 187.768429 91.48782) (xy 187.951461 91.451413) (xy 187.969587 91.469539) (xy 187.98922 91.493462) - (xy 188.084693 91.571814) (xy 188.193618 91.630036) (xy 188.311808 91.665888) (xy 188.403927 91.674961) (xy 188.403928 91.674961) - (xy 188.43472 91.677994) (xy 188.465512 91.674961) (xy 197.483025 91.674961) (xy 197.513819 91.677994) (xy 197.544613 91.674961) - (xy 197.636732 91.665888) (xy 197.754922 91.630036) (xy 197.863847 91.571814) (xy 197.95932 91.493462) (xy 197.978957 91.469534) - (xy 198.471707 90.976784) (xy 199.71382 90.976784) (xy 199.787725 90.969505) (xy 199.85879 90.947948) (xy 199.924283 90.912941) - (xy 199.981689 90.865829) (xy 200.028801 90.808423) (xy 200.063808 90.74293) (xy 200.085365 90.671865) (xy 200.092644 90.59796) - (xy 200.092644 88.84796) (xy 200.085365 88.774055) (xy 200.063808 88.70299) (xy 200.028801 88.637497) (xy 199.981689 88.580091) - (xy 199.924283 88.532979) (xy 199.85879 88.497972) (xy 199.787725 88.476415) (xy 199.71382 88.469136) (xy 197.96382 88.469136) - (xy 197.889915 88.476415) (xy 197.81885 88.497972) (xy 197.753357 88.532979) (xy 197.695951 88.580091) (xy 197.648839 88.637497) - (xy 197.613832 88.70299) (xy 197.592275 88.774055) (xy 197.584996 88.84796) (xy 197.584996 90.090073) (xy 197.254108 90.420961) - (xy 196.378198 90.420961) (xy 196.448328 90.316004) (xy 196.542706 90.088155) (xy 196.59082 89.846271) (xy 196.59082 89.599649) - (xy 196.542706 89.357765) (xy 196.448328 89.129916) (xy 196.311312 88.924856) (xy 196.136924 88.750468) (xy 195.931864 88.613452) - (xy 195.704015 88.519074) (xy 195.462131 88.47096) (xy 195.215509 88.47096) (xy 194.973625 88.519074) (xy 194.745776 88.613452) - (xy 194.540716 88.750468) (xy 194.366328 88.924856) (xy 194.229312 89.129916) (xy 194.134934 89.357765) (xy 194.08682 89.599649) - (xy 194.08682 89.846271) (xy 194.134934 90.088155) (xy 194.229312 90.316004) (xy 194.299442 90.420961) (xy 188.866764 90.420961) - (xy 188.87458 90.381669) (xy 188.87458 90.139971) (xy 188.827427 89.902917) (xy 188.734933 89.679618) (xy 188.600653 89.478653) - (xy 188.429747 89.307747) (xy 188.228782 89.173467) (xy 188.005483 89.080973) (xy 187.768429 89.03382) (xy 187.526731 89.03382) - (xy 187.289677 89.080973) (xy 187.066378 89.173467) (xy 186.865413 89.307747) (xy 186.694507 89.478653) (xy 186.560227 89.679618) - (xy 186.467733 89.902917) (xy 186.42058 90.139971) (xy 186.33458 90.139971) (xy 186.287427 89.902917) (xy 186.194933 89.679618) - (xy 186.060653 89.478653) (xy 185.889747 89.307747) (xy 185.688782 89.173467) (xy 185.465483 89.080973) (xy 185.228429 89.03382) - (xy 184.986731 89.03382) (xy 184.749677 89.080973) (xy 184.526378 89.173467) (xy 184.325413 89.307747) (xy 184.154507 89.478653) - (xy 184.020227 89.679618) (xy 183.975428 89.787771) (xy 183.918499 89.627073) (xy 183.845052 89.489663) (xy 183.595977 89.412028) - (xy 182.747185 90.26082) (xy 182.387975 90.26082) (xy 181.539183 89.412028) (xy 181.290108 89.489663) (xy 181.164209 89.753703) - (xy 181.092241 90.037231) (xy 181.076969 90.329351) (xy 176.137904 90.329351) (xy 176.137904 89.232423) (xy 181.718788 89.232423) - (xy 182.56758 90.081215) (xy 183.416372 89.232423) (xy 183.338737 88.983348) (xy 183.074697 88.857449) (xy 182.791169 88.785481) - (xy 182.499049 88.770209) (xy 182.209561 88.812221) (xy 181.933833 88.909901) (xy 181.796423 88.983348) (xy 181.718788 89.232423) - (xy 176.137904 89.232423) (xy 176.137904 88.84034) (xy 176.130625 88.766435) (xy 176.109068 88.69537) (xy 176.074061 88.629877) - (xy 176.026949 88.572471) (xy 175.969543 88.525359) (xy 175.90405 88.490352) (xy 175.832985 88.468795) (xy 175.75908 88.461516) - (xy 174.00908 88.461516) (xy 173.935175 88.468795) (xy 173.86411 88.490352) (xy 173.798617 88.525359) (xy 173.741211 88.572471) - (xy 173.694099 88.629877) (xy 173.659092 88.69537) (xy 173.637535 88.766435) (xy 173.630256 88.84034) (xy 173.630256 89.08834) - (xy 173.539871 89.08834) (xy 173.509079 89.085307) (xy 173.478287 89.08834) (xy 173.478286 89.08834) (xy 173.386167 89.097413) - (xy 173.267977 89.133265) (xy 173.159052 89.191487) (xy 173.063579 89.269839) (xy 173.043949 89.293759) (xy 172.63608 89.701628) - (xy 172.63608 89.592029) (xy 172.587966 89.350145) (xy 172.550254 89.2591) (xy 174.152335 87.65702) (xy 185.755335 87.65702) - (xy 185.856871 87.758556) (xy 185.984132 87.843589) (xy 186.125537 87.902161) (xy 186.275652 87.93202) (xy 186.428708 87.93202) - (xy 186.578823 87.902161) (xy 186.720228 87.843589) (xy 186.847489 87.758556) (xy 186.955716 87.650329) (xy 187.040749 87.523068) - (xy 187.099321 87.381663) (xy 187.12918 87.231548) (xy 187.12918 87.078492) (xy 187.099321 86.928377) (xy 187.040749 86.786972) - (xy 186.955716 86.659711) (xy 186.847489 86.551484) (xy 186.720228 86.466451) (xy 186.578823 86.407879) (xy 186.428708 86.37802) - (xy 186.275652 86.37802) (xy 186.125537 86.407879) (xy 185.984132 86.466451) (xy 185.856871 86.551484) (xy 185.755335 86.65302) - (xy 173.969042 86.65302) (xy 173.944399 86.650593) (xy 173.919756 86.65302) (xy 173.919747 86.65302) (xy 173.845991 86.660284) - (xy 173.751364 86.688989) (xy 173.664155 86.735603) (xy 173.587716 86.798336) (xy 173.572003 86.817482) (xy 171.84032 88.549166) - (xy 171.749275 88.511454) (xy 171.507391 88.46334) (xy 171.260769 88.46334) (xy 171.018885 88.511454) (xy 170.791036 88.605832) - (xy 170.585976 88.742848) (xy 170.411588 88.917236) (xy 170.274572 89.122296) (xy 170.180194 89.350145) (xy 170.13208 89.592029) - (xy 170.13208 89.838651) (xy 170.180194 90.080535) (xy 170.274572 90.308384) (xy 170.344702 90.413341) (xy 164.916558 90.413341) - (xy 164.9173 90.409609) (xy 164.9173 90.167911) (xy 164.870147 89.930857) (xy 164.777653 89.707558) (xy 164.643373 89.506593) - (xy 164.472467 89.335687) (xy 164.271502 89.201407) (xy 164.048203 89.108913) (xy 163.811149 89.06176) (xy 163.569451 89.06176) - (xy 163.386419 89.098167) (xy 162.72641 88.438159) (xy 162.706773 88.414231) (xy 162.6113 88.335879) (xy 162.502375 88.277657) - (xy 162.384185 88.241805) (xy 162.292066 88.232732) (xy 162.261272 88.229699) (xy 162.230478 88.232732) (xy 160.030281 88.232732) - (xy 160.039439 88.219026) (xy 160.098011 88.077621) (xy 160.12787 87.927506) (xy 160.12787 87.77445) (xy 160.098011 87.624335) - (xy 160.039439 87.48293) (xy 159.954406 87.355669) (xy 159.846179 87.247442) (xy 159.718918 87.162409) (xy 159.577513 87.103837) - (xy 159.427398 87.073978) (xy 159.274342 87.073978) (xy 159.124227 87.103837) (xy 158.982822 87.162409) (xy 158.855561 87.247442) - (xy 158.754025 87.348978) (xy 149.300564 87.348978) (xy 149.275921 87.346551) (xy 149.251278 87.348978) (xy 149.251269 87.348978) - (xy 149.177513 87.356242) (xy 149.082886 87.384947) (xy 148.995677 87.431561) (xy 148.919238 87.494294) (xy 148.903525 87.51344) - (xy 147.8678 88.549166) (xy 147.776755 88.511454) (xy 147.534871 88.46334) (xy 147.288249 88.46334) (xy 147.046365 88.511454) - (xy 146.818516 88.605832) (xy 146.613456 88.742848) (xy 146.439068 88.917236) (xy 146.302052 89.122296) (xy 146.207674 89.350145) - (xy 146.15956 89.592029) (xy 146.15956 89.838651) (xy 146.207674 90.080535) (xy 146.226913 90.126982) (xy 145.956958 89.857027) - (xy 145.937321 89.833099) (xy 145.841848 89.754747) (xy 145.732923 89.696525) (xy 145.614733 89.660673) (xy 145.522614 89.6516) - (xy 145.49182 89.648567) (xy 145.461026 89.6516) (xy 144.910613 89.6516) (xy 144.818468 89.590031) (xy 144.677063 89.531459) - (xy 144.526948 89.5016) (xy 144.373892 89.5016) (xy 144.223777 89.531459) (xy 144.082372 89.590031) (xy 143.990227 89.6516) - (xy 140.779612 89.6516) (xy 140.675933 89.496433) (xy 140.505027 89.325527) (xy 140.304062 89.191247) (xy 140.080763 89.098753) - (xy 139.843709 89.0516) (xy 139.602011 89.0516) (xy 139.364957 89.098753) (xy 139.141658 89.191247) (xy 138.940693 89.325527) - (xy 138.769787 89.496433) (xy 138.635507 89.697398) (xy 138.543013 89.920697) (xy 138.49586 90.157751) (xy 138.49586 90.399449) - (xy 138.532267 90.582481) (xy 138.281008 90.833741) (xy 138.362707 90.636503) (xy 138.40986 90.399449) (xy 138.40986 90.157751) - (xy 138.362707 89.920697) (xy 138.3299 89.841494) (xy 140.482522 87.688874) (xy 145.935568 87.688874) (xy 146.037104 87.79041) - (xy 146.164365 87.875443) (xy 146.30577 87.934015) (xy 146.455885 87.963874) (xy 146.608941 87.963874) (xy 146.759056 87.934015) - (xy 146.900461 87.875443) (xy 147.027722 87.79041) (xy 147.135949 87.682183) (xy 147.220982 87.554922) (xy 147.279554 87.413517) - (xy 147.309413 87.263402) (xy 147.309413 87.110346) (xy 147.279554 86.960231) (xy 147.220982 86.818826) (xy 147.135949 86.691565) - (xy 147.027722 86.583338) (xy 146.900461 86.498305) (xy 146.759056 86.439733) (xy 146.608941 86.409874) (xy 146.455885 86.409874) - (xy 146.30577 86.439733) (xy 146.164365 86.498305) (xy 146.037104 86.583338) (xy 145.935568 86.684874) (xy 140.299229 86.684874) - (xy 140.274586 86.682447) (xy 140.249943 86.684874) (xy 140.249933 86.684874) (xy 140.176177 86.692138) (xy 140.08155 86.720843) - (xy 139.994341 86.767457) (xy 139.994339 86.767458) (xy 139.99434 86.767458) (xy 139.93705 86.814474) (xy 139.937042 86.814482) - (xy 139.917902 86.83019) (xy 139.902193 86.849331) (xy 137.619966 89.13156) (xy 137.540763 89.098753) (xy 137.303709 89.0516) - (xy 137.062011 89.0516) (xy 136.824957 89.098753) (xy 136.601658 89.191247) (xy 136.400693 89.325527) (xy 136.229787 89.496433) - (xy 136.095507 89.697398) (xy 136.050708 89.805551) (xy 135.993779 89.644853) (xy 135.920332 89.507443) (xy 135.671257 89.429808) - (xy 134.822465 90.2786) (xy 134.836608 90.292743) (xy 134.657003 90.472348) (xy 134.64286 90.458205) (xy 134.628718 90.472348) - (xy 134.449113 90.292743) (xy 134.463255 90.2786) (xy 133.614463 89.429808) (xy 133.365388 89.507443) (xy 133.239489 89.771483) - (xy 133.167521 90.055011) (xy 133.152249 90.347131) (xy 133.194261 90.636619) (xy 133.291941 90.912347) (xy 133.312923 90.951601) - (xy 131.081313 90.951601) (xy 129.379915 89.250203) (xy 133.794068 89.250203) (xy 134.64286 90.098995) (xy 135.491652 89.250203) - (xy 135.414017 89.001128) (xy 135.149977 88.875229) (xy 134.866449 88.803261) (xy 134.574329 88.787989) (xy 134.284841 88.830001) - (xy 134.009113 88.927681) (xy 133.871703 89.001128) (xy 133.794068 89.250203) (xy 129.379915 89.250203) (xy 128.3636 88.233889) - (xy 128.3636 84.813831) (xy 135.230859 84.813831) (xy 135.230859 84.966887) (xy 135.260718 85.117002) (xy 135.31929 85.258407) - (xy 135.404323 85.385668) (xy 135.51255 85.493895) (xy 135.639811 85.578928) (xy 135.781216 85.6375) (xy 135.931331 85.667359) - (xy 136.084387 85.667359) (xy 136.234502 85.6375) (xy 136.375907 85.578928) (xy 136.503168 85.493895) (xy 136.611395 85.385668) - (xy 136.696428 85.258407) (xy 136.755 85.117002) (xy 136.784859 84.966887) (xy 136.784859 84.813831) (xy 136.755 84.663716) - (xy 136.696428 84.522311) (xy 136.611395 84.39505) (xy 136.509859 84.293514) (xy 136.509859 84.092205) (xy 140.79886 84.092205) - (xy 140.924774 84.382177) (xy 141.256986 84.548033) (xy 141.615172 84.64589) (xy 141.985566 84.671989) (xy 142.353935 84.625325) - (xy 142.706122 84.507694) (xy 142.940946 84.382177) (xy 143.062448 84.102365) (xy 155.2663 84.102365) (xy 155.392214 84.392337) - (xy 155.724426 84.558193) (xy 156.082612 84.65605) (xy 156.453006 84.682149) (xy 156.821375 84.635485) (xy 157.173562 84.517854) - (xy 157.408386 84.392337) (xy 157.5343 84.102365) (xy 164.7663 84.102365) (xy 164.892214 84.392337) (xy 165.224426 84.558193) - (xy 165.582612 84.65605) (xy 165.953006 84.682149) (xy 166.321375 84.635485) (xy 166.673562 84.517854) (xy 166.908386 84.392337) - (xy 167.0343 84.102365) (xy 167.00636 84.074425) (xy 179.22358 84.074425) (xy 179.349494 84.364397) (xy 179.681706 84.530253) - (xy 180.039892 84.62811) (xy 180.410286 84.654209) (xy 180.778655 84.607545) (xy 181.130842 84.489914) (xy 181.365666 84.364397) - (xy 181.49158 84.074425) (xy 188.72358 84.074425) (xy 188.849494 84.364397) (xy 189.181706 84.530253) (xy 189.539892 84.62811) - (xy 189.910286 84.654209) (xy 190.278655 84.607545) (xy 190.630842 84.489914) (xy 190.865666 84.364397) (xy 190.99158 84.074425) - (xy 189.85758 82.940425) (xy 188.72358 84.074425) (xy 181.49158 84.074425) (xy 180.35758 82.940425) (xy 179.22358 84.074425) - (xy 167.00636 84.074425) (xy 165.9003 82.968365) (xy 164.7663 84.102365) (xy 157.5343 84.102365) (xy 156.4003 82.968365) - (xy 155.2663 84.102365) (xy 143.062448 84.102365) (xy 143.06686 84.092205) (xy 141.93286 82.958205) (xy 140.79886 84.092205) - (xy 136.509859 84.092205) (xy 136.509859 83.950715) (xy 137.412975 83.0476) (xy 137.556568 83.0476) (xy 137.706683 83.017741) - (xy 137.848088 82.959169) (xy 137.975349 82.874136) (xy 138.018179 82.831306) (xy 140.039471 82.831306) (xy 140.086135 83.199675) - (xy 140.203766 83.551862) (xy 140.329283 83.786686) (xy 140.619255 83.9126) (xy 141.753255 82.7786) (xy 142.112465 82.7786) - (xy 143.246465 83.9126) (xy 143.536437 83.786686) (xy 143.702293 83.454474) (xy 143.798371 83.102797) (xy 145.760008 83.102797) - (xy 145.837643 83.351872) (xy 146.101683 83.477771) (xy 146.385211 83.549739) (xy 146.677331 83.565011) (xy 146.966819 83.522999) - (xy 147.242547 83.425319) (xy 147.379957 83.351872) (xy 147.457592 83.102797) (xy 146.6088 82.254005) (xy 145.760008 83.102797) - (xy 143.798371 83.102797) (xy 143.80015 83.096288) (xy 143.826249 82.725894) (xy 143.779585 82.357525) (xy 143.707911 82.142931) - (xy 145.118189 82.142931) (xy 145.160201 82.432419) (xy 145.257881 82.708147) (xy 145.331328 82.845557) (xy 145.580403 82.923192) - (xy 146.429195 82.0744) (xy 146.788405 82.0744) (xy 147.637197 82.923192) (xy 147.886272 82.845557) (xy 148.012171 82.581517) - (xy 148.019234 82.553691) (xy 148.061447 82.655602) (xy 148.195727 82.856567) (xy 148.366633 83.027473) (xy 148.567598 83.161753) - (xy 148.790897 83.254247) (xy 149.027951 83.3014) (xy 149.269649 83.3014) (xy 149.506703 83.254247) (xy 149.730002 83.161753) - (xy 149.930967 83.027473) (xy 150.101873 82.856567) (xy 150.236153 82.655602) (xy 150.328647 82.432303) (xy 150.3758 82.195249) - (xy 150.3758 81.953551) (xy 150.4618 81.953551) (xy 150.4618 82.195249) (xy 150.508953 82.432303) (xy 150.601447 82.655602) - (xy 150.735727 82.856567) (xy 150.906633 83.027473) (xy 151.107598 83.161753) (xy 151.330897 83.254247) (xy 151.567951 83.3014) - (xy 151.809649 83.3014) (xy 152.046703 83.254247) (xy 152.270002 83.161753) (xy 152.470967 83.027473) (xy 152.641873 82.856567) - (xy 152.651963 82.841466) (xy 154.506911 82.841466) (xy 154.553575 83.209835) (xy 154.671206 83.562022) (xy 154.796723 83.796846) - (xy 155.086695 83.92276) (xy 156.220695 82.78876) (xy 156.579905 82.78876) (xy 157.713905 83.92276) (xy 158.003877 83.796846) - (xy 158.169733 83.464634) (xy 158.26759 83.106448) (xy 158.293689 82.736054) (xy 158.247025 82.367685) (xy 158.129394 82.015498) - (xy 158.003877 81.780674) (xy 157.713905 81.65476) (xy 156.579905 82.78876) (xy 156.220695 82.78876) (xy 155.086695 81.65476) - (xy 154.796723 81.780674) (xy 154.630867 82.112886) (xy 154.53301 82.471072) (xy 154.506911 82.841466) (xy 152.651963 82.841466) - (xy 152.776153 82.655602) (xy 152.868647 82.432303) (xy 152.9158 82.195249) (xy 152.9158 81.953551) (xy 152.868647 81.716497) - (xy 152.776153 81.493198) (xy 152.764098 81.475155) (xy 155.2663 81.475155) (xy 156.4003 82.609155) (xy 157.5343 81.475155) - (xy 157.408386 81.185183) (xy 157.076174 81.019327) (xy 156.717988 80.92147) (xy 156.347594 80.895371) (xy 155.979225 80.942035) - (xy 155.627038 81.059666) (xy 155.392214 81.185183) (xy 155.2663 81.475155) (xy 152.764098 81.475155) (xy 152.641873 81.292233) - (xy 152.470967 81.121327) (xy 152.270002 80.987047) (xy 152.046703 80.894553) (xy 151.809649 80.8474) (xy 151.567951 80.8474) - (xy 151.330897 80.894553) (xy 151.107598 80.987047) (xy 150.906633 81.121327) (xy 150.735727 81.292233) (xy 150.601447 81.493198) - (xy 150.508953 81.716497) (xy 150.4618 81.953551) (xy 150.3758 81.953551) (xy 150.328647 81.716497) (xy 150.236153 81.493198) - (xy 150.101873 81.292233) (xy 149.930967 81.121327) (xy 149.730002 80.987047) (xy 149.506703 80.894553) (xy 149.269649 80.8474) - (xy 149.027951 80.8474) (xy 148.790897 80.894553) (xy 148.567598 80.987047) (xy 148.366633 81.121327) (xy 148.195727 81.292233) - (xy 148.061447 81.493198) (xy 148.016648 81.601351) (xy 147.959719 81.440653) (xy 147.886272 81.303243) (xy 147.637197 81.225608) - (xy 146.788405 82.0744) (xy 146.429195 82.0744) (xy 145.580403 81.225608) (xy 145.331328 81.303243) (xy 145.205429 81.567283) - (xy 145.133461 81.850811) (xy 145.118189 82.142931) (xy 143.707911 82.142931) (xy 143.661954 82.005338) (xy 143.536437 81.770514) - (xy 143.246465 81.6446) (xy 142.112465 82.7786) (xy 141.753255 82.7786) (xy 140.619255 81.6446) (xy 140.329283 81.770514) - (xy 140.163427 82.102726) (xy 140.06557 82.460912) (xy 140.039471 82.831306) (xy 138.018179 82.831306) (xy 138.083576 82.765909) - (xy 138.168609 82.638648) (xy 138.227181 82.497243) (xy 138.25704 82.347128) (xy 138.25704 82.194072) (xy 138.227181 82.043957) - (xy 138.168609 81.902552) (xy 138.083576 81.775291) (xy 137.975349 81.667064) (xy 137.848088 81.582031) (xy 137.706683 81.523459) - (xy 137.556568 81.4936) (xy 137.403512 81.4936) (xy 137.253397 81.523459) (xy 137.111992 81.582031) (xy 136.984731 81.667064) - (xy 136.876504 81.775291) (xy 136.791471 81.902552) (xy 136.732899 82.043957) (xy 136.70304 82.194072) (xy 136.70304 82.337665) - (xy 135.670326 83.37038) (xy 135.651175 83.386097) (xy 135.588442 83.462536) (xy 135.541828 83.549746) (xy 135.513123 83.644373) - (xy 135.505859 83.718129) (xy 135.505859 83.718138) (xy 135.503432 83.742781) (xy 135.505859 83.767424) (xy 135.505859 84.293514) - (xy 135.404323 84.39505) (xy 135.31929 84.522311) (xy 135.260718 84.663716) (xy 135.230859 84.813831) (xy 128.3636 84.813831) - (xy 128.3636 84.092205) (xy 131.29886 84.092205) (xy 131.424774 84.382177) (xy 131.756986 84.548033) (xy 132.115172 84.64589) - (xy 132.485566 84.671989) (xy 132.853935 84.625325) (xy 133.206122 84.507694) (xy 133.440946 84.382177) (xy 133.56686 84.092205) - (xy 132.43286 82.958205) (xy 131.29886 84.092205) (xy 128.3636 84.092205) (xy 128.3636 83.143852) (xy 128.518767 83.040173) - (xy 128.689673 82.869267) (xy 128.715037 82.831306) (xy 130.539471 82.831306) (xy 130.586135 83.199675) (xy 130.703766 83.551862) - (xy 130.829283 83.786686) (xy 131.119255 83.9126) (xy 132.253255 82.7786) (xy 132.612465 82.7786) (xy 133.746465 83.9126) - (xy 134.036437 83.786686) (xy 134.202293 83.454474) (xy 134.30015 83.096288) (xy 134.326249 82.725894) (xy 134.279585 82.357525) - (xy 134.161954 82.005338) (xy 134.036437 81.770514) (xy 133.746465 81.6446) (xy 132.612465 82.7786) (xy 132.253255 82.7786) - (xy 131.119255 81.6446) (xy 130.829283 81.770514) (xy 130.663427 82.102726) (xy 130.56557 82.460912) (xy 130.539471 82.831306) - (xy 128.715037 82.831306) (xy 128.823953 82.668302) (xy 128.916447 82.445003) (xy 128.9636 82.207949) (xy 128.9636 81.966251) - (xy 128.916447 81.729197) (xy 128.823953 81.505898) (xy 128.762615 81.414099) (xy 131.32096 81.414099) (xy 131.29886 81.464995) - (xy 132.43286 82.598995) (xy 133.56686 81.464995) (xy 133.54476 81.414099) (xy 138.439082 81.414099) (xy 138.444859 81.443143) - (xy 138.503431 81.584548) (xy 138.588464 81.711809) (xy 138.696691 81.820036) (xy 138.823952 81.905069) (xy 138.965357 81.963641) - (xy 139.115472 81.9935) (xy 139.268528 81.9935) (xy 139.418643 81.963641) (xy 139.560048 81.905069) (xy 139.687309 81.820036) - (xy 139.795536 81.711809) (xy 139.880569 81.584548) (xy 139.939141 81.443143) (xy 139.96303 81.323041) (xy 140.029143 81.268783) - (xy 140.091876 81.192344) (xy 140.13849 81.105135) (xy 140.156567 81.045544) (xy 140.172938 81.061915) (xy 140.188652 81.081062) - (xy 140.207798 81.096775) (xy 140.207801 81.096778) (xy 140.265091 81.143795) (xy 140.352299 81.190409) (xy 140.446926 81.219114) - (xy 140.455768 81.219985) (xy 140.520683 81.226378) (xy 140.52069 81.226378) (xy 140.545336 81.228805) (xy 140.569981 81.226378) - (xy 140.902474 81.226378) (xy 140.79886 81.464995) (xy 141.93286 82.598995) (xy 143.06686 81.464995) (xy 142.940946 81.175023) - (xy 142.794286 81.101803) (xy 142.819559 81.081062) (xy 142.835276 81.061911) (xy 143.055419 80.841769) (xy 145.823666 80.841769) - (xy 145.760008 81.046003) (xy 146.6088 81.894795) (xy 147.457592 81.046003) (xy 147.393934 80.841769) (xy 157.698738 80.841769) - (xy 157.687899 80.867937) (xy 157.65804 81.018052) (xy 157.65804 81.171108) (xy 157.687899 81.321223) (xy 157.746471 81.462628) - (xy 157.831504 81.589889) (xy 157.939731 81.698116) (xy 158.066992 81.783149) (xy 158.208397 81.841721) (xy 158.358512 81.87158) - (xy 158.511568 81.87158) (xy 158.661683 81.841721) (xy 158.803088 81.783149) (xy 158.930349 81.698116) (xy 159.031885 81.59658) - (xy 164.528512 81.59658) (xy 164.586693 81.654761) (xy 164.296723 81.780674) (xy 164.130867 82.112886) (xy 164.03301 82.471072) - (xy 164.006911 82.841466) (xy 164.053575 83.209835) (xy 164.171206 83.562022) (xy 164.296723 83.796846) (xy 164.586695 83.92276) - (xy 165.720695 82.78876) (xy 166.079905 82.78876) (xy 167.213905 83.92276) (xy 167.503877 83.796846) (xy 167.669733 83.464634) - (xy 167.765117 83.115497) (xy 169.747768 83.115497) (xy 169.825403 83.364572) (xy 170.089443 83.490471) (xy 170.372971 83.562439) - (xy 170.665091 83.577711) (xy 170.954579 83.535699) (xy 171.230307 83.438019) (xy 171.367717 83.364572) (xy 171.445352 83.115497) - (xy 170.59656 82.266705) (xy 169.747768 83.115497) (xy 167.765117 83.115497) (xy 167.76759 83.106448) (xy 167.793689 82.736054) - (xy 167.747025 82.367685) (xy 167.676199 82.155631) (xy 169.105949 82.155631) (xy 169.147961 82.445119) (xy 169.245641 82.720847) - (xy 169.319088 82.858257) (xy 169.568163 82.935892) (xy 170.416955 82.0871) (xy 170.776165 82.0871) (xy 171.624957 82.935892) - (xy 171.874032 82.858257) (xy 171.999931 82.594217) (xy 172.006994 82.566391) (xy 172.049207 82.668302) (xy 172.183487 82.869267) - (xy 172.354393 83.040173) (xy 172.555358 83.174453) (xy 172.778657 83.266947) (xy 173.015711 83.3141) (xy 173.257409 83.3141) - (xy 173.494463 83.266947) (xy 173.717762 83.174453) (xy 173.918727 83.040173) (xy 174.089633 82.869267) (xy 174.223913 82.668302) - (xy 174.316407 82.445003) (xy 174.36356 82.207949) (xy 174.36356 81.966251) (xy 174.316407 81.729197) (xy 174.223913 81.505898) - (xy 174.089633 81.304933) (xy 173.918727 81.134027) (xy 173.717762 80.999747) (xy 173.494463 80.907253) (xy 173.257409 80.8601) - (xy 173.015711 80.8601) (xy 172.778657 80.907253) (xy 172.555358 80.999747) (xy 172.354393 81.134027) (xy 172.183487 81.304933) - (xy 172.049207 81.505898) (xy 172.004408 81.614051) (xy 171.947479 81.453353) (xy 171.874032 81.315943) (xy 171.624957 81.238308) - (xy 170.776165 82.0871) (xy 170.416955 82.0871) (xy 169.568163 81.238308) (xy 169.319088 81.315943) (xy 169.193189 81.579983) - (xy 169.121221 81.863511) (xy 169.105949 82.155631) (xy 167.676199 82.155631) (xy 167.629394 82.015498) (xy 167.503877 81.780674) - (xy 167.213905 81.65476) (xy 166.079905 82.78876) (xy 165.720695 82.78876) (xy 165.706553 82.774618) (xy 165.886158 82.595013) - (xy 165.9003 82.609155) (xy 167.0343 81.475155) (xy 166.999447 81.394891) (xy 167.061109 81.302608) (xy 167.119681 81.161203) - (xy 167.140069 81.058703) (xy 169.747768 81.058703) (xy 170.59656 81.907495) (xy 171.445352 81.058703) (xy 171.367717 80.809628) - (xy 171.103677 80.683729) (xy 170.820149 80.611761) (xy 170.528029 80.596489) (xy 170.238541 80.638501) (xy 169.962813 80.736181) - (xy 169.825403 80.809628) (xy 169.747768 81.058703) (xy 167.140069 81.058703) (xy 167.14954 81.011088) (xy 167.14954 80.858032) - (xy 167.119681 80.707917) (xy 167.061109 80.566512) (xy 166.976076 80.439251) (xy 166.867849 80.331024) (xy 166.740588 80.245991) - (xy 166.599183 80.187419) (xy 166.449068 80.15756) (xy 166.296012 80.15756) (xy 166.145897 80.187419) (xy 166.004492 80.245991) - (xy 165.877231 80.331024) (xy 165.769004 80.439251) (xy 165.683971 80.566512) (xy 165.673173 80.59258) (xy 165.181925 80.59258) - (xy 165.289516 80.484989) (xy 165.374549 80.357728) (xy 165.433121 80.216323) (xy 165.46298 80.066208) (xy 165.46298 79.913152) - (xy 165.433121 79.763037) (xy 165.374549 79.621632) (xy 165.289516 79.494371) (xy 165.262124 79.466979) (xy 166.016128 79.466979) - (xy 166.031799 79.545763) (xy 166.090371 79.687168) (xy 166.175404 79.814429) (xy 166.283631 79.922656) (xy 166.410892 80.007689) - (xy 166.552297 80.066261) (xy 166.702412 80.09612) (xy 166.855468 80.09612) (xy 167.005583 80.066261) (xy 167.146988 80.007689) - (xy 167.274249 79.922656) (xy 167.382476 79.814429) (xy 167.467509 79.687168) (xy 167.526081 79.545763) (xy 167.55594 79.395648) - (xy 167.55594 79.242592) (xy 167.526081 79.092477) (xy 167.467509 78.951072) (xy 167.382476 78.823811) (xy 167.274249 78.715584) - (xy 167.146988 78.630551) (xy 167.005583 78.571979) (xy 166.855468 78.54212) (xy 166.702412 78.54212) (xy 166.699637 78.542672) - (xy 166.617835 78.498948) (xy 166.523208 78.470243) (xy 166.449452 78.462979) (xy 166.449442 78.462979) (xy 166.424799 78.460552) - (xy 166.400156 78.462979) (xy 162.690726 78.462979) (xy 162.719861 78.316505) (xy 162.719861 78.163449) (xy 162.690002 78.013334) - (xy 162.63143 77.871929) (xy 162.546397 77.744668) (xy 162.43817 77.636441) (xy 162.373964 77.59354) (xy 177.704675 77.59354) - (xy 177.712084 77.604629) (xy 177.820311 77.712856) (xy 177.947572 77.797889) (xy 178.088977 77.856461) (xy 178.239092 77.88632) - (xy 178.392148 77.88632) (xy 178.542263 77.856461) (xy 178.683668 77.797889) (xy 178.810929 77.712856) (xy 178.919156 77.604629) - (xy 179.004189 77.477368) (xy 179.062761 77.335963) (xy 179.09262 77.185848) (xy 179.09262 77.032792) (xy 179.062761 76.882677) - (xy 179.004189 76.741272) (xy 178.919156 76.614011) (xy 178.810929 76.505784) (xy 178.683668 76.420751) (xy 178.542263 76.362179) - (xy 178.529653 76.359671) (xy 178.659822 76.316194) (xy 178.894646 76.190677) (xy 179.02056 75.900705) (xy 177.88656 74.766705) - (xy 176.75256 75.900705) (xy 176.878474 76.190677) (xy 177.210686 76.356533) (xy 177.568872 76.45439) (xy 177.865904 76.47532) - (xy 177.820311 76.505784) (xy 177.736555 76.58954) (xy 161.190885 76.58954) (xy 161.089349 76.488004) (xy 160.962088 76.402971) - (xy 160.820683 76.344399) (xy 160.670568 76.31454) (xy 160.517512 76.31454) (xy 160.367397 76.344399) (xy 160.225992 76.402971) - (xy 160.098731 76.488004) (xy 159.990504 76.596231) (xy 159.905471 76.723492) (xy 159.846899 76.864897) (xy 159.81704 77.015012) - (xy 159.81704 77.168068) (xy 159.846899 77.318183) (xy 159.905471 77.459588) (xy 159.990504 77.586849) (xy 160.098731 77.695076) - (xy 160.162937 77.737977) (xy 154.003226 77.737977) (xy 154.083745 77.694939) (xy 154.160184 77.632206) (xy 154.175901 77.613055) - (xy 155.251674 76.537283) (xy 155.395267 76.537283) (xy 155.545382 76.507424) (xy 155.686787 76.448852) (xy 155.814048 76.363819) - (xy 155.922275 76.255592) (xy 156.007308 76.128331) (xy 156.06588 75.986926) (xy 156.08303 75.900705) (xy 167.25256 75.900705) - (xy 167.378474 76.190677) (xy 167.710686 76.356533) (xy 168.068872 76.45439) (xy 168.439266 76.480489) (xy 168.807635 76.433825) - (xy 169.159822 76.316194) (xy 169.394646 76.190677) (xy 169.52056 75.900705) (xy 168.38656 74.766705) (xy 167.25256 75.900705) - (xy 156.08303 75.900705) (xy 156.095739 75.836811) (xy 156.095739 75.683755) (xy 156.06588 75.53364) (xy 156.007308 75.392235) - (xy 155.922275 75.264974) (xy 155.835298 75.177997) (xy 157.748808 75.177997) (xy 157.826443 75.427072) (xy 158.090483 75.552971) - (xy 158.374011 75.624939) (xy 158.666131 75.640211) (xy 158.955619 75.598199) (xy 159.231347 75.500519) (xy 159.368757 75.427072) - (xy 159.446392 75.177997) (xy 158.5976 74.329205) (xy 157.748808 75.177997) (xy 155.835298 75.177997) (xy 155.814048 75.156747) - (xy 155.71235 75.088794) (xy 155.76609 74.892088) (xy 155.792189 74.521694) (xy 155.745525 74.153325) (xy 155.627894 73.801138) - (xy 155.596812 73.742989) (xy 155.723239 73.742989) (xy 155.873354 73.71313) (xy 156.014759 73.654558) (xy 156.14202 73.569525) - (xy 156.250247 73.461298) (xy 156.33528 73.334037) (xy 156.357282 73.28092) (xy 156.37024 73.289579) (xy 156.511645 73.348151) - (xy 156.66176 73.37801) (xy 156.814816 73.37801) (xy 156.964931 73.348151) (xy 157.106336 73.289579) (xy 157.198481 73.22801) - (xy 157.496402 73.22801) (xy 157.569201 73.300809) (xy 157.320128 73.378443) (xy 157.194229 73.642483) (xy 157.122261 73.926011) - (xy 157.106989 74.218131) (xy 157.149001 74.507619) (xy 157.246681 74.783347) (xy 157.320128 74.920757) (xy 157.569203 74.998392) - (xy 158.417995 74.1496) (xy 158.403853 74.135458) (xy 158.583458 73.955853) (xy 158.5976 73.969995) (xy 158.611743 73.955853) - (xy 158.791348 74.135458) (xy 158.777205 74.1496) (xy 159.625997 74.998392) (xy 159.875072 74.920757) (xy 160.000971 74.656717) - (xy 160.008034 74.628891) (xy 160.050247 74.730802) (xy 160.184527 74.931767) (xy 160.355433 75.102673) (xy 160.556398 75.236953) - (xy 160.779697 75.329447) (xy 161.016751 75.3766) (xy 161.258449 75.3766) (xy 161.495503 75.329447) (xy 161.718802 75.236953) - (xy 161.919767 75.102673) (xy 162.090673 74.931767) (xy 162.224953 74.730802) (xy 162.317447 74.507503) (xy 162.3646 74.270449) - (xy 162.3646 74.028751) (xy 162.317447 73.791697) (xy 162.224953 73.568398) (xy 162.090673 73.367433) (xy 161.95125 73.22801) - (xy 162.86395 73.22801) (xy 162.724527 73.367433) (xy 162.590247 73.568398) (xy 162.497753 73.791697) (xy 162.4506 74.028751) - (xy 162.4506 74.270449) (xy 162.497753 74.507503) (xy 162.590247 74.730802) (xy 162.724527 74.931767) (xy 162.895433 75.102673) - (xy 163.096398 75.236953) (xy 163.319697 75.329447) (xy 163.556751 75.3766) (xy 163.798449 75.3766) (xy 164.035503 75.329447) - (xy 164.258802 75.236953) (xy 164.459767 75.102673) (xy 164.630673 74.931767) (xy 164.764953 74.730802) (xy 164.802644 74.639806) - (xy 166.493171 74.639806) (xy 166.539835 75.008175) (xy 166.657466 75.360362) (xy 166.782983 75.595186) (xy 167.072955 75.7211) - (xy 168.206955 74.5871) (xy 168.566165 74.5871) (xy 169.700165 75.7211) (xy 169.990137 75.595186) (xy 170.155993 75.262974) - (xy 170.25385 74.904788) (xy 170.272521 74.639806) (xy 175.993171 74.639806) (xy 176.039835 75.008175) (xy 176.157466 75.360362) - (xy 176.282983 75.595186) (xy 176.572955 75.7211) (xy 177.706955 74.5871) (xy 178.066165 74.5871) (xy 179.200165 75.7211) - (xy 179.490137 75.595186) (xy 179.655993 75.262974) (xy 179.68129 75.170377) (xy 181.721328 75.170377) (xy 181.798963 75.419452) - (xy 182.063003 75.545351) (xy 182.346531 75.617319) (xy 182.638651 75.632591) (xy 182.928139 75.590579) (xy 183.203867 75.492899) - (xy 183.341277 75.419452) (xy 183.418912 75.170377) (xy 182.57012 74.321585) (xy 181.721328 75.170377) (xy 179.68129 75.170377) - (xy 179.75385 74.904788) (xy 179.779949 74.534394) (xy 179.738921 74.210511) (xy 181.079509 74.210511) (xy 181.121521 74.499999) - (xy 181.219201 74.775727) (xy 181.292648 74.913137) (xy 181.541723 74.990772) (xy 182.390515 74.14198) (xy 181.541723 73.293188) - (xy 181.292648 73.370823) (xy 181.166749 73.634863) (xy 181.094781 73.918391) (xy 181.079509 74.210511) (xy 179.738921 74.210511) - (xy 179.733285 74.166025) (xy 179.615654 73.813838) (xy 179.490137 73.579014) (xy 179.200165 73.4531) (xy 178.066165 74.5871) - (xy 177.706955 74.5871) (xy 176.572955 73.4531) (xy 176.282983 73.579014) (xy 176.117127 73.911226) (xy 176.01927 74.269412) - (xy 175.993171 74.639806) (xy 170.272521 74.639806) (xy 170.279949 74.534394) (xy 170.233285 74.166025) (xy 170.115654 73.813838) - (xy 169.990137 73.579014) (xy 169.700165 73.4531) (xy 168.566165 74.5871) (xy 168.206955 74.5871) (xy 167.072955 73.4531) - (xy 166.782983 73.579014) (xy 166.617127 73.911226) (xy 166.51927 74.269412) (xy 166.493171 74.639806) (xy 164.802644 74.639806) - (xy 164.857447 74.507503) (xy 164.9046 74.270449) (xy 164.9046 74.028751) (xy 164.857447 73.791697) (xy 164.764953 73.568398) - (xy 164.630673 73.367433) (xy 164.536735 73.273495) (xy 167.25256 73.273495) (xy 168.38656 74.407495) (xy 169.52056 73.273495) - (xy 176.75256 73.273495) (xy 177.88656 74.407495) (xy 179.02056 73.273495) (xy 178.894646 72.983523) (xy 178.562434 72.817667) - (xy 178.204248 72.71981) (xy 177.833854 72.693711) (xy 177.465485 72.740375) (xy 177.113298 72.858006) (xy 176.878474 72.983523) - (xy 176.75256 73.273495) (xy 169.52056 73.273495) (xy 169.394646 72.983523) (xy 169.062434 72.817667) (xy 168.704248 72.71981) - (xy 168.333854 72.693711) (xy 167.965485 72.740375) (xy 167.613298 72.858006) (xy 167.378474 72.983523) (xy 167.25256 73.273495) - (xy 164.536735 73.273495) (xy 164.49125 73.22801) (xy 164.878516 73.22801) (xy 164.90931 73.231043) (xy 164.940104 73.22801) - (xy 165.032223 73.218937) (xy 165.150413 73.183085) (xy 165.259338 73.124863) (xy 165.354811 73.046511) (xy 165.374448 73.022583) - (xy 166.242798 72.154234) (xy 166.319783 72.138921) (xy 166.461188 72.080349) (xy 166.588449 71.995316) (xy 166.696676 71.887089) - (xy 166.781709 71.759828) (xy 166.840281 71.618423) (xy 166.87014 71.468308) (xy 166.87014 71.315252) (xy 166.840281 71.165137) - (xy 166.83197 71.145072) (xy 174.26964 71.145072) (xy 174.26964 71.298128) (xy 174.299499 71.448243) (xy 174.358071 71.589648) - (xy 174.443104 71.716909) (xy 174.551331 71.825136) (xy 174.678592 71.910169) (xy 174.819997 71.968741) (xy 174.970112 71.9986) - (xy 175.123168 71.9986) (xy 175.273283 71.968741) (xy 175.414688 71.910169) (xy 175.541949 71.825136) (xy 175.643485 71.7236) - (xy 182.189466 71.7236) (xy 182.89802 72.432155) (xy 182.89802 72.575748) (xy 182.922607 72.699359) (xy 182.793709 72.666641) - (xy 182.501589 72.651369) (xy 182.212101 72.693381) (xy 181.936373 72.791061) (xy 181.798963 72.864508) (xy 181.721328 73.113583) - (xy 182.57012 73.962375) (xy 182.584263 73.948233) (xy 182.763868 74.127838) (xy 182.749725 74.14198) (xy 183.598517 74.990772) - (xy 183.847592 74.913137) (xy 183.973491 74.649097) (xy 183.980554 74.621271) (xy 184.022767 74.723182) (xy 184.157047 74.924147) - (xy 184.327953 75.095053) (xy 184.528918 75.229333) (xy 184.752217 75.321827) (xy 184.989271 75.36898) (xy 185.230969 75.36898) - (xy 185.468023 75.321827) (xy 185.66526 75.240128) (xy 180.47157 80.433819) (xy 176.733635 80.433819) (xy 176.702841 80.430786) - (xy 176.579928 80.442892) (xy 176.461737 80.478744) (xy 176.363335 80.531342) (xy 176.352813 80.536966) (xy 176.25734 80.615318) - (xy 176.237703 80.639246) (xy 175.980442 80.896507) (xy 175.797409 80.8601) (xy 175.555711 80.8601) (xy 175.318657 80.907253) - (xy 175.095358 80.999747) (xy 174.894393 81.134027) (xy 174.723487 81.304933) (xy 174.589207 81.505898) (xy 174.496713 81.729197) - (xy 174.44956 81.966251) (xy 174.44956 82.207949) (xy 174.496713 82.445003) (xy 174.589207 82.668302) (xy 174.723487 82.869267) - (xy 174.894393 83.040173) (xy 175.095358 83.174453) (xy 175.318657 83.266947) (xy 175.555711 83.3141) (xy 175.797409 83.3141) - (xy 176.034463 83.266947) (xy 176.257762 83.174453) (xy 176.458727 83.040173) (xy 176.629633 82.869267) (xy 176.763913 82.668302) - (xy 176.856407 82.445003) (xy 176.90356 82.207949) (xy 176.90356 81.966251) (xy 176.867153 81.783218) (xy 176.962552 81.687819) - (xy 178.903498 81.687819) (xy 178.754003 81.752734) (xy 178.588147 82.084946) (xy 178.49029 82.443132) (xy 178.464191 82.813526) - (xy 178.510855 83.181895) (xy 178.628486 83.534082) (xy 178.754003 83.768906) (xy 179.043975 83.89482) (xy 180.177975 82.76082) - (xy 180.537185 82.76082) (xy 181.671185 83.89482) (xy 181.961157 83.768906) (xy 182.127013 83.436694) (xy 182.22487 83.078508) - (xy 182.243541 82.813526) (xy 187.964191 82.813526) (xy 188.010855 83.181895) (xy 188.128486 83.534082) (xy 188.254003 83.768906) - (xy 188.543975 83.89482) (xy 189.677975 82.76082) (xy 190.037185 82.76082) (xy 191.171185 83.89482) (xy 191.461157 83.768906) - (xy 191.627013 83.436694) (xy 191.71407 83.118037) (xy 193.687268 83.118037) (xy 193.764903 83.367112) (xy 194.028943 83.493011) - (xy 194.312471 83.564979) (xy 194.604591 83.580251) (xy 194.894079 83.538239) (xy 195.169807 83.440559) (xy 195.307217 83.367112) - (xy 195.384852 83.118037) (xy 194.53606 82.269245) (xy 193.687268 83.118037) (xy 191.71407 83.118037) (xy 191.72487 83.078508) - (xy 191.750969 82.708114) (xy 191.704305 82.339745) (xy 191.64366 82.158171) (xy 193.045449 82.158171) (xy 193.087461 82.447659) - (xy 193.185141 82.723387) (xy 193.258588 82.860797) (xy 193.507663 82.938432) (xy 194.356455 82.08964) (xy 193.507663 81.240848) - (xy 193.258588 81.318483) (xy 193.132689 81.582523) (xy 193.060721 81.866051) (xy 193.045449 82.158171) (xy 191.64366 82.158171) - (xy 191.586674 81.987558) (xy 191.461157 81.752734) (xy 191.171185 81.62682) (xy 190.037185 82.76082) (xy 189.677975 82.76082) - (xy 188.543975 81.62682) (xy 188.254003 81.752734) (xy 188.088147 82.084946) (xy 187.99029 82.443132) (xy 187.964191 82.813526) - (xy 182.243541 82.813526) (xy 182.250969 82.708114) (xy 182.204305 82.339745) (xy 182.086674 81.987558) (xy 181.961157 81.752734) - (xy 181.671185 81.62682) (xy 180.537185 82.76082) (xy 180.177975 82.76082) (xy 180.163833 82.746678) (xy 180.343438 82.567073) - (xy 180.35758 82.581215) (xy 181.49158 81.447215) (xy 188.72358 81.447215) (xy 189.85758 82.581215) (xy 190.99158 81.447215) - (xy 190.865666 81.157243) (xy 190.533454 80.991387) (xy 190.175268 80.89353) (xy 189.804874 80.867431) (xy 189.436505 80.914095) - (xy 189.084318 81.031726) (xy 188.849494 81.157243) (xy 188.72358 81.447215) (xy 181.49158 81.447215) (xy 181.412867 81.265944) - (xy 182.78626 79.892551) (xy 182.78626 80.017948) (xy 182.816119 80.168063) (xy 182.874691 80.309468) (xy 182.959724 80.436729) - (xy 183.067951 80.544956) (xy 183.195212 80.629989) (xy 183.336617 80.688561) (xy 183.486732 80.71842) (xy 183.639788 80.71842) - (xy 183.789903 80.688561) (xy 183.931308 80.629989) (xy 184.058569 80.544956) (xy 184.160105 80.44342) (xy 194.719906 80.44342) - (xy 194.935397 80.658911) (xy 194.759649 80.614301) (xy 194.467529 80.599029) (xy 194.178041 80.641041) (xy 193.902313 80.738721) - (xy 193.764903 80.812168) (xy 193.687268 81.061243) (xy 194.53606 81.910035) (xy 194.550203 81.895893) (xy 194.729808 82.075498) - (xy 194.715665 82.08964) (xy 195.564457 82.938432) (xy 195.813532 82.860797) (xy 195.939431 82.596757) (xy 195.946494 82.568931) - (xy 195.988707 82.670842) (xy 196.122987 82.871807) (xy 196.293893 83.042713) (xy 196.494858 83.176993) (xy 196.718157 83.269487) - (xy 196.955211 83.31664) (xy 197.196909 83.31664) (xy 197.433963 83.269487) (xy 197.657262 83.176993) (xy 197.858227 83.042713) - (xy 198.029133 82.871807) (xy 198.163413 82.670842) (xy 198.255907 82.447543) (xy 198.30306 82.210489) (xy 198.30306 81.968791) - (xy 198.38906 81.968791) (xy 198.38906 82.210489) (xy 198.436213 82.447543) (xy 198.528707 82.670842) (xy 198.662987 82.871807) - (xy 198.833893 83.042713) (xy 199.034858 83.176993) (xy 199.258157 83.269487) (xy 199.495211 83.31664) (xy 199.736909 83.31664) - (xy 199.973963 83.269487) (xy 200.197262 83.176993) (xy 200.398227 83.042713) (xy 200.569133 82.871807) (xy 200.703413 82.670842) - (xy 200.795907 82.447543) (xy 200.84306 82.210489) (xy 200.84306 81.968791) (xy 200.795907 81.731737) (xy 200.703413 81.508438) - (xy 200.569133 81.307473) (xy 200.398227 81.136567) (xy 200.197262 81.002287) (xy 199.973963 80.909793) (xy 199.736909 80.86264) - (xy 199.495211 80.86264) (xy 199.258157 80.909793) (xy 199.034858 81.002287) (xy 198.833893 81.136567) (xy 198.662987 81.307473) - (xy 198.528707 81.508438) (xy 198.436213 81.731737) (xy 198.38906 81.968791) (xy 198.30306 81.968791) (xy 198.255907 81.731737) - (xy 198.163413 81.508438) (xy 198.029133 81.307473) (xy 197.858227 81.136567) (xy 197.657262 81.002287) (xy 197.433963 80.909793) - (xy 197.196909 80.86264) (xy 196.955211 80.86264) (xy 196.718157 80.909793) (xy 196.638955 80.9426) (xy 195.300241 79.603887) - (xy 195.284524 79.584736) (xy 195.208085 79.522003) (xy 195.120876 79.475389) (xy 195.026249 79.446684) (xy 194.952493 79.43942) - (xy 194.952483 79.43942) (xy 194.92784 79.436993) (xy 194.903197 79.43942) (xy 184.160105 79.43942) (xy 184.058569 79.337884) - (xy 183.931308 79.252851) (xy 183.789903 79.194279) (xy 183.639788 79.16442) (xy 183.514391 79.16442) (xy 186.775566 75.903245) - (xy 191.19206 75.903245) (xy 191.317974 76.193217) (xy 191.650186 76.359073) (xy 192.008372 76.45693) (xy 192.378766 76.483029) - (xy 192.747135 76.436365) (xy 193.099322 76.318734) (xy 193.334146 76.193217) (xy 193.46006 75.903245) (xy 192.32606 74.769245) - (xy 191.19206 75.903245) (xy 186.775566 75.903245) (xy 187.346239 75.332573) (xy 187.529271 75.36898) (xy 187.770969 75.36898) - (xy 188.008023 75.321827) (xy 188.231322 75.229333) (xy 188.432287 75.095053) (xy 188.603193 74.924147) (xy 188.737473 74.723182) - (xy 188.829967 74.499883) (xy 188.87712 74.262829) (xy 188.87712 74.021131) (xy 188.840713 73.838099) (xy 189.162173 73.516639) - (xy 190.871978 73.516639) (xy 190.722483 73.581554) (xy 190.556627 73.913766) (xy 190.45877 74.271952) (xy 190.432671 74.642346) - (xy 190.479335 75.010715) (xy 190.596966 75.362902) (xy 190.722483 75.597726) (xy 191.012455 75.72364) (xy 192.146455 74.58964) - (xy 192.132313 74.575498) (xy 192.311918 74.395893) (xy 192.32606 74.410035) (xy 192.340203 74.395893) (xy 192.519808 74.575498) - (xy 192.505665 74.58964) (xy 193.639665 75.72364) (xy 193.929637 75.597726) (xy 194.095493 75.265514) (xy 194.19335 74.907328) - (xy 194.212021 74.642346) (xy 199.932671 74.642346) (xy 199.979335 75.010715) (xy 200.096966 75.362902) (xy 200.222483 75.597726) - (xy 200.512455 75.72364) (xy 201.646455 74.58964) (xy 200.512455 73.45564) (xy 200.222483 73.581554) (xy 200.056627 73.913766) - (xy 199.95877 74.271952) (xy 199.932671 74.642346) (xy 194.212021 74.642346) (xy 194.219449 74.536934) (xy 194.172785 74.168565) - (xy 194.055154 73.816378) (xy 193.929637 73.581554) (xy 193.780142 73.516639) (xy 197.591029 73.516639) (xy 197.656797 73.543881) - (xy 197.806912 73.57374) (xy 197.959968 73.57374) (xy 198.110083 73.543881) (xy 198.251488 73.485309) (xy 198.378749 73.400276) - (xy 198.486976 73.292049) (xy 198.572009 73.164788) (xy 198.630581 73.023383) (xy 198.66044 72.873268) (xy 198.66044 72.720212) - (xy 198.630581 72.570097) (xy 198.572009 72.428692) (xy 198.486976 72.301431) (xy 198.378749 72.193204) (xy 198.251488 72.108171) - (xy 198.110083 72.049599) (xy 197.959968 72.01974) (xy 197.806912 72.01974) (xy 197.656797 72.049599) (xy 197.515392 72.108171) - (xy 197.388131 72.193204) (xy 197.318696 72.262639) (xy 188.933255 72.262639) (xy 188.902461 72.259606) (xy 188.779548 72.271712) - (xy 188.661357 72.307564) (xy 188.616371 72.33161) (xy 188.552433 72.365786) (xy 188.45696 72.444138) (xy 188.43733 72.468058) - (xy 187.954001 72.951387) (xy 187.770969 72.91498) (xy 187.529271 72.91498) (xy 187.292217 72.962133) (xy 187.068918 73.054627) - (xy 186.867953 73.188907) (xy 186.697047 73.359813) (xy 186.562767 73.560778) (xy 186.470273 73.784077) (xy 186.42312 74.021131) - (xy 186.42312 74.262829) (xy 186.459527 74.445861) (xy 186.208268 74.69712) (xy 186.289967 74.499883) (xy 186.33712 74.262829) - (xy 186.33712 74.021131) (xy 186.289967 73.784077) (xy 186.197473 73.560778) (xy 186.063193 73.359813) (xy 185.892287 73.188907) - (xy 185.691322 73.054627) (xy 185.468023 72.962133) (xy 185.230969 72.91498) (xy 184.989271 72.91498) (xy 184.752217 72.962133) - (xy 184.528918 73.054627) (xy 184.327953 73.188907) (xy 184.157047 73.359813) (xy 184.022767 73.560778) (xy 183.977968 73.668931) - (xy 183.921039 73.508233) (xy 183.847592 73.370823) (xy 183.598519 73.293189) (xy 183.615488 73.27622) (xy 183.751548 73.27622) - (xy 183.901663 73.246361) (xy 184.043068 73.187789) (xy 184.170329 73.102756) (xy 184.278556 72.994529) (xy 184.363589 72.867268) - (xy 184.422161 72.725863) (xy 184.45202 72.575748) (xy 184.45202 72.422692) (xy 184.422161 72.272577) (xy 184.363589 72.131172) - (xy 184.278556 72.003911) (xy 184.170329 71.895684) (xy 184.043068 71.810651) (xy 183.901663 71.752079) (xy 183.751548 71.72222) - (xy 183.607955 71.72222) (xy 182.769801 70.884067) (xy 182.754084 70.864916) (xy 182.677645 70.802183) (xy 182.590436 70.755569) - (xy 182.495809 70.726864) (xy 182.422053 70.7196) (xy 182.422043 70.7196) (xy 182.3974 70.717173) (xy 182.372757 70.7196) - (xy 175.643485 70.7196) (xy 175.541949 70.618064) (xy 175.414688 70.533031) (xy 175.273283 70.474459) (xy 175.123168 70.4446) - (xy 174.970112 70.4446) (xy 174.819997 70.474459) (xy 174.678592 70.533031) (xy 174.551331 70.618064) (xy 174.443104 70.726291) - (xy 174.358071 70.853552) (xy 174.299499 70.994957) (xy 174.26964 71.145072) (xy 166.83197 71.145072) (xy 166.781709 71.023732) - (xy 166.696676 70.896471) (xy 166.588449 70.788244) (xy 166.461188 70.703211) (xy 166.319783 70.644639) (xy 166.169668 70.61478) - (xy 166.016612 70.61478) (xy 165.866497 70.644639) (xy 165.725092 70.703211) (xy 165.597831 70.788244) (xy 165.489604 70.896471) - (xy 165.404571 71.023732) (xy 165.345999 71.165137) (xy 165.318073 71.305536) (xy 164.649599 71.97401) (xy 157.198481 71.97401) - (xy 157.106336 71.912441) (xy 156.964931 71.853869) (xy 156.856239 71.832249) (xy 156.718404 71.694415) (xy 156.698767 71.670487) - (xy 156.603294 71.592135) (xy 156.494369 71.533913) (xy 156.376179 71.498061) (xy 156.28406 71.488988) (xy 156.253266 71.485955) - (xy 156.222472 71.488988) (xy 155.085448 71.488988) (xy 155.105481 71.440623) (xy 155.13534 71.290508) (xy 155.13534 71.137452) - (xy 155.105481 70.987337) (xy 155.078582 70.922398) (xy 161.600163 70.922398) (xy 161.643242 70.926641) (xy 161.686321 70.922398) - (xy 161.815164 70.909708) (xy 161.980479 70.85956) (xy 162.132834 70.778125) (xy 162.266375 70.668531) (xy 162.293839 70.635066) - (xy 162.752293 70.176612) (xy 167.40485 70.176612) (xy 167.490392 70.233769) (xy 167.631797 70.292341) (xy 167.781912 70.3222) - (xy 167.934968 70.3222) (xy 168.085083 70.292341) (xy 168.226488 70.233769) (xy 168.343021 70.155904) (xy 168.481905 70.113774) - (xy 168.63426 70.032339) (xy 168.767801 69.922745) (xy 168.795265 69.88928) (xy 169.204994 69.47955) (xy 169.287126 69.379471) - (xy 169.368562 69.227117) (xy 169.41871 69.061803) (xy 169.435643 68.88988) (xy 169.41871 68.717958) (xy 169.372878 68.566871) - (xy 172.442875 68.566871) (xy 172.473669 68.569904) (xy 172.504463 68.566871) (xy 172.596582 68.557798) (xy 172.714772 68.521946) - (xy 172.823697 68.463724) (xy 172.91917 68.385372) (xy 172.938807 68.361444) (xy 173.32198 67.978272) (xy 173.355657 68.011949) - (xy 173.37529 68.035872) (xy 173.470763 68.114224) (xy 173.579688 68.172446) (xy 173.697878 68.208298) (xy 173.789997 68.217371) - (xy 173.789998 68.217371) (xy 173.82079 68.220404) (xy 173.851582 68.217371) (xy 176.816616 68.217371) (xy 176.84741 68.220404) - (xy 176.878204 68.217371) (xy 176.970323 68.208298) (xy 177.088513 68.172446) (xy 177.197438 68.114224) (xy 177.292911 68.035872) - (xy 177.312548 68.011944) (xy 177.368907 67.955585) (xy 179.22612 67.955585) (xy 179.352034 68.245557) (xy 179.684246 68.411413) - (xy 180.042432 68.50927) (xy 180.412826 68.535369) (xy 180.781195 68.488705) (xy 181.133382 68.371074) (xy 181.368206 68.245557) - (xy 181.49412 67.955585) (xy 188.72612 67.955585) (xy 188.852034 68.245557) (xy 189.184246 68.411413) (xy 189.542432 68.50927) - (xy 189.912826 68.535369) (xy 190.281195 68.488705) (xy 190.633382 68.371074) (xy 190.868206 68.245557) (xy 190.99412 67.955585) - (xy 189.86012 66.821585) (xy 188.72612 67.955585) (xy 181.49412 67.955585) (xy 180.36012 66.821585) (xy 179.22612 67.955585) - (xy 177.368907 67.955585) (xy 178.485066 66.839426) (xy 178.513395 67.063055) (xy 178.631026 67.415242) (xy 178.756543 67.650066) - (xy 179.046515 67.77598) (xy 180.180515 66.64198) (xy 180.539725 66.64198) (xy 181.673725 67.77598) (xy 181.963697 67.650066) - (xy 182.129553 67.317854) (xy 182.22741 66.959668) (xy 182.246081 66.694686) (xy 187.966731 66.694686) (xy 188.013395 67.063055) - (xy 188.131026 67.415242) (xy 188.256543 67.650066) (xy 188.546515 67.77598) (xy 189.680515 66.64198) (xy 190.039725 66.64198) - (xy 191.173725 67.77598) (xy 191.463697 67.650066) (xy 191.629553 67.317854) (xy 191.72741 66.959668) (xy 191.753509 66.589274) - (xy 191.706845 66.220905) (xy 191.589214 65.868718) (xy 191.463697 65.633894) (xy 191.173725 65.50798) (xy 190.039725 66.64198) - (xy 189.680515 66.64198) (xy 188.546515 65.50798) (xy 188.256543 65.633894) (xy 188.090687 65.966106) (xy 187.99283 66.324292) - (xy 187.966731 66.694686) (xy 182.246081 66.694686) (xy 182.253509 66.589274) (xy 182.206845 66.220905) (xy 182.089214 65.868718) - (xy 181.963697 65.633894) (xy 181.673725 65.50798) (xy 180.539725 66.64198) (xy 180.180515 66.64198) (xy 180.166373 66.627838) - (xy 180.345978 66.448233) (xy 180.36012 66.462375) (xy 181.49412 65.328375) (xy 181.409457 65.133402) (xy 188.810783 65.133402) - (xy 188.72612 65.328375) (xy 189.86012 66.462375) (xy 190.99412 65.328375) (xy 190.909457 65.133402) (xy 191.961948 65.133402) - (xy 192.50684 65.678295) (xy 192.50684 65.821888) (xy 192.536699 65.972003) (xy 192.595271 66.113408) (xy 192.680304 66.240669) - (xy 192.788531 66.348896) (xy 192.915792 66.433929) (xy 193.057197 66.492501) (xy 193.207312 66.52236) (xy 193.360368 66.52236) - (xy 193.510483 66.492501) (xy 193.651888 66.433929) (xy 193.779149 66.348896) (xy 193.887376 66.240669) (xy 193.972409 66.113408) - (xy 194.030981 65.972003) (xy 194.06084 65.821888) (xy 194.06084 65.668832) (xy 194.030981 65.518717) (xy 193.972409 65.377312) - (xy 193.887376 65.250051) (xy 193.779149 65.141824) (xy 193.651888 65.056791) (xy 193.510483 64.998219) (xy 193.360368 64.96836) - (xy 193.216775 64.96836) (xy 192.542281 64.293867) (xy 192.526566 64.274718) (xy 192.450127 64.211985) (xy 192.362918 64.165371) - (xy 192.268291 64.136666) (xy 192.194535 64.129402) (xy 192.194525 64.129402) (xy 192.169882 64.126975) (xy 192.145239 64.129402) - (xy 186.739365 64.129402) (xy 186.7685 63.982928) (xy 186.7685 63.829872) (xy 186.739187 63.6825) (xy 192.500889 63.6825) - (xy 194.522199 65.703811) (xy 194.522205 65.703816) (xy 194.575019 65.75663) (xy 194.596639 65.865323) (xy 194.655211 66.006728) - (xy 194.740244 66.133989) (xy 194.848471 66.242216) (xy 194.975732 66.327249) (xy 195.117137 66.385821) (xy 195.267252 66.41568) - (xy 195.420308 66.41568) (xy 195.570423 66.385821) (xy 195.711828 66.327249) (xy 195.839089 66.242216) (xy 195.947316 66.133989) - (xy 196.032349 66.006728) (xy 196.090921 65.865323) (xy 196.12078 65.715208) (xy 196.12078 65.562152) (xy 196.090921 65.412037) - (xy 196.032349 65.270632) (xy 195.947316 65.143371) (xy 195.839089 65.035144) (xy 195.711828 64.950111) (xy 195.570423 64.891539) - (xy 195.46173 64.869919) (xy 195.408916 64.817105) (xy 195.408911 64.817099) (xy 193.299301 62.70749) (xy 200.082116 62.70749) - (xy 200.55356 63.178935) (xy 200.55356 63.322528) (xy 200.583419 63.472643) (xy 200.641991 63.614048) (xy 200.727024 63.741309) - (xy 200.835251 63.849536) (xy 200.962512 63.934569) (xy 201.103917 63.993141) (xy 201.254032 64.023) (xy 201.407088 64.023) - (xy 201.557203 63.993141) (xy 201.698608 63.934569) (xy 201.825869 63.849536) (xy 201.934096 63.741309) (xy 202.019129 63.614048) - (xy 202.077701 63.472643) (xy 202.10756 63.322528) (xy 202.10756 63.169472) (xy 202.077701 63.019357) (xy 202.019129 62.877952) - (xy 201.934096 62.750691) (xy 201.825869 62.642464) (xy 201.698608 62.557431) (xy 201.557203 62.498859) (xy 201.407088 62.469) - (xy 201.263495 62.469) (xy 200.662451 61.867957) (xy 200.646734 61.848806) (xy 200.570295 61.786073) (xy 200.483086 61.739459) - (xy 200.388459 61.710754) (xy 200.314703 61.70349) (xy 200.314693 61.70349) (xy 200.29005 61.701063) (xy 200.265407 61.70349) - (xy 179.780087 61.70349) (xy 179.708331 61.631734) (xy 179.74153 61.582048) (xy 179.800102 61.440643) (xy 179.829961 61.290528) - (xy 179.829961 61.137472) (xy 179.800102 60.987357) (xy 179.74153 60.845952) (xy 179.656497 60.718691) (xy 179.54827 60.610464) - (xy 179.421009 60.525431) (xy 179.279604 60.466859) (xy 179.129489 60.437) (xy 178.976433 60.437) (xy 178.826318 60.466859) - (xy 178.684913 60.525431) (xy 178.592768 60.587) (xy 178.519376 60.587) (xy 178.488582 60.583967) (xy 178.39096 60.593582) - (xy 178.365669 60.596073) (xy 178.247479 60.631925) (xy 178.138554 60.690147) (xy 178.043081 60.768499) (xy 178.023448 60.792422) - (xy 176.919229 61.896642) (xy 176.836253 61.77246) (xy 176.728026 61.664233) (xy 176.600765 61.5792) (xy 176.45936 61.520628) - (xy 176.309245 61.490769) (xy 176.156189 61.490769) (xy 176.006074 61.520628) (xy 175.864669 61.5792) (xy 175.737408 61.664233) - (xy 175.629181 61.77246) (xy 175.544148 61.899721) (xy 175.485576 62.041126) (xy 175.455717 62.191241) (xy 175.455717 62.334834) - (xy 174.698572 63.09198) (xy 162.966345 63.09198) (xy 162.864809 62.990444) (xy 162.737548 62.905411) (xy 162.596143 62.846839) - (xy 162.446028 62.81698) (xy 162.292972 62.81698) (xy 162.142857 62.846839) (xy 162.001452 62.905411) (xy 161.874191 62.990444) - (xy 161.765964 63.098671) (xy 161.680931 63.225932) (xy 161.622359 63.367337) (xy 161.5925 63.517452) (xy 161.5925 63.670508) - (xy 161.622359 63.820623) (xy 161.633869 63.84841) (xy 152.376997 63.84841) (xy 152.346203 63.845377) (xy 152.315409 63.84841) - (xy 152.22329 63.857483) (xy 152.141907 63.88217) (xy 148.770343 63.88217) (xy 148.75602 63.877825) (xy 148.633108 63.865719) - (xy 148.633107 63.865719) (xy 148.510196 63.877825) (xy 148.469424 63.890193) (xy 146.589203 63.890193) (xy 146.558409 63.88716) - (xy 146.527615 63.890193) (xy 146.435496 63.899266) (xy 146.317306 63.935118) (xy 146.208381 63.99334) (xy 146.112908 64.071692) - (xy 146.093278 64.095612) (xy 143.792321 66.396569) (xy 143.769425 66.215825) (xy 143.651794 65.863638) (xy 143.526277 65.628814) - (xy 143.236305 65.5029) (xy 142.102305 66.6369) (xy 142.116448 66.651043) (xy 141.936843 66.830648) (xy 141.9227 66.816505) - (xy 141.908558 66.830648) (xy 141.728953 66.651043) (xy 141.743095 66.6369) (xy 140.609095 65.5029) (xy 140.319123 65.628814) - (xy 140.153267 65.961026) (xy 140.05541 66.319212) (xy 140.029311 66.689606) (xy 140.075975 67.057975) (xy 140.193606 67.410162) - (xy 140.319123 67.644986) (xy 140.468618 67.709901) (xy 138.982551 67.709901) (xy 137.961667 66.689018) (xy 137.94203 66.66509) - (xy 137.846557 66.586738) (xy 137.737632 66.528516) (xy 137.619442 66.492664) (xy 137.527323 66.483591) (xy 137.496529 66.480558) - (xy 137.465735 66.483591) (xy 137.339862 66.483591) (xy 136.179566 65.323295) (xy 140.7887 65.323295) (xy 141.9227 66.457295) - (xy 143.0567 65.323295) (xy 142.930786 65.033323) (xy 142.598574 64.867467) (xy 142.240388 64.76961) (xy 141.869994 64.743511) - (xy 141.501625 64.790175) (xy 141.149438 64.907806) (xy 140.914614 65.033323) (xy 140.7887 65.323295) (xy 136.179566 65.323295) - (xy 135.346936 64.490666) (xy 135.327299 64.466738) (xy 135.231826 64.388386) (xy 135.122901 64.330164) (xy 135.004711 64.294312) - (xy 134.912592 64.285239) (xy 134.881798 64.282206) (xy 134.851004 64.285239) (xy 131.662153 64.285239) (xy 131.631359 64.282206) - (xy 131.600565 64.285239) (xy 131.508446 64.294312) (xy 131.39584 64.32847) (xy 122.477966 64.32847) (xy 122.373524 64.272644) - (xy 122.255334 64.236792) (xy 122.163215 64.227719) (xy 122.132421 64.224686) (xy 122.101627 64.227719) (xy 117.24207 64.227719) - (xy 117.211278 64.224686) (xy 117.180486 64.227719) (xy 117.180485 64.227719) (xy 117.088366 64.236792) (xy 116.970176 64.272644) - (xy 116.861251 64.330866) (xy 116.765778 64.409218) (xy 116.746145 64.433141) (xy 114.798547 66.38074) (xy 113.810233 66.38074) - (xy 113.718088 66.319171) (xy 113.576683 66.260599) (xy 113.426568 66.23074) (xy 113.273512 66.23074) (xy 113.123397 66.260599) - (xy 112.981992 66.319171) (xy 112.854731 66.404204) (xy 112.746504 66.512431) (xy 112.661471 66.639692) (xy 112.602899 66.781097) - (xy 112.57304 66.931212) (xy 112.57304 67.084268) (xy 112.602899 67.234383) (xy 112.661471 67.375788) (xy 112.746504 67.503049) - (xy 112.854731 67.611276) (xy 112.981992 67.696309) (xy 113.123397 67.754881) (xy 113.273512 67.78474) (xy 113.426568 67.78474) - (xy 113.576683 67.754881) (xy 113.718088 67.696309) (xy 113.810233 67.63474) (xy 115.027464 67.63474) (xy 115.058258 67.637773) - (xy 115.089052 67.63474) (xy 115.181171 67.625667) (xy 115.299361 67.589815) (xy 115.408286 67.531593) (xy 115.503759 67.453241) - (xy 115.523396 67.429313) (xy 116.113579 66.839131) (xy 116.136475 67.019875) (xy 116.254106 67.372062) (xy 116.379623 67.606886) - (xy 116.669595 67.7328) (xy 117.803595 66.5988) (xy 117.789453 66.584658) (xy 117.969058 66.405053) (xy 117.9832 66.419195) - (xy 117.997343 66.405053) (xy 118.176948 66.584658) (xy 118.162805 66.5988) (xy 119.296805 67.7328) (xy 119.586777 67.606886) - (xy 119.752633 67.274674) (xy 119.85049 66.916488) (xy 119.876589 66.546094) (xy 119.829925 66.177725) (xy 119.712294 65.825538) - (xy 119.586777 65.590714) (xy 119.335768 65.481719) (xy 120.94658 65.481719) (xy 120.91694 65.630732) (xy 120.91694 65.783788) - (xy 120.946799 65.933903) (xy 121.005371 66.075308) (xy 121.090404 66.202569) (xy 121.198631 66.310796) (xy 121.325892 66.395829) - (xy 121.467297 66.454401) (xy 121.617412 66.48426) (xy 121.770468 66.48426) (xy 121.920583 66.454401) (xy 122.061988 66.395829) - (xy 122.189249 66.310796) (xy 122.290785 66.20926) (xy 126.558219 66.20926) (xy 126.640304 66.332109) (xy 126.748531 66.440336) - (xy 126.875792 66.525369) (xy 127.017197 66.583941) (xy 127.167312 66.6138) (xy 127.320368 66.6138) (xy 127.470483 66.583941) - (xy 127.611888 66.525369) (xy 127.739149 66.440336) (xy 127.847376 66.332109) (xy 127.932409 66.204848) (xy 127.990981 66.063443) - (xy 128.02084 65.913328) (xy 128.02084 65.760272) (xy 127.990981 65.610157) (xy 127.979513 65.58247) (xy 130.92585 65.58247) - (xy 130.819123 65.628814) (xy 130.653267 65.961026) (xy 130.55541 66.319212) (xy 130.529311 66.689606) (xy 130.575975 67.057975) - (xy 130.693606 67.410162) (xy 130.819123 67.644986) (xy 131.109095 67.7709) (xy 132.243095 66.6369) (xy 132.228953 66.622758) - (xy 132.408558 66.443153) (xy 132.4227 66.457295) (xy 132.436843 66.443153) (xy 132.616448 66.622758) (xy 132.602305 66.6369) - (xy 133.736305 67.7709) (xy 134.026277 67.644986) (xy 134.192133 67.312774) (xy 134.28999 66.954588) (xy 134.316089 66.584194) - (xy 134.269425 66.215825) (xy 134.151794 65.863638) (xy 134.026277 65.628814) (xy 133.819991 65.539239) (xy 134.622087 65.539239) - (xy 136.516561 67.433714) (xy 136.484992 67.465283) (xy 136.399959 67.592544) (xy 136.341387 67.733949) (xy 136.311528 67.884064) - (xy 136.311528 68.03712) (xy 136.341387 68.187235) (xy 136.399959 68.32864) (xy 136.484992 68.455901) (xy 136.593219 68.564128) - (xy 136.72048 68.649161) (xy 136.861885 68.707733) (xy 136.970577 68.729353) (xy 137.415431 69.174207) (xy 126.444332 69.174207) - (xy 125.570328 68.300203) (xy 125.542872 68.266748) (xy 125.509417 68.239292) (xy 125.509411 68.239286) (xy 125.409332 68.157154) - (xy 125.256976 68.075718) (xy 125.091662 68.02557) (xy 124.91974 68.008637) (xy 124.919739 68.008637) (xy 124.747817 68.02557) - (xy 124.582503 68.075718) (xy 124.430148 68.157154) (xy 124.330069 68.239286) (xy 124.330063 68.239292) (xy 124.296608 68.266748) - (xy 124.269152 68.300203) (xy 124.156476 68.412879) (xy 118.502017 68.412879) (xy 118.756462 68.327894) (xy 118.991286 68.202377) - (xy 119.100655 67.950505) (xy 131.2887 67.950505) (xy 131.414614 68.240477) (xy 131.746826 68.406333) (xy 132.105012 68.50419) - (xy 132.475406 68.530289) (xy 132.843775 68.483625) (xy 133.195962 68.365994) (xy 133.430786 68.240477) (xy 133.5567 67.950505) - (xy 132.4227 66.816505) (xy 131.2887 67.950505) (xy 119.100655 67.950505) (xy 119.1172 67.912405) (xy 117.9832 66.778405) - (xy 116.8492 67.912405) (xy 116.975114 68.202377) (xy 117.307326 68.368233) (xy 117.470744 68.412879) (xy 110.980596 68.412879) - (xy 111.011081 68.339283) (xy 111.04094 68.189168) (xy 111.04094 68.045574) (xy 115.927305 63.159211) (xy 149.954246 63.159211) - (xy 149.978889 63.161638) (xy 150.003532 63.159211) (xy 150.003542 63.159211) (xy 150.047358 63.154896) (xy 150.159392 63.17718) - (xy 150.312448 63.17718) (xy 150.462563 63.147321) (xy 150.603968 63.088749) (xy 150.731229 63.003716) (xy 150.784627 62.950318) - (xy 150.787399 62.954467) (xy 150.895626 63.062694) (xy 151.022887 63.147727) (xy 151.164292 63.206299) (xy 151.314407 63.236158) - (xy 151.467463 63.236158) (xy 151.617578 63.206299) (xy 151.758983 63.147727) (xy 151.886244 63.062694) (xy 151.994471 62.954467) - (xy 152.079504 62.827206) (xy 152.138076 62.685801) (xy 152.167935 62.535686) (xy 152.167935 62.38263) (xy 152.138076 62.232515) - (xy 152.079504 62.09111) (xy 152.007483 61.983323) (xy 152.035886 61.95492) (xy 152.120919 61.827659) (xy 152.179491 61.686254) - (xy 152.20935 61.536139) (xy 152.20935 61.383083) (xy 152.179491 61.232968) (xy 152.120919 61.091563) (xy 152.035886 60.964302) - (xy 151.927659 60.856075) (xy 151.800398 60.771042) (xy 151.658993 60.71247) (xy 151.508878 60.682611) (xy 151.364279 60.682611) - (xy 151.312596 60.640195) (xy 151.225387 60.593581) (xy 151.13076 60.564876) (xy 151.057004 60.557612) (xy 151.056994 60.557612) - (xy 151.032351 60.555185) (xy 151.007708 60.557612) (xy 138.220719 60.557612) (xy 138.196076 60.555185) (xy 138.171433 60.557612) - (xy 138.171423 60.557612) (xy 138.097667 60.564876) (xy 138.00304 60.593581) (xy 137.971454 60.610464) (xy 137.91583 60.640195) - (xy 137.85854 60.687212) (xy 137.858532 60.68722) (xy 137.839392 60.702928) (xy 137.823683 60.722069) (xy 137.335914 61.20984) - (xy 132.996058 61.20984) (xy 133.070561 61.098338) (xy 133.129133 60.956933) (xy 133.158992 60.806818) (xy 133.158992 60.663224) - (xy 134.305857 59.51636) (xy 144.861333 59.51636) (xy 144.962869 59.617896) (xy 145.09013 59.702929) (xy 145.231535 59.761501) - (xy 145.38165 59.79136) (xy 145.534706 59.79136) (xy 145.684821 59.761501) (xy 145.826226 59.702929) (xy 145.953487 59.617896) - (xy 146.061714 59.509669) (xy 146.146747 59.382408) (xy 146.205319 59.241003) (xy 146.235178 59.090888) (xy 146.235178 58.937832) - (xy 146.205319 58.787717) (xy 146.146747 58.646312) (xy 146.113499 58.596552) (xy 152.23214 58.596552) (xy 152.23214 58.749608) - (xy 152.261999 58.899723) (xy 152.320571 59.041128) (xy 152.38214 59.133273) (xy 152.38214 59.142286) (xy 152.379107 59.17308) - (xy 152.38214 59.203874) (xy 152.391213 59.295993) (xy 152.427065 59.414183) (xy 152.485288 59.523108) (xy 152.56364 59.618581) - (xy 152.587562 59.638213) (xy 154.044006 61.094658) (xy 154.063639 61.118581) (xy 154.159112 61.196933) (xy 154.268037 61.255155) - (xy 154.386227 61.291007) (xy 154.478346 61.30008) (xy 154.478347 61.30008) (xy 154.509139 61.303113) (xy 154.539931 61.30008) - (xy 155.742179 61.30008) (xy 155.761999 61.399723) (xy 155.820571 61.541128) (xy 155.905604 61.668389) (xy 156.013831 61.776616) - (xy 156.141092 61.861649) (xy 156.282497 61.920221) (xy 156.432612 61.95008) (xy 156.585668 61.95008) (xy 156.735783 61.920221) - (xy 156.877188 61.861649) (xy 157.004449 61.776616) (xy 157.112676 61.668389) (xy 157.197709 61.541128) (xy 157.256281 61.399723) - (xy 157.28614 61.249608) (xy 157.28614 61.096552) (xy 157.256281 60.946437) (xy 157.197709 60.805032) (xy 157.112676 60.677771) - (xy 157.004449 60.569544) (xy 156.877188 60.484511) (xy 156.735783 60.425939) (xy 156.627091 60.404319) (xy 156.474278 60.251507) - (xy 156.454641 60.227579) (xy 156.359168 60.149227) (xy 156.250243 60.091005) (xy 156.19429 60.074032) (xy 157.585545 60.074032) - (xy 157.610188 60.076459) (xy 157.634831 60.074032) (xy 157.634841 60.074032) (xy 157.708597 60.066768) (xy 157.803224 60.038063) - (xy 157.890433 59.991449) (xy 157.966872 59.928716) (xy 157.982589 59.909565) (xy 158.442075 59.45008) (xy 158.585668 59.45008) - (xy 158.735783 59.420221) (xy 158.877188 59.361649) (xy 159.004449 59.276616) (xy 159.112676 59.168389) (xy 159.197709 59.041128) - (xy 159.256281 58.899723) (xy 159.28614 58.749608) (xy 159.28614 58.596552) (xy 159.256281 58.446437) (xy 159.197709 58.305032) - (xy 159.112676 58.177771) (xy 159.004449 58.069544) (xy 158.886746 57.990897) (xy 160.301508 57.990897) (xy 160.379143 58.239972) - (xy 160.643183 58.365871) (xy 160.926711 58.437839) (xy 161.218831 58.453111) (xy 161.508319 58.411099) (xy 161.784047 58.313419) - (xy 161.921457 58.239972) (xy 161.999092 57.990897) (xy 172.277608 57.990897) (xy 172.355243 58.239972) (xy 172.619283 58.365871) - (xy 172.902811 58.437839) (xy 173.194931 58.453111) (xy 173.484419 58.411099) (xy 173.760147 58.313419) (xy 173.897557 58.239972) - (xy 173.975192 57.990897) (xy 173.962492 57.978197) (xy 184.253708 57.978197) (xy 184.331343 58.227272) (xy 184.595383 58.353171) - (xy 184.878911 58.425139) (xy 185.171031 58.440411) (xy 185.460519 58.398399) (xy 185.736247 58.300719) (xy 185.873657 58.227272) - (xy 185.951292 57.978197) (xy 185.938592 57.965497) (xy 196.255208 57.965497) (xy 196.332843 58.214572) (xy 196.596883 58.340471) - (xy 196.880411 58.412439) (xy 197.172531 58.427711) (xy 197.462019 58.385699) (xy 197.737747 58.288019) (xy 197.875157 58.214572) - (xy 197.952792 57.965497) (xy 197.104 57.116705) (xy 196.255208 57.965497) (xy 185.938592 57.965497) (xy 185.1025 57.129405) - (xy 184.253708 57.978197) (xy 173.962492 57.978197) (xy 173.1264 57.142105) (xy 172.277608 57.990897) (xy 161.999092 57.990897) - (xy 161.1503 57.142105) (xy 160.301508 57.990897) (xy 158.886746 57.990897) (xy 158.877188 57.984511) (xy 158.735783 57.925939) - (xy 158.585668 57.89608) (xy 158.432612 57.89608) (xy 158.282497 57.925939) (xy 158.141092 57.984511) (xy 158.013831 58.069544) - (xy 157.905604 58.177771) (xy 157.820571 58.305032) (xy 157.761999 58.446437) (xy 157.73214 58.596552) (xy 157.73214 58.740145) - (xy 157.402254 59.070032) (xy 155.207033 59.070032) (xy 155.105497 58.968496) (xy 154.978236 58.883463) (xy 154.836831 58.824891) - (xy 154.686716 58.795032) (xy 154.53366 58.795032) (xy 154.383545 58.824891) (xy 154.24214 58.883463) (xy 154.114879 58.968496) - (xy 154.006652 59.076723) (xy 153.923676 59.200905) (xy 153.717096 58.994325) (xy 153.756281 58.899723) (xy 153.78614 58.749608) - (xy 153.78614 58.596552) (xy 153.756281 58.446437) (xy 153.697709 58.305032) (xy 153.612676 58.177771) (xy 153.504449 58.069544) - (xy 153.377188 57.984511) (xy 153.235783 57.925939) (xy 153.085668 57.89608) (xy 152.932612 57.89608) (xy 152.782497 57.925939) - (xy 152.641092 57.984511) (xy 152.513831 58.069544) (xy 152.405604 58.177771) (xy 152.320571 58.305032) (xy 152.261999 58.446437) - (xy 152.23214 58.596552) (xy 146.113499 58.596552) (xy 146.061714 58.519051) (xy 145.953487 58.410824) (xy 145.826226 58.325791) - (xy 145.684821 58.267219) (xy 145.534706 58.23736) (xy 145.38165 58.23736) (xy 145.231535 58.267219) (xy 145.09013 58.325791) - (xy 144.962869 58.410824) (xy 144.861333 58.51236) (xy 134.122564 58.51236) (xy 134.097921 58.509933) (xy 134.073278 58.51236) - (xy 134.073269 58.51236) (xy 133.999513 58.519624) (xy 133.904886 58.548329) (xy 133.817677 58.594943) (xy 133.741238 58.657676) - (xy 133.725525 58.676822) (xy 132.449058 59.95329) (xy 132.305464 59.95329) (xy 132.155349 59.983149) (xy 132.013944 60.041721) - (xy 131.886683 60.126754) (xy 131.778456 60.234981) (xy 131.693423 60.362242) (xy 131.634851 60.503647) (xy 131.604992 60.653762) - (xy 131.604992 60.806818) (xy 131.634851 60.956933) (xy 131.693423 61.098338) (xy 131.767926 61.20984) (xy 118.209005 61.20984) - (xy 118.107469 61.108304) (xy 117.980208 61.023271) (xy 117.838803 60.964699) (xy 117.688688 60.93484) (xy 117.535632 60.93484) - (xy 117.385517 60.964699) (xy 117.244112 61.023271) (xy 117.116851 61.108304) (xy 117.008624 61.216531) (xy 116.923591 61.343792) - (xy 116.865019 61.485197) (xy 116.83516 61.635312) (xy 116.83516 61.788368) (xy 116.865019 61.938483) (xy 116.923591 62.079888) - (xy 116.97392 62.155211) (xy 115.744012 62.155211) (xy 115.719369 62.152784) (xy 115.694726 62.155211) (xy 115.694716 62.155211) - (xy 115.62096 62.162475) (xy 115.526333 62.19118) (xy 115.496457 62.207149) (xy 115.439123 62.237794) (xy 115.381833 62.284811) - (xy 115.381825 62.284819) (xy 115.362685 62.300527) (xy 115.346977 62.319667) (xy 110.331006 67.33564) (xy 110.222196 67.33564) - (xy 110.252633 67.274674) (xy 110.35049 66.916488) (xy 110.376589 66.546094) (xy 110.329925 66.177725) (xy 110.212294 65.825538) - (xy 110.086777 65.590714) (xy 109.796805 65.4648) (xy 108.662805 66.5988) (xy 108.676948 66.612943) (xy 108.497343 66.792548) - (xy 108.4832 66.778405) (xy 107.3492 67.912405) (xy 107.475114 68.202377) (xy 107.807326 68.368233) (xy 107.970744 68.412879) - (xy 107.13614 68.412879) (xy 107.13614 67.718273) (xy 107.169595 67.7328) (xy 108.303595 66.5988) (xy 107.169595 65.4648) - (xy 107.13614 65.479327) (xy 107.13614 65.285195) (xy 107.3492 65.285195) (xy 108.4832 66.419195) (xy 109.6172 65.285195) - (xy 109.491286 64.995223) (xy 109.159074 64.829367) (xy 108.800888 64.73151) (xy 108.430494 64.705411) (xy 108.062125 64.752075) - (xy 107.709938 64.869706) (xy 107.475114 64.995223) (xy 107.3492 65.285195) (xy 107.13614 65.285195) (xy 107.13614 58.659831) - (xy 118.8769 58.659831) (xy 118.8769 58.901529) (xy 118.924053 59.138583) (xy 119.016547 59.361882) (xy 119.150827 59.562847) - (xy 119.321733 59.733753) (xy 119.522698 59.868033) (xy 119.745997 59.960527) (xy 119.983051 60.00768) (xy 120.224749 60.00768) - (xy 120.461803 59.960527) (xy 120.685102 59.868033) (xy 120.773336 59.809077) (xy 121.795108 59.809077) (xy 121.872743 60.058152) - (xy 122.136783 60.184051) (xy 122.420311 60.256019) (xy 122.712431 60.271291) (xy 123.001919 60.229279) (xy 123.277647 60.131599) - (xy 123.415057 60.058152) (xy 123.492692 59.809077) (xy 124.335108 59.809077) (xy 124.412743 60.058152) (xy 124.676783 60.184051) - (xy 124.960311 60.256019) (xy 125.252431 60.271291) (xy 125.541919 60.229279) (xy 125.817647 60.131599) (xy 125.955057 60.058152) - (xy 126.032692 59.809077) (xy 126.875108 59.809077) (xy 126.952743 60.058152) (xy 127.216783 60.184051) (xy 127.500311 60.256019) - (xy 127.792431 60.271291) (xy 128.081919 60.229279) (xy 128.357647 60.131599) (xy 128.495057 60.058152) (xy 128.572692 59.809077) - (xy 127.7239 58.960285) (xy 126.875108 59.809077) (xy 126.032692 59.809077) (xy 125.1839 58.960285) (xy 124.335108 59.809077) - (xy 123.492692 59.809077) (xy 122.6439 58.960285) (xy 121.795108 59.809077) (xy 120.773336 59.809077) (xy 120.886067 59.733753) - (xy 121.056973 59.562847) (xy 121.191253 59.361882) (xy 121.236052 59.253729) (xy 121.292981 59.414427) (xy 121.366428 59.551837) - (xy 121.615503 59.629472) (xy 122.464295 58.78068) (xy 122.823505 58.78068) (xy 123.672297 59.629472) (xy 123.9139 59.554166) - (xy 124.155503 59.629472) (xy 125.004295 58.78068) (xy 125.363505 58.78068) (xy 126.212297 59.629472) (xy 126.4539 59.554166) - (xy 126.695503 59.629472) (xy 127.544295 58.78068) (xy 127.903505 58.78068) (xy 128.752297 59.629472) (xy 129.001372 59.551837) - (xy 129.043278 59.463951) (xy 129.047159 59.503357) (xy 129.082942 59.621321) (xy 129.141052 59.730036) (xy 129.219254 59.825326) - (xy 129.314544 59.903528) (xy 129.423259 59.961638) (xy 129.541223 59.997421) (xy 129.6639 60.009504) (xy 130.8639 60.009504) - (xy 130.986577 59.997421) (xy 131.104541 59.961638) (xy 131.213256 59.903528) (xy 131.308546 59.825326) (xy 131.386748 59.730036) - (xy 131.444858 59.621321) (xy 131.480641 59.503357) (xy 131.492724 59.38068) (xy 131.492724 58.18068) (xy 131.480641 58.058003) - (xy 131.460286 57.990897) (xy 136.374708 57.990897) (xy 136.452343 58.239972) (xy 136.716383 58.365871) (xy 136.999911 58.437839) - (xy 137.292031 58.453111) (xy 137.581519 58.411099) (xy 137.857247 58.313419) (xy 137.994657 58.239972) (xy 138.072292 57.990897) - (xy 148.325408 57.990897) (xy 148.403043 58.239972) (xy 148.667083 58.365871) (xy 148.950611 58.437839) (xy 149.242731 58.453111) - (xy 149.532219 58.411099) (xy 149.807947 58.313419) (xy 149.945357 58.239972) (xy 150.022992 57.990897) (xy 149.1742 57.142105) - (xy 148.325408 57.990897) (xy 138.072292 57.990897) (xy 137.2235 57.142105) (xy 136.374708 57.990897) (xy 131.460286 57.990897) - (xy 131.444858 57.940039) (xy 131.386748 57.831324) (xy 131.308546 57.736034) (xy 131.213256 57.657832) (xy 131.104541 57.599722) - (xy 130.986577 57.563939) (xy 130.8639 57.551856) (xy 129.6639 57.551856) (xy 129.541223 57.563939) (xy 129.423259 57.599722) - (xy 129.314544 57.657832) (xy 129.219254 57.736034) (xy 129.141052 57.831324) (xy 129.082942 57.940039) (xy 129.047159 58.058003) - (xy 129.044067 58.089399) (xy 129.001372 58.009523) (xy 128.752297 57.931888) (xy 127.903505 58.78068) (xy 127.544295 58.78068) - (xy 126.695503 57.931888) (xy 126.4539 58.007194) (xy 126.212297 57.931888) (xy 125.363505 58.78068) (xy 125.004295 58.78068) - (xy 124.155503 57.931888) (xy 123.9139 58.007194) (xy 123.672297 57.931888) (xy 122.823505 58.78068) (xy 122.464295 58.78068) - (xy 121.615503 57.931888) (xy 121.366428 58.009523) (xy 121.240529 58.273563) (xy 121.233466 58.301389) (xy 121.191253 58.199478) - (xy 121.056973 57.998513) (xy 120.886067 57.827607) (xy 120.685102 57.693327) (xy 120.461803 57.600833) (xy 120.224749 57.55368) - (xy 119.983051 57.55368) (xy 119.745997 57.600833) (xy 119.522698 57.693327) (xy 119.321733 57.827607) (xy 119.150827 57.998513) - (xy 119.016547 58.199478) (xy 118.924053 58.422777) (xy 118.8769 58.659831) (xy 107.13614 58.659831) (xy 107.13614 57.978197) - (xy 112.333608 57.978197) (xy 112.411243 58.227272) (xy 112.675283 58.353171) (xy 112.958811 58.425139) (xy 113.250931 58.440411) - (xy 113.540419 58.398399) (xy 113.816147 58.300719) (xy 113.953557 58.227272) (xy 114.031192 57.978197) (xy 113.1824 57.129405) - (xy 112.333608 57.978197) (xy 107.13614 57.978197) (xy 107.13614 57.018331) (xy 111.691789 57.018331) (xy 111.733801 57.307819) - (xy 111.831481 57.583547) (xy 111.904928 57.720957) (xy 112.154003 57.798592) (xy 113.002795 56.9498) (xy 113.362005 56.9498) - (xy 114.210797 57.798592) (xy 114.459872 57.720957) (xy 114.585771 57.456917) (xy 114.657739 57.173389) (xy 114.673011 56.881269) - (xy 114.630999 56.591781) (xy 114.533319 56.316053) (xy 114.459872 56.178643) (xy 114.271187 56.119831) (xy 118.8769 56.119831) - (xy 118.8769 56.361529) (xy 118.924053 56.598583) (xy 119.016547 56.821882) (xy 119.150827 57.022847) (xy 119.321733 57.193753) - (xy 119.522698 57.328033) (xy 119.745997 57.420527) (xy 119.983051 57.46768) (xy 120.224749 57.46768) (xy 120.461803 57.420527) - (xy 120.685102 57.328033) (xy 120.773336 57.269077) (xy 121.795108 57.269077) (xy 121.870414 57.51068) (xy 121.795108 57.752283) - (xy 122.6439 58.601075) (xy 123.492692 57.752283) (xy 123.417386 57.51068) (xy 123.492692 57.269077) (xy 124.335108 57.269077) - (xy 124.410414 57.51068) (xy 124.335108 57.752283) (xy 125.1839 58.601075) (xy 126.032692 57.752283) (xy 125.957386 57.51068) - (xy 126.032692 57.269077) (xy 126.875108 57.269077) (xy 126.950414 57.51068) (xy 126.875108 57.752283) (xy 127.7239 58.601075) - (xy 128.572692 57.752283) (xy 128.497386 57.51068) (xy 128.572692 57.269077) (xy 127.7239 56.420285) (xy 126.875108 57.269077) - (xy 126.032692 57.269077) (xy 125.1839 56.420285) (xy 124.335108 57.269077) (xy 123.492692 57.269077) (xy 122.6439 56.420285) - (xy 121.795108 57.269077) (xy 120.773336 57.269077) (xy 120.886067 57.193753) (xy 121.056973 57.022847) (xy 121.191253 56.821882) - (xy 121.236052 56.713729) (xy 121.292981 56.874427) (xy 121.366428 57.011837) (xy 121.615503 57.089472) (xy 122.464295 56.24068) - (xy 122.823505 56.24068) (xy 123.672297 57.089472) (xy 123.9139 57.014166) (xy 124.155503 57.089472) (xy 125.004295 56.24068) - (xy 125.363505 56.24068) (xy 126.212297 57.089472) (xy 126.4539 57.014166) (xy 126.695503 57.089472) (xy 127.544295 56.24068) - (xy 127.903505 56.24068) (xy 128.752297 57.089472) (xy 129.001372 57.011837) (xy 129.127271 56.747797) (xy 129.134334 56.719971) - (xy 129.176547 56.821882) (xy 129.310827 57.022847) (xy 129.481733 57.193753) (xy 129.682698 57.328033) (xy 129.905997 57.420527) - (xy 130.143051 57.46768) (xy 130.384749 57.46768) (xy 130.621803 57.420527) (xy 130.845102 57.328033) (xy 131.046067 57.193753) - (xy 131.208789 57.031031) (xy 135.732889 57.031031) (xy 135.774901 57.320519) (xy 135.872581 57.596247) (xy 135.946028 57.733657) - (xy 136.195103 57.811292) (xy 137.043895 56.9625) (xy 137.403105 56.9625) (xy 138.251897 57.811292) (xy 138.500972 57.733657) - (xy 138.626871 57.469617) (xy 138.698839 57.186089) (xy 138.706945 57.031031) (xy 147.683589 57.031031) (xy 147.725601 57.320519) - (xy 147.823281 57.596247) (xy 147.896728 57.733657) (xy 148.145803 57.811292) (xy 148.994595 56.9625) (xy 149.353805 56.9625) - (xy 150.202597 57.811292) (xy 150.451672 57.733657) (xy 150.577571 57.469617) (xy 150.649539 57.186089) (xy 150.657645 57.031031) - (xy 159.659689 57.031031) (xy 159.701701 57.320519) (xy 159.799381 57.596247) (xy 159.872828 57.733657) (xy 160.121903 57.811292) - (xy 160.970695 56.9625) (xy 161.329905 56.9625) (xy 162.178697 57.811292) (xy 162.427772 57.733657) (xy 162.553671 57.469617) - (xy 162.625639 57.186089) (xy 162.633745 57.031031) (xy 171.635789 57.031031) (xy 171.677801 57.320519) (xy 171.775481 57.596247) - (xy 171.848928 57.733657) (xy 172.098003 57.811292) (xy 172.946795 56.9625) (xy 173.306005 56.9625) (xy 174.154797 57.811292) - (xy 174.403872 57.733657) (xy 174.529771 57.469617) (xy 174.601739 57.186089) (xy 174.610509 57.018331) (xy 183.611889 57.018331) - (xy 183.653901 57.307819) (xy 183.751581 57.583547) (xy 183.825028 57.720957) (xy 184.074103 57.798592) (xy 184.922895 56.9498) - (xy 185.282105 56.9498) (xy 186.130897 57.798592) (xy 186.379972 57.720957) (xy 186.505871 57.456917) (xy 186.577839 57.173389) - (xy 186.586609 57.005631) (xy 195.613389 57.005631) (xy 195.655401 57.295119) (xy 195.753081 57.570847) (xy 195.826528 57.708257) - (xy 196.075603 57.785892) (xy 196.924395 56.9371) (xy 197.283605 56.9371) (xy 198.132397 57.785892) (xy 198.381472 57.708257) - (xy 198.507371 57.444217) (xy 198.579339 57.160689) (xy 198.594611 56.868569) (xy 198.552599 56.579081) (xy 198.454919 56.303353) - (xy 198.381472 56.165943) (xy 198.132397 56.088308) (xy 197.283605 56.9371) (xy 196.924395 56.9371) (xy 196.075603 56.088308) - (xy 195.826528 56.165943) (xy 195.700629 56.429983) (xy 195.628661 56.713511) (xy 195.613389 57.005631) (xy 186.586609 57.005631) - (xy 186.593111 56.881269) (xy 186.551099 56.591781) (xy 186.453419 56.316053) (xy 186.379972 56.178643) (xy 186.130897 56.101008) - (xy 185.282105 56.9498) (xy 184.922895 56.9498) (xy 184.074103 56.101008) (xy 183.825028 56.178643) (xy 183.699129 56.442683) - (xy 183.627161 56.726211) (xy 183.611889 57.018331) (xy 174.610509 57.018331) (xy 174.617011 56.893969) (xy 174.574999 56.604481) - (xy 174.477319 56.328753) (xy 174.403872 56.191343) (xy 174.154797 56.113708) (xy 173.306005 56.9625) (xy 172.946795 56.9625) - (xy 172.098003 56.113708) (xy 171.848928 56.191343) (xy 171.723029 56.455383) (xy 171.651061 56.738911) (xy 171.635789 57.031031) - (xy 162.633745 57.031031) (xy 162.640911 56.893969) (xy 162.598899 56.604481) (xy 162.501219 56.328753) (xy 162.427772 56.191343) - (xy 162.178697 56.113708) (xy 161.329905 56.9625) (xy 160.970695 56.9625) (xy 160.121903 56.113708) (xy 159.872828 56.191343) - (xy 159.746929 56.455383) (xy 159.674961 56.738911) (xy 159.659689 57.031031) (xy 150.657645 57.031031) (xy 150.664811 56.893969) - (xy 150.622799 56.604481) (xy 150.525119 56.328753) (xy 150.451672 56.191343) (xy 150.202597 56.113708) (xy 149.353805 56.9625) - (xy 148.994595 56.9625) (xy 148.145803 56.113708) (xy 147.896728 56.191343) (xy 147.770829 56.455383) (xy 147.698861 56.738911) - (xy 147.683589 57.031031) (xy 138.706945 57.031031) (xy 138.714111 56.893969) (xy 138.672099 56.604481) (xy 138.574419 56.328753) - (xy 138.500972 56.191343) (xy 138.251897 56.113708) (xy 137.403105 56.9625) (xy 137.043895 56.9625) (xy 136.195103 56.113708) - (xy 135.946028 56.191343) (xy 135.820129 56.455383) (xy 135.748161 56.738911) (xy 135.732889 57.031031) (xy 131.208789 57.031031) - (xy 131.216973 57.022847) (xy 131.351253 56.821882) (xy 131.443747 56.598583) (xy 131.4909 56.361529) (xy 131.4909 56.119831) - (xy 131.453957 55.934103) (xy 136.374708 55.934103) (xy 137.2235 56.782895) (xy 138.072292 55.934103) (xy 148.325408 55.934103) - (xy 149.1742 56.782895) (xy 150.022992 55.934103) (xy 160.301508 55.934103) (xy 161.1503 56.782895) (xy 161.999092 55.934103) - (xy 172.277608 55.934103) (xy 173.1264 56.782895) (xy 173.975192 55.934103) (xy 173.971234 55.921403) (xy 184.253708 55.921403) - (xy 185.1025 56.770195) (xy 185.951292 55.921403) (xy 185.947334 55.908703) (xy 196.255208 55.908703) (xy 197.104 56.757495) - (xy 197.952792 55.908703) (xy 197.875157 55.659628) (xy 197.611117 55.533729) (xy 197.327589 55.461761) (xy 197.035469 55.446489) - (xy 196.745981 55.488501) (xy 196.470253 55.586181) (xy 196.332843 55.659628) (xy 196.255208 55.908703) (xy 185.947334 55.908703) - (xy 185.873657 55.672328) (xy 185.609617 55.546429) (xy 185.326089 55.474461) (xy 185.033969 55.459189) (xy 184.744481 55.501201) - (xy 184.468753 55.598881) (xy 184.331343 55.672328) (xy 184.253708 55.921403) (xy 173.971234 55.921403) (xy 173.897557 55.685028) - (xy 173.633517 55.559129) (xy 173.349989 55.487161) (xy 173.057869 55.471889) (xy 172.768381 55.513901) (xy 172.492653 55.611581) - (xy 172.355243 55.685028) (xy 172.277608 55.934103) (xy 161.999092 55.934103) (xy 161.921457 55.685028) (xy 161.657417 55.559129) - (xy 161.373889 55.487161) (xy 161.081769 55.471889) (xy 160.792281 55.513901) (xy 160.516553 55.611581) (xy 160.379143 55.685028) - (xy 160.301508 55.934103) (xy 150.022992 55.934103) (xy 149.945357 55.685028) (xy 149.681317 55.559129) (xy 149.397789 55.487161) - (xy 149.105669 55.471889) (xy 148.816181 55.513901) (xy 148.540453 55.611581) (xy 148.403043 55.685028) (xy 148.325408 55.934103) - (xy 138.072292 55.934103) (xy 137.994657 55.685028) (xy 137.730617 55.559129) (xy 137.447089 55.487161) (xy 137.154969 55.471889) - (xy 136.865481 55.513901) (xy 136.589753 55.611581) (xy 136.452343 55.685028) (xy 136.374708 55.934103) (xy 131.453957 55.934103) - (xy 131.443747 55.882777) (xy 131.351253 55.659478) (xy 131.216973 55.458513) (xy 131.046067 55.287607) (xy 130.845102 55.153327) - (xy 130.621803 55.060833) (xy 130.384749 55.01368) (xy 130.143051 55.01368) (xy 129.905997 55.060833) (xy 129.682698 55.153327) - (xy 129.481733 55.287607) (xy 129.310827 55.458513) (xy 129.176547 55.659478) (xy 129.131748 55.767631) (xy 129.074819 55.606933) - (xy 129.001372 55.469523) (xy 128.752297 55.391888) (xy 127.903505 56.24068) (xy 127.544295 56.24068) (xy 126.695503 55.391888) - (xy 126.4539 55.467194) (xy 126.212297 55.391888) (xy 125.363505 56.24068) (xy 125.004295 56.24068) (xy 124.155503 55.391888) - (xy 123.9139 55.467194) (xy 123.672297 55.391888) (xy 122.823505 56.24068) (xy 122.464295 56.24068) (xy 121.615503 55.391888) - (xy 121.366428 55.469523) (xy 121.240529 55.733563) (xy 121.233466 55.761389) (xy 121.191253 55.659478) (xy 121.056973 55.458513) - (xy 120.886067 55.287607) (xy 120.773337 55.212283) (xy 121.795108 55.212283) (xy 122.6439 56.061075) (xy 123.492692 55.212283) - (xy 124.335108 55.212283) (xy 125.1839 56.061075) (xy 126.032692 55.212283) (xy 126.875108 55.212283) (xy 127.7239 56.061075) - (xy 128.572692 55.212283) (xy 128.495057 54.963208) (xy 128.343404 54.890897) (xy 136.374708 54.890897) (xy 136.452343 55.139972) - (xy 136.716383 55.265871) (xy 136.999911 55.337839) (xy 137.292031 55.353111) (xy 137.581519 55.311099) (xy 137.857247 55.213419) - (xy 137.994657 55.139972) (xy 138.072292 54.890897) (xy 137.2235 54.042105) (xy 136.374708 54.890897) (xy 128.343404 54.890897) - (xy 128.231017 54.837309) (xy 127.947489 54.765341) (xy 127.655369 54.750069) (xy 127.365881 54.792081) (xy 127.090153 54.889761) - (xy 126.952743 54.963208) (xy 126.875108 55.212283) (xy 126.032692 55.212283) (xy 125.955057 54.963208) (xy 125.691017 54.837309) - (xy 125.407489 54.765341) (xy 125.115369 54.750069) (xy 124.825881 54.792081) (xy 124.550153 54.889761) (xy 124.412743 54.963208) - (xy 124.335108 55.212283) (xy 123.492692 55.212283) (xy 123.415057 54.963208) (xy 123.151017 54.837309) (xy 122.867489 54.765341) - (xy 122.575369 54.750069) (xy 122.285881 54.792081) (xy 122.010153 54.889761) (xy 121.872743 54.963208) (xy 121.795108 55.212283) - (xy 120.773337 55.212283) (xy 120.685102 55.153327) (xy 120.461803 55.060833) (xy 120.224749 55.01368) (xy 119.983051 55.01368) - (xy 119.745997 55.060833) (xy 119.522698 55.153327) (xy 119.321733 55.287607) (xy 119.150827 55.458513) (xy 119.016547 55.659478) - (xy 118.924053 55.882777) (xy 118.8769 56.119831) (xy 114.271187 56.119831) (xy 114.210797 56.101008) (xy 113.362005 56.9498) - (xy 113.002795 56.9498) (xy 112.154003 56.101008) (xy 111.904928 56.178643) (xy 111.779029 56.442683) (xy 111.707061 56.726211) - (xy 111.691789 57.018331) (xy 107.13614 57.018331) (xy 107.13614 55.921403) (xy 112.333608 55.921403) (xy 113.1824 56.770195) - (xy 114.031192 55.921403) (xy 113.953557 55.672328) (xy 113.689517 55.546429) (xy 113.405989 55.474461) (xy 113.113869 55.459189) - (xy 112.824381 55.501201) (xy 112.548653 55.598881) (xy 112.411243 55.672328) (xy 112.333608 55.921403) (xy 107.13614 55.921403) - (xy 107.13614 54.878197) (xy 112.333608 54.878197) (xy 112.411243 55.127272) (xy 112.675283 55.253171) (xy 112.958811 55.325139) - (xy 113.250931 55.340411) (xy 113.540419 55.298399) (xy 113.816147 55.200719) (xy 113.953557 55.127272) (xy 114.031192 54.878197) - (xy 113.1824 54.029405) (xy 112.333608 54.878197) (xy 107.13614 54.878197) (xy 107.13614 53.918331) (xy 111.691789 53.918331) - (xy 111.733801 54.207819) (xy 111.831481 54.483547) (xy 111.904928 54.620957) (xy 112.154003 54.698592) (xy 113.002795 53.8498) - (xy 113.362005 53.8498) (xy 114.210797 54.698592) (xy 114.459872 54.620957) (xy 114.585771 54.356917) (xy 114.657739 54.073389) - (xy 114.673011 53.781269) (xy 114.630999 53.491781) (xy 114.533319 53.216053) (xy 114.459872 53.078643) (xy 114.210797 53.001008) - (xy 113.362005 53.8498) (xy 113.002795 53.8498) (xy 112.154003 53.001008) (xy 111.904928 53.078643) (xy 111.779029 53.342683) - (xy 111.707061 53.626211) (xy 111.691789 53.918331) (xy 107.13614 53.918331) (xy 107.13614 52.821403) (xy 112.333608 52.821403) - (xy 113.1824 53.670195) (xy 114.031192 52.821403) (xy 113.953557 52.572328) (xy 113.689517 52.446429) (xy 113.405989 52.374461) - (xy 113.113869 52.359189) (xy 112.824381 52.401201) (xy 112.548653 52.498881) (xy 112.411243 52.572328) (xy 112.333608 52.821403) - (xy 107.13614 52.821403) (xy 107.13614 50.329253) (xy 111.7554 50.329253) (xy 111.7554 50.610347) (xy 111.810238 50.886041) - (xy 111.917809 51.145738) (xy 112.073976 51.37946) (xy 112.27274 51.578224) (xy 112.506462 51.734391) (xy 112.766159 51.841962) - (xy 113.041853 51.8968) (xy 113.322947 51.8968) (xy 113.598641 51.841962) (xy 113.858338 51.734391) (xy 114.09206 51.578224) - (xy 114.210187 51.460097) (xy 117.893208 51.460097) (xy 117.970843 51.709172) (xy 118.234883 51.835071) (xy 118.518411 51.907039) - (xy 118.810531 51.922311) (xy 119.100019 51.880299) (xy 119.375747 51.782619) (xy 119.513157 51.709172) (xy 119.590792 51.460097) - (xy 118.742 50.611305) (xy 117.893208 51.460097) (xy 114.210187 51.460097) (xy 114.290824 51.37946) (xy 114.446991 51.145738) - (xy 114.554562 50.886041) (xy 114.6094 50.610347) (xy 114.6094 50.500231) (xy 117.251389 50.500231) (xy 117.293401 50.789719) - (xy 117.391081 51.065447) (xy 117.464528 51.202857) (xy 117.713603 51.280492) (xy 118.562395 50.4317) (xy 118.921605 50.4317) - (xy 119.770397 51.280492) (xy 120.019472 51.202857) (xy 120.145371 50.938817) (xy 120.217339 50.655289) (xy 120.232611 50.363169) - (xy 120.225019 50.310851) (xy 120.615 50.310851) (xy 120.615 50.552549) (xy 120.662153 50.789603) (xy 120.754647 51.012902) - (xy 120.888927 51.213867) (xy 121.059833 51.384773) (xy 121.260798 51.519053) (xy 121.484097 51.611547) (xy 121.721151 51.6587) - (xy 121.962849 51.6587) (xy 122.145881 51.622293) (xy 123.357655 52.834067) (xy 123.377288 52.85799) (xy 123.472761 52.936342) - (xy 123.581686 52.994564) (xy 123.699876 53.030416) (xy 123.822789 53.042522) (xy 123.853583 53.039489) (xy 136.11239 53.039489) - (xy 135.946028 53.091343) (xy 135.820129 53.355383) (xy 135.748161 53.638911) (xy 135.732889 53.931031) (xy 135.774901 54.220519) - (xy 135.872581 54.496247) (xy 135.946028 54.633657) (xy 136.195103 54.711292) (xy 137.043895 53.8625) (xy 137.029753 53.848358) - (xy 137.209358 53.668753) (xy 137.2235 53.682895) (xy 137.237643 53.668753) (xy 137.417248 53.848358) (xy 137.403105 53.8625) - (xy 138.251897 54.711292) (xy 138.500972 54.633657) (xy 138.626871 54.369617) (xy 138.698839 54.086089) (xy 138.714111 53.793969) - (xy 138.672099 53.504481) (xy 138.574419 53.228753) (xy 138.500972 53.091343) (xy 138.33461 53.039489) (xy 147.464478 53.039489) - (xy 147.983607 53.558619) (xy 147.9472 53.741651) (xy 147.9472 53.983349) (xy 147.994353 54.220403) (xy 148.086847 54.443702) - (xy 148.221127 54.644667) (xy 148.392033 54.815573) (xy 148.592998 54.949853) (xy 148.816297 55.042347) (xy 149.053351 55.0895) - (xy 149.295049 55.0895) (xy 149.532103 55.042347) (xy 149.755402 54.949853) (xy 149.843636 54.890897) (xy 160.301508 54.890897) - (xy 160.379143 55.139972) (xy 160.643183 55.265871) (xy 160.926711 55.337839) (xy 161.218831 55.353111) (xy 161.508319 55.311099) - (xy 161.784047 55.213419) (xy 161.921457 55.139972) (xy 161.999092 54.890897) (xy 161.1503 54.042105) (xy 160.301508 54.890897) - (xy 149.843636 54.890897) (xy 149.956367 54.815573) (xy 150.127273 54.644667) (xy 150.261553 54.443702) (xy 150.354047 54.220403) - (xy 150.4012 53.983349) (xy 150.4012 53.931031) (xy 159.659689 53.931031) (xy 159.701701 54.220519) (xy 159.799381 54.496247) - (xy 159.872828 54.633657) (xy 160.121903 54.711292) (xy 160.970695 53.8625) (xy 161.329905 53.8625) (xy 162.178697 54.711292) - (xy 162.427772 54.633657) (xy 162.553671 54.369617) (xy 162.625639 54.086089) (xy 162.640911 53.793969) (xy 162.598899 53.504481) - (xy 162.501219 53.228753) (xy 162.427772 53.091343) (xy 162.178697 53.013708) (xy 161.329905 53.8625) (xy 160.970695 53.8625) - (xy 160.121903 53.013708) (xy 159.872828 53.091343) (xy 159.746929 53.355383) (xy 159.674961 53.638911) (xy 159.659689 53.931031) - (xy 150.4012 53.931031) (xy 150.4012 53.741651) (xy 150.364793 53.558619) (xy 151.183923 52.739489) (xy 160.330999 52.739489) - (xy 160.301508 52.834103) (xy 161.1503 53.682895) (xy 161.999092 52.834103) (xy 161.969601 52.739489) (xy 171.116678 52.739489) - (xy 171.935807 53.558619) (xy 171.8994 53.741651) (xy 171.8994 53.983349) (xy 171.946553 54.220403) (xy 172.039047 54.443702) - (xy 172.173327 54.644667) (xy 172.344233 54.815573) (xy 172.545198 54.949853) (xy 172.768497 55.042347) (xy 173.005551 55.0895) - (xy 173.247249 55.0895) (xy 173.484303 55.042347) (xy 173.707602 54.949853) (xy 173.814843 54.878197) (xy 184.253708 54.878197) - (xy 184.331343 55.127272) (xy 184.595383 55.253171) (xy 184.878911 55.325139) (xy 185.171031 55.340411) (xy 185.460519 55.298399) - (xy 185.736247 55.200719) (xy 185.873657 55.127272) (xy 185.951292 54.878197) (xy 185.1025 54.029405) (xy 184.253708 54.878197) - (xy 173.814843 54.878197) (xy 173.908567 54.815573) (xy 174.079473 54.644667) (xy 174.213753 54.443702) (xy 174.306247 54.220403) - (xy 174.3534 53.983349) (xy 174.3534 53.918331) (xy 183.611889 53.918331) (xy 183.653901 54.207819) (xy 183.751581 54.483547) - (xy 183.825028 54.620957) (xy 184.074103 54.698592) (xy 184.922895 53.8498) (xy 185.282105 53.8498) (xy 186.130897 54.698592) - (xy 186.379972 54.620957) (xy 186.505871 54.356917) (xy 186.577839 54.073389) (xy 186.593111 53.781269) (xy 186.551099 53.491781) - (xy 186.453419 53.216053) (xy 186.379972 53.078643) (xy 186.130897 53.001008) (xy 185.282105 53.8498) (xy 184.922895 53.8498) - (xy 184.074103 53.001008) (xy 183.825028 53.078643) (xy 183.699129 53.342683) (xy 183.627161 53.626211) (xy 183.611889 53.918331) - (xy 174.3534 53.918331) (xy 174.3534 53.741651) (xy 174.316993 53.558619) (xy 175.148823 52.726789) (xy 184.283199 52.726789) - (xy 184.253708 52.821403) (xy 185.1025 53.670195) (xy 185.951292 52.821403) (xy 185.921801 52.726789) (xy 195.106978 52.726789) - (xy 195.913407 53.533219) (xy 195.877 53.716251) (xy 195.877 53.957949) (xy 195.924153 54.195003) (xy 196.016647 54.418302) - (xy 196.150927 54.619267) (xy 196.321833 54.790173) (xy 196.522798 54.924453) (xy 196.746097 55.016947) (xy 196.983151 55.0641) - (xy 197.224849 55.0641) (xy 197.461903 55.016947) (xy 197.685202 54.924453) (xy 197.886167 54.790173) (xy 198.057073 54.619267) - (xy 198.191353 54.418302) (xy 198.283847 54.195003) (xy 198.331 53.957949) (xy 198.331 53.716251) (xy 198.283847 53.479197) - (xy 198.191353 53.255898) (xy 198.057073 53.054933) (xy 197.886167 52.884027) (xy 197.685202 52.749747) (xy 197.461903 52.657253) - (xy 197.224849 52.6101) (xy 196.983151 52.6101) (xy 196.800119 52.646507) (xy 195.831827 51.678216) (xy 195.81219 51.654288) - (xy 195.716717 51.575936) (xy 195.607792 51.517714) (xy 195.489602 51.481862) (xy 195.397483 51.472789) (xy 195.366689 51.469756) - (xy 195.335895 51.472789) (xy 186.117595 51.472789) (xy 186.210924 51.37946) (xy 186.367091 51.145738) (xy 186.474662 50.886041) - (xy 186.5295 50.610347) (xy 186.5295 50.329253) (xy 186.526974 50.316553) (xy 195.677 50.316553) (xy 195.677 50.597647) - (xy 195.731838 50.873341) (xy 195.839409 51.133038) (xy 195.995576 51.36676) (xy 196.19434 51.565524) (xy 196.428062 51.721691) - (xy 196.687759 51.829262) (xy 196.963453 51.8841) (xy 197.244547 51.8841) (xy 197.520241 51.829262) (xy 197.779938 51.721691) - (xy 198.01366 51.565524) (xy 198.212424 51.36676) (xy 198.368591 51.133038) (xy 198.476162 50.873341) (xy 198.531 50.597647) - (xy 198.531 50.316553) (xy 198.476162 50.040859) (xy 198.368591 49.781162) (xy 198.212424 49.54744) (xy 198.01366 49.348676) - (xy 197.779938 49.192509) (xy 197.520241 49.084938) (xy 197.244547 49.0301) (xy 196.963453 49.0301) (xy 196.687759 49.084938) - (xy 196.428062 49.192509) (xy 196.19434 49.348676) (xy 195.995576 49.54744) (xy 195.839409 49.781162) (xy 195.731838 50.040859) - (xy 195.677 50.316553) (xy 186.526974 50.316553) (xy 186.474662 50.053559) (xy 186.367091 49.793862) (xy 186.210924 49.56014) - (xy 186.01216 49.361376) (xy 185.778438 49.205209) (xy 185.518741 49.097638) (xy 185.243047 49.0428) (xy 184.961953 49.0428) - (xy 184.686259 49.097638) (xy 184.426562 49.205209) (xy 184.19284 49.361376) (xy 183.994076 49.56014) (xy 183.837909 49.793862) - (xy 183.730338 50.053559) (xy 183.6755 50.329253) (xy 183.6755 50.610347) (xy 183.730338 50.886041) (xy 183.837909 51.145738) - (xy 183.994076 51.37946) (xy 184.087405 51.472789) (xy 174.919905 51.472789) (xy 174.889111 51.469756) (xy 174.858317 51.472789) - (xy 174.766198 51.481862) (xy 174.648008 51.517714) (xy 174.539083 51.575936) (xy 174.44361 51.654288) (xy 174.423977 51.678211) - (xy 173.430281 52.671907) (xy 173.247249 52.6355) (xy 173.005551 52.6355) (xy 172.822519 52.671907) (xy 171.841527 51.690916) - (xy 171.82189 51.666988) (xy 171.726417 51.588636) (xy 171.617492 51.530414) (xy 171.499302 51.494562) (xy 171.407183 51.485489) - (xy 171.376389 51.482456) (xy 171.345595 51.485489) (xy 162.165395 51.485489) (xy 162.258724 51.39216) (xy 162.414891 51.158438) - (xy 162.522462 50.898741) (xy 162.5773 50.623047) (xy 162.5773 50.341953) (xy 171.6994 50.341953) (xy 171.6994 50.623047) - (xy 171.754238 50.898741) (xy 171.861809 51.158438) (xy 172.017976 51.39216) (xy 172.21674 51.590924) (xy 172.450462 51.747091) - (xy 172.710159 51.854662) (xy 172.985853 51.9095) (xy 173.266947 51.9095) (xy 173.542641 51.854662) (xy 173.802338 51.747091) - (xy 174.03606 51.590924) (xy 174.234824 51.39216) (xy 174.390991 51.158438) (xy 174.498562 50.898741) (xy 174.5534 50.623047) - (xy 174.5534 50.341953) (xy 174.498562 50.066259) (xy 174.390991 49.806562) (xy 174.234824 49.57284) (xy 174.03606 49.374076) - (xy 173.802338 49.217909) (xy 173.542641 49.110338) (xy 173.266947 49.0555) (xy 172.985853 49.0555) (xy 172.710159 49.110338) - (xy 172.450462 49.217909) (xy 172.21674 49.374076) (xy 172.017976 49.57284) (xy 171.861809 49.806562) (xy 171.754238 50.066259) - (xy 171.6994 50.341953) (xy 162.5773 50.341953) (xy 162.522462 50.066259) (xy 162.414891 49.806562) (xy 162.258724 49.57284) - (xy 162.05996 49.374076) (xy 161.826238 49.217909) (xy 161.566541 49.110338) (xy 161.290847 49.0555) (xy 161.009753 49.0555) - (xy 160.734059 49.110338) (xy 160.474362 49.217909) (xy 160.24064 49.374076) (xy 160.041876 49.57284) (xy 159.885709 49.806562) - (xy 159.778138 50.066259) (xy 159.7233 50.341953) (xy 159.7233 50.623047) (xy 159.778138 50.898741) (xy 159.885709 51.158438) - (xy 160.041876 51.39216) (xy 160.135205 51.485489) (xy 150.955002 51.485489) (xy 150.92421 51.482456) (xy 150.893418 51.485489) - (xy 150.893417 51.485489) (xy 150.801298 51.494562) (xy 150.683108 51.530414) (xy 150.574183 51.588636) (xy 150.47871 51.666988) - (xy 150.459077 51.690911) (xy 149.478081 52.671907) (xy 149.295049 52.6355) (xy 149.053351 52.6355) (xy 148.870319 52.671907) - (xy 148.189327 51.990916) (xy 148.16969 51.966988) (xy 148.074217 51.888636) (xy 147.965292 51.830414) (xy 147.847102 51.794562) - (xy 147.754983 51.785489) (xy 147.724189 51.782456) (xy 147.693395 51.785489) (xy 137.806738 51.785489) (xy 137.899438 51.747091) - (xy 138.13316 51.590924) (xy 138.331924 51.39216) (xy 138.488091 51.158438) (xy 138.595662 50.898741) (xy 138.6505 50.623047) - (xy 138.6505 50.341953) (xy 147.7472 50.341953) (xy 147.7472 50.623047) (xy 147.802038 50.898741) (xy 147.909609 51.158438) - (xy 148.065776 51.39216) (xy 148.26454 51.590924) (xy 148.498262 51.747091) (xy 148.757959 51.854662) (xy 149.033653 51.9095) - (xy 149.314747 51.9095) (xy 149.590441 51.854662) (xy 149.850138 51.747091) (xy 150.08386 51.590924) (xy 150.282624 51.39216) - (xy 150.438791 51.158438) (xy 150.546362 50.898741) (xy 150.6012 50.623047) (xy 150.6012 50.341953) (xy 150.546362 50.066259) - (xy 150.438791 49.806562) (xy 150.282624 49.57284) (xy 150.08386 49.374076) (xy 149.850138 49.217909) (xy 149.590441 49.110338) - (xy 149.314747 49.0555) (xy 149.033653 49.0555) (xy 148.757959 49.110338) (xy 148.498262 49.217909) (xy 148.26454 49.374076) - (xy 148.065776 49.57284) (xy 147.909609 49.806562) (xy 147.802038 50.066259) (xy 147.7472 50.341953) (xy 138.6505 50.341953) - (xy 138.595662 50.066259) (xy 138.488091 49.806562) (xy 138.331924 49.57284) (xy 138.13316 49.374076) (xy 137.899438 49.217909) - (xy 137.639741 49.110338) (xy 137.364047 49.0555) (xy 137.082953 49.0555) (xy 136.807259 49.110338) (xy 136.547562 49.217909) - (xy 136.31384 49.374076) (xy 136.115076 49.57284) (xy 135.958909 49.806562) (xy 135.851338 50.066259) (xy 135.7965 50.341953) - (xy 135.7965 50.623047) (xy 135.851338 50.898741) (xy 135.958909 51.158438) (xy 136.115076 51.39216) (xy 136.31384 51.590924) - (xy 136.547562 51.747091) (xy 136.640262 51.785489) (xy 125.682597 51.785489) (xy 125.897938 51.696291) (xy 126.13166 51.540124) - (xy 126.330424 51.34136) (xy 126.486591 51.107638) (xy 126.594162 50.847941) (xy 126.649 50.572247) (xy 126.649 50.310851) - (xy 128.915 50.310851) (xy 128.915 50.552549) (xy 128.962153 50.789603) (xy 129.054647 51.012902) (xy 129.188927 51.213867) - (xy 129.359833 51.384773) (xy 129.560798 51.519053) (xy 129.784097 51.611547) (xy 130.021151 51.6587) (xy 130.262849 51.6587) - (xy 130.499903 51.611547) (xy 130.723202 51.519053) (xy 130.924167 51.384773) (xy 131.095073 51.213867) (xy 131.229353 51.012902) - (xy 131.321847 50.789603) (xy 131.369 50.552549) (xy 131.369 50.310851) (xy 131.321847 50.073797) (xy 131.229353 49.850498) - (xy 131.095073 49.649533) (xy 130.924167 49.478627) (xy 130.723202 49.344347) (xy 130.499903 49.251853) (xy 130.262849 49.2047) - (xy 130.021151 49.2047) (xy 129.784097 49.251853) (xy 129.560798 49.344347) (xy 129.359833 49.478627) (xy 129.188927 49.649533) - (xy 129.054647 49.850498) (xy 128.962153 50.073797) (xy 128.915 50.310851) (xy 126.649 50.310851) (xy 126.649 50.291153) - (xy 126.594162 50.015459) (xy 126.486591 49.755762) (xy 126.330424 49.52204) (xy 126.13166 49.323276) (xy 125.897938 49.167109) - (xy 125.638241 49.059538) (xy 125.362547 49.0047) (xy 125.081453 49.0047) (xy 124.805759 49.059538) (xy 124.546062 49.167109) - (xy 124.31234 49.323276) (xy 124.113576 49.52204) (xy 123.957409 49.755762) (xy 123.849838 50.015459) (xy 123.795 50.291153) - (xy 123.795 50.572247) (xy 123.849838 50.847941) (xy 123.957409 51.107638) (xy 124.113576 51.34136) (xy 124.31234 51.540124) - (xy 124.546062 51.696291) (xy 124.761403 51.785489) (xy 124.082501 51.785489) (xy 123.032593 50.735581) (xy 123.069 50.552549) - (xy 123.069 50.310851) (xy 123.021847 50.073797) (xy 122.929353 49.850498) (xy 122.795073 49.649533) (xy 122.624167 49.478627) - (xy 122.423202 49.344347) (xy 122.199903 49.251853) (xy 121.962849 49.2047) (xy 121.721151 49.2047) (xy 121.484097 49.251853) - (xy 121.260798 49.344347) (xy 121.059833 49.478627) (xy 120.888927 49.649533) (xy 120.754647 49.850498) (xy 120.662153 50.073797) - (xy 120.615 50.310851) (xy 120.225019 50.310851) (xy 120.190599 50.073681) (xy 120.092919 49.797953) (xy 120.019472 49.660543) - (xy 119.770397 49.582908) (xy 118.921605 50.4317) (xy 118.562395 50.4317) (xy 117.713603 49.582908) (xy 117.464528 49.660543) - (xy 117.338629 49.924583) (xy 117.266661 50.208111) (xy 117.251389 50.500231) (xy 114.6094 50.500231) (xy 114.6094 50.329253) - (xy 114.554562 50.053559) (xy 114.446991 49.793862) (xy 114.290824 49.56014) (xy 114.133987 49.403303) (xy 117.893208 49.403303) - (xy 118.742 50.252095) (xy 119.590792 49.403303) (xy 119.513157 49.154228) (xy 119.249117 49.028329) (xy 118.965589 48.956361) - (xy 118.673469 48.941089) (xy 118.383981 48.983101) (xy 118.108253 49.080781) (xy 117.970843 49.154228) (xy 117.893208 49.403303) - (xy 114.133987 49.403303) (xy 114.09206 49.361376) (xy 113.858338 49.205209) (xy 113.598641 49.097638) (xy 113.322947 49.0428) - (xy 113.041853 49.0428) (xy 112.766159 49.097638) (xy 112.506462 49.205209) (xy 112.27274 49.361376) (xy 112.073976 49.56014) - (xy 111.917809 49.793862) (xy 111.810238 50.053559) (xy 111.7554 50.329253) (xy 107.13614 50.329253) (xy 107.13614 45.428951) - (xy 111.9554 45.428951) (xy 111.9554 45.670649) (xy 112.002553 45.907703) (xy 112.095047 46.131002) (xy 112.229327 46.331967) - (xy 112.400233 46.502873) (xy 112.601198 46.637153) (xy 112.824497 46.729647) (xy 113.061551 46.7768) (xy 113.303249 46.7768) - (xy 113.540303 46.729647) (xy 113.763602 46.637153) (xy 113.964567 46.502873) (xy 114.135473 46.331967) (xy 114.269753 46.131002) - (xy 114.362247 45.907703) (xy 114.4094 45.670649) (xy 114.4094 45.441651) (xy 135.9965 45.441651) (xy 135.9965 45.683349) - (xy 136.043653 45.920403) (xy 136.136147 46.143702) (xy 136.270427 46.344667) (xy 136.441333 46.515573) (xy 136.642298 46.649853) - (xy 136.865597 46.742347) (xy 137.102651 46.7895) (xy 137.344349 46.7895) (xy 137.581403 46.742347) (xy 137.804702 46.649853) - (xy 138.005667 46.515573) (xy 138.176573 46.344667) (xy 138.310853 46.143702) (xy 138.403347 45.920403) (xy 138.4505 45.683349) - (xy 138.4505 45.441651) (xy 147.9472 45.441651) (xy 147.9472 45.683349) (xy 147.994353 45.920403) (xy 148.086847 46.143702) - (xy 148.221127 46.344667) (xy 148.392033 46.515573) (xy 148.592998 46.649853) (xy 148.816297 46.742347) (xy 149.053351 46.7895) - (xy 149.295049 46.7895) (xy 149.532103 46.742347) (xy 149.755402 46.649853) (xy 149.956367 46.515573) (xy 150.127273 46.344667) - (xy 150.261553 46.143702) (xy 150.354047 45.920403) (xy 150.4012 45.683349) (xy 150.4012 45.441651) (xy 159.9233 45.441651) - (xy 159.9233 45.683349) (xy 159.970453 45.920403) (xy 160.062947 46.143702) (xy 160.197227 46.344667) (xy 160.368133 46.515573) - (xy 160.569098 46.649853) (xy 160.792397 46.742347) (xy 161.029451 46.7895) (xy 161.271149 46.7895) (xy 161.508203 46.742347) - (xy 161.731502 46.649853) (xy 161.932467 46.515573) (xy 162.103373 46.344667) (xy 162.237653 46.143702) (xy 162.330147 45.920403) - (xy 162.3773 45.683349) (xy 162.3773 45.441651) (xy 171.8994 45.441651) (xy 171.8994 45.683349) (xy 171.946553 45.920403) - (xy 172.039047 46.143702) (xy 172.173327 46.344667) (xy 172.344233 46.515573) (xy 172.545198 46.649853) (xy 172.768497 46.742347) - (xy 173.005551 46.7895) (xy 173.247249 46.7895) (xy 173.484303 46.742347) (xy 173.707602 46.649853) (xy 173.908567 46.515573) - (xy 174.079473 46.344667) (xy 174.213753 46.143702) (xy 174.306247 45.920403) (xy 174.3534 45.683349) (xy 174.3534 45.441651) - (xy 174.350874 45.428951) (xy 183.8755 45.428951) (xy 183.8755 45.670649) (xy 183.922653 45.907703) (xy 184.015147 46.131002) - (xy 184.149427 46.331967) (xy 184.320333 46.502873) (xy 184.521298 46.637153) (xy 184.744597 46.729647) (xy 184.981651 46.7768) - (xy 185.223349 46.7768) (xy 185.460403 46.729647) (xy 185.683702 46.637153) (xy 185.884667 46.502873) (xy 186.055573 46.331967) - (xy 186.189853 46.131002) (xy 186.282347 45.907703) (xy 186.3295 45.670649) (xy 186.3295 45.428951) (xy 186.326974 45.416251) - (xy 195.877 45.416251) (xy 195.877 45.657949) (xy 195.924153 45.895003) (xy 196.016647 46.118302) (xy 196.150927 46.319267) - (xy 196.321833 46.490173) (xy 196.522798 46.624453) (xy 196.746097 46.716947) (xy 196.983151 46.7641) (xy 197.224849 46.7641) - (xy 197.461903 46.716947) (xy 197.685202 46.624453) (xy 197.886167 46.490173) (xy 198.057073 46.319267) (xy 198.191353 46.118302) - (xy 198.283847 45.895003) (xy 198.331 45.657949) (xy 198.331 45.416251) (xy 198.283847 45.179197) (xy 198.191353 44.955898) - (xy 198.057073 44.754933) (xy 197.886167 44.584027) (xy 197.685202 44.449747) (xy 197.461903 44.357253) (xy 197.224849 44.3101) - (xy 196.983151 44.3101) (xy 196.746097 44.357253) (xy 196.522798 44.449747) (xy 196.321833 44.584027) (xy 196.150927 44.754933) - (xy 196.016647 44.955898) (xy 195.924153 45.179197) (xy 195.877 45.416251) (xy 186.326974 45.416251) (xy 186.282347 45.191897) - (xy 186.189853 44.968598) (xy 186.055573 44.767633) (xy 185.884667 44.596727) (xy 185.683702 44.462447) (xy 185.460403 44.369953) - (xy 185.223349 44.3228) (xy 184.981651 44.3228) (xy 184.744597 44.369953) (xy 184.521298 44.462447) (xy 184.320333 44.596727) - (xy 184.149427 44.767633) (xy 184.015147 44.968598) (xy 183.922653 45.191897) (xy 183.8755 45.428951) (xy 174.350874 45.428951) - (xy 174.306247 45.204597) (xy 174.213753 44.981298) (xy 174.079473 44.780333) (xy 173.908567 44.609427) (xy 173.707602 44.475147) - (xy 173.484303 44.382653) (xy 173.247249 44.3355) (xy 173.005551 44.3355) (xy 172.768497 44.382653) (xy 172.545198 44.475147) - (xy 172.344233 44.609427) (xy 172.173327 44.780333) (xy 172.039047 44.981298) (xy 171.946553 45.204597) (xy 171.8994 45.441651) - (xy 162.3773 45.441651) (xy 162.330147 45.204597) (xy 162.237653 44.981298) (xy 162.103373 44.780333) (xy 161.932467 44.609427) - (xy 161.731502 44.475147) (xy 161.508203 44.382653) (xy 161.271149 44.3355) (xy 161.029451 44.3355) (xy 160.792397 44.382653) - (xy 160.569098 44.475147) (xy 160.368133 44.609427) (xy 160.197227 44.780333) (xy 160.062947 44.981298) (xy 159.970453 45.204597) - (xy 159.9233 45.441651) (xy 150.4012 45.441651) (xy 150.354047 45.204597) (xy 150.261553 44.981298) (xy 150.127273 44.780333) - (xy 149.956367 44.609427) (xy 149.755402 44.475147) (xy 149.532103 44.382653) (xy 149.295049 44.3355) (xy 149.053351 44.3355) - (xy 148.816297 44.382653) (xy 148.592998 44.475147) (xy 148.392033 44.609427) (xy 148.221127 44.780333) (xy 148.086847 44.981298) - (xy 147.994353 45.204597) (xy 147.9472 45.441651) (xy 138.4505 45.441651) (xy 138.403347 45.204597) (xy 138.310853 44.981298) - (xy 138.176573 44.780333) (xy 138.005667 44.609427) (xy 137.804702 44.475147) (xy 137.581403 44.382653) (xy 137.344349 44.3355) - (xy 137.102651 44.3355) (xy 136.865597 44.382653) (xy 136.642298 44.475147) (xy 136.441333 44.609427) (xy 136.270427 44.780333) - (xy 136.136147 44.981298) (xy 136.043653 45.204597) (xy 135.9965 45.441651) (xy 114.4094 45.441651) (xy 114.4094 45.428951) - (xy 114.362247 45.191897) (xy 114.269753 44.968598) (xy 114.135473 44.767633) (xy 113.964567 44.596727) (xy 113.763602 44.462447) - (xy 113.540303 44.369953) (xy 113.303249 44.3228) (xy 113.061551 44.3228) (xy 112.824497 44.369953) (xy 112.601198 44.462447) - (xy 112.400233 44.596727) (xy 112.229327 44.767633) (xy 112.095047 44.968598) (xy 112.002553 45.191897) (xy 111.9554 45.428951) - (xy 107.13614 45.428951) (xy 107.13614 44.07508) (xy 202.607141 44.07508) + (xy 116.8746 84.079505) (xy 116.21432 84.079505) (xy 114.953421 82.818606) (xy 116.115211 82.818606) (xy 116.161875 83.186975) + (xy 116.279506 83.539162) (xy 116.405023 83.773986) (xy 116.694995 83.8999) (xy 117.828995 82.7659) (xy 118.188205 82.7659) + (xy 119.322205 83.8999) (xy 119.612177 83.773986) (xy 119.778033 83.441774) (xy 119.867172 83.115497) (xy 121.807808 83.115497) + (xy 121.885443 83.364572) (xy 122.149483 83.490471) (xy 122.433011 83.562439) (xy 122.725131 83.577711) (xy 123.014619 83.535699) + (xy 123.290347 83.438019) (xy 123.427757 83.364572) (xy 123.505392 83.115497) (xy 122.6566 82.266705) (xy 121.807808 83.115497) + (xy 119.867172 83.115497) (xy 119.87589 83.083588) (xy 119.901989 82.713194) (xy 119.855325 82.344825) (xy 119.737694 81.992638) + (xy 119.612177 81.757814) (xy 119.322205 81.6319) (xy 118.188205 82.7659) (xy 117.828995 82.7659) (xy 116.694995 81.6319) + (xy 116.405023 81.757814) (xy 116.239167 82.090026) (xy 116.14131 82.448212) (xy 116.115211 82.818606) (xy 114.953421 82.818606) + (xy 114.413322 82.278508) (xy 114.397604 82.259356) (xy 114.321165 82.196623) (xy 114.233956 82.150009) (xy 114.139329 82.121304) + (xy 114.065573 82.11404) (xy 114.065563 82.11404) (xy 114.04092 82.111613) (xy 114.016277 82.11404) (xy 111.605005 82.11404) + (xy 111.503469 82.012504) (xy 111.376208 81.927471) (xy 111.234803 81.868899) (xy 111.084688 81.83904) (xy 110.931632 81.83904) + (xy 110.781517 81.868899) (xy 110.640112 81.927471) (xy 110.512851 82.012504) (xy 110.404624 82.120731) (xy 110.321852 82.244608) + (xy 110.237694 81.992638) (xy 110.112177 81.757814) (xy 109.822205 81.6319) (xy 108.688205 82.7659) (xy 108.328995 82.7659) + (xy 108.314853 82.751758) (xy 108.494458 82.572153) (xy 108.5086 82.586295) (xy 109.6426 81.452295) (xy 109.630802 81.425124) + (xy 116.886398 81.425124) (xy 116.8746 81.452295) (xy 118.0086 82.586295) (xy 119.1426 81.452295) (xy 119.130802 81.425124) + (xy 121.327069 81.425124) (xy 121.253229 81.579983) (xy 121.181261 81.863511) (xy 121.165989 82.155631) (xy 121.208001 82.445119) + (xy 121.305681 82.720847) (xy 121.379128 82.858257) (xy 121.628203 82.935892) (xy 122.476995 82.0871) (xy 122.462853 82.072958) + (xy 122.642458 81.893353) (xy 122.6566 81.907495) (xy 122.670743 81.893353) (xy 122.850348 82.072958) (xy 122.836205 82.0871) + (xy 123.684997 82.935892) (xy 123.934072 82.858257) (xy 124.059971 82.594217) (xy 124.067034 82.566391) (xy 124.109247 82.668302) + (xy 124.243527 82.869267) (xy 124.414433 83.040173) (xy 124.615398 83.174453) (xy 124.838697 83.266947) (xy 125.075751 83.3141) + (xy 125.317449 83.3141) (xy 125.554503 83.266947) (xy 125.777802 83.174453) (xy 125.978767 83.040173) (xy 126.149673 82.869267) + (xy 126.283953 82.668302) (xy 126.376447 82.445003) (xy 126.4236 82.207949) (xy 126.4236 81.966251) (xy 126.376447 81.729197) + (xy 126.283953 81.505898) (xy 126.222615 81.414099) (xy 126.710585 81.414099) (xy 126.649247 81.505898) (xy 126.556753 81.729197) + (xy 126.5096 81.966251) (xy 126.5096 82.207949) (xy 126.556753 82.445003) (xy 126.649247 82.668302) (xy 126.783527 82.869267) + (xy 126.954433 83.040173) (xy 127.109601 83.143852) (xy 127.1096 88.233888) (xy 126.884512 88.458976) (xy 126.0869 88.458976) + (xy 126.012995 88.466255) (xy 125.94193 88.487812) (xy 125.876437 88.522819) (xy 125.819031 88.569931) (xy 125.771919 88.627337) + (xy 125.736912 88.69283) (xy 125.715355 88.763895) (xy 125.708076 88.8378) (xy 125.708076 90.5878) (xy 125.715355 90.661705) + (xy 125.736912 90.73277) (xy 125.771919 90.798263) (xy 125.819031 90.855669) (xy 125.876437 90.902781) (xy 125.94193 90.937788) + (xy 126.012995 90.959345) (xy 126.0869 90.966624) (xy 127.8369 90.966624) (xy 127.910805 90.959345) (xy 127.98187 90.937788) + (xy 128.047363 90.902781) (xy 128.104769 90.855669) (xy 128.151881 90.798263) (xy 128.186888 90.73277) (xy 128.208445 90.661705) + (xy 128.215724 90.5878) (xy 128.215724 89.859435) (xy 130.356467 92.000179) (xy 130.3761 92.024102) (xy 130.471573 92.102454) + (xy 130.580498 92.160676) (xy 130.662835 92.185652) (xy 130.698687 92.196528) (xy 130.8216 92.208634) (xy 130.852394 92.205601) + (xy 138.392065 92.205601) (xy 138.422859 92.208634) (xy 138.453653 92.205601) (xy 138.545772 92.196528) (xy 138.663962 92.160676) + (xy 138.772887 92.102454) (xy 138.86836 92.024102) (xy 138.887997 92.000174) (xy 139.418979 91.469193) (xy 139.602011 91.5056) + (xy 139.843709 91.5056) (xy 140.080763 91.458447) (xy 140.304062 91.365953) (xy 140.505027 91.231673) (xy 140.675933 91.060767) + (xy 140.779612 90.9056) (xy 143.990227 90.9056) (xy 144.082372 90.967169) (xy 144.223777 91.025741) (xy 144.373892 91.0556) + (xy 144.526948 91.0556) (xy 144.677063 91.025741) (xy 144.818468 90.967169) (xy 144.910613 90.9056) (xy 145.232109 90.9056) + (xy 146.185542 91.859033) (xy 146.205179 91.882961) (xy 146.300651 91.961312) (xy 146.300652 91.961313) (xy 146.409576 92.019535) + (xy 146.527767 92.055387) (xy 146.65068 92.067493) (xy 146.681474 92.06446) (xy 149.158646 92.06446) (xy 149.18944 92.067493) + (xy 149.220234 92.06446) (xy 149.312353 92.055387) (xy 149.430543 92.019535) (xy 149.539468 91.961313) (xy 149.634941 91.882961) + (xy 149.654578 91.859033) (xy 150.196454 91.317157) (xy 157.761508 91.317157) (xy 157.839143 91.566232) (xy 158.103183 91.692131) + (xy 158.386711 91.764099) (xy 158.678831 91.779371) (xy 158.968319 91.737359) (xy 159.244047 91.639679) (xy 159.381457 91.566232) + (xy 159.459092 91.317157) (xy 158.6103 90.468365) (xy 157.761508 91.317157) (xy 150.196454 91.317157) (xy 150.544448 90.969164) + (xy 151.78656 90.969164) (xy 151.860465 90.961885) (xy 151.93153 90.940328) (xy 151.997023 90.905321) (xy 152.054429 90.858209) + (xy 152.101541 90.800803) (xy 152.136548 90.73531) (xy 152.158105 90.664245) (xy 152.165384 90.59034) (xy 152.165384 90.34234) + (xy 152.255766 90.34234) (xy 152.28656 90.345373) (xy 152.317354 90.34234) (xy 152.409473 90.333267) (xy 152.527663 90.297415) + (xy 152.636588 90.239193) (xy 152.732061 90.160841) (xy 152.751698 90.136913) (xy 153.40696 89.481652) (xy 157.448169 89.481652) + (xy 157.332828 89.517603) (xy 157.206929 89.781643) (xy 157.134961 90.065171) (xy 157.119689 90.357291) (xy 157.161701 90.646779) + (xy 157.259381 90.922507) (xy 157.332828 91.059917) (xy 157.581903 91.137552) (xy 158.430695 90.28876) (xy 158.416553 90.274618) + (xy 158.596158 90.095013) (xy 158.6103 90.109155) (xy 158.624443 90.095013) (xy 158.804048 90.274618) (xy 158.789905 90.28876) + (xy 159.638697 91.137552) (xy 159.887772 91.059917) (xy 160.013671 90.795877) (xy 160.020734 90.768051) (xy 160.062947 90.869962) + (xy 160.197227 91.070927) (xy 160.368133 91.241833) (xy 160.569098 91.376113) (xy 160.792397 91.468607) (xy 161.029451 91.51576) + (xy 161.271149 91.51576) (xy 161.508203 91.468607) (xy 161.731502 91.376113) (xy 161.932467 91.241833) (xy 162.103373 91.070927) + (xy 162.237653 90.869962) (xy 162.330147 90.646663) (xy 162.3773 90.409609) (xy 162.3773 90.167911) (xy 162.330147 89.930857) + (xy 162.248448 89.733619) (xy 162.499707 89.984879) (xy 162.4633 90.167911) (xy 162.4633 90.409609) (xy 162.510453 90.646663) + (xy 162.602947 90.869962) (xy 162.737227 91.070927) (xy 162.908133 91.241833) (xy 163.109098 91.376113) (xy 163.332397 91.468607) + (xy 163.569451 91.51576) (xy 163.811149 91.51576) (xy 163.991493 91.479887) (xy 163.99638 91.485842) (xy 164.091853 91.564194) + (xy 164.200778 91.622416) (xy 164.318968 91.658268) (xy 164.44188 91.670374) (xy 164.472674 91.667341) (xy 172.153285 91.667341) + (xy 172.184079 91.670374) (xy 172.214873 91.667341) (xy 172.306992 91.658268) (xy 172.425182 91.622416) (xy 172.534107 91.564194) + (xy 172.62958 91.485842) (xy 172.649217 91.461914) (xy 172.821914 91.289217) (xy 181.718788 91.289217) (xy 181.796423 91.538292) + (xy 182.060463 91.664191) (xy 182.343991 91.736159) (xy 182.636111 91.751431) (xy 182.925599 91.709419) (xy 183.201327 91.611739) + (xy 183.338737 91.538292) (xy 183.416372 91.289217) (xy 182.56758 90.440425) (xy 181.718788 91.289217) (xy 172.821914 91.289217) + (xy 173.630256 90.480876) (xy 173.630256 90.59034) (xy 173.637535 90.664245) (xy 173.659092 90.73531) (xy 173.694099 90.800803) + (xy 173.741211 90.858209) (xy 173.798617 90.905321) (xy 173.86411 90.940328) (xy 173.935175 90.961885) (xy 174.00908 90.969164) + (xy 175.75908 90.969164) (xy 175.832985 90.961885) (xy 175.90405 90.940328) (xy 175.969543 90.905321) (xy 176.026949 90.858209) + (xy 176.074061 90.800803) (xy 176.109068 90.73531) (xy 176.130625 90.664245) (xy 176.137904 90.59034) (xy 176.137904 90.329351) + (xy 181.076969 90.329351) (xy 181.118981 90.618839) (xy 181.216661 90.894567) (xy 181.290108 91.031977) (xy 181.539183 91.109612) + (xy 182.387975 90.26082) (xy 182.747185 90.26082) (xy 183.595977 91.109612) (xy 183.845052 91.031977) (xy 183.970951 90.767937) + (xy 183.978014 90.740111) (xy 184.020227 90.842022) (xy 184.154507 91.042987) (xy 184.325413 91.213893) (xy 184.526378 91.348173) + (xy 184.749677 91.440667) (xy 184.986731 91.48782) (xy 185.228429 91.48782) (xy 185.465483 91.440667) (xy 185.688782 91.348173) + (xy 185.889747 91.213893) (xy 186.060653 91.042987) (xy 186.194933 90.842022) (xy 186.287427 90.618723) (xy 186.33458 90.381669) + (xy 186.33458 90.139971) (xy 186.42058 90.139971) (xy 186.42058 90.381669) (xy 186.467733 90.618723) (xy 186.560227 90.842022) + (xy 186.694507 91.042987) (xy 186.865413 91.213893) (xy 187.066378 91.348173) (xy 187.289677 91.440667) (xy 187.526731 91.48782) + (xy 187.768429 91.48782) (xy 187.951461 91.451413) (xy 187.969587 91.469539) (xy 187.98922 91.493462) (xy 188.084693 91.571814) + (xy 188.193618 91.630036) (xy 188.311808 91.665888) (xy 188.403927 91.674961) (xy 188.403928 91.674961) (xy 188.43472 91.677994) + (xy 188.465512 91.674961) (xy 197.483025 91.674961) (xy 197.513819 91.677994) (xy 197.544613 91.674961) (xy 197.636732 91.665888) + (xy 197.754922 91.630036) (xy 197.863847 91.571814) (xy 197.95932 91.493462) (xy 197.978957 91.469534) (xy 198.471707 90.976784) + (xy 199.71382 90.976784) (xy 199.787725 90.969505) (xy 199.85879 90.947948) (xy 199.924283 90.912941) (xy 199.981689 90.865829) + (xy 200.028801 90.808423) (xy 200.063808 90.74293) (xy 200.085365 90.671865) (xy 200.092644 90.59796) (xy 200.092644 88.84796) + (xy 200.085365 88.774055) (xy 200.063808 88.70299) (xy 200.028801 88.637497) (xy 199.981689 88.580091) (xy 199.924283 88.532979) + (xy 199.85879 88.497972) (xy 199.787725 88.476415) (xy 199.71382 88.469136) (xy 197.96382 88.469136) (xy 197.889915 88.476415) + (xy 197.81885 88.497972) (xy 197.753357 88.532979) (xy 197.695951 88.580091) (xy 197.648839 88.637497) (xy 197.613832 88.70299) + (xy 197.592275 88.774055) (xy 197.584996 88.84796) (xy 197.584996 90.090073) (xy 197.254108 90.420961) (xy 196.378198 90.420961) + (xy 196.448328 90.316004) (xy 196.542706 90.088155) (xy 196.59082 89.846271) (xy 196.59082 89.599649) (xy 196.542706 89.357765) + (xy 196.448328 89.129916) (xy 196.311312 88.924856) (xy 196.136924 88.750468) (xy 195.931864 88.613452) (xy 195.704015 88.519074) + (xy 195.462131 88.47096) (xy 195.215509 88.47096) (xy 194.973625 88.519074) (xy 194.745776 88.613452) (xy 194.540716 88.750468) + (xy 194.366328 88.924856) (xy 194.229312 89.129916) (xy 194.134934 89.357765) (xy 194.08682 89.599649) (xy 194.08682 89.846271) + (xy 194.134934 90.088155) (xy 194.229312 90.316004) (xy 194.299442 90.420961) (xy 188.866764 90.420961) (xy 188.87458 90.381669) + (xy 188.87458 90.139971) (xy 188.827427 89.902917) (xy 188.734933 89.679618) (xy 188.600653 89.478653) (xy 188.429747 89.307747) + (xy 188.228782 89.173467) (xy 188.005483 89.080973) (xy 187.768429 89.03382) (xy 187.526731 89.03382) (xy 187.289677 89.080973) + (xy 187.066378 89.173467) (xy 186.865413 89.307747) (xy 186.694507 89.478653) (xy 186.560227 89.679618) (xy 186.467733 89.902917) + (xy 186.42058 90.139971) (xy 186.33458 90.139971) (xy 186.287427 89.902917) (xy 186.194933 89.679618) (xy 186.060653 89.478653) + (xy 185.889747 89.307747) (xy 185.688782 89.173467) (xy 185.465483 89.080973) (xy 185.228429 89.03382) (xy 184.986731 89.03382) + (xy 184.749677 89.080973) (xy 184.526378 89.173467) (xy 184.325413 89.307747) (xy 184.154507 89.478653) (xy 184.020227 89.679618) + (xy 183.975428 89.787771) (xy 183.918499 89.627073) (xy 183.845052 89.489663) (xy 183.595977 89.412028) (xy 182.747185 90.26082) + (xy 182.387975 90.26082) (xy 181.539183 89.412028) (xy 181.290108 89.489663) (xy 181.164209 89.753703) (xy 181.092241 90.037231) + (xy 181.076969 90.329351) (xy 176.137904 90.329351) (xy 176.137904 89.232423) (xy 181.718788 89.232423) (xy 182.56758 90.081215) + (xy 183.416372 89.232423) (xy 183.338737 88.983348) (xy 183.074697 88.857449) (xy 182.791169 88.785481) (xy 182.499049 88.770209) + (xy 182.209561 88.812221) (xy 181.933833 88.909901) (xy 181.796423 88.983348) (xy 181.718788 89.232423) (xy 176.137904 89.232423) + (xy 176.137904 88.84034) (xy 176.130625 88.766435) (xy 176.109068 88.69537) (xy 176.074061 88.629877) (xy 176.026949 88.572471) + (xy 175.969543 88.525359) (xy 175.90405 88.490352) (xy 175.832985 88.468795) (xy 175.75908 88.461516) (xy 174.00908 88.461516) + (xy 173.935175 88.468795) (xy 173.86411 88.490352) (xy 173.798617 88.525359) (xy 173.741211 88.572471) (xy 173.694099 88.629877) + (xy 173.659092 88.69537) (xy 173.637535 88.766435) (xy 173.630256 88.84034) (xy 173.630256 89.08834) (xy 173.539871 89.08834) + (xy 173.509079 89.085307) (xy 173.478287 89.08834) (xy 173.478286 89.08834) (xy 173.386167 89.097413) (xy 173.267977 89.133265) + (xy 173.159052 89.191487) (xy 173.063579 89.269839) (xy 173.043949 89.293759) (xy 172.63608 89.701628) (xy 172.63608 89.592029) + (xy 172.587966 89.350145) (xy 172.550254 89.2591) (xy 174.152335 87.65702) (xy 185.755335 87.65702) (xy 185.856871 87.758556) + (xy 185.984132 87.843589) (xy 186.125537 87.902161) (xy 186.275652 87.93202) (xy 186.428708 87.93202) (xy 186.578823 87.902161) + (xy 186.720228 87.843589) (xy 186.847489 87.758556) (xy 186.955716 87.650329) (xy 187.040749 87.523068) (xy 187.099321 87.381663) + (xy 187.12918 87.231548) (xy 187.12918 87.078492) (xy 187.099321 86.928377) (xy 187.040749 86.786972) (xy 186.955716 86.659711) + (xy 186.847489 86.551484) (xy 186.720228 86.466451) (xy 186.578823 86.407879) (xy 186.428708 86.37802) (xy 186.275652 86.37802) + (xy 186.125537 86.407879) (xy 185.984132 86.466451) (xy 185.856871 86.551484) (xy 185.755335 86.65302) (xy 173.969042 86.65302) + (xy 173.944399 86.650593) (xy 173.919756 86.65302) (xy 173.919747 86.65302) (xy 173.845991 86.660284) (xy 173.751364 86.688989) + (xy 173.664155 86.735603) (xy 173.587716 86.798336) (xy 173.572003 86.817482) (xy 171.84032 88.549166) (xy 171.749275 88.511454) + (xy 171.507391 88.46334) (xy 171.260769 88.46334) (xy 171.018885 88.511454) (xy 170.791036 88.605832) (xy 170.585976 88.742848) + (xy 170.411588 88.917236) (xy 170.274572 89.122296) (xy 170.180194 89.350145) (xy 170.13208 89.592029) (xy 170.13208 89.838651) + (xy 170.180194 90.080535) (xy 170.274572 90.308384) (xy 170.344702 90.413341) (xy 164.916558 90.413341) (xy 164.9173 90.409609) + (xy 164.9173 90.167911) (xy 164.870147 89.930857) (xy 164.777653 89.707558) (xy 164.643373 89.506593) (xy 164.472467 89.335687) + (xy 164.271502 89.201407) (xy 164.048203 89.108913) (xy 163.811149 89.06176) (xy 163.569451 89.06176) (xy 163.386419 89.098167) + (xy 162.72641 88.438159) (xy 162.706773 88.414231) (xy 162.6113 88.335879) (xy 162.502375 88.277657) (xy 162.384185 88.241805) + (xy 162.292066 88.232732) (xy 162.261272 88.229699) (xy 162.230478 88.232732) (xy 160.030281 88.232732) (xy 160.039439 88.219026) + (xy 160.098011 88.077621) (xy 160.12787 87.927506) (xy 160.12787 87.77445) (xy 160.098011 87.624335) (xy 160.039439 87.48293) + (xy 159.954406 87.355669) (xy 159.846179 87.247442) (xy 159.718918 87.162409) (xy 159.577513 87.103837) (xy 159.427398 87.073978) + (xy 159.274342 87.073978) (xy 159.124227 87.103837) (xy 158.982822 87.162409) (xy 158.855561 87.247442) (xy 158.754025 87.348978) + (xy 149.300564 87.348978) (xy 149.275921 87.346551) (xy 149.251278 87.348978) (xy 149.251269 87.348978) (xy 149.177513 87.356242) + (xy 149.082886 87.384947) (xy 148.995677 87.431561) (xy 148.919238 87.494294) (xy 148.903525 87.51344) (xy 147.8678 88.549166) + (xy 147.776755 88.511454) (xy 147.534871 88.46334) (xy 147.288249 88.46334) (xy 147.046365 88.511454) (xy 146.818516 88.605832) + (xy 146.613456 88.742848) (xy 146.439068 88.917236) (xy 146.302052 89.122296) (xy 146.207674 89.350145) (xy 146.15956 89.592029) + (xy 146.15956 89.838651) (xy 146.207674 90.080535) (xy 146.226913 90.126982) (xy 145.956958 89.857027) (xy 145.937321 89.833099) + (xy 145.841848 89.754747) (xy 145.732923 89.696525) (xy 145.614733 89.660673) (xy 145.522614 89.6516) (xy 145.49182 89.648567) + (xy 145.461026 89.6516) (xy 144.910613 89.6516) (xy 144.818468 89.590031) (xy 144.677063 89.531459) (xy 144.526948 89.5016) + (xy 144.373892 89.5016) (xy 144.223777 89.531459) (xy 144.082372 89.590031) (xy 143.990227 89.6516) (xy 140.779612 89.6516) + (xy 140.675933 89.496433) (xy 140.505027 89.325527) (xy 140.304062 89.191247) (xy 140.080763 89.098753) (xy 139.843709 89.0516) + (xy 139.602011 89.0516) (xy 139.364957 89.098753) (xy 139.141658 89.191247) (xy 138.940693 89.325527) (xy 138.769787 89.496433) + (xy 138.635507 89.697398) (xy 138.543013 89.920697) (xy 138.49586 90.157751) (xy 138.49586 90.399449) (xy 138.532267 90.582481) + (xy 138.281008 90.833741) (xy 138.362707 90.636503) (xy 138.40986 90.399449) (xy 138.40986 90.157751) (xy 138.362707 89.920697) + (xy 138.3299 89.841494) (xy 140.482522 87.688874) (xy 145.935568 87.688874) (xy 146.037104 87.79041) (xy 146.164365 87.875443) + (xy 146.30577 87.934015) (xy 146.455885 87.963874) (xy 146.608941 87.963874) (xy 146.759056 87.934015) (xy 146.900461 87.875443) + (xy 147.027722 87.79041) (xy 147.135949 87.682183) (xy 147.220982 87.554922) (xy 147.279554 87.413517) (xy 147.309413 87.263402) + (xy 147.309413 87.110346) (xy 147.279554 86.960231) (xy 147.220982 86.818826) (xy 147.135949 86.691565) (xy 147.027722 86.583338) + (xy 146.900461 86.498305) (xy 146.759056 86.439733) (xy 146.608941 86.409874) (xy 146.455885 86.409874) (xy 146.30577 86.439733) + (xy 146.164365 86.498305) (xy 146.037104 86.583338) (xy 145.935568 86.684874) (xy 140.299229 86.684874) (xy 140.274586 86.682447) + (xy 140.249943 86.684874) (xy 140.249933 86.684874) (xy 140.176177 86.692138) (xy 140.08155 86.720843) (xy 139.994341 86.767457) + (xy 139.994339 86.767458) (xy 139.99434 86.767458) (xy 139.93705 86.814474) (xy 139.937042 86.814482) (xy 139.917902 86.83019) + (xy 139.902193 86.849331) (xy 137.619966 89.13156) (xy 137.540763 89.098753) (xy 137.303709 89.0516) (xy 137.062011 89.0516) + (xy 136.824957 89.098753) (xy 136.601658 89.191247) (xy 136.400693 89.325527) (xy 136.229787 89.496433) (xy 136.095507 89.697398) + (xy 136.050708 89.805551) (xy 135.993779 89.644853) (xy 135.920332 89.507443) (xy 135.671257 89.429808) (xy 134.822465 90.2786) + (xy 134.836608 90.292743) (xy 134.657003 90.472348) (xy 134.64286 90.458205) (xy 134.628718 90.472348) (xy 134.449113 90.292743) + (xy 134.463255 90.2786) (xy 133.614463 89.429808) (xy 133.365388 89.507443) (xy 133.239489 89.771483) (xy 133.167521 90.055011) + (xy 133.152249 90.347131) (xy 133.194261 90.636619) (xy 133.291941 90.912347) (xy 133.312923 90.951601) (xy 131.081313 90.951601) + (xy 129.379915 89.250203) (xy 133.794068 89.250203) (xy 134.64286 90.098995) (xy 135.491652 89.250203) (xy 135.414017 89.001128) + (xy 135.149977 88.875229) (xy 134.866449 88.803261) (xy 134.574329 88.787989) (xy 134.284841 88.830001) (xy 134.009113 88.927681) + (xy 133.871703 89.001128) (xy 133.794068 89.250203) (xy 129.379915 89.250203) (xy 128.3636 88.233889) (xy 128.3636 84.813831) + (xy 135.230859 84.813831) (xy 135.230859 84.966887) (xy 135.260718 85.117002) (xy 135.31929 85.258407) (xy 135.404323 85.385668) + (xy 135.51255 85.493895) (xy 135.639811 85.578928) (xy 135.781216 85.6375) (xy 135.931331 85.667359) (xy 136.084387 85.667359) + (xy 136.234502 85.6375) (xy 136.375907 85.578928) (xy 136.503168 85.493895) (xy 136.611395 85.385668) (xy 136.696428 85.258407) + (xy 136.755 85.117002) (xy 136.784859 84.966887) (xy 136.784859 84.813831) (xy 136.755 84.663716) (xy 136.696428 84.522311) + (xy 136.611395 84.39505) (xy 136.509859 84.293514) (xy 136.509859 84.092205) (xy 140.79886 84.092205) (xy 140.924774 84.382177) + (xy 141.256986 84.548033) (xy 141.615172 84.64589) (xy 141.985566 84.671989) (xy 142.353935 84.625325) (xy 142.706122 84.507694) + (xy 142.940946 84.382177) (xy 143.062448 84.102365) (xy 155.2663 84.102365) (xy 155.392214 84.392337) (xy 155.724426 84.558193) + (xy 156.082612 84.65605) (xy 156.453006 84.682149) (xy 156.821375 84.635485) (xy 157.173562 84.517854) (xy 157.408386 84.392337) + (xy 157.5343 84.102365) (xy 164.7663 84.102365) (xy 164.892214 84.392337) (xy 165.224426 84.558193) (xy 165.582612 84.65605) + (xy 165.953006 84.682149) (xy 166.321375 84.635485) (xy 166.673562 84.517854) (xy 166.908386 84.392337) (xy 167.0343 84.102365) + (xy 167.00636 84.074425) (xy 179.22358 84.074425) (xy 179.349494 84.364397) (xy 179.681706 84.530253) (xy 180.039892 84.62811) + (xy 180.410286 84.654209) (xy 180.778655 84.607545) (xy 181.130842 84.489914) (xy 181.365666 84.364397) (xy 181.49158 84.074425) + (xy 188.72358 84.074425) (xy 188.849494 84.364397) (xy 189.181706 84.530253) (xy 189.539892 84.62811) (xy 189.910286 84.654209) + (xy 190.278655 84.607545) (xy 190.630842 84.489914) (xy 190.865666 84.364397) (xy 190.99158 84.074425) (xy 189.85758 82.940425) + (xy 188.72358 84.074425) (xy 181.49158 84.074425) (xy 180.35758 82.940425) (xy 179.22358 84.074425) (xy 167.00636 84.074425) + (xy 165.9003 82.968365) (xy 164.7663 84.102365) (xy 157.5343 84.102365) (xy 156.4003 82.968365) (xy 155.2663 84.102365) + (xy 143.062448 84.102365) (xy 143.06686 84.092205) (xy 141.93286 82.958205) (xy 140.79886 84.092205) (xy 136.509859 84.092205) + (xy 136.509859 83.950715) (xy 137.412975 83.0476) (xy 137.556568 83.0476) (xy 137.706683 83.017741) (xy 137.848088 82.959169) + (xy 137.975349 82.874136) (xy 138.018179 82.831306) (xy 140.039471 82.831306) (xy 140.086135 83.199675) (xy 140.203766 83.551862) + (xy 140.329283 83.786686) (xy 140.619255 83.9126) (xy 141.753255 82.7786) (xy 142.112465 82.7786) (xy 143.246465 83.9126) + (xy 143.536437 83.786686) (xy 143.702293 83.454474) (xy 143.798371 83.102797) (xy 145.760008 83.102797) (xy 145.837643 83.351872) + (xy 146.101683 83.477771) (xy 146.385211 83.549739) (xy 146.677331 83.565011) (xy 146.966819 83.522999) (xy 147.242547 83.425319) + (xy 147.379957 83.351872) (xy 147.457592 83.102797) (xy 146.6088 82.254005) (xy 145.760008 83.102797) (xy 143.798371 83.102797) + (xy 143.80015 83.096288) (xy 143.826249 82.725894) (xy 143.779585 82.357525) (xy 143.707911 82.142931) (xy 145.118189 82.142931) + (xy 145.160201 82.432419) (xy 145.257881 82.708147) (xy 145.331328 82.845557) (xy 145.580403 82.923192) (xy 146.429195 82.0744) + (xy 146.788405 82.0744) (xy 147.637197 82.923192) (xy 147.886272 82.845557) (xy 148.012171 82.581517) (xy 148.019234 82.553691) + (xy 148.061447 82.655602) (xy 148.195727 82.856567) (xy 148.366633 83.027473) (xy 148.567598 83.161753) (xy 148.790897 83.254247) + (xy 149.027951 83.3014) (xy 149.269649 83.3014) (xy 149.506703 83.254247) (xy 149.730002 83.161753) (xy 149.930967 83.027473) + (xy 150.101873 82.856567) (xy 150.236153 82.655602) (xy 150.328647 82.432303) (xy 150.3758 82.195249) (xy 150.3758 81.953551) + (xy 150.4618 81.953551) (xy 150.4618 82.195249) (xy 150.508953 82.432303) (xy 150.601447 82.655602) (xy 150.735727 82.856567) + (xy 150.906633 83.027473) (xy 151.107598 83.161753) (xy 151.330897 83.254247) (xy 151.567951 83.3014) (xy 151.809649 83.3014) + (xy 152.046703 83.254247) (xy 152.270002 83.161753) (xy 152.470967 83.027473) (xy 152.641873 82.856567) (xy 152.651963 82.841466) + (xy 154.506911 82.841466) (xy 154.553575 83.209835) (xy 154.671206 83.562022) (xy 154.796723 83.796846) (xy 155.086695 83.92276) + (xy 156.220695 82.78876) (xy 156.579905 82.78876) (xy 157.713905 83.92276) (xy 158.003877 83.796846) (xy 158.169733 83.464634) + (xy 158.26759 83.106448) (xy 158.293689 82.736054) (xy 158.247025 82.367685) (xy 158.129394 82.015498) (xy 158.003877 81.780674) + (xy 157.713905 81.65476) (xy 156.579905 82.78876) (xy 156.220695 82.78876) (xy 155.086695 81.65476) (xy 154.796723 81.780674) + (xy 154.630867 82.112886) (xy 154.53301 82.471072) (xy 154.506911 82.841466) (xy 152.651963 82.841466) (xy 152.776153 82.655602) + (xy 152.868647 82.432303) (xy 152.9158 82.195249) (xy 152.9158 81.953551) (xy 152.868647 81.716497) (xy 152.776153 81.493198) + (xy 152.764098 81.475155) (xy 155.2663 81.475155) (xy 156.4003 82.609155) (xy 157.5343 81.475155) (xy 157.408386 81.185183) + (xy 157.076174 81.019327) (xy 156.717988 80.92147) (xy 156.347594 80.895371) (xy 155.979225 80.942035) (xy 155.627038 81.059666) + (xy 155.392214 81.185183) (xy 155.2663 81.475155) (xy 152.764098 81.475155) (xy 152.641873 81.292233) (xy 152.470967 81.121327) + (xy 152.270002 80.987047) (xy 152.046703 80.894553) (xy 151.809649 80.8474) (xy 151.567951 80.8474) (xy 151.330897 80.894553) + (xy 151.107598 80.987047) (xy 150.906633 81.121327) (xy 150.735727 81.292233) (xy 150.601447 81.493198) (xy 150.508953 81.716497) + (xy 150.4618 81.953551) (xy 150.3758 81.953551) (xy 150.328647 81.716497) (xy 150.236153 81.493198) (xy 150.101873 81.292233) + (xy 149.930967 81.121327) (xy 149.730002 80.987047) (xy 149.506703 80.894553) (xy 149.269649 80.8474) (xy 149.027951 80.8474) + (xy 148.790897 80.894553) (xy 148.567598 80.987047) (xy 148.366633 81.121327) (xy 148.195727 81.292233) (xy 148.061447 81.493198) + (xy 148.016648 81.601351) (xy 147.959719 81.440653) (xy 147.886272 81.303243) (xy 147.637197 81.225608) (xy 146.788405 82.0744) + (xy 146.429195 82.0744) (xy 145.580403 81.225608) (xy 145.331328 81.303243) (xy 145.205429 81.567283) (xy 145.133461 81.850811) + (xy 145.118189 82.142931) (xy 143.707911 82.142931) (xy 143.661954 82.005338) (xy 143.536437 81.770514) (xy 143.246465 81.6446) + (xy 142.112465 82.7786) (xy 141.753255 82.7786) (xy 140.619255 81.6446) (xy 140.329283 81.770514) (xy 140.163427 82.102726) + (xy 140.06557 82.460912) (xy 140.039471 82.831306) (xy 138.018179 82.831306) (xy 138.083576 82.765909) (xy 138.168609 82.638648) + (xy 138.227181 82.497243) (xy 138.25704 82.347128) (xy 138.25704 82.194072) (xy 138.227181 82.043957) (xy 138.168609 81.902552) + (xy 138.083576 81.775291) (xy 137.975349 81.667064) (xy 137.848088 81.582031) (xy 137.706683 81.523459) (xy 137.556568 81.4936) + (xy 137.403512 81.4936) (xy 137.253397 81.523459) (xy 137.111992 81.582031) (xy 136.984731 81.667064) (xy 136.876504 81.775291) + (xy 136.791471 81.902552) (xy 136.732899 82.043957) (xy 136.70304 82.194072) (xy 136.70304 82.337665) (xy 135.670326 83.37038) + (xy 135.651175 83.386097) (xy 135.588442 83.462536) (xy 135.541828 83.549746) (xy 135.513123 83.644373) (xy 135.505859 83.718129) + (xy 135.505859 83.718138) (xy 135.503432 83.742781) (xy 135.505859 83.767424) (xy 135.505859 84.293514) (xy 135.404323 84.39505) + (xy 135.31929 84.522311) (xy 135.260718 84.663716) (xy 135.230859 84.813831) (xy 128.3636 84.813831) (xy 128.3636 84.092205) + (xy 131.29886 84.092205) (xy 131.424774 84.382177) (xy 131.756986 84.548033) (xy 132.115172 84.64589) (xy 132.485566 84.671989) + (xy 132.853935 84.625325) (xy 133.206122 84.507694) (xy 133.440946 84.382177) (xy 133.56686 84.092205) (xy 132.43286 82.958205) + (xy 131.29886 84.092205) (xy 128.3636 84.092205) (xy 128.3636 83.143852) (xy 128.518767 83.040173) (xy 128.689673 82.869267) + (xy 128.715037 82.831306) (xy 130.539471 82.831306) (xy 130.586135 83.199675) (xy 130.703766 83.551862) (xy 130.829283 83.786686) + (xy 131.119255 83.9126) (xy 132.253255 82.7786) (xy 132.612465 82.7786) (xy 133.746465 83.9126) (xy 134.036437 83.786686) + (xy 134.202293 83.454474) (xy 134.30015 83.096288) (xy 134.326249 82.725894) (xy 134.279585 82.357525) (xy 134.161954 82.005338) + (xy 134.036437 81.770514) (xy 133.746465 81.6446) (xy 132.612465 82.7786) (xy 132.253255 82.7786) (xy 131.119255 81.6446) + (xy 130.829283 81.770514) (xy 130.663427 82.102726) (xy 130.56557 82.460912) (xy 130.539471 82.831306) (xy 128.715037 82.831306) + (xy 128.823953 82.668302) (xy 128.916447 82.445003) (xy 128.9636 82.207949) (xy 128.9636 81.966251) (xy 128.916447 81.729197) + (xy 128.823953 81.505898) (xy 128.769982 81.425124) (xy 131.316173 81.425124) (xy 131.29886 81.464995) (xy 132.43286 82.598995) + (xy 133.56686 81.464995) (xy 133.549547 81.425124) (xy 138.441275 81.425124) (xy 138.444859 81.443143) (xy 138.503431 81.584548) + (xy 138.588464 81.711809) (xy 138.696691 81.820036) (xy 138.823952 81.905069) (xy 138.965357 81.963641) (xy 139.115472 81.9935) + (xy 139.268528 81.9935) (xy 139.418643 81.963641) (xy 139.560048 81.905069) (xy 139.687309 81.820036) (xy 139.795536 81.711809) + (xy 139.880569 81.584548) (xy 139.939141 81.443143) (xy 139.969 81.293028) (xy 139.969 81.139972) (xy 139.939141 80.989857) + (xy 139.933034 80.975113) (xy 140.086137 80.975113) (xy 140.172934 81.06191) (xy 140.188652 81.081062) (xy 140.265091 81.143795) + (xy 140.3523 81.190409) (xy 140.446927 81.219114) (xy 140.520683 81.226378) (xy 140.520692 81.226378) (xy 140.545335 81.228805) + (xy 140.569978 81.226378) (xy 140.902474 81.226378) (xy 140.79886 81.464995) (xy 141.93286 82.598995) (xy 143.06686 81.464995) + (xy 142.940946 81.175023) (xy 142.794286 81.101803) (xy 142.819559 81.081062) (xy 142.835276 81.061911) (xy 143.055419 80.841769) + (xy 145.823666 80.841769) (xy 145.760008 81.046003) (xy 146.6088 81.894795) (xy 147.457592 81.046003) (xy 147.393934 80.841769) + (xy 157.698738 80.841769) (xy 157.687899 80.867937) (xy 157.65804 81.018052) (xy 157.65804 81.171108) (xy 157.687899 81.321223) + (xy 157.746471 81.462628) (xy 157.831504 81.589889) (xy 157.939731 81.698116) (xy 158.066992 81.783149) (xy 158.208397 81.841721) + (xy 158.358512 81.87158) (xy 158.511568 81.87158) (xy 158.661683 81.841721) (xy 158.803088 81.783149) (xy 158.930349 81.698116) + (xy 159.031885 81.59658) (xy 164.528512 81.59658) (xy 164.586693 81.654761) (xy 164.296723 81.780674) (xy 164.130867 82.112886) + (xy 164.03301 82.471072) (xy 164.006911 82.841466) (xy 164.053575 83.209835) (xy 164.171206 83.562022) (xy 164.296723 83.796846) + (xy 164.586695 83.92276) (xy 165.720695 82.78876) (xy 166.079905 82.78876) (xy 167.213905 83.92276) (xy 167.503877 83.796846) + (xy 167.669733 83.464634) (xy 167.765117 83.115497) (xy 169.747768 83.115497) (xy 169.825403 83.364572) (xy 170.089443 83.490471) + (xy 170.372971 83.562439) (xy 170.665091 83.577711) (xy 170.954579 83.535699) (xy 171.230307 83.438019) (xy 171.367717 83.364572) + (xy 171.445352 83.115497) (xy 170.59656 82.266705) (xy 169.747768 83.115497) (xy 167.765117 83.115497) (xy 167.76759 83.106448) + (xy 167.793689 82.736054) (xy 167.747025 82.367685) (xy 167.676199 82.155631) (xy 169.105949 82.155631) (xy 169.147961 82.445119) + (xy 169.245641 82.720847) (xy 169.319088 82.858257) (xy 169.568163 82.935892) (xy 170.416955 82.0871) (xy 170.776165 82.0871) + (xy 171.624957 82.935892) (xy 171.874032 82.858257) (xy 171.999931 82.594217) (xy 172.006994 82.566391) (xy 172.049207 82.668302) + (xy 172.183487 82.869267) (xy 172.354393 83.040173) (xy 172.555358 83.174453) (xy 172.778657 83.266947) (xy 173.015711 83.3141) + (xy 173.257409 83.3141) (xy 173.494463 83.266947) (xy 173.717762 83.174453) (xy 173.918727 83.040173) (xy 174.089633 82.869267) + (xy 174.223913 82.668302) (xy 174.316407 82.445003) (xy 174.36356 82.207949) (xy 174.36356 81.966251) (xy 174.316407 81.729197) + (xy 174.223913 81.505898) (xy 174.089633 81.304933) (xy 173.918727 81.134027) (xy 173.717762 80.999747) (xy 173.494463 80.907253) + (xy 173.257409 80.8601) (xy 173.015711 80.8601) (xy 172.778657 80.907253) (xy 172.555358 80.999747) (xy 172.354393 81.134027) + (xy 172.183487 81.304933) (xy 172.049207 81.505898) (xy 172.004408 81.614051) (xy 171.947479 81.453353) (xy 171.874032 81.315943) + (xy 171.624957 81.238308) (xy 170.776165 82.0871) (xy 170.416955 82.0871) (xy 169.568163 81.238308) (xy 169.319088 81.315943) + (xy 169.193189 81.579983) (xy 169.121221 81.863511) (xy 169.105949 82.155631) (xy 167.676199 82.155631) (xy 167.629394 82.015498) + (xy 167.503877 81.780674) (xy 167.213905 81.65476) (xy 166.079905 82.78876) (xy 165.720695 82.78876) (xy 165.706553 82.774618) + (xy 165.886158 82.595013) (xy 165.9003 82.609155) (xy 167.0343 81.475155) (xy 166.999447 81.394891) (xy 167.061109 81.302608) + (xy 167.119681 81.161203) (xy 167.140069 81.058703) (xy 169.747768 81.058703) (xy 170.59656 81.907495) (xy 171.445352 81.058703) + (xy 171.367717 80.809628) (xy 171.103677 80.683729) (xy 170.820149 80.611761) (xy 170.528029 80.596489) (xy 170.238541 80.638501) + (xy 169.962813 80.736181) (xy 169.825403 80.809628) (xy 169.747768 81.058703) (xy 167.140069 81.058703) (xy 167.14954 81.011088) + (xy 167.14954 80.858032) (xy 167.119681 80.707917) (xy 167.061109 80.566512) (xy 166.976076 80.439251) (xy 166.867849 80.331024) + (xy 166.740588 80.245991) (xy 166.599183 80.187419) (xy 166.449068 80.15756) (xy 166.296012 80.15756) (xy 166.145897 80.187419) + (xy 166.004492 80.245991) (xy 165.877231 80.331024) (xy 165.769004 80.439251) (xy 165.683971 80.566512) (xy 165.673173 80.59258) + (xy 165.181925 80.59258) (xy 165.289516 80.484989) (xy 165.374549 80.357728) (xy 165.433121 80.216323) (xy 165.46298 80.066208) + (xy 165.46298 79.913152) (xy 165.433121 79.763037) (xy 165.374549 79.621632) (xy 165.289516 79.494371) (xy 165.262124 79.466979) + (xy 166.016128 79.466979) (xy 166.031799 79.545763) (xy 166.090371 79.687168) (xy 166.175404 79.814429) (xy 166.283631 79.922656) + (xy 166.410892 80.007689) (xy 166.552297 80.066261) (xy 166.702412 80.09612) (xy 166.855468 80.09612) (xy 167.005583 80.066261) + (xy 167.146988 80.007689) (xy 167.274249 79.922656) (xy 167.382476 79.814429) (xy 167.467509 79.687168) (xy 167.526081 79.545763) + (xy 167.55594 79.395648) (xy 167.55594 79.242592) (xy 167.526081 79.092477) (xy 167.467509 78.951072) (xy 167.382476 78.823811) + (xy 167.274249 78.715584) (xy 167.146988 78.630551) (xy 167.005583 78.571979) (xy 166.855468 78.54212) (xy 166.702412 78.54212) + (xy 166.699637 78.542672) (xy 166.617835 78.498948) (xy 166.523208 78.470243) (xy 166.449452 78.462979) (xy 166.449442 78.462979) + (xy 166.424799 78.460552) (xy 166.400156 78.462979) (xy 162.690726 78.462979) (xy 162.719861 78.316505) (xy 162.719861 78.163449) + (xy 162.690002 78.013334) (xy 162.63143 77.871929) (xy 162.546397 77.744668) (xy 162.43817 77.636441) (xy 162.373964 77.59354) + (xy 177.704675 77.59354) (xy 177.712084 77.604629) (xy 177.820311 77.712856) (xy 177.947572 77.797889) (xy 178.088977 77.856461) + (xy 178.239092 77.88632) (xy 178.392148 77.88632) (xy 178.542263 77.856461) (xy 178.683668 77.797889) (xy 178.810929 77.712856) + (xy 178.919156 77.604629) (xy 179.004189 77.477368) (xy 179.062761 77.335963) (xy 179.09262 77.185848) (xy 179.09262 77.032792) + (xy 179.062761 76.882677) (xy 179.004189 76.741272) (xy 178.919156 76.614011) (xy 178.810929 76.505784) (xy 178.683668 76.420751) + (xy 178.542263 76.362179) (xy 178.529653 76.359671) (xy 178.659822 76.316194) (xy 178.894646 76.190677) (xy 179.02056 75.900705) + (xy 177.88656 74.766705) (xy 176.75256 75.900705) (xy 176.878474 76.190677) (xy 177.210686 76.356533) (xy 177.568872 76.45439) + (xy 177.865904 76.47532) (xy 177.820311 76.505784) (xy 177.736555 76.58954) (xy 161.190885 76.58954) (xy 161.089349 76.488004) + (xy 160.962088 76.402971) (xy 160.820683 76.344399) (xy 160.670568 76.31454) (xy 160.517512 76.31454) (xy 160.367397 76.344399) + (xy 160.225992 76.402971) (xy 160.098731 76.488004) (xy 159.990504 76.596231) (xy 159.905471 76.723492) (xy 159.846899 76.864897) + (xy 159.81704 77.015012) (xy 159.81704 77.168068) (xy 159.846899 77.318183) (xy 159.905471 77.459588) (xy 159.990504 77.586849) + (xy 160.098731 77.695076) (xy 160.162937 77.737977) (xy 154.003226 77.737977) (xy 154.083745 77.694939) (xy 154.160184 77.632206) + (xy 154.175901 77.613055) (xy 155.251674 76.537283) (xy 155.395267 76.537283) (xy 155.545382 76.507424) (xy 155.686787 76.448852) + (xy 155.814048 76.363819) (xy 155.922275 76.255592) (xy 156.007308 76.128331) (xy 156.06588 75.986926) (xy 156.08303 75.900705) + (xy 167.25256 75.900705) (xy 167.378474 76.190677) (xy 167.710686 76.356533) (xy 168.068872 76.45439) (xy 168.439266 76.480489) + (xy 168.807635 76.433825) (xy 169.159822 76.316194) (xy 169.394646 76.190677) (xy 169.52056 75.900705) (xy 168.38656 74.766705) + (xy 167.25256 75.900705) (xy 156.08303 75.900705) (xy 156.095739 75.836811) (xy 156.095739 75.683755) (xy 156.06588 75.53364) + (xy 156.007308 75.392235) (xy 155.922275 75.264974) (xy 155.835298 75.177997) (xy 157.748808 75.177997) (xy 157.826443 75.427072) + (xy 158.090483 75.552971) (xy 158.374011 75.624939) (xy 158.666131 75.640211) (xy 158.955619 75.598199) (xy 159.231347 75.500519) + (xy 159.368757 75.427072) (xy 159.446392 75.177997) (xy 158.5976 74.329205) (xy 157.748808 75.177997) (xy 155.835298 75.177997) + (xy 155.814048 75.156747) (xy 155.71235 75.088794) (xy 155.76609 74.892088) (xy 155.792189 74.521694) (xy 155.745525 74.153325) + (xy 155.627894 73.801138) (xy 155.596812 73.742989) (xy 155.723239 73.742989) (xy 155.873354 73.71313) (xy 156.014759 73.654558) + (xy 156.14202 73.569525) (xy 156.250247 73.461298) (xy 156.33528 73.334037) (xy 156.357282 73.28092) (xy 156.37024 73.289579) + (xy 156.511645 73.348151) (xy 156.66176 73.37801) (xy 156.814816 73.37801) (xy 156.964931 73.348151) (xy 157.106336 73.289579) + (xy 157.198481 73.22801) (xy 157.496402 73.22801) (xy 157.569201 73.300809) (xy 157.320128 73.378443) (xy 157.194229 73.642483) + (xy 157.122261 73.926011) (xy 157.106989 74.218131) (xy 157.149001 74.507619) (xy 157.246681 74.783347) (xy 157.320128 74.920757) + (xy 157.569203 74.998392) (xy 158.417995 74.1496) (xy 158.403853 74.135458) (xy 158.583458 73.955853) (xy 158.5976 73.969995) + (xy 158.611743 73.955853) (xy 158.791348 74.135458) (xy 158.777205 74.1496) (xy 159.625997 74.998392) (xy 159.875072 74.920757) + (xy 160.000971 74.656717) (xy 160.008034 74.628891) (xy 160.050247 74.730802) (xy 160.184527 74.931767) (xy 160.355433 75.102673) + (xy 160.556398 75.236953) (xy 160.779697 75.329447) (xy 161.016751 75.3766) (xy 161.258449 75.3766) (xy 161.495503 75.329447) + (xy 161.718802 75.236953) (xy 161.919767 75.102673) (xy 162.090673 74.931767) (xy 162.224953 74.730802) (xy 162.317447 74.507503) + (xy 162.3646 74.270449) (xy 162.3646 74.028751) (xy 162.317447 73.791697) (xy 162.224953 73.568398) (xy 162.090673 73.367433) + (xy 161.95125 73.22801) (xy 162.86395 73.22801) (xy 162.724527 73.367433) (xy 162.590247 73.568398) (xy 162.497753 73.791697) + (xy 162.4506 74.028751) (xy 162.4506 74.270449) (xy 162.497753 74.507503) (xy 162.590247 74.730802) (xy 162.724527 74.931767) + (xy 162.895433 75.102673) (xy 163.096398 75.236953) (xy 163.319697 75.329447) (xy 163.556751 75.3766) (xy 163.798449 75.3766) + (xy 164.035503 75.329447) (xy 164.258802 75.236953) (xy 164.459767 75.102673) (xy 164.630673 74.931767) (xy 164.764953 74.730802) + (xy 164.802644 74.639806) (xy 166.493171 74.639806) (xy 166.539835 75.008175) (xy 166.657466 75.360362) (xy 166.782983 75.595186) + (xy 167.072955 75.7211) (xy 168.206955 74.5871) (xy 168.566165 74.5871) (xy 169.700165 75.7211) (xy 169.990137 75.595186) + (xy 170.155993 75.262974) (xy 170.25385 74.904788) (xy 170.272521 74.639806) (xy 175.993171 74.639806) (xy 176.039835 75.008175) + (xy 176.157466 75.360362) (xy 176.282983 75.595186) (xy 176.572955 75.7211) (xy 177.706955 74.5871) (xy 178.066165 74.5871) + (xy 179.200165 75.7211) (xy 179.490137 75.595186) (xy 179.655993 75.262974) (xy 179.68129 75.170377) (xy 181.721328 75.170377) + (xy 181.798963 75.419452) (xy 182.063003 75.545351) (xy 182.346531 75.617319) (xy 182.638651 75.632591) (xy 182.928139 75.590579) + (xy 183.203867 75.492899) (xy 183.341277 75.419452) (xy 183.418912 75.170377) (xy 182.57012 74.321585) (xy 181.721328 75.170377) + (xy 179.68129 75.170377) (xy 179.75385 74.904788) (xy 179.779949 74.534394) (xy 179.738921 74.210511) (xy 181.079509 74.210511) + (xy 181.121521 74.499999) (xy 181.219201 74.775727) (xy 181.292648 74.913137) (xy 181.541723 74.990772) (xy 182.390515 74.14198) + (xy 181.541723 73.293188) (xy 181.292648 73.370823) (xy 181.166749 73.634863) (xy 181.094781 73.918391) (xy 181.079509 74.210511) + (xy 179.738921 74.210511) (xy 179.733285 74.166025) (xy 179.615654 73.813838) (xy 179.490137 73.579014) (xy 179.200165 73.4531) + (xy 178.066165 74.5871) (xy 177.706955 74.5871) (xy 176.572955 73.4531) (xy 176.282983 73.579014) (xy 176.117127 73.911226) + (xy 176.01927 74.269412) (xy 175.993171 74.639806) (xy 170.272521 74.639806) (xy 170.279949 74.534394) (xy 170.233285 74.166025) + (xy 170.115654 73.813838) (xy 169.990137 73.579014) (xy 169.700165 73.4531) (xy 168.566165 74.5871) (xy 168.206955 74.5871) + (xy 167.072955 73.4531) (xy 166.782983 73.579014) (xy 166.617127 73.911226) (xy 166.51927 74.269412) (xy 166.493171 74.639806) + (xy 164.802644 74.639806) (xy 164.857447 74.507503) (xy 164.9046 74.270449) (xy 164.9046 74.028751) (xy 164.857447 73.791697) + (xy 164.764953 73.568398) (xy 164.630673 73.367433) (xy 164.536735 73.273495) (xy 167.25256 73.273495) (xy 168.38656 74.407495) + (xy 169.52056 73.273495) (xy 176.75256 73.273495) (xy 177.88656 74.407495) (xy 179.02056 73.273495) (xy 178.894646 72.983523) + (xy 178.562434 72.817667) (xy 178.204248 72.71981) (xy 177.833854 72.693711) (xy 177.465485 72.740375) (xy 177.113298 72.858006) + (xy 176.878474 72.983523) (xy 176.75256 73.273495) (xy 169.52056 73.273495) (xy 169.394646 72.983523) (xy 169.062434 72.817667) + (xy 168.704248 72.71981) (xy 168.333854 72.693711) (xy 167.965485 72.740375) (xy 167.613298 72.858006) (xy 167.378474 72.983523) + (xy 167.25256 73.273495) (xy 164.536735 73.273495) (xy 164.49125 73.22801) (xy 164.878516 73.22801) (xy 164.90931 73.231043) + (xy 164.940104 73.22801) (xy 165.032223 73.218937) (xy 165.150413 73.183085) (xy 165.259338 73.124863) (xy 165.354811 73.046511) + (xy 165.374448 73.022583) (xy 166.242798 72.154234) (xy 166.319783 72.138921) (xy 166.461188 72.080349) (xy 166.588449 71.995316) + (xy 166.696676 71.887089) (xy 166.781709 71.759828) (xy 166.840281 71.618423) (xy 166.87014 71.468308) (xy 166.87014 71.315252) + (xy 166.840281 71.165137) (xy 166.83197 71.145072) (xy 174.26964 71.145072) (xy 174.26964 71.298128) (xy 174.299499 71.448243) + (xy 174.358071 71.589648) (xy 174.443104 71.716909) (xy 174.551331 71.825136) (xy 174.678592 71.910169) (xy 174.819997 71.968741) + (xy 174.970112 71.9986) (xy 175.123168 71.9986) (xy 175.273283 71.968741) (xy 175.414688 71.910169) (xy 175.541949 71.825136) + (xy 175.643485 71.7236) (xy 182.189466 71.7236) (xy 182.89802 72.432155) (xy 182.89802 72.575748) (xy 182.922607 72.699359) + (xy 182.793709 72.666641) (xy 182.501589 72.651369) (xy 182.212101 72.693381) (xy 181.936373 72.791061) (xy 181.798963 72.864508) + (xy 181.721328 73.113583) (xy 182.57012 73.962375) (xy 182.584263 73.948233) (xy 182.763868 74.127838) (xy 182.749725 74.14198) + (xy 183.598517 74.990772) (xy 183.847592 74.913137) (xy 183.973491 74.649097) (xy 183.980554 74.621271) (xy 184.022767 74.723182) + (xy 184.157047 74.924147) (xy 184.327953 75.095053) (xy 184.528918 75.229333) (xy 184.752217 75.321827) (xy 184.989271 75.36898) + (xy 185.230969 75.36898) (xy 185.468023 75.321827) (xy 185.66526 75.240128) (xy 180.47157 80.433819) (xy 176.733635 80.433819) + (xy 176.702841 80.430786) (xy 176.579928 80.442892) (xy 176.461737 80.478744) (xy 176.363335 80.531342) (xy 176.352813 80.536966) + (xy 176.25734 80.615318) (xy 176.237703 80.639246) (xy 175.980442 80.896507) (xy 175.797409 80.8601) (xy 175.555711 80.8601) + (xy 175.318657 80.907253) (xy 175.095358 80.999747) (xy 174.894393 81.134027) (xy 174.723487 81.304933) (xy 174.589207 81.505898) + (xy 174.496713 81.729197) (xy 174.44956 81.966251) (xy 174.44956 82.207949) (xy 174.496713 82.445003) (xy 174.589207 82.668302) + (xy 174.723487 82.869267) (xy 174.894393 83.040173) (xy 175.095358 83.174453) (xy 175.318657 83.266947) (xy 175.555711 83.3141) + (xy 175.797409 83.3141) (xy 176.034463 83.266947) (xy 176.257762 83.174453) (xy 176.458727 83.040173) (xy 176.629633 82.869267) + (xy 176.763913 82.668302) (xy 176.856407 82.445003) (xy 176.90356 82.207949) (xy 176.90356 81.966251) (xy 176.867153 81.783218) + (xy 176.962552 81.687819) (xy 178.903498 81.687819) (xy 178.754003 81.752734) (xy 178.588147 82.084946) (xy 178.49029 82.443132) + (xy 178.464191 82.813526) (xy 178.510855 83.181895) (xy 178.628486 83.534082) (xy 178.754003 83.768906) (xy 179.043975 83.89482) + (xy 180.177975 82.76082) (xy 180.537185 82.76082) (xy 181.671185 83.89482) (xy 181.961157 83.768906) (xy 182.127013 83.436694) + (xy 182.22487 83.078508) (xy 182.243541 82.813526) (xy 187.964191 82.813526) (xy 188.010855 83.181895) (xy 188.128486 83.534082) + (xy 188.254003 83.768906) (xy 188.543975 83.89482) (xy 189.677975 82.76082) (xy 190.037185 82.76082) (xy 191.171185 83.89482) + (xy 191.461157 83.768906) (xy 191.627013 83.436694) (xy 191.71407 83.118037) (xy 193.687268 83.118037) (xy 193.764903 83.367112) + (xy 194.028943 83.493011) (xy 194.312471 83.564979) (xy 194.604591 83.580251) (xy 194.894079 83.538239) (xy 195.169807 83.440559) + (xy 195.307217 83.367112) (xy 195.384852 83.118037) (xy 194.53606 82.269245) (xy 193.687268 83.118037) (xy 191.71407 83.118037) + (xy 191.72487 83.078508) (xy 191.750969 82.708114) (xy 191.704305 82.339745) (xy 191.64366 82.158171) (xy 193.045449 82.158171) + (xy 193.087461 82.447659) (xy 193.185141 82.723387) (xy 193.258588 82.860797) (xy 193.507663 82.938432) (xy 194.356455 82.08964) + (xy 193.507663 81.240848) (xy 193.258588 81.318483) (xy 193.132689 81.582523) (xy 193.060721 81.866051) (xy 193.045449 82.158171) + (xy 191.64366 82.158171) (xy 191.586674 81.987558) (xy 191.461157 81.752734) (xy 191.171185 81.62682) (xy 190.037185 82.76082) + (xy 189.677975 82.76082) (xy 188.543975 81.62682) (xy 188.254003 81.752734) (xy 188.088147 82.084946) (xy 187.99029 82.443132) + (xy 187.964191 82.813526) (xy 182.243541 82.813526) (xy 182.250969 82.708114) (xy 182.204305 82.339745) (xy 182.086674 81.987558) + (xy 181.961157 81.752734) (xy 181.671185 81.62682) (xy 180.537185 82.76082) (xy 180.177975 82.76082) (xy 180.163833 82.746678) + (xy 180.343438 82.567073) (xy 180.35758 82.581215) (xy 181.49158 81.447215) (xy 188.72358 81.447215) (xy 189.85758 82.581215) + (xy 190.99158 81.447215) (xy 190.865666 81.157243) (xy 190.533454 80.991387) (xy 190.175268 80.89353) (xy 189.804874 80.867431) + (xy 189.436505 80.914095) (xy 189.084318 81.031726) (xy 188.849494 81.157243) (xy 188.72358 81.447215) (xy 181.49158 81.447215) + (xy 181.412867 81.265944) (xy 182.78626 79.892551) (xy 182.78626 80.017948) (xy 182.816119 80.168063) (xy 182.874691 80.309468) + (xy 182.959724 80.436729) (xy 183.067951 80.544956) (xy 183.195212 80.629989) (xy 183.336617 80.688561) (xy 183.486732 80.71842) + (xy 183.639788 80.71842) (xy 183.789903 80.688561) (xy 183.931308 80.629989) (xy 184.058569 80.544956) (xy 184.160105 80.44342) + (xy 194.719906 80.44342) (xy 194.935397 80.658911) (xy 194.759649 80.614301) (xy 194.467529 80.599029) (xy 194.178041 80.641041) + (xy 193.902313 80.738721) (xy 193.764903 80.812168) (xy 193.687268 81.061243) (xy 194.53606 81.910035) (xy 194.550203 81.895893) + (xy 194.729808 82.075498) (xy 194.715665 82.08964) (xy 195.564457 82.938432) (xy 195.813532 82.860797) (xy 195.939431 82.596757) + (xy 195.946494 82.568931) (xy 195.988707 82.670842) (xy 196.122987 82.871807) (xy 196.293893 83.042713) (xy 196.494858 83.176993) + (xy 196.718157 83.269487) (xy 196.955211 83.31664) (xy 197.196909 83.31664) (xy 197.433963 83.269487) (xy 197.657262 83.176993) + (xy 197.858227 83.042713) (xy 198.029133 82.871807) (xy 198.163413 82.670842) (xy 198.255907 82.447543) (xy 198.30306 82.210489) + (xy 198.30306 81.968791) (xy 198.38906 81.968791) (xy 198.38906 82.210489) (xy 198.436213 82.447543) (xy 198.528707 82.670842) + (xy 198.662987 82.871807) (xy 198.833893 83.042713) (xy 199.034858 83.176993) (xy 199.258157 83.269487) (xy 199.495211 83.31664) + (xy 199.736909 83.31664) (xy 199.973963 83.269487) (xy 200.197262 83.176993) (xy 200.398227 83.042713) (xy 200.569133 82.871807) + (xy 200.703413 82.670842) (xy 200.795907 82.447543) (xy 200.84306 82.210489) (xy 200.84306 81.968791) (xy 200.795907 81.731737) + (xy 200.703413 81.508438) (xy 200.569133 81.307473) (xy 200.398227 81.136567) (xy 200.197262 81.002287) (xy 199.973963 80.909793) + (xy 199.736909 80.86264) (xy 199.495211 80.86264) (xy 199.258157 80.909793) (xy 199.034858 81.002287) (xy 198.833893 81.136567) + (xy 198.662987 81.307473) (xy 198.528707 81.508438) (xy 198.436213 81.731737) (xy 198.38906 81.968791) (xy 198.30306 81.968791) + (xy 198.255907 81.731737) (xy 198.163413 81.508438) (xy 198.029133 81.307473) (xy 197.858227 81.136567) (xy 197.657262 81.002287) + (xy 197.433963 80.909793) (xy 197.196909 80.86264) (xy 196.955211 80.86264) (xy 196.718157 80.909793) (xy 196.638955 80.9426) + (xy 195.300241 79.603887) (xy 195.284524 79.584736) (xy 195.208085 79.522003) (xy 195.120876 79.475389) (xy 195.026249 79.446684) + (xy 194.952493 79.43942) (xy 194.952483 79.43942) (xy 194.92784 79.436993) (xy 194.903197 79.43942) (xy 184.160105 79.43942) + (xy 184.058569 79.337884) (xy 183.931308 79.252851) (xy 183.789903 79.194279) (xy 183.639788 79.16442) (xy 183.514391 79.16442) + (xy 186.775566 75.903245) (xy 191.19206 75.903245) (xy 191.317974 76.193217) (xy 191.650186 76.359073) (xy 192.008372 76.45693) + (xy 192.378766 76.483029) (xy 192.747135 76.436365) (xy 193.099322 76.318734) (xy 193.334146 76.193217) (xy 193.46006 75.903245) + (xy 192.32606 74.769245) (xy 191.19206 75.903245) (xy 186.775566 75.903245) (xy 187.346239 75.332573) (xy 187.529271 75.36898) + (xy 187.770969 75.36898) (xy 188.008023 75.321827) (xy 188.231322 75.229333) (xy 188.432287 75.095053) (xy 188.603193 74.924147) + (xy 188.737473 74.723182) (xy 188.829967 74.499883) (xy 188.87712 74.262829) (xy 188.87712 74.021131) (xy 188.840713 73.838099) + (xy 189.162173 73.516639) (xy 190.871978 73.516639) (xy 190.722483 73.581554) (xy 190.556627 73.913766) (xy 190.45877 74.271952) + (xy 190.432671 74.642346) (xy 190.479335 75.010715) (xy 190.596966 75.362902) (xy 190.722483 75.597726) (xy 191.012455 75.72364) + (xy 192.146455 74.58964) (xy 192.132313 74.575498) (xy 192.311918 74.395893) (xy 192.32606 74.410035) (xy 192.340203 74.395893) + (xy 192.519808 74.575498) (xy 192.505665 74.58964) (xy 193.639665 75.72364) (xy 193.929637 75.597726) (xy 194.095493 75.265514) + (xy 194.19335 74.907328) (xy 194.212021 74.642346) (xy 199.932671 74.642346) (xy 199.979335 75.010715) (xy 200.096966 75.362902) + (xy 200.222483 75.597726) (xy 200.512455 75.72364) (xy 201.646455 74.58964) (xy 200.512455 73.45564) (xy 200.222483 73.581554) + (xy 200.056627 73.913766) (xy 199.95877 74.271952) (xy 199.932671 74.642346) (xy 194.212021 74.642346) (xy 194.219449 74.536934) + (xy 194.172785 74.168565) (xy 194.055154 73.816378) (xy 193.929637 73.581554) (xy 193.780142 73.516639) (xy 197.591029 73.516639) + (xy 197.656797 73.543881) (xy 197.806912 73.57374) (xy 197.959968 73.57374) (xy 198.110083 73.543881) (xy 198.251488 73.485309) + (xy 198.378749 73.400276) (xy 198.486976 73.292049) (xy 198.572009 73.164788) (xy 198.630581 73.023383) (xy 198.66044 72.873268) + (xy 198.66044 72.720212) (xy 198.630581 72.570097) (xy 198.572009 72.428692) (xy 198.486976 72.301431) (xy 198.378749 72.193204) + (xy 198.251488 72.108171) (xy 198.110083 72.049599) (xy 197.959968 72.01974) (xy 197.806912 72.01974) (xy 197.656797 72.049599) + (xy 197.515392 72.108171) (xy 197.388131 72.193204) (xy 197.318696 72.262639) (xy 188.933255 72.262639) (xy 188.902461 72.259606) + (xy 188.779548 72.271712) (xy 188.661357 72.307564) (xy 188.616371 72.33161) (xy 188.552433 72.365786) (xy 188.45696 72.444138) + (xy 188.43733 72.468058) (xy 187.954001 72.951387) (xy 187.770969 72.91498) (xy 187.529271 72.91498) (xy 187.292217 72.962133) + (xy 187.068918 73.054627) (xy 186.867953 73.188907) (xy 186.697047 73.359813) (xy 186.562767 73.560778) (xy 186.470273 73.784077) + (xy 186.42312 74.021131) (xy 186.42312 74.262829) (xy 186.459527 74.445861) (xy 186.208268 74.69712) (xy 186.289967 74.499883) + (xy 186.33712 74.262829) (xy 186.33712 74.021131) (xy 186.289967 73.784077) (xy 186.197473 73.560778) (xy 186.063193 73.359813) + (xy 185.892287 73.188907) (xy 185.691322 73.054627) (xy 185.468023 72.962133) (xy 185.230969 72.91498) (xy 184.989271 72.91498) + (xy 184.752217 72.962133) (xy 184.528918 73.054627) (xy 184.327953 73.188907) (xy 184.157047 73.359813) (xy 184.022767 73.560778) + (xy 183.977968 73.668931) (xy 183.921039 73.508233) (xy 183.847592 73.370823) (xy 183.598519 73.293189) (xy 183.615488 73.27622) + (xy 183.751548 73.27622) (xy 183.901663 73.246361) (xy 184.043068 73.187789) (xy 184.170329 73.102756) (xy 184.278556 72.994529) + (xy 184.363589 72.867268) (xy 184.422161 72.725863) (xy 184.45202 72.575748) (xy 184.45202 72.422692) (xy 184.422161 72.272577) + (xy 184.363589 72.131172) (xy 184.278556 72.003911) (xy 184.170329 71.895684) (xy 184.043068 71.810651) (xy 183.901663 71.752079) + (xy 183.751548 71.72222) (xy 183.607955 71.72222) (xy 182.769801 70.884067) (xy 182.754084 70.864916) (xy 182.677645 70.802183) + (xy 182.590436 70.755569) (xy 182.495809 70.726864) (xy 182.422053 70.7196) (xy 182.422043 70.7196) (xy 182.3974 70.717173) + (xy 182.372757 70.7196) (xy 175.643485 70.7196) (xy 175.541949 70.618064) (xy 175.414688 70.533031) (xy 175.273283 70.474459) + (xy 175.123168 70.4446) (xy 174.970112 70.4446) (xy 174.819997 70.474459) (xy 174.678592 70.533031) (xy 174.551331 70.618064) + (xy 174.443104 70.726291) (xy 174.358071 70.853552) (xy 174.299499 70.994957) (xy 174.26964 71.145072) (xy 166.83197 71.145072) + (xy 166.781709 71.023732) (xy 166.696676 70.896471) (xy 166.588449 70.788244) (xy 166.461188 70.703211) (xy 166.319783 70.644639) + (xy 166.169668 70.61478) (xy 166.016612 70.61478) (xy 165.866497 70.644639) (xy 165.725092 70.703211) (xy 165.597831 70.788244) + (xy 165.489604 70.896471) (xy 165.404571 71.023732) (xy 165.345999 71.165137) (xy 165.318073 71.305536) (xy 164.649599 71.97401) + (xy 157.198481 71.97401) (xy 157.106336 71.912441) (xy 156.964931 71.853869) (xy 156.856239 71.832249) (xy 156.718404 71.694415) + (xy 156.698767 71.670487) (xy 156.603294 71.592135) (xy 156.494369 71.533913) (xy 156.376179 71.498061) (xy 156.28406 71.488988) + (xy 156.253266 71.485955) (xy 156.222472 71.488988) (xy 155.085448 71.488988) (xy 155.105481 71.440623) (xy 155.13534 71.290508) + (xy 155.13534 71.137452) (xy 155.105481 70.987337) (xy 155.078582 70.922398) (xy 161.600163 70.922398) (xy 161.643242 70.926641) + (xy 161.686321 70.922398) (xy 161.815164 70.909708) (xy 161.980479 70.85956) (xy 162.132834 70.778125) (xy 162.266375 70.668531) + (xy 162.293839 70.635066) (xy 162.752293 70.176612) (xy 167.40485 70.176612) (xy 167.490392 70.233769) (xy 167.631797 70.292341) + (xy 167.781912 70.3222) (xy 167.934968 70.3222) (xy 168.085083 70.292341) (xy 168.226488 70.233769) (xy 168.343021 70.155904) + (xy 168.481905 70.113774) (xy 168.63426 70.032339) (xy 168.767801 69.922745) (xy 168.795265 69.88928) (xy 169.204994 69.47955) + (xy 169.287126 69.379471) (xy 169.368562 69.227117) (xy 169.41871 69.061803) (xy 169.435643 68.88988) (xy 169.41871 68.717958) + (xy 169.372878 68.566871) (xy 172.442875 68.566871) (xy 172.473669 68.569904) (xy 172.504463 68.566871) (xy 172.596582 68.557798) + (xy 172.714772 68.521946) (xy 172.823697 68.463724) (xy 172.91917 68.385372) (xy 172.938807 68.361444) (xy 173.32198 67.978272) + (xy 173.355657 68.011949) (xy 173.37529 68.035872) (xy 173.470763 68.114224) (xy 173.579688 68.172446) (xy 173.697878 68.208298) + (xy 173.789997 68.217371) (xy 173.789998 68.217371) (xy 173.82079 68.220404) (xy 173.851582 68.217371) (xy 176.816616 68.217371) + (xy 176.84741 68.220404) (xy 176.878204 68.217371) (xy 176.970323 68.208298) (xy 177.088513 68.172446) (xy 177.197438 68.114224) + (xy 177.292911 68.035872) (xy 177.312548 68.011944) (xy 177.368907 67.955585) (xy 179.22612 67.955585) (xy 179.352034 68.245557) + (xy 179.684246 68.411413) (xy 180.042432 68.50927) (xy 180.412826 68.535369) (xy 180.781195 68.488705) (xy 181.133382 68.371074) + (xy 181.368206 68.245557) (xy 181.49412 67.955585) (xy 188.72612 67.955585) (xy 188.852034 68.245557) (xy 189.184246 68.411413) + (xy 189.542432 68.50927) (xy 189.912826 68.535369) (xy 190.281195 68.488705) (xy 190.633382 68.371074) (xy 190.868206 68.245557) + (xy 190.99412 67.955585) (xy 189.86012 66.821585) (xy 188.72612 67.955585) (xy 181.49412 67.955585) (xy 180.36012 66.821585) + (xy 179.22612 67.955585) (xy 177.368907 67.955585) (xy 178.485066 66.839426) (xy 178.513395 67.063055) (xy 178.631026 67.415242) + (xy 178.756543 67.650066) (xy 179.046515 67.77598) (xy 180.180515 66.64198) (xy 180.539725 66.64198) (xy 181.673725 67.77598) + (xy 181.963697 67.650066) (xy 182.129553 67.317854) (xy 182.22741 66.959668) (xy 182.246081 66.694686) (xy 187.966731 66.694686) + (xy 188.013395 67.063055) (xy 188.131026 67.415242) (xy 188.256543 67.650066) (xy 188.546515 67.77598) (xy 189.680515 66.64198) + (xy 190.039725 66.64198) (xy 191.173725 67.77598) (xy 191.463697 67.650066) (xy 191.629553 67.317854) (xy 191.72741 66.959668) + (xy 191.753509 66.589274) (xy 191.706845 66.220905) (xy 191.589214 65.868718) (xy 191.463697 65.633894) (xy 191.173725 65.50798) + (xy 190.039725 66.64198) (xy 189.680515 66.64198) (xy 188.546515 65.50798) (xy 188.256543 65.633894) (xy 188.090687 65.966106) + (xy 187.99283 66.324292) (xy 187.966731 66.694686) (xy 182.246081 66.694686) (xy 182.253509 66.589274) (xy 182.206845 66.220905) + (xy 182.089214 65.868718) (xy 181.963697 65.633894) (xy 181.673725 65.50798) (xy 180.539725 66.64198) (xy 180.180515 66.64198) + (xy 180.166373 66.627838) (xy 180.345978 66.448233) (xy 180.36012 66.462375) (xy 181.49412 65.328375) (xy 181.409457 65.133402) + (xy 188.810783 65.133402) (xy 188.72612 65.328375) (xy 189.86012 66.462375) (xy 190.99412 65.328375) (xy 190.909457 65.133402) + (xy 191.961948 65.133402) (xy 192.50684 65.678295) (xy 192.50684 65.821888) (xy 192.536699 65.972003) (xy 192.595271 66.113408) + (xy 192.680304 66.240669) (xy 192.788531 66.348896) (xy 192.915792 66.433929) (xy 193.057197 66.492501) (xy 193.207312 66.52236) + (xy 193.360368 66.52236) (xy 193.510483 66.492501) (xy 193.651888 66.433929) (xy 193.779149 66.348896) (xy 193.887376 66.240669) + (xy 193.972409 66.113408) (xy 194.030981 65.972003) (xy 194.06084 65.821888) (xy 194.06084 65.668832) (xy 194.030981 65.518717) + (xy 193.972409 65.377312) (xy 193.887376 65.250051) (xy 193.779149 65.141824) (xy 193.651888 65.056791) (xy 193.510483 64.998219) + (xy 193.360368 64.96836) (xy 193.216775 64.96836) (xy 192.542281 64.293867) (xy 192.526566 64.274718) (xy 192.450127 64.211985) + (xy 192.362918 64.165371) (xy 192.268291 64.136666) (xy 192.194535 64.129402) (xy 192.194525 64.129402) (xy 192.169882 64.126975) + (xy 192.145239 64.129402) (xy 186.739365 64.129402) (xy 186.7685 63.982928) (xy 186.7685 63.829872) (xy 186.739187 63.6825) + (xy 192.500889 63.6825) (xy 194.522199 65.703811) (xy 194.522205 65.703816) (xy 194.575019 65.75663) (xy 194.596639 65.865323) + (xy 194.655211 66.006728) (xy 194.740244 66.133989) (xy 194.848471 66.242216) (xy 194.975732 66.327249) (xy 195.117137 66.385821) + (xy 195.267252 66.41568) (xy 195.420308 66.41568) (xy 195.570423 66.385821) (xy 195.711828 66.327249) (xy 195.839089 66.242216) + (xy 195.947316 66.133989) (xy 196.032349 66.006728) (xy 196.090921 65.865323) (xy 196.12078 65.715208) (xy 196.12078 65.562152) + (xy 196.090921 65.412037) (xy 196.032349 65.270632) (xy 195.947316 65.143371) (xy 195.839089 65.035144) (xy 195.711828 64.950111) + (xy 195.570423 64.891539) (xy 195.46173 64.869919) (xy 195.408916 64.817105) (xy 195.408911 64.817099) (xy 193.299301 62.70749) + (xy 200.082116 62.70749) (xy 200.55356 63.178935) (xy 200.55356 63.322528) (xy 200.583419 63.472643) (xy 200.641991 63.614048) + (xy 200.727024 63.741309) (xy 200.835251 63.849536) (xy 200.962512 63.934569) (xy 201.103917 63.993141) (xy 201.254032 64.023) + (xy 201.407088 64.023) (xy 201.557203 63.993141) (xy 201.698608 63.934569) (xy 201.825869 63.849536) (xy 201.934096 63.741309) + (xy 202.019129 63.614048) (xy 202.077701 63.472643) (xy 202.10756 63.322528) (xy 202.10756 63.169472) (xy 202.077701 63.019357) + (xy 202.019129 62.877952) (xy 201.934096 62.750691) (xy 201.825869 62.642464) (xy 201.698608 62.557431) (xy 201.557203 62.498859) + (xy 201.407088 62.469) (xy 201.263495 62.469) (xy 200.662451 61.867957) (xy 200.646734 61.848806) (xy 200.570295 61.786073) + (xy 200.483086 61.739459) (xy 200.388459 61.710754) (xy 200.314703 61.70349) (xy 200.314693 61.70349) (xy 200.29005 61.701063) + (xy 200.265407 61.70349) (xy 179.780087 61.70349) (xy 179.708331 61.631734) (xy 179.74153 61.582048) (xy 179.800102 61.440643) + (xy 179.829961 61.290528) (xy 179.829961 61.137472) (xy 179.800102 60.987357) (xy 179.74153 60.845952) (xy 179.656497 60.718691) + (xy 179.54827 60.610464) (xy 179.421009 60.525431) (xy 179.279604 60.466859) (xy 179.129489 60.437) (xy 178.976433 60.437) + (xy 178.826318 60.466859) (xy 178.684913 60.525431) (xy 178.592768 60.587) (xy 178.519376 60.587) (xy 178.488582 60.583967) + (xy 178.39096 60.593582) (xy 178.365669 60.596073) (xy 178.247479 60.631925) (xy 178.138554 60.690147) (xy 178.043081 60.768499) + (xy 178.023448 60.792422) (xy 176.919229 61.896642) (xy 176.836253 61.77246) (xy 176.728026 61.664233) (xy 176.600765 61.5792) + (xy 176.45936 61.520628) (xy 176.309245 61.490769) (xy 176.156189 61.490769) (xy 176.006074 61.520628) (xy 175.864669 61.5792) + (xy 175.737408 61.664233) (xy 175.629181 61.77246) (xy 175.544148 61.899721) (xy 175.485576 62.041126) (xy 175.455717 62.191241) + (xy 175.455717 62.334834) (xy 174.698572 63.09198) (xy 162.966345 63.09198) (xy 162.864809 62.990444) (xy 162.737548 62.905411) + (xy 162.596143 62.846839) (xy 162.446028 62.81698) (xy 162.292972 62.81698) (xy 162.142857 62.846839) (xy 162.001452 62.905411) + (xy 161.874191 62.990444) (xy 161.765964 63.098671) (xy 161.680931 63.225932) (xy 161.622359 63.367337) (xy 161.5925 63.517452) + (xy 161.5925 63.670508) (xy 161.622359 63.820623) (xy 161.633869 63.84841) (xy 152.376997 63.84841) (xy 152.346203 63.845377) + (xy 152.315409 63.84841) (xy 152.22329 63.857483) (xy 152.141907 63.88217) (xy 148.770343 63.88217) (xy 148.75602 63.877825) + (xy 148.633108 63.865719) (xy 148.633107 63.865719) (xy 148.510196 63.877825) (xy 148.469424 63.890193) (xy 146.589203 63.890193) + (xy 146.558409 63.88716) (xy 146.527615 63.890193) (xy 146.435496 63.899266) (xy 146.317306 63.935118) (xy 146.208381 63.99334) + (xy 146.112908 64.071692) (xy 146.093278 64.095612) (xy 143.792321 66.396569) (xy 143.769425 66.215825) (xy 143.651794 65.863638) + (xy 143.526277 65.628814) (xy 143.236305 65.5029) (xy 142.102305 66.6369) (xy 142.116448 66.651043) (xy 141.936843 66.830648) + (xy 141.9227 66.816505) (xy 141.908558 66.830648) (xy 141.728953 66.651043) (xy 141.743095 66.6369) (xy 140.609095 65.5029) + (xy 140.319123 65.628814) (xy 140.153267 65.961026) (xy 140.05541 66.319212) (xy 140.029311 66.689606) (xy 140.075975 67.057975) + (xy 140.193606 67.410162) (xy 140.319123 67.644986) (xy 140.468618 67.709901) (xy 138.982551 67.709901) (xy 137.961667 66.689018) + (xy 137.94203 66.66509) (xy 137.846557 66.586738) (xy 137.737632 66.528516) (xy 137.619442 66.492664) (xy 137.527323 66.483591) + (xy 137.496529 66.480558) (xy 137.465735 66.483591) (xy 137.339862 66.483591) (xy 136.179566 65.323295) (xy 140.7887 65.323295) + (xy 141.9227 66.457295) (xy 143.0567 65.323295) (xy 142.930786 65.033323) (xy 142.598574 64.867467) (xy 142.240388 64.76961) + (xy 141.869994 64.743511) (xy 141.501625 64.790175) (xy 141.149438 64.907806) (xy 140.914614 65.033323) (xy 140.7887 65.323295) + (xy 136.179566 65.323295) (xy 135.346936 64.490666) (xy 135.327299 64.466738) (xy 135.231826 64.388386) (xy 135.122901 64.330164) + (xy 135.004711 64.294312) (xy 134.912592 64.285239) (xy 134.881798 64.282206) (xy 134.851004 64.285239) (xy 131.662153 64.285239) + (xy 131.631359 64.282206) (xy 131.600565 64.285239) (xy 131.508446 64.294312) (xy 131.39584 64.32847) (xy 122.477966 64.32847) + (xy 122.373524 64.272644) (xy 122.255334 64.236792) (xy 122.163215 64.227719) (xy 122.132421 64.224686) (xy 122.101627 64.227719) + (xy 117.24207 64.227719) (xy 117.211278 64.224686) (xy 117.180486 64.227719) (xy 117.180485 64.227719) (xy 117.088366 64.236792) + (xy 116.970176 64.272644) (xy 116.861251 64.330866) (xy 116.765778 64.409218) (xy 116.746145 64.433141) (xy 114.798547 66.38074) + (xy 113.810233 66.38074) (xy 113.718088 66.319171) (xy 113.576683 66.260599) (xy 113.426568 66.23074) (xy 113.273512 66.23074) + (xy 113.123397 66.260599) (xy 112.981992 66.319171) (xy 112.854731 66.404204) (xy 112.746504 66.512431) (xy 112.661471 66.639692) + (xy 112.602899 66.781097) (xy 112.57304 66.931212) (xy 112.57304 67.084268) (xy 112.602899 67.234383) (xy 112.661471 67.375788) + (xy 112.746504 67.503049) (xy 112.854731 67.611276) (xy 112.981992 67.696309) (xy 113.123397 67.754881) (xy 113.273512 67.78474) + (xy 113.426568 67.78474) (xy 113.576683 67.754881) (xy 113.718088 67.696309) (xy 113.810233 67.63474) (xy 115.027464 67.63474) + (xy 115.058258 67.637773) (xy 115.089052 67.63474) (xy 115.181171 67.625667) (xy 115.299361 67.589815) (xy 115.408286 67.531593) + (xy 115.503759 67.453241) (xy 115.523396 67.429313) (xy 116.113579 66.839131) (xy 116.136475 67.019875) (xy 116.254106 67.372062) + (xy 116.379623 67.606886) (xy 116.669595 67.7328) (xy 117.803595 66.5988) (xy 117.789453 66.584658) (xy 117.969058 66.405053) + (xy 117.9832 66.419195) (xy 117.997343 66.405053) (xy 118.176948 66.584658) (xy 118.162805 66.5988) (xy 119.296805 67.7328) + (xy 119.586777 67.606886) (xy 119.752633 67.274674) (xy 119.85049 66.916488) (xy 119.876589 66.546094) (xy 119.829925 66.177725) + (xy 119.712294 65.825538) (xy 119.586777 65.590714) (xy 119.335768 65.481719) (xy 120.94658 65.481719) (xy 120.91694 65.630732) + (xy 120.91694 65.783788) (xy 120.946799 65.933903) (xy 121.005371 66.075308) (xy 121.090404 66.202569) (xy 121.198631 66.310796) + (xy 121.325892 66.395829) (xy 121.467297 66.454401) (xy 121.617412 66.48426) (xy 121.770468 66.48426) (xy 121.920583 66.454401) + (xy 122.061988 66.395829) (xy 122.189249 66.310796) (xy 122.290785 66.20926) (xy 126.558219 66.20926) (xy 126.640304 66.332109) + (xy 126.748531 66.440336) (xy 126.875792 66.525369) (xy 127.017197 66.583941) (xy 127.167312 66.6138) (xy 127.320368 66.6138) + (xy 127.470483 66.583941) (xy 127.611888 66.525369) (xy 127.739149 66.440336) (xy 127.847376 66.332109) (xy 127.932409 66.204848) + (xy 127.990981 66.063443) (xy 128.02084 65.913328) (xy 128.02084 65.760272) (xy 127.990981 65.610157) (xy 127.979513 65.58247) + (xy 130.92585 65.58247) (xy 130.819123 65.628814) (xy 130.653267 65.961026) (xy 130.55541 66.319212) (xy 130.529311 66.689606) + (xy 130.575975 67.057975) (xy 130.693606 67.410162) (xy 130.819123 67.644986) (xy 131.109095 67.7709) (xy 132.243095 66.6369) + (xy 132.228953 66.622758) (xy 132.408558 66.443153) (xy 132.4227 66.457295) (xy 132.436843 66.443153) (xy 132.616448 66.622758) + (xy 132.602305 66.6369) (xy 133.736305 67.7709) (xy 134.026277 67.644986) (xy 134.192133 67.312774) (xy 134.28999 66.954588) + (xy 134.316089 66.584194) (xy 134.269425 66.215825) (xy 134.151794 65.863638) (xy 134.026277 65.628814) (xy 133.819991 65.539239) + (xy 134.622087 65.539239) (xy 136.516561 67.433714) (xy 136.484992 67.465283) (xy 136.399959 67.592544) (xy 136.341387 67.733949) + (xy 136.311528 67.884064) (xy 136.311528 68.03712) (xy 136.341387 68.187235) (xy 136.399959 68.32864) (xy 136.484992 68.455901) + (xy 136.593219 68.564128) (xy 136.72048 68.649161) (xy 136.861885 68.707733) (xy 136.970577 68.729353) (xy 137.415431 69.174207) + (xy 126.444332 69.174207) (xy 125.570328 68.300203) (xy 125.542872 68.266748) (xy 125.509417 68.239292) (xy 125.509411 68.239286) + (xy 125.409332 68.157154) (xy 125.256976 68.075718) (xy 125.091662 68.02557) (xy 124.91974 68.008637) (xy 124.919739 68.008637) + (xy 124.747817 68.02557) (xy 124.582503 68.075718) (xy 124.430148 68.157154) (xy 124.330069 68.239286) (xy 124.330063 68.239292) + (xy 124.296608 68.266748) (xy 124.269152 68.300203) (xy 124.156476 68.412879) (xy 118.502017 68.412879) (xy 118.756462 68.327894) + (xy 118.991286 68.202377) (xy 119.100655 67.950505) (xy 131.2887 67.950505) (xy 131.414614 68.240477) (xy 131.746826 68.406333) + (xy 132.105012 68.50419) (xy 132.475406 68.530289) (xy 132.843775 68.483625) (xy 133.195962 68.365994) (xy 133.430786 68.240477) + (xy 133.5567 67.950505) (xy 132.4227 66.816505) (xy 131.2887 67.950505) (xy 119.100655 67.950505) (xy 119.1172 67.912405) + (xy 117.9832 66.778405) (xy 116.8492 67.912405) (xy 116.975114 68.202377) (xy 117.307326 68.368233) (xy 117.470744 68.412879) + (xy 110.980596 68.412879) (xy 111.011081 68.339283) (xy 111.04094 68.189168) (xy 111.04094 68.045574) (xy 115.927305 63.159211) + (xy 149.954246 63.159211) (xy 149.978889 63.161638) (xy 150.003532 63.159211) (xy 150.003542 63.159211) (xy 150.047358 63.154896) + (xy 150.159392 63.17718) (xy 150.312448 63.17718) (xy 150.462563 63.147321) (xy 150.603968 63.088749) (xy 150.731229 63.003716) + (xy 150.784627 62.950318) (xy 150.787399 62.954467) (xy 150.895626 63.062694) (xy 151.022887 63.147727) (xy 151.164292 63.206299) + (xy 151.314407 63.236158) (xy 151.467463 63.236158) (xy 151.617578 63.206299) (xy 151.758983 63.147727) (xy 151.886244 63.062694) + (xy 151.994471 62.954467) (xy 152.079504 62.827206) (xy 152.138076 62.685801) (xy 152.167935 62.535686) (xy 152.167935 62.38263) + (xy 152.138076 62.232515) (xy 152.079504 62.09111) (xy 152.007483 61.983323) (xy 152.035886 61.95492) (xy 152.120919 61.827659) + (xy 152.179491 61.686254) (xy 152.20935 61.536139) (xy 152.20935 61.383083) (xy 152.179491 61.232968) (xy 152.120919 61.091563) + (xy 152.035886 60.964302) (xy 151.927659 60.856075) (xy 151.800398 60.771042) (xy 151.658993 60.71247) (xy 151.508878 60.682611) + (xy 151.364279 60.682611) (xy 151.312596 60.640195) (xy 151.225387 60.593581) (xy 151.13076 60.564876) (xy 151.057004 60.557612) + (xy 151.056994 60.557612) (xy 151.032351 60.555185) (xy 151.007708 60.557612) (xy 138.220719 60.557612) (xy 138.196076 60.555185) + (xy 138.171433 60.557612) (xy 138.171423 60.557612) (xy 138.097667 60.564876) (xy 138.00304 60.593581) (xy 137.971454 60.610464) + (xy 137.91583 60.640195) (xy 137.85854 60.687212) (xy 137.858532 60.68722) (xy 137.839392 60.702928) (xy 137.823683 60.722069) + (xy 137.335914 61.20984) (xy 132.996058 61.20984) (xy 133.070561 61.098338) (xy 133.129133 60.956933) (xy 133.158992 60.806818) + (xy 133.158992 60.663224) (xy 134.305857 59.51636) (xy 144.861333 59.51636) (xy 144.962869 59.617896) (xy 145.09013 59.702929) + (xy 145.231535 59.761501) (xy 145.38165 59.79136) (xy 145.534706 59.79136) (xy 145.684821 59.761501) (xy 145.826226 59.702929) + (xy 145.953487 59.617896) (xy 146.061714 59.509669) (xy 146.146747 59.382408) (xy 146.205319 59.241003) (xy 146.235178 59.090888) + (xy 146.235178 58.937832) (xy 146.205319 58.787717) (xy 146.146747 58.646312) (xy 146.113499 58.596552) (xy 152.23214 58.596552) + (xy 152.23214 58.749608) (xy 152.261999 58.899723) (xy 152.320571 59.041128) (xy 152.38214 59.133273) (xy 152.38214 59.142286) + (xy 152.379107 59.17308) (xy 152.38214 59.203874) (xy 152.391213 59.295993) (xy 152.427065 59.414183) (xy 152.485288 59.523108) + (xy 152.56364 59.618581) (xy 152.587562 59.638213) (xy 154.044006 61.094658) (xy 154.063639 61.118581) (xy 154.159112 61.196933) + (xy 154.268037 61.255155) (xy 154.386227 61.291007) (xy 154.478346 61.30008) (xy 154.478347 61.30008) (xy 154.509139 61.303113) + (xy 154.539931 61.30008) (xy 155.742179 61.30008) (xy 155.761999 61.399723) (xy 155.820571 61.541128) (xy 155.905604 61.668389) + (xy 156.013831 61.776616) (xy 156.141092 61.861649) (xy 156.282497 61.920221) (xy 156.432612 61.95008) (xy 156.585668 61.95008) + (xy 156.735783 61.920221) (xy 156.877188 61.861649) (xy 157.004449 61.776616) (xy 157.112676 61.668389) (xy 157.197709 61.541128) + (xy 157.256281 61.399723) (xy 157.28614 61.249608) (xy 157.28614 61.096552) (xy 157.256281 60.946437) (xy 157.197709 60.805032) + (xy 157.112676 60.677771) (xy 157.004449 60.569544) (xy 156.877188 60.484511) (xy 156.735783 60.425939) (xy 156.627091 60.404319) + (xy 156.474278 60.251507) (xy 156.454641 60.227579) (xy 156.359168 60.149227) (xy 156.250243 60.091005) (xy 156.19429 60.074032) + (xy 157.585545 60.074032) (xy 157.610188 60.076459) (xy 157.634831 60.074032) (xy 157.634841 60.074032) (xy 157.708597 60.066768) + (xy 157.803224 60.038063) (xy 157.890433 59.991449) (xy 157.966872 59.928716) (xy 157.982589 59.909565) (xy 158.442075 59.45008) + (xy 158.585668 59.45008) (xy 158.735783 59.420221) (xy 158.877188 59.361649) (xy 159.004449 59.276616) (xy 159.112676 59.168389) + (xy 159.197709 59.041128) (xy 159.256281 58.899723) (xy 159.28614 58.749608) (xy 159.28614 58.596552) (xy 159.256281 58.446437) + (xy 159.197709 58.305032) (xy 159.112676 58.177771) (xy 159.004449 58.069544) (xy 158.886746 57.990897) (xy 160.301508 57.990897) + (xy 160.379143 58.239972) (xy 160.643183 58.365871) (xy 160.926711 58.437839) (xy 161.218831 58.453111) (xy 161.508319 58.411099) + (xy 161.784047 58.313419) (xy 161.921457 58.239972) (xy 161.999092 57.990897) (xy 172.277608 57.990897) (xy 172.355243 58.239972) + (xy 172.619283 58.365871) (xy 172.902811 58.437839) (xy 173.194931 58.453111) (xy 173.484419 58.411099) (xy 173.760147 58.313419) + (xy 173.897557 58.239972) (xy 173.975192 57.990897) (xy 173.962492 57.978197) (xy 184.253708 57.978197) (xy 184.331343 58.227272) + (xy 184.595383 58.353171) (xy 184.878911 58.425139) (xy 185.171031 58.440411) (xy 185.460519 58.398399) (xy 185.736247 58.300719) + (xy 185.873657 58.227272) (xy 185.951292 57.978197) (xy 185.938592 57.965497) (xy 196.255208 57.965497) (xy 196.332843 58.214572) + (xy 196.596883 58.340471) (xy 196.880411 58.412439) (xy 197.172531 58.427711) (xy 197.462019 58.385699) (xy 197.737747 58.288019) + (xy 197.875157 58.214572) (xy 197.952792 57.965497) (xy 197.104 57.116705) (xy 196.255208 57.965497) (xy 185.938592 57.965497) + (xy 185.1025 57.129405) (xy 184.253708 57.978197) (xy 173.962492 57.978197) (xy 173.1264 57.142105) (xy 172.277608 57.990897) + (xy 161.999092 57.990897) (xy 161.1503 57.142105) (xy 160.301508 57.990897) (xy 158.886746 57.990897) (xy 158.877188 57.984511) + (xy 158.735783 57.925939) (xy 158.585668 57.89608) (xy 158.432612 57.89608) (xy 158.282497 57.925939) (xy 158.141092 57.984511) + (xy 158.013831 58.069544) (xy 157.905604 58.177771) (xy 157.820571 58.305032) (xy 157.761999 58.446437) (xy 157.73214 58.596552) + (xy 157.73214 58.740145) (xy 157.402254 59.070032) (xy 155.207033 59.070032) (xy 155.105497 58.968496) (xy 154.978236 58.883463) + (xy 154.836831 58.824891) (xy 154.686716 58.795032) (xy 154.53366 58.795032) (xy 154.383545 58.824891) (xy 154.24214 58.883463) + (xy 154.114879 58.968496) (xy 154.006652 59.076723) (xy 153.923676 59.200905) (xy 153.717096 58.994325) (xy 153.756281 58.899723) + (xy 153.78614 58.749608) (xy 153.78614 58.596552) (xy 153.756281 58.446437) (xy 153.697709 58.305032) (xy 153.612676 58.177771) + (xy 153.504449 58.069544) (xy 153.377188 57.984511) (xy 153.235783 57.925939) (xy 153.085668 57.89608) (xy 152.932612 57.89608) + (xy 152.782497 57.925939) (xy 152.641092 57.984511) (xy 152.513831 58.069544) (xy 152.405604 58.177771) (xy 152.320571 58.305032) + (xy 152.261999 58.446437) (xy 152.23214 58.596552) (xy 146.113499 58.596552) (xy 146.061714 58.519051) (xy 145.953487 58.410824) + (xy 145.826226 58.325791) (xy 145.684821 58.267219) (xy 145.534706 58.23736) (xy 145.38165 58.23736) (xy 145.231535 58.267219) + (xy 145.09013 58.325791) (xy 144.962869 58.410824) (xy 144.861333 58.51236) (xy 134.122564 58.51236) (xy 134.097921 58.509933) + (xy 134.073278 58.51236) (xy 134.073269 58.51236) (xy 133.999513 58.519624) (xy 133.904886 58.548329) (xy 133.817677 58.594943) + (xy 133.741238 58.657676) (xy 133.725525 58.676822) (xy 132.449058 59.95329) (xy 132.305464 59.95329) (xy 132.155349 59.983149) + (xy 132.013944 60.041721) (xy 131.886683 60.126754) (xy 131.778456 60.234981) (xy 131.693423 60.362242) (xy 131.634851 60.503647) + (xy 131.604992 60.653762) (xy 131.604992 60.806818) (xy 131.634851 60.956933) (xy 131.693423 61.098338) (xy 131.767926 61.20984) + (xy 118.209005 61.20984) (xy 118.107469 61.108304) (xy 117.980208 61.023271) (xy 117.838803 60.964699) (xy 117.688688 60.93484) + (xy 117.535632 60.93484) (xy 117.385517 60.964699) (xy 117.244112 61.023271) (xy 117.116851 61.108304) (xy 117.008624 61.216531) + (xy 116.923591 61.343792) (xy 116.865019 61.485197) (xy 116.83516 61.635312) (xy 116.83516 61.788368) (xy 116.865019 61.938483) + (xy 116.923591 62.079888) (xy 116.97392 62.155211) (xy 115.744012 62.155211) (xy 115.719369 62.152784) (xy 115.694726 62.155211) + (xy 115.694716 62.155211) (xy 115.62096 62.162475) (xy 115.526333 62.19118) (xy 115.496457 62.207149) (xy 115.439123 62.237794) + (xy 115.381833 62.284811) (xy 115.381825 62.284819) (xy 115.362685 62.300527) (xy 115.346977 62.319667) (xy 110.331006 67.33564) + (xy 110.222196 67.33564) (xy 110.252633 67.274674) (xy 110.35049 66.916488) (xy 110.376589 66.546094) (xy 110.329925 66.177725) + (xy 110.212294 65.825538) (xy 110.086777 65.590714) (xy 109.796805 65.4648) (xy 108.662805 66.5988) (xy 108.676948 66.612943) + (xy 108.497343 66.792548) (xy 108.4832 66.778405) (xy 107.3492 67.912405) (xy 107.475114 68.202377) (xy 107.807326 68.368233) + (xy 107.970744 68.412879) (xy 107.13614 68.412879) (xy 107.13614 67.718273) (xy 107.169595 67.7328) (xy 108.303595 66.5988) + (xy 107.169595 65.4648) (xy 107.13614 65.479327) (xy 107.13614 65.285195) (xy 107.3492 65.285195) (xy 108.4832 66.419195) + (xy 109.6172 65.285195) (xy 109.491286 64.995223) (xy 109.159074 64.829367) (xy 108.800888 64.73151) (xy 108.430494 64.705411) + (xy 108.062125 64.752075) (xy 107.709938 64.869706) (xy 107.475114 64.995223) (xy 107.3492 65.285195) (xy 107.13614 65.285195) + (xy 107.13614 58.659831) (xy 118.8769 58.659831) (xy 118.8769 58.901529) (xy 118.924053 59.138583) (xy 119.016547 59.361882) + (xy 119.150827 59.562847) (xy 119.321733 59.733753) (xy 119.522698 59.868033) (xy 119.745997 59.960527) (xy 119.983051 60.00768) + (xy 120.224749 60.00768) (xy 120.461803 59.960527) (xy 120.685102 59.868033) (xy 120.773336 59.809077) (xy 121.795108 59.809077) + (xy 121.872743 60.058152) (xy 122.136783 60.184051) (xy 122.420311 60.256019) (xy 122.712431 60.271291) (xy 123.001919 60.229279) + (xy 123.277647 60.131599) (xy 123.415057 60.058152) (xy 123.492692 59.809077) (xy 124.335108 59.809077) (xy 124.412743 60.058152) + (xy 124.676783 60.184051) (xy 124.960311 60.256019) (xy 125.252431 60.271291) (xy 125.541919 60.229279) (xy 125.817647 60.131599) + (xy 125.955057 60.058152) (xy 126.032692 59.809077) (xy 126.875108 59.809077) (xy 126.952743 60.058152) (xy 127.216783 60.184051) + (xy 127.500311 60.256019) (xy 127.792431 60.271291) (xy 128.081919 60.229279) (xy 128.357647 60.131599) (xy 128.495057 60.058152) + (xy 128.572692 59.809077) (xy 127.7239 58.960285) (xy 126.875108 59.809077) (xy 126.032692 59.809077) (xy 125.1839 58.960285) + (xy 124.335108 59.809077) (xy 123.492692 59.809077) (xy 122.6439 58.960285) (xy 121.795108 59.809077) (xy 120.773336 59.809077) + (xy 120.886067 59.733753) (xy 121.056973 59.562847) (xy 121.191253 59.361882) (xy 121.236052 59.253729) (xy 121.292981 59.414427) + (xy 121.366428 59.551837) (xy 121.615503 59.629472) (xy 122.464295 58.78068) (xy 122.823505 58.78068) (xy 123.672297 59.629472) + (xy 123.9139 59.554166) (xy 124.155503 59.629472) (xy 125.004295 58.78068) (xy 125.363505 58.78068) (xy 126.212297 59.629472) + (xy 126.4539 59.554166) (xy 126.695503 59.629472) (xy 127.544295 58.78068) (xy 127.903505 58.78068) (xy 128.752297 59.629472) + (xy 129.001372 59.551837) (xy 129.043278 59.463951) (xy 129.047159 59.503357) (xy 129.082942 59.621321) (xy 129.141052 59.730036) + (xy 129.219254 59.825326) (xy 129.314544 59.903528) (xy 129.423259 59.961638) (xy 129.541223 59.997421) (xy 129.6639 60.009504) + (xy 130.8639 60.009504) (xy 130.986577 59.997421) (xy 131.104541 59.961638) (xy 131.213256 59.903528) (xy 131.308546 59.825326) + (xy 131.386748 59.730036) (xy 131.444858 59.621321) (xy 131.480641 59.503357) (xy 131.492724 59.38068) (xy 131.492724 58.18068) + (xy 131.480641 58.058003) (xy 131.460286 57.990897) (xy 136.374708 57.990897) (xy 136.452343 58.239972) (xy 136.716383 58.365871) + (xy 136.999911 58.437839) (xy 137.292031 58.453111) (xy 137.581519 58.411099) (xy 137.857247 58.313419) (xy 137.994657 58.239972) + (xy 138.072292 57.990897) (xy 148.325408 57.990897) (xy 148.403043 58.239972) (xy 148.667083 58.365871) (xy 148.950611 58.437839) + (xy 149.242731 58.453111) (xy 149.532219 58.411099) (xy 149.807947 58.313419) (xy 149.945357 58.239972) (xy 150.022992 57.990897) + (xy 149.1742 57.142105) (xy 148.325408 57.990897) (xy 138.072292 57.990897) (xy 137.2235 57.142105) (xy 136.374708 57.990897) + (xy 131.460286 57.990897) (xy 131.444858 57.940039) (xy 131.386748 57.831324) (xy 131.308546 57.736034) (xy 131.213256 57.657832) + (xy 131.104541 57.599722) (xy 130.986577 57.563939) (xy 130.8639 57.551856) (xy 129.6639 57.551856) (xy 129.541223 57.563939) + (xy 129.423259 57.599722) (xy 129.314544 57.657832) (xy 129.219254 57.736034) (xy 129.141052 57.831324) (xy 129.082942 57.940039) + (xy 129.047159 58.058003) (xy 129.044067 58.089399) (xy 129.001372 58.009523) (xy 128.752297 57.931888) (xy 127.903505 58.78068) + (xy 127.544295 58.78068) (xy 126.695503 57.931888) (xy 126.4539 58.007194) (xy 126.212297 57.931888) (xy 125.363505 58.78068) + (xy 125.004295 58.78068) (xy 124.155503 57.931888) (xy 123.9139 58.007194) (xy 123.672297 57.931888) (xy 122.823505 58.78068) + (xy 122.464295 58.78068) (xy 121.615503 57.931888) (xy 121.366428 58.009523) (xy 121.240529 58.273563) (xy 121.233466 58.301389) + (xy 121.191253 58.199478) (xy 121.056973 57.998513) (xy 120.886067 57.827607) (xy 120.685102 57.693327) (xy 120.461803 57.600833) + (xy 120.224749 57.55368) (xy 119.983051 57.55368) (xy 119.745997 57.600833) (xy 119.522698 57.693327) (xy 119.321733 57.827607) + (xy 119.150827 57.998513) (xy 119.016547 58.199478) (xy 118.924053 58.422777) (xy 118.8769 58.659831) (xy 107.13614 58.659831) + (xy 107.13614 57.978197) (xy 112.333608 57.978197) (xy 112.411243 58.227272) (xy 112.675283 58.353171) (xy 112.958811 58.425139) + (xy 113.250931 58.440411) (xy 113.540419 58.398399) (xy 113.816147 58.300719) (xy 113.953557 58.227272) (xy 114.031192 57.978197) + (xy 113.1824 57.129405) (xy 112.333608 57.978197) (xy 107.13614 57.978197) (xy 107.13614 57.018331) (xy 111.691789 57.018331) + (xy 111.733801 57.307819) (xy 111.831481 57.583547) (xy 111.904928 57.720957) (xy 112.154003 57.798592) (xy 113.002795 56.9498) + (xy 113.362005 56.9498) (xy 114.210797 57.798592) (xy 114.459872 57.720957) (xy 114.585771 57.456917) (xy 114.657739 57.173389) + (xy 114.673011 56.881269) (xy 114.630999 56.591781) (xy 114.533319 56.316053) (xy 114.459872 56.178643) (xy 114.271187 56.119831) + (xy 118.8769 56.119831) (xy 118.8769 56.361529) (xy 118.924053 56.598583) (xy 119.016547 56.821882) (xy 119.150827 57.022847) + (xy 119.321733 57.193753) (xy 119.522698 57.328033) (xy 119.745997 57.420527) (xy 119.983051 57.46768) (xy 120.224749 57.46768) + (xy 120.461803 57.420527) (xy 120.685102 57.328033) (xy 120.773336 57.269077) (xy 121.795108 57.269077) (xy 121.870414 57.51068) + (xy 121.795108 57.752283) (xy 122.6439 58.601075) (xy 123.492692 57.752283) (xy 123.417386 57.51068) (xy 123.492692 57.269077) + (xy 124.335108 57.269077) (xy 124.410414 57.51068) (xy 124.335108 57.752283) (xy 125.1839 58.601075) (xy 126.032692 57.752283) + (xy 125.957386 57.51068) (xy 126.032692 57.269077) (xy 126.875108 57.269077) (xy 126.950414 57.51068) (xy 126.875108 57.752283) + (xy 127.7239 58.601075) (xy 128.572692 57.752283) (xy 128.497386 57.51068) (xy 128.572692 57.269077) (xy 127.7239 56.420285) + (xy 126.875108 57.269077) (xy 126.032692 57.269077) (xy 125.1839 56.420285) (xy 124.335108 57.269077) (xy 123.492692 57.269077) + (xy 122.6439 56.420285) (xy 121.795108 57.269077) (xy 120.773336 57.269077) (xy 120.886067 57.193753) (xy 121.056973 57.022847) + (xy 121.191253 56.821882) (xy 121.236052 56.713729) (xy 121.292981 56.874427) (xy 121.366428 57.011837) (xy 121.615503 57.089472) + (xy 122.464295 56.24068) (xy 122.823505 56.24068) (xy 123.672297 57.089472) (xy 123.9139 57.014166) (xy 124.155503 57.089472) + (xy 125.004295 56.24068) (xy 125.363505 56.24068) (xy 126.212297 57.089472) (xy 126.4539 57.014166) (xy 126.695503 57.089472) + (xy 127.544295 56.24068) (xy 127.903505 56.24068) (xy 128.752297 57.089472) (xy 129.001372 57.011837) (xy 129.127271 56.747797) + (xy 129.134334 56.719971) (xy 129.176547 56.821882) (xy 129.310827 57.022847) (xy 129.481733 57.193753) (xy 129.682698 57.328033) + (xy 129.905997 57.420527) (xy 130.143051 57.46768) (xy 130.384749 57.46768) (xy 130.621803 57.420527) (xy 130.845102 57.328033) + (xy 131.046067 57.193753) (xy 131.208789 57.031031) (xy 135.732889 57.031031) (xy 135.774901 57.320519) (xy 135.872581 57.596247) + (xy 135.946028 57.733657) (xy 136.195103 57.811292) (xy 137.043895 56.9625) (xy 137.403105 56.9625) (xy 138.251897 57.811292) + (xy 138.500972 57.733657) (xy 138.626871 57.469617) (xy 138.698839 57.186089) (xy 138.706945 57.031031) (xy 147.683589 57.031031) + (xy 147.725601 57.320519) (xy 147.823281 57.596247) (xy 147.896728 57.733657) (xy 148.145803 57.811292) (xy 148.994595 56.9625) + (xy 149.353805 56.9625) (xy 150.202597 57.811292) (xy 150.451672 57.733657) (xy 150.577571 57.469617) (xy 150.649539 57.186089) + (xy 150.657645 57.031031) (xy 159.659689 57.031031) (xy 159.701701 57.320519) (xy 159.799381 57.596247) (xy 159.872828 57.733657) + (xy 160.121903 57.811292) (xy 160.970695 56.9625) (xy 161.329905 56.9625) (xy 162.178697 57.811292) (xy 162.427772 57.733657) + (xy 162.553671 57.469617) (xy 162.625639 57.186089) (xy 162.633745 57.031031) (xy 171.635789 57.031031) (xy 171.677801 57.320519) + (xy 171.775481 57.596247) (xy 171.848928 57.733657) (xy 172.098003 57.811292) (xy 172.946795 56.9625) (xy 173.306005 56.9625) + (xy 174.154797 57.811292) (xy 174.403872 57.733657) (xy 174.529771 57.469617) (xy 174.601739 57.186089) (xy 174.610509 57.018331) + (xy 183.611889 57.018331) (xy 183.653901 57.307819) (xy 183.751581 57.583547) (xy 183.825028 57.720957) (xy 184.074103 57.798592) + (xy 184.922895 56.9498) (xy 185.282105 56.9498) (xy 186.130897 57.798592) (xy 186.379972 57.720957) (xy 186.505871 57.456917) + (xy 186.577839 57.173389) (xy 186.586609 57.005631) (xy 195.613389 57.005631) (xy 195.655401 57.295119) (xy 195.753081 57.570847) + (xy 195.826528 57.708257) (xy 196.075603 57.785892) (xy 196.924395 56.9371) (xy 197.283605 56.9371) (xy 198.132397 57.785892) + (xy 198.381472 57.708257) (xy 198.507371 57.444217) (xy 198.579339 57.160689) (xy 198.594611 56.868569) (xy 198.552599 56.579081) + (xy 198.454919 56.303353) (xy 198.381472 56.165943) (xy 198.132397 56.088308) (xy 197.283605 56.9371) (xy 196.924395 56.9371) + (xy 196.075603 56.088308) (xy 195.826528 56.165943) (xy 195.700629 56.429983) (xy 195.628661 56.713511) (xy 195.613389 57.005631) + (xy 186.586609 57.005631) (xy 186.593111 56.881269) (xy 186.551099 56.591781) (xy 186.453419 56.316053) (xy 186.379972 56.178643) + (xy 186.130897 56.101008) (xy 185.282105 56.9498) (xy 184.922895 56.9498) (xy 184.074103 56.101008) (xy 183.825028 56.178643) + (xy 183.699129 56.442683) (xy 183.627161 56.726211) (xy 183.611889 57.018331) (xy 174.610509 57.018331) (xy 174.617011 56.893969) + (xy 174.574999 56.604481) (xy 174.477319 56.328753) (xy 174.403872 56.191343) (xy 174.154797 56.113708) (xy 173.306005 56.9625) + (xy 172.946795 56.9625) (xy 172.098003 56.113708) (xy 171.848928 56.191343) (xy 171.723029 56.455383) (xy 171.651061 56.738911) + (xy 171.635789 57.031031) (xy 162.633745 57.031031) (xy 162.640911 56.893969) (xy 162.598899 56.604481) (xy 162.501219 56.328753) + (xy 162.427772 56.191343) (xy 162.178697 56.113708) (xy 161.329905 56.9625) (xy 160.970695 56.9625) (xy 160.121903 56.113708) + (xy 159.872828 56.191343) (xy 159.746929 56.455383) (xy 159.674961 56.738911) (xy 159.659689 57.031031) (xy 150.657645 57.031031) + (xy 150.664811 56.893969) (xy 150.622799 56.604481) (xy 150.525119 56.328753) (xy 150.451672 56.191343) (xy 150.202597 56.113708) + (xy 149.353805 56.9625) (xy 148.994595 56.9625) (xy 148.145803 56.113708) (xy 147.896728 56.191343) (xy 147.770829 56.455383) + (xy 147.698861 56.738911) (xy 147.683589 57.031031) (xy 138.706945 57.031031) (xy 138.714111 56.893969) (xy 138.672099 56.604481) + (xy 138.574419 56.328753) (xy 138.500972 56.191343) (xy 138.251897 56.113708) (xy 137.403105 56.9625) (xy 137.043895 56.9625) + (xy 136.195103 56.113708) (xy 135.946028 56.191343) (xy 135.820129 56.455383) (xy 135.748161 56.738911) (xy 135.732889 57.031031) + (xy 131.208789 57.031031) (xy 131.216973 57.022847) (xy 131.351253 56.821882) (xy 131.443747 56.598583) (xy 131.4909 56.361529) + (xy 131.4909 56.119831) (xy 131.453957 55.934103) (xy 136.374708 55.934103) (xy 137.2235 56.782895) (xy 138.072292 55.934103) + (xy 148.325408 55.934103) (xy 149.1742 56.782895) (xy 150.022992 55.934103) (xy 160.301508 55.934103) (xy 161.1503 56.782895) + (xy 161.999092 55.934103) (xy 172.277608 55.934103) (xy 173.1264 56.782895) (xy 173.975192 55.934103) (xy 173.971234 55.921403) + (xy 184.253708 55.921403) (xy 185.1025 56.770195) (xy 185.951292 55.921403) (xy 185.947334 55.908703) (xy 196.255208 55.908703) + (xy 197.104 56.757495) (xy 197.952792 55.908703) (xy 197.875157 55.659628) (xy 197.611117 55.533729) (xy 197.327589 55.461761) + (xy 197.035469 55.446489) (xy 196.745981 55.488501) (xy 196.470253 55.586181) (xy 196.332843 55.659628) (xy 196.255208 55.908703) + (xy 185.947334 55.908703) (xy 185.873657 55.672328) (xy 185.609617 55.546429) (xy 185.326089 55.474461) (xy 185.033969 55.459189) + (xy 184.744481 55.501201) (xy 184.468753 55.598881) (xy 184.331343 55.672328) (xy 184.253708 55.921403) (xy 173.971234 55.921403) + (xy 173.897557 55.685028) (xy 173.633517 55.559129) (xy 173.349989 55.487161) (xy 173.057869 55.471889) (xy 172.768381 55.513901) + (xy 172.492653 55.611581) (xy 172.355243 55.685028) (xy 172.277608 55.934103) (xy 161.999092 55.934103) (xy 161.921457 55.685028) + (xy 161.657417 55.559129) (xy 161.373889 55.487161) (xy 161.081769 55.471889) (xy 160.792281 55.513901) (xy 160.516553 55.611581) + (xy 160.379143 55.685028) (xy 160.301508 55.934103) (xy 150.022992 55.934103) (xy 149.945357 55.685028) (xy 149.681317 55.559129) + (xy 149.397789 55.487161) (xy 149.105669 55.471889) (xy 148.816181 55.513901) (xy 148.540453 55.611581) (xy 148.403043 55.685028) + (xy 148.325408 55.934103) (xy 138.072292 55.934103) (xy 137.994657 55.685028) (xy 137.730617 55.559129) (xy 137.447089 55.487161) + (xy 137.154969 55.471889) (xy 136.865481 55.513901) (xy 136.589753 55.611581) (xy 136.452343 55.685028) (xy 136.374708 55.934103) + (xy 131.453957 55.934103) (xy 131.443747 55.882777) (xy 131.351253 55.659478) (xy 131.216973 55.458513) (xy 131.046067 55.287607) + (xy 130.845102 55.153327) (xy 130.621803 55.060833) (xy 130.384749 55.01368) (xy 130.143051 55.01368) (xy 129.905997 55.060833) + (xy 129.682698 55.153327) (xy 129.481733 55.287607) (xy 129.310827 55.458513) (xy 129.176547 55.659478) (xy 129.131748 55.767631) + (xy 129.074819 55.606933) (xy 129.001372 55.469523) (xy 128.752297 55.391888) (xy 127.903505 56.24068) (xy 127.544295 56.24068) + (xy 126.695503 55.391888) (xy 126.4539 55.467194) (xy 126.212297 55.391888) (xy 125.363505 56.24068) (xy 125.004295 56.24068) + (xy 124.155503 55.391888) (xy 123.9139 55.467194) (xy 123.672297 55.391888) (xy 122.823505 56.24068) (xy 122.464295 56.24068) + (xy 121.615503 55.391888) (xy 121.366428 55.469523) (xy 121.240529 55.733563) (xy 121.233466 55.761389) (xy 121.191253 55.659478) + (xy 121.056973 55.458513) (xy 120.886067 55.287607) (xy 120.773337 55.212283) (xy 121.795108 55.212283) (xy 122.6439 56.061075) + (xy 123.492692 55.212283) (xy 124.335108 55.212283) (xy 125.1839 56.061075) (xy 126.032692 55.212283) (xy 126.875108 55.212283) + (xy 127.7239 56.061075) (xy 128.572692 55.212283) (xy 128.495057 54.963208) (xy 128.343404 54.890897) (xy 136.374708 54.890897) + (xy 136.452343 55.139972) (xy 136.716383 55.265871) (xy 136.999911 55.337839) (xy 137.292031 55.353111) (xy 137.581519 55.311099) + (xy 137.857247 55.213419) (xy 137.994657 55.139972) (xy 138.072292 54.890897) (xy 137.2235 54.042105) (xy 136.374708 54.890897) + (xy 128.343404 54.890897) (xy 128.231017 54.837309) (xy 127.947489 54.765341) (xy 127.655369 54.750069) (xy 127.365881 54.792081) + (xy 127.090153 54.889761) (xy 126.952743 54.963208) (xy 126.875108 55.212283) (xy 126.032692 55.212283) (xy 125.955057 54.963208) + (xy 125.691017 54.837309) (xy 125.407489 54.765341) (xy 125.115369 54.750069) (xy 124.825881 54.792081) (xy 124.550153 54.889761) + (xy 124.412743 54.963208) (xy 124.335108 55.212283) (xy 123.492692 55.212283) (xy 123.415057 54.963208) (xy 123.151017 54.837309) + (xy 122.867489 54.765341) (xy 122.575369 54.750069) (xy 122.285881 54.792081) (xy 122.010153 54.889761) (xy 121.872743 54.963208) + (xy 121.795108 55.212283) (xy 120.773337 55.212283) (xy 120.685102 55.153327) (xy 120.461803 55.060833) (xy 120.224749 55.01368) + (xy 119.983051 55.01368) (xy 119.745997 55.060833) (xy 119.522698 55.153327) (xy 119.321733 55.287607) (xy 119.150827 55.458513) + (xy 119.016547 55.659478) (xy 118.924053 55.882777) (xy 118.8769 56.119831) (xy 114.271187 56.119831) (xy 114.210797 56.101008) + (xy 113.362005 56.9498) (xy 113.002795 56.9498) (xy 112.154003 56.101008) (xy 111.904928 56.178643) (xy 111.779029 56.442683) + (xy 111.707061 56.726211) (xy 111.691789 57.018331) (xy 107.13614 57.018331) (xy 107.13614 55.921403) (xy 112.333608 55.921403) + (xy 113.1824 56.770195) (xy 114.031192 55.921403) (xy 113.953557 55.672328) (xy 113.689517 55.546429) (xy 113.405989 55.474461) + (xy 113.113869 55.459189) (xy 112.824381 55.501201) (xy 112.548653 55.598881) (xy 112.411243 55.672328) (xy 112.333608 55.921403) + (xy 107.13614 55.921403) (xy 107.13614 54.878197) (xy 112.333608 54.878197) (xy 112.411243 55.127272) (xy 112.675283 55.253171) + (xy 112.958811 55.325139) (xy 113.250931 55.340411) (xy 113.540419 55.298399) (xy 113.816147 55.200719) (xy 113.953557 55.127272) + (xy 114.031192 54.878197) (xy 113.1824 54.029405) (xy 112.333608 54.878197) (xy 107.13614 54.878197) (xy 107.13614 53.918331) + (xy 111.691789 53.918331) (xy 111.733801 54.207819) (xy 111.831481 54.483547) (xy 111.904928 54.620957) (xy 112.154003 54.698592) + (xy 113.002795 53.8498) (xy 113.362005 53.8498) (xy 114.210797 54.698592) (xy 114.459872 54.620957) (xy 114.585771 54.356917) + (xy 114.657739 54.073389) (xy 114.673011 53.781269) (xy 114.630999 53.491781) (xy 114.533319 53.216053) (xy 114.459872 53.078643) + (xy 114.210797 53.001008) (xy 113.362005 53.8498) (xy 113.002795 53.8498) (xy 112.154003 53.001008) (xy 111.904928 53.078643) + (xy 111.779029 53.342683) (xy 111.707061 53.626211) (xy 111.691789 53.918331) (xy 107.13614 53.918331) (xy 107.13614 52.821403) + (xy 112.333608 52.821403) (xy 113.1824 53.670195) (xy 114.031192 52.821403) (xy 113.953557 52.572328) (xy 113.689517 52.446429) + (xy 113.405989 52.374461) (xy 113.113869 52.359189) (xy 112.824381 52.401201) (xy 112.548653 52.498881) (xy 112.411243 52.572328) + (xy 112.333608 52.821403) (xy 107.13614 52.821403) (xy 107.13614 50.329253) (xy 111.7554 50.329253) (xy 111.7554 50.610347) + (xy 111.810238 50.886041) (xy 111.917809 51.145738) (xy 112.073976 51.37946) (xy 112.27274 51.578224) (xy 112.506462 51.734391) + (xy 112.766159 51.841962) (xy 113.041853 51.8968) (xy 113.322947 51.8968) (xy 113.598641 51.841962) (xy 113.858338 51.734391) + (xy 114.09206 51.578224) (xy 114.210187 51.460097) (xy 117.893208 51.460097) (xy 117.970843 51.709172) (xy 118.234883 51.835071) + (xy 118.518411 51.907039) (xy 118.810531 51.922311) (xy 119.100019 51.880299) (xy 119.375747 51.782619) (xy 119.513157 51.709172) + (xy 119.590792 51.460097) (xy 118.742 50.611305) (xy 117.893208 51.460097) (xy 114.210187 51.460097) (xy 114.290824 51.37946) + (xy 114.446991 51.145738) (xy 114.554562 50.886041) (xy 114.6094 50.610347) (xy 114.6094 50.500231) (xy 117.251389 50.500231) + (xy 117.293401 50.789719) (xy 117.391081 51.065447) (xy 117.464528 51.202857) (xy 117.713603 51.280492) (xy 118.562395 50.4317) + (xy 118.921605 50.4317) (xy 119.770397 51.280492) (xy 120.019472 51.202857) (xy 120.145371 50.938817) (xy 120.217339 50.655289) + (xy 120.232611 50.363169) (xy 120.225019 50.310851) (xy 120.615 50.310851) (xy 120.615 50.552549) (xy 120.662153 50.789603) + (xy 120.754647 51.012902) (xy 120.888927 51.213867) (xy 121.059833 51.384773) (xy 121.260798 51.519053) (xy 121.484097 51.611547) + (xy 121.721151 51.6587) (xy 121.962849 51.6587) (xy 122.145881 51.622293) (xy 123.357655 52.834067) (xy 123.377288 52.85799) + (xy 123.472761 52.936342) (xy 123.581686 52.994564) (xy 123.699876 53.030416) (xy 123.822789 53.042522) (xy 123.853583 53.039489) + (xy 136.11239 53.039489) (xy 135.946028 53.091343) (xy 135.820129 53.355383) (xy 135.748161 53.638911) (xy 135.732889 53.931031) + (xy 135.774901 54.220519) (xy 135.872581 54.496247) (xy 135.946028 54.633657) (xy 136.195103 54.711292) (xy 137.043895 53.8625) + (xy 137.029753 53.848358) (xy 137.209358 53.668753) (xy 137.2235 53.682895) (xy 137.237643 53.668753) (xy 137.417248 53.848358) + (xy 137.403105 53.8625) (xy 138.251897 54.711292) (xy 138.500972 54.633657) (xy 138.626871 54.369617) (xy 138.698839 54.086089) + (xy 138.714111 53.793969) (xy 138.672099 53.504481) (xy 138.574419 53.228753) (xy 138.500972 53.091343) (xy 138.33461 53.039489) + (xy 147.464478 53.039489) (xy 147.983607 53.558619) (xy 147.9472 53.741651) (xy 147.9472 53.983349) (xy 147.994353 54.220403) + (xy 148.086847 54.443702) (xy 148.221127 54.644667) (xy 148.392033 54.815573) (xy 148.592998 54.949853) (xy 148.816297 55.042347) + (xy 149.053351 55.0895) (xy 149.295049 55.0895) (xy 149.532103 55.042347) (xy 149.755402 54.949853) (xy 149.843636 54.890897) + (xy 160.301508 54.890897) (xy 160.379143 55.139972) (xy 160.643183 55.265871) (xy 160.926711 55.337839) (xy 161.218831 55.353111) + (xy 161.508319 55.311099) (xy 161.784047 55.213419) (xy 161.921457 55.139972) (xy 161.999092 54.890897) (xy 161.1503 54.042105) + (xy 160.301508 54.890897) (xy 149.843636 54.890897) (xy 149.956367 54.815573) (xy 150.127273 54.644667) (xy 150.261553 54.443702) + (xy 150.354047 54.220403) (xy 150.4012 53.983349) (xy 150.4012 53.931031) (xy 159.659689 53.931031) (xy 159.701701 54.220519) + (xy 159.799381 54.496247) (xy 159.872828 54.633657) (xy 160.121903 54.711292) (xy 160.970695 53.8625) (xy 161.329905 53.8625) + (xy 162.178697 54.711292) (xy 162.427772 54.633657) (xy 162.553671 54.369617) (xy 162.625639 54.086089) (xy 162.640911 53.793969) + (xy 162.598899 53.504481) (xy 162.501219 53.228753) (xy 162.427772 53.091343) (xy 162.178697 53.013708) (xy 161.329905 53.8625) + (xy 160.970695 53.8625) (xy 160.121903 53.013708) (xy 159.872828 53.091343) (xy 159.746929 53.355383) (xy 159.674961 53.638911) + (xy 159.659689 53.931031) (xy 150.4012 53.931031) (xy 150.4012 53.741651) (xy 150.364793 53.558619) (xy 151.183923 52.739489) + (xy 160.330999 52.739489) (xy 160.301508 52.834103) (xy 161.1503 53.682895) (xy 161.999092 52.834103) (xy 161.969601 52.739489) + (xy 171.116678 52.739489) (xy 171.935807 53.558619) (xy 171.8994 53.741651) (xy 171.8994 53.983349) (xy 171.946553 54.220403) + (xy 172.039047 54.443702) (xy 172.173327 54.644667) (xy 172.344233 54.815573) (xy 172.545198 54.949853) (xy 172.768497 55.042347) + (xy 173.005551 55.0895) (xy 173.247249 55.0895) (xy 173.484303 55.042347) (xy 173.707602 54.949853) (xy 173.814843 54.878197) + (xy 184.253708 54.878197) (xy 184.331343 55.127272) (xy 184.595383 55.253171) (xy 184.878911 55.325139) (xy 185.171031 55.340411) + (xy 185.460519 55.298399) (xy 185.736247 55.200719) (xy 185.873657 55.127272) (xy 185.951292 54.878197) (xy 185.1025 54.029405) + (xy 184.253708 54.878197) (xy 173.814843 54.878197) (xy 173.908567 54.815573) (xy 174.079473 54.644667) (xy 174.213753 54.443702) + (xy 174.306247 54.220403) (xy 174.3534 53.983349) (xy 174.3534 53.918331) (xy 183.611889 53.918331) (xy 183.653901 54.207819) + (xy 183.751581 54.483547) (xy 183.825028 54.620957) (xy 184.074103 54.698592) (xy 184.922895 53.8498) (xy 185.282105 53.8498) + (xy 186.130897 54.698592) (xy 186.379972 54.620957) (xy 186.505871 54.356917) (xy 186.577839 54.073389) (xy 186.593111 53.781269) + (xy 186.551099 53.491781) (xy 186.453419 53.216053) (xy 186.379972 53.078643) (xy 186.130897 53.001008) (xy 185.282105 53.8498) + (xy 184.922895 53.8498) (xy 184.074103 53.001008) (xy 183.825028 53.078643) (xy 183.699129 53.342683) (xy 183.627161 53.626211) + (xy 183.611889 53.918331) (xy 174.3534 53.918331) (xy 174.3534 53.741651) (xy 174.316993 53.558619) (xy 175.148823 52.726789) + (xy 184.283199 52.726789) (xy 184.253708 52.821403) (xy 185.1025 53.670195) (xy 185.951292 52.821403) (xy 185.921801 52.726789) + (xy 195.106978 52.726789) (xy 195.913407 53.533219) (xy 195.877 53.716251) (xy 195.877 53.957949) (xy 195.924153 54.195003) + (xy 196.016647 54.418302) (xy 196.150927 54.619267) (xy 196.321833 54.790173) (xy 196.522798 54.924453) (xy 196.746097 55.016947) + (xy 196.983151 55.0641) (xy 197.224849 55.0641) (xy 197.461903 55.016947) (xy 197.685202 54.924453) (xy 197.886167 54.790173) + (xy 198.057073 54.619267) (xy 198.191353 54.418302) (xy 198.283847 54.195003) (xy 198.331 53.957949) (xy 198.331 53.716251) + (xy 198.283847 53.479197) (xy 198.191353 53.255898) (xy 198.057073 53.054933) (xy 197.886167 52.884027) (xy 197.685202 52.749747) + (xy 197.461903 52.657253) (xy 197.224849 52.6101) (xy 196.983151 52.6101) (xy 196.800119 52.646507) (xy 195.831827 51.678216) + (xy 195.81219 51.654288) (xy 195.716717 51.575936) (xy 195.607792 51.517714) (xy 195.489602 51.481862) (xy 195.397483 51.472789) + (xy 195.366689 51.469756) (xy 195.335895 51.472789) (xy 186.117595 51.472789) (xy 186.210924 51.37946) (xy 186.367091 51.145738) + (xy 186.474662 50.886041) (xy 186.5295 50.610347) (xy 186.5295 50.329253) (xy 186.526974 50.316553) (xy 195.677 50.316553) + (xy 195.677 50.597647) (xy 195.731838 50.873341) (xy 195.839409 51.133038) (xy 195.995576 51.36676) (xy 196.19434 51.565524) + (xy 196.428062 51.721691) (xy 196.687759 51.829262) (xy 196.963453 51.8841) (xy 197.244547 51.8841) (xy 197.520241 51.829262) + (xy 197.779938 51.721691) (xy 198.01366 51.565524) (xy 198.212424 51.36676) (xy 198.368591 51.133038) (xy 198.476162 50.873341) + (xy 198.531 50.597647) (xy 198.531 50.316553) (xy 198.476162 50.040859) (xy 198.368591 49.781162) (xy 198.212424 49.54744) + (xy 198.01366 49.348676) (xy 197.779938 49.192509) (xy 197.520241 49.084938) (xy 197.244547 49.0301) (xy 196.963453 49.0301) + (xy 196.687759 49.084938) (xy 196.428062 49.192509) (xy 196.19434 49.348676) (xy 195.995576 49.54744) (xy 195.839409 49.781162) + (xy 195.731838 50.040859) (xy 195.677 50.316553) (xy 186.526974 50.316553) (xy 186.474662 50.053559) (xy 186.367091 49.793862) + (xy 186.210924 49.56014) (xy 186.01216 49.361376) (xy 185.778438 49.205209) (xy 185.518741 49.097638) (xy 185.243047 49.0428) + (xy 184.961953 49.0428) (xy 184.686259 49.097638) (xy 184.426562 49.205209) (xy 184.19284 49.361376) (xy 183.994076 49.56014) + (xy 183.837909 49.793862) (xy 183.730338 50.053559) (xy 183.6755 50.329253) (xy 183.6755 50.610347) (xy 183.730338 50.886041) + (xy 183.837909 51.145738) (xy 183.994076 51.37946) (xy 184.087405 51.472789) (xy 174.919905 51.472789) (xy 174.889111 51.469756) + (xy 174.858317 51.472789) (xy 174.766198 51.481862) (xy 174.648008 51.517714) (xy 174.539083 51.575936) (xy 174.44361 51.654288) + (xy 174.423977 51.678211) (xy 173.430281 52.671907) (xy 173.247249 52.6355) (xy 173.005551 52.6355) (xy 172.822519 52.671907) + (xy 171.841527 51.690916) (xy 171.82189 51.666988) (xy 171.726417 51.588636) (xy 171.617492 51.530414) (xy 171.499302 51.494562) + (xy 171.407183 51.485489) (xy 171.376389 51.482456) (xy 171.345595 51.485489) (xy 162.165395 51.485489) (xy 162.258724 51.39216) + (xy 162.414891 51.158438) (xy 162.522462 50.898741) (xy 162.5773 50.623047) (xy 162.5773 50.341953) (xy 171.6994 50.341953) + (xy 171.6994 50.623047) (xy 171.754238 50.898741) (xy 171.861809 51.158438) (xy 172.017976 51.39216) (xy 172.21674 51.590924) + (xy 172.450462 51.747091) (xy 172.710159 51.854662) (xy 172.985853 51.9095) (xy 173.266947 51.9095) (xy 173.542641 51.854662) + (xy 173.802338 51.747091) (xy 174.03606 51.590924) (xy 174.234824 51.39216) (xy 174.390991 51.158438) (xy 174.498562 50.898741) + (xy 174.5534 50.623047) (xy 174.5534 50.341953) (xy 174.498562 50.066259) (xy 174.390991 49.806562) (xy 174.234824 49.57284) + (xy 174.03606 49.374076) (xy 173.802338 49.217909) (xy 173.542641 49.110338) (xy 173.266947 49.0555) (xy 172.985853 49.0555) + (xy 172.710159 49.110338) (xy 172.450462 49.217909) (xy 172.21674 49.374076) (xy 172.017976 49.57284) (xy 171.861809 49.806562) + (xy 171.754238 50.066259) (xy 171.6994 50.341953) (xy 162.5773 50.341953) (xy 162.522462 50.066259) (xy 162.414891 49.806562) + (xy 162.258724 49.57284) (xy 162.05996 49.374076) (xy 161.826238 49.217909) (xy 161.566541 49.110338) (xy 161.290847 49.0555) + (xy 161.009753 49.0555) (xy 160.734059 49.110338) (xy 160.474362 49.217909) (xy 160.24064 49.374076) (xy 160.041876 49.57284) + (xy 159.885709 49.806562) (xy 159.778138 50.066259) (xy 159.7233 50.341953) (xy 159.7233 50.623047) (xy 159.778138 50.898741) + (xy 159.885709 51.158438) (xy 160.041876 51.39216) (xy 160.135205 51.485489) (xy 150.955002 51.485489) (xy 150.92421 51.482456) + (xy 150.893418 51.485489) (xy 150.893417 51.485489) (xy 150.801298 51.494562) (xy 150.683108 51.530414) (xy 150.574183 51.588636) + (xy 150.47871 51.666988) (xy 150.459077 51.690911) (xy 149.478081 52.671907) (xy 149.295049 52.6355) (xy 149.053351 52.6355) + (xy 148.870319 52.671907) (xy 148.189327 51.990916) (xy 148.16969 51.966988) (xy 148.074217 51.888636) (xy 147.965292 51.830414) + (xy 147.847102 51.794562) (xy 147.754983 51.785489) (xy 147.724189 51.782456) (xy 147.693395 51.785489) (xy 137.806738 51.785489) + (xy 137.899438 51.747091) (xy 138.13316 51.590924) (xy 138.331924 51.39216) (xy 138.488091 51.158438) (xy 138.595662 50.898741) + (xy 138.6505 50.623047) (xy 138.6505 50.341953) (xy 147.7472 50.341953) (xy 147.7472 50.623047) (xy 147.802038 50.898741) + (xy 147.909609 51.158438) (xy 148.065776 51.39216) (xy 148.26454 51.590924) (xy 148.498262 51.747091) (xy 148.757959 51.854662) + (xy 149.033653 51.9095) (xy 149.314747 51.9095) (xy 149.590441 51.854662) (xy 149.850138 51.747091) (xy 150.08386 51.590924) + (xy 150.282624 51.39216) (xy 150.438791 51.158438) (xy 150.546362 50.898741) (xy 150.6012 50.623047) (xy 150.6012 50.341953) + (xy 150.546362 50.066259) (xy 150.438791 49.806562) (xy 150.282624 49.57284) (xy 150.08386 49.374076) (xy 149.850138 49.217909) + (xy 149.590441 49.110338) (xy 149.314747 49.0555) (xy 149.033653 49.0555) (xy 148.757959 49.110338) (xy 148.498262 49.217909) + (xy 148.26454 49.374076) (xy 148.065776 49.57284) (xy 147.909609 49.806562) (xy 147.802038 50.066259) (xy 147.7472 50.341953) + (xy 138.6505 50.341953) (xy 138.595662 50.066259) (xy 138.488091 49.806562) (xy 138.331924 49.57284) (xy 138.13316 49.374076) + (xy 137.899438 49.217909) (xy 137.639741 49.110338) (xy 137.364047 49.0555) (xy 137.082953 49.0555) (xy 136.807259 49.110338) + (xy 136.547562 49.217909) (xy 136.31384 49.374076) (xy 136.115076 49.57284) (xy 135.958909 49.806562) (xy 135.851338 50.066259) + (xy 135.7965 50.341953) (xy 135.7965 50.623047) (xy 135.851338 50.898741) (xy 135.958909 51.158438) (xy 136.115076 51.39216) + (xy 136.31384 51.590924) (xy 136.547562 51.747091) (xy 136.640262 51.785489) (xy 125.682597 51.785489) (xy 125.897938 51.696291) + (xy 126.13166 51.540124) (xy 126.330424 51.34136) (xy 126.486591 51.107638) (xy 126.594162 50.847941) (xy 126.649 50.572247) + (xy 126.649 50.310851) (xy 128.915 50.310851) (xy 128.915 50.552549) (xy 128.962153 50.789603) (xy 129.054647 51.012902) + (xy 129.188927 51.213867) (xy 129.359833 51.384773) (xy 129.560798 51.519053) (xy 129.784097 51.611547) (xy 130.021151 51.6587) + (xy 130.262849 51.6587) (xy 130.499903 51.611547) (xy 130.723202 51.519053) (xy 130.924167 51.384773) (xy 131.095073 51.213867) + (xy 131.229353 51.012902) (xy 131.321847 50.789603) (xy 131.369 50.552549) (xy 131.369 50.310851) (xy 131.321847 50.073797) + (xy 131.229353 49.850498) (xy 131.095073 49.649533) (xy 130.924167 49.478627) (xy 130.723202 49.344347) (xy 130.499903 49.251853) + (xy 130.262849 49.2047) (xy 130.021151 49.2047) (xy 129.784097 49.251853) (xy 129.560798 49.344347) (xy 129.359833 49.478627) + (xy 129.188927 49.649533) (xy 129.054647 49.850498) (xy 128.962153 50.073797) (xy 128.915 50.310851) (xy 126.649 50.310851) + (xy 126.649 50.291153) (xy 126.594162 50.015459) (xy 126.486591 49.755762) (xy 126.330424 49.52204) (xy 126.13166 49.323276) + (xy 125.897938 49.167109) (xy 125.638241 49.059538) (xy 125.362547 49.0047) (xy 125.081453 49.0047) (xy 124.805759 49.059538) + (xy 124.546062 49.167109) (xy 124.31234 49.323276) (xy 124.113576 49.52204) (xy 123.957409 49.755762) (xy 123.849838 50.015459) + (xy 123.795 50.291153) (xy 123.795 50.572247) (xy 123.849838 50.847941) (xy 123.957409 51.107638) (xy 124.113576 51.34136) + (xy 124.31234 51.540124) (xy 124.546062 51.696291) (xy 124.761403 51.785489) (xy 124.082501 51.785489) (xy 123.032593 50.735581) + (xy 123.069 50.552549) (xy 123.069 50.310851) (xy 123.021847 50.073797) (xy 122.929353 49.850498) (xy 122.795073 49.649533) + (xy 122.624167 49.478627) (xy 122.423202 49.344347) (xy 122.199903 49.251853) (xy 121.962849 49.2047) (xy 121.721151 49.2047) + (xy 121.484097 49.251853) (xy 121.260798 49.344347) (xy 121.059833 49.478627) (xy 120.888927 49.649533) (xy 120.754647 49.850498) + (xy 120.662153 50.073797) (xy 120.615 50.310851) (xy 120.225019 50.310851) (xy 120.190599 50.073681) (xy 120.092919 49.797953) + (xy 120.019472 49.660543) (xy 119.770397 49.582908) (xy 118.921605 50.4317) (xy 118.562395 50.4317) (xy 117.713603 49.582908) + (xy 117.464528 49.660543) (xy 117.338629 49.924583) (xy 117.266661 50.208111) (xy 117.251389 50.500231) (xy 114.6094 50.500231) + (xy 114.6094 50.329253) (xy 114.554562 50.053559) (xy 114.446991 49.793862) (xy 114.290824 49.56014) (xy 114.133987 49.403303) + (xy 117.893208 49.403303) (xy 118.742 50.252095) (xy 119.590792 49.403303) (xy 119.513157 49.154228) (xy 119.249117 49.028329) + (xy 118.965589 48.956361) (xy 118.673469 48.941089) (xy 118.383981 48.983101) (xy 118.108253 49.080781) (xy 117.970843 49.154228) + (xy 117.893208 49.403303) (xy 114.133987 49.403303) (xy 114.09206 49.361376) (xy 113.858338 49.205209) (xy 113.598641 49.097638) + (xy 113.322947 49.0428) (xy 113.041853 49.0428) (xy 112.766159 49.097638) (xy 112.506462 49.205209) (xy 112.27274 49.361376) + (xy 112.073976 49.56014) (xy 111.917809 49.793862) (xy 111.810238 50.053559) (xy 111.7554 50.329253) (xy 107.13614 50.329253) + (xy 107.13614 45.428951) (xy 111.9554 45.428951) (xy 111.9554 45.670649) (xy 112.002553 45.907703) (xy 112.095047 46.131002) + (xy 112.229327 46.331967) (xy 112.400233 46.502873) (xy 112.601198 46.637153) (xy 112.824497 46.729647) (xy 113.061551 46.7768) + (xy 113.303249 46.7768) (xy 113.540303 46.729647) (xy 113.763602 46.637153) (xy 113.964567 46.502873) (xy 114.135473 46.331967) + (xy 114.269753 46.131002) (xy 114.362247 45.907703) (xy 114.4094 45.670649) (xy 114.4094 45.441651) (xy 135.9965 45.441651) + (xy 135.9965 45.683349) (xy 136.043653 45.920403) (xy 136.136147 46.143702) (xy 136.270427 46.344667) (xy 136.441333 46.515573) + (xy 136.642298 46.649853) (xy 136.865597 46.742347) (xy 137.102651 46.7895) (xy 137.344349 46.7895) (xy 137.581403 46.742347) + (xy 137.804702 46.649853) (xy 138.005667 46.515573) (xy 138.176573 46.344667) (xy 138.310853 46.143702) (xy 138.403347 45.920403) + (xy 138.4505 45.683349) (xy 138.4505 45.441651) (xy 147.9472 45.441651) (xy 147.9472 45.683349) (xy 147.994353 45.920403) + (xy 148.086847 46.143702) (xy 148.221127 46.344667) (xy 148.392033 46.515573) (xy 148.592998 46.649853) (xy 148.816297 46.742347) + (xy 149.053351 46.7895) (xy 149.295049 46.7895) (xy 149.532103 46.742347) (xy 149.755402 46.649853) (xy 149.956367 46.515573) + (xy 150.127273 46.344667) (xy 150.261553 46.143702) (xy 150.354047 45.920403) (xy 150.4012 45.683349) (xy 150.4012 45.441651) + (xy 159.9233 45.441651) (xy 159.9233 45.683349) (xy 159.970453 45.920403) (xy 160.062947 46.143702) (xy 160.197227 46.344667) + (xy 160.368133 46.515573) (xy 160.569098 46.649853) (xy 160.792397 46.742347) (xy 161.029451 46.7895) (xy 161.271149 46.7895) + (xy 161.508203 46.742347) (xy 161.731502 46.649853) (xy 161.932467 46.515573) (xy 162.103373 46.344667) (xy 162.237653 46.143702) + (xy 162.330147 45.920403) (xy 162.3773 45.683349) (xy 162.3773 45.441651) (xy 171.8994 45.441651) (xy 171.8994 45.683349) + (xy 171.946553 45.920403) (xy 172.039047 46.143702) (xy 172.173327 46.344667) (xy 172.344233 46.515573) (xy 172.545198 46.649853) + (xy 172.768497 46.742347) (xy 173.005551 46.7895) (xy 173.247249 46.7895) (xy 173.484303 46.742347) (xy 173.707602 46.649853) + (xy 173.908567 46.515573) (xy 174.079473 46.344667) (xy 174.213753 46.143702) (xy 174.306247 45.920403) (xy 174.3534 45.683349) + (xy 174.3534 45.441651) (xy 174.350874 45.428951) (xy 183.8755 45.428951) (xy 183.8755 45.670649) (xy 183.922653 45.907703) + (xy 184.015147 46.131002) (xy 184.149427 46.331967) (xy 184.320333 46.502873) (xy 184.521298 46.637153) (xy 184.744597 46.729647) + (xy 184.981651 46.7768) (xy 185.223349 46.7768) (xy 185.460403 46.729647) (xy 185.683702 46.637153) (xy 185.884667 46.502873) + (xy 186.055573 46.331967) (xy 186.189853 46.131002) (xy 186.282347 45.907703) (xy 186.3295 45.670649) (xy 186.3295 45.428951) + (xy 186.326974 45.416251) (xy 195.877 45.416251) (xy 195.877 45.657949) (xy 195.924153 45.895003) (xy 196.016647 46.118302) + (xy 196.150927 46.319267) (xy 196.321833 46.490173) (xy 196.522798 46.624453) (xy 196.746097 46.716947) (xy 196.983151 46.7641) + (xy 197.224849 46.7641) (xy 197.461903 46.716947) (xy 197.685202 46.624453) (xy 197.886167 46.490173) (xy 198.057073 46.319267) + (xy 198.191353 46.118302) (xy 198.283847 45.895003) (xy 198.331 45.657949) (xy 198.331 45.416251) (xy 198.283847 45.179197) + (xy 198.191353 44.955898) (xy 198.057073 44.754933) (xy 197.886167 44.584027) (xy 197.685202 44.449747) (xy 197.461903 44.357253) + (xy 197.224849 44.3101) (xy 196.983151 44.3101) (xy 196.746097 44.357253) (xy 196.522798 44.449747) (xy 196.321833 44.584027) + (xy 196.150927 44.754933) (xy 196.016647 44.955898) (xy 195.924153 45.179197) (xy 195.877 45.416251) (xy 186.326974 45.416251) + (xy 186.282347 45.191897) (xy 186.189853 44.968598) (xy 186.055573 44.767633) (xy 185.884667 44.596727) (xy 185.683702 44.462447) + (xy 185.460403 44.369953) (xy 185.223349 44.3228) (xy 184.981651 44.3228) (xy 184.744597 44.369953) (xy 184.521298 44.462447) + (xy 184.320333 44.596727) (xy 184.149427 44.767633) (xy 184.015147 44.968598) (xy 183.922653 45.191897) (xy 183.8755 45.428951) + (xy 174.350874 45.428951) (xy 174.306247 45.204597) (xy 174.213753 44.981298) (xy 174.079473 44.780333) (xy 173.908567 44.609427) + (xy 173.707602 44.475147) (xy 173.484303 44.382653) (xy 173.247249 44.3355) (xy 173.005551 44.3355) (xy 172.768497 44.382653) + (xy 172.545198 44.475147) (xy 172.344233 44.609427) (xy 172.173327 44.780333) (xy 172.039047 44.981298) (xy 171.946553 45.204597) + (xy 171.8994 45.441651) (xy 162.3773 45.441651) (xy 162.330147 45.204597) (xy 162.237653 44.981298) (xy 162.103373 44.780333) + (xy 161.932467 44.609427) (xy 161.731502 44.475147) (xy 161.508203 44.382653) (xy 161.271149 44.3355) (xy 161.029451 44.3355) + (xy 160.792397 44.382653) (xy 160.569098 44.475147) (xy 160.368133 44.609427) (xy 160.197227 44.780333) (xy 160.062947 44.981298) + (xy 159.970453 45.204597) (xy 159.9233 45.441651) (xy 150.4012 45.441651) (xy 150.354047 45.204597) (xy 150.261553 44.981298) + (xy 150.127273 44.780333) (xy 149.956367 44.609427) (xy 149.755402 44.475147) (xy 149.532103 44.382653) (xy 149.295049 44.3355) + (xy 149.053351 44.3355) (xy 148.816297 44.382653) (xy 148.592998 44.475147) (xy 148.392033 44.609427) (xy 148.221127 44.780333) + (xy 148.086847 44.981298) (xy 147.994353 45.204597) (xy 147.9472 45.441651) (xy 138.4505 45.441651) (xy 138.403347 45.204597) + (xy 138.310853 44.981298) (xy 138.176573 44.780333) (xy 138.005667 44.609427) (xy 137.804702 44.475147) (xy 137.581403 44.382653) + (xy 137.344349 44.3355) (xy 137.102651 44.3355) (xy 136.865597 44.382653) (xy 136.642298 44.475147) (xy 136.441333 44.609427) + (xy 136.270427 44.780333) (xy 136.136147 44.981298) (xy 136.043653 45.204597) (xy 135.9965 45.441651) (xy 114.4094 45.441651) + (xy 114.4094 45.428951) (xy 114.362247 45.191897) (xy 114.269753 44.968598) (xy 114.135473 44.767633) (xy 113.964567 44.596727) + (xy 113.763602 44.462447) (xy 113.540303 44.369953) (xy 113.303249 44.3228) (xy 113.061551 44.3228) (xy 112.824497 44.369953) + (xy 112.601198 44.462447) (xy 112.400233 44.596727) (xy 112.229327 44.767633) (xy 112.095047 44.968598) (xy 112.002553 45.191897) + (xy 111.9554 45.428951) (xy 107.13614 45.428951) (xy 107.13614 44.07508) (xy 202.607141 44.07508) ) ) (filled_polygon @@ -19287,22 +19287,24 @@ (xy 137.299103 77.737977) (xy 137.249026 77.663031) (xy 137.140799 77.554804) (xy 137.013538 77.469771) (xy 136.872133 77.411199) (xy 136.722018 77.38134) (xy 136.568962 77.38134) (xy 136.418847 77.411199) (xy 136.277442 77.469771) (xy 136.150181 77.554804) (xy 136.041954 77.663031) (xy 135.956921 77.790292) (xy 135.898349 77.931697) (xy 135.86849 78.081812) (xy 135.86849 78.234868) - (xy 135.898349 78.384983) (xy 135.929 78.45898) (xy 107.13614 78.45898) (xy 107.13614 75.900705) (xy 119.3126 75.900705) - (xy 119.438514 76.190677) (xy 119.770726 76.356533) (xy 120.128912 76.45439) (xy 120.499306 76.480489) (xy 120.867675 76.433825) - (xy 121.219862 76.316194) (xy 121.454686 76.190677) (xy 121.5806 75.900705) (xy 128.8126 75.900705) (xy 128.938514 76.190677) - (xy 129.270726 76.356533) (xy 129.628912 76.45439) (xy 129.999306 76.480489) (xy 130.367675 76.433825) (xy 130.719862 76.316194) - (xy 130.954686 76.190677) (xy 131.0806 75.900705) (xy 129.9466 74.766705) (xy 128.8126 75.900705) (xy 121.5806 75.900705) - (xy 120.4466 74.766705) (xy 119.3126 75.900705) (xy 107.13614 75.900705) (xy 107.13614 75.127197) (xy 109.844408 75.127197) - (xy 109.922043 75.376272) (xy 110.186083 75.502171) (xy 110.469611 75.574139) (xy 110.761731 75.589411) (xy 111.051219 75.547399) - (xy 111.326947 75.449719) (xy 111.464357 75.376272) (xy 111.541992 75.127197) (xy 110.6932 74.278405) (xy 109.844408 75.127197) - (xy 107.13614 75.127197) (xy 107.13614 74.167331) (xy 109.202589 74.167331) (xy 109.244601 74.456819) (xy 109.342281 74.732547) - (xy 109.415728 74.869957) (xy 109.664803 74.947592) (xy 110.513595 74.0988) (xy 109.664803 73.250008) (xy 109.415728 73.327643) - (xy 109.289829 73.591683) (xy 109.217861 73.875211) (xy 109.202589 74.167331) (xy 107.13614 74.167331) (xy 107.13614 73.070403) - (xy 109.844408 73.070403) (xy 110.6932 73.919195) (xy 111.541992 73.070403) (xy 111.464357 72.821328) (xy 111.200317 72.695429) - (xy 110.916789 72.623461) (xy 110.624669 72.608189) (xy 110.335181 72.650201) (xy 110.059453 72.747881) (xy 109.922043 72.821328) - (xy 109.844408 73.070403) (xy 107.13614 73.070403) (xy 107.13614 70.379404) (xy 107.348665 70.166879) (xy 124.476662 70.166879) - (xy 124.519741 70.171122) (xy 124.56282 70.166879) (xy 124.567623 70.166406) (xy 124.691663 70.154189) (xy 124.709639 70.148736) - (xy 124.856978 70.104041) (xy 124.880867 70.091272) + (xy 135.898349 78.384983) (xy 135.956921 78.526388) (xy 136.020192 78.62108) (xy 129.157008 78.62108) (xy 129.14461 78.617319) + (xy 129.070854 78.610055) (xy 129.070844 78.610055) (xy 129.046201 78.607628) (xy 129.021558 78.610055) (xy 121.371642 78.610055) + (xy 121.346999 78.607628) (xy 121.322356 78.610055) (xy 121.322346 78.610055) (xy 121.24859 78.617319) (xy 121.236192 78.62108) + (xy 107.13614 78.62108) (xy 107.13614 75.900705) (xy 119.3126 75.900705) (xy 119.438514 76.190677) (xy 119.770726 76.356533) + (xy 120.128912 76.45439) (xy 120.499306 76.480489) (xy 120.867675 76.433825) (xy 121.219862 76.316194) (xy 121.454686 76.190677) + (xy 121.5806 75.900705) (xy 128.8126 75.900705) (xy 128.938514 76.190677) (xy 129.270726 76.356533) (xy 129.628912 76.45439) + (xy 129.999306 76.480489) (xy 130.367675 76.433825) (xy 130.719862 76.316194) (xy 130.954686 76.190677) (xy 131.0806 75.900705) + (xy 129.9466 74.766705) (xy 128.8126 75.900705) (xy 121.5806 75.900705) (xy 120.4466 74.766705) (xy 119.3126 75.900705) + (xy 107.13614 75.900705) (xy 107.13614 75.127197) (xy 109.844408 75.127197) (xy 109.922043 75.376272) (xy 110.186083 75.502171) + (xy 110.469611 75.574139) (xy 110.761731 75.589411) (xy 111.051219 75.547399) (xy 111.326947 75.449719) (xy 111.464357 75.376272) + (xy 111.541992 75.127197) (xy 110.6932 74.278405) (xy 109.844408 75.127197) (xy 107.13614 75.127197) (xy 107.13614 74.167331) + (xy 109.202589 74.167331) (xy 109.244601 74.456819) (xy 109.342281 74.732547) (xy 109.415728 74.869957) (xy 109.664803 74.947592) + (xy 110.513595 74.0988) (xy 109.664803 73.250008) (xy 109.415728 73.327643) (xy 109.289829 73.591683) (xy 109.217861 73.875211) + (xy 109.202589 74.167331) (xy 107.13614 74.167331) (xy 107.13614 73.070403) (xy 109.844408 73.070403) (xy 110.6932 73.919195) + (xy 111.541992 73.070403) (xy 111.464357 72.821328) (xy 111.200317 72.695429) (xy 110.916789 72.623461) (xy 110.624669 72.608189) + (xy 110.335181 72.650201) (xy 110.059453 72.747881) (xy 109.922043 72.821328) (xy 109.844408 73.070403) (xy 107.13614 73.070403) + (xy 107.13614 70.379404) (xy 107.348665 70.166879) (xy 124.476662 70.166879) (xy 124.519741 70.171122) (xy 124.56282 70.166879) + (xy 124.567623 70.166406) (xy 124.691663 70.154189) (xy 124.709639 70.148736) (xy 124.856978 70.104041) (xy 124.880867 70.091272) ) ) (filled_polygon diff --git a/hardware/mainboard/TapeLooper_MainBoard.sch b/hardware/mainboard/TapeLooper_MainBoard.sch index 43bf51e..15640f9 100644 --- a/hardware/mainboard/TapeLooper_MainBoard.sch +++ b/hardware/mainboard/TapeLooper_MainBoard.sch @@ -99,7 +99,7 @@ BTTN_LOAD Text GLabel 7450 2000 0 50 Input ~ 0 BTTN_SAVE Text GLabel 7450 2600 0 50 Input ~ 0 -BTTN_DIRECTION +BTTN_SETTINGS Text GLabel 7450 1200 0 50 Input ~ 0 BTTN_REC Wire Wire Line diff --git a/hardware/mainboard/UI.sch b/hardware/mainboard/UI.sch index e5945c6..b4ef0d0 100644 --- a/hardware/mainboard/UI.sch +++ b/hardware/mainboard/UI.sch @@ -385,7 +385,7 @@ P 4050 2000 AR Path="/61A6EF5C/61C6F7DD" Ref="R19" Part="1" AR Path="/61C6F7DD" Ref="R?" Part="1" F 0 "R19" H 4120 2046 50 0000 L CNN -F 1 "Rled" H 4120 1955 50 0000 L CNN +F 1 "330" H 4120 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 3980 2000 50 0001 C CNN F 3 "~" H 4050 2000 50 0001 C CNN 1 4050 2000 @@ -398,7 +398,7 @@ P 4250 2000 AR Path="/61A6EF5C/61C6F7E3" Ref="R20" Part="1" AR Path="/61C6F7E3" Ref="R?" Part="1" F 0 "R20" H 4320 2046 50 0000 L CNN -F 1 "Rled" H 4320 1955 50 0000 L CNN +F 1 "330" H 4320 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4180 2000 50 0001 C CNN F 3 "~" H 4250 2000 50 0001 C CNN 1 4250 2000 @@ -439,7 +439,7 @@ P 4600 2000 AR Path="/61A6EF5C/61C6F7F6" Ref="R21" Part="1" AR Path="/61C6F7F6" Ref="R?" Part="1" F 0 "R21" H 4670 2046 50 0000 L CNN -F 1 "Rled" H 4670 1955 50 0000 L CNN +F 1 "330" H 4670 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4530 2000 50 0001 C CNN F 3 "~" H 4600 2000 50 0001 C CNN 1 4600 2000 @@ -452,7 +452,7 @@ P 4800 2000 AR Path="/61A6EF5C/61C6F7FC" Ref="R22" Part="1" AR Path="/61C6F7FC" Ref="R?" Part="1" F 0 "R22" H 4870 2046 50 0000 L CNN -F 1 "Rled" H 4870 1955 50 0000 L CNN +F 1 "330" H 4870 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 4730 2000 50 0001 C CNN F 3 "~" H 4800 2000 50 0001 C CNN 1 4800 2000 @@ -493,7 +493,7 @@ P 5400 2000 AR Path="/61A6EF5C/61C6F80F" Ref="R23" Part="1" AR Path="/61C6F80F" Ref="R?" Part="1" F 0 "R23" H 5470 2046 50 0000 L CNN -F 1 "Rled" H 5470 1955 50 0000 L CNN +F 1 "330" H 5470 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 5330 2000 50 0001 C CNN F 3 "~" H 5400 2000 50 0001 C CNN 1 5400 2000 @@ -506,7 +506,7 @@ P 5600 2000 AR Path="/61A6EF5C/61C6F815" Ref="R26" Part="1" AR Path="/61C6F815" Ref="R?" Part="1" F 0 "R26" H 5670 2046 50 0000 L CNN -F 1 "Rled" H 5670 1955 50 0000 L CNN +F 1 "330" H 5670 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 5530 2000 50 0001 C CNN F 3 "~" H 5600 2000 50 0001 C CNN 1 5600 2000 @@ -547,7 +547,7 @@ P 5950 2000 AR Path="/61A6EF5C/61C6F828" Ref="R27" Part="1" AR Path="/61C6F828" Ref="R?" Part="1" F 0 "R27" H 6020 2046 50 0000 L CNN -F 1 "Rled" H 6020 1955 50 0000 L CNN +F 1 "330" H 6020 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 5880 2000 50 0001 C CNN F 3 "~" H 5950 2000 50 0001 C CNN 1 5950 2000 @@ -560,7 +560,7 @@ P 6150 2000 AR Path="/61A6EF5C/61C6F82E" Ref="R28" Part="1" AR Path="/61C6F82E" Ref="R?" Part="1" F 0 "R28" H 6220 2046 50 0000 L CNN -F 1 "Rled" H 6220 1955 50 0000 L CNN +F 1 "330" H 6220 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6080 2000 50 0001 C CNN F 3 "~" H 6150 2000 50 0001 C CNN 1 6150 2000 @@ -617,7 +617,7 @@ P 6700 2000 AR Path="/61A6EF5C/61C6F849" Ref="R29" Part="1" AR Path="/61C6F849" Ref="R?" Part="1" F 0 "R29" H 6770 2046 50 0000 L CNN -F 1 "Rled" H 6770 1955 50 0000 L CNN +F 1 "330" H 6770 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6630 2000 50 0001 C CNN F 3 "~" H 6700 2000 50 0001 C CNN 1 6700 2000 @@ -630,7 +630,7 @@ P 6900 2000 AR Path="/61A6EF5C/61C6F84F" Ref="R30" Part="1" AR Path="/61C6F84F" Ref="R?" Part="1" F 0 "R30" H 6970 2046 50 0000 L CNN -F 1 "Rled" H 6970 1955 50 0000 L CNN +F 1 "330" H 6970 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 6830 2000 50 0001 C CNN F 3 "~" H 6900 2000 50 0001 C CNN 1 6900 2000 @@ -877,7 +877,7 @@ P 7250 2000 AR Path="/61A6EF5C/61C93599" Ref="R33" Part="1" AR Path="/61C93599" Ref="R?" Part="1" F 0 "R33" H 7320 2046 50 0000 L CNN -F 1 "Rled" H 7320 1955 50 0000 L CNN +F 1 "330" H 7320 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7180 2000 50 0001 C CNN F 3 "~" H 7250 2000 50 0001 C CNN 1 7250 2000 @@ -890,7 +890,7 @@ P 7450 2000 AR Path="/61A6EF5C/61C9359F" Ref="R34" Part="1" AR Path="/61C9359F" Ref="R?" Part="1" F 0 "R34" H 7520 2046 50 0000 L CNN -F 1 "Rled" H 7520 1955 50 0000 L CNN +F 1 "330" H 7520 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7380 2000 50 0001 C CNN F 3 "~" H 7450 2000 50 0001 C CNN 1 7450 2000 @@ -939,7 +939,7 @@ P 7800 2000 AR Path="/61A6EF5C/61C9628B" Ref="R35" Part="1" AR Path="/61C9628B" Ref="R?" Part="1" F 0 "R35" H 7870 2046 50 0000 L CNN -F 1 "Rled" H 7870 1955 50 0000 L CNN +F 1 "330" H 7870 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7730 2000 50 0001 C CNN F 3 "~" H 7800 2000 50 0001 C CNN 1 7800 2000 @@ -952,7 +952,7 @@ P 8000 2000 AR Path="/61A6EF5C/61C96291" Ref="R36" Part="1" AR Path="/61C96291" Ref="R?" Part="1" F 0 "R36" H 8070 2046 50 0000 L CNN -F 1 "Rled" H 8070 1955 50 0000 L CNN +F 1 "330" H 8070 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 7930 2000 50 0001 C CNN F 3 "~" H 8000 2000 50 0001 C CNN 1 8000 2000 @@ -1001,7 +1001,7 @@ P 8350 2000 AR Path="/61A6EF5C/61C99EF8" Ref="R37" Part="1" AR Path="/61C99EF8" Ref="R?" Part="1" F 0 "R37" H 8420 2046 50 0000 L CNN -F 1 "Rled" H 8420 1955 50 0000 L CNN +F 1 "330" H 8420 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 8280 2000 50 0001 C CNN F 3 "~" H 8350 2000 50 0001 C CNN 1 8350 2000 @@ -1014,7 +1014,7 @@ P 8550 2000 AR Path="/61A6EF5C/61C99EFE" Ref="R38" Part="1" AR Path="/61C99EFE" Ref="R?" Part="1" F 0 "R38" H 8620 2046 50 0000 L CNN -F 1 "Rled" H 8620 1955 50 0000 L CNN +F 1 "330" H 8620 1955 50 0000 L CNN F 2 "Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder" V 8480 2000 50 0001 C CNN F 3 "~" H 8550 2000 50 0001 C CNN 1 8550 2000 diff --git a/lib/libDaisy b/lib/libDaisy index a3be03e..3e200cb 160000 --- a/lib/libDaisy +++ b/lib/libDaisy @@ -1 +1 @@ -Subproject commit a3be03e13c8deddb66530c45e5ddb3d4fe82b793 +Subproject commit 3e200cbf3ef688edf184f30b648021deeeb0db22