From 78bcb8423f535956d5c6b067658b52cba91f168c Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 29 Mar 2014 23:01:44 +0200 Subject: [PATCH] New instrument... Codename: Monstro. May be subject to a rename later. --- data/themes/default/style.css | 10 + plugins/CMakeLists.txt | 1 + plugins/monstro/CMakeLists.txt | 3 + plugins/monstro/Monstro.cpp | 1594 ++++++++++++++++++++++++++ plugins/monstro/Monstro.h | 593 ++++++++++ plugins/monstro/am_active.png | Bin 0 -> 730 bytes plugins/monstro/am_inactive.png | Bin 0 -> 525 bytes plugins/monstro/artwork_mat.png | Bin 0 -> 61598 bytes plugins/monstro/artwork_op.png | Bin 0 -> 58075 bytes plugins/monstro/exp.png | Bin 0 -> 367 bytes plugins/monstro/fm_active.png | Bin 0 -> 678 bytes plugins/monstro/fm_inactive.png | Bin 0 -> 484 bytes plugins/monstro/logo.png | Bin 0 -> 3335 bytes plugins/monstro/matview_active.png | Bin 0 -> 1992 bytes plugins/monstro/matview_inactive.png | Bin 0 -> 1501 bytes plugins/monstro/mix_active.png | Bin 0 -> 776 bytes plugins/monstro/mix_inactive.png | Bin 0 -> 510 bytes plugins/monstro/moog.png | Bin 0 -> 402 bytes plugins/monstro/noise.png | Bin 0 -> 478 bytes plugins/monstro/opview_active.png | Bin 0 -> 2129 bytes plugins/monstro/opview_inactive.png | Bin 0 -> 1519 bytes plugins/monstro/pm_active.png | Bin 0 -> 724 bytes plugins/monstro/pm_inactive.png | Bin 0 -> 481 bytes plugins/monstro/ramp.png | Bin 0 -> 333 bytes plugins/monstro/saw.png | Bin 0 -> 365 bytes plugins/monstro/sin.png | Bin 0 -> 398 bytes plugins/monstro/sqr.png | Bin 0 -> 342 bytes plugins/monstro/tri.png | Bin 0 -> 380 bytes 28 files changed, 2201 insertions(+) create mode 100644 plugins/monstro/CMakeLists.txt create mode 100644 plugins/monstro/Monstro.cpp create mode 100644 plugins/monstro/Monstro.h create mode 100644 plugins/monstro/am_active.png create mode 100644 plugins/monstro/am_inactive.png create mode 100644 plugins/monstro/artwork_mat.png create mode 100644 plugins/monstro/artwork_op.png create mode 100644 plugins/monstro/exp.png create mode 100644 plugins/monstro/fm_active.png create mode 100644 plugins/monstro/fm_inactive.png create mode 100644 plugins/monstro/logo.png create mode 100644 plugins/monstro/matview_active.png create mode 100644 plugins/monstro/matview_inactive.png create mode 100644 plugins/monstro/mix_active.png create mode 100644 plugins/monstro/mix_inactive.png create mode 100644 plugins/monstro/moog.png create mode 100644 plugins/monstro/noise.png create mode 100644 plugins/monstro/opview_active.png create mode 100644 plugins/monstro/opview_inactive.png create mode 100644 plugins/monstro/pm_active.png create mode 100644 plugins/monstro/pm_inactive.png create mode 100644 plugins/monstro/ramp.png create mode 100644 plugins/monstro/saw.png create mode 100644 plugins/monstro/sin.png create mode 100644 plugins/monstro/sqr.png create mode 100644 plugins/monstro/tri.png diff --git a/data/themes/default/style.css b/data/themes/default/style.css index b68ef0658..bab240bf3 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -644,6 +644,16 @@ WatsynView knob#xtalkKnob { qproperty-outerColor: #fb50fb; } +MonstroView knob { + color: #ffffff; + qproperty-outerColor: #aaaaaa; + qproperty-outerRadius: 9; + qproperty-innerRadius: 6; + qproperty-centerPointX: 10; + qproperty-centerPointY: 10; + qproperty-lineWidth: 2.5; +} + /* palette information - each colour definition must be on a single line, and the line must begin with "palette:", with no leading whitespace * colour codes MUST be of the form #RRGGBB */ diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index b1247ce18..c5bf9175f 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -12,6 +12,7 @@ ADD_SUBDIRECTORY(LadspaEffect) ADD_SUBDIRECTORY(lb302) #ADD_SUBDIRECTORY(lb303) ADD_SUBDIRECTORY(midi_import) +ADD_SUBDIRECTORY(monstro) ADD_SUBDIRECTORY(organic) ADD_SUBDIRECTORY(opl2) ADD_SUBDIRECTORY(papu) diff --git a/plugins/monstro/CMakeLists.txt b/plugins/monstro/CMakeLists.txt new file mode 100644 index 000000000..6a9195b75 --- /dev/null +++ b/plugins/monstro/CMakeLists.txt @@ -0,0 +1,3 @@ +INCLUDE(BuildPlugin) + +BUILD_PLUGIN(monstro Monstro.cpp Monstro.h MOCFILES Monstro.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") diff --git a/plugins/monstro/Monstro.cpp b/plugins/monstro/Monstro.cpp new file mode 100644 index 000000000..e3b843891 --- /dev/null +++ b/plugins/monstro/Monstro.cpp @@ -0,0 +1,1594 @@ +/* + * Monstro.cpp - a monstrous semi-modular 3-osc synth with modulation matrix + * + * Copyright (c) 2014 Vesa Kivimäki + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#include + +#include "Monstro.h" +#include "engine.h" +#include "InstrumentTrack.h" +#include "templates.h" +#include "gui_templates.h" +#include "tooltip.h" +#include "song.h" +#include "lmms_math.h" + +#include "embed.cpp" + + +extern "C" +{ + +Plugin::Descriptor PLUGIN_EXPORT monstro_plugin_descriptor = +{ + STRINGIFY( PLUGIN_NAME ), + "Monstro", + QT_TRANSLATE_NOOP( "pluginBrowser", + "Monstrous 3-oscillator synth with modulation matrix" ), + "Vesa Kivimäki ", + 0x0100, + Plugin::Instrument, + new PluginPixmapLoader( "logo" ), + NULL, + NULL +} ; + +} + + + + +MonstroSynth::MonstroSynth( MonstroInstrument * _i, NotePlayHandle * _nph, + const sample_rate_t _samplerate, fpp_t _frames ) : + m_parent( _i ), + m_nph( _nph ), + m_samplerate( _samplerate ), + m_fpp( _frames ) +{ + m_env1_buf = new sample_t[_frames]; + m_env2_buf = new sample_t[_frames]; + m_lfo1_buf = new sample_t[_frames]; + m_lfo2_buf = new sample_t[_frames]; + + m_osc1l_phase = 0.0; + m_osc1r_phase = 0.0; + m_osc2l_phase = 0.0; + m_osc2r_phase = 0.0; + m_osc3l_phase = 0.0; + m_osc3r_phase = 0.0; + + m_env1_phase = 0.0; + m_env2_phase = 0.0; +} + + +MonstroSynth::~MonstroSynth() +{ + delete[] m_env1_buf; + delete[] m_env2_buf; + delete[] m_lfo1_buf; + delete[] m_lfo2_buf; + +} + + +void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) +{ +// macros for modulating with env/lfos +#define modulatefreq( car, mod, min, max ) \ + if( mod##_e1 != 0.0 ) car = qBound( min, car * static_cast( fastPow( 2, m_env1_buf[f] * mod##_e1 ) ), max ); \ + if( mod##_e2 != 0.0 ) car = qBound( min, car * static_cast( fastPow( 2, m_env2_buf[f] * mod##_e2 ) ), max ); \ + if( mod##_l1 != 0.0 ) car = qBound( min, car * static_cast( fastPow( 2, m_lfo1_buf[f] * mod##_l1 ) ), max ); \ + if( mod##_l2 != 0.0 ) car = qBound( min, car * static_cast( fastPow( 2, m_lfo2_buf[f] * mod##_l2 ) ), max ); + +#define modulateabs( car, mod, min, max ) \ + if( mod##_e1 != 0.0 ) car = qBound( min, car + mod##_e1 / 2 * m_env1_buf[f], max ); \ + if( mod##_e2 != 0.0 ) car = qBound( min, car + mod##_e2 / 2 * m_env2_buf[f], max ); \ + if( mod##_l1 != 0.0 ) car = qBound( min, car + mod##_l1 / 2 * m_lfo1_buf[f], max ); \ + if( mod##_l2 != 0.0 ) car = qBound( min, car + mod##_l2 / 2 * m_lfo2_buf[f], max ); + +#define modulatevol( car, mod ) \ + if( mod##_e1 > 0.0 ) car = qBound( 0.0f, car * ( 1.0f - mod##_e1 + mod##_e1 * m_env1_buf[f] ), MODCLIP ); \ + if( mod##_e1 < 0.0 ) car = qBound( 0.0f, car * ( 0.0f - mod##_e1 + mod##_e1 * m_env1_buf[f] ), MODCLIP ); \ + if( mod##_e2 > 0.0 ) car = qBound( 0.0f, car * ( 1.0f - mod##_e2 + mod##_e2 * m_env2_buf[f] ), MODCLIP ); \ + if( mod##_e2 < 0.0 ) car = qBound( 0.0f, car * ( 0.0f - mod##_e2 + mod##_e2 * m_env2_buf[f] ), MODCLIP ); \ + if( mod##_l1 != 0.0 ) car = qBound( 0.0f, car * ( 1.0f + mod##_l1 * m_lfo1_buf[f] ), MODCLIP ); \ + if( mod##_l2 != 0.0 ) car = qBound( 0.0f, car * ( 1.0f + mod##_l2 * m_lfo2_buf[f] ), MODCLIP ); + + // pre-render env's and lfo's + renderModulators( _frames ); + + // get updated osc1 values + // get pulse width + const float pw = ( m_parent->m_osc1Pw.value() / 100.0 ); + const float o1pw_e1 = ( m_parent->m_pw1env1.value() ); + const float o1pw_e2 = ( m_parent->m_pw1env2.value() ); + const float o1pw_l1 = ( m_parent->m_pw1lfo1.value() ); + const float o1pw_l2 = ( m_parent->m_pw1lfo2.value() ); + + // get phases + const float o1lpo = m_parent->m_osc1l_po; + const float o1rpo = m_parent->m_osc1r_po; + const float o1p_e1 = ( m_parent->m_phs1env1.value() ); + const float o1p_e2 = ( m_parent->m_phs1env2.value() ); + const float o1p_l1 = ( m_parent->m_phs1lfo1.value() ); + const float o1p_l2 = ( m_parent->m_phs1lfo2.value() ); + + // get pitch + const float o1lfb = ( m_parent->m_osc1l_freq * m_nph->frequency() ); + const float o1rfb = ( m_parent->m_osc1r_freq * m_nph->frequency() ); + const float o1f_e1 = ( m_parent->m_pit1env1.value() ); + const float o1f_e2 = ( m_parent->m_pit1env2.value() ); + const float o1f_l1 = ( m_parent->m_pit1lfo1.value() ); + const float o1f_l2 = ( m_parent->m_pit1lfo2.value() ); + + // get volumes + const float o1lv = m_parent->m_osc1l_vol; + const float o1rv = m_parent->m_osc1r_vol; + const float o1v_e1 = ( m_parent->m_vol1env1.value() ); + const float o1v_e2 = ( m_parent->m_vol1env2.value() ); + const float o1v_l1 = ( m_parent->m_vol1lfo1.value() ); + const float o1v_l2 = ( m_parent->m_vol1lfo2.value() ); + + + // update osc2 + // get waveform + const int o2w = m_parent->m_osc2Wave.value(); + + // get phases + const float o2lpo = m_parent->m_osc2l_po; + const float o2rpo = m_parent->m_osc2r_po; + const float o2p_e1 = ( m_parent->m_phs2env1.value() ); + const float o2p_e2 = ( m_parent->m_phs2env2.value() ); + const float o2p_l1 = ( m_parent->m_phs2lfo1.value() ); + const float o2p_l2 = ( m_parent->m_phs2lfo2.value() ); + + // get pitch + const float o2lfb = ( m_parent->m_osc2l_freq * m_nph->frequency() ); + const float o2rfb = ( m_parent->m_osc2r_freq * m_nph->frequency() ); + const float o2f_e1 = ( m_parent->m_pit2env1.value() ); + const float o2f_e2 = ( m_parent->m_pit2env2.value() ); + const float o2f_l1 = ( m_parent->m_pit2lfo2.value() ); + const float o2f_l2 = ( m_parent->m_pit2lfo2.value() ); + + // get volumes + const float o2lv = m_parent->m_osc2l_vol; + const float o2rv = m_parent->m_osc2r_vol; + const float o2v_e1 = ( m_parent->m_vol2env1.value() ); + const float o2v_e2 = ( m_parent->m_vol2env2.value() ); + const float o2v_l1 = ( m_parent->m_vol2lfo2.value() ); + const float o2v_l2 = ( m_parent->m_vol2lfo2.value() ); + + + + // update osc3 + // get waveforms + const int o3w1 = m_parent->m_osc3Wave1.value(); + const int o3w2 = m_parent->m_osc3Wave2.value(); + + // get phases + const float o3lpo = m_parent->m_osc3l_po; + const float o3rpo = m_parent->m_osc3r_po; + const float o3p_e1 = ( m_parent->m_phs3env1.value() ); + const float o3p_e2 = ( m_parent->m_phs3env2.value() ); + const float o3p_l1 = ( m_parent->m_phs3lfo1.value() ); + const float o3p_l2 = ( m_parent->m_phs3lfo2.value() ); + + // get pitch modulators + const float o3fb = ( m_parent->m_osc3_freq * m_nph->frequency() ); + const float o3f_e1 = ( m_parent->m_pit3env1.value() ); + const float o3f_e2 = ( m_parent->m_pit3env2.value() ); + const float o3f_l1 = ( m_parent->m_pit3lfo1.value() ); + const float o3f_l2 = ( m_parent->m_pit3lfo2.value() ); + + // get volumes + const float o3lv = m_parent->m_osc3l_vol; + const float o3rv = m_parent->m_osc3r_vol; + const float o3v_e1 = ( m_parent->m_vol3env1.value() ); + const float o3v_e2 = ( m_parent->m_vol3env2.value() ); + const float o3v_l1 = ( m_parent->m_vol3lfo1.value() ); + const float o3v_l2 = ( m_parent->m_vol3lfo2.value() ); + + // get sub + const float o3sub = ( m_parent->m_osc3Sub.value() + 100.0 ) / 200.0; + const float o3s_e1 = ( m_parent->m_sub3env1.value() ); + const float o3s_e2 = ( m_parent->m_sub3env2.value() ); + const float o3s_l1 = ( m_parent->m_sub3lfo1.value() ); + const float o3s_l2 = ( m_parent->m_sub3lfo2.value() ); + + + //o2-o3 modulation + + const int omod = m_parent->m_o23Mod.value(); + + /////////////////////////// + // // + // start buffer loop // + // // + /////////////////////////// + + + + for( f_cnt_t f = 0; f < _frames; f++ ) + { + +/* + // debug code + if( f % 10 == 0 ) { + qDebug( "env1 %f -- env1 phase %f", m_env1_buf[f], m_env1_phase ); + qDebug( "env1 pre %f att %f dec %f rel %f ", m_parent->m_env1_pre, m_parent->m_env1_att, + m_parent->m_env1_dec, m_parent->m_env1_rel ); + } +*/ + + ///////////////////////////// + // // + // OSC 1 // + // // + ///////////////////////////// + + // calc and mod frequencies + float o1l_f = o1lfb; + float o1r_f = o1rfb; + modulatefreq( o1l_f, o1f, 20.0f, 20000.0f ) + modulatefreq( o1r_f, o1f, 20.0f, 20000.0f ) + + // calc and modulate phase + float o1l_p = m_osc1l_phase + o1lpo; + float o1r_p = m_osc1r_phase + o1rpo; + modulateabs( o1l_p, o1p, 0.0f, 1.0f ) + modulateabs( o1r_p, o1p, 0.0f, 1.0f ) + + // calc and modulate pulse + float o1_pw = pw; + modulateabs( o1_pw, o1pw, -1.0f, 1.0f ) + + // pulse wave osc + sample_t O1L = ( o1l_p < o1_pw ) ? 1.0f : -1.0f; + sample_t O1R = ( o1r_p < o1_pw ) ? 1.0f : -1.0f; + + // modulate volume + O1L *= o1lv; + O1R *= o1rv; + modulatevol( O1L, o1v ) + modulatevol( O1R, o1v ) + + // update osc1 phases + m_osc1l_phase = fraction( m_osc1l_phase + ( 1.0 / ( static_cast( m_samplerate ) / o1l_f ) ) ); + m_osc1r_phase = fraction( m_osc1r_phase + ( 1.0 / ( static_cast( m_samplerate ) / o1r_f ) ) ); + + ///////////////////////////// + // // + // OSC 2 // + // // + ///////////////////////////// + + // calc and mod frequencies + float o2l_f = o2lfb; + float o2r_f = o2rfb; + modulatefreq( o2l_f, o2f, 20.0f, 20000.0f ) + modulatefreq( o2r_f, o2f, 20.0f, 20000.0f ) + + // calc and modulate phase + float o2l_p = m_osc2l_phase + o2lpo; + float o2r_p = m_osc2r_phase + o2rpo; + modulateabs( o2l_p, o2p, 0.0f, 1.0f ) + modulateabs( o2r_p, o2p, 0.0f, 1.0f ) + + // multi-wave DC Oscillator + sample_t O2L = oscillate( o2w, o2l_p ); + sample_t O2R = oscillate( o2w, o2r_p ); + + // modulate volume + O2L *= o2lv; + O2R *= o2rv; + modulatevol( O2L, o2v ) + modulatevol( O2R, o2v ) + + // update osc2 phases + m_osc2l_phase = fraction( m_osc2l_phase + ( 1.0 / ( static_cast( m_samplerate ) / o2l_f ) ) ); + m_osc2r_phase = fraction( m_osc2r_phase + ( 1.0 / ( static_cast( m_samplerate ) / o2r_f ) ) ); + + ///////////////////////////// + // // + // OSC 3 // + // // + ///////////////////////////// + + // calc and mod frequencies + float o3l_f = o3fb; + float o3r_f = o3fb; + modulatefreq( o3l_f, o3f, 20.0f, 20000.0f ) + modulatefreq( o3r_f, o3f, 20.0f, 20000.0f ) + // o2 modulation? + if( omod == MOD_FM ) + { + o3l_f = qBound( 20.0f, o3l_f * static_cast( fastPow( 2, O2L ) ), 20000.0f ); + o3r_f = qBound( 20.0f, o3r_f * static_cast( fastPow( 2, O2R ) ), 20000.0f ); + } + + // calc and modulate phase + float o3l_p = m_osc3l_phase + o3lpo; + float o3r_p = m_osc3r_phase + o3rpo; + modulateabs( o3l_p, o3p, 0.0f, 1.0f ) + modulateabs( o3r_p, o3p, 0.0f, 1.0f ) + // o2 modulation? + if( omod == MOD_PM ) + { + o3l_p = qBound( 0.0f, o3l_p + O2L/2, 1.0f ); + o3r_p = qBound( 0.0f, o3r_p + O2R/2, 1.0f ); + } + + // multi-wave DC Oscillator, sub-osc 1 + sample_t O3AL = oscillate( o3w1, o3l_p ); + sample_t O3AR = oscillate( o3w1, o3r_p ); + + // multi-wave DC Oscillator, sub-osc 2 + sample_t O3BL = oscillate( o3w2, o3l_p ); + sample_t O3BR = oscillate( o3w2, o3r_p ); + + // calc and modulate sub + float sub = o3sub; + modulateabs( sub, o3s, 0.0f, 1.0f ) + + sample_t O3L = interpolate( O3AL, O3BL, sub ); + sample_t O3R = interpolate( O3AR, O3BR, sub ); + + // modulate volume + O3L *= o3lv; + O3R *= o3rv; + modulatevol( O3L, o3v ) + modulatevol( O3R, o3v ) + // o2 modulation? + if( omod == MOD_AM ) + { + O3L = qBound( -MODCLIP, O3L * qMax( 0.0f, 1.0f + O2L ), MODCLIP ); + O3R = qBound( -MODCLIP, O3R * qMax( 0.0f, 1.0f + O2R ), MODCLIP ); + } + + // update osc3 phases + m_osc3l_phase = fraction( m_osc3l_phase + ( 1.0f / ( static_cast( m_samplerate ) / o3l_f ) ) ); + m_osc3r_phase = fraction( m_osc3r_phase + ( 1.0f / ( static_cast( m_samplerate ) / o3r_f ) ) ); + + _buf[f][0] = O1L + O3L + ( omod == MOD_MIX ? O2L : 0.0f ); + _buf[f][1] = O1R + O3R + ( omod == MOD_MIX ? O2R : 0.0f ); + } +} + + +void MonstroSynth::renderModulators( fpp_t _frames ) +{ + // LFO phase offsets + const float lfo1_p = m_parent->m_lfo1Phs.value() / 360.0f; + const float lfo2_p = m_parent->m_lfo2Phs.value() / 360.0f; + + // LFO rates + const float lfo1_r = m_parent->m_lfo1Rate.value() / 1000.0f * m_samplerate; + const float lfo2_r = m_parent->m_lfo2Rate.value() / 1000.0f * m_samplerate; + + // LFOs + + sample_t lfo1_s; + sample_t lfo2_s; + + // LFO 1 + + switch( m_parent->m_lfo1Wave.value() ) + { + case WAVE_SINE: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::sinSample( lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent-> m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_TRI: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::triangleSample( lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_SAW: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::sawSample( lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_RAMP: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::sawSample( lfo1_p + static_cast( t ) / lfo1_r ) * -1.0f; + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_SQR: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::squareSample( lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_MOOG: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::moogSawSample( lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_EXP: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo1_s = Oscillator::expSample( lfo1_p + static_cast( t ) / lfo1_r ); + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent-> m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + case WAVE_NOISE: + default: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + if( t % static_cast( lfo1_r ) == 0 ) m_lfo1_last = Oscillator::noiseSample( 0.0f ); + lfo1_s = m_lfo1_last; + if( t < m_parent->m_lfo1_att ) lfo1_s *= ( static_cast( t ) / m_parent->m_lfo1_att ); + m_lfo1_buf[f] = lfo1_s; + } + break; + } + + // LFO 2 + + switch( m_parent->m_lfo2Wave.value() ) + { + case WAVE_SINE: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::sinSample( lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_TRI: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::triangleSample( lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_SAW: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::sawSample( lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_RAMP: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::sawSample( lfo2_p + static_cast( t ) / lfo2_r ) * -1.0f; + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_SQR: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::squareSample( lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_MOOG: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::moogSawSample( lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_EXP: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + lfo2_s = Oscillator::expSample( lfo2_p + static_cast( t ) / lfo2_r ); + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + case WAVE_NOISE: + default: + for( f_cnt_t f = 0; f < _frames; f++ ) + { + const f_cnt_t t = f + m_nph->totalFramesPlayed(); + if( t % static_cast( lfo2_r ) == 0 ) m_lfo2_last = Oscillator::noiseSample( 0.0f ); + lfo2_s = m_lfo2_last; + if( t < m_parent->m_lfo2_att ) lfo2_s *= ( static_cast( t ) / m_parent->m_lfo2_att ); + m_lfo2_buf[f] = lfo2_s; + } + break; + } + + ///////////////////////////////////////////// + // + // + // envelopes + // + // + ///////////////////////////////////////////// + + const float env1_s = m_parent-> m_env1Slope.value(); + const float env2_s = m_parent-> m_env2Slope.value(); + + const float env1_sus = m_parent-> m_env1Sus.value(); + const float env2_sus = m_parent-> m_env2Sus.value(); + + for( f_cnt_t f = 0; f < _frames; f++ ) + { + // envelope 1 + + // adjust phase for release + if( m_nph->isReleased() && m_env1_phase < 4.0f ) + { + if( m_env1_phase < 1.0f ) m_env1_phase = 5.0f; + else if( m_env1_phase < 2.0f ) m_env1_phase = 5.0f - fraction( m_env1_phase ); + else if( m_env1_phase < 3.0f ) m_env1_phase = 4.0f; + else m_env1_phase = 4.0f + fraction( m_env1_phase ); + } + + // process envelope + if( m_env1_phase < 1.0f ) // pre-delay phase + { + m_env1_buf[f] = 0.0f; + m_env1_phase = qMin( 1.0f, m_env1_phase + m_parent->m_env1_pre ); + } + else if( m_env1_phase < 2.0f ) // attack phase + { + m_env1_buf[f] = calcSlope( fraction( m_env1_phase ), env1_s ); + m_env1_phase = qMin( 2.0f, m_env1_phase + m_parent->m_env1_att ); + } + else if( m_env1_phase < 3.0f ) // hold phase + { + m_env1_buf[f] = 1.0f; + m_env1_phase = qMin( 3.0f, m_env1_phase + m_parent->m_env1_hold ); + } + else if( m_env1_phase < 4.0f ) // decay phase + { + const sample_t s = 1.0f - fraction( m_env1_phase ); + if( s <= env1_sus ) + { + m_env1_buf[f] = env1_sus; + } + else + { + m_env1_buf[f] = calcSlope( s, env1_s ); + m_env1_phase = qMin( 4.0f - env1_sus, m_env1_phase + m_parent->m_env1_dec ); + } + } + else if( m_env1_phase < 5.0f ) // release phase + { + m_env1_buf[f] = calcSlope( 1.0f - fraction( m_env1_phase ), env1_s ); + m_env1_phase += m_parent->m_env1_rel; + } + else m_env1_buf[f] = 0.0f; + +// qDebug( "env1 %f", m_env1_buf[f] ); + + // envelope 2 + + + + // adjust phase for release + if( m_nph->isReleased() && m_env2_phase < 4.0f ) + { + if( m_env2_phase < 1.0f ) m_env2_phase = 5.0f; + else if( m_env2_phase < 2.0f ) m_env2_phase = 5.0f - fraction( m_env2_phase ); + else if( m_env2_phase < 3.0f ) m_env2_phase = 4.0f; + else m_env2_phase = 4.0f + fraction( m_env2_phase ); + } + + // process envelope + if( m_env2_phase < 1.0f ) // pre-delay phase + { + m_env2_buf[f] = 0.0f; + m_env2_phase = qMin( 1.0f, m_env2_phase + m_parent->m_env2_pre ); + } + else if( m_env2_phase < 2.0f ) // attack phase + { + m_env2_buf[f] = calcSlope( fraction( m_env2_phase ), env2_s ); + m_env2_phase = qMin( 2.0f, m_env2_phase + m_parent->m_env2_att ); + } + else if( m_env2_phase < 3.0f ) // hold phase + { + m_env2_buf[f] = 1.0f; + m_env2_phase = qMin( 3.0f, m_env2_phase + m_parent->m_env2_hold ); + } + else if( m_env2_phase < 4.0f ) // decay phase + { + const sample_t s = 1.0f - fraction( m_env2_phase ); + if( s <= env2_sus ) + { + m_env2_buf[f] = env2_sus; + } + else + { + m_env2_buf[f] = calcSlope( s, env2_s ); + m_env2_phase = qMin( 4.0f - env2_sus, m_env2_phase + m_parent->m_env2_dec ); + } + } + else if( m_env2_phase < 5.0f ) // release phase + { + m_env2_buf[f] = calcSlope( 1.0f - fraction( m_env2_phase), env2_s ); + m_env2_phase += m_parent->m_env2_rel; + } + else m_env2_buf[f] = 0.0f; + + } + +} + + + +MonstroInstrument::MonstroInstrument( InstrumentTrack * _instrument_track ) : + Instrument( _instrument_track, &monstro_plugin_descriptor ), + + m_osc1Vol( 33.0, 0.0, 200.0, 0.1, this, tr( "Osc 1 Volume" ) ), + m_osc1Pan( 0.0, -100.0, 100.0, 0.1, this, tr( "Osc 1 Panning" ) ), + m_osc1Crs( 0.0, -24.0, 24.0, 1.0, this, tr( "Osc 1 Coarse detune" ) ), + m_osc1Ftl( 0.0, -100.0, 100.0, 1.0, this, tr( "Osc 1 Fine detune left" ) ), + m_osc1Ftr( 0.0, -100.0, 100.0, 1.0, this, tr( "Osc 1 Fine detune right" ) ), + m_osc1Spo( 0.0, -180.0, 180.0, 0.1, this, tr( "Osc 1 Stereo phase offset" ) ), + m_osc1Pw( 50.0, 0.0, 100.0, 0.01, this, tr( "Osc 1 Pulse width" ) ), + + m_osc2Vol( 33.0, 0.0, 200.0, 0.1, this, tr( "Osc 2 Volume" ) ), + m_osc2Pan( 0.0, -100.0, 100.0, 0.1, this, tr( "Osc 2 Panning" ) ), + m_osc2Crs( 0.0, -24.0, 24.0, 1.0, this, tr( "Osc 2 Coarse detune" ) ), + m_osc2Ftl( 0.0, -100.0, 100.0, 1.0, this, tr( "Osc 2 Fine detune left" ) ), + m_osc2Ftr( 0.0, -100.0, 100.0, 1.0, this, tr( "Osc 2 Fine detune right" ) ), + m_osc2Spo( 0.0, -180.0, 180.0, 0.1, this, tr( "Osc 2 Stereo phase offset" ) ), + m_osc2Wave( this, tr( "Osc 2 Waveform" ) ), + + m_osc3Vol( 33.0, 0.0, 200.0, 0.1, this, tr( "Osc 3 Volume" ) ), + m_osc3Pan( 0.0, -100.0, 100.0, 0.1, this, tr( "Osc 3 Panning" ) ), + m_osc3Crs( 0.0, -24.0, 24.0, 1.0, this, tr( "Osc 3 Coarse detune" ) ), + m_osc3Spo( 0.0, -180.0, 180.0, 0.1, this, tr( "Osc 3 Stereo phase offset" ) ), + m_osc3Sub( 0.0, -100.0, 100.0, 0.1, this, tr( "Osc 3 Sub-oscillator mix" ) ), + m_osc3Wave1( this, tr( "Osc 3 Waveform 1" ) ), + m_osc3Wave2( this, tr( "Osc 3 Waveform 2" ) ), + + m_lfo1Wave( this, tr( "LFO 1 Waveform" ) ), + m_lfo1Att( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "LFO 1 Attack" ) ), + m_lfo1Rate( 1.0f, 0.1, 20000.0, 0.1, 20000.0f, this, tr( "LFO 1 Rate" ) ), + m_lfo1Phs( 0.0, -180.0, 180.0, 0.1, this, tr( "LFO 1 Phase" ) ), + + m_lfo2Wave( this, tr( "LFO 2 Waveform" ) ), + m_lfo2Att( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "LFO 2 Attack" ) ), + m_lfo2Rate( 1.0f, 0.1, 20000.0, 0.1, 20000.0f, this, tr( "LFO 2 Rate" ) ), + m_lfo2Phs( 0.0, -180.0, 180.0, 0.1, this, tr( "LFO 2 Phase" ) ), + + m_env1Pre( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 1 Pre-delay" ) ), + m_env1Att( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 1 Attack" ) ), + m_env1Hold( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 1 Hold" ) ), + m_env1Dec( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 1 Decay" ) ), + m_env1Sus( 1.0f, 0.0f, 1.0f, 0.001f, this, tr( "Env 1 Sustain" ) ), + m_env1Rel( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 1 Release" ) ), + m_env1Slope( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Env 1 Slope" ) ), + + m_env2Pre( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 2 Pre-delay" ) ), + m_env2Att( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 2 Attack" ) ), + m_env2Hold( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 2 Hold" ) ), + m_env2Dec( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 2 Decay" ) ), + m_env2Sus( 1.0f, 0.0f, 1.0f, 0.001f, this, tr( "Env 2 Sustain" ) ), + m_env2Rel( 0.0f, 0.0f, 2000.0f, 1.0f, 2000.0f, this, tr( "Env 2 Release" ) ), + m_env2Slope( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Env 2 Slope" ) ), + + m_o23Mod( 0, 0, NUM_MODS - 1, this, tr( "Osc2-3 modulation" ) ), + + m_selectedView( 0, 0, 1, this, tr( "Selected view" ) ), + + m_vol1env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol1-Env1" ) ), + m_vol1env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol1-Env2" ) ), + m_vol1lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol1-LFO1" ) ), + m_vol1lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol1-LFO2" ) ), + + m_vol2env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol2-Env1" ) ), + m_vol2env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol2-Env2" ) ), + m_vol2lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol2-LFO1" ) ), + m_vol2lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol2-LFO2" ) ), + + m_vol3env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol3-Env1" ) ), + m_vol3env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol3-Env2" ) ), + m_vol3lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol3-LFO1" ) ), + m_vol3lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Vol3-LFO2" ) ), + + m_phs1env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs1-Env1" ) ), + m_phs1env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs1-Env2" ) ), + m_phs1lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs1-LFO1" ) ), + m_phs1lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs1-LFO2" ) ), + + m_phs2env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs2-Env1" ) ), + m_phs2env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs2-Env2" ) ), + m_phs2lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs2-LFO1" ) ), + m_phs2lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs2-LFO2" ) ), + + m_phs3env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs3-Env1" ) ), + m_phs3env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs3-Env2" ) ), + m_phs3lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs3-LFO1" ) ), + m_phs3lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Phs3-LFO2" ) ), + + m_pit1env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit1-Env1" ) ), + m_pit1env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit1-Env2" ) ), + m_pit1lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit1-LFO1" ) ), + m_pit1lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit1-LFO2" ) ), + + m_pit2env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit2-Env1" ) ), + m_pit2env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit2-Env2" ) ), + m_pit2lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit2-LFO1" ) ), + m_pit2lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit2-LFO2" ) ), + + m_pit3env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit3-Env1" ) ), + m_pit3env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit3-Env2" ) ), + m_pit3lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit3-LFO1" ) ), + m_pit3lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Pit3-LFO2" ) ), + + m_pw1env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "PW1-Env1" ) ), + m_pw1env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "PW1-Env2" ) ), + m_pw1lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "PW1-LFO1" ) ), + m_pw1lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "PW1-LFO2" ) ), + + m_sub3env1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Sub3-Env1" ) ), + m_sub3env2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Sub3-Env2" ) ), + m_sub3lfo1( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Sub3-LFO1" ) ), + m_sub3lfo2( 0.0f, -1.0f, 1.0f, 0.001f, this, tr( "Sub3-LFO2" ) ) + +{ +// setup waveboxes + setwavemodel( m_osc2Wave ) + setwavemodel( m_osc3Wave1 ) + setwavemodel( m_osc3Wave2 ) + setwavemodel( m_lfo1Wave ) + setwavemodel( m_lfo2Wave ) + +// make connections: + +// updateVolumes + + connect( &m_osc1Vol, SIGNAL( dataChanged() ), this, SLOT( updateVolumes() ) ); + connect( &m_osc1Pan, SIGNAL( dataChanged() ), this, SLOT( updateVolumes() ) ); + connect( &m_osc2Vol, SIGNAL( dataChanged() ), this, SLOT( updateVolumes() ) ); + connect( &m_osc2Pan, SIGNAL( dataChanged() ), this, SLOT( updateVolumes() ) ); + connect( &m_osc3Vol, SIGNAL( dataChanged() ), this, SLOT( updateVolumes() ) ); + connect( &m_osc3Pan, SIGNAL( dataChanged() ), this, SLOT( updateVolumes() ) ); + +// updateFreq + + connect( &m_osc1Crs, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + connect( &m_osc2Crs, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + connect( &m_osc3Crs, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + + connect( &m_osc1Ftl, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + connect( &m_osc2Ftl, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + + connect( &m_osc1Ftr, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + connect( &m_osc2Ftr, SIGNAL( dataChanged() ), this, SLOT( updateFreq() ) ); + +// updatePO + connect( &m_osc1Spo, SIGNAL( dataChanged() ), this, SLOT( updatePO() ) ); + connect( &m_osc2Spo, SIGNAL( dataChanged() ), this, SLOT( updatePO() ) ); + connect( &m_osc3Spo, SIGNAL( dataChanged() ), this, SLOT( updatePO() ) ); + +// updateEnvelope1 + + connect( &m_env1Pre, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope1() ) ); + connect( &m_env1Att, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope1() ) ); + connect( &m_env1Hold, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope1() ) ); + connect( &m_env1Dec, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope1() ) ); + connect( &m_env1Rel, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope1() ) ); + +// updateEnvelope2 + + connect( &m_env2Pre, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope2() ) ); + connect( &m_env2Att, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope2() ) ); + connect( &m_env2Hold, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope2() ) ); + connect( &m_env2Dec, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope2() ) ); + connect( &m_env2Rel, SIGNAL( dataChanged() ), this, SLOT( updateEnvelope2() ) ); + +// updateLFOAtts + + connect( &m_lfo1Att, SIGNAL( dataChanged() ), this, SLOT( updateLFOAtts() ) ); + connect( &m_lfo2Att, SIGNAL( dataChanged() ), this, SLOT( updateLFOAtts() ) ); + +// updateSampleRate + + connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( updateSamplerate() ) ); + + m_fpp = engine::mixer()->framesPerPeriod(); + + updateSamplerate(); + updateVolumes(); + updateFreq(); + updatePO(); +} + + +MonstroInstrument::~MonstroInstrument() +{ +} + + +void MonstroInstrument::playNote( NotePlayHandle * _n, + sampleFrame * _working_buffer ) +{ + if ( _n->totalFramesPlayed() == 0 || _n->m_pluginData == NULL ) + { + const sample_rate_t samplerate = m_samplerate; + _n->m_pluginData = new MonstroSynth( this, _n, samplerate, m_fpp ); + } + + const fpp_t frames = _n->framesLeftForCurrentPeriod(); + + MonstroSynth * ms = static_cast( _n->m_pluginData ); + + ms->renderOutput( frames, _working_buffer ); + + //applyRelease( _working_buffer, _n ); + + instrumentTrack()->processAudioBuffer( _working_buffer, frames, _n ); +} + +void MonstroInstrument::deleteNotePluginData( NotePlayHandle * _n ) +{ + delete static_cast( _n->m_pluginData ); +} + + +void MonstroInstrument::saveSettings( QDomDocument & _doc, + QDomElement & _this ) +{ + m_osc1Vol.saveSettings( _doc, _this, "o1vol" ); + m_osc1Pan.saveSettings( _doc, _this, "o1pan" ); + m_osc1Crs.saveSettings( _doc, _this, "o1crs" ); + m_osc1Ftl.saveSettings( _doc, _this, "o1ftl" ); + m_osc1Ftr.saveSettings( _doc, _this, "o1ftr" ); + m_osc1Spo.saveSettings( _doc, _this, "o1spo" ); + m_osc1Pw.saveSettings( _doc, _this, "o1pw" ); + + m_osc2Vol.saveSettings( _doc, _this, "o2vol" ); + m_osc2Pan.saveSettings( _doc, _this, "o2pan" ); + m_osc2Crs.saveSettings( _doc, _this, "o2crs" ); + m_osc2Ftl.saveSettings( _doc, _this, "o2ftl" ); + m_osc2Ftr.saveSettings( _doc, _this, "o2ftr" ); + m_osc2Spo.saveSettings( _doc, _this, "o2spo" ); + m_osc2Wave.saveSettings( _doc, _this, "o2wav" ); + + m_osc3Vol.saveSettings( _doc, _this, "o3vol" ); + m_osc3Pan.saveSettings( _doc, _this, "o3pan" ); + m_osc3Crs.saveSettings( _doc, _this, "o3crs" ); + m_osc3Spo.saveSettings( _doc, _this, "o3spo" ); + m_osc3Sub.saveSettings( _doc, _this, "o3sub" ); + m_osc3Wave1.saveSettings( _doc, _this, "o3wav1" ); + m_osc3Wave2.saveSettings( _doc, _this, "o3wav2" ); + + m_lfo1Wave.saveSettings( _doc, _this, "l1wav" ); + m_lfo1Att.saveSettings( _doc, _this, "l1att" ); + m_lfo1Rate.saveSettings( _doc, _this, "l1rat" ); + m_lfo1Phs.saveSettings( _doc, _this, "l1phs" ); + + m_lfo2Wave.saveSettings( _doc, _this, "l2wav" ); + m_lfo2Att.saveSettings( _doc, _this, "l2att" ); + m_lfo2Rate.saveSettings( _doc, _this, "l2rat" ); + m_lfo2Phs.saveSettings( _doc, _this, "l2phs" ); + + m_env1Pre.saveSettings( _doc, _this, "e1pre" ); + m_env1Att.saveSettings( _doc, _this, "e1att" ); + m_env1Hold.saveSettings( _doc, _this, "e1hol" ); + m_env1Dec.saveSettings( _doc, _this, "e1dec" ); + m_env1Sus.saveSettings( _doc, _this, "e1sus" ); + m_env1Rel.saveSettings( _doc, _this, "e1rel" ); + m_env1Slope.saveSettings( _doc, _this, "e1slo" ); + + m_env2Pre.saveSettings( _doc, _this, "e2pre" ); + m_env2Att.saveSettings( _doc, _this, "e2att" ); + m_env2Hold.saveSettings( _doc, _this, "e2hol" ); + m_env2Dec.saveSettings( _doc, _this, "e2dec" ); + m_env2Sus.saveSettings( _doc, _this, "e2sus" ); + m_env2Rel.saveSettings( _doc, _this, "e2rel" ); + m_env2Slope.saveSettings( _doc, _this, "e2slo" ); + + m_o23Mod.saveSettings( _doc, _this, "o23mo" ); + + m_vol1env1.saveSettings( _doc, _this, "v1e1" ); + m_vol1env2.saveSettings( _doc, _this, "v1e2" ); + m_vol1lfo1.saveSettings( _doc, _this, "v1l1" ); + m_vol1lfo2.saveSettings( _doc, _this, "v1l2" ); + + m_vol2env1.saveSettings( _doc, _this, "v2e1" ); + m_vol2env2.saveSettings( _doc, _this, "v2e2" ); + m_vol2lfo1.saveSettings( _doc, _this, "v2l1" ); + m_vol2lfo2.saveSettings( _doc, _this, "v2l2" ); + + m_vol3env1.saveSettings( _doc, _this, "v3e1" ); + m_vol3env2.saveSettings( _doc, _this, "v3e2" ); + m_vol3lfo1.saveSettings( _doc, _this, "v3l1" ); + m_vol3lfo2.saveSettings( _doc, _this, "v3l2" ); + + m_phs1env1.saveSettings( _doc, _this, "p1e1" ); + m_phs1env2.saveSettings( _doc, _this, "p1e2" ); + m_phs1lfo1.saveSettings( _doc, _this, "p1l1" ); + m_phs1lfo2.saveSettings( _doc, _this, "p1l2" ); + + m_phs2env1.saveSettings( _doc, _this, "p2e1" ); + m_phs2env2.saveSettings( _doc, _this, "p2e2" ); + m_phs2lfo1.saveSettings( _doc, _this, "p2l1" ); + m_phs2lfo2.saveSettings( _doc, _this, "p2l2" ); + + m_phs3env1.saveSettings( _doc, _this, "p3e1" ); + m_phs3env2.saveSettings( _doc, _this, "p3e2" ); + m_phs3lfo1.saveSettings( _doc, _this, "p3l1" ); + m_phs3lfo2.saveSettings( _doc, _this, "p3l2" ); + + m_pit1env1.saveSettings( _doc, _this, "f1e1" ); + m_pit1env2.saveSettings( _doc, _this, "f1e2" ); + m_pit1lfo1.saveSettings( _doc, _this, "f1l1" ); + m_pit1lfo2.saveSettings( _doc, _this, "f1l2" ); + + m_pit2env1.saveSettings( _doc, _this, "f2e1" ); + m_pit2env2.saveSettings( _doc, _this, "f2e2" ); + m_pit2lfo1.saveSettings( _doc, _this, "f2l1" ); + m_pit2lfo2.saveSettings( _doc, _this, "f2l2" ); + + m_pit3env1.saveSettings( _doc, _this, "f3e1" ); + m_pit3env2.saveSettings( _doc, _this, "f3e2" ); + m_pit3lfo1.saveSettings( _doc, _this, "f3l1" ); + m_pit3lfo2.saveSettings( _doc, _this, "f3l2" ); + + m_pw1env1.saveSettings( _doc, _this, "w1e1" ); + m_pw1env2.saveSettings( _doc, _this, "w1e2" ); + m_pw1lfo1.saveSettings( _doc, _this, "w1l1" ); + m_pw1lfo2.saveSettings( _doc, _this, "w1l2" ); + + m_sub3env1.saveSettings( _doc, _this, "s3e1" ); + m_sub3env2.saveSettings( _doc, _this, "s3e2" ); + m_sub3lfo1.saveSettings( _doc, _this, "s3l1" ); + m_sub3lfo2.saveSettings( _doc, _this, "s3l2" ); + +} + +void MonstroInstrument::loadSettings( const QDomElement & _this ) +{ + m_osc1Vol.loadSettings( _this, "o1vol" ); + m_osc1Pan.loadSettings( _this, "o1pan" ); + m_osc1Crs.loadSettings( _this, "o1crs" ); + m_osc1Ftl.loadSettings( _this, "o1ftl" ); + m_osc1Ftr.loadSettings( _this, "o1ftr" ); + m_osc1Spo.loadSettings( _this, "o1spo" ); + m_osc1Pw.loadSettings( _this, "o1pw" ); + + m_osc2Vol.loadSettings( _this, "o2vol" ); + m_osc2Pan.loadSettings( _this, "o2pan" ); + m_osc2Crs.loadSettings( _this, "o2crs" ); + m_osc2Ftl.loadSettings( _this, "o2ftl" ); + m_osc2Ftr.loadSettings( _this, "o2ftr" ); + m_osc2Spo.loadSettings( _this, "o2spo" ); + m_osc2Wave.loadSettings( _this, "o2wav" ); + + m_osc3Vol.loadSettings( _this, "o3vol" ); + m_osc3Pan.loadSettings( _this, "o3pan" ); + m_osc3Crs.loadSettings( _this, "o3crs" ); + m_osc3Spo.loadSettings( _this, "o3spo" ); + m_osc3Sub.loadSettings( _this, "o3sub" ); + m_osc3Wave1.loadSettings( _this, "o3wav1" ); + m_osc3Wave2.loadSettings( _this, "o3wav2" ); + + m_lfo1Wave.loadSettings( _this, "l1wav" ); + m_lfo1Att.loadSettings( _this, "l1att" ); + m_lfo1Rate.loadSettings( _this, "l1rat" ); + m_lfo1Phs.loadSettings( _this, "l1phs" ); + + m_lfo2Wave.loadSettings( _this, "l2wav" ); + m_lfo2Att.loadSettings( _this, "l2att" ); + m_lfo2Rate.loadSettings( _this, "l2rat" ); + m_lfo2Phs.loadSettings( _this, "l2phs" ); + + m_env1Pre.loadSettings( _this, "e1pre" ); + m_env1Att.loadSettings( _this, "e1att" ); + m_env1Hold.loadSettings( _this, "e1hol" ); + m_env1Dec.loadSettings( _this, "e1dec" ); + m_env1Sus.loadSettings( _this, "e1sus" ); + m_env1Rel.loadSettings( _this, "e1rel" ); + m_env1Slope.loadSettings( _this, "e1slo" ); + + m_env2Pre.loadSettings( _this, "e2pre" ); + m_env2Att.loadSettings( _this, "e2att" ); + m_env2Hold.loadSettings( _this, "e2hol" ); + m_env2Dec.loadSettings( _this, "e2dec" ); + m_env2Sus.loadSettings( _this, "e2sus" ); + m_env2Rel.loadSettings( _this, "e2rel" ); + m_env2Slope.loadSettings( _this, "e2slo" ); + + m_o23Mod.loadSettings( _this, "o23mo" ); + + m_vol1env1.loadSettings( _this, "v1e1" ); + m_vol1env2.loadSettings( _this, "v1e2" ); + m_vol1lfo1.loadSettings( _this, "v1l1" ); + m_vol1lfo2.loadSettings( _this, "v1l2" ); + + m_vol2env1.loadSettings( _this, "v2e1" ); + m_vol2env2.loadSettings( _this, "v2e2" ); + m_vol2lfo1.loadSettings( _this, "v2l1" ); + m_vol2lfo2.loadSettings( _this, "v2l2" ); + + m_vol3env1.loadSettings( _this, "v3e1" ); + m_vol3env2.loadSettings( _this, "v3e2" ); + m_vol3lfo1.loadSettings( _this, "v3l1" ); + m_vol3lfo2.loadSettings( _this, "v3l2" ); + + m_phs1env1.loadSettings( _this, "p1e1" ); + m_phs1env2.loadSettings( _this, "p1e2" ); + m_phs1lfo1.loadSettings( _this, "p1l1" ); + m_phs1lfo2.loadSettings( _this, "p1l2" ); + + m_phs2env1.loadSettings( _this, "p2e1" ); + m_phs2env2.loadSettings( _this, "p2e2" ); + m_phs2lfo1.loadSettings( _this, "p2l1" ); + m_phs2lfo2.loadSettings( _this, "p2l2" ); + + m_phs3env1.loadSettings( _this, "p3e1" ); + m_phs3env2.loadSettings( _this, "p3e2" ); + m_phs3lfo1.loadSettings( _this, "p3l1" ); + m_phs3lfo2.loadSettings( _this, "p3l2" ); + + m_pit1env1.loadSettings( _this, "f1e1" ); + m_pit1env2.loadSettings( _this, "f1e2" ); + m_pit1lfo1.loadSettings( _this, "f1l1" ); + m_pit1lfo2.loadSettings( _this, "f1l2" ); + + m_pit2env1.loadSettings( _this, "f2e1" ); + m_pit2env2.loadSettings( _this, "f2e2" ); + m_pit2lfo1.loadSettings( _this, "f2l1" ); + m_pit2lfo2.loadSettings( _this, "f2l2" ); + + m_pit3env1.loadSettings( _this, "f3e1" ); + m_pit3env2.loadSettings( _this, "f3e2" ); + m_pit3lfo1.loadSettings( _this, "f3l1" ); + m_pit3lfo2.loadSettings( _this, "f3l2" ); + + m_pw1env1.loadSettings( _this, "w1e1" ); + m_pw1env2.loadSettings( _this, "w1e2" ); + m_pw1lfo1.loadSettings( _this, "w1l1" ); + m_pw1lfo2.loadSettings( _this, "w1l2" ); + + m_sub3env1.loadSettings( _this, "s3e1" ); + m_sub3env2.loadSettings( _this, "s3e2" ); + m_sub3lfo1.loadSettings( _this, "s3l1" ); + m_sub3lfo2.loadSettings( _this, "s3l2" ); + +} + + +QString MonstroInstrument::nodeName() const +{ + return monstro_plugin_descriptor.name; +} + + +f_cnt_t MonstroInstrument::desiredReleaseFrames() const +{ + return qMax( 64, qMax( m_env1_relF, m_env2_relF ) ); +} + + +PluginView * MonstroInstrument::instantiateView( QWidget * _parent ) +{ + return( new MonstroView( this, _parent ) ); +} + + +void MonstroInstrument::updateVolumes() +{ + m_osc1l_vol = leftCh( m_osc1Vol.value(), m_osc1Pan.value() ); + m_osc1r_vol = rightCh( m_osc1Vol.value(), m_osc1Pan.value() ); + + m_osc2l_vol = leftCh( m_osc2Vol.value(), m_osc2Pan.value() ); + m_osc2r_vol = rightCh( m_osc2Vol.value(), m_osc2Pan.value() ); + + m_osc3l_vol = leftCh( m_osc3Vol.value(), m_osc3Pan.value() ); + m_osc3r_vol = rightCh( m_osc3Vol.value(), m_osc3Pan.value() ); +} + + +void MonstroInstrument::updateFreq() +{ + m_osc1l_freq = powf( 2.0d, m_osc1Crs.value() / 12.0d ) * + powf( 2.0d, m_osc1Ftl.value() / 1200.0d ); + m_osc1r_freq = powf( 2.0d, m_osc1Crs.value() / 12.0d ) * + powf( 2.0d, m_osc1Ftr.value() / 1200.0d ); + + m_osc2l_freq = powf( 2.0d, m_osc2Crs.value() / 12.0d ) * + powf( 2.0d, m_osc2Ftl.value() / 1200.0d ); + m_osc2r_freq = powf( 2.0d, m_osc2Crs.value() / 12.0d ) * + powf( 2.0d, m_osc2Ftr.value() / 1200.0d ); + + m_osc3_freq = powf( 2.0d, m_osc3Crs.value() / 12.0d ); +} + + +void MonstroInstrument::updatePO() +{ + m_osc1l_po = m_osc1Spo.value() / 360.0; + m_osc1r_po = ( m_osc1Spo.value() * -1.0 ) / 360.0; + + m_osc2l_po = m_osc2Spo.value() / 360.0; + m_osc2r_po = ( m_osc2Spo.value() * -1.0 ) / 360.0; + + m_osc3l_po = m_osc3Spo.value() / 360.0; + m_osc3r_po = ( m_osc3Spo.value() * -1.0 ) / 360.0; +} + +void MonstroInstrument::updateEnvelope1() +{ + if( m_env1Pre.value() == 0.0f ) m_env1_pre = 1.0; + else m_env1_pre = 1.0 / ( m_env1Pre.value() / 1000.0f ) / m_samplerate; + if( m_env1Att.value() == 0.0f ) m_env1_att = 1.0; + else m_env1_att = 1.0 / ( m_env1Att.value() / 1000.0f ) / m_samplerate; + if( m_env1Hold.value() == 0.0f ) m_env1_hold = 1.0; + else m_env1_hold = 1.0 / ( m_env1Hold.value() / 1000.0f ) / m_samplerate; + if( m_env1Dec.value() == 0.0f ) m_env1_dec = 1.0; + else m_env1_dec = 1.0 / ( m_env1Dec.value() / 1000.0f ) / m_samplerate; + if( m_env1Rel.value() == 0.0f ) m_env1_rel = 1.0; + else m_env1_rel = 1.0 / ( m_env1Rel.value() / 1000.0f ) / m_samplerate; + + m_env1_len = ( m_env1Pre.value() + m_env1Att.value() + m_env1Hold.value() + m_env1Dec.value() ) * m_samplerate / 1000.0f; + m_env1_relF = m_env1Rel.value() * m_samplerate / 1000.0f; +} +void MonstroInstrument::updateEnvelope2() +{ + if( m_env2Pre.value() == 0.0f ) m_env2_pre = 1.0; + else m_env2_pre = 1.0 / ( m_env2Pre.value() / 1000.0f ) / m_samplerate; + if( m_env2Att.value() == 0.0f ) m_env2_att = 1.0; + else m_env2_att = 1.0 / ( m_env2Att.value() / 1000.0f ) / m_samplerate; + if( m_env2Hold.value() == 0.0f ) m_env2_hold = 1.0; + else m_env2_hold = 1.0 / ( m_env2Hold.value() / 1000.0f ) / m_samplerate; + if( m_env2Dec.value() == 0.0f ) m_env2_dec = 1.0; + else m_env2_dec = 1.0 / ( m_env2Dec.value() / 1000.0f ) / m_samplerate; + if( m_env2Rel.value() == 0.0f ) m_env2_rel = 1.0; + else m_env2_rel = 1.0 / ( m_env2Rel.value() / 1000.0f ) / m_samplerate; + + m_env2_len = ( m_env2Pre.value() + m_env2Att.value() + m_env2Hold.value() + m_env2Dec.value() ) * m_samplerate / 1000.0f; + m_env2_relF = m_env2Rel.value() * m_samplerate / 1000.0f; +} + + +void MonstroInstrument::updateLFOAtts() +{ + m_lfo1_att = m_lfo1Att.value() * m_samplerate / 1000.0f; + m_lfo2_att = m_lfo2Att.value() * m_samplerate / 1000.0f; +} + + +void MonstroInstrument::updateSamplerate() +{ + m_samplerate = engine::mixer()->processingSampleRate(); + updateEnvelope1(); + updateEnvelope2(); + updateLFOAtts(); +} + + +MonstroView::MonstroView( Instrument * _instrument, + QWidget * _parent ) : + InstrumentView( _instrument, _parent ) +{ + m_operatorsView = setupOperatorsView( this ); + setWidgetBackground( m_operatorsView, "artwork_op" ); + m_operatorsView->show(); + m_operatorsView->move( 0, 0 ); + + m_matrixView = setupMatrixView( this ); + setWidgetBackground( m_matrixView, "artwork_mat" ); + m_matrixView->hide(); + m_matrixView->move( 0, 0 ); + +// "tab buttons" + + pixmapButton * m_opViewButton = new pixmapButton( this, NULL ); + m_opViewButton -> move( 0,0 ); + m_opViewButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "opview_active" ) ); + m_opViewButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "opview_inactive" ) ); + toolTip::add( m_opViewButton, tr( "Operators view" ) ); + + pixmapButton * m_matViewButton = new pixmapButton( this, NULL ); + m_matViewButton -> move( 125,0 ); + m_matViewButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "matview_active" ) ); + m_matViewButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "matview_inactive" ) ); + toolTip::add( m_matViewButton, tr( "Matrix view" ) ); + + m_selectedViewGroup = new automatableButtonGroup( this ); + m_selectedViewGroup -> addButton( m_opViewButton ); + m_selectedViewGroup -> addButton( m_matViewButton ); + + connect( m_opViewButton, SIGNAL( clicked() ), this, SLOT( updateLayout() ) ); + connect( m_matViewButton, SIGNAL( clicked() ), this, SLOT( updateLayout() ) ); +} + + +MonstroView::~MonstroView() +{ +} + + +void MonstroView::updateLayout() +{ + switch( m_selectedViewGroup->model()->value() ) + { + case OPVIEW: + m_operatorsView->show(); + m_matrixView->hide(); + break; + case MATVIEW: + m_operatorsView->hide(); + m_matrixView->show(); + break; + } +} + + +void MonstroView::modelChanged() +{ + MonstroInstrument * m = castModel(); + + m_osc1VolKnob-> setModel( &m-> m_osc1Vol ); + m_osc1PanKnob-> setModel( &m-> m_osc1Pan ); + m_osc1CrsKnob-> setModel( &m-> m_osc1Crs ); + m_osc1FtlKnob-> setModel( &m-> m_osc1Ftl ); + m_osc1FtrKnob-> setModel( &m-> m_osc1Ftr ); + m_osc1SpoKnob-> setModel( &m-> m_osc1Spo ); + m_osc1PwKnob-> setModel( &m-> m_osc1Pw ); + + m_osc2VolKnob-> setModel( &m-> m_osc2Vol ); + m_osc2PanKnob-> setModel( &m-> m_osc2Pan ); + m_osc2CrsKnob-> setModel( &m-> m_osc2Crs ); + m_osc2FtlKnob-> setModel( &m-> m_osc2Ftl ); + m_osc2FtrKnob-> setModel( &m-> m_osc2Ftr ); + m_osc2SpoKnob-> setModel( &m-> m_osc2Spo ); + m_osc2WaveBox-> setModel( &m-> m_osc2Wave ); + + m_osc3VolKnob-> setModel( &m-> m_osc3Vol ); + m_osc3PanKnob-> setModel( &m-> m_osc3Pan ); + m_osc3CrsKnob-> setModel( &m-> m_osc3Crs ); + m_osc3SpoKnob-> setModel( &m-> m_osc3Spo ); + m_osc3SubKnob-> setModel( &m-> m_osc3Sub ); + m_osc3Wave1Box-> setModel( &m-> m_osc3Wave1 ); + m_osc3Wave2Box-> setModel( &m-> m_osc3Wave2 ); + + m_lfo1WaveBox-> setModel( &m-> m_lfo1Wave ); + m_lfo1AttKnob-> setModel( &m-> m_lfo1Att ); + m_lfo1RateKnob-> setModel( &m-> m_lfo1Rate ); + m_lfo1PhsKnob-> setModel( &m-> m_lfo1Phs ); + + m_lfo2WaveBox-> setModel( &m-> m_lfo2Wave ); + m_lfo2AttKnob-> setModel( &m-> m_lfo2Att ); + m_lfo2RateKnob-> setModel( &m-> m_lfo2Rate ); + m_lfo2PhsKnob-> setModel( &m-> m_lfo2Phs ); + + m_env1PreKnob-> setModel( &m-> m_env1Pre ); + m_env1AttKnob-> setModel( &m-> m_env1Att ); + m_env1HoldKnob-> setModel( &m-> m_env1Hold ); + m_env1DecKnob-> setModel( &m-> m_env1Dec ); + m_env1SusKnob-> setModel( &m-> m_env1Sus ); + m_env1RelKnob-> setModel( &m-> m_env1Rel ); + m_env1SlopeKnob-> setModel( &m-> m_env1Slope ); + + m_env2PreKnob-> setModel( &m-> m_env2Pre ); + m_env2AttKnob-> setModel( &m-> m_env2Att ); + m_env2HoldKnob-> setModel( &m-> m_env2Hold ); + m_env2DecKnob-> setModel( &m-> m_env2Dec ); + m_env2SusKnob-> setModel( &m-> m_env2Sus ); + m_env2RelKnob-> setModel( &m-> m_env2Rel ); + m_env2SlopeKnob-> setModel( &m-> m_env2Slope ); + + m_o23ModGroup-> setModel( &m-> m_o23Mod ); + m_selectedViewGroup-> setModel( &m-> m_selectedView ); + + m_vol1env1Knob-> setModel( &m-> m_vol1env1 ); + m_vol1env2Knob-> setModel( &m-> m_vol1env2 ); + m_vol1lfo1Knob-> setModel( &m-> m_vol1lfo1 ); + m_vol1lfo2Knob-> setModel( &m-> m_vol1lfo2 ); + + m_vol2env1Knob-> setModel( &m-> m_vol2env1 ); + m_vol2env2Knob-> setModel( &m-> m_vol2env2 ); + m_vol2lfo1Knob-> setModel( &m-> m_vol2lfo1 ); + m_vol2lfo2Knob-> setModel( &m-> m_vol2lfo2 ); + + m_vol3env1Knob-> setModel( &m-> m_vol3env1 ); + m_vol3env2Knob-> setModel( &m-> m_vol3env2 ); + m_vol3lfo1Knob-> setModel( &m-> m_vol3lfo1 ); + m_vol3lfo2Knob-> setModel( &m-> m_vol3lfo2 ); + + m_phs1env1Knob-> setModel( &m-> m_phs1env1 ); + m_phs1env2Knob-> setModel( &m-> m_phs1env2 ); + m_phs1lfo1Knob-> setModel( &m-> m_phs1lfo1 ); + m_phs1lfo2Knob-> setModel( &m-> m_phs1lfo2 ); + + m_phs2env1Knob-> setModel( &m-> m_phs2env1 ); + m_phs2env2Knob-> setModel( &m-> m_phs2env2 ); + m_phs2lfo1Knob-> setModel( &m-> m_phs2lfo1 ); + m_phs2lfo2Knob-> setModel( &m-> m_phs2lfo2 ); + + m_phs3env1Knob-> setModel( &m-> m_phs3env1 ); + m_phs3env2Knob-> setModel( &m-> m_phs3env2 ); + m_phs3lfo1Knob-> setModel( &m-> m_phs3lfo1 ); + m_phs3lfo2Knob-> setModel( &m-> m_phs3lfo2 ); + + m_pit1env1Knob-> setModel( &m-> m_pit1env1 ); + m_pit1env2Knob-> setModel( &m-> m_pit1env2 ); + m_pit1lfo1Knob-> setModel( &m-> m_pit1lfo1 ); + m_pit1lfo2Knob-> setModel( &m-> m_pit1lfo2 ); + + m_pit2env1Knob-> setModel( &m-> m_pit2env1 ); + m_pit2env2Knob-> setModel( &m-> m_pit2env2 ); + m_pit2lfo1Knob-> setModel( &m-> m_pit2lfo1 ); + m_pit2lfo2Knob-> setModel( &m-> m_pit2lfo2 ); + + m_pit3env1Knob-> setModel( &m-> m_pit3env1 ); + m_pit3env2Knob-> setModel( &m-> m_pit3env2 ); + m_pit3lfo1Knob-> setModel( &m-> m_pit3lfo1 ); + m_pit3lfo2Knob-> setModel( &m-> m_pit3lfo2 ); + + m_pw1env1Knob-> setModel( &m-> m_pw1env1 ); + m_pw1env2Knob-> setModel( &m-> m_pw1env2 ); + m_pw1lfo1Knob-> setModel( &m-> m_pw1lfo1 ); + m_pw1lfo2Knob-> setModel( &m-> m_pw1lfo2 ); + + m_sub3env1Knob-> setModel( &m-> m_sub3env1 ); + m_sub3env2Knob-> setModel( &m-> m_sub3env2 ); + m_sub3lfo1Knob-> setModel( &m-> m_sub3lfo1 ); + m_sub3lfo2Knob-> setModel( &m-> m_sub3lfo2 ); + +} + + +void MonstroView::setWidgetBackground( QWidget * _widget, const QString & _pic ) +{ + _widget->setAutoFillBackground( true ); + QPalette pal; + pal.setBrush( _widget->backgroundRole(), + PLUGIN_NAME::getIconPixmap( _pic.toAscii().constData() ) ); + _widget->setPalette( pal ); +} + + +QWidget * MonstroView::setupOperatorsView( QWidget * _parent ) +{ + // operators view + + QWidget * view = new QWidget( _parent ); + view-> setFixedSize( 250, 250 ); + + makeknob( m_osc1VolKnob, KNOBCOL1, O1ROW, "Volume", "%", "osc1Knob" ) + makeknob( m_osc1PanKnob, KNOBCOL2, O1ROW, "Panning", "", "osc1Knob" ) + makeknob( m_osc1CrsKnob, KNOBCOL3, O1ROW, "Coarse detune", " seminotes", "osc1Knob" ) + makeknob( m_osc1FtlKnob, KNOBCOL4, O1ROW, "Finetune left", " cents", "osc1Knob" ) + makeknob( m_osc1FtrKnob, KNOBCOL5, O1ROW, "Finetune right", " cents", "osc1Knob" ) + makeknob( m_osc1SpoKnob, KNOBCOL6, O1ROW, "Stereo phase offset", "°", "osc1Knob" ) + makeknob( m_osc1PwKnob, KNOBCOL7, O1ROW, "Pulse width", "%", "osc1Knob" ) + + m_osc1VolKnob -> setVolumeKnob( true ); + + makeknob( m_osc2VolKnob, KNOBCOL1, O2ROW, "Volume", "%", "osc2Knob" ) + makeknob( m_osc2PanKnob, KNOBCOL2, O2ROW, "Panning", "", "osc2Knob" ) + makeknob( m_osc2CrsKnob, KNOBCOL3, O2ROW, "Coarse detune", " seminotes", "osc2Knob" ) + makeknob( m_osc2FtlKnob, KNOBCOL4, O2ROW, "Finetune left", " cents", "osc2Knob" ) + makeknob( m_osc2FtrKnob, KNOBCOL5, O2ROW, "Finetune right", " cents", "osc2Knob" ) + makeknob( m_osc2SpoKnob, KNOBCOL6, O2ROW, "Stereo phase offset", "°", "osc2Knob" ) + + m_osc2VolKnob -> setVolumeKnob( true ); + + m_osc2WaveBox = new comboBox( view ); + m_osc2WaveBox -> setGeometry( KNOBCOL7, O2ROW + 4, 42, 22 ); + m_osc2WaveBox->setFont( pointSize<8>( m_osc2WaveBox->font() ) ); + + makeknob( m_osc3VolKnob, KNOBCOL1, O3ROW, "Volume", "%", "osc3Knob" ) + makeknob( m_osc3PanKnob, KNOBCOL2, O3ROW, "Panning", "", "osc3Knob" ) + makeknob( m_osc3CrsKnob, KNOBCOL3, O3ROW, "Coarse detune", " seminotes", "osc3Knob" ) + makeknob( m_osc3SpoKnob, KNOBCOL4, O3ROW, "Stereo phase offset", "°", "osc3Knob" ) + makeknob( m_osc3SubKnob, KNOBCOL5, O3ROW, "Sub-osc mix", "", "osc3Knob" ) + + m_osc3Wave1Box = new comboBox( view ); + m_osc3Wave1Box -> setGeometry( 160, O3ROW + 4, 42, 22 ); + m_osc3Wave1Box->setFont( pointSize<8>( m_osc3Wave1Box->font() ) ); + + m_osc3Wave2Box = new comboBox( view ); + m_osc3Wave2Box -> setGeometry( 204, O3ROW + 4, 42, 22 ); + m_osc3Wave2Box->setFont( pointSize<8>( m_osc3Wave2Box->font() ) ); + + m_lfo1WaveBox = new comboBox( view ); + m_lfo1WaveBox -> setGeometry( 2, LFOROW + 7, 42, 22 ); + m_lfo1WaveBox->setFont( pointSize<8>( m_lfo1WaveBox->font() ) ); + + maketsknob( m_lfo1AttKnob, LFOCOL1, LFOROW, "Attack", " ms", "lfoKnob" ) + maketsknob( m_lfo1RateKnob, LFOCOL2, LFOROW, "Rate", " ms", "lfoKnob" ) + makeknob( m_lfo1PhsKnob, LFOCOL3, LFOROW, "Phase", "°", "lfoKnob" ) + + m_lfo2WaveBox = new comboBox( view ); + m_lfo2WaveBox -> setGeometry( 127, LFOROW + 7, 42, 22 ); + m_lfo2WaveBox->setFont( pointSize<8>( m_lfo2WaveBox->font() ) ); + + maketsknob( m_lfo2AttKnob, LFOCOL4, LFOROW, "Attack", " ms", "lfoKnob" ) + maketsknob( m_lfo2RateKnob, LFOCOL5, LFOROW, "Rate", " ms", "lfoKnob" ) + makeknob( m_lfo2PhsKnob, LFOCOL6, LFOROW, "Phase", "°", "lfoKnob" ) + + maketsknob( m_env1PreKnob, KNOBCOL1, E1ROW, "Pre-delay", " ms", "envKnob" ) + maketsknob( m_env1AttKnob, KNOBCOL2, E1ROW, "Attack", " ms", "envKnob" ) + maketsknob( m_env1HoldKnob, KNOBCOL3, E1ROW, "Hold", " ms", "envKnob" ) + maketsknob( m_env1DecKnob, KNOBCOL4, E1ROW, "Decay", " ms", "envKnob" ) + makeknob( m_env1SusKnob, KNOBCOL5, E1ROW, "Sustain", "", "envKnob" ) + maketsknob( m_env1RelKnob, KNOBCOL6, E1ROW, "Release", " ms", "envKnob" ) + makeknob( m_env1SlopeKnob, KNOBCOL7, E1ROW, "Slope", "", "envKnob" ) + + maketsknob( m_env2PreKnob, KNOBCOL1, E2ROW, "Pre-delay", " ms", "envKnob" ) + maketsknob( m_env2AttKnob, KNOBCOL2, E2ROW, "Attack", " ms", "envKnob" ) + maketsknob( m_env2HoldKnob, KNOBCOL3, E2ROW, "Hold", " ms", "envKnob" ) + maketsknob( m_env2DecKnob, KNOBCOL4, E2ROW, "Decay", " ms", "envKnob" ) + makeknob( m_env2SusKnob, KNOBCOL5, E2ROW, "Sustain", "", "envKnob" ) + maketsknob( m_env2RelKnob, KNOBCOL6, E2ROW, "Release", " ms", "envKnob" ) + makeknob( m_env2SlopeKnob, KNOBCOL7, E2ROW, "Slope", "", "envKnob" ) + + // mod selector + pixmapButton * m_mixButton = new pixmapButton( view, NULL ); + m_mixButton -> move( 225, 185 ); + m_mixButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "mix_active" ) ); + m_mixButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "mix_inactive" ) ); + toolTip::add( m_mixButton, tr( "Mix Osc2 with Osc3" ) ); + + pixmapButton * m_amButton = new pixmapButton( view, NULL ); + m_amButton -> move( 225, 185 + 15 ); + m_amButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "am_active" ) ); + m_amButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "am_inactive" ) ); + toolTip::add( m_amButton, tr( "Modulate amplitude of Osc3 with Osc2" ) ); + + pixmapButton * m_fmButton = new pixmapButton( view, NULL ); + m_fmButton -> move( 225, 185 + 15*2 ); + m_fmButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "fm_active" ) ); + m_fmButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "fm_inactive" ) ); + toolTip::add( m_fmButton, tr( "Modulate frequency of Osc3 with Osc2" ) ); + + pixmapButton * m_pmButton = new pixmapButton( view, NULL ); + m_pmButton -> move( 225, 185 + 15*3 ); + m_pmButton -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "pm_active" ) ); + m_pmButton -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "pm_inactive" ) ); + toolTip::add( m_pmButton, tr( "Modulate phase of Osc3 with Osc2" ) ); + + m_o23ModGroup = new automatableButtonGroup( view ); + m_o23ModGroup-> addButton( m_mixButton ); + m_o23ModGroup-> addButton( m_amButton ); + m_o23ModGroup-> addButton( m_fmButton ); + m_o23ModGroup-> addButton( m_pmButton ); + + return( view ); +} + + +QWidget * MonstroView::setupMatrixView( QWidget * _parent ) +{ + // matrix view + + QWidget * view = new QWidget( _parent ); + view-> setFixedSize( 250, 250 ); + + makeknob( m_vol1env1Knob, MATCOL1, MATROW1, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol1env2Knob, MATCOL2, MATROW1, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol1lfo1Knob, MATCOL3, MATROW1, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol1lfo2Knob, MATCOL4, MATROW1, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_vol2env1Knob, MATCOL1, MATROW3, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol2env2Knob, MATCOL2, MATROW3, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol2lfo1Knob, MATCOL3, MATROW3, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol2lfo2Knob, MATCOL4, MATROW3, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_vol3env1Knob, MATCOL1, MATROW5, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol3env2Knob, MATCOL2, MATROW5, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol3lfo1Knob, MATCOL3, MATROW5, "Modulation amount", "", "matrixKnob" ) + makeknob( m_vol3lfo2Knob, MATCOL4, MATROW5, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_phs1env1Knob, MATCOL1, MATROW2, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs1env2Knob, MATCOL2, MATROW2, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs1lfo1Knob, MATCOL3, MATROW2, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs1lfo2Knob, MATCOL4, MATROW2, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_phs2env1Knob, MATCOL1, MATROW4, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs2env2Knob, MATCOL2, MATROW4, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs2lfo1Knob, MATCOL3, MATROW4, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs2lfo2Knob, MATCOL4, MATROW4, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_phs3env1Knob, MATCOL1, MATROW6, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs3env2Knob, MATCOL2, MATROW6, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs3lfo1Knob, MATCOL3, MATROW6, "Modulation amount", "", "matrixKnob" ) + makeknob( m_phs3lfo2Knob, MATCOL4, MATROW6, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_pit1env1Knob, MATCOL5, MATROW1, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit1env2Knob, MATCOL6, MATROW1, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit1lfo1Knob, MATCOL7, MATROW1, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit1lfo2Knob, MATCOL8, MATROW1, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_pit2env1Knob, MATCOL5, MATROW3, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit2env2Knob, MATCOL6, MATROW3, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit2lfo1Knob, MATCOL7, MATROW3, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit2lfo2Knob, MATCOL8, MATROW3, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_pit3env1Knob, MATCOL5, MATROW5, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit3env2Knob, MATCOL6, MATROW5, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit3lfo1Knob, MATCOL7, MATROW5, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pit3lfo2Knob, MATCOL8, MATROW5, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_pw1env1Knob, MATCOL5, MATROW2, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pw1env2Knob, MATCOL6, MATROW2, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pw1lfo1Knob, MATCOL7, MATROW2, "Modulation amount", "", "matrixKnob" ) + makeknob( m_pw1lfo2Knob, MATCOL8, MATROW2, "Modulation amount", "", "matrixKnob" ) + + makeknob( m_sub3env1Knob, MATCOL5, MATROW6, "Modulation amount", "", "matrixKnob" ) + makeknob( m_sub3env2Knob, MATCOL6, MATROW6, "Modulation amount", "", "matrixKnob" ) + makeknob( m_sub3lfo1Knob, MATCOL7, MATROW6, "Modulation amount", "", "matrixKnob" ) + makeknob( m_sub3lfo2Knob, MATCOL8, MATROW6, "Modulation amount", "", "matrixKnob" ) + + return( view ); +} + +extern "C" +{ + +// necessary for getting instance out of shared lib +Plugin * PLUGIN_EXPORT lmms_plugin_main( Model *, void * _data ) +{ + return new MonstroInstrument( static_cast( _data ) ); +} + + +} + + + +#include "moc_Monstro.cxx" diff --git a/plugins/monstro/Monstro.h b/plugins/monstro/Monstro.h new file mode 100644 index 000000000..094859f62 --- /dev/null +++ b/plugins/monstro/Monstro.h @@ -0,0 +1,593 @@ +/* + * Monstro.h - a semi-modular 3-osc synth with modulation matrix + * + * Copyright (c) 2014 Vesa Kivimäki + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#ifndef MONSTRO_H +#define MONSTRO_H + + +#include "Instrument.h" +#include "InstrumentView.h" +#include "AutomatableModel.h" +#include "automatable_button.h" +#include "TempoSyncKnob.h" +#include "NotePlayHandle.h" +#include "pixmap_button.h" +#include "combobox.h" +#include "Oscillator.h" +// #include "fastpow.h" // once grejppi's fastpow gets merged + + +#define makeknob( name, x, y, hint, unit, oname ) \ + name = new knob( knobStyled, view ); \ + name ->move( x, y ); \ + name ->setHintText( tr( hint ) + " ", unit ); \ + name ->setObjectName( oname ); \ + name ->setFixedSize( 20, 20 ); + +#define maketsknob( name, x, y, hint, unit, oname ) \ + name = new TempoSyncKnob( knobStyled, view ); \ + name ->move( x, y ); \ + name ->setHintText( tr( hint ) + " ", unit ); \ + name ->setObjectName( oname ); \ + name ->setFixedSize( 20, 20 ); + +#define setwavemodel( name ) \ + name .addItem( tr( "Sine wave" ), static_cast( new PluginPixmapLoader( "sin" ) ) ); \ + name .addItem( tr( "Triangle wave" ), static_cast( new PluginPixmapLoader( "tri" ) ) ); \ + name .addItem( tr( "Saw wave" ), static_cast( new PluginPixmapLoader( "saw" ) ) ); \ + name .addItem( tr( "Ramp wave" ), static_cast( new PluginPixmapLoader( "ramp" ) ) ); \ + name .addItem( tr( "Square wave" ), static_cast( new PluginPixmapLoader( "sqr" ) ) ); \ + name .addItem( tr( "Moog saw wave" ), static_cast( new PluginPixmapLoader( "moog" ) ) ); \ + name .addItem( tr( "Exponential wave" ), static_cast( new PluginPixmapLoader( "exp" ) ) ); \ + name .addItem( tr( "White noise" ), static_cast( new PluginPixmapLoader( "noise" ) ) ); + + + + +const int O1ROW = 22; +const int O2ROW = 22 + 39; +const int O3ROW = 22 + 39 * 2; +const int LFOROW = 22 + 39 * 3; +const int E1ROW = 22 + 39 * 4; +const int E2ROW = 22 + 39 * 5; + +const int KNOBCOL1 = 16; +const int KNOBCOL2 = 16 + 30; +const int KNOBCOL3 = 16 + 30 * 2; +const int KNOBCOL4 = 16 + 30 * 3; +const int KNOBCOL5 = 16 + 30 * 4; +const int KNOBCOL6 = 16 + 30 * 5; +const int KNOBCOL7 = 16 + 30 * 6; + +const int LFOCOL1 = KNOBCOL2; +const int LFOCOL2 = KNOBCOL2 + 26; +const int LFOCOL3 = KNOBCOL2 + 26*2; +const int LFOCOL4 = 171; +const int LFOCOL5 = 171 + 26; +const int LFOCOL6 = 171 + 26*2; + +const int MATCOL1 = 32; +const int MATCOL2 = 32 + 25; +const int MATCOL3 = 32 + 25*2; +const int MATCOL4 = 32 + 25*3; +const int MATCOL5 = 149; +const int MATCOL6 = 149 + 25; +const int MATCOL7 = 149 + 25*2; +const int MATCOL8 = 149 + 25*3; + +const int MATROW1 = 22; +const int MATROW2 = 22 + 39; +const int MATROW3 = 22 + 39*2; +const int MATROW4 = 22 + 39*3; +const int MATROW5 = 22 + 39*4; +const int MATROW6 = 22 + 39*5; + +const int OPVIEW = 0; +const int MATVIEW = 1; + +const int WAVE_SINE = 0; +const int WAVE_TRI = 1; +const int WAVE_SAW = 2; +const int WAVE_RAMP = 3; +const int WAVE_SQR = 4; +const int WAVE_MOOG = 5; +const int WAVE_EXP = 6; +const int WAVE_NOISE = 7; +const int NUM_WAVES = 8; + +const int MOD_MIX = 0; +const int MOD_AM = 1; +const int MOD_FM = 2; +const int MOD_PM = 3; +const int NUM_MODS = 4; + +const float MODCLIP = 2.0; + +class MonstroInstrument; +class MonstroView; + +// use grejppi's once it's merged +inline double fastPow( double a, double b ) +{ + union + { + double d; + int32_t x[2]; + } u = { a }; + u.x[1] = static_cast( b * ( u.x[1] - 1072632447 ) + 1072632447 ); + u.x[0] = 0; + return u.d; +} + + +class MonstroSynth +{ +public: + MonstroSynth( MonstroInstrument * _i, NotePlayHandle * _nph, + const sample_rate_t _samplerate, fpp_t _frames ); + virtual ~MonstroSynth(); + + void renderOutput( fpp_t _frames, sampleFrame * _buf ); + + inline sample_rate_t samplerate() const + { + return m_samplerate; + } + +private: + + MonstroInstrument * m_parent; + NotePlayHandle * m_nph; + const sample_rate_t m_samplerate; + fpp_t m_fpp; + + sample_t * m_env1_buf; + sample_t * m_env2_buf; + sample_t * m_lfo1_buf; + sample_t * m_lfo2_buf; + + void renderModulators( fpp_t _frames ); + + // linear interpolation + inline sample_t interpolate( sample_t s1, sample_t s2, float x ) + { + return s1 + ( s2 - s1 ) * x; + } + + + inline sample_t calcSlope( sample_t _s, float _slope ) + { + if( _slope == 0.0f ) return _s; + const double exp = fastPow( 10.0, static_cast( _slope * -1.0 ) ); + return fastPow( _s, exp ); + } + + inline sample_t oscillate( int _wave, const float _ph ) + { + switch( _wave ) + { + case WAVE_SINE: + return Oscillator::sinSample( _ph ); + break; + case WAVE_TRI: + return Oscillator::triangleSample( _ph ); + break; + case WAVE_SAW: + return Oscillator::sawSample( _ph ); + break; + case WAVE_RAMP: + return Oscillator::sawSample( _ph ) * -1.0; + break; + case WAVE_SQR: + return Oscillator::squareSample( _ph ); + break; + case WAVE_MOOG: + return Oscillator::moogSawSample( _ph ); + break; + case WAVE_EXP: + return Oscillator::expSample( _ph ); + break; + case WAVE_NOISE: + default: + return Oscillator::noiseSample( _ph ); + break; + } + return 0.0; + } + + + float m_osc1l_phase; + float m_osc1r_phase; + float m_osc2l_phase; + float m_osc2r_phase; + float m_osc3l_phase; + float m_osc3r_phase; + + sample_t m_env1_phase; + sample_t m_env2_phase; + + sample_t m_lfo1_last; + sample_t m_lfo2_last; + +}; + +class MonstroInstrument : public Instrument +{ + Q_OBJECT +public: + MonstroInstrument( InstrumentTrack * _instrument_track ); + virtual ~MonstroInstrument(); + + virtual void playNote( NotePlayHandle * _n, + sampleFrame * _working_buffer ); + virtual void deleteNotePluginData( NotePlayHandle * _n ); + + virtual void saveSettings( QDomDocument & _doc, + QDomElement & _this ); + virtual void loadSettings( const QDomElement & _this ); + + virtual QString nodeName() const; + + virtual f_cnt_t desiredReleaseFrames() const; + + virtual PluginView * instantiateView( QWidget * _parent ); + +public slots: + void updateVolumes(); + void updateFreq(); + void updatePO(); + void updateEnvelope1(); + void updateEnvelope2(); + void updateLFOAtts(); + void updateSamplerate(); + +protected: + float m_osc1l_vol; + float m_osc1r_vol; + float m_osc2l_vol; + float m_osc2r_vol; + float m_osc3l_vol; + float m_osc3r_vol; + + float m_osc1l_freq; + float m_osc1r_freq; + float m_osc2l_freq; + float m_osc2r_freq; + float m_osc3_freq; + + float m_osc1l_po; + float m_osc1r_po; + float m_osc2l_po; + float m_osc2r_po; + float m_osc3l_po; + float m_osc3r_po; + + float m_env1_pre; + float m_env1_att; + float m_env1_hold; + float m_env1_dec; + float m_env1_rel; + + float m_env2_pre; + float m_env2_att; + float m_env2_hold; + float m_env2_dec; + float m_env2_rel; + + f_cnt_t m_env1_len; + f_cnt_t m_env2_len; + + f_cnt_t m_env1_relF; + f_cnt_t m_env2_relF; + + f_cnt_t m_lfo1_att; + f_cnt_t m_lfo2_att; + + sample_rate_t m_samplerate; + fpp_t m_fpp; + +private: + inline float leftCh( float _vol, float _pan ) + { + return ( _pan <= 0 ? 1.0 : 1.0 - ( _pan / 100.0 ) ) * _vol / 100.0; + } + + inline float rightCh( float _vol, float _pan ) + { + return ( _pan >= 0 ? 1.0 : 1.0 + ( _pan / 100.0 ) ) * _vol / 100.0; + } + +////////////////////////////////////// +// models of // +// operator view knobs // +// // +////////////////////////////////////// + + FloatModel m_osc1Vol; + FloatModel m_osc1Pan; + FloatModel m_osc1Crs; + FloatModel m_osc1Ftl; + FloatModel m_osc1Ftr; + FloatModel m_osc1Spo; + FloatModel m_osc1Pw; + + FloatModel m_osc2Vol; + FloatModel m_osc2Pan; + FloatModel m_osc2Crs; + FloatModel m_osc2Ftl; + FloatModel m_osc2Ftr; + FloatModel m_osc2Spo; + ComboBoxModel m_osc2Wave; + + FloatModel m_osc3Vol; + FloatModel m_osc3Pan; + FloatModel m_osc3Crs; + FloatModel m_osc3Spo; + FloatModel m_osc3Sub; + ComboBoxModel m_osc3Wave1; + ComboBoxModel m_osc3Wave2; + + ComboBoxModel m_lfo1Wave; + TempoSyncKnobModel m_lfo1Att; + TempoSyncKnobModel m_lfo1Rate; + FloatModel m_lfo1Phs; + + ComboBoxModel m_lfo2Wave; + TempoSyncKnobModel m_lfo2Att; + TempoSyncKnobModel m_lfo2Rate; + FloatModel m_lfo2Phs; + + TempoSyncKnobModel m_env1Pre; + TempoSyncKnobModel m_env1Att; + TempoSyncKnobModel m_env1Hold; + TempoSyncKnobModel m_env1Dec; + FloatModel m_env1Sus; + TempoSyncKnobModel m_env1Rel; + FloatModel m_env1Slope; + + TempoSyncKnobModel m_env2Pre; + TempoSyncKnobModel m_env2Att; + TempoSyncKnobModel m_env2Hold; + TempoSyncKnobModel m_env2Dec; + FloatModel m_env2Sus; + TempoSyncKnobModel m_env2Rel; + FloatModel m_env2Slope; + + IntModel m_o23Mod; + + IntModel m_selectedView; + +////////////////////////////////////// +// models of // +// modulation matrix view knobs // +// // +////////////////////////////////////// + + FloatModel m_vol1env1; + FloatModel m_vol1env2; + FloatModel m_vol1lfo1; + FloatModel m_vol1lfo2; + + FloatModel m_vol2env1; + FloatModel m_vol2env2; + FloatModel m_vol2lfo1; + FloatModel m_vol2lfo2; + + FloatModel m_vol3env1; + FloatModel m_vol3env2; + FloatModel m_vol3lfo1; + FloatModel m_vol3lfo2; + + FloatModel m_phs1env1; + FloatModel m_phs1env2; + FloatModel m_phs1lfo1; + FloatModel m_phs1lfo2; + + FloatModel m_phs2env1; + FloatModel m_phs2env2; + FloatModel m_phs2lfo1; + FloatModel m_phs2lfo2; + + FloatModel m_phs3env1; + FloatModel m_phs3env2; + FloatModel m_phs3lfo1; + FloatModel m_phs3lfo2; + + FloatModel m_pit1env1; + FloatModel m_pit1env2; + FloatModel m_pit1lfo1; + FloatModel m_pit1lfo2; + + FloatModel m_pit2env1; + FloatModel m_pit2env2; + FloatModel m_pit2lfo1; + FloatModel m_pit2lfo2; + + FloatModel m_pit3env1; + FloatModel m_pit3env2; + FloatModel m_pit3lfo1; + FloatModel m_pit3lfo2; + + FloatModel m_pw1env1; + FloatModel m_pw1env2; + FloatModel m_pw1lfo1; + FloatModel m_pw1lfo2; + + FloatModel m_sub3env1; + FloatModel m_sub3env2; + FloatModel m_sub3lfo1; + FloatModel m_sub3lfo2; + + friend class MonstroSynth; + friend class MonstroView; + +}; + +class MonstroView : public InstrumentView +{ + Q_OBJECT +public: + MonstroView( Instrument * _instrument, + QWidget * _parent ); + virtual ~MonstroView(); + +protected slots: + void updateLayout(); + +private: + virtual void modelChanged(); + + void setWidgetBackground( QWidget * _widget, const QString & _pic ); + QWidget * setupOperatorsView( QWidget * _parent ); + QWidget * setupMatrixView( QWidget * _parent ); + +////////////////////////////////////// +// // +// operator view knobs // +// // +////////////////////////////////////// + + knob * m_osc1VolKnob; + knob * m_osc1PanKnob; + knob * m_osc1CrsKnob; + knob * m_osc1FtlKnob; + knob * m_osc1FtrKnob; + knob * m_osc1SpoKnob; + knob * m_osc1PwKnob; + + knob * m_osc2VolKnob; + knob * m_osc2PanKnob; + knob * m_osc2CrsKnob; + knob * m_osc2FtlKnob; + knob * m_osc2FtrKnob; + knob * m_osc2SpoKnob; + comboBox * m_osc2WaveBox; + + knob * m_osc3VolKnob; + knob * m_osc3PanKnob; + knob * m_osc3CrsKnob; + knob * m_osc3SpoKnob; + knob * m_osc3SubKnob; + comboBox * m_osc3Wave1Box; + comboBox * m_osc3Wave2Box; + + comboBox * m_lfo1WaveBox; + TempoSyncKnob * m_lfo1AttKnob; + TempoSyncKnob * m_lfo1RateKnob; + knob * m_lfo1PhsKnob; + + comboBox * m_lfo2WaveBox; + TempoSyncKnob * m_lfo2AttKnob; + TempoSyncKnob * m_lfo2RateKnob; + knob * m_lfo2PhsKnob; + + TempoSyncKnob * m_env1PreKnob; + TempoSyncKnob * m_env1AttKnob; + TempoSyncKnob * m_env1HoldKnob; + TempoSyncKnob * m_env1DecKnob; + knob * m_env1SusKnob; + TempoSyncKnob * m_env1RelKnob; + knob * m_env1SlopeKnob; + + TempoSyncKnob * m_env2PreKnob; + TempoSyncKnob * m_env2AttKnob; + TempoSyncKnob * m_env2HoldKnob; + TempoSyncKnob * m_env2DecKnob; + knob * m_env2SusKnob; + TempoSyncKnob * m_env2RelKnob; + knob * m_env2SlopeKnob; + + automatableButtonGroup * m_o23ModGroup; + + automatableButtonGroup * m_selectedViewGroup; + + QWidget * m_operatorsView; + QWidget * m_matrixView; + +///////////////////////////////// +// // +// matrix view knobs // +// // +///////////////////////////////// + + knob * m_vol1env1Knob; + knob * m_vol1env2Knob; + knob * m_vol1lfo1Knob; + knob * m_vol1lfo2Knob; + + knob * m_vol2env1Knob; + knob * m_vol2env2Knob; + knob * m_vol2lfo1Knob; + knob * m_vol2lfo2Knob; + + knob * m_vol3env1Knob; + knob * m_vol3env2Knob; + knob * m_vol3lfo1Knob; + knob * m_vol3lfo2Knob; + + knob * m_phs1env1Knob; + knob * m_phs1env2Knob; + knob * m_phs1lfo1Knob; + knob * m_phs1lfo2Knob; + + knob * m_phs2env1Knob; + knob * m_phs2env2Knob; + knob * m_phs2lfo1Knob; + knob * m_phs2lfo2Knob; + + knob * m_phs3env1Knob; + knob * m_phs3env2Knob; + knob * m_phs3lfo1Knob; + knob * m_phs3lfo2Knob; + + knob * m_pit1env1Knob; + knob * m_pit1env2Knob; + knob * m_pit1lfo1Knob; + knob * m_pit1lfo2Knob; + + knob * m_pit2env1Knob; + knob * m_pit2env2Knob; + knob * m_pit2lfo1Knob; + knob * m_pit2lfo2Knob; + + knob * m_pit3env1Knob; + knob * m_pit3env2Knob; + knob * m_pit3lfo1Knob; + knob * m_pit3lfo2Knob; + + knob * m_pw1env1Knob; + knob * m_pw1env2Knob; + knob * m_pw1lfo1Knob; + knob * m_pw1lfo2Knob; + + knob * m_sub3env1Knob; + knob * m_sub3env2Knob; + knob * m_sub3lfo1Knob; + knob * m_sub3lfo2Knob; + +}; + + +#endif diff --git a/plugins/monstro/am_active.png b/plugins/monstro/am_active.png new file mode 100644 index 0000000000000000000000000000000000000000..785ac4faeacfee72670864a07d7a1f7c735a3801 GIT binary patch literal 730 zcmV<00ww*4P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00KfuL_t(I%Z-#fYZXxxg}=4W z6hgH1i=RwiwFt|Lc|~%LlE&r z9ygDh*S#~_;+&aW3&nxMz?r?*UhAxNMzvba0VGw+-I2uqK4rbTlK~tY8An+s>c~)* zAq!YAkdO>YY>&+p1@1XTE5}*_n z+`P)B0=E@mnE}w?f2Vm}wLJ1a72rP}=p|!fq{NvH;+uHOb`RX!rw{IXB zzTTkm4Vsu{m#It3$&K&h-eUq&Vk)D7iN*f!i$IW>^nf&k6AmzJ`~oUga8 z5xRS@u5EExQuimr1iUbIm)g)UdoNw5d(VEB-j3sV#d2V1n0%#9@1Y}6suKq$it6w0 z_rV8K$<2@gonoLU2d|oMS|wI48z~@#I+?IFHmyp!klLn5 zcyc-0GDTIRYikRs0;(W99e}0cQiwb1>+5rO$I5%$cAo$GyZmkcH;A+BM6GX2-v9sr M07*qoM6N<$f)*e?a{vGU literal 0 HcmV?d00001 diff --git a/plugins/monstro/am_inactive.png b/plugins/monstro/am_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..4b177193048bd1b8a4f45b5d16926fd75fb3fdd5 GIT binary patch literal 525 zcmV+o0`mQdP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00DJLL_t(I%bk?H&gw7>Ku=mg z9gu(yh`s>>BQL|m3&I<~))g@$#E*(ZhYlT}Eow@Ar{>ZR`0fQuRwUa=j_o*VFc=7c zQp%`^pp@c&rHU638UT~Y1k18eN}2VYlx0a-mfY`milQLTbF|hJMZt2p#1at`{0UV> z^hgO{y$bwRMCAEE5kYIsd_L!VJ{$XLwPH4#al74&&G&tL-$z9L5ZJYgmU-NsO$9lb{)oNi`R;?i~36IAkqtS@*cucq3B@DxwzbZw)-+#&sK)J3f z)9Li%Nzq!HDXDa^SkzPg_EA6Xd--g>nGo|y^m;uJ5tC|l+i$e*AVh>eP7LxB%$8ki P00000NkvXXu0mjfT+P~| literal 0 HcmV?d00001 diff --git a/plugins/monstro/artwork_mat.png b/plugins/monstro/artwork_mat.png new file mode 100644 index 0000000000000000000000000000000000000000..1a4240b5102b959a79c8c0512a5a0778eaaf5b1d GIT binary patch literal 61598 zcmYhC1yCH%6Ynp$yBzNN!y!m;5AFoF!wK&0en61mPC|g-8r+ZI8YDO*xV!T<|5vZ- zRo(4Y?ator?acIafBVz1>Z$`(M==lG>Z$R0(VBjFKhk}YM@)|q^E+S3=yp!$7h?TMK zv+VQ7PLm`YDI))_$3~>jw>me{xMXBhM_3P4)Loer( zPaC=6b{Na&f*=VU0<@OV$Xs#(0$Ic&gvZLR;3KM6XcjrhhCDkR1hO@NV`U)FE>b5T ztf)Bpe){in_u^)FkPcp9gcRZ%6dLNZkeR?=fv=0=L6lgEEGSlC1*nAwrg}^M1xvR{ z&)WsJ4)g$!Z4IhWZN=||8OWow&zisf-f{^xv zP-Ve0WH)^A_14|P<+&U9sY~W}XN`&|p|duxcf_oHC^yE1!6tIEeWQ;RkN>VxQeSUhyLDWKAJ?8n-n(?2dvqn%< z&ep5iC_Phv`AVA80L~(jb=}G- zpR&j}C;!uz(~r-`Q(oUr!4Mci?#fWEI~SwH#P+%1*14cXUFN+vZK#Y0*4ySLL>&zY zme7haxsdogmed6&66@cM7@uA!rI-bOxUPNVbKNuB_58B*=Ek2#{J;Baul^2U5u1$P zA;Y$F8XR5JwD_gM2o7w4l$Wuhd{sB*;DX^KG1WE^O4H*-RxoV6r^kD*r|mtW zFhZbAZtZg!z(|<$rC>TXNMJcq(w0eDBkGhFwIDAY(bD_qb*nFY^HBUQzezp6mwd9S z`8qbg7+fvR*1W$U%Nm7aUHY&U4gU#<4)p#w25;k_Ydjt5t$lgQ1>Z8#3Gpw zt1Qg8R8oK6iPA}bf>!+KeX;!Jo)sZu&8S?nmP)}mM3L#gz}ucmK3YwxI>R$}DL(8g z;BpIRRu~NGHNy#&0972+ucj#z4@-sW!3IY@?cm_$Abkojtw;N~y2jTS_2qmQ6f<%4 z(3HN5b7l!a7i=k5C{Vm2i@ir0$UGPqDiAJvw_^W9{g74T-C9~R&GHo{--Pup`BX&{ z916cOvhpDDj@zz{BzJkS_bJ}SGPN;`e!PtZzdac$aFp2U-5%YQT186+eI>VMfbi2O zRHmtd=+!1x)$+lCd$*6cC?QQ$27byrLwuBX@ZMs_h1@Yi zpNtj0^CijSQ88V9b+l$uu$Xxe+~SJIM;;FkSmhVvSccq}%{(x`&y8cN>5j)XRGhqL zN^GbIWMmMo_KhW%$@h}m86L}#lVzHykWt*d#DEJsifUExYgTqBt4E`$_wVw2cf9yv z-l-u$sdOn9G>|#jBQ!LaVG5g>!PC{%MfY4IX;^`el1C4$($Bsf_G$=1a=9y=DU`o&A?9(%8$ zwJ?r#c*@4*%V@1CHq^^4G8G?Nr@_WPL5GJG?w)8=LoCbiwd}jI%xGvh^%NojqUV@r z#+nQ44aW7gMSur59{n;VLVzI(d+_U5TicIPhrQC&)Eg0`V@}75mcM50J|R8$af$Ij z2k(U<7@`(-rCk+BNVBu2yv}L~8a-^H8B!GKbKNnnZp_#yfGyH_G{q z0}T8Y6_u3|R#u3h4gYn2stit3ScA*_S~oB0j#pG9hoyZ% zanf@6!h=SG0OiKOzJXW-5GbLe$H>vkRTKAa;myqp6qa9yBurNY_8zm!qcz~Wa7}Q( z;|nRD5=_q^!by)Tg94fmg2_d3iQ@KM%+OkB zP|y*FnsHayJ4{c_W%DIwQLO&#el7`~d^X_}X>E0Bo%?d!bfw(o57B?P96lWs;u2Ym zM)r25A&u=x%|TaF#WJcuCnq;FG>nleiIFKjyAKcyI^YBTe^fDZ)SEE9##E1S%A>=< z)nx&kga}^9U7(=v1Nm<(;Ji9>oJDUT$=5S8Q|yzKj>MlFT&j6ON$}CXWk(#zkQBt@ z-4jFCzDTdKDPxnv>0CWU zP8e3}hV}^!ok>tpu5>2Y^6>)QHCTtAXX_*kk|La<-^`eJKO{J`w*jIQ{SmImmrc@t zIG7A!nqHhii_{F!RL|Q~@RKf@*ifTflV?jOp<4h>CvMx?5`iN$dt0J<{>Cuj#mJVR z$kVEG7`Hy;FXzGk`iqAlJ*Ll-XHejm2sd}1`)qLeZn-Hf4E{&pGb!a-J0`Fs7MtN9 zA|e8B=;!#jtg0%O2qiY~adUISiI?RT5e%{AiyJwxr+HVFx9NELU#iL4-G%!~x4ZiS zSQ`F0W{|e5q8eWg%$g;F8vb6I5oGkbW%I-T5Xq>00DN>R%|*DbX1k_(Z78g8#q`kEz5|J_<^7wzQ^|u z{yr|CX+46^IuDs>a@^^Z3fZv=0^S>5r_egWcneEgoH|kYnH zY4@Zs#y;&m{$HcPy`MPE78+@~x^Xrdt&UY{cmp#wGoNlZPE zT+<~HtR{elhNiBqjZiR&oUx3UQSrMfng_dc^e-GpSw)o^538iUO}FwtcA3(eWRG9x zu%^kW<<;vIa4J5H46V8LuQ^ga6;wj|Qksnjg6D%vwdu=0=kewd0vg6zHegcEDw?I? ztc~H?U7)605GI4-8zdeV7sn8uwmz4^C>3> z9h8}q)4y`WCRK!kgp54B7PMHuvH@O%1goj3_7v>ObAbsA5{4I^6xM zFARJG+pcAWQ8#A0mXAabga6uQE1&PC=@8)F5D*d3ii?|83VYt-OkfNb=FkF00JUZz z{^=>;hY^RmR1q^moW;qDT{dH7E>RLkBAzHG7{j|QfQ&3i<*NP0V zZh&SbGS#wNU}BF z|Jm#mg?Nb1bIaT^KltFe|22D&)!aGwDY)I^ezuPl7$DA0Aow>!;Rpa>&4x zCIQ^}(tHn~?47ojiHC-LaCC^RTS;5HE#%h}?iB?>h56r8&3Mh>PR zm+|4vMTBwzE1H$50!H>qbk+MePr)4*rX+;_fcDk=%gKPQJ8u05ei z37h97Lo5fccY9ob{aq1ay)stFi$&RuLSuo$xeDFbFoSt=WS~$WmoKrwHpl_gW zW>T`)p;L=xdOF-#)e7WTPz+3KY>0;p6bAw#rh+pA0=W2N9Iz2YPI!!4&7|$k^m_!R z!~z^w+>6`_=FEbe{w4=guo5rOQqccdR7i|bn*`0`qwoZlQo9YKAK)xV5}om}U_e zNb&u?EF;ZLkfhYDlgTN5K{1L z4R! zxR_QX;0}kF!|2mVb@A$`k`n*zhfg)%yUj0U*H^|kkXmH(Tydmu*H*?@9Z9>&S3HKG z5dxc+))_A<4}7hfZ$G-E-#KpWK|lY&g_*C1HB1f9<~sqythlfiBy>V9LyN1d993J( zm9$W86gs(^$_?9r7BO{Ak$iSVjNs}wPIV0#mg9kan&Q*v)~x<4)Sw?5SyPi2(-2GZ zpj162B#gXBb^})%W1mhgU#u61|@j(tK80igy{LoR_vG>3V)%VU#8dgE)n?q!mncO;)MFN z;esLEkh%A*wAAHhMSpJO*#IZ3sp;)Xr#rH-TARzulkYZv%|bNL0}$stMQo~(%<*oc zIsf^HkufkII}Iiu?Ou?-Kbc7Z=di2v%IUQgcK_~Wf6PnW9o$`g?B;FGv&xtwXMuP- zcwp!JJ-fDr>uXx{=rOGIa@Y0rL=*!HgLM7jImm-tm=P+cjHAc@Xb3H*bhK*gwI=L8 zglF!tqQW7OE;zil#su6k!cq7otks+2;c@<`iJ}1v8Q#Fvs`K4}UhkZDk>-LzZSV+- zYro}ueIo}`unCBefah1byP8#VoMdMCZ|LZXe&vLm3#RO?o25f1bd|V&5ML?@d3Y!L z1Ni`pXt;>?>tDjmtlXbyQ7+lZ6J&)^=M|O3a9a39m1f!t^I587=>=AQKWAoxC$XZg zKFzjF50q&wXX1_`+|Cxf5d3pZM}mvsE-&3<k8tPXdke9&1qB6DN(l0m#xD9Ovg0Kv(KRme zLr9S`8C#+v70zxRP)OtzY%ciI_ogc90R;VSiF}SUm z<-8V34rEA={tdse`g@0qo0qo++0gQw>}o11!`$s{r%A^3k51d79k$PnC@&$F=+4RmdGw4KfmPy1Euw#fN=fSd+1{E1yzkj;ttiDW4(4Bj;!#1Kio$i1Pyn z=fW>vw4qr8>YfGmQjW3mS9Qn7$C7;Hy%#fhrQg1B^N2u0UxLQQ$IY#LNpwDcZq{>e zaX5VrJpcTkn=&eaVo@2IHpwazY%Vgit8;o>iP%)Owruh2+Xn)~xQfL+YuiF+HSn%U z8~sW{tV@Fqfvlf48nH{pa>8bBsHl0aXfSTCS#n+47fmzX1W6_OLL=Yps#_zc-aYN2 z^u4#U4D&l|vZyg7CAq`*Q~_siE-o%zcE(83(mxkBRuYVlj|={uev`BS>86sZvL}5FNP-axbaY^khqs7X=LF1d0*@*gKFr;^h1wH2zyl!wQ6#H(mZ&KwFw^HzA z=x_l$-h~6J!~f=TFs2_%6Qio3bFPIem%Ek1BhzmVO-Ss(ft_pR?TL8nDq7N_EPs{K z7+eei=JeN?BgAb>rgxLMsk~?iQ6G_;CU$C*{MDQ}gZ>(JhgDQ4B80v1=`_KSs(txL zG5X)AV8C6it0=O(s{$%*@)`Q=?esR2%hsG-zjscBW-V*Ql`nGGpnpluO(I0l>*5QB za+sytCPbBhMh{+g5Qx4rQ4+dwV4HLlf^JVgjH)%6SqX!VI0jKD(GkM`oz6w+#DVqR z(Ak~}a@>7FV+6XPPl2~GG;V_3Nr`h4V0h8gbPnJv^#=a^RnHn-2I%5&@W{H3S3CAr!-j><5GYUGcU`b|(vW=(x z2*MYzMO7I(15wv8KzAlIy%} zijkuO-j_JB9AF#-FJ};yf|U{^>nu>($}6k+GoO9AuqcG$W_LL%_r#t3vj z=q3cr1J0y2ZYV+WdxXh+QE8`YV$SXdQdN)qx?|zPv7$0R|FSH_IQO~vUv!+^AYLsk zJ!Ac0=;rm-g~JC|VALt`<4JmO{6f^RmyFQt@8}bfHXRQ7XCTb;3_h=AOCg-<$p4KdejaX1SL>wrOic?rf*{J}YFibxLUO zpaFy6guI0vQCC$p@sghUak(HPX=#5yZ(S>K|6J?aIQLgtji`w~4>zg5x+SJm#H?*f zy}yvDIdO1wxRC%oUT>9&s|26H9vk~sUPniT{mJ(}GbgL}-~bDpZc#ow z`u@}5IrwngM+B=yc!>La8xRf^72~{r5lgxMcX!@JA4cwr3w0BXSYVMP7o2m#^^&6fuFVDbEMdi&B)-rC za6JV79Dz?odVQ7&OhVarbcDg5Uj+}kxVX?T(T^?N(ItPk;-o^(WJ462Jcs3gnCKHg z7VAT9ASFFH>jcHXw(x?zDJe%p#%@`@$lOOLs;CGx_smylDs}I8?YvEJcWNQ)H3NnA zfzaUJ0D&zKEa#M<&JOWW%8PVis?1KUFNfDnn~zOSSoFUuB_yQ%tFvql30@=D8YFn{ zXBzUekRjD+YZ;X*y+vsSv!Gyb2ZjXd*}W~Ptc3H#Ot7^RHj4-0|4y|)aXwW3 zE?mr|!iz>@tK5GkAuhFDqL*7Rv{O28cCVqS8}+*liLa@-cgIOenel^h9F$-VzMURv z7Lf5H?5pj-B&0om1_X(ScK|P$K#WO@N>OoCUCS^Dwln{wH9d@V4u?Jhr57jOkp?d| z+s*!>^;kIqB5C~=Y)BfVEXZs#wz>q9N;f!@0V_#2CBYjS*~ zvTQ`s%zUBcG^B98GmB+4*hiiQ515K(XAu+0L$K7S?@ z@xM_}q*O)!GL?VeNj7uXd!x(_q?U6z$dX^vruU4GoRN(9kzyV=`Q#qE=H7r|N~P zg>leRFY;@|@o^RXy0OCv=SilhPBI|`g=PvR6vl_!M2|dXP$}JFMyhG5Q^bl!@Hv~r z@8d8$LzJRq8Co&!6ax3Wc&=gRs+rOcc?S0%9*2#^;PzPE=_)1=LHK@{9133Adug-` zEQWcJU*w>-Y)21l4mb#3S)6JkKxPOWkzshm1X4H|aFN{OW?mL5r7G9zvJEu^Iw$q& z7L#ZW=V^6`+8P=-y%L~=-0;2gz5hm$E)CtLOK$`;2Hj{RF-q`gaLm6Adq||fv_JDw z^FYh5e&JMzC07^gGBPRL2VHX$3S(*OjISbD9HTn*7E<%r)tC0-RF84Xg@8|s)e*II z3e|rtlC?lkwaW_kzc3@4E^rhg@_ZkEYQ_==-d$r$ewI$Y#Udtmm3>Czkfxh=6$QH<%$kn zGwHa28NwvoIGPc@*_58|%ZtBVJ05T84t-A#bubM`6zD!jr;gaz$uQkGSat^7e3VP{ zOF{1!IKge7nQI&-)x6#T8I+cqU>06~yvAnAp2!SN1r-S&(nKswb9*;9PSY;h8A^?? z@+H)OoBbg<|C+9Qe(-|JaYF%3R~`suYGx*CqQRz)OCY+di?ZYXMnG2A(AdSr%*O{s z3!lcw@A_@5JWe*ae^Tt_C-@$C94tHoxPrik*cdQ9f(kpkpzi^ORFUgSm#^`=NF2VF z=FPA18Ep3>W4SM-;EV=J;wDSL1iKvGIMO$7GuKqg*w`>B#wlrNYQtHNlBoehHC8S7 zL5r?K^Xi_l>uC$!DDaRBgyOV%hxTFJ2cNE=7X38Koio%uktvC4Gr~%_#wc+1Y<^bf zq&3Sf;Ne^zmeci8s>)lieUP&bqUjkYGu{04-Pt0*5{!O%DHwP|4&L6|Kj{N}DQ;1c zzSZTHKW<32_V$BW?z`qJLs3(EVCzyQ*OR`{s2xFGf#^fiAoGvdrUBPzV91Za?f>Yv zTtjf?1o*c0&QtXa^m=|yfjEr1ERrsF$&1dp$0n4wk6O{KyH!-SU>OS-Z~XUv{Wryj z33N!L3@uhjVRP3TdErEJKR>)A$`xJ_#6vPt*NZFtoT?c8JA+@oiTZzxxxg|ij_gJp z#EOcF>h}6t-LKEL6z;`_ufyBfJ^zmdc-ax?ZavKYNH&>ILlnPx`?7(Z;6N$fk@V6< zsl70_A@PU{$Z~zh=RG+Y(a7TWIDm^0ci*aSp5@hwgC)-;CT2}9+}IWG6GYJc8vU9o z*_A}KChx2!P~l+jdiPTU3dN#f8iF@95u*&ad&6NGgxPR$f09ey*w|cDbqqpb$jr;? zT@SeBblLo?WStC$Q(0X}%_nBv5G1y|C_!5k+dORBA}rt>qDlCAa2rIdm703Dx!#?G zUegiwo-eL$T7%bOIK?5r(~4w!8}h?)|8(4j%#5_(`(>PJ1RRiPC{W%1mH95=^hu17 zNeZ|$kc!i|Bcd4|dD`m?2jz`*Y3X@q_luIz4-X-RLH-#+0npix@93aUrs^R}StK5w zo<$7}vnFXY<&&>XNA4h>s}0Hrzx?91QY2(-s=>vdTq~5=0WTs?S3^`ATYvw{EXaGK zkvlZ^VDQf)`}kkf`r~sjB=^wo3g@{~6iBr6_VyoxsVHzE2bbH^;Z&P_Uq=BA53z{g zgj|3$+hB@$mS=K&V(WDMl`L1xdu{%vsYwTr*cb6^ot&H`X7TQ>*B>b8jP9p9+Y7aO zYo30$XXfR@hJc>=HjyjP{1>A?M>gi4m9cljd&-S%X>CP?y$yI=c>O#@AlToJd@DhS z*nKs+{y*dLyf*|S%`gtg3@t}&0I80W>ZyNyb8hJ}{pVYJrKlS>`e0q%bSuFx)~|^! zbMx~(`;>;hC`UK_DeogBIY&Mien?vTrY2)R1*)hhENvz_ba04~;Rn=xDP!qQ?e)6; z_MUnXTzTU__O;DuXf7Mk=gg(87Vq!y+$M?Jc@^*Qq|`r{Cgq_Fbrc z9P+NLs*yjPb=o%3DJrX|8hm&lEl%btWnxk{{NSw6Y+FRZL`u6-N8v}K$vX5|&o+&f zM^KhVih)TNx_TB-_$JZ-FDVS2RD)S?S5xJib)s+>#gO*ru>KS;q#y3P9C7hVE)|z) zMJaaKQSSxACMIUReu;kdlT9(UAr88{Y-qUq-hJm@wAOWv>4F8gVFSfzKyaS$UFTQi z!2zi`n7aQC{#<+a4+g5-hqhIFyu?PKqO%!lU~S%{vA2@fAt#(|Wl z4kqJ}G~g)??O$?|C=nUXl|^O>BJWtU@m=mLNBtF6ECJeb8*FGA19Jo>^FBhsJ71I& z=3#{>{`iNGgugs;TRY`ab&d1K zzPrV;_kn40#q^Mj587KTLASy%r~t1hA_$O_$<-*CM7zsTA#^2Enbvspk4r%+y_39VaHJXbQ{+J6nI9Km9@! z;gV95UQ%2^y8e=|&fi5vM&fl;vnzDv&&pbHR%QCAQsNDhlcOjQ62gU>~0yV&j0nR@}|2>QeP;8*bbp`*HsQjKDWZ}u{G z*>%rF_~Fs-<7jVo+q)|KZ)&onJn}Z}u&IqUYDyyq4JUt0VM@O5x7BZC9pD)GXkw zQ&ZA5|0U}w3q{{0?$Sc8kn)=9 zP5+~=X zL#YKbtdintpKL^f-K2um8GQAN2F}<@ANKpI6m8Q(s@dcefxolw1wV-oat> za->lbvdzr?-(X~h$%vVXn(5-y@I}6n)_;Fb`R)(B-1DlaEiQHr6Hk*#1D)9`-jj=% zl2e#_`A*!w` z&9=;}Jw^dub6t)XK2I;1rhOiBd<{SCDI)=STkFYxjz0}Zpu-nVlitCq+7*GP_qH5s z+|54}W3ub$Z^+HRmqLG;V=-1~=_{+O=o1(n%W*&r_-tkUkpQ)=Yd z{Oxvu_ZOlsdB?jpmqL?|FYTL=f3Q9Mj+z`6&Ng}jnd8DnMijMmb!jP+wzDvv7Bxn` z`D=6umrr_6e@#ToFFCk*8cR8+UuU>?N0wRE#ccU*!@@6tY>yFB*{1 z*+?d*A`sP1wy>)F5HMs;o5eV~io)?CV$ruR_OfO4@Rqy+e`I6?O*I#X#_RC#@b0Oh zAXZ&K%B7+K9}^SP&RVJtzO}iT6;oi|SV8cxB=-x|=eZ*HTCo#8$fYrRKx>^J|1aC( zB%?SvwWEio^Zy#YpYi|7C;jRrLu!AHkv|tautAw}b&{pWJ&e87EX%;InF}6``XlBs zU)GAappf7lR5DlBZ15!|a4!Wm=Y?5!z;DOjHDd=+ICb(T&W}pxnI=|qPtfxBLHfOI zXG^;OIPi|ja0vg?Zr0y#*R9Gye7$?wP5G&V`cjq+G21uChKq?zQ}e&0Tm+$O`6hD< zZ@*Miv8O#xtBJ$fPrJ}nQA!z^)U~uAM&P8Ogp`_{_*CejmFPyqk<_Ycd#SgX)llMm zUIAvahrxoo&2i51!eK4@X4WyL=Wd#14co47)M*E!QdY@~-ZVwGl8wwZ2|>#kFW;`J zo=B%FJHrgr5Mjb;es}n8MY8ZbZ=H8g-3AxN!VhxVxJdhotF~mKn0J&F&iLuY=%AOp zdpEr;e5*u=DS(}YrFV!b7>X@+2Xb(5u(h?7ke5eREf7n1Pk&*=+FxbZ@-g`JjOvx! z|M0??EhV=jMR4*wbahc{M-J#n}yWokWbU#=quiqS!lQP zknqyNU823n(ln@rm?HDkPk3ACYPUvV{KZe(JA5Q_G3HB8T_V;;XGe2DQq>{+Ea=q; zzd`=r=%`D(QSm3knGU-ame_22#K=g6oFb5tZIq{Y>PX(SLEhTK-%4CTlBwCnRi5QZ z6$^#>mak(R5rR$Bb_^1lzvR1!!`7zNM|sa!ysfeG?Ohv`thnt^t9b~V58P#DxElHNdF9LA<15Ekgevti?~&HG zGzyo$4Six_ah;@oOb^4MJ?BWPDI+hPGvdgpOtJx3f9B+;5y1B?LWx&$S~4ZpyBzi;gIef-&FL}B6B*? zE-q?xuaJE8LVR(GCJ>4jUH3@RWk(;fuKEb5=v{-3e0tYiJmj2j=H!1hKF zopo`b1=iZ1SOO z?GJ>eYfM{vQ8N~S_aA)`Q^)MNq_4&a#kR@mq~SBs5+J^I{|FM`&$xA>5D^x&HB(-X zSMfO1WW@}gg!DS{QiPXa z!CrWm{7>++_zT7DeZbitzm0T`TB?^l`Mte8i98c}+@9aR-<_OKNx#&>(^p1A%yhk=X!dBDMPn81`eW9%@>RQM|nQg zSPaYB1m4n@j|dG(oNBGKo)gjvTim%mtoV`(u5ip?>8D6qr_2Lh^sUI?F_|eX-Wo~C z<(N<-g&6I2CIy#IcIRayM|pd@3Cf(wN_Sx30_69M*A#fxm?{O6(ZC`PwC>qH2R{F3ojN^&{&098j|cbyJS~G)#i0W%#tbgozioV6 zc6X||qmUkO6J*pijOo5`HlbiysL__&VEscJU2o?-ODt5Zp(scX4>*|e>iWhGJMg?u z>#^a81=|4Z*t?q3KJE9fjg$zD!iK3_xlCV9Sw;EVUzX_8 zuIQ=%2-`j1i#x>Sy4Z>X(k!PK!3VA{mV$_9OEv{G3#tEMR$xI3qJ|&++e|+y_nW7E z&FANaEZ`@^XyFsqdcS5iN+g6I~*zLC56a!dwroPkczETE=>&OA+5yYGFa4I#bJ zHqAjBg7uKUBtGky)-@l`8 zZ*MPRIBzXIytB5khqi~gEv)n1rW}`2zzqQ2(caD_K+p;lI|vC0$>I4amg#d%6eI3^b>LI!zxqSp5hM=C6+$`qymZLB z{aA)7@J-b?uL1jeaDo6p+GO769yi>HEju-aQ2&ge!p4J>9yE@H$+C z85uV&cWH3g_}7fpKFIK77E_A(gw*}hR44j?AmBIOuiT zOPF6UHuh11lXdC0jq7`$$l*7%I;v`-xVoDeb~MJ%L`4y*xWBc z21r%`-UOfq05S4SCW#$LWnLp`XuD9gd7-|ZCs)`T3u^c8eJrFh?VX-R7c&dGZrvpc z3l1exNCU}9;a9xCY%?Sm$Eu&08%>eKCp6RZead^ z$gimX=?Tt9gi@r-8#$X%n^5#??JxWLjfn(Nh{z9j!@1s>%Rb&!c!e<@Z)f94I2gMI zLSLMD*7WJxll>$Z`*Z~klFiIx{zpo!<(lE)Ea$W%yhJ|9!odN3p~iGbo+>b6cz8I? zW9Z>}Y45c9(RvF1u$-|Pe>p@v4rnEaF{Uupb-g49w5Jw>OQSjb%tU?MKFTy`3;#>F`CD zmhK0t^K!|t=jZ3SMR_3v${XZhvSE{8HPwg#!Glwlb#A_F(YCDY%ujz~7>?gVW2f}y zxvWbWi@58Yth0T(V1lKLQu+g#DaRW~&xerWQUj&bT>Y7cZ2eq=6mse9bA-NRE`9-i zoLHIKy1Ll$ag_)`ljs2t&Gf+mr3^i-Wq)%+kYo)owgJd2M0n)SpBV%*{yKR?;~!dgpUki-1wK7vzhEI~%jIU# zq)7#$8ic(A_id{9bTaHH8Ailwj7i{qfo0ac%x5Ac#PY}}Lx2YZ5QT&`Q&LD_t|X$Y zk30Ta3Y*2=>13uxrn$R2JcItgRMj1nyZ4CN6dnoLh7?><*p@-OAlp`URU`}n@-J~8 z>rpWYuL*&qRoL>e>iGM9lD-@={bT1&ev(viLa7E-0i)&*T*ZrW2>_KkiU*4u04;zx zB2eGR^5I3T?~aoqeQCh6T4|0i&Ng?{bi`p}O~6A?cH^zfZ}5xU=MQv3McE7)ttxJ+ zBDAvld$zN))sHPcuX(@OA_sNwY z8rricSKF!j#NMkQb%ad~xvq3Cobqd~2}z+zv8XFK%MCeHs=l|&CiPu5ft4lj$OeYf z>+4B?E?C^sLJUOsK)yuI#3cVLsDYHJ;VwUld>SnH7xrjP7=Ac6ihy5VQ$*pGK9{LJ zdhQ7=|A?O2PNSUIFyg%}RzMz+f|q8&BaGs5FvoIrbyc`)hpqcz!DVl%sL>oH--xrh zxfv=N(3yhzIr7e|is7rBR0XfKp1J3@kmF;=KYo#tG4zB=W7pQ${fE~}m7{Hgq6>$k z0L8bvSCglMv4mCE#=V@(Q9z0OY5Tlzdy%`5LNMgzB?zERENpGTKgSX|UJ}A2AP^63eXn34f$Ao*1be@GSgmkkqe;j>0L`SaW5G3xQs5td zmyZtwGliw4NbvCRU@*96?hk>4jCl;;_$@1&Xd8tM-s}HZ6*7Zn$!?{h@qtqkvtV?y zXe=x6qpYmso=m(Xb!A@&&>ML5d%4KjP+GYCUF}$QY)TuVXy%LOj55LszcdoK>kn=e zriHrOqgC-u+XAZPt7Tcb5yuCFBD>7&?D|_-1(uzLx%EC=8RbY_XmJW2+k{oLlj6w8 zcr!1SDv2Ny3ejgXJ9CczzyPFbtz%{lOGk){tF8a>i4bVb!)q+K8x{V!sO^+hZ0?0F zVS1v&L_>#MEC8I4kg&JE-@CXdDE2g+q;9Ac&TBIPj?mUx51Cp-0VLND7h7d`hB;<# zhX}$w2VIWJbhGSQ3q?Xv099>kp4fqveJ=qJCNLEV0LB79Y4Tie_C{HC5h?^Qg}r4} z4)0xy7P#daB7o9Avsu3@DYbd>tKn$F`F!tIBRO_Ios&ya`d%SG7UfR=`ocdnxApgD zNcL~P2)PDn0RRAV!(-xKzp42BP8phHjR?r;FdAY!c`Hx$QmJkIUfY@qFO2vo%2NBu zl;RmJo7zy zrR9J1RDqM=pjh*HA%TYTCQ8AWcKtqEdpmBF7{e7G7KTIxnl<0uyfGzVB|Uw2!{&!& z;0M#c#2~sWQ?0dkdSi4`d18)R(^F2D?4kgP%JaLIRZ)n~v)J66Kqd=v%;s&(1I*e( zyba)ge?Q3aUYL-cd(=q%eH#3*Hp|dpg39w%u;e-k ztATOg-ns&iLW}sYr3@1}^TPK|fO{2^&ng$>_v^UtY=e@U!$^u+&+>;-95csY%(yqu zobqVhUpP!Q>ZYWn-{5{WTYjoS>|oiDKNxLv@6gbkBg0|xIq(6vjiNjePHT`3^A*qJ zQejT2%|uBpmsts!B4K~g=wC1MkCr}a;32g^(kE-Le?5p3V~*Wf|{>dq8dfb!MauCBz^ zdtYc$62#sfEgGAmp23_M1EH2M!NT6H?`$(+Xj@YUR}Ll6kS6(k3_FpmHt4J)#& zYcBnNEC8K65T?48urlc|Ys-cfAJD{*1C<~a{=K%q#gL%{eOYY7U(3m=js-b+0Jrf> z(pKOF0n!J5|5|B&ddH**Jm$^ZIx<$v_E|Dk_*xmcmIjtVhmHB>+Ft4PhB>)Nz+9%a zZ0tv!n@9-`HVkT_cymAdi%72QWvt?3^>*&jgFwfd7UuRw!gzCQKYMI&G$tdH43yTw$D z9LmYevB+P-&qxj8*m9$x(g3X6SU30U(J-lLfk_*wu(AWs&`@JcSw&PpZfIDQ_dK>b z`Tx*#*70<||Nl2V-90lkOgp-}n_;HAd%C;dm~JL!n(2*O9*hU(v7c$EgR#5f|w91;#jHWNvQvmH61_3+Bs5W zEAHHB8DyuAlCTo96TEb&1>ok44qK2(h39-!GBwY3ll|+_Pof|>?;LL!X*RpDq~3d@V?$wUGvi9TKAxhi2ddG;ucQ^Pd13vg`bQzI?9TPlmtM7m$2 zUo?Ox7>nAPJl~urP5RwW7ON7?s{1w1y@#jN;uqoB-J|Zu3>cCORzki&XjABME$g^P zum$bYG^XLlOC5PVBtJYee+Lwd<{oQduO%LHj(V)@JyPlvo+^8 zlqJ@GyD%_FR0n4U<5~vEkdXOWLFa*2@-Nr=%qQTVr;CgkrA={yH1hMsX9d! zO+;7mEKPoPZ6CgT^BfrFefu3(p-^o8%F)(FQc@FLCK82%8@F$EJ0yDRq7Xa~_jeC# zYsWfbTUxDh&zMFlUDp+tSCZO2{IYJV;t-zZ=tfEW9n&*rl3%IXH~NQqA?}lx`o|9mqZPLE5Xg#P zxSHgDY878vNHryT2$9hE4#={=wi^|FjytZR3Yw22pm|o*(uhHr%3bO*B~Y6DYy6h3#aBd_}bg zI+~e0{0HhcuPFGAiY9QS*@w`Lt!JI6%!;fSFB#|rn`lyl`8S&5zK;Ep5Tcaz^%X=z zLkB+@wT71$DbWQhZTi3I?WU)u4@sJw+sU+j+-WAe%+^QOiis+vBb%>T-msIXPFPsE zwQ+Fasw+r|mdCLFr^nfgng~I6_`u<1`@yn|B9YdDRAw&W>j`S{h_hb1lcdjz5_CF0 zSB@6LEO)dr$r{6$AgzNY?Gdu7lxOk@r8jj^ifHNk5ADjzN@I8P`82}Ebx)Y`0WP)w zKH=|?ZxCzh^3YggbQ*Nj#oU;vaA!iv4L?P^-T0Db$|ARBzcgs3tauUFR zdP6DtYdWt506J91H018!@Jcn$og9{JW?N&!3SlHhWq`z^7JlK7of0kV)D25AcUD`5 z3GoY79+4OIG@|3NTYsY8A`+Opr_kU^ZbYEI?+fYmfZv0g;Xs9pC+QWtqm@psAN@e8 zR;DV!nfP^@M7tQXPdwU+MAKA7B8ITvzKOIGnrWYbEGEC};4A;)>(E=@;pOWEe%XS5 zyadu_2PGPzUF?q^+~Ty~-tj1W$jI-Huc;;+S9ba2Ug?JZm|#xt>A2DJ zPNzCV1GREY2lVIrXSb%Q zLYIHU;5h%>guA6J9&e2i*Q&=~G(4sLTIaw5ttU0^w6*ikEBO`O!z9d~5 zqqGn~Loijkl8oE0=)JYvdXey#zhR1h&+FIdVN@7Ri|;+MVb=p0>I=%X_So2TRx?gW zLP?13`o0i0k)*wofBhV~#$#zN9&l48rw#gpj;pHu`A=`M2hjAib zZ9U#^FLysUj4MxVrX&W0?BwQ_+gVHan{lDOAlltK-@*mVh!jpn%2DFgD z!GEKqk*M?qm;=84>gw%x*u$%xwWA|53~a1|j(W7JDu)b=_} zm{^JXw!qk0qBMB=578744^G1j#`NM`d{UwKXKk&b)?aY+5^p+O2ayt|B2T6QBQ&k1 zOk7NGsZ96P4Pa5=nBgo@%O{$cDDognA?Q6?8X&4~)PHn&`7FEcD=q7qYZC&Cj|v+J zyOHxMKw}8~Bj#PNo2FtO%PIZcr>)HQ!<_Kk-uPIazn*WEW2T-MvLWNxd($mv9 zxP&b-myOv`Q*FI21k>ZiN+uI(-pF$r`d=uIBU!pU9uPKC3Wa2~A{M^cTjaW6DhWKHl#4cs#p&KiaPNF@vl^;7<48~>Z5&hizZVj|x-cS#V; zD71IOP;xMZmXwe%pt6dYh5*9^tbR`wWTnvGPjq!yUrOwgs_xLss@nOND;58vx)7F9 z4t?`FJK%obm-)wvkI$hL&czisV#x#SE(>q*T6#m9c~IXS;U#Xz-sh$G1DCWe?&AGv?t`hm_yUnmOpv`S(|HmMc^RmIlwN4VDyfATX(u4ldB$T~LcD{B-%KagE+ zBqk(ALA10CdY%*O`<^SxvOPYdi(8bq=f3-vA8vE7Vb41lfej3p(ps3rQ472Xv~It# zbMr^+UA&-hv_sgkC~*4t2tV^1d4ZSbzx@0fl=juNn1y)-1xCxVvh#1A0myKCp8JF} z%sNuL++qj@4X8UYWerqm`!*dnld5{F#5=1C1_`m~=q*pb_M#j!9?P^8GuCUDE9l-A z3l91j6P*IdOJ5GxVRK{k6#rpy5d%ZbrJ1d3NR3T)$wIIul2*`%>+${cNrcaRhhtEm zFk>5=UIINr(qE|o;Jv&3w*d@N$FH|WXQ>@wEzkvb|5vSdSs&KI=0gO&HS-f^^va$- zC!a35`8*`()druwmDp@?Jh2;HecDX-`?$wkxV9ajXK2{Bp1p`0FH=|7mC*6vw}-Em zkJ1@ZPtU28!>Y1vSJm3KmhtRvV?#1RkA@m|O0-k}9r9T_iX&=QK+=BsE z;C(}RdF`&3(cD&=h9s*N?-~2yKnWM6<0!eF^P%@9(AbYhP!Juhz+%eq(%s{a0`Y~q6(04kd@01NI?w^MnVt0)|^0GKkV;aG! zFGn?+SnbN`IF62X0SBJbjz>up6Cv@f!JoCK37>q>Vl+hd1PU`V_0-fFk2XT{PFPX< za4YN%*!el2i=TU#e)D@)eyOBz3OIEr#t&X5Rf7}sJQX)mZMKNh{=uD*@zZY9^AZdY zO)FxY{P*q?NW4}2r}I-&bvE^#{HJci65^rSH6_(U4T4H-8`p=hr|NTiQ~UWs(Q%pL zii%$bZ&$LCJl;ha&(pVMZ-2MMpK{2=Au0@t_ThC}>v0l!K%kI~wK$Y(4n5lbNd< z3>XQgE*70E?MDelKx0pdg2a>ydfSWCbzi~>e)wco+dakHC&qpI?c2Y#X1ukKjPJ5P zgFN=YxU0czj}-&^T0f+Y>01TI^y=7697}{ztkG*ttumghg&P(>xB<7e3=&f#{FWoe zmJag8rpJ4TiUFRe=C=KLM~}gSvWi0wK7{f`n$a;a+sB^1qJ2Ys!ws>$xiYB7ebY(I z7D9G@et!+@9*J0Ik}P}aa7~D@&1mBaHtM{019c_=0YRzzwQ54*md+`s`tA0+8bN0suhpH~AMK)CE2UbJ zhK8(%&+VeBOV78f5i2}ZzQSt0y`%sBZ9U@pqrE#BzSY*)uz)$h=8aB!Oyhi$>fRp0 z?UnE8hZ_tAKM^*-zj?27U$28@98pI{O;6jR@pE>1Y|jxy#4rDQl8#ysmlfLp>6&*+$)wS686#NX&OCznY`0s?=IT_Muk844m!0F+S8046i!8hQD zjb&Em-e5#sRI--9L(FbLx*9Ajo)q)7|^}pz@28gnQY`%THMYM4KBj)V|_H z0^5M2^QmxXMe3P$NM(8MtfEWjDVkyU$NcnC5on|2?v$5?;ovBIyp5tAwt1uS8a-f% znt*_?F!sjiYo5|DHBD|2{VE6da#gOU z2sVKEe2??PX0);kDM`2&GdFGqpMoOV@o-{oJ{s#q)}0g`-`VU?OSFP@tZo4H-M{R) z4{eAuAI7hxx|B2T&f!0n;#<)O$@sU??UluCvCX^zba2YgQ`kbV>3mzh*5V#19|T;2>O1%h_@#UtJU<7-Vsm zLTU3ljM0;wKjtYte{}xOQtBv(Z-u&8^Id~r$WB`hJ6U|F38&7ONf*VQ+^v$T4jq3W#7obLW7&@@$9;kGwJ_y<%!xvFZmPrF5#o5F z4|9IaSBI210IQ#OvAf9Q*YcvHK1nN)-e%I%+@3tR7Fk-B-VS76(@?Zk`>1E)A1og- z))Spa=_*B$K%S-bH2vaf!h@>m6ca)0?^z9B?RTrv=jv8xmwD26Mx|lH9iar znzk3J^PwJz@YuTYl*&^<@{Gc%_6o#04$bXZMUel-KXmb{=hME==k@;oP&G(vRI1{;$oLmU!nVo~_IP8yf$#m{ z1uY51Neg*mZY`)^&BQw4=U((TRm(n@As^z!cMh3p$V4h(1L1Z&c*zTk@kJ6qEWOD8)@ zNfjFj^;}&RC#vdXzU6`aBX`bH#*xpZ(MSItP8lODQW~uZ9;7^=SBSz(x;hLcd*r ze)Li>f7K=77$vy3RwZsEzfL0hT$nm!o$ADRy4g8qJP)leZZ2TDSMSn@&QVbyde_GI zkJPw*po}=j(qjC1l8I0@HWdLzh(?Tk4KbLE0kP!3q(S=xM2%WJdAL+60L{3djJ&u% zG$S9Kis0i8#1DvPBqh!8vpi2t#w^QuYE6deh~^ke0Atwqdzxw&p#jyE%rGCDuH=`s zwXMY1Nhh*%0fQ}_5TQNMe%A?WT+0lQQeK>N(#JL5+S$wn-0O2ZK0GPhKBmG2d2V`M-u&sJ`zkrD-;so$-}7H#7J z1x}%fEEjo$N@T{@`A;J~6FVH7z&v@*Ar#1yD5qPN6yH~br}bl@sPOA@Qvz+_fZWqw z;B(+KMGdju^75G%LAGzaeV?Za&!Z5QUIu*Vqp+9PGge z;rjl`B*Nt?Q#khD6)^ymkKh`z5I0#>C%P1V?;6Bl!2w zovXaK3c)g~bty~V%Ti4$^{sJk^m8;WJv<#lpx~<=xt-VWUo)wM3ykM`!u(Nyi&Mp# zf}n2e&bR%1^Q3Bi(S4B;A8&aOpN5j*vj%`sHn$$zQ6ur^&h9$EY3>!Mg@T=Nq+M9o z;ylSpNKQ`siz9DvUjF+6pSsgcT*!%i1hf1&dnuQY3$Mfh#?#Nk8k}g_(xl@nQ&_O1 z^-`}jj$sZi{0CT6FlY3ol-#N*S~1rEOaDc` zsXx`U!SF4<7i3)l&cvjY*g(GrP8-+&6FfSyH@CE;e)kR?WGRM0_#0&Qj00cyZLvT6 zsN5w;s>E>GXY*8FYYQMWT5r$gj1TTIl%js4rM<|Jo;HxVCKI|fS|{K2_t)M()twOI z?C;ZKaasxqpptZ_5YmjVCs!biC)cU5PnKZ=-?X^*o%e6I?Z&Qc0el=G@7dst3IJ>U z!|{Ce^{Y_A=bqr4?^kwreQUe1x8z8knEaJVi-UT2VDx77{%+W$q$4(!vVA0Ezh%Lb zmvm?Kqbs=JC1x0_yZ~?%{wpI@e2QUh z*GO%Gf=x}Og*a1GVZrT=>G1nJ*Aw87(N{>t6y6th?O&{jb>jpB3e3e)8zog`Y6`5v zqWaM&zuIY>N;>S*^?!27G@H-pkV|>fxJh`cpCFR>$Oqb=N{M~%v{3KLO+w#7Uzl&} ze#qC)JMU&Wb(MX-@4h3vK3O&sqWNrE&`b{AA@Lz0@C1Z}Z@9STf~eE@;J?w88lvI= z2U`mM&hW^Hw7LsN@wfDnnIAX`GqAbn`(`J{T<9%{tD7qTvHD2Y8qt3v9pAO(Zv%az zeklisNJP#W1p#q-mYYl^#HT$EeEe{=I4LDIc^glbOsZuN=`}{hLjb_H$kf&w8XErP zjF*;3?(XkrR@!vbcp2`R_+gs=e)fbo*nm=8TauPg-4*(~GP81mruHOF-oSX1y_e*L z41CMGQ9#Igl`|fwB~^;2`8uwaQ*V(VoJ)}jk=RX2W)X7?3=EvCJbg3=^BFPL5HzIZ zH^RF7{F8WDcUAxNk>HmoDky*hG@8=sJdH13Occrf_1TjHko5fg^{cLeKq`b8AIpCX z!9nW>UQ_v^E(l}|-Q5XLZgj`KVqsC!4p5ZG6EiP%yE$E3;fb#~S?`@R@P*@s^5jYt z$klTM-Z;XRMB>|L4@EIDF*ct5Ls>G;-qh3< zv6l0ZA%;5Wv|%nmZXhbOnd(dVk+5`9Qg(JM$U*}XGKam7q3nmD+26+peJckCO*Vl4 zE9!2}Mqsp!K#zp~y?-=tpx|SDdF3uS$Doxep~=W#;r1i<6B$`eoib*QkA%IQvTihW zQvd?gP4B&$mTnlpR4E)pEnjdR9UlzXlI{9BI1q+D`cFg9lz-^H!KfhD@||sTT40}t zIeqcq45Q*n0IMD1Vv{Nj$;W<>+(&?E@uR-gL65k<$Nh+28Z3iDBN^&f&4-C_l2BV~ zj>6LvwUzvsIfqLXb(+pum5>1P)Bk4ygvPQ;-CzJ=K|8ag-&ndmQ(LiCicjQfe52gMg)lgf1$>aAf+>i+Or&{!du|qY;o2HgR8Ubtc8`4|>vo|s z)*Nd0?JO-VE0@SVsjZvX$AHODVu1mprq0JOt3q5|NcZDMf*{g~;c76H`&^n7LFz5- zZDRx?$#k6%d#XUhN)l-s8~HmMTE=?>HL!E+9M*J0_vgyITi%i1Tv$z2dd!aSa>E4r zcnE`BC!w%+NlP>jG0SIykhnxz~)3%u~gqfX%`7 zv&j^x{8fi#W5t1Web%4?M#Yf8oKqNbHd}QedU=seu{edq`#B-3IhgVrT&B3_C2F&m z*GC)i-*mcrhPoeFY!7X>CayU+&$*GVdD5g4zoNO((GS$b`4A z_`LsoIp+q(NYIt&Z)QD5eH~$B#Z#%%I3HG#l4VP6V{dQYb9k`~&%1Qf*>yQ{_Sf~+ zUPF;Nh%Fc5>N@_HzI1ggJ;ji00PmdP{bD1X72KJ*`R2e#ikI{Ai@W=~cvUx7SLe-5 zaZAYT60+i+Ujz3q(1vGUYMed0gL_%vhlQ#uB-6B*%|o_q$X2r@$I^6KdE`Dv1<)sM zOqLkZO*SdM!I9%+O|l5h0zt8$_$y2;EiJS(zk-4SoVTiZeW~wsm>oW+=@?tu!jqC_ zPD3UztbUb~nL3B*eRywSVUM{)K}1=OqN{s{T2NVpH;2DtQ`j3~>2-$8mMw`Y4*H<< zLqoF?#eikQSiyPHH{2Tfd28)seTK@v9uKvf`>+s)O1$kmesI z&vK4WsFa1v=!L`HFow)%tyP{xH+192UJpu3d(F-S)5s?1`u#>!dYFEjsumMb`U(_a zk}4{!Vhmc!;RAMN*>A~y$yo35%xR%nGkIciD4H`6NcccSa}5Io%yj`;i1>Mn85XMNqe!orsT83#|IsqaLekJ|829~LyT)eD&^ zZ#a_I{Y$0Z;j^7_)v{#$Wbb76PG$&twwfpkT?EF+<{E6(Jdwfl#p=SwN{r2`8gbN5 z$2Q??Z;9W%8-qh)M+PlNbX1K^+pgeSHtdP^YZAA@p*?*0 zzUt2V|58%0$Xb_XIuuDlF(j6{Y&JTHyK-_I=FWcY7P(l(lKN6#Fo?=S!9jBCsw7kf zi|i9b-%T*iJB2F0`|==>ONjK0{NL?O(mO|g6+r`^t0e?!$RK(1zuxl zYHE^@QAim%u~}MK)tx=?gVIm2+B?GP{^GGuaqn*y-f%LaUJ@ppW>YEU<(0h?EXQYy zA|^&L&dWzH?ajM-3m69Ya4a-h(@NKi$Hb(mp7|n5fe8L&WVpvT5Y}W(A^H~{n9MP? zH6oK{wJ>d&k^er7)jTbw^pY4P)4lPXz=-~is3?y(z@awz^8s7*0jJfwmG9FL$>`{q z+Iz!@SAw66pMw!VA5O0uyP%~JaZ3#q7#d_SoFHVsiqNuLfF3W}7*KU6 zSg)Xk*Jcm!+xYwEwMaWM3CXh>VUlm+5-^;ip}qYM)`FjM=8Usd-Vs_$DsM*P<&uoi?QG!{QDy$mQ0n%Ug>Z(x;T!Q=Gc z1nSv+W1yw|S6x>NwPq1r0yRx1?c8sR|N3Ozu0vH^UE@QH8biykzZ-$S*|C~maho>N zg}<(>?=#y7E=oQ=&R#%3aXA~t&C5WX{K*W>89p**VP+NQqk!Hn{Z6w!TK9yz$9lDW zPyt>6U5a*Dp5!64*chM{1yy_#9a+2n4M<+Tfkxt)x$338kT-?RxXbMEw$TmFv2aZ= z_K#fKgEUA=iY5v9D`|1@7YB!jpcWh(^eBVJA^7p#16uU8BF5f{$Bp+4Ur81|)q=F1 z_8*oALPkK*V`AYJZqF=zem3zf!;wirU4PNozH4Hd&;83Qt4X6x$T%}~VxOY~M`kft zM~nx+XVwA;tk^zss+y~W#!FlByufNx>&7Ij3?RWsGH^0VB1BJFeIW(T5p`Bml;*yj z3{1>YC9p)mAv88N7Bn?sW$NjrahI%SoFYUfZeC`(<#d@-RPJWsg+kxoOmu}tI{yjh zk_n{i>+@MIWI`7sBLL7aYNRB|Yw~r1_=QIlm!o+bldjeQs#wTU*SU@k`FIy8neX-S z&hadTF z8|{NKxPl;Zt-}x84q)nHGSky=?IrY|d72z9T6k@JeaMkLo1u{B3!v%Hdzch(8;%j7 z90^MB6iL|L}qzFD{bIU1L$6k%vnA^Ft@a5d@X1aQRBvu zDlbCWbbiDj4BrsR|GtHJY z!H*0qEZ=oMF_wVSEl5|^k;Go_|7*vc;lMZiBNDenRzH5$(JJbyizc;^iseY68p8t( z0s_?tButseb!}}zTS$yGGn%sI%-kSVhNV?mU0a{c&)uS;*+gjRE6{$@<~v%7u9S=8 z7b2w`u8$rzTWB}MCy#{!gRhT3zOl7495`kJ*(Wj_7}FK@oyyK7SRO5}GQkg>XNS+# z#`hN#Rz%70;>5}nLbcpILY&B*MnXemui#rRWUQKR;| zM<^~1K|UWHC$G``B>T4vMi!BzkrOXSN#ml9|FiPIZH|qIdwbIzkdf6jSfmqb=GTr3 zKb{deeGtZx*3_0Vny)? z3z8#SN9zZ!T(QlwY1zjr?$D7ct=M&rbZh+=Tg+WWb43MeBu(XY7NwVBn7||g!eeFQO>~@@|v;Jpda`MBbB?H|1Sb?H4&ZGzjpH!UktkL?k+YsCrSO3J3WnD#LNfyH~ z=G2$EJqY}m((p+HIH_VWxRTF>T5+F3k(^bx$G2vx=IZUe@CS?aQQ*vD_k$HsP4TuO z2u2YU2JS>EHzFNP7M=9WB;_JZT6^sI&*h&%rJYv2+%ITzf}{&Szsqi%lwVW725&Bd%cS{$Dz=(;`f zgu=0Q-jRVjQydNN@zM>w390Z-Hrj$?fxr*&Rlu&j^*cJHpy2n>@1CUVVnD=68+r1w zc05$n{r8zOeRKYjp!(qizu2j!<61zXkgD3>o3N(ii5~S0xOqtNqt7un1||j-J8@5R zN|`u!%-dH+JI<>dAh)n}GI2<;oKn#0O{~)Gh3sQNtq`;o{6a}3ZUG6d3b_0>b+HvhunwV{og=V%Hkx zfH-XbG%nB3Pa4Lh{}p_Z1>J8xgcM*QRx7L3ha?1rrMv*ie4E6+LKEMN{4ssB$J zY5H791{$TyZ8d8)a;G!(7U^?082-amr z`=2!O9-CqSJR_yBpRp9$0?)s$fmhLb1_7rtP&{`71;x)gOrW*&4Z@DDcM<2Grb6o2n_ zA3S()=7p)$AKC+^OyuNKpV~d|iD>0}yB{t@0pf!w;&p0}6R=Mg)@K6T$l0Wd@C&!w zeQqFYw;9I{vwQaqG^0fCnga*j&OoHR?PVhKPGZ0%aR$ljew6M9B$ZBQWR~_%#TGY| zIPglUDqFevk2EUz{NyNg$669n&lfJTC~#D4qOZB;=Kh&4e0_Z>R@(UXp0lR-;e>o{ z;e-ux%d5Zko^;-WVOCUJCG)MT>-mV2=m5Ia6b(BUCbeMA*QF|u`IB0pxxMJVZH6`^ z$Ql(lx1$3jXsNTAu()5+UfG}D>++13&wrO0zJZG>IV^4*0|GggqKUM~1AT4Z(FijPzXodL31ho zkp4RqZryiFt)8by>}JWwmR)Ns1twBDL>3LJ{UCvh86U^!IP0@vu3_%o_a9>`9D#8J zaIX^0w6sV8w_@VS<>E zfzRstI+1`n2ICQ>xcEX)H0?X%acH3d1gNP?vv3xL8!FBRNgBtbYx}X(|9IN={GM70 z4ynYsN=m%ajhVC}T+du$u~WRK6NfX>+wydIP~e`;#j6R_zOlq?+p}Zo&Ojvt%=GnF zt{+dmW|DA1+U|VZh5g~>jWqSdl?_l?=*#v9J(wW_f@48%53Wm9WP)f#XJ(1>ribk?y4FqWl|2 z5q7T7{HJ~x*ZK92MRCT>i@!K8$Go17TF;w`ywnT~LeFP7#*yIp0{%3dWbVSRuDpc5}sfDSP(tmrL@`IRmAZ&JSZ#cMPBakX6m&)FM(`D6h?AK(Z_g z7rq#^1HMS+@bibiAsq0D+dwVC4IR?Wa=$-Mu~#N0I{Rz&`hwd))}5-@6)p;ERlbM1G7YAQKdW>RW4+jy`SgJrlw?tElP6J-ZMZ1H6B+ z+ECox41xR*_vghE{=2wfaeWts_pO1?B0#4*v#>!QG-m@2D+AQ#c zw<81pSVd&|`q-kuP5W%Z<$V&W?=XTbg@Fbvvj0!lq9q$0t-JG~z-yWvXm(x}BHWRv zGpZ`(>WY(X-|#fMmNK_SDP1XM4b)Wb&aO-DoJ?+xPb5R^vR$q?> zyYKC0x3n_1UaFe_vrX%YnA6A2#N?CLhTD3v?YokNR9LSBhNYQpb(5{Eto~JrO``z}L95z(WCBZx0j&=bH~3Uu&Ft<`QIw6YWH` zuR;Zw`IXr}&EREOQ_$bZAGjqbUk^RrY!9OIx&CA)BR>R+9&yy^<>lyXUZ?HiL=hzs zo~KF=Siq&b=ZD>Y!pPhNyR35IJr{69irL6xjTO+<)QLP%iFnMr^P|gp_hmXEjrz4U ztAib@T_nqSeo=b`w@JRY5Gkm7)r2UwprycSHjq-L>hQfrZd8_t?%b5SoVD$ln6<6j z((hz!M7pFKt@k^3sHKBH0x-P(v&(LwqwU>o5h%GokH8L1e`Z5{`T1MRD=VNY2Nma) z)rGj=wkQC9u;=|ECNKfh-REDYPegEPAid4o{rF117v9*~8Yl3%IS>J7a~0NZAD5`1 zY01RE4E;S!_^{Xg*A6h|;516+ri$cFgo`Y7y={csPc^6@Y95G#mEh*wOu}2xaijQ(XKFDBNE_>UCde4{mQ$6A=@Ge>=Ca zwZns1)u*RZu@@Z=2jntF%USQu;%gX7#2ox-K*A%Q`+K4F^4%cEU6`=jd8&>c*;^-= zk=`JN{zsIrRSrFW{%}^sL93H>V7>%Mq?KdaeRZf9|!Q8^)>nOhfJZKw|uo(8P$@fKS)CdW+0(G%p&TT?+raFq~)rOCF z-H*R{%d5VHPmP`T%E+j{Hze}(aBMp140lUzlx8tTjgF!}K_cYn&B@3W(8ZNcP9i;r zn`ci>GG8ZeiHiK5$S z;B*%8m|xq>gBe40%TZeKPPlB2PhMZe!BKuIv3r*AZFE<83kW*r^!y{>R~N00nsahK zg4K(P@tB3{i6OU?M#~ib4L&JZ7?cc3@fiqkB`s@>5wK`nAzu)p7-sC==6$m@#XR9A6v&Q9h^Z zh`l#o-DrgUchao?;Gr!3iZgFJkFJZ@z{#R)Oi=vvKaDbnkB66R1M3U$4G1!mO>c$; z!%aim*qV0e#564*ek#v8a8xwh9zQVC?aE7Q7o2Nm+=5FA7A@&v=f3WTAMY?9JjjXG z+{Szfu(00G%_>O06ZmmYrB-N3eiWEBjSy>rHMzie?)yPVSdrmd28nq1%uBPPb2sI$ z6Yxq77vw|Zkl^o2BgF-Sfr~+&O;(c52~v~~qr z1^$}fy0Bu=YV>@{QOcHz>#ZdcKf&ixpCq`}6$u9HT1pkaoWB_0g_Ni?mbbgGu+Aw7 zIcv;J9bfKbj{A7EUUE&USqTOmb7Ft*-l6JNTV2u6&G=k;%lstk_K<_-fwEk4fN@)~ zC-SW##`op~i02DIpiNs_8<-uIKMy4dE14z8y<}iv>@DlQe?=hO3$AA(BhPj=ehvT*TEDYil*<3Ik2e|*kKKad z&;<$?Qq*F<0wZLSZBEhq6Z==qiij%6mtnST`iVF-NrL6O%os~HhHt-@PlSktC>$lZ1!O9;FUVZ#j9ZB!O?{4!4A!OD(1{fhl2*>V9^VQQ6_pd!3 zrQUn0yYV}pQGuifupuA@Y7=5n2n|c!g(G=!a*nq+ny%Mqm3s$Vfin7j{&cC3k) zq)i^1Ox2!@$@8lPvtW+)zeOVt=htrUaFFV}XDWAjmsa9M4K~Nm`b3#KX|ub1ZiJe@_lzuXaryr& zfV!Pd4$;Qp#n#bsL&0Z&-Qg*^W@93%!KODigy;$oTfEMxiHL~ehQHR;ajY`hbt&TM z!UieKc`e_D@df@otHy88$Fx(?fa5L zABBLlSzoB`ByXkabhw2PY1KY?gi%B2AbD-x-40z$v$m(~)ACy#=O*Sh&3H0CqtCWf zQW6j{$)TMg5^}TPi~6F1HZYdIIhAeVUDcvzL=dmF_g09LLZQ(x{88I7&`(E9w9S(_ zd~_Fsb$MlMZ%#6`i-3w03JAp2LunTq(gX6W=?=T*qzOq6xwq&`v@oeA1Sz(5MaEw( z?id+>w?rr*Fs#9*vj8lmy#zWNYH!e^RF9bMX2XD4$eHVR0ZLs@&$lwjD4?|7D(tA_ z0q7hO*{7qP6XAQMg8wNXUuuzkLys;h1HlRd>v`T|@Tn?z%nUD!s3Aiaym)!|bRrMu zL0rT7mEXnHUh3o&B~1$uqBI?}USX9NL^B~;II&)2WZ0n+sT6A`Bu>d{UD7Qk={s6=09 zW>%6NtbD)$zb0ScmXNDEl~^u89rd7LdjMuDKR+m+P~oU35{w-Ku)uf$pt=M#J1t8$ zg-?|K5}jax1zPXJqvK(+=RqMq($OOOQN#Zatqi~b6H2k|@+<)^ybw?2JV&7x zU-T_Cc8++8*We%-Y~cGr@2Q5_cqZDvIr{kXKag^Jqlz4rt|Te6_^pcR;>LSqLE0d3 zJPEvwjZTAHa3i&VMDI_?N@A|q*oMDQ;&L#u$9Zmh#Fx^iE*eSAEUNMZdViT$89zpb z5A2gvw{j69wD(Yjve(26PRtJ~EvNaeY!91TxesF8=--!i#9m&fpGG0zCU{(|aG+7_S22?3cDf-6PQY_OrR4sfP5-IW%ZR>-gCSZ-ZbaS?@M<6 z*}k7&p*{9lgBpZ?Q#`09-urcKf+0qDpPwTJmHN)Y8K{*0)Vm@;DB-{_?y^1L^0D<# z>kI9a;ixKb6;K@sxa&6-Tp_-@3($9QcTdmat}YQrlhgIKgsu}6kgzW8lnt66^QtUeRp)Rt@mQMtA}p^XQ= zJn$K)^TA-lwANq`M>Fgw`nq_hj1?yT%TmSByG;JduPi`4OH8uN(TB@pzGfW@KkKZW zk+xQCZ`H4Tr4^UBIP+OMhaec-(CY3k1WlrGsPqati>au9`d$a&J)Q#I#P4putRrC_ z><{EFn>}EEUy#F^G-G%p;IOFps--6+{ML5OZMCQ=+@?;E`N1LHymbrg_ zj_p~Eqm^}AzI^F%4+Tb_cER(@^F{sAna9hQF^Z$p^}aQAnIuc1+?UtKu#wb7`>)AYXM9lnrc*}Sj+ ze`K9?RFqNM?kVYJfFY#2k?v0E?rsnS6cD7OOOP%}NkK}ayQI6jk?sc1_Wj=Pth3f( z@fVAMd1mIh_ult?UB8P41on{wlD5|)NRjsV2@{?cr&vuS_k6li{$>(SbbZ1b}C;i8Ve7KfVONCh2-81F$)mNzdmtSmpx6`NHwsn#O2;Jr z4&6HnEi54wTKYD=_ylqM{(Z5qs<9Egt86o^rG#i8h%0jC2fdy$QcSJ(S%vJUU39F1SqO@D?Jx*Zhl2kKgRzAz|oyk?qlPxtOk_xYBYJhzv^G8RfVHeGjT z={-|?=0dw-;DA{3yE-~D5_L{#@JxbrW()@mHxQ&G%F2IGK~O=oG6s0{kwZTLN5JjM zO)FA>_#{Kt@G#H|<0V!bi~zmhdrPu{IIll?ii{SVCiLmEVKa_$K`@}M0xv{mjlOoS z!YeL1MF?>I|H;Qe=3t;z4*F)V#)FDNyaNxei7@p=F`}~NG&fJFL|*%&lVBg`p!hQn zhSqeBBKl`Ns*>K!Nt%s|>$IhLXc)p8q~CJNsK+_o;V^v>Rzh>^u#PabM&zY&`{XnO z#l@wZB#m88oR>9<;)ezjku~Xe*9Vm4!c-eArcbyCxTE}BuNy$47o1gT!nKG$b?|t# z6zs@CY`Pe1+WEc>y#7rbvd)tfHBJoa`8PMtKTavNk1Ixef&0nP@iZBT1Xuirl~#>F zRE|Bdy&7shYpMO1cq=S1L`yT*9+$=#e-rJsxH-RZcUPw1?i|i$Cw4TC@O@AN!iV0h z+!Q>#^wgA6i??P|(rZP;$kyfzTH%M3i1-(#V_rg)ojiDUHZ(M~(lAxF-O0()<&+c6 zi?T$tr8qS|lR5Z=do-ed<1pd=A%g7iV=#u`()s=|dmXHI{^}5RcFJIJ4p|!RrXJg; zOjztzADM-nrZ3MO+0rVeAl4x>BjQ#m8a02XQ^UMNga|d=Fdamn!Mb?xir(*0H(xI} z9zMXqW%-R2mpYU{OVx>j?QEv7U(80$)5V^p+n1ISsrweD%B4ORsTZqFsz^=lO4#(A z(ZqbD-lQvQGEgkH5aX#n{&_2o z%lbUS?S9J>#qSiGod8e@r-h4Hr&%Yc4Dg56|AgffUHCq@$;Ug#*q)D_dJb=ktwt z4WM_8`|<@vd2)#A>=ztH?@>Y2w^E11=FQHZUxaez=T$(*;Gn}J3Fz92rxT1cNxZ^H_=4nCkUG)XY5cwCv3 z>WBIF&&RCkjjdnD#z0C;!L{#w3`axHCROBdf2;^DIgRD0cufmCGb)f3MFF`C$ksBq zvVxF5?STG9Nk^4sUv$Hd5|?)1E&{wySjk)mCK@UtS{n>y=~?{}MCF2jLdogWJtZC> zMhf0v5bSa(i*h1>%^=^LCDoT?MZR)pZO)$HzH?h+rdoUk;z%e*|cJM24K+)B=9u z7z^rwjd%HvZDnf07YTCO_?$e5FnY#@A?$oe7|O#o*Kuk9(f5I{xiu5W17$WxY|L|& zLg(hI(ONT)CV#JU4+-wdRvB}jEPUl9Ru=M17j;Nw;6IDt?i`K_?=bFE8{Wkf*Tv*e zQJ6-Mvt#@Qc{m=}n%bUu?`xCb?L=-67#uIX^YmPHoNhK{PV#!fb*b!wZ|Lu1kD7xD zk5k;HU~C|G$*HVF1{%(}+V3x7VlWV2F2mISeM{nO+Jp+03b1JfD%wiLcwQF%QuQuq zZ?_6?l178?N!yVsZbR%SXzAoX{}kU3lX-#|!V!~zLUrs2$xs$2H;;vv4q~AP+5W#+ ziP^K7erv<$+A!SEsG*WNi+y&?_HPs+zUL3;!CG-BetrC18QR%^GA>dQHAwpgk2`I3 z*+XBQ=A9?)09Mh|Hm`>^{t|73OM3rTY0tZ@C|m!`FYD$CkjALq_!t|v%I&m0h05o^ zjXWxloduNUfb7G<&Th$z-M+WSKu1qsaJdION(u}8Ns7BWxcVA}&;}e{DOd#X}%&_0sS64r^ zeMyfkeB1)L?sisbf|`i-aOW{dS*^M4!!#|=yJdxdFKif!Jb6oPQ_)Y)pI@Uyhk~ux zmj2^4ZV}f)8cC=r9`LBheE1-+zke{kJRJfkY_E1k`vc|FhYoq*^+WTPOk=K)Ej_fg zzZ?zQH1hH>{7HLP%_5a-^^c1TMYr%g5C!wTerD7f!-XntT7<5gU`sW)(d~ zflY?w)Ww2o( zg{_>_ji1c?tg2XkVU0!g9u7uf+FYD;;T4?I2Si58%Sra9xrB9aS*hwsHkdy(dsQ+E z@%c0yIwTK3{rv~mLPG;tq=Ai%_qXZVMowkLWs(5Y3m2%*!pcT$?JPouMWYYmuaQF} z!R;tvV?(f@n%SG>i-gV-h|RH?$UFK$lC` z%O6OC$MEWP7%eYxqQ>oe;+m3ie!qPg5IH~t?SR!!cT~7NA>pqERIz3Ta1PxpD!G|TSa2=|61fsGZ zp1{Wg#>CyHW@11ye(K~m@(r-$0FLJ$OKz@e(xCW@e4KSJX*`QQ$5FA0)E5cHp3lk4 zc1z=*{^_Sa|I<&I<*Kh&NCHl(+0tZ$JOvyE)kF?@n@T+G@APJC;$ZU7=>7sPpr~vd ziVyan!yh$v-VgTkPC;(bdRWuZ{Oqh#=6OX**Ty|`8voLT)ahf(NpXP-6l~5M;it`Ld$K{>9lhOVpuQaL! z;p0q9{o=m_SKfPB#=1{TZ_)Ndqp;CVpeSq>WQJgVw#`{w1;sL`(j|5M268ce8|LJm z*9QiRk3Nni(8RwZ%@}9@!wVHAN)X!LV+)~4*!kk3n7u-rFzHXHXA z+?<0l@Z9|na`PxdUYB!(Iw9l{Q(%?)hw{_YYd;;UlqstJc;}W`*kSR{8Ukay%FFk)N)g32a|0eLycKn}pmB7$YsNSB)dx5fV!Q9;Gip4sS zl>_}Ao)hv-(&(w_B&>HaUmwNilqi%sTmP;Qi9G9ax_{D!d9~q&%d!!^XW;HyrydC~ ziV(HK7O|!gIe75UB?Jg*tfMWx-Qen6Ot|{qUkh8LM>g@fq`#TvGg}RW2Lzw)f4DJi z5Jc3yp5KRUYRejN7B*4dCbcXjha1t}Z~Q)^xks~pIl)g%o9^#lWusW#B@81^k#dty z_#<<070d_?hBe7$L!v@LU6mUaoVQPYKkMr9>%T#JXnWS~q+J=^7~jdn|}TTNPm={But1M`wL8F5H`<^nB3V2XCUo4bQMEtl-?DkIK4Ub7%;#i6Zs$D!v zrwJcajkthIP5WTe)25|n{B?vPoq}NHh=AU(c}eprYk8mTS~1VtT1FZD*=)3UM+-07 z0G4|w924GZ=l=&;k-ca6+|RNINKe2HD2}y~KueV5CkE)b*am3kHg34n)3xYl+MbE0 zqD}f#F{7|r+SC6+2pJ4nUgJI{`IWJ;16Gu!g9WO#b}fZ8TsthCl0VKU#+d)QUe2U+ zeiFZY$Pm0YjDm)EI7_167W8gvg%@9od6A1v9Y-D}Y3Nr392IAN4olT7vI0^i_67NS zGm4nna+D)O*ADZcubg4Tra+Aj&3G~QoTienAPVn~nR{w0eEVA1nDyA*0oIGNk0z0} zGNuDnMQSt9j@vOH5nn0PAZnK`Ghz5?g0+?Y{D;M#sz-4D=kxC9j_av>)6u(Hx%X9vOLq-0D}Q@NVPV*_L`Km_y>I}3zgrtc5~e3Vr_(f~ zq@Pnb8*A;YAqg@=ax#JI<~|`%3|F>R1p=4LR8$MHlJ&+PwcC4Aj9Enm8gvT*01b znu;Ae6&42AT!X;$elT5ocB(puIF!k3i^lOSQ@fK*^3(qZfpXi@y53F)kZzS|sr>Zu z(SBEg?u(giF~}#rp)M8nl?|F#+P6<$2X8KX-lY<+L5bUvcqo%I1)cPye&Z6)GPpdr zo&Tbz>&-1CZoRn1TDRF>h!j<@-$><2r^&No9?Bk~i#r{YANsD4CdTvqQH-5;HUv!u z(jom0=R3J^v@gAEKPA7xP8zcN1tOOu&=UL)mT5^|7p7u%kWS%dH8PK&UJuF4)*a2+ z=!sN7;6o_-Mn!3FlB#HLV3*vGOwP`65pN>a7cPeI5Z81=kM(;(T|HiC(Fvft*=BzX z4hmZo=gHSSleV`F3KcdU3~jc@4&#?Mr) zp4{JO5!hH&O(~n zcAp>bd{*=Omy4@(@MChRC7jlR=YK|*&nw3>IXHzZ+`>y@RB@V42_G01isF%=7yRNh zIb*I@h8;pkqAH2#XE+wDJ*6th3fO=M@67ePeeG`M3iKT^JQVTpKiTE#zKqq!v>Qt9 z&n$GHBIEe|afn$UhB7OMv(F*a_BrNYwyM>fwBpU1qjee6Y_Hgp{XWN!?YcV2XEpwh zoG@z>j=DVo4NGK+iDVKS*x3Jgx&Zep`9Y?jLR;oUUPLMc@xgo&NiSFl8HTW`pEhP5>~XG*<=O`sXX)$tlwvxoHi)bY<<|> z*|j`=M)x~^#=^l2Q&(G4woC65eV{+7VQnXI@x?e(%3d4I>Q!C&D|F_h$OAS+)i?fs z!xUD<{H$|0|eb14a>j#M?$;SE2r3~QG#rc&B(hfNbK@UN{h=H!Hw;{JJRDHhMfUJ zy2%wkH5-lqD_jEi@!Cf<{p4ZvbeCc)q(u0lTzOv@BJ5)w>7A5)q<;3usqBon$&CQ`!>K{Vg+uhtHk4Wd4 zH?);C!>Qu=IF>SX(`5+EWR$!EUlfUO85tG6W!p16i|XoI2>BKi1lTk4QI?Qr=>{hKUoFpTu`C%}D=}8O^qt0+#iV`76f&ncG?QPQ%z!8Mz z(P&)K>3#aIQu1~y)oRHi@Y{HD z15e)R%qLn!pdIFKZO@ zjDiZy4hiqBClw$`^6|9UbCLn#*cYPG{Oj^cwsYmTuGM!nb=(5XIh@$`(ix!;xq~bLDJm_ z5tyBJiVs26Qk){4v2pdgI3zMfD8X^5trZ#3u1M0}-Px|lHdKWiNrtaj5ebB240=t4 zQ__oUy0TSyhCMjxIH9FE-0(EG?jHH-%$y;jDpTRh6ez#osHing94CcoQ0CVZ9VP;$ zBUO~m$M2ug6;imBgYp>4B4bOb_Rm1jz@cp3+~T4P10)m|9Wew>2qL1at@!8d>#x=6 zAE#BVvdDiQs9ZblCu}X+e)9dXzr$iYGg&rGSSW_h!db;Uv}gg5G+IzF z2_@_2<5_EQ_R-Cw2j`h74-XBnGQ=YwQL0TdgiGgyb1P{!eiKmU!qGMI_PGk$u1WA^ zw82F(jzszNZ9>6K&HAr{$3d`_K}Uj%z>t`fl+@{6GsCI(x*91;8;y=Zb;Yd0ZGkko zeje}UaqR;)tWzF+;q9y11Y?pHyaTdCb)?)4)_>0}_I|?2^Q!R1KRaX%`S|I*ptt(_ zxt3-?A-?+cp*sfsgULn0rhf=q-EGg9N=JgNiHQHR(a#PL4R>$_^7e9b+R?H{nH{>b z#Yp~F3s8?YnUkt(bm1}3+<0&zA>pL!VR0`;ETw5PC1UwkE(gieRe?97jpkU)tU)@$ ze5G&M#Yx~@-0j20)PhM>#M#i_WHHn);cwd`l8mX&zI))#%w7)dJpGsv4$YkSRw!8I zy&{fluwg}BQ?opj8akRyGfzZM70gi=^sS%{g?;fFf2f~}CL%)F0up7AnO)I(&jk2) zAfOn4iD?fH56x_BWQC9F{0{1HFT*gDlLS6Q_TFp18^uuGpp00wCgQu zG75;!6p$Ge&O07icCx>+RCBugHQ@zwNZ)DGvZ{+VQ02SPza`Y{wJB!GFQn}dshwL5 zkov@YvT*W(`Nuyu)|ceKhADsuuo0q0y;jpSj4hnWmnCNSLZM(~N+Q&q4HfyQ2*ii^?VnNRWM+}SlrY`%G}73T7|s&l(fN=eCWZbpYW%_nb( z{jOWFu|1fwF+22&g#LcXQ25mx*557ulaqkGlgeFvD=&n`N(EJyfoJzs@BZf~4{8&8!C?#rQqaFX5p>KpF`TDYJp1 z!60`Wd2DW_)!2zHI8RY;i$+Mz9KlW1xclC3+ z8L^Qb2uC!^hDvyKD5uVSq6QqpTx_@wiY?|@=jPpaHWIG0vH9{uXw`RrbU zKjCL?PT5dI9LyK$>e}#Mkw)iadju7UdXLye7wLPkft{#}f;8wRV)-_`FD+p0?!rVG z2$sU&sj2hrPWCEQARgziYb(P~S2uINIV9Jy2beE8ts~(+r9SgQ68eYX`M;KMdVnVw z`t#C`Lm%pO{J=|2)ajrFHime-1xBgJkhH zy=)`5J`x4``xs-*e0B9}-FI{ad#z8jq4y5}brsv$DOtbloO-u&Wh$e-_D*p9Ek6uQ z4c8<0ZJrHz{W@ZcAQore=RcGjaK**EwbUL|3YFIN?+*xU3T-)Fy+VfpTLHk8 z1G$@V)@eQ)<;?fX8QGR=GAA9q+|Vte;LMN|c~>0@k>DlZh5|^qoM=@B@#dwyWU0}X zMJUnXDqrv85)1HUeNNOCuRt;D;P~*GOsqbtYP|#AGBKUwQpF;21dZRQ#bXmFIRjb3 zI+b89{IqV@B2oj;SJV#P5ArqpT-N$@yX4W}`8-R7Xx`(1rd+8lw zP~^EAz#&OYw}7TpPsj_%-3wf#uv{y|Bux4(F$9YT$G>V-%HbX8rg4nVjRIPo?zLv=lgit4n-r)&uOP8 z;O&IBpJHI{ED^_@3DQp36wduqu`rq?8ZvwE&tDFt4|A=W(vtQTHe<#(u|CHg+isNX z?6KO!l(<%D;>j`ZK4@#Rnn!uZ)B=z7;qmc?t12I{p+QdR$E0|gfZrS2-p8vV+`aio zH{(+ah^G_?R5%RrEcYiJEsJ4&d#z!~`ES&C#3%H$p$dID?Lj_uuf{(6fC`8B57MM& z)92k9-v71SfeAGVRbAHEGZ z*)sLPrb6`Bpg)Jg&gGwtQ(_#ucSKupfj26*XqQs-Zj0-2tB8DUQdP94D=d~nP|&6! zR$~XcIKLwCgPt%lkE2su#4At(J0iSN@pXuN(sB{QE07pnRZ|l)o@?H#Jn9&9U_>nS z^fWiWBFf!+ea#Ch3;&lqy3cPJ0y+rUE1zC*K|%N|;4EnujA@}N>YHL%fk?pjlO<~< z^fWeQ5eV23v8%=PY=fvDO@L~Qv1|T^yCkNbe_Oi;;=PZpEr}&Hh$lo1tP6K{%>*BQB1EnvQ*@$)uV1bhj_4gJ4LQdaYVH${o`qNU%eoIe3_d_v1 zhp8{O{dP}&hl8$HKp|72NfAaV8q>D&C3;Y4x?LFOPL&}axYIYL`Zd+8^rN$>2K5Y# zx`#7NBg=_kIXIIWp0m=@gH9@0|bcYT`HCLFu30sfjB8`Sw8yb-G@+8D8nw;}c z&jAx_Uv?8HnU(gioj=H9J-5Qdcoj_(msHRbZ4UNJQNJ7t%W9L7hWdB*2VODIsEo@~ zo@x8Mw-&I3Ix-J_LjCO4$TyIrr+|N)E;vuMazGYS>UDicRQN$36md0m^@z={ed9|@ zR(Bp|wj@6`EH(?2Tjigc35D@hx2*%`{lBa6=!hw6@-RfggBXU+pPX_YM@}yJ{6SFJ zE&K;^%Jz}#!66Gh{_**t=9ZS2jg7n^%kILcUKta02m!%He*%5|yFa*Cp4LYuhQ|2o z754+D)0ceGve0%^J&3KAb2QTrCnZ`0506(&8OaV^!lYc#xxmFF{ku9@#C^)jjr!lG zpBHWA`=o=%Q!Bj^GMo2Kx&V^z9PRwe_K+k8wEHre95~DB{f>x1fm1Ey(?QqPj`?V< znEOvNK{c+KAMK+;GkqbrRyuGqkXe+OO2w}bjctn?bd@ra>X;ZX07a}q(I0**6n){0 z8lk3{A+Kb`BC$B04^-l#XJ_nwf&1wW^=?K^ru;k+6Y&;RVcbRaHishSi4PN+s;zeNv9LWUr&IfdWjE-H#tc37N3%>+d!?d!oGNF0iS) zs5dmhoO%S0K6O&w5-z#_*~W6e&N!0VU0Tv~v8S5XV>GNO`XEbR_)Eg`>p?9mE z9x8>L;Su>AZ+|k#2DCADGLAT>98Pc?!Y#wX9UdL8|NinSfu5X!;dEo8NB3XQvVNAj zkv9UGJJ(ymnjHIdoRI;2o}msLEp82K+T<5+FwwB4;8|EskaM==i9kLg*Qfttnp~xk zCG7QyY>J+UI*I|h=M%5e-()hzzQao`8xF7FOuy)Vn5Nz#rPR|w(`Ve1)(5uFkFrFd z%Zh_qjXezVajD&7IGj(Fu020kD`M zn^0b-Pub+T44L`QPEC_YsL^ScjOHv&P0jr2`%9o*_T904YtBxV1E^MGw(vCBb!TVH z9V}R+pgaU=!P;2yJ>ThL^<$%Ac4ilZ1Ua^EHVMi7qv=(%E$qCYqYw9|+rt?QY>cop zol5wUV+%8|b@U)}*cle0mOu0z3L4sk5pKuK*A=Cuj~5J7rIE$NFJPQboTvfad{`Jy zDfSJ0H9D07|AH%N))Kne)^2WXIlOe;J8L3oi?)}2suX;D?C{V#yEiA5zk>P->O8Z= z0jf!MVSK{5yA)3W@s|Ay?E!zr*2Ye`;hyg^=`%=QSXwdXR@kAT5-m*IcTqJVOE+AU zHr+eBla3!-@Ixn4rQ>iLpIdTp0HmhWC2sOJVT+pr+@V5zgjc|nc^EO2|42imTrRin zW((K#?~LW>9Ja@Ya$ZZ~(gyal>)4c)g>k=AYu;V(L{N<6OjP`dAV9mg0Ef{I;G><< z(fxM@xY%W<0JN&NKh#i*CL`8!VS%4T1}HS7ZvMQ zc2>m+5Ul2auyEk$Sj@m)x0NpRGVJ7Ju)=uLQjy{{u9Zw^XU)T0svw837k|Tt?el|E ze1eGoVwz-}K`t6ri0gV1GmCIWC5NGY@&{>JG+0mmuOMbk6w(WFh}JLgBg?;a(>p0o z=YZXHMa$i_4<^0lJB4JWc}H3KGFm-FDvDo$ZlOE=x9ed5a?{h`zN@BT@F{)*mz$S& z!^@Vw+IW8E1fGF~O_Bi`?C+q_eJV?Z<6O!?AM96#9V45o{woC~tP6C7Wq12E`RCt% zW*2X!eu>Fzw$!h#WfZN(5nj?C0dJnk{~pnH4BaIiN*NWABgQOx4>tyo6{j954^+Z?MpT&+m?x ziD>}X8Q0w!#F0B@23dg{Ik%<7cnLt7!2dPlc)Rv2>UR!N`6|Ht57MOiA4n6d>G=9q zVg3bzN~Y*AUP60PW=|?!nsV7nClyeNDLoWn29Nud;q|FxZ7ph}R8v*)dxWvX_kqN7 zaM}aM9i&chhoHawN}ooisMK$*k4O{YD>sS%wPG(BGAf;B??I%(ISU{-96~}!f2Sb8 zF{ox}7zN^HoqsIi$Y^Nk%!Y$J9DIQvq#jG{wj5tkw30zHEE;6xg4{vy8WE?MG}-j` zYCw<(O?vnX^B{nBD|vez;2xl}4RamEvr28v5W#bmL?kBU%eZi>jvo27s zSAAx0zND!JB(P19!EM$$xb>qFy-Xu2D@}My2I#0T zA|p#3{yESeimpS(T^|ufTHN}lR+lW|hM`K%1I)}J)h9^#M{};3EpPknkWBZi(l`ab zs{=+8oz7)BZpXCcs@BHiN{O)&MpPsGQ)S49-Y^eD`TAf!X_p10CgUownR`4iJF(L4% zt1T!S;SZCxK(5`9j5+z#F#!k?#Q6n|0`4)sBBR6peq4%fK*M}mB9twK1oRq00LC{w zpN&@!6%uCA!J$FV=-_bhB_%s{{^!Da?*ZS6^lSr~?5!Z5X4>|q*(bum2}_M@HGUQi zjj#GDXfMF9HTj9E{b4a7BP^t$Vd|tGu%gmxdQ%mn8KiXGo^Ja|P20EVu+T2t8Mo;` z(+9lCk$6QTdQh9WnRatZ&T(r*7^c$F_5R_mjYnZ#UJWy=-L;KvW-!=Jq)4H{4V3m0 z8iI0ooewfGgJ0^I=oIGFG_$g{-Fz(2omXU2`4EvRf0=--ZTaAP?*G{L*ASu)c~F+j zv7fSeq0(KixFKnMWtQ5|Ab^gEX<=yz4^F0ghr*vXHY}oSQ#8Qn7X;5>$5h*8uXp$< zfei;ReG4tJ-=)1_Q;bc_{nZ*MU_V4=2_*2e{G^x+m_;ENvPJ)aGtqpK=Y~_(L+}Z(Wet~@w;_-zU^Yp{H=rVaF0a6ttt9i36&VA#m&oQ!jfCd%Bo@M#b z34(@pG3VFt0tO`hc6~W_1M6#kc}tfPX`e2^XPimQKmccwzQ&G`&XLu=Y}@O)okJ$r zdBZ`R{`O}}*IMu7i;NSb_vr4YO3i#lMkZyOM zDoX|a3_wBwG%Tk8XJ|pl3#W{}pJmbNCbd5^P+vk5zNE%ow!*9{ybfKGzRnx_$q*Wb zxCUG;6BBSAzv^INoMVxIU%$BIyPW3h?@9kbGx?tLR{Zp)h%5w8F~6*h2Op#+pMox; zwLOZE5NX$u1jvd8i8o_o|AS^qG;;kfnhBa7DIbh)IHrZanGez+vp^aoE}W1M%TD)^ ztg8Ye*Z`=n&XLy4D8^YSDA5F0Mo^Nj$Z$Xr?rs2mE0?V&px-g{ zPc&P+{fs9+X=gLng?)s(yh#JqK-G}dL)C|dUYroC!zX+sccb%jZ4LB5n1W~{YTOv{ zn0;t^NNmg;0@0tDPgFI&4bB>9*LZ^;m@F|OWT};I`4M@hEs8jQs(m^Yw|J+0KO^;- zXWsk<-3$mQNDj(~j{(Wqr1fKeJpJu%Z>mOCP-kBvGxCAEJ5XaYG2v;~WC;!?N(Is| zCfi96RF|SOM9Aia%TgzE;@2L$88lX_;;-~=fOm_Ig`(^)l#QTCgEKoN`738jZu7T1?pf4 z;g54c^Jzq6)lBOf%!KOt>R%wYU08one0-WXtD0<%*&PP629${DE}1CRc#^DH&tR$P zX0Von7;SuI0;vY$@cYg7s^XB`(Ek_8gj@ADcZ&1~5p6xIJE<$zr^s4Alde;vKd3ea zqY$2nGF&lONP_{3fphl8yw>;~R#WQ$YGB;AdJa8F7&`<^{ZG=QaVQeOstoCcsMhp5 zOq}sqrFNG|Wv7}1{q>WI3QDZ#MIj-gx6LL~ny7iZ`4tr?+p*>2Z~nOCRUSzuA{XIO zn%Ngsxrtl!YOOO<#78s6PMZ~quIJ|2(8iX#=f^S%xyC_y_}@_MWaZGIqaZ|P)lt*w z#!Li%E0VS-;)X zyPFx?LoEki*r?c3l3jaD-KqpQ<$cXC-2f^acxlO-ljMwm>;pY0WT1iSQjj@Eoty9z^zaO3P7 zL2}XzP$23otnBNZJ+E_!doEV!`QPu578X72wYo=f`QUQ%)oo0C*OkU+Pz;C|SO1qB zIsJVWdIZ2sO&kFD^C126rq}R9JfF$g@7WPl1{m1%bc3DHB%No1_WrqRS682AfRoEv_ge0e@Nq>Suxy1ImsQHp9tdg#O5 z^a|n}e0)Kpes`|{nCbo_QeEpKF5k*CG0dk2PZt2va54WFU3Hq(bc)JQ0FWq*Drvo! z3o&)lKeL?O*hfa!YgGMcS1x1f-lg5a@vYp0M9bslmY7+W<`9rB!NShEet3rl$V|_z zCZu8?h~2pW8e)}@wwIVV-SxOrCUvmzj-HNFj4ue_1MrhKA2+Cum+m!4u}uA*h`E)e zz?&B?O9ev-T>5=y2>{mD91V_FMvdOX|G-R-nhAO!VDt_xCE73JE6Abb>p}3@zH$W1 z!Lp|_HE|3KMe&dFuCoz5fZ*zw?8B1zX7Pf*h3iP|jK# z-$3ZIxtkl@$e~lcoBP@AX6)O${R7ZjGRv|LgAWwP*3?Y+bU60Nc6dkm*q{AGLfJZ+ zCEO|QPYzPI#{CZYd+BArBqd>ZI+Kz4UsC=sY5Dx(`J=54L3%pCGEJaT;jj#iZib27 zIvROjMV0_86DZ8!vI$Oh2an!J=QBA1ER)aM6Sn_gnKs2b4~Ni2Z~Jas|J2T6qlW-z zy15lgT756y%q#~FPXu$}^U8+?4CU$57XK$(VWjMh=VhU{zhC*?`1pTHvlkP+4I|%7 z8q^(|@P@F;Es7&^hzW&}KP|7WO(cDHg)Dl|N?(d)UtPn&0OBOrQN;qFAMhIVRF!8u zJer<~A_Wx1l3P^%eF3iS?awEEAdOuc8VOxYh%$ZNkTPoZ#(0f(K~epbnr?akHebjm zp@7$NUeQy#Ql!ekJr)}|z(o4yqhlm=DN zXJjCrg!H*}p4p^JgOx3<;A2Po;{1G|toFwn&*%S8nff=w;;e{P?}ty!%$+f_pY{pC z2#nO>AcKFKtFrlLFqZ#47Qg#*9;5qk`$kC%q^b=Bk$f6Vf>+i&TX59PVPIi(wRC@p z83xyM5^gG);O~4lZ6Phaxq~YKc9V!E!nQv}VIVTHfU5J0mk$U1*vw`jHoeinxs|%7 zsr{#jxfl=+dyUUJzT&h7VX9{C?(iLEFkF6O4hJN2WGYk^ugz2Uxp$UJN+yu-k0>(J z<##^gE;}Bs?VjAZA(A`Xqlc|}HEh=@b4EUQ z=d>$cn;1)87l;6M7Xaw(ye7XkU%Ck5N`f(K)N|`@+$CoczSgvsrTZXvVeJlQ$e*u2 z6HkE4A}Wy3cjF(MDX)>(&@cn}1w2TYm3^;V9^o`jBjoW)y7-OIKQoVL&|+O1q9SbFV$5540CP#NH&iDrE-UN2Oe6YLQay9pf%xuu|G^&?=C+rw?M)tjGQTlr6^CcF=dUWi z;*Q6Pzq^3e{JbjmSM_jy^_9pXE~RQ^>#xXI|7V=*YY*TxUc11jYQ4^$)&l9{9C;Fv z!^5n=sUe^d+R_q!MZ|gEVzz(5w|a+2q8SV9-cU!!@2yS`CjYAi=sb62z|_*wGPfCs z1=IJ;mfOg=YQ1V%)$lR)Hp zKN)+MdfaKaRvZ2Dd$GgUrgx^hol7i!mvv$=Fh*b%nW4h4pdMySF<&5FRO>b5U|bw{ zz6}GUrqf3IMXKk%I+zR+lKQ(I+wj99a~HnokI&EDik1|W_)S(xSy^NdeEdzNS)wQd zUT)sbgaZYK#-jYSs+*+bq;=2dwbbAZE)L#1+z&ngI5!_}{LjUpNw%R#o7oZp5ofN&4iNv_7BLwoYs7Sf?A}M8 zUChN@AyTk(?U6&p!2k*zpyLuYt3RrqxIf9ATznqE+r#r6Q5ssfM+9=kAO~WasO6+v zx!=*xk002$`h?Cl?zjezQ#CRx23Siq$vV%+QZ%;sx*+i3^8?GqKu8vd$738n@ zM^OP$n?=)yyYV(n9i70F$Lo`bl{C`qO5dHKpXBMK8$xYQO^n-NDHk&v$#-TP0SWY~ zZ}Fl~RnIpz;94Kgqf&QHW|dUm?EINs1dEDY&ZuJmFL*~4E}iC97X2Ri z5lt`kk4wtSrA$vWxB5iHmXDBXiQLk^9oeYbReL}W>HpjaT;GXC_^*0x3aVs_hTPv9 z)Gx7N!!>)I!Fe7pb;yzXrZ&EL1jf@%D5;nEpNsSbgXYSYlUAcOE^>xGNTG-itcx8W ze-XXeZ0Y3Bjc#?TB=P9@#1uShM@=n)Wf=UQ>^yR9M>+v_{>(D3#x8S%D#rc&{j=r@ z_QGp?1)qUDnw2udY2};0oys?!-Mh}JYy$(#*mLtZsemaxx3DA)iiQk3!{I@gCdcFx zl7B(Qmp01d3okcy9rcK>M{iuq3xALqW@G?_9p3CY+DCAv>F~dMHid)v7$S2U=rtn|*+zq4(yFHWy#|AtsAUHO1LXljcup4j~&IRzXD&{vl=TDTieBeupo?YcgT#W!+hG-^^6x zgAlC0vEYq9DpfC8YvIS(+e06Bbr}o1I|~xzgdLuTlcHZ&cAwBLDQ4pt8j~iNcC_u_ zf;g|65_=c*d6RVP^FpY48RPc#6X|%rS&HTJO0ZXQ?c$~0x}LZf+omme2lxh%4RtwG zgy0|}=8ESB4E%ZbAx_%yHCpTK#_Pw8{OtV3LSkpaU8IamNdG`t~|`H~pIFW>Ca!jW=16=XG93L9h~1f3#G``(KT%|}&)wUexdMKT*n zi}y&%xy1@Fn#^V8{W6-XmfyS2+$^8jl+T5m9Lj!$tTW>JjBEIfI`gWWu{7C|*>#b( zePi|@XaOIOU66I!6^6yhEzGhtyxHG#HZqbphoti;^*Co~P*Lbt0ZDivW5lBr&mXBN z%W!)# zp@n~vbZmJsL*Ezb)%J;VTp(frrcE^iZ-i>9zTY;7sA*pBqfCD=7AyB^F4b-wSafR7 zJD;hXd&nOYSpJ+jZo{rK$VmJ;iaDib`=I7D)*bYw33==%zStG@pIpfF%HyxLXx+&E*&E!*ivc5wJwqRib|!5DJ}Gnx7vqiK`gZRq5g2UtzIV?u@}wDun| zY7vlvBAVyrHCyAh$Y=z{#SQ3R_ha!{F1|<*b}VeeGoEdatb&bn_^}IMP2ipcph*R_ zQgcT~v~2(97kOWhktzAzchEsu+PsM^Y}u*syF*#=y)g!~CLu0XNqg8xc^WFkR$}%< zZ)?O{l<0lE3*n9|6KRN{Tl6748CguCm#OMexr@VcMOSsmEQ<@EHFe8ckAI_IP`HM; zI%>hOHy+tWWZH4}Ukl%%Dwn(@P(Cz@8sz3u<^OXyYI(MqG$iVPnvtZY}-CY4>bx?H)k?0v+)2iHT3Z%MUth$Aeb& z{(oDyPq6&1Yle;nC+BG9WoXsYhs>0Zbrp7a3Q!J3iEqeuv;{;X?c3U>M$#h$;3PF{ zNy}DWuUo55pLsmXtm_Z=Mq`AwNlD4h9igco%9GNQgleq3E)Qz^(Ii*4H0ROgLHQ({rpKnN z)ZOOOt_~F{u6v}-`!>p*hO-*9L;RIX^5i<22U7{V#st_}&*GknN(CL?^zILGntE{d zf{XEuCmNa3W8X04;>S=@j{EfsRp~L^z2gQBoL6d@J>XB=nq05;wbcgnENCKV8(7&` zbASC{JKJQ0r3K3JWs^I&PCziATR{op(zq4Mo882cgC>9|(YZ?c@`R*tDOg__;zWY+D(ofiURJEG!-X3E8Oyp{+r`J<@diLUzeZQ*WKev zUKed~zc=mvF@hnno~O{)2W`FCA8jk!dU*pz|M43knJ& z|J_2+(M`riM*v{U&x0YI8@Ryfozrkt{Cg)?uplACDIQCD2q7PDLqb}*MOsQg_V=TF3uzU=3@tXYc*K&vjq-WK5Ye6*D$j zpiRu4c>_O8IhBFS(Su0Qci8bP5kUZM>FJ7~OSolZY%Tz+dM4lBU&#xrlGx89kF6R; zRI(y6Z2cw>*N`Ipr-He@bpf}-MM z0<(tG0LROYB?PGV%zz4tx&TA#O%QhI_BYcPDFoA|v+RmoC1R~Y_OEppkp!IZsvCBUciQb(PQp(rYHB_Ky!mWOv zZUtCQytWg1B5cON(^j|JL)4EgUiE)pE%wRV1zl$wXXwOjgp&HYUJHe>@rpqLHUQBn zN_LbSi_N$ATAi(5>*0y#T6?4gt)K!JR@gg84xDE@^Vo+qok!4B?XOHQ&mfBZ>PWlF z7HXy>hUQk%aK>q{4Md@zwN^aa&~gX3ZREJ_OM82lP{!d>EBsi@mBc5e?}-S@dVQ~2 z!HS2K4L}5sL}y8DLr$}_U2Sv9^}=j`V<6F6O&aKnd@KfZ=RwWV+7jjM`Ml3R6Yv-Q zLpcp!1q0}=cNh!xG>=ByKZ4(Ge0^qry0ZF%ysj=GJ3Bi_UPi#a;ppk>Gwt{X-)^&k zv`unGMkILVdh`xu7v^+>A(7ehEcwN6OC+ov6hhvyvB}QP?>ju?1PNU1`m=KJ_nvF_;zE20uB<6ZhD z*q$S!_I-@F5s~n92uDvNMvsrslSdNfYg9nuiwbfSc*vxT<%u`5k=5?2wBrIkNet3z z8ZP4vfaMdg6%%J@@|yh0*TV0n0Z>z^;;MPOsI1Ga>sTdsuS zr2u-osjT^^8wQGMaGEkH{bZsiN8M602r>T>#k)4vwFB}6=j7GGykx?x??I-$tL!)c z9ayq*qL#KoKh-PMeDo)0r-J&fqf#%oc~~TXJ-=mYyuc1J>}d(Vm^YZX%Zd9At>T|g zZ{zyf4m{-#g0i~L{j$3-h^YZczS;ZCF$kDHq_sGMTm-QAl4wV%-1YZ`dxo~_;b z@79e=lDPXX|HAx(lW=G>Tz2THZ^dnK}m|I!IqX&Kl zU!mj<4CuNp<%!(&Hw{J)ko|l+fW;24VGdLHaFo1h6~HF1?11^)41x#7qe4Pq06ik3 zporj9g?RmX*E&J*%Eip1?PaU~r66b$ctEN%`-+j1ruv+VtF*S(AR7oB0cD4$Kg*f!Ri%N&U#I%2W9Cttwt;7M4?pu&~sj4V&i&$73M;Q(mFjdRj7w7`SAF1iL2~zJfJI zjtfM^QR9=2?gEiTEQ8|6V*?YolTsSus>H?9jW*)&2KigMP*Dy3c|t~*8|;n*a8g%W zHmmQGuTrzIp4y8EM>yX8(*{as2D5=`&m&Mzts%e_^ooLn%_ zhekdtzfU9Y%`PgC_Iin2>^O-*jA-06{SVt}tQ6j2E{XB+XEVVGmtdH&wJ}ibDdKOL zB;q;7Vq(MON-0J_Z^-7TQ_CNgz5x^+^kuq=3J&)`+99Vu{Qy zbuY&M3cyOW|E~b-kxDf-w-Sni%cNNwgzA)nuf`|`z7v$`d>2s4Mbj@!F1EB`13;>3 zJi=_TLrreEf}j$Sk@1+dC`pcTtwS*!P2bA1kDwt*cw%H+;jJw4uNy&q*dsDh7wV!v{??&+_>&fl5ZcE-o}lyG1N~a{(d6AMpitSFdmTX>g4tpz8Ss&*-Nd%~c~VEd zpC>B1#5ztJb=*HM0Amv!G7ORaEX*eT{gag*9*Iqc#Dzsd@a?H=tGoO9`RzK#MM-@< zzC;mTM-RQzHsvhX02{XtK4=~m_*bX)E@2dB=g1~*C{a5+l&Y0KqG6m@NfE*FZL!^m|g99Ul+tcQ7JW0zj1wI|ydU(f-Cib>eTYpxESFel@V=AGN4y%LPmWp6Ua9VHnE9q3yD-6}IQ>=QG z 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 Of6DS2a-6QB2eHV0l>Lb4zQv( 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

KTtJkY7M|93 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 N002ovPDHLkV1jQEkqiI; literal 0 HcmV?d00001 diff --git a/plugins/monstro/fm_active.png b/plugins/monstro/fm_active.png new file mode 100644 index 0000000000000000000000000000000000000000..cd4ee859d03bc5cca2f65fe23ad40b603efd2905 GIT binary patch literal 678 zcmV;X0$KfuP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00It4L_t(I%Z-#jYm`9{#(%SW z(VU#-L~N|Ikq}StL_4_;prw+=Phe$l=O?gGK?Jd|F{dD68U<0&!b&g~0-~r0fe0CONq(Nl!n zF?aSI!OH-7oLYqs;Pju|W%b^*!sE!5TWr34#>R_B%-wlI+_xVbK3+bDjkY*?^CrX4x>*!Y&c+j;W{FM4hIZBukds2TS-4<9{7XS&RQmB zu}1&(A~>vfZxCuzljNuZV&GN)+xCd%`4+tk#~8eO1;Et7L;UK02cZA*G4;cXpOUjP6A literal 0 HcmV?d00001 diff --git a/plugins/monstro/fm_inactive.png b/plugins/monstro/fm_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..a96128b7db2f1e72ac9d1748d58421947957a1d4 GIT binary patch literal 484 zcmVW02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00B%%L_t(I%dM2Xssb?(g}=-D;bhr=PK(}~03z-TnWS_{B(xg^Un27|#9X@&55y%IuTGMN-- zo6Uy%{myo~rQh%4z2|&B6Gc&_P#;T<Q5?wOV1VMMPfS z`BB?+yIpR#8|`-cZH{ryY1t{|m)|)hcSzYOkH>?>V(~M{b$NL#|7E);$$53lgQ0Ff a)Zq&^)wc^~=^|AC0000undR< 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 Am;e9( literal 0 HcmV?d00001 diff --git a/plugins/monstro/moog.png b/plugins/monstro/moog.png new file mode 100644 index 0000000000000000000000000000000000000000..1a657b161324cabb6a67bade9c17f35d366bc4b2 GIT binary patch literal 402 zcmV;D0d4+?P)UyOwITYqUl3@ z`^~&i!R-S}Kme{A8Pz_p4NQSWAZFN`aiChADNiZxQ(r8rSv)q_9oH&+XFsIIht w)2Lt68AAxiY5^Ppmp})#t9BcH&i6rl0^94WKmdLPuK)l507*qoM6N<$f>Z;NXaE2J literal 0 HcmV?d00001 diff --git a/plugins/monstro/noise.png b/plugins/monstro/noise.png new file mode 100644 index 0000000000000000000000000000000000000000..cd22af02b51a24ec51095a77b26008a3855a55f7 GIT binary patch literal 478 zcmV<40U`d0P)_CTR4a#c!5bTb=*}yP|ygMa1Ng<{}xM0rmeO0IUK8la2PwaKUuOz*jIO7 z!@DHc2P{<=ID}8wu8*@__l5H~h4+{YI9=d(%oq5z07*qoM6N<$g49yUp#T5? literal 0 HcmV?d00001 diff --git a/plugins/monstro/opview_active.png b/plugins/monstro/opview_active.png new file mode 100644 index 0000000000000000000000000000000000000000..d993b111b3572d509548e4cb671f5ce36e128950 GIT binary patch literal 2129 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 Xs^G$%TA4L+00000NkvXXu0mjffBDQl literal 0 HcmV?d00001 diff --git a/plugins/monstro/ramp.png b/plugins/monstro/ramp.png new file mode 100644 index 0000000000000000000000000000000000000000..94f23b59f4d3ae623724cea67c983c344ac83f9d GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^d_XL~!3HGNrubO_Db50q$YKTtZeb8+WSBKa0w~B{ z;_2(kevesJM4dk%t<4lDBw6AbQR1ARo12kkZ7lQxBL zd|)a2XXAI!%p$*`REtmX*bLVO^+|1>1_#&|F#4#PcE8&3tMKCAd)G^RZb{_4V^&|F zojISU*6jf6izBkrosxa{&NM{d*~pqz*Y!ax;+SdVf_KYfn-0%nn4b8JVa3Yyl-Lc^hNe^yeNp zV{=%{?)2J1?HMzV-_Tf?XnH-n@!P2nLd92WE;8gk-oTTu^k`39uuo%HVN0crZ*!fj zsj+xruc(d75zot^uVmM6XnWpq<8O9>>)F+%dmb$~yKK?3tJdF?A1&s6lbR+!duh11 z;KyrEO+{}UWRg>Uv~Fo#&-#-g{tGkTi1HTpU#zb?aVh05Z`>3A8;jprUjcfV!PC{x JWt~$(699#lkk9}C literal 0 HcmV?d00001 diff --git a/plugins/monstro/sin.png b/plugins/monstro/sin.png new file mode 100644 index 0000000000000000000000000000000000000000..f9441bdfbc0d9f2a9efe464ea1aee44d57522b95 GIT binary patch literal 398 zcmV;90df9`P)ABwe#cJ%<8t z2W$aL;D9cY^q@aIN*cO-zYYqLqNGo^gQPe2g*L7NYTyuf2BM#t`|4HT0O$kJ%#xWU zhx;CD1&@GlV3GM3-lSU6UQt$Py1D_(fk_5NAOXjoZgSw(AGoT3A#ek{6yO}#FY4R@ zHk(vOz{t$LnrKU%HLwl504L`@=J&6*RLk@Z|Hn0CpYh sw2DDelCkpKVy07*qoM6N<$f))^%egFUf literal 0 HcmV?d00001 diff --git a/plugins/monstro/sqr.png b/plugins/monstro/sqr.png new file mode 100644 index 0000000000000000000000000000000000000000..47748c66830d3acc5bd245bf6ea27e9e0c633166 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^d_XL~!3HGNrubO_Db50q$YKTtZeb8+WSBKa0w~B{ z;_2(kevesJL|xpOOD-8GBw6AbQR1ARo12%J#2SL$jpaJZWLW%oj0wfZ*!5{V}{+aY!zCw>;4DEKTJ+O k-cfPFXX?w)$99LzJ6{-{5?uZk=rslgPgg&ebxsLQ0OxsuO#lD@ literal 0 HcmV?d00001 diff --git a/plugins/monstro/tri.png b/plugins/monstro/tri.png new file mode 100644 index 0000000000000000000000000000000000000000..9764a36e8bdfdfb2eada0673e3e5846cbf1eabc9 GIT binary patch literal 380 zcmV-?0fYXDP)&L#D9n^!8)alC>DYJ06)S{NFn*2 zEv#&{uoP1Stc=})AVkDkun;633*XAByE_GPYG)s_FIR;#N&X{+H!3hNtSYI%^d7fEVDpkJvJ44eY2xVnU{w!+)Y4@n5LJ aX8#WK`s*geiHIEl0000