Browse Source

initial commit

pull/1639/head
bsp2 7 years ago
parent
commit
848871160e
100 changed files with 13035 additions and 1207 deletions
  1. +7
    -14
      include/app.hpp
  2. +5
    -0
      include/asset.hpp
  3. +4
    -0
      include/audio.hpp
  4. +28
    -27
      include/dsp/fir.hpp
  5. +8
    -11
      include/engine.hpp
  6. +158
    -0
      include/global.hpp
  7. +18
    -0
      include/global_pre.hpp
  8. +138
    -0
      include/global_ui.hpp
  9. +26
    -2
      include/plugin.hpp
  10. +4
    -0
      include/rack.hpp
  11. +5
    -0
      include/rtmidi.hpp
  12. +4
    -0
      include/util/common.hpp
  13. +35
    -0
      include/vstmidi.hpp
  14. +2
    -0
      include/window.hpp
  15. +99
    -0
      make.objects
  16. +30
    -0
      makefile.msvc
  17. +21
    -0
      makefile_lib.msvc
  18. +9
    -0
      makefile_vst_effect.msvc
  19. +8
    -0
      makefile_vst_instr.msvc
  20. +6
    -26
      res/Core/AudioInterface.svg
  21. +8
    -28
      res/Core/MIDICCToCVInterface.svg
  22. +5
    -25
      res/Core/MIDIToCVInterface.svg
  23. +6
    -26
      res/Core/MIDITriggerToCVInterface.svg
  24. +8
    -28
      res/Core/Notes.svg
  25. +6
    -26
      res/Core/QuadMIDIToCVInterface.svg
  26. +20
    -1
      src/Core/AudioInterface.cpp
  27. +10
    -4
      src/Core/Blank.cpp
  28. +20
    -10
      src/Core/Core.cpp
  29. +2
    -11
      src/Core/Core.hpp
  30. +11
    -6
      src/Core/MIDICCToCVInterface.cpp
  31. +6
    -1
      src/Core/MIDIToCVInterface.cpp
  32. +9
    -3
      src/Core/MIDITriggerToCVInterface.cpp
  33. +6
    -1
      src/Core/Notes.cpp
  34. +6
    -2
      src/Core/QuadMIDIToCVInterface.cpp
  35. +20
    -4
      src/app/AudioWidget.cpp
  36. +2
    -1
      src/app/Knob.cpp
  37. +6
    -4
      src/app/LedDisplay.cpp
  38. +6
    -3
      src/app/MidiWidget.cpp
  39. +36
    -39
      src/app/ModuleBrowser.cpp
  40. +65
    -220
      src/app/ModuleWidget.cpp
  41. +2
    -0
      src/app/ParamWidget.cpp
  42. +4
    -0
      src/app/PluginManagerWidget.cpp
  43. +11
    -10
      src/app/Port.cpp
  44. +21
    -25
      src/app/RackScene.cpp
  45. +4
    -2
      src/app/RackScrollWidget.cpp
  46. +98
    -94
      src/app/RackWidget.cpp
  47. +3
    -1
      src/app/SVGPanel.cpp
  48. +18
    -15
      src/app/Toolbar.cpp
  49. +12
    -10
      src/app/WireWidget.cpp
  50. +13
    -20
      src/app/app.cpp
  51. +31
    -19
      src/asset.cpp
  52. +53
    -11
      src/audio.cpp
  53. +2
    -0
      src/bridge.cpp
  54. +216
    -116
      src/engine.cpp
  55. +2
    -0
      src/gamepad.cpp
  56. +8
    -7
      src/keyboard.cpp
  57. +151
    -11
      src/main.cpp
  58. +14
    -16
      src/midi.cpp
  59. +151
    -39
      src/plugin.cpp
  60. +2
    -0
      src/rtmidi.cpp
  61. +27
    -22
      src/settings.cpp
  62. +6
    -0
      src/tags.cpp
  63. +5
    -3
      src/ui/MenuItem.cpp
  64. +3
    -1
      src/ui/MenuLabel.cpp
  65. +4
    -2
      src/ui/MenuOverlay.cpp
  66. +4
    -2
      src/ui/Scene.cpp
  67. +7
    -5
      src/ui/ScrollWidget.cpp
  68. +9
    -7
      src/ui/TextField.cpp
  69. +0
    -1
      src/ui/ui.cpp
  70. +18
    -18
      src/util/logger.cpp
  71. +22
    -9
      src/util/random.cpp
  72. +31
    -0
      src/util/string.cpp
  73. +30
    -0
      src/util/system.cpp
  74. +1585
    -0
      src/vst2_main.cpp
  75. +111
    -0
      src/vstmidi.cpp
  76. +11
    -9
      src/widgets/FramebufferWidget.cpp
  77. +18
    -16
      src/widgets/Widget.cpp
  78. +0
    -5
      src/widgets/widgets.cpp
  79. +234
    -188
      src/window.cpp
  80. +264
    -0
      vst2_bin/CHANGELOG_VST.txt
  81. +514
    -0
      vst2_bin/LICENSE-dist.txt
  82. +11
    -0
      vst2_bin/LICENSE.txt
  83. +108
    -0
      vst2_bin/README.md
  84. +289
    -0
      vst2_bin/README_vst2.txt
  85. +54
    -0
      vst2_bin/log.txt
  86. +0
    -0
      vst2_bin/plugins/.gitignore
  87. +320
    -0
      vst2_bin/plugins/AS/LICENSE.txt
  88. +251
    -0
      vst2_bin/plugins/AS/README.md
  89. +626
    -0
      vst2_bin/plugins/AS/res/8chMixer.svg
  90. +452
    -0
      vst2_bin/plugins/AS/res/ADSR.svg
  91. +440
    -0
      vst2_bin/plugins/AS/res/AtNuVrTr.svg
  92. +702
    -0
      vst2_bin/plugins/AS/res/BPMCalc.svg
  93. +761
    -0
      vst2_bin/plugins/AS/res/BPMClock.svg
  94. +145
    -0
      vst2_bin/plugins/AS/res/Blanks/BlankPanel4.svg
  95. +146
    -0
      vst2_bin/plugins/AS/res/Blanks/BlankPanel6.svg
  96. +149
    -0
      vst2_bin/plugins/AS/res/Blanks/BlankPanel8.svg
  97. +1452
    -0
      vst2_bin/plugins/AS/res/Blanks/as-BlankPanelSpecial0.svg
  98. +1596
    -0
      vst2_bin/plugins/AS/res/Blanks/as-BlankPanelSpecial1.svg
  99. +457
    -0
      vst2_bin/plugins/AS/res/Blanks/as-BlankPanelSpecial2.svg
  100. +484
    -0
      vst2_bin/plugins/AS/res/Blanks/as-BlankPanelSpecial3.svg

+ 7
- 14
include/app.hpp View File

@@ -46,8 +46,6 @@ struct SVGPanel;
static const float RACK_GRID_WIDTH = 15;
static const float RACK_GRID_HEIGHT = 380;
static const Vec RACK_GRID_SIZE = Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
static const std::string PRESET_FILTERS = "VCV Rack module preset (.vcvm):vcvm";
static const std::string PATCH_FILTERS = "VCV Rack patch (.vcv):vcv";


struct ModuleWidget : OpaqueWidget {
@@ -70,12 +68,6 @@ struct ModuleWidget : OpaqueWidget {

virtual json_t *toJson();
virtual void fromJson(json_t *rootJ);
void copyClipboard();
void pasteClipboard();
void save(std::string filename);
void load(std::string filename);
void loadDialog();
void saveDialog();

virtual void create();
virtual void _delete();
@@ -162,20 +154,21 @@ struct RackWidget : OpaqueWidget {
void clear();
/** Clears the rack and loads the template patch */
void reset();
void loadDialog();
void openDialog();
void saveDialog();
void saveAsDialog();
/** If `lastPath` is defined, ask the user to reload it */
void revert();
/** Disconnects all wires */
void disconnect();
void save(std::string filename);
void load(std::string filename);
void savePatch(std::string filename);
void loadPatch(std::string filename);
#ifdef USE_VST2
bool loadPatchFromString (const char *_string);
char *savePatchToString (void);
#endif // USE_VST2
json_t *toJson();
void fromJson(json_t *rootJ);
/** Creates a module and adds it to the rack */
ModuleWidget *moduleFromJson(json_t *moduleJ);
void pastePresetClipboard();

void addModule(ModuleWidget *m);
/** Removes the module and transfers ownership to the caller */


+ 5
- 0
include/asset.hpp View File

@@ -15,5 +15,10 @@ std::string assetLocal(std::string filename);
/** Returns the path of a resource in the plugin's folder. Should only read files from this location. */
std::string assetPlugin(Plugin *plugin, std::string filename);

#ifdef USE_VST2
std::string assetStaticPlugin(const char *name/*e.g. "Fundamentals"*/, const char *_relPathOrNull = 0);
std::string assetPlugin(const char *name/*e.g. "Fundamentals"*/, const char *_relPathOrNull = 0);
#endif // USE_VST2


} // namespace rack

+ 4
- 0
include/audio.hpp View File

@@ -2,12 +2,16 @@

#include <jansson.h>

#ifdef __GNUC__
#pragma GCC diagnostic push
#ifndef __clang__
#pragma GCC diagnostic ignored "-Wsuggest-override"
#endif
#include <RtAudio.h>
#pragma GCC diagnostic pop
#else
#include <RtAudio.h>
#endif // __GNUC__


namespace rack {


+ 28
- 27
include/dsp/fir.hpp View File

@@ -53,21 +53,18 @@ struct RealTimeConvolver {
RealTimeConvolver(size_t blockSize) {
this->blockSize = blockSize;
pffft = pffft_new_setup(blockSize*2, PFFFT_REAL);
outputTail = new float[blockSize];
memset(outputTail, 0, blockSize * sizeof(float));
tmpBlock = new float[blockSize*2];
memset(tmpBlock, 0, blockSize*2 * sizeof(float));
outputTail = new float[blockSize]();
tmpBlock = new float[blockSize*2]();
}

~RealTimeConvolver() {
setKernel(NULL, 0);
clear();
delete[] outputTail;
delete[] tmpBlock;
pffft_destroy_setup(pffft);
}

void setKernel(const float *kernel, size_t length) {
// Clear existing kernel
void clear() {
if (kernelFfts) {
pffft_aligned_free(kernelFfts);
kernelFfts = NULL;
@@ -78,24 +75,29 @@ struct RealTimeConvolver {
}
kernelBlocks = 0;
inputPos = 0;
}

void setKernel(const float *kernel, size_t length) {
clear();

if (kernel && length > 0) {
// Round up to the nearest factor of `blockSize`
kernelBlocks = (length - 1) / blockSize + 1;

// Allocate blocks
kernelFfts = (float*) pffft_aligned_malloc(sizeof(float) * blockSize*2 * kernelBlocks);
inputFfts = (float*) pffft_aligned_malloc(sizeof(float) * blockSize*2 * kernelBlocks);
memset(inputFfts, 0, sizeof(float) * blockSize*2 * kernelBlocks);

for (size_t i = 0; i < kernelBlocks; i++) {
// Pad each block with zeros
memset(tmpBlock, 0, sizeof(float) * blockSize*2);
size_t len = min((int) blockSize, (int) (length - i*blockSize));
memcpy(tmpBlock, &kernel[i*blockSize], sizeof(float)*len);
// Compute fft
pffft_transform(pffft, tmpBlock, &kernelFfts[blockSize*2 * i], NULL, PFFFT_FORWARD);
}
assert(kernel);
assert(length > 0);

// Round up to the nearest factor of `blockSize`
kernelBlocks = (length - 1) / blockSize + 1;

// Allocate blocks
kernelFfts = (float*) pffft_aligned_malloc(sizeof(float) * blockSize*2 * kernelBlocks);
inputFfts = (float*) pffft_aligned_malloc(sizeof(float) * blockSize*2 * kernelBlocks);
memset(inputFfts, 0, sizeof(float) * blockSize*2 * kernelBlocks);

for (size_t i = 0; i < kernelBlocks; i++) {
// Pad each block with zeros
memset(tmpBlock, 0, sizeof(float) * blockSize*2);
size_t len = min((int) blockSize, (int) (length - i*blockSize));
memcpy(tmpBlock, &kernel[i*blockSize], sizeof(float)*len);
// Compute fft
pffft_transform(pffft, tmpBlock, &kernelFfts[blockSize*2 * i], NULL, PFFFT_FORWARD);
}
}

@@ -121,7 +123,7 @@ struct RealTimeConvolver {
// Note: This is the CPU bottleneck loop
for (size_t i = 0; i < kernelBlocks; i++) {
size_t pos = (inputPos - i + kernelBlocks) % kernelBlocks;
pffft_zconvolve_accumulate(pffft, &kernelFfts[blockSize*2 * i], &inputFfts[blockSize*2 * pos], tmpBlock, 1.f);
pffft_zconvolve_accumulate(pffft, &kernelFfts[blockSize*2 * i], &inputFfts[blockSize*2 * pos], tmpBlock, 1.0);
}
// Compute output
pffft_transform(pffft, tmpBlock, tmpBlock, NULL, PFFFT_BACKWARD);
@@ -130,10 +132,9 @@ struct RealTimeConvolver {
tmpBlock[i] += outputTail[i];
}
// Copy output block to output
float scale = 1.f / (blockSize*2);
for (size_t i = 0; i < blockSize; i++) {
// Scale based on FFT
output[i] = tmpBlock[i] * scale;
output[i] = tmpBlock[i] / blockSize;
}
// Set tail
for (size_t i = 0; i < blockSize; i++) {


+ 8
- 11
include/engine.hpp View File

@@ -49,6 +49,10 @@ struct Output {


struct Module {
#ifdef USE_VST2
// assigned when module is added to engine (see engine.cpp:engineAddModule())
int vst2_unique_param_base_id;
#endif // USE_VST2
std::vector<Param> params;
std::vector<Input> inputs;
std::vector<Output> outputs;
@@ -118,12 +122,14 @@ void engineStop();
/** Does not transfer pointer ownership */
void engineAddModule(Module *module);
void engineRemoveModule(Module *module);
void engineResetModule(Module *module);
void engineRandomizeModule(Module *module);
/** Does not transfer pointer ownership */
void engineAddWire(Wire *wire);
void engineRemoveWire(Wire *wire);
#ifdef USE_VST2
void engineSetParam(Module *module, int paramId, float value, bool bVSTAutomate = true);
#else
void engineSetParam(Module *module, int paramId, float value);
#endif
void engineSetParamSmooth(Module *module, int paramId, float value);
void engineSetSampleRate(float sampleRate);
float engineGetSampleRate();
@@ -131,13 +137,4 @@ float engineGetSampleRate();
float engineGetSampleTime();


extern bool gPaused;
/** Plugins should not manipulate other modules or wires unless that is the entire purpose of the module.
Your plugin needs to have a clear purpose for manipulating other modules and wires and must be done with a good UX.
*/
extern std::vector<Module*> gModules;
extern std::vector<Wire*> gWires;
extern bool gPowerMeter;


} // namespace rack

+ 158
- 0
include/global.hpp View File

@@ -0,0 +1,158 @@
#pragma once


#include <map>
#include <list>
#include <vector>
#include <string>
#include <mutex>
#include <thread>

#include "util/common.hpp" // VIPMutex


#ifdef USE_VST2
struct VSTPluginWrapper;
#endif // USE_VST2


namespace rack {

struct Module;
struct Wire;
struct KeyboardDriver;
struct MidiDriver;
struct Plugin;

#ifdef USE_VST2
struct VSTMidiInputDevice;

#define VST2_MAX_UNIQUE_PARAM_IDS (9999)
#endif // USE_VST2

//
// the structure fields reflect the original file locations
// (e.g. 'window' was originally located in 'window.cpp')
//

struct VST2QueuedParam {
int unique_id;
float norm_value;
};

struct Global {
bool gPaused;
/** Plugins should not manipulate other modules or wires unless that is the entire purpose of the module.
Your plugin needs to have a clear purpose for manipulating other modules and wires and must be done with a good UX.
*/
std::vector<Module*> gModules;
std::vector<Wire*> gWires;
bool gPowerMeter;

struct {
bool running;
float sampleRate;
float sampleTime;
std::mutex mutex;
std::thread thread;
VIPMutex vipMutex;
// Parameter interpolation
Module *smoothModule;
int smoothParamId;
float smoothValue;

} engine;

struct {
std::string globalDir;
std::string localDir;
} asset;

struct {
KeyboardDriver *driver;
} keyboard;

struct {
std::vector<int> driverIds;
std::map<int, MidiDriver*> drivers;
} midi;

struct {
std::list<Plugin*> gPlugins;
std::string gToken;

bool isDownloading;
float downloadProgress;
std::string downloadName;
std::string loginStatus;
} plugin;

struct {
bool gSkipAutosaveOnLaunch;
} settings;

struct {
FILE *logFile;
std::chrono::high_resolution_clock::time_point startTime;
} logger;

struct {
uint64_t xoroshiro128plus_state[2] = {};
} random;

// struct {
// } plugins;

#ifdef USE_VST2
struct {
int last_seen_instance_count;
const char *program_dir;

float *const*inputs;
float **outputs;
unsigned int frame_idx;
unsigned int last_seen_num_frames;

VSTPluginWrapper *wrapper;
VSTMidiInputDevice *midi_device;

int next_unique_param_base_id;
std::vector<VST2QueuedParam> queued_params;

bool b_patch_loading;
} vst2;
#endif // USE_VST2

void init(void) {
gPaused = false;
gPowerMeter = false;

engine.running = false;
engine.sampleRate = 44100.0f;
engine.smoothModule = NULL;

keyboard.driver = NULL;

plugin.isDownloading = false;
plugin.downloadProgress = 0.0;

settings.gSkipAutosaveOnLaunch = false;

logger.logFile = NULL;

random.xoroshiro128plus_state[0] = 0;
random.xoroshiro128plus_state[1] = 0;

#ifdef USE_VST2
vst2.midi_device = NULL;
vst2.next_unique_param_base_id = 1;
vst2.b_patch_loading = false;
#endif
}

};


} // namespace rack

+ 18
- 0
include/global_pre.hpp View File

@@ -0,0 +1,18 @@
#pragma once


#include "../dep/yac/yac.h"

namespace rack {


struct Global;
struct GlobalUI;
extern YAC_TLS Global *global;
extern YAC_TLS GlobalUI *global_ui;

struct KeyboardDriver;



} // namespace rack

+ 138
- 0
include/global_ui.hpp View File

@@ -0,0 +1,138 @@
#pragma once

#include <set>
#include <map>

#include "util/math.hpp" // Vec
#include "tags.hpp" // ModelTag enum
#include "widgets.hpp"


struct GLFWwindow;
struct NVGcontext;


namespace rack {


struct Font;
struct Widget;
struct RackWidget;
struct Toolbar;
struct RackScene;
struct Scene;
struct Model;


//
// the structure fields reflect the original file locations
// (e.g. 'window' was originally located in 'window.cpp')
//
struct GlobalUI {

struct {
GLFWwindow *gWindow;
NVGcontext *gVg;
NVGcontext *gFramebufferVg;
std::shared_ptr<Font> gGuiFont;
float gPixelRatio;
float gWindowRatio;
bool gAllowCursorLock;
int gGuiFrame;
Vec gMousePos;

std::string lastWindowTitle;

int windowX;
int windowY;
int windowWidth;
int windowHeight;

std::map<std::string, std::weak_ptr<Font>> font_cache;
std::map<std::string, std::weak_ptr<Image>> image_cache;
std::map<std::string, std::weak_ptr<SVG>> svg_cache;
} window;

struct {
Widget *gHoveredWidget;
Widget *gDraggedWidget;
Widget *gDragHoveredWidget;
Widget *gFocusedWidget;
Widget *gTempWidget;
} widgets;

struct {
Scene *gScene;
} ui;

struct {
std::set<Model*> sFavoriteModels;
std::string sAuthorFilter;
ModelTag sTagFilter;
} module_browser;

struct {
std::string gApplicationName;
std::string gApplicationVersion;
std::string gApiHost;
std::string gLatestVersion;
bool gCheckVersion;

RackWidget *gRackWidget;
Toolbar *gToolbar;
RackScene *gRackScene;
} app;

#ifdef USE_VST2
struct {
volatile int b_close_window;
volatile int b_hide_window;
} vst2;
#endif // USE_VST2

void init(void) {
window.gWindow = NULL;
window.gVg = NULL;
window.gFramebufferVg = NULL;
window.gPixelRatio = 1.0;
window.gWindowRatio = 1.0;
#ifdef USE_VST2
window.gAllowCursorLock = false;
#else
window.gAllowCursorLock = true;
#endif // USE_VST2
window.windowX = 0;
window.windowY = 0;
window.windowWidth = 0;
window.windowHeight = 0;

widgets.gHoveredWidget = NULL;
widgets.gDraggedWidget = NULL;
widgets.gDragHoveredWidget = NULL;
widgets.gFocusedWidget = NULL;
widgets.gTempWidget = NULL;

ui.gScene = NULL;

module_browser.sTagFilter = ModelTag::NO_TAG;

app.gApplicationName = "VeeSeeVST Rack";
app.gApplicationVersion = TOSTRING(VERSION);
app.gApiHost = "https://api.vcvrack.com";
// app.gApiHost = "http://localhost:8081";
app.gCheckVersion = true;

app.gRackWidget = NULL;
app.gToolbar = NULL;
app.gRackScene = NULL;

#ifdef USE_VST2
vst2.b_close_window = 0;
vst2.b_hide_window = 0;
#endif // USE_VST2
}

};


} // namespace rack

+ 26
- 2
include/plugin.hpp View File

@@ -125,5 +125,29 @@ extern std::string gToken;
/** Called once to initialize and return the Plugin instance.
You must implement this in your plugin
*/
extern "C"
void init(rack::Plugin *plugin);
#ifdef _MSC_VER
// (note) turns out that VCV plugins don't work when the VCV engine itself is a DLL
// #define RACK_PLUGIN_EXPORT __declspec(dllexport)
#define RACK_PLUGIN_EXPORT
#else
#define RACK_PLUGIN_EXPORT
#endif

#define RACK_PLUGIN_INIT_ID_INTERNAL p->slug = TOSTRING(SLUG); p->version = TOSTRING(VERSION)

#ifdef USE_VST2
#define RACK_PLUGIN_DECLARE(pluginname)
#define RACK_PLUGIN_INIT(pluginname) extern "C" void init_plugin_##pluginname##(rack::Plugin *p)
#define RACK_PLUGIN_INIT_ID() RACK_PLUGIN_INIT_ID_INTERNAL
#else
#define RACK_PLUGIN_DECLARE(pluginname) extern Plugin *plugin
#define RACK_PLUGIN_INIT(pluginname) extern "C" RACK_PLUGIN_EXPORT void init(rack::Plugin *p)
#define RACK_PLUGIN_INIT_ID() plugin = p; RACK_PLUGIN_INIT_ID_INTERNAL
#endif // USE_VST2

#define RACK_PLUGIN_INIT_WEBSITE(url) p->website = url
#define RACK_PLUGIN_INIT_MANUAL(url) p->manual = url

#define RACK_PLUGIN_MODEL_DECLARE(pluginname, modelname) extern Model *create_model_##pluginname##_##modelname##(void)
#define RACK_PLUGIN_MODEL_INIT(pluginname, modelname) Model *create_model_##pluginname##_##modelname##(void)
#define RACK_PLUGIN_MODEL_ADD(pluginname, modelname) p->addModel(create_model_##pluginname##_##modelname##())

+ 4
- 0
include/rack.hpp View File

@@ -88,5 +88,9 @@ DEPRECATED TModuleLightWidget *createLight(Vec pos, Module *module, int firstLig
return light;
}

// Rack instance, stores global states
struct Rack {
};


} // namespace rack

+ 5
- 0
include/rtmidi.hpp View File

@@ -3,12 +3,17 @@
#include "midi.hpp"
#include <map>

#ifdef __GNUC__
#pragma GCC diagnostic push
#ifndef __clang__
#pragma GCC diagnostic ignored "-Wsuggest-override"
#endif
#include "rtmidi/RtMidi.h"
#pragma GCC diagnostic pop
#else
#include "rtmidi/RtMidi.h"
#endif // __GNUC__



namespace rack {


+ 4
- 0
include/util/common.hpp View File

@@ -52,7 +52,11 @@ Example:
#define ENUMS(name, count) name, name ## _LAST = name + (count) - 1

/** Deprecation notice for GCC */
#ifdef _MSC_VER
#define DEPRECATED
#else
#define DEPRECATED __attribute__ ((deprecated))
#endif


/** References binary files compiled into the program.


+ 35
- 0
include/vstmidi.hpp View File

@@ -0,0 +1,35 @@
#pragma once

#include "midi.hpp"
#include <map>


namespace rack {

#define VST_DRIVER (-0x4489)


struct VSTMidiInputDevice : MidiInputDevice {

VSTMidiInputDevice(int driverId, int deviceId);
~VSTMidiInputDevice();
};


struct VSTMidiDriver : MidiDriver {
VSTMidiInputDevice *device;

VSTMidiDriver(int driverId);
~VSTMidiDriver();
std::string getName() override;
std::vector<int> getInputDeviceIds() override;
std::string getInputDeviceName(int deviceId) override;
MidiInputDevice *subscribeInputDevice(int deviceId, MidiInput *midiInput) override;
void unsubscribeInputDevice(int deviceId, MidiInput *midiInput) override;
};


void vstmidiInit();


} // namespace rack

+ 2
- 0
include/window.hpp View File

@@ -12,6 +12,8 @@
#endif


extern const char *g_program_dir;

namespace rack {




+ 99
- 0
make.objects View File

@@ -0,0 +1,99 @@
LIB_OBJ= \
dep/jpommier-pffft-29e4f76ac53b/fftpack.o \
dep/jpommier-pffft-29e4f76ac53b/pffft.o \
dep/nanovg/src/nanovg.o \
dep/osdialog/osdialog.o \
dep/osdialog/osdialog_win.o \
src/app/app.o \
src/app/AudioWidget.o \
src/app/CircularShadow.o \
src/app/Knob.o \
src/app/LedDisplay.o \
src/app/LightWidget.o \
src/app/MidiWidget.o \
src/app/ModuleBrowser.o \
src/app/ModuleLightWidget.o \
src/app/ModuleWidget.o \
src/app/MomentarySwitch.o \
src/app/MultiLightWidget.o \
src/app/Panel.o \
src/app/ParamWidget.o \
src/app/PluginManagerWidget.o \
src/app/Port.o \
src/app/RackRail.o \
src/app/RackScene.o \
src/app/RackScrollWidget.o \
src/app/RackWidget.o \
src/app/SpriteKnob.o \
src/app/SVGButton.o \
src/app/SVGKnob.o \
src/app/SVGPanel.o \
src/app/SVGPort.o \
src/app/SVGScrew.o \
src/app/SVGSlider.o \
src/app/SVGSwitch.o \
src/app/ToggleSwitch.o \
src/app/Toolbar.o \
src/app/WireContainer.o \
src/app/WireWidget.o \
src/asset.o \
src/audio.o \
src/Core/AudioInterface.o \
src/Core/Blank.o \
src/Core/Core.o \
src/Core/MIDICCToCVInterface.o \
src/Core/MIDIToCVInterface.o \
src/Core/MIDITriggerToCVInterface.o \
src/Core/Notes.o \
src/Core/QuadMIDIToCVInterface.o \
src/dsp/minblep.o \
src/engine.o \
src/keyboard.o \
src/midi.o \
src/plugin.o \
src/settings.o \
src/tags.o \
src/ui/Button.o \
src/ui/ChoiceButton.o \
src/ui/IconButton.o \
src/ui/Label.o \
src/ui/layouts.o \
src/ui/List.o \
src/ui/Menu.o \
src/ui/MenuItem.o \
src/ui/MenuLabel.o \
src/ui/MenuOverlay.o \
src/ui/MenuSeparator.o \
src/ui/PasswordField.o \
src/ui/ProgressBar.o \
src/ui/RadioButton.o \
src/ui/Scene.o \
src/ui/ScrollWidget.o \
src/ui/Slider.o \
src/ui/TextField.o \
src/ui/Tooltip.o \
src/ui/ui.o \
src/ui/WindowWidget.o \
src/util/color.o \
src/util/logger.o \
src/util/random.o \
src/util/request.o \
src/util/string.o \
src/util/system.o \
src/widgets/FramebufferWidget.o \
src/widgets/QuantityWidget.o \
src/widgets/SpriteWidget.o \
src/widgets/SVGWidget.o \
src/widgets/TransformWidget.o \
src/widgets/Widget.o \
src/widgets/widgets.o \
src/widgets/ZoomWidget.o \
src/window.o \
src/vstmidi.o

MAIN_OBJ= \
src/vst2_main.o \
src/main.o

# src/bridge.o
# src/rtmidi.o

+ 30
- 0
makefile.msvc View File

@@ -0,0 +1,30 @@
#
# Makefile for VCV rack lib + Microsoft Visual C++ 2003 / 2005 / 2008 / 2017 ToolKit
#
#

NUM_JOBS=20

.PHONY:
bin: vst

.PHONY:
lib:
make -f makefile_lib.msvc bin -j $(NUM_JOBS)

.PHONY:
vst: lib
make -f makefile_vst_instr.msvc bin -j $(NUM_JOBS)
rm -f src/vst2_main.o
make -f makefile_vst_effect.msvc bin -j $(NUM_JOBS)
# (note) cannot use both instrument and effect plugin at the same time!
mv veeseevstrack_instr.dll vst2_bin/veeseevstrack_instr.dll__
mv veeseevstrack_effect.dll vst2_bin/
@ls -l vst2_bin/veeseevstrack_instr.dll__
@ls -l vst2_bin/veeseevstrack_effect.dll

clean:
make -f makefile_lib.msvc clean
make -f makefile_vst_instr.msvc clean
make -f makefile_vst_effect.msvc clean


+ 21
- 0
makefile_lib.msvc View File

@@ -0,0 +1,21 @@
#
# Makefile for VCV rack lib + Microsoft Visual C++ 2003 / 2005 / 2008 ToolKit
#
#

include dep/yac/install_msvc.mk

TARGET_BASENAME=Rack

EXTRAFLAGS= -DVERSION=0.6.1 -DARCH_WIN -D_USE_MATH_DEFINES -DRACK_HOST -DUSE_VST2 -Iinclude/ -Idep/include

EXTRALIBS= -LIBPATH:dep/lib/msvc/ jansson.lib
# glew.lib glfw.lib gdi32.lib user32.lib kernel32.lib

PLAF_OBJ=

include make.objects

ALL_OBJ=$(LIB_OBJ)

include dep/yac/staticlib_msvc.mk

+ 9
- 0
makefile_vst_effect.msvc View File

@@ -0,0 +1,9 @@

PLUGIN_DIR=plugins/community/repos/

include dep/yac/install_msvc.mk

TARGET_BASENAME=veeseevstrack_effect

EXTRAFLAGS+= -DVST2_EFFECT
include vst2_common.mk

+ 8
- 0
makefile_vst_instr.msvc View File

@@ -0,0 +1,8 @@

PLUGIN_DIR=plugins/community/repos/

include dep/yac/install_msvc.mk

TARGET_BASENAME=veeseevstrack_instr

include vst2_common.mk

+ 6
- 26
res/Core/AudioInterface.svg View File

@@ -14,7 +14,7 @@
viewBox="0 0 50.799999 128.4993"
version="1.1"
id="svg48736"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="AudioInterface.svg">
<defs
id="defs48730" />
@@ -26,10 +26,10 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="250.93456"
inkscape:cx="166.83936"
inkscape:cy="222.506"
inkscape:document-units="mm"
inkscape:current-layer="layer6"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
@@ -37,8 +37,8 @@
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-width="1920"
inkscape:window-height="1200"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
@@ -51,7 +51,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -106,26 +106,6 @@
id="path44512"
d="m 363.97847,3.669412 c 0,-0.551215 -0.44924,-1.000451 -0.99908,-1.000451 h -19.28288 c -0.54984,0 -0.99908,0.449236 -0.99908,1.000451 V 15.84163 c 0,0.54983 0.44924,1.00045 0.99908,1.00045 h 19.28288 c 0.54984,0 0.99908,-0.45062 0.99908,-1.00045 z m 0,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path44514"
d="m 362.18564,39.60727 c -0.11713,0 -0.22462,-0.0661 -0.27698,-0.17088 l -1.00184,-2.00504 c -0.0758,-0.15297 -0.0152,-0.33762 0.13781,-0.41341 0.15158,-0.0772 0.33762,-0.0152 0.41341,0.1378 l 0.7276,1.45246 0.72623,-1.45246 c 0.0758,-0.15296 0.26045,-0.21497 0.41341,-0.1378 0.15296,0.0758 0.21359,0.26044 0.1378,0.41341 l -1.00183,2.00504 c -0.0524,0.10474 -0.15985,0.17088 -0.27561,0.17088"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path44516"
d="m 367.69091,39.60727 c -0.11714,0 -0.22325,-0.0661 -0.27561,-0.17088 l -1.00321,-2.00504 c -0.0758,-0.15297 -0.0138,-0.33762 0.13918,-0.41341 0.15158,-0.0772 0.33762,-0.0152 0.41341,0.1378 l 0.72623,1.45246 0.72622,-1.45246 c 0.0758,-0.15296 0.26183,-0.21497 0.41341,-0.1378 0.15297,0.0758 0.21498,0.26044 0.13781,0.41341 l -1.00184,2.00504 c -0.0524,0.10474 -0.15847,0.17088 -0.2756,0.17088"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path44518"
d="m 365.08779,39.60727 c -0.72347,0 -1.31051,-0.58842 -1.31051,-1.31189 0,-0.72209 0.58704,-1.31052 1.31051,-1.31052 0.28663,0 0.55811,0.091 0.78686,0.26183 0.13505,0.10335 0.16261,0.29628 0.0606,0.43271 -0.10197,0.13642 -0.2949,0.16398 -0.43132,0.0606 -0.12127,-0.0896 -0.26459,-0.13918 -0.41617,-0.13918 -0.3831,0 -0.69453,0.31282 -0.69453,0.69453 0,0.38309 0.31143,0.69453 0.69453,0.69453 0.15158,0 0.2949,-0.0482 0.41617,-0.13918 0.13642,-0.10198 0.32935,-0.0744 0.43132,0.062 0.10198,0.13643 0.0744,0.32935 -0.0606,0.43132 -0.22875,0.17226 -0.50023,0.26321 -0.78686,0.26321"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path44520"
d="m 365.50809,38.28022 c 0,0.22186 -0.17914,0.40101 -0.40101,0.40101 -0.22048,0 -0.39963,-0.17915 -0.39963,-0.40101 0,-0.22186 0.17915,-0.40101 0.39963,-0.40101 0.22187,0 0.40101,0.17915 0.40101,0.40101"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.35277775"


+ 8
- 28
res/Core/MIDICCToCVInterface.svg View File

@@ -14,7 +14,7 @@
viewBox="0 0 50.799999 128.4993"
version="1.1"
id="svg35238"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="MIDICCToCVInterface.svg">
<defs
id="defs35232" />
@@ -26,7 +26,7 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="226.99608"
inkscape:cx="142.90088"
inkscape:cy="249.91512"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
@@ -37,11 +37,11 @@
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
inkscape:window-width="1920"
inkscape:window-height="1137"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata35235">
<rdf:RDF>
@@ -50,7 +50,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -69,26 +69,6 @@
id="path3833"
d="m -14.665476,84.583683 h -50.8 V 213.08298 h 50.8 z M -14.852891,212.89557 H -65.278063 V 84.769721 h 50.425172 z m 0,0"
style="fill:#ababab;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path5999"
d="m -42.818798,208.9406 c -0.115753,0 -0.223241,-0.0661 -0.275607,-0.17088 l -1.001833,-2.00504 c -0.07717,-0.15297 -0.01517,-0.33762 0.137802,-0.41341 0.151585,-0.0772 0.337623,-0.0152 0.413413,0.1378 l 0.726225,1.45246 0.727604,-1.45246 c 0.07579,-0.15296 0.260449,-0.21497 0.413414,-0.1378 0.151585,0.0758 0.213596,0.26044 0.137802,0.41341 l -1.001833,2.00504 c -0.05237,0.10474 -0.159854,0.17088 -0.276987,0.17088"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path6001"
d="m -37.312156,208.9406 c -0.117133,0 -0.22462,-0.0661 -0.276987,-0.17088 l -1.001831,-2.00504 c -0.07579,-0.15297 -0.01378,-0.33762 0.1378,-0.41341 0.152966,-0.0772 0.337619,-0.0152 0.413414,0.1378 l 0.727604,1.45246 0.726226,-1.45246 c 0.07579,-0.15296 0.261826,-0.21497 0.413411,-0.1378 0.152961,0.0758 0.214974,0.26044 0.137803,0.41341 l -1.001831,2.00504 c -0.05237,0.10474 -0.159856,0.17088 -0.275609,0.17088"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path6003"
d="m -39.915271,208.9406 c -0.72347,0 -1.311892,-0.58842 -1.311892,-1.31189 0,-0.72209 0.588422,-1.31052 1.311892,-1.31052 0.286632,0 0.558105,0.091 0.78686,0.26183 0.135048,0.10335 0.162609,0.29628 0.06064,0.43271 -0.101978,0.13642 -0.296281,0.16398 -0.431328,0.0606 -0.121267,-0.0896 -0.264583,-0.13918 -0.416168,-0.13918 -0.383095,0 -0.694531,0.31282 -0.694531,0.69453 0,0.38309 0.311436,0.69453 0.694531,0.69453 0.151585,0 0.294901,-0.0482 0.416168,-0.13918 0.135047,-0.10198 0.32935,-0.0744 0.431328,0.062 0.101973,0.13643 0.07441,0.32935 -0.06064,0.43132 -0.228755,0.17226 -0.500228,0.26321 -0.78686,0.26321"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path6005"
d="m -39.494968,207.61355 c 0,0.22186 -0.179144,0.40101 -0.40101,0.40101 -0.221865,0 -0.401009,-0.17915 -0.401009,-0.40101 0,-0.22186 0.179144,-0.40101 0.401009,-0.40101 0.221866,0 0.40101,0.17915 0.40101,0.40101"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.35277775"


+ 5
- 25
res/Core/MIDIToCVInterface.svg View File

@@ -14,7 +14,7 @@
viewBox="0 0 40.64109 128.4993"
version="1.1"
id="svg33989"
inkscape:version="0.92.2 2405546, 2018-03-11"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="MIDIToCVInterface.svg">
<defs
id="defs33983" />
@@ -26,7 +26,7 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="65.955205"
inkscape:cx="-18.139994"
inkscape:cy="239.87477"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
@@ -35,8 +35,8 @@
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-width="1920"
inkscape:window-height="1200"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
@@ -48,7 +48,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -67,26 +67,6 @@
id="path22734"
d="M 205.33989,31.856005 H 164.6988 V 160.3553 h 40.64109 z M 205.15246,160.16789 H 164.88619 V 32.042042 h 40.26627 z m 0,0"
style="fill:#ababab;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path22762"
d="m 182.266,156.21292 c -0.11574,0 -0.22324,-0.0661 -0.27559,-0.17088 l -1.00185,-2.00504 c -0.0758,-0.15297 -0.0152,-0.33762 0.13783,-0.41341 0.15155,-0.0772 0.33761,-0.0152 0.41338,0.1378 l 0.72623,1.45246 0.72761,-1.45246 c 0.0758,-0.15296 0.26045,-0.21497 0.41342,-0.1378 0.15159,0.0758 0.2136,0.26044 0.13779,0.41341 l -1.00182,2.00504 c -0.0524,0.10474 -0.15984,0.17088 -0.277,0.17088"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path22764"
d="m 187.77265,156.21292 c -0.11712,0 -0.22461,-0.0661 -0.27559,-0.17088 l -1.00323,-2.00504 c -0.0758,-0.15297 -0.0138,-0.33762 0.1378,-0.41341 0.15296,-0.0772 0.33764,-0.0152 0.41479,0.1378 l 0.72623,1.45246 0.72623,-1.45246 c 0.0758,-0.15296 0.26183,-0.21497 0.41342,-0.1378 0.15296,0.0758 0.21495,0.26044 0.1378,0.41341 l -1.00182,2.00504 c -0.0524,0.10474 -0.15851,0.17088 -0.27563,0.17088"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path22766"
d="m 185.16954,156.21292 c -0.72348,0 -1.31191,-0.58842 -1.31191,-1.31189 0,-0.72209 0.58843,-1.31052 1.31191,-1.31052 0.28526,0 0.55809,0.091 0.78549,0.26183 0.13642,0.10335 0.16398,0.29628 0.062,0.43271 -0.10195,0.13642 -0.29488,0.16398 -0.4313,0.0606 -0.12129,-0.0896 -0.26458,-0.13918 -0.41617,-0.13918 -0.38308,0 -0.69455,0.31282 -0.69455,0.69453 0,0.38309 0.31147,0.69453 0.69455,0.69453 0.15159,0 0.29488,-0.0482 0.41617,-0.13918 0.13642,-0.10198 0.32935,-0.0744 0.4313,0.062 0.10199,0.13643 0.0744,0.32935 -0.062,0.43132 -0.2274,0.17226 -0.50023,0.26321 -0.78549,0.26321"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path22768"
d="m 185.58984,154.88587 c 0,0.22186 -0.17914,0.40101 -0.401,0.40101 -0.22187,0 -0.40101,-0.17915 -0.40101,-0.40101 0,-0.22186 0.17914,-0.40101 0.40101,-0.40101 0.22186,0 0.401,0.17915 0.401,0.40101"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.35277775"


+ 6
- 26
res/Core/MIDITriggerToCVInterface.svg View File

@@ -14,7 +14,7 @@
viewBox="0 0 50.800003 128.4993"
version="1.1"
id="svg17475"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="MIDITriggerToCVInterface.svg">
<defs
id="defs17469" />
@@ -26,7 +26,7 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="219.75398"
inkscape:cx="135.65878"
inkscape:cy="223.67913"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
@@ -36,9 +36,9 @@
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1274"
inkscape:window-height="1434"
inkscape:window-x="1280"
inkscape:window-y="0"
inkscape:window-height="1200"
inkscape:window-x="351"
inkscape:window-y="11"
inkscape:window-maximized="0" />
<metadata
id="metadata17472">
@@ -48,7 +48,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -67,26 +67,6 @@
id="path6954"
d="M 116.11429,40.738445 H 65.314286 V 169.23775 h 50.800004 z m -0.1874,128.311895 H 65.501717 V 40.924483 h 50.425173 z m 0,0"
style="fill:#ababab;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path10954"
d="m 87.960961,165.09537 c -0.115747,0 -0.223238,-0.0661 -0.27559,-0.17088 l -1.001854,-2.00504 c -0.07578,-0.15297 -0.01517,-0.33762 0.13783,-0.41341 0.151554,-0.0772 0.337609,-0.0152 0.413385,0.1378 l 0.726229,1.45246 0.727604,-1.45246 c 0.07581,-0.15296 0.260456,-0.21497 0.41342,-0.1378 0.151589,0.0758 0.213607,0.26044 0.137795,0.41341 l -1.001818,2.00504 c -0.05239,0.10474 -0.159844,0.17088 -0.277001,0.17088"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path10956"
d="m 93.467609,165.09537 c -0.117121,0 -0.224613,-0.0661 -0.27559,-0.17088 l -1.003229,-2.00504 c -0.07578,-0.15297 -0.01376,-0.33762 0.137795,-0.41341 0.152964,-0.0772 0.337643,-0.0152 0.414796,0.1378 l 0.726228,1.45246 0.726228,-1.45246 c 0.07578,-0.15296 0.261832,-0.21497 0.413422,-0.1378 0.152964,0.0758 0.214948,0.26044 0.137795,0.41341 l -1.001818,2.00504 c -0.05239,0.10474 -0.158504,0.17088 -0.275627,0.17088"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path10958"
d="m 90.864498,165.09537 c -0.723477,0 -1.31191,-0.58842 -1.31191,-1.31189 0,-0.72209 0.588433,-1.31052 1.31191,-1.31052 0.285256,0 0.558095,0.091 0.785495,0.26183 0.136419,0.10335 0.16397,0.29628 0.06198,0.43271 -0.101953,0.13642 -0.294887,0.16398 -0.431306,0.0606 -0.121285,-0.0896 -0.264583,-0.13918 -0.416172,-0.13918 -0.383081,0 -0.694549,0.31282 -0.694549,0.69453 0,0.38309 0.311468,0.69453 0.694549,0.69453 0.151589,0 0.294887,-0.0482 0.416172,-0.13918 0.136419,-0.10198 0.329353,-0.0744 0.431306,0.062 0.101987,0.13643 0.07444,0.32935 -0.06198,0.43132 -0.2274,0.17226 -0.500239,0.26321 -0.785495,0.26321"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path10960"
d="m 91.284798,163.76832 c 0,0.22186 -0.179141,0.40101 -0.401003,0.40101 -0.221862,0 -0.401002,-0.17915 -0.401002,-0.40101 0,-0.22186 0.17914,-0.40101 0.401002,-0.40101 0.221862,0 0.401003,0.17915 0.401003,0.40101"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.35277775"


+ 8
- 28
res/Core/Notes.svg View File

@@ -14,7 +14,7 @@
viewBox="0 0 81.279434 128.4993"
version="1.1"
id="svg30767"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="Notes.svg">
<defs
id="defs30761" />
@@ -26,7 +26,7 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="163.70046"
inkscape:cx="79.605261"
inkscape:cy="242.83332"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
@@ -35,11 +35,11 @@
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0"
inkscape:window-width="1920"
inkscape:window-height="1137"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true" />
<metadata
@@ -50,7 +50,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -70,26 +70,6 @@
id="path3837"
d="M 111.83658,52.92097 H 30.557143 v 128.4993 h 81.279437 z m -0.18739,128.31189 H 30.74318 V 53.107008 h 80.90601 z m 0,0"
style="fill:#ababab;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path6935"
d="m 68.44354,177.27789 c -0.117124,0 -0.22324,-0.0661 -0.27559,-0.17088 l -1.001856,-2.00504 c -0.07715,-0.15297 -0.01516,-0.33762 0.137832,-0.41341 0.151554,-0.0772 0.337609,-0.0152 0.413385,0.1378 l 0.726229,1.45246 0.727604,-1.45246 c 0.07581,-0.15296 0.260456,-0.21497 0.413419,-0.1378 0.151588,0.0758 0.213606,0.26044 0.137795,0.41341 l -1.003194,2.00504 c -0.05239,0.10474 -0.158467,0.17088 -0.275624,0.17088"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path6937"
d="m 73.948812,177.27789 c -0.115747,0 -0.223237,-0.0661 -0.275624,-0.17088 l -1.001818,-2.00504 c -0.07578,-0.15297 -0.01516,-0.33762 0.137795,-0.41341 0.151587,-0.0772 0.337642,-0.0152 0.413419,0.1378 l 0.726228,1.45246 0.727604,-1.45246 c 0.07578,-0.15296 0.260456,-0.21497 0.41342,-0.1378 0.152966,0.0758 0.213572,0.26044 0.137795,0.41341 l -1.001818,2.00504 c -0.05239,0.10474 -0.159878,0.17088 -0.277001,0.17088"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path6939"
d="m 71.345701,177.27789 c -0.722101,0 -1.310534,-0.58842 -1.310534,-1.31189 0,-0.72209 0.588433,-1.31052 1.310534,-1.31052 0.286631,0 0.55947,0.091 0.786871,0.26183 0.136419,0.10335 0.16397,0.29628 0.06198,0.43271 -0.101952,0.13642 -0.296262,0.16398 -0.432681,0.0606 -0.119909,-0.0896 -0.264583,-0.13918 -0.416171,-0.13918 -0.381706,0 -0.693174,0.31282 -0.693174,0.69453 0,0.38309 0.311468,0.69453 0.693174,0.69453 0.151588,0 0.296262,-0.0482 0.416171,-0.13918 0.136419,-0.10198 0.330729,-0.0744 0.432681,0.062 0.101989,0.13643 0.07444,0.32935 -0.06198,0.43132 -0.227401,0.17226 -0.50024,0.26321 -0.786871,0.26321"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path6941"
d="m 71.767376,175.95084 c 0,0.22186 -0.179142,0.40101 -0.401003,0.40101 -0.221861,0 -0.401002,-0.17915 -0.401002,-0.40101 0,-0.22186 0.179141,-0.40101 0.401002,-0.40101 0.221861,0 0.401003,0.17915 0.401003,0.40101"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.35277775"


+ 6
- 26
res/Core/QuadMIDIToCVInterface.svg View File

@@ -14,7 +14,7 @@
viewBox="0 0 50.799999 128.4993"
version="1.1"
id="svg11827"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="QuadMIDIToCVInterface.svg">
<defs
id="defs11821" />
@@ -29,7 +29,7 @@
inkscape:cx="182.22871"
inkscape:cy="273.03255"
inkscape:document-units="mm"
inkscape:current-layer="layer2"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
@@ -37,11 +37,11 @@
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-nodes="true"
inkscape:window-width="2560"
inkscape:window-height="1422"
inkscape:window-width="1920"
inkscape:window-height="1200"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="0" />
inkscape:window-maximized="1" />
<metadata
id="metadata11824">
<rdf:RDF>
@@ -50,7 +50,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -74,26 +74,6 @@
id="path4075"
d="m 121.2713,60.304029 c 0,-0.549839 -0.45062,-0.99908 -1.00046,-0.99908 H 77.78868 c -0.549836,0 -0.999077,0.449241 -0.999077,0.99908 v 12.172209 c 0,0.551215 0.449241,1.000456 0.999077,1.000456 h 42.48216 c 0.54984,0 1.00046,-0.449241 1.00046,-1.000456 z m 0,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path4079"
d="m 96.27782,128.24269 c -0.117133,0 -0.224621,-0.0661 -0.276987,-0.17088 L 94.999,126.06677 c -0.07579,-0.15297 -0.01379,-0.33762 0.137802,-0.41341 0.152965,-0.0772 0.337619,-0.0152 0.413413,0.1378 l 0.727605,1.45246 0.726224,-1.45246 c 0.07579,-0.15296 0.261828,-0.21497 0.413414,-0.1378 0.15296,0.0758 0.213596,0.26044 0.137802,0.41341 l -1.001833,2.00504 c -0.05237,0.10474 -0.159854,0.17088 -0.275607,0.17088"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path4081"
d="m 101.78308,128.24269 c -0.11713,0 -0.22324,-0.0661 -0.27561,-0.17088 l -1.00321,-2.00504 c -0.0758,-0.15297 -0.0138,-0.33762 0.13919,-0.41341 0.15158,-0.0772 0.33761,-0.0152 0.4134,0.1378 l 0.72623,1.45246 0.72623,-1.45246 c 0.0758,-0.15296 0.26182,-0.21497 0.41341,-0.1378 0.15296,0.0758 0.21497,0.26044 0.1378,0.41341 l -1.00183,2.00504 c -0.0524,0.10474 -0.15847,0.17088 -0.27561,0.17088"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path4083"
d="m 99.179967,128.24269 c -0.72347,0 -1.310513,-0.58842 -1.310513,-1.31189 0,-0.72209 0.587043,-1.31052 1.310513,-1.31052 0.286632,0 0.558105,0.091 0.78686,0.26183 0.136423,0.10335 0.162613,0.29628 0.06063,0.43271 -0.101989,0.13642 -0.294912,0.16398 -0.431339,0.0606 -0.121267,-0.0896 -0.264583,-0.13918 -0.416168,-0.13918 -0.383095,0 -0.694531,0.31282 -0.694531,0.69453 0,0.38309 0.311436,0.69453 0.694531,0.69453 0.151585,0 0.294901,-0.0482 0.416168,-0.13918 0.136427,-0.10198 0.32935,-0.0744 0.431339,0.062 0.10197,0.13643 0.0758,0.32935 -0.06063,0.43132 -0.228755,0.17226 -0.500228,0.26321 -0.78686,0.26321"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
id="path4085"
d="m 99.60027,126.91564 c 0,0.22186 -0.179147,0.40101 -0.40101,0.40101 -0.220486,0 -0.39963,-0.17915 -0.39963,-0.40101 0,-0.22186 0.179144,-0.40101 0.39963,-0.40101 0.221863,0 0.40101,0.17915 0.40101,0.40101"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.35277775" />
<path
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.35277775"


+ 20
- 1
src/Core/AudioInterface.cpp View File

@@ -1,3 +1,4 @@
#include "global_pre.hpp"
#include <assert.h>
#include <mutex>
#include <chrono>
@@ -8,6 +9,7 @@
#include "audio.hpp"
#include "dsp/samplerate.hpp"
#include "dsp/ringbuffer.hpp"
#include "global.hpp"


#define AUDIO_OUTPUTS 8
@@ -112,12 +114,14 @@ struct AudioInterface : Module {
int lastNumOutputs = -1;
int lastNumInputs = -1;

#ifndef USE_VST2
SampleRateConverter<AUDIO_INPUTS> inputSrc;
SampleRateConverter<AUDIO_OUTPUTS> outputSrc;

// in rack's sample rate
DoubleRingBuffer<Frame<AUDIO_INPUTS>, 16> inputBuffer;
DoubleRingBuffer<Frame<AUDIO_OUTPUTS>, 16> outputBuffer;
#endif // USE_VST2

AudioInterface() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
onSampleRateChange();
@@ -143,6 +147,7 @@ struct AudioInterface : Module {


void AudioInterface::step() {
#ifndef USE_VST2
// Update SRC states
int sampleRate = (int) engineGetSampleRate();
inputSrc.setRates(audioIO.sampleRate, sampleRate);
@@ -229,6 +234,17 @@ void AudioInterface::step() {
audioIO.audioCv.notify_one();
}

#else
// Outputs: rack engine -> VST out
for(int i = 0; i < AUDIO_INPUTS; i++) {
outputs[AUDIO_OUTPUT + i].value = global->vst2.inputs[i][global->vst2.frame_idx];
}
for(int i = 0; i < AUDIO_OUTPUTS; i++) {
global->vst2.outputs[i][global->vst2.frame_idx] += inputs[AUDIO_INPUT + i].value;
}
#endif // USE_VST2


// Turn on light if at least one port is enabled in the nearby pair
for (int i = 0; i < AUDIO_INPUTS / 2; i++)
lights[INPUT_LIGHT + i].value = (audioIO.active && audioIO.numOutputs >= 2*i+1);
@@ -281,4 +297,7 @@ struct AudioInterfaceWidget : ModuleWidget {
};


Model *modelAudioInterface = Model::create<AudioInterface, AudioInterfaceWidget>("Core", "AudioInterface", "Audio", EXTERNAL_TAG);
RACK_PLUGIN_MODEL_INIT(Core, AudioInterface) {
Model *modelAudioInterface = Model::create<AudioInterface, AudioInterfaceWidget>("Core", "AudioInterface", "Audio", EXTERNAL_TAG);
return modelAudioInterface;
}

+ 10
- 4
src/Core/Blank.cpp View File

@@ -1,4 +1,6 @@
#include "global_pre.hpp"
#include "Core.hpp"
#include "global_ui.hpp"

using namespace rack;

@@ -17,14 +19,14 @@ struct ModuleResizeHandle : Widget {
}
}
void onDragStart(EventDragStart &e) override {
dragX = gRackWidget->lastMousePos.x;
dragX = global_ui->app.gRackWidget->lastMousePos.x;
ModuleWidget *m = getAncestorOfType<ModuleWidget>();
originalBox = m->box;
}
void onDragMove(EventDragMove &e) override {
ModuleWidget *m = getAncestorOfType<ModuleWidget>();

float newDragX = gRackWidget->lastMousePos.x;
float newDragX = global_ui->app.gRackWidget->lastMousePos.x;
float deltaX = newDragX - dragX;

Rect newBox = originalBox;
@@ -40,7 +42,7 @@ struct ModuleResizeHandle : Widget {
newBox.size.x = roundf(newBox.size.x / RACK_GRID_WIDTH) * RACK_GRID_WIDTH;
newBox.pos.x = originalBox.pos.x + originalBox.size.x - newBox.size.x;
}
gRackWidget->requestModuleBox(m, newBox);
global_ui->app.gRackWidget->requestModuleBox(m, newBox);
}
void draw(NVGcontext *vg) override {
for (float x = 5.0; x <= 10.0; x += 5.0) {
@@ -120,4 +122,8 @@ struct BlankWidget : ModuleWidget {
};


Model *modelBlank = Model::create<Module, BlankWidget>("Core", "Blank", "Blank", BLANK_TAG);
RACK_PLUGIN_MODEL_INIT(Core, Blank) {
Model *modelBlank = Model::create<Module, BlankWidget>("Core", "Blank", "Blank", BLANK_TAG);
return modelBlank;
}


+ 20
- 10
src/Core/Core.cpp View File

@@ -1,15 +1,25 @@
#include "global_pre.hpp"
#include "Core.hpp"
#include "global.hpp"

RACK_PLUGIN_MODEL_DECLARE(Core, AudioInterface);
RACK_PLUGIN_MODEL_DECLARE(Core, MIDIToCVInterface);
RACK_PLUGIN_MODEL_DECLARE(Core, QuadMIDIToCVInterface);
RACK_PLUGIN_MODEL_DECLARE(Core, MIDICCToCVInterface);
RACK_PLUGIN_MODEL_DECLARE(Core, MIDITriggerToCVInterface);
RACK_PLUGIN_MODEL_DECLARE(Core, Blank);
RACK_PLUGIN_MODEL_DECLARE(Core, Notes);

void init(rack::Plugin *p) {
p->slug = "Core";
p->version = TOSTRING(VERSION);
#undef SLUG
#define SLUG Core
RACK_PLUGIN_INIT(Core) {
RACK_PLUGIN_INIT_ID_INTERNAL;

p->addModel(modelAudioInterface);
p->addModel(modelMIDIToCVInterface);
p->addModel(modelQuadMIDIToCVInterface);
p->addModel(modelMIDICCToCVInterface);
p->addModel(modelMIDITriggerToCVInterface);
p->addModel(modelBlank);
p->addModel(modelNotes);
RACK_PLUGIN_MODEL_ADD(Core, AudioInterface);
RACK_PLUGIN_MODEL_ADD(Core, MIDIToCVInterface);
RACK_PLUGIN_MODEL_ADD(Core, QuadMIDIToCVInterface);
RACK_PLUGIN_MODEL_ADD(Core, MIDICCToCVInterface);
RACK_PLUGIN_MODEL_ADD(Core, MIDITriggerToCVInterface);
RACK_PLUGIN_MODEL_ADD(Core, Blank);
RACK_PLUGIN_MODEL_ADD(Core, Notes);
}

+ 2
- 11
src/Core/Core.hpp View File

@@ -3,16 +3,7 @@

using namespace rack;


extern Model *modelAudioInterface;
extern Model *modelMIDIToCVInterface;
extern Model *modelQuadMIDIToCVInterface;
extern Model *modelMIDICCToCVInterface;
extern Model *modelMIDITriggerToCVInterface;
extern Model *modelBlank;
extern Model *modelNotes;


RACK_PLUGIN_INIT(Core);

struct GridChoice : LedDisplayChoice {
virtual void setId(int id) {}
@@ -61,4 +52,4 @@ struct Grid16MidiWidget : MidiWidget {
}
}
virtual GridChoice *createGridChoice() {return NULL;}
};
};

+ 11
- 6
src/Core/MIDICCToCVInterface.cpp View File

@@ -1,7 +1,10 @@
#include "global_pre.hpp"
#include "Core.hpp"
#include "midi.hpp"
#include "dsp/filter.hpp"
#include "window.hpp"
#include "global.hpp"
#include "global_ui.hpp"


struct MIDICCToCVInterface : Module {
@@ -129,8 +132,8 @@ struct MidiCcChoice : GridChoice {
else {
text = stringf("%d", module->learnedCcs[id]);
color.a = 1.0;
if (gFocusedWidget == this)
gFocusedWidget = NULL;
if (global_ui->widgets.gFocusedWidget == this)
global_ui->widgets.gFocusedWidget = NULL;
}
}

@@ -158,11 +161,11 @@ struct MidiCcChoice : GridChoice {
}

void onKey(EventKey &e) override {
if (gFocusedWidget == this) {
if (global_ui->widgets.gFocusedWidget == this) {
if (e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) {
EventDefocus eDefocus;
onDefocus(eDefocus);
gFocusedWidget = NULL;
global_ui->widgets.gFocusedWidget = NULL;
e.consumed = true;
}
}
@@ -215,5 +218,7 @@ struct MIDICCToCVInterfaceWidget : ModuleWidget {
}
};


Model *modelMIDICCToCVInterface = Model::create<MIDICCToCVInterface, MIDICCToCVInterfaceWidget>("Core", "MIDICCToCVInterface", "MIDI-CC", MIDI_TAG, EXTERNAL_TAG);
RACK_PLUGIN_MODEL_INIT(Core, MIDICCToCVInterface) {
Model *modelMIDICCToCVInterface = Model::create<MIDICCToCVInterface, MIDICCToCVInterfaceWidget>("Core", "MIDICCToCVInterface", "MIDI-CC", MIDI_TAG, EXTERNAL_TAG);
return modelMIDICCToCVInterface;
}

+ 6
- 1
src/Core/MIDIToCVInterface.cpp View File

@@ -1,9 +1,11 @@
#include "global_pre.hpp"
#include "Core.hpp"
#include "midi.hpp"
#include "dsp/digital.hpp"
#include "dsp/filter.hpp"

#include <algorithm>
#include "global.hpp"


struct MIDIToCVInterface : Module {
@@ -326,4 +328,7 @@ struct MIDIToCVInterfaceWidget : ModuleWidget {
};


Model *modelMIDIToCVInterface = Model::create<MIDIToCVInterface, MIDIToCVInterfaceWidget>("Core", "MIDIToCVInterface", "MIDI-1", MIDI_TAG, EXTERNAL_TAG);
RACK_PLUGIN_MODEL_INIT(Core, MIDIToCVInterface) {
Model *modelMIDIToCVInterface = Model::create<MIDIToCVInterface, MIDIToCVInterfaceWidget>("Core", "MIDIToCVInterface", "MIDI-1", MIDI_TAG, EXTERNAL_TAG);
return modelMIDIToCVInterface;
}

+ 9
- 3
src/Core/MIDITriggerToCVInterface.cpp View File

@@ -1,5 +1,8 @@
#include "global_pre.hpp"
#include "Core.hpp"
#include "midi.hpp"
#include "global.hpp"
#include "global_ui.hpp"


struct MIDITriggerToCVInterface : Module {
@@ -171,8 +174,8 @@ struct MidiTrigChoice : GridChoice {
text = stringf("%s%d", noteNames[semi], oct);
color.a = 1.0;

if (gFocusedWidget == this)
gFocusedWidget = NULL;
if (global_ui->widgets.gFocusedWidget == this)
global_ui->widgets.gFocusedWidget = NULL;
}
}

@@ -249,4 +252,7 @@ struct MIDITriggerToCVInterfaceWidget : ModuleWidget {
};


Model *modelMIDITriggerToCVInterface = Model::create<MIDITriggerToCVInterface, MIDITriggerToCVInterfaceWidget>("Core", "MIDITriggerToCVInterface", "MIDI-Trig", MIDI_TAG, EXTERNAL_TAG);
RACK_PLUGIN_MODEL_INIT(Core, MIDITriggerToCVInterface) {
Model *modelMIDITriggerToCVInterface = Model::create<MIDITriggerToCVInterface, MIDITriggerToCVInterfaceWidget>("Core", "MIDITriggerToCVInterface", "MIDI-Trig", MIDI_TAG, EXTERNAL_TAG);
return modelMIDITriggerToCVInterface;
}

+ 6
- 1
src/Core/Notes.cpp View File

@@ -1,4 +1,6 @@
#include "global_pre.hpp"
#include "Core.hpp"
#include "global.hpp"

using namespace rack;

@@ -41,4 +43,7 @@ struct NotesWidget : ModuleWidget {
};


Model *modelNotes = Model::create<Module, NotesWidget>("Core", "Notes", "Notes", BLANK_TAG);
RACK_PLUGIN_MODEL_INIT(Core, Notes) {
Model *modelNotes = Model::create<Module, NotesWidget>("Core", "Notes", "Notes", BLANK_TAG);
return modelNotes;
}

+ 6
- 2
src/Core/QuadMIDIToCVInterface.cpp View File

@@ -1,6 +1,8 @@
#include "global_pre.hpp"
#include "Core.hpp"
#include "midi.hpp"
#include "dsp/digital.hpp"
#include "global.hpp"

#include <algorithm>

@@ -366,5 +368,7 @@ struct QuadMIDIToCVInterfaceWidget : ModuleWidget {
};


Model *modelQuadMIDIToCVInterface = Model::create<QuadMIDIToCVInterface, QuadMIDIToCVInterfaceWidget>("Core", "QuadMIDIToCVInterface", "MIDI-4", MIDI_TAG, EXTERNAL_TAG, QUAD_TAG);

RACK_PLUGIN_MODEL_INIT(Core, QuadMIDIToCVInterface) {
Model *modelQuadMIDIToCVInterface = Model::create<QuadMIDIToCVInterface, QuadMIDIToCVInterfaceWidget>("Core", "QuadMIDIToCVInterface", "MIDI-4", MIDI_TAG, EXTERNAL_TAG, QUAD_TAG);
return modelQuadMIDIToCVInterface;
}

+ 20
- 4
src/app/AudioWidget.cpp View File

@@ -1,5 +1,8 @@
#include "global_pre.hpp"
#include "app.hpp"
#include "audio.hpp"
#include "global.hpp"
#include "global_ui.hpp"


namespace rack {
@@ -16,7 +19,7 @@ struct AudioDriverItem : MenuItem {
struct AudioDriverChoice : LedDisplayChoice {
AudioWidget *audioWidget;
void onAction(EventAction &e) override {
Menu *menu = gScene->createMenu();
Menu *menu = global_ui->ui.gScene->createMenu();
menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Audio driver"));
for (int driver : audioWidget->audioIO->getDrivers()) {
AudioDriverItem *item = new AudioDriverItem();
@@ -48,7 +51,7 @@ struct AudioDeviceChoice : LedDisplayChoice {
int maxTotalChannels = 128;

void onAction(EventAction &e) override {
Menu *menu = gScene->createMenu();
Menu *menu = global_ui->ui.gScene->createMenu();
menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Audio device"));
int deviceCount = audioWidget->audioIO->getDeviceCount();
{
@@ -73,6 +76,10 @@ struct AudioDeviceChoice : LedDisplayChoice {
}
}
void step() override {
#ifdef USE_VST2
text = "VST Audio I/O";
color.a = 1.f;
#else
text = audioWidget->audioIO->getDeviceDetail(audioWidget->audioIO->device, audioWidget->audioIO->offset);
if (text.empty()) {
text = "(No device)";
@@ -81,6 +88,7 @@ struct AudioDeviceChoice : LedDisplayChoice {
else {
color.a = 1.f;
}
#endif // USE_VST2
}
};

@@ -96,7 +104,7 @@ struct AudioSampleRateItem : MenuItem {
struct AudioSampleRateChoice : LedDisplayChoice {
AudioWidget *audioWidget;
void onAction(EventAction &e) override {
Menu *menu = gScene->createMenu();
Menu *menu = global_ui->ui.gScene->createMenu();
menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Sample rate"));
std::vector<int> sampleRates = audioWidget->audioIO->getSampleRates();
if (sampleRates.empty()) {
@@ -112,7 +120,11 @@ struct AudioSampleRateChoice : LedDisplayChoice {
}
}
void step() override {
#ifdef USE_VST2
text = stringf("%g kHz", global->engine.sampleRate / 1000.f);
#else
text = stringf("%g kHz", audioWidget->audioIO->sampleRate / 1000.f);
#endif
}
};

@@ -128,7 +140,7 @@ struct AudioBlockSizeItem : MenuItem {
struct AudioBlockSizeChoice : LedDisplayChoice {
AudioWidget *audioWidget;
void onAction(EventAction &e) override {
Menu *menu = gScene->createMenu();
Menu *menu = global_ui->ui.gScene->createMenu();
menu->addChild(construct<MenuLabel>(&MenuLabel::text, "Block size"));
std::vector<int> blockSizes = audioWidget->audioIO->getBlockSizes();
if (blockSizes.empty()) {
@@ -145,7 +157,11 @@ struct AudioBlockSizeChoice : LedDisplayChoice {
}
}
void step() override {
#ifdef USE_VST2
text = stringf("%u", global->vst2.last_seen_num_frames);
#else
text = stringf("%d", audioWidget->audioIO->blockSize);
#endif // USE_VST2
}
};



+ 2
- 1
src/app/Knob.cpp View File

@@ -12,7 +12,8 @@ static const float KNOB_SENSITIVITY = 0.0015f;


Knob::Knob() {
smooth = true;
// smooth = true;
smooth = false; // xxx
}

void Knob::onDragStart(EventDragStart &e) {


+ 6
- 4
src/app/LedDisplay.cpp View File

@@ -1,6 +1,8 @@
#include "global_pre.hpp"
#include "app.hpp"
#include "asset.hpp"
#include "window.hpp"
#include "global_ui.hpp"


namespace rack {
@@ -85,12 +87,12 @@ void LedDisplayTextField::draw(NVGcontext *vg) {
NVGcolor highlightColor = color;
highlightColor.a = 0.5;
int begin = min(cursor, selection);
int end = (this == gFocusedWidget) ? max(cursor, selection) : -1;
int end = (this == global_ui->widgets.gFocusedWidget) ? max(cursor, selection) : -1;
bndIconLabelCaret(vg, textOffset.x, textOffset.y,
box.size.x - 2*textOffset.x, box.size.y - 2*textOffset.y,
-1, color, 12, text.c_str(), highlightColor, begin, end);

bndSetFont(gGuiFont->handle);
bndSetFont(global_ui->window.gGuiFont->handle);
}

nvgResetScissor(vg);
@@ -98,10 +100,10 @@ void LedDisplayTextField::draw(NVGcontext *vg) {

int LedDisplayTextField::getTextPosition(Vec mousePos) {
bndSetFont(font->handle);
int textPos = bndIconLabelTextPosition(gVg, textOffset.x, textOffset.y,
int textPos = bndIconLabelTextPosition(global_ui->window.gVg, textOffset.x, textOffset.y,
box.size.x - 2*textOffset.x, box.size.y - 2*textOffset.y,
-1, 12, text.c_str(), mousePos.x, mousePos.y);
bndSetFont(gGuiFont->handle);
bndSetFont(global_ui->window.gGuiFont->handle);
return textPos;
}



+ 6
- 3
src/app/MidiWidget.cpp View File

@@ -1,5 +1,8 @@
#include "global_pre.hpp"
#include "app.hpp"
#include "midi.hpp"
#include "global.hpp"
#include "global_ui.hpp"


namespace rack {
@@ -16,7 +19,7 @@ struct MidiDriverItem : MenuItem {
struct MidiDriverChoice : LedDisplayChoice {
MidiWidget *midiWidget;
void onAction(EventAction &e) override {
Menu *menu = gScene->createMenu();
Menu *menu = global_ui->ui.gScene->createMenu();
menu->addChild(construct<MenuLabel>(&MenuLabel::text, "MIDI driver"));
for (int driverId : midiWidget->midiIO->getDriverIds()) {
MidiDriverItem *item = new MidiDriverItem();
@@ -50,7 +53,7 @@ struct MidiDeviceItem : MenuItem {
struct MidiDeviceChoice : LedDisplayChoice {
MidiWidget *midiWidget;
void onAction(EventAction &e) override {
Menu *menu = gScene->createMenu();
Menu *menu = global_ui->ui.gScene->createMenu();
menu->addChild(construct<MenuLabel>(&MenuLabel::text, "MIDI device"));
{
MidiDeviceItem *item = new MidiDeviceItem();
@@ -92,7 +95,7 @@ struct MidiChannelItem : MenuItem {
struct MidiChannelChoice : LedDisplayChoice {
MidiWidget *midiWidget;
void onAction(EventAction &e) override {
Menu *menu = gScene->createMenu();
Menu *menu = global_ui->ui.gScene->createMenu();
menu->addChild(construct<MenuLabel>(&MenuLabel::text, "MIDI channel"));
for (int channel = -1; channel < 16; channel++) {
MidiChannelItem *item = new MidiChannelItem();


+ 36
- 39
src/app/ModuleBrowser.cpp View File

@@ -1,8 +1,11 @@
#include "global_pre.hpp"
#include "app.hpp"
#include "plugin.hpp"
#include "window.hpp"
#include <set>
#include <algorithm>
#include "global.hpp"
#include "global_ui.hpp"


static const float itemMargin = 2.0;
@@ -11,12 +14,6 @@ static const float itemMargin = 2.0;
namespace rack {


static std::set<Model*> sFavoriteModels;
static std::string sAuthorFilter;
static ModelTag sTagFilter = NO_TAG;



bool isMatch(std::string s, std::string search) {
s = stringLowercase(s);
search = stringLowercase(search);
@@ -92,7 +89,7 @@ struct BrowserListItem : OpaqueWidget {
onAction(eAction);
if (eAction.consumed) {
// deletes `this`
gScene->setOverlay(NULL);
global_ui->ui.gScene->setOverlay(NULL);
}
}
};
@@ -113,8 +110,8 @@ struct ModelItem : BrowserListItem {
addChild(favoriteButton);

// Set favorite button initial state
auto it = sFavoriteModels.find(model);
if (it != sFavoriteModels.end())
auto it = global_ui->module_browser.sFavoriteModels.find(model);
if (it != global_ui->module_browser.sFavoriteModels.end())
favoriteButton->setValue(1);
favoriteButton->model = model;

@@ -139,10 +136,10 @@ struct ModelItem : BrowserListItem {
ModuleWidget *moduleWidget = model->createModuleWidget();
if (!moduleWidget)
return;
gRackWidget->addModule(moduleWidget);
global_ui->app.gRackWidget->addModule(moduleWidget);
// Move module nearest to the mouse position
moduleWidget->box.pos = gRackWidget->lastMousePos.minus(moduleWidget->box.size.div(2));
gRackWidget->requestModuleBoxNearest(moduleWidget, moduleWidget->box);
moduleWidget->box.pos = global_ui->app.gRackWidget->lastMousePos.minus(moduleWidget->box.size.div(2));
global_ui->app.gRackWidget->requestModuleBoxNearest(moduleWidget, moduleWidget->box);
}
};

@@ -284,8 +281,8 @@ struct ModuleBrowser : OpaqueWidget {

ModuleBrowser() {
box.size.x = 450;
sAuthorFilter = "";
sTagFilter = NO_TAG;
global_ui->module_browser.sAuthorFilter = "";
global_ui->module_browser.sTagFilter = NO_TAG;

// Search
searchField = new SearchModuleField();
@@ -304,7 +301,7 @@ struct ModuleBrowser : OpaqueWidget {
addChild(moduleScroll);

// Collect authors
for (Plugin *plugin : gPlugins) {
for (Plugin *plugin : global->plugin.gPlugins) {
for (Model *model : plugin->models) {
// Insert author
if (!model->author.empty())
@@ -331,10 +328,10 @@ struct ModuleBrowser : OpaqueWidget {
}

bool isModelFiltered(Model *model) {
if (!sAuthorFilter.empty() && model->author != sAuthorFilter)
if (!global_ui->module_browser.sAuthorFilter.empty() && model->author != global_ui->module_browser.sAuthorFilter)
return false;
if (sTagFilter != NO_TAG) {
auto it = std::find(model->tags.begin(), model->tags.end(), sTagFilter);
if (global_ui->module_browser.sTagFilter != NO_TAG) {
auto it = std::find(model->tags.begin(), model->tags.end(), global_ui->module_browser.sTagFilter);
if (it == model->tags.end())
return false;
}
@@ -345,16 +342,16 @@ struct ModuleBrowser : OpaqueWidget {
std::string search = searchField->text;
moduleList->clearChildren();
moduleList->selected = 0;
bool filterPage = !(sAuthorFilter.empty() && sTagFilter == NO_TAG);
bool filterPage = !(global_ui->module_browser.sAuthorFilter.empty() && global_ui->module_browser.sTagFilter == NO_TAG);

if (!filterPage) {
// Favorites
if (!sFavoriteModels.empty()) {
if (!global_ui->module_browser.sFavoriteModels.empty()) {
SeparatorItem *item = new SeparatorItem();
item->setText("Favorites");
moduleList->addChild(item);
}
for (Model *model : sFavoriteModels) {
for (Model *model : global_ui->module_browser.sFavoriteModels) {
if (isModelFiltered(model) && isModelMatch(model, search)) {
ModelItem *item = new ModelItem();
item->setModel(model);
@@ -402,14 +399,14 @@ struct ModuleBrowser : OpaqueWidget {
}
else if (filterPage) {
SeparatorItem *item = new SeparatorItem();
if (!sAuthorFilter.empty())
item->setText(sAuthorFilter);
else if (sTagFilter != NO_TAG)
item->setText("Tag: " + gTagNames[sTagFilter]);
if (!global_ui->module_browser.sAuthorFilter.empty())
item->setText(global_ui->module_browser.sAuthorFilter);
else if (global_ui->module_browser.sTagFilter != NO_TAG)
item->setText("Tag: " + gTagNames[global_ui->module_browser.sTagFilter]);
moduleList->addChild(item);
}
// Modules
for (Plugin *plugin : gPlugins) {
for (Plugin *plugin : global->plugin.gPlugins) {
for (Model *model : plugin->models) {
if (isModelFiltered(model) && isModelMatch(model, search)) {
ModelItem *item = new ModelItem();
@@ -428,7 +425,7 @@ struct ModuleBrowser : OpaqueWidget {
moduleScroll->box.size.y = min(box.size.y - moduleScroll->box.pos.y, moduleList->box.size.y);
box.size.y = min(box.size.y, moduleScroll->box.getBottomRight().y);

gFocusedWidget = searchField;
global_ui->widgets.gFocusedWidget = searchField;
Widget::step();
}
};
@@ -438,7 +435,7 @@ struct ModuleBrowser : OpaqueWidget {

void AuthorItem::onAction(EventAction &e) {
ModuleBrowser *moduleBrowser = getAncestorOfType<ModuleBrowser>();
sAuthorFilter = author;
global_ui->module_browser.sAuthorFilter = author;
moduleBrowser->clearSearch();
moduleBrowser->refreshSearch();
e.consumed = false;
@@ -446,7 +443,7 @@ void AuthorItem::onAction(EventAction &e) {

void TagItem::onAction(EventAction &e) {
ModuleBrowser *moduleBrowser = getAncestorOfType<ModuleBrowser>();
sTagFilter = tag;
global_ui->module_browser.sTagFilter = tag;
moduleBrowser->clearSearch();
moduleBrowser->refreshSearch();
e.consumed = false;
@@ -454,8 +451,8 @@ void TagItem::onAction(EventAction &e) {

void ClearFilterItem::onAction(EventAction &e) {
ModuleBrowser *moduleBrowser = getAncestorOfType<ModuleBrowser>();
sAuthorFilter = "";
sTagFilter = NO_TAG;
global_ui->module_browser.sAuthorFilter = "";
global_ui->module_browser.sTagFilter = NO_TAG;
moduleBrowser->refreshSearch();
e.consumed = false;
}
@@ -464,12 +461,12 @@ void FavoriteRadioButton::onAction(EventAction &e) {
if (!model)
return;
if (value) {
sFavoriteModels.insert(model);
global_ui->module_browser.sFavoriteModels.insert(model);
}
else {
auto it = sFavoriteModels.find(model);
if (it != sFavoriteModels.end())
sFavoriteModels.erase(it);
auto it = global_ui->module_browser.sFavoriteModels.find(model);
if (it != global_ui->module_browser.sFavoriteModels.end())
global_ui->module_browser.sFavoriteModels.erase(it);
}

ModuleBrowser *moduleBrowser = getAncestorOfType<ModuleBrowser>();
@@ -491,7 +488,7 @@ void SearchModuleField::onTextChange() {
void SearchModuleField::onKey(EventKey &e) {
switch (e.key) {
case GLFW_KEY_ESCAPE: {
gScene->setOverlay(NULL);
global_ui->ui.gScene->setOverlay(NULL);
e.consumed = true;
return;
} break;
@@ -538,14 +535,14 @@ void appModuleBrowserCreate() {
ModuleBrowser *moduleBrowser = new ModuleBrowser();
overlay->addChild(moduleBrowser);

gScene->setOverlay(overlay);
global_ui->ui.gScene->setOverlay(overlay);
}

json_t *appModuleBrowserToJson() {
json_t *rootJ = json_object();

json_t *favoritesJ = json_array();
for (Model *model : sFavoriteModels) {
for (Model *model : global_ui->module_browser.sFavoriteModels) {
json_t *modelJ = json_object();
json_object_set_new(modelJ, "plugin", json_string(model->plugin->slug.c_str()));
json_object_set_new(modelJ, "model", json_string(model->slug.c_str()));
@@ -571,7 +568,7 @@ void appModuleBrowserFromJson(json_t *rootJ) {
Model *model = pluginGetModel(pluginSlug, modelSlug);
if (!model)
continue;
sFavoriteModels.insert(model);
global_ui->module_browser.sFavoriteModels.insert(model);
}
}
}


+ 65
- 220
src/app/ModuleWidget.cpp View File

@@ -1,9 +1,10 @@
#include "global_pre.hpp"
#include "app.hpp"
#include "engine.hpp"
#include "plugin.hpp"
#include "window.hpp"
#include "asset.hpp"
#include "osdialog.h"
#include "global.hpp"
#include "global_ui.hpp"


namespace rack {
@@ -68,8 +69,18 @@ json_t *ModuleWidget::toJson() {
// version (of plugin)
if (!model->plugin->version.empty())
json_object_set_new(rootJ, "version", json_string(model->plugin->version.c_str()));

#ifdef USE_VST2
json_t *vst2_unique_param_base_idJ = json_integer(module->vst2_unique_param_base_id);
json_object_set_new(rootJ, "vst2_unique_param_base_id", vst2_unique_param_base_idJ);
#endif // USE_VST2

// model
json_object_set_new(rootJ, "model", json_string(model->slug.c_str()));
// pos
Vec pos = box.pos.div(RACK_GRID_SIZE).round();
json_t *posJ = json_pack("[i, i]", (int) pos.x, (int) pos.y);
json_object_set_new(rootJ, "pos", posJ);
// params
json_t *paramsJ = json_array();
for (ParamWidget *paramWidget : params) {
@@ -89,42 +100,36 @@ json_t *ModuleWidget::toJson() {
}

void ModuleWidget::fromJson(json_t *rootJ) {
// Check if plugin and model are incorrect
json_t *pluginJ = json_object_get(rootJ, "plugin");
std::string pluginSlug;
if (pluginJ) {
pluginSlug = json_string_value(pluginJ);
if (pluginSlug != model->plugin->slug) {
warn("Plugin %s does not match ModuleWidget's plugin %s.", pluginSlug.c_str(), model->plugin->slug.c_str());
return;
}
}

json_t *modelJ = json_object_get(rootJ, "model");
std::string modelSlug;
if (modelJ) {
modelSlug = json_string_value(modelJ);
if (modelSlug != model->slug) {
warn("Model %s does not match ModuleWidget's model %s.", modelSlug.c_str(), model->slug.c_str());
return;
}
}

// Check plugin version
json_t *versionJ = json_object_get(rootJ, "version");
if (versionJ) {
std::string version = json_string_value(versionJ);
if (version != model->plugin->version) {
info("Patch created with %s version %s, using version %s.", pluginSlug.c_str(), version.c_str(), model->plugin->version.c_str());
}
}

// legacy
int legacy = 0;
json_t *legacyJ = json_object_get(rootJ, "legacy");
if (legacyJ)
legacy = json_integer_value(legacyJ);

#ifdef USE_VST2
if(NULL != module) {
json_t *vst2_unique_param_base_idJ = json_object_get(rootJ, "vst2_unique_param_base_id");
if (vst2_unique_param_base_idJ) {
module->vst2_unique_param_base_id = json_integer_value(vst2_unique_param_base_idJ);
if((module->vst2_unique_param_base_id + module->params.size()) > global->vst2.next_unique_param_base_id) {
global->vst2.next_unique_param_base_id = (module->vst2_unique_param_base_id + module->params.size());
}
}
}
#endif // USE_VST2

// pos
json_t *posJ = json_object_get(rootJ, "pos");
double x, y;
json_unpack(posJ, "[F, F]", &x, &y);
Vec pos = Vec(x, y);
if (legacy && legacy <= 1) {
box.pos = pos;
}
else {
box.pos = pos.mult(RACK_GRID_SIZE);
}

// params
json_t *paramsJ = json_object_get(rootJ, "params");
size_t i;
@@ -162,108 +167,12 @@ void ModuleWidget::fromJson(json_t *rootJ) {
}
}

void ModuleWidget::copyClipboard() {
json_t *moduleJ = toJson();
char *moduleJson = json_dumps(moduleJ, JSON_INDENT(2) | JSON_REAL_PRECISION(9));
glfwSetClipboardString(gWindow, moduleJson);
free(moduleJson);
json_decref(moduleJ);
}

void ModuleWidget::pasteClipboard() {
const char *moduleJson = glfwGetClipboardString(gWindow);
if (!moduleJson) {
warn("Could not get text from clipboard.");
return;
}

json_error_t error;
json_t *moduleJ = json_loads(moduleJson, 0, &error);
if (moduleJ) {
fromJson(moduleJ);
json_decref(moduleJ);
}
else {
warn("JSON parsing error at %s %d:%d %s", error.source, error.line, error.column, error.text);
}
}

void ModuleWidget::load(std::string filename) {
info("Loading preset %s", filename.c_str());
FILE *file = fopen(filename.c_str(), "r");
if (!file) {
// Exit silently
return;
}

json_error_t error;
json_t *moduleJ = json_loadf(file, 0, &error);
if (moduleJ) {
fromJson(moduleJ);
json_decref(moduleJ);
}
else {
std::string message = stringf("JSON parsing error at %s %d:%d %s", error.source, error.line, error.column, error.text);
osdialog_message(OSDIALOG_WARNING, OSDIALOG_OK, message.c_str());
}

fclose(file);
}

void ModuleWidget::save(std::string filename) {
info("Saving preset %s", filename.c_str());
json_t *moduleJ = toJson();
if (!moduleJ)
return;

FILE *file = fopen(filename.c_str(), "w");
if (file) {
json_dumpf(moduleJ, file, JSON_INDENT(2) | JSON_REAL_PRECISION(9));
fclose(file);
}

json_decref(moduleJ);
}

void ModuleWidget::loadDialog() {
std::string dir = assetLocal("presets");
systemCreateDirectory(dir);

osdialog_filters *filters = osdialog_filters_parse(PRESET_FILTERS.c_str());
char *path = osdialog_file(OSDIALOG_OPEN, dir.c_str(), NULL, filters);
if (path) {
load(path);
free(path);
}
osdialog_filters_free(filters);
}

void ModuleWidget::saveDialog() {
std::string dir = assetLocal("presets");
systemCreateDirectory(dir);

osdialog_filters *filters = osdialog_filters_parse(PRESET_FILTERS.c_str());
char *path = osdialog_file(OSDIALOG_SAVE, dir.c_str(), "Untitled.vcvm", filters);

if (path) {
std::string pathStr = path;
free(path);
std::string extension = stringExtension(pathStr);
if (extension.empty()) {
pathStr += ".vcvm";
}

save(pathStr);
}
osdialog_filters_free(filters);
}

void ModuleWidget::disconnect() {
for (Port *input : inputs) {
gRackWidget->wireContainer->removeAllWires(input);
global_ui->app.gRackWidget->wireContainer->removeAllWires(input);
}
for (Port *output : outputs) {
gRackWidget->wireContainer->removeAllWires(output);
global_ui->app.gRackWidget->wireContainer->removeAllWires(output);
}
}

@@ -278,7 +187,7 @@ void ModuleWidget::reset() {
param->reset();
}
if (module) {
engineResetModule(module);
module->onReset();
}
}

@@ -287,7 +196,7 @@ void ModuleWidget::randomize() {
param->randomize();
}
if (module) {
engineRandomizeModule(module);
module->onRandomize();
}
}

@@ -296,7 +205,7 @@ void ModuleWidget::draw(NVGcontext *vg) {
Widget::draw(vg);

// CPU meter
if (module && gPowerMeter) {
if (module && global->gPowerMeter) {
nvgBeginPath(vg);
nvgRect(vg,
0, box.size.y - 20,
@@ -305,7 +214,7 @@ void ModuleWidget::draw(NVGcontext *vg) {
nvgFill(vg);

std::string cpuText = stringf("%.0f mS", module->cpuTime * 1000.f);
nvgFontFaceId(vg, gGuiFont->handle);
nvgFontFaceId(vg, global_ui->window.gGuiFont->handle);
nvgFontSize(vg, 12);
nvgFillColor(vg, nvgRGBf(1, 1, 1));
nvgText(vg, 10.0, box.size.y - 6.0, cpuText.c_str(), NULL);
@@ -350,11 +259,11 @@ void ModuleWidget::onMouseMove(EventMouseMove &e) {
OpaqueWidget::onMouseMove(e);

// Don't delete the ModuleWidget if a TextField is focused
if (!gFocusedWidget) {
if (!global_ui->widgets.gFocusedWidget) {
// Instead of checking key-down events, delete the module even if key-repeat hasn't fired yet and the cursor is hovering over the widget.
if (glfwGetKey(gWindow, GLFW_KEY_DELETE) == GLFW_PRESS || glfwGetKey(gWindow, GLFW_KEY_BACKSPACE) == GLFW_PRESS) {
if (glfwGetKey(global_ui->window.gWindow, GLFW_KEY_DELETE) == GLFW_PRESS || glfwGetKey(global_ui->window.gWindow, GLFW_KEY_BACKSPACE) == GLFW_PRESS) {
if (!windowIsModPressed() && !windowIsShiftPressed()) {
gRackWidget->deleteModule(this);
global_ui->app.gRackWidget->deleteModule(this);
this->finalizeEvents();
delete this;
e.consumed = true;
@@ -380,23 +289,9 @@ void ModuleWidget::onHoverKey(EventHoverKey &e) {
return;
}
} break;
case GLFW_KEY_C: {
if (windowIsModPressed() && !windowIsShiftPressed()) {
copyClipboard();
e.consumed = true;
return;
}
} break;
case GLFW_KEY_V: {
if (windowIsModPressed() && !windowIsShiftPressed()) {
pasteClipboard();
e.consumed = true;
return;
}
} break;
case GLFW_KEY_D: {
if (windowIsModPressed() && !windowIsShiftPressed()) {
gRackWidget->cloneModule(this);
global_ui->app.gRackWidget->cloneModule(this);
e.consumed = true;
return;
}
@@ -414,140 +309,90 @@ void ModuleWidget::onHoverKey(EventHoverKey &e) {
}

void ModuleWidget::onDragStart(EventDragStart &e) {
dragPos = gRackWidget->lastMousePos.minus(box.pos);
dragPos = global_ui->app.gRackWidget->lastMousePos.minus(box.pos);
}

void ModuleWidget::onDragEnd(EventDragEnd &e) {
}

void ModuleWidget::onDragMove(EventDragMove &e) {
if (!gRackWidget->lockModules) {
if (!global_ui->app.gRackWidget->lockModules) {
Rect newBox = box;
newBox.pos = gRackWidget->lastMousePos.minus(dragPos);
gRackWidget->requestModuleBoxNearest(this, newBox);
newBox.pos = global_ui->app.gRackWidget->lastMousePos.minus(dragPos);
global_ui->app.gRackWidget->requestModuleBoxNearest(this, newBox);
}
}


struct ModuleDisconnectItem : MenuItem {
struct DisconnectMenuItem : MenuItem {
ModuleWidget *moduleWidget;
void onAction(EventAction &e) override {
moduleWidget->disconnect();
}
};

struct ModuleResetItem : MenuItem {
struct ResetMenuItem : MenuItem {
ModuleWidget *moduleWidget;
void onAction(EventAction &e) override {
moduleWidget->reset();
}
};

struct ModuleRandomizeItem : MenuItem {
struct RandomizeMenuItem : MenuItem {
ModuleWidget *moduleWidget;
void onAction(EventAction &e) override {
moduleWidget->randomize();
}
};

struct ModuleCopyItem : MenuItem {
ModuleWidget *moduleWidget;
void onAction(EventAction &e) override {
moduleWidget->copyClipboard();
}
};

struct ModulePasteItem : MenuItem {
ModuleWidget *moduleWidget;
void onAction(EventAction &e) override {
moduleWidget->pasteClipboard();
}
};

struct ModuleSaveItem : MenuItem {
ModuleWidget *moduleWidget;
void onAction(EventAction &e) override {
moduleWidget->saveDialog();
}
};

struct ModuleLoadItem : MenuItem {
ModuleWidget *moduleWidget;
void onAction(EventAction &e) override {
moduleWidget->loadDialog();
}
};

struct ModuleCloneItem : MenuItem {
struct CloneMenuItem : MenuItem {
ModuleWidget *moduleWidget;
void onAction(EventAction &e) override {
gRackWidget->cloneModule(moduleWidget);
global_ui->app.gRackWidget->cloneModule(moduleWidget);
}
};

struct ModuleDeleteItem : MenuItem {
struct DeleteMenuItem : MenuItem {
ModuleWidget *moduleWidget;
void onAction(EventAction &e) override {
gRackWidget->deleteModule(moduleWidget);
global_ui->app.gRackWidget->deleteModule(moduleWidget);
moduleWidget->finalizeEvents();
delete moduleWidget;
}
};

Menu *ModuleWidget::createContextMenu() {
Menu *menu = gScene->createMenu();
Menu *menu = global_ui->ui.gScene->createMenu();

MenuLabel *menuLabel = new MenuLabel();
menuLabel->text = model->author + " " + model->name + " " + model->plugin->version;
menu->addChild(menuLabel);

ModuleResetItem *resetItem = new ModuleResetItem();
ResetMenuItem *resetItem = new ResetMenuItem();
resetItem->text = "Initialize";
resetItem->rightText = WINDOW_MOD_KEY_NAME "+I";
resetItem->moduleWidget = this;
menu->addChild(resetItem);

ModuleRandomizeItem *randomizeItem = new ModuleRandomizeItem();
RandomizeMenuItem *randomizeItem = new RandomizeMenuItem();
randomizeItem->text = "Randomize";
randomizeItem->rightText = WINDOW_MOD_KEY_NAME "+R";
randomizeItem->moduleWidget = this;
menu->addChild(randomizeItem);

ModuleDisconnectItem *disconnectItem = new ModuleDisconnectItem();
DisconnectMenuItem *disconnectItem = new DisconnectMenuItem();
disconnectItem->text = "Disconnect cables";
disconnectItem->rightText = WINDOW_MOD_KEY_NAME "+U";
disconnectItem->moduleWidget = this;
menu->addChild(disconnectItem);

ModuleCloneItem *cloneItem = new ModuleCloneItem();
CloneMenuItem *cloneItem = new CloneMenuItem();
cloneItem->text = "Duplicate";
cloneItem->rightText = WINDOW_MOD_KEY_NAME "+D";
cloneItem->moduleWidget = this;
menu->addChild(cloneItem);

ModuleCopyItem *copyItem = new ModuleCopyItem();
copyItem->text = "Copy preset";
copyItem->rightText = WINDOW_MOD_KEY_NAME "+C";
copyItem->moduleWidget = this;
menu->addChild(copyItem);

ModulePasteItem *pasteItem = new ModulePasteItem();
pasteItem->text = "Paste preset";
pasteItem->rightText = WINDOW_MOD_KEY_NAME "+V";
pasteItem->moduleWidget = this;
menu->addChild(pasteItem);

ModuleLoadItem *loadItem = new ModuleLoadItem();
loadItem->text = "Load preset";
loadItem->moduleWidget = this;
menu->addChild(loadItem);

ModuleSaveItem *saveItem = new ModuleSaveItem();
saveItem->text = "Save preset";
saveItem->moduleWidget = this;
menu->addChild(saveItem);

ModuleDeleteItem *deleteItem = new ModuleDeleteItem();
DeleteMenuItem *deleteItem = new DeleteMenuItem();
deleteItem->text = "Delete";
deleteItem->rightText = "Backspace/Delete";
deleteItem->moduleWidget = this;
@@ -559,4 +404,4 @@ Menu *ModuleWidget::createContextMenu() {
}


} // namespace rack
} // namespace rack

+ 2
- 0
src/app/ParamWidget.cpp View File

@@ -47,6 +47,8 @@ void ParamWidget::onChange(EventChange &e) {
if (!module)
return;

// printf("xxx ParamWidget::onChange: paramId=%d value=%f\n", paramId, value);

if (smooth)
engineSetParamSmooth(module, paramId, value);
else


+ 4
- 0
src/app/PluginManagerWidget.cpp View File

@@ -54,6 +54,7 @@ struct SyncButton : Button {
bool completed = false;

void step() override {
#ifndef USE_VST2
// Check for plugin update on first step()
if (!checked) {
std::thread t([this]() {
@@ -63,6 +64,7 @@ struct SyncButton : Button {
t.detach();
checked = true;
}
#endif // USE_VST2
// Display message if we've completed updates
if (completed) {
if (osdialog_message(OSDIALOG_INFO, OSDIALOG_OK_CANCEL, "All plugins have been updated. Close Rack and re-launch it to load new updates.")) {
@@ -85,11 +87,13 @@ struct SyncButton : Button {
}
void onAction(EventAction &e) override {
available = false;
#ifndef USE_VST2
std::thread t([this]() {
if (pluginSync(false))
completed = true;
});
t.detach();
#endif // USE_VST2
}
};



+ 11
- 10
src/app/Port.cpp View File

@@ -1,8 +1,9 @@
#include "global_pre.hpp"
#include "app.hpp"
#include "window.hpp"
#include "engine.hpp"
#include "componentlibrary.hpp"
#include "global_ui.hpp"

namespace rack {

@@ -24,7 +25,7 @@ Port::Port() {
Port::~Port() {
// plugLight is not a child and is thus owned by the Port, so we need to delete it here
delete plugLight;
gRackWidget->wireContainer->removeAllWires(this);
global_ui->app.gRackWidget->wireContainer->removeAllWires(this);
}

void Port::step() {
@@ -41,7 +42,7 @@ void Port::step() {
}

void Port::draw(NVGcontext *vg) {
WireWidget *activeWire = gRackWidget->wireContainer->activeWire;
WireWidget *activeWire = global_ui->app.gRackWidget->wireContainer->activeWire;
if (activeWire) {
// Dim the Port if the active wire cannot plug into this Port
if (type == INPUT ? activeWire->inputPort : activeWire->outputPort)
@@ -51,7 +52,7 @@ void Port::draw(NVGcontext *vg) {

void Port::onMouseDown(EventMouseDown &e) {
if (e.button == 1) {
gRackWidget->wireContainer->removeTopWire(this);
global_ui->app.gRackWidget->wireContainer->removeTopWire(this);

// HACK
// Update hovered*Port of active wire if applicable
@@ -64,7 +65,7 @@ void Port::onMouseDown(EventMouseDown &e) {

void Port::onDragStart(EventDragStart &e) {
// Try to grab wire on top of stack
WireWidget *wire = gRackWidget->wireContainer->getTopWire(this);
WireWidget *wire = global_ui->app.gRackWidget->wireContainer->getTopWire(this);
if (type == OUTPUT && windowIsModPressed()) {
wire = NULL;
}
@@ -85,13 +86,13 @@ void Port::onDragStart(EventDragStart &e) {
else
wire->outputPort = this;
}
gRackWidget->wireContainer->setActiveWire(wire);
global_ui->app.gRackWidget->wireContainer->setActiveWire(wire);
}

void Port::onDragEnd(EventDragEnd &e) {
// FIXME
// If the source Port is deleted, this will be called, removing the cable
gRackWidget->wireContainer->commitActiveWire();
global_ui->app.gRackWidget->wireContainer->commitActiveWire();
}

void Port::onDragDrop(EventDragDrop &e) {
@@ -100,12 +101,12 @@ void Port::onDragDrop(EventDragDrop &e) {
void Port::onDragEnter(EventDragEnter &e) {
// Reject ports if this is an input port and something is already plugged into it
if (type == INPUT) {
WireWidget *topWire = gRackWidget->wireContainer->getTopWire(this);
WireWidget *topWire = global_ui->app.gRackWidget->wireContainer->getTopWire(this);
if (topWire)
return;
}

WireWidget *activeWire = gRackWidget->wireContainer->activeWire;
WireWidget *activeWire = global_ui->app.gRackWidget->wireContainer->activeWire;
if (activeWire) {
if (type == INPUT)
activeWire->hoveredInputPort = this;
@@ -115,7 +116,7 @@ void Port::onDragEnter(EventDragEnter &e) {
}

void Port::onDragLeave(EventDragEnter &e) {
WireWidget *activeWire = gRackWidget->wireContainer->activeWire;
WireWidget *activeWire = global_ui->app.gRackWidget->wireContainer->activeWire;
if (activeWire) {
if (type == INPUT)
activeWire->hoveredInputPort = NULL;


+ 21
- 25
src/app/RackScene.cpp View File

@@ -1,9 +1,11 @@
#include "global_pre.hpp"
#include "app.hpp"
#include "window.hpp"
#include "util/request.hpp"
#include "osdialog.h"
#include <string.h>
#include <thread>
#include "global_ui.hpp"


namespace rack {
@@ -14,43 +16,43 @@ RackScene::RackScene() {
{
zoomWidget = new ZoomWidget();
{
assert(!gRackWidget);
gRackWidget = new RackWidget();
zoomWidget->addChild(gRackWidget);
assert(!global_ui->app.gRackWidget);
global_ui->app.gRackWidget = new RackWidget();
zoomWidget->addChild(global_ui->app.gRackWidget);
}
scrollWidget->container->addChild(zoomWidget);
}
addChild(scrollWidget);

gToolbar = new Toolbar();
addChild(gToolbar);
scrollWidget->box.pos.y = gToolbar->box.size.y;
global_ui->app.gToolbar = new Toolbar();
addChild(global_ui->app.gToolbar);
scrollWidget->box.pos.y = global_ui->app.gToolbar->box.size.y;
}

void RackScene::step() {
// Resize owned descendants
gToolbar->box.size.x = box.size.x;
global_ui->app.gToolbar->box.size.x = box.size.x;
scrollWidget->box.size = box.size.minus(scrollWidget->box.pos);

// Resize to be a bit larger than the ScrollWidget viewport
gRackWidget->box.size = scrollWidget->box.size
global_ui->app.gRackWidget->box.size = scrollWidget->box.size
.minus(scrollWidget->container->box.pos)
.plus(Vec(500, 500))
.div(zoomWidget->zoom);

Scene::step();

zoomWidget->box.size = gRackWidget->box.size.mult(zoomWidget->zoom);
zoomWidget->box.size = global_ui->app.gRackWidget->box.size.mult(zoomWidget->zoom);

// Version popup message
if (!gLatestVersion.empty()) {
std::string versionMessage = stringf("Rack %s is available.\n\nYou have Rack %s.\n\nClose Rack and download new version on the website?", gLatestVersion.c_str(), gApplicationVersion.c_str());
if (!global_ui->app.gLatestVersion.empty()) {
std::string versionMessage = stringf("Rack %s is available.\n\nYou have Rack %s.\n\nClose Rack and download new version on the website?", global_ui->app.gLatestVersion.c_str(), global_ui->app.gApplicationVersion.c_str());
if (osdialog_message(OSDIALOG_INFO, OSDIALOG_OK_CANCEL, versionMessage.c_str())) {
std::thread t(systemOpenBrowser, "https://vcvrack.com/");
t.detach();
windowClose();
}
gLatestVersion = "";
global_ui->app.gLatestVersion = "";
}
}

@@ -65,7 +67,7 @@ void RackScene::onHoverKey(EventHoverKey &e) {
switch (e.key) {
case GLFW_KEY_N: {
if (windowIsModPressed() && !windowIsShiftPressed()) {
gRackWidget->reset();
global_ui->app.gRackWidget->reset();
e.consumed = true;
}
} break;
@@ -77,27 +79,21 @@ void RackScene::onHoverKey(EventHoverKey &e) {
} break;
case GLFW_KEY_O: {
if (windowIsModPressed() && !windowIsShiftPressed()) {
gRackWidget->loadDialog();
global_ui->app.gRackWidget->openDialog();
e.consumed = true;
}
if (windowIsModPressed() && windowIsShiftPressed()) {
gRackWidget->revert();
global_ui->app.gRackWidget->revert();
e.consumed = true;
}
} break;
case GLFW_KEY_S: {
if (windowIsModPressed() && !windowIsShiftPressed()) {
gRackWidget->saveDialog();
global_ui->app.gRackWidget->saveDialog();
e.consumed = true;
}
if (windowIsModPressed() && windowIsShiftPressed()) {
gRackWidget->saveAsDialog();
e.consumed = true;
}
} break;
case GLFW_KEY_V: {
if (windowIsModPressed() && !windowIsShiftPressed()) {
gRackWidget->pastePresetClipboard();
global_ui->app.gRackWidget->saveAsDialog();
e.consumed = true;
}
} break;
@@ -115,9 +111,9 @@ void RackScene::onHoverKey(EventHoverKey &e) {

void RackScene::onPathDrop(EventPathDrop &e) {
if (e.paths.size() >= 1) {
const std::string &firstPath = e.paths.front();
const std::string& firstPath = e.paths.front();
if (stringExtension(firstPath) == "vcv") {
gRackWidget->load(firstPath);
global_ui->app.gRackWidget->loadPatch(firstPath);
e.consumed = true;
}
}


+ 4
- 2
src/app/RackScrollWidget.cpp View File

@@ -1,15 +1,17 @@
#include "global_pre.hpp"
#include "app.hpp"
#include "window.hpp"
#include "global_ui.hpp"


namespace rack {


void RackScrollWidget::step() {
Vec pos = gMousePos;
Vec pos = global_ui->window.gMousePos;
Rect viewport = getViewport(box.zeroPos());
// Scroll rack if dragging cable near the edge of the screen
if (gRackWidget->wireContainer->activeWire) {
if (global_ui->app.gRackWidget->wireContainer->activeWire) {
float margin = 20.0;
float speed = 15.0;
if (pos.x <= viewport.pos.x + margin)


+ 98
- 94
src/app/RackWidget.cpp View File

@@ -1,3 +1,4 @@
#include "global_pre.hpp"
#include "app.hpp"
#include "engine.hpp"
#include "plugin.hpp"
@@ -7,11 +8,16 @@
#include <map>
#include <algorithm>
#include "osdialog.h"
#include "global.hpp"
#include "global_ui.hpp"


namespace rack {


static const char *FILTERS = "VeeSeeVST Rack patch (.vcv):vcv";


struct ModuleContainer : Widget {
void draw(NVGcontext *vg) override {
// Draw shadows behind each ModuleWidget first, so the shadow doesn't overlap the front.
@@ -56,19 +62,22 @@ void RackWidget::clear() {
wireContainer->clearChildren();
moduleContainer->clearChildren();

gRackScene->scrollWidget->offset = Vec(0, 0);
global_ui->app.gRackScene->scrollWidget->offset = Vec(0, 0);
#ifdef USE_VST2
global->vst2.next_unique_param_base_id = 1;
#endif // USE_VST2
}

void RackWidget::reset() {
if (osdialog_message(OSDIALOG_INFO, OSDIALOG_OK_CANCEL, "Clear patch and start over?")) {
clear();
// Fails silently if file does not exist
load(assetLocal("template.vcv"));
loadPatch(assetLocal("template.vcv"));
lastPath = "";
}
}

void RackWidget::loadDialog() {
void RackWidget::openDialog() {
std::string dir;
if (lastPath.empty()) {
dir = assetLocal("patches");
@@ -77,10 +86,10 @@ void RackWidget::loadDialog() {
else {
dir = stringDirectory(lastPath);
}
osdialog_filters *filters = osdialog_filters_parse(PATCH_FILTERS.c_str());
osdialog_filters *filters = osdialog_filters_parse(FILTERS);
char *path = osdialog_file(OSDIALOG_OPEN, dir.c_str(), NULL, filters);
if (path) {
load(path);
loadPatch(path);
lastPath = path;
free(path);
}
@@ -89,7 +98,7 @@ void RackWidget::loadDialog() {

void RackWidget::saveDialog() {
if (!lastPath.empty()) {
save(lastPath);
savePatch(lastPath);
}
else {
saveAsDialog();
@@ -107,7 +116,7 @@ void RackWidget::saveAsDialog() {
dir = stringDirectory(lastPath);
filename = stringFilename(lastPath);
}
osdialog_filters *filters = osdialog_filters_parse(PATCH_FILTERS.c_str());
osdialog_filters *filters = osdialog_filters_parse(FILTERS);
char *path = osdialog_file(OSDIALOG_SAVE, dir.c_str(), filename.c_str(), filters);

if (path) {
@@ -118,19 +127,19 @@ void RackWidget::saveAsDialog() {
pathStr += ".vcv";
}

save(pathStr);
savePatch(pathStr);
lastPath = pathStr;
}
osdialog_filters_free(filters);
}

void RackWidget::save(std::string filename) {
info("Saving patch %s", filename.c_str());
void RackWidget::savePatch(std::string path) {
info("Saving patch %s", path.c_str());
json_t *rootJ = toJson();
if (!rootJ)
return;

FILE *file = fopen(filename.c_str(), "w");
FILE *file = fopen(path.c_str(), "w");
if (file) {
json_dumpf(rootJ, file, JSON_INDENT(2) | JSON_REAL_PRECISION(9));
fclose(file);
@@ -139,9 +148,25 @@ void RackWidget::save(std::string filename) {
json_decref(rootJ);
}

void RackWidget::load(std::string filename) {
info("Loading patch %s", filename.c_str());
FILE *file = fopen(filename.c_str(), "r");
#ifdef USE_VST2
char *RackWidget::savePatchToString(void) {
// (note) caller must free() returned string
info("Saving patch to string");
char *r = NULL;

json_t *rootJ = toJson();
if (!rootJ)
return NULL;

r = json_dumps(rootJ, JSON_INDENT(2) | JSON_REAL_PRECISION(9));
json_decref(rootJ);
return r;
}
#endif // USE_VST2

void RackWidget::loadPatch(std::string path) {
info("Loading patch %s", path.c_str());
FILE *file = fopen(path.c_str(), "r");
if (!file) {
// Exit silently
return;
@@ -155,18 +180,50 @@ void RackWidget::load(std::string filename) {
json_decref(rootJ);
}
else {
std::string message = stringf("JSON parsing error at %s %d:%d %s", error.source, error.line, error.column, error.text);
std::string message = stringf("JSON parsing error at %s %d:%d %s\n", error.source, error.line, error.column, error.text);
osdialog_message(OSDIALOG_WARNING, OSDIALOG_OK, message.c_str());
}

fclose(file);
}

#ifdef USE_VST2
bool RackWidget::loadPatchFromString(const char *_string) {
info("Loading patch from string");

if (NULL == _string) {
// Exit silently
return false;
}
json_error_t error;
json_t *rootJ = json_loads(_string, 0/*flags*/, &error);
if (rootJ) {
clear();
#ifdef USE_VST2
global->vst2.b_patch_loading = true;
#endif
fromJson(rootJ);
#ifdef USE_VST2
global->vst2.b_patch_loading = false;
#endif // USE_VST2
json_decref(rootJ);
return true;
}
else {
std::string message = stringf("JSON parsing error at %s %d:%d %s\n", error.source, error.line, error.column, error.text);
osdialog_message(OSDIALOG_WARNING, OSDIALOG_OK, message.c_str());
}

return false;
}
#endif // USE_VST2

void RackWidget::revert() {
if (lastPath.empty())
return;
if (osdialog_message(OSDIALOG_INFO, OSDIALOG_OK_CANCEL, "Revert patch to the last saved state?")) {
load(lastPath);
loadPatch(lastPath);
}
}

@@ -186,7 +243,7 @@ json_t *RackWidget::toJson() {
json_t *rootJ = json_object();

// version
json_t *versionJ = json_string(gApplicationVersion.c_str());
json_t *versionJ = json_string(global_ui->app.gApplicationVersion.c_str());
json_object_set_new(rootJ, "version", versionJ);

// modules
@@ -200,12 +257,6 @@ json_t *RackWidget::toJson() {
moduleId++;
// module
json_t *moduleJ = moduleWidget->toJson();
{
// pos
Vec pos = moduleWidget->box.pos.div(RACK_GRID_SIZE).round();
json_t *posJ = json_pack("[i, i]", (int) pos.x, (int) pos.y);
json_object_set_new(moduleJ, "pos", posJ);
}
json_array_append_new(modulesJ, moduleJ);
}
json_object_set_new(rootJ, "modules", modulesJ);
@@ -278,30 +329,25 @@ void RackWidget::fromJson(json_t *rootJ) {
json_object_set(moduleJ, "legacy", json_integer(legacy));
}

ModuleWidget *moduleWidget = moduleFromJson(moduleJ);

if (moduleWidget) {
// pos
json_t *posJ = json_object_get(moduleJ, "pos");
double x, y;
json_unpack(posJ, "[F, F]", &x, &y);
Vec pos = Vec(x, y);
if (legacy && legacy <= 1) {
moduleWidget->box.pos = pos;
}
else {
moduleWidget->box.pos = pos.mult(RACK_GRID_SIZE);
}
json_t *pluginSlugJ = json_object_get(moduleJ, "plugin");
if (!pluginSlugJ) continue;
json_t *modelSlugJ = json_object_get(moduleJ, "model");
if (!modelSlugJ) continue;
std::string pluginSlug = json_string_value(pluginSlugJ);
std::string modelSlug = json_string_value(modelSlugJ);

moduleWidgets[moduleId] = moduleWidget;
}
else {
json_t *pluginSlugJ = json_object_get(moduleJ, "plugin");
json_t *modelSlugJ = json_object_get(moduleJ, "model");
std::string pluginSlug = json_string_value(pluginSlugJ);
std::string modelSlug = json_string_value(modelSlugJ);
Model *model = pluginGetModel(pluginSlug, modelSlug);
if (!model) {
message += stringf("Could not find module \"%s\" of plugin \"%s\"\n", modelSlug.c_str(), pluginSlug.c_str());
continue;
}

// Create ModuleWidget
ModuleWidget *moduleWidget = model->createModuleWidget();
assert(moduleWidget);
moduleWidget->fromJson(moduleJ);
moduleContainer->addChild(moduleWidget);
moduleWidgets[moduleId] = moduleWidget;
}

// wires
@@ -363,53 +409,6 @@ void RackWidget::fromJson(json_t *rootJ) {
}
}

ModuleWidget *RackWidget::moduleFromJson(json_t *moduleJ) {
// Get slugs
json_t *pluginSlugJ = json_object_get(moduleJ, "plugin");
if (!pluginSlugJ)
return NULL;
json_t *modelSlugJ = json_object_get(moduleJ, "model");
if (!modelSlugJ)
return NULL;
std::string pluginSlug = json_string_value(pluginSlugJ);
std::string modelSlug = json_string_value(modelSlugJ);

// Get Model
Model *model = pluginGetModel(pluginSlug, modelSlug);
if (!model)
return NULL;

// Create ModuleWidget
ModuleWidget *moduleWidget = model->createModuleWidget();
assert(moduleWidget);
moduleWidget->fromJson(moduleJ);
moduleContainer->addChild(moduleWidget);
return moduleWidget;
}

void RackWidget::pastePresetClipboard() {
const char *moduleJson = glfwGetClipboardString(gWindow);
if (!moduleJson) {
warn("Could not get text from clipboard.");
return;
}

json_error_t error;
json_t *moduleJ = json_loads(moduleJson, 0, &error);
if (moduleJ) {
ModuleWidget *moduleWidget = moduleFromJson(moduleJ);
// Set moduleWidget position
Rect newBox = moduleWidget->box;
newBox.pos = lastMousePos.minus(newBox.size.div(2));
requestModuleBoxNearest(moduleWidget, newBox);

json_decref(moduleJ);
}
else {
warn("JSON parsing error at %s %d:%d %s", error.source, error.line, error.column, error.text);
}
}

void RackWidget::addModule(ModuleWidget *m) {
moduleContainer->addChild(m);
m->create();
@@ -421,13 +420,16 @@ void RackWidget::deleteModule(ModuleWidget *m) {
}

void RackWidget::cloneModule(ModuleWidget *m) {
// Create new module from model
ModuleWidget *clonedModuleWidget = m->model->createModuleWidget();
// JSON serialization is the most straightforward way to do this
json_t *moduleJ = m->toJson();
ModuleWidget *clonedModuleWidget = moduleFromJson(moduleJ);
clonedModuleWidget->fromJson(moduleJ);
json_decref(moduleJ);
Rect clonedBox = clonedModuleWidget->box;
clonedBox.pos = m->box.pos;
requestModuleBoxNearest(clonedModuleWidget, clonedBox);
addModule(clonedModuleWidget);
}

bool RackWidget::requestModuleBox(ModuleWidget *m, Rect box) {
@@ -488,11 +490,13 @@ void RackWidget::step() {
rail->box.size = rails->box.size;
}

#ifndef USE_VST2
// Autosave every 15 seconds
if (gGuiFrame % (60 * 15) == 0) {
save(assetLocal("autosave.vcv"));
if (global_ui->window.gGuiFrame % (60 * 15) == 0) {
savePatch(assetLocal("autosave.vcv"));
settingsSave(assetLocal("settings.json"));
}
#endif // USE_VST2

Widget::step();
}


+ 3
- 1
src/app/SVGPanel.cpp View File

@@ -1,5 +1,7 @@
#include "global_pre.hpp"
#include "app.hpp"
#include "window.hpp"
#include "global_ui.hpp"


namespace rack {
@@ -18,7 +20,7 @@ struct PanelBorder : TransparentWidget {


void SVGPanel::step() {
if (isNear(gPixelRatio, 1.0)) {
if (isNear(global_ui->window.gPixelRatio, 1.0)) {
// Small details draw poorly at low DPI, so oversample when drawing to the framebuffer
oversample = 2.0;
}


+ 18
- 15
src/app/Toolbar.cpp View File

@@ -1,7 +1,10 @@
#include "global_pre.hpp"
#include "app.hpp"
#include "window.hpp"
#include "engine.hpp"
#include "asset.hpp"
#include "global.hpp"
#include "global_ui.hpp"


namespace rack {
@@ -15,13 +18,13 @@ struct TooltipIconButton : IconButton {
tooltip = new Tooltip();
tooltip->box.pos = getAbsoluteOffset(Vec(0, BND_WIDGET_HEIGHT));
tooltip->text = tooltipText;
gScene->addChild(tooltip);
global_ui->ui.gScene->addChild(tooltip);
}
IconButton::onMouseEnter(e);
}
void onMouseLeave(EventMouseLeave &e) override {
if (tooltip) {
gScene->removeChild(tooltip);
global_ui->ui.gScene->removeChild(tooltip);
delete tooltip;
tooltip = NULL;
}
@@ -35,7 +38,7 @@ struct NewButton : TooltipIconButton {
tooltipText = "New (" WINDOW_MOD_KEY_NAME "+N)";
}
void onAction(EventAction &e) override {
gRackWidget->reset();
global_ui->app.gRackWidget->reset();
}
};

@@ -45,7 +48,7 @@ struct OpenButton : TooltipIconButton {
tooltipText = "Open (" WINDOW_MOD_KEY_NAME "+O)";
}
void onAction(EventAction &e) override {
gRackWidget->loadDialog();
global_ui->app.gRackWidget->openDialog();
}
};

@@ -55,7 +58,7 @@ struct SaveButton : TooltipIconButton {
tooltipText = "Save (" WINDOW_MOD_KEY_NAME "+S)";
}
void onAction(EventAction &e) override {
gRackWidget->saveDialog();
global_ui->app.gRackWidget->saveDialog();
}
};

@@ -65,7 +68,7 @@ struct SaveAsButton : TooltipIconButton {
tooltipText = "Save as (" WINDOW_MOD_KEY_NAME "+Shift+S)";
}
void onAction(EventAction &e) override {
gRackWidget->saveAsDialog();
global_ui->app.gRackWidget->saveAsDialog();
}
};

@@ -75,7 +78,7 @@ struct RevertButton : TooltipIconButton {
tooltipText = "Revert";
}
void onAction(EventAction &e) override {
gRackWidget->revert();
global_ui->app.gRackWidget->revert();
}
};

@@ -85,7 +88,7 @@ struct DisconnectCablesButton : TooltipIconButton {
tooltipText = "Disconnect cables";
}
void onAction(EventAction &e) override {
gRackWidget->disconnect();
global_ui->app.gRackWidget->disconnect();
}
};

@@ -95,13 +98,13 @@ struct PowerMeterButton : TooltipIconButton {
tooltipText = "Toggle power meter (see manual for explanation)";
}
void onAction(EventAction &e) override {
gPowerMeter ^= true;
global->gPowerMeter ^= true;
}
};

struct EnginePauseItem : MenuItem {
void onAction(EventAction &e) override {
gPaused ^= true;
global->gPaused ^= true;
}
};

@@ -109,7 +112,7 @@ struct SampleRateItem : MenuItem {
float sampleRate;
void onAction(EventAction &e) override {
engineSetSampleRate(sampleRate);
gPaused = false;
global->gPaused = false;
}
};

@@ -119,14 +122,14 @@ struct SampleRateButton : TooltipIconButton {
tooltipText = "Internal sample rate";
}
void onAction(EventAction &e) override {
Menu *menu = gScene->createMenu();
Menu *menu = global_ui->ui.gScene->createMenu();
menu->box.pos = getAbsoluteOffset(Vec(0, box.size.y));
menu->box.size.x = box.size.x;

menu->addChild(MenuLabel::create("Internal sample rate"));

EnginePauseItem *pauseItem = new EnginePauseItem();
pauseItem->text = gPaused ? "Resume engine" : "Pause engine";
pauseItem->text = global->gPaused ? "Resume engine" : "Pause engine";
menu->addChild(pauseItem);

std::vector<float> sampleRates = {44100, 48000, 88200, 96000, 176400, 192000};
@@ -146,14 +149,14 @@ struct RackLockButton : TooltipIconButton {
tooltipText = "Lock modules";
}
void onAction(EventAction &e) override {
gRackWidget->lockModules ^= true;
global_ui->app.gRackWidget->lockModules ^= true;
}
};

struct ZoomSlider : Slider {
void onAction(EventAction &e) override {
Slider::onAction(e);
gRackScene->zoomWidget->setZoom(roundf(value) / 100.0);
global_ui->app.gRackScene->zoomWidget->setZoom(roundf(value) / 100.0);
}
};



+ 12
- 10
src/app/WireWidget.cpp View File

@@ -1,7 +1,9 @@
#include "global_pre.hpp"
#include "app.hpp"
#include "engine.hpp"
#include "componentlibrary.hpp"
#include "window.hpp"
#include "global_ui.hpp"


namespace rack {
@@ -120,25 +122,25 @@ void WireWidget::updateWire() {

Vec WireWidget::getOutputPos() {
if (outputPort) {
return outputPort->getRelativeOffset(outputPort->box.zeroPos().getCenter(), gRackWidget);
return outputPort->getRelativeOffset(outputPort->box.zeroPos().getCenter(), global_ui->app.gRackWidget);
}
else if (hoveredOutputPort) {
return hoveredOutputPort->getRelativeOffset(hoveredOutputPort->box.zeroPos().getCenter(), gRackWidget);
return hoveredOutputPort->getRelativeOffset(hoveredOutputPort->box.zeroPos().getCenter(), global_ui->app.gRackWidget);
}
else {
return gRackWidget->lastMousePos;
return global_ui->app.gRackWidget->lastMousePos;
}
}

Vec WireWidget::getInputPos() {
if (inputPort) {
return inputPort->getRelativeOffset(inputPort->box.zeroPos().getCenter(), gRackWidget);
return inputPort->getRelativeOffset(inputPort->box.zeroPos().getCenter(), global_ui->app.gRackWidget);
}
else if (hoveredInputPort) {
return hoveredInputPort->getRelativeOffset(hoveredInputPort->box.zeroPos().getCenter(), gRackWidget);
return hoveredInputPort->getRelativeOffset(hoveredInputPort->box.zeroPos().getCenter(), global_ui->app.gRackWidget);
}
else {
return gRackWidget->lastMousePos;
return global_ui->app.gRackWidget->lastMousePos;
}
}

@@ -161,17 +163,17 @@ void WireWidget::fromJson(json_t *rootJ) {
}

void WireWidget::draw(NVGcontext *vg) {
float opacity = gToolbar->wireOpacitySlider->value / 100.0;
float tension = gToolbar->wireTensionSlider->value;
float opacity = global_ui->app.gToolbar->wireOpacitySlider->value / 100.0;
float tension = global_ui->app.gToolbar->wireTensionSlider->value;

WireWidget *activeWire = gRackWidget->wireContainer->activeWire;
WireWidget *activeWire = global_ui->app.gRackWidget->wireContainer->activeWire;
if (activeWire) {
// Draw as opaque if the wire is active
if (activeWire == this)
opacity = 1.0;
}
else {
Port *hoveredPort = dynamic_cast<Port*>(gHoveredWidget);
Port *hoveredPort = dynamic_cast<Port*>(global_ui->widgets.gHoveredWidget);
if (hoveredPort && (hoveredPort == outputPort || hoveredPort == inputPort))
opacity = 1.0;
}


+ 13
- 20
src/app/app.cpp View File

@@ -1,53 +1,46 @@
#include "global_pre.hpp"
#include "app.hpp"
#include "util/request.hpp"
#include <thread>
#include "global_ui.hpp"


namespace rack {


std::string gApplicationName = "VCV Rack";
std::string gApplicationVersion = TOSTRING(VERSION);
std::string gApiHost = "https://api.vcvrack.com";
// std::string gApiHost = "http://localhost:8081";
std::string gLatestVersion;
bool gCheckVersion = true;


RackWidget *gRackWidget = NULL;
Toolbar *gToolbar = NULL;
RackScene *gRackScene = NULL;


#ifndef USE_VST2
static void checkVersion() {
json_t *resJ = requestJson(METHOD_GET, gApiHost + "/version", NULL);
json_t *resJ = requestJson(METHOD_GET, global_ui->app.gApiHost + "/version", NULL);

if (resJ) {
json_t *versionJ = json_object_get(resJ, "version");
if (versionJ) {
const char *version = json_string_value(versionJ);
if (version && version != gApplicationVersion) {
gLatestVersion = version;
if (version && version != global_ui->app.gApplicationVersion) {
global_ui->app.gLatestVersion = version;
}
}
json_decref(resJ);
}
}
#endif // USE_VST2


void appInit(bool devMode) {
gRackScene = new RackScene();
gScene = gRackScene;
global_ui->app.gRackScene = new RackScene();
global_ui->ui.gScene = global_ui->app.gRackScene;

#ifndef USE_VST2
// Request latest version from server
if (!devMode && gCheckVersion) {
if (!devMode && global_ui->app.gCheckVersion) {
std::thread t(checkVersion);
t.detach();
}
#endif // USE_VST2
}

void appDestroy() {
delete gRackScene;
delete global_ui->app.gRackScene;
}




+ 31
- 19
src/asset.cpp View File

@@ -1,6 +1,8 @@
#include "global_pre.hpp"
#include "asset.hpp"
#include "util/common.hpp"
#include "osdialog.h"
#include "global.hpp"

#if ARCH_MAC
#include <CoreFoundation/CoreFoundation.h>
@@ -23,15 +25,11 @@
namespace rack {


static std::string globalDir;
static std::string localDir;


void assetInit(bool devMode) {
if (devMode) {
// Use current working directory if running in development mode
globalDir = ".";
localDir = ".";
global->asset.globalDir = ".";
global->asset.localDir = ".";
return;
}

@@ -43,31 +41,36 @@ void assetInit(bool devMode) {
Boolean success = CFURLGetFileSystemRepresentation(resourcesUrl, TRUE, (UInt8*) resourcesBuf, sizeof(resourcesBuf));
assert(success);
CFRelease(resourcesUrl);
globalDir = resourcesBuf;
global->asset.globalDir = resourcesBuf;

// Get home directory
struct passwd *pw = getpwuid(getuid());
assert(pw);
localDir = pw->pw_dir;
localDir += "/Documents/Rack";
global->asset.localDir = pw->pw_dir;
global->asset.localDir += "/Documents/Rack";
#endif
#if ARCH_WIN
#ifndef USE_VST2
char moduleBuf[MAX_PATH];
DWORD length = GetModuleFileName(NULL, moduleBuf, sizeof(moduleBuf));
assert(length > 0);
PathRemoveFileSpec(moduleBuf);
globalDir = moduleBuf;

global->asset.globalDir = moduleBuf;
// Get "My Documents" folder
char documentsBuf[MAX_PATH];
HRESULT result = SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, documentsBuf);
assert(result == S_OK);
localDir = documentsBuf;
localDir += "/Rack";
global->asset.localDir = documentsBuf;
global->asset.localDir += "/Rack";
#else
global->asset.globalDir = global->vst2.program_dir;
global->asset.localDir = global->vst2.program_dir;
#endif // USE_VST2

#endif
#if ARCH_LIN
// TODO For now, users should launch Rack from their terminal in the global directory
globalDir = ".";
global->asset.globalDir = ".";

// Get home directory
const char *homeBuf = getenv("HOME");
@@ -76,20 +79,20 @@ void assetInit(bool devMode) {
assert(pw);
homeBuf = pw->pw_dir;
}
localDir = homeBuf;
localDir += "/.Rack";
global->asset.localDir = homeBuf;
global->asset.localDir += "/.Rack";
#endif
systemCreateDirectory(localDir);
systemCreateDirectory(global->asset.localDir);
}


std::string assetGlobal(std::string filename) {
return globalDir + "/" + filename;
return global->asset.globalDir + "/" + filename;
}


std::string assetLocal(std::string filename) {
return localDir + "/" + filename;
return global->asset.localDir + "/" + filename;
}


@@ -98,5 +101,14 @@ std::string assetPlugin(Plugin *plugin, std::string filename) {
return plugin->path + "/" + filename;
}

#ifdef USE_VST2
std::string assetStaticPlugin(const char *name/*e.g. "Fundamentals"*/, const char *_relPathOrNull) {
return global->asset.localDir + "plugins/" + name + "/" + ((NULL != _relPathOrNull)?_relPathOrNull:"");
}
std::string assetPlugin(const char *name/*e.g. "Fundamentals"*/, const char *_relPathOrNull) {
return assetStaticPlugin(name, _relPathOrNull);
}
#endif // USE_VST2


} // namespace rack

+ 53
- 11
src/audio.cpp View File

@@ -1,13 +1,19 @@
#include "global_pre.hpp"
#include "audio.hpp"
#include "util/common.hpp"
#include "bridge.hpp"
#include "global.hpp"


namespace rack {


AudioIO::AudioIO() {
#ifdef USE_VST2
setDriver(-1);
#else
setDriver(RtAudio::UNSPECIFIED);
#endif
}

AudioIO::~AudioIO() {
@@ -15,44 +21,54 @@ AudioIO::~AudioIO() {
}

std::vector<int> AudioIO::getDrivers() {
std::vector<int> drivers;
#ifndef USE_VST2
std::vector<RtAudio::Api> apis;
RtAudio::getCompiledApi(apis);
std::vector<int> drivers;
for (RtAudio::Api api : apis)
drivers.push_back((int) api);
// Add fake Bridge driver
drivers.push_back(BRIDGE_DRIVER);
#endif // !USE_VST2
return drivers;
}

std::string AudioIO::getDriverName(int driver) {
#ifndef USE_VST2
switch (driver) {
case RtAudio::UNSPECIFIED: return "Unspecified";
case RtAudio::LINUX_ALSA: return "ALSA";
case RtAudio::LINUX_PULSE: return "PulseAudio";
case RtAudio::LINUX_OSS: return "OSS";
case RtAudio::UNIX_JACK: return "JACK";
case RtAudio::MACOSX_CORE: return "Core Audio";
case RtAudio::UNSPECIFIED: return "Unspecified";
case RtAudio::LINUX_ALSA: return "ALSA";
case RtAudio::LINUX_PULSE: return "PulseAudio";
case RtAudio::LINUX_OSS: return "OSS";
case RtAudio::UNIX_JACK: return "JACK";
case RtAudio::MACOSX_CORE: return "Core Audio";
case RtAudio::WINDOWS_WASAPI: return "WASAPI";
case RtAudio::WINDOWS_ASIO: return "ASIO";
case RtAudio::WINDOWS_DS: return "DirectSound";
case RtAudio::RTAUDIO_DUMMY: return "Dummy Audio";
case BRIDGE_DRIVER: return "Bridge";
case RtAudio::WINDOWS_ASIO: return "ASIO";
case RtAudio::WINDOWS_DS: return "DirectSound";
case RtAudio::RTAUDIO_DUMMY: return "Dummy Audio";
case BRIDGE_DRIVER: return "Bridge";
default: return "Unknown";
}
#else
return "VST";
#endif // !USE_VST2
}

void AudioIO::setDriver(int driver) {
// Close device
setDevice(-1, 0);

#ifndef USE_VST2
// Close driver
if (rtAudio) {
delete rtAudio;
rtAudio = NULL;
}
#endif // !USE_VST2

this->driver = 0;

#ifndef USE_VST2
// Open driver
if (driver >= 0) {
rtAudio = new RtAudio((RtAudio::Api) driver);
@@ -61,15 +77,18 @@ void AudioIO::setDriver(int driver) {
else if (driver == BRIDGE_DRIVER) {
this->driver = BRIDGE_DRIVER;
}
#endif // !USE_VST2
}

int AudioIO::getDeviceCount() {
#ifndef USE_VST2
if (rtAudio) {
return rtAudio->getDeviceCount();
}
else if (driver == BRIDGE_DRIVER) {
return BRIDGE_NUM_PORTS;
}
#endif // !USE_VST2
return 0;
}

@@ -77,6 +96,7 @@ bool AudioIO::getDeviceInfo(int device, RtAudio::DeviceInfo *deviceInfo) {
if (!deviceInfo)
return false;

#ifndef USE_VST2
if (rtAudio) {
if (device == this->device) {
*deviceInfo = this->deviceInfo;
@@ -92,6 +112,7 @@ bool AudioIO::getDeviceInfo(int device, RtAudio::DeviceInfo *deviceInfo) {
}
}
}
#endif // !USE_VST2

return false;
}
@@ -100,6 +121,7 @@ int AudioIO::getDeviceChannels(int device) {
if (device < 0)
return 0;

#ifndef USE_VST2
if (rtAudio) {
RtAudio::DeviceInfo deviceInfo;
if (getDeviceInfo(device, &deviceInfo))
@@ -108,6 +130,8 @@ int AudioIO::getDeviceChannels(int device) {
else if (driver == BRIDGE_DRIVER) {
return max(BRIDGE_OUTPUTS, BRIDGE_INPUTS);
}
#endif // !USE_VST2

return 0;
}

@@ -115,6 +139,7 @@ std::string AudioIO::getDeviceName(int device) {
if (device < 0)
return "";

#ifndef USE_VST2
if (rtAudio) {
RtAudio::DeviceInfo deviceInfo;
if (getDeviceInfo(device, &deviceInfo))
@@ -123,6 +148,8 @@ std::string AudioIO::getDeviceName(int device) {
else if (driver == BRIDGE_DRIVER) {
return stringf("%d", device + 1);
}
#endif // !USE_VST2

return "";
}

@@ -130,6 +157,7 @@ std::string AudioIO::getDeviceDetail(int device, int offset) {
if (device < 0)
return "";

#ifndef USE_VST2
if (rtAudio) {
RtAudio::DeviceInfo deviceInfo;
if (getDeviceInfo(device, &deviceInfo)) {
@@ -147,6 +175,8 @@ std::string AudioIO::getDeviceDetail(int device, int offset) {
else if (driver == BRIDGE_DRIVER) {
return stringf("Port %d", device + 1);
}
#endif // !USE_VST2

return "";
}

@@ -158,6 +188,7 @@ void AudioIO::setDevice(int device, int offset) {
}

std::vector<int> AudioIO::getSampleRates() {
#ifndef USE_VST2
if (rtAudio) {
try {
RtAudio::DeviceInfo deviceInfo = rtAudio->getDeviceInfo(device);
@@ -168,6 +199,7 @@ std::vector<int> AudioIO::getSampleRates() {
warn("Failed to query RtAudio device: %s", e.what());
}
}
#endif // !USE_VST2
return {};
}

@@ -180,10 +212,14 @@ void AudioIO::setSampleRate(int sampleRate) {
}

std::vector<int> AudioIO::getBlockSizes() {
#ifdef USE_VST2
return {};
#else
if (rtAudio) {
return {64, 128, 256, 512, 1024, 2048, 4096};
}
return {};
#endif
}

void AudioIO::setBlockSize(int blockSize) {
@@ -201,17 +237,20 @@ void AudioIO::setChannels(int numOutputs, int numInputs) {
}


#ifndef USE_VST2
static int rtCallback(void *outputBuffer, void *inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status, void *userData) {
AudioIO *audioIO = (AudioIO*) userData;
assert(audioIO);
audioIO->processStream((const float *) inputBuffer, (float *) outputBuffer, nFrames);
return 0;
}
#endif // !USE_VST2

void AudioIO::openStream() {
if (device < 0)
return;

#ifndef USE_VST2
if (rtAudio) {
// Open new device
try {
@@ -283,11 +322,13 @@ void AudioIO::openStream() {
setChannels(BRIDGE_OUTPUTS, BRIDGE_INPUTS);
bridgeAudioSubscribe(device, this);
}
#endif // !USE_VST2
}

void AudioIO::closeStream() {
setChannels(0, 0);

#ifndef USE_VST2
if (rtAudio) {
if (rtAudio->isStreamRunning()) {
info("Stopping RtAudio stream %d", device);
@@ -312,6 +353,7 @@ void AudioIO::closeStream() {
else if (driver == BRIDGE_DRIVER) {
bridgeAudioUnsubscribe(device, this);
}
#endif // !USE_VST2

onCloseStream();
}


+ 2
- 0
src/bridge.cpp View File

@@ -1,6 +1,8 @@
#include "global_pre.hpp"
#include "bridge.hpp"
#include "util/common.hpp"
#include "dsp/ringbuffer.hpp"
#include "global.hpp"

#include <unistd.h>
#if ARCH_WIN


+ 216
- 116
src/engine.cpp View File

@@ -9,32 +9,17 @@
#include <xmmintrin.h>
#include <pmmintrin.h>

#include "global_pre.hpp"
#include "engine.hpp"
#include "global.hpp"


namespace rack {

bool gPaused = false;
std::vector<Module*> gModules;
std::vector<Wire*> gWires;
bool gPowerMeter = false;

static bool running = false;
static float sampleRate = 44100.f;
static float sampleTime = 1.f / sampleRate;
static float sampleRateRequested = sampleRate;
#ifdef USE_VST2
extern void vst2_handle_ui_param (int uniqueParamId, float normValue);
#endif // USE_VST2

static Module *resetModule = NULL;
static Module *randomizeModule = NULL;

static std::mutex mutex;
static std::thread thread;
static VIPMutex vipMutex;
namespace rack {

// Parameter interpolation
static Module *smoothModule = NULL;
static int smoothParamId;
static float smoothValue;


float Light::getBrightness() {
@@ -47,7 +32,7 @@ void Light::setBrightnessSmooth(float brightness, float frames) {
float v = (brightness > 0.f) ? brightness * brightness : 0.f;
if (v < value) {
// Fade out light with lambda = framerate
value += (v - value) * sampleTime * frames * 60.f;
value += (v - value) * global->engine.sampleTime * frames * 60.f;
}
else {
// Immediately illuminate light
@@ -63,66 +48,43 @@ void Wire::step() {


void engineInit() {
engineSetSampleRate(44100.0);
}

void engineDestroy() {
// Make sure there are no wires or modules in the rack on destruction. This suggests that a module failed to remove itself before the RackWidget was destroyed.
assert(gWires.empty());
assert(gModules.empty());
// Make sure there are no wires or modules in the rack on destruction. This suggests that a module failed to remove itself before the WINDOW was destroyed.
assert(global->gWires.empty());
assert(global->gModules.empty());
}

static void engineStep() {
// Sample rate
if (sampleRateRequested != sampleRate) {
sampleRate = sampleRateRequested;
sampleTime = 1.f / sampleRate;
for (Module *module : gModules) {
module->onSampleRateChange();
// Param interpolation
if (global->engine.smoothModule) {
float value = global->engine.smoothModule->params[global->engine.smoothParamId].value;
const float lambda = 60.0; // decay rate is 1 graphics frame
float delta = global->engine.smoothValue - value;
float newValue = value + delta * lambda * global->engine.sampleTime;
if (value == newValue) {
// Snap to actual smooth value if the value doesn't change enough (due to the granularity of floats)
global->engine.smoothModule->params[global->engine.smoothParamId].value = global->engine.smoothValue;
global->engine.smoothModule = NULL;
}
}

// Events
if (resetModule) {
resetModule->onReset();
resetModule = NULL;
}
if (randomizeModule) {
randomizeModule->onRandomize();
randomizeModule = NULL;
}

// Param smoothing
{
Module *localSmoothModule = smoothModule;
int localSmoothParamId = smoothParamId;
float localSmoothValue = smoothValue;
if (localSmoothModule) {
float value = localSmoothModule->params[localSmoothParamId].value;
const float lambda = 60.0; // decay rate is 1 graphics frame
float delta = localSmoothValue - value;
float newValue = value + delta * lambda * sampleTime;
if (value == newValue) {
// Snap to actual smooth value if the value doesn't change enough (due to the granularity of floats)
localSmoothModule->params[localSmoothParamId].value = localSmoothValue;
smoothModule = NULL;
}
else {
localSmoothModule->params[localSmoothParamId].value = newValue;
}
else {
global->engine.smoothModule->params[global->engine.smoothParamId].value = newValue;
}
}

// Step modules
for (Module *module : gModules) {
for (Module *module : global->gModules) {
std::chrono::high_resolution_clock::time_point startTime;
if (gPowerMeter) {
if (global->gPowerMeter) {
startTime = std::chrono::high_resolution_clock::now();

module->step();

auto stopTime = std::chrono::high_resolution_clock::now();
float cpuTime = std::chrono::duration<float>(stopTime - startTime).count() * sampleRate;
module->cpuTime += (cpuTime - module->cpuTime) * sampleTime / 0.5f;
float cpuTime = std::chrono::duration<float>(stopTime - startTime).count() * global->engine.sampleRate;
module->cpuTime += (cpuTime - module->cpuTime) * global->engine.sampleTime / 0.5f;
}
else {
module->step();
@@ -146,7 +108,7 @@ static void engineStep() {
}

// Step cables by moving their output values to inputs
for (Wire *wire : gWires) {
for (Wire *wire : global->gWires) {
wire->step();
}
}
@@ -163,17 +125,17 @@ static void engineRun() {
double ahead = 0.0;
auto lastTime = std::chrono::high_resolution_clock::now();

while (running) {
vipMutex.wait();
while (global->engine.running) {
global->engine.vipMutex.wait();

if (!gPaused) {
std::lock_guard<std::mutex> lock(mutex);
if (!global->gPaused) {
std::lock_guard<std::mutex> lock(global->engine.mutex);
for (int i = 0; i < mutexSteps; i++) {
engineStep();
}
}

double stepTime = mutexSteps * sampleTime;
double stepTime = mutexSteps * global->engine.sampleTime;
ahead += stepTime;
auto currTime = std::chrono::high_resolution_clock::now();
const double aheadFactor = 2.0;
@@ -191,56 +153,52 @@ static void engineRun() {
}

void engineStart() {
running = true;
thread = std::thread(engineRun);
global->engine.running = true;
global->engine.thread = std::thread(engineRun);
}

void engineStop() {
running = false;
thread.join();
global->engine.running = false;
global->engine.thread.join();
}

void engineAddModule(Module *module) {
assert(module);
VIPLock vipLock(vipMutex);
std::lock_guard<std::mutex> lock(mutex);
VIPLock vipLock(global->engine.vipMutex);
std::lock_guard<std::mutex> lock(global->engine.mutex);
// Check that the module is not already added
auto it = std::find(gModules.begin(), gModules.end(), module);
assert(it == gModules.end());
gModules.push_back(module);
auto it = std::find(global->gModules.begin(), global->gModules.end(), module);
assert(it == global->gModules.end());
global->gModules.push_back(module);
#ifdef USE_VST2
module->vst2_unique_param_base_id = global->vst2.next_unique_param_base_id;
global->vst2.next_unique_param_base_id += module->params.size() + 1;
#endif // USE_VST2
}

void engineRemoveModule(Module *module) {
assert(module);
VIPLock vipLock(vipMutex);
std::lock_guard<std::mutex> lock(mutex);
VIPLock vipLock(global->engine.vipMutex);
std::lock_guard<std::mutex> lock(global->engine.mutex);
// If a param is being smoothed on this module, stop smoothing it immediately
if (module == smoothModule) {
smoothModule = NULL;
if (module == global->engine.smoothModule) {
global->engine.smoothModule = NULL;
}
// Check that all wires are disconnected
for (Wire *wire : gWires) {
for (Wire *wire : global->gWires) {
assert(wire->outputModule != module);
assert(wire->inputModule != module);
}
// Check that the module actually exists
auto it = std::find(gModules.begin(), gModules.end(), module);
assert(it != gModules.end());
auto it = std::find(global->gModules.begin(), global->gModules.end(), module);
assert(it != global->gModules.end());
// Remove it
gModules.erase(it);
}

void engineResetModule(Module *module) {
resetModule = module;
}

void engineRandomizeModule(Module *module) {
randomizeModule = module;
global->gModules.erase(it);
}

static void updateActive() {
// Set everything to inactive
for (Module *module : gModules) {
for (Module *module : global->gModules) {
for (Input &input : module->inputs) {
input.active = false;
}
@@ -249,7 +207,7 @@ static void updateActive() {
}
}
// Set inputs/outputs to active
for (Wire *wire : gWires) {
for (Wire *wire : global->gWires) {
wire->outputModule->outputs[wire->outputId].active = true;
wire->inputModule->inputs[wire->inputId].active = true;
}
@@ -257,59 +215,201 @@ static void updateActive() {

void engineAddWire(Wire *wire) {
assert(wire);
VIPLock vipLock(vipMutex);
std::lock_guard<std::mutex> lock(mutex);
VIPLock vipLock(global->engine.vipMutex);
std::lock_guard<std::mutex> lock(global->engine.mutex);
// Check wire properties
assert(wire->outputModule);
assert(wire->inputModule);
// Check that the wire is not already added, and that the input is not already used by another cable
for (Wire *wire2 : gWires) {
for (Wire *wire2 : global->gWires) {
assert(wire2 != wire);
assert(!(wire2->inputModule == wire->inputModule && wire2->inputId == wire->inputId));
}
// Add the wire
gWires.push_back(wire);
global->gWires.push_back(wire);
updateActive();
}

void engineRemoveWire(Wire *wire) {
assert(wire);
VIPLock vipLock(vipMutex);
std::lock_guard<std::mutex> lock(mutex);
VIPLock vipLock(global->engine.vipMutex);
std::lock_guard<std::mutex> lock(global->engine.mutex);
// Check that the wire is already added
auto it = std::find(gWires.begin(), gWires.end(), wire);
assert(it != gWires.end());
auto it = std::find(global->gWires.begin(), global->gWires.end(), wire);
assert(it != global->gWires.end());
// Set input to 0V
wire->inputModule->inputs[wire->inputId].value = 0.0;
// Remove the wire
gWires.erase(it);
global->gWires.erase(it);
updateActive();
}

#ifdef USE_VST2
static int loc_vst2_find_unique_param_by_module_and_paramid(Module *module, int paramId) {
return module->vst2_unique_param_base_id + paramId;
}

static bool loc_vst2_find_module_and_paramid_by_unique_paramid(int uniqueParamId, Module**retModule, int *retParamId) {
if(uniqueParamId >= 0)
{
if(uniqueParamId < VST2_MAX_UNIQUE_PARAM_IDS)
{
// (todo) speed this up with a hashtable
for(Module *module : global->gModules) {
if( (uniqueParamId >= module->vst2_unique_param_base_id) &&
(uniqueParamId < (module->vst2_unique_param_base_id + module->params.size()))
)
{
*retParamId = (uniqueParamId - module->vst2_unique_param_base_id);
*retModule = module;
return true;
}
}
}
}
return false;
}
#endif // USE_VST2

#ifdef USE_VST2
void engineSetParam(Module *module, int paramId, float value, bool bVSTAutomate) {
#else
void engineSetParam(Module *module, int paramId, float value) {
#endif
if(module->params[paramId].value == value)
return;
module->params[paramId].value = value;

#ifdef USE_VST2
if(bVSTAutomate && !global->vst2.b_patch_loading)
{
// (note) [bsp] this is usually called from the UI thread (see ParamWidget.cpp)
// (note) [bsp] VST requires all parameters to be in the normalized 0..1 range
// (note) [bsp] VCV Rack parameters however are arbitrary floats
// (note) [bsp] this scale+bias hack should work for most parameters, though
// (note) [bsp] => automation curves will look a bit strange, though
// (note) [bsp] => this may potentially crash modules which cannot deal with params outside the expected range
// (todo) add min/max query methods to each module
float normValue = value / 2.0f;
normValue += 0.5f;
// printf("xxx vcvrack: paramId=%d value=%f (=> %f)\n", paramId, value, normValue);
int uniqueParamId = loc_vst2_find_unique_param_by_module_and_paramid(module, paramId);
if(-1 != uniqueParamId)
{
// Call host audioMasterAutomate
vst2_handle_ui_param(uniqueParamId, normValue);
}
}
#endif // USE_VST2
}

#ifdef USE_VST2
}
using namespace rack;
void vst2_queue_param(int uniqueParamId, float normValue) {
// Called from any thread via setParameter()
// (note) protected by caller mutex
VST2QueuedParam qp;
qp.unique_id = uniqueParamId;
qp.norm_value = normValue;
global->vst2.queued_params.push_back(qp);
}

void vst2_handle_queued_params(void) {
// Called in processReplacing()
// (note) protected by caller mutex
// vector<VST2QueuedParam>::iterator it;
// for(it = global->vst2.queued_params.begin(); it != global->vst2.queued_params.end(); it++)
for(VST2QueuedParam qp : global->vst2.queued_params)
{
Module *module;
int paramId;
if(loc_vst2_find_module_and_paramid_by_unique_paramid(qp.unique_id, &module, &paramId))
{
float value = qp.norm_value - 0.5f;
value *= 2.0f;
engineSetParam(module, paramId, value, false/*bVSTAutomate*/);
}
}
global->vst2.queued_params.clear();
}

float vst2_get_param(int uniqueParamId) {
Module *module;
int paramId;
if(loc_vst2_find_module_and_paramid_by_unique_paramid(uniqueParamId, &module, &paramId))
{
if(sUI(paramId) < sUI(module->params.size())) // paranoia
{
return module->params[paramId].value;
}
}
return 0.0f;
}

void vst2_get_param_name (int uniqueParamId, char *s, int sMaxLen) {
Module *module;
int paramId;
if(loc_vst2_find_module_and_paramid_by_unique_paramid(uniqueParamId, &module, &paramId))
{
if(sUI(paramId) < sUI(module->params.size())) // paranoia
{
// (note) VCV params do not have names
::snprintf(s, sMaxLen, "%4d: <param>", uniqueParamId);
return;
}
}
::snprintf(s, sMaxLen, "%4d: -", uniqueParamId);
}

namespace rack {
#endif // USE_VST2

void engineSetParamSmooth(Module *module, int paramId, float value) {
// If another param is being smoothed, jump value
if (smoothModule && !(smoothModule == module && smoothParamId == paramId)) {
smoothModule->params[smoothParamId].value = smoothValue;
VIPLock vipLock(global->engine.vipMutex);
std::lock_guard<std::mutex> lock(global->engine.mutex);
// Since only one param can be smoothed at a time, if another param is currently being smoothed, skip to its final state
if (global->engine.smoothModule && !(global->engine.smoothModule == module && global->engine.smoothParamId == paramId)) {
global->engine.smoothModule->params[global->engine.smoothParamId].value = global->engine.smoothValue;
}
smoothParamId = paramId;
smoothValue = value;
smoothModule = module;
global->engine.smoothModule = module;
global->engine.smoothParamId = paramId;
global->engine.smoothValue = value;
}

void engineSetSampleRate(float newSampleRate) {
sampleRateRequested = newSampleRate;
VIPLock vipLock(global->engine.vipMutex);
std::lock_guard<std::mutex> lock(global->engine.mutex);
global->engine.sampleRate = newSampleRate;
global->engine.sampleTime = 1.0 / global->engine.sampleRate;
// onSampleRateChange
for (Module *module : global->gModules) {
module->onSampleRateChange();
}
}

float engineGetSampleRate() {
return sampleRate;
return global->engine.sampleRate;
}

float engineGetSampleTime() {
return sampleTime;
return global->engine.sampleTime;
}

} // namespace rack


#ifdef USE_VST2
using namespace rack;
void vst2_set_samplerate(sF32 _rate) {
rack::engineSetSampleRate(_rate);
}
void vst2_engine_process(float *const*_in, float **_out, unsigned int _numFrames) {
global->vst2.inputs = _in;
global->vst2.outputs = _out;
for(global->vst2.frame_idx = 0u; global->vst2.frame_idx < _numFrames; global->vst2.frame_idx++)
{
engineStep();
}
}
#endif // USE_VST2

+ 2
- 0
src/gamepad.cpp View File

@@ -1,3 +1,4 @@
#ifndef USE_VST2
#include "gamepad.hpp"
#include <GLFW/glfw3.h>

@@ -113,3 +114,4 @@ void gamepadStep() {


} // namespace rack
#endif // USE_VST2

+ 8
- 7
src/keyboard.cpp View File

@@ -1,12 +1,13 @@
#include "global_pre.hpp"
#include "keyboard.hpp"
#include <GLFW/glfw3.h>
#include "global.hpp"


namespace rack {


static const int KEYBOARD_DRIVER = -11;
static KeyboardDriver *driver = NULL;


void KeyboardInputDevice::onKeyPress(int key) {
@@ -119,20 +120,20 @@ void KeyboardDriver::unsubscribeInputDevice(int deviceId, MidiInput *midiInput)


void keyboardInit() {
driver = new KeyboardDriver();
midiDriverAdd(KEYBOARD_DRIVER, driver);
global->keyboard.driver = new KeyboardDriver();
midiDriverAdd(KEYBOARD_DRIVER, global->keyboard.driver);
}

void keyboardPress(int key) {
if (!driver)
if (!global->keyboard.driver)
return;
driver->device.onKeyPress(key);
global->keyboard.driver->device.onKeyPress(key);
}

void keyboardRelease(int key) {
if (!driver)
if (!global->keyboard.driver)
return;
driver->device.onKeyRelease(key);
global->keyboard.driver->device.onKeyRelease(key);
}




+ 151
- 11
src/main.cpp View File

@@ -1,3 +1,4 @@
#include "global_pre.hpp"
#include "util/common.hpp"
#include "engine.hpp"
#include "window.hpp"
@@ -8,21 +9,159 @@
#include "bridge.hpp"
#include "midi.hpp"
#include "rtmidi.hpp"
#include "vstmidi.hpp"
#include "keyboard.hpp"
#include "gamepad.hpp"
#include "util/color.hpp"

#include "osdialog.h"
#ifdef YAC_POSIX
#include <unistd.h>
#endif
#include "global.hpp"
#include "global_ui.hpp"


using namespace rack;

/*__declspec(dllexport) won't link*/ YAC_TLS rack::Global *rack::global;
/*__declspec(dllexport) won't link*/ YAC_TLS rack::GlobalUI *rack::global_ui;

#ifdef USE_VST2
int vst2_init(int argc, char* argv[]) {
bool devMode = false;
std::string patchFile;

#if 0
// Parse command line arguments
int c;
opterr = 0;
while ((c = getopt(argc, argv, "d")) != -1) {
switch (c) {
case 'd': {
devMode = true;
} break;
default: break;
}
}
if (optind < argc) {
patchFile = argv[optind];
}
#endif

// Initialize environment
randomInit();
assetInit(devMode);
loggerInit(devMode);

// Log environment
info("%s %s", global_ui->app.gApplicationName.c_str(), global_ui->app.gApplicationVersion.c_str());
if (devMode)
info("Development mode");
info("Global directory: %s", assetGlobal("").c_str());
info("Local directory: %s", assetLocal("").c_str());

// Initialize app
pluginInit(devMode);
engineInit();
#ifndef USE_VST2
rtmidiInit();
bridgeInit();
#endif // USE_VST2
vstmidiInit();
keyboardInit();
#ifndef USE_VST2
gamepadInit();
windowInit(); // must be done in vst2 ui thread
#endif // USE_VST2
appInit(devMode);

#if 0
if (patchFile.empty()) {
std::string oldLastPath = global_ui->app.gRackWidget->lastPath;
// To prevent launch crashes, if Rack crashes between now and 15 seconds from now, the "skipAutosaveOnLaunch" property will remain in settings.json, so that in the next launch, the broken autosave will not be loaded.
bool oldSkipAutosaveOnLaunch = global->settings.gSkipAutosaveOnLaunch;
global->settings.gSkipAutosaveOnLaunch = true;
settingsSave(assetLocal("settings.json"));
global->settings.gSkipAutosaveOnLaunch = false;
if (oldSkipAutosaveOnLaunch && osdialog_message(OSDIALOG_INFO, OSDIALOG_YES_NO, "Rack has recovered from a crash, possibly caused by a faulty module in your patch. Would you like to clear your patch and start over?")) {
// Do nothing. Empty patch is already loaded.
}
else {
// Load autosave
global_ui->app.gRackWidget->loadPatch(assetLocal("autosave.vcv"));
}
global_ui->app.gRackWidget->lastPath = oldLastPath;
}
else {
// Load patch
global_ui->app.gRackWidget->loadPatch(patchFile);
}
#endif

// // engineStart(); // starts bg thread for audio rendering
return 0;
}

void vst2_editor_create(void) {
windowInit();
// settingsLoad(assetLocal("settings.json"));
glfwHideWindow(rack::global_ui->window.gWindow);
}

void vst2_editor_destroy(void) {
windowDestroy();
}

void vst2_editor_loop(void) {
windowRun();
}

void vst2_exit(void) {
// Destroy namespaces
// // engineStop();
printf("xxx vst2_exit 1\n");
// global_ui->app.gRackWidget->savePatch(assetLocal("autosave.vcv"));
// settingsSave(assetLocal("settings.json"));
printf("xxx vst2_exit 2\n");
#if 0 // (note) setting this to 1 seems to work fine (and it fixes the obvious mem leaks)
appDestroy();
printf("xxx vst2_exit 3\n");
#ifndef USE_VST2
windowDestroy();
bridgeDestroy();
#endif // USE_VST2
printf("xxx vst2_exit 4\n");
engineDestroy();
printf("xxx vst2_exit 5\n");
#endif
printf("xxx vst2_exit destroy midi\n");
midiDestroy();
printf("xxx vst2_exit destroy midi done\n");
#if 0
printf("xxx vst2_exit 6\n");
pluginDestroy();
printf("xxx vst2_exit 7\n");
loggerDestroy();
#endif
printf("xxx vst2_exit 8 (leave)\n");
}


#else

static rack::Global loc_global;
static rack::GlobalUI loc_global_ui;

int main(int argc, char* argv[]) {
bool devMode = false;
std::string patchFile;

loc_global.init();
loc_global_ui.init();
rack::global = &loc_global;
rack::global_ui = &loc_global_ui;

// Parse command line arguments
int c;
opterr = 0;
@@ -44,7 +183,7 @@ int main(int argc, char* argv[]) {
loggerInit(devMode);

// Log environment
info("%s %s", gApplicationName.c_str(), gApplicationVersion.c_str());
info("%s %s", global_ui->app.gApplicationName.c_str(), global_ui->app.gApplicationVersion.c_str());
if (devMode)
info("Development mode");
info("Global directory: %s", assetGlobal("").c_str());
@@ -62,24 +201,24 @@ int main(int argc, char* argv[]) {
settingsLoad(assetLocal("settings.json"));

if (patchFile.empty()) {
std::string oldLastPath = global_ui->app.gRackWidget->lastPath;
// To prevent launch crashes, if Rack crashes between now and 15 seconds from now, the "skipAutosaveOnLaunch" property will remain in settings.json, so that in the next launch, the broken autosave will not be loaded.
bool oldSkipAutosaveOnLaunch = gSkipAutosaveOnLaunch;
gSkipAutosaveOnLaunch = true;
bool oldSkipAutosaveOnLaunch = global->settings.gSkipAutosaveOnLaunch;
global->settings.gSkipAutosaveOnLaunch = true;
settingsSave(assetLocal("settings.json"));
gSkipAutosaveOnLaunch = false;
if (oldSkipAutosaveOnLaunch && osdialog_message(OSDIALOG_INFO, OSDIALOG_YES_NO, "Rack has recovered from a crash, possibly caused by a faulty module in your patch. Clear your patch and start over?")) {
gRackWidget->lastPath = "";
global->settings.gSkipAutosaveOnLaunch = false;
if (oldSkipAutosaveOnLaunch && osdialog_message(OSDIALOG_INFO, OSDIALOG_YES_NO, "Rack has recovered from a crash, possibly caused by a faulty module in your patch. Would you like to clear your patch and start over?")) {
// Do nothing. Empty patch is already loaded.
}
else {
// Load autosave
std::string oldLastPath = gRackWidget->lastPath;
gRackWidget->load(assetLocal("autosave.vcv"));
gRackWidget->lastPath = oldLastPath;
global_ui->app.gRackWidget->loadPatch(assetLocal("autosave.vcv"));
}
global_ui->app.gRackWidget->lastPath = oldLastPath;
}
else {
// Load patch
gRackWidget->load(patchFile);
global_ui->app.gRackWidget->loadPatch(patchFile);
}

engineStart();
@@ -87,7 +226,7 @@ int main(int argc, char* argv[]) {
engineStop();

// Destroy namespaces
gRackWidget->save(assetLocal("autosave.vcv"));
global_ui->app.gRackWidget->savePatch(assetLocal("autosave.vcv"));
settingsSave(assetLocal("settings.json"));
appDestroy();
windowDestroy();
@@ -99,3 +238,4 @@ int main(int argc, char* argv[]) {

return 0;
}
#endif // USE_VST2

+ 14
- 16
src/midi.cpp View File

@@ -1,17 +1,15 @@
#include "global_pre.hpp"
#include "midi.hpp"
#include "rtmidi.hpp"
#include "bridge.hpp"
#include "gamepad.hpp"
#include "keyboard.hpp"
#include "global.hpp"


namespace rack {


static std::vector<int> driverIds;
static std::map<int, MidiDriver*> drivers;


////////////////////
// MidiDevice
////////////////////
@@ -48,12 +46,12 @@ MidiIO::~MidiIO() {
}

std::vector<int> MidiIO::getDriverIds() {
return driverIds;
return global->midi.driverIds;
}

std::string MidiIO::getDriverName(int driverId) {
auto it = drivers.find(driverId);
if (it == drivers.end())
auto it = global->midi.drivers.find(driverId);
if (it == global->midi.drivers.end())
return "";

return it->second->getName();
@@ -68,8 +66,8 @@ void MidiIO::setDriverId(int driverId) {
this->driverId = -1;

// Set driver
auto it = drivers.find(driverId);
if (it != drivers.end()) {
auto it = global->midi.drivers.find(driverId);
if (it != global->midi.drivers.end()) {
driver = it->second;
this->driverId = driverId;
}
@@ -119,8 +117,8 @@ void MidiIO::fromJson(json_t *rootJ) {
////////////////////

MidiInput::MidiInput() {
if (driverIds.size() >= 1) {
setDriverId(driverIds[0]);
if (global->midi.driverIds.size() >= 1) {
setDriverId(global->midi.driverIds[0]);
}
}

@@ -199,17 +197,17 @@ void MidiOutput::setDeviceId(int deviceId) {
////////////////////

void midiDestroy() {
driverIds.clear();
for (auto &pair : drivers) {
global->midi.driverIds.clear();
for (auto &pair : global->midi.drivers) {
delete pair.second;
}
drivers.clear();
global->midi.drivers.clear();
}

void midiDriverAdd(int driverId, MidiDriver *driver) {
assert(driver);
driverIds.push_back(driverId);
drivers[driverId] = driver;
global->midi.driverIds.push_back(driverId);
global->midi.drivers[driverId] = driver;
}




+ 151
- 39
src/plugin.cpp View File

@@ -1,4 +1,6 @@
#include "global_pre.hpp"
#include "plugin.hpp"
#include "Core/Core.hpp"
#include "app.hpp"
#include "asset.hpp"
#include "util/request.hpp"
@@ -7,16 +9,26 @@
#include <stdio.h>
#include <assert.h>
#include <string.h>

#ifdef YAC_POSIX
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/param.h> // for MAXPATHLEN
#include <fcntl.h>
#include <dirent.h>
#endif

#include <thread>
#include <stdexcept>

#include "global.hpp"
#include "global_ui.hpp"

#ifndef USE_VST2
#define ZIP_STATIC
#include <zip.h>
#endif // USE_VST2
#include <jansson.h>

#if ARCH_WIN
@@ -26,20 +38,16 @@
#else
#include <dlfcn.h>
#endif
#include <dirent.h>


namespace rack {


std::list<Plugin*> gPlugins;
std::string gToken;

typedef void (*InitCallback)(Plugin *);

static bool isDownloading = false;
static float downloadProgress = 0.0;
static std::string downloadName;
static std::string loginStatus;
#ifdef USE_VST2
static void vst2_load_static_rack_plugins(void);
#endif // USE_VST2


Plugin::~Plugin() {
@@ -77,7 +85,13 @@ static bool loadPlugin(std::string path) {
// Load dynamic/shared library
#if ARCH_WIN
SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS);
// #ifdef USE_VST2
// std::wstring libNameW = std::wstring(libraryFilename.begin(), libraryFilename.end());
// HINSTANCE handle = LoadLibraryW(libNameW.c_str());
// #else
HINSTANCE handle = LoadLibrary(libraryFilename.c_str());
// #endif
SetErrorMode(0);
if (!handle) {
int error = GetLastError();
@@ -93,7 +107,6 @@ static bool loadPlugin(std::string path) {
#endif

// Call plugin's init() function
typedef void (*InitCallback)(Plugin *);
InitCallback initCallback;
#if ARCH_WIN
initCallback = (InitCallback) GetProcAddress(handle, "init");
@@ -121,13 +134,14 @@ static bool loadPlugin(std::string path) {
}

// Add plugin to list
gPlugins.push_back(plugin);
global->plugin.gPlugins.push_back(plugin);
info("Loaded plugin %s %s from %s", plugin->slug.c_str(), plugin->version.c_str(), libraryFilename.c_str());

return true;
}

static bool syncPlugin(std::string slug, json_t *manifestJ, bool dryRun) {
#ifndef USE_VST2
// Check that "status" is "available"
json_t *statusJ = json_object_get(manifestJ, "status");
if (!statusJ) {
@@ -170,15 +184,18 @@ static bool syncPlugin(std::string slug, json_t *manifestJ, bool dryRun) {
#endif

std::string downloadUrl;
downloadUrl = gApiHost;
downloadUrl = global_ui->app.gApiHost;
downloadUrl += "/download";
if (dryRun) {
downloadUrl += "/available";
}
downloadUrl += "?token=" + requestEscape(gToken);
downloadUrl += "?token=" + requestEscape(global->plugin.gToken);
downloadUrl += "&slug=" + requestEscape(slug);
downloadUrl += "&version=" + requestEscape(latestVersion);
downloadUrl += "&arch=" + requestEscape(arch);
#ifdef USE_VST2
downloadUrl += "&format=vst2";
#endif // USE_VST2

if (dryRun) {
// Check if available
@@ -194,20 +211,23 @@ static bool syncPlugin(std::string slug, json_t *manifestJ, bool dryRun) {
return json_boolean_value(successJ);
}
else {
downloadName = name;
downloadProgress = 0.0;
global->plugin.downloadName = name;
global->plugin.downloadProgress = 0.0;
info("Downloading plugin %s %s %s", slug.c_str(), latestVersion.c_str(), arch.c_str());

// Download zip
std::string pluginDest = assetLocal("plugins/" + slug + ".zip");
if (!requestDownload(downloadUrl, pluginDest, &downloadProgress)) {
if (!requestDownload(downloadUrl, pluginDest, &global->plugin.downloadProgress)) {
warn("Plugin %s download was unsuccessful", slug.c_str());
return false;
}

downloadName = "";
global->plugin.downloadName = "";
return true;
}
#else
return false;
#endif // USE_VST2
}

static void loadPlugins(std::string path) {
@@ -225,6 +245,7 @@ static void loadPlugins(std::string path) {
}
}

#ifndef USE_VST2
/** Returns 0 if successful */
static int extractZipHandle(zip_t *za, const char *dir) {
int err;
@@ -277,7 +298,9 @@ static int extractZipHandle(zip_t *za, const char *dir) {
}
return 0;
}
#endif // USE_VST2

#ifndef USE_VST2
/** Returns 0 if successful */
static int extractZip(const char *filename, const char *path) {
int err;
@@ -293,7 +316,9 @@ static int extractZip(const char *filename, const char *path) {
err = extractZipHandle(za, path);
return err;
}
#endif // USE_VST2

#ifndef USE_VST2
static void extractPackages(std::string path) {
std::string message;

@@ -316,6 +341,7 @@ static void extractPackages(std::string path) {
osdialog_message(OSDIALOG_WARNING, OSDIALOG_OK, message.c_str());
}
}
#endif // USE_VST2

////////////////////
// public API
@@ -327,9 +353,10 @@ void pluginInit(bool devMode) {
// Load core
// This function is defined in core.cpp
Plugin *corePlugin = new Plugin();
init(corePlugin);
gPlugins.push_back(corePlugin);
init_plugin_Core(corePlugin);
global->plugin.gPlugins.push_back(corePlugin);

#ifndef USE_VST2
// Get local plugins directory
std::string localPlugins = assetLocal("plugins");
mkdir(localPlugins.c_str(), 0755);
@@ -345,12 +372,19 @@ void pluginInit(bool devMode) {
}

// Extract packages and load plugins
#ifndef USE_VST2
extractPackages(localPlugins);
#endif // USE_VST2
loadPlugins(localPlugins);

#else
vst2_load_static_rack_plugins();
#endif // USE_VST2
}

void pluginDestroy() {
for (Plugin *plugin : gPlugins) {
#ifndef USE_VST2
for (Plugin *plugin : global->plugin.gPlugins) {
// Free library handle
#if ARCH_WIN
if (plugin->handle)
@@ -364,28 +398,30 @@ void pluginDestroy() {
// It might be best to let them leak anyway, because "crash on exit" issues would occur with badly-written plugins.
// delete plugin;
}
gPlugins.clear();
#endif // USE_VST2
global->plugin.gPlugins.clear();
}

bool pluginSync(bool dryRun) {
if (gToken.empty())
#ifndef USE_VST2
if (global->plugin.gToken.empty())
return false;

bool available = false;

if (!dryRun) {
isDownloading = true;
downloadProgress = 0.0;
downloadName = "Updating plugins...";
global->plugin.isDownloading = true;
global->plugin.downloadProgress = 0.0;
global->plugin.downloadName = "Updating plugins...";
}
defer({
isDownloading = false;
global->plugin.isDownloading = false;
});

// Get user's plugins list
json_t *pluginsReqJ = json_object();
json_object_set(pluginsReqJ, "token", json_string(gToken.c_str()));
json_t *pluginsResJ = requestJson(METHOD_GET, gApiHost + "/plugins", pluginsReqJ);
json_object_set(pluginsReqJ, "token", json_string(global->plugin.gToken.c_str()));
json_t *pluginsResJ = requestJson(METHOD_GET, global_ui->app.gApiHost + "/plugins", pluginsReqJ);
json_decref(pluginsReqJ);
if (!pluginsResJ) {
warn("Request for user's plugins failed");
@@ -402,7 +438,7 @@ bool pluginSync(bool dryRun) {
}

// Get community manifests
json_t *manifestsResJ = requestJson(METHOD_GET, gApiHost + "/community/manifests", NULL);
json_t *manifestsResJ = requestJson(METHOD_GET, global_ui->app.gApiHost + "/community/manifests", NULL);
if (!manifestsResJ) {
warn("Request for community manifests failed");
return false;
@@ -444,35 +480,40 @@ bool pluginSync(bool dryRun) {
}

return available;
#else
return false;
#endif // USE_VST2
}

void pluginLogIn(std::string email, std::string password) {
#ifndef USE_VST2
json_t *reqJ = json_object();
json_object_set(reqJ, "email", json_string(email.c_str()));
json_object_set(reqJ, "password", json_string(password.c_str()));
json_t *resJ = requestJson(METHOD_POST, gApiHost + "/token", reqJ);
json_t *resJ = requestJson(METHOD_POST, global_ui->app.gApiHost + "/token", reqJ);
json_decref(reqJ);

if (resJ) {
json_t *errorJ = json_object_get(resJ, "error");
if (errorJ) {
const char *errorStr = json_string_value(errorJ);
loginStatus = errorStr;
global->plugin.loginStatus = errorStr;
}
else {
json_t *tokenJ = json_object_get(resJ, "token");
if (tokenJ) {
const char *tokenStr = json_string_value(tokenJ);
gToken = tokenStr;
loginStatus = "";
global->plugin.gToken = tokenStr;
global->plugin.loginStatus = "";
}
}
json_decref(resJ);
}
#endif
}

void pluginLogOut() {
gToken = "";
global->plugin.gToken = "";
}

void pluginCancelDownload() {
@@ -480,27 +521,28 @@ void pluginCancelDownload() {
}

bool pluginIsLoggedIn() {
return gToken != "";
return global->plugin.gToken != "";
}

bool pluginIsDownloading() {
return isDownloading;
return global->plugin.isDownloading;
}

float pluginGetDownloadProgress() {
return downloadProgress;
return global->plugin.downloadProgress;
}

std::string pluginGetDownloadName() {
return downloadName;
return global->plugin.downloadName;
}

std::string pluginGetLoginStatus() {
return loginStatus;
return global->plugin.loginStatus;
}

Plugin *pluginGetPlugin(std::string pluginSlug) {
for (Plugin *plugin : gPlugins) {
for (Plugin *plugin : global->plugin.gPlugins) {
// printf("xxx pluginGetPlugin: find pluginSlug=\"%s\" current=\"%s\"\n", pluginSlug.c_str(), plugin->slug.c_str());
if (plugin->slug == pluginSlug) {
return plugin;
}
@@ -510,9 +552,11 @@ Plugin *pluginGetPlugin(std::string pluginSlug) {

Model *pluginGetModel(std::string pluginSlug, std::string modelSlug) {
Plugin *plugin = pluginGetPlugin(pluginSlug);
// printf("xxx vstrack_plugin: plugSlug=\"%s\" modelSlug=\"%s\" => plugin=%p\n", pluginSlug.c_str(), modelSlug.c_str(), plugin);
if (plugin) {
for (Model *model : plugin->models) {
if (model->slug == modelSlug) {
// printf("xxx vstrack_plugin: plugSlug=\"%s\" modelSlug=\"%s\" => plugin=%p model=%p\n", pluginSlug.c_str(), modelSlug.c_str(), plugin, model);
return model;
}
}
@@ -521,4 +565,72 @@ Model *pluginGetModel(std::string pluginSlug, std::string modelSlug) {
}



#ifdef USE_VST2
extern "C" {
extern void init_plugin_AS (rack::Plugin *p);
extern void init_plugin_AudibleInstruments (rack::Plugin *p);
extern void init_plugin_Befaco (rack::Plugin *p);
extern void init_plugin_Bogaudio (rack::Plugin *p);
extern void init_plugin_cf (rack::Plugin *p);
extern void init_plugin_ErraticInstruments (rack::Plugin *p);
extern void init_plugin_ESeries (rack::Plugin *p);
extern void init_plugin_Fundamental (rack::Plugin *p);
extern void init_plugin_HetrickCV (rack::Plugin *p);
extern void init_plugin_Koralfx (rack::Plugin *p);
extern void init_plugin_LindenbergResearch (rack::Plugin *p);
extern void init_plugin_Qwelk (rack::Plugin *p);
extern void init_plugin_SonusModular (rack::Plugin *p);
extern void init_plugin_SubmarineFree (rack::Plugin *p);
extern void init_plugin_Template (rack::Plugin *p);
extern void init_plugin_Valley (rack::Plugin *p);
}

static void vst2_load_static_rack_plugin(const char *_name, InitCallback _initCallback) {

std::string path = assetStaticPlugin(_name);
// Construct and initialize Plugin instance
Plugin *plugin = new Plugin();
plugin->path = path;
plugin->handle = NULL;
_initCallback(plugin);

#if 0
// Reject plugin if slug already exists
Plugin *oldPlugin = pluginGetPlugin(plugin->slug);
if (oldPlugin) {
warn("Plugin \"%s\" is already loaded, not attempting to load it again", plugin->slug.c_str());
// TODO
// Fix memory leak with `plugin` here
return false;
}
#endif

// Add plugin to list
global->plugin.gPlugins.push_back(plugin);
info("vcvrack: Loaded static plugin %s %s", plugin->slug.c_str(), plugin->version.c_str());
}

void vst2_load_static_rack_plugins(void) {
vst2_load_static_rack_plugin("AS", &init_plugin_AS);
vst2_load_static_rack_plugin("AudibleInstruments", &init_plugin_AudibleInstruments);
vst2_load_static_rack_plugin("Befaco", &init_plugin_Befaco);
vst2_load_static_rack_plugin("Bogaudio", &init_plugin_Bogaudio);
vst2_load_static_rack_plugin("cf", &init_plugin_cf);
vst2_load_static_rack_plugin("ErraticInstruments", &init_plugin_ErraticInstruments);
vst2_load_static_rack_plugin("ESeries", &init_plugin_ESeries);
vst2_load_static_rack_plugin("Fundamental", &init_plugin_Fundamental);
vst2_load_static_rack_plugin("HetrickCV", &init_plugin_HetrickCV);
vst2_load_static_rack_plugin("Koralfx-Modules", &init_plugin_Koralfx);
vst2_load_static_rack_plugin("LindenbergResearch", &init_plugin_LindenbergResearch);
vst2_load_static_rack_plugin("Qwelk", &init_plugin_Qwelk);
vst2_load_static_rack_plugin("SonusModular", &init_plugin_SonusModular);
vst2_load_static_rack_plugin("SubmarineFree", &init_plugin_SubmarineFree);
vst2_load_static_rack_plugin("Template", &init_plugin_Template);
vst2_load_static_rack_plugin("Valley", &init_plugin_Valley);
}
#endif // USE_VST2


} // namespace rack

+ 2
- 0
src/rtmidi.cpp View File

@@ -1,5 +1,7 @@
#include "global_pre.hpp"
#include "rtmidi.hpp"
#include <map>
#include "global.hpp"


namespace rack {


+ 27
- 22
src/settings.cpp View File

@@ -1,23 +1,23 @@
#include "global_pre.hpp"
#include "settings.hpp"
#include "app.hpp"
#include "window.hpp"
#include "engine.hpp"
#include "plugin.hpp"
#include <jansson.h>
#include "global.hpp"
#include "global_ui.hpp"


namespace rack {


bool gSkipAutosaveOnLaunch = false;


static json_t *settingsToJson() {
// root
json_t *rootJ = json_object();

// token
json_t *tokenJ = json_string(gToken.c_str());
json_t *tokenJ = json_string(global->plugin.gToken.c_str());
json_object_set_new(rootJ, "token", tokenJ);

if (!windowIsMaximized()) {
@@ -33,22 +33,22 @@ static json_t *settingsToJson() {
}

// opacity
float opacity = gToolbar->wireOpacitySlider->value;
float opacity = global_ui->app.gToolbar->wireOpacitySlider->value;
json_t *opacityJ = json_real(opacity);
json_object_set_new(rootJ, "wireOpacity", opacityJ);

// tension
float tension = gToolbar->wireTensionSlider->value;
float tension = global_ui->app.gToolbar->wireTensionSlider->value;
json_t *tensionJ = json_real(tension);
json_object_set_new(rootJ, "wireTension", tensionJ);

// zoom
float zoom = gRackScene->zoomWidget->zoom;
float zoom = global_ui->app.gRackScene->zoomWidget->zoom;
json_t *zoomJ = json_real(zoom);
json_object_set_new(rootJ, "zoom", zoomJ);

// allowCursorLock
json_t *allowCursorLockJ = json_boolean(gAllowCursorLock);
json_t *allowCursorLockJ = json_boolean(global_ui->window.gAllowCursorLock);
json_object_set_new(rootJ, "allowCursorLock", allowCursorLockJ);

// sampleRate
@@ -56,11 +56,11 @@ static json_t *settingsToJson() {
json_object_set_new(rootJ, "sampleRate", sampleRateJ);

// lastPath
json_t *lastPathJ = json_string(gRackWidget->lastPath.c_str());
json_t *lastPathJ = json_string(global_ui->app.gRackWidget->lastPath.c_str());
json_object_set_new(rootJ, "lastPath", lastPathJ);

// skipAutosaveOnLaunch
if (gSkipAutosaveOnLaunch) {
if (global->settings.gSkipAutosaveOnLaunch) {
json_object_set_new(rootJ, "skipAutosaveOnLaunch", json_true());
}

@@ -68,10 +68,10 @@ static json_t *settingsToJson() {
json_object_set_new(rootJ, "moduleBrowser", appModuleBrowserToJson());

// powerMeter
json_object_set_new(rootJ, "powerMeter", json_boolean(gPowerMeter));
json_object_set_new(rootJ, "powerMeter", json_boolean(global->gPowerMeter));

// checkVersion
json_object_set_new(rootJ, "checkVersion", json_boolean(gCheckVersion));
json_object_set_new(rootJ, "checkVersion", json_boolean(global_ui->app.gCheckVersion));

return rootJ;
}
@@ -80,7 +80,7 @@ static void settingsFromJson(json_t *rootJ) {
// token
json_t *tokenJ = json_object_get(rootJ, "token");
if (tokenJ)
gToken = json_string_value(tokenJ);
global->plugin.gToken = json_string_value(tokenJ);

// windowSize
json_t *windowSizeJ = json_object_get(rootJ, "windowSize");
@@ -101,24 +101,29 @@ static void settingsFromJson(json_t *rootJ) {
// opacity
json_t *opacityJ = json_object_get(rootJ, "wireOpacity");
if (opacityJ)
gToolbar->wireOpacitySlider->value = json_number_value(opacityJ);
global_ui->app.gToolbar->wireOpacitySlider->value = json_number_value(opacityJ);

// tension
json_t *tensionJ = json_object_get(rootJ, "wireTension");
if (tensionJ)
gToolbar->wireTensionSlider->value = json_number_value(tensionJ);
global_ui->app.gToolbar->wireTensionSlider->value = json_number_value(tensionJ);

// zoom
json_t *zoomJ = json_object_get(rootJ, "zoom");
if (zoomJ) {
gRackScene->zoomWidget->setZoom(clamp((float) json_number_value(zoomJ), 0.25f, 4.0f));
gToolbar->zoomSlider->setValue(json_number_value(zoomJ) * 100.0);
global_ui->app.gRackScene->zoomWidget->setZoom(clamp((float) json_number_value(zoomJ), 0.25f, 4.0f));
global_ui->app.gToolbar->zoomSlider->setValue(json_number_value(zoomJ) * 100.0);
}

// allowCursorLock
json_t *allowCursorLockJ = json_object_get(rootJ, "allowCursorLock");
if (allowCursorLockJ)
gAllowCursorLock = json_is_true(allowCursorLockJ);
{
global_ui->window.gAllowCursorLock = json_is_true(allowCursorLockJ);
#ifdef USE_VST2
global_ui->window.gAllowCursorLock = 0;
#endif // USE_VST2
}

// sampleRate
json_t *sampleRateJ = json_object_get(rootJ, "sampleRate");
@@ -130,12 +135,12 @@ static void settingsFromJson(json_t *rootJ) {
// lastPath
json_t *lastPathJ = json_object_get(rootJ, "lastPath");
if (lastPathJ)
gRackWidget->lastPath = json_string_value(lastPathJ);
global_ui->app.gRackWidget->lastPath = json_string_value(lastPathJ);

// skipAutosaveOnLaunch
json_t *skipAutosaveOnLaunchJ = json_object_get(rootJ, "skipAutosaveOnLaunch");
if (skipAutosaveOnLaunchJ)
gSkipAutosaveOnLaunch = json_boolean_value(skipAutosaveOnLaunchJ);
global->settings.gSkipAutosaveOnLaunch = json_boolean_value(skipAutosaveOnLaunchJ);

// moduleBrowser
json_t *moduleBrowserJ = json_object_get(rootJ, "moduleBrowser");
@@ -145,12 +150,12 @@ static void settingsFromJson(json_t *rootJ) {
// powerMeter
json_t *powerMeterJ = json_object_get(rootJ, "powerMeter");
if (powerMeterJ)
gPowerMeter = json_boolean_value(powerMeterJ);
global->gPowerMeter = json_boolean_value(powerMeterJ);

// checkVersion
json_t *checkVersionJ = json_object_get(rootJ, "checkVersion");
if (checkVersionJ)
gCheckVersion = json_boolean_value(checkVersionJ);
global_ui->app.gCheckVersion = json_boolean_value(checkVersionJ);
}




+ 6
- 0
src/tags.cpp View File

@@ -4,10 +4,16 @@
namespace rack {


static bool b_tags_init = false;
std::string gTagNames[NUM_TAGS];


void tagsInit() {
// (todo) protect with mutex in case of (unlikely) parallel/threaded instantation
if(b_tags_init)
return;
b_tags_init = true;

gTagNames[AMPLIFIER_TAG] = "Amplifier/VCA";
gTagNames[ATTENUATOR_TAG] = "Attenuator";
gTagNames[ARPEGGIATOR_TAG] = "Arpeggiator";


+ 5
- 3
src/ui/MenuItem.cpp View File

@@ -1,5 +1,7 @@
#include "global_pre.hpp"
#include "ui.hpp"
#include "window.hpp"
#include "global_ui.hpp"


namespace rack {
@@ -10,7 +12,7 @@ namespace rack {

void MenuItem::draw(NVGcontext *vg) {
// Get state
BNDwidgetState state = (gHoveredWidget == this) ? BND_HOVER : BND_DEFAULT;
BNDwidgetState state = (global_ui->widgets.gHoveredWidget == this) ? BND_HOVER : BND_DEFAULT;
Menu *parentMenu = dynamic_cast<Menu*>(parent);
if (parentMenu && parentMenu->activeEntry == this) {
state = BND_ACTIVE;
@@ -28,7 +30,7 @@ void MenuItem::step() {
const float rightPadding = 10.0;
// HACK use gVg from the window.
// All this does is inspect the font, so it shouldn't modify gVg and should work when called from a FramebufferWidget for example.
box.size.x = bndLabelWidth(gVg, -1, text.c_str()) + bndLabelWidth(gVg, -1, rightText.c_str()) + rightPadding;
box.size.x = bndLabelWidth(global_ui->window.gVg, -1, text.c_str()) + bndLabelWidth(global_ui->window.gVg, -1, rightText.c_str()) + rightPadding;
Widget::step();
}

@@ -58,7 +60,7 @@ void MenuItem::onDragDrop(EventDragDrop &e) {
onAction(eAction);
if (eAction.consumed) {
// deletes `this`
gScene->setOverlay(NULL);
global_ui->ui.gScene->setOverlay(NULL);
}
}



+ 3
- 1
src/ui/MenuLabel.cpp View File

@@ -1,5 +1,7 @@
#include "global_pre.hpp"
#include "ui.hpp"
#include "window.hpp"
#include "global_ui.hpp"


namespace rack {
@@ -13,7 +15,7 @@ void MenuLabel::step() {
// Add 10 more pixels because Retina measurements are sometimes too small
const float rightPadding = 10.0;
// HACK use gVg from the window.
box.size.x = bndLabelWidth(gVg, -1, text.c_str()) + rightPadding;
box.size.x = bndLabelWidth(global_ui->window.gVg, -1, text.c_str()) + rightPadding;
Widget::step();
}



+ 4
- 2
src/ui/MenuOverlay.cpp View File

@@ -1,5 +1,7 @@
#include "global_pre.hpp"
#include "ui.hpp"
#include "window.hpp"
#include "global_ui.hpp"


namespace rack {
@@ -18,7 +20,7 @@ void MenuOverlay::onMouseDown(EventMouseDown &e) {
Widget::onMouseDown(e);
if (!e.consumed) {
// deletes `this`
gScene->setOverlay(NULL);
global_ui->ui.gScene->setOverlay(NULL);
e.consumed = true;
}
}
@@ -26,7 +28,7 @@ void MenuOverlay::onMouseDown(EventMouseDown &e) {
void MenuOverlay::onHoverKey(EventHoverKey &e) {
switch (e.key) {
case GLFW_KEY_ESCAPE: {
gScene->setOverlay(NULL);
global_ui->ui.gScene->setOverlay(NULL);
e.consumed = true;
return;
} break;


+ 4
- 2
src/ui/Scene.cpp View File

@@ -1,5 +1,7 @@
#include "global_pre.hpp"
#include "ui.hpp"
#include "window.hpp"
#include "global_ui.hpp"


namespace rack {
@@ -21,10 +23,10 @@ Menu *Scene::createMenu() {
// Get relative position of the click
MenuOverlay *overlay = new MenuOverlay();
Menu *menu = new Menu();
menu->box.pos = gMousePos;
menu->box.pos = global_ui->window.gMousePos;

overlay->addChild(menu);
gScene->setOverlay(overlay);
global_ui->ui.gScene->setOverlay(overlay);

return menu;
}


+ 7
- 5
src/ui/ScrollWidget.cpp View File

@@ -1,5 +1,7 @@
#include "global_pre.hpp"
#include "ui.hpp"
#include "window.hpp"
#include "global_ui.hpp"


namespace rack {
@@ -109,7 +111,7 @@ void ScrollWidget::step() {

void ScrollWidget::onMouseMove(EventMouseMove &e) {
// Scroll with arrow keys
if (!gFocusedWidget) {
if (!global_ui->widgets.gFocusedWidget) {
float arrowSpeed = 30.0;
if (windowIsShiftPressed() && windowIsModPressed())
arrowSpeed /= 16.0;
@@ -118,16 +120,16 @@ void ScrollWidget::onMouseMove(EventMouseMove &e) {
else if (windowIsModPressed())
arrowSpeed /= 4.0;

if (glfwGetKey(gWindow, GLFW_KEY_LEFT) == GLFW_PRESS) {
if (glfwGetKey(global_ui->window.gWindow, GLFW_KEY_LEFT) == GLFW_PRESS) {
offset.x -= arrowSpeed;
}
if (glfwGetKey(gWindow, GLFW_KEY_RIGHT) == GLFW_PRESS) {
if (glfwGetKey(global_ui->window.gWindow, GLFW_KEY_RIGHT) == GLFW_PRESS) {
offset.x += arrowSpeed;
}
if (glfwGetKey(gWindow, GLFW_KEY_UP) == GLFW_PRESS) {
if (glfwGetKey(global_ui->window.gWindow, GLFW_KEY_UP) == GLFW_PRESS) {
offset.y -= arrowSpeed;
}
if (glfwGetKey(gWindow, GLFW_KEY_DOWN) == GLFW_PRESS) {
if (glfwGetKey(global_ui->window.gWindow, GLFW_KEY_DOWN) == GLFW_PRESS) {
offset.y += arrowSpeed;
}
}


+ 9
- 7
src/ui/TextField.cpp View File

@@ -1,8 +1,10 @@
#include "global_pre.hpp"
#include "ui.hpp"
// for gVg
#include "window.hpp"
// for key codes
#include <GLFW/glfw3.h>
#include "global_ui.hpp"


namespace rack {
@@ -12,9 +14,9 @@ void TextField::draw(NVGcontext *vg) {
nvgScissor(vg, 0, 0, box.size.x, box.size.y);

BNDwidgetState state;
if (this == gFocusedWidget)
if (this == global_ui->widgets.gFocusedWidget)
state = BND_ACTIVE;
else if (this == gHoveredWidget)
else if (this == global_ui->widgets.gHoveredWidget)
state = BND_HOVER;
else
state = BND_DEFAULT;
@@ -38,7 +40,7 @@ void TextField::onMouseDown(EventMouseDown &e) {
}

void TextField::onMouseMove(EventMouseMove &e) {
if (this == gDraggedWidget) {
if (this == global_ui->widgets.gDraggedWidget) {
int pos = getTextPosition(e.pos);
if (pos != selection) {
cursor = pos;
@@ -125,7 +127,7 @@ void TextField::onKey(EventKey &e) {
} break;
case GLFW_KEY_V: {
if (windowIsModPressed()) {
const char *newText = glfwGetClipboardString(gWindow);
const char *newText = glfwGetClipboardString(global_ui->window.gWindow);
if (newText)
insertText(newText);
}
@@ -135,7 +137,7 @@ void TextField::onKey(EventKey &e) {
if (cursor != selection) {
int begin = min(cursor, selection);
std::string selectedText = text.substr(begin, std::abs(selection - cursor));
glfwSetClipboardString(gWindow, selectedText.c_str());
glfwSetClipboardString(global_ui->window.gWindow, selectedText.c_str());
insertText("");
}
}
@@ -145,7 +147,7 @@ void TextField::onKey(EventKey &e) {
if (cursor != selection) {
int begin = min(cursor, selection);
std::string selectedText = text.substr(begin, std::abs(selection - cursor));
glfwSetClipboardString(gWindow, selectedText.c_str());
glfwSetClipboardString(global_ui->window.gWindow, selectedText.c_str());
}
}
} break;
@@ -190,7 +192,7 @@ void TextField::setText(std::string text) {
}

int TextField::getTextPosition(Vec mousePos) {
return bndTextFieldTextPosition(gVg, 0.0, 0.0, box.size.x, box.size.y, -1, text.c_str(), mousePos.x, mousePos.y);
return bndTextFieldTextPosition(global_ui->window.gVg, 0.0, 0.0, box.size.x, box.size.y, -1, text.c_str(), mousePos.x, mousePos.y);
}




+ 0
- 1
src/ui/ui.cpp View File

@@ -3,7 +3,6 @@
namespace rack {


Scene *gScene = NULL;


} // namespace rack

+ 18
- 18
src/util/logger.cpp View File

@@ -1,29 +1,27 @@
#include "global_pre.hpp"
#include "util/common.hpp"
#include "asset.hpp"
#include <stdarg.h>
#include "global.hpp"


namespace rack {


static FILE *logFile = NULL;
static std::chrono::high_resolution_clock::time_point startTime;


void loggerInit(bool devMode) {
startTime = std::chrono::high_resolution_clock::now();
global->logger.startTime = std::chrono::high_resolution_clock::now();
if (devMode) {
logFile = stderr;
global->logger.logFile = stderr;
}
else {
std::string logFilename = assetLocal("log.txt");
logFile = fopen(logFilename.c_str(), "w");
global->logger.logFile = fopen(logFilename.c_str(), "w");
}
}

void loggerDestroy() {
if (logFile != stderr) {
fclose(logFile);
if (global->logger.logFile != stderr) {
fclose(global->logger.logFile);
}
}

@@ -43,15 +41,17 @@ static const int loggerColor[] = {

static void loggerLogVa(LoggerLevel level, const char *file, int line, const char *format, va_list args) {
auto nowTime = std::chrono::high_resolution_clock::now();
int duration = std::chrono::duration_cast<std::chrono::milliseconds>(nowTime - startTime).count();
if (logFile == stderr)
fprintf(logFile, "\x1B[%dm", loggerColor[level]);
fprintf(logFile, "[%.03f %s %s:%d] ", duration / 1000.0, loggerText[level], file, line);
if (logFile == stderr)
fprintf(logFile, "\x1B[0m");
vfprintf(logFile, format, args);
fprintf(logFile, "\n");
fflush(logFile);
int duration = std::chrono::duration_cast<std::chrono::milliseconds>(nowTime - global->logger.startTime).count();
if (global->logger.logFile == stderr)
fprintf(global->logger.logFile, "\x1B[%dm", loggerColor[level]);
fprintf(global->logger.logFile, "[%.03f %s %s:%d] ", duration / 1000.0, loggerText[level], file, line);
if (global->logger.logFile == stderr)
fprintf(global->logger.logFile, "\x1B[0m");
vfprintf(global->logger.logFile, format, args);
vprintf(format, args); // xxx
printf("\n"); // xxx
fprintf(global->logger.logFile, "\n");
fflush(global->logger.logFile);
}

void loggerLog(LoggerLevel level, const char *file, int line, const char *format, ...) {


+ 22
- 9
src/util/random.cpp View File

@@ -1,6 +1,14 @@
#include "global_pre.hpp"
#include "util/common.hpp"
#ifdef YAC_POSIX
#include <time.h>
#include <sys/time.h>
#endif // YAC_POSIX
#ifdef YAC_WIN32
#define WIN32_LEAN_AND_MEAN defined
#include <windows.h>
#endif // YAC_WIN32
#include "global.hpp"


namespace rack {
@@ -9,31 +17,36 @@ namespace rack {
// xoroshiro128+
// from http://xoroshiro.di.unimi.it/xoroshiro128plus.c

static uint64_t xoroshiro128plus_state[2] = {};

static uint64_t rotl(const uint64_t x, int k) {
return (x << k) | (x >> (64 - k));
}

static uint64_t xoroshiro128plus_next(void) {
const uint64_t s0 = xoroshiro128plus_state[0];
uint64_t s1 = xoroshiro128plus_state[1];
const uint64_t s0 = global->random.xoroshiro128plus_state[0];
uint64_t s1 = global->random.xoroshiro128plus_state[1];
const uint64_t result = s0 + s1;

s1 ^= s0;
xoroshiro128plus_state[0] = rotl(s0, 55) ^ s1 ^ (s1 << 14); // a, b
xoroshiro128plus_state[1] = rotl(s1, 36); // c
global->random.xoroshiro128plus_state[0] = rotl(s0, 55) ^ s1 ^ (s1 << 14); // a, b
global->random.xoroshiro128plus_state[1] = rotl(s1, 36); // c

return result;
}

void randomInit() {
// Only allow the seed to be initialized once during the lifetime of the program.
assert(xoroshiro128plus_state[0] == 0 && xoroshiro128plus_state[1] == 0);
assert(global->random.xoroshiro128plus_state[0] == 0 && global->random.xoroshiro128plus_state[1] == 0);
#ifdef YAC_WIN32
LARGE_INTEGER pfcCurrent;
::QueryPerformanceCounter(&pfcCurrent);
global->random.xoroshiro128plus_state[0] = pfcCurrent.QuadPart;
global->random.xoroshiro128plus_state[1] = pfcCurrent.QuadPart;
#else
struct timeval tv;
gettimeofday(&tv, NULL);
xoroshiro128plus_state[0] = tv.tv_sec;
xoroshiro128plus_state[1] = tv.tv_usec;
global->random.xoroshiro128plus_state[0] = tv.tv_sec;
global->random.xoroshiro128plus_state[1] = tv.tv_usec;
#endif // USE_VST2
// Generate a few times to fix the fact that the time is not a uniform u64
for (int i = 0; i < 10; i++) {
xoroshiro128plus_next();


+ 31
- 0
src/util/string.cpp View File

@@ -1,7 +1,10 @@
#include "global_pre.hpp"
#include "util/common.hpp"
#include <stdarg.h>
#include <algorithm>
#ifdef YAC_GCC
#include <libgen.h> // for dirname and basename
#endif


namespace rack {
@@ -50,16 +53,44 @@ bool stringEndsWith(std::string str, std::string suffix) {
}

std::string stringDirectory(std::string path) {
#ifdef YAC_POSIX
char *pathDup = strdup(path.c_str());
std::string directory = dirname(pathDup);
free(pathDup);
#elif defined(YAC_WIN32)
char drive[_MAX_DRIVE];
char dir [_MAX_DIR];
char file [_MAX_FNAME];
char ext [_MAX_EXT];
char dirName [_MAX_DRIVE + _MAX_DIR + _MAX_EXT];
_splitpath(path.c_str(), drive, dir, file, ext);
sprintf(dirName, "%s%s", drive, dir);
printf("xxx dirName=\"%s\"\n", dirName);
std::string directory = dirName;
#else
#error dirname not implemented
#endif
return directory;
}

std::string stringFilename(std::string path) {
#ifdef YAC_POSIX
char *pathDup = strdup(path.c_str());
std::string filename = basename(pathDup);
free(pathDup);
#elif defined(YAC_WIN32)
char drive[_MAX_DRIVE];
char dir [_MAX_DIR];
char file [_MAX_FNAME];
char ext [_MAX_EXT];
char fileName [_MAX_FNAME + _MAX_EXT];
_splitpath(path.c_str(), drive, dir, file, ext);
sprintf(fileName, "%s%s", file, ext);
// printf("xxx fileName=\"%s\"\n", fileName);
std::string filename = fileName;
#else
#error basename not implemented
#endif
return filename;
}



+ 30
- 0
src/util/system.cpp View File

@@ -1,7 +1,10 @@
#include "global_pre.hpp"
#include "util/common.hpp"

#ifdef YAC_POSIX
#include <dirent.h>
#include <sys/stat.h>
#endif // YAC_POSIX

#if ARCH_WIN
#include <windows.h>
@@ -9,11 +12,16 @@
#endif


#ifdef USE_VST2
#define SKIP_SYSTEM_FXNS defined
#endif // USE_VST2

namespace rack {


std::vector<std::string> systemListEntries(std::string path) {
std::vector<std::string> filenames;
#ifndef SKIP_SYSTEM_FXNS
DIR *dir = opendir(path.c_str());
if (dir) {
struct dirent *d;
@@ -25,29 +33,43 @@ std::vector<std::string> systemListEntries(std::string path) {
}
closedir(dir);
}
#endif
return filenames;
}

bool systemExists(std::string path) {
#ifndef SKIP_SYSTEM_FXNS
struct stat statbuf;
return (stat(path.c_str(), &statbuf) == 0);
#else
return false;
#endif // SKIP_SYSTEM_FXNS
}

bool systemIsFile(std::string path) {
#ifndef SKIP_SYSTEM_FXNS
struct stat statbuf;
if (stat(path.c_str(), &statbuf))
return false;
return S_ISREG(statbuf.st_mode);
#else
return false;
#endif // SKIP_SYSTEM_FXNS
}

bool systemIsDirectory(std::string path) {
#ifndef SKIP_SYSTEM_FXNS
struct stat statbuf;
if (stat(path.c_str(), &statbuf))
return false;
return S_ISDIR(statbuf.st_mode);
#else
return false;
#endif // SKIP_SYSTEM_FXNS
}

void systemCopy(std::string srcPath, std::string destPath) {
#ifndef SKIP_SYSTEM_FXNS
// Open files
FILE *source = fopen(srcPath.c_str(), "rb");
if (!source) return;
@@ -70,17 +92,23 @@ void systemCopy(std::string srcPath, std::string destPath) {
if (size == 0)
break;
}
#else
#endif // SKIP_SYSTEM_FXNS
}

void systemCreateDirectory(std::string path) {
#ifndef SKIP_SYSTEM_FXNS
#if ARCH_WIN
CreateDirectory(path.c_str(), NULL);
#else
mkdir(path.c_str(), 0755);
#endif
#else
#endif // SKIP_SYSTEM_FXNS
}

void systemOpenBrowser(std::string url) {
#ifndef SKIP_SYSTEM_FXNS
#if ARCH_LIN
std::string command = "xdg-open " + url;
(void) system(command.c_str());
@@ -92,6 +120,8 @@ void systemOpenBrowser(std::string url) {
#if ARCH_WIN
ShellExecute(NULL, "open", url.c_str(), NULL, NULL, SW_SHOWNORMAL);
#endif
#else
#endif // SKIP_SYSTEM_FXNS
}




+ 1585
- 0
src/vst2_main.cpp
File diff suppressed because it is too large
View File


+ 111
- 0
src/vstmidi.cpp View File

@@ -0,0 +1,111 @@
#include "global_pre.hpp"
#include "vstmidi.hpp"
#include <map>
#include "global.hpp"


extern void vst2_lock_midi_device(void);
extern void vst2_unlock_midi_device(void);


namespace rack {


// static void midiInputCallback(double timeStamp, std::vector<unsigned char> *message, void *userData) {
// if (!message) return;
// if (!userData) return;

// RtMidiInputDevice *midiInputDevice = (RtMidiInputDevice*) userData;
// if (!midiInputDevice) return;
// MidiMessage msg;
// if (message->size() >= 1)
// msg.cmd = (*message)[0];
// if (message->size() >= 2)
// msg.data1 = (*message)[1];
// if (message->size() >= 3)
// msg.data2 = (*message)[2];

// midiInputDevice->onMessage(msg);
// }

VSTMidiInputDevice::VSTMidiInputDevice(int driverId, int deviceId) {
}

VSTMidiInputDevice::~VSTMidiInputDevice() {
}


VSTMidiDriver::VSTMidiDriver(int driverId) {
device = NULL;
}

VSTMidiDriver::~VSTMidiDriver() {
if(NULL != device)
delete device;
}

std::string VSTMidiDriver::getName() {
return "VST";
}

std::vector<int> VSTMidiDriver::getInputDeviceIds() {
std::vector<int> deviceIds;
deviceIds.push_back(0);
return deviceIds;
}

std::string VSTMidiDriver::getInputDeviceName(int deviceId) {
if(0 == deviceId)
return std::string("VST MIDI Input Device");
return "";
}

MidiInputDevice *VSTMidiDriver::subscribeInputDevice(int deviceId, MidiInput *midiInput) {
if(0 != deviceId)
return NULL;

if (!device) {
device = new VSTMidiInputDevice(VST_DRIVER, deviceId);
vst2_lock_midi_device();
global->vst2.midi_device = device;
vst2_unlock_midi_device();
}

device->subscribe(midiInput);
return device;
}

void VSTMidiDriver::unsubscribeInputDevice(int deviceId, MidiInput *midiInput) {
if(0 != deviceId)
return;
device->unsubscribe(midiInput);

// Destroy device if nothing is subscribed anymore
if (device->subscribed.empty()) {
vst2_lock_midi_device();
delete device;
device = NULL;
global->vst2.midi_device = NULL;
vst2_unlock_midi_device();
}
}

void vstmidiInit() {
MidiDriver *driver = new VSTMidiDriver(VST_DRIVER);
midiDriverAdd(VST_DRIVER, driver);
}

} // namespace rack

void vst2_process_midi_input_event(sU8 _a, sU8 _b, sU8 _c) {
// (note) vst midi device mutex is locked by caller
if(NULL != rack::global->vst2.midi_device)
{
rack::MidiMessage msg;
msg.cmd = _a;
msg.data1 = _b;
msg.data2 = _c;

rack::global->vst2.midi_device->onMessage(msg);
}
}

+ 11
- 9
src/widgets/FramebufferWidget.cpp View File

@@ -1,7 +1,9 @@
#include "global_pre.hpp"
#include "widgets.hpp"
#include "window.hpp"
#include "nanovg_gl.h"
#include "nanovg_gl_utils.h"
#include "global_ui.hpp"


namespace rack {
@@ -55,7 +57,7 @@ void FramebufferWidget::draw(NVGcontext *vg) {
internal->box.pos = internal->box.pos.mult(s).floor();
internal->box.size = internal->box.size.mult(s).ceil().plus(Vec(1, 1));

Vec fbSize = internal->box.size.mult(gPixelRatio * oversample);
Vec fbSize = internal->box.size.mult(global_ui->window.gPixelRatio * oversample);

if (!fbSize.isFinite())
return;
@@ -66,7 +68,7 @@ void FramebufferWidget::draw(NVGcontext *vg) {
// Delete old one first to free up GPU memory
internal->setFramebuffer(NULL);
// Create a framebuffer from the main nanovg context. We will draw to this in the secondary nanovg context.
NVGLUframebuffer *fb = nvgluCreateFramebuffer(gVg, fbSize.x, fbSize.y, 0);
NVGLUframebuffer *fb = nvgluCreateFramebuffer(global_ui->window.gVg, fbSize.x, fbSize.y, 0);
if (!fb)
return;
internal->setFramebuffer(fb);
@@ -76,16 +78,16 @@ void FramebufferWidget::draw(NVGcontext *vg) {
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

nvgBeginFrame(gFramebufferVg, fbSize.x, fbSize.y, gPixelRatio * oversample);
nvgBeginFrame(global_ui->window.gFramebufferVg, fbSize.x, fbSize.y, global_ui->window.gPixelRatio * oversample);

nvgScale(gFramebufferVg, gPixelRatio * oversample, gPixelRatio * oversample);
nvgScale(global_ui->window.gFramebufferVg, global_ui->window.gPixelRatio * oversample, global_ui->window.gPixelRatio * oversample);
// Use local scaling
nvgTranslate(gFramebufferVg, bf.x, bf.y);
nvgTranslate(gFramebufferVg, -internal->box.pos.x, -internal->box.pos.y);
nvgScale(gFramebufferVg, s.x, s.y);
Widget::draw(gFramebufferVg);
nvgTranslate(global_ui->window.gFramebufferVg, bf.x, bf.y);
nvgTranslate(global_ui->window.gFramebufferVg, -internal->box.pos.x, -internal->box.pos.y);
nvgScale(global_ui->window.gFramebufferVg, s.x, s.y);
Widget::draw(global_ui->window.gFramebufferVg);

nvgEndFrame(gFramebufferVg);
nvgEndFrame(global_ui->window.gFramebufferVg);
nvgluBindFramebuffer(NULL);
}



+ 18
- 16
src/widgets/Widget.cpp View File

@@ -1,6 +1,8 @@
#include "global_pre.hpp"
#include "widgets.hpp"
#include "app.hpp"
#include <algorithm>
#include "global_ui.hpp"


namespace rack {
@@ -9,11 +11,11 @@ Widget::~Widget() {
// You should only delete orphaned widgets
assert(!parent);
// Stop dragging and hovering this widget
if (gHoveredWidget == this) gHoveredWidget = NULL;
if (gDraggedWidget == this) gDraggedWidget = NULL;
if (gDragHoveredWidget == this) gDragHoveredWidget = NULL;
if (gFocusedWidget == this) gFocusedWidget = NULL;
if (gTempWidget == this) gTempWidget = NULL;
if (global_ui->widgets.gHoveredWidget == this) global_ui->widgets.gHoveredWidget = NULL;
if (global_ui->widgets.gDraggedWidget == this) global_ui->widgets.gDraggedWidget = NULL;
if (global_ui->widgets.gDragHoveredWidget == this) global_ui->widgets.gDragHoveredWidget = NULL;
if (global_ui->widgets.gFocusedWidget == this) global_ui->widgets.gFocusedWidget = NULL;
if (global_ui->widgets.gTempWidget == this) global_ui->widgets.gTempWidget = NULL;
clearChildren();
}

@@ -77,23 +79,23 @@ void Widget::clearChildren() {

void Widget::finalizeEvents() {
// Stop dragging and hovering this widget
if (gHoveredWidget == this) {
if (global_ui->widgets.gHoveredWidget == this) {
EventMouseLeave e;
gHoveredWidget->onMouseLeave(e);
gHoveredWidget = NULL;
global_ui->widgets.gHoveredWidget->onMouseLeave(e);
global_ui->widgets.gHoveredWidget = NULL;
}
if (gDraggedWidget == this) {
if (global_ui->widgets.gDraggedWidget == this) {
EventDragEnd e;
gDraggedWidget->onDragEnd(e);
gDraggedWidget = NULL;
global_ui->widgets.gDraggedWidget->onDragEnd(e);
global_ui->widgets.gDraggedWidget = NULL;
}
if (gDragHoveredWidget == this) {
gDragHoveredWidget = NULL;
if (global_ui->widgets.gDragHoveredWidget == this) {
global_ui->widgets.gDragHoveredWidget = NULL;
}
if (gFocusedWidget == this) {
if (global_ui->widgets.gFocusedWidget == this) {
EventDefocus e;
gFocusedWidget->onDefocus(e);
gFocusedWidget = NULL;
global_ui->widgets.gFocusedWidget->onDefocus(e);
global_ui->widgets.gFocusedWidget = NULL;
}
for (Widget *child : children) {
child->finalizeEvents();


+ 0
- 5
src/widgets/widgets.cpp View File

@@ -3,11 +3,6 @@
namespace rack {


Widget *gHoveredWidget = NULL;
Widget *gDraggedWidget = NULL;
Widget *gDragHoveredWidget = NULL;
Widget *gFocusedWidget = NULL;
Widget *gTempWidget = NULL;


} // namespace rack

+ 234
- 188
src/window.cpp View File

@@ -1,3 +1,4 @@
#include "global_pre.hpp"
#include "window.hpp"
#include "app.hpp"
#include "asset.hpp"
@@ -30,21 +31,15 @@
#include <ApplicationServices/ApplicationServices.h>
#endif

namespace rack {
#include "global.hpp"
#include "global_ui.hpp"


GLFWwindow *gWindow = NULL;
NVGcontext *gVg = NULL;
NVGcontext *gFramebufferVg = NULL;
std::shared_ptr<Font> gGuiFont;
float gPixelRatio = 1.0;
float gWindowRatio = 1.0;
bool gAllowCursorLock = true;
int gGuiFrame;
Vec gMousePos;
#ifdef USE_VST2
extern void vst2_handle_queued_set_program_chunk (void);
#endif // USE_VST2

std::string lastWindowTitle;
namespace rack {


void windowSizeCallback(GLFWwindow* window, int width, int height) {
@@ -54,78 +49,78 @@ void mouseButtonCallback(GLFWwindow *window, int button, int action, int mods) {
#ifdef ARCH_MAC
// Ctrl-left click --> right click
if (button == GLFW_MOUSE_BUTTON_LEFT) {
if (glfwGetKey(gWindow, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS || glfwGetKey(gWindow, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS) {
if (glfwGetKey(global_ui->window.gWindow, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS || glfwGetKey(global_ui->window.gWindow, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS) {
button = GLFW_MOUSE_BUTTON_RIGHT;
}
}
#endif

if (action == GLFW_PRESS) {
gTempWidget = NULL;
global_ui->widgets.gTempWidget = NULL;
// onMouseDown
{
EventMouseDown e;
e.pos = gMousePos;
e.pos = global_ui->window.gMousePos;
e.button = button;
gScene->onMouseDown(e);
gTempWidget = e.target;
global_ui->ui.gScene->onMouseDown(e);
global_ui->widgets.gTempWidget = e.target;
}

if (button == GLFW_MOUSE_BUTTON_LEFT) {
if (gTempWidget) {
if (global_ui->widgets.gTempWidget) {
// onDragStart
EventDragStart e;
gTempWidget->onDragStart(e);
global_ui->widgets.gTempWidget->onDragStart(e);
}
gDraggedWidget = gTempWidget;
global_ui->widgets.gDraggedWidget = global_ui->widgets.gTempWidget;

if (gTempWidget != gFocusedWidget) {
if (gFocusedWidget) {
if (global_ui->widgets.gTempWidget != global_ui->widgets.gFocusedWidget) {
if (global_ui->widgets.gFocusedWidget) {
// onDefocus
EventDefocus e;
gFocusedWidget->onDefocus(e);
global_ui->widgets.gFocusedWidget->onDefocus(e);
}
gFocusedWidget = NULL;
if (gTempWidget) {
global_ui->widgets.gFocusedWidget = NULL;
if (global_ui->widgets.gTempWidget) {
// onFocus
EventFocus e;
gTempWidget->onFocus(e);
global_ui->widgets.gTempWidget->onFocus(e);
if (e.consumed) {
gFocusedWidget = gTempWidget;
global_ui->widgets.gFocusedWidget = global_ui->widgets.gTempWidget;
}
}
}
}
gTempWidget = NULL;
global_ui->widgets.gTempWidget = NULL;
}
else if (action == GLFW_RELEASE) {
// onMouseUp
gTempWidget = NULL;
global_ui->widgets.gTempWidget = NULL;
{
EventMouseUp e;
e.pos = gMousePos;
e.pos = global_ui->window.gMousePos;
e.button = button;
gScene->onMouseUp(e);
gTempWidget = e.target;
global_ui->ui.gScene->onMouseUp(e);
global_ui->widgets.gTempWidget = e.target;
}

if (button == GLFW_MOUSE_BUTTON_LEFT) {
if (gDraggedWidget) {
if (global_ui->widgets.gDraggedWidget) {
// onDragDrop
EventDragDrop e;
e.origin = gDraggedWidget;
gTempWidget->onDragDrop(e);
e.origin = global_ui->widgets.gDraggedWidget;
global_ui->widgets.gTempWidget->onDragDrop(e);
}
// gDraggedWidget might have been set to null in the last event, recheck here
if (gDraggedWidget) {
if (global_ui->widgets.gDraggedWidget) {
// onDragEnd
EventDragEnd e;
gDraggedWidget->onDragEnd(e);
global_ui->widgets.gDraggedWidget->onDragEnd(e);
}
gDraggedWidget = NULL;
gDragHoveredWidget = NULL;
global_ui->widgets.gDraggedWidget = NULL;
global_ui->widgets.gDragHoveredWidget = NULL;
}
gTempWidget = NULL;
global_ui->widgets.gTempWidget = NULL;
}
}

@@ -152,10 +147,10 @@ void mouseButtonStickyCallback(GLFWwindow *window, int button, int action, int m
}

void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) {
Vec mousePos = Vec(xpos, ypos).div(gPixelRatio / gWindowRatio).round();
Vec mouseRel = mousePos.minus(gMousePos);
Vec mousePos = Vec(xpos, ypos).div(global_ui->window.gPixelRatio / global_ui->window.gWindowRatio).round();
Vec mouseRel = mousePos.minus(global_ui->window.gMousePos);

int cursorMode = glfwGetInputMode(gWindow, GLFW_CURSOR);
int cursorMode = glfwGetInputMode(global_ui->window.gWindow, GLFW_CURSOR);
(void) cursorMode;

#ifdef ARCH_MAC
@@ -163,80 +158,80 @@ void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) {
// This is not an ideal implementation. For example, if the user drags off the screen, the new mouse position will be clamped.
if (cursorMode == GLFW_CURSOR_HIDDEN) {
// CGSetLocalEventsSuppressionInterval(0.0);
glfwSetCursorPos(gWindow, gMousePos.x, gMousePos.y);
glfwSetCursorPos(global_ui->window.gWindow, global_ui->window.gMousePos.x, global_ui->window.gMousePos.y);
CGAssociateMouseAndMouseCursorPosition(true);
mousePos = gMousePos;
mousePos = global_ui->window.gMousePos;
}
// Because sometimes the cursor turns into an arrow when its position is on the boundary of the window
glfwSetCursor(gWindow, NULL);
glfwSetCursor(global_ui->window.gWindow, NULL);
#endif

gMousePos = mousePos;
global_ui->window.gMousePos = mousePos;

gTempWidget = NULL;
global_ui->widgets.gTempWidget = NULL;
// onMouseMove
{
EventMouseMove e;
e.pos = mousePos;
e.mouseRel = mouseRel;
gScene->onMouseMove(e);
gTempWidget = e.target;
global_ui->ui.gScene->onMouseMove(e);
global_ui->widgets.gTempWidget = e.target;
}

if (gDraggedWidget) {
if (global_ui->widgets.gDraggedWidget) {
// onDragMove
EventDragMove e;
e.mouseRel = mouseRel;
gDraggedWidget->onDragMove(e);
global_ui->widgets.gDraggedWidget->onDragMove(e);

if (gTempWidget != gDragHoveredWidget) {
if (gDragHoveredWidget) {
if (global_ui->widgets.gTempWidget != global_ui->widgets.gDragHoveredWidget) {
if (global_ui->widgets.gDragHoveredWidget) {
EventDragEnter e;
e.origin = gDraggedWidget;
gDragHoveredWidget->onDragLeave(e);
e.origin = global_ui->widgets.gDraggedWidget;
global_ui->widgets.gDragHoveredWidget->onDragLeave(e);
}
gDragHoveredWidget = gTempWidget;
if (gDragHoveredWidget) {
global_ui->widgets.gDragHoveredWidget = global_ui->widgets.gTempWidget;
if (global_ui->widgets.gDragHoveredWidget) {
EventDragEnter e;
e.origin = gDraggedWidget;
gDragHoveredWidget->onDragEnter(e);
e.origin = global_ui->widgets.gDraggedWidget;
global_ui->widgets.gDragHoveredWidget->onDragEnter(e);
}
}
}
else {
if (gTempWidget != gHoveredWidget) {
if (gHoveredWidget) {
if (global_ui->widgets.gTempWidget != global_ui->widgets.gHoveredWidget) {
if (global_ui->widgets.gHoveredWidget) {
// onMouseLeave
EventMouseLeave e;
gHoveredWidget->onMouseLeave(e);
global_ui->widgets.gHoveredWidget->onMouseLeave(e);
}
gHoveredWidget = gTempWidget;
if (gHoveredWidget) {
global_ui->widgets.gHoveredWidget = global_ui->widgets.gTempWidget;
if (global_ui->widgets.gHoveredWidget) {
// onMouseEnter
EventMouseEnter e;
gHoveredWidget->onMouseEnter(e);
global_ui->widgets.gHoveredWidget->onMouseEnter(e);
}
}
}
gTempWidget = NULL;
if (glfwGetMouseButton(gWindow, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS) {
global_ui->widgets.gTempWidget = NULL;
if (glfwGetMouseButton(global_ui->window.gWindow, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS) {
// TODO
// Define a new global called gScrollWidget, which remembers the widget where middle-click was first pressed
EventScroll e;
e.pos = mousePos;
e.scrollRel = mouseRel;
gScene->onScroll(e);
global_ui->ui.gScene->onScroll(e);
}
}

void cursorEnterCallback(GLFWwindow* window, int entered) {
if (!entered) {
if (gHoveredWidget) {
if (global_ui->widgets.gHoveredWidget) {
// onMouseLeave
EventMouseLeave e;
gHoveredWidget->onMouseLeave(e);
global_ui->widgets.gHoveredWidget->onMouseLeave(e);
}
gHoveredWidget = NULL;
global_ui->widgets.gHoveredWidget = NULL;
}
}

@@ -248,35 +243,35 @@ void scrollCallback(GLFWwindow *window, double x, double y) {
#endif
// onScroll
EventScroll e;
e.pos = gMousePos;
e.pos = global_ui->window.gMousePos;
e.scrollRel = scrollRel.mult(50.0);
gScene->onScroll(e);
global_ui->ui.gScene->onScroll(e);
}

void charCallback(GLFWwindow *window, unsigned int codepoint) {
if (gFocusedWidget) {
if (global_ui->widgets.gFocusedWidget) {
// onText
EventText e;
e.codepoint = codepoint;
gFocusedWidget->onText(e);
global_ui->widgets.gFocusedWidget->onText(e);
}
}

void keyCallback(GLFWwindow *window, int key, int scancode, int action, int mods) {
if (action == GLFW_PRESS || action == GLFW_REPEAT) {
if (gFocusedWidget) {
if (global_ui->widgets.gFocusedWidget) {
// onKey
EventKey e;
e.key = key;
gFocusedWidget->onKey(e);
global_ui->widgets.gFocusedWidget->onKey(e);
if (e.consumed)
return;
}
// onHoverKey
EventHoverKey e;
e.pos = gMousePos;
e.pos = global_ui->window.gMousePos;
e.key = key;
gScene->onHoverKey(e);
global_ui->ui.gScene->onHoverKey(e);
}

// Keyboard MIDI driver
@@ -293,11 +288,11 @@ void keyCallback(GLFWwindow *window, int key, int scancode, int action, int mods
void dropCallback(GLFWwindow *window, int count, const char **paths) {
// onPathDrop
EventPathDrop e;
e.pos = gMousePos;
e.pos = global_ui->window.gMousePos;
for (int i = 0; i < count; i++) {
e.paths.push_back(paths[i]);
}
gScene->onPathDrop(e);
global_ui->ui.gScene->onPathDrop(e);
}

void errorCallback(int error, const char *description) {
@@ -306,32 +301,47 @@ void errorCallback(int error, const char *description) {

void renderGui() {
int width, height;
glfwGetFramebufferSize(gWindow, &width, &height);
glfwGetFramebufferSize(global_ui->window.gWindow, &width, &height);

// Update and render
nvgBeginFrame(gVg, width, height, gPixelRatio);
nvgBeginFrame(global_ui->window.gVg, width, height, global_ui->window.gPixelRatio);

nvgReset(gVg);
nvgScale(gVg, gPixelRatio, gPixelRatio);
gScene->draw(gVg);
nvgReset(global_ui->window.gVg);
nvgScale(global_ui->window.gVg, global_ui->window.gPixelRatio, global_ui->window.gPixelRatio);
global_ui->ui.gScene->draw(global_ui->window.gVg);

glViewport(0, 0, width, height);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
nvgEndFrame(gVg);
glfwSwapBuffers(gWindow);
nvgEndFrame(global_ui->window.gVg);
glfwSwapBuffers(global_ui->window.gWindow);
}

void windowInit() {
int err;

// Set up GLFW
glfwSetErrorCallback(errorCallback);
err = glfwInit();
if (err != GLFW_TRUE) {
osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Could not initialize GLFW.");
exit(1);
}
bool bInitGLFW = true;

#ifdef USE_VST2
// (note) GLFW uses global vars. hmmmmm. multiple init seems to work, though (and opening multiple windows)
// (note) just don't terminate until last instance is closed
// (note) (this will probably result in memleaks..?!)
bInitGLFW = (1 == global->vst2.last_seen_instance_count);
#endif // USE_VST2

#if 0
if(bInitGLFW)
{
// Set up GLFW
glfwSetErrorCallback(errorCallback);
err = glfwInit();
if (err != GLFW_TRUE) {
osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Could not initialize GLFW.");
exit(1);
}
}
#else
glfwSetErrorCallback(errorCallback);
#endif

#if defined NANOVG_GL2
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
@@ -344,28 +354,28 @@ void windowInit() {
#endif
glfwWindowHint(GLFW_MAXIMIZED, GLFW_TRUE);
glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_TRUE);
lastWindowTitle = "";
gWindow = glfwCreateWindow(640, 480, lastWindowTitle.c_str(), NULL, NULL);
if (!gWindow) {
global_ui->window.lastWindowTitle = "";
global_ui->window.gWindow = glfwCreateWindow(640, 480, global_ui->window.lastWindowTitle.c_str(), NULL, NULL);
if (!global_ui->window.gWindow) {
osdialog_message(OSDIALOG_ERROR, OSDIALOG_OK, "Cannot open window with OpenGL 2.0 renderer. Does your graphics card support OpenGL 2.0 or greater? If so, make sure you have the latest graphics drivers installed.");
exit(1);
}

glfwMakeContextCurrent(gWindow);
glfwMakeContextCurrent(global_ui->window.gWindow);

glfwSwapInterval(1);

glfwSetInputMode(gWindow, GLFW_LOCK_KEY_MODS, 1);
glfwSetInputMode(global_ui->window.gWindow, GLFW_LOCK_KEY_MODS, 1);

glfwSetWindowSizeCallback(gWindow, windowSizeCallback);
glfwSetMouseButtonCallback(gWindow, mouseButtonStickyCallback);
glfwSetWindowSizeCallback(global_ui->window.gWindow, windowSizeCallback);
glfwSetMouseButtonCallback(global_ui->window.gWindow, mouseButtonStickyCallback);
// Call this ourselves, but on every frame instead of only when the mouse moves
// glfwSetCursorPosCallback(gWindow, cursorPosCallback);
glfwSetCursorEnterCallback(gWindow, cursorEnterCallback);
glfwSetScrollCallback(gWindow, scrollCallback);
glfwSetCharCallback(gWindow, charCallback);
glfwSetKeyCallback(gWindow, keyCallback);
glfwSetDropCallback(gWindow, dropCallback);
glfwSetCursorEnterCallback(global_ui->window.gWindow, cursorEnterCallback);
glfwSetScrollCallback(global_ui->window.gWindow, scrollCallback);
glfwSetCharCallback(global_ui->window.gWindow, charCallback);
glfwSetKeyCallback(global_ui->window.gWindow, keyCallback);
glfwSetDropCallback(global_ui->window.gWindow, dropCallback);

// Set up GLEW
glewExperimental = GL_TRUE;
@@ -378,113 +388,139 @@ void windowInit() {
// GLEW generates GL error because it calls glGetString(GL_EXTENSIONS), we'll consume it here.
glGetError();

glfwSetWindowSizeLimits(gWindow, 640, 480, GLFW_DONT_CARE, GLFW_DONT_CARE);
glfwSetWindowSizeLimits(global_ui->window.gWindow, 640, 480, GLFW_DONT_CARE, GLFW_DONT_CARE);

// Set up NanoVG
int nvgFlags = NVG_ANTIALIAS;
#if defined NANOVG_GL2
gVg = nvgCreateGL2(nvgFlags);
global_ui->window.gVg = nvgCreateGL2(nvgFlags);
#elif defined NANOVG_GL3
gVg = nvgCreateGL3(nvgFlags);
global_ui->window.gVg = nvgCreateGL3(nvgFlags);
#elif defined NANOVG_GLES2
gVg = nvgCreateGLES2(nvgFlags);
global_ui->window.gVg = nvgCreateGLES2(nvgFlags);
#endif
assert(gVg);
assert(global_ui->window.gVg);

#if defined NANOVG_GL2
gFramebufferVg = nvgCreateGL2(nvgFlags);
global_ui->window.gFramebufferVg = nvgCreateGL2(nvgFlags);
#elif defined NANOVG_GL3
gFramebufferVg = nvgCreateGL3(nvgFlags);
global_ui->window.gFramebufferVg = nvgCreateGL3(nvgFlags);
#elif defined NANOVG_GLES2
gFramebufferVg = nvgCreateGLES2(nvgFlags);
global_ui->window.gFramebufferVg = nvgCreateGLES2(nvgFlags);
#endif
assert(gFramebufferVg);
assert(global_ui->window.gFramebufferVg);

// Set up Blendish
gGuiFont = Font::load(assetGlobal("res/fonts/DejaVuSans.ttf"));
bndSetFont(gGuiFont->handle);
global_ui->window.gGuiFont = Font::load(assetGlobal("res/fonts/DejaVuSans.ttf"));
bndSetFont(global_ui->window.gGuiFont->handle);

windowSetTheme(nvgRGB(0x33, 0x33, 0x33), nvgRGB(0xf0, 0xf0, 0xf0));

#ifdef USE_VST2
// (note) the patch loader requires an initialized window system (widgets etc)
::glfwHideWindow(global_ui->window.gWindow);
#endif // USE_VST2
}

void windowDestroy() {
gGuiFont.reset();
global_ui->window.gGuiFont.reset();

#if defined NANOVG_GL2
nvgDeleteGL2(gVg);
nvgDeleteGL2(global_ui->window.gVg);
#elif defined NANOVG_GL3
nvgDeleteGL3(gVg);
nvgDeleteGL3(global_ui->window.gVg);
#elif defined NANOVG_GLES2
nvgDeleteGLES2(gVg);
nvgDeleteGLES2(global_ui->window.gVg);
#endif

#if defined NANOVG_GL2
nvgDeleteGL2(gFramebufferVg);
nvgDeleteGL2(global_ui->window.gFramebufferVg);
#elif defined NANOVG_GL3
nvgDeleteGL3(gFramebufferVg);
nvgDeleteGL3(global_ui->window.gFramebufferVg);
#elif defined NANOVG_GLES2
nvgDeleteGLES2(gFramebufferVg);
nvgDeleteGLES2(global_ui->window.gFramebufferVg);
#endif

glfwDestroyWindow(gWindow);
glfwTerminate();
glfwDestroyWindow(global_ui->window.gWindow);
global_ui->window.gWindow = 0;

#if 0
bool bTerminateGLFW = true;
#ifdef USE_VST2
bTerminateGLFW = (1 == global->vst2.last_seen_instance_count);
#endif // USE_VST2
if(bTerminateGLFW)
glfwTerminate();
#endif
}

void windowRun() {
assert(gWindow);
gGuiFrame = 0;
while(!glfwWindowShouldClose(gWindow)) {
printf("xxx vcvrack: windowRun() ENTER\n");
assert(global_ui->window.gWindow);
global_ui->window.gGuiFrame = 0;
while(!glfwWindowShouldClose(global_ui->window.gWindow)
#ifdef USE_VST2
&& !global_ui->vst2.b_close_window
#endif // USE_VST2
) {

vst2_handle_queued_set_program_chunk();

double startTime = glfwGetTime();
gGuiFrame++;
global_ui->window.gGuiFrame++;
// printf("xxx vcvrack: windowRun(): startTime=%g\n", startTime);

// Poll events
glfwPollEvents();
{
double xpos, ypos;
glfwGetCursorPos(gWindow, &xpos, &ypos);
cursorPosCallback(gWindow, xpos, ypos);
glfwGetCursorPos(global_ui->window.gWindow, &xpos, &ypos);
cursorPosCallback(global_ui->window.gWindow, xpos, ypos);
}
mouseButtonStickyPop();

#ifndef USE_VST2
gamepadStep();
#endif // !USE_VST2

// Set window title
std::string windowTitle;
windowTitle = gApplicationName;
windowTitle = global_ui->app.gApplicationName;
windowTitle += " ";
windowTitle += gApplicationVersion;
if (!gRackWidget->lastPath.empty()) {
windowTitle += global_ui->app.gApplicationVersion;
if (!global_ui->app.gRackWidget->lastPath.empty()) {
windowTitle += " - ";
windowTitle += stringFilename(gRackWidget->lastPath);
windowTitle += stringFilename(global_ui->app.gRackWidget->lastPath);
}
if (windowTitle != lastWindowTitle) {
glfwSetWindowTitle(gWindow, windowTitle.c_str());
lastWindowTitle = windowTitle;
if (windowTitle != global_ui->window.lastWindowTitle) {
glfwSetWindowTitle(global_ui->window.gWindow, windowTitle.c_str());
global_ui->window.lastWindowTitle = windowTitle;
}

// Get desired scaling
float pixelRatio;
glfwGetWindowContentScale(gWindow, &pixelRatio, NULL);
glfwGetWindowContentScale(global_ui->window.gWindow, &pixelRatio, NULL);
pixelRatio = roundf(pixelRatio);
if (pixelRatio != gPixelRatio) {
if (pixelRatio != global_ui->window.gPixelRatio) {
EventZoom eZoom;
gScene->onZoom(eZoom);
gPixelRatio = pixelRatio;
global_ui->ui.gScene->onZoom(eZoom);
global_ui->window.gPixelRatio = pixelRatio;
}

// Get framebuffer/window ratio
int width, height;
glfwGetFramebufferSize(gWindow, &width, &height);
glfwGetFramebufferSize(global_ui->window.gWindow, &width, &height);
int windowWidth, windowHeight;
glfwGetWindowSize(gWindow, &windowWidth, &windowHeight);
gWindowRatio = (float)width / windowWidth;
glfwGetWindowSize(global_ui->window.gWindow, &windowWidth, &windowHeight);
global_ui->window.gWindowRatio = (float)width / windowWidth;

gScene->box.size = Vec(width, height).div(gPixelRatio);
global_ui->ui.gScene->box.size = Vec(width, height).div(global_ui->window.gPixelRatio);

// Step scene
gScene->step();
global_ui->ui.gScene->step();

// Render
bool visible = glfwGetWindowAttrib(gWindow, GLFW_VISIBLE) && !glfwGetWindowAttrib(gWindow, GLFW_ICONIFIED);
bool visible = glfwGetWindowAttrib(global_ui->window.gWindow, GLFW_VISIBLE) && !glfwGetWindowAttrib(global_ui->window.gWindow, GLFW_ICONIFIED);
if (visible) {
renderGui();
}
@@ -498,67 +534,85 @@ void windowRun() {
}
endTime = glfwGetTime();
// info("%lf fps", 1.0 / (endTime - startTime));

#ifdef USE_VST2
if(global_ui->vst2.b_hide_window)
{
global_ui->vst2.b_hide_window = 0;
break;
}
#endif // USE_VST2
}

#ifdef USE_VST2
::glfwSetWindowShouldClose(global_ui->window.gWindow, 0);
::glfwHideWindow(global_ui->window.gWindow);
#endif

printf("xxx vcvrack: windowRun() LEAVE\n");
}

void windowClose() {
glfwSetWindowShouldClose(gWindow, GLFW_TRUE);
glfwSetWindowShouldClose(global_ui->window.gWindow, GLFW_TRUE);
}

void windowCursorLock() {
if (gAllowCursorLock) {
if (global_ui->window.gAllowCursorLock) {
#ifdef ARCH_MAC
glfwSetInputMode(gWindow, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
glfwSetInputMode(global_ui->window.gWindow, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
#else
glfwSetInputMode(gWindow, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
glfwSetInputMode(global_ui->window.gWindow, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
#endif
}
}

void windowCursorUnlock() {
if (gAllowCursorLock) {
glfwSetInputMode(gWindow, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
if (global_ui->window.gAllowCursorLock) {
glfwSetInputMode(global_ui->window.gWindow, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
}
}

bool windowIsModPressed() {
#ifdef ARCH_MAC
return glfwGetKey(gWindow, GLFW_KEY_LEFT_SUPER) == GLFW_PRESS || glfwGetKey(gWindow, GLFW_KEY_RIGHT_SUPER) == GLFW_PRESS;
return glfwGetKey(global_ui->window.gWindow, GLFW_KEY_LEFT_SUPER) == GLFW_PRESS || glfwGetKey(global_ui->window.gWindow, GLFW_KEY_RIGHT_SUPER) == GLFW_PRESS;
#else
return glfwGetKey(gWindow, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS || glfwGetKey(gWindow, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS;
return glfwGetKey(global_ui->window.gWindow, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS || glfwGetKey(global_ui->window.gWindow, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS;
#endif
}

bool windowIsShiftPressed() {
return glfwGetKey(gWindow, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS || glfwGetKey(gWindow, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS;
return glfwGetKey(global_ui->window.gWindow, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS || glfwGetKey(global_ui->window.gWindow, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS;
}

Vec windowGetWindowSize() {
int width, height;
glfwGetWindowSize(gWindow, &width, &height);
glfwGetWindowSize(global_ui->window.gWindow, &width, &height);
return Vec(width, height);
}

void windowSetWindowSize(Vec size) {
int width = size.x;
int height = size.y;
glfwSetWindowSize(gWindow, width, height);
glfwSetWindowSize(global_ui->window.gWindow, width, height);
}

Vec windowGetWindowPos() {
int x, y;
glfwGetWindowPos(gWindow, &x, &y);
glfwGetWindowPos(global_ui->window.gWindow, &x, &y);
return Vec(x, y);
}

void windowSetWindowPos(Vec pos) {
int x = pos.x;
int y = pos.y;
glfwSetWindowPos(gWindow, x, y);
glfwSetWindowPos(global_ui->window.gWindow, x, y);
}

bool windowIsMaximized() {
return glfwGetWindowAttrib(gWindow, GLFW_MAXIMIZED);
if(global_ui->window.gWindow)
return glfwGetWindowAttrib(global_ui->window.gWindow, GLFW_MAXIMIZED);
else
return false;
}

void windowSetTheme(NVGcolor bg, NVGcolor fg) {
@@ -607,26 +661,21 @@ void windowSetTheme(NVGcolor bg, NVGcolor fg) {
bndSetTheme(t);
}

static int windowX = 0;
static int windowY = 0;
static int windowWidth = 0;
static int windowHeight = 0;

void windowSetFullScreen(bool fullScreen) {
if (windowGetFullScreen()) {
glfwSetWindowMonitor(gWindow, NULL, windowX, windowY, windowWidth, windowHeight, GLFW_DONT_CARE);
glfwSetWindowMonitor(global_ui->window.gWindow, NULL, global_ui->window.windowX, global_ui->window.windowY, global_ui->window.windowWidth, global_ui->window.windowHeight, GLFW_DONT_CARE);
}
else {
glfwGetWindowPos(gWindow, &windowX, &windowY);
glfwGetWindowSize(gWindow, &windowWidth, &windowHeight);
glfwGetWindowPos(global_ui->window.gWindow, &global_ui->window.windowX, &global_ui->window.windowY);
glfwGetWindowSize(global_ui->window.gWindow, &global_ui->window.windowWidth, &global_ui->window.windowHeight);
GLFWmonitor *monitor = glfwGetPrimaryMonitor();
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
glfwSetWindowMonitor(gWindow, monitor, 0, 0, mode->width, mode->height, mode->refreshRate);
glfwSetWindowMonitor(global_ui->window.gWindow, monitor, 0, 0, mode->width, mode->height, mode->refreshRate);
}
}

bool windowGetFullScreen() {
GLFWmonitor *monitor = glfwGetWindowMonitor(gWindow);
GLFWmonitor *monitor = glfwGetWindowMonitor(global_ui->window.gWindow);
return monitor != NULL;
}

@@ -636,7 +685,7 @@ bool windowGetFullScreen() {
////////////////////

Font::Font(const std::string &filename) {
handle = nvgCreateFont(gVg, filename.c_str(), filename.c_str());
handle = nvgCreateFont(global_ui->window.gVg, filename.c_str(), filename.c_str());
if (handle >= 0) {
info("Loaded font %s", filename.c_str());
}
@@ -650,10 +699,9 @@ Font::~Font() {
}

std::shared_ptr<Font> Font::load(const std::string &filename) {
static std::map<std::string, std::weak_ptr<Font>> cache;
auto sp = cache[filename].lock();
auto sp = global_ui->window.font_cache[filename].lock();
if (!sp)
cache[filename] = sp = std::make_shared<Font>(filename);
global_ui->window.font_cache[filename] = sp = std::make_shared<Font>(filename);
return sp;
}

@@ -662,7 +710,7 @@ std::shared_ptr<Font> Font::load(const std::string &filename) {
////////////////////

Image::Image(const std::string &filename) {
handle = nvgCreateImage(gVg, filename.c_str(), NVG_IMAGE_REPEATX | NVG_IMAGE_REPEATY);
handle = nvgCreateImage(global_ui->window.gVg, filename.c_str(), NVG_IMAGE_REPEATX | NVG_IMAGE_REPEATY);
if (handle > 0) {
info("Loaded image %s", filename.c_str());
}
@@ -673,14 +721,13 @@ Image::Image(const std::string &filename) {

Image::~Image() {
// TODO What if handle is invalid?
nvgDeleteImage(gVg, handle);
nvgDeleteImage(global_ui->window.gVg, handle);
}

std::shared_ptr<Image> Image::load(const std::string &filename) {
static std::map<std::string, std::weak_ptr<Image>> cache;
auto sp = cache[filename].lock();
auto sp = global_ui->window.image_cache[filename].lock();
if (!sp)
cache[filename] = sp = std::make_shared<Image>(filename);
global_ui->window.image_cache[filename] = sp = std::make_shared<Image>(filename);
return sp;
}

@@ -703,10 +750,9 @@ SVG::~SVG() {
}

std::shared_ptr<SVG> SVG::load(const std::string &filename) {
static std::map<std::string, std::weak_ptr<SVG>> cache;
auto sp = cache[filename].lock();
auto sp = global_ui->window.svg_cache[filename].lock();
if (!sp)
cache[filename] = sp = std::make_shared<SVG>(filename);
global_ui->window.svg_cache[filename] = sp = std::make_shared<SVG>(filename);
return sp;
}



+ 264
- 0
vst2_bin/CHANGELOG_VST.txt View File

@@ -0,0 +1,264 @@

** July 2nd, 2018
- add module Template.MyModule
- clean up for GITHub release


** July 1st, 2018
- add VST parameter support (set/get/query name)
- added "vst2_unique_param_base_id" JSON module parameter
- the plugin always reports 9999 parameters
- known issue: does not work in Reason since it bails out when a plugin has more than 128 params (IIRC)
- add module Bogaudio.VCO
- add module Bogaudio.XCO
- add module Bogaudio.Additator
- add module Bogaudio.FMOp
- add module Bogaudio.LFO
- add module Bogaudio.EightFO
- add module Bogaudio.DADSRH
- add module Bogaudio.DADSRHPlus
- add module Bogaudio.DGate
- add module Bogaudio.Shaper
- add module Bogaudio.ShaperPlus
- add module Bogaudio.ADSR
- add module Bogaudio.Follow
- add module Bogaudio.Mix4
- add module Bogaudio.Mix8
- add module Bogaudio.VCM
- add module Bogaudio.Pan
- add module Bogaudio.XFade
- add module Bogaudio.VCA
- add module Bogaudio.VCAmp
- add module Bogaudio.Analyzer
- add module Bogaudio.VU
- add module Bogaudio.Detune
- add module Bogaudio.Stack
- add module Bogaudio.Reftone
- add module Bogaudio.Bool
- add module Bogaudio.CVD
- add module Bogaudio.FlipFlop
- add module Bogaudio.Manual
- add module Bogaudio.Mult
- add module Bogaudio.Noise
- add module Bogaudio.Offset
- add module Bogaudio.SampleHold
- add module Bogaudio.Sums
- add module Bogaudio.Switch
- add module Bogaudio.Lag
- add module Bogaudio.RM
- add module Bogaudio.Test
- add module Bogaudio.Test2
- add module Bogaudio.ThreeHP
- add module Bogaudio.SixHP
- add module Bogaudio.EightHP
- add module Bogaudio.TenHP
- add module Bogaudio.TwelveHP
- add module Bogaudio.ThirteenHP
- add module Bogaudio.FifteenHP
- add module Bogaudio.EighteenHP
- add module Bogaudio.TwentyHP
- add module Bogaudio.TwentyTwoHP
- add module Bogaudio.TwentyFiveHP
- add module Bogaudio.ThirtyHP
- add module cf.trSEQ
- add module cf.LEDSEQ
- add module cf.L3DS3Q
- add module cf.SLIDERSEQ
- add module cf.PLAYER
- add module cf.STEPS
- add module cf.METRO
- add module cf.EACH
- add module cf.FOUR
- add module cf.PEAK
- add module cf.MONO
- add module cf.STEREO
- add module cf.MASTER
- add module cf.SUB
- add module cf.CUBE
- add module cf.PATCH
- add module cf.LEDS
- add module cf.DAVE
- add module Koralfx.Beatovnik
- add module Koralfx.Mixovnik
- add module Koralfx.Nullovnik4
- add module Koralfx.Nullovnik6
- add module Koralfx.Presetovnik
- add module Koralfx.Quantovnik
- add module Koralfx.Scorovnik
- add module LindenbergResearch.SimpleFilter
- add module LindenbergResearch.MS20Filter
- add module LindenbergResearch.AlmaFilter
- add module LindenbergResearch.ReShaper
- add module LindenbergResearch.BlankPanel
- add module LindenbergResearch.BlankPanelM1
- add module Qwelk.Automaton
- add module Qwelk.Byte
- add module Qwelk.Chaos
- add module Qwelk.Column
- add module Qwelk.Gate
- add module Qwelk.Or
- add module Qwelk.Not
- add module Qwelk.Xor
- add module Qwelk.Mix
- add module Qwelk.News
- add module Qwelk.Scaler
- add module Qwelk.Wrap
- add module Qwelk.XFade
- add module SubmarineFree.AG106
- add module SubmarineFree.BB120
- add module SubmarineFree.FF110
- add module SubmarineFree.FF120
- add module SubmarineFree.FF212
- add module SubmarineFree.LA108
- add module SubmarineFree.LD106
- add module SubmarineFree.NG112
- add module SubmarineFree.OG106
- add module SubmarineFree.PG112
- add module SubmarineFree.PO101
- add module SubmarineFree.PO102
- add module SubmarineFree.PO204
- add module SubmarineFree.WK101
- add module SubmarineFree.WK205
- add module SubmarineFree.XF101
- add module SubmarineFree.XF102
- add module SubmarineFree.XF104
- add module SubmarineFree.XF201
- add module SubmarineFree.XF202
- add module SubmarineFree.XG106
- add module SubmarineFree.BP101
- add module SubmarineFree.BP102
- add module SubmarineFree.BP104
- add module SubmarineFree.BP108
- add module SubmarineFree.BP110
- add module SubmarineFree.BP112
- add module SubmarineFree.BP116
- add module SubmarineFree.BP120
- add module SubmarineFree.BP124
- add module SubmarineFree.BP132


** June 30th, 2018
- add module AS.ADSR
- add module AS.AtNuVrTr
- add module AS.BPMCalc
- add module AS.BPMClock
- add module AS.BlankPanel4
- add module AS.BlankPanel6
- add module AS.BlankPanel8
- add module AS.BlankPanelSpecial
- add module AS.Cv2T
- add module AS.DelayPlusFx
- add module AS.DelayPlusStereoFx
- add module AS.Flow
- add module AS.KillGate
- add module AS.LaunchGate
- add module AS.Merge2.5
- add module AS.Mixer8ch
- add module AS.MonoVUmeter
- add module AS.Multiple2.5
- add module AS.PhaserFx
- add module AS.QuadVCA
- add module AS.ReverbFx
- add module AS.ReverbStereoFx
- add module AS.SEQ16
- add module AS.SawOsc
- add module AS.SignalDelay
- add module AS.SineOsc
- add module AS.Steps
- add module AS.SuperDriveFx
- add module AS.TremoloFx
- add module AS.TremoloStereoFx
- add module AS.TriLFO
- add module AS.TriggersMKI
- add module AS.TriggersMKII
- add module AS.VCA
- add module AS.WaveShaper
- add module AS.StereoVUmeter
- add module Befaco.ABC
- add module Befaco.DualAtenuverter
- add module Befaco.EvenVCO
- add module Befaco.Mixer
- add module Befaco.Rampage
- add module Befaco.SlewLimiter
- add module Befaco.SpringReverb
- add module ESeries.E340
- add module ErraticInstruments.MPEToCV
- add module ErraticInstruments.QuadMPEToCV
- add module HetrickCV.TwoToFour
- add module HetrickCV.AnalogToDigital
- add module HetrickCV.ASR
- add module HetrickCV.Bitshift
- add module HetrickCV.BlankPanel
- add module HetrickCV.Boolean3
- add module HetrickCV.Comparator
- add module HetrickCV.Contrast
- add module HetrickCV.Crackle
- add module HetrickCV.Delta
- add module HetrickCV.DigitalToAnalog
- add module HetrickCV.Dust
- add module HetrickCV.Exponent
- add module HetrickCV.FlipFlop
- add module HetrickCV.FlipPan
- add module HetrickCV.GateJunction
- add module HetrickCV.LogicCombine
- add module HetrickCV.RandomGates
- add module HetrickCV.Rotator
- add module HetrickCV.Scanner
- add module HetrickCV.Waveshape
- add module SonusModular.Addiction
- add module SonusModular.Bitter
- add module SonusModular.Bymidside
- add module SonusModular.Campione
- add module SonusModular.Chainsaw
- add module SonusModular.Ctrl
- add module SonusModular.Deathcrush
- add module SonusModular.Harmony
- add module SonusModular.Ladrone
- add module SonusModular.Luppolo
- add module SonusModular.Luppolo3
- add module SonusModular.Micromacro
- add module SonusModular.Multimulti
- add module SonusModular.Oktagon
- add module SonusModular.Osculum
- add module SonusModular.Paramath
- add module SonusModular.Piconoise
- add module SonusModular.Pusher
- add module SonusModular.Ringo
- add module SonusModular.Scramblase
- add module SonusModular.Twoff
- add module SonusModular.Yabp
- add module Valley.Topograph
- add module Valley.UGraph
- add module Valley.Dexter
- add module Valley.Plateau


** June 29th, 2018
- add VSTi version of the plugin (the only difference is that it is reported as an instrument instead of an effect)
- forward host samplerate to VCV
- report last seen processing buffer size
- disable mouse focus lock (can result in non-responding UI)
- prevent windows from being closed
- load patches in UI thread
- add AudibleInstruments modules (Mutable Instruments Clouds, Elements, ..)


** June 28th, 2018
- replaced all (700+) static+global var references by TLS instance pointer
- added MSVC+GNU make based build system
- added support for multiple instantion (reentrant + thread safe)
- added MIDI input support (VSTMidiDriver)
- comes with one (statically linke) plugin ("Fundamental")
- the plugin now also works in other DAWs (tested with Reaper and Reason 10)


** June 25th, 2018
- initial release
- registered VST2 uid ('gvgy') at http://service.steinberg.de/databases/plugin.nsf/plugIn?openForm
- built using mingw64
- only one instance supported
- no program chunks
- no MIDI
- audio input is broken
- comes with one (dynamically loaded) plugin ("Fundamental")
- the VST plugin does not work in some DAWs (neither in Reaper, nor in Reason. It does work in Eureka)

+ 514
- 0
vst2_bin/LICENSE-dist.txt View File

@@ -0,0 +1,514 @@
# nanosvg

Copyright (c) 2013-14 Mikko Mononen memon@inside.org

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.


# nanovg

Copyright (c) 2013 Mikko Mononen memon@inside.org

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.


# Blendish

Copyright (c) 2014 Leonard Ritter <leonard.ritter@duangle.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


# GLFW

Copyright © 2002-2006 Marcus Geelnard

Copyright © 2006-2011 Camilla Berglund

This software is provided ‘as-is’, without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.

Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:

The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.

Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.

This notice may not be removed or altered from any source distribution.


# GLEW

The OpenGL Extension Wrangler Library
Copyright (C) 2002-2007, Milan Ikits <milan ikits[]ieee org>
Copyright (C) 2002-2007, Marcelo E. Magallon <mmagallo[]debian org>
Copyright (C) 2002, Lev Povalahev
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* The name of the author may be used to endorse or promote products
derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.


Mesa 3-D graphics library
Version: 7.0

Copyright (C) 1999-2007 Brian Paul All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


Copyright (c) 2007 The Khronos Group Inc.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and/or associated documentation files (the
"Materials"), to deal in the Materials without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Materials, and to
permit persons to whom the Materials are furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Materials.

THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.


# jansson

Copyright (c) 2009-2016 Petri Lehtinen <petri@digip.org>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


# RtAudio

RtAudio: a set of realtime audio i/o C++ classes
Copyright (c) 2001-2017 Gary P. Scavone

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

Any person wishing to distribute modifications to the Software is
asked to send the modifications to the original developer so that
they can be incorporated into the canonical version. This is,
however, not a binding provision of this license.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


# RtMidi

RtMidi: realtime MIDI i/o C++ classes
Copyright (c) 2003-2017 Gary P. Scavone

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is,
however, not a binding provision of this license.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


# libspeexdsp

Copyright 2002-2008 Xiph.org Foundation
Copyright 2002-2008 Jean-Marc Valin
Copyright 2005-2007 Analog Devices Inc.
Copyright 2005-2008 Commonwealth Scientific and Industrial Research
Organisation (CSIRO)
Copyright 1993, 2002, 2006 David Rowe
Copyright 2003 EpicGames
Copyright 1992-1994 Jutta Degener, Carsten Bormann

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.

- Neither the name of the Xiph.org Foundation nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


# curl

Copyright (c) 1996 - 2017, Daniel Stenberg, daniel@haxx.se, and many contributors, see the THANKS file.

All rights reserved.

Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder.


# libzip

Copyright (C) 1999-2014 Dieter Baron and Thomas Klausner

The authors can be contacted at <libzip@nih.at>

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


# zlib

(C) 1995-2017 Jean-loup Gailly and Mark Adler

This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.

Jean-loup Gailly Mark Adler
jloup@gzip.org madler@alumni.caltech.edu

If you use the zlib library in a product, we would appreciate *not* receiving
lengthy legal documents to sign. The sources are provided for free but without
warranty of any kind. The library has been entirely written by Jean-loup
Gailly and Mark Adler; it does not include third-party code.

If you redistribute modified sources, we would appreciate that you include in
the file ChangeLog history information documenting your changes. Please read
the FAQ for more information on the distribution of modified source versions.


# OpenSSL

OpenSSL License
---------------

/* ====================================================================
* Copyright (c) 1998-2017 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* openssl-core@openssl.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/

Original SSLeay License
-----------------------

/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
*
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
*
* Copyright remains Eric Young's, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* "This product includes cryptographic software written by
* Eric Young (eay@cryptsoft.com)"
* The word 'cryptographic' can be left out if the rouines from the library
* being used are not cryptographic related :-).
* 4. If you include any Windows specific code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
*
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
* [including the GNU Public Licence.]
*/


# osdialog

(CC0 1.0 Universal, no attribution needed)


# pffft

Copyright (c) 2013 Julien Pommier ( pommier@modartt.com )

Based on original fortran 77 code from FFTPACKv4 from NETLIB,
authored by Dr Paul Swarztrauber of NCAR, in 1985.

As confirmed by the NCAR fftpack software curators, the following
FFTPACKv5 license applies to FFTPACKv4 sources. My changes are
released under the same terms.

FFTPACK license:

http://www.cisl.ucar.edu/css/software/fftpack5/ftpk.html

Copyright (c) 2004 the University Corporation for Atmospheric
Research ("UCAR"). All rights reserved. Developed by NCAR's
Computational and Information Systems Laboratory, UCAR,
www.cisl.ucar.edu.

Redistribution and use of the Software in source and binary forms,
with or without modification, is permitted provided that the
following conditions are met:

- Neither the names of NCAR's Computational and Information Systems
Laboratory, the University Corporation for Atmospheric Research,
nor the names of its sponsors or contributors may be used to
endorse or promote products derived from this Software without
specific prior written permission.

- Redistributions of source code must retain the above copyright
notices, this list of conditions, and the disclaimer below.

- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions, and the disclaimer below in the
documentation and/or other materials provided with the
distribution.

THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
SOFTWARE.

+ 11
- 0
vst2_bin/LICENSE.txt View File

@@ -0,0 +1,11 @@
Copyright 2016 Andrew Belt

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ 108
- 0
vst2_bin/README.md View File

@@ -0,0 +1,108 @@
# Rack

*Rack* is the engine for the VCV open-source virtual modular synthesizer.

![Rack screenshot](https://vcvrack.com/images/screenshot.png)

This README includes instructions for building Rack from source. For information about the software, go to https://vcvrack.com/.

## The [Issue Tracker](https://github.com/VCVRack/Rack/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) *is* the official developer's forum

Bug reports, feature requests, and even *questions/discussions* are welcome on the GitHub Issue Tracker for all VCVRack repos.
However, please search before posting to avoid duplicates, and limit to one issue per post.

Please vote on feature requests by using the Thumbs Up/Down reaction on the first post.

I rarely accept code contributions to Rack itself, so please notify me in advance if you wish to send a pull request.

## Setting up your development environment

Before building Rack, you must install build dependencies provided by your system's package manager.
Rack's own dependencies (GLEW, glfw, etc) do not need to be installed on your system, since specific versions are compiled locally during the build process.
However, you need proper tools to build Rack and these dependencies.

### Mac

Install [Xcode](https://developer.apple.com/xcode/).
Using [Homebrew](https://brew.sh/), install the build dependencies.
```
brew install git wget cmake autoconf automake libtool
```

### Windows

Install [MSYS2](http://www.msys2.org/) and launch the MinGW 64-bit shell (not the default MSYS shell).
```
pacman -S git wget make tar unzip zip mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake autoconf automake mingw-w64-x86_64-libtool
```

### Linux

On Arch Linux:
```
pacman -S git wget gcc make cmake tar unzip zip curl
```

On Ubuntu 16.04:
```
sudo apt install git curl cmake libx11-dev libglu1-mesa-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev zlib1g-dev libasound2-dev libgtk2.0-dev libjack-jackd2-dev
```

## Building

*If the build fails for you, please report the issue with a detailed error message to help the portability of Rack.*

Clone this repository with `git clone https://github.com/VCVRack/Rack.git` and `cd Rack`.
Make sure there are no spaces in your path, as this breaks many build systems.

Clone submodules.

git submodule update --init --recursive

Build dependencies locally.
You may use make's `-j$(nproc)` flag to parallelize builds across all your CPU cores.

make dep

You may use `make dep RTAUDIO_ALL_APIS=1` to attempt to build with all audio driver APIs enabled for your operating system, although this is unsupported.

You should see a message that all dependencies built successfully.

Build Rack.

make

Run Rack.

make run

## Building plugins

Be sure to check out and build the version of Rack you wish to build your plugins against.

You must clone the plugin in Rack's `plugins/` directory, e.g.

cd plugins
git clone https://github.com/VCVRack/Fundamental.git

Clone submodules.

cd Fundamental
git submodule update --init --recursive

Build plugin.

make dep
make

## Licenses

All **source code** in this repository is licensed under [BSD-3-Clause](LICENSE.txt) by [Andrew Belt](https://andrewbelt.name/).

**Component Library graphics** in `res/ComponentLibrary` are licensed under [CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/) by [Grayscale](http://grayscale.info/). Commercial plugins must request a commercial license to use Component Library graphics by emailing contact@vcvrack.com.

**Core** panel graphics in `res/Core` are copyright © 2017 Grayscale. You may not create derivative works of Core panels.

The **VCV logo and icon** are copyright © 2017 Andrew Belt and may not be used in derivative works.

The **"VCV" name** is trademarked and may not be used for unofficial products. However, it is acceptable to use the phrase "for VCV Rack" for promotion of your plugin. For all other purposes, email contact@vcvrack.com.

+ 289
- 0
vst2_bin/README_vst2.txt View File

@@ -0,0 +1,289 @@
VeeSeeVST Rack VST 2.4 Plugin -- July 2nd, 2018
===============================================

!!!------------------------------------------------------------------------------
!!! ***** THIS IS NOT AN OFFICIAL VCV RACK RELEASE ***** !!!
!!! Please DO NOT contact the VCV Rack team if you need any support !!!
!!! Instead, go to https://www.kvraudio.com/forum/viewtopic.php?f=23&t=507216 !!!
---------------------------------------------------------------------------------

This is a quick'n'dirty adaption of VCV Rack 0.6.1 for the VST2 format.

+ supports multiple instances (that was quite a lot of work..)
+ supports VST MIDI input
+ supports up to 8 audio outputs
+ supports up to 8 audio inputs
+ support VST program chunks (=> patches are saved with the DAW's project file or as .fxp files)
- does not support plugin DLLs due to VCV Rack's architecture which prevents this when it is run as a plugin itself
- future releases will contain additional (open source) add-ons modules

Here's a demo video of it: https://vimeo.com/277703414

Tested in
- Eureka (my own work-in-progress VST host)
- Cockos Reaper
- Propellerhead Reason 10

The VST2 plugin includes the following add-on modules:
- AS.ADSR
- AS.AtNuVrTr
- AS.BPMCalc
- AS.BPMClock
- AS.BlankPanel4
- AS.BlankPanel6
- AS.BlankPanel8
- AS.BlankPanelSpecial
- AS.Cv2T
- AS.DelayPlusFx
- AS.DelayPlusStereoFx
- AS.Flow
- AS.KillGate
- AS.LaunchGate
- AS.Merge2.5
- AS.Mixer8ch
- AS.MonoVUmeter
- AS.Multiple2.5
- AS.PhaserFx
- AS.QuadVCA
- AS.ReverbFx
- AS.ReverbStereoFx
- AS.SEQ16
- AS.SawOsc
- AS.SignalDelay
- AS.SineOsc
- AS.Steps
- AS.SuperDriveFx
- AS.TremoloFx
- AS.TremoloStereoFx
- AS.TriLFO
- AS.TriggersMKI
- AS.TriggersMKII
- AS.VCA
- AS.WaveShaper
- AS.StereoVUmeter
- AudibleInstruments.Braids
- AudibleInstruments.Elements
- AudibleInstruments.Tides
- AudibleInstruments.Clouds
- AudibleInstruments.Warps
- AudibleInstruments.Rings
- AudibleInstruments.Links
- AudibleInstruments.Kinks
- AudibleInstruments.Shades
- AudibleInstruments.Branches
- AudibleInstruments.Blinds
- AudibleInstruments.Veils
- AudibleInstruments.Frames
- Befaco.ABC
- Befaco.DualAtenuverter
- Befaco.EvenVCO
- Befaco.Mixer
- Befaco.Rampage
- Befaco.SlewLimiter
- Befaco.SpringReverb
- Bogaudio.VCO
- Bogaudio.XCO
- Bogaudio.Additator
- Bogaudio.FMOp
- Bogaudio.LFO
- Bogaudio.EightFO
- Bogaudio.DADSRH
- Bogaudio.DADSRHPlus
- Bogaudio.DGate
- Bogaudio.Shaper
- Bogaudio.ShaperPlus
- Bogaudio.ADSR
- Bogaudio.Follow
- Bogaudio.Mix4
- Bogaudio.Mix8
- Bogaudio.VCM
- Bogaudio.Pan
- Bogaudio.XFade
- Bogaudio.VCA
- Bogaudio.VCAmp
- Bogaudio.Analyzer
- Bogaudio.VU
- Bogaudio.Detune
- Bogaudio.Stack
- Bogaudio.Reftone
- Bogaudio.Bool
- Bogaudio.CVD
- Bogaudio.FlipFlop
- Bogaudio.Manual
- Bogaudio.Mult
- Bogaudio.Noise
- Bogaudio.Offset
- Bogaudio.SampleHold
- Bogaudio.Sums
- Bogaudio.Switch
- Bogaudio.Lag
- Bogaudio.RM
- Bogaudio.Test
- Bogaudio.Test2
- Bogaudio.ThreeHP
- Bogaudio.SixHP
- Bogaudio.EightHP
- Bogaudio.TenHP
- Bogaudio.TwelveHP
- Bogaudio.ThirteenHP
- Bogaudio.FifteenHP
- Bogaudio.EighteenHP
- Bogaudio.TwentyHP
- Bogaudio.TwentyTwoHP
- Bogaudio.TwentyFiveHP
- Bogaudio.ThirtyHP
- cf.trSEQ
- cf.LEDSEQ
- cf.L3DS3Q
- cf.SLIDERSEQ
- cf.PLAYER
- cf.STEPS
- cf.METRO
- cf.EACH
- cf.FOUR
- cf.PEAK
- cf.MONO
- cf.STEREO
- cf.MASTER
- cf.SUB
- cf.CUBE
- cf.PATCH
- cf.LEDS
- cf.DAVE
- ESeries.E340
- ErraticInstruments.MPEToCV
- ErraticInstruments.QuadMPEToCV
- Fundamentals.8vert
- Fundamentals.ADSR
- Fundamentals.Delay
- Fundamentals.LFO
- Fundamentals.LFO2
- Fundamentals.Mutes
- Fundamentals.SEQ3
- Fundamentals.SequentialSwitch1
- Fundamentals.SequentialSwitch2
- Fundamentals.Scope
- Fundamentals.Unity
- Fundamentals.VCA
- Fundamentals.VCF
- Fundamentals.VCMixer
- Fundamentals.VCO
- Fundamentals.VCO2
- HetrickCV.TwoToFour
- HetrickCV.AnalogToDigital
- HetrickCV.ASR
- HetrickCV.Bitshift
- HetrickCV.BlankPanel
- HetrickCV.Boolean3
- HetrickCV.Comparator
- HetrickCV.Contrast
- HetrickCV.Crackle
- HetrickCV.Delta
- HetrickCV.DigitalToAnalog
- HetrickCV.Dust
- HetrickCV.Exponent
- HetrickCV.FlipFlop
- HetrickCV.FlipPan
- HetrickCV.GateJunction
- HetrickCV.LogicCombine
- HetrickCV.RandomGates
- HetrickCV.Rotator
- HetrickCV.Scanner
- HetrickCV.Waveshape
- Koralfx.Beatovnik
- Koralfx.Mixovnik
- Koralfx.Nullovnik4
- Koralfx.Nullovnik6
- Koralfx.Presetovnik
- Koralfx.Quantovnik
- Koralfx.Scorovnik
- LindenbergResearch.SimpleFilter
- LindenbergResearch.MS20Filter
- LindenbergResearch.AlmaFilter
- LindenbergResearch.ReShaper
- LindenbergResearch.BlankPanel
- LindenbergResearch.BlankPanelM1
- Qwelk.Automaton
- Qwelk.Byte
- Qwelk.Chaos
- Qwelk.Column
- Qwelk.Gate
- Qwelk.Or
- Qwelk.Not
- Qwelk.Xor
- Qwelk.Mix
- Qwelk.News
- Qwelk.Scaler
- Qwelk.Wrap
- Qwelk.XFade
- SonusModular.Addiction
- SonusModular.Bitter
- SonusModular.Bymidside
- SonusModular.Campione
- SonusModular.Chainsaw
- SonusModular.Ctrl
- SonusModular.Deathcrush
- SonusModular.Harmony
- SonusModular.Ladrone
- SonusModular.Luppolo
- SonusModular.Luppolo3
- SonusModular.Micromacro
- SonusModular.Multimulti
- SonusModular.Oktagon
- SonusModular.Osculum
- SonusModular.Paramath
- SonusModular.Piconoise
- SonusModular.Pusher
- SonusModular.Ringo
- SonusModular.Scramblase
- SonusModular.Twoff
- SonusModular.Yabp
- SubmarineFree.AG106
- SubmarineFree.BB120
- SubmarineFree.FF110
- SubmarineFree.FF120
- SubmarineFree.FF212
- SubmarineFree.LA108
- SubmarineFree.LD106
- SubmarineFree.NG112
- SubmarineFree.OG106
- SubmarineFree.PG112
- SubmarineFree.PO101
- SubmarineFree.PO102
- SubmarineFree.PO204
- SubmarineFree.WK101
- SubmarineFree.WK205
- SubmarineFree.XF101
- SubmarineFree.XF102
- SubmarineFree.XF104
- SubmarineFree.XF201
- SubmarineFree.XF202
- SubmarineFree.XG106
- SubmarineFree.BP101
- SubmarineFree.BP102
- SubmarineFree.BP104
- SubmarineFree.BP108
- SubmarineFree.BP110
- SubmarineFree.BP112
- SubmarineFree.BP116
- SubmarineFree.BP120
- SubmarineFree.BP124
- SubmarineFree.BP132
- Template.MyModule
- Valley.Topograph
- Valley.UGraph
- Valley.Dexter
- Valley.Plateau

Please notice that the Audible/Mutable Instruments modules appear under a different name in the UI.
For example, "Clouds" is listed as "Texture Synthesizer".

For more info about VCV rack, see https://vcvrack.com/

!!!------------------------------------------------------------------------------
!!! ***** THIS IS NOT AN OFFICIAL VCV RACK RELEASE ***** !!!
!!! Please DO NOT contact the VCV Rack team if you need any support !!!
!!! Instead, go to https://www.kvraudio.com/forum/viewtopic.php?f=23&t=507216 !!!
---------------------------------------------------------------------------------

~bsp

+ 54
- 0
vst2_bin/log.txt View File

@@ -0,0 +1,54 @@
[0.000 info src/main.cpp:58] VeeSeeVST Rack 0.6.1
[0.000 info src/main.cpp:61] Global directory: f:\git\Rack\vst2_bin\/
[0.000 info src/main.cpp:62] Local directory: f:\git\Rack\vst2_bin\/
[0.000 info src/plugin.cpp:612] vcvrack: Loaded static plugin AS 0.6.1
[0.000 info src/plugin.cpp:612] vcvrack: Loaded static plugin AudibleInstruments 0.6.1
[0.001 info src/plugin.cpp:612] vcvrack: Loaded static plugin Befaco 0.6.1
[0.001 info src/plugin.cpp:612] vcvrack: Loaded static plugin Bogaudio 0.6.1
[0.001 info src/plugin.cpp:612] vcvrack: Loaded static plugin cf 0.6.1
[0.001 info src/plugin.cpp:612] vcvrack: Loaded static plugin ErraticInstruments 0.6.1
[0.002 info src/plugin.cpp:612] vcvrack: Loaded static plugin ESeries 0.6.1
[0.002 info src/plugin.cpp:612] vcvrack: Loaded static plugin Fundamental 0.6.1
[0.002 info src/plugin.cpp:612] vcvrack: Loaded static plugin HetrickCV 0.6.1
[0.002 info src/plugin.cpp:612] vcvrack: Loaded static plugin Koralfx-Modules 0.6.1
[0.002 info src/plugin.cpp:612] vcvrack: Loaded static plugin LindenbergResearch 0.6.1
[0.002 info src/plugin.cpp:612] vcvrack: Loaded static plugin Qwelk 0.6.1
[0.002 info src/plugin.cpp:612] vcvrack: Loaded static plugin SonusModular 0.6.1
[0.003 info src/plugin.cpp:612] vcvrack: Loaded static plugin SubmarineFree 0.6.1
[0.003 info src/plugin.cpp:612] vcvrack: Loaded static plugin Template 0.6.1
[0.003 info src/plugin.cpp:612] vcvrack: Loaded static plugin Valley 0.6.1
[0.003 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/icons/noun_146097_cc.svg
[0.003 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/icons/noun_31859_cc.svg
[0.004 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/icons/noun_1343816_cc.svg
[0.004 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/icons/noun_1343811_cc.svg
[0.004 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/icons/noun_1084369_cc.svg
[0.004 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/icons/noun_1745061_cc.svg
[0.004 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/icons/noun_1240789_cc.svg
[0.004 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/icons/noun_305536_cc.svg
[0.005 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/icons/noun_468341_cc.svg
[0.182 info src/window.cpp:690] Loaded font f:\git\Rack\vst2_bin\/res/fonts/DejaVuSans.ttf
[0.284 info src/app/RackWidget.cpp:192] Loading patch from string
[0.286 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/Core/AudioInterface.svg
[0.286 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/ComponentLibrary/ScrewSilver.svg
[0.286 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/ComponentLibrary/PJ301M.svg
[0.286 info src/window.cpp:690] Loaded font f:\git\Rack\vst2_bin\/res/fonts/ShareTechMono-Regular.ttf
[0.287 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/Core/MIDIToCVInterface.svg
[0.290 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/Bogaudio/res/XCO.svg
[0.290 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/Bogaudio/res/knob_68px.svg
[0.290 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/Bogaudio/res/knob_16px.svg
[0.291 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/Bogaudio/res/button_9px_0.svg
[0.291 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/Bogaudio/res/button_9px_1.svg
[0.291 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/Bogaudio/res/knob_38px.svg
[0.291 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_0.svg
[0.291 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/Bogaudio/res/slider_switch_2_14px_1.svg
[0.292 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/Bogaudio/res/port.svg
[0.292 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/Fundamental/res/VCA.svg
[0.293 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/ComponentLibrary/RoundLargeBlackKnob.svg
[0.293 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/Fundamental/res/VCF.svg
[0.294 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\/res/ComponentLibrary/RoundHugeBlackKnob.svg
[0.295 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/AS/res/ADSR.svg
[0.295 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/AS/res/as-hexscrew.svg
[0.295 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/AS/res/as-SlidePot.svg
[0.295 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/AS/res/as-SlidePotHandle.svg
[0.296 info src/window.cpp:741] Loaded SVG f:\git\Rack\vst2_bin\plugins/AS/res/as-PJ301M.svg
[3.464 info src/app/RackWidget.cpp:154] Saving patch to string

+ 0
- 0
vst2_bin/plugins/.gitignore View File


+ 320
- 0
vst2_bin/plugins/AS/LICENSE.txt View File

@@ -0,0 +1,320 @@
### AS ###

AS Logo/Monogram Copyright (c) 2017 Alfredo Santamaria , All rights reserved.

Panel graphics in res/ are (c) 2017

Derivative works may not use the AS logo or panel graphics including custom component graphics (knobs, switches, screws, caps,etc.).

### AS Modules License ###
MIT License

Copyright (c) 2017 Alfredo Santamaria, Copyright (c) 2017 AS Custom Works

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


### FUNDAMENTAL ###

Copyright (c) 2016 Andrew Belt (Source code licensed under BSD-3-Clause by Andrew Belt)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

### Waveshaper code by HetrickCV ###

Creative Commons Legal Code

CC0 1.0 Universal

CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
HEREUNDER.

Statement of Purpose

The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator
and subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").

Certain owners wish to permanently relinquish those rights to a Work for
the purpose of contributing to a commons of creative, cultural and
scientific works ("Commons") that the public can reliably and without fear
of later claims of infringement build upon, modify, incorporate in other
works, reuse and redistribute as freely as possible in any form whatsoever
and for any purposes, including without limitation commercial purposes.
These owners may contribute to the Commons to promote the ideal of a free
culture and the further production of creative, cultural and scientific
works, or to gain reputation or greater distribution for their Work in
part through the use and efforts of others.

For these and/or other purposes and motivations, and without any
expectation of additional consideration or compensation, the person
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
is an owner of Copyright and Related Rights in the Work, voluntarily
elects to apply CC0 to the Work and publicly distribute the Work under its
terms, with knowledge of his or her Copyright and Related Rights in the
Work and the meaning and intended legal effect of CC0 on those rights.

1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not
limited to, the following:

i. the right to reproduce, adapt, distribute, perform, display,
communicate, and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or
likeness depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work,
subject to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data
in a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the
European Parliament and of the Council of 11 March 1996 on the legal
protection of databases, and under any national implementation
thereof, including any amended or successor version of such
directive); and
vii. other similar, equivalent or corresponding rights throughout the
world based on applicable law or treaty, and any national
implementations thereof.

2. Waiver. To the greatest extent permitted by, but not in contravention
of, applicable law, Affirmer hereby overtly, fully, permanently,
irrevocably and unconditionally waives, abandons, and surrenders all of
Affirmer's Copyright and Related Rights and associated claims and causes
of action, whether now known or unknown (including existing as well as
future claims and causes of action), in the Work (i) in all territories
worldwide, (ii) for the maximum duration provided by applicable law or
treaty (including future time extensions), (iii) in any current or future
medium and for any number of copies, and (iv) for any purpose whatsoever,
including without limitation commercial, advertising or promotional
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
member of the public at large and to the detriment of Affirmer's heirs and
successors, fully intending that such Waiver shall not be subject to
revocation, rescission, cancellation, termination, or any other legal or
equitable action to disrupt the quiet enjoyment of the Work by the public
as contemplated by Affirmer's express Statement of Purpose.

3. Public License Fallback. Should any part of the Waiver for any reason
be judged legally invalid or ineffective under applicable law, then the
Waiver shall be preserved to the maximum extent permitted taking into
account Affirmer's express Statement of Purpose. In addition, to the
extent the Waiver is so judged Affirmer hereby grants to each affected
person a royalty-free, non transferable, non sublicensable, non exclusive,
irrevocable and unconditional license to exercise Affirmer's Copyright and
Related Rights in the Work (i) in all territories worldwide, (ii) for the
maximum duration provided by applicable law or treaty (including future
time extensions), (iii) in any current or future medium and for any number
of copies, and (iv) for any purpose whatsoever, including without
limitation commercial, advertising or promotional purposes (the
"License"). The License shall be deemed effective as of the date CC0 was
applied by Affirmer to the Work. Should any part of the License for any
reason be judged legally invalid or ineffective under applicable law, such
partial invalidity or ineffectiveness shall not invalidate the remainder
of the License, and in such case Affirmer hereby affirms that he or she
will not (i) exercise any of his or her remaining Copyright and Related
Rights in the Work or (ii) assert any associated claims and causes of
action with respect to the Work, in either case contrary to Affirmer's
express Statement of Purpose.

4. Limitations and Disclaimers.

a. No trademark or patent rights held by Affirmer are waived, abandoned,
surrendered, licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or
warranties of any kind concerning the Work, express, implied,
statutory or otherwise, including without limitation warranties of
title, merchantability, fitness for a particular purpose, non
infringement, or the absence of latent or other defects, accuracy, or
the present or absence of errors, whether or not discoverable, all to
the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons
that may apply to the Work or any use thereof, including without
limitation any person's Copyright and Related Rights in the Work.
Further, Affirmer disclaims responsibility for obtaining any necessary
consents, permissions or other rights required for any use of the
Work.
d. Affirmer understands and acknowledges that Creative Commons is not a
party to this document and has no duty or obligation with respect to
this CC0 or use of the Work.


### Portions of code from Mental ###

Copyright (c) 2017 Strum strum@softhome.net , All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

### seq-16, 8ch mixer and phaser portions of code from Autodafe ###

Copyright (c) 2016 Antonio Grazioli (AUtodafe) is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

### Portions of code from martin-lueders/ML_modules ###

BSD 3-Clause License

Copyright (c) 2017, Martin Lueders
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

### Freeverb - Free, studio-quality reverb SOURCE CODE in the public domain ###
-----------------------------------------------------------------------

Written by Jezar at Dreampoint - http://www.dreampoint.co.uk


Introduction
------------

Hello.

I'll try to keep this "readme" reasonably small. There are few things in the world that I hate more than long "readme" files. Except "coding conventions" - but more on that later...

In this zip file you will find two folders of C++ source code:

"Components" - Contains files that should clean-compile ON ANY TYPE OF COMPUTER OR SYSTEM WHATSOEVER. It should not be necessary to make ANY changes to these files to get them to compile, except to make up for inadequacies of certain compilers. These files create three classes - a comb filter, an allpass filter, and a reverb model made up of a number of instances of the filters, with some features to control the filters at a macro level. You will need to link these classes into another program that interfaces with them. The files in the components drawer are completely independant, and can be built without dependancies on anything else. Because of the simple interface, it should be possible to interface these files to any system - VST, DirectX, anything - without changing them AT ALL.

"FreeverbVST" - Contains a Steinberg VST implementation of this version of Freeverb, using the components in (surprise) the components folder. It was built on a PC but may compile properly for the Macintosh with no problems. I don't know - I don't have a Macintosh. If you've figured out how to compile the examples in the Steinberg VST Development Kit, then you should easilly figure out how to bring the files into a project and get it working in a few minutes. It should be very simple.

Note that this version of Freeverb doesn't contain predelay, or any EQ. I thought that might make it difficult to understand the "reverb" part of the code. Once you figure out how Freeverb works, you should find it trivial to add such features with little CPU overhead.

Also, the code in this version of Freeverb has been optimised. This has changed the sound *slightly*, but not significantly compared to how much processing power it saves.

Finally, note that there is also a built copy of this version of Freeverb called "Freeverb3.dll" - this is a VST plugin for the PC. If you want a version for the Mac or anything else, then you'll need to build it yourself from the code.


Technical Explanation
---------------------

Freeverb is a simple implementation of the standard Schroeder/Moorer reverb model. I guess the only reason why it sounds better than other reverbs, is simply because I spent a long while doing listening tests in order to create the values found in "tuning.h". It uses 8 comb filters on both the left and right channels), and you might possibly be able to get away with less if CPU power is a serious constraint for you. It then feeds the result of the reverb through 4 allpass filters on both the left and right channels. These "smooth" the sound. Adding more than four allpasses doesn't seem to add anything significant to the sound, and if you use less, the sound gets a bit "grainy". The filters on the right channel are slightly detuned compared to the left channel in order to create a stereo effect.

Hopefully, you should find the code in the components drawer a model of brevity and clarity. Notice that I don't use any "coding conventions". Personally, I think that coding conventions suck. They are meant to make the code "clearer", but they inevitably do the complete opposite, making the code completely unfathomable. Anyone whose done Windows programming with its - frankly stupid - "Hungarian notation" will know exactly what I mean. Coding conventions typically promote issues that are irrelevant up to the status of appearing supremely important. It may have helped back people in the days when compilers where somewhat feeble in their type-safety, but not in the new millenium with advanced C++ compilers.

Imagine if we rewrote the English language to conform to coding conventions. After all, The arguments should be just as valid for the English language as they are for a computer language. For example, we could put a lower-case "n" in front of every noun, a lower-case "p" in front of a persons name, a lower-case "v" in front of every verb, and a lower-case "a" in front of every adjective. Can you imagine what the English language would look like? All in the name of "clarity". It's just as stupid to do this for computer code as it would be to do it for the English language. I hope that the code for Freeverb in the components drawer demonstrates this, and helps start a movement back towards sanity in coding practices.


Background
----------

Why is the Freeverb code now public domain? Simple. I only intended to create Freeverb to provide me and my friends with studio-quality reverb for free. I never intended to make any money out of it. However, I simply do not have the time to develop it any further. I'm working on a "concept album" at the moment, and I'll never finish it if I spend any more time programming.

In any case, I make more far money as a contract programmer - making Mobile Internet products - than I ever could writing plugins, so it simply doesn't make financial sense for me to spend any more time on it.

Rather than give Freeverb to any particular individual or organisation to profit from it, I've decided to give it away to the internet community at large, so that quality, FREE (or at the very least, low-cost) reverbs can be developed for all platforms.

Feel free to use the source code for Freeverb in any of your own products, whether they are also available for free, or even if they are commercial - I really don't mind. You may do with the code whatever you wish. If you use it in a product (whether commercial or not), it would be very nice of you, if you were to send me a copy of your product - although I appreciate that this isn't always possible in all circumstances.

HOWEVER, please don't bug me with questions about how to use this code. I gave away Freeverb because I don't have time to maintain it. That means I *certainly* don't have time to answer questions about the source code, so please don't email questions to me. I *will* ignore them. If you can't figure the code for Freeverb out - then find somebody who can. I hope that either way, you enjoy experimenting with it.


Disclaimer
----------

This software and source code is given away for free, without any warranties of any kind. It has been given away to the internet community as a free gift, so please treat it in the same spirit.


I hope this code is useful and interesting to you all!
I hope you have lots of fun experimenting with it and make good products!

Very best regards,
Jezar.
Technology Consultant
Dreampoint Design and Engineering
http://www.dreampoint.co.uk


//ends



### BPM detect portions of code by Tomasz Sosnowski - KoralFX

Copyright (c) 2018, Tomasz Sosnowski - KoralFX
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ 251
- 0
vst2_bin/plugins/AS/README.md View File

@@ -0,0 +1,251 @@

# AS modules for VCV Rack

AS is a collection of modules for [VCV Rack](https://vcvrack.com/) by Alfredo Santamaria, Need a custom work?, you can find me at [Hakken.com.mx](http://www.hakken.com.mx/).

AS Logo/Monogram Copyright (c) 2017 Alfredo Santamaria , All rights reserved.
Panel graphics in res/ are © 2017
Derivative works may not use the AS logo or panel graphics including custom component graphics (knobs, switches, screws, caps,etc.).

### Releases

AS is compatible with VCV Rack 0.6.X. releases, (see previous releases for 0.5.X. binaries and source files). You can download Mac, Win and Linux binary files and source on the [Release Page](https://github.com/AScustomWorks/as/releases)

If you enjoy those modules you can support the development by making a donation, it will be appreciated!. Here's the link: [DONATE](https://www.paypal.me/frederius/)


![AS](https://github.com/AScustomWorks/AS/blob/master/AS.JPG)

# AS modules

### ADSR
Fundamental ADSR module. Mods: graphics, sliders instead of knobs to provide faster visual input.

### VCA
Fundamental VCA module. Mods: graphics, sliders instead of knobs to provide faster visual input, one input + lin/exp switch instead of two separate inputs.

V 0.5.3: Code fix, now the VCA module works ok when there's no envelope input present.

### QuadVCA/Mixer
AS VCA module x 4, plus mixer functionality (user request).

V 0.5.5: First relase of this module.

### BPM Clock
Strum's Mental VCV Master Clock. Mods: graphics, reset trigger input and output.

V 0.5.2: all the trigger signals are 10v now, it seems that some other modules don't work fine with the correct voltages.

V 0.5.4: Fixed a reset signal issue.

V 0.5.5: 16th clock output now sends unipolar signal, just as the other outputs.

V 0.6.1: Now BPM Clock outputs a short length trigger signal, as most of the available clocks.

V 0.6.2: Small fix on the reset signal length.

V 0.6.5: Added a Regular/Extended switch to change the clock from 40-250 to 30-300 range. Had to add the switch instead of simply changing the default settings to avoid changing the bpm tempo on the patches already using the clock.

V 0.6.6: Added a CV input for the "RUN" switch.

V 0.6.7: Added a CV output for the "RUN" switch, sends a trigger signal on each press of the switch.

### BPM to delay/hz calculator
A BPM to delay/hz calculator to setup easier those nice delay effects.

V 0.6.4: First relase of this module.

V 0.6.5: Added an external input to detect a BPM from a LFO or some other sources, BPM detection code based on Koralfx Beatovnik from Tomek Sosnowski, nice work Tomek!.

### 8 Channel Mixer
Fundamental/Autodafe mixer module. Mods: graphics, sliders for channel volume, stereo or mono output(L channel outputs L+R signal if R channel is not active). Now with main mix mute button. Beware,the default setting for each channel volume is at 70% in stead of 0%.

V 0.5.2: added MIX L & R input to chain mixers without giving up 2 mixer channels.

### Multi 2x5
2x5 Signal multiplier.

V 0.5.7 Module size reduced to 5HP

### Merge 2x5
2x5 CV Signal merger.

V 0.5.7: First relase of this module.

### Mono VU Meter
V 0.5.4, New module added, Mono VU Meter made to match the 8CH Mixer.

### Stereo VU Meter
V 0.5.3, New module added, Stereo VU Meter made to match the 8CH Mixer.

### 16-step Sequencer
Fundamental/Autodafe SEQ module. Mods: graphics, digital display to show the number of steps selected.

V 0.5.2: added digital display to show current sequence step so you can run/stop the sequence and tune in the current step.

V 0.5.3: added edit mode: manual trigger with current step selector buttons and blinking led light to highlight the current step. Send a row output to a NYSTHI Hot Tuna and enjoy precise step tuning!

V 0.5.4: Exposed the trigger mode settings into the panel (contextual menu is still there but it won't change the mode)

### TinySawish
RODENTMODULES MuO. Mods: graphics, smaller panel size.

V 0.5.4 Added dc blocker code, modified a bit the internal parameters.

V 0.5.5 Extendend the freq range 1 octave below.

V 0.5.7 Module size reduced to 4HP

### TinySine
VCV tutorial module. Mods: graphics, proper sine wave.

V 0.5.7 Module size reduced to 4HP

### TriLFO
Fundamental LFO module. Mods:graphics, controls stripped to the basics but you get 3 LFOS on the same space.

### AtNuVrTr Dual attenuverter module
Just like Befaco Attenuverter module but with added cv inputs to modulate both Attenueverter and Offset parameters.

V 0.6.1: First relase of this module.

### Triggers REMOVED
A couple of manual trigger buttons, one ON/OFF, one temporary, both with 4 trigger outputs, trigger volts knob going from 1 to 10 v output.

(NOTICE: Triggers MKI will supersede Triggers, so Triggers will be removed from the plugin by v0.6 but you have time now to replace it on your current patches and keep everything working fine).

### Triggers MKI
A manual CV signal trigger module with latch and temporary triggers, volts knob lets you adjust the range from -10v to 10v output.

V 0.5.7: First relase of this module.
V 0.6.1: Changed the volts range to -10v +10v and now the display shows positive values in green, and negative values in red.

### Triggers MKII
A manual CV signal temporary trigger module with labeling integrated, so you remember where the signal is going.

The labels list includes:
"------", "MUTE"," SOLO"," RESET"," DRUMS"," KICK"," SNARE"," HIHAT"," CLAP"," PERC","BASS 1","BASS 2"," GTR 1",
" GTR 2","LEAD 1","LEAD 2"," PAD 1"," PAD 2","CHORDS"," FX 1"," FX 2"," SEQ 1"," SEQ 2"," MIX 1"," MIX 2",
" AUX 1"," AUX 2"," ON"," OFF"," START"," STOP"," PAUSE"," UP"," DOWN"," LEFT"," RIGHT", "RUN"

V 0.5.7: First relase of this module.

V 0.6.5: Added "RUN" label at the end of the list.

### Steps
Strum's Mental VCV Counters module. Mods: graphics, 3 counters, up to 64 steps each, added reset lights to the buttons.

V 0.5.4: First relase of this module.

V 0.5.5: code tweaks.

### Launch Gate
Delay the start of a flow of signals by a set number of clock ticks (TAOS request).

V 0.5.5: First relase of this module.

V 0.6.5: Now it features soft mute, so you can use it both for audio and cv signals without any switching noise.

### Kill Gate
Cut the flow of signals after a set number of clock ticks (TAOS request).

V 0.5.6: First relase of this module.

V 0.6.5: Now it features soft mute, so you can use it both for audio and cv signals without any switching noise.

### Flow
Cut the flow of signals with a switch or a cv signal (TAOS request).

V 0.6.0: First relase of this module.

V 0.6.5: Now it features soft mute, so you can use it both for audio and cv signals without any switching noise.

### Signal Delay
Delay the incomming CV signal by set milliseconds, with signal thru and delayed output. You can chain several Signal Delay modules together for unlimited length of delays. (TAOS request).

V 0.5.5: First relase of this module.

### CV 2 T
CV to Trigger module. Feed a midi signal to the CV inputs and it will output one trigger signal when the incoming signal rises above 0v, and another trigger signal when the incoming signal returns to 0v. Useful to use your external hardware controller/keyboard as a trigger.

V 0.6.7: First relase of this module.

### Delay Plus
Fundamental Delay module. Mods: graphics, digital display to show delay time in MS , wet signal send & return, bypass switch.

V 0.5.4: Updated look.

V 0.5.5 CHanged the time knob reading from exponential to linear, now you can set any value precisely at the whole 1 to 10k ms range.

V 0.6.3: bypass CV input added.

V 0.6.5: Now it features soft bypass to avoid switching noise.

### Delay Plus Stereo
Stereo version of the Delay Plus module, with link switches for Feedback and Color parameters. If the respective switch is active, the left knob controls the changes for both left and right channels.

V 0.6.7: First relase of this module.

### Phaser
Autodafe's Phaser Fx module. Mods: graphics, bypass switch.

V 0.5.4: Added CV inputs for each parameter, updated look.

V 0.6.3: bypass CV input added.

V 0.6.5: Now it features soft bypass to avoid switching noise.

### SuperDrive
Overdrive/clipping Fx module with DRIVE, TONE and GAIN parameters, to get those acid bass lines we all love!.

V 0.5.4: First relase of this module.

V 0.6.3: bypass CV input added.

V 0.6.5: Now it features soft bypass to avoid switching noise(Results may change according to signal levels).

### Reverb
Reverb Fx module based on ML_modules reverb and Freeverb code, with DECAY, DAMP and BLEND parameters, a little bit tamed Reverb with mixed output signal.

0.5.4: First relase of this module.

V 0.6.3: bypass CV input added.

V 0.6.5: Now it features soft bypass to avoid switching noise.

### Reverb Stereo
Stereo version of the Reverb module, BLEND is replaced with a DRY /WET knob, to work better when used with a mixer send/return ports.

V 0.6.7: First relase of this module.

### Tremolo
Tremolo Fx module with SHAPE, SPEED and BLEND parameters, and a phase switch (set your effect, duplicate the module and invert the phase for stereo tremolo setup)your Tremolo to go!.

0.5.6: First relase of this module.

V 0.6.3: bypass CV input added.

V 0.6.5: Now it features soft bypass to avoid switching noise.

### Tremolo Stereo
Stereo version of the Tremolo module, use the phase switch to change from synced L and R channels to inverted phase, to get stereo panning effect.

V 0.6.7: First relase of this module.

### WaveShaper
HetrickCV Wave Shaper module. Mods: graphics, bypass switch.

V 0.5.2: added back the voltage range switch.

V 0.5.4: Updated look.

V 0.6.3: bypass CV input added.

V 0.6.5: Now it features soft bypass to avoid switching noise.

### Blank Panel
Blank panels in 4, 6 & 8 HP.

New special "blank" panel 8 HP added for v0.6.0.

### Have fun!

+ 626
- 0
vst2_bin/plugins/AS/res/8chMixer.svg
File diff suppressed because it is too large
View File


+ 452
- 0
vst2_bin/plugins/AS/res/ADSR.svg View File

@@ -0,0 +1,452 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="120"
height="380"
viewBox="0 0 31.75 100.54166"
version="1.1"
id="svg8033"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="ADSR.svg">
<defs
id="defs8027" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.9710526"
inkscape:cx="92.311767"
inkscape:cy="136.14704"
inkscape:document-units="mm"
inkscape:current-layer="layer2"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1243"
inkscape:window-height="1384"
inkscape:window-x="116"
inkscape:window-y="5"
inkscape:window-maximized="0"
units="px"
showguides="true"
inkscape:guide-bbox="true" />
<metadata
id="metadata8030">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="background"
transform="translate(0,-8.0744425e-6)">
<rect
style="opacity:1;vector-effect:none;fill:#44423e;fill-opacity:1;stroke:none;stroke-width:0.25762081;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1709"
width="31.75"
height="100.54166"
x="3.6811375e-06"
y="8.0744421e-06" />
<g
transform="matrix(2.0981223,0,0,2.0981223,-109.95818,-706.23)"
data-name="Layer 2"
id="g1661"
style="fill:#3c3835;fill-opacity:1">
<g
data-name="Layer 1-2"
id="g1659"
style="fill:#3c3835;fill-opacity:1">
<path
style="fill:#3c3835;fill-opacity:1"
inkscape:connector-curvature="0"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
class="cls-4"
id="path1657" />
</g>
</g>
<rect
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.25762081;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1759"
width="31.75"
height="3.96875"
x="3.6811375e-06"
y="96.572922" />
<rect
y="8.0744421e-06"
x="3.6811375e-06"
height="3.96875"
width="31.75"
id="rect1806"
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.25762081;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<g
transform="matrix(0.26458333,0,0,0.26458333,3.6811375e-6,8.0744425e-6)"
id="g1810">
<path
style="fill:#202020;fill-opacity:1"
d="m 18.51,2.7999981 h 8.37 a 5,5 0 0 1 5.26,4.72 v 0 A 5,5 0 0 1 26.88,12.239998 H 18.51 A 5,5 0 0 1 13.25,7.5199981 v 0 a 5,5 0 0 1 5.26,-4.72 z"
class="cls-3"
id="rect861"
inkscape:connector-curvature="0" />
<path
style="fill:#202020;fill-opacity:1"
d="m 18.51,368.28 h 8.37 a 5,5 0 0 1 5.26,4.72 v 0 a 5,5 0 0 1 -5.26,4.72 H 18.51 A 5,5 0 0 1 13.24,373 v 0 a 5,5 0 0 1 5.27,-4.72 z"
class="cls-3"
id="rect863"
inkscape:connector-curvature="0" />
</g>
<g
transform="matrix(0.26458333,0,0,0.26458333,3.6811375e-6,8.0744425e-6)"
id="g1814">
<path
style="fill:#202020;fill-opacity:1"
d="m 93.31,2.7999981 h 8.37 a 5,5 0 0 1 5.26,4.72 v 0 a 5,5 0 0 1 -5.26,4.7199999 H 93.31 A 5,5 0 0 1 88.05,7.5199981 v 0 a 5,5 0 0 1 5.26,-4.72 z"
class="cls-3"
id="rect1497"
inkscape:connector-curvature="0" />
<path
style="fill:#202020;fill-opacity:1"
d="m 93.31,368.28 h 8.37 a 5,5 0 0 1 5.26,4.72 v 0 a 5,5 0 0 1 -5.26,4.72 H 93.31 A 5,5 0 0 1 88.05,373 v 0 a 5,5 0 0 1 5.26,-4.72 z"
class="cls-3"
id="rect1499"
inkscape:connector-curvature="0" />
</g>
<circle
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.19682446;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path1686"
cx="15.875004"
cy="95.218742"
r="4" />
<g
style="fill:#fff7d4;fill-opacity:1"
id="Layer_2-2"
data-name="Layer 2"
transform="matrix(0.17622025,0,0,0.17622025,5.3063379,31.483553)">
<g
style="fill:#fff7d4;fill-opacity:1"
id="Layer_1-2-6"
data-name="Layer 1-2">
<path
id="path8-4-6"
class="cls-4"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" />
</g>
</g>
</g>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-84.642804,-25.235125)">
<g
id="g1684"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(0,-2.2168714)">
<path
inkscape:connector-curvature="0"
id="path9367"
d="m 88.394439,108.58996 c 0.185455,0 0.336405,-0.0647 0.444225,-0.13801 0.05175,-0.0302 0.07763,-0.0776 0.07763,-0.13801 v -0.3364 c 0,-0.0604 -0.04744,-0.11214 -0.112133,-0.11214 H 88.45482 c -0.05175,0 -0.0992,0.0431 -0.0992,0.0992 0,0.0518 0.04744,0.0949 0.0992,0.0949 h 0.250145 v 0.2329 c -0.07763,0.0604 -0.185452,0.0949 -0.306213,0.0949 -0.25446,0 -0.426974,-0.18977 -0.426974,-0.44854 0,-0.24152 0.176826,-0.44423 0.409723,-0.44423 0.133699,0 0.224269,0.0388 0.3019,0.0992 0.02156,0.0129 0.04313,0.0259 0.06901,0.0259 0.06038,0 0.112136,-0.0517 0.112136,-0.11213 0,-0.0431 -0.02588,-0.0733 -0.04744,-0.0906 -0.112136,-0.0819 -0.241522,-0.12508 -0.426974,-0.12508 -0.379534,0 -0.64693,0.29759 -0.64693,0.64693 v 0.004 c 0,0.3666 0.254458,0.64693 0.651243,0.64693 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
<path
inkscape:connector-curvature="0"
id="path9363"
d="m 89.154246,108.47352 c 0,0.0604 0.04744,0.1035 0.10351,0.1035 0.04744,0 0.08626,-0.0259 0.103508,-0.069 l 0.103507,-0.24152 H 90.0772 l 0.10351,0.2329 c 0.01725,0.0474 0.05175,0.0776 0.10782,0.0776 0.05607,0 0.103511,-0.0474 0.103511,-0.10351 0,-0.0173 -0.0043,-0.0345 -0.01294,-0.0474 l -0.465791,-1.04371 c -0.02588,-0.0518 -0.06901,-0.0863 -0.1337,-0.0863 h -0.0086 c -0.06469,0 -0.107823,0.0345 -0.133699,0.0863 l -0.465791,1.04371 c -0.0086,0.0173 -0.01725,0.0345 -0.01725,0.0474 z m 0.396785,-0.40541 0.219956,-0.50461 0.219956,0.50461 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
<path
inkscape:connector-curvature="0"
id="path9359"
d="m 90.833858,108.4692 c 0,0.0604 0.05175,0.10782 0.112133,0.10782 0.06038,0 0.112136,-0.0474 0.112136,-0.10782 v -0.95314 h 0.306213 c 0.05607,0 0.0992,-0.0474 0.0992,-0.0992 0,-0.0561 -0.04313,-0.10351 -0.0992,-0.10351 h -0.836698 c -0.05607,0 -0.09919,0.0474 -0.09919,0.10351 0,0.0517 0.04313,0.0992 0.09919,0.0992 h 0.306216 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
<path
inkscape:connector-curvature="0"
id="path9355"
d="m 91.840407,108.5684 h 0.741815 c 0.05175,0 0.09919,-0.0431 0.09919,-0.0992 0,-0.0517 -0.04744,-0.0992 -0.09919,-0.0992 H 91.95254 v -0.33641 h 0.53911 c 0.05175,0 0.0992,-0.0431 0.0992,-0.0949 0,-0.0561 -0.04744,-0.1035 -0.0992,-0.1035 h -0.53911 v -0.32347 h 0.621054 c 0.05175,0 0.09489,-0.0431 0.09489,-0.0992 0,-0.0561 -0.04313,-0.0992 -0.09489,-0.0992 h -0.733187 c -0.06038,0 -0.112136,0.0474 -0.112136,0.11213 v 1.03078 c 0,0.0647 0.05175,0.11213 0.112136,0.11213 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
</g>
<g
id="g1692"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(0,-2.2168714)">
<path
inkscape:connector-curvature="0"
id="path9335"
d="m 97.094056,108.4692 c 0,0.0604 0.05175,0.10782 0.112136,0.10782 0.06038,0 0.112133,-0.0474 0.112133,-0.10782 v -0.34071 h 0.276024 l 0.306215,0.39247 c 0.02588,0.0345 0.05607,0.0561 0.107821,0.0561 0.05175,0 0.10351,-0.0388 0.10351,-0.10351 0,-0.0345 -0.01294,-0.0561 -0.0345,-0.0819 l -0.24152,-0.3019 c 0.168201,-0.0561 0.284649,-0.17683 0.284649,-0.37522 v -0.004 c 0,-0.11214 -0.0345,-0.20271 -0.10351,-0.27171 -0.07763,-0.0776 -0.202703,-0.12508 -0.362281,-0.12508 h -0.448537 c -0.06038,0 -0.112136,0.0474 -0.112136,0.11214 z m 0.224269,-0.53479 v -0.42267 h 0.319153 c 0.163889,0 0.258773,0.0733 0.258773,0.21134 0,0.12938 -0.0992,0.21133 -0.258773,0.21133 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
<path
inkscape:connector-curvature="0"
id="path9331"
d="m 98.5667,108.5684 h 0.741815 c 0.05175,0 0.09919,-0.0431 0.09919,-0.0992 0,-0.0517 -0.04744,-0.0992 -0.09919,-0.0992 h -0.629682 v -0.33641 h 0.53911 c 0.05175,0 0.0992,-0.0431 0.0992,-0.0949 0,-0.0561 -0.04744,-0.1035 -0.0992,-0.1035 h -0.53911 v -0.32347 h 0.621054 c 0.05175,0 0.09488,-0.0431 0.09488,-0.0992 0,-0.0561 -0.04313,-0.0992 -0.09488,-0.0992 H 98.5667 c -0.06038,0 -0.112135,0.0474 -0.112135,0.11213 v 1.03078 c 0,0.0647 0.05175,0.11213 0.112135,0.11213 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
<path
inkscape:connector-curvature="0"
id="path9327"
d="m 100.03716,108.4692 c 0,0.0604 0.0517,0.10782 0.11213,0.10782 0.0604,0 0.11213,-0.0474 0.11213,-0.10782 v -0.95314 h 0.30622 c 0.0561,0 0.0992,-0.0474 0.0992,-0.0992 0,-0.0561 -0.0431,-0.10351 -0.0992,-0.10351 h -0.836699 c -0.05607,0 -0.09919,0.0474 -0.09919,0.10351 0,0.0517 0.04313,0.0992 0.09919,0.0992 h 0.306219 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
<path
inkscape:connector-curvature="0"
id="path9323"
d="m 100.9314,108.4692 c 0,0.0604 0.0517,0.10782 0.11214,0.10782 0.0604,0 0.11213,-0.0474 0.11213,-0.10782 v -0.34071 h 0.27602 l 0.30622,0.39247 c 0.0259,0.0345 0.0561,0.0561 0.10782,0.0561 0.0517,0 0.10351,-0.0388 0.10351,-0.10351 0,-0.0345 -0.0129,-0.0561 -0.0345,-0.0819 l -0.24152,-0.3019 c 0.1682,-0.0561 0.28465,-0.17683 0.28465,-0.37522 v -0.004 c 0,-0.11214 -0.0345,-0.20271 -0.10351,-0.27171 -0.0776,-0.0776 -0.2027,-0.12508 -0.36228,-0.12508 h -0.44854 c -0.0604,0 -0.11213,0.0474 -0.11213,0.11214 z m 0.22427,-0.53479 v -0.42267 h 0.31915 c 0.16389,0 0.25878,0.0733 0.25878,0.21134 0,0.12938 -0.0992,0.21133 -0.25878,0.21133 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
<path
inkscape:connector-curvature="0"
id="path9319"
d="m 102.29892,108.4692 c 0,0.0604 0.0517,0.10782 0.11213,0.10782 0.0604,0 0.11214,-0.0474 0.11214,-0.10782 v -1.05665 c 0,-0.0604 -0.0518,-0.10782 -0.11214,-0.10782 -0.0604,0 -0.11213,0.0474 -0.11213,0.10782 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
<path
inkscape:connector-curvature="0"
id="path9315"
d="m 103.50159,108.58996 c 0.18545,0 0.3364,-0.0647 0.44422,-0.13801 0.0517,-0.0302 0.0776,-0.0776 0.0776,-0.13801 v -0.3364 c 0,-0.0604 -0.0474,-0.11214 -0.11213,-0.11214 h -0.34934 c -0.0518,0 -0.0992,0.0431 -0.0992,0.0992 0,0.0518 0.0474,0.0949 0.0992,0.0949 h 0.25014 v 0.2329 c -0.0776,0.0604 -0.18545,0.0949 -0.30621,0.0949 -0.25446,0 -0.42698,-0.18977 -0.42698,-0.44854 0,-0.24152 0.17683,-0.44423 0.40973,-0.44423 0.1337,0 0.22427,0.0388 0.3019,0.0992 0.0216,0.0129 0.0431,0.0259 0.069,0.0259 0.0604,0 0.11213,-0.0517 0.11213,-0.11213 0,-0.0431 -0.0259,-0.0733 -0.0474,-0.0906 -0.11213,-0.0819 -0.24152,-0.12508 -0.42697,-0.12508 -0.37953,0 -0.64693,0.29759 -0.64693,0.64693 v 0.004 c 0,0.3666 0.25446,0.64693 0.65124,0.64693 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
</g>
<g
id="g1626"
transform="translate(0,-8.1434476)">
<g
transform="translate(-15.483406,12.082115)"
id="g1710">
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 103.55021,37.705675 c 0,0.07332 0.0517,0.129387 0.12507,0.129387 0.0561,0 0.10351,-0.0345 0.12507,-0.08626 l 0.12939,-0.301901 h 0.75044 l 0.12507,0.293275 c 0.0259,0.05607 0.069,0.09488 0.1337,0.09488 0.0733,0 0.12939,-0.06038 0.12939,-0.133699 0,-0.01725 -0.004,-0.0345 -0.0173,-0.05607 l -0.57361,-1.280923 c -0.0302,-0.06901 -0.082,-0.112134 -0.15958,-0.112134 h -0.0129 c -0.0776,0 -0.1337,0.04313 -0.16389,0.112134 l -0.57361,1.280923 c -0.0129,0.02156 -0.0172,0.04313 -0.0172,0.06038 z m 0.48304,-0.49598 0.27171,-0.625366 0.27171,0.625366 z m 0,0"
id="path8947"
inkscape:connector-curvature="0" />
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 105.59003,37.69705 c 0,0.07763 0.0604,0.138012 0.13801,0.138012 0.0733,0 0.13801,-0.06038 0.13801,-0.138012 v -1.168788 h 0.37522 c 0.069,0 0.12507,-0.05607 0.12507,-0.125074 0,-0.06901 -0.0561,-0.125073 -0.12507,-0.125073 h -1.02646 c -0.069,0 -0.12508,0.05607 -0.12508,0.125073 0,0.06901 0.0561,0.125074 0.12508,0.125074 h 0.37522 z m 0,0"
id="path8943"
inkscape:connector-curvature="0" />
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 107.11235,37.69705 c 0,0.07763 0.0604,0.138012 0.13801,0.138012 0.0733,0 0.13802,-0.06038 0.13802,-0.138012 v -1.168788 h 0.37522 c 0.069,0 0.12507,-0.05607 0.12507,-0.125074 0,-0.06901 -0.0561,-0.125073 -0.12507,-0.125073 h -1.02647 c -0.069,0 -0.12507,0.05607 -0.12507,0.125073 0,0.06901 0.0561,0.125074 0.12507,0.125074 h 0.37522 z m 0,0"
id="path8939"
inkscape:connector-curvature="0" />
</g>
<g
transform="translate(-8.553806,-5.7047685)"
id="g1715">
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 103.46161,55.466665 c 0,0.07763 0.0604,0.138012 0.13801,0.138012 h 0.43991 c 0.48304,0 0.81945,-0.336404 0.81945,-0.772004 v -0.0043 c 0,-0.4356 -0.33641,-0.767692 -0.81945,-0.767692 h -0.43991 c -0.0776,0 -0.13801,0.05607 -0.13801,0.1337 z m 0.27171,-0.107823 v -1.05234 h 0.30621 c 0.32347,0 0.5348,0.224271 0.5348,0.526171 v 0.0043 c 0,0.3019 -0.21133,0.521856 -0.5348,0.521856 z m 0,0"
id="path8935"
inkscape:connector-curvature="0" />
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 105.37433,55.604677 h 0.91002 c 0.0647,0 0.12076,-0.05175 0.12076,-0.120761 0,-0.06901 -0.0561,-0.120758 -0.12076,-0.120758 h -0.77632 v -0.418349 h 0.66418 c 0.069,0 0.12077,-0.05175 0.12077,-0.116448 0,-0.06901 -0.0518,-0.125074 -0.12077,-0.125074 h -0.66418 v -0.401098 h 0.76338 c 0.069,0 0.12076,-0.05175 0.12076,-0.120758 0,-0.06901 -0.0517,-0.120762 -0.12076,-0.120762 h -0.89708 c -0.0776,0 -0.13801,0.05607 -0.13801,0.1337 v 1.272296 c 0,0.07763 0.0604,0.138012 0.13801,0.138012 z m 0,0"
id="path8931"
inkscape:connector-curvature="0" />
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 107.44279,55.630554 c 0.25015,0 0.41835,-0.07763 0.56499,-0.207018 0.0216,-0.02156 0.0431,-0.05607 0.0431,-0.09919 0,-0.06469 -0.0604,-0.125074 -0.12939,-0.125074 -0.0345,0 -0.0604,0.01294 -0.0819,0.03019 -0.11213,0.09488 -0.22427,0.15095 -0.38384,0.15095 -0.29759,0 -0.51324,-0.245834 -0.51324,-0.547735 v -0.0043 c 0,-0.301901 0.21565,-0.547735 0.51324,-0.547735 0.14663,0 0.25877,0.05607 0.36659,0.142324 0.0173,0.01294 0.0431,0.02588 0.0819,0.02588 0.0733,0 0.1337,-0.06038 0.1337,-0.133696 0,-0.04744 -0.0216,-0.08626 -0.0517,-0.107823 -0.1337,-0.103508 -0.29327,-0.176829 -0.53048,-0.176829 -0.4701,0 -0.79788,0.362283 -0.79788,0.802195 v 0.0043 c 0,0.444225 0.3364,0.793568 0.78494,0.793568 z m 0,0"
id="path8927"
inkscape:connector-curvature="0" />
</g>
<g
transform="translate(-1.704666,-23.310614)"
id="g1720">
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 104.14855,73.229933 c 0.32346,0 0.55205,-0.172514 0.55205,-0.461476 v -0.0043 c 0,-0.254461 -0.1682,-0.370909 -0.49598,-0.452853 -0.29759,-0.06901 -0.37091,-0.125074 -0.37091,-0.24152 v -0.0043 c 0,-0.10351 0.0949,-0.185454 0.25446,-0.185454 0.12076,0 0.23289,0.04313 0.35366,0.116448 0.0216,0.01294 0.0431,0.02156 0.0733,0.02156 0.069,0 0.12507,-0.05607 0.12507,-0.125074 0,-0.05175 -0.0259,-0.09057 -0.0604,-0.10782 -0.13801,-0.09489 -0.29328,-0.146638 -0.48735,-0.146638 -0.30622,0 -0.53049,0.185452 -0.53049,0.448538 v 0.0043 c 0,0.284649 0.18546,0.383847 0.51755,0.461478 0.28465,0.06901 0.34934,0.129384 0.34934,0.237207 v 0.0043 c 0,0.116448 -0.10782,0.194079 -0.27602,0.194079 -0.16821,0 -0.30622,-0.05607 -0.43129,-0.159575 -0.0173,-0.01294 -0.0431,-0.02156 -0.082,-0.02156 -0.069,0 -0.12507,0.05607 -0.12507,0.125074 0,0.04313 0.0216,0.08194 0.0517,0.103511 0.17251,0.129383 0.37091,0.194077 0.58224,0.194077 z m 0,0"
id="path8923"
inkscape:connector-curvature="0" />
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 105.70536,73.234246 c 0.40541,0 0.66418,-0.232894 0.66418,-0.694373 v -0.75475 c 0,-0.07332 -0.0604,-0.133699 -0.13369,-0.133699 -0.0776,0 -0.13802,0.06038 -0.13802,0.133699 v 0.767691 c 0,0.284649 -0.14664,0.426974 -0.38816,0.426974 -0.24151,0 -0.39247,-0.15095 -0.39247,-0.439915 v -0.75475 c 0,-0.07332 -0.0561,-0.133699 -0.1337,-0.133699 -0.0776,0 -0.13801,0.06038 -0.13801,0.133699 v 0.767691 c 0,0.448538 0.25877,0.681432 0.65987,0.681432 z m 0,0"
id="path8919"
inkscape:connector-curvature="0" />
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 107.34137,73.229933 c 0.32347,0 0.55205,-0.172514 0.55205,-0.461476 v -0.0043 c 0,-0.254461 -0.1682,-0.370909 -0.49598,-0.452853 -0.29759,-0.06901 -0.37091,-0.125074 -0.37091,-0.24152 v -0.0043 c 0,-0.10351 0.0949,-0.185454 0.25446,-0.185454 0.12076,0 0.2329,0.04313 0.35366,0.116448 0.0216,0.01294 0.0431,0.02156 0.0733,0.02156 0.069,0 0.12507,-0.05607 0.12507,-0.125074 0,-0.05175 -0.0259,-0.09057 -0.0604,-0.10782 -0.13801,-0.09489 -0.29327,-0.146638 -0.48735,-0.146638 -0.30622,0 -0.53049,0.185452 -0.53049,0.448538 v 0.0043 c 0,0.284649 0.18546,0.383847 0.51755,0.461478 0.28465,0.06901 0.34934,0.129384 0.34934,0.237207 v 0.0043 c 0,0.116448 -0.10782,0.194079 -0.27602,0.194079 -0.1682,0 -0.30622,-0.05607 -0.43129,-0.159575 -0.0173,-0.01294 -0.0431,-0.02156 -0.082,-0.02156 -0.069,0 -0.12507,0.05607 -0.12507,0.125074 0,0.04313 0.0216,0.08194 0.0517,0.103511 0.17252,0.129383 0.37091,0.194077 0.58224,0.194077 z m 0,0"
id="path8915"
inkscape:connector-curvature="0" />
</g>
<g
transform="translate(5.131964,-40.914302)"
id="g1725">
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 103.63384,90.686993 c 0,0.07763 0.0604,0.138012 0.13801,0.138012 0.0733,0 0.1337,-0.06038 0.1337,-0.138012 v -0.414036 h 0.34071 l 0.37522,0.478729 c 0.0345,0.04313 0.0733,0.07332 0.1337,0.07332 0.069,0 0.12939,-0.05175 0.12939,-0.129386 0,-0.03881 -0.0172,-0.06901 -0.0431,-0.103508 l -0.29328,-0.370906 c 0.20702,-0.06469 0.34935,-0.215646 0.34935,-0.461478 v -0.0043 c 0,-0.133699 -0.0474,-0.250148 -0.12939,-0.336405 -0.0992,-0.09488 -0.25015,-0.15095 -0.44423,-0.15095 h -0.55204 c -0.0776,0 -0.13802,0.05607 -0.13802,0.1337 z m 0.27171,-0.655555 v -0.517546 h 0.39678 c 0.19839,0 0.31915,0.09057 0.31915,0.25446 v 0.0043 c 0,0.159575 -0.12507,0.258773 -0.31915,0.258773 z m 0,0"
id="path8911"
inkscape:connector-curvature="0" />
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 105.42954,90.812067 h 0.91002 c 0.0647,0 0.12076,-0.05175 0.12076,-0.120761 0,-0.06901 -0.0561,-0.120759 -0.12076,-0.120759 h -0.77632 v -0.418348 h 0.66418 c 0.069,0 0.12076,-0.05175 0.12076,-0.116449 0,-0.06901 -0.0517,-0.125073 -0.12076,-0.125073 h -0.66418 v -0.401098 h 0.76338 c 0.069,0 0.12076,-0.05175 0.12076,-0.120759 0,-0.06901 -0.0517,-0.120761 -0.12076,-0.120761 h -0.89708 c -0.0776,0 -0.13801,0.05607 -0.13801,0.1337 v 1.272296 c 0,0.07763 0.0604,0.138012 0.13801,0.138012 z m 0,0"
id="path8907"
inkscape:connector-curvature="0" />
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 106.81739,90.674055 c 0,0.07763 0.0604,0.138012 0.13801,0.138012 h 0.83239 c 0.069,0 0.12507,-0.05607 0.12507,-0.125074 0,-0.06901 -0.0561,-0.120761 -0.12507,-0.120761 H 107.0891 V 89.38882 c 0,-0.07332 -0.0604,-0.133699 -0.1337,-0.133699 -0.0776,0 -0.13801,0.06038 -0.13801,0.133699 z m 0,0"
id="path8903"
inkscape:connector-curvature="0" />
</g>
</g>
<g
id="g1503"
transform="matrix(0.90584922,0,0,0.9908646,9.4528518,3.8571261)" />
<g
transform="matrix(0.26458333,0,0,0.26458333,90.588027,19.654788)"
id="g52"
style="fill:#fff7d4;fill-opacity:1">
<path
inkscape:connector-curvature="0"
d="m 36.62,70.19 a 0.73,0.73 0 0 1 -0.27,0.57 0.91,0.91 0 0 1 -0.62,0.23 0.81,0.81 0 0 1 -0.43,-0.13 0.79,0.79 0 0 1 -0.31,-0.38 l -0.64,-1.42 h -4.06 l -0.64,1.42 A 0.81,0.81 0 0 1 29.34,70.86 0.8,0.8 0 0 1 28.9,70.99 0.94,0.94 0 0 1 28.28,70.76 0.72,0.72 0 0 1 28,70.19 1,1 0 0 1 28.1,69.81 L 31.34,63 a 0.94,0.94 0 0 1 0.4,-0.44 1.14,1.14 0 0 1 1.14,0 1.06,1.06 0 0 1 0.41,0.43 l 3.24,6.8 a 1,1 0 0 1 0.09,0.4 z m -5.7,-2.53 h 2.8 l -1.39,-3.12 z"
transform="translate(-7.25,-14.98)"
style="fill:#fff7d4;fill-opacity:1"
id="path44" />
<path
inkscape:connector-curvature="0"
d="m 37.88,70.72 a 0.88,0.88 0 0 1 -0.23,-0.65 v -6.71 a 0.79,0.79 0 0 1 0.88,-0.88 h 2.41 a 5.21,5.21 0 0 1 2.38,0.5 3.52,3.52 0 0 1 1.52,1.45 4.59,4.59 0 0 1 0.53,2.27 4.67,4.67 0 0 1 -0.52,2.3 3.48,3.48 0 0 1 -1.52,1.46 5.24,5.24 0 0 1 -2.39,0.5 h -2.41 a 0.88,0.88 0 0 1 -0.65,-0.24 z m 2.93,-1.28 a 2.4,2.4 0 0 0 2.7,-2.72 2.39,2.39 0 0 0 -2.7,-2.72 h -1.28 v 5.44 z"
transform="translate(-7.25,-14.98)"
style="fill:#fff7d4;fill-opacity:1"
id="path46" />
<path
inkscape:connector-curvature="0"
d="m 48.1,70.83 a 3.68,3.68 0 0 1 -1.33,-0.63 0.84,0.84 0 0 1 -0.26,-0.28 0.81,0.81 0 0 1 -0.08,-0.38 0.82,0.82 0 0 1 0.19,-0.53 0.54,0.54 0 0 1 0.43,-0.23 0.81,0.81 0 0 1 0.26,0 1.63,1.63 0 0 1 0.31,0.15 4,4 0 0 0 1,0.47 4.25,4.25 0 0 0 1.16,0.15 A 2.29,2.29 0 0 0 51,69.34 0.84,0.84 0 0 0 51.42,68.58 0.68,0.68 0 0 0 51.03,67.98 5,5 0 0 0 49.64,67.55 7.66,7.66 0 0 1 47.89,67 2.31,2.31 0 0 1 46.89,66.2 2.11,2.11 0 0 1 46.61,65 2.27,2.27 0 0 1 47,63.67 2.9,2.9 0 0 1 48.21,62.72 4.27,4.27 0 0 1 50,62.38 a 4.46,4.46 0 0 1 2.81,0.85 0.94,0.94 0 0 1 0.26,0.29 0.78,0.78 0 0 1 0.08,0.37 0.81,0.81 0 0 1 -0.19,0.53 0.54,0.54 0 0 1 -0.43,0.23 0.81,0.81 0 0 1 -0.25,0 1.69,1.69 0 0 1 -0.32,-0.16 5.07,5.07 0 0 0 -0.91,-0.47 3,3 0 0 0 -1,-0.16 2,2 0 0 0 -1.15,0.28 0.89,0.89 0 0 0 -0.42,0.77 0.7,0.7 0 0 0 0.16,0.47 1.35,1.35 0 0 0 0.54,0.33 8.31,8.31 0 0 0 1.07,0.3 6,6 0 0 1 2.35,0.92 1.86,1.86 0 0 1 0.71,1.55 2.25,2.25 0 0 1 -0.43,1.36 2.75,2.75 0 0 1 -1.2,0.91 4.62,4.62 0 0 1 -1.79,0.32 6.7,6.7 0 0 1 -1.79,-0.24 z"
transform="translate(-7.25,-14.98)"
style="fill:#fff7d4;fill-opacity:1"
id="path48" />
<path
inkscape:connector-curvature="0"
d="M 61.74,70.27 A 0.67,0.67 0 0 1 61.47,70.82 1,1 0 0 1 60.4,70.93 0.89,0.89 0 0 1 60,70.6 L 58.42,68.25 A 1.42,1.42 0 0 0 58,67.8 1.1,1.1 0 0 0 57.42,67.66 h -1 v 2.42 a 0.94,0.94 0 0 1 -0.25,0.68 0.89,0.89 0 0 1 -0.67,0.25 0.87,0.87 0 0 1 -0.94,-0.94 v -6.71 a 0.8,0.8 0 0 1 0.88,-0.88 h 3 a 3.37,3.37 0 0 1 2.25,0.65 2.35,2.35 0 0 1 0.83,1.87 2.45,2.45 0 0 1 -0.52,1.65 2.59,2.59 0 0 1 -1.52,0.85 1.58,1.58 0 0 1 0.64,0.28 2.45,2.45 0 0 1 0.55,0.61 l 0.91,1.37 a 0.92,0.92 0 0 1 0.16,0.51 z M 59.4,66 a 1.27,1.27 0 0 0 0,-1.77 1.93,1.93 0 0 0 -1.16,-0.28 h -1.79 v 2.33 h 1.79 A 1.9,1.9 0 0 0 59.4,66 Z"
transform="translate(-7.25,-14.98)"
style="fill:#fff7d4;fill-opacity:1"
id="path50" />
</g>
<g
id="g1026"
transform="translate(88.358096,22.5893)">
<path
inkscape:connector-curvature="0"
id="path25377"
d="m 26.368901,82.091199 c 0,-0.43021 -0.352577,-0.78171 -0.782785,-0.78171 h -6.009987 c -0.430208,0 -0.782787,0.3515 -0.782787,0.78171 v 9.13358 c 0,0.43022 0.352579,0.78279 0.782787,0.78279 h 6.009987 c 0.430208,0 0.782785,-0.35257 0.782785,-0.78279 z m 0,0"
style="display:inline;fill:#202020;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2330292" />
<path
style="display:inline;fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.2330292"
d="m 21.263285,83.746531 c 0.388158,0 0.672808,-0.29328 0.672808,-0.651251 0,-0.357971 -0.280336,-0.64693 -0.668494,-0.64693 -0.388159,0 -0.668497,0.29328 -0.668497,0.64693 v 0.004 c 0,0.35796 0.280338,0.64693 0.664183,0.64693 z m 0.0043,-0.254461 c -0.219955,0 -0.37953,-0.181141 -0.37953,-0.39679 0,-0.215641 0.15526,-0.39247 0.375218,-0.39247 0.22427,0 0.383847,0.176829 0.383847,0.39247 v 0.004 c 0,0.215638 -0.155263,0.39247 -0.379535,0.39247 z m 0,0"
id="path12074"
inkscape:connector-curvature="0" />
<path
style="display:inline;fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.2330292"
d="m 22.762883,83.746531 c 0.340719,0 0.552048,-0.18977 0.552048,-0.569302 V 82.59499 c 0,-0.0776 -0.06038,-0.138009 -0.138012,-0.138009 -0.07763,0 -0.138012,0.0604 -0.138012,0.138009 v 0.59518 c 0,0.19839 -0.103509,0.3019 -0.271709,0.3019 -0.168204,0 -0.271713,-0.10782 -0.271713,-0.310531 V 82.59499 c 0,-0.0776 -0.06038,-0.138009 -0.138012,-0.138009 -0.07332,0 -0.138012,0.0604 -0.138012,0.138009 v 0.59087 c 0,0.370901 0.207018,0.560671 0.543422,0.560671 z m 0,0"
id="path12070"
inkscape:connector-curvature="0" />
<path
style="display:inline;fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.2330292"
d="m 23.9409,83.595581 c 0,0.0776 0.06038,0.138009 0.138012,0.138009 0.07763,0 0.138012,-0.0604 0.138012,-0.138009 v -0.871202 h 0.263087 c 0.07332,0 0.129386,-0.0561 0.129386,-0.129389 0,-0.069 -0.05607,-0.125071 -0.129386,-0.125071 h -0.806509 c -0.06901,0 -0.125072,0.0561 -0.125072,0.125071 0,0.0733 0.05607,0.129389 0.125072,0.129389 H 23.9409 Z m 0,0"
id="path12066"
inkscape:connector-curvature="0" />
</g>
<g
transform="translate(0,5.4055845)"
id="g1664">
<g
id="g1642"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(-0.017989,-5.2916667)">
<path
inkscape:connector-curvature="0"
id="path1638"
d="m 89.599095,93.256455 c 0.202705,0 0.336402,-0.06469 0.45285,-0.168201 0.02156,-0.01725 0.03882,-0.04744 0.03882,-0.07763 0,-0.05607 -0.05175,-0.10351 -0.107823,-0.10351 -0.02588,0 -0.04744,0.0086 -0.06469,0.02588 -0.09057,0.07763 -0.181139,0.120759 -0.314838,0.120759 -0.237209,0 -0.414036,-0.202703 -0.414036,-0.448538 0,-0.245835 0.176827,-0.444225 0.414036,-0.444225 0.120759,0 0.215643,0.04313 0.3019,0.112133 0.01294,0.01294 0.0345,0.02156 0.06469,0.02156 0.06038,0 0.112136,-0.04744 0.112136,-0.107823 0,-0.03882 -0.02156,-0.06901 -0.04313,-0.08626 -0.112136,-0.08626 -0.237207,-0.142325 -0.431287,-0.142325 -0.379534,0 -0.64693,0.293275 -0.64693,0.646931 v 0.0043 c 0,0.362281 0.271709,0.64693 0.638305,0.64693 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
<path
inkscape:connector-curvature="0"
id="path1640"
d="m 90.889301,93.252142 h 0.01294 c 0.06038,0 0.103508,-0.0345 0.125071,-0.09057 L 91.47154,92.12217 c 0.0043,-0.01294 0.0086,-0.03019 0.0086,-0.04744 0,-0.05607 -0.04744,-0.103508 -0.107823,-0.103508 -0.05175,0 -0.09057,0.0345 -0.107821,0.06901 l -0.3666,0.914322 -0.362281,-0.905703 c -0.01725,-0.04744 -0.05607,-0.07763 -0.112133,-0.07763 -0.06469,0 -0.112135,0.04744 -0.112135,0.10782 0,0.01725 0.0043,0.0345 0.01294,0.05175 l 0.439914,1.030777 c 0.02156,0.05607 0.06469,0.09057 0.125072,0.09057 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
</g>
<g
id="g1648"
transform="translate(6.882011,-5.2916667)"
style="fill:#fff7d4;fill-opacity:1">
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 89.599095,93.256455 c 0.202705,0 0.336402,-0.06469 0.45285,-0.168201 0.02156,-0.01725 0.03882,-0.04744 0.03882,-0.07763 0,-0.05607 -0.05175,-0.10351 -0.107823,-0.10351 -0.02588,0 -0.04744,0.0086 -0.06469,0.02588 -0.09057,0.07763 -0.181139,0.120759 -0.314838,0.120759 -0.237209,0 -0.414036,-0.202703 -0.414036,-0.448538 0,-0.245835 0.176827,-0.444225 0.414036,-0.444225 0.120759,0 0.215643,0.04313 0.3019,0.112133 0.01294,0.01294 0.0345,0.02156 0.06469,0.02156 0.06038,0 0.112136,-0.04744 0.112136,-0.107823 0,-0.03882 -0.02156,-0.06901 -0.04313,-0.08626 -0.112136,-0.08626 -0.237207,-0.142325 -0.431287,-0.142325 -0.379534,0 -0.64693,0.293275 -0.64693,0.646931 v 0.0043 c 0,0.362281 0.271709,0.64693 0.638305,0.64693 z m 0,0"
id="path1644"
inkscape:connector-curvature="0" />
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 90.889301,93.252142 h 0.01294 c 0.06038,0 0.103508,-0.0345 0.125071,-0.09057 L 91.47154,92.12217 c 0.0043,-0.01294 0.0086,-0.03019 0.0086,-0.04744 0,-0.05607 -0.04744,-0.103508 -0.107823,-0.103508 -0.05175,0 -0.09057,0.0345 -0.107821,0.06901 l -0.3666,0.914322 -0.362281,-0.905703 c -0.01725,-0.04744 -0.05607,-0.07763 -0.112133,-0.07763 -0.06469,0 -0.112135,0.04744 -0.112135,0.10782 0,0.01725 0.0043,0.0345 0.01294,0.05175 l 0.439914,1.030777 c 0.02156,0.05607 0.06469,0.09057 0.125072,0.09057 z m 0,0"
id="path1646"
inkscape:connector-curvature="0" />
</g>
<g
transform="translate(13.782011,-5.2916667)"
id="g1654"
style="fill:#fff7d4;fill-opacity:1">
<path
inkscape:connector-curvature="0"
id="path1650"
d="m 89.599095,93.256455 c 0.202705,0 0.336402,-0.06469 0.45285,-0.168201 0.02156,-0.01725 0.03882,-0.04744 0.03882,-0.07763 0,-0.05607 -0.05175,-0.10351 -0.107823,-0.10351 -0.02588,0 -0.04744,0.0086 -0.06469,0.02588 -0.09057,0.07763 -0.181139,0.120759 -0.314838,0.120759 -0.237209,0 -0.414036,-0.202703 -0.414036,-0.448538 0,-0.245835 0.176827,-0.444225 0.414036,-0.444225 0.120759,0 0.215643,0.04313 0.3019,0.112133 0.01294,0.01294 0.0345,0.02156 0.06469,0.02156 0.06038,0 0.112136,-0.04744 0.112136,-0.107823 0,-0.03882 -0.02156,-0.06901 -0.04313,-0.08626 -0.112136,-0.08626 -0.237207,-0.142325 -0.431287,-0.142325 -0.379534,0 -0.64693,0.293275 -0.64693,0.646931 v 0.0043 c 0,0.362281 0.271709,0.64693 0.638305,0.64693 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
<path
inkscape:connector-curvature="0"
id="path1652"
d="m 90.889301,93.252142 h 0.01294 c 0.06038,0 0.103508,-0.0345 0.125071,-0.09057 L 91.47154,92.12217 c 0.0043,-0.01294 0.0086,-0.03019 0.0086,-0.04744 0,-0.05607 -0.04744,-0.103508 -0.107823,-0.103508 -0.05175,0 -0.09057,0.0345 -0.107821,0.06901 l -0.3666,0.914322 -0.362281,-0.905703 c -0.01725,-0.04744 -0.05607,-0.07763 -0.112133,-0.07763 -0.06469,0 -0.112135,0.04744 -0.112135,0.10782 0,0.01725 0.0043,0.0345 0.01294,0.05175 l 0.439914,1.030777 c 0.02156,0.05607 0.06469,0.09057 0.125072,0.09057 z m 0,0"
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378" />
</g>
<g
id="g1662"
transform="translate(20.682011,-5.2916667)"
style="fill:#fff7d4;fill-opacity:1">
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 89.599095,93.256455 c 0.202705,0 0.336402,-0.06469 0.45285,-0.168201 0.02156,-0.01725 0.03882,-0.04744 0.03882,-0.07763 0,-0.05607 -0.05175,-0.10351 -0.107823,-0.10351 -0.02588,0 -0.04744,0.0086 -0.06469,0.02588 -0.09057,0.07763 -0.181139,0.120759 -0.314838,0.120759 -0.237209,0 -0.414036,-0.202703 -0.414036,-0.448538 0,-0.245835 0.176827,-0.444225 0.414036,-0.444225 0.120759,0 0.215643,0.04313 0.3019,0.112133 0.01294,0.01294 0.0345,0.02156 0.06469,0.02156 0.06038,0 0.112136,-0.04744 0.112136,-0.107823 0,-0.03882 -0.02156,-0.06901 -0.04313,-0.08626 -0.112136,-0.08626 -0.237207,-0.142325 -0.431287,-0.142325 -0.379534,0 -0.64693,0.293275 -0.64693,0.646931 v 0.0043 c 0,0.362281 0.271709,0.64693 0.638305,0.64693 z m 0,0"
id="path1656"
inkscape:connector-curvature="0" />
<path
style="fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.27602378"
d="m 90.889301,93.252142 h 0.01294 c 0.06038,0 0.103508,-0.0345 0.125071,-0.09057 L 91.47154,92.12217 c 0.0043,-0.01294 0.0086,-0.03019 0.0086,-0.04744 0,-0.05607 -0.04744,-0.103508 -0.107823,-0.103508 -0.05175,0 -0.09057,0.0345 -0.107821,0.06901 l -0.3666,0.914322 -0.362281,-0.905703 c -0.01725,-0.04744 -0.05607,-0.07763 -0.112133,-0.07763 -0.06469,0 -0.112135,0.04744 -0.112135,0.10782 0,0.01725 0.0043,0.0345 0.01294,0.05175 l 0.439914,1.030777 c 0.02156,0.05607 0.06469,0.09057 0.125072,0.09057 z m 0,0"
id="path1658"
inkscape:connector-curvature="0" />
</g>
</g>
<g
id="g1675"
transform="matrix(1.0035812,0,0,0.49511921,-0.36055249,48.180225)">
<path
inkscape:connector-curvature="0"
id="path1666"
d="m 90.342396,86.336996 v -5.06241"
style="fill:#fff7d4;fill-opacity:1;stroke:#fff7d4;stroke-width:0.22603756;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#fff7d4;fill-opacity:1;stroke:#fff7d4;stroke-width:0.22603756;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
d="m 97.234972,86.336996 v -5.06241"
id="path1669"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path1671"
d="m 104.12755,86.336996 v -5.06241"
style="fill:#fff7d4;fill-opacity:1;stroke:#fff7d4;stroke-width:0.22603756;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#fff7d4;fill-opacity:1;stroke:#fff7d4;stroke-width:0.22603756;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
d="m 111.02014,86.336996 v -5.06241"
id="path1673"
inkscape:connector-curvature="0" />
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="guides"
transform="translate(0,-8.0744425e-6)" />
</svg>

+ 440
- 0
vst2_bin/plugins/AS/res/AtNuVrTr.svg View File

@@ -0,0 +1,440 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->

<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg8"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="AtNuVrTr.svg"
x="0px"
y="0px"
viewBox="0 0 75 380"
style="enable-background:new 0 0 75 380;"
xml:space="preserve"><metadata
id="metadata138"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs136" /><style
type="text/css"
id="style2">
.st0{fill:#44423E;}
.st1{fill:#3C3835;}
.st2{fill:#FFF7D4;}
.st3{fill:#251E1E;}
</style><sodipodi:namedview
bordercolor="#666666"
borderopacity="1"
gridtolerance="10"
guidetolerance="10"
id="namedview25"
inkscape:current-layer="layer2"
inkscape:cx="-227.24091"
inkscape:cy="185.49058"
inkscape:guide-bbox="true"
inkscape:lockguides="false"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-height="1229"
inkscape:window-maximized="0"
inkscape:window-width="2138"
inkscape:window-x="34"
inkscape:window-y="64"
inkscape:zoom="1.3082204"
objecttolerance="10"
pagecolor="#ffffff"
showgrid="false"
showguides="true" /><title
id="title2">MyModule</title><g
id="layer2"
transform="translate(0,-3.0517578e-5)"
inkscape:groupmode="layer"
inkscape:label="background"><path
style="fill:#44423e;stroke-width:0.91793352"
d="M -0.02545608,3.0517578e-5 V 47.400031 v 3.8 2.9 1.2 265.699999 1.2 57.8 H 74.966115 v -57.7 -1.2 -266.999999 -2.9 -3.8 V 3.0517578e-5 Z"
class="st0"
inkscape:connector-curvature="0"
id="path1784" /><rect
id="rect2016"
x="0"
y="365"
class="st1"
width="75"
height="15"
style="fill:#3c3835;fill-opacity:1" /><circle
id="circle1788"
class="st1"
cx="37.5"
cy="359.9"
r="15.1"
style="fill:#3c3835;fill-opacity:1" /><path
id="path1790"
inkscape:connector-curvature="0"
class="st2"
d="m 45.043324,356.76538 c -0.0666,-0.1332 -0.133206,-0.26641 -0.266412,-0.33301 -0.133206,-0.0666 -0.266411,-0.13321 -0.399617,-0.0666 -0.133206,0.0666 -0.266412,0.1332 -0.333015,0.26641 -0.666029,1.19885 -1.398661,2.3311 -2.197896,3.39675 -0.66603,-1.33206 -1.13225,-2.79733 -1.398662,-4.32919 v -0.26642 l 1.332059,-1.86488 c 0.133205,-0.19981 0.865838,-1.06564 -0.532824,-1.66507 -0.532823,-0.19981 -1.065647,-0.19981 -1.59847,0.0666 -1.531867,0.66603 -1.265456,2.86393 -1.198853,3.19694 0,0.13321 0,0.26641 0.0666,0.39962 l -2.530911,4.12938 c 0,0 0.333014,-2.19789 0.399617,-2.59751 0.0666,-0.46622 -0.199808,-0.99905 -0.732632,-1.06565 0,0 0,0 -0.0666,0 -0.666029,-0.13321 -1.065647,0.0666 -1.531867,1.73168 -0.399618,1.46526 -1.665073,5.06182 -2.597514,5.06182 -0.532824,0 -0.133206,-2.2645 0.46622,-3.92957 0.732632,-1.99809 2.530912,-4.66221 4.528999,-5.86106 0.466221,-0.26641 1.065647,-0.99904 0.466221,-1.73168 -0.799235,-0.86584 -1.665073,-0.19981 -1.998088,0.0666 -0.932441,0.79923 -1.731676,1.79827 -2.331102,2.93052 -0.865839,1.33206 -1.465265,2.73072 -1.864882,4.19599 -0.66603,2.13129 -1.398662,5.66125 0.0666,5.79445 1.998088,0.19981 3.596559,-3.72976 3.596559,-3.72976 0,0 -0.0666,1.99809 0.932441,2.06469 0.999043,0.0666 2.997131,-3.92957 3.596558,-5.26163 0.399617,1.33206 0.932441,2.53091 1.665073,3.66316 0.0666,0.0666 0.0666,0.19981 0.0666,0.26641 -0.199809,0.33302 -2.530911,3.26355 -3.196941,4.99522 -0.0666,0.13321 -0.0666,0.33302 0,0.46622 0.0666,0.13321 0.199809,0.26641 0.333015,0.26641 0.199809,0 0.333015,0 0.46622,-0.0666 0.133206,-0.0666 0.266412,-0.1332 0.466221,-0.26641 3.19694,-1.86488 3.663161,-3.99618 3.463352,-5.66125 0.0666,-0.0666 0.133206,-0.19981 0.199809,-0.26641 0.999044,-1.19885 1.864882,-2.46431 2.597514,-3.86297 0.0666,0.19981 0.133206,0 0.0666,-0.13321 z"
style="fill:#fff7d4;stroke-width:0.66602927" /><rect
id="rect2018"
x="0"
y="0"
class="st1"
width="75"
height="15"
style="fill:#3c3835;fill-opacity:1" /><g
transform="matrix(7.9299111,0,0,7.9299111,-438.08996,-2669.2158)"
data-name="Layer 2"
id="g1661"
style="fill:#3c3835;fill-opacity:1"><g
data-name="Layer 1-2"
id="g1659"
style="fill:#3c3835;fill-opacity:1"><path
style="fill:#3c3835;fill-opacity:1"
inkscape:connector-curvature="0"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
class="cls-4"
id="path1657" /></g></g></g><g
id="layer1"
transform="translate(0,-3.0517578e-5)"
inkscape:groupmode="layer"
inkscape:label="graphics" /><g
id="g911"
transform="translate(7.8009486)"><path
id="rect861"
class="st3"
d="M10.6,2.8h8.4c2.9,0,5.3,2.1,5.3,4.7v0c0,2.6-2.4,4.7-5.3,4.7h-8.4c-2.9,0-5.3-2.1-5.3-4.7v0 C5.3,4.9,7.7,2.8,10.6,2.8z" /><path
id="rect863"
class="st3"
d="M10.6,368.3h8.4c2.9,0,5.3,2.1,5.3,4.7v0c0,2.6-2.4,4.7-5.3,4.7h-8.4c-2.9,0-5.3-2.1-5.3-4.7v0 C5.3,370.4,7.7,368.3,10.6,368.3z" /></g><g
id="g915"
transform="translate(-7.8009491)"><path
id="rect1497"
class="st3"
d="M56.1,2.8h8.4c2.9,0,5.3,2.1,5.3,4.7v0c0,2.6-2.4,4.7-5.3,4.7h-8.4c-2.9,0-5.3-2.1-5.3-4.7v0 C50.8,4.9,53.2,2.8,56.1,2.8z" /><path
id="rect1499"
class="st3"
d="M56.1,368.3h8.4c2.9,0,5.3,2.1,5.3,4.7v0c0,2.6-2.4,4.7-5.3,4.7h-8.4c-2.9,0-5.3-2.1-5.3-4.7v0 C50.8,370.4,53.2,368.3,56.1,368.3z" /></g><g
transform="translate(-37.931037,-124.95824)"
id="g926"
style="fill:#fff7d4;fill-opacity:1"><g
id="g1713"><g
id="g27"
transform="translate(-167.44921,126.95824)"
style="enable-background:new 0 0 75 380"><path
inkscape:connector-curvature="0"
id="path19"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 46.51,89.72 a 0.41,0.41 0 0 1 -0.15,0.32 0.52,0.52 0 0 1 -0.35,0.13 0.46,0.46 0 0 1 -0.43,-0.29 l -0.5,-1.11 h -2.93 l -0.5,1.11 a 0.48,0.48 0 0 1 -0.18,0.22 0.49,0.49 0 0 1 -0.26,0.07 0.53,0.53 0 0 1 -0.35,-0.13 0.41,0.41 0 0 1 -0.16,-0.32 0.51,0.51 0 0 1 0,-0.22 L 43,84.58 a 0.54,0.54 0 0 1 0.23,-0.25 0.66,0.66 0 0 1 0.66,0 0.54,0.54 0 0 1 0.23,0.25 l 2.3,4.92 a 0.51,0.51 0 0 1 0.09,0.22 z m -4,-1.78 h 2.19 l -1.1,-2.46 z" /><path
inkscape:connector-curvature="0"
id="path21"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 48.94,90 a 0.52,0.52 0 0 1 -0.15,-0.39 v -4.44 h -1.5 q -0.5,0 -0.5,-0.44 0,-0.44 0.5,-0.44 h 4.09 q 0.5,0 0.5,0.44 0,0.44 -0.5,0.44 h -1.51 v 4.48 A 0.5,0.5 0 0 1 49.34,90.18 0.53,0.53 0 0 1 48.94,90 Z" /><path
inkscape:connector-curvature="0"
id="path23"
style="fill:#fff7d4"
transform="translate(204.6)"
d="M 54.86,90 A 0.52,0.52 0 0 1 54.71,89.61 V 85.17 H 53.2 q -0.5,0 -0.5,-0.44 0,-0.44 0.5,-0.44 h 4.1 q 0.5,0 0.5,0.44 0,0.44 -0.5,0.44 h -1.51 v 4.48 A 0.5,0.5 0 0 1 55.26,90.18 0.53,0.53 0 0 1 54.86,90 Z" /><path
inkscape:connector-curvature="0"
id="path25"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 64.06,84.39 a 0.54,0.54 0 0 1 0.14,0.39 v 4.87 A 0.55,0.55 0 0 1 64.06,90.04 0.48,0.48 0 0 1 63.69,90.19 0.48,0.48 0 0 1 63.28,90 l -3,-3.94 v 3.59 a 0.56,0.56 0 0 1 -0.13,0.39 0.52,0.52 0 0 1 -0.73,0 0.56,0.56 0 0 1 -0.13,-0.39 v -4.87 a 0.53,0.53 0 0 1 0.14,-0.39 0.49,0.49 0 0 1 0.37,-0.15 0.47,0.47 0 0 1 0.4,0.19 l 3,3.93 v -3.58 a 0.54,0.54 0 0 1 0.14,-0.39 0.47,0.47 0 0 1 0.36,-0.15 0.48,0.48 0 0 1 0.36,0.15 z" /></g><g
id="g41"
transform="translate(-166.97094,128.95824)"
style="enable-background:new 0 0 75 380"><path
inkscape:connector-curvature="0"
id="path29"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 35.94,143.72 a 2.44,2.44 0 0 1 -1,-1 3.91,3.91 0 0 1 0,-3.18 2.42,2.42 0 0 1 1,-1 3.2,3.2 0 0 1 3,0 2.43,2.43 0 0 1 1,1 3.91,3.91 0 0 1 0,3.18 2.44,2.44 0 0 1 -1,1 3.17,3.17 0 0 1 -3,0 z m 2.74,-1 a 3,3 0 0 0 0,-3.18 1.72,1.72 0 0 0 -2.52,0 3,3 0 0 0 0,3.18 1.71,1.71 0 0 0 2.52,0 z" /><path
inkscape:connector-curvature="0"
id="path31"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 42.26,143.91 a 0.54,0.54 0 0 1 -0.15,-0.39 v -4.86 a 0.5,0.5 0 0 1 0.14,-0.37 0.52,0.52 0 0 1 0.38,-0.13 h 2.91 q 0.51,0 0.51,0.43 0,0.43 -0.51,0.42 h -2.37 v 1.59 h 2.21 q 0.51,0 0.51,0.43 0,0.43 -0.51,0.42 h -2.21 v 2.06 a 0.55,0.55 0 0 1 -0.14,0.39 0.5,0.5 0 0 1 -0.38,0.15 0.51,0.51 0 0 1 -0.39,-0.14 z" /><path
inkscape:connector-curvature="0"
id="path33"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 47.79,143.91 a 0.54,0.54 0 0 1 -0.15,-0.39 v -4.86 a 0.5,0.5 0 0 1 0.14,-0.37 0.52,0.52 0 0 1 0.38,-0.13 h 2.91 q 0.51,0 0.51,0.43 0,0.43 -0.51,0.42 H 48.7 v 1.59 h 2.2 q 0.51,0 0.51,0.43 0,0.43 -0.51,0.42 h -2.2 v 2.06 a 0.55,0.55 0 0 1 -0.14,0.39 0.5,0.5 0 0 1 -0.38,0.15 0.51,0.51 0 0 1 -0.39,-0.14 z" /><path
inkscape:connector-curvature="0"
id="path35"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 53.84,143.91 a 2.65,2.65 0 0 1 -0.92,-0.46 0.46,0.46 0 0 1 -0.19,-0.4 0.47,0.47 0 0 1 0.1,-0.3 0.31,0.31 0 0 1 0.25,-0.13 0.68,0.68 0 0 1 0.34,0.12 2.46,2.46 0 0 0 0.75,0.37 3,3 0 0 0 0.86,0.12 1.7,1.7 0 0 0 0.97,-0.23 0.69,0.69 0 0 0 0.32,-0.62 0.53,0.53 0 0 0 -0.3,-0.49 4,4 0 0 0 -1,-0.33 6,6 0 0 1 -1.19,-0.36 1.68,1.68 0 0 1 -0.69,-0.53 1.37,1.37 0 0 1 -0.23,-0.82 1.54,1.54 0 0 1 0.29,-0.92 1.91,1.91 0 0 1 0.81,-0.63 2.87,2.87 0 0 1 1.17,-0.23 2.9,2.9 0 0 1 1.93,0.63 0.63,0.63 0 0 1 0.15,0.18 0.52,0.52 0 0 1 -0.06,0.52 0.31,0.31 0 0 1 -0.25,0.13 H 56.8 l -0.19,-0.09 a 2.81,2.81 0 0 0 -0.66,-0.37 2.25,2.25 0 0 0 -0.79,-0.12 1.54,1.54 0 0 0 -0.89,0.23 0.73,0.73 0 0 0 -0.33,0.64 0.58,0.58 0 0 0 0.29,0.52 3.4,3.4 0 0 0 1,0.34 6.64,6.64 0 0 1 1.2,0.37 1.79,1.79 0 0 1 0.71,0.52 1.25,1.25 0 0 1 0.24,0.79 1.5,1.5 0 0 1 -0.29,0.91 1.87,1.87 0 0 1 -0.8,0.61 3,3 0 0 1 -1.19,0.22 4.2,4.2 0 0 1 -1.26,-0.19 z" /><path
inkscape:connector-curvature="0"
id="path37"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 59.28,143.87 a 0.5,0.5 0 0 1 -0.14,-0.37 v -4.84 a 0.5,0.5 0 0 1 0.14,-0.37 0.52,0.52 0 0 1 0.38,-0.13 h 3 a 0.58,0.58 0 0 1 0.37,0.11 0.38,0.38 0 0 1 0.13,0.31 0.4,0.4 0 0 1 -0.13,0.32 0.56,0.56 0 0 1 -0.37,0.11 h -2.47 v 1.61 h 2.3 a 0.58,0.58 0 0 1 0.37,0.11 0.38,0.38 0 0 1 0.14,0.27 0.38,0.38 0 0 1 -0.13,0.31 0.58,0.58 0 0 1 -0.37,0.11 h -2.3 v 1.71 h 2.46 a 0.56,0.56 0 0 1 0.37,0.11 0.4,0.4 0 0 1 0.13,0.32 0.37,0.37 0 0 1 -0.13,0.31 0.58,0.58 0 0 1 -0.37,0.11 h -3 a 0.52,0.52 0 0 1 -0.38,-0.11 z" /><path
inkscape:connector-curvature="0"
id="path39"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 66.4,143.9 a 0.52,0.52 0 0 1 -0.14,-0.39 V 139 h -1.52 q -0.5,0 -0.5,-0.44 0,-0.44 0.5,-0.44 h 4.09 q 0.5,0 0.5,0.44 0,0.44 -0.5,0.44 h -1.51 v 4.48 a 0.5,0.5 0 0 1 -0.53,0.53 0.53,0.53 0 0 1 -0.39,-0.11 z" /></g><g
transform="translate(-168.97094,124.95824)"
id="g47"
style="enable-background:new 0 0 75 380"><path
inkscape:connector-curvature="0"
id="path43"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 11.38,92.1 a 2,2 0 0 1 -0.82,-0.86 3.12,3.12 0 0 1 0,-2.61 2,2 0 0 1 0.82,-0.85 2.68,2.68 0 0 1 2.77,0.19 0.51,0.51 0 0 1 0.14,0.16 0.45,0.45 0 0 1 0,0.2 0.47,0.47 0 0 1 -0.1,0.3 0.3,0.3 0 0 1 -0.24,0.13 h -0.17 l -0.16,-0.08 a 2.26,2.26 0 0 0 -0.5,-0.25 1.55,1.55 0 0 0 -0.5,-0.08 1.19,1.19 0 0 0 -1,0.4 1.88,1.88 0 0 0 -0.33,1.21 q 0,1.62 1.31,1.62 a 1.42,1.42 0 0 0 0.48,-0.08 3,3 0 0 0 0.52,-0.25 l 0.17,-0.08 h 0.16 a 0.3,0.3 0 0 1 0.24,0.13 0.47,0.47 0 0 1 0.1,0.3 0.45,0.45 0 0 1 0,0.21 0.51,0.51 0 0 1 -0.14,0.16 2.68,2.68 0 0 1 -2.77,0.19 z" /><path
inkscape:connector-curvature="0"
id="path45"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 19.29,87.58 a 0.48,0.48 0 0 1 0.26,-0.07 0.56,0.56 0 0 1 0.37,0.14 0.42,0.42 0 0 1 0.16,0.33 0.47,0.47 0 0 1 0,0.2 l -1.84,3.88 a 0.54,0.54 0 0 1 -0.22,0.24 0.67,0.67 0 0 1 -0.65,0 0.54,0.54 0 0 1 -0.22,-0.24 l -1.84,-3.88 a 0.44,0.44 0 0 1 0,-0.2 0.42,0.42 0 0 1 0.17,-0.34 0.6,0.6 0 0 1 0.38,-0.14 0.5,0.5 0 0 1 0.26,0.07 0.44,0.44 0 0 1 0.18,0.21 l 1.35,3.22 1.46,-3.18 a 0.45,0.45 0 0 1 0.18,-0.24 z" /></g><g
transform="translate(-166.95341,132.62126)"
id="g53"><path
inkscape:connector-curvature="0"
id="path49"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 14.39,153.54 a 0.52,0.52 0 0 1 -0.14,-0.39 v -3.81 a 0.51,0.51 0 0 1 0.14,-0.38 0.6,0.6 0 0 1 0.78,0 0.51,0.51 0 0 1 0.14,0.38 v 3.81 a 0.55,0.55 0 0 1 -0.92,0.39 z" /><path
inkscape:connector-curvature="0"
id="path51"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 21,149 a 0.53,0.53 0 0 1 0.14,0.38 v 3.81 a 0.53,0.53 0 0 1 -0.14,0.38 0.48,0.48 0 0 1 -0.36,0.15 0.49,0.49 0 0 1 -0.39,-0.18 l -2.28,-2.92 v 2.56 a 0.55,0.55 0 0 1 -0.13,0.38 0.46,0.46 0 0 1 -0.36,0.15 0.47,0.47 0 0 1 -0.36,-0.15 0.54,0.54 0 0 1 -0.14,-0.38 v -3.81 a 0.53,0.53 0 0 1 0.14,-0.38 0.48,0.48 0 0 1 0.36,-0.15 0.46,0.46 0 0 1 0.39,0.18 l 2.28,2.9 v -2.55 a 0.53,0.53 0 0 1 0.14,-0.38 0.46,0.46 0 0 1 0.35,-0.15 A 0.48,0.48 0 0 1 21,149 Z" /></g><g
transform="translate(-168.95341,132.95824)"
id="g61"><path
inkscape:connector-curvature="0"
id="path55"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 50.78,153.11 a 2,2 0 0 1 -0.81,-0.86 3.11,3.11 0 0 1 0,-2.6 2,2 0 0 1 0.81,-0.85 2.73,2.73 0 0 1 2.48,0 2,2 0 0 1 0.81,0.85 3.11,3.11 0 0 1 0,2.6 2,2 0 0 1 -0.81,0.86 2.7,2.7 0 0 1 -2.48,0 z m 2.18,-0.94 a 2.33,2.33 0 0 0 0,-2.43 1.27,1.27 0 0 0 -1.89,0 2.35,2.35 0 0 0 0,2.43 1.26,1.26 0 0 0 1.88,0 z" /><path
inkscape:connector-curvature="0"
id="path57"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 56.35,152.89 a 2,2 0 0 1 -0.53,-1.52 V 149 a 0.49,0.49 0 0 1 0.52,-0.52 0.5,0.5 0 0 1 0.38,0.14 0.52,0.52 0 0 1 0.14,0.38 v 2.37 a 1.28,1.28 0 0 0 0.26,0.87 1.11,1.11 0 0 0 1.52,0 1.27,1.27 0 0 0 0.27,-0.87 V 149 a 0.52,0.52 0 0 1 0.14,-0.38 0.51,0.51 0 0 1 0.38,-0.14 0.49,0.49 0 0 1 0.52,0.52 v 2.33 a 2,2 0 0 1 -0.53,1.52 2.52,2.52 0 0 1 -3.07,0 z" /><path
inkscape:connector-curvature="0"
id="path59-3"
style="fill:#fff7d4"
transform="translate(204.6)"
d="m 62.81,153.24 a 0.51,0.51 0 0 1 -0.15,-0.38 v -3.44 h -1.1 c -0.33,0 -0.5,-0.14 -0.5,-0.44 0,-0.3 0.17,-0.43 0.5,-0.43 h 3.26 q 0.5,0 0.5,0.43 c 0,0.29 -0.17,0.44 -0.5,0.44 h -1.1 v 3.44 a 0.51,0.51 0 0 1 -0.14,0.38 0.59,0.59 0 0 1 -0.77,0 z" /></g><path
transform="translate(37.931037,124.95824)"
id="path1139"
d="m 25.77802,62.870005 h 13.6"
style="enable-background:new 0 0 75 380;fill:#fff7d4;stroke:#fff7d4;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
inkscape:connector-curvature="0" /><path
id="path1139-2"
data-name="path1139"
d="m 63.709057,243.19824 h 13.6"
style="fill:#fff7d4;stroke:#fff7d4;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
inkscape:connector-curvature="0" /><circle
transform="translate(37.931037,124.95824)"
r="1.4387163"
cy="40.5"
cx="52.5"
id="path1635"
style="enable-background:new 0 0 75 380;opacity:1;vector-effect:none;fill:#fff7d4;fill-opacity:1;stroke:#ffffff;stroke-width:0.12256749;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" /><circle
transform="translate(37.931037,124.95824)"
style="enable-background:new 0 0 75 380;opacity:1;vector-effect:none;fill:#fff7d4;fill-opacity:1;stroke:#ffffff;stroke-width:0.12256749;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="circle1637"
cx="52.5"
cy="95.5"
r="1.4387163" /><g
style="fill:#fff7d4;fill-opacity:1"
transform="translate(4)"
id="g87-0"><path
d="m 4,206.19 q 0,-0.4 0.48,-0.4 h 1.35 q 0.48,0 0.48,0.4 c 0,0.27 -0.16,0.4 -0.48,0.4 H 4.5 c -0.32,0 -0.5,-0.13 -0.5,-0.4 z"
transform="translate(60)"
style="fill:#fff7d4;fill-opacity:1"
id="path83-1"
inkscape:connector-curvature="0" /><path
d="m 11.28,207.58 q 0,0.43 -0.5,0.43 H 8.46 q -0.5,0 -0.5,-0.43 0,-0.43 0.5,-0.42 h 0.63 v -2.78 l -0.6,0.36 A 0.39,0.39 0 0 1 8.29,204.8 0.36,0.36 0 0 1 8,204.66 0.49,0.49 0 0 1 7.88,204.34 0.39,0.39 0 0 1 8.09,203.98 l 1.07,-0.65 a 0.92,0.92 0 0 1 0.48,-0.14 0.49,0.49 0 0 1 0.51,0.52 v 3.45 h 0.63 q 0.5,0 0.5,0.42 z"
transform="translate(60)"
style="fill:#fff7d4;fill-opacity:1"
id="path85-9"
inkscape:connector-curvature="0" /></g><path
d="m 108.8,207.58 c 0,0.29 -0.17,0.43 -0.5,0.43 H 106 q -0.5,0 -0.5,-0.43 0,-0.43 0.5,-0.42 h 0.63 v -2.78 l -0.6,0.36 a 0.39,0.39 0 0 1 -0.2,0.06 0.36,0.36 0 0 1 -0.29,-0.14 0.49,0.49 0 0 1 -0.12,-0.32 0.39,0.39 0 0 1 0.21,-0.36 l 1.07,-0.65 a 0.92,0.92 0 0 1 0.48,-0.14 0.48,0.48 0 0 1 0.51,0.52 v 3.45 h 0.63 c 0.31,0 0.48,0.14 0.48,0.42 z"
style="fill:#fff7d4;fill-opacity:1"
id="path89-5"
inkscape:connector-curvature="0" /></g><g
id="g1775"
transform="translate(0,160)"><g
transform="translate(-167.44921,126.95824)"
id="g1723"><path
d="m 46.51,89.72 a 0.41,0.41 0 0 1 -0.15,0.32 0.52,0.52 0 0 1 -0.35,0.13 0.46,0.46 0 0 1 -0.43,-0.29 l -0.5,-1.11 h -2.93 l -0.5,1.11 a 0.48,0.48 0 0 1 -0.18,0.22 0.49,0.49 0 0 1 -0.26,0.07 0.53,0.53 0 0 1 -0.35,-0.13 0.41,0.41 0 0 1 -0.16,-0.32 0.51,0.51 0 0 1 0,-0.22 L 43,84.58 a 0.54,0.54 0 0 1 0.23,-0.25 0.66,0.66 0 0 1 0.66,0 0.54,0.54 0 0 1 0.23,0.25 l 2.3,4.92 a 0.51,0.51 0 0 1 0.09,0.22 z m -4,-1.78 h 2.19 l -1.1,-2.46 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1715"
inkscape:connector-curvature="0" /><path
d="m 48.94,90 a 0.52,0.52 0 0 1 -0.15,-0.39 v -4.44 h -1.5 q -0.5,0 -0.5,-0.44 0,-0.44 0.5,-0.44 h 4.09 q 0.5,0 0.5,0.44 0,0.44 -0.5,0.44 h -1.51 v 4.48 A 0.5,0.5 0 0 1 49.34,90.18 0.53,0.53 0 0 1 48.94,90 Z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1717"
inkscape:connector-curvature="0" /><path
d="M 54.86,90 A 0.52,0.52 0 0 1 54.71,89.61 V 85.17 H 53.2 q -0.5,0 -0.5,-0.44 0,-0.44 0.5,-0.44 h 4.1 q 0.5,0 0.5,0.44 0,0.44 -0.5,0.44 h -1.51 v 4.48 A 0.5,0.5 0 0 1 55.26,90.18 0.53,0.53 0 0 1 54.86,90 Z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1719"
inkscape:connector-curvature="0" /><path
d="m 64.06,84.39 a 0.54,0.54 0 0 1 0.14,0.39 v 4.87 A 0.55,0.55 0 0 1 64.06,90.04 0.48,0.48 0 0 1 63.69,90.19 0.48,0.48 0 0 1 63.28,90 l -3,-3.94 v 3.59 a 0.56,0.56 0 0 1 -0.13,0.39 0.52,0.52 0 0 1 -0.73,0 0.56,0.56 0 0 1 -0.13,-0.39 v -4.87 a 0.53,0.53 0 0 1 0.14,-0.39 0.49,0.49 0 0 1 0.37,-0.15 0.47,0.47 0 0 1 0.4,0.19 l 3,3.93 v -3.58 a 0.54,0.54 0 0 1 0.14,-0.39 0.47,0.47 0 0 1 0.36,-0.15 0.48,0.48 0 0 1 0.36,0.15 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1721"
inkscape:connector-curvature="0" /></g><g
transform="translate(-166.97094,128.95824)"
id="g1737"><path
d="m 35.94,143.72 a 2.44,2.44 0 0 1 -1,-1 3.91,3.91 0 0 1 0,-3.18 2.42,2.42 0 0 1 1,-1 3.2,3.2 0 0 1 3,0 2.43,2.43 0 0 1 1,1 3.91,3.91 0 0 1 0,3.18 2.44,2.44 0 0 1 -1,1 3.17,3.17 0 0 1 -3,0 z m 2.74,-1 a 3,3 0 0 0 0,-3.18 1.72,1.72 0 0 0 -2.52,0 3,3 0 0 0 0,3.18 1.71,1.71 0 0 0 2.52,0 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1725"
inkscape:connector-curvature="0" /><path
d="m 42.26,143.91 a 0.54,0.54 0 0 1 -0.15,-0.39 v -4.86 a 0.5,0.5 0 0 1 0.14,-0.37 0.52,0.52 0 0 1 0.38,-0.13 h 2.91 q 0.51,0 0.51,0.43 0,0.43 -0.51,0.42 h -2.37 v 1.59 h 2.21 q 0.51,0 0.51,0.43 0,0.43 -0.51,0.42 h -2.21 v 2.06 a 0.55,0.55 0 0 1 -0.14,0.39 0.5,0.5 0 0 1 -0.38,0.15 0.51,0.51 0 0 1 -0.39,-0.14 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1727"
inkscape:connector-curvature="0" /><path
d="m 47.79,143.91 a 0.54,0.54 0 0 1 -0.15,-0.39 v -4.86 a 0.5,0.5 0 0 1 0.14,-0.37 0.52,0.52 0 0 1 0.38,-0.13 h 2.91 q 0.51,0 0.51,0.43 0,0.43 -0.51,0.42 H 48.7 v 1.59 h 2.2 q 0.51,0 0.51,0.43 0,0.43 -0.51,0.42 h -2.2 v 2.06 a 0.55,0.55 0 0 1 -0.14,0.39 0.5,0.5 0 0 1 -0.38,0.15 0.51,0.51 0 0 1 -0.39,-0.14 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1729"
inkscape:connector-curvature="0" /><path
d="m 53.84,143.91 a 2.65,2.65 0 0 1 -0.92,-0.46 0.46,0.46 0 0 1 -0.19,-0.4 0.47,0.47 0 0 1 0.1,-0.3 0.31,0.31 0 0 1 0.25,-0.13 0.68,0.68 0 0 1 0.34,0.12 2.46,2.46 0 0 0 0.75,0.37 3,3 0 0 0 0.86,0.12 1.7,1.7 0 0 0 0.97,-0.23 0.69,0.69 0 0 0 0.32,-0.62 0.53,0.53 0 0 0 -0.3,-0.49 4,4 0 0 0 -1,-0.33 6,6 0 0 1 -1.19,-0.36 1.68,1.68 0 0 1 -0.69,-0.53 1.37,1.37 0 0 1 -0.23,-0.82 1.54,1.54 0 0 1 0.29,-0.92 1.91,1.91 0 0 1 0.81,-0.63 2.87,2.87 0 0 1 1.17,-0.23 2.9,2.9 0 0 1 1.93,0.63 0.63,0.63 0 0 1 0.15,0.18 0.52,0.52 0 0 1 -0.06,0.52 0.31,0.31 0 0 1 -0.25,0.13 H 56.8 l -0.19,-0.09 a 2.81,2.81 0 0 0 -0.66,-0.37 2.25,2.25 0 0 0 -0.79,-0.12 1.54,1.54 0 0 0 -0.89,0.23 0.73,0.73 0 0 0 -0.33,0.64 0.58,0.58 0 0 0 0.29,0.52 3.4,3.4 0 0 0 1,0.34 6.64,6.64 0 0 1 1.2,0.37 1.79,1.79 0 0 1 0.71,0.52 1.25,1.25 0 0 1 0.24,0.79 1.5,1.5 0 0 1 -0.29,0.91 1.87,1.87 0 0 1 -0.8,0.61 3,3 0 0 1 -1.19,0.22 4.2,4.2 0 0 1 -1.26,-0.19 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1731"
inkscape:connector-curvature="0" /><path
d="m 59.28,143.87 a 0.5,0.5 0 0 1 -0.14,-0.37 v -4.84 a 0.5,0.5 0 0 1 0.14,-0.37 0.52,0.52 0 0 1 0.38,-0.13 h 3 a 0.58,0.58 0 0 1 0.37,0.11 0.38,0.38 0 0 1 0.13,0.31 0.4,0.4 0 0 1 -0.13,0.32 0.56,0.56 0 0 1 -0.37,0.11 h -2.47 v 1.61 h 2.3 a 0.58,0.58 0 0 1 0.37,0.11 0.38,0.38 0 0 1 0.14,0.27 0.38,0.38 0 0 1 -0.13,0.31 0.58,0.58 0 0 1 -0.37,0.11 h -2.3 v 1.71 h 2.46 a 0.56,0.56 0 0 1 0.37,0.11 0.4,0.4 0 0 1 0.13,0.32 0.37,0.37 0 0 1 -0.13,0.31 0.58,0.58 0 0 1 -0.37,0.11 h -3 a 0.52,0.52 0 0 1 -0.38,-0.11 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1733"
inkscape:connector-curvature="0" /><path
d="m 66.4,143.9 a 0.52,0.52 0 0 1 -0.14,-0.39 V 139 h -1.52 q -0.5,0 -0.5,-0.44 0,-0.44 0.5,-0.44 h 4.09 q 0.5,0 0.5,0.44 0,0.44 -0.5,0.44 h -1.51 v 4.48 a 0.5,0.5 0 0 1 -0.53,0.53 0.53,0.53 0 0 1 -0.39,-0.11 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1735"
inkscape:connector-curvature="0" /></g><g
id="g1743"
transform="translate(-168.97094,124.95824)"><path
d="m 11.38,92.1 a 2,2 0 0 1 -0.82,-0.86 3.12,3.12 0 0 1 0,-2.61 2,2 0 0 1 0.82,-0.85 2.68,2.68 0 0 1 2.77,0.19 0.51,0.51 0 0 1 0.14,0.16 0.45,0.45 0 0 1 0,0.2 0.47,0.47 0 0 1 -0.1,0.3 0.3,0.3 0 0 1 -0.24,0.13 h -0.17 l -0.16,-0.08 a 2.26,2.26 0 0 0 -0.5,-0.25 1.55,1.55 0 0 0 -0.5,-0.08 1.19,1.19 0 0 0 -1,0.4 1.88,1.88 0 0 0 -0.33,1.21 q 0,1.62 1.31,1.62 a 1.42,1.42 0 0 0 0.48,-0.08 3,3 0 0 0 0.52,-0.25 l 0.17,-0.08 h 0.16 a 0.3,0.3 0 0 1 0.24,0.13 0.47,0.47 0 0 1 0.1,0.3 0.45,0.45 0 0 1 0,0.21 0.51,0.51 0 0 1 -0.14,0.16 2.68,2.68 0 0 1 -2.77,0.19 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1739"
inkscape:connector-curvature="0" /><path
d="m 19.29,87.58 a 0.48,0.48 0 0 1 0.26,-0.07 0.56,0.56 0 0 1 0.37,0.14 0.42,0.42 0 0 1 0.16,0.33 0.47,0.47 0 0 1 0,0.2 l -1.84,3.88 a 0.54,0.54 0 0 1 -0.22,0.24 0.67,0.67 0 0 1 -0.65,0 0.54,0.54 0 0 1 -0.22,-0.24 l -1.84,-3.88 a 0.44,0.44 0 0 1 0,-0.2 0.42,0.42 0 0 1 0.17,-0.34 0.6,0.6 0 0 1 0.38,-0.14 0.5,0.5 0 0 1 0.26,0.07 0.44,0.44 0 0 1 0.18,0.21 l 1.35,3.22 1.46,-3.18 a 0.45,0.45 0 0 1 0.18,-0.24 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1741"
inkscape:connector-curvature="0" /></g><g
id="g1749"
transform="translate(-166.95341,132.62126)"><path
d="m 14.39,153.54 a 0.52,0.52 0 0 1 -0.14,-0.39 v -3.81 a 0.51,0.51 0 0 1 0.14,-0.38 0.6,0.6 0 0 1 0.78,0 0.51,0.51 0 0 1 0.14,0.38 v 3.81 a 0.55,0.55 0 0 1 -0.92,0.39 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1745"
inkscape:connector-curvature="0" /><path
d="m 21,149 a 0.53,0.53 0 0 1 0.14,0.38 v 3.81 a 0.53,0.53 0 0 1 -0.14,0.38 0.48,0.48 0 0 1 -0.36,0.15 0.49,0.49 0 0 1 -0.39,-0.18 l -2.28,-2.92 v 2.56 a 0.55,0.55 0 0 1 -0.13,0.38 0.46,0.46 0 0 1 -0.36,0.15 0.47,0.47 0 0 1 -0.36,-0.15 0.54,0.54 0 0 1 -0.14,-0.38 v -3.81 a 0.53,0.53 0 0 1 0.14,-0.38 0.48,0.48 0 0 1 0.36,-0.15 0.46,0.46 0 0 1 0.39,0.18 l 2.28,2.9 v -2.55 a 0.53,0.53 0 0 1 0.14,-0.38 0.46,0.46 0 0 1 0.35,-0.15 A 0.48,0.48 0 0 1 21,149 Z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1747"
inkscape:connector-curvature="0" /></g><g
id="g1757"
transform="translate(-168.95341,132.95824)"><path
d="m 50.78,153.11 a 2,2 0 0 1 -0.81,-0.86 3.11,3.11 0 0 1 0,-2.6 2,2 0 0 1 0.81,-0.85 2.73,2.73 0 0 1 2.48,0 2,2 0 0 1 0.81,0.85 3.11,3.11 0 0 1 0,2.6 2,2 0 0 1 -0.81,0.86 2.7,2.7 0 0 1 -2.48,0 z m 2.18,-0.94 a 2.33,2.33 0 0 0 0,-2.43 1.27,1.27 0 0 0 -1.89,0 2.35,2.35 0 0 0 0,2.43 1.26,1.26 0 0 0 1.88,0 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1751"
inkscape:connector-curvature="0" /><path
d="m 56.35,152.89 a 2,2 0 0 1 -0.53,-1.52 V 149 a 0.49,0.49 0 0 1 0.52,-0.52 0.5,0.5 0 0 1 0.38,0.14 0.52,0.52 0 0 1 0.14,0.38 v 2.37 a 1.28,1.28 0 0 0 0.26,0.87 1.11,1.11 0 0 0 1.52,0 1.27,1.27 0 0 0 0.27,-0.87 V 149 a 0.52,0.52 0 0 1 0.14,-0.38 0.51,0.51 0 0 1 0.38,-0.14 0.49,0.49 0 0 1 0.52,0.52 v 2.33 a 2,2 0 0 1 -0.53,1.52 2.52,2.52 0 0 1 -3.07,0 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1753"
inkscape:connector-curvature="0" /><path
d="m 62.81,153.24 a 0.51,0.51 0 0 1 -0.15,-0.38 v -3.44 h -1.1 c -0.33,0 -0.5,-0.14 -0.5,-0.44 0,-0.3 0.17,-0.43 0.5,-0.43 h 3.26 q 0.5,0 0.5,0.43 c 0,0.29 -0.17,0.44 -0.5,0.44 h -1.1 v 3.44 a 0.51,0.51 0 0 1 -0.14,0.38 0.59,0.59 0 0 1 -0.77,0 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path1755"
inkscape:connector-curvature="0" /></g><path
inkscape:connector-curvature="0"
style="fill:#fff7d4;stroke:#fff7d4;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
d="m 25.77802,62.870005 h 13.6"
id="path1759"
transform="translate(37.931037,124.95824)" /><path
inkscape:connector-curvature="0"
style="fill:#fff7d4;stroke:#fff7d4;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
d="m 63.709057,243.19824 h 13.6"
data-name="path1139"
id="path1761" /><circle
style="opacity:1;vector-effect:none;fill:#fff7d4;fill-opacity:1;stroke:#ffffff;stroke-width:0.12256749;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="circle1763"
cx="52.5"
cy="40.5"
r="1.4387163"
transform="translate(37.931037,124.95824)" /><circle
r="1.4387163"
cy="95.5"
cx="52.5"
id="circle1765"
style="opacity:1;vector-effect:none;fill:#fff7d4;fill-opacity:1;stroke:#ffffff;stroke-width:0.12256749;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
transform="translate(37.931037,124.95824)" /><g
id="g1771"
transform="translate(4)"
style="fill:#fff7d4;fill-opacity:1"><path
inkscape:connector-curvature="0"
id="path1767"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(60)"
d="m 4,206.19 q 0,-0.4 0.48,-0.4 h 1.35 q 0.48,0 0.48,0.4 c 0,0.27 -0.16,0.4 -0.48,0.4 H 4.5 c -0.32,0 -0.5,-0.13 -0.5,-0.4 z" /><path
inkscape:connector-curvature="0"
id="path1769"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(60)"
d="m 11.28,207.58 q 0,0.43 -0.5,0.43 H 8.46 q -0.5,0 -0.5,-0.43 0,-0.43 0.5,-0.42 h 0.63 v -2.78 l -0.6,0.36 A 0.39,0.39 0 0 1 8.29,204.8 0.36,0.36 0 0 1 8,204.66 0.49,0.49 0 0 1 7.88,204.34 0.39,0.39 0 0 1 8.09,203.98 l 1.07,-0.65 a 0.92,0.92 0 0 1 0.48,-0.14 0.49,0.49 0 0 1 0.51,0.52 v 3.45 h 0.63 q 0.5,0 0.5,0.42 z" /></g><path
inkscape:connector-curvature="0"
id="path1773"
style="fill:#fff7d4;fill-opacity:1"
d="m 108.8,207.58 c 0,0.29 -0.17,0.43 -0.5,0.43 H 106 q -0.5,0 -0.5,-0.43 0,-0.43 0.5,-0.42 h 0.63 v -2.78 l -0.6,0.36 a 0.39,0.39 0 0 1 -0.2,0.06 0.36,0.36 0 0 1 -0.29,-0.14 0.49,0.49 0 0 1 -0.12,-0.32 0.39,0.39 0 0 1 0.21,-0.36 l 1.07,-0.65 a 0.92,0.92 0 0 1 0.48,-0.14 0.48,0.48 0 0 1 0.51,0.52 v 3.45 h 0.63 c 0.31,0 0.48,0.14 0.48,0.42 z" /></g><g
style="fill:#fff7d4;fill-opacity:1"
transform="translate(-166.78045,127.9574)"
id="g135"><path
inkscape:connector-curvature="0"
d="M 18.55,31.13 A 0.73,0.73 0 0 1 18.28,31.7 0.91,0.91 0 0 1 17.66,31.93 0.81,0.81 0 0 1 17.23,31.8 0.79,0.79 0 0 1 16.92,31.42 L 16.28,30 h -4.07 l -0.64,1.42 a 0.81,0.81 0 0 1 -0.31,0.38 0.8,0.8 0 0 1 -0.44,0.13 0.94,0.94 0 0 1 -0.62,-0.23 0.72,0.72 0 0 1 -0.28,-0.57 1,1 0 0 1 0.1,-0.38 l 3.24,-6.8 a 0.94,0.94 0 0 1 0.4,-0.44 1.14,1.14 0 0 1 1.14,0 1.06,1.06 0 0 1 0.41,0.43 l 3.24,6.8 a 1,1 0 0 1 0.1,0.39 z m -5.7,-2.53 h 2.8 l -1.39,-3.12 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path119" /><path
inkscape:connector-curvature="0"
d="m 23.3,30.81 a 0.67,0.67 0 0 1 -0.11,1 1.28,1.28 0 0 1 -0.79,0.14 h -0.34 a 2,2 0 0 1 -2.1,-2.2 v -2.41 h -0.48 a 0.9,0.9 0 0 1 -0.6,-0.17 0.62,0.62 0 0 1 -0.2,-0.5 0.63,0.63 0 0 1 0.2,-0.51 0.9,0.9 0 0 1 0.6,-0.17 H 20 v -0.94 a 0.81,0.81 0 0 1 0.25,-0.62 0.94,0.94 0 0 1 0.67,-0.23 0.92,0.92 0 0 1 0.66,0.23 0.82,0.82 0 0 1 0.24,0.62 V 26 h 0.84 q 0.82,0 0.82,0.68 a 0.62,0.62 0 0 1 -0.2,0.5 0.92,0.92 0 0 1 -0.61,0.17 h -0.84 v 2.51 a 0.79,0.79 0 0 0 0.17,0.55 0.7,0.7 0 0 0 0.49,0.21 h 0.34 a 0.85,0.85 0 0 1 0.47,0.19 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path121" /><path
inkscape:connector-curvature="0"
d="m 31.62,23.62 a 0.93,0.93 0 0 1 0.25,0.67 V 31 A 0.94,0.94 0 0 1 31.62,31.68 0.85,0.85 0 0 1 31,32 0.86,0.86 0 0 1 30.3,31.69 l -4,-5.15 V 31 A 1,1 0 0 1 26.07,31.68 0.81,0.81 0 0 1 25.44,31.94 0.83,0.83 0 0 1 24.8,31.68 1,1 0 0 1 24.56,31 v -6.72 a 0.93,0.93 0 0 1 0.25,-0.67 0.85,0.85 0 0 1 0.64,-0.26 0.81,0.81 0 0 1 0.68,0.31 l 4,5.11 v -4.5 a 0.94,0.94 0 0 1 0.24,-0.67 0.81,0.81 0 0 1 0.62,-0.26 0.85,0.85 0 0 1 0.63,0.28 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path123" /><path
inkscape:connector-curvature="0"
d="m 39.07,26.1 a 0.81,0.81 0 0 1 0.25,0.62 v 4.4 a 0.76,0.76 0 0 1 -0.26,0.6 1,1 0 0 1 -0.67,0.23 0.85,0.85 0 0 1 -0.61,-0.22 0.76,0.76 0 0 1 -0.23,-0.58 V 31 a 1.86,1.86 0 0 1 -0.73,0.7 2.43,2.43 0 0 1 -2.68,-0.38 2.75,2.75 0 0 1 -0.55,-1.87 v -2.73 a 0.81,0.81 0 0 1 0.25,-0.62 0.94,0.94 0 0 1 0.67,-0.23 0.92,0.92 0 0 1 0.66,0.23 0.82,0.82 0 0 1 0.24,0.62 v 2.81 a 1.16,1.16 0 0 0 0.22,0.78 0.86,0.86 0 0 0 0.68,0.25 1.11,1.11 0 0 0 0.86,-0.36 1.35,1.35 0 0 0 0.33,-0.95 v -2.53 a 0.82,0.82 0 0 1 0.24,-0.62 0.92,0.92 0 0 1 0.66,-0.23 0.94,0.94 0 0 1 0.67,0.23 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path125" /><path
inkscape:connector-curvature="0"
d="m 47.52,23.48 a 0.85,0.85 0 0 1 0.46,-0.13 1,1 0 0 1 0.65,0.24 0.74,0.74 0 0 1 0.29,0.59 0.85,0.85 0 0 1 -0.08,0.36 l -3.24,6.84 a 0.94,0.94 0 0 1 -0.4,0.43 1.18,1.18 0 0 1 -1.15,0 0.94,0.94 0 0 1 -0.4,-0.43 l -3.24,-6.84 a 0.77,0.77 0 0 1 -0.08,-0.35 0.74,0.74 0 0 1 0.3,-0.6 1,1 0 0 1 0.67,-0.24 0.88,0.88 0 0 1 0.46,0.13 0.79,0.79 0 0 1 0.32,0.38 l 2.57,5.62 2.57,-5.62 a 0.8,0.8 0 0 1 0.3,-0.38 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path127" /><path
inkscape:connector-curvature="0"
d="m 53.29,26 a 0.71,0.71 0 0 1 0.21,0.56 0.8,0.8 0 0 1 -0.19,0.59 1.12,1.12 0 0 1 -0.68,0.24 h -0.36 a 1.37,1.37 0 0 0 -1,0.43 1.42,1.42 0 0 0 -0.29,0.92 v 2.36 a 0.78,0.78 0 0 1 -0.26,0.64 1,1 0 0 1 -0.64,0.22 1,1 0 0 1 -0.65,-0.22 0.78,0.78 0 0 1 -0.26,-0.64 v -4.4 a 0.75,0.75 0 0 1 0.26,-0.61 1,1 0 0 1 0.64,-0.22 0.88,0.88 0 0 1 0.6,0.21 0.73,0.73 0 0 1 0.24,0.58 V 27 a 1.67,1.67 0 0 1 0.65,-0.79 2,2 0 0 1 1,-0.31 h 0.17 a 0.75,0.75 0 0 1 0.56,0.1 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path129" /><path
inkscape:connector-curvature="0"
d="m 56.62,31.69 a 0.89,0.89 0 0 1 -0.26,-0.67 v -6.08 h -1.95 q -0.89,0 -0.89,-0.77 0,-0.77 0.89,-0.76 h 5.76 q 0.89,0 0.89,0.76 0,0.76 -0.89,0.77 H 58.23 V 31 a 0.91,0.91 0 0 1 -0.25,0.67 1,1 0 0 1 -1.36,0 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path131" /><path
inkscape:connector-curvature="0"
d="m 65.09,26 a 0.71,0.71 0 0 1 0.21,0.56 0.8,0.8 0 0 1 -0.19,0.59 1.12,1.12 0 0 1 -0.68,0.24 h -0.36 a 1.37,1.37 0 0 0 -1,0.43 1.42,1.42 0 0 0 -0.29,0.92 V 31.1 A 0.78,0.78 0 0 1 62.52,31.74 1,1 0 0 1 61.88,31.96 1,1 0 0 1 61.23,31.74 0.78,0.78 0 0 1 61,31.1 v -4.4 a 0.75,0.75 0 0 1 0.26,-0.61 1,1 0 0 1 0.64,-0.22 0.88,0.88 0 0 1 0.6,0.21 0.73,0.73 0 0 1 0.24,0.58 V 27 a 1.67,1.67 0 0 1 0.65,-0.79 2,2 0 0 1 1,-0.31 h 0.17 a 0.75,0.75 0 0 1 0.53,0.1 z"
transform="translate(204.6)"
style="fill:#fff7d4"
id="path133" /></g></g></svg>

+ 702
- 0
vst2_bin/plugins/AS/res/BPMCalc.svg View File

@@ -0,0 +1,702 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->

<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg4541"
x="0px"
y="0px"
viewBox="0 0 300 380"
xml:space="preserve"
sodipodi:docname="BPMCalc.svg"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
width="300"
height="380"><metadata
id="metadata61"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>BPMCalc</dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs59" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1922"
inkscape:window-height="1380"
id="namedview57"
showgrid="false"
inkscape:zoom="3.0341834"
inkscape:cx="96.491764"
inkscape:cy="202.49872"
inkscape:window-x="187"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg4541" /><style
type="text/css"
id="style2">
.st0{fill:#44423E;}
.st1{fill:#3C3835;}
.st2{fill:#141414;}
.st3{fill:#FFF7D4;}
.st4{fill:#141414;stroke:#000000;stroke-width:0.75;stroke-miterlimit:10;}
</style><title
id="title4">BPMCalc</title><polygon
class="st0"
points="0,297.8 0,380 150,380 150,293 150,291.5 150,287.6 150,286.2 150,272.4 150,31.8 150,31.5 150,30 150,26.1 150,24.7 150,16.5 150,0 0,0 0,24.7 0,26.1 0,30 0,31.8 0,286.2 0,287.6 0,291.5 0,293 "
id="polygon6"
style="fill:#44423e;fill-opacity:1"
transform="scale(2,1)" /><g
id="g1661"
style="fill:#3c3835;fill-opacity:1"
transform="translate(29.999957)"><g
id="g1659"
style="fill:#3c3835;fill-opacity:1"><path
id="path1657"
class="st1"
d="m 164.9,161.8 c -0.5,-1.8 -1.7,-3.3 -3.2,-4.2 -1.5,-1 -3.4,-1.3 -5.1,-0.8 -1.8,0.5 -3.3,1.7 -4.2,3.2 -7.8,14 -16.7,27.5 -26.4,40.3 -8.2,-16.1 -13.7,-33.3 -16.5,-51.2 V 146 l 15.9,-22.3 c 1.9,-2.7 10,-12.4 -6.2,-19.4 -6.1,-2.2 -12.8,-2 -18.7,0.6 -18.4,7.9 -15.2,33.8 -14.7,38 0,1.7 0.2,3.3 0.7,4.9 l -30,49.3 c 0,0 3.9,-25.9 4.6,-30.5 1.2,-5.8 -2.6,-11.5 -8.5,-12.7 0,0 0,0 0,0 l -0.4,-0.1 c -7.9,-1.9 -12.8,0.5 -18,21 -4.4,17.4 -20.1,60.6 -30.6,60.3 -6.2,0 -1.9,-27 5.4,-46.6 8.9,-23.4 30,-55.5 53.8,-70 5.5,-3.4 12.7,-11.9 5.2,-20.3 -9.4,-10.6 -19.5,-2.2 -23.8,1 -11.3,9.6 -20.7,21.3 -27.7,34.5 -9.9,15.6 -17.4,32.5 -22.3,50.3 -7.9,25.8 -16.4,67.7 0.8,69.3 23.8,2.1 42.7,-44.1 42.7,-44.1 0,0 -1,24.2 11.1,24.8 12.1,0.6 35.8,-46.8 42.5,-62.8 4.6,15.5 11.2,30.3 19.8,44 0.4,1 0.8,2 1.1,3.1 -2.7,3.7 -29.9,38.5 -37.8,59.5 -0.9,1.8 -0.9,3.9 0,5.7 0.8,1.6 2.2,2.9 4,3.3 2,0.4 4.1,0 5.9,-1 1.8,-0.8 3.6,-1.7 5.2,-2.8 38.3,-22 43.8,-47.6 41,-67.2 0.6,-1.1 1.3,-2.2 2.1,-3.2 11.5,-14.4 21.8,-29.7 30.9,-45.8 1.2,-1.3 1.8,-3.2 1.4,-5 z"
style="fill:#3c3835;fill-opacity:1"
inkscape:connector-curvature="0" /></g></g><rect
id="rect1806"
class="st1"
width="300"
height="15"
style="fill:#3c3835;fill-opacity:1;stroke-width:1.2247448"
x="0"
y="0" /><rect
id="rect1982"
y="365"
class="st1"
width="300"
height="15"
style="fill:#3c3835;fill-opacity:1;stroke-width:1.2247448"
x="0" /><g
id="g1553"><path
style="fill:#141414"
inkscape:connector-curvature="0"
d="m 18.5,2.8 h 8.4 c 2.8,-0.1 5.1,2 5.3,4.7 v 0 c -0.2,2.8 -2.5,4.9 -5.3,4.7 h -8.4 c -2.8,0.1 -5.1,-2 -5.3,-4.7 v 0 c 0.2,-2.7 2.6,-4.8 5.3,-4.7 z"
class="st2"
id="rect861" /><path
style="fill:#141414"
inkscape:connector-curvature="0"
d="m 18.5,368.3 h 8.4 c 2.8,-0.1 5.1,2 5.3,4.7 v 0 c -0.2,2.8 -2.5,4.9 -5.3,4.7 h -8.4 c -2.8,0.2 -5.1,-2 -5.3,-4.7 0,0 0,0 0,0 v 0 c 0.2,-2.8 2.5,-4.9 5.3,-4.7 0,0 0,0 0,0 z"
class="st2"
id="rect863" /></g><circle
id="path1686"
class="st1"
cx="150"
cy="359.89999"
r="15.1"
style="fill:#3c3835;fill-opacity:1" /><g
id="Layer_2-2"
transform="translate(74.944853)"><path
style="fill:#fff7d4;fill-opacity:1"
inkscape:connector-curvature="0"
d="m 82.6,356.8 c 0,-0.1 -0.1,-0.3 -0.3,-0.4 -0.1,-0.1 -0.3,-0.1 -0.4,-0.1 -0.1,0 -0.3,0.1 -0.3,0.3 -0.7,1.2 -1.4,2.3 -2.2,3.4 -0.7,-1.4 -1.2,-2.8 -1.4,-4.3 v -0.3 l 1.3,-1.9 c 0.2,-0.2 0.8,-1 -0.5,-1.6 -0.5,-0.2 -1.1,-0.2 -1.6,0 -1.6,0.7 -1.3,2.8 -1.2,3.2 0,0.1 0,0.3 0.1,0.4 l -2.5,4.1 0.4,-2.6 c 0.1,-0.5 -0.2,-1 -0.7,-1.1 v 0 c -0.7,-0.2 -1.1,0 -1.5,1.8 -0.4,1.5 -1.7,5.1 -2.6,5.1 -0.5,0 -0.2,-2.3 0.4,-3.9 0.9,-2.3 2.5,-4.4 4.5,-5.8 0.5,-0.3 1.1,-1 0.4,-1.7 -0.8,-0.9 -1.6,-0.2 -2,0.1 -1,0.8 -1.7,1.8 -2.3,2.9 -0.8,1.3 -1.5,2.7 -1.9,4.2 -0.7,2.2 -1.4,5.7 0.1,5.8 2,0.2 3.6,-3.7 3.6,-3.7 0,0 -0.1,2 0.9,2.1 1,0.1 3,-3.9 3.6,-5.3 0.4,1.3 0.9,2.5 1.7,3.7 0,0.1 0.1,0.2 0.1,0.3 -1.2,1.5 -2.3,3.2 -3.2,5 -0.1,0.2 -0.1,0.3 0,0.5 0.1,0.1 0.2,0.2 0.3,0.3 0.2,0 0.3,0 0.5,-0.1 0.2,-0.1 0.3,-0.1 0.4,-0.2 3.2,-1.9 3.7,-4 3.4,-5.6 0,-0.1 0.1,-0.2 0.2,-0.3 1,-1.2 1.8,-2.5 2.6,-3.8 0.1,-0.2 0.1,-0.4 0.1,-0.5 z"
class="st3"
id="path8-4-6" /></g><g
id="g1986"
transform="translate(150)"><path
id="path1191"
class="st2"
d="m 122.2,2.8 c -2.8,-0.1 -5.1,2 -5.2,4.7 0.2,2.8 2.5,4.9 5.3,4.7 h 8.4 c 2.8,0.1 5.1,-2 5.3,-4.7 -0.2,-2.8 -2.5,-4.9 -5.3,-4.7 z"
inkscape:connector-curvature="0"
style="fill:#141414" /><path
id="rect865"
class="st2"
d="m 122.2,368.3 c -2.6,-0.3 -4.9,1.6 -5.2,4.2 -0.3,2.6 1.6,4.9 4.2,5.2 0.3,0 0.6,0 1,0 h 8.4 c 2.6,0.3 4.9,-1.6 5.2,-4.2 0.3,-2.6 -1.6,-4.9 -4.2,-5.2 -0.3,0 -0.6,0 -1,0 z"
inkscape:connector-curvature="0"
style="fill:#141414" /></g><g
id="g901"
transform="translate(29.55,-9.55)"><path
class="st3"
d="m 26.7,40.9 c 0.3,0.4 0.4,0.8 0.4,1.3 0,0.7 -0.3,1.3 -0.8,1.7 -0.5,0.4 -1.2,0.6 -2.2,0.6 H 21 c -0.3,0 -0.5,-0.1 -0.6,-0.2 -0.1,-0.1 -0.2,-0.4 -0.2,-0.6 V 37 c 0,-0.3 0.1,-0.5 0.2,-0.6 0.1,-0.1 0.4,-0.2 0.6,-0.2 h 3 c 0.9,0 1.6,0.2 2.1,0.6 0.5,0.4 0.8,0.9 0.8,1.6 0,0.4 -0.1,0.8 -0.4,1.2 -0.3,0.4 -0.6,0.6 -1,0.7 0.5,0 0.9,0.2 1.2,0.6 z m -4.8,-1.4 h 1.8 c 0.5,0 0.8,-0.1 1.1,-0.2 0.2,-0.2 0.3,-0.4 0.3,-0.8 0,-0.4 -0.1,-0.6 -0.3,-0.8 -0.2,-0.2 -0.6,-0.2 -1.1,-0.2 h -1.8 z m 3.1,3.3 c 0.2,-0.2 0.3,-0.4 0.3,-0.8 0,-0.4 -0.1,-0.7 -0.3,-0.8 -0.2,-0.2 -0.6,-0.3 -1.1,-0.3 h -2 v 2.2 h 2 c 0.5,0 0.9,-0.1 1.1,-0.3 z"
id="path24"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="m 28.9,44.3 c -0.2,-0.2 -0.3,-0.4 -0.3,-0.7 v -6.7 c 0,-0.3 0.1,-0.5 0.2,-0.6 0.1,-0.1 0.4,-0.2 0.6,-0.2 h 3 c 0.9,0 1.6,0.2 2.1,0.7 0.5,0.5 0.8,1.1 0.8,1.9 0,0.8 -0.3,1.5 -0.8,1.9 -0.5,0.5 -1.2,0.7 -2.1,0.7 h -2 v 2.3 c 0,0.3 -0.1,0.5 -0.3,0.7 -0.2,0.2 -0.4,0.3 -0.7,0.3 -0.3,0 -0.4,-0.1 -0.5,-0.3 z m 3.4,-4.4 c 0.9,0 1.4,-0.4 1.4,-1.2 0,-0.8 -0.5,-1.2 -1.4,-1.2 h -1.8 v 2.4 z"
id="path26"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="m 45,36.3 c 0.2,0.2 0.2,0.4 0.2,0.7 v 6.8 c 0,0.3 -0.1,0.5 -0.2,0.6 -0.2,0.2 -0.4,0.2 -0.6,0.2 -0.2,0 -0.4,-0.1 -0.6,-0.2 -0.2,-0.2 -0.2,-0.4 -0.2,-0.6 v -4.2 l -1.7,3.2 c -0.1,0.2 -0.2,0.4 -0.4,0.5 -0.1,0.1 -0.3,0.1 -0.5,0.1 -0.2,0 -0.3,0 -0.5,-0.1 -0.1,-0.1 -0.3,-0.2 -0.4,-0.5 l -1.7,-3.1 v 4.2 c 0,0.3 -0.1,0.5 -0.2,0.6 -0.2,0.2 -0.4,0.2 -0.6,0.2 -0.2,0 -0.4,-0.1 -0.6,-0.2 -0.2,-0.2 -0.2,-0.4 -0.2,-0.6 v -6.8 c 0,-0.3 0.1,-0.5 0.2,-0.7 0.2,-0.2 0.4,-0.3 0.6,-0.3 0.4,0 0.7,0.2 0.9,0.6 l 2.4,4.6 2.4,-4.6 c 0.2,-0.4 0.5,-0.6 0.9,-0.6 0.4,-0.1 0.6,0 0.8,0.2 z"
id="path28"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="M 51,44.3 C 50.8,44.1 50.8,43.9 50.8,43.7 V 37 c 0,-0.3 0.1,-0.5 0.2,-0.6 0.1,-0.1 0.4,-0.2 0.6,-0.2 H 54 c 0.9,0 1.7,0.2 2.4,0.5 0.7,0.3 1.2,0.8 1.5,1.5 0.3,0.7 0.5,1.4 0.5,2.3 0,0.9 -0.2,1.6 -0.5,2.3 -0.3,0.6 -0.9,1.1 -1.5,1.5 -0.6,0.4 -1.5,0.5 -2.4,0.5 H 51.6 C 51.4,44.5 51.2,44.4 51,44.3 Z M 53.9,43 c 1.8,0 2.7,-0.9 2.7,-2.7 0,-1.8 -0.9,-2.7 -2.7,-2.7 H 52.6 V 43 Z"
id="path30"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="m 65.2,43 c 0.1,0.1 0.1,0.3 0.1,0.5 0,0.1 0,0.3 -0.1,0.4 -0.1,0.1 -0.2,0.2 -0.3,0.3 -0.3,0.1 -0.6,0.3 -0.9,0.4 -0.3,0.1 -0.7,0.1 -1,0.1 -0.6,0 -1.2,-0.1 -1.7,-0.4 -0.5,-0.2 -0.8,-0.6 -1.1,-1.1 -0.3,-0.5 -0.4,-1 -0.4,-1.6 0,-0.6 0.1,-1.1 0.4,-1.6 0.2,-0.5 0.6,-0.8 1,-1.1 0.4,-0.3 0.9,-0.4 1.5,-0.4 0.5,0 1,0.1 1.4,0.4 0.4,0.2 0.7,0.6 0.9,1 0.2,0.4 0.3,0.9 0.3,1.5 0,0.2 0,0.3 -0.1,0.4 -0.1,0.1 -0.2,0.1 -0.4,0.1 h -3.4 c 0.1,0.5 0.2,0.8 0.4,1 0.2,0.2 0.6,0.3 1,0.3 0.2,0 0.4,0 0.6,-0.1 0.2,-0.1 0.4,-0.1 0.6,-0.2 0.1,0 0.2,-0.1 0.3,-0.1 0.1,0 0.2,-0.1 0.3,-0.1 0.3,0.1 0.5,0.1 0.6,0.3 z m -3.3,-2.9 c -0.2,0.2 -0.3,0.5 -0.4,1 h 2.3 c 0,-0.4 -0.1,-0.7 -0.3,-1 -0.2,-0.2 -0.5,-0.3 -0.8,-0.3 -0.3,-0.1 -0.6,0 -0.8,0.3 z"
id="path32"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="M 66.9,44.4 C 66.7,44.3 66.6,44 66.6,43.8 v -6.9 c 0,-0.3 0.1,-0.5 0.3,-0.6 0.2,-0.1 0.4,-0.2 0.7,-0.2 0.3,0 0.5,0.1 0.6,0.2 0.2,0.1 0.3,0.4 0.3,0.6 v 6.9 c 0,0.3 -0.1,0.5 -0.3,0.6 -0.2,0.1 -0.4,0.2 -0.6,0.2 -0.3,0 -0.5,-0.1 -0.7,-0.2 z"
id="path34"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="m 74.7,39.1 c 0.4,0.4 0.6,1.1 0.6,1.9 v 2.7 c 0,0.3 -0.1,0.5 -0.2,0.6 -0.2,0.1 -0.4,0.2 -0.6,0.2 -0.3,0 -0.5,-0.1 -0.6,-0.2 -0.2,-0.2 -0.2,-0.4 -0.2,-0.6 v -0.1 c -0.1,0.3 -0.3,0.5 -0.6,0.7 -0.3,0.2 -0.6,0.3 -1,0.3 -0.4,0 -0.8,-0.1 -1.1,-0.2 -0.3,-0.2 -0.6,-0.4 -0.8,-0.7 -0.2,-0.3 -0.3,-0.6 -0.3,-1 0,-0.4 0.1,-0.8 0.3,-1 0.2,-0.2 0.6,-0.4 1.1,-0.5 0.5,-0.1 1.2,-0.2 2,-0.2 h 0.3 v -0.2 c 0,-0.3 -0.1,-0.6 -0.2,-0.7 -0.1,-0.2 -0.4,-0.2 -0.7,-0.2 -0.3,0 -0.8,0.1 -1.5,0.4 -0.2,0.1 -0.3,0.1 -0.5,0.1 -0.2,0 -0.3,-0.1 -0.4,-0.2 -0.1,-0.1 -0.2,-0.3 -0.2,-0.5 0,-0.2 0,-0.3 0.1,-0.4 0.1,-0.1 0.2,-0.2 0.3,-0.3 0.3,-0.2 0.6,-0.3 1,-0.4 0.4,-0.1 0.8,-0.1 1.2,-0.1 0.9,0 1.6,0.2 2,0.6 z M 73.3,43 c 0.2,-0.2 0.3,-0.5 0.3,-0.9 v -0.2 h -0.2 c -0.6,0 -1.1,0.1 -1.4,0.2 -0.3,0.1 -0.4,0.3 -0.4,0.6 0,0.2 0.1,0.4 0.2,0.5 0.1,0.1 0.3,0.2 0.6,0.2 0.4,0 0.7,-0.2 0.9,-0.4 z"
id="path36"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="m 81.2,38.7 c 0.1,-0.1 0.3,-0.1 0.4,-0.1 0.2,0 0.4,0.1 0.6,0.2 0.2,0.1 0.3,0.3 0.3,0.5 0,0.1 0,0.2 -0.1,0.3 l -3.2,6.6 c -0.1,0.2 -0.2,0.3 -0.3,0.4 -0.1,0.1 -0.3,0.1 -0.4,0.1 -0.2,0 -0.4,-0.1 -0.6,-0.2 -0.2,-0.1 -0.3,-0.3 -0.3,-0.5 0,-0.1 0,-0.2 0.1,-0.4 L 78.5,44 76.4,39.6 c 0,-0.1 -0.1,-0.2 -0.1,-0.3 0,-0.2 0.1,-0.4 0.3,-0.6 0.2,-0.2 0.4,-0.2 0.6,-0.2 0.2,0 0.3,0 0.4,0.1 0.1,0.1 0.2,0.2 0.3,0.4 l 1.5,3.2 1.5,-3.2 c 0.1,-0.1 0.2,-0.3 0.3,-0.3 z"
id="path38"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="m 83.6,45.3 c -0.1,0.1 -0.3,0.1 -0.4,0.1 -0.2,0 -0.3,-0.1 -0.5,-0.2 -0.1,-0.1 -0.2,-0.3 -0.2,-0.5 0,-0.1 0,-0.2 0,-0.3 l 2.7,-8.6 c 0.1,-0.2 0.1,-0.3 0.3,-0.4 0.2,-0.1 0.3,-0.1 0.4,-0.1 0.2,0 0.4,0.1 0.5,0.2 0.1,0.1 0.2,0.3 0.2,0.5 0,0.1 0,0.2 0,0.3 l -2.8,8.6 c 0.1,0.2 0,0.3 -0.2,0.4 z"
id="path40"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="m 95,36.3 c 0.2,0.2 0.3,0.4 0.3,0.7 v 6.7 c 0,0.3 -0.1,0.5 -0.3,0.7 -0.2,0.2 -0.4,0.3 -0.7,0.3 -0.3,0 -0.5,-0.1 -0.7,-0.3 C 93.4,44.2 93.4,44 93.4,43.7 V 41 h -3.9 v 2.7 c 0,0.3 -0.1,0.5 -0.3,0.7 -0.2,0.2 -0.4,0.3 -0.7,0.3 -0.3,0 -0.5,-0.1 -0.7,-0.3 C 87.6,44.2 87.5,44 87.5,43.7 V 37 c 0,-0.3 0.1,-0.5 0.3,-0.7 0.2,-0.2 0.4,-0.3 0.7,-0.3 0.3,0 0.5,0.1 0.7,0.3 0.2,0.2 0.2,0.4 0.2,0.7 v 2.6 h 3.9 V 37 c 0,-0.3 0.1,-0.5 0.2,-0.7 0.1,-0.2 0.5,-0.3 0.8,-0.3 0.3,0 0.5,0.1 0.7,0.3 z"
id="path42"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="m 102.3,43.8 c 0,0.4 -0.3,0.7 -0.8,0.7 h -3.9 c -0.2,0 -0.4,-0.1 -0.6,-0.2 -0.2,-0.2 -0.2,-0.3 -0.2,-0.5 0,-0.2 0.1,-0.4 0.3,-0.6 l 2.8,-3.1 h -2.3 c -0.5,0 -0.8,-0.2 -0.8,-0.7 0,-0.5 0.3,-0.7 0.8,-0.7 h 3.7 c 0.2,0 0.4,0.1 0.6,0.2 0.1,0.2 0.2,0.3 0.2,0.6 0,0.2 -0.1,0.4 -0.3,0.6 L 99,43.2 h 2.4 c 0.6,0 0.9,0.2 0.9,0.6 z"
id="path44"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="m 108.9,44.1 c -0.6,-0.4 -1.1,-0.9 -1.4,-1.5 -0.3,-0.7 -0.5,-1.4 -0.5,-2.3 0,-0.9 0.2,-1.6 0.5,-2.3 0.3,-0.7 0.8,-1.2 1.4,-1.5 0.6,-0.3 1.4,-0.5 2.2,-0.5 1,0 2,0.3 2.7,0.9 0.1,0.1 0.2,0.2 0.3,0.3 0.1,0.1 0.1,0.2 0.1,0.4 0,0.2 -0.1,0.4 -0.2,0.5 -0.1,0.1 -0.3,0.2 -0.4,0.2 -0.1,0 -0.2,0 -0.3,0 -0.1,0 -0.2,-0.1 -0.3,-0.2 -0.3,-0.2 -0.6,-0.4 -0.9,-0.4 -0.3,-0.1 -0.6,-0.1 -0.9,-0.1 -0.8,0 -1.3,0.2 -1.7,0.7 -0.4,0.5 -0.6,1.2 -0.6,2.1 0,1.9 0.8,2.9 2.3,2.9 0.3,0 0.6,0 0.8,-0.1 0.3,-0.1 0.6,-0.2 0.9,-0.4 0.1,-0.1 0.2,-0.1 0.3,-0.2 0.1,0 0.2,0 0.3,0 0.2,0 0.3,0.1 0.4,0.2 0.1,0.1 0.2,0.3 0.2,0.5 0,0.1 0,0.3 -0.1,0.4 -0.1,0.1 -0.1,0.2 -0.2,0.3 -0.8,0.6 -1.7,0.9 -2.7,0.9 -0.9,-0.3 -1.6,-0.4 -2.2,-0.8 z"
id="path46"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="m 119.8,39.1 c 0.4,0.4 0.6,1.1 0.6,1.9 v 2.7 c 0,0.3 -0.1,0.5 -0.2,0.6 -0.2,0.1 -0.4,0.2 -0.6,0.2 -0.3,0 -0.5,-0.1 -0.6,-0.2 -0.2,-0.2 -0.2,-0.4 -0.2,-0.6 v -0.1 c -0.1,0.3 -0.3,0.5 -0.6,0.7 -0.3,0.2 -0.6,0.3 -1,0.3 -0.4,0 -0.8,-0.1 -1.1,-0.2 -0.3,-0.2 -0.6,-0.4 -0.8,-0.7 -0.2,-0.3 -0.3,-0.6 -0.3,-1 0,-0.4 0.1,-0.8 0.3,-1 0.2,-0.2 0.6,-0.4 1.1,-0.5 0.5,-0.1 1.2,-0.2 2,-0.2 h 0.3 v -0.2 c 0,-0.3 -0.1,-0.6 -0.2,-0.7 -0.1,-0.2 -0.4,-0.2 -0.7,-0.2 -0.3,0 -0.8,0.1 -1.5,0.4 -0.2,0.1 -0.3,0.1 -0.5,0.1 -0.2,0 -0.3,-0.1 -0.4,-0.2 -0.1,-0.1 -0.2,-0.3 -0.2,-0.5 0,-0.2 0,-0.3 0.1,-0.4 0.1,-0.1 0.2,-0.2 0.3,-0.3 0.3,-0.2 0.6,-0.3 1,-0.4 0.4,-0.1 0.8,-0.1 1.2,-0.1 1,0 1.6,0.2 2,0.6 z m -1.4,3.9 c 0.2,-0.2 0.3,-0.5 0.3,-0.9 v -0.2 h -0.2 c -0.6,0 -1.1,0.1 -1.4,0.2 -0.3,0.1 -0.4,0.3 -0.4,0.6 0,0.2 0.1,0.4 0.2,0.5 0.1,0.1 0.3,0.2 0.6,0.2 0.4,0 0.7,-0.2 0.9,-0.4 z"
id="path48"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="M 122.3,44.4 C 122.1,44.3 122,44 122,43.8 v -6.9 c 0,-0.3 0.1,-0.5 0.3,-0.6 0.2,-0.1 0.4,-0.2 0.7,-0.2 0.3,0 0.5,0.1 0.6,0.2 0.2,0.1 0.3,0.4 0.3,0.6 v 6.9 c 0,0.3 -0.1,0.5 -0.3,0.6 -0.2,0.1 -0.4,0.2 -0.6,0.2 -0.3,0 -0.5,-0.1 -0.7,-0.2 z"
id="path50"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /><path
class="st3"
d="m 126.6,44.2 c -0.5,-0.2 -0.8,-0.6 -1,-1.1 -0.2,-0.5 -0.4,-1 -0.4,-1.6 0,-0.6 0.1,-1.2 0.4,-1.6 0.3,-0.5 0.6,-0.8 1.1,-1.1 0.5,-0.3 1,-0.4 1.6,-0.4 0.3,0 0.6,0 1,0.1 0.4,0.1 0.6,0.2 0.9,0.4 0.2,0.2 0.4,0.4 0.4,0.7 0,0.2 0,0.4 -0.1,0.5 -0.1,0.1 -0.2,0.2 -0.4,0.2 -0.1,0 -0.2,0 -0.3,-0.1 -0.1,-0.1 -0.2,-0.1 -0.4,-0.2 -0.2,-0.1 -0.3,-0.2 -0.4,-0.2 -0.1,0 -0.3,-0.1 -0.5,-0.1 -0.4,0 -0.8,0.1 -1,0.4 -0.2,0.3 -0.4,0.7 -0.4,1.2 0,0.5 0.1,1 0.4,1.2 0.3,0.2 0.6,0.4 1,0.4 0.2,0 0.3,0 0.4,-0.1 0.1,-0.1 0.3,-0.1 0.5,-0.2 0.2,-0.1 0.3,-0.1 0.4,-0.2 0.1,0 0.2,-0.1 0.3,-0.1 0.2,0 0.3,0.1 0.4,0.2 0.1,0.1 0.2,0.3 0.2,0.5 0,0.3 -0.1,0.5 -0.4,0.7 -0.3,0.2 -0.6,0.3 -0.9,0.4 -0.3,0.1 -0.7,0.1 -1.1,0.1 -0.7,0.4 -1.2,0.3 -1.7,0 z"
id="path52"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" /></g><g
style="display:inline"
id="g938"
transform="matrix(0.56228326,0,0,0.56228326,-52.085636,-11.020274)"><path
id="path922"
style="fill:#fff8d5"
transform="translate(319.8,113.4)"
d="m 21.14,21.46 a 2.12,2.12 0 0 1 0.4,1.31 2,2 0 0 1 -0.79,1.69 3.4,3.4 0 0 1 -2.17,0.62 H 15.45 A 0.79,0.79 0 0 1 14.57,24.2 v -6.69 a 0.79,0.79 0 0 1 0.88,-0.88 h 3 a 3.38,3.38 0 0 1 2.09,0.59 1.91,1.91 0 0 1 0.77,1.61 A 2,2 0 0 1 21,20 a 2,2 0 0 1 -1,0.73 2.12,2.12 0 0 1 1.14,0.73 z M 16.4,20.08 h 1.76 a 1.83,1.83 0 0 0 1.06,-0.25 0.86,0.86 0 0 0 0.34,-0.75 0.89,0.89 0 0 0 -0.34,-0.77 1.84,1.84 0 0 0 -1.06,-0.25 H 16.4 Z m 3.06,3.34 A 1,1 0 0 0 19.8,22.6 1,1 0 0 0 19.46,21.77 1.76,1.76 0 0 0 18.38,21.51 h -2 v 2.16 h 2 a 1.82,1.82 0 0 0 1.08,-0.26 z"
inkscape:connector-curvature="0" /><path
id="path924"
style="fill:#fff8d5"
transform="translate(319.8,113.4)"
d="m 23.33,24.91 a 0.92,0.92 0 0 1 -0.25,-0.68 v -6.72 a 0.79,0.79 0 0 1 0.88,-0.88 h 3 a 3.09,3.09 0 0 1 2.15,0.7 2.49,2.49 0 0 1 0.77,1.94 2.49,2.49 0 0 1 -0.77,1.94 3.09,3.09 0 0 1 -2.15,0.7 H 25 v 2.32 a 1,1 0 0 1 -1.62,0.68 z m 3.4,-4.42 q 1.4,0 1.4,-1.21 0,-1.21 -1.4,-1.22 H 25 v 2.44 z"
inkscape:connector-curvature="0" /><path
id="path926"
style="fill:#fff8d5"
transform="translate(319.8,113.4)"
d="m 39.49,16.83 a 0.93,0.93 0 0 1 0.25,0.67 v 6.82 a 0.84,0.84 0 0 1 -0.23,0.62 0.81,0.81 0 0 1 -0.6,0.23 0.8,0.8 0 0 1 -0.59,-0.23 0.84,0.84 0 0 1 -0.23,-0.62 v -4.24 l -1.7,3.2 a 1.34,1.34 0 0 1 -0.37,0.46 0.84,0.84 0 0 1 -0.94,0 1.3,1.3 0 0 1 -0.37,-0.46 L 33,20.14 v 4.18 a 0.85,0.85 0 0 1 -0.23,0.62 0.88,0.88 0 0 1 -1.19,0 0.84,0.84 0 0 1 -0.23,-0.62 V 17.5 a 0.93,0.93 0 0 1 0.25,-0.67 0.85,0.85 0 0 1 0.64,-0.26 1,1 0 0 1 0.88,0.61 L 35.56,21.8 38,17.18 a 1,1 0 0 1 0.86,-0.61 0.85,0.85 0 0 1 0.63,0.26 z"
inkscape:connector-curvature="0" /></g><rect
style="opacity:1;vector-effect:none;fill:#181414;fill-opacity:1;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect1555"
width="196"
height="236"
x="7"
y="103.625"
rx="6"
ry="6" /><g
aria-label="NOTE"
transform="translate(235.77148,24.571781)"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.66666698px;line-height:1.25;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold, ';letter-spacing:0px;word-spacing:0px;fill:#fff7d4;fill-opacity:1;stroke:none"
id="flowRoot1557"><path
d="m -206.65039,67.770558 2.23047,3.375 v -3.40625 q 0,-0.332031 0.14062,-0.496094 0.14453,-0.167968 0.38672,-0.167968 0.25,0 0.39453,0.167968 0.14453,0.164063 0.14453,0.496094 v 4.503906 q 0,0.753907 -0.625,0.753907 -0.15625,0 -0.28125,-0.04687 -0.125,-0.04297 -0.23437,-0.140625 -0.10938,-0.09766 -0.20313,-0.226563 -0.0937,-0.132812 -0.1875,-0.269531 l -2.17578,-3.335938 v 3.355469 q 0,0.328125 -0.15234,0.496094 -0.15234,0.167969 -0.39063,0.167969 -0.24609,0 -0.39453,-0.167969 -0.14843,-0.171875 -0.14843,-0.496094 v -4.417969 q 0,-0.28125 0.0625,-0.441406 0.0742,-0.175781 0.24609,-0.285156 0.17187,-0.113281 0.37109,-0.113281 0.15625,0 0.26563,0.05078 0.11328,0.05078 0.19531,0.136719 0.0859,0.08594 0.17188,0.222656 0.0898,0.136719 0.18359,0.285156 z"
style="font-size:8px;fill:#fff7d4;fill-opacity:1"
id="path1581"
inkscape:connector-curvature="0" /><path
d="m -199.56445,67.075246 q 0.89062,0 1.52734,0.363281 0.64063,0.359375 0.96875,1.027344 0.32813,0.664062 0.32813,1.5625 0,0.664062 -0.17969,1.207031 -0.17969,0.542969 -0.53906,0.941406 -0.35938,0.398438 -0.88282,0.609375 -0.52343,0.210938 -1.19922,0.210938 -0.67187,0 -1.20312,-0.214844 -0.53125,-0.21875 -0.88672,-0.613281 -0.35547,-0.394532 -0.53906,-0.949219 -0.17969,-0.554688 -0.17969,-1.199219 0,-0.660156 0.1875,-1.210937 0.19141,-0.550782 0.55078,-0.9375 0.35938,-0.386719 0.875,-0.589844 0.51563,-0.207031 1.17188,-0.207031 z m 1.64843,2.945312 q 0,-0.628906 -0.20312,-1.089844 -0.20313,-0.460937 -0.58203,-0.695312 -0.375,-0.238281 -0.86328,-0.238281 -0.34766,0 -0.64453,0.132812 -0.29297,0.128906 -0.50782,0.378906 -0.21093,0.25 -0.33593,0.640625 -0.1211,0.386719 -0.1211,0.871094 0,0.488281 0.1211,0.882813 0.125,0.394531 0.34765,0.65625 0.22656,0.257812 0.51563,0.386718 0.29297,0.128907 0.64062,0.128907 0.44531,0 0.81641,-0.222657 0.375,-0.222656 0.59375,-0.6875 0.22265,-0.464843 0.22265,-1.144531 z"
style="font-size:8px;fill:#fff7d4;fill-opacity:1"
id="path1583"
inkscape:connector-curvature="0" /><path
d="m -192.31055,68.129933 h -1.26562 v 4.160156 q 0,0.359375 -0.16016,0.535157 -0.16015,0.171875 -0.41406,0.171875 -0.25781,0 -0.42188,-0.175782 -0.16015,-0.175781 -0.16015,-0.53125 v -4.160156 h -1.26563 q -0.29687,0 -0.4414,-0.128906 -0.14453,-0.132813 -0.14453,-0.347656 0,-0.222657 0.14843,-0.351563 0.15235,-0.128906 0.4375,-0.128906 h 3.6875 q 0.30078,0 0.44532,0.132812 0.14843,0.132813 0.14843,0.347657 0,0.214843 -0.14843,0.347656 -0.14844,0.128906 -0.44532,0.128906 z"
style="font-size:8px;fill:#fff7d4;fill-opacity:1"
id="path1585"
inkscape:connector-curvature="0" /><path
d="m -187.24805,68.067433 h -2.61328 v 1.40625 h 2.40625 q 0.26563,0 0.39453,0.121094 0.13282,0.117187 0.13282,0.3125 0,0.195312 -0.12891,0.320312 -0.12891,0.121094 -0.39844,0.121094 h -2.40625 v 1.628906 h 2.70313 q 0.27343,0 0.41015,0.128907 0.14063,0.125 0.14063,0.335937 0,0.203125 -0.14063,0.332031 -0.13672,0.125 -0.41015,0.125 h -3.15235 q -0.3789,0 -0.54687,-0.167968 -0.16406,-0.167969 -0.16406,-0.542969 v -4.304688 q 0,-0.25 0.0742,-0.40625 0.0742,-0.160156 0.23047,-0.230468 0.16016,-0.07422 0.40625,-0.07422 h 3.0625 q 0.27735,0 0.41016,0.125 0.13672,0.121094 0.13672,0.320312 0,0.203125 -0.13672,0.328125 -0.13281,0.121094 -0.41016,0.121094 z"
style="font-size:8px;fill:#fff7d4;fill-opacity:1"
id="path1587"
inkscape:connector-curvature="0" /></g><g
aria-label="MS"
transform="translate(292.43359,24.571781)"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.66666698px;line-height:1.25;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold, ';letter-spacing:0px;word-spacing:0px;fill:#fff7d4;fill-opacity:1;stroke:none"
id="flowRoot1571"><path
d="m -206.22852,72.036183 -0.91796,-3.648437 v 3.953125 q 0,0.328125 -0.14844,0.492187 -0.14453,0.164063 -0.38672,0.164063 -0.23438,0 -0.38281,-0.160157 -0.14844,-0.164062 -0.14844,-0.496093 v -4.53125 q 0,-0.375 0.19531,-0.503907 0.19531,-0.132812 0.52735,-0.132812 h 0.35937 q 0.32422,0 0.46875,0.05859 0.14844,0.05859 0.21875,0.210937 0.0703,0.152344 0.16016,0.496094 l 0.83203,3.136719 0.83203,-3.136719 q 0.0898,-0.34375 0.16016,-0.496094 0.0703,-0.152344 0.21484,-0.210937 0.14844,-0.05859 0.47266,-0.05859 h 0.35937 q 0.33203,0 0.52734,0.132812 0.19532,0.128907 0.19532,0.503907 v 4.53125 q 0,0.328125 -0.14844,0.492187 -0.14453,0.164063 -0.39063,0.164063 -0.23046,0 -0.3789,-0.164063 -0.14844,-0.164062 -0.14844,-0.492187 v -3.953125 l -0.91797,3.648437 q -0.0898,0.355469 -0.14844,0.523438 -0.0547,0.164062 -0.20703,0.300781 -0.15234,0.136719 -0.42187,0.136719 -0.20313,0 -0.34375,-0.08984 -0.14063,-0.08594 -0.21875,-0.222656 -0.0781,-0.136719 -0.125,-0.300782 -0.043,-0.167968 -0.0899,-0.347656 z"
style="font-size:8px"
id="path1590"
inkscape:connector-curvature="0" /><path
d="m -197.13867,71.180714 q 0,0.519532 -0.26953,0.933594 -0.26563,0.414063 -0.78125,0.648438 -0.51563,0.234375 -1.22266,0.234375 -0.84766,0 -1.39844,-0.320313 -0.39062,-0.230469 -0.63672,-0.613281 -0.24218,-0.386719 -0.24218,-0.75 0,-0.210938 0.14453,-0.359375 0.14844,-0.152344 0.375,-0.152344 0.18359,0 0.30859,0.117188 0.12891,0.117187 0.21875,0.347656 0.10938,0.273437 0.23438,0.457031 0.1289,0.183594 0.35937,0.304688 0.23047,0.117187 0.60547,0.117187 0.51563,0 0.83594,-0.238281 0.32422,-0.242188 0.32422,-0.601563 0,-0.285156 -0.17578,-0.460937 -0.17188,-0.179688 -0.44922,-0.273438 -0.27344,-0.09375 -0.73438,-0.199218 -0.61719,-0.144532 -1.03515,-0.335938 -0.41407,-0.195312 -0.66016,-0.527344 -0.24219,-0.335937 -0.24219,-0.832031 0,-0.472656 0.25781,-0.839844 0.25782,-0.367187 0.7461,-0.5625 0.48828,-0.199218 1.14844,-0.199218 0.52734,0 0.91015,0.132812 0.38672,0.128906 0.64063,0.347656 0.2539,0.214844 0.37109,0.453125 0.11719,0.238282 0.11719,0.464844 0,0.207031 -0.14844,0.375 -0.14453,0.164063 -0.36328,0.164063 -0.19922,0 -0.30469,-0.09766 -0.10156,-0.101562 -0.22265,-0.328125 -0.15625,-0.324218 -0.375,-0.503906 -0.21875,-0.183594 -0.70313,-0.183594 -0.44922,0 -0.72656,0.199219 -0.27344,0.195313 -0.27344,0.472656 0,0.171875 0.0937,0.296875 0.0937,0.125 0.25781,0.214844 0.16407,0.08984 0.33203,0.140625 0.16797,0.05078 0.55469,0.148438 0.48438,0.113281 0.875,0.25 0.39453,0.136718 0.66797,0.332031 0.27734,0.195312 0.42969,0.496094 0.15625,0.296875 0.15625,0.730468 z"
style="font-size:8px"
id="path1592"
inkscape:connector-curvature="0" /></g><g
aria-label="HZ"
transform="translate(365.5213,24.571781)"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.66666698px;line-height:1.25;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold, ';letter-spacing:0px;word-spacing:0px;fill:#fff7d4;fill-opacity:1;stroke:none"
id="flowRoot1579"><path
d="m -206.99414,67.778371 v 1.640625 h 2.50391 v -1.640625 q 0,-0.351563 0.15625,-0.527344 0.16015,-0.175781 0.41796,-0.175781 0.26172,0 0.42188,0.175781 0.16406,0.171875 0.16406,0.527344 v 4.511718 q 0,0.355469 -0.16406,0.53125 -0.16406,0.175782 -0.42188,0.175782 -0.26171,0 -0.41796,-0.175782 -0.15625,-0.179687 -0.15625,-0.53125 v -1.925781 h -2.50391 v 1.925781 q 0,0.355469 -0.16406,0.53125 -0.16407,0.175782 -0.42188,0.175782 -0.26172,0 -0.41797,-0.175782 -0.15625,-0.179687 -0.15625,-0.53125 v -4.511718 q 0,-0.351563 0.15235,-0.527344 0.15625,-0.175781 0.42187,-0.175781 0.26172,0 0.42188,0.175781 0.16406,0.171875 0.16406,0.527344 z"
style="font-size:8px"
id="path1595"
inkscape:connector-curvature="0" /><path
d="m -202.23633,71.563527 2.94141,-3.519531 h -2.52735 q -0.26562,0 -0.40234,-0.117188 -0.13281,-0.117187 -0.13281,-0.308594 0,-0.199218 0.13281,-0.320312 0.13672,-0.125 0.40234,-0.125 h 3.25782 q 0.63281,0 0.63281,0.589844 0,0.28125 -0.10547,0.449218 -0.10547,0.167969 -0.42578,0.542969 l -2.75,3.273438 h 3.03125 q 0.26953,0 0.40234,0.113281 0.13282,0.109375 0.13282,0.308594 0,0.207031 -0.13282,0.328125 -0.13281,0.121093 -0.40234,0.121093 h -3.71875 q -0.37891,0 -0.57031,-0.167968 -0.19141,-0.171875 -0.19141,-0.457032 0,-0.09766 0.0312,-0.179687 0.0312,-0.08203 0.082,-0.152344 0.0547,-0.07422 0.14844,-0.183594 0.0937,-0.113281 0.16406,-0.195312 z"
style="font-size:8px"
id="path1597"
inkscape:connector-curvature="0" /></g><g
transform="matrix(0.96635726,0,0,0.96635726,43.771026,-15.972118)"
id="g57"><path
inkscape:connector-curvature="0"
d="M 7.15,66.79 A 0.6,0.6 0 0 1 7,66.35 v -3.74 a 0.54,0.54 0 0 1 0.59,-0.6 H 10 a 0.71,0.71 0 0 1 0.46,0.13 0.44,0.44 0 0 1 0.15,0.36 Q 10.61,63 10,63 H 8.25 v 0.94 h 1.63 q 0.61,0 0.61,0.5 A 0.44,0.44 0 0 1 10.34,64.8 0.7,0.7 0 0 1 9.89,64.93 H 8.25 v 1 H 10 q 0.61,0 0.61,0.5 A 0.44,0.44 0 0 1 10.46,66.79 0.71,0.71 0 0 1 10,66.92 H 7.59 A 0.6,0.6 0 0 1 7.15,66.79 Z"
transform="translate(0,18.75)"
style="fill:#fff7d4"
id="path51" /><path
inkscape:connector-curvature="0"
d="M 16,66.4 A 0.56,0.56 0 0 1 15.81,66.82 0.59,0.59 0 0 1 15.39,67 0.55,0.55 0 0 1 14.96,66.79 l -1.2,-1.44 -1.23,1.44 a 0.54,0.54 0 0 1 -0.42,0.21 0.58,0.58 0 0 1 -0.42,-0.18 0.56,0.56 0 0 1 0,-0.8 l 1.34,-1.55 -1.31,-1.52 a 0.58,0.58 0 0 1 -0.15,-0.38 0.56,0.56 0 0 1 0.19,-0.42 0.59,0.59 0 0 1 0.44,-0.15 0.55,0.55 0 0 1 0.43,0.21 l 1.18,1.4 1.19,-1.43 a 0.51,0.51 0 0 1 0.4,-0.18 0.59,0.59 0 0 1 0.42,0.18 0.56,0.56 0 0 1 0.19,0.42 0.58,0.58 0 0 1 -0.15,0.38 L 14.55,64.5 15.89,66 A 0.57,0.57 0 0 1 16,66.4 Z"
transform="translate(0,18.75)"
style="fill:#fff7d4"
id="path53" /><path
inkscape:connector-curvature="0"
d="m 18.64,66.81 a 0.61,0.61 0 0 1 -0.18,-0.46 v -3.3 h -1 A 0.69,0.69 0 0 1 17,62.92 0.49,0.49 0 0 1 16.85,62.52 0.48,0.48 0 0 1 17,62.13 0.7,0.7 0 0 1 17.46,62 h 3.28 a 0.7,0.7 0 0 1 0.46,0.13 0.48,0.48 0 0 1 0.15,0.39 0.49,0.49 0 0 1 -0.15,0.4 0.69,0.69 0 0 1 -0.46,0.13 h -1 v 3.3 a 0.61,0.61 0 0 1 -0.18,0.46 0.74,0.74 0 0 1 -0.95,0 z"
transform="translate(0,18.75)"
style="fill:#fff7d4"
id="path55" /></g><g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="Layer 1"
style="display:none"
sodipodi:insensitive="true"><rect
style="opacity:1;vector-effect:none;fill:#cccec9;fill-opacity:1;stroke:none;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
id="rect874"
width="0.98805201"
height="18.608313"
x="104.50597"
y="61.129848" /></g><g
transform="translate(226.66624,-137.88551)"
id="g160"
style="fill:#fff7d4;fill-opacity:1"><path
inkscape:connector-curvature="0"
d="m -265.56,167.93 a 0.63,0.63 0 0 1 0.17,0.46 v 3.81 a 0.57,0.57 0 0 1 -0.15,0.42 0.55,0.55 0 0 1 -0.41,0.15 0.55,0.55 0 0 1 -0.4,-0.15 0.56,0.56 0 0 1 -0.16,-0.42 v -2.06 l -0.8,1.47 a 0.91,0.91 0 0 1 -0.25,0.32 0.53,0.53 0 0 1 -0.32,0.09 0.53,0.53 0 0 1 -0.31,-0.09 0.91,0.91 0 0 1 -0.25,-0.32 l -0.79,-1.43 v 2 a 0.56,0.56 0 0 1 -0.16,0.42 0.55,0.55 0 0 1 -0.41,0.16 0.55,0.55 0 0 1 -0.4,-0.15 0.56,0.56 0 0 1 -0.16,-0.42 v -3.81 a 0.62,0.62 0 0 1 0.17,-0.46 0.59,0.59 0 0 1 0.44,-0.18 0.58,0.58 0 0 1 0.34,0.11 0.85,0.85 0 0 1 0.26,0.31 l 1.29,2.42 1.28,-2.42 a 0.66,0.66 0 0 1 0.59,-0.42 0.58,0.58 0 0 1 0.43,0.19 z"
transform="translate(270.37)"
style="fill:#fff7d4;fill-opacity:1"
id="path142" /><path
inkscape:connector-curvature="0"
d="m -263,172.66 a 2.38,2.38 0 0 1 -0.79,-0.34 0.6,0.6 0 0 1 -0.17,-0.19 0.53,0.53 0 0 1 -0.05,-0.25 0.56,0.56 0 0 1 0.13,-0.36 0.37,0.37 0 0 1 0.29,-0.15 h 0.18 l 0.21,0.1 a 2.28,2.28 0 0 0 0.57,0.23 2.67,2.67 0 0 0 0.64,0.07 1.28,1.28 0 0 0 0.63,-0.12 0.39,0.39 0 0 0 0.21,-0.36 0.33,0.33 0 0 0 -0.2,-0.28 2.82,2.82 0 0 0 -0.76,-0.23 4.38,4.38 0 0 1 -1.08,-0.35 1.28,1.28 0 0 1 -0.55,-0.48 1.33,1.33 0 0 1 -0.16,-0.67 1.35,1.35 0 0 1 0.27,-0.81 1.77,1.77 0 0 1 0.73,-0.57 2.55,2.55 0 0 1 1,-0.21 3.39,3.39 0 0 1 0.91,0.11 2.28,2.28 0 0 1 0.73,0.35 0.57,0.57 0 0 1 0.18,0.19 0.53,0.53 0 0 1 0.05,0.25 0.57,0.57 0 0 1 -0.12,0.36 0.36,0.36 0 0 1 -0.29,0.15 h -0.17 l -0.22,-0.11 -0.2,-0.11 a 1.61,1.61 0 0 0 -0.38,-0.14 2.06,2.06 0 0 0 -0.48,-0.05 1.07,1.07 0 0 0 -0.57,0.14 0.41,0.41 0 0 0 -0.22,0.36 0.31,0.31 0 0 0 0.08,0.22 0.78,0.78 0 0 0 0.29,0.16 4.21,4.21 0 0 0 0.62,0.16 4.17,4.17 0 0 1 1.06,0.35 1.35,1.35 0 0 1 0.55,0.48 1.24,1.24 0 0 1 0.16,0.64 1.34,1.34 0 0 1 -0.26,0.82 1.66,1.66 0 0 1 -0.72,0.55 2.81,2.81 0 0 1 -1.08,0.19 4.19,4.19 0 0 1 -1.02,-0.1 z"
transform="translate(270.37)"
style="fill:#fff7d4;fill-opacity:1"
id="path144" /><path
inkscape:connector-curvature="0"
d="m -254.7,172.47 a 2.12,2.12 0 0 1 -0.86,-0.88 2.83,2.83 0 0 1 -0.3,-1.34 2.83,2.83 0 0 1 0.3,-1.34 2.1,2.1 0 0 1 0.86,-0.88 2.67,2.67 0 0 1 1.31,-0.31 2.67,2.67 0 0 1 1.31,0.31 2.08,2.08 0 0 1 0.85,0.88 2.86,2.86 0 0 1 0.3,1.34 2.83,2.83 0 0 1 -0.3,1.34 2.12,2.12 0 0 1 -0.86,0.88 2.63,2.63 0 0 1 -1.31,0.31 2.65,2.65 0 0 1 -1.3,-0.31 z m 2.19,-1.07 a 1.82,1.82 0 0 0 0.31,-1.15 1.79,1.79 0 0 0 -0.32,-1.15 1.06,1.06 0 0 0 -0.87,-0.39 1.06,1.06 0 0 0 -0.87,0.39 1.8,1.8 0 0 0 -0.31,1.15 1.81,1.81 0 0 0 0.31,1.16 1.06,1.06 0 0 0 0.88,0.39 1.06,1.06 0 0 0 0.86,-0.4 z"
transform="translate(270.37)"
style="fill:#fff7d4;fill-opacity:1"
id="path146" /><path
inkscape:connector-curvature="0"
d="m -248.94,172.24 a 2.14,2.14 0 0 1 -0.56,-1.6 v -2.26 a 0.62,0.62 0 0 1 0.17,-0.46 0.62,0.62 0 0 1 0.46,-0.17 0.62,0.62 0 0 1 0.46,0.17 0.62,0.62 0 0 1 0.17,0.46 v 2.31 a 1.25,1.25 0 0 0 0.24,0.82 0.84,0.84 0 0 0 0.69,0.29 0.84,0.84 0 0 0 0.69,-0.29 1.25,1.25 0 0 0 0.24,-0.82 v -2.31 a 0.62,0.62 0 0 1 0.17,-0.46 0.62,0.62 0 0 1 0.46,-0.17 0.63,0.63 0 0 1 0.46,0.17 0.61,0.61 0 0 1 0.17,0.46 v 2.26 a 2.13,2.13 0 0 1 -0.56,1.59 2.24,2.24 0 0 1 -1.63,0.55 2.23,2.23 0 0 1 -1.63,-0.54 z"
transform="translate(270.37)"
style="fill:#fff7d4;fill-opacity:1"
id="path148" /><path
inkscape:connector-curvature="0"
d="m -242.26,172.58 a 0.61,0.61 0 0 1 -0.18,-0.46 v -3.3 h -1 a 0.69,0.69 0 0 1 -0.46,-0.13 0.49,0.49 0 0 1 -0.15,-0.4 0.48,0.48 0 0 1 0.15,-0.39 0.7,0.7 0 0 1 0.46,-0.13 h 3.28 a 0.7,0.7 0 0 1 0.46,0.13 0.48,0.48 0 0 1 0.15,0.39 0.49,0.49 0 0 1 -0.15,0.4 0.69,0.69 0 0 1 -0.46,0.13 h -1 v 3.3 a 0.61,0.61 0 0 1 -0.18,0.46 0.65,0.65 0 0 1 -0.47,0.17 0.65,0.65 0 0 1 -0.45,-0.17 z"
transform="translate(270.37)"
style="fill:#fff7d4;fill-opacity:1"
id="path150" /><path
inkscape:connector-curvature="0"
d="m -238.25,172.59 a 0.63,0.63 0 0 1 -0.17,-0.47 v -3.74 a 0.6,0.6 0 0 1 0.15,-0.44 0.59,0.59 0 0 1 0.44,-0.15 h 1.83 a 1.82,1.82 0 0 1 1.27,0.42 1.49,1.49 0 0 1 0.46,1.16 1.49,1.49 0 0 1 -0.46,1.15 1.81,1.81 0 0 1 -1.27,0.42 h -1.1 v 1.19 a 0.62,0.62 0 0 1 -0.17,0.47 0.65,0.65 0 0 1 -0.48,0.17 0.63,0.63 0 0 1 -0.5,-0.18 z m 2,-2.62 a 0.8,0.8 0 0 0 0.53,-0.15 0.57,0.57 0 0 0 0.17,-0.46 q 0,-0.61 -0.7,-0.61 h -0.92 V 170 Z"
transform="translate(270.37)"
style="fill:#fff7d4;fill-opacity:1"
id="path152" /><path
inkscape:connector-curvature="0"
d="m -232.46,172.24 a 2.14,2.14 0 0 1 -0.56,-1.6 v -2.26 a 0.62,0.62 0 0 1 0.17,-0.46 0.62,0.62 0 0 1 0.46,-0.17 0.62,0.62 0 0 1 0.46,0.17 0.62,0.62 0 0 1 0.17,0.46 v 2.31 a 1.25,1.25 0 0 0 0.24,0.82 0.84,0.84 0 0 0 0.69,0.29 0.84,0.84 0 0 0 0.69,-0.29 1.25,1.25 0 0 0 0.24,-0.82 v -2.31 a 0.62,0.62 0 0 1 0.17,-0.46 0.62,0.62 0 0 1 0.46,-0.17 0.63,0.63 0 0 1 0.46,0.17 0.61,0.61 0 0 1 0.17,0.46 v 2.26 a 2.13,2.13 0 0 1 -0.56,1.59 2.24,2.24 0 0 1 -1.63,0.55 2.23,2.23 0 0 1 -1.63,-0.54 z"
transform="translate(270.37)"
style="fill:#fff7d4;fill-opacity:1"
id="path154" /><path
inkscape:connector-curvature="0"
d="m -225.78,172.58 a 0.61,0.61 0 0 1 -0.18,-0.46 v -3.3 h -1 a 0.69,0.69 0 0 1 -0.46,-0.13 0.49,0.49 0 0 1 -0.15,-0.4 0.48,0.48 0 0 1 0.15,-0.39 0.7,0.7 0 0 1 0.46,-0.13 h 3.28 a 0.7,0.7 0 0 1 0.46,0.13 0.48,0.48 0 0 1 0.15,0.39 0.49,0.49 0 0 1 -0.15,0.4 0.69,0.69 0 0 1 -0.46,0.13 h -1 v 3.3 a 0.61,0.61 0 0 1 -0.18,0.46 0.65,0.65 0 0 1 -0.47,0.17 0.65,0.65 0 0 1 -0.45,-0.17 z"
transform="translate(270.37)"
style="fill:#fff7d4;fill-opacity:1"
id="path156" /><path
inkscape:connector-curvature="0"
d="m -221.26,172.66 a 2.38,2.38 0 0 1 -0.79,-0.34 0.6,0.6 0 0 1 -0.17,-0.19 0.53,0.53 0 0 1 -0.05,-0.25 0.56,0.56 0 0 1 0.13,-0.36 0.37,0.37 0 0 1 0.29,-0.15 h 0.18 l 0.21,0.1 a 2.28,2.28 0 0 0 0.57,0.23 2.67,2.67 0 0 0 0.64,0.07 1.28,1.28 0 0 0 0.63,-0.12 0.39,0.39 0 0 0 0.21,-0.36 0.33,0.33 0 0 0 -0.2,-0.28 2.82,2.82 0 0 0 -0.76,-0.23 4.38,4.38 0 0 1 -1.08,-0.35 1.28,1.28 0 0 1 -0.55,-0.43 1.33,1.33 0 0 1 -0.16,-0.67 1.35,1.35 0 0 1 0.27,-0.81 1.77,1.77 0 0 1 0.73,-0.57 2.55,2.55 0 0 1 1,-0.21 3.39,3.39 0 0 1 0.91,0.11 2.28,2.28 0 0 1 0.73,0.35 0.57,0.57 0 0 1 0.18,0.19 0.53,0.53 0 0 1 0.05,0.25 0.57,0.57 0 0 1 -0.12,0.36 0.36,0.36 0 0 1 -0.29,0.15 h -0.17 l -0.22,-0.11 -0.2,-0.11 a 1.61,1.61 0 0 0 -0.38,-0.14 2.06,2.06 0 0 0 -0.48,-0.05 1.07,1.07 0 0 0 -0.57,0.14 0.41,0.41 0 0 0 -0.22,0.36 0.31,0.31 0 0 0 0.08,0.22 0.78,0.78 0 0 0 0.29,0.16 4.21,4.21 0 0 0 0.62,0.16 4.17,4.17 0 0 1 1.06,0.35 1.35,1.35 0 0 1 0.55,0.48 1.24,1.24 0 0 1 0.16,0.64 1.34,1.34 0 0 1 -0.26,0.82 1.66,1.66 0 0 1 -0.72,0.55 2.81,2.81 0 0 1 -1.08,0.19 4.19,4.19 0 0 1 -1.02,-0.15 z"
transform="translate(270.37)"
style="fill:#fff7d4;fill-opacity:1"
id="path158" /></g><g
id="g2120"><g
id="g2871"><g
id="g2790"><path
id="path162"
style="fill:#fff7d4;fill-opacity:1"
d="m 234.49277,44.629962 a 0.47,0.47 0 0 1 0.15,0.38 q 0,0.52 -0.61,0.52 h -2.43 q -0.61,0 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.57 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.48,0.48 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.18,1.18 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.47,0.15 z"
inkscape:connector-curvature="0" /><g
style="fill:#fff7d4;fill-opacity:1"
id="g180"
transform="translate(186.29265,-131.91619)"><path
id="path174"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -226.08,216.4 a 0.47,0.47 0 0 1 0.15,0.38 c 0,0.35 -0.2,0.52 -0.61,0.52 H -229 c -0.41,0 -0.61,-0.17 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.47,0.47 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.19,1.19 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.5,0.11 z"
inkscape:connector-curvature="0" /><path
id="path176"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -224.53,217.77 a 0.48,0.48 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.47,0.47 0 0 1 0,-0.16 l 1.59,-5 a 0.48,0.48 0 0 1 0.18,-0.25 0.47,0.47 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.78,0.78 0 0 1 0,0.15 l -1.59,5 a 0.48,0.48 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path178"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -218.23,216.39 a 0.46,0.46 0 0 1 0.15,0.38 0.48,0.48 0 0 1 -0.15,0.39 0.7,0.7 0 0 1 -0.46,0.13 h -2.55 a 0.53,0.53 0 0 1 -0.4,-0.15 0.52,0.52 0 0 1 -0.15,-0.38 0.77,0.77 0 0 1 0.24,-0.55 l 1.48,-1.55 a 1.36,1.36 0 0 0 0.46,-0.89 0.47,0.47 0 0 0 -0.14,-0.36 0.55,0.55 0 0 0 -0.39,-0.13 1.15,1.15 0 0 0 -0.37,0.06 3.38,3.38 0 0 0 -0.4,0.17 l -0.14,0.07 -0.11,0.06 -0.14,0.07 h -0.13 a 0.36,0.36 0 0 1 -0.29,-0.16 0.6,0.6 0 0 1 -0.12,-0.37 0.6,0.6 0 0 1 0,-0.25 0.46,0.46 0 0 1 0.17,-0.18 2.73,2.73 0 0 1 0.74,-0.35 2.74,2.74 0 0 1 0.81,-0.13 2.25,2.25 0 0 1 0.91,0.17 1.36,1.36 0 0 1 0.61,0.49 1.28,1.28 0 0 1 0.21,0.73 1.76,1.76 0 0 1 -0.17,0.78 3.29,3.29 0 0 1 -0.58,0.79 l -1,1 h 1.41 a 0.72,0.72 0 0 1 0.5,0.16 z"
inkscape:connector-curvature="0" /></g><g
style="fill:#fff7d4;fill-opacity:1"
id="g200"
transform="translate(188.29342,-113.67209)"><path
id="path192"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -233.29,238.21 a 1.26,1.26 0 0 1 -0.47,-0.45 1.19,1.19 0 0 1 -0.17,-0.63 1.2,1.2 0 0 1 0.16,-0.61 1.27,1.27 0 0 1 0.46,-0.46 1.23,1.23 0 0 1 0.65,-0.18 1.25,1.25 0 0 1 0.63,0.17 1.27,1.27 0 0 1 0.47,0.45 1.18,1.18 0 0 1 0.18,0.63 1.18,1.18 0 0 1 -0.17,0.62 1.29,1.29 0 0 1 -0.46,0.45 1.24,1.24 0 0 1 -0.63,0.17 1.27,1.27 0 0 1 -0.65,-0.16 z"
inkscape:connector-curvature="0" /><path
id="path194"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -226.08,238.09 a 0.47,0.47 0 0 1 0.15,0.38 q 0,0.52 -0.61,0.52 H -229 q -0.61,0 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.09 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.48,0.48 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.18,1.18 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.3 h 0.57 a 0.7,0.7 0 0 1 0.5,0.09 z"
inkscape:connector-curvature="0" /><path
id="path196"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -224.52,239.46 a 0.47,0.47 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.46,0.46 0 0 1 0,-0.16 l 1.59,-5 a 0.47,0.47 0 0 1 0.18,-0.25 0.46,0.46 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.77,0.77 0 0 1 0,0.15 l -1.59,5 a 0.47,0.47 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path198"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -217.87,237.66 q 0,0.5 -0.61,0.5 h -0.15 v 0.24 a 0.62,0.62 0 0 1 -0.18,0.48 0.64,0.64 0 0 1 -0.46,0.16 0.63,0.63 0 0 1 -0.45,-0.16 0.62,0.62 0 0 1 -0.17,-0.48 v -0.24 h -1.56 a 0.53,0.53 0 0 1 -0.4,-0.15 0.54,0.54 0 0 1 -0.15,-0.38 0.78,0.78 0 0 1 0.15,-0.46 l 2,-2.86 a 0.65,0.65 0 0 1 0.25,-0.21 0.69,0.69 0 0 1 0.31,-0.07 0.66,0.66 0 0 1 0.46,0.17 0.6,0.6 0 0 1 0.19,0.47 v 2.53 h 0.15 q 0.62,-0.02 0.62,0.46 z m -2.86,-0.48 h 0.84 V 236 Z"
inkscape:connector-curvature="0" /></g><g
style="fill:#fff7d4;fill-opacity:1"
id="g218"
transform="translate(188.23337,-95.437984)"><path
id="path210"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -230.79,260.26 a 0.4,0.4 0 0 1 -0.19,0.36 0.91,0.91 0 0 1 -0.54,0.1 h -0.2 a 1.44,1.44 0 0 1 -1,-0.38 1.27,1.27 0 0 1 -0.33,-0.93 v -1.24 h -0.2 q -0.56,0 -0.56,-0.46 0,-0.46 0.56,-0.46 h 0.2 v -0.46 a 0.55,0.55 0 0 1 0.17,-0.42 0.64,0.64 0 0 1 0.46,-0.16 0.64,0.64 0 0 1 0.46,0.16 0.55,0.55 0 0 1 0.17,0.42 v 0.46 h 0.38 q 0.56,0 0.56,0.46 0,0.46 -0.56,0.46 h -0.38 v 1.34 a 0.33,0.33 0 0 0 0.08,0.22 0.29,0.29 0 0 0 0.21,0.1 h 0.2 c 0.36,0.03 0.51,0.17 0.51,0.43 z"
inkscape:connector-curvature="0" /><path
id="path212"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -226.08,259.79 a 0.47,0.47 0 0 1 0.15,0.38 q 0,0.52 -0.61,0.52 H -229 q -0.61,0 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.48,0.48 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.18,1.18 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.5,0.11 z"
inkscape:connector-curvature="0" /><path
id="path214"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -224.52,261.16 a 0.47,0.47 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.46,0.46 0 0 1 0,-0.16 l 1.59,-5 a 0.47,0.47 0 0 1 0.18,-0.25 0.46,0.46 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.77,0.77 0 0 1 0,0.15 l -1.59,5 a 0.47,0.47 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path216"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -217.87,259.35 q 0,0.5 -0.61,0.5 h -0.15 v 0.24 a 0.62,0.62 0 0 1 -0.18,0.48 0.64,0.64 0 0 1 -0.46,0.16 0.63,0.63 0 0 1 -0.45,-0.16 0.62,0.62 0 0 1 -0.17,-0.48 v -0.24 h -1.56 a 0.53,0.53 0 0 1 -0.4,-0.15 0.54,0.54 0 0 1 -0.15,-0.38 0.78,0.78 0 0 1 0.15,-0.46 l 2,-2.86 a 0.65,0.65 0 0 1 0.25,-0.21 0.69,0.69 0 0 1 0.31,-0.07 0.66,0.66 0 0 1 0.46,0.17 0.6,0.6 0 0 1 0.19,0.47 v 2.53 h 0.15 q 0.62,-0.02 0.62,0.46 z m -2.86,-0.48 h 0.84 v -1.21 z"
inkscape:connector-curvature="0" /></g><g
style="fill:#fff7d4;fill-opacity:1"
id="g236"
transform="translate(186.26821,-77.203824)"><path
id="path230"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -226.08,281.48 a 0.47,0.47 0 0 1 0.15,0.38 c 0,0.35 -0.2,0.52 -0.61,0.52 H -229 c -0.41,0 -0.61,-0.17 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.47,0.47 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.19,1.19 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.5,0.11 z"
inkscape:connector-curvature="0" /><path
id="path232"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -224.52,282.86 a 0.48,0.48 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.47,0.47 0 0 1 0,-0.16 l 1.59,-5 a 0.48,0.48 0 0 1 0.18,-0.25 0.47,0.47 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.78,0.78 0 0 1 0,0.15 l -1.59,5 a 0.48,0.48 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path234"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -218.26,280.27 a 1.22,1.22 0 0 1 0.23,0.75 1.21,1.21 0 0 1 -0.52,1 2.4,2.4 0 0 1 -1.42,0.38 2.4,2.4 0 0 1 -1.42,-0.37 1.21,1.21 0 0 1 -0.52,-1 1.23,1.23 0 0 1 0.23,-0.77 1.17,1.17 0 0 1 0.66,-0.42 1.15,1.15 0 0 1 -0.56,-0.43 1.19,1.19 0 0 1 -0.2,-0.68 1.16,1.16 0 0 1 0.49,-1 2.19,2.19 0 0 1 1.32,-0.36 2.18,2.18 0 0 1 1.33,0.36 1.16,1.16 0 0 1 0.49,1 1.21,1.21 0 0 1 -0.2,0.7 1.05,1.05 0 0 1 -0.55,0.41 1.21,1.21 0 0 1 0.64,0.43 z m -1,0.65 q 0,-0.55 -0.76,-0.55 -0.76,0 -0.76,0.55 0,0.55 0.76,0.55 0.76,0 0.8,-0.55 z m -1.23,-2.44 a 0.48,0.48 0 0 0 -0.15,0.4 0.49,0.49 0 0 0 0.15,0.4 0.73,0.73 0 0 0 0.47,0.13 0.73,0.73 0 0 0 0.47,-0.13 0.49,0.49 0 0 0 0.15,-0.4 0.48,0.48 0 0 0 -0.15,-0.4 0.75,0.75 0 0 0 -0.47,-0.12 0.75,0.75 0 0 0 -0.43,0.12 z"
inkscape:connector-curvature="0" /></g><g
style="fill:#fff7d4;fill-opacity:1"
id="g258"
transform="translate(190.8481,-58.959707)"><path
id="path248"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -238.19,303.29 a 1.25,1.25 0 0 1 -0.47,-0.45 1.19,1.19 0 0 1 -0.17,-0.63 1.2,1.2 0 0 1 0.16,-0.61 1.26,1.26 0 0 1 0.46,-0.46 1.23,1.23 0 0 1 0.65,-0.18 1.25,1.25 0 0 1 0.63,0.16 1.28,1.28 0 0 1 0.47,0.45 1.18,1.18 0 0 1 0.18,0.63 1.17,1.17 0 0 1 -0.17,0.62 1.27,1.27 0 0 1 -0.46,0.45 1.23,1.23 0 0 1 -0.63,0.17 1.27,1.27 0 0 1 -0.65,-0.15 z"
inkscape:connector-curvature="0" /><path
id="path250"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -231,303.18 a 0.47,0.47 0 0 1 0.15,0.38 q 0,0.52 -0.61,0.52 h -2.43 q -0.61,0 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.48,0.48 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.18,1.18 0 0 1 0.58,-0.17 0.61,0.61 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.47,0.11 z"
inkscape:connector-curvature="0" /><path
id="path252"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -229.42,304.55 a 0.48,0.48 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.46,0.46 0 0 1 0,-0.16 l 1.59,-5 a 0.48,0.48 0 0 1 0.18,-0.25 0.47,0.47 0 0 1 0.27,-0.08 0.53,0.53 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.77,0.77 0 0 1 0,0.15 l -1.59,5 a 0.47,0.47 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path254"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -222.93,303.18 a 0.47,0.47 0 0 1 0.15,0.38 q 0,0.52 -0.61,0.52 h -2.43 q -0.61,0 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.48,0.48 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.18,1.18 0 0 1 0.58,-0.17 0.61,0.61 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.47,0.11 z"
inkscape:connector-curvature="0" /><path
id="path256"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -218.8,301 a 1.45,1.45 0 0 1 0.53,0.57 1.77,1.77 0 0 1 0.19,0.83 1.75,1.75 0 0 1 -0.22,0.88 1.56,1.56 0 0 1 -0.61,0.61 1.81,1.81 0 0 1 -0.89,0.22 1.88,1.88 0 0 1 -1.53,-0.64 2.78,2.78 0 0 1 -0.54,-1.83 3.39,3.39 0 0 1 0.26,-1.37 2,2 0 0 1 0.72,-0.9 1.89,1.89 0 0 1 1.09,-0.31 2.72,2.72 0 0 1 0.8,0.13 2.23,2.23 0 0 1 0.7,0.35 0.61,0.61 0 0 1 0.17,0.19 0.52,0.52 0 0 1 0.05,0.25 0.56,0.56 0 0 1 -0.12,0.37 0.37,0.37 0 0 1 -0.3,0.15 0.47,0.47 0 0 1 -0.17,0 l -0.21,-0.1 -0.15,-0.08 -0.38,-0.17 a 0.94,0.94 0 0 0 -0.32,-0.05 0.67,0.67 0 0 0 -0.58,0.32 1.86,1.86 0 0 0 -0.26,0.91 1.12,1.12 0 0 1 0.43,-0.35 1.35,1.35 0 0 1 0.59,-0.13 1.41,1.41 0 0 1 0.75,0.15 z m -0.64,1.94 a 0.7,0.7 0 0 0 0.16,-0.48 0.71,0.71 0 0 0 -0.16,-0.49 0.55,0.55 0 0 0 -0.44,-0.18 0.56,0.56 0 0 0 -0.44,0.18 0.69,0.69 0 0 0 -0.16,0.48 0.69,0.69 0 0 0 0.17,0.48 0.56,0.56 0 0 0 0.43,0.19 0.55,0.55 0 0 0 0.43,-0.12 z"
inkscape:connector-curvature="0" /></g><g
style="fill:#fff7d4;fill-opacity:1"
id="g280"
transform="translate(190.78804,-40.725606)"><path
id="path270"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -235.69,325.34 a 0.4,0.4 0 0 1 -0.19,0.36 0.91,0.91 0 0 1 -0.54,0.1 h -0.2 a 1.44,1.44 0 0 1 -1,-0.38 1.27,1.27 0 0 1 -0.33,-0.93 v -1.24 h -0.2 q -0.56,0 -0.56,-0.46 0,-0.46 0.56,-0.46 h 0.2 v -0.46 a 0.55,0.55 0 0 1 0.17,-0.42 0.64,0.64 0 0 1 0.46,-0.16 0.64,0.64 0 0 1 0.46,0.16 0.55,0.55 0 0 1 0.17,0.42 v 0.46 h 0.38 q 0.56,0 0.56,0.46 0,0.46 -0.56,0.46 h -0.38 v 1.34 a 0.33,0.33 0 0 0 0.08,0.22 0.29,0.29 0 0 0 0.21,0.1 h 0.2 c 0.36,0.03 0.51,0.17 0.51,0.43 z"
inkscape:connector-curvature="0" /><path
id="path272"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -231,324.88 a 0.47,0.47 0 0 1 0.15,0.38 q 0,0.52 -0.61,0.52 h -2.43 q -0.61,0 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.48,0.48 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.18,1.18 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.47,0.11 z"
inkscape:connector-curvature="0" /><path
id="path274"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -229.42,326.25 a 0.47,0.47 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.46,0.46 0 0 1 0,-0.16 l 1.59,-5 a 0.47,0.47 0 0 1 0.18,-0.25 0.46,0.46 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.77,0.77 0 0 1 0,0.15 l -1.59,5 a 0.47,0.47 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path276"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -222.93,324.88 a 0.47,0.47 0 0 1 0.15,0.38 q 0,0.52 -0.61,0.52 h -2.43 q -0.61,0 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.48,0.48 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.18,1.18 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.47,0.11 z"
inkscape:connector-curvature="0" /><path
id="path278"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -218.8,322.73 a 1.45,1.45 0 0 1 0.53,0.57 1.77,1.77 0 0 1 0.19,0.83 1.75,1.75 0 0 1 -0.22,0.88 1.56,1.56 0 0 1 -0.61,0.61 1.81,1.81 0 0 1 -0.89,0.22 1.88,1.88 0 0 1 -1.53,-0.64 2.78,2.78 0 0 1 -0.54,-1.83 3.4,3.4 0 0 1 0.26,-1.37 2,2 0 0 1 0.72,-0.9 1.89,1.89 0 0 1 1.09,-0.31 2.72,2.72 0 0 1 0.8,0.13 2.23,2.23 0 0 1 0.7,0.35 0.61,0.61 0 0 1 0.17,0.19 0.52,0.52 0 0 1 0.05,0.25 0.56,0.56 0 0 1 -0.12,0.37 0.37,0.37 0 0 1 -0.3,0.15 0.47,0.47 0 0 1 -0.17,0 l -0.21,-0.1 -0.12,-0.13 -0.38,-0.17 a 0.94,0.94 0 0 0 -0.32,-0.06 0.67,0.67 0 0 0 -0.58,0.33 1.85,1.85 0 0 0 -0.26,0.91 1.12,1.12 0 0 1 0.43,-0.35 1.35,1.35 0 0 1 0.59,-0.13 1.41,1.41 0 0 1 0.72,0.2 z m -0.64,1.94 a 0.7,0.7 0 0 0 0.16,-0.48 0.71,0.71 0 0 0 -0.16,-0.49 0.56,0.56 0 0 0 -0.44,-0.18 0.56,0.56 0 0 0 -0.44,0.18 0.69,0.69 0 0 0 -0.16,0.48 0.69,0.69 0 0 0 0.17,0.48 0.56,0.56 0 0 0 0.43,0.19 0.55,0.55 0 0 0 0.43,-0.18 z"
inkscape:connector-curvature="0" /></g><g
style="fill:#fff7d4;fill-opacity:1"
id="g302"
transform="translate(188.73765,-22.48147)"><path
id="path294"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -231,346.57 a 0.47,0.47 0 0 1 0.15,0.38 c 0,0.35 -0.2,0.52 -0.61,0.52 h -2.43 c -0.41,0 -0.61,-0.17 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.47,0.47 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.19,1.19 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.47,0.11 z"
inkscape:connector-curvature="0" /><path
id="path296"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -229.43,347.94 a 0.48,0.48 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.47,0.47 0 0 1 0,-0.16 l 1.59,-5 a 0.48,0.48 0 0 1 0.18,-0.25 0.47,0.47 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.78,0.78 0 0 1 0,0.15 l -1.59,5 a 0.48,0.48 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path298"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -223.35,345.36 a 1.24,1.24 0 0 1 0.23,0.76 1.22,1.22 0 0 1 -0.23,0.74 1.47,1.47 0 0 1 -0.65,0.49 2.63,2.63 0 0 1 -1,0.17 3.09,3.09 0 0 1 -0.87,-0.12 2.23,2.23 0 0 1 -0.73,-0.35 0.55,0.55 0 0 1 -0.17,-0.19 0.55,0.55 0 0 1 0,-0.24 0.58,0.58 0 0 1 0.12,-0.37 0.36,0.36 0 0 1 0.29,-0.15 0.45,0.45 0 0 1 0.18,0 l 0.21,0.1 h 0.07 0.09 a 3.14,3.14 0 0 0 0.4,0.17 1.29,1.29 0 0 0 0.4,0.06 1,1 0 0 0 0.56,-0.13 0.49,0.49 0 0 0 0.17,-0.42 0.44,0.44 0 0 0 -0.17,-0.39 1.06,1.06 0 0 0 -0.57,-0.12 h -0.43 a 0.4,0.4 0 0 1 -0.33,-0.15 0.54,0.54 0 0 1 -0.22,-0.22 0.54,0.54 0 0 1 0.12,-0.35 0.4,0.4 0 0 1 0.33,-0.15 h 0.31 a 1.08,1.08 0 0 0 0.56,-0.11 0.39,0.39 0 0 0 0.17,-0.36 0.52,0.52 0 0 0 -0.15,-0.4 0.6,0.6 0 0 0 -0.43,-0.14 1.06,1.06 0 0 0 -0.37,0.06 l -0.38,0.17 -0.15,0.07 -0.21,0.1 a 0.45,0.45 0 0 1 -0.17,0 0.36,0.36 0 0 1 -0.29,-0.15 0.57,0.57 0 0 1 -0.12,-0.37 0.55,0.55 0 0 1 0,-0.25 0.56,0.56 0 0 1 0.17,-0.19 2.32,2.32 0 0 1 0.71,-0.35 2.8,2.8 0 0 1 0.83,-0.13 2.33,2.33 0 0 1 0.91,0.17 1.38,1.38 0 0 1 0.61,0.48 1.22,1.22 0 0 1 0.21,0.71 1.16,1.16 0 0 1 -0.2,0.68 1.13,1.13 0 0 1 -0.56,0.42 1.2,1.2 0 0 1 0.75,0.45 z"
inkscape:connector-curvature="0" /><path
id="path300"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -218.23,346.57 a 0.46,0.46 0 0 1 0.15,0.38 0.48,0.48 0 0 1 -0.15,0.39 0.7,0.7 0 0 1 -0.46,0.13 h -2.55 a 0.53,0.53 0 0 1 -0.4,-0.15 0.52,0.52 0 0 1 -0.15,-0.38 0.77,0.77 0 0 1 0.24,-0.55 l 1.48,-1.55 a 1.36,1.36 0 0 0 0.46,-0.89 0.47,0.47 0 0 0 -0.14,-0.36 0.55,0.55 0 0 0 -0.39,-0.13 1.15,1.15 0 0 0 -0.37,0.06 3.38,3.38 0 0 0 -0.4,0.17 l -0.14,0.07 -0.11,0.06 -0.14,0.07 h -0.13 a 0.36,0.36 0 0 1 -0.29,-0.16 0.6,0.6 0 0 1 -0.12,-0.37 0.6,0.6 0 0 1 0,-0.25 0.46,0.46 0 0 1 0.17,-0.18 2.73,2.73 0 0 1 0.74,-0.35 2.74,2.74 0 0 1 0.81,-0.13 2.25,2.25 0 0 1 0.91,0.17 1.36,1.36 0 0 1 0.61,0.49 1.28,1.28 0 0 1 0.21,0.73 1.76,1.76 0 0 1 -0.17,0.78 3.29,3.29 0 0 1 -0.58,0.79 l -1,1 h 1.41 a 0.72,0.72 0 0 1 0.5,0.16 z"
inkscape:connector-curvature="0" /></g></g><g
id="g2752"><g
style="fill:#fff7d4;fill-opacity:1"
id="g172"
transform="translate(226.70212,-161.00033)"><path
id="path164"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -233.29,205.67 a 1.24,1.24 0 0 1 -0.47,-0.45 1.19,1.19 0 0 1 -0.17,-0.63 1.2,1.2 0 0 1 0.16,-0.61 1.27,1.27 0 0 1 0.46,-0.46 1.23,1.23 0 0 1 0.65,-0.17 1.25,1.25 0 0 1 0.63,0.16 1.28,1.28 0 0 1 0.47,0.45 1.18,1.18 0 0 1 0.18,0.63 1.17,1.17 0 0 1 -0.17,0.62 1.27,1.27 0 0 1 -0.46,0.45 1.24,1.24 0 0 1 -0.63,0.17 1.27,1.27 0 0 1 -0.65,-0.16 z"
inkscape:connector-curvature="0" /><path
id="path166"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -226.08,205.55 a 0.47,0.47 0 0 1 0.15,0.38 c 0,0.35 -0.2,0.52 -0.61,0.52 H -229 c -0.41,0 -0.61,-0.17 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.52 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.47,0.47 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.19,1.19 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.5,0.1 z"
inkscape:connector-curvature="0" /><path
id="path168"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -224.53,206.92 a 0.48,0.48 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.47,0.47 0 0 1 0,-0.16 l 1.59,-5 a 0.48,0.48 0 0 1 0.18,-0.25 0.47,0.47 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.78,0.78 0 0 1 0,0.15 l -1.59,5 a 0.48,0.48 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path170"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -218.23,205.55 a 0.46,0.46 0 0 1 0.15,0.38 0.48,0.48 0 0 1 -0.15,0.39 0.7,0.7 0 0 1 -0.46,0.13 h -2.55 a 0.53,0.53 0 0 1 -0.4,-0.15 0.52,0.52 0 0 1 -0.15,-0.38 0.77,0.77 0 0 1 0.24,-0.55 l 1.48,-1.55 a 1.36,1.36 0 0 0 0.46,-0.89 0.47,0.47 0 0 0 -0.14,-0.36 0.55,0.55 0 0 0 -0.39,-0.13 1.15,1.15 0 0 0 -0.37,0.06 3.38,3.38 0 0 0 -0.4,0.17 l -0.14,0.07 -0.11,0.06 -0.14,0.07 h -0.13 a 0.36,0.36 0 0 1 -0.29,-0.16 0.6,0.6 0 0 1 -0.12,-0.37 0.6,0.6 0 0 1 0,-0.25 0.46,0.46 0 0 1 0.17,-0.18 2.73,2.73 0 0 1 0.74,-0.35 2.74,2.74 0 0 1 0.81,-0.13 2.25,2.25 0 0 1 0.91,0.17 1.36,1.36 0 0 1 0.61,0.49 1.28,1.28 0 0 1 0.21,0.73 1.76,1.76 0 0 1 -0.17,0.78 3.29,3.29 0 0 1 -0.58,0.79 l -1,1 h 1.41 a 0.72,0.72 0 0 1 0.5,0.16 z"
inkscape:connector-curvature="0" /></g><g
style="fill:#fff7d4;fill-opacity:1"
id="g190"
transform="translate(226.64206,-142.76619)"><path
id="path182"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -230.79,227.71 a 0.4,0.4 0 0 1 -0.19,0.36 0.91,0.91 0 0 1 -0.54,0.1 h -0.2 a 1.45,1.45 0 0 1 -1,-0.38 1.27,1.27 0 0 1 -0.33,-0.93 v -1.24 h -0.2 q -0.56,0 -0.56,-0.46 0,-0.46 0.56,-0.46 h 0.2 v -0.46 a 0.55,0.55 0 0 1 0.17,-0.42 0.64,0.64 0 0 1 0.46,-0.16 0.64,0.64 0 0 1 0.46,0.16 0.55,0.55 0 0 1 0.17,0.42 v 0.46 h 0.38 q 0.56,0 0.56,0.46 0,0.46 -0.56,0.46 h -0.38 V 227 a 0.32,0.32 0 0 0 0.08,0.22 0.29,0.29 0 0 0 0.21,0.1 h 0.2 q 0.51,0 0.51,0.39 z"
inkscape:connector-curvature="0" /><path
id="path184"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -226.08,227.25 a 0.47,0.47 0 0 1 0.15,0.38 c 0,0.35 -0.2,0.52 -0.61,0.52 H -229 c -0.41,0 -0.61,-0.17 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.47,0.47 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.19,1.19 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.5,0.11 z"
inkscape:connector-curvature="0" /><path
id="path186"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -224.53,228.62 a 0.48,0.48 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.47,0.47 0 0 1 0,-0.16 l 1.59,-5 a 0.48,0.48 0 0 1 0.18,-0.25 0.47,0.47 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.78,0.78 0 0 1 0,0.15 l -1.59,5 a 0.48,0.48 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path188"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -218.23,227.24 a 0.46,0.46 0 0 1 0.15,0.38 0.48,0.48 0 0 1 -0.15,0.39 0.7,0.7 0 0 1 -0.46,0.13 h -2.55 a 0.53,0.53 0 0 1 -0.4,-0.15 0.52,0.52 0 0 1 -0.15,-0.38 0.77,0.77 0 0 1 0.24,-0.55 l 1.48,-1.55 a 1.36,1.36 0 0 0 0.46,-0.89 0.47,0.47 0 0 0 -0.14,-0.36 0.55,0.55 0 0 0 -0.39,-0.13 1.15,1.15 0 0 0 -0.37,0.06 3.38,3.38 0 0 0 -0.4,0.17 l -0.14,0.07 -0.11,0.06 -0.14,0.07 h -0.13 a 0.36,0.36 0 0 1 -0.29,-0.16 0.6,0.6 0 0 1 -0.12,-0.37 0.6,0.6 0 0 1 0,-0.25 0.46,0.46 0 0 1 0.17,-0.18 2.73,2.73 0 0 1 0.74,-0.35 2.74,2.74 0 0 1 0.81,-0.13 2.25,2.25 0 0 1 0.91,0.17 1.36,1.36 0 0 1 0.61,0.49 1.28,1.28 0 0 1 0.21,0.73 1.76,1.76 0 0 1 -0.17,0.78 3.29,3.29 0 0 1 -0.58,0.79 l -1,1 h 1.41 a 0.72,0.72 0 0 1 0.5,0.16 z"
inkscape:connector-curvature="0" /></g><g
style="fill:#fff7d4;fill-opacity:1"
id="g208"
transform="translate(224.49293,-124.52209)"><path
id="path202"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -226.08,248.94 a 0.47,0.47 0 0 1 0.15,0.38 q 0,0.52 -0.61,0.52 H -229 q -0.61,0 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.48,0.48 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.18,1.18 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.5,0.11 z"
inkscape:connector-curvature="0" /><path
id="path204"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -224.52,250.31 a 0.47,0.47 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.46,0.46 0 0 1 0,-0.16 l 1.59,-5 a 0.47,0.47 0 0 1 0.18,-0.25 0.46,0.46 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.77,0.77 0 0 1 0,0.15 l -1.59,5 a 0.47,0.47 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path206"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -217.87,248.51 q 0,0.5 -0.61,0.5 h -0.15 v 0.24 a 0.62,0.62 0 0 1 -0.18,0.48 0.64,0.64 0 0 1 -0.46,0.16 0.63,0.63 0 0 1 -0.45,-0.16 0.62,0.62 0 0 1 -0.17,-0.48 V 249 h -1.56 a 0.53,0.53 0 0 1 -0.4,-0.15 0.54,0.54 0 0 1 -0.15,-0.38 0.78,0.78 0 0 1 0.15,-0.46 l 2,-2.86 a 0.65,0.65 0 0 1 0.25,-0.21 0.69,0.69 0 0 1 0.31,-0.07 0.66,0.66 0 0 1 0.46,0.17 0.6,0.6 0 0 1 0.19,0.47 V 248 h 0.15 q 0.62,0 0.62,0.51 z m -2.86,-0.48 h 0.84 v -1.21 z"
inkscape:connector-curvature="0" /></g><g
style="fill:#fff7d4;fill-opacity:1"
id="g228"
transform="translate(226.67768,-106.27796)"><path
id="path220"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -233.29,270.75 a 1.24,1.24 0 0 1 -0.47,-0.45 1.19,1.19 0 0 1 -0.17,-0.63 1.2,1.2 0 0 1 0.16,-0.61 1.27,1.27 0 0 1 0.46,-0.46 1.23,1.23 0 0 1 0.65,-0.17 1.25,1.25 0 0 1 0.63,0.16 1.28,1.28 0 0 1 0.47,0.45 1.18,1.18 0 0 1 0.18,0.63 1.17,1.17 0 0 1 -0.17,0.62 1.27,1.27 0 0 1 -0.46,0.45 1.24,1.24 0 0 1 -0.63,0.17 1.27,1.27 0 0 1 -0.65,-0.16 z"
inkscape:connector-curvature="0" /><path
id="path222"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -226.08,270.64 a 0.47,0.47 0 0 1 0.15,0.38 c 0,0.35 -0.2,0.52 -0.61,0.52 H -229 c -0.41,0 -0.61,-0.17 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 V 268 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.47,0.47 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.19,1.19 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.5,0.09 z"
inkscape:connector-curvature="0" /><path
id="path224"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -224.52,272 a 0.48,0.48 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.47,0.47 0 0 1 0,-0.16 l 1.59,-5 a 0.48,0.48 0 0 1 0.18,-0.25 0.47,0.47 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.78,0.78 0 0 1 0,0.15 l -1.59,5 a 0.48,0.48 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path226"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -218.26,269.42 a 1.22,1.22 0 0 1 0.23,0.75 1.21,1.21 0 0 1 -0.52,1 2.4,2.4 0 0 1 -1.42,0.38 2.4,2.4 0 0 1 -1.42,-0.37 1.21,1.21 0 0 1 -0.52,-1 1.23,1.23 0 0 1 0.23,-0.77 1.17,1.17 0 0 1 0.68,-0.41 1.15,1.15 0 0 1 -0.56,-0.43 1.19,1.19 0 0 1 -0.2,-0.68 1.16,1.16 0 0 1 0.49,-1 2.19,2.19 0 0 1 1.32,-0.36 2.18,2.18 0 0 1 1.33,0.36 1.16,1.16 0 0 1 0.49,1 1.21,1.21 0 0 1 -0.2,0.7 1.05,1.05 0 0 1 -0.55,0.41 1.21,1.21 0 0 1 0.62,0.42 z m -1,0.65 q 0,-0.55 -0.76,-0.55 -0.76,0 -0.76,0.55 0,0.55 0.76,0.55 0.76,0 0.8,-0.55 z m -1.23,-2.44 a 0.48,0.48 0 0 0 -0.15,0.4 0.49,0.49 0 0 0 0.15,0.4 0.73,0.73 0 0 0 0.47,0.13 0.73,0.73 0 0 0 0.47,-0.13 0.49,0.49 0 0 0 0.15,-0.4 0.48,0.48 0 0 0 -0.15,-0.4 0.75,0.75 0 0 0 -0.47,-0.12 0.75,0.75 0 0 0 -0.43,0.12 z"
inkscape:connector-curvature="0" /></g><g
style="fill:#fff7d4;fill-opacity:1"
id="g246"
transform="translate(226.61762,-88.043824)"><path
id="path238"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -230.79,292.8 a 0.4,0.4 0 0 1 -0.19,0.36 0.91,0.91 0 0 1 -0.54,0.1 h -0.2 a 1.45,1.45 0 0 1 -1,-0.38 1.27,1.27 0 0 1 -0.33,-0.93 v -1.25 h -0.2 q -0.56,0 -0.56,-0.46 0,-0.46 0.56,-0.46 h 0.2 v -0.46 a 0.55,0.55 0 0 1 0.17,-0.42 0.64,0.64 0 0 1 0.46,-0.16 0.64,0.64 0 0 1 0.46,0.16 0.55,0.55 0 0 1 0.17,0.42 v 0.46 h 0.38 q 0.56,0 0.56,0.46 0,0.46 -0.56,0.46 h -0.38 v 1.3 a 0.32,0.32 0 0 0 0.08,0.22 0.29,0.29 0 0 0 0.21,0.1 h 0.2 q 0.51,0.09 0.51,0.48 z"
inkscape:connector-curvature="0" /><path
id="path240"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -226.08,292.33 a 0.47,0.47 0 0 1 0.15,0.38 c 0,0.35 -0.2,0.52 -0.61,0.52 H -229 c -0.41,0 -0.61,-0.17 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.47,0.47 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.19,1.19 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.5,0.11 z"
inkscape:connector-curvature="0" /><path
id="path242"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -224.52,293.7 a 0.48,0.48 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.47,0.47 0 0 1 0,-0.16 l 1.59,-5 a 0.48,0.48 0 0 1 0.18,-0.25 0.47,0.47 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.78,0.78 0 0 1 0,0.15 l -1.59,5 a 0.48,0.48 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path244"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -218.26,291.12 a 1.22,1.22 0 0 1 0.23,0.75 1.21,1.21 0 0 1 -0.52,1 2.4,2.4 0 0 1 -1.42,0.38 2.4,2.4 0 0 1 -1.42,-0.37 1.21,1.21 0 0 1 -0.52,-1 1.23,1.23 0 0 1 0.23,-0.77 1.17,1.17 0 0 1 0.66,-0.42 1.15,1.15 0 0 1 -0.56,-0.43 1.19,1.19 0 0 1 -0.2,-0.68 1.16,1.16 0 0 1 0.49,-1 2.19,2.19 0 0 1 1.32,-0.36 2.18,2.18 0 0 1 1.33,0.36 1.16,1.16 0 0 1 0.49,1 1.21,1.21 0 0 1 -0.2,0.7 1.05,1.05 0 0 1 -0.55,0.41 1.21,1.21 0 0 1 0.64,0.43 z m -1,0.65 q 0,-0.55 -0.76,-0.55 -0.76,0 -0.76,0.55 0,0.55 0.76,0.55 0.76,0 0.8,-0.56 z m -1.23,-2.44 a 0.48,0.48 0 0 0 -0.15,0.4 0.49,0.49 0 0 0 0.15,0.4 0.73,0.73 0 0 0 0.47,0.13 0.73,0.73 0 0 0 0.47,-0.13 0.49,0.49 0 0 0 0.15,-0.4 0.48,0.48 0 0 0 -0.15,-0.4 0.75,0.75 0 0 0 -0.47,-0.12 0.75,0.75 0 0 0 -0.43,0.12 z"
inkscape:connector-curvature="0" /></g><g
style="fill:#fff7d4;fill-opacity:1"
id="g268"
transform="translate(227.0426,-69.809727)"><path
id="path260"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -231,314 a 0.47,0.47 0 0 1 0.15,0.38 q 0,0.52 -0.61,0.52 h -2.43 q -0.61,0 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.48,0.48 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.18,1.18 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 A 0.7,0.7 0 0 1 -231,314 Z"
inkscape:connector-curvature="0" /><path
id="path262"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -229.42,315.4 a 0.47,0.47 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.46,0.46 0 0 1 0,-0.16 l 1.59,-5 a 0.47,0.47 0 0 1 0.18,-0.25 0.46,0.46 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.77,0.77 0 0 1 0,0.15 l -1.59,5 a 0.47,0.47 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path264"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -222.93,314 a 0.47,0.47 0 0 1 0.15,0.38 q 0,0.52 -0.61,0.52 h -2.43 q -0.61,0 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.48,0.48 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.18,1.18 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.47,0.11 z"
inkscape:connector-curvature="0" /><path
id="path266"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -218.8,311.88 a 1.45,1.45 0 0 1 0.53,0.57 1.77,1.77 0 0 1 0.19,0.83 1.75,1.75 0 0 1 -0.22,0.88 1.56,1.56 0 0 1 -0.61,0.61 1.81,1.81 0 0 1 -0.89,0.22 1.88,1.88 0 0 1 -1.53,-0.64 2.78,2.78 0 0 1 -0.54,-1.83 3.4,3.4 0 0 1 0.26,-1.37 2,2 0 0 1 0.72,-0.9 1.89,1.89 0 0 1 1.09,-0.31 2.72,2.72 0 0 1 0.8,0.13 2.23,2.23 0 0 1 0.7,0.35 0.61,0.61 0 0 1 0.17,0.19 0.52,0.52 0 0 1 0.05,0.25 0.56,0.56 0 0 1 -0.12,0.37 0.37,0.37 0 0 1 -0.3,0.15 0.47,0.47 0 0 1 -0.17,0 l -0.21,-0.1 -0.15,-0.08 -0.38,-0.17 a 0.94,0.94 0 0 0 -0.32,-0.06 0.67,0.67 0 0 0 -0.58,0.33 1.85,1.85 0 0 0 -0.26,0.91 1.12,1.12 0 0 1 0.43,-0.35 1.35,1.35 0 0 1 0.59,-0.13 1.41,1.41 0 0 1 0.75,0.15 z m -0.64,1.94 a 0.7,0.7 0 0 0 0.16,-0.48 0.71,0.71 0 0 0 -0.16,-0.49 0.56,0.56 0 0 0 -0.44,-0.18 0.56,0.56 0 0 0 -0.44,0.18 0.69,0.69 0 0 0 -0.16,0.48 0.69,0.69 0 0 0 0.17,0.48 0.56,0.56 0 0 0 0.43,0.19 0.55,0.55 0 0 0 0.43,-0.18 z"
inkscape:connector-curvature="0" /></g><g
style="fill:#fff7d4;fill-opacity:1"
id="g292"
transform="translate(229.15212,-51.565606)"><path
id="path282"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -238.19,335.84 a 1.26,1.26 0 0 1 -0.47,-0.45 1.19,1.19 0 0 1 -0.17,-0.63 1.2,1.2 0 0 1 0.16,-0.61 1.27,1.27 0 0 1 0.46,-0.46 1.23,1.23 0 0 1 0.65,-0.18 1.25,1.25 0 0 1 0.63,0.17 1.27,1.27 0 0 1 0.47,0.45 1.18,1.18 0 0 1 0.18,0.63 1.18,1.18 0 0 1 -0.17,0.62 1.29,1.29 0 0 1 -0.46,0.45 1.24,1.24 0 0 1 -0.63,0.17 1.27,1.27 0 0 1 -0.65,-0.16 z"
inkscape:connector-curvature="0" /><path
id="path284"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -231,335.72 a 0.47,0.47 0 0 1 0.15,0.38 q 0,0.52 -0.61,0.52 h -2.43 q -0.61,0 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.48,0.48 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.18,1.18 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.47,0.11 z"
inkscape:connector-curvature="0" /><path
id="path286"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -229.43,337.09 a 0.47,0.47 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.46,0.46 0 0 1 0,-0.16 l 1.59,-5 a 0.47,0.47 0 0 1 0.18,-0.25 0.46,0.46 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.77,0.77 0 0 1 0,0.15 l -1.59,5 a 0.47,0.47 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path288"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -223.35,334.51 a 1.24,1.24 0 0 1 0.23,0.76 1.22,1.22 0 0 1 -0.23,0.74 1.47,1.47 0 0 1 -0.65,0.49 2.61,2.61 0 0 1 -1,0.17 3.13,3.13 0 0 1 -0.87,-0.12 2.27,2.27 0 0 1 -0.73,-0.35 0.55,0.55 0 0 1 -0.17,-0.19 0.55,0.55 0 0 1 0,-0.24 0.57,0.57 0 0 1 0.12,-0.37 0.36,0.36 0 0 1 0.29,-0.15 0.47,0.47 0 0 1 0.18,0 l 0.21,0.1 h 0.07 0.09 a 3.12,3.12 0 0 0 0.4,0.17 1.26,1.26 0 0 0 0.4,0.06 1,1 0 0 0 0.56,-0.13 0.49,0.49 0 0 0 0.17,-0.42 0.44,0.44 0 0 0 -0.17,-0.39 1.06,1.06 0 0 0 -0.57,-0.12 h -0.43 a 0.4,0.4 0 0 1 -0.33,-0.15 0.54,0.54 0 0 1 -0.12,-0.35 0.54,0.54 0 0 1 0.12,-0.35 0.4,0.4 0 0 1 0.33,-0.15 h 0.31 a 1.07,1.07 0 0 0 0.56,-0.11 0.39,0.39 0 0 0 0.17,-0.36 0.52,0.52 0 0 0 -0.15,-0.4 0.6,0.6 0 0 0 -0.43,-0.14 1.06,1.06 0 0 0 -0.37,0.06 l -0.38,0.17 -0.15,0.07 -0.21,0.1 a 0.47,0.47 0 0 1 -0.17,0 0.36,0.36 0 0 1 -0.29,-0.15 0.57,0.57 0 0 1 -0.12,-0.37 0.54,0.54 0 0 1 0,-0.25 0.56,0.56 0 0 1 0.17,-0.19 2.32,2.32 0 0 1 0.71,-0.35 2.8,2.8 0 0 1 0.83,-0.13 2.31,2.31 0 0 1 0.91,0.17 1.37,1.37 0 0 1 0.61,0.48 1.23,1.23 0 0 1 0.21,0.71 1.16,1.16 0 0 1 -0.2,0.68 1.14,1.14 0 0 1 -0.56,0.42 1.19,1.19 0 0 1 0.65,0.58 z"
inkscape:connector-curvature="0" /><path
id="path290"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -218.23,335.72 a 0.46,0.46 0 0 1 0.15,0.38 0.48,0.48 0 0 1 -0.15,0.39 0.7,0.7 0 0 1 -0.46,0.13 h -2.55 a 0.53,0.53 0 0 1 -0.4,-0.15 0.52,0.52 0 0 1 -0.15,-0.38 0.77,0.77 0 0 1 0.24,-0.55 l 1.48,-1.55 a 1.36,1.36 0 0 0 0.46,-0.89 0.47,0.47 0 0 0 -0.14,-0.36 0.55,0.55 0 0 0 -0.39,-0.13 1.13,1.13 0 0 0 -0.37,0.06 3.36,3.36 0 0 0 -0.4,0.17 l -0.14,0.07 -0.11,0.06 -0.14,0.07 h -0.13 a 0.35,0.35 0 0 1 -0.29,-0.16 0.6,0.6 0 0 1 -0.12,-0.37 0.6,0.6 0 0 1 0,-0.25 0.47,0.47 0 0 1 0.17,-0.18 2.72,2.72 0 0 1 0.74,-0.35 2.74,2.74 0 0 1 0.81,-0.13 2.25,2.25 0 0 1 0.91,0.17 1.38,1.38 0 0 1 0.61,0.49 1.29,1.29 0 0 1 0.21,0.73 1.76,1.76 0 0 1 -0.17,0.78 3.27,3.27 0 0 1 -0.58,0.79 l -1,1 h 1.41 a 0.71,0.71 0 0 1 0.5,0.16 z"
inkscape:connector-curvature="0" /></g><g
style="fill:#fff7d4;fill-opacity:1"
id="g314"
transform="translate(229.09206,-33.33147)"><path
id="path304"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -235.69,357.89 a 0.4,0.4 0 0 1 -0.19,0.36 0.91,0.91 0 0 1 -0.54,0.1 h -0.2 a 1.45,1.45 0 0 1 -1,-0.38 1.27,1.27 0 0 1 -0.33,-0.93 v -1.24 h -0.2 q -0.56,0 -0.56,-0.46 0,-0.46 0.56,-0.46 h 0.2 v -0.46 a 0.55,0.55 0 0 1 0.17,-0.42 0.64,0.64 0 0 1 0.46,-0.16 0.64,0.64 0 0 1 0.46,0.16 0.55,0.55 0 0 1 0.17,0.42 v 0.46 h 0.38 q 0.56,0 0.56,0.46 0,0.46 -0.56,0.46 h -0.38 v 1.34 a 0.32,0.32 0 0 0 0.08,0.22 0.29,0.29 0 0 0 0.21,0.1 h 0.2 q 0.5,0.04 0.51,0.43 z"
inkscape:connector-curvature="0" /><path
id="path306"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -231,357.42 a 0.47,0.47 0 0 1 0.15,0.38 c 0,0.35 -0.2,0.52 -0.61,0.52 h -2.43 c -0.41,0 -0.61,-0.17 -0.61,-0.52 a 0.47,0.47 0 0 1 0.15,-0.38 0.7,0.7 0 0 1 0.46,-0.13 h 0.57 v -2.53 l -0.56,0.33 a 0.48,0.48 0 0 1 -0.25,0.07 0.42,0.42 0 0 1 -0.34,-0.17 0.59,0.59 0 0 1 -0.14,-0.38 0.47,0.47 0 0 1 0.25,-0.43 l 1.12,-0.65 a 1.19,1.19 0 0 1 0.58,-0.17 0.62,0.62 0 0 1 0.45,0.17 0.61,0.61 0 0 1 0.17,0.46 v 3.32 h 0.57 a 0.7,0.7 0 0 1 0.47,0.11 z"
inkscape:connector-curvature="0" /><path
id="path308"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -229.43,358.79 a 0.48,0.48 0 0 1 -0.28,0.08 0.51,0.51 0 0 1 -0.34,-0.13 0.4,0.4 0 0 1 -0.15,-0.32 0.47,0.47 0 0 1 0,-0.16 l 1.59,-5 a 0.48,0.48 0 0 1 0.18,-0.25 0.47,0.47 0 0 1 0.27,-0.08 0.52,0.52 0 0 1 0.35,0.13 0.41,0.41 0 0 1 0.15,0.33 0.78,0.78 0 0 1 0,0.15 l -1.59,5 a 0.48,0.48 0 0 1 -0.18,0.25 z"
inkscape:connector-curvature="0" /><path
id="path310"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -223.35,356.21 a 1.24,1.24 0 0 1 0.23,0.76 1.22,1.22 0 0 1 -0.23,0.74 1.47,1.47 0 0 1 -0.65,0.49 2.63,2.63 0 0 1 -1,0.17 3.09,3.09 0 0 1 -0.87,-0.12 2.23,2.23 0 0 1 -0.73,-0.35 0.55,0.55 0 0 1 -0.17,-0.19 0.55,0.55 0 0 1 0,-0.24 0.58,0.58 0 0 1 0.12,-0.37 0.36,0.36 0 0 1 0.29,-0.15 0.45,0.45 0 0 1 0.18,0 l 0.21,0.1 h 0.07 0.09 a 3.14,3.14 0 0 0 0.4,0.17 1.29,1.29 0 0 0 0.4,0.06 1,1 0 0 0 0.56,-0.13 0.49,0.49 0 0 0 0.17,-0.42 0.44,0.44 0 0 0 -0.17,-0.39 1.06,1.06 0 0 0 -0.57,-0.12 h -0.43 a 0.4,0.4 0 0 1 -0.33,-0.15 0.54,0.54 0 0 1 -0.12,-0.35 0.54,0.54 0 0 1 0.12,-0.35 0.4,0.4 0 0 1 0.33,-0.15 h 0.31 a 1.08,1.08 0 0 0 0.56,-0.11 0.39,0.39 0 0 0 0.17,-0.36 0.52,0.52 0 0 0 -0.15,-0.4 0.6,0.6 0 0 0 -0.43,-0.14 1.06,1.06 0 0 0 -0.37,0.06 l -0.38,0.17 -0.15,0.07 -0.21,0.1 a 0.45,0.45 0 0 1 -0.17,0 0.36,0.36 0 0 1 -0.29,-0.15 0.57,0.57 0 0 1 -0.12,-0.37 0.55,0.55 0 0 1 0,-0.25 0.56,0.56 0 0 1 0.17,-0.19 2.32,2.32 0 0 1 0.71,-0.35 2.8,2.8 0 0 1 0.83,-0.13 2.33,2.33 0 0 1 0.91,0.17 1.38,1.38 0 0 1 0.61,0.48 1.22,1.22 0 0 1 0.21,0.71 1.16,1.16 0 0 1 -0.2,0.68 1.13,1.13 0 0 1 -0.56,0.42 1.2,1.2 0 0 1 0.65,0.58 z"
inkscape:connector-curvature="0" /><path
id="path312"
style="fill:#fff7d4;fill-opacity:1"
transform="translate(270.37)"
d="m -218.23,357.42 a 0.46,0.46 0 0 1 0.15,0.38 0.48,0.48 0 0 1 -0.15,0.39 0.7,0.7 0 0 1 -0.46,0.13 h -2.55 a 0.53,0.53 0 0 1 -0.4,-0.15 0.52,0.52 0 0 1 -0.15,-0.38 0.77,0.77 0 0 1 0.24,-0.55 l 1.48,-1.55 a 1.36,1.36 0 0 0 0.46,-0.89 0.47,0.47 0 0 0 -0.14,-0.36 0.55,0.55 0 0 0 -0.39,-0.13 1.15,1.15 0 0 0 -0.37,0.06 3.38,3.38 0 0 0 -0.4,0.17 l -0.14,0.07 -0.11,0.06 -0.14,0.07 h -0.13 a 0.36,0.36 0 0 1 -0.29,-0.16 0.6,0.6 0 0 1 -0.12,-0.37 0.6,0.6 0 0 1 0,-0.25 0.46,0.46 0 0 1 0.17,-0.18 2.73,2.73 0 0 1 0.74,-0.35 2.74,2.74 0 0 1 0.81,-0.13 2.25,2.25 0 0 1 0.91,0.17 1.36,1.36 0 0 1 0.61,0.49 1.28,1.28 0 0 1 0.21,0.73 1.76,1.76 0 0 1 -0.17,0.78 3.29,3.29 0 0 1 -0.58,0.79 l -1,1 h 1.41 a 0.72,0.72 0 0 1 0.5,0.16 z"
inkscape:connector-curvature="0" /></g></g></g></g><g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2" /></svg>

+ 761
- 0
vst2_bin/plugins/AS/res/BPMClock.svg View File

@@ -0,0 +1,761 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="90"
height="380"
viewBox="0 0 23.812499 100.54167"
version="1.1"
id="svg5269"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
sodipodi:docname="BPMClock.svg">
<defs
id="defs5263" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="8.7383513"
inkscape:cx="38.749176"
inkscape:cy="153.37982"
inkscape:document-units="mm"
inkscape:current-layer="layer3"
showgrid="true"
units="px"
inkscape:window-width="1318"
inkscape:window-height="1351"
inkscape:window-x="158"
inkscape:window-y="0"
inkscape:window-maximized="0"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
type="xygrid"
id="grid5814"
empspacing="15"
dotted="false" />
</sodipodi:namedview>
<metadata
id="metadata5266">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="bg 2"
style="display:inline">
<g
id="g166"
transform="matrix(0.26755618,0,0,0.26458333,-31.705405,0)"
style="fill:#44423e;fill-opacity:1">
<polygon
points="207.5,29.98 118.5,29.98 118.5,287.57 207.5,287.57 207.5,272.35 "
style="fill:#44423e;fill-opacity:1"
id="polygon156" />
<polygon
points="118.5,380 207.5,380 207.5,291.45 118.5,291.45 118.5,297.78 "
style="fill:#44423e;fill-opacity:1"
id="polygon158" />
<polygon
points="118.5,287.57 118.5,291.45 207.5,291.45 207.5,287.57 "
style="fill:#44423e;fill-opacity:1"
id="polygon160"
transform="matrix(1,0,0,1.7442041,0,-215.34345)" />
<polygon
points="207.5,0 118.5,0 118.5,26.09 207.5,26.1 207.5,16.51 "
style="fill:#44423e;fill-opacity:1"
id="polygon162" />
<polygon
points="118.5,29.98 207.5,29.98 207.5,29.81 207.5,26.1 118.5,26.09 "
style="fill:#44423e;fill-opacity:1"
id="polygon164"
transform="matrix(1,0,0,1.8212547,0,-22.815527)" />
</g>
<g
style="fill:#3c3835;fill-opacity:1"
id="g919"
data-name="Layer 2"
transform="matrix(2.0981223,0,0,2.0981223,-117.23465,-700.93765)">
<g
style="fill:#3c3835;fill-opacity:1"
id="g917"
data-name="Layer 1-2">
<path
id="path915"
class="cls-4"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
inkscape:connector-curvature="0"
style="fill:#3c3835;fill-opacity:1" />
</g>
</g>
<g
style="fill:#3c3835;fill-opacity:1"
id="g925"
data-name="Layer 2"
transform="matrix(2.0981223,0,0,2.0981223,-117.23465,-700.93765)">
<g
style="fill:#3c3835;fill-opacity:1"
id="g923"
data-name="Layer 1-2">
<path
id="path921"
class="cls-4"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
inkscape:connector-curvature="0"
style="fill:#3c3835;fill-opacity:1" />
</g>
</g>
<g
style="fill:#3c3835;fill-opacity:1"
id="g931"
data-name="Layer 2"
transform="matrix(2.0981223,0,0,2.0981223,-117.23465,-700.93765)">
<g
style="fill:#3c3835;fill-opacity:1"
id="g929"
data-name="Layer 1-2">
<path
id="path927"
class="cls-4"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
inkscape:connector-curvature="0"
style="fill:#3c3835;fill-opacity:1" />
</g>
</g>
<g
style="fill:#3c3835;fill-opacity:1"
id="g937"
data-name="Layer 2"
transform="matrix(2.0981223,0,0,2.0981223,-117.23465,-700.93765)">
<g
style="fill:#3c3835;fill-opacity:1"
id="g935"
data-name="Layer 1-2">
<path
id="path933"
class="cls-4"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
inkscape:connector-curvature="0"
style="fill:#3c3835;fill-opacity:1" />
</g>
</g>
<g
style="fill:#3c3835;fill-opacity:1"
id="g943"
data-name="Layer 2"
transform="matrix(2.0981223,0,0,2.0981223,-115.9842,-700.72227)">
<g
style="fill:#3c3835;fill-opacity:1"
id="g941"
data-name="Layer 1-2">
<path
id="path939"
class="cls-4"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
inkscape:connector-curvature="0"
style="fill:#3c3835;fill-opacity:1" />
</g>
</g>
<g
style="fill:#3c3835;fill-opacity:1"
id="g949"
data-name="Layer 2"
transform="matrix(2.0981223,0,0,2.0981223,-115.9842,-700.72227)">
<g
style="fill:#3c3835;fill-opacity:1"
id="g947"
data-name="Layer 1-2">
<path
id="path945"
class="cls-4"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
inkscape:connector-curvature="0"
style="fill:#3c3835;fill-opacity:1" />
</g>
</g>
<g
style="fill:#3c3835;fill-opacity:1"
id="g955"
data-name="Layer 2"
transform="matrix(2.0981223,0,0,2.0981223,-115.9842,-700.72227)">
<g
style="fill:#3c3835;fill-opacity:1"
id="g953"
data-name="Layer 1-2">
<path
id="path951"
class="cls-4"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
inkscape:connector-curvature="0"
style="fill:#3c3835;fill-opacity:1" />
</g>
</g>
<g
transform="matrix(2.0981223,0,0,2.0981223,-113.92693,-706.23001)"
data-name="Layer 2"
id="g1661"
style="fill:#3c3835;fill-opacity:1">
<g
data-name="Layer 1-2"
id="g1659"
style="fill:#3c3835;fill-opacity:1">
<path
style="fill:#3c3835;fill-opacity:1"
inkscape:connector-curvature="0"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
class="cls-4"
id="path1657" />
</g>
</g>
<rect
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.22310618;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1759"
width="23.8125"
height="3.96875"
x="3.7916682e-06"
y="96.572906" />
<rect
y="0"
x="3.7916682e-06"
height="3.96875"
width="23.8125"
id="rect1806"
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.22310618;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<g
transform="matrix(0.26458333,0,0,0.26458333,3.1779159e-6,-3.667036e-6)"
id="g1614">
<circle
r="15.118111"
cy="359.88181"
cx="44.999989"
id="path1686"
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.74390346;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<g
transform="matrix(0.66602928,0,0,0.66602928,5.0554261,118.9929)"
data-name="Layer 2"
id="Layer_2-2"
style="fill:#fff7d4;fill-opacity:1">
<g
data-name="Layer 1-2"
id="Layer_1-2-6"
style="fill:#fff7d4;fill-opacity:1">
<path
style="fill:#fff7d4;fill-opacity:1"
inkscape:connector-curvature="0"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
class="cls-4"
id="path8-4-6" />
</g>
</g>
</g>
<g
id="g1660"
transform="translate(-0.01851772)">
<rect
ry="1.3924577"
y="0.74168032"
x="3.5040054"
height="2.5"
width="5"
id="rect861"
style="opacity:1;vector-effect:none;fill:#251e1e;fill-opacity:1;stroke:none;stroke-width:0.15187515;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="opacity:1;vector-effect:none;fill:#251e1e;fill-opacity:1;stroke:none;stroke-width:0.15187515;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect863"
width="5"
height="2.5"
x="3.5040054"
y="97.441681"
ry="1.3924577" />
<path
inkscape:connector-curvature="0"
id="path1191"
d="m 16.737997,0.74152337 c -0.771421,0 -1.392163,0.55756003 -1.392163,1.25006003 0,0.6925 0.620742,1.2500501 1.392163,1.2500501 h 2.21537 c 0.771422,0 1.392161,-0.5575501 1.392161,-1.2500501 0,-0.6925 -0.620739,-1.25006003 -1.392161,-1.25006003 z"
style="opacity:1;vector-effect:none;fill:#251e1e;fill-opacity:1;stroke:none;stroke-width:0.15187515;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="rect865"
d="m 16.737997,97.441605 c -0.771421,0 -1.392163,0.557548 -1.392163,1.25005 0,0.692499 0.620742,1.25005 1.392163,1.25005 h 2.21537 c 0.771422,0 1.392161,-0.557551 1.392161,-1.25005 0,-0.692502 -0.620739,-1.25005 -1.392161,-1.25005 z"
style="opacity:1;vector-effect:none;fill:#251e1e;fill-opacity:1;stroke:none;stroke-width:0.15187515;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
</g>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-196.45832)"
style="display:none">
<g
transform="translate(26.458334,196.45832)"
style="display:inline"
id="g1596">
<rect
ry="0.78382814"
y="27.08441"
x="2.1166666"
height="62.706249"
width="7.5142331"
id="rect1741"
style="opacity:1;vector-effect:none;fill:#202020;fill-opacity:1;stroke:none;stroke-width:0.65668011;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" />
<rect
style="opacity:1;vector-effect:none;fill:#202020;fill-opacity:1;stroke:none;stroke-width:0.65668011;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
id="rect1783"
width="7.5142331"
height="62.706249"
x="14.084242"
y="27.08441"
ry="0.78382814" />
<g
transform="matrix(0.26458333,0,0,0.26458333,12.170834,-6.2500007e-8)"
id="g2412">
<path
id="path2402"
style="fill:#fff8d5"
d="m 23.88,125.20991 a 0.41,0.41 0 0 1 -0.15,0.32 0.52,0.52 0 0 1 -0.35,0.13 0.46,0.46 0 0 1 -0.24,-0.07 0.45,0.45 0 0 1 -0.18,-0.21 l -0.36,-0.8 h -2.31 l -0.36,0.8 a 0.46,0.46 0 0 1 -0.17,0.21 0.45,0.45 0 0 1 -0.25,0.07 0.53,0.53 0 0 1 -0.35,-0.13 0.41,0.41 0 0 1 -0.16,-0.32 0.55,0.55 0 0 1 0.05,-0.22 l 1.84,-3.86 a 0.54,0.54 0 0 1 0.22,-0.25 0.64,0.64 0 0 1 0.32,-0.08 0.63,0.63 0 0 1 0.33,0.09 0.6,0.6 0 0 1 0.23,0.25 l 1.84,3.86 a 0.54,0.54 0 0 1 0.05,0.21 z m -3.23,-1.44 h 1.58 l -0.79,-1.77 z"
inkscape:connector-curvature="0" />
<path
id="path2404"
style="fill:#fff8d5"
d="m 23.189136,165.91622 a 1.2,1.2 0 0 1 0.23,0.74 1.16,1.16 0 0 1 -0.45,1 1.92,1.92 0 0 1 -1.23,0.35 h -1.78 a 0.5,0.5 0 0 1 -0.37,-0.13 0.5,0.5 0 0 1 -0.13,-0.37 v -3.8 a 0.5,0.5 0 0 1 0.13,-0.37 0.5,0.5 0 0 1 0.37,-0.13 h 1.71 a 1.92,1.92 0 0 1 1.19,0.33 1.08,1.08 0 0 1 0.44,0.91 1.11,1.11 0 0 1 -0.2,0.66 1.14,1.14 0 0 1 -0.55,0.41 1.2,1.2 0 0 1 0.64,0.4 z m -2.69,-0.79 h 1 a 1,1 0 0 0 0.6,-0.14 0.49,0.49 0 0 0 0.19,-0.42 0.5,0.5 0 0 0 -0.19,-0.44 1,1 0 0 0 -0.6,-0.14 h -1 z m 1.73,1.89 a 0.54,0.54 0 0 0 0.19,-0.46 0.56,0.56 0 0 0 -0.19,-0.47 1,1 0 0 0 -0.61,-0.15 h -1.12 v 1.22 h 1.12 a 1,1 0 0 0 0.62,-0.14 z"
inkscape:connector-curvature="0" />
<path
id="path2406"
style="fill:#fff8d5"
d="m 20.529706,215.00026 a 2,2 0 0 1 -0.82,-0.86 2.83,2.83 0 0 1 -0.29,-1.31 2.81,2.81 0 0 1 0.29,-1.3 2,2 0 0 1 0.82,-0.85 2.48,2.48 0 0 1 1.24,-0.3 2.47,2.47 0 0 1 1.54,0.49 0.52,0.52 0 0 1 0.14,0.16 0.45,0.45 0 0 1 0,0.2 0.47,0.47 0 0 1 -0.1,0.3 0.3,0.3 0 0 1 -0.24,0.13 h -0.17 l -0.16,-0.08 a 2.26,2.26 0 0 0 -0.5,-0.25 1.54,1.54 0 0 0 -0.5,-0.08 1.19,1.19 0 0 0 -1,0.4 1.88,1.88 0 0 0 -0.33,1.21 q 0,1.62 1.31,1.62 a 1.43,1.43 0 0 0 0.48,-0.08 3,3 0 0 0 0.52,-0.25 l 0.17,-0.08 h 0.16 a 0.3,0.3 0 0 1 0.24,0.13 0.47,0.47 0 0 1 0.1,0.3 0.45,0.45 0 0 1 0,0.21 0.5,0.5 0 0 1 -0.14,0.16 2.47,2.47 0 0 1 -1.54,0.49 2.48,2.48 0 0 1 -1.22,-0.36 z"
inkscape:connector-curvature="0" />
<path
id="path2408"
style="fill:#fff8d5"
d="m 19.379987,257.9504 a 0.5,0.5 0 0 1 -0.13,-0.37 v -3.8 a 0.5,0.5 0 0 1 0.13,-0.37 0.5,0.5 0 0 1 0.37,-0.13 h 1.37 a 3,3 0 0 1 1.35,0.29 2,2 0 0 1 0.86,0.82 2.6,2.6 0 0 1 0.3,1.29 2.65,2.65 0 0 1 -0.3,1.29 2,2 0 0 1 -0.86,0.83 3,3 0 0 1 -1.35,0.29 h -1.37 a 0.5,0.5 0 0 1 -0.37,-0.14 z m 1.66,-0.73 a 1.36,1.36 0 0 0 1.53,-1.54 1.36,1.36 0 0 0 -1.53,-1.54 h -0.73 v 3.08 z"
inkscape:connector-curvature="0" />
<path
id="path2410"
style="fill:#fff8d5"
d="m 19.865535,305.3204 a 0.5,0.5 0 0 1 -0.13,-0.37 v -3.8 a 0.5,0.5 0 0 1 0.13,-0.37 0.5,0.5 0 0 1 0.37,-0.13 h 2.41 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.42 h -1.87 v 1.12 h 1.73 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.41 h -1.73 v 1.2 h 1.87 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.41 h -2.41 a 0.5,0.5 0 0 1 -0.37,-0.12 z"
inkscape:connector-curvature="0" />
</g>
<g
id="g2424"
transform="scale(0.26458333)">
<path
inkscape:connector-curvature="0"
d="m 23.88,125.20991 a 0.41,0.41 0 0 1 -0.15,0.32 0.52,0.52 0 0 1 -0.35,0.13 0.46,0.46 0 0 1 -0.24,-0.07 0.45,0.45 0 0 1 -0.18,-0.21 l -0.36,-0.8 h -2.31 l -0.36,0.8 a 0.46,0.46 0 0 1 -0.17,0.21 0.45,0.45 0 0 1 -0.25,0.07 0.53,0.53 0 0 1 -0.35,-0.13 0.41,0.41 0 0 1 -0.16,-0.32 0.55,0.55 0 0 1 0.05,-0.22 l 1.84,-3.86 a 0.54,0.54 0 0 1 0.22,-0.25 0.64,0.64 0 0 1 0.32,-0.08 0.63,0.63 0 0 1 0.33,0.09 0.6,0.6 0 0 1 0.23,0.25 l 1.84,3.86 a 0.54,0.54 0 0 1 0.05,0.21 z m -3.23,-1.44 h 1.58 l -0.79,-1.77 z"
style="fill:#fff8d5"
id="path2414" />
<path
inkscape:connector-curvature="0"
d="m 23.189136,165.91622 a 1.2,1.2 0 0 1 0.23,0.74 1.16,1.16 0 0 1 -0.45,1 1.92,1.92 0 0 1 -1.23,0.35 h -1.78 a 0.5,0.5 0 0 1 -0.37,-0.13 0.5,0.5 0 0 1 -0.13,-0.37 v -3.8 a 0.5,0.5 0 0 1 0.13,-0.37 0.5,0.5 0 0 1 0.37,-0.13 h 1.71 a 1.92,1.92 0 0 1 1.19,0.33 1.08,1.08 0 0 1 0.44,0.91 1.11,1.11 0 0 1 -0.2,0.66 1.14,1.14 0 0 1 -0.55,0.41 1.2,1.2 0 0 1 0.64,0.4 z m -2.69,-0.79 h 1 a 1,1 0 0 0 0.6,-0.14 0.49,0.49 0 0 0 0.19,-0.42 0.5,0.5 0 0 0 -0.19,-0.44 1,1 0 0 0 -0.6,-0.14 h -1 z m 1.73,1.89 a 0.54,0.54 0 0 0 0.19,-0.46 0.56,0.56 0 0 0 -0.19,-0.47 1,1 0 0 0 -0.61,-0.15 h -1.12 v 1.22 h 1.12 a 1,1 0 0 0 0.62,-0.14 z"
style="fill:#fff8d5"
id="path2416" />
<path
inkscape:connector-curvature="0"
d="m 20.529706,215.00026 a 2,2 0 0 1 -0.82,-0.86 2.83,2.83 0 0 1 -0.29,-1.31 2.81,2.81 0 0 1 0.29,-1.3 2,2 0 0 1 0.82,-0.85 2.48,2.48 0 0 1 1.24,-0.3 2.47,2.47 0 0 1 1.54,0.49 0.52,0.52 0 0 1 0.14,0.16 0.45,0.45 0 0 1 0,0.2 0.47,0.47 0 0 1 -0.1,0.3 0.3,0.3 0 0 1 -0.24,0.13 h -0.17 l -0.16,-0.08 a 2.26,2.26 0 0 0 -0.5,-0.25 1.54,1.54 0 0 0 -0.5,-0.08 1.19,1.19 0 0 0 -1,0.4 1.88,1.88 0 0 0 -0.33,1.21 q 0,1.62 1.31,1.62 a 1.43,1.43 0 0 0 0.48,-0.08 3,3 0 0 0 0.52,-0.25 l 0.17,-0.08 h 0.16 a 0.3,0.3 0 0 1 0.24,0.13 0.47,0.47 0 0 1 0.1,0.3 0.45,0.45 0 0 1 0,0.21 0.5,0.5 0 0 1 -0.14,0.16 2.47,2.47 0 0 1 -1.54,0.49 2.48,2.48 0 0 1 -1.22,-0.36 z"
style="fill:#fff8d5"
id="path2418" />
<path
inkscape:connector-curvature="0"
d="m 19.379987,257.9504 a 0.5,0.5 0 0 1 -0.13,-0.37 v -3.8 a 0.5,0.5 0 0 1 0.13,-0.37 0.5,0.5 0 0 1 0.37,-0.13 h 1.37 a 3,3 0 0 1 1.35,0.29 2,2 0 0 1 0.86,0.82 2.6,2.6 0 0 1 0.3,1.29 2.65,2.65 0 0 1 -0.3,1.29 2,2 0 0 1 -0.86,0.83 3,3 0 0 1 -1.35,0.29 h -1.37 a 0.5,0.5 0 0 1 -0.37,-0.14 z m 1.66,-0.73 a 1.36,1.36 0 0 0 1.53,-1.54 1.36,1.36 0 0 0 -1.53,-1.54 h -0.73 v 3.08 z"
style="fill:#fff8d5"
id="path2420" />
<path
inkscape:connector-curvature="0"
d="m 19.865535,305.3204 a 0.5,0.5 0 0 1 -0.13,-0.37 v -3.8 a 0.5,0.5 0 0 1 0.13,-0.37 0.5,0.5 0 0 1 0.37,-0.13 h 2.41 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.42 h -1.87 v 1.12 h 1.73 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.41 h -1.73 v 1.2 h 1.87 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.41 h -2.41 a 0.5,0.5 0 0 1 -0.37,-0.12 z"
style="fill:#fff8d5"
id="path2422" />
</g>
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="TXTS"
style="display:inline">
<g
transform="matrix(0.21656532,0,0,0.21656532,-67.733631,35.788165)"
id="g1338">
<path
inkscape:connector-curvature="0"
d="m 43.51,-38.3 a 0.39,0.39 0 0 1 -0.15,0.32 0.55,0.55 0 0 1 -0.36,0.12 0.55,0.55 0 0 1 -0.25,-0.06 0.54,0.54 0 0 1 -0.2,-0.19 l -1.1,-1.68 a 1.08,1.08 0 0 0 -0.35,-0.37 1,1 0 0 0 -0.49,-0.11 H 39.8 v 1.86 a 0.54,0.54 0 0 1 -0.14,0.39 0.51,0.51 0 0 1 -0.38,0.15 0.52,0.52 0 0 1 -0.39,-0.15 0.53,0.53 0 0 1 -0.15,-0.39 v -4.86 a 0.5,0.5 0 0 1 0.14,-0.37 0.52,0.52 0 0 1 0.38,-0.13 h 2.07 a 2.27,2.27 0 0 1 1.52,0.44 1.59,1.59 0 0 1 0.5,1.33 1.62,1.62 0 0 1 -0.35,1.07 1.83,1.83 0 0 1 -1.09,0.56 1,1 0 0 1 0.42,0.21 1.84,1.84 0 0 1 0.36,0.42 l 0.76,1.15 a 0.53,0.53 0 0 1 0.06,0.29 z m -1.45,-3 a 0.85,0.85 0 0 0 0.28,-0.7 0.84,0.84 0 0 0 -0.28,-0.7 1.45,1.45 0 0 0 -0.89,-0.22 h -1.4 v 1.85 h 1.39 a 1.4,1.4 0 0 0 0.9,-0.25 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1332" />
<path
inkscape:connector-curvature="0"
d="m 45.92,-38.47 a 2.46,2.46 0 0 1 -0.62,-1.82 v -3 a 0.53,0.53 0 0 1 0.14,-0.39 0.51,0.51 0 0 1 0.38,-0.15 0.51,0.51 0 0 1 0.38,0.15 0.53,0.53 0 0 1 0.14,0.39 v 3.05 a 1.63,1.63 0 0 0 0.36,1.14 1.36,1.36 0 0 0 1,0.39 1.33,1.33 0 0 0 1,-0.39 1.63,1.63 0 0 0 0.36,-1.14 v -3.05 a 0.53,0.53 0 0 1 0.14,-0.39 0.51,0.51 0 0 1 0.38,-0.15 0.51,0.51 0 0 1 0.38,0.15 0.53,0.53 0 0 1 0.14,0.39 v 3 a 2.47,2.47 0 0 1 -0.62,1.81 2.45,2.45 0 0 1 -1.82,0.63 2.47,2.47 0 0 1 -1.74,-0.62 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1334" />
<path
inkscape:connector-curvature="0"
d="m 57,-43.67 a 0.54,0.54 0 0 1 0.14,0.39 v 4.87 A 0.54,0.54 0 0 1 57,-38 a 0.48,0.48 0 0 1 -0.37,0.15 0.47,0.47 0 0 1 -0.41,-0.19 l -3,-3.94 v 3.59 a 0.57,0.57 0 0 1 -0.13,0.39 0.46,0.46 0 0 1 -0.37,0.15 0.46,0.46 0 0 1 -0.37,-0.15 0.56,0.56 0 0 1 -0.13,-0.39 v -4.87 a 0.53,0.53 0 0 1 0.14,-0.39 0.5,0.5 0 0 1 0.37,-0.15 0.47,0.47 0 0 1 0.4,0.19 l 3,3.93 v -3.59 a 0.54,0.54 0 0 1 0.14,-0.39 0.47,0.47 0 0 1 0.36,-0.15 0.48,0.48 0 0 1 0.37,0.14 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1336" />
</g>
<g
transform="matrix(0.26179895,0,0,0.26179895,-73.41011,28.536056)"
id="g1392">
<path
inkscape:connector-curvature="0"
d="M 25.35,-69.65 A 2.09,2.09 0 0 1 24.6,-70 a 0.48,0.48 0 0 1 -0.15,-0.16 0.46,0.46 0 0 1 0,-0.21 0.46,0.46 0 0 1 0.11,-0.3 0.31,0.31 0 0 1 0.24,-0.13 h 0.15 l 0.17,0.08 a 2.28,2.28 0 0 0 0.59,0.27 2.41,2.41 0 0 0 0.66,0.08 1.3,1.3 0 0 0 0.63,-0.13 0.48,0.48 0 0 0 0.24,-0.43 0.39,0.39 0 0 0 -0.22,-0.34 2.85,2.85 0 0 0 -0.79,-0.24 4.34,4.34 0 0 1 -1,-0.31 1.3,1.3 0 0 1 -0.55,-0.46 1.2,1.2 0 0 1 -0.17,-0.66 1.28,1.28 0 0 1 0.25,-0.77 1.65,1.65 0 0 1 0.69,-0.54 2.43,2.43 0 0 1 1,-0.19 2.53,2.53 0 0 1 1.55,0.44 0.54,0.54 0 0 1 0.15,0.17 0.44,0.44 0 0 1 0,0.21 0.46,0.46 0 0 1 -0.11,0.3 0.31,0.31 0 0 1 -0.24,0.13 h -0.14 l -0.18,-0.09 a 2.83,2.83 0 0 0 -0.51,-0.27 1.71,1.71 0 0 0 -0.6,-0.09 1.16,1.16 0 0 0 -0.65,0.16 0.5,0.5 0 0 0 -0.24,0.44 0.39,0.39 0 0 0 0.09,0.27 0.76,0.76 0 0 0 0.31,0.19 4.55,4.55 0 0 0 0.61,0.17 3.38,3.38 0 0 1 1.33,0.52 1.06,1.06 0 0 1 0.4,0.88 1.28,1.28 0 0 1 -0.24,0.77 1.56,1.56 0 0 1 -0.68,0.52 2.61,2.61 0 0 1 -1,0.18 3.81,3.81 0 0 1 -0.95,-0.11 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1374" />
<path
inkscape:connector-curvature="0"
d="m 29.87,-69.69 a 0.52,0.52 0 0 1 -0.14,-0.39 v -3.81 a 0.51,0.51 0 0 1 0.14,-0.38 0.52,0.52 0 0 1 0.39,-0.14 0.52,0.52 0 0 1 0.39,0.14 0.51,0.51 0 0 1 0.14,0.38 v 3.81 a 0.52,0.52 0 0 1 -0.14,0.39 0.52,0.52 0 0 1 -0.39,0.14 0.52,0.52 0 0 1 -0.39,-0.14 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1376" />
<path
inkscape:connector-curvature="0"
d="m 36.43,-72.13 a 0.38,0.38 0 0 1 0.11,0.29 v 1.33 a 1.57,1.57 0 0 1 0,0.42 0.47,0.47 0 0 1 -0.15,0.24 0.91,0.91 0 0 1 -0.33,0.15 3.88,3.88 0 0 1 -0.61,0.13 4.74,4.74 0 0 1 -0.65,0 2.78,2.78 0 0 1 -1.32,-0.3 2,2 0 0 1 -0.86,-0.85 2.73,2.73 0 0 1 -0.3,-1.32 2.73,2.73 0 0 1 0.3,-1.3 2,2 0 0 1 0.85,-0.85 2.65,2.65 0 0 1 1.29,-0.3 2.44,2.44 0 0 1 1.56,0.49 0.52,0.52 0 0 1 0.14,0.16 0.46,0.46 0 0 1 0,0.2 0.47,0.47 0 0 1 -0.1,0.3 0.29,0.29 0 0 1 -0.23,0.13 0.45,0.45 0 0 1 -0.16,0 L 35.8,-73.3 a 2.37,2.37 0 0 0 -0.52,-0.25 1.74,1.74 0 0 0 -0.52,-0.08 q -1.39,0 -1.39,1.61 a 1.83,1.83 0 0 0 0.36,1.24 1.38,1.38 0 0 0 1.09,0.41 3.05,3.05 0 0 0 0.78,-0.1 V -71.5 H 35 a 0.45,0.45 0 0 1 -0.31,-0.1 0.34,0.34 0 0 1 -0.11,-0.27 0.34,0.34 0 0 1 0.11,-0.27 0.45,0.45 0 0 1 0.31,-0.1 h 1.16 a 0.42,0.42 0 0 1 0.27,0.11 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1378" />
</g>
<g
transform="matrix(0.2645825,0,0,0.26458333,-84.719903,-27.420684)"
id="g1436">
<path
inkscape:connector-curvature="0"
d="m 21.14,21.46 a 2.12,2.12 0 0 1 0.4,1.31 2,2 0 0 1 -0.79,1.69 3.4,3.4 0 0 1 -2.17,0.62 H 15.45 A 0.79,0.79 0 0 1 14.57,24.2 v -6.69 a 0.79,0.79 0 0 1 0.88,-0.88 h 3 a 3.38,3.38 0 0 1 2.09,0.59 1.91,1.91 0 0 1 0.77,1.61 A 2,2 0 0 1 21,20 a 2,2 0 0 1 -1,0.73 2.12,2.12 0 0 1 1.14,0.73 z M 16.4,20.08 h 1.76 a 1.83,1.83 0 0 0 1.06,-0.25 0.86,0.86 0 0 0 0.34,-0.75 0.89,0.89 0 0 0 -0.34,-0.77 1.84,1.84 0 0 0 -1.06,-0.25 H 16.4 Z m 3.06,3.34 A 1,1 0 0 0 19.8,22.6 1,1 0 0 0 19.46,21.77 1.76,1.76 0 0 0 18.38,21.51 h -2 v 2.16 h 2 a 1.82,1.82 0 0 0 1.08,-0.26 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1420" />
<path
inkscape:connector-curvature="0"
d="m 23.33,24.91 a 0.92,0.92 0 0 1 -0.25,-0.68 v -6.72 a 0.79,0.79 0 0 1 0.88,-0.88 h 3 a 3.09,3.09 0 0 1 2.15,0.7 2.49,2.49 0 0 1 0.77,1.94 2.49,2.49 0 0 1 -0.77,1.94 3.09,3.09 0 0 1 -2.15,0.7 H 25 v 2.32 a 1,1 0 0 1 -1.62,0.68 z m 3.4,-4.42 q 1.4,0 1.4,-1.21 0,-1.21 -1.4,-1.22 H 25 v 2.44 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1422" />
<path
inkscape:connector-curvature="0"
d="m 39.49,16.83 a 0.93,0.93 0 0 1 0.25,0.67 v 6.82 a 0.84,0.84 0 0 1 -0.23,0.62 0.81,0.81 0 0 1 -0.6,0.23 0.8,0.8 0 0 1 -0.59,-0.23 0.84,0.84 0 0 1 -0.23,-0.62 v -4.24 l -1.7,3.2 a 1.34,1.34 0 0 1 -0.37,0.46 0.84,0.84 0 0 1 -0.94,0 1.3,1.3 0 0 1 -0.37,-0.46 L 33,20.14 v 4.18 a 0.85,0.85 0 0 1 -0.23,0.62 0.88,0.88 0 0 1 -1.19,0 0.84,0.84 0 0 1 -0.23,-0.62 V 17.5 a 0.93,0.93 0 0 1 0.25,-0.67 0.85,0.85 0 0 1 0.64,-0.26 1,1 0 0 1 0.88,0.61 L 35.56,21.8 38,17.18 a 1,1 0 0 1 0.86,-0.61 0.85,0.85 0 0 1 0.63,0.26 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1424" />
<path
inkscape:connector-curvature="0"
d="m 47,24.67 a 3.55,3.55 0 0 1 -1.44,-1.51 5,5 0 0 1 -0.5,-2.3 5,5 0 0 1 0.5,-2.3 3.56,3.56 0 0 1 1.44,-1.51 4.73,4.73 0 0 1 4.9,0.34 0.9,0.9 0 0 1 0.25,0.29 0.8,0.8 0 0 1 0.07,0.36 0.84,0.84 0 0 1 -0.17,0.53 0.52,0.52 0 0 1 -0.43,0.22 0.93,0.93 0 0 1 -0.29,0 A 1.16,1.16 0 0 1 51,18.6 4.05,4.05 0 0 0 50.11,18.15 2.72,2.72 0 0 0 49.23,18.01 2.11,2.11 0 0 0 47.5,18.72 3.32,3.32 0 0 0 46.92,20.85 q 0,2.86 2.32,2.86 a 2.53,2.53 0 0 0 0.84,-0.14 5.29,5.29 0 0 0 0.92,-0.45 1.74,1.74 0 0 1 0.3,-0.15 0.84,0.84 0 0 1 0.28,0 0.52,0.52 0 0 1 0.43,0.22 0.84,0.84 0 0 1 0.17,0.53 0.79,0.79 0 0 1 -0.08,0.37 0.89,0.89 0 0 1 -0.25,0.28 4.73,4.73 0 0 1 -4.9,0.34 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1426" />
<path
inkscape:connector-curvature="0"
d="M 53.76,24.95 A 0.78,0.78 0 0 1 53.5,24.31 v -6.89 a 0.78,0.78 0 0 1 0.26,-0.64 1,1 0 0 1 0.65,-0.22 1,1 0 0 1 0.64,0.22 0.78,0.78 0 0 1 0.26,0.64 v 6.89 a 0.78,0.78 0 0 1 -0.26,0.64 1,1 0 0 1 -0.64,0.22 1,1 0 0 1 -0.65,-0.22 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1428" />
<path
inkscape:connector-curvature="0"
d="M 58.13,24.81 A 2.65,2.65 0 0 1 57,23.74 a 3.64,3.64 0 0 1 0,-3.25 2.61,2.61 0 0 1 1.09,-1.06 3.82,3.82 0 0 1 3.29,0 2.62,2.62 0 0 1 1.09,1.06 3.64,3.64 0 0 1 0,3.25 2.65,2.65 0 0 1 -1.09,1.07 3.76,3.76 0 0 1 -3.29,0 z m 3,-2.69 a 2,2 0 0 0 -0.34,-1.27 1.19,1.19 0 0 0 -1,-0.42 q -1.32,0 -1.32,1.69 0,1.69 1.32,1.69 1.31,0 1.31,-1.69 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1430" />
<path
inkscape:connector-curvature="0"
d="M 65.37,24.82 A 2.55,2.55 0 0 1 64.32,23.76 3.36,3.36 0 0 1 64,22.15 a 3.29,3.29 0 0 1 0.39,-1.63 2.71,2.71 0 0 1 1.1,-1.09 3.37,3.37 0 0 1 1.63,-0.38 3.68,3.68 0 0 1 1,0.13 3.23,3.23 0 0 1 0.87,0.37 0.74,0.74 0 0 1 0.37,0.67 0.84,0.84 0 0 1 -0.14,0.51 0.45,0.45 0 0 1 -0.38,0.2 0.8,0.8 0 0 1 -0.29,-0.05 l -0.37,-0.16 a 3.75,3.75 0 0 0 -0.45,-0.2 1.31,1.31 0 0 0 -0.45,-0.07 1.26,1.26 0 0 0 -1,0.43 1.9,1.9 0 0 0 -0.35,1.24 1.92,1.92 0 0 0 0.35,1.25 1.25,1.25 0 0 0 1,0.43 1.37,1.37 0 0 0 0.44,-0.07 3.58,3.58 0 0 0 0.47,-0.21 l 0.36,-0.16 a 0.75,0.75 0 0 1 0.29,-0.05 0.45,0.45 0 0 1 0.38,0.2 0.85,0.85 0 0 1 0.15,0.52 0.71,0.71 0 0 1 -0.37,0.66 3.18,3.18 0 0 1 -0.89,0.37 4.16,4.16 0 0 1 -1.06,0.13 3.29,3.29 0 0 1 -1.68,-0.37 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1432" />
<path
inkscape:connector-curvature="0"
d="m 76.24,24.29 a 0.86,0.86 0 0 1 -0.25,0.6 0.76,0.76 0 0 1 -0.57,0.26 0.82,0.82 0 0 1 -0.58,-0.25 l -2.63,-2.44 v 1.84 a 0.78,0.78 0 0 1 -0.26,0.64 1,1 0 0 1 -0.64,0.22 1,1 0 0 1 -0.65,-0.22 0.78,0.78 0 0 1 -0.26,-0.64 v -6.88 a 0.78,0.78 0 0 1 0.26,-0.64 1,1 0 0 1 0.65,-0.22 1,1 0 0 1 0.64,0.22 0.78,0.78 0 0 1 0.26,0.64 v 4.3 l 2.4,-2.36 a 0.81,0.81 0 0 1 1.18,0 0.79,0.79 0 0 1 0.25,0.58 0.83,0.83 0 0 1 -0.28,0.59 L 74.18,22 76,23.69 a 0.81,0.81 0 0 1 0.24,0.6 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1434" />
</g>
<g
id="g938"
transform="matrix(0.14877078,0,0,0.14877078,-30.958201,-5.5737438)">
<path
id="path922"
style="fill:#fff8d5"
transform="translate(319.8,113.4)"
d="m 21.14,21.46 a 2.12,2.12 0 0 1 0.4,1.31 2,2 0 0 1 -0.79,1.69 3.4,3.4 0 0 1 -2.17,0.62 H 15.45 A 0.79,0.79 0 0 1 14.57,24.2 v -6.69 a 0.79,0.79 0 0 1 0.88,-0.88 h 3 a 3.38,3.38 0 0 1 2.09,0.59 1.91,1.91 0 0 1 0.77,1.61 A 2,2 0 0 1 21,20 a 2,2 0 0 1 -1,0.73 2.12,2.12 0 0 1 1.14,0.73 z M 16.4,20.08 h 1.76 a 1.83,1.83 0 0 0 1.06,-0.25 0.86,0.86 0 0 0 0.34,-0.75 0.89,0.89 0 0 0 -0.34,-0.77 1.84,1.84 0 0 0 -1.06,-0.25 H 16.4 Z m 3.06,3.34 A 1,1 0 0 0 19.8,22.6 1,1 0 0 0 19.46,21.77 1.76,1.76 0 0 0 18.38,21.51 h -2 v 2.16 h 2 a 1.82,1.82 0 0 0 1.08,-0.26 z"
inkscape:connector-curvature="0" />
<path
id="path924"
style="fill:#fff8d5"
transform="translate(319.8,113.4)"
d="m 23.33,24.91 a 0.92,0.92 0 0 1 -0.25,-0.68 v -6.72 a 0.79,0.79 0 0 1 0.88,-0.88 h 3 a 3.09,3.09 0 0 1 2.15,0.7 2.49,2.49 0 0 1 0.77,1.94 2.49,2.49 0 0 1 -0.77,1.94 3.09,3.09 0 0 1 -2.15,0.7 H 25 v 2.32 a 1,1 0 0 1 -1.62,0.68 z m 3.4,-4.42 q 1.4,0 1.4,-1.21 0,-1.21 -1.4,-1.22 H 25 v 2.44 z"
inkscape:connector-curvature="0" />
<path
id="path926"
style="fill:#fff8d5"
transform="translate(319.8,113.4)"
d="m 39.49,16.83 a 0.93,0.93 0 0 1 0.25,0.67 v 6.82 a 0.84,0.84 0 0 1 -0.23,0.62 0.81,0.81 0 0 1 -0.6,0.23 0.8,0.8 0 0 1 -0.59,-0.23 0.84,0.84 0 0 1 -0.23,-0.62 v -4.24 l -1.7,3.2 a 1.34,1.34 0 0 1 -0.37,0.46 0.84,0.84 0 0 1 -0.94,0 1.3,1.3 0 0 1 -0.37,-0.46 L 33,20.14 v 4.18 a 0.85,0.85 0 0 1 -0.23,0.62 0.88,0.88 0 0 1 -1.19,0 0.84,0.84 0 0 1 -0.23,-0.62 V 17.5 a 0.93,0.93 0 0 1 0.25,-0.67 0.85,0.85 0 0 1 0.64,-0.26 1,1 0 0 1 0.88,0.61 L 35.56,21.8 38,17.18 a 1,1 0 0 1 0.86,-0.61 0.85,0.85 0 0 1 0.63,0.26 z"
inkscape:connector-curvature="0" />
</g>
<g
transform="matrix(0.21488787,0,0,0.21488787,-67.256252,48.47841)"
id="g910">
<path
inkscape:connector-curvature="0"
d="m 364.41084,62.79 a 0.39,0.39 0 0 1 -0.15,0.32 0.55,0.55 0 0 1 -0.36,0.12 0.55,0.55 0 0 1 -0.25,-0.06 0.54,0.54 0 0 1 -0.2,-0.19 l -1.12,-1.68 a 1.08,1.08 0 0 0 -0.35,-0.37 1,1 0 0 0 -0.49,-0.11 h -0.81 v 1.86 a 0.54,0.54 0 0 1 -0.14,0.39 0.51,0.51 0 0 1 -0.38,0.15 0.52,0.52 0 0 1 -0.39,-0.15 0.53,0.53 0 0 1 -0.15,-0.39 v -4.86 a 0.5,0.5 0 0 1 0.14,-0.37 0.52,0.52 0 0 1 0.38,-0.13 h 2.07 a 2.27,2.27 0 0 1 1.52,0.44 1.59,1.59 0 0 1 0.52,1.28 1.62,1.62 0 0 1 -0.39,1.12 1.83,1.83 0 0 1 -1.09,0.56 1,1 0 0 1 0.42,0.21 1.84,1.84 0 0 1 0.36,0.42 l 0.76,1.15 a 0.53,0.53 0 0 1 0.1,0.29 z m -1.45,-3 a 0.85,0.85 0 0 0 0.28,-0.7 0.84,0.84 0 0 0 -0.28,-0.7 1.45,1.45 0 0 0 -0.89,-0.22 h -1.44 v 1.85 h 1.39 a 1.4,1.4 0 0 0 0.94,-0.25 z"
style="fill:#fff8d5"
id="path904" />
<path
inkscape:connector-curvature="0"
d="m 47,-50.33 a 2.65,2.65 0 0 1 -0.92,-0.46 0.46,0.46 0 0 1 -0.19,-0.4 0.47,0.47 0 0 1 0.1,-0.3 0.31,0.31 0 0 1 0.25,-0.13 0.68,0.68 0 0 1 0.34,0.12 2.46,2.46 0 0 0 0.75,0.37 3,3 0 0 0 0.86,0.12 1.7,1.7 0 0 0 0.93,-0.21 0.69,0.69 0 0 0 0.32,-0.62 0.53,0.53 0 0 0 -0.3,-0.49 4,4 0 0 0 -1,-0.33 A 6,6 0 0 1 47,-53 a 1.68,1.68 0 0 1 -0.69,-0.53 1.37,1.37 0 0 1 -0.23,-0.82 1.54,1.54 0 0 1 0.29,-0.92 1.91,1.91 0 0 1 0.81,-0.63 2.87,2.87 0 0 1 1.17,-0.23 2.9,2.9 0 0 1 1.93,0.63 0.63,0.63 0 0 1 0.15,0.18 0.47,0.47 0 0 1 0,0.22 0.47,0.47 0 0 1 -0.1,0.3 0.31,0.31 0 0 1 -0.25,0.13 h -0.15 l -0.19,-0.09 a 2.81,2.81 0 0 0 -0.66,-0.37 2.25,2.25 0 0 0 -0.79,-0.12 1.54,1.54 0 0 0 -0.89,0.23 0.73,0.73 0 0 0 -0.33,0.64 0.58,0.58 0 0 0 0.29,0.52 3.4,3.4 0 0 0 1,0.34 6.64,6.64 0 0 1 1.2,0.37 1.79,1.79 0 0 1 0.71,0.52 1.25,1.25 0 0 1 0.24,0.79 1.5,1.5 0 0 1 -0.29,0.91 1.87,1.87 0 0 1 -0.8,0.61 3,3 0 0 1 -1.19,0.22 4.2,4.2 0 0 1 -1.23,-0.23 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path906" />
<path
inkscape:connector-curvature="0"
d="m 374.26929,63.07 a 0.52,0.52 0 0 1 -0.14,-0.39 V 58.2 h -1.47 q -0.5,0 -0.5,-0.44 0,-0.44 0.5,-0.44 h 4 q 0.5,0 0.5,0.44 0,0.44 -0.5,0.44 h -1.47 v 4.48 a 0.52,0.52 0 0 1 -0.15,0.39 0.52,0.52 0 0 1 -0.39,0.15 0.53,0.53 0 0 1 -0.38,-0.15 z"
style="fill:#fff8d5"
id="path908" />
</g>
<g
transform="matrix(0.2645817,0,0,0.26458333,-92.24279,76.457272)"
id="g1360">
<path
inkscape:connector-curvature="0"
d="m 42,-89.92 a 1.2,1.2 0 0 1 0.22,0.74 1.17,1.17 0 0 1 -0.49,1 2.24,2.24 0 0 1 -1.35,0.36 2.24,2.24 0 0 1 -1.35,-0.36 1.17,1.17 0 0 1 -0.49,-1 1.21,1.21 0 0 1 0.22,-0.75 1.16,1.16 0 0 1 0.65,-0.41 1.16,1.16 0 0 1 -0.55,-0.42 1.14,1.14 0 0 1 -0.2,-0.67 1.13,1.13 0 0 1 0.46,-0.95 2,2 0 0 1 1.26,-0.35 2,2 0 0 1 1.26,0.35 1.13,1.13 0 0 1 0.46,1 1.18,1.18 0 0 1 -0.2,0.68 1,1 0 0 1 -0.54,0.41 1.18,1.18 0 0 1 0.64,0.37 z m -0.76,0.66 q 0,-0.63 -0.86,-0.63 -0.86,0 -0.86,0.63 0,0.63 0.86,0.63 0.86,0 0.89,-0.64 z m -1.58,-2.05 q 0,0.61 0.73,0.61 0.73,0 0.73,-0.61 0,-0.6 -0.73,-0.6 -0.73,0 -0.7,0.59 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1352" />
<path
inkscape:connector-curvature="0"
d="m 45.68,-88.49 a 0.33,0.33 0 0 1 0.1,0.26 0.33,0.33 0 0 1 -0.16,0.3 0.73,0.73 0 0 1 -0.45,0.08 H 45 a 1.13,1.13 0 0 1 -1.19,-1.24 v -1.35 h -0.27 a 0.51,0.51 0 0 1 -0.34,-0.1 0.35,0.35 0 0 1 -0.12,-0.28 0.36,0.36 0 0 1 0.12,-0.29 0.51,0.51 0 0 1 0.34,-0.1 h 0.27 v -0.53 a 0.46,0.46 0 0 1 0.14,-0.35 0.53,0.53 0 0 1 0.38,-0.13 0.52,0.52 0 0 1 0.37,0.13 0.46,0.46 0 0 1 0.14,0.35 v 0.53 h 0.48 q 0.46,0 0.46,0.39 a 0.35,0.35 0 0 1 -0.12,0.28 0.52,0.52 0 0 1 -0.35,0.1 H 44.83 V -89 a 0.45,0.45 0 0 0 0.1,0.31 0.4,0.4 0 0 0 0.28,0.12 h 0.19 a 0.47,0.47 0 0 1 0.28,0.08 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1354" />
<path
inkscape:connector-curvature="0"
d="m 50.12,-89.89 v 1.57 A 0.46,0.46 0 0 1 50,-88 0.54,0.54 0 0 1 49.62,-87.87 0.52,0.52 0 0 1 49.25,-88 0.46,0.46 0 0 1 49.11,-88.35 v -1.58 a 0.67,0.67 0 0 0 -0.13,-0.45 0.49,0.49 0 0 0 -0.39,-0.15 0.68,0.68 0 0 0 -0.51,0.2 0.76,0.76 0 0 0 -0.19,0.54 v 1.43 a 0.46,0.46 0 0 1 -0.14,0.35 0.52,0.52 0 0 1 -0.37,0.13 A 0.53,0.53 0 0 1 47,-88 0.46,0.46 0 0 1 46.86,-88.35 v -3.92 a 0.43,0.43 0 0 1 0.15,-0.34 0.56,0.56 0 0 1 0.38,-0.13 0.52,0.52 0 0 1 0.36,0.12 0.42,0.42 0 0 1 0.14,0.33 v 1.48 a 1.13,1.13 0 0 1 0.46,-0.39 1.45,1.45 0 0 1 0.65,-0.1 q 1.12,0 1.12,1.41 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1356" />
<path
inkscape:connector-curvature="0"
d="m 52.11,-87.9 a 1.63,1.63 0 0 1 -0.54,-0.22 0.42,0.42 0 0 1 -0.16,-0.16 0.48,0.48 0 0 1 -0.05,-0.23 0.39,0.39 0 0 1 0.09,-0.26 0.27,0.27 0 0 1 0.22,-0.11 0.55,0.55 0 0 1 0.18,0 l 0.18,0.07 a 2.46,2.46 0 0 0 0.37,0.14 1.72,1.72 0 0 0 0.46,0.05 0.75,0.75 0 0 0 0.37,-0.08 0.23,0.23 0 0 0 0.13,-0.2 0.21,0.21 0 0 0 -0.06,-0.1 0.54,0.54 0 0 0 -0.21,-0.11 l -0.5,-0.12 a 1.87,1.87 0 0 1 -0.87,-0.35 0.81,0.81 0 0 1 -0.27,-0.65 0.88,0.88 0 0 1 0.19,-0.55 1.24,1.24 0 0 1 0.51,-0.38 1.85,1.85 0 0 1 0.73,-0.14 2.19,2.19 0 0 1 0.57,0.07 1.82,1.82 0 0 1 0.55,0.23 0.42,0.42 0 0 1 0.21,0.38 0.42,0.42 0 0 1 -0.09,0.27 0.27,0.27 0 0 1 -0.22,0.11 0.8,0.8 0 0 1 -0.37,-0.12 2,2 0 0 0 -0.31,-0.13 1.1,1.1 0 0 0 -0.33,0 0.62,0.62 0 0 0 -0.33,0.08 0.24,0.24 0 0 0 -0.12,0.21 0.24,0.24 0 0 0 0.14,0.22 2.22,2.22 0 0 0 0.55,0.15 3,3 0 0 1 0.71,0.21 0.86,0.86 0 0 1 0.37,0.32 0.92,0.92 0 0 1 0.12,0.48 0.9,0.9 0 0 1 -0.4,0.77 1.79,1.79 0 0 1 -1.06,0.29 3.35,3.35 0 0 1 -0.76,-0.14 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1358" />
</g>
<g
id="g902"
transform="matrix(0.99999386,0,0,1,0.78334863,2.5189976)">
<g
id="g1372"
transform="matrix(0.26458333,0,0,0.26458333,-79.110415,71.398044)">
<path
id="path1362"
style="fill:#fff8d5"
transform="translate(319.8,113.4)"
d="m 39.93,-78.65 q 0,0.43 -0.5,0.43 h -2.32 q -0.5,0 -0.5,-0.43 0,-0.43 0.5,-0.42 h 0.63 v -2.78 l -0.6,0.36 a 0.39,0.39 0 0 1 -0.2,0.06 0.36,0.36 0 0 1 -0.29,-0.14 0.49,0.49 0 0 1 -0.12,-0.32 0.39,0.39 0 0 1 0.21,-0.36 l 1.07,-0.65 a 0.92,0.92 0 0 1 0.48,-0.14 0.5,0.5 0 0 1 0.37,0.14 0.5,0.5 0 0 1 0.14,0.38 v 3.45 h 0.63 q 0.5,0 0.5,0.42 z"
inkscape:connector-curvature="0" />
<path
id="path1364"
style="fill:#fff8d5"
transform="translate(319.8,113.4)"
d="m 43.89,-81.14 a 1.37,1.37 0 0 1 0.52,0.55 1.68,1.68 0 0 1 0.19,0.8 1.67,1.67 0 0 1 -0.21,0.84 1.5,1.5 0 0 1 -0.58,0.58 1.71,1.71 0 0 1 -0.84,0.21 1.76,1.76 0 0 1 -1.44,-0.62 2.71,2.71 0 0 1 -0.53,-1.77 3.49,3.49 0 0 1 0.24,-1.34 1.93,1.93 0 0 1 0.68,-0.88 1.79,1.79 0 0 1 1,-0.31 2.51,2.51 0 0 1 0.78,0.13 2,2 0 0 1 0.67,0.36 0.51,0.51 0 0 1 0.14,0.16 0.45,0.45 0 0 1 0,0.21 0.47,0.47 0 0 1 -0.1,0.3 0.3,0.3 0 0 1 -0.24,0.13 h -0.15 l -0.17,-0.08 a 4.12,4.12 0 0 0 -0.49,-0.25 1.1,1.1 0 0 0 -0.44,-0.09 0.76,0.76 0 0 0 -0.67,0.39 2.22,2.22 0 0 0 -0.28,1.09 1.12,1.12 0 0 1 0.44,-0.41 1.33,1.33 0 0 1 0.64,-0.15 1.43,1.43 0 0 1 0.84,0.15 z m -0.48,1.94 a 0.79,0.79 0 0 0 0.19,-0.56 0.78,0.78 0 0 0 -0.19,-0.55 0.66,0.66 0 0 0 -0.51,-0.21 0.68,0.68 0 0 0 -0.52,0.21 0.77,0.77 0 0 0 -0.2,0.55 0.79,0.79 0 0 0 0.2,0.55 0.67,0.67 0 0 0 0.52,0.21 0.66,0.66 0 0 0 0.51,-0.19 z"
inkscape:connector-curvature="0" />
<path
id="path1366"
style="fill:#fff8d5"
transform="translate(319.8,113.4)"
d="m 48.06,-78.83 a 0.33,0.33 0 0 1 0.09,0.26 0.33,0.33 0 0 1 -0.16,0.3 0.73,0.73 0 0 1 -0.45,0.08 h -0.19 a 1.13,1.13 0 0 1 -1.19,-1.24 v -1.35 H 45.9 a 0.51,0.51 0 0 1 -0.34,-0.1 0.35,0.35 0 0 1 -0.12,-0.28 0.36,0.36 0 0 1 0.12,-0.29 0.51,0.51 0 0 1 0.34,-0.1 h 0.27 v -0.53 a 0.46,0.46 0 0 1 0.14,-0.35 0.53,0.53 0 0 1 0.38,-0.13 0.52,0.52 0 0 1 0.37,0.13 0.46,0.46 0 0 1 0.14,0.35 v 0.53 h 0.48 q 0.46,0 0.46,0.39 a 0.35,0.35 0 0 1 -0.12,0.28 0.52,0.52 0 0 1 -0.35,0.1 H 47.2 v 1.42 a 0.45,0.45 0 0 0 0.09,0.31 0.4,0.4 0 0 0 0.28,0.12 h 0.19 a 0.47,0.47 0 0 1 0.3,0.1 z"
inkscape:connector-curvature="0" />
<path
id="path1368"
style="fill:#fff8d5"
transform="translate(319.8,113.4)"
d="m 52.5,-80.23 v 1.57 a 0.46,0.46 0 0 1 -0.14,0.35 0.53,0.53 0 0 1 -0.38,0.13 0.52,0.52 0 0 1 -0.37,-0.13 0.46,0.46 0 0 1 -0.14,-0.35 v -1.58 a 0.67,0.67 0 0 0 -0.12,-0.45 0.49,0.49 0 0 0 -0.39,-0.15 0.67,0.67 0 0 0 -0.51,0.2 0.75,0.75 0 0 0 -0.19,0.54 v 1.43 a 0.46,0.46 0 0 1 -0.14,0.35 0.52,0.52 0 0 1 -0.37,0.13 0.53,0.53 0 0 1 -0.38,-0.13 0.46,0.46 0 0 1 -0.14,-0.35 v -3.92 a 0.43,0.43 0 0 1 0.15,-0.34 0.56,0.56 0 0 1 0.38,-0.13 0.52,0.52 0 0 1 0.36,0.12 0.42,0.42 0 0 1 0.14,0.33 v 1.48 a 1.13,1.13 0 0 1 0.46,-0.39 1.45,1.45 0 0 1 0.63,-0.13 q 1.15,0.01 1.15,1.42 z"
inkscape:connector-curvature="0" />
<path
id="path1370"
style="fill:#fff8d5"
transform="translate(319.8,113.4)"
d="m 54.49,-78.24 a 1.63,1.63 0 0 1 -0.54,-0.22 0.41,0.41 0 0 1 -0.16,-0.16 0.48,0.48 0 0 1 -0.05,-0.23 0.39,0.39 0 0 1 0.09,-0.26 0.27,0.27 0 0 1 0.22,-0.11 0.55,0.55 0 0 1 0.18,0 l 0.18,0.07 a 2.42,2.42 0 0 0 0.37,0.14 1.71,1.71 0 0 0 0.46,0.05 0.76,0.76 0 0 0 0.37,-0.08 0.23,0.23 0 0 0 0.13,-0.2 0.21,0.21 0 0 0 -0.06,-0.15 0.52,0.52 0 0 0 -0.21,-0.11 l -0.5,-0.12 a 1.87,1.87 0 0 1 -0.87,-0.35 0.81,0.81 0 0 1 -0.26,-0.65 0.88,0.88 0 0 1 0.19,-0.55 1.24,1.24 0 0 1 0.51,-0.38 1.85,1.85 0 0 1 0.73,-0.14 2.21,2.21 0 0 1 0.57,0.07 1.81,1.81 0 0 1 0.5,0.21 0.42,0.42 0 0 1 0.21,0.38 0.41,0.41 0 0 1 -0.09,0.27 0.27,0.27 0 0 1 -0.22,0.11 0.8,0.8 0 0 1 -0.37,-0.12 2,2 0 0 0 -0.31,-0.13 1.1,1.1 0 0 0 -0.33,0 0.61,0.61 0 0 0 -0.33,0.08 0.24,0.24 0 0 0 -0.12,0.21 0.23,0.23 0 0 0 0.14,0.22 2.2,2.2 0 0 0 0.55,0.15 3,3 0 0 1 0.71,0.21 0.87,0.87 0 0 1 0.37,0.32 0.92,0.92 0 0 1 0.12,0.48 0.9,0.9 0 0 1 -0.4,0.77 1.79,1.79 0 0 1 -1.06,0.29 3.35,3.35 0 0 1 -0.72,-0.07 z"
inkscape:connector-curvature="0" />
</g>
</g>
<g
transform="matrix(0.26458684,0,0,0.26458333,-78.34683,68.833708)"
id="g1402">
<path
inkscape:connector-curvature="0"
d="m 40.92,-100.28 a 1.2,1.2 0 0 1 0.23,0.74 1.16,1.16 0 0 1 -0.45,1 1.92,1.92 0 0 1 -1.23,0.35 h -1.78 a 0.5,0.5 0 0 1 -0.37,-0.13 0.5,0.5 0 0 1 -0.13,-0.37 v -3.8 a 0.5,0.5 0 0 1 0.13,-0.37 0.5,0.5 0 0 1 0.37,-0.13 h 1.71 a 1.92,1.92 0 0 1 1.19,0.33 1.08,1.08 0 0 1 0.44,0.91 1.11,1.11 0 0 1 -0.2,0.66 1.14,1.14 0 0 1 -0.55,0.41 1.2,1.2 0 0 1 0.64,0.4 z m -2.69,-0.79 h 1 a 1,1 0 0 0 0.6,-0.14 0.49,0.49 0 0 0 0.19,-0.42 0.5,0.5 0 0 0 -0.19,-0.44 1,1 0 0 0 -0.6,-0.14 h -1 z m 1.77,1.9 a 0.54,0.54 0 0 0 0.19,-0.46 0.56,0.56 0 0 0 -0.19,-0.47 1,1 0 0 0 -0.61,-0.15 H 38.23 V -99 h 1.12 A 1,1 0 0 0 40,-99.17 Z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1394" />
<path
inkscape:connector-curvature="0"
d="m 42.69,-98.35 a 0.5,0.5 0 0 1 -0.13,-0.37 v -3.8 a 0.5,0.5 0 0 1 0.13,-0.37 0.5,0.5 0 0 1 0.37,-0.13 h 2.41 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.42 H 43.6 v 1.12 h 1.73 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.41 H 43.6 V -99 h 1.87 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.41 h -2.41 a 0.5,0.5 0 0 1 -0.37,-0.17 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1396" />
<path
inkscape:connector-curvature="0"
d="m 51.73,-98.65 a 0.41,0.41 0 0 1 -0.15,0.32 0.52,0.52 0 0 1 -0.35,0.13 0.46,0.46 0 0 1 -0.24,-0.07 0.44,0.44 0 0 1 -0.18,-0.21 l -0.36,-0.8 h -2.31 l -0.36,0.8 a 0.46,0.46 0 0 1 -0.17,0.21 0.45,0.45 0 0 1 -0.25,0.07 0.53,0.53 0 0 1 -0.35,-0.13 0.41,0.41 0 0 1 -0.16,-0.32 0.55,0.55 0 0 1 0.05,-0.22 l 1.84,-3.86 A 0.54,0.54 0 0 1 49,-103 a 0.64,0.64 0 0 1 0.32,-0.08 0.63,0.63 0 0 1 0.33,0.09 0.61,0.61 0 0 1 0.23,0.25 l 1.84,3.86 a 0.55,0.55 0 0 1 0.01,0.23 z m -3.23,-1.44 h 1.58 l -0.79,-1.77 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1398" />
<path
inkscape:connector-curvature="0"
d="m 53.64,-98.33 a 0.51,0.51 0 0 1 -0.15,-0.38 v -3.44 h -1.1 q -0.5,0 -0.5,-0.44 0,-0.44 0.5,-0.43 h 3.26 q 0.5,0 0.5,0.43 0,0.43 -0.5,0.44 h -1.1 v 3.44 a 0.51,0.51 0 0 1 -0.14,0.38 0.52,0.52 0 0 1 -0.39,0.14 0.53,0.53 0 0 1 -0.38,-0.14 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1400" />
</g>
<g
transform="matrix(0.26458684,0,0,0.26458333,-92.271107,71.566785)"
id="g1410">
<path
inkscape:connector-curvature="0"
d="m 42.67,-110.62 a 1.2,1.2 0 0 1 0.23,0.74 1.16,1.16 0 0 1 -0.45,1 1.92,1.92 0 0 1 -1.23,0.35 h -1.78 a 0.5,0.5 0 0 1 -0.37,-0.13 0.5,0.5 0 0 1 -0.13,-0.37 v -3.8 a 0.5,0.5 0 0 1 0.13,-0.37 0.5,0.5 0 0 1 0.37,-0.13 h 1.71 a 1.92,1.92 0 0 1 1.19,0.33 1.08,1.08 0 0 1 0.44,0.91 1.11,1.11 0 0 1 -0.2,0.66 1.14,1.14 0 0 1 -0.58,0.43 1.2,1.2 0 0 1 0.67,0.38 z M 40,-111.41 h 1 a 1,1 0 0 0 0.6,-0.14 0.49,0.49 0 0 0 0.19,-0.42 0.5,0.5 0 0 0 -0.19,-0.44 1,1 0 0 0 -0.6,-0.14 h -1 z m 1.73,1.89 a 0.54,0.54 0 0 0 0.19,-0.46 0.56,0.56 0 0 0 -0.19,-0.47 1,1 0 0 0 -0.61,-0.15 H 40 v 1.22 h 1.1 a 1,1 0 0 0 0.61,-0.14 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1404" />
<path
inkscape:connector-curvature="0"
d="m 48.83,-109 a 0.41,0.41 0 0 1 -0.15,0.32 0.52,0.52 0 0 1 -0.35,0.13 0.46,0.46 0 0 1 -0.24,-0.07 0.44,0.44 0 0 1 -0.18,-0.21 l -0.36,-0.8 h -2.31 l -0.36,0.8 a 0.46,0.46 0 0 1 -0.17,0.21 0.45,0.45 0 0 1 -0.25,0.07 0.53,0.53 0 0 1 -0.35,-0.13 0.41,0.41 0 0 1 -0.16,-0.32 0.55,0.55 0 0 1 0.05,-0.22 l 1.84,-3.86 a 0.53,0.53 0 0 1 0.23,-0.25 0.64,0.64 0 0 1 0.32,-0.08 0.63,0.63 0 0 1 0.33,0.09 0.61,0.61 0 0 1 0.23,0.25 l 1.84,3.86 a 0.55,0.55 0 0 1 0.04,0.21 z m -3.23,-1.44 h 1.58 l -0.79,-1.77 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1406" />
<path
inkscape:connector-curvature="0"
d="m 54.13,-108.94 a 0.38,0.38 0 0 1 -0.15,0.31 0.55,0.55 0 0 1 -0.36,0.12 0.55,0.55 0 0 1 -0.25,-0.06 0.51,0.51 0 0 1 -0.2,-0.19 l -0.9,-1.33 a 0.81,0.81 0 0 0 -0.25,-0.26 0.62,0.62 0 0 0 -0.33,-0.08 h -0.55 v 1.37 a 0.53,0.53 0 0 1 -0.14,0.39 0.5,0.5 0 0 1 -0.38,0.14 0.52,0.52 0 0 1 -0.39,-0.14 0.52,0.52 0 0 1 -0.14,-0.39 v -3.81 a 0.5,0.5 0 0 1 0.13,-0.37 0.5,0.5 0 0 1 0.37,-0.13 h 1.71 a 1.91,1.91 0 0 1 1.27,0.37 1.33,1.33 0 0 1 0.43,1.07 1.38,1.38 0 0 1 -0.31,0.92 1.47,1.47 0 0 1 -0.86,0.48 0.9,0.9 0 0 1 0.36,0.16 1.37,1.37 0 0 1 0.31,0.34 l 0.52,0.77 a 0.52,0.52 0 0 1 0.11,0.32 z m -1.33,-2.44 a 0.6,0.6 0 0 0 0.2,-0.5 0.6,0.6 0 0 0 -0.2,-0.5 1.09,1.09 0 0 0 -0.66,-0.16 h -1 v 1.32 h 1 a 1.08,1.08 0 0 0 0.66,-0.17 z"
transform="translate(319.8,113.4)"
style="fill:#fff8d5"
id="path1408" />
</g>
<g
transform="translate(-7.0947387,-19.018031)"
id="g1585">
<path
style="display:inline;fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.2330292"
d="m 24.369943,81.100698 c 0.388158,0 0.672808,-0.29328 0.672808,-0.651251 0,-0.357971 -0.280336,-0.64693 -0.668494,-0.64693 -0.388159,0 -0.668497,0.29328 -0.668497,0.64693 v 0.004 c 0,0.35796 0.280338,0.64693 0.664183,0.64693 z m 0.0043,-0.254461 c -0.219955,0 -0.37953,-0.181141 -0.37953,-0.39679 0,-0.215641 0.15526,-0.39247 0.375218,-0.39247 0.22427,0 0.383847,0.176829 0.383847,0.39247 v 0.004 c 0,0.215638 -0.155263,0.39247 -0.379535,0.39247 z m 0,0"
id="path12074"
inkscape:connector-curvature="0" />
<path
style="display:inline;fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.2330292"
d="m 25.869541,81.100698 c 0.340719,0 0.552048,-0.18977 0.552048,-0.569302 v -0.582239 c 0,-0.0776 -0.06038,-0.138009 -0.138012,-0.138009 -0.07763,0 -0.138012,0.0604 -0.138012,0.138009 v 0.59518 c 0,0.19839 -0.103509,0.3019 -0.271709,0.3019 -0.168204,0 -0.271713,-0.10782 -0.271713,-0.310531 v -0.586549 c 0,-0.0776 -0.06038,-0.138009 -0.138012,-0.138009 -0.07332,0 -0.138012,0.0604 -0.138012,0.138009 v 0.59087 c 0,0.370901 0.207018,0.560671 0.543422,0.560671 z m 0,0"
id="path12070"
inkscape:connector-curvature="0" />
<path
style="display:inline;fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.2330292"
d="m 27.047558,80.949748 c 0,0.0776 0.06038,0.138009 0.138012,0.138009 0.07763,0 0.138012,-0.0604 0.138012,-0.138009 v -0.871202 h 0.263087 c 0.07332,0 0.129386,-0.0561 0.129386,-0.129389 0,-0.069 -0.05607,-0.125071 -0.129386,-0.125071 H 26.78016 c -0.06901,0 -0.125072,0.0561 -0.125072,0.125071 0,0.0733 0.05607,0.129389 0.125072,0.129389 h 0.267398 z m 0,0"
id="path12066"
inkscape:connector-curvature="0" />
</g>
<g
style="display:inline"
id="g1402-7"
transform="matrix(0.26458685,0,0,0.26458333,-78.616891,15.661774)">
<path
id="path1396-6"
style="fill:#fff8d5"
d="m 355.21983,38.569752 a 0.5,0.5 0 0 1 -0.13,-0.37 v -3.8 a 0.5,0.5 0 0 1 0.13,-0.37 0.5,0.5 0 0 1 0.37,-0.13 h 2.41 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.42 h -1.87 v 1.12 h 1.73 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.41 h -1.73 v 1.25 h 1.87 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.41 h -2.41 a 0.5,0.5 0 0 1 -0.37,-0.17 z"
inkscape:connector-curvature="0" />
</g>
<g
style="display:inline"
id="g1410-6"
transform="matrix(0.26458685,0,0,0.26458333,-82.532815,21.138787)">
<path
id="path1408-4"
style="fill:#fff8d5"
transform="translate(319.8,113.4)"
d="m 54.13,-108.94 a 0.38,0.38 0 0 1 -0.15,0.31 0.55,0.55 0 0 1 -0.36,0.12 0.55,0.55 0 0 1 -0.25,-0.06 0.51,0.51 0 0 1 -0.2,-0.19 l -0.9,-1.33 a 0.81,0.81 0 0 0 -0.25,-0.26 0.62,0.62 0 0 0 -0.33,-0.08 h -0.55 v 1.37 a 0.53,0.53 0 0 1 -0.14,0.39 0.5,0.5 0 0 1 -0.38,0.14 0.52,0.52 0 0 1 -0.39,-0.14 0.52,0.52 0 0 1 -0.14,-0.39 v -3.81 a 0.5,0.5 0 0 1 0.13,-0.37 0.5,0.5 0 0 1 0.37,-0.13 h 1.71 a 1.91,1.91 0 0 1 1.27,0.37 1.33,1.33 0 0 1 0.43,1.07 1.38,1.38 0 0 1 -0.31,0.92 1.47,1.47 0 0 1 -0.86,0.48 0.9,0.9 0 0 1 0.36,0.16 1.37,1.37 0 0 1 0.31,0.34 l 0.52,0.77 a 0.52,0.52 0 0 1 0.11,0.32 z m -1.33,-2.44 a 0.6,0.6 0 0 0 0.2,-0.5 0.6,0.6 0 0 0 -0.2,-0.5 1.09,1.09 0 0 0 -0.66,-0.16 h -1 v 1.32 h 1 a 1.08,1.08 0 0 0 0.66,-0.17 z"
inkscape:connector-curvature="0" />
</g>
<g
id="g4047"
transform="matrix(0.26458333,0,0,0.26458333,-529.28458,-305.03636)">
<path
d="m 1691.49,689.94 a 0.5,0.5 0 0 1 -0.13,-0.37 v -3.8 a 0.45,0.45 0 0 1 0.5,-0.5 h 2.41 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.42 h -1.87 v 1.12 h 1.73 c 0.34,0 0.5,0.14 0.5,0.41 0,0.27 -0.17,0.41 -0.5,0.41 h -1.73 v 1.2 h 1.87 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.41 h -2.41 a 0.5,0.5 0 0 1 -0.37,-0.12 z"
transform="translate(319.8,697.39)"
style="fill:#fff7d4"
id="path4041"
inkscape:connector-curvature="0" />
<path
d="m 1700,689.62 a 0.46,0.46 0 0 1 -0.15,0.34 0.49,0.49 0 0 1 -0.35,0.15 0.44,0.44 0 0 1 -0.35,-0.17 l -1.28,-1.56 -1.29,1.56 a 0.45,0.45 0 0 1 -0.35,0.17 0.48,0.48 0 0 1 -0.34,-0.15 0.46,0.46 0 0 1 -0.15,-0.34 0.48,0.48 0 0 1 0.12,-0.31 l 1.39,-1.66 -1.35,-1.61 a 0.47,0.47 0 0 1 -0.13,-0.31 0.46,0.46 0 0 1 0.15,-0.34 0.49,0.49 0 0 1 0.34,-0.15 0.45,0.45 0 0 1 0.35,0.18 l 1.24,1.5 1.23,-1.5 a 0.45,0.45 0 0 1 0.35,-0.18 0.48,0.48 0 0 1 0.34,0.15 0.46,0.46 0 0 1 0.15,0.34 0.47,0.47 0 0 1 -0.12,0.31 l -1.35,1.61 1.39,1.66 a 0.47,0.47 0 0 1 0.16,0.31 z"
transform="translate(319.8,697.39)"
style="fill:#fff7d4"
id="path4043"
inkscape:connector-curvature="0" />
<path
d="m 1702.56,690 a 0.51,0.51 0 0 1 -0.15,-0.38 v -3.44 h -1.1 q -0.5,0 -0.5,-0.44 0,-0.44 0.5,-0.43 h 3.26 q 0.5,0 0.5,0.43 0,0.43 -0.5,0.44 h -1.1 v 3.44 a 0.51,0.51 0 0 1 -0.14,0.38 0.59,0.59 0 0 1 -0.77,0 z"
transform="translate(319.8,697.39)"
style="fill:#fff7d4"
id="path4045"
inkscape:connector-curvature="0" />
</g>
<path
inkscape:connector-curvature="0"
id="path1257"
d="M 8.3022408,56.121514 H 15.510259"
style="display:inline;fill:none;fill-opacity:1;stroke:#fff7d4;stroke-width:0.13229167;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
sodipodi:nodetypes="cc" />
<g
transform="matrix(0.26458333,0,0,0.26458333,-529.28458,-314.96631)"
id="g1265">
<path
inkscape:connector-curvature="0"
id="path1259"
style="fill:#fff7d4"
transform="translate(319.8,697.39)"
d="m 1691.49,689.94 a 0.5,0.5 0 0 1 -0.13,-0.37 v -3.8 a 0.45,0.45 0 0 1 0.5,-0.5 h 2.41 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.42 h -1.87 v 1.12 h 1.73 c 0.34,0 0.5,0.14 0.5,0.41 0,0.27 -0.17,0.41 -0.5,0.41 h -1.73 v 1.2 h 1.87 q 0.5,0 0.5,0.41 0,0.41 -0.5,0.41 h -2.41 a 0.5,0.5 0 0 1 -0.37,-0.12 z" />
<path
inkscape:connector-curvature="0"
id="path1261"
style="fill:#fff7d4"
transform="translate(319.8,697.39)"
d="m 1700,689.62 a 0.46,0.46 0 0 1 -0.15,0.34 0.49,0.49 0 0 1 -0.35,0.15 0.44,0.44 0 0 1 -0.35,-0.17 l -1.28,-1.56 -1.29,1.56 a 0.45,0.45 0 0 1 -0.35,0.17 0.48,0.48 0 0 1 -0.34,-0.15 0.46,0.46 0 0 1 -0.15,-0.34 0.48,0.48 0 0 1 0.12,-0.31 l 1.39,-1.66 -1.35,-1.61 a 0.47,0.47 0 0 1 -0.13,-0.31 0.46,0.46 0 0 1 0.15,-0.34 0.49,0.49 0 0 1 0.34,-0.15 0.45,0.45 0 0 1 0.35,0.18 l 1.24,1.5 1.23,-1.5 a 0.45,0.45 0 0 1 0.35,-0.18 0.48,0.48 0 0 1 0.34,0.15 0.46,0.46 0 0 1 0.15,0.34 0.47,0.47 0 0 1 -0.12,0.31 l -1.35,1.61 1.39,1.66 a 0.47,0.47 0 0 1 0.16,0.31 z" />
<path
inkscape:connector-curvature="0"
id="path1263"
style="fill:#fff7d4"
transform="translate(319.8,697.39)"
d="m 1702.56,690 a 0.51,0.51 0 0 1 -0.15,-0.38 v -3.44 h -1.1 q -0.5,0 -0.5,-0.44 0,-0.44 0.5,-0.43 h 3.26 q 0.5,0 0.5,0.43 0,0.43 -0.5,0.44 h -1.1 v 3.44 a 0.51,0.51 0 0 1 -0.14,0.38 0.59,0.59 0 0 1 -0.77,0 z" />
</g>
<g
id="g963"
transform="translate(-7.0947387,-28.947975)">
<path
inkscape:connector-curvature="0"
id="path957"
d="m 24.369943,81.100698 c 0.388158,0 0.672808,-0.29328 0.672808,-0.651251 0,-0.357971 -0.280336,-0.64693 -0.668494,-0.64693 -0.388159,0 -0.668497,0.29328 -0.668497,0.64693 v 0.004 c 0,0.35796 0.280338,0.64693 0.664183,0.64693 z m 0.0043,-0.254461 c -0.219955,0 -0.37953,-0.181141 -0.37953,-0.39679 0,-0.215641 0.15526,-0.39247 0.375218,-0.39247 0.22427,0 0.383847,0.176829 0.383847,0.39247 v 0.004 c 0,0.215638 -0.155263,0.39247 -0.379535,0.39247 z m 0,0"
style="display:inline;fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.2330292" />
<path
inkscape:connector-curvature="0"
id="path959"
d="m 25.869541,81.100698 c 0.340719,0 0.552048,-0.18977 0.552048,-0.569302 v -0.582239 c 0,-0.0776 -0.06038,-0.138009 -0.138012,-0.138009 -0.07763,0 -0.138012,0.0604 -0.138012,0.138009 v 0.59518 c 0,0.19839 -0.103509,0.3019 -0.271709,0.3019 -0.168204,0 -0.271713,-0.10782 -0.271713,-0.310531 v -0.586549 c 0,-0.0776 -0.06038,-0.138009 -0.138012,-0.138009 -0.07332,0 -0.138012,0.0604 -0.138012,0.138009 v 0.59087 c 0,0.370901 0.207018,0.560671 0.543422,0.560671 z m 0,0"
style="display:inline;fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.2330292" />
<path
inkscape:connector-curvature="0"
id="path961"
d="m 27.047558,80.949748 c 0,0.0776 0.06038,0.138009 0.138012,0.138009 0.07763,0 0.138012,-0.0604 0.138012,-0.138009 v -0.871202 h 0.263087 c 0.07332,0 0.129386,-0.0561 0.129386,-0.129389 0,-0.069 -0.05607,-0.125071 -0.129386,-0.125071 H 26.78016 c -0.06901,0 -0.125072,0.0561 -0.125072,0.125071 0,0.0733 0.05607,0.129389 0.125072,0.129389 h 0.267398 z m 0,0"
style="display:inline;fill:#fff7d4;fill-opacity:1;stroke:none;stroke-width:0.2330292" />
</g>
<path
sodipodi:nodetypes="cc"
style="display:inline;fill:none;fill-opacity:1;stroke:#fff7d4;stroke-width:0.13229167;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
d="M 8.3022407,66.504514 H 15.510259"
id="path965"
inkscape:connector-curvature="0" />
</g>
</svg>

+ 145
- 0
vst2_bin/plugins/AS/res/Blanks/BlankPanel4.svg View File

@@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg8"
viewBox="0 0 60 380"
version="1.1"
sodipodi:docname="BlankPanel4.svg"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
width="60"
height="380">
<metadata
id="metadata39">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>BlankPanel8</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1372"
inkscape:window-height="1231"
id="namedview37"
showgrid="false"
inkscape:zoom="1.9612909"
inkscape:cx="-84.198267"
inkscape:cy="120.36804"
inkscape:window-x="89"
inkscape:window-y="125"
inkscape:window-maximized="0"
inkscape:current-layer="svg8" />
<defs
id="defs4">
<style
id="style2">.cls-1{fill:#ab2d2d;}.cls-2{fill:#952d2d;}.cls-3{fill:#251e1e;}.cls-4{fill:#fff7d4;}.cls-5{fill:#202020;}</style>
</defs>
<title
id="title6">BlankPanel8</title>
<rect
style="opacity:1;vector-effect:none;fill:#44423e;fill-opacity:1;stroke:none;stroke-width:0.68849927;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1709"
width="60"
height="380"
x="0"
y="0" />
<g
transform="matrix(7.9299111,0,0,7.9299111,-445.58996,-2669.2158)"
data-name="Layer 2"
id="g1661"
style="fill:#3c3835;fill-opacity:1">
<g
data-name="Layer 1-2"
id="g1659"
style="fill:#3c3835;fill-opacity:1">
<path
style="fill:#3c3835;fill-opacity:1"
inkscape:connector-curvature="0"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
class="cls-4"
id="path1657" />
</g>
</g>
<rect
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.68849927;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1759"
width="60"
height="15"
x="0"
y="365" />
<rect
y="0"
x="0"
height="15"
width="60"
id="rect1806"
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.68849927;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<circle
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.74390346;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path1686"
cx="30"
cy="359.88184"
r="15.118111" />
<g
style="fill:#fff7d4;fill-opacity:1"
id="Layer_2-2"
data-name="Layer 2"
transform="matrix(0.66602928,0,0,0.66602928,-9.9445641,118.99293)">
<g
style="fill:#fff7d4;fill-opacity:1"
id="Layer_1-2-6"
data-name="Layer 1-2">
<path
id="path8-4-6"
class="cls-4"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" />
</g>
</g>
<g
transform="scale(3.7795276)"
id="g1486">
<path
style="fill:#251e1e;fill-opacity:1;stroke-width:0.26458335"
d="M 1.5406693,0.7410401 V 3.2385622 H 2.7333615 C 3.4623855,3.2776139 4.0851679,2.7185244 4.1250078,1.9895428 4.085169,1.2605618 3.4623855,0.70198842 2.7333615,0.7410401 Z"
id="rect861-6"
inkscape:connector-curvature="0" />
<path
id="path912"
d="m 1.540669,97.440866 v 2.497523 h 1.192693 c 0.729024,0.03905 1.351806,-0.520038 1.391646,-1.24902 -0.03984,-0.728981 -0.662622,-1.287554 -1.391646,-1.248503 z"
style="fill:#251e1e;fill-opacity:1;stroke-width:0.26458335"
inkscape:connector-curvature="0" />
</g>
<g
transform="scale(3.7795276)"
id="g1490">
<path
inkscape:connector-curvature="0"
id="path918"
d="M 14.331839,0.74104081 V 3.2385629 H 13.139146 C 12.410122,3.2776147 11.78734,2.7185251 11.7475,1.9895435 11.78734,1.2605625 12.410122,0.70198913 13.139146,0.74104081 Z"
style="fill:#251e1e;fill-opacity:1;stroke-width:0.26458335" />
<path
inkscape:connector-curvature="0"
style="fill:#251e1e;fill-opacity:1;stroke-width:0.26458335"
d="m 14.331839,97.440867 v 2.497523 h -1.192693 c -0.729024,0.03905 -1.351806,-0.520038 -1.391646,-1.24902 0.03984,-0.728981 0.662622,-1.287554 1.391646,-1.248503 z"
id="path920" />
</g>
</svg>

+ 146
- 0
vst2_bin/plugins/AS/res/Blanks/BlankPanel6.svg View File

@@ -0,0 +1,146 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg8"
width="89.99999"
height="380.00004"
viewBox="0 0 89.99999 380.00004"
version="1.1"
sodipodi:docname="BlankPanel6.svg"
inkscape:version="0.92.2 5c3e80d, 2017-08-06">
<metadata
id="metadata29">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs27" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1528"
inkscape:window-height="1099"
id="namedview25"
showgrid="false"
inkscape:zoom="1.83529"
inkscape:cx="-57.573167"
inkscape:cy="169.06781"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg8" />
<title
id="title2">MyModule</title>
<path
style="opacity:1;vector-effect:none;fill:#44423e;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.83711767;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
d="M 0,1.4017578e-5 H 90 V 380.00003 H 0 Z"
id="rect817"
inkscape:connector-curvature="0" />
<g
transform="matrix(7.9299111,0,0,7.9299111,-430.58996,-2669.2158)"
data-name="Layer 2"
id="g1661"
style="fill:#3c3835;fill-opacity:1">
<g
data-name="Layer 1-2"
id="g1659"
style="fill:#3c3835;fill-opacity:1">
<path
style="fill:#3c3835;fill-opacity:1"
inkscape:connector-curvature="0"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
class="cls-4"
id="path1657" />
</g>
</g>
<rect
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.84323591;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1759"
width="90"
height="15"
x="-3.8146973e-06"
y="365.00003" />
<rect
y="0"
x="-3.8146973e-06"
height="15"
width="90"
id="rect1806"
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.84323591;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<g
id="g850">
<rect
ry="5.2628322"
y="2.8032005"
x="13.243464"
height="9.4488192"
width="18.897638"
id="rect861"
style="opacity:1;vector-effect:none;fill:#251e1e;fill-opacity:1;stroke:none;stroke-width:0.57401633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
style="opacity:1;vector-effect:none;fill:#251e1e;fill-opacity:1;stroke:none;stroke-width:0.57401633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect863"
width="18.897638"
height="9.4488192"
x="13.243464"
y="368.28357"
ry="5.2628322" />
<rect
style="opacity:1;vector-effect:none;fill:#251e1e;fill-opacity:1;stroke:none;stroke-width:0.57401633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1497"
width="18.897638"
height="9.4488192"
x="59.243465"
y="2.8032005"
ry="5.2628322" />
<rect
ry="5.2628322"
y="368.28357"
x="59.243465"
height="9.4488192"
width="18.897638"
id="rect1499"
style="opacity:1;vector-effect:none;fill:#251e1e;fill-opacity:1;stroke:none;stroke-width:0.57401633;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
<circle
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.74390346;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path1686"
cx="44.999996"
cy="359.88187"
r="15.118111" />
<g
style="fill:#fff7d4;fill-opacity:1"
id="Layer_2-2"
data-name="Layer 2"
transform="matrix(0.66602928,0,0,0.66602928,5.0554325,118.99296)">
<g
style="fill:#fff7d4;fill-opacity:1"
id="Layer_1-2-6"
data-name="Layer 1-2">
<path
id="path8-4-6"
class="cls-4"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
inkscape:connector-curvature="0"
style="fill:#fff7d4;fill-opacity:1" />
</g>
</g>
</svg>

+ 149
- 0
vst2_bin/plugins/AS/res/Blanks/BlankPanel8.svg View File

@@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg8"
viewBox="0 0 120 380"
version="1.1"
sodipodi:docname="BlankPanel8.svg"
inkscape:version="0.92.2 5c3e80d, 2017-08-06">
<metadata
id="metadata39">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1845"
inkscape:window-height="1348"
id="namedview37"
showgrid="false"
inkscape:zoom="2.3333333"
inkscape:cx="6.857143"
inkscape:cy="128.92858"
inkscape:window-x="-32"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg8" />
<defs
id="defs4">
<style
id="style2">.cls-1{fill:#ab2d2d;}.cls-2{fill:#952d2d;}.cls-3{fill:#251e1e;}.cls-4{fill:#fff7d4;}.cls-5{fill:#202020;}</style>
</defs>
<title
id="title6">BlankPanel8</title>
<rect
style="opacity:1;vector-effect:none;fill:#44423e;fill-opacity:1;stroke:none;stroke-width:0.97368497;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1709"
width="120"
height="380"
x="0"
y="0" />
<g
transform="matrix(7.9299111,0,0,7.9299111,-415.58996,-2669.2158)"
data-name="Layer 2"
id="g1661"
style="fill:#3c3835;fill-opacity:1">
<g
data-name="Layer 1-2"
id="g1659"
style="fill:#3c3835;fill-opacity:1">
<path
style="fill:#3c3835;fill-opacity:1"
inkscape:connector-curvature="0"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
class="cls-4"
id="path1657" />
</g>
</g>
<rect
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.97368497;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1759"
width="120"
height="15"
x="0"
y="365" />
<rect
y="0"
x="0"
height="15"
width="120"
id="rect1806"
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.97368497;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<g
id="g1810">
<path
style="fill:#202020;fill-opacity:1"
d="m 18.51,2.7999981 h 8.37 a 5,5 0 0 1 5.26,4.72 v 0 A 5,5 0 0 1 26.88,12.239998 H 18.51 A 5,5 0 0 1 13.25,7.5199981 v 0 a 5,5 0 0 1 5.26,-4.72 z"
class="cls-3"
id="rect861"
inkscape:connector-curvature="0" />
<path
style="fill:#202020;fill-opacity:1"
d="m 18.51,368.28 h 8.37 a 5,5 0 0 1 5.26,4.72 v 0 a 5,5 0 0 1 -5.26,4.72 H 18.51 A 5,5 0 0 1 13.24,373 v 0 a 5,5 0 0 1 5.27,-4.72 z"
class="cls-3"
id="rect863"
inkscape:connector-curvature="0" />
</g>
<g
id="g1814">
<path
style="fill:#202020;fill-opacity:1"
d="m 93.31,2.7999981 h 8.37 a 5,5 0 0 1 5.26,4.72 v 0 a 5,5 0 0 1 -5.26,4.7199999 H 93.31 A 5,5 0 0 1 88.05,7.5199981 v 0 a 5,5 0 0 1 5.26,-4.72 z"
class="cls-3"
id="rect1497"
inkscape:connector-curvature="0" />
<path
style="fill:#202020;fill-opacity:1"
d="m 93.31,368.28 h 8.37 a 5,5 0 0 1 5.26,4.72 v 0 a 5,5 0 0 1 -5.26,4.72 H 93.31 A 5,5 0 0 1 88.05,373 v 0 a 5,5 0 0 1 5.26,-4.72 z"
class="cls-3"
id="rect1499"
inkscape:connector-curvature="0" />
</g>
<g
style="display:inline"
transform="translate(15.000011,-4.7631836e-6)"
id="g1614">
<circle
r="15.118111"
cy="359.88181"
cx="44.999989"
id="path1686"
style="opacity:1;vector-effect:none;fill:#3c3835;fill-opacity:1;stroke:none;stroke-width:0.74390346;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<g
transform="matrix(0.66602928,0,0,0.66602928,5.0554261,118.9929)"
data-name="Layer 2"
id="Layer_2-2"
style="fill:#fff7d4;fill-opacity:1">
<g
data-name="Layer 1-2"
id="Layer_1-2-6"
style="fill:#fff7d4;fill-opacity:1">
<path
style="fill:#fff7d4;fill-opacity:1"
inkscape:connector-curvature="0"
d="m 71.31,357 a 0.91,0.91 0 0 0 -0.41,-0.53 0.77,0.77 0 0 0 -0.64,-0.1 0.91,0.91 0 0 0 -0.53,0.41 43.94,43.94 0 0 1 -3.33,5.08 21.5,21.5 0 0 1 -2.08,-6.45 v -0.39 l 2,-2.81 c 0.24,-0.34 1.26,-1.56 -0.78,-2.45 a 3.15,3.15 0 0 0 -2.36,0.07 c -2.32,1 -1.92,4.26 -1.85,4.79 q 0,0.31 0.09,0.62 l -3.78,6.22 c 0,0 0.49,-3.26 0.58,-3.85 A 1.36,1.36 0 0 0 57.1,356 c -1,-0.24 -1.61,0.06 -2.27,2.65 -0.56,2.19 -2.54,7.64 -3.86,7.6 -0.78,0 -0.24,-3.41 0.68,-5.87 1.12,-2.95 3.78,-7 6.78,-8.83 0.69,-0.43 1.6,-1.5 0.66,-2.56 -1.19,-1.34 -2.46,-0.28 -3,0.13 a 14.68,14.68 0 0 0 -3.49,4.35 22.82,22.82 0 0 0 -2.81,6.33 c -1,3.25 -2.07,8.54 0.1,8.74 3,0.27 5.39,-5.56 5.39,-5.56 0,0 -0.13,3.05 1.4,3.13 1.53,0.08 4.51,-5.9 5.36,-7.92 a 22.36,22.36 0 0 0 2.5,5.55 2.87,2.87 0 0 1 0.14,0.39 c -0.34,0.47 -3.77,4.86 -4.77,7.5 a 0.82,0.82 0 0 0 0,0.72 0.79,0.79 0 0 0 0.5,0.42 1.12,1.12 0 0 0 0.74,-0.12 5.53,5.53 0 0 0 0.66,-0.35 c 4.83,-2.78 5.52,-6 5.17,-8.48 a 2.08,2.08 0 0 1 0.26,-0.4 42.2,42.2 0 0 0 3.89,-5.77 0.76,0.76 0 0 0 0.18,-0.65 z"
class="cls-4"
id="path8-4-6" />
</g>
</g>
</g>
</svg>

+ 1452
- 0
vst2_bin/plugins/AS/res/Blanks/as-BlankPanelSpecial0.svg
File diff suppressed because it is too large
View File


+ 1596
- 0
vst2_bin/plugins/AS/res/Blanks/as-BlankPanelSpecial1.svg
File diff suppressed because it is too large
View File


+ 457
- 0
vst2_bin/plugins/AS/res/Blanks/as-BlankPanelSpecial2.svg
File diff suppressed because it is too large
View File


+ 484
- 0
vst2_bin/plugins/AS/res/Blanks/as-BlankPanelSpecial3.svg View File

@@ -0,0 +1,484 @@
<svg xmlns="http://www.w3.org/2000/svg" width="120.46" height="380" viewBox="0 0 120.46 380">
<title>as-BlankPanelSpecial3</title>
<g id="Layer_1" data-name="Layer 1">
<g>
<rect id="rect1709" x="0.34" width="120" height="380" style="fill: #333;opacity: 0.5"/>
<g>
<rect id="rect1709-2" x="0.46" y="226.13" width="120" height="1.26" style="fill: #2b2c2b"/>
<rect id="rect1709-3" x="0.46" y="224.92" width="120" height="1.26" style="fill: #252624"/>
<rect id="rect1709-4" x="0.46" y="223.63" width="120" height="1.26" style="fill: #1e1d1d"/>
<rect id="rect1709-5" x="0.46" y="222.35" width="120" height="1.26" style="fill: #191818"/>
</g>
<rect x="0.34" y="147.67" width="119.87" height="74.67" style="fill: #034732"/>
<rect id="rect1806-5" x="0.34" y="165.43" width="119.97" height="1.02" style="fill: #0e3e1f"/>
<rect id="rect1806-6" x="0.34" y="170.84" width="119.97" height="1.02" style="fill: #0e3e1f"/>
<rect id="rect1806-7" x="0.34" y="176.25" width="119.97" height="1.02" style="fill: #0e3e1f"/>
<rect id="rect1806-8" x="0.34" y="181.66" width="119.97" height="1.02" style="fill: #0e3e1f"/>
<rect id="rect1806-9" x="0.34" y="187.07" width="119.97" height="1.02" style="fill: #0e3e1f"/>
<rect id="rect1806-10" x="0.34" y="192.48" width="119.97" height="1.02" style="fill: #0e3e1f"/>
<rect id="rect1806-11" x="0.34" y="197.89" width="119.97" height="1.02" style="fill: #0e3e1f"/>
<rect id="rect1806-12" x="0.34" y="203.3" width="119.97" height="1.02" style="fill: #0e3e1f"/>
<g>
<g>
<g>
<polygon points="35.1 164.53 32.82 163.14 30.48 164.42 30.42 167.09 32.7 168.48 35.03 167.2 35.1 164.53" style="fill: #2d2929"/>
<circle cx="32.44" cy="165.8" r="0.77" transform="translate(-125.73 107.32) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="39.79 164.53 37.51 163.14 35.17 164.42 35.1 167.09 37.38 168.48 39.72 167.2 39.79 164.53" style="fill: #2d2929"/>
<circle cx="37.12" cy="165.8" r="0.77" transform="translate(-123.48 111.33) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="35.1 169.96 32.82 168.57 30.48 169.85 30.42 172.52 32.7 173.91 35.03 172.63 35.1 169.96" style="fill: #2d2929"/>
<circle cx="32.43" cy="171.23" r="0.77" transform="translate(-130.37 109.93) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="39.79 169.96 37.51 168.57 35.17 169.85 35.1 172.52 37.38 173.91 39.72 172.63 39.79 169.96" style="fill: #2d2929"/>
<circle cx="37.12" cy="171.23" r="0.77" transform="translate(-128.12 113.94) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="35.1 175.39 32.82 174.01 30.48 175.29 30.42 177.95 32.7 179.34 35.03 178.06 35.1 175.39" style="fill: #2d2929"/>
<circle cx="32.43" cy="176.66" r="0.77" transform="translate(-135.01 112.54) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="39.79 175.39 37.51 174.01 35.17 175.29 35.1 177.95 37.38 179.34 39.72 178.06 39.79 175.39" style="fill: #2d2929"/>
<circle cx="37.12" cy="176.66" r="0.77" transform="translate(-132.75 116.54) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="35.1 180.83 32.82 179.44 30.48 180.72 30.42 183.39 32.7 184.77 35.03 183.49 35.1 180.83" style="fill: #2d2929"/>
<circle cx="32.43" cy="182.1" r="0.77" transform="translate(-139.66 115.15) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="39.79 180.83 37.51 179.44 35.17 180.72 35.1 183.39 37.38 184.77 39.72 183.49 39.79 180.83" style="fill: #2d2929"/>
<circle cx="37.13" cy="182.09" r="0.77" transform="translate(-137.4 119.16) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="35.1 186.26 32.82 184.87 30.48 186.15 30.42 188.82 32.7 190.21 35.03 188.93 35.1 186.26" style="fill: #2d2929"/>
<circle cx="32.43" cy="187.53" r="0.77" transform="translate(-144.3 117.75) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="39.79 186.26 37.51 184.87 35.17 186.15 35.1 188.82 37.38 190.21 39.72 188.93 39.79 186.26" style="fill: #2d2929"/>
<circle cx="37.12" cy="187.53" r="0.77" transform="translate(-142.04 121.75) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="35.1 191.69 32.82 190.31 30.48 191.59 30.42 194.25 32.7 195.64 35.03 194.36 35.1 191.69" style="fill: #2d2929"/>
<circle cx="32.43" cy="192.95" r="0.77" transform="translate(-148.93 120.36) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="39.79 191.69 37.51 190.31 35.17 191.59 35.1 194.25 37.38 195.64 39.72 194.36 39.79 191.69" style="fill: #2d2929"/>
<circle cx="37.12" cy="192.96" r="0.77" transform="translate(-146.68 124.36) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="35.1 197.12 32.82 195.74 30.48 197.02 30.42 199.68 32.7 201.07 35.03 199.79 35.1 197.12" style="fill: #2d2929"/>
<circle cx="32.43" cy="198.39" r="0.77" transform="translate(-153.57 122.96) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="39.79 197.12 37.51 195.74 35.17 197.02 35.1 199.68 37.38 201.07 39.72 199.79 39.79 197.12" style="fill: #2d2929"/>
<circle cx="37.11" cy="198.39" r="0.77" transform="translate(-151.33 126.97) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="35.1 202.56 32.82 201.17 30.48 202.45 30.42 205.12 32.7 206.5 35.03 205.22 35.1 202.56" style="fill: #2d2929"/>
<circle cx="32.43" cy="203.83" r="0.77" transform="translate(-158.22 125.58) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="39.79 202.56 37.51 201.17 35.17 202.45 35.1 205.12 37.38 206.5 39.72 205.22 39.79 202.56" style="fill: #2d2929"/>
<circle cx="37.12" cy="203.83" r="0.77" transform="translate(-155.97 129.59) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
</g>
<g>
<g>
<g>
<polygon points="84.6 164.53 82.32 163.14 79.98 164.42 79.92 167.09 82.19 168.48 84.53 167.2 84.6 164.53" style="fill: #2d2929"/>
<circle cx="81.93" cy="165.8" r="0.77" transform="translate(-101.97 149.6) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="89.29 164.53 87.01 163.14 84.67 164.42 84.61 167.09 86.88 168.48 89.22 167.2 89.29 164.53" style="fill: #2d2929"/>
<circle cx="86.62" cy="165.79" r="0.77" transform="translate(-99.7 153.61) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="84.6 169.96 82.32 168.57 79.98 169.85 79.92 172.52 82.19 173.91 84.53 172.63 84.6 169.96" style="fill: #2d2929"/>
<circle cx="81.93" cy="171.23" r="0.77" transform="translate(-106.61 152.21) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="89.29 169.96 87.01 168.57 84.67 169.85 84.61 172.52 86.88 173.91 89.22 172.63 89.29 169.96" style="fill: #2d2929"/>
<circle cx="86.61" cy="171.23" r="0.77" transform="translate(-104.35 156.21) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="84.6 175.39 82.32 174.01 79.98 175.29 79.92 177.95 82.19 179.34 84.53 178.06 84.6 175.39" style="fill: #2d2929"/>
<circle cx="81.92" cy="176.66" r="0.77" transform="translate(-111.24 154.81) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="89.29 175.39 87.01 174.01 84.67 175.29 84.61 177.95 86.88 179.34 89.22 178.06 89.29 175.39" style="fill: #2d2929"/>
<circle cx="86.61" cy="176.66" r="0.77" transform="translate(-108.99 158.82) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="84.6 180.83 82.32 179.44 79.98 180.72 79.92 183.39 82.19 184.77 84.53 183.49 84.6 180.83" style="fill: #2d2929"/>
<circle cx="81.93" cy="182.09" r="0.77" transform="translate(-115.88 157.43) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="89.29 180.83 87.01 179.44 84.67 180.72 84.61 183.39 86.88 184.77 89.22 183.49 89.29 180.83" style="fill: #2d2929"/>
<circle cx="86.62" cy="182.1" r="0.77" transform="translate(-113.63 161.44) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="84.6 186.26 82.32 184.87 79.98 186.15 79.92 188.82 82.19 190.21 84.53 188.93 84.6 186.26" style="fill: #2d2929"/>
<circle cx="81.93" cy="187.53" r="0.77" transform="translate(-120.52 160.04) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="89.29 186.26 87.01 184.87 84.67 186.15 84.61 188.82 86.88 190.21 89.22 188.93 89.29 186.26" style="fill: #2d2929"/>
<circle cx="86.62" cy="187.53" r="0.77" transform="translate(-118.28 164.04) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="84.6 191.69 82.32 190.31 79.98 191.59 79.92 194.25 82.19 195.64 84.53 194.36 84.6 191.69" style="fill: #2d2929"/>
<circle cx="81.93" cy="192.96" r="0.77" transform="translate(-125.17 162.64) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="89.29 191.69 87.01 190.31 84.67 191.59 84.61 194.25 86.88 195.64 89.22 194.36 89.29 191.69" style="fill: #2d2929"/>
<circle cx="86.62" cy="192.96" r="0.77" transform="translate(-122.92 166.65) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="84.6 197.12 82.32 195.74 79.98 197.02 79.92 199.68 82.19 201.07 84.53 199.79 84.6 197.12" style="fill: #2d2929"/>
<circle cx="81.93" cy="198.39" r="0.77" transform="translate(-129.81 165.25) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="89.29 197.12 87.01 195.74 84.67 197.02 84.61 199.68 86.88 201.07 89.22 199.79 89.29 197.12" style="fill: #2d2929"/>
<circle cx="86.62" cy="198.38" r="0.77" transform="translate(-127.55 169.25) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
<g>
<g>
<polygon points="84.6 202.56 82.32 201.17 79.98 202.45 79.92 205.12 82.19 206.5 84.53 205.22 84.6 202.56" style="fill: #2d2929"/>
<circle cx="81.93" cy="203.83" r="0.77" transform="translate(-134.45 167.87) rotate(-58.68)" style="fill: #bb9965"/>
</g>
<g>
<polygon points="89.29 202.56 87.01 201.17 84.67 202.45 84.61 205.12 86.88 206.5 89.22 205.22 89.29 202.56" style="fill: #2d2929"/>
<circle cx="86.62" cy="203.82" r="0.77" transform="translate(-132.19 171.87) rotate(-58.68)" style="fill: #bb9965"/>
</g>
</g>
</g>
<g>
<g>
<path d="M45.6,165.23a.28.28,0,0,1,.08.21v1a1.16,1.16,0,0,1,0,.31.35.35,0,0,1-.11.17.69.69,0,0,1-.24.11,2.88,2.88,0,0,1-.45.09,3.47,3.47,0,0,1-.48,0,2,2,0,0,1-1-.22,1.5,1.5,0,0,1-.63-.62,2.22,2.22,0,0,1,0-1.92,1.51,1.51,0,0,1,.62-.63,2,2,0,0,1,1-.22,1.8,1.8,0,0,1,1.15.36.37.37,0,0,1,.1.12.33.33,0,0,1,0,.15.35.35,0,0,1-.07.22.22.22,0,0,1-.17.09h-.12l-.13-.06a1.75,1.75,0,0,0-.38-.19,1.3,1.3,0,0,0-.38-.05q-1,0-1,1.18a1.34,1.34,0,0,0,.27.91,1,1,0,0,0,.8.3,2.26,2.26,0,0,0,.58-.07v-.78h-.46a.33.33,0,0,1-.23-.07.29.29,0,0,1,0-.4.33.33,0,0,1,.23-.07h.85A.31.31,0,0,1,45.6,165.23Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M50.17,166.79a.3.3,0,0,1-.11.24.38.38,0,0,1-.26.1.33.33,0,0,1-.18-.05.32.32,0,0,1-.13-.16l-.27-.59H47.53l-.27.59a.32.32,0,0,1-.31.21.39.39,0,0,1-.26-.1.3.3,0,0,1-.12-.24.39.39,0,0,1,0-.16L48,163.79a.4.4,0,0,1,.17-.18.47.47,0,0,1,.48,0,.44.44,0,0,1,.17.18l1.35,2.83C50.18,166.68,50.22,166.74,50.17,166.79Zm-2.37-1.05H49l-.58-1.3Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M51.57,167a.37.37,0,0,1-.11-.28v-2.53h-.81c-.25,0-.37-.11-.37-.32s.12-.32.37-.32H53c.25,0,.37.11.37.32s-.12.32-.37.32h-.81v2.53a.38.38,0,0,1-.1.28A.44.44,0,0,1,51.57,167Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M54.36,167a.36.36,0,0,1-.09-.27v-2.79a.33.33,0,0,1,.29-.37H56.4c.25,0,.37.1.37.3s-.12.31-.37.31H55V165h1.27c.25,0,.37.1.37.31s-.12.3-.37.3H55v.88h1.4c.25,0,.37.1.37.31s-.12.3-.37.3H54.63A.36.36,0,0,1,54.36,167Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M43.37,172.48a1.48,1.48,0,0,1-.6-.63,2.29,2.29,0,0,1,0-1.92,1.49,1.49,0,0,1,.6-.63,2,2,0,0,1,2,.14.37.37,0,0,1,.1.12.32.32,0,0,1,0,.15.35.35,0,0,1-.07.22.22.22,0,0,1-.18.09H45.1L45,170a1.65,1.65,0,0,0-.37-.19,1.11,1.11,0,0,0-.37-.06.87.87,0,0,0-.72.3,1.38,1.38,0,0,0-.24.89q0,1.19,1,1.19a1.06,1.06,0,0,0,.35-.06,2.31,2.31,0,0,0,.38-.19l.13-.06h.12a.22.22,0,0,1,.18.09.36.36,0,0,1,.07.22.33.33,0,0,1,0,.15.37.37,0,0,1-.1.12,2,2,0,0,1-2,.14Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M49.18,169.15a.35.35,0,0,1,.19-.05.41.41,0,0,1,.27.1.31.31,0,0,1,.12.24.36.36,0,0,1,0,.15l-1.35,2.85a.39.39,0,0,1-.17.18.49.49,0,0,1-.48,0,.39.39,0,0,1-.17-.18l-1.35-2.85a.32.32,0,0,1,0-.14.31.31,0,0,1,.13-.25.44.44,0,0,1,.28-.1.36.36,0,0,1,.19.05.33.33,0,0,1,.13.16l1,2.34,1-2.34A.33.33,0,0,1,49.18,169.15Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M45,176.59a.24.24,0,0,1,.08.18.26.26,0,0,1-.26.26h-.7v.71a.24.24,0,0,1-.07.18.28.28,0,0,1-.37,0,.25.25,0,0,1-.08-.18V177h-.7a.26.26,0,0,1-.26-.26.24.24,0,0,1,.08-.18.25.25,0,0,1,.18-.07h.7v-.71a.26.26,0,0,1,.52,0s0,0,0,0v.71h.7A.25.25,0,0,1,45,176.59Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M48.1,176.07a1,1,0,0,1,.4.4,1.22,1.22,0,0,1,.14.59,1.16,1.16,0,0,1-.17.62,1.12,1.12,0,0,1-.46.42,1.52,1.52,0,0,1-.69.15,2,2,0,0,1-.61-.09,1.62,1.62,0,0,1-.51-.26.34.34,0,0,1-.11-.12.62.62,0,0,1,.07-.37.22.22,0,0,1,.18-.09h.11l.13.06a2.72,2.72,0,0,0,.37.19.93.93,0,0,0,.36.07.67.67,0,0,0,.46-.14.52.52,0,0,0,.16-.42.53.53,0,0,0-.16-.41.62.62,0,0,0-.44-.15,1.06,1.06,0,0,0-.31,0,1.38,1.38,0,0,0-.31.14.42.42,0,0,1-.21.06.29.29,0,0,1-.2-.07.24.24,0,0,1-.08-.19V175a.33.33,0,0,1,.3-.36h1.67c.25,0,.37.1.37.29s-.12.3-.37.3H47V176a1.13,1.13,0,0,1,.56-.13A1.17,1.17,0,0,1,48.1,176.07Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M52.34,174.71a.35.35,0,0,1,.19-.05.41.41,0,0,1,.27.1.31.31,0,0,1,.12.25.35.35,0,0,1,0,.15L51.53,178a.4.4,0,0,1-.17.18.49.49,0,0,1-.48,0,.4.4,0,0,1-.17-.18l-1.35-2.85a.32.32,0,0,1,0-.15.31.31,0,0,1,.13-.25.44.44,0,0,1,.28-.1.37.37,0,0,1,.19.05.32.32,0,0,1,.13.16l1.07,2.34,1.07-2.34A.33.33,0,0,1,52.34,174.71Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M45,182.15a.25.25,0,0,1,.08.18.26.26,0,0,1-.26.26h-.7v.7a.24.24,0,0,1-.07.18.26.26,0,0,1-.19.07.25.25,0,0,1-.18-.07.24.24,0,0,1-.08-.18v-.7h-.7a.26.26,0,0,1-.26-.26.25.25,0,0,1,.08-.18.26.26,0,0,1,.18-.07h.7v-.71a.26.26,0,0,1,.26-.26.26.26,0,0,1,.26.26v.71h.7A.26.26,0,0,1,45,182.15Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M48.7,183.45q0,.31-.37.32h-1.7q-.37,0-.37-.32t.37-.31h.46v-2l-.44.26a.29.29,0,0,1-.15,0,.27.27,0,0,1-.21-.1.36.36,0,0,1-.09-.24.29.29,0,0,1,.15-.26l.79-.48a.68.68,0,0,1,.35-.1.36.36,0,0,1,.38.38v2.54h.46Q48.7,183.14,48.7,183.45Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M52.14,183.45q0,.31-.37.32H49.91a.34.34,0,0,1-.25-.09.31.31,0,0,1-.09-.23.47.47,0,0,1,.15-.33l1.1-1.17a1.1,1.1,0,0,0,.37-.72.4.4,0,0,0-.12-.31.47.47,0,0,0-.33-.11.93.93,0,0,0-.35.06,3,3,0,0,0-.37.19l-.13.07h-.1a.22.22,0,0,1-.18-.1.36.36,0,0,1-.08-.23.33.33,0,0,1,0-.16.31.31,0,0,1,.11-.11,1.94,1.94,0,0,1,1.1-.36,1.51,1.51,0,0,1,.62.12.94.94,0,0,1,.41.34.92.92,0,0,1,.15.51,1.26,1.26,0,0,1-.13.57,2.48,2.48,0,0,1-.43.58l-.79.83h1.16Q52.14,183.14,52.14,183.45Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M55.84,180.26a.35.35,0,0,1,.19-.05.41.41,0,0,1,.27.1.31.31,0,0,1,.12.25.35.35,0,0,1,0,.15L55,183.55a.4.4,0,0,1-.17.18.49.49,0,0,1-.48,0,.4.4,0,0,1-.17-.18l-1.35-2.85a.32.32,0,0,1,0-.14.31.31,0,0,1,.13-.25.44.44,0,0,1,.28-.1.37.37,0,0,1,.19.05.33.33,0,0,1,.13.16l1.07,2.34,1.07-2.34A.34.34,0,0,1,55.84,180.26Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M45.6,187.45a.28.28,0,0,1,.08.21v1a1.17,1.17,0,0,1,0,.31.35.35,0,0,1-.11.17.71.71,0,0,1-.24.11,2.89,2.89,0,0,1-.45.09,3.47,3.47,0,0,1-.48,0,2,2,0,0,1-1-.22,1.5,1.5,0,0,1-.63-.62,2.22,2.22,0,0,1,0-1.93,1.5,1.5,0,0,1,.62-.63,2,2,0,0,1,1-.22,1.8,1.8,0,0,1,1.15.36.37.37,0,0,1,.1.12.33.33,0,0,1,0,.15.36.36,0,0,1-.07.22.22.22,0,0,1-.17.09h-.12l-.13-.06a1.71,1.71,0,0,0-.38-.19,1.27,1.27,0,0,0-.38-.05q-1,0-1,1.18a1.34,1.34,0,0,0,.27.91,1,1,0,0,0,.8.3,2.31,2.31,0,0,0,.58-.07v-.78h-.46a.33.33,0,0,1-.23-.07.29.29,0,0,1,0-.4.33.33,0,0,1,.23-.07h.85A.31.31,0,0,1,45.6,187.45Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M49.8,185.88a.38.38,0,0,1,.1.28V189a.39.39,0,0,1-.1.28.39.39,0,0,1-.56,0l-1.67-2.14V189a.4.4,0,0,1-.1.28.36.36,0,0,1-.52,0,.39.39,0,0,1-.1-.28v-2.8a.38.38,0,0,1,.1-.28.35.35,0,0,1,.27-.11.34.34,0,0,1,.29.13L49.18,188v-1.87a.39.39,0,0,1,.1-.28.34.34,0,0,1,.26-.11A.35.35,0,0,1,49.8,185.88Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M51.2,189.22a.37.37,0,0,1-.09-.27v-2.79a.33.33,0,0,1,.3-.36h1.07a2.16,2.16,0,0,1,1,.21,1.47,1.47,0,0,1,.63.61,1.91,1.91,0,0,1,.22.94,2,2,0,0,1-.22.95,1.46,1.46,0,0,1-.63.61,2.19,2.19,0,0,1-1,.21h-1A.37.37,0,0,1,51.2,189.22Zm1.22-.53a1.14,1.14,0,1,0,0-2.27h-.54v2.27Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M45.6,193a.28.28,0,0,1,.08.21v1a1.16,1.16,0,0,1,0,.31.35.35,0,0,1-.11.18.69.69,0,0,1-.24.11,2.77,2.77,0,0,1-.45.09,3.47,3.47,0,0,1-.48,0,2,2,0,0,1-1-.22,1.5,1.5,0,0,1-.63-.62,2.22,2.22,0,0,1,0-1.93,1.5,1.5,0,0,1,.62-.63,2,2,0,0,1,1-.22,1.8,1.8,0,0,1,1.15.36.37.37,0,0,1,.1.12.33.33,0,0,1,0,.15.36.36,0,0,1-.07.22.22.22,0,0,1-.17.09h-.12l-.13-.07a1.7,1.7,0,0,0-.38-.18,1.27,1.27,0,0,0-.38-.06q-1,0-1,1.19a1.34,1.34,0,0,0,.27.91,1,1,0,0,0,.8.3,2.26,2.26,0,0,0,.58-.08v-.77h-.46a.33.33,0,0,1-.23-.07.29.29,0,0,1,0-.4.33.33,0,0,1,.23-.07h.85A.31.31,0,0,1,45.6,193Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M49.8,191.43a.39.39,0,0,1,.1.28v2.81a.39.39,0,0,1-.1.28.39.39,0,0,1-.56,0l-1.67-2.15v1.89a.41.41,0,0,1-.1.28.36.36,0,0,1-.52,0,.39.39,0,0,1-.1-.28v-2.81a.39.39,0,0,1,.1-.28.35.35,0,0,1,.27-.11.34.34,0,0,1,.29.13l1.67,2.13v-1.87a.39.39,0,0,1,.1-.28.34.34,0,0,1,.26-.11A.36.36,0,0,1,49.8,191.43Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M51.2,194.78a.37.37,0,0,1-.09-.27v-2.79a.33.33,0,0,1,.3-.36h1.07a2.16,2.16,0,0,1,1,.21,1.47,1.47,0,0,1,.63.6,1.92,1.92,0,0,1,.22.95,2,2,0,0,1-.22.95,1.45,1.45,0,0,1-.63.61,2.17,2.17,0,0,1-1,.21h-1A.37.37,0,0,1,51.2,194.78Zm1.22-.54a1.13,1.13,0,0,0,0-2.26h-.54v2.26Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M45.6,198.56a.28.28,0,0,1,.08.21v1a1.16,1.16,0,0,1,0,.31.35.35,0,0,1-.11.17.69.69,0,0,1-.24.11,2.88,2.88,0,0,1-.45.09,3.47,3.47,0,0,1-.48,0,2,2,0,0,1-1-.22,1.5,1.5,0,0,1-.63-.62,2.22,2.22,0,0,1,0-1.92,1.51,1.51,0,0,1,.62-.63,2,2,0,0,1,1-.22,1.8,1.8,0,0,1,1.15.36.37.37,0,0,1,.1.12.33.33,0,0,1,0,.15.35.35,0,0,1-.07.22.22.22,0,0,1-.17.09h-.12l-.13-.06a1.75,1.75,0,0,0-.38-.19,1.3,1.3,0,0,0-.38-.05q-1,0-1,1.18a1.34,1.34,0,0,0,.27.91,1,1,0,0,0,.8.3,2.26,2.26,0,0,0,.58-.07V199h-.46a.33.33,0,0,1-.23-.07.29.29,0,0,1,0-.4.33.33,0,0,1,.23-.07h.85A.31.31,0,0,1,45.6,198.56Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M49.8,197a.38.38,0,0,1,.1.28v2.8a.39.39,0,0,1-.1.28.35.35,0,0,1-.27.11.36.36,0,0,1-.29-.13l-1.67-2.14v1.88a.4.4,0,0,1-.1.28.36.36,0,0,1-.52,0,.39.39,0,0,1-.1-.28v-2.8A.38.38,0,0,1,47,197a.35.35,0,0,1,.27-.11.34.34,0,0,1,.29.13l1.67,2.13v-1.87a.39.39,0,0,1,.1-.28.34.34,0,0,1,.26-.11A.35.35,0,0,1,49.8,197Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M51.2,200.33a.37.37,0,0,1-.09-.27v-2.79a.33.33,0,0,1,.28-.37h1.09a2.18,2.18,0,0,1,1,.21,1.47,1.47,0,0,1,.63.61,1.91,1.91,0,0,1,.22.94,2,2,0,0,1-.22.95,1.46,1.46,0,0,1-.63.61,2.19,2.19,0,0,1-1,.21h-1A.37.37,0,0,1,51.2,200.33Zm1.22-.53a1.14,1.14,0,0,0,0-2.27h-.54v2.27Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M42.56,204.64c0-.2.12-.29.36-.29h1c.24,0,.36.1.36.29s-.12.29-.36.29h-1Q42.56,204.94,42.56,204.64Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M47.9,205.67c0,.21-.12.32-.37.32h-1.7q-.37,0-.37-.32t.37-.31h.47v-2l-.44.26a.29.29,0,0,1-.15,0,.27.27,0,0,1-.21-.1.36.36,0,0,1-.09-.24.29.29,0,0,1,.16-.26l.79-.48a.68.68,0,0,1,.35-.1.36.36,0,0,1,.38.38v2.54h.46C47.78,205.36,47.9,205.46,47.9,205.67Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M51.34,205.67c0,.21-.12.32-.37.32H49.11a.33.33,0,0,1-.25-.09.31.31,0,0,1-.09-.23.46.46,0,0,1,.14-.33l1.1-1.17a1.11,1.11,0,0,0,.37-.72.41.41,0,0,0-.12-.31.47.47,0,0,0-.33-.11.92.92,0,0,0-.35.06,2.87,2.87,0,0,0-.37.19l-.13.07H49a.22.22,0,0,1-.18-.1.36.36,0,0,1-.08-.23.34.34,0,0,1,0-.16.31.31,0,0,1,.11-.11,1.86,1.86,0,0,1,.52-.26,1.84,1.84,0,0,1,.59-.1,1.5,1.5,0,0,1,.62.12.93.93,0,0,1,.41.34.92.92,0,0,1,.14.51,1.26,1.26,0,0,1-.1.64,2.48,2.48,0,0,1-.43.58l-.79.83H51C51.21,205.36,51.34,205.46,51.34,205.67Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M54.11,203.53a.32.32,0,0,1,.18-.05.38.38,0,0,1,.25.09.28.28,0,0,1,.11.22.32.32,0,0,1,0,.15l-.9,1.84a.37.37,0,0,1-.15.17.44.44,0,0,1-.43,0,.39.39,0,0,1-.16-.17l-.9-1.84a.35.35,0,0,1,0-.13.29.29,0,0,1,.12-.23.41.41,0,0,1,.26-.09.35.35,0,0,1,.19.05.36.36,0,0,1,.14.16l.61,1.34L54,203.7A.36.36,0,0,1,54.11,203.53Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
</g>
<g>
<g>
<path d="M95.94,165.23a.28.28,0,0,1,.08.21v1a1.16,1.16,0,0,1,0,.31.35.35,0,0,1-.11.17.69.69,0,0,1-.24.11,2.88,2.88,0,0,1-.45.09,3.47,3.47,0,0,1-.48,0,2,2,0,0,1-1-.22,1.5,1.5,0,0,1-.63-.62,2.22,2.22,0,0,1,0-1.92,1.51,1.51,0,0,1,.62-.63,2,2,0,0,1,.95-.22,1.8,1.8,0,0,1,1.15.36.37.37,0,0,1,.1.12.33.33,0,0,1,0,.15.35.35,0,0,1-.07.22.22.22,0,0,1-.17.09h-.12l-.13-.06a1.75,1.75,0,0,0-.38-.19,1.3,1.3,0,0,0-.38-.05q-1,0-1,1.18a1.34,1.34,0,0,0,.27.91,1,1,0,0,0,.8.3,2.26,2.26,0,0,0,.58-.07v-.78h-.46a.33.33,0,0,1-.23-.07.29.29,0,0,1,0-.4.33.33,0,0,1,.23-.07h.85A.31.31,0,0,1,95.94,165.23Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M100.51,166.79a.3.3,0,0,1-.11.24.38.38,0,0,1-.26.1.33.33,0,0,1-.18-.05.32.32,0,0,1-.13-.16l-.27-.59H97.87l-.27.59a.32.32,0,0,1-.31.21A.39.39,0,0,1,97,167a.3.3,0,0,1-.12-.24.39.39,0,0,1,0-.16l1.35-2.83a.4.4,0,0,1,.17-.18.47.47,0,0,1,.48,0,.44.44,0,0,1,.17.18l1.35,2.83A.41.41,0,0,1,100.51,166.79Zm-2.37-1.05H99.3l-.58-1.3Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M101.91,167a.37.37,0,0,1-.11-.28v-2.53H101c-.25,0-.37-.11-.37-.32s.12-.32.37-.32h2.4c.25,0,.37.11.37.32s-.12.32-.37.32h-.81v2.53a.38.38,0,0,1-.1.28.44.44,0,0,1-.57,0Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M104.69,167a.36.36,0,0,1-.09-.27v-2.79a.33.33,0,0,1,.29-.37h1.84c.25,0,.37.1.37.3s-.12.31-.37.31h-1.37V165h1.27c.25,0,.37.1.37.31s-.12.3-.37.3h-1.27v.88h1.38c.25,0,.37.1.37.31s-.12.3-.37.3H105A.36.36,0,0,1,104.69,167Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M93.7,172.48a1.48,1.48,0,0,1-.6-.63,2.29,2.29,0,0,1,0-1.92,1.49,1.49,0,0,1,.6-.63,2,2,0,0,1,2,.14.37.37,0,0,1,.1.12.32.32,0,0,1,0,.15.35.35,0,0,1-.07.22.22.22,0,0,1-.18.09h-.12l-.12-.06a1.65,1.65,0,0,0-.37-.19,1.11,1.11,0,0,0-.37-.06.87.87,0,0,0-.72.3,1.38,1.38,0,0,0-.24.89q0,1.19,1,1.19A1.06,1.06,0,0,0,95,172a2.31,2.31,0,0,0,.38-.19l.13-.06h.12a.22.22,0,0,1,.18.09.36.36,0,0,1,.07.22.33.33,0,0,1,0,.15.37.37,0,0,1-.1.12,2,2,0,0,1-2,.14Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M99.51,169.15a.35.35,0,0,1,.19-.05.41.41,0,0,1,.27.1.31.31,0,0,1,.12.24.36.36,0,0,1,0,.15l-1.35,2.85a.39.39,0,0,1-.17.18.49.49,0,0,1-.48,0,.39.39,0,0,1-.17-.18l-1.35-2.85a.32.32,0,0,1,0-.14.31.31,0,0,1,.13-.25.44.44,0,0,1,.28-.1.36.36,0,0,1,.19.05.33.33,0,0,1,.13.16l1.07,2.34,1.07-2.34A.33.33,0,0,1,99.51,169.15Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M95.29,176.59a.24.24,0,0,1,.08.18.26.26,0,0,1-.26.26h-.7v.71a.24.24,0,0,1-.07.18.28.28,0,0,1-.37,0,.25.25,0,0,1-.08-.18V177h-.7a.26.26,0,0,1-.26-.26.24.24,0,0,1,.08-.18.25.25,0,0,1,.18-.07h.7v-.71a.26.26,0,0,1,.52,0s0,0,0,0v.71h.7A.25.25,0,0,1,95.29,176.59Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M98.43,176.07a1,1,0,0,1,.4.4,1.22,1.22,0,0,1,.14.59,1.16,1.16,0,0,1-.17.62,1.12,1.12,0,0,1-.46.42,1.52,1.52,0,0,1-.69.15,2,2,0,0,1-.61-.09,1.62,1.62,0,0,1-.51-.26.34.34,0,0,1-.11-.12.62.62,0,0,1,.07-.37.22.22,0,0,1,.18-.09h.11l.13.06a2.72,2.72,0,0,0,.37.19.93.93,0,0,0,.36.07.67.67,0,0,0,.46-.14.52.52,0,0,0,.16-.42.53.53,0,0,0-.16-.41.62.62,0,0,0-.44-.15,1.06,1.06,0,0,0-.31,0,1.38,1.38,0,0,0-.31.14.42.42,0,0,1-.21.06.29.29,0,0,1-.2-.07.24.24,0,0,1-.08-.19V175a.33.33,0,0,1,.3-.36h1.67c.25,0,.37.1.37.29s-.12.3-.37.3H97.29V176a1.13,1.13,0,0,1,.56-.13A1.17,1.17,0,0,1,98.43,176.07Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M102.67,174.71a.35.35,0,0,1,.19-.05.41.41,0,0,1,.27.1.31.31,0,0,1,.12.25.35.35,0,0,1,0,.15L101.87,178a.4.4,0,0,1-.17.18.49.49,0,0,1-.48,0,.4.4,0,0,1-.17-.18l-1.35-2.85a.32.32,0,0,1,0-.15.31.31,0,0,1,.13-.25.44.44,0,0,1,.28-.1.37.37,0,0,1,.19.05.32.32,0,0,1,.13.16l1.07,2.34,1.07-2.34A.33.33,0,0,1,102.67,174.71Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M95.29,182.15a.25.25,0,0,1,.08.18.26.26,0,0,1-.26.26h-.7v.7a.24.24,0,0,1-.07.18.26.26,0,0,1-.19.07.25.25,0,0,1-.18-.07.24.24,0,0,1-.08-.18v-.7h-.7a.26.26,0,0,1-.26-.26.25.25,0,0,1,.08-.18.26.26,0,0,1,.18-.07h.7v-.71a.26.26,0,0,1,.26-.26.26.26,0,0,1,.26.26v.71h.7A.26.26,0,0,1,95.29,182.15Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M99,183.45q0,.31-.37.32H97q-.37,0-.37-.32t.37-.31h.46v-2l-.44.26a.29.29,0,0,1-.15,0,.27.27,0,0,1-.21-.1.36.36,0,0,1-.09-.24.29.29,0,0,1,.15-.26l.79-.48a.68.68,0,0,1,.35-.1.36.36,0,0,1,.38.38v2.54h.46A.27.27,0,0,1,99,183.45Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M102.47,183.45q0,.31-.37.32h-1.86a.34.34,0,0,1-.25-.09.31.31,0,0,1-.09-.23.47.47,0,0,1,.15-.33l1.1-1.17a1.1,1.1,0,0,0,.37-.72.4.4,0,0,0-.12-.31.47.47,0,0,0-.33-.11.93.93,0,0,0-.35.06,3,3,0,0,0-.37.19l-.13.07h-.1a.22.22,0,0,1-.18-.1.36.36,0,0,1-.08-.23.33.33,0,0,1,0-.16.31.31,0,0,1,.11-.11,1.94,1.94,0,0,1,1.1-.36,1.51,1.51,0,0,1,.62.12.94.94,0,0,1,.41.34.92.92,0,0,1,.15.51,1.26,1.26,0,0,1-.13.57,2.48,2.48,0,0,1-.43.58l-.79.83h1.16Q102.47,183.14,102.47,183.45Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M106.18,180.26a.35.35,0,0,1,.19-.05.41.41,0,0,1,.27.1.31.31,0,0,1,.12.25.35.35,0,0,1,0,.15l-1.35,2.85a.4.4,0,0,1-.17.18.49.49,0,0,1-.48,0,.4.4,0,0,1-.17-.18l-1.35-2.85a.32.32,0,0,1,0-.14.31.31,0,0,1,.13-.25.44.44,0,0,1,.28-.1.37.37,0,0,1,.19.05.33.33,0,0,1,.13.16l1.07,2.34,1.07-2.34A.34.34,0,0,1,106.18,180.26Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M95.94,187.45a.28.28,0,0,1,.08.21v1a1.17,1.17,0,0,1,0,.31.35.35,0,0,1-.11.17.71.71,0,0,1-.24.11,2.89,2.89,0,0,1-.45.09,3.47,3.47,0,0,1-.48,0,2,2,0,0,1-1-.22,1.5,1.5,0,0,1-.63-.62,2.22,2.22,0,0,1,0-1.93,1.5,1.5,0,0,1,.62-.63,2,2,0,0,1,.95-.22,1.8,1.8,0,0,1,1.15.36.37.37,0,0,1,.1.12.33.33,0,0,1,0,.15.36.36,0,0,1-.07.22.22.22,0,0,1-.17.09h-.12l-.13-.06a1.71,1.71,0,0,0-.38-.19,1.27,1.27,0,0,0-.38-.05q-1,0-1,1.18a1.34,1.34,0,0,0,.27.91,1,1,0,0,0,.8.3,2.31,2.31,0,0,0,.58-.07v-.78h-.46a.33.33,0,0,1-.23-.07.29.29,0,0,1,0-.4.33.33,0,0,1,.23-.07h.85A.31.31,0,0,1,95.94,187.45Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M100.14,185.88a.38.38,0,0,1,.1.28V189a.39.39,0,0,1-.1.28.39.39,0,0,1-.56,0l-1.67-2.14V189a.4.4,0,0,1-.1.28.36.36,0,0,1-.52,0,.39.39,0,0,1-.1-.28v-2.8a.38.38,0,0,1,.1-.28.35.35,0,0,1,.27-.11.34.34,0,0,1,.29.13L99.51,188v-1.87a.39.39,0,0,1,.1-.28.34.34,0,0,1,.26-.11A.35.35,0,0,1,100.14,185.88Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M101.53,189.22a.37.37,0,0,1-.09-.27v-2.79a.33.33,0,0,1,.3-.36h1.07a2.16,2.16,0,0,1,1,.21,1.47,1.47,0,0,1,.63.61,1.91,1.91,0,0,1,.22.94,2,2,0,0,1-.22.95,1.46,1.46,0,0,1-.63.61,2.19,2.19,0,0,1-1,.21h-1A.37.37,0,0,1,101.53,189.22Zm1.22-.53a1.14,1.14,0,1,0,0-2.27h-.54v2.27Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M95.94,193a.28.28,0,0,1,.08.21v1a1.16,1.16,0,0,1,0,.31.35.35,0,0,1-.11.18.69.69,0,0,1-.24.11,2.77,2.77,0,0,1-.45.09,3.47,3.47,0,0,1-.48,0,2,2,0,0,1-1-.22,1.5,1.5,0,0,1-.63-.62,2.22,2.22,0,0,1,0-1.93,1.5,1.5,0,0,1,.62-.63,2,2,0,0,1,.95-.22,1.8,1.8,0,0,1,1.15.36.37.37,0,0,1,.1.12.33.33,0,0,1,0,.15.36.36,0,0,1-.07.22.22.22,0,0,1-.17.09h-.12l-.13-.07a1.7,1.7,0,0,0-.38-.18,1.27,1.27,0,0,0-.38-.06q-1,0-1,1.19A1.34,1.34,0,0,0,94,194a1,1,0,0,0,.8.3,2.26,2.26,0,0,0,.58-.08v-.77h-.46a.33.33,0,0,1-.23-.07.29.29,0,0,1,0-.4.33.33,0,0,1,.23-.07h.85A.31.31,0,0,1,95.94,193Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M100.14,191.43a.39.39,0,0,1,.1.28v2.81a.39.39,0,0,1-.1.28.39.39,0,0,1-.56,0l-1.67-2.15v1.89a.41.41,0,0,1-.1.28.36.36,0,0,1-.52,0,.39.39,0,0,1-.1-.28v-2.81a.39.39,0,0,1,.1-.28.35.35,0,0,1,.27-.11.34.34,0,0,1,.29.13l1.67,2.13v-1.87a.39.39,0,0,1,.1-.28.34.34,0,0,1,.26-.11A.36.36,0,0,1,100.14,191.43Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M101.53,194.78a.37.37,0,0,1-.09-.27v-2.79a.33.33,0,0,1,.3-.36h1.07a2.16,2.16,0,0,1,1,.21,1.47,1.47,0,0,1,.63.6,1.92,1.92,0,0,1,.22.95,2,2,0,0,1-.22.95,1.45,1.45,0,0,1-.63.61,2.17,2.17,0,0,1-1,.21h-1A.37.37,0,0,1,101.53,194.78Zm1.22-.54a1.13,1.13,0,0,0,0-2.26h-.54v2.26Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M95.94,198.56a.28.28,0,0,1,.08.21v1a1.16,1.16,0,0,1,0,.31.35.35,0,0,1-.11.17.69.69,0,0,1-.24.11,2.88,2.88,0,0,1-.45.09,3.47,3.47,0,0,1-.48,0,2,2,0,0,1-1-.22,1.5,1.5,0,0,1-.63-.62,2.22,2.22,0,0,1,0-1.92,1.51,1.51,0,0,1,.62-.63,2,2,0,0,1,.95-.22,1.8,1.8,0,0,1,1.15.36.37.37,0,0,1,.1.12.33.33,0,0,1,0,.15.35.35,0,0,1-.07.22.22.22,0,0,1-.17.09h-.12l-.13-.06a1.75,1.75,0,0,0-.38-.19,1.3,1.3,0,0,0-.38-.05q-1,0-1,1.18a1.34,1.34,0,0,0,.27.91,1,1,0,0,0,.8.3,2.26,2.26,0,0,0,.58-.07V199h-.46a.33.33,0,0,1-.23-.07.29.29,0,0,1,0-.4.33.33,0,0,1,.23-.07h.85A.31.31,0,0,1,95.94,198.56Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M100.14,197a.38.38,0,0,1,.1.28v2.8a.39.39,0,0,1-.1.28.35.35,0,0,1-.27.11.36.36,0,0,1-.29-.13l-1.67-2.14v1.88a.4.4,0,0,1-.1.28.36.36,0,0,1-.52,0,.39.39,0,0,1-.1-.28v-2.8a.38.38,0,0,1,.1-.28.35.35,0,0,1,.27-.11.34.34,0,0,1,.29.13l1.67,2.13v-1.87a.39.39,0,0,1,.1-.28.34.34,0,0,1,.26-.11A.35.35,0,0,1,100.14,197Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M101.53,200.33a.37.37,0,0,1-.09-.27v-2.79a.33.33,0,0,1,.28-.37h1.09a2.18,2.18,0,0,1,1,.21,1.47,1.47,0,0,1,.63.61,1.91,1.91,0,0,1,.22.94,2,2,0,0,1-.22.95,1.46,1.46,0,0,1-.63.61,2.19,2.19,0,0,1-1,.21h-1A.37.37,0,0,1,101.53,200.33Zm1.22-.53a1.14,1.14,0,0,0,0-2.27h-.54v2.27Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M92.89,204.64c0-.2.12-.29.36-.29h1c.24,0,.36.1.36.29s-.12.29-.36.29h-1Q92.89,204.94,92.89,204.64Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M98.23,205.67c0,.21-.12.32-.37.32h-1.7q-.37,0-.37-.32t.37-.31h.47v-2l-.44.26a.29.29,0,0,1-.15,0,.27.27,0,0,1-.21-.1.36.36,0,0,1-.09-.24.29.29,0,0,1,.16-.26l.79-.48a.68.68,0,0,1,.35-.1.36.36,0,0,1,.38.38v2.54h.46C98.11,205.36,98.23,205.46,98.23,205.67Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M101.67,205.67c0,.21-.12.32-.37.32H99.44a.33.33,0,0,1-.25-.09.31.31,0,0,1-.09-.23.46.46,0,0,1,.14-.33l1.1-1.17a1.11,1.11,0,0,0,.37-.72.41.41,0,0,0-.12-.31.47.47,0,0,0-.33-.11.92.92,0,0,0-.35.06,2.87,2.87,0,0,0-.37.19l-.13.07H99.3a.22.22,0,0,1-.18-.1A.36.36,0,0,1,99,203a.34.34,0,0,1,0-.16.31.31,0,0,1,.11-.11,1.86,1.86,0,0,1,.52-.26,1.84,1.84,0,0,1,.59-.1,1.5,1.5,0,0,1,.62.12.93.93,0,0,1,.41.34.92.92,0,0,1,.14.51,1.26,1.26,0,0,1-.13.57,2.48,2.48,0,0,1-.43.58l-.79.83h1.16C101.55,205.36,101.67,205.46,101.67,205.67Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M104.44,203.53a.32.32,0,0,1,.18-.05.38.38,0,0,1,.25.09.28.28,0,0,1,.11.22.32.32,0,0,1,0,.15l-.9,1.84a.37.37,0,0,1-.15.17.44.44,0,0,1-.43,0,.39.39,0,0,1-.16-.17l-.9-1.84a.35.35,0,0,1,0-.13.29.29,0,0,1,.12-.23.41.41,0,0,1,.26-.09.35.35,0,0,1,.19.05.36.36,0,0,1,.14.16l.61,1.34.61-1.34A.36.36,0,0,1,104.44,203.53Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
</g>
<g>
<g>
<path d="M21.63,156.47a.73.73,0,0,1,.14.45.71.71,0,0,1-.27.58,1.17,1.17,0,0,1-.75.21H19.67a.27.27,0,0,1-.3-.3V155.1a.27.27,0,0,1,.24-.3h1.06a1.17,1.17,0,0,1,.72.2.66.66,0,0,1,.27.55.67.67,0,0,1-.12.4.69.69,0,0,1-.34.25A.73.73,0,0,1,21.63,156.47ZM20,156h.61a.63.63,0,0,0,.37-.08.3.3,0,0,0,.12-.26.31.31,0,0,0-.12-.27.63.63,0,0,0-.37-.08H20Zm1,1.14a.33.33,0,0,0,.12-.28.34.34,0,0,0-.12-.28.6.6,0,0,0-.37-.09H20v.74h.68A.62.62,0,0,0,21,157.14Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M22.6,157.44a1.24,1.24,0,0,1-.32-.92v-1.41a.3.3,0,0,1,.28-.32h0a.31.31,0,0,1,.23.09.32.32,0,0,1,.08.23v1.44a.78.78,0,0,0,.16.53.67.67,0,0,0,.92,0,.78.78,0,0,0,.16-.53v-1.44a.32.32,0,0,1,.08-.23.31.31,0,0,1,.23-.09.3.3,0,0,1,.32.32v1.41a1.24,1.24,0,0,1-.32.92,1.53,1.53,0,0,1-1.87,0Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M25.87,157.68a1.26,1.26,0,0,1-.46-.22.29.29,0,0,1-.09-.1.3.3,0,0,1,0-.31.19.19,0,0,1,.15-.08h.09l.11.05a1.37,1.37,0,0,0,.36.16,1.47,1.47,0,0,0,.4.05.79.79,0,0,0,.42-.09.29.29,0,0,0,.14-.26.23.23,0,0,0-.13-.21,1.74,1.74,0,0,0-.48-.15,2.63,2.63,0,0,1-.61-.19.8.8,0,0,1-.33-.28.73.73,0,0,1-.11-.4.78.78,0,0,1,.15-.47,1,1,0,0,1,.42-.33,1.48,1.48,0,0,1,.6-.12,1.54,1.54,0,0,1,1,.29.33.33,0,0,1,.09.1.27.27,0,0,1,0,.13.28.28,0,0,1-.06.18.19.19,0,0,1-.15.08H27.3l-.11-.05a1.72,1.72,0,0,0-.31-.16,1,1,0,0,0-.36-.05.71.71,0,0,0-.4.1.31.31,0,0,0-.14.27.24.24,0,0,0,.06.16.47.47,0,0,0,.19.11l.37.1a2,2,0,0,1,.81.32.64.64,0,0,1,.25.53.78.78,0,0,1-.15.47,1,1,0,0,1-.41.31,1.59,1.59,0,0,1-.62.11A2.29,2.29,0,0,1,25.87,157.68Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M31.7,156.47a.73.73,0,0,1,.14.45.71.71,0,0,1-.27.58,1.17,1.17,0,0,1-.75.21H29.74a.27.27,0,0,1-.3-.3V155.1a.27.27,0,0,1,.24-.3h1.06a1.17,1.17,0,0,1,.72.2.66.66,0,0,1,.27.55.67.67,0,0,1-.12.4.69.69,0,0,1-.34.25A.73.73,0,0,1,31.7,156.47ZM30.07,156h.61a.63.63,0,0,0,.37-.08.3.3,0,0,0,.12-.26.31.31,0,0,0-.12-.27.63.63,0,0,0-.37-.08h-.61Zm1,1.15a.33.33,0,0,0,.12-.28.34.34,0,0,0-.12-.28.6.6,0,0,0-.37-.09h-.68v.74h.68a.62.62,0,0,0,.37-.1Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M33,157.58a1.24,1.24,0,0,1-.49-.52,1.89,1.89,0,0,1,0-1.58A1.23,1.23,0,0,1,33,155a1.65,1.65,0,0,1,1.51,0,1.23,1.23,0,0,1,.49.52,1.89,1.89,0,0,1,0,1.58,1.24,1.24,0,0,1-.49.52,1.64,1.64,0,0,1-1.51,0Zm1.33-.57a1.42,1.42,0,0,0,0-1.48.77.77,0,0,0-1.09-.06l-.06.06a1.43,1.43,0,0,0,0,1.48.76.76,0,0,0,1.07.07l.07-.07Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M38.37,157.46a.25.25,0,0,1-.09.2.32.32,0,0,1-.21.08.19.19,0,0,1-.26-.13l-.22-.49h-1.4l-.22.49a.27.27,0,0,1-.26.17.32.32,0,0,1-.21-.08.25.25,0,0,1-.1-.2.34.34,0,0,1,0-.13L36.55,155a.32.32,0,0,1,.14-.15.39.39,0,0,1,.39,0,.37.37,0,0,1,.14.15l1.12,2.34A.34.34,0,0,1,38.37,157.46Zm-2-.87h1l-.48-1.07Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M41.26,157.49a.23.23,0,0,1-.09.19.35.35,0,0,1-.37,0,.31.31,0,0,1-.12-.12l-.55-.81a.48.48,0,0,0-.15-.15.38.38,0,0,0-.2,0h-.33v.83a.32.32,0,0,1-.08.24.31.31,0,0,1-.23.09.3.3,0,0,1-.32-.32v-2.31a.27.27,0,0,1,.24-.3h1.06a1.16,1.16,0,0,1,.77.23.81.81,0,0,1,.26.65.84.84,0,0,1-.19.56.89.89,0,0,1-.53.29.54.54,0,0,1,.22.1.84.84,0,0,1,.19.21l.31.47A.31.31,0,0,1,41.26,157.49ZM40.45,156a.44.44,0,0,0,0-.61.67.67,0,0,0-.4-.09h-.62v.8H40A.66.66,0,0,0,40.45,156Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M41.87,157.65a.3.3,0,0,1-.08-.22v-2.31a.27.27,0,0,1,.24-.3h.89a1.79,1.79,0,0,1,.82.17,1.21,1.21,0,0,1,.52.5,1.58,1.58,0,0,1,.18.78,1.61,1.61,0,0,1-.18.78,1.2,1.2,0,0,1-.52.5,1.81,1.81,0,0,1-.82.17h-.83A.3.3,0,0,1,41.87,157.65Zm1-.44a.94.94,0,0,0,0-1.87h-.44v1.87Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g id="g1794">
<g id="g1792">
<path id="path1790" d="M18.25,155.39a.22.22,0,0,0-.1-.13.19.19,0,0,0-.16,0,.22.22,0,0,0-.13.1,10.83,10.83,0,0,1-.82,1.25,5.3,5.3,0,0,1-.51-1.59v-.1l.49-.69c.06-.08.31-.38-.19-.6a.78.78,0,0,0-.58,0c-.57.25-.47,1-.46,1.18a.55.55,0,0,0,0,.15l-.93,1.53.14-.95a.34.34,0,0,0-.26-.39h0c-.25-.06-.4,0-.56.65s-.63,1.88-1,1.87-.06-.84.17-1.45A4.78,4.78,0,0,1,15.08,154c.17-.11.39-.37.16-.63s-.61-.07-.74,0a3.62,3.62,0,0,0-.86,1.07A5.62,5.62,0,0,0,13,156c-.25.8-.51,2.1,0,2.15.74.07,1.33-1.37,1.33-1.37s0,.75.34.77,1.11-1.45,1.32-2a5.51,5.51,0,0,0,.62,1.37v.1a10.35,10.35,0,0,0-1.12,2,.2.2,0,0,0,0,.18.19.19,0,0,0,.12.1.28.28,0,0,0,.18,0l.16-.09c1.19-.68,1.36-1.48,1.27-2.09l.06-.1a10.4,10.4,0,0,0,1-1.42.19.19,0,0,0,0-.16Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
</g>
</g>
<g>
<g>
<polygon points="4.33 164.93 2.77 163.98 1.16 164.86 1.12 166.69 2.69 167.64 4.29 166.76 4.33 164.93" style="fill: #bb9965"/>
<circle cx="2.41" cy="165.8" r="0.9" transform="translate(-140.15 81.67) rotate(-58.68)" style="fill: #bbbdbf"/>
<path d="M2.15,165H0v1.6H2.15a.8.8,0,1,0,0-1.6Z" transform="translate(0.33)" style="fill: #929497"/>
</g>
<g>
<polygon points="4.33 177.61 2.77 176.66 1.16 177.53 1.12 179.37 2.69 180.32 4.29 179.44 4.33 177.61" style="fill: #bb9965"/>
<circle cx="2.41" cy="178.48" r="0.9" transform="translate(-150.98 87.76) rotate(-58.68)" style="fill: #bbbdbf"/>
<path d="M2.15,177.65H0v1.6H2.15a.8.8,0,1,0,0-1.6Z" transform="translate(0.33)" style="fill: #929497"/>
</g>
<g>
<polygon points="4.33 190.29 2.77 189.33 1.16 190.21 1.12 192.04 2.69 193 4.29 192.12 4.33 190.29" style="fill: #bb9965"/>
<circle cx="2.4" cy="191.15" r="0.9" transform="translate(-161.81 93.84) rotate(-58.68)" style="fill: #bbbdbf"/>
<path d="M2.15,190.33H0v1.6H2.15a.8.8,0,1,0,0-1.6Z" transform="translate(0.33)" style="fill: #929497"/>
</g>
<g>
<polygon points="4.33 202.96 2.77 202.01 1.16 202.89 1.12 204.72 2.69 205.67 4.29 204.79 4.33 202.96" style="fill: #bb9965"/>
<circle cx="2.4" cy="203.83" r="0.9" transform="translate(-172.64 99.93) rotate(-58.68)" style="fill: #bbbdbf"/>
<path d="M2.15,203H0v1.6H2.15a.8.8,0,1,0,0-1.6Z" transform="translate(0.33)" style="fill: #929497"/>
</g>
</g>
<g>
<g>
<polygon points="116.2 204.72 117.77 205.67 119.38 204.79 119.42 202.96 117.85 202.01 116.25 202.89 116.2 204.72" style="fill: #bb9965"/>
<circle cx="117.47" cy="203.83" r="0.9" transform="translate(-117.38 198.23) rotate(-58.68)" style="fill: #bbbdbf"/>
<path d="M117.72,204.68h2.15v-1.6h-2.15a.8.8,0,0,0,0,1.6Z" transform="translate(0.33)" style="fill: #929497"/>
</g>
<g>
<polygon points="116.2 192.04 117.77 193 119.38 192.12 119.42 190.29 117.85 189.33 116.25 190.21 116.2 192.04" style="fill: #bb9965"/>
<circle cx="117.47" cy="191.15" r="0.9" transform="translate(-106.55 192.14) rotate(-58.68)" style="fill: #bbbdbf"/>
<path d="M117.72,192h2.15v-1.6h-2.15a.8.8,0,0,0,0,1.6Z" transform="translate(0.33)" style="fill: #929497"/>
</g>
<g>
<polygon points="116.2 179.37 117.77 180.32 119.38 179.44 119.42 177.61 117.85 176.66 116.25 177.53 116.2 179.37" style="fill: #bb9965"/>
<circle cx="117.48" cy="178.48" r="0.9" transform="translate(-95.73 186.06) rotate(-58.68)" style="fill: #bbbdbf"/>
<path d="M117.72,179.32h2.15v-1.6h-2.15a.8.8,0,0,0,0,1.6Z" transform="translate(0.33)" style="fill: #929497"/>
</g>
<g>
<polygon points="116.2 166.69 117.77 167.64 119.38 166.76 119.42 164.93 117.85 163.98 116.25 164.86 116.2 166.69" style="fill: #bb9965"/>
<circle cx="117.48" cy="165.8" r="0.9" transform="translate(-84.9 179.97) rotate(-58.68)" style="fill: #bbbdbf"/>
<path d="M117.72,166.65h2.15V165h-2.15a.8.8,0,0,0,0,1.6Z" transform="translate(0.33)" style="fill: #929497"/>
</g>
</g>
<g>
<path d="M8.57,165.81a.24.24,0,0,1,.08.18.26.26,0,0,1-.26.26h-.7V167a.24.24,0,0,1-.07.18.28.28,0,0,1-.37,0,.25.25,0,0,1-.08-.18v-.71h-.7A.26.26,0,0,1,6.2,166a.24.24,0,0,1,.08-.18.25.25,0,0,1,.18-.07h.7V165a.26.26,0,0,1,.52,0s0,0,0,0v.71h.7A.25.25,0,0,1,8.57,165.81Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M11.72,165.29a1,1,0,0,1,.4.4,1.22,1.22,0,0,1,.14.59,1.16,1.16,0,0,1-.17.62,1.12,1.12,0,0,1-.46.42,1.52,1.52,0,0,1-.69.15,2,2,0,0,1-.61-.09,1.62,1.62,0,0,1-.51-.26.34.34,0,0,1-.11-.12.62.62,0,0,1,.07-.37.22.22,0,0,1,.18-.09h.11l.13.06a2.72,2.72,0,0,0,.37.19.93.93,0,0,0,.36.07.67.67,0,0,0,.46-.14.52.52,0,0,0,.16-.42.53.53,0,0,0-.16-.41.62.62,0,0,0-.44-.15,1.06,1.06,0,0,0-.31,0,1.38,1.38,0,0,0-.31.14.42.42,0,0,1-.21.06.29.29,0,0,1-.2-.07.24.24,0,0,1-.08-.19v-1.46a.33.33,0,0,1,.3-.36h1.67c.25,0,.37.1.37.29s-.12.3-.37.3H10.57v.79a1.13,1.13,0,0,1,.56-.13A1.17,1.17,0,0,1,11.72,165.29Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M16,163.92a.35.35,0,0,1,.19-.05.41.41,0,0,1,.27.1.31.31,0,0,1,.12.25.35.35,0,0,1,0,.15l-1.35,2.85a.4.4,0,0,1-.17.18.49.49,0,0,1-.48,0,.4.4,0,0,1-.17-.18L13,164.36a.32.32,0,0,1,0-.15.31.31,0,0,1,.13-.25.44.44,0,0,1,.28-.1.37.37,0,0,1,.19.05.32.32,0,0,1,.13.16l1.07,2.34,1.07-2.34A.33.33,0,0,1,16,163.92Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M8.57,178.4a.25.25,0,0,1,.08.18.26.26,0,0,1-.26.26h-.7v.7a.24.24,0,0,1-.07.18.26.26,0,0,1-.19.07.25.25,0,0,1-.18-.07.24.24,0,0,1-.08-.18v-.7h-.7a.26.26,0,0,1-.26-.26.25.25,0,0,1,.08-.18.26.26,0,0,1,.18-.07h.7v-.71a.26.26,0,0,1,.26-.26.26.26,0,0,1,.26.26v.71h.7A.26.26,0,0,1,8.57,178.4Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M12.32,179.7q0,.31-.37.32H10.24q-.37,0-.37-.32t.37-.31h.46v-2l-.44.26a.29.29,0,0,1-.15,0,.27.27,0,0,1-.21-.1.36.36,0,0,1-.09-.24A.29.29,0,0,1,10,177l.79-.48a.68.68,0,0,1,.35-.1.36.36,0,0,1,.38.38v2.54H12A.28.28,0,0,1,12.32,179.7Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M15.75,179.7q0,.31-.37.32H13.52a.34.34,0,0,1-.25-.09.31.31,0,0,1-.09-.23.47.47,0,0,1,.15-.33l1.1-1.17a1.1,1.1,0,0,0,.37-.72.4.4,0,0,0-.12-.31.47.47,0,0,0-.33-.11.93.93,0,0,0-.35.06,3,3,0,0,0-.37.19l-.13.07h-.1a.22.22,0,0,1-.18-.1.36.36,0,0,1-.08-.23.33.33,0,0,1,0-.16.31.31,0,0,1,.11-.11,1.94,1.94,0,0,1,1.1-.36,1.51,1.51,0,0,1,.62.12.94.94,0,0,1,.41.34.92.92,0,0,1,.15.51,1.26,1.26,0,0,1-.13.57,2.48,2.48,0,0,1-.43.58l-.79.83h1.16Q15.75,179.39,15.75,179.7Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M19.46,176.51a.35.35,0,0,1,.19-.05.41.41,0,0,1,.27.1.31.31,0,0,1,.12.25.35.35,0,0,1,0,.15l-1.35,2.85a.4.4,0,0,1-.17.18.49.49,0,0,1-.48,0,.4.4,0,0,1-.17-.18L16.49,177a.32.32,0,0,1,0-.14.31.31,0,0,1,.13-.25.44.44,0,0,1,.28-.1.37.37,0,0,1,.19.05.33.33,0,0,1,.13.16l1,2.28,1.07-2.34A.34.34,0,0,1,19.46,176.51Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M9.25,190.95a.28.28,0,0,1,.08.21v1a1.17,1.17,0,0,1,0,.31.35.35,0,0,1-.11.17.71.71,0,0,1-.24.11,2.89,2.89,0,0,1-.45.09,3.47,3.47,0,0,1-.48,0,2,2,0,0,1-1-.22,1.5,1.5,0,0,1-.63-.62,2.22,2.22,0,0,1,0-1.93,1.5,1.5,0,0,1,.62-.63,2,2,0,0,1,.95-.22,1.8,1.8,0,0,1,1.15.36.37.37,0,0,1,.1.12.33.33,0,0,1,0,.15.36.36,0,0,1-.07.22.22.22,0,0,1-.17.09H8.88l-.13-.06a1.71,1.71,0,0,0-.38-.19,1.27,1.27,0,0,0-.38-.05q-1,0-1,1.18a1.34,1.34,0,0,0,.27.91,1,1,0,0,0,.8.3,2.31,2.31,0,0,0,.58-.07v-.78H8.17a.33.33,0,0,1-.23-.07.29.29,0,0,1,0-.4.33.33,0,0,1,.23-.07H9A.31.31,0,0,1,9.25,190.95Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M13.45,189.37a.38.38,0,0,1,.1.28v2.8a.39.39,0,0,1-.1.28.39.39,0,0,1-.56,0l-1.67-2.14v1.88a.4.4,0,0,1-.1.28.36.36,0,0,1-.52,0,.39.39,0,0,1-.1-.28v-2.8a.38.38,0,0,1,.1-.28.35.35,0,0,1,.27-.11.34.34,0,0,1,.29.13l1.67,2.13v-1.87a.39.39,0,0,1,.1-.28.34.34,0,0,1,.26-.11A.35.35,0,0,1,13.45,189.37Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M14.85,192.72a.37.37,0,0,1-.09-.27v-2.79a.33.33,0,0,1,.3-.36h1.07a2.16,2.16,0,0,1,1,.21,1.47,1.47,0,0,1,.63.61A1.91,1.91,0,0,1,18,191a2,2,0,0,1-.22.95,1.46,1.46,0,0,1-.63.61,2.19,2.19,0,0,1-1,.21h-1A.37.37,0,0,1,14.85,192.72Zm1.22-.53a1.14,1.14,0,1,0,0-2.27h-.54v2.27Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<path d="M6.2,204c0-.2.12-.29.36-.29h1c.24,0,.36.1.36.29s-.12.29-.36.29h-1Q6.2,204.31,6.2,204Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M11.54,205c0,.21-.12.32-.37.32H9.47q-.37,0-.37-.32t.37-.31h.47v-2l-.44.26a.29.29,0,0,1-.15,0,.27.27,0,0,1-.21-.1.36.36,0,0,1-.09-.24.29.29,0,0,1,.16-.26l.79-.48a.68.68,0,0,1,.35-.1.36.36,0,0,1,.38.38v2.54h.46C11.42,204.73,11.54,204.83,11.54,205Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M15,205c0,.21-.12.32-.37.32H12.75a.33.33,0,0,1-.25-.09.31.31,0,0,1-.09-.23.46.46,0,0,1,.14-.33l1.1-1.17a1.11,1.11,0,0,0,.37-.72.41.41,0,0,0-.12-.31.47.47,0,0,0-.33-.11.92.92,0,0,0-.35.06,2.87,2.87,0,0,0-.37.19l-.13.07h-.11a.22.22,0,0,1-.18-.1.36.36,0,0,1-.08-.23.34.34,0,0,1,0-.16.31.31,0,0,1,.11-.11,1.86,1.86,0,0,1,.52-.26,1.84,1.84,0,0,1,.59-.1,1.5,1.5,0,0,1,.62.12.93.93,0,0,1,.41.34.92.92,0,0,1,.14.51,1.26,1.26,0,0,1-.13.57,2.48,2.48,0,0,1-.43.58l-.79.83h1.16C14.85,204.73,15,204.83,15,205Z" transform="translate(0.33)" style="fill: #fff"/>
<path d="M17.75,202.9a.32.32,0,0,1,.18-.05.38.38,0,0,1,.25.09.28.28,0,0,1,.11.22.32.32,0,0,1,0,.15l-.9,1.84a.37.37,0,0,1-.15.17.44.44,0,0,1-.43,0,.39.39,0,0,1-.16-.17l-.9-1.84a.35.35,0,0,1,0-.13.29.29,0,0,1,.12-.23.41.41,0,0,1,.26-.09.35.35,0,0,1,.19.05.36.36,0,0,1,.14.16l.61,1.34.61-1.34A.36.36,0,0,1,17.75,202.9Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<circle id="circle868" cx="59.85" cy="214.15" r="3.99" style="fill: #bb9965"/>
<circle id="circle868-2" cx="59.85" cy="214.15" r="1.86" style="fill: #231f20"/>
<path id="path884" d="M59.52,209.1a5.06,5.06,0,1,1-5.06,5.06h0a5.06,5.06,0,0,1,5.06-5.06m0-.44a5.5,5.5,0,1,0,5.5,5.5h0a5.5,5.5,0,0,0-5.5-5.5Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<circle id="circle868-3" cx="10.35" cy="214.15" r="3.99" style="fill: #bb9965"/>
<circle id="circle868-4" cx="10.35" cy="214.15" r="1.86" style="fill: #231f20"/>
<path id="path884-2" d="M10,209.1a5.06,5.06,0,1,1-5,5.12v-.06H5a5.06,5.06,0,0,1,5-5.06m0-.44a5.5,5.5,0,1,0,5.5,5.5h0a5.5,5.5,0,0,0-5.5-5.5Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g>
<circle id="circle868-5" cx="109.35" cy="214.15" r="3.99" style="fill: #bb9965"/>
<circle id="circle868-6" cx="109.35" cy="214.15" r="1.86" style="fill: #231f20"/>
<path id="path884-3" d="M109,209.1a5.06,5.06,0,1,1-5.06,5.06h0A5.06,5.06,0,0,1,109,209.1m0-.44a5.5,5.5,0,1,0,5.5,5.5h0a5.5,5.5,0,0,0-5.5-5.5Z" transform="translate(0.33)" style="fill: #fff"/>
</g>
<g style="opacity: 0.38">
<rect id="rect1709-2-2" data-name="rect1709-2" x="12.83" y="147.49" width="4.17" height="74.88" style="fill: #2b2c2b"/>
<rect id="rect1709-3-2" data-name="rect1709-3" x="8.83" y="147.49" width="4.17" height="74.88" style="fill: #252624"/>
<rect id="rect1709-4-2" data-name="rect1709-4" x="4.57" y="147.49" width="4.17" height="74.88" style="fill: #1e1d1d"/>
<rect id="rect1709-5-2" data-name="rect1709-5" x="0.33" y="147.49" width="4.17" height="74.88" style="fill: #191818"/>
</g>
<g style="opacity: 0.38">
<rect id="rect1709-2-3" data-name="rect1709-2" x="103.8" y="147.49" width="4.17" height="74.88" style="fill: #2b2c2b"/>
<rect id="rect1709-3-3" data-name="rect1709-3" x="107.8" y="147.49" width="4.17" height="74.88" style="fill: #252624"/>
<rect id="rect1709-4-3" data-name="rect1709-4" x="112.07" y="147.49" width="4.17" height="74.88" style="fill: #1e1d1d"/>
<rect id="rect1709-5-3" data-name="rect1709-5" x="116.3" y="147.49" width="4.17" height="74.88" style="fill: #191818"/>
</g>
</g>
</g>
<g id="Layer_4" data-name="Layer 4">
<g>
<rect id="rect1806" x="0.34" width="120" height="14.43" style="fill: #d9d9d8"/>
<rect id="rect1806-2" x="0.34" y="14.41" width="120" height="1.02" style="fill: #b3b3b3"/>
<g>
<circle cx="7.84" cy="7.94" r="3.44" style="fill: #333"/>
<circle cx="22.84" cy="7.94" r="3.44" style="fill: #333"/>
<circle cx="37.84" cy="7.94" r="3.44" style="fill: #333"/>
<circle cx="52.84" cy="7.94" r="3.44" style="fill: #333"/>
<circle cx="67.84" cy="7.94" r="3.44" style="fill: #333"/>
<circle cx="82.84" cy="7.94" r="3.44" style="fill: #333"/>
<circle cx="97.84" cy="7.94" r="3.44" style="fill: #333"/>
<circle cx="112.84" cy="7.94" r="3.44" style="fill: #333"/>
</g>
</g>
<g>
<rect id="rect1806-3" x="0.34" y="365.57" width="120" height="14.43" style="fill: #d9d9d8"/>
<rect id="rect1806-4" x="0.34" y="364.57" width="120" height="1.02" style="fill: #b3b3b3"/>
<g>
<circle cx="112.84" cy="372.06" r="3.44" style="fill: #333"/>
<circle cx="97.84" cy="372.06" r="3.44" style="fill: #333"/>
<circle cx="82.84" cy="372.06" r="3.44" style="fill: #333"/>
<circle cx="67.84" cy="372.06" r="3.44" style="fill: #333"/>
<circle cx="52.84" cy="372.06" r="3.44" style="fill: #333"/>
<circle cx="37.84" cy="372.06" r="3.44" style="fill: #333"/>
<circle cx="22.84" cy="372.06" r="3.44" style="fill: #333"/>
<circle cx="7.84" cy="372.06" r="3.44" style="fill: #333"/>
</g>
</g>
</g>
<g id="Layer_5" data-name="Layer 5">
<g>
<polygon points="25.18 103.03 60.69 96.88 56.42 97.62 58.49 84.41 48.1 86.21 46.03 99.42 35.56 101.23 37.63 88.02 21.55 90.81 27.25 89.82 25.18 103.03" style="fill: #fbc010"/>
<polygon points="14.71 104.84 16.78 91.63 6.4 93.43 4.33 106.64 0 107.39 0 107.39 21.97 103.59 14.71 104.84" style="fill: #fbc010"/>
<polygon points="77.27 94.01 79.34 80.8 85.55 79.73 68.96 82.6 66.89 95.81 77.27 94.01" style="fill: #fbc010"/>
<polygon points="89.81 78.99 85.55 79.73 89.81 78.99 89.81 78.99"/>
<polygon points="77.27 94.01 84.38 92.78 77.27 94.01 77.27 94.01"/>
<polygon points="77.27 94.01 84.38 92.78 87.74 92.2 89.81 78.99 85.55 79.73 79.34 80.8 77.27 94.01"/>
<polygon points="108.59 88.59 108.59 88.59 99.41 90.18 108.59 88.59"/>
<polygon points="100.19 77.19 98.12 90.4 99.41 90.18 108.59 88.59 110.66 75.38 100.19 77.19"/>
<polygon points="68.96 82.6 58.49 84.41 58.49 84.41 68.96 82.6 68.96 82.6"/>
<polygon points="66.89 95.81 66.89 95.81 60.69 96.88 66.89 95.81"/>
<polygon points="60.69 96.88 66.89 95.81 68.96 82.6 58.49 84.41 56.42 97.62 60.69 96.88"/>
<polygon points="6.4 93.43 6.4 93.43 0 94.54 0 94.54 6.4 93.43"/>
<polygon points="0 107.39 4.33 106.64 6.4 93.43 0 94.54 0 107.39"/>
<polygon points="48.1 86.21 37.63 88.02 37.63 88.02 48.1 86.21 48.1 86.21"/>
<polygon points="46.03 99.42 48.1 86.21 37.63 88.02 35.56 101.23 46.03 99.42"/>
<polygon points="25.18 103.03 25.18 103.03 21.97 103.59 25.18 103.03"/>
<polygon points="16.78 91.63 16.78 91.63 21.55 90.81 16.78 91.63"/>
<polygon points="21.97 103.59 25.18 103.03 27.25 89.82 21.55 90.81 16.78 91.63 14.71 104.84 21.97 103.59"/>
<polygon points="118.97 86.79 120.35 78.04 120.35 73.7 89.81 78.99 87.74 92.2 84.38 92.78 99.41 90.18 98.12 90.4 100.19 77.19 110.66 75.38 108.59 88.59 120.35 86.56 120.35 86.56 118.97 86.79" style="fill: #fbc010"/>
<polygon points="118.97 86.79 120.35 86.56 120.35 78.04 118.97 86.79"/>
</g>
<g>
<polygon points="52.89 162.55 46.89 174.5 36.37 173.04 42.36 161.09 0 155.18 0 156.13 0.44 155.25 10.97 156.71 4.97 168.66 15.4 170.12 21.4 158.17 31.93 159.63 25.93 171.58 57.33 175.96 63.33 164.01 52.89 162.55" style="fill: #fbc010"/>
<polygon points="78.28 178.88 88.81 180.35 88.81 180.35 78.28 178.88 78.28 178.88"/>
<polygon points="84.28 166.93 78.28 178.88 88.81 180.35 94.81 168.4 84.28 166.93"/>
<polygon points="99.25 181.8 104.6 182.55 99.25 181.8 99.25 181.8"/>
<polygon points="115.77 171.32 105.25 169.85 99.25 181.8 104.6 182.55 109.77 183.27 115.77 171.32"/>
<polygon points="57.33 175.96 67.85 177.43 67.85 177.43 57.33 175.96 57.33 175.96"/>
<polygon points="73.85 165.47 63.33 164.01 63.33 164.01 73.85 165.47 73.85 165.47"/>
<polygon points="63.33 164.01 57.33 175.96 67.85 177.43 73.85 165.47 63.33 164.01"/>
<polygon points="0 167.97 4.97 168.66 4.97 168.66 0 167.97 0 167.97"/>
<polygon points="0.44 155.25 0 156.13 0 167.97 4.97 168.66 10.97 156.71 0.44 155.25"/>
<polygon points="52.89 162.55 42.36 161.09 42.36 161.09 52.89 162.55 52.89 162.55"/>
<polygon points="46.89 174.5 52.89 162.55 42.36 161.09 36.37 173.04 46.89 174.5"/>
<polygon points="15.4 170.12 25.93 171.58 25.93 171.58 15.4 170.12 15.4 170.12"/>
<polygon points="21.4 158.17 15.4 170.12 25.93 171.58 31.93 159.63 21.4 158.17"/>
<polygon points="120.41 184.75 120.41 184.32 120.21 184.72 120.41 184.75" style="fill: none"/>
<polygon points="120.21 184.72 120.41 184.32 120.41 171.96 73.85 165.47 67.85 177.43 78.28 178.88 84.28 166.93 94.81 168.4 88.81 180.35 99.25 181.8 105.25 169.85 115.77 171.32 109.77 183.27 104.6 182.55 120.41 184.75 120.41 184.75 120.21 184.72" style="fill: #fbc010"/>
</g>
<g>
<polygon points="52.31 308.39 65.45 302.05 63.8 288.77 67.74 286.88 54.32 293.36 55.96 306.63 52.31 308.39" style="fill: #fbc010"/>
<polygon points="85.24 292.48 84.5 292.84 82.86 279.57 85.49 278.3 73.37 284.15 75.02 297.42 85.24 292.48" style="fill: #fbc010"/>
<polygon points="103.56 283.63 101.91 270.36 92.43 274.94 94.07 288.22 103.56 283.63" style="fill: #fbc010"/>
<polygon points="27.34 320.46 25.69 307.19 16.21 311.77 17.85 325.04 27.34 320.46" style="fill: #fbc010"/>
<polygon points="32.14 318.14 46.39 311.25 44.75 297.98 35.26 302.57 36.91 315.84 32.14 318.14" style="fill: #fbc010"/>
<polygon points="65.45 302.05 75.02 297.42 75.02 297.42 65.45 302.05 65.45 302.05"/>
<polygon points="73.37 284.15 67.74 286.88 73.37 284.15 73.37 284.15"/>
<polygon points="65.45 302.05 75.02 297.42 73.37 284.15 67.74 286.88 63.8 288.77 65.45 302.05"/>
<polygon points="92.43 274.94 85.49 278.3 92.43 274.94 92.43 274.94"/>
<polygon points="94.07 288.22 94.07 288.22 85.24 292.48 94.07 288.22"/>
<polygon points="84.5 292.84 85.24 292.48 94.07 288.22 92.43 274.94 85.49 278.3 82.86 279.57 84.5 292.84"/>
<polygon points="54.32 293.36 44.75 297.98 44.75 297.98 54.32 293.36 54.32 293.36"/>
<polygon points="46.39 311.25 52.31 308.39 46.39 311.25 46.39 311.25"/>
<polygon points="52.31 308.39 55.96 306.63 54.32 293.36 44.75 297.98 46.39 311.25 52.31 308.39"/>
<polygon points="35.26 302.57 25.69 307.19 25.69 307.19 35.26 302.57 35.26 302.57"/>
<polygon points="27.34 320.46 32.14 318.14 27.34 320.46 27.34 320.46"/>
<polygon points="32.14 318.14 36.91 315.84 35.26 302.57 25.69 307.19 27.34 320.46 32.14 318.14"/>
<polygon points="16.21 311.77 6.64 316.4 6.64 316.4 16.21 311.77 16.21 311.77"/>
<polygon points="17.85 325.04 17.85 325.04 14.61 326.61 17.85 325.04"/>
<polygon points="14.61 326.61 17.85 325.04 16.21 311.77 6.64 316.4 8.28 329.67 14.61 326.61"/>
<polygon points="111.48 265.74 101.91 270.36 101.91 270.36 111.48 265.74 111.48 265.74"/>
<polygon points="103.56 283.63 113.13 279.01 113.13 279.01 103.56 283.63 103.56 283.63"/>
<polygon points="111.48 265.74 113.13 279.01 120.39 275.5 120.39 261.43 111.48 265.74" style="fill: #fbc010"/>
<polygon points="101.91 270.36 103.56 283.63 113.13 279.01 111.48 265.74 101.91 270.36"/>
<polygon points="8.28 329.67 6.64 316.4 0.3 319.46 0.3 333.52 14.61 326.61 8.28 329.67" style="fill: #fbc010"/>
</g>
</g>
</svg>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save