From 454ca08025123322560e48dd2554185d0c42e0f5 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Wed, 21 Jun 2017 23:43:11 -0400 Subject: [PATCH 01/15] Switch ColorChord over to the new dev esp82xx. --- embedded8266/ccconfig.h | 80 +++++------ embedded8266/esp82xx | 2 +- embedded8266/user.cfg | 9 +- embedded8266/user/custom_commands.c | 51 +++---- embedded8266/user/user_main.c | 70 ++++------ embedded8266/user/ws2812_i2s.h | 3 +- embedded8266/web/page/menuinterface.js | 185 +++++++++++++++++++++---- 7 files changed, 257 insertions(+), 143 deletions(-) diff --git a/embedded8266/ccconfig.h b/embedded8266/ccconfig.h index b3a09e5..b94ed85 100644 --- a/embedded8266/ccconfig.h +++ b/embedded8266/ccconfig.h @@ -12,52 +12,54 @@ #define memcpy ets_memcpy #define memset ets_memset -extern uint8_t gDFTIIR; //=6 -#define DFTIIR gDFTIIR - -extern uint8_t gFUZZ_IIR_BITS; //=1 -#define FUZZ_IIR_BITS gFUZZ_IIR_BITS - +#define ROOT_NOTE_OFFSET CCS.gROOT_NOTE_OFFSET +#define DFTIIR CCS.gDFTIIR +#define FUZZ_IIR_BITS CCS.gFUZZ_IIR_BITS #define MAXNOTES 12 //MAXNOTES cannot be changed dynamically. - -extern uint8_t gFILTER_BLUR_PASSES; //=2 -#define FILTER_BLUR_PASSES gFILTER_BLUR_PASSES - -extern uint8_t gSEMIBITSPERBIN; //=3 -#define SEMIBITSPERBIN gSEMIBITSPERBIN - -extern uint8_t gMAX_JUMP_DISTANCE; //=4 -#define MAX_JUMP_DISTANCE gMAX_JUMP_DISTANCE - -extern uint8_t gMAX_COMBINE_DISTANCE; //=7 -#define MAX_COMBINE_DISTANCE gMAX_COMBINE_DISTANCE - -extern uint8_t gAMP_1_IIR_BITS; //=4 -#define AMP_1_IIR_BITS gAMP_1_IIR_BITS - -extern uint8_t gAMP_2_IIR_BITS; //=2 -#define AMP_2_IIR_BITS gAMP_2_IIR_BITS - -extern uint8_t gMIN_AMP_FOR_NOTE; //=80 -#define MIN_AMP_FOR_NOTE gMIN_AMP_FOR_NOTE - -extern uint8_t gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR; //=64 -#define MINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR - -extern uint8_t gNOTE_FINAL_AMP; //=12 -#define NOTE_FINAL_AMP gNOTE_FINAL_AMP - -extern uint8_t gNERF_NOTE_PORP; //=15 -#define NERF_NOTE_PORP gNERF_NOTE_PORP - -extern uint8_t gUSE_NUM_LIN_LEDS; // = NUM_LIN_LEDS -#define USE_NUM_LIN_LEDS gUSE_NUM_LIN_LEDS +#define FILTER_BLUR_PASSES CCS.gFILTER_BLUR_PASSES +#define SEMIBITSPERBIN CCS.gSEMIBITSPERBIN +#define MAX_JUMP_DISTANCE CCS.gMAX_JUMP_DISTANCE +#define MAX_COMBINE_DISTANCE CCS.gMAX_COMBINE_DISTANCE +#define AMP_1_IIR_BITS CCS.gAMP_1_IIR_BITS +#define AMP_2_IIR_BITS CCS.gAMP_2_IIR_BITS +#define MIN_AMP_FOR_NOTE CCS.gMIN_AMP_FOR_NOTE +#define MINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR CCS.gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR +#define NOTE_FINAL_AMP CCS.gNOTE_FINAL_AMP +#define NERF_NOTE_PORP CCS.gNERF_NOTE_PORP +#define USE_NUM_LIN_LEDS CCS.gUSE_NUM_LIN_LEDS +#define COLORCHORD_OUTPUT_DRIVER CCS.gCOLORCHORD_OUTPUT_DRIVER +#define COLORCHORD_ACTIVE CCS.gCOLORCHORD_ACTIVE //We are not enabling these for the ESP8266 port. #define LIN_WRAPAROUND 0 #define SORT_NOTES 0 +struct CCSettings +{ + uint8_t gSETTINGS_KEY; + uint8_t gROOT_NOTE_OFFSET; //Set to define what the root note is. 0 = A. + uint8_t gDFTIIR; //=6 + uint8_t gFUZZ_IIR_BITS; //=1 + uint8_t gFILTER_BLUR_PASSES; //=2 + uint8_t gSEMIBITSPERBIN; //=3 + uint8_t gMAX_JUMP_DISTANCE; //=4 + uint8_t gMAX_COMBINE_DISTANCE; //=7 + uint8_t gAMP_1_IIR_BITS; //=4 + uint8_t gAMP_2_IIR_BITS; //=2 + uint8_t gMIN_AMP_FOR_NOTE; //=80 + uint8_t gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR; //=64 + uint8_t gNOTE_FINAL_AMP; //=12 + uint8_t gNERF_NOTE_PORP; //=15 + uint8_t gUSE_NUM_LIN_LEDS; // = NUM_LIN_LEDS + uint8_t gCOLORCHORD_ACTIVE; + uint8_t gCOLORCHORD_OUTPUT_DRIVER; +}; + +extern struct CCSettings CCS; + + + #endif diff --git a/embedded8266/esp82xx b/embedded8266/esp82xx index 113e0d1..21e23b5 160000 --- a/embedded8266/esp82xx +++ b/embedded8266/esp82xx @@ -1 +1 @@ -Subproject commit 113e0d1a182cd138510f748abf2854c0e84cfa23 +Subproject commit 21e23b5c360045425abe6c855853f2d973420fc2 diff --git a/embedded8266/user.cfg b/embedded8266/user.cfg index 5945534..4677ca8 100644 --- a/embedded8266/user.cfg +++ b/embedded8266/user.cfg @@ -12,12 +12,17 @@ PAGE_OFFSET = 65536 # 1048576 #SDK_DEFAULT = $(HOME)/esp8266/esp-open-sdk ESP_GCC_VERS = 4.8.5 -SDK = $(HOME)/esp8266/esp_iot_sdk_v1.5.2 +#SDK = $(HOME)/esp8266/esp_iot_sdk_v1.5.2 PAGE_SCRIPTS = main.js -FWBURNFLAGS = -b 1000000 +FWBURNFLAGS = -b 1500000 OPTS += -DICACHE_FLASH +OPTS += -DDISABLE_CHARRX #Saves about 48 bytes. +OPTS += -DQUIET_REFLASH #Saves about 128 bytes. +OPTS += -DWS2812_FOUR_SAMPLE #Saves about 224 bytes. +#OPTS += -DWS2812_THREE_SAMPLE + #OPTS += -DVERIFY_FLASH_WRITE #OPTS += -DDEBUG #OPTS += -DFREQ=12500 diff --git a/embedded8266/user/custom_commands.c b/embedded8266/user/custom_commands.c index 3afe2ef..be53a79 100644 --- a/embedded8266/user/custom_commands.c +++ b/embedded8266/user/custom_commands.c @@ -4,6 +4,7 @@ #include #include "esp82xxutil.h" #include +#include #include #include @@ -13,34 +14,21 @@ extern volatile uint16_t soundhead; #define CONFIGURABLES 17 //(plus1) -extern uint8_t RootNoteOffset; //Set to define what the root note is. 0 = A. -uint8_t gDFTIIR = 6; -uint8_t gFUZZ_IIR_BITS = 1; -uint8_t gFILTER_BLUR_PASSES = 2; -uint8_t gSEMIBITSPERBIN = 3; -uint8_t gMAX_JUMP_DISTANCE = 4; -uint8_t gMAX_COMBINE_DISTANCE = 7; -uint8_t gAMP_1_IIR_BITS = 4; -uint8_t gAMP_2_IIR_BITS = 2; -uint8_t gMIN_AMP_FOR_NOTE = 80; -uint8_t gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR = 64; -uint8_t gNOTE_FINAL_AMP = 12; -uint8_t gNERF_NOTE_PORP = 15; -uint8_t gUSE_NUM_LIN_LEDS = NUM_LIN_LEDS; -uint8_t gCOLORCHORD_ACTIVE = 1; -uint8_t gCOLORCHORD_OUTPUT_DRIVER = 0; struct SaveLoad { uint8_t configs[CONFIGURABLES]; + uint8_t SaveLoadKey; //Must be 0xaa to be valid. } settings; +struct CCSettings CCS; + uint8_t gConfigDefaults[CONFIGURABLES] = { 0, 6, 1, 2, 3, 4, 7, 4, 2, 80, 64, 12, 15, NUM_LIN_LEDS, 1, 0, 0 }; -uint8_t * gConfigurables[CONFIGURABLES] = { &RootNoteOffset, &gDFTIIR, &gFUZZ_IIR_BITS, &gFILTER_BLUR_PASSES, - &gSEMIBITSPERBIN, &gMAX_JUMP_DISTANCE, &gMAX_COMBINE_DISTANCE, &gAMP_1_IIR_BITS, - &gAMP_2_IIR_BITS, &gMIN_AMP_FOR_NOTE, &gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR, &gNOTE_FINAL_AMP, - &gNERF_NOTE_PORP, &gUSE_NUM_LIN_LEDS, &gCOLORCHORD_ACTIVE, &gCOLORCHORD_OUTPUT_DRIVER, 0 }; +uint8_t * gConfigurables[CONFIGURABLES] = { &CCS.gROOT_NOTE_OFFSET, &CCS.gDFTIIR, &CCS.gFUZZ_IIR_BITS, &CCS.gFILTER_BLUR_PASSES, + &CCS.gSEMIBITSPERBIN, &CCS.gMAX_JUMP_DISTANCE, &CCS.gMAX_COMBINE_DISTANCE, &CCS.gAMP_1_IIR_BITS, + &CCS.gAMP_2_IIR_BITS, &CCS.gMIN_AMP_FOR_NOTE, &CCS.gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR, &CCS.gNOTE_FINAL_AMP, + &CCS.gNERF_NOTE_PORP, &CCS.gUSE_NUM_LIN_LEDS, &CCS.gCOLORCHORD_ACTIVE, &CCS.gCOLORCHORD_OUTPUT_DRIVER, 0 }; char * gConfigurableNames[CONFIGURABLES] = { "gROOT_NOTE_OFFSET", "gDFTIIR", "gFUZZ_IIR_BITS", "gFILTER_BLUR_PASSES", "gSEMIBITSPERBIN", "gMAX_JUMP_DISTANCE", "gMAX_COMBINE_DISTANCE", "gAMP_1_IIR_BITS", @@ -51,11 +39,24 @@ void ICACHE_FLASH_ATTR CustomStart( ) { int i; spi_flash_read( 0x3D000, (uint32*)&settings, sizeof( settings ) ); - for( i = 0; i < CONFIGURABLES; i++ ) + if( settings.SaveLoadKey == 0xaa ) { - if( gConfigurables[i] ) + for( i = 0; i < CONFIGURABLES; i++ ) { - *gConfigurables[i] = settings.configs[i]; + if( gConfigurables[i] ) + { + *gConfigurables[i] = settings.configs[i]; + } + } + } + else + { + for( i = 0; i < CONFIGURABLES; i++ ) + { + if( gConfigurables[i] ) + { + *gConfigurables[i] = gConfigDefaults[i]; + } } } } @@ -105,8 +106,8 @@ int ICACHE_FLASH_ATTR CustomCommand(char * buffer, int retsize, char *pusrdata, case 'l': case 'L': //LEDs { int i, it = 0; - buffend += ets_sprintf( buffend, "CL\t%d\t", gUSE_NUM_LIN_LEDS ); - uint16_t toledsvals = gUSE_NUM_LIN_LEDS*3; + buffend += ets_sprintf( buffend, "CL\t%d\t", USE_NUM_LIN_LEDS ); + uint16_t toledsvals = USE_NUM_LIN_LEDS*3; if( toledsvals > 600 ) toledsvals = 600; for( i = 0; i < toledsvals; i++ ) { diff --git a/embedded8266/user/user_main.c b/embedded8266/user/user_main.c index 3b858e7..a67aa40 100644 --- a/embedded8266/user/user_main.c +++ b/embedded8266/user/user_main.c @@ -15,9 +15,10 @@ #include "ccconfig.h" #include #include +#include #include "ets_sys.h" #include "gpio.h" - +#include "settings.h" //#define PROFILE #define PORT 7777 @@ -28,6 +29,7 @@ #define procTaskPrio 0 #define procTaskQueueLen 1 +struct CCSettings CCS; static volatile os_timer_t some_timer; static struct espconn *pUdpServer; @@ -37,27 +39,26 @@ void ExitCritical(); extern volatile uint8_t sounddata[HPABUFFSIZE]; extern volatile uint16_t soundhead; uint16_t soundtail; -extern uint8_t gCOLORCHORD_ACTIVE; -static uint8_t hpa_running = 0; +static uint8_t hpa_running = 0; +static uint8_t hpa_is_paused_for_wifi; void ICACHE_FLASH_ATTR CustomStart( ); void ICACHE_FLASH_ATTR user_rf_pre_init() { } -extern uint8_t gCOLORCHORD_OUTPUT_DRIVER; //Call this once we've stacked together one full colorchord frame. static void NewFrame() { - if( !gCOLORCHORD_ACTIVE ) return; + if( !COLORCHORD_ACTIVE ) return; //uint8_t led_outs[NUM_LIN_LEDS*3]; int i; HandleFrameInfo(); - switch( gCOLORCHORD_OUTPUT_DRIVER ) + switch( COLORCHORD_OUTPUT_DRIVER ) { case 0: UpdateLinearLEDs(); @@ -72,56 +73,22 @@ static void NewFrame() } os_event_t procTaskQueue[procTaskQueueLen]; -static uint8_t printed_ip = 0; uint32_t samp_iir = 0; int wf = 0; //Tasks that happen all the time. -static void ICACHE_FLASH_ATTR HandleIPStuff() -{ - //Idle Event. - struct station_config wcfg; - char stret[256]; - char *stt = &stret[0]; - struct ip_info ipi; - - int stat = wifi_station_get_connect_status(); - - //printf( "STAT: %d %d\n", stat, wifi_get_opmode() ); - - if( stat == STATION_WRONG_PASSWORD || stat == STATION_NO_AP_FOUND || stat == STATION_CONNECT_FAIL ) - { - wifi_set_opmode_current( 2 ); - stt += ets_sprintf( stt, "Connection failed: %d\n", stat ); - uart0_sendStr(stret); - } - - if( stat == STATION_GOT_IP && !printed_ip ) - { - wifi_station_get_config( &wcfg ); - wifi_get_ip_info(0, &ipi); - stt += ets_sprintf( stt, "STAT: %d\n", stat ); - stt += ets_sprintf( stt, "IP: %d.%d.%d.%d\n", (ipi.ip.addr>>0)&0xff,(ipi.ip.addr>>8)&0xff,(ipi.ip.addr>>16)&0xff,(ipi.ip.addr>>24)&0xff ); - stt += ets_sprintf( stt, "NM: %d.%d.%d.%d\n", (ipi.netmask.addr>>0)&0xff,(ipi.netmask.addr>>8)&0xff,(ipi.netmask.addr>>16)&0xff,(ipi.netmask.addr>>24)&0xff ); - stt += ets_sprintf( stt, "GW: %d.%d.%d.%d\n", (ipi.gw.addr>>0)&0xff,(ipi.gw.addr>>8)&0xff,(ipi.gw.addr>>16)&0xff,(ipi.gw.addr>>24)&0xff ); - stt += ets_sprintf( stt, "WCFG: /%s/%s/\n", wcfg.ssid, wcfg.password ); - uart0_sendStr(stret); - printed_ip = 1; - } -} - static void procTask(os_event_t *events) { system_os_post(procTaskPrio, 0, 0 ); - if( gCOLORCHORD_ACTIVE && !hpa_running ) + if( COLORCHORD_ACTIVE && !hpa_running ) { ExitCritical(); hpa_running = 1; } - if( !gCOLORCHORD_ACTIVE && hpa_running ) + if( !COLORCHORD_ACTIVE && hpa_running ) { EnterCritical(); hpa_running = 0; @@ -152,7 +119,6 @@ static void procTask(os_event_t *events) if( events->sig == 0 && events->par == 0 ) { CSTick( 0 ); - HandleIPStuff(); } } @@ -161,6 +127,12 @@ static void procTask(os_event_t *events) static void ICACHE_FLASH_ATTR myTimer(void *arg) { CSTick( 1 ); + + if( hpa_is_paused_for_wifi && printed_ip ) + { + StartHPATimer(); //Init the high speed ADC timer. + hpa_running = 1; + } // uart0_sendStr("."); // printf( "%d/%d\n",soundtail,soundhead ); // printf( "%d/%d\n",soundtail,soundhead ); @@ -238,8 +210,16 @@ void ICACHE_FLASH_ATTR user_init(void) InitColorChord(); //Init colorchord - StartHPATimer(); //Init the high speed ADC timer. - hpa_running = 1; + //Tricky: If we are in station mode, wait for that to get resolved before enabling the high speed timer. + if( wifi_get_opmode() == 1 ) + { + hpa_is_paused_for_wifi = 1; + } + else + { + StartHPATimer(); //Init the high speed ADC timer. + hpa_running = 1; + } ws2812_init(); diff --git a/embedded8266/user/ws2812_i2s.h b/embedded8266/user/ws2812_i2s.h index 85609d7..c0276e6 100644 --- a/embedded8266/user/ws2812_i2s.h +++ b/embedded8266/user/ws2812_i2s.h @@ -23,7 +23,8 @@ //4 takes up more RAM per LED than 3. //3 has slightly more restrictve timing requirements. //4 has more DMA load when running. -#define WS2812_THREE_SAMPLE + +//#define WS2812_THREE_SAMPLE //#define WS2812_FOUR_SAMPLE void ICACHE_FLASH_ATTR ws2812_init(); diff --git a/embedded8266/web/page/menuinterface.js b/embedded8266/web/page/menuinterface.js index 21cca02..ea3aea0 100644 --- a/embedded8266/web/page/menuinterface.js +++ b/embedded8266/web/page/menuinterface.js @@ -6,7 +6,7 @@ var output; var websocket; var commsup = 0; -var mpfs_start_at = 1048576; +var mpfs_start_at = 65536; //1048576; NOTE: If you select 1048576, it will override the 65536 sector, but has much more room. var flash_scratchpad_at = 524288; var flash_blocksize = 65536; var flash_sendsize = 256; @@ -44,10 +44,12 @@ function QueueOperation( command, callback ) workqueue.push( vp ); } - +did_init = false; function init() { - var GPIOlines = ''; + if( did_init ) return; + did_init = true; + GPIOlines = ''; for(var i=0; i<16; ++i) GPIOlines += ""+ i + "" @@ -56,10 +58,11 @@ function init() $('#MainMenu > tbody:first-child').before( "\ \ - \ + \
\
\ -
\n
" ); +
\n " + ); $('#MainMenu > tbody:last-child').after( "\ \ @@ -118,16 +121,19 @@ function init() $("#custom_command_response").val( "" ); //Preclude drag and drop on rest of document in event user misses firmware boxes. - var donothing = function(e) {e.stopPropagation();e.preventDefault();}; + donothing = function(e) {e.stopPropagation();e.preventDefault();}; $(document).on('drop', donothing ); $(document).on('dragover', donothing ); $(document).on('dragenter', donothing ); output = document.getElementById("output"); - Ticker(); KickWifiTicker(); GPIODataTickerStart(); + InitSystemTicker(); + + console.log( "Load complete.\n" ); + Ticker(); } window.addEventListener("load", init, false); @@ -141,6 +147,7 @@ function StartWebSocket() workqueue = []; lastitem = null; websocket = new WebSocket(wsUri); + websocket.binaryType = 'arraybuffer'; websocket.onopen = function(evt) { onOpen(evt) }; websocket.onclose = function(evt) { onClose(evt) }; websocket.onmessage = function(evt) { onMessage(evt) }; @@ -161,7 +168,8 @@ function onClose(evt) var msg = 0; var tickmessage = 0; var lasthz = 0; -var time_since_hz = 0; +var time_since_hz = 10; //Make it realize it was disconnected to begin with. + function Ticker() { setTimeout( Ticker, 1000 ); @@ -203,17 +211,24 @@ function onMessage(evt) } + var rawdat = new Uint8Array(evt.data) + var stringdata = String.fromCharCode.apply(null, rawdat); + if( lastitem ) { if( lastitem.callback ) { - lastitem.callback( lastitem, evt.data ); + lastitem.callback( lastitem, stringdata, rawdat ); lastitem = null; } } else { - output.innerHTML = "

Messages: " + msg + "

RSSI: " + evt.data.substr(2) + "

"; + if( stringdata.length > 2 ) + { + var wxresp = stringdata.substr(2).split("\t"); + output.innerHTML = "

Messages: " + msg + "

RSSI: " + wxresp[0] + " / IP: " + ((wxresp.length>1)?HexToIP( wxresp[1] ):"") + "

"; + } } @@ -278,27 +293,27 @@ function IssueCustomCommand() function MakeDragDrop( divname, callback ) { var obj = $("#" + divname); - obj.on('dragenter', function (e) + obj.on('dragenter', function (e) { e.stopPropagation(); e.preventDefault(); $(this).css('border', '2px solid #0B85A1'); }); - obj.on('dragover', function (e) + obj.on('dragover', function (e) { e.stopPropagation(); e.preventDefault(); }); - obj.on('dragend', function (e) + obj.on('dragend', function (e) { e.stopPropagation(); e.preventDefault(); $(this).css('border', '2px dotted #0B85A1'); }); - obj.on('drop', function (e) + obj.on('drop', function (e) { $(this).css('border', '2px dotted #0B85A1'); e.preventDefault(); @@ -318,9 +333,108 @@ function MakeDragDrop( divname, callback ) /////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///Below here are mostly just events... -var did_wifi_get_config = false; -var is_data_ticker_running = false; -var is_waiting_on_stations = false; +var sysset = null; +var snchanged = false; +var sdchanged = false; + +var lastpeerdata = ""; + +function CallbackForPeers(req,data) +{ + if( data == lastpeerdata ) return; + lastpeerdata = data; + var lines = data.split( "\n" ); + var searchcount = 0; + if( lines.length > 0 ) + { + var line1 = lines[0].split( "\t" ); + if( line1.length > 1 ) searchcount = Number( line1[1] ); + } + + var htm = ""; + for( var i = 1; i < lines.length; i++ ) + { + var elems = lines[i].split( "\t" ); + if( elems.length < 4 ) continue; + IP = HexToIP( elems[0] ); + + htm += ""; + } + htm += "
AddressServiceNameDescription
" + IP + "" + elems[1] + "" + elems[2] + "" + elems[3] + "
"; + if( searchcount == 0 ) + { + htm += ""; + } + + $("#peers").html( htm ); +} + +function SysTickBack(req,data) +{ + var params = data.split( "\t" ); + if( !snchanged ) + { + $("#SystemName").prop( "value", params[3] ); + $("#SystemName").removeClass( "unsaved-input"); + } + if( !sdchanged ) + { + $("#SystemDescription").prop( "value", params[4] ); + $("#SystemDescription").removeClass( "unsaved-input"); + } + $("#ServiceName").html( params[5] ); + $("#FreeHeap").html( params[6] ); + + QueueOperation( "BL", CallbackForPeers ); +} + +function SystemInfoTick() +{ + if( IsTabOpen('SystemStatus') ) + { + QueueOperation( "I", SysTickBack ); + setTimeout( SystemInfoTick, 500 ); + } + else + { + //Stop. + } +} + +function SystemChangesReset() +{ + snchanged = false; + sdchanged = false; +} + +function SystemUncommittedChanges() +{ + if( sdchanged || snchanged ) return true; + else return false; +} + +function InitSystemTicker() +{ + sysset = document.getElementById( "systemsettings" ); + SystemInfoTick(); + sysset.innerHTML = "\ +
System Name:
System Description:
Service Name:
Free Heap:
\ + \ + \ + \ + \ + \ +

Search for others:

\ +
"; + $("#SystemName").on("input propertychange paste",function(){snchanged = true; $("#SystemName").addClass( "unsaved-input"); }); + $("#SystemDescription").on("input propertychange paste",function(){sdchanged = true;$("#SystemDescription").addClass( "unsaved-input"); }); +} + + + +did_wifi_get_config = false; +is_data_ticker_running = false; +is_waiting_on_stations = false; function ScanForWifi() { @@ -378,7 +492,7 @@ function WifiDataTicker() QueueOperation( "WI", function(req,data) { var params = data.split( "\t" ); - + var opmode = Number( params[0].substr(2) ); document.wifisection.wifitype.value = opmode; document.wifisection.wificurname.value = params[1]; @@ -394,6 +508,7 @@ function WifiDataTicker() QueueOperation( "WR", function(req,data) { var lines = data.split( "\n" ); var innerhtml; + if( data[0] == '!' ) return; //If no APs, don't deal with list. if( lines.length < 3 ) { @@ -425,7 +540,7 @@ function WifiDataTicker() innerhtml += ""; document.getElementById("WifiStations").innerHTML = innerhtml; } ); - setTimeout( WifiDataTicker, 12000 ); + setTimeout( WifiDataTicker, 500 ); } else { @@ -435,7 +550,7 @@ function WifiDataTicker() function ChangeWifiConfig() { - + var st = "W"; st += document.wifisection.wifitype.value; st += "\t" + document.wifisection.wificurname.value; @@ -549,7 +664,7 @@ function SystemPushImageProgress( is_ok, comment, pushop ) pushop.ctx.file1md5 = faultylabs.MD5( pushop.paddata ).toLowerCase(); var reader = new FileReader(); - reader.onload = function(e) { + reader.onload = function(e) { $("#innersystemflashtext").html( "Pusing second half..." ); PushImageTo( e.target.result, flash_scratchpad_at + 0x40000, SystemPushImageProgress, pushop.ctx ); } @@ -567,7 +682,7 @@ function SystemPushImageProgress( is_ok, comment, pushop ) var stf = "FM" + flash_scratchpad_at + "\t0\t" + f1s + "\t" + f1m + "\t" + (flash_scratchpad_at+0x40000) + "\t" + 0x40000 + "\t" + f2s + "\t" + f2m + "\n"; var fun = function( fsrd, flashresponse ) { $("#innerflashtext").html( (flashresponse[0] == '!')?"Flashing failed.":"Flash success." ) }; - QueueOperation( stf, fun); + QueueOperation( stf, fun); } return false; @@ -578,7 +693,7 @@ function SystemPushImageProgress( is_ok, comment, pushop ) function WebPagePushImageFunction( ok, comment, pushop ) -{ +{ if( pushop.place == pushop.padlen ) { $("#innersystemflashtext").html("Push complete. Reload page."); @@ -589,7 +704,7 @@ function WebPagePushImageFunction( ok, comment, pushop ) } return true; -} +} function DragDropSystemFiles( file ) { @@ -607,7 +722,7 @@ function DragDropSystemFiles( file ) var reader = new FileReader(); - reader.onload = function(e) { + reader.onload = function(e) { PushImageTo( e.target.result, mpfs_start_at, WebPagePushImageFunction ); } @@ -620,18 +735,19 @@ function DragDropSystemFiles( file ) for( var i = 0; i < file.length; i++ ) { - if( file[i].name.substr( 0, 7 ) == "0x00000" ) file1 = file[i]; - if( file[i].name.substr( 0, 7 ) == "0x40000" ) file2 = file[i]; + console.log( "Found: " + file[i].name ); + if( file[i].name.substr( 0, 17 ) == "image.elf-0x00000" ) file1 = file[i]; + if( file[i].name.substr( 0, 17 ) == "image.elf-0x40000" ) file2 = file[i]; } if( !file1 ) { - $("#innersystemflashtext").html( "Could not find a 0x00000... file." ); return; + $("#innersystemflashtext").html( "Could not find a image.elf-0x00000... file." ); return; } if( !file2 ) { - $("#innersystemflashtext").html( "Could not find a 0x40000... file." ); return; + $("#innersystemflashtext").html( "Could not find a image.elf-0x40000... file." ); return; } if( file1.size > 65536 ) @@ -650,7 +766,7 @@ function DragDropSystemFiles( file ) var reader = new FileReader(); - reader.onload = function(e) { + reader.onload = function(e) { var ctx = new Object(); ctx.file1 = file1; ctx.file2 = file2; @@ -682,6 +798,15 @@ function tohex8( c ) } +function HexToIP( hexstr ) +{ + if( !hexstr ) return ""; + return parseInt( hexstr.substr( 6, 2 ), 16 ) + "." + + parseInt( hexstr.substr( 4, 2 ), 16 ) + "." + + parseInt( hexstr.substr( 2, 2 ), 16 ) + "." + + parseInt( hexstr.substr( 0, 2 ), 16 ); +} + function ContinueSystemFlash( fsrd, flashresponse, pushop ) { if( flashresponse[0] == '!' ) From faa72a488b9d346a1bc1957315a2b16a66bcb9cf Mon Sep 17 00:00:00 2001 From: cnlohr Date: Wed, 21 Jun 2017 23:55:03 -0400 Subject: [PATCH 02/15] forgot to set key on save. --- embedded8266/user/custom_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/embedded8266/user/custom_commands.c b/embedded8266/user/custom_commands.c index be53a79..62d0ab4 100644 --- a/embedded8266/user/custom_commands.c +++ b/embedded8266/user/custom_commands.c @@ -199,6 +199,7 @@ int ICACHE_FLASH_ATTR CustomCommand(char * buffer, int retsize, char *pusrdata, if( gConfigurables[i] ) settings.configs[i] = *gConfigurables[i]; } + settings.SaveLoadKey = 0xAA; EnterCritical(); ets_intr_lock(); From 095ca6d4152cc74c61db0bcc8feefc2b76865fef Mon Sep 17 00:00:00 2001 From: cnlohr Date: Sat, 24 Jun 2017 02:13:01 -0400 Subject: [PATCH 03/15] remove unused references to settings.h --- embedded8266/user/custom_commands.c | 1 - embedded8266/user/user_main.c | 1 - 2 files changed, 2 deletions(-) diff --git a/embedded8266/user/custom_commands.c b/embedded8266/user/custom_commands.c index 62d0ab4..6832a76 100644 --- a/embedded8266/user/custom_commands.c +++ b/embedded8266/user/custom_commands.c @@ -4,7 +4,6 @@ #include #include "esp82xxutil.h" #include -#include #include #include diff --git a/embedded8266/user/user_main.c b/embedded8266/user/user_main.c index a67aa40..5b5267b 100644 --- a/embedded8266/user/user_main.c +++ b/embedded8266/user/user_main.c @@ -18,7 +18,6 @@ #include #include "ets_sys.h" #include "gpio.h" -#include "settings.h" //#define PROFILE #define PORT 7777 From 4dc15e13e2632028fc7f214aa79e3a55f8b3866f Mon Sep 17 00:00:00 2001 From: cnlohr Date: Sat, 8 Jul 2017 16:58:41 -0400 Subject: [PATCH 04/15] add hidapistuff --- colorchord2/DisplayHIDAPI.c | 242 +++ colorchord2/Makefile | 8 +- colorchord2/hidapi.c | 2918 +++++++++++++++++++++++++++++++++++ colorchord2/hidapi.conf | 30 + colorchord2/hidapi.h | 405 +++++ 5 files changed, 3599 insertions(+), 4 deletions(-) create mode 100644 colorchord2/DisplayHIDAPI.c create mode 100644 colorchord2/hidapi.c create mode 100644 colorchord2/hidapi.conf create mode 100644 colorchord2/hidapi.h diff --git a/colorchord2/DisplayHIDAPI.c b/colorchord2/DisplayHIDAPI.c new file mode 100644 index 0000000..40792a1 --- /dev/null +++ b/colorchord2/DisplayHIDAPI.c @@ -0,0 +1,242 @@ +//Copyright 2015 <>< Charles Lohr under the ColorChord License. + +#include "outdrivers.h" +#include "notefinder.h" +#include +#include +#include "parameters.h" +#include +#include "hidapi.h" +#include "color.h" +#include +#include + +struct HIDAPIOutDriver +{ + hid_device *devh; + int did_init; + int zigzag; + int total_leds; + int array; + float outamp; + uint8_t * last_leds; + int buffersize; + volatile int readyFlag; + int xn; + int yn; + int rot90; + int is_rgby; + int bank_size[4]; + int bank_id[4]; +}; + + +static void * LEDOutThread( void * v ) +{ + struct HIDAPIOutDriver * led = (struct HIDAPIOutDriver*)v; + while(1) + { + int total_bytes = led->buffersize; + total_bytes = ((total_bytes-2)&0xffc0) + 0x41; //Round up. + if( led->readyFlag ) + { +/* + int i; + printf( "%d -- ", total_bytes ); + for( i = 0; i < total_bytes; i++ ) + { + if( !( i & 0x0f ) ) printf( "\n" ); + printf( "%02x ", led->last_leds[i] ); + } + printf( "\n" ); +*/ + int r = hid_send_feature_report( led->devh, led->last_leds, total_bytes ); + if( r < 0 ) + { + led->did_init = 0; + printf( "Fault sending LEDs.\n" ); + } + led->readyFlag = 0; + } + usleep(100); + } + return 0; +} + +static void LEDUpdate(void * id, struct NoteFinder*nf) +{ + int i; + struct HIDAPIOutDriver * led = (struct HIDAPIOutDriver*)id; + + + if( !led->did_init ) + { + led->did_init = 1; + hid_init(); + + led->devh = hid_open( 0xabcd, 0xf104, 0 ); + + if( !led->devh ) + { + fprintf( stderr, "Error: Cannot find device.\n" ); +// exit( -98 ); + } + } + + int leds_this_round = 0; + int ledbid = 0; + + while( led->readyFlag ) usleep(100); + + int lastledplace = 1; + led->last_leds[0] = 0; + + int k = 0; + + //Advance the LEDs to this position when outputting the values. + for( i = 0; i < led->total_leds; i++ ) + { + int source = i; + if( !led->array ) + { + int sx, sy; + if( led->rot90 ) + { + sy = i % led->yn; + sx = i / led->yn; + } + else + { + sx = i % led->xn; + sy = i / led->xn; + } + + if( led->zigzag ) + { + if( led->rot90 ) + { + if( sx & 1 ) + { + sy = led->yn - sy - 1; + } + } + else + { + if( sy & 1 ) + { + sx = led->xn - sx - 1; + } + } + } + + if( led->rot90 ) + { + source = sx + sy * led->xn; + } + else + { + source = sx + sy * led->yn; + } + } + + + if( led->is_rgby ) + { + int r = OutLEDs[k++]; + int g = OutLEDs[k++]; + int b = OutLEDs[k++]; + int y = 0; + int rg_common; + if( r/2 > g ) rg_common = g; + else rg_common = r/2; + + if( rg_common > 255 ) rg_common = 255; + y = rg_common; + r -= rg_common; + g -= rg_common; + if( r < 0 ) r = 0; + if( g < 0 ) g = 0; + + + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = g * led->outamp; + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = r * led->outamp; + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = b * led->outamp; + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = y * led->outamp; + } + else + { + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = OutLEDs[source*3+1] * led->outamp; + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = OutLEDs[source*3+0] * led->outamp; + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = OutLEDs[source*3+2] * led->outamp; + } + //printf( "%3d -- %3d [%3d] == %d %d %d\n", ledbid, source, lastledplace, OutLEDs[source*3+1], OutLEDs[source*3+0], OutLEDs[source*3+2] ); + leds_this_round++; + while( leds_this_round >= led->bank_size[ledbid] ) + { + while( (lastledplace % 64) != 1 ) led->last_leds[lastledplace++] = 0; + ledbid++; + if( ledbid > 3 ) break; + if( led->bank_size[ledbid] != 0 ) + led->last_leds[lastledplace++] = led->bank_id[ledbid]; + else + continue; + leds_this_round = 0; + } + if( ledbid > 3 ) break; + } + led->buffersize = lastledplace; + + led->readyFlag = 1; +} + +static void LEDParams(void * id ) +{ + struct HIDAPIOutDriver * led = (struct HIDAPIOutDriver*)id; + + led->total_leds = GetParameterI( "leds", 300 ); + led->last_leds = malloc( led->total_leds * 5 + 4 ); + led->outamp = .1; RegisterValue( "ledoutamp", PAFLOAT, &led->outamp, sizeof( led->outamp ) ); + led->zigzag = 0; RegisterValue( "zigzag", PAINT, &led->zigzag, sizeof( led->zigzag ) ); + led->xn = 16; RegisterValue( "lightx", PAINT, &led->xn, sizeof( led->xn ) ); + led->yn = 9; RegisterValue( "lighty", PAINT, &led->yn, sizeof( led->yn ) ); + led->rot90 = 0; RegisterValue( "rot90", PAINT, &led->rot90, sizeof( led->rot90 ) ); + led->array = 0; RegisterValue( "ledarray", PAINT, &led->array, sizeof( led->array ) ); + led->is_rgby = 0; RegisterValue( "ledisrgby", PAINT, &led->is_rgby, sizeof( led->is_rgby ) ); + + led->bank_size[0] = 0; RegisterValue( "bank1_size", PAINT, &led->bank_size[0], sizeof( led->bank_size[0] ) ); + led->bank_size[1] = 0; RegisterValue( "bank2_size", PAINT, &led->bank_size[1], sizeof( led->bank_size[1] ) ); + led->bank_size[2] = 0; RegisterValue( "bank3_size", PAINT, &led->bank_size[2], sizeof( led->bank_size[2] ) ); + led->bank_size[3] = 0; RegisterValue( "bank4_size", PAINT, &led->bank_size[3], sizeof( led->bank_size[3] ) ); + led->bank_id[0] = 0; RegisterValue( "bank1_id", PAINT, &led->bank_id[0], sizeof( led->bank_id[0] ) ); + led->bank_id[1] = 0; RegisterValue( "bank2_id", PAINT, &led->bank_id[1], sizeof( led->bank_id[1] ) ); + led->bank_id[2] = 0; RegisterValue( "bank3_id", PAINT, &led->bank_id[2], sizeof( led->bank_id[2] ) ); + led->bank_id[3] = 0; RegisterValue( "bank4_id", PAINT, &led->bank_id[3], sizeof( led->bank_id[3] ) ); + + led->did_init = 0; +} + + +static struct DriverInstances * DisplayHIDAPI() +{ + struct DriverInstances * ret = malloc( sizeof( struct DriverInstances ) ); + memset( ret, 0, sizeof( struct DriverInstances ) ); + struct HIDAPIOutDriver * led = ret->id = malloc( sizeof( struct HIDAPIOutDriver ) ); + ret->Func = LEDUpdate; + ret->Params = LEDParams; + OGCreateThread( LEDOutThread, led ); + led->readyFlag = 0; + LEDParams( led ); + return ret; + +} + +REGISTER_OUT_DRIVER(DisplayHIDAPI); + + diff --git a/colorchord2/Makefile b/colorchord2/Makefile index e1c9ad3..5a7c35b 100644 --- a/colorchord2/Makefile +++ b/colorchord2/Makefile @@ -3,14 +3,14 @@ all : colorchord RAWDRAW:=DrawFunctions.o XDriver.o SOUND:=sound.o sound_alsa.o sound_pulse.o sound_null.o -OUTS := OutputVoronoi.o DisplayArray.o OutputLinear.o DisplayPie.o DisplayNetwork.o DisplayUSB2812.o DisplayDMX.o OutputProminent.o RecorderPlugin.o OutputCells.o +OUTS := OutputVoronoi.o DisplayArray.o OutputLinear.o DisplayPie.o DisplayNetwork.o DisplayUSB2812.o DisplayDMX.o OutputProminent.o RecorderPlugin.o DisplayHIDAPI.o hidapi.o OutputCells.o WINGCC:= i686-w64-mingw32-gcc WINGCCFLAGS:= -g -DICACHE_FLASH_ATTR= -I../embeddedcommon -I. -O1 #-O2 -Wl,--relax -Wl,--gc-sections -ffunction-sections -fdata-sections -WINLDFLAGS:=-lwinmm -lgdi32 -lws2_32 +WINLDFLAGS:=-lwinmm -lgdi32 -lws2_32 -lsetupapi RAWDRAWLIBS:=-lX11 -lm -lpthread -lXinerama -lXext -LDLIBS:=-lpthread -lasound -lm -lpulse-simple -lpulse +LDLIBS:=-lpthread -lasound -lm -lpulse-simple -lpulse -ludev CFLAGS:=-g -Os -flto -Wall -ffast-math -I../embeddedcommon -I. -DICACHE_FLASH_ATTR= @@ -19,7 +19,7 @@ EXTRALIBS:=-lusb-1.0 colorchord : os_generic.o main.o dft.o decompose.o filter.o color.o notefinder.o util.o outdrivers.o $(RAWDRAW) $(SOUND) $(OUTS) parameters.o chash.o hook.o ../embeddedcommon/DFT32.o configs.o gcc -o $@ $^ $(CFLAGS) $(LDLIBS) $(EXTRALIBS) $(RAWDRAWLIBS) -colorchord.exe : os_generic.c main.c dft.c decompose.c filter.c color.c notefinder.c util.c outdrivers.c DrawFunctions.c parameters.c chash.c WinDriver.c sound.c sound_null.c sound_win.c OutputVoronoi.c DisplayArray.c OutputLinear.c DisplayPie.c DisplayNetwork.c hook.c RecorderPlugin.c ../embeddedcommon/DFT32.c OutputCells.c configs.c +colorchord.exe : os_generic.c main.c dft.c decompose.c filter.c color.c notefinder.c util.c outdrivers.c DrawFunctions.c parameters.c chash.c WinDriver.c sound.c sound_null.c sound_win.c OutputVoronoi.c DisplayArray.c OutputLinear.c DisplayPie.c DisplayNetwork.c hook.c RecorderPlugin.c ../embeddedcommon/DFT32.c OutputCells.c configs.c hidapi.c DisplayHIDAPI.c $(WINGCC) $(WINGCCFLAGS) -o $@ $^ $(WINLDFLAGS) diff --git a/colorchord2/hidapi.c b/colorchord2/hidapi.c new file mode 100644 index 0000000..ceb7832 --- /dev/null +++ b/colorchord2/hidapi.c @@ -0,0 +1,2918 @@ +#ifdef _WIN32 + +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 8/22/2009 + + Copyright 2009, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + + +/* Copy of LICENSE-orig.txt (compatible with MIT/x11 license) + + HIDAPI - Multi-Platform library for + communication with HID devices. + + Copyright 2009, Alan Ott, Signal 11 Software. + All Rights Reserved. + + This software may be used by anyone for any reason so + long as the copyright notice in the source files + remains intact. +*/ + +#include + +#ifndef _NTDEF_ +typedef LONG NTSTATUS; +#endif + +#ifdef __MINGW32__ +#include +#include +#endif + +#ifdef __CYGWIN__ +#include +#define _wcsdup wcsdup +#endif + +/* The maximum number of characters that can be passed into the + HidD_Get*String() functions without it failing.*/ +#define MAX_STRING_WCHARS 0xFFF + +/*#define HIDAPI_USE_DDK*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef TCC + typedef struct _SP_DEVINFO_DATA { + DWORD cbSize; + GUID ClassGuid; + DWORD DevInst; + ULONG_PTR Reserved; + } SP_DEVINFO_DATA, *PSP_DEVINFO_DATA; + typedef struct _SP_DEVICE_INTERFACE_DATA { + DWORD cbSize; + GUID InterfaceClassGuid; + DWORD Flags; + ULONG_PTR Reserved; + } SP_DEVICE_INTERFACE_DATA, *PSP_DEVICE_INTERFACE_DATA; + typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA { + DWORD cbSize; + CHAR DevicePath[ANYSIZE_ARRAY]; + } SP_DEVICE_INTERFACE_DETAIL_DATA_A, *PSP_DEVICE_INTERFACE_DETAIL_DATA_A; + typedef PVOID HDEVINFO; + + HDEVINFO WINAPI SetupDiGetClassDevsA(CONST GUID*,PCSTR,HWND,DWORD); + + #define DIGCF_PRESENT 0x00000002 + #define DIGCF_DEVICEINTERFACE 0x00000010 + #define SPDRP_CLASS 7 + #define SPDRP_DRIVER 9 + #define FILE_DEVICE_KEYBOARD 0x0000000b + #define METHOD_OUT_DIRECT 2 + enum + { FILE_ANY_ACCESS = 0x00000000UL, + FILE_SPECIAL_ACCESS = FILE_ANY_ACCESS, + FILE_READ_ACCESS = 0x00000001UL, + FILE_WRITE_ACCESS = 0x00000002UL + }; + #define CTL_CODE(t,f,m,a) (((t)<<16)|((a)<<14)|((f)<<2)|(m)) + +#else + #include + #include +#endif + #ifdef HIDAPI_USE_DDK + #include + #endif + + /* Copied from inc/ddk/hidclass.h, part of the Windows DDK. */ + #define HID_OUT_CTL_CODE(id) \ + CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + #define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include +#include + + +#include "hidapi.h" + +#undef MIN +#define MIN(x,y) ((x) < (y)? (x): (y)) + +#ifdef _MSC_VER + /* Thanks Microsoft, but I know how to use strncpy(). */ + #pragma warning(disable:4996) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef HIDAPI_USE_DDK + /* Since we're not building with the DDK, and the HID header + files aren't part of the SDK, we have to define all this + stuff here. In lookup_functions(), the function pointers + defined below are set. */ + typedef struct _HIDD_ATTRIBUTES{ + ULONG Size; + USHORT VendorID; + USHORT ProductID; + USHORT VersionNumber; + } HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; + + typedef USHORT USAGE; + typedef struct _HIDP_CAPS { + USAGE Usage; + USAGE UsagePage; + USHORT InputReportByteLength; + USHORT OutputReportByteLength; + USHORT FeatureReportByteLength; + USHORT Reserved[17]; + USHORT fields_not_used_by_hidapi[10]; + } HIDP_CAPS, *PHIDP_CAPS; + typedef void* PHIDP_PREPARSED_DATA; + #define HIDP_STATUS_SUCCESS 0x110000 + + typedef BOOLEAN (__stdcall *HidD_GetAttributes_)(HANDLE device, PHIDD_ATTRIBUTES attrib); + typedef BOOLEAN (__stdcall *HidD_GetSerialNumberString_)(HANDLE device, PVOID buffer, ULONG buffer_len); + typedef BOOLEAN (__stdcall *HidD_GetManufacturerString_)(HANDLE handle, PVOID buffer, ULONG buffer_len); + typedef BOOLEAN (__stdcall *HidD_GetProductString_)(HANDLE handle, PVOID buffer, ULONG buffer_len); + typedef BOOLEAN (__stdcall *HidD_SetFeature_)(HANDLE handle, PVOID data, ULONG length); + typedef BOOLEAN (__stdcall *HidD_GetFeature_)(HANDLE handle, PVOID data, ULONG length); + typedef BOOLEAN (__stdcall *HidD_GetIndexedString_)(HANDLE handle, ULONG string_index, PVOID buffer, ULONG buffer_len); + typedef BOOLEAN (__stdcall *HidD_GetPreparsedData_)(HANDLE handle, PHIDP_PREPARSED_DATA *preparsed_data); + typedef BOOLEAN (__stdcall *HidD_FreePreparsedData_)(PHIDP_PREPARSED_DATA preparsed_data); + typedef NTSTATUS (__stdcall *HidP_GetCaps_)(PHIDP_PREPARSED_DATA preparsed_data, HIDP_CAPS *caps); + typedef BOOLEAN (__stdcall *HidD_SetNumInputBuffers_)(HANDLE handle, ULONG number_buffers); + + static HidD_GetAttributes_ HidD_GetAttributes; + static HidD_GetSerialNumberString_ HidD_GetSerialNumberString; + static HidD_GetManufacturerString_ HidD_GetManufacturerString; + static HidD_GetProductString_ HidD_GetProductString; + static HidD_SetFeature_ HidD_SetFeature; + static HidD_GetFeature_ HidD_GetFeature; + static HidD_GetIndexedString_ HidD_GetIndexedString; + static HidD_GetPreparsedData_ HidD_GetPreparsedData; + static HidD_FreePreparsedData_ HidD_FreePreparsedData; + static HidP_GetCaps_ HidP_GetCaps; + static HidD_SetNumInputBuffers_ HidD_SetNumInputBuffers; + + static HMODULE lib_handle = NULL; + static BOOLEAN initialized = FALSE; +#endif /* HIDAPI_USE_DDK */ + +struct hid_device_ { + HANDLE device_handle; + BOOL blocking; + USHORT output_report_length; + size_t input_report_length; + void *last_error_str; + DWORD last_error_num; + BOOL read_pending; + char *read_buf; + OVERLAPPED ol; +}; + +static hid_device *new_hid_device() +{ + hid_device *dev = (hid_device*) calloc(1, sizeof(hid_device)); + dev->device_handle = INVALID_HANDLE_VALUE; + dev->blocking = TRUE; + dev->output_report_length = 0; + dev->input_report_length = 0; + dev->last_error_str = NULL; + dev->last_error_num = 0; + dev->read_pending = FALSE; + dev->read_buf = NULL; + memset(&dev->ol, 0, sizeof(dev->ol)); + dev->ol.hEvent = CreateEvent(NULL, FALSE, FALSE /*initial state f=nonsignaled*/, NULL); + + return dev; +} + +static void free_hid_device(hid_device *dev) +{ + CloseHandle(dev->ol.hEvent); + CloseHandle(dev->device_handle); + LocalFree(dev->last_error_str); + free(dev->read_buf); + free(dev); +} + +static void register_error(hid_device *device, const char *op) +{ + WCHAR *ptr, *msg; + + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPVOID)&msg, 0/*sz*/, + NULL); + + /* Get rid of the CR and LF that FormatMessage() sticks at the + end of the message. Thanks Microsoft! */ + ptr = msg; + while (*ptr) { + if (*ptr == '\r') { + *ptr = 0x0000; + break; + } + ptr++; + } + + /* Store the message off in the Device entry so that + the hid_error() function can pick it up. */ + LocalFree(device->last_error_str); + device->last_error_str = msg; +} + +#ifndef HIDAPI_USE_DDK +static int lookup_functions() +{ + lib_handle = LoadLibraryA("hid.dll"); + if (lib_handle) { +#define RESOLVE(x) x = (x##_)GetProcAddress(lib_handle, #x); if (!x) return -1; + RESOLVE(HidD_GetAttributes); + RESOLVE(HidD_GetSerialNumberString); + RESOLVE(HidD_GetManufacturerString); + RESOLVE(HidD_GetProductString); + RESOLVE(HidD_SetFeature); + RESOLVE(HidD_GetFeature); + RESOLVE(HidD_GetIndexedString); + RESOLVE(HidD_GetPreparsedData); + RESOLVE(HidD_FreePreparsedData); + RESOLVE(HidP_GetCaps); + RESOLVE(HidD_SetNumInputBuffers); +#undef RESOLVE + } + else + return -1; + + return 0; +} +#endif + +static HANDLE open_device(const char *path, BOOL enumerate) +{ + HANDLE handle; + DWORD desired_access = (enumerate)? 0: (GENERIC_WRITE | GENERIC_READ); + DWORD share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE; + + handle = CreateFileA(path, + desired_access, + share_mode, + NULL, + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED,/*FILE_ATTRIBUTE_NORMAL,*/ + 0); + + return handle; +} + +int HID_API_EXPORT hid_init(void) +{ +#ifndef HIDAPI_USE_DDK + if (!initialized) { + if (lookup_functions() < 0) { + hid_exit(); + return -1; + } + initialized = TRUE; + } +#endif + return 0; +} + +int HID_API_EXPORT hid_exit(void) +{ +#ifndef HIDAPI_USE_DDK + if (lib_handle) + FreeLibrary(lib_handle); + lib_handle = NULL; + initialized = FALSE; +#endif + return 0; +} + +struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id) +{ + BOOL res; + struct hid_device_info *root = NULL; /* return object */ + struct hid_device_info *cur_dev = NULL; + + /* Windows objects for interacting with the driver. */ + GUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30} }; + SP_DEVINFO_DATA devinfo_data; + SP_DEVICE_INTERFACE_DATA device_interface_data; + SP_DEVICE_INTERFACE_DETAIL_DATA_A *device_interface_detail_data = NULL; + HDEVINFO device_info_set = INVALID_HANDLE_VALUE; + int device_index = 0; + int i; + + if (hid_init() < 0) + return NULL; + + /* Initialize the Windows objects. */ + memset(&devinfo_data, 0x0, sizeof(devinfo_data)); + devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA); + device_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + + /* Get information for all the devices belonging to the HID class. */ + device_info_set = SetupDiGetClassDevsA(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + + /* Iterate over each device in the HID class, looking for the right one. */ + + for (;;) { + HANDLE write_handle = INVALID_HANDLE_VALUE; + DWORD required_size = 0; + HIDD_ATTRIBUTES attrib; + + res = SetupDiEnumDeviceInterfaces(device_info_set, + NULL, + &InterfaceClassGuid, + device_index, + &device_interface_data); + + if (!res) { + /* A return of FALSE from this function means that + there are no more devices. */ + break; + } + + /* Call with 0-sized detail size, and let the function + tell us how long the detail struct needs to be. The + size is put in &required_size. */ + res = SetupDiGetDeviceInterfaceDetailA(device_info_set, + &device_interface_data, + NULL, + 0, + &required_size, + NULL); + + /* Allocate a long enough structure for device_interface_detail_data. */ + device_interface_detail_data = (SP_DEVICE_INTERFACE_DETAIL_DATA_A*) malloc(required_size); + device_interface_detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); + + /* Get the detailed data for this device. The detail data gives us + the device path for this device, which is then passed into + CreateFile() to get a handle to the device. */ + res = SetupDiGetDeviceInterfaceDetailA(device_info_set, + &device_interface_data, + device_interface_detail_data, + required_size, + NULL, + NULL); + + if (!res) { + /* register_error(dev, "Unable to call SetupDiGetDeviceInterfaceDetail"); + Continue to the next device. */ + goto cont; + } + + /* Make sure this device is of Setup Class "HIDClass" and has a + driver bound to it. */ + for (i = 0; ; i++) { + char driver_name[256]; + + /* Populate devinfo_data. This function will return failure + when there are no more interfaces left. */ + res = SetupDiEnumDeviceInfo(device_info_set, i, &devinfo_data); + if (!res) + goto cont; + + res = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data, + SPDRP_CLASS, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL); + if (!res) + goto cont; + + if (strcmp(driver_name, "HIDClass") == 0) { + /* See if there's a driver bound. */ + res = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data, + SPDRP_DRIVER, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL); + if (res) + break; + } + } + + //wprintf(L"HandleName: %s\n", device_interface_detail_data->DevicePath); + + /* Open a handle to the device */ + write_handle = open_device(device_interface_detail_data->DevicePath, TRUE); + + /* Check validity of write_handle. */ + if (write_handle == INVALID_HANDLE_VALUE) { + /* Unable to open the device. */ + //register_error(dev, "CreateFile"); + goto cont_close; + } + + + /* Get the Vendor ID and Product ID for this device. */ + attrib.Size = sizeof(HIDD_ATTRIBUTES); + HidD_GetAttributes(write_handle, &attrib); + //wprintf(L"Product/Vendor: %x %x\n", attrib.ProductID, attrib.VendorID); + + /* Check the VID/PID to see if we should add this + device to the enumeration list. */ + if ((vendor_id == 0x0 || attrib.VendorID == vendor_id) && + (product_id == 0x0 || attrib.ProductID == product_id)) { + + #define WSTR_LEN 512 + const char *str; + struct hid_device_info *tmp; + PHIDP_PREPARSED_DATA pp_data = NULL; + HIDP_CAPS caps; + BOOLEAN res; + NTSTATUS nt_res; + wchar_t wstr[WSTR_LEN]; /* TODO: Determine Size */ + size_t len; + + /* VID/PID match. Create the record. */ + tmp = (struct hid_device_info*) calloc(1, sizeof(struct hid_device_info)); + if (cur_dev) { + cur_dev->next = tmp; + } + else { + root = tmp; + } + cur_dev = tmp; + + /* Get the Usage Page and Usage for this device. */ + res = HidD_GetPreparsedData(write_handle, &pp_data); + if (res) { + nt_res = HidP_GetCaps(pp_data, &caps); + if (nt_res == HIDP_STATUS_SUCCESS) { + cur_dev->usage_page = caps.UsagePage; + cur_dev->usage = caps.Usage; + } + + HidD_FreePreparsedData(pp_data); + } + + /* Fill out the record */ + cur_dev->next = NULL; + str = device_interface_detail_data->DevicePath; + if (str) { + len = strlen(str); + cur_dev->path = (char*) calloc(len+1, sizeof(char)); + strncpy(cur_dev->path, str, len+1); + cur_dev->path[len] = '\0'; + } + else + cur_dev->path = NULL; + + /* Serial Number */ + res = HidD_GetSerialNumberString(write_handle, wstr, sizeof(wstr)); + wstr[WSTR_LEN-1] = 0x0000; + if (res) { + cur_dev->serial_number = _wcsdup(wstr); + } + + /* Manufacturer String */ + res = HidD_GetManufacturerString(write_handle, wstr, sizeof(wstr)); + wstr[WSTR_LEN-1] = 0x0000; + if (res) { + cur_dev->manufacturer_string = _wcsdup(wstr); + } + + /* Product String */ + res = HidD_GetProductString(write_handle, wstr, sizeof(wstr)); + wstr[WSTR_LEN-1] = 0x0000; + if (res) { + cur_dev->product_string = _wcsdup(wstr); + } + + /* VID/PID */ + cur_dev->vendor_id = attrib.VendorID; + cur_dev->product_id = attrib.ProductID; + + /* Release Number */ + cur_dev->release_number = attrib.VersionNumber; + + /* Interface Number. It can sometimes be parsed out of the path + on Windows if a device has multiple interfaces. See + http://msdn.microsoft.com/en-us/windows/hardware/gg487473 or + search for "Hardware IDs for HID Devices" at MSDN. If it's not + in the path, it's set to -1. */ + cur_dev->interface_number = -1; + if (cur_dev->path) { + char *interface_component = strstr(cur_dev->path, "&mi_"); + if (interface_component) { + char *hex_str = interface_component + 4; + char *endptr = NULL; + cur_dev->interface_number = strtol(hex_str, &endptr, 16); + if (endptr == hex_str) { + /* The parsing failed. Set interface_number to -1. */ + cur_dev->interface_number = -1; + } + } + } + } + +cont_close: + CloseHandle(write_handle); +cont: + /* We no longer need the detail data. It can be freed */ + free(device_interface_detail_data); + + device_index++; + + } + + /* Close the device information handle. */ + SetupDiDestroyDeviceInfoList(device_info_set); + + return root; + +} + +void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs) +{ + /* TODO: Merge this with the Linux version. This function is platform-independent. */ + struct hid_device_info *d = devs; + while (d) { + struct hid_device_info *next = d->next; + free(d->path); + free(d->serial_number); + free(d->manufacturer_string); + free(d->product_string); + free(d); + d = next; + } +} + + +HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) +{ + /* TODO: Merge this functions with the Linux version. This function should be platform independent. */ + struct hid_device_info *devs, *cur_dev; + const char *path_to_open = NULL; + hid_device *handle = NULL; + + devs = hid_enumerate(vendor_id, product_id); + cur_dev = devs; + while (cur_dev) { + if (cur_dev->vendor_id == vendor_id && + cur_dev->product_id == product_id) { + if (serial_number) { + if (wcscmp(serial_number, cur_dev->serial_number) == 0) { + path_to_open = cur_dev->path; + break; + } + } + else { + path_to_open = cur_dev->path; + break; + } + } + cur_dev = cur_dev->next; + } + + if (path_to_open) { + /* Open the device */ + handle = hid_open_path(path_to_open); + } + + hid_free_enumeration(devs); + + return handle; +} + +HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path) +{ + hid_device *dev; + HIDP_CAPS caps; + PHIDP_PREPARSED_DATA pp_data = NULL; + BOOLEAN res; + NTSTATUS nt_res; + + if (hid_init() < 0) { + return NULL; + } + + dev = new_hid_device(); + + /* Open a handle to the device */ + dev->device_handle = open_device(path, FALSE); + + /* Check validity of write_handle. */ + if (dev->device_handle == INVALID_HANDLE_VALUE) { + /* Unable to open the device. */ + register_error(dev, "CreateFile"); + goto err; + } + + /* Set the Input Report buffer size to 64 reports. */ + res = HidD_SetNumInputBuffers(dev->device_handle, 64); + if (!res) { + register_error(dev, "HidD_SetNumInputBuffers"); + goto err; + } + + /* Get the Input Report length for the device. */ + res = HidD_GetPreparsedData(dev->device_handle, &pp_data); + if (!res) { + register_error(dev, "HidD_GetPreparsedData"); + goto err; + } + nt_res = HidP_GetCaps(pp_data, &caps); + if (nt_res != HIDP_STATUS_SUCCESS) { + register_error(dev, "HidP_GetCaps"); + goto err_pp_data; + } + dev->output_report_length = caps.OutputReportByteLength; + dev->input_report_length = caps.InputReportByteLength; + HidD_FreePreparsedData(pp_data); + + dev->read_buf = (char*) malloc(dev->input_report_length); + + return dev; + +err_pp_data: + HidD_FreePreparsedData(pp_data); +err: + free_hid_device(dev); + return NULL; +} + +int HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char *data, size_t length) +{ + DWORD bytes_written; + BOOL res; + + OVERLAPPED ol; + unsigned char *buf; + memset(&ol, 0, sizeof(ol)); + + /* Make sure the right number of bytes are passed to WriteFile. Windows + expects the number of bytes which are in the _longest_ report (plus + one for the report number) bytes even if the data is a report + which is shorter than that. Windows gives us this value in + caps.OutputReportByteLength. If a user passes in fewer bytes than this, + create a temporary buffer which is the proper size. */ + if (length >= dev->output_report_length) { + /* The user passed the right number of bytes. Use the buffer as-is. */ + buf = (unsigned char *) data; + } else { + /* Create a temporary buffer and copy the user's data + into it, padding the rest with zeros. */ + buf = (unsigned char *) malloc(dev->output_report_length); + memcpy(buf, data, length); + memset(buf + length, 0, dev->output_report_length - length); + length = dev->output_report_length; + } + + res = WriteFile(dev->device_handle, buf, (DWORD)length, NULL, &ol); + int err = GetLastError(); + + if (!res) { + if (err != ERROR_IO_PENDING) { + /* WriteFile() failed. Return error. */ + register_error(dev, "WriteFile"); + bytes_written = -1; + goto end_of_function; + } + } + + /* Wait here until the write is done. This makes + hid_write() synchronous. */ + res = GetOverlappedResult(dev->device_handle, &ol, &bytes_written, TRUE/*wait*/); + if (!res) { + /* The Write operation failed. */ + register_error(dev, "WriteFile"); + bytes_written = -1; + goto end_of_function; + } + +end_of_function: + if (buf != data) + free(buf); + + return bytes_written; +} + + +int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) +{ + DWORD bytes_read = 0; + size_t copy_len = 0; + BOOL res; + + /* Copy the handle for convenience. */ + HANDLE ev = dev->ol.hEvent; + + if (!dev->read_pending) { + /* Start an Overlapped I/O read. */ + dev->read_pending = TRUE; + memset(dev->read_buf, 0, dev->input_report_length); + ResetEvent(ev); + res = ReadFile(dev->device_handle, dev->read_buf, (DWORD)dev->input_report_length, &bytes_read, &dev->ol); + + if (!res) { + if (GetLastError() != ERROR_IO_PENDING) { + /* ReadFile() has failed. + Clean up and return error. */ + CancelIo(dev->device_handle); + dev->read_pending = FALSE; + goto end_of_function; + } + } + } + + if (milliseconds >= 0) { + /* See if there is any data yet. */ + res = WaitForSingleObject(ev, milliseconds); + if (res != WAIT_OBJECT_0) { + /* There was no data this time. Return zero bytes available, + but leave the Overlapped I/O running. */ + return 0; + } + } + + /* Either WaitForSingleObject() told us that ReadFile has completed, or + we are in non-blocking mode. Get the number of bytes read. The actual + data has been copied to the data[] array which was passed to ReadFile(). */ + res = GetOverlappedResult(dev->device_handle, &dev->ol, &bytes_read, TRUE/*wait*/); + + /* Set pending back to false, even if GetOverlappedResult() returned error. */ + dev->read_pending = FALSE; + + if (res && bytes_read > 0) { + if (dev->read_buf[0] == 0x0) { + /* If report numbers aren't being used, but Windows sticks a report + number (0x0) on the beginning of the report anyway. To make this + work like the other platforms, and to make it work more like the + HID spec, we'll skip over this byte. */ + bytes_read--; + copy_len = length > bytes_read ? bytes_read : length; + memcpy(data, dev->read_buf+1, copy_len); + } + else { + /* Copy the whole buffer, report number and all. */ + copy_len = length > bytes_read ? bytes_read : length; + memcpy(data, dev->read_buf, copy_len); + } + } + +end_of_function: + if (!res) { + register_error(dev, "GetOverlappedResult"); + return -1; + } + + return (int)copy_len; +} + +int HID_API_EXPORT HID_API_CALL hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); +} + +int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *dev, int nonblock) +{ + dev->blocking = !nonblock; + return 0; /* Success */ +} + +int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) +{ + BOOL res = HidD_SetFeature(dev->device_handle, (PVOID)data, (ULONG)length); + if (!res) { + register_error(dev, "HidD_SetFeature"); + return -1; + } + + return (int)length; +} + + +int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) +{ + BOOL res; +#if 0 + res = HidD_GetFeature(dev->device_handle, data, length); + if (!res) { + register_error(dev, "HidD_GetFeature"); + return -1; + } + return 0; /* HidD_GetFeature() doesn't give us an actual length, unfortunately */ +#else + DWORD bytes_returned; + + OVERLAPPED ol; + memset(&ol, 0, sizeof(ol)); + + res = DeviceIoControl(dev->device_handle, + IOCTL_HID_GET_FEATURE, + data, (DWORD)length, + data, (DWORD)length, + &bytes_returned, &ol); + + if (!res) { + if (GetLastError() != ERROR_IO_PENDING) { + /* DeviceIoControl() failed. Return error. */ + register_error(dev, "Send Feature Report DeviceIoControl"); + return -1; + } + } + + /* Wait here until the write is done. This makes + hid_get_feature_report() synchronous. */ + res = GetOverlappedResult(dev->device_handle, &ol, &bytes_returned, TRUE/*wait*/); + if (!res) { + /* The operation failed. */ + register_error(dev, "Send Feature Report GetOverLappedResult"); + return -1; + } + + /* bytes_returned does not include the first byte which contains the + report ID. The data buffer actually contains one more byte than + bytes_returned. */ + bytes_returned++; + + return bytes_returned; +#endif +} + +void HID_API_EXPORT HID_API_CALL hid_close(hid_device *dev) +{ + if (!dev) + return; + CancelIo(dev->device_handle); + free_hid_device(dev); +} + +int HID_API_EXPORT_CALL HID_API_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + BOOL res; + + res = HidD_GetManufacturerString(dev->device_handle, string, (ULONG)(sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS))); + if (!res) { + register_error(dev, "HidD_GetManufacturerString"); + return -1; + } + + return 0; +} + +int HID_API_EXPORT_CALL HID_API_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + BOOL res; + + res = HidD_GetProductString(dev->device_handle, string, (ULONG)(sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS))); + if (!res) { + register_error(dev, "HidD_GetProductString"); + return -1; + } + + return 0; +} + +int HID_API_EXPORT_CALL HID_API_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + BOOL res; + + res = HidD_GetSerialNumberString(dev->device_handle, string, (ULONG)(sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS))); + if (!res) { + register_error(dev, "HidD_GetSerialNumberString"); + return -1; + } + + return 0; +} + +int HID_API_EXPORT_CALL HID_API_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) +{ + BOOL res; + + res = HidD_GetIndexedString(dev->device_handle, string_index, string, (ULONG)(sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS))); + if (!res) { + register_error(dev, "HidD_GetIndexedString"); + return -1; + } + + return 0; +} + + +HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) +{ + return (wchar_t*)dev->last_error_str; +} + + +/*#define PICPGM*/ +/*#define S11*/ +#define P32 +#ifdef S11 + unsigned short VendorID = 0xa0a0; + unsigned short ProductID = 0x0001; +#endif + +#ifdef P32 + unsigned short VendorID = 0x04d8; + unsigned short ProductID = 0x3f; +#endif + + +#ifdef PICPGM + unsigned short VendorID = 0x04d8; + unsigned short ProductID = 0x0033; +#endif + + +#if 0 +int __cdecl main(int argc, char* argv[]) +{ + int res; + unsigned char buf[65]; + + UNREFERENCED_PARAMETER(argc); + UNREFERENCED_PARAMETER(argv); + + /* Set up the command buffer. */ + memset(buf,0x00,sizeof(buf)); + buf[0] = 0; + buf[1] = 0x81; + + + /* Open the device. */ + int handle = open(VendorID, ProductID, L"12345"); + if (handle < 0) + printf("unable to open device\n"); + + + /* Toggle LED (cmd 0x80) */ + buf[1] = 0x80; + res = write(handle, buf, 65); + if (res < 0) + printf("Unable to write()\n"); + + /* Request state (cmd 0x81) */ + buf[1] = 0x81; + write(handle, buf, 65); + if (res < 0) + printf("Unable to write() (2)\n"); + + /* Read requested state */ + read(handle, buf, 65); + if (res < 0) + printf("Unable to read()\n"); + + /* Print out the returned buffer. */ + for (int i = 0; i < 4; i++) + printf("buf[%d]: %d\n", i, buf[i]); + + return 0; +} +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#elif defined( __MACOSX__ ) + +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 2010-07-03 + + Copyright 2010, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + +/* See Apple Technical Note TN2187 for details on IOHidManager. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hidapi.h" + +/* Barrier implementation because Mac OSX doesn't have pthread_barrier. + It also doesn't have clock_gettime(). So much for POSIX and SUSv2. + This implementation came from Brent Priddy and was posted on + StackOverflow. It is used with his permission. */ +typedef int pthread_barrierattr_t; +typedef struct pthread_barrier { + pthread_mutex_t mutex; + pthread_cond_t cond; + int count; + int trip_count; +} pthread_barrier_t; + +static int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) +{ + if(count == 0) { + errno = EINVAL; + return -1; + } + + if(pthread_mutex_init(&barrier->mutex, 0) < 0) { + return -1; + } + if(pthread_cond_init(&barrier->cond, 0) < 0) { + pthread_mutex_destroy(&barrier->mutex); + return -1; + } + barrier->trip_count = count; + barrier->count = 0; + + return 0; +} + +static int pthread_barrier_destroy(pthread_barrier_t *barrier) +{ + pthread_cond_destroy(&barrier->cond); + pthread_mutex_destroy(&barrier->mutex); + return 0; +} + +static int pthread_barrier_wait(pthread_barrier_t *barrier) +{ + pthread_mutex_lock(&barrier->mutex); + ++(barrier->count); + if(barrier->count >= barrier->trip_count) + { + barrier->count = 0; + pthread_cond_broadcast(&barrier->cond); + pthread_mutex_unlock(&barrier->mutex); + return 1; + } + else + { + pthread_cond_wait(&barrier->cond, &(barrier->mutex)); + pthread_mutex_unlock(&barrier->mutex); + return 0; + } +} + +static int return_data(hid_device *dev, unsigned char *data, size_t length); + +/* Linked List of input reports received from the device. */ +struct input_report { + uint8_t *data; + size_t len; + struct input_report *next; +}; + +struct hid_device_ { + IOHIDDeviceRef device_handle; + int blocking; + int uses_numbered_reports; + int disconnected; + CFStringRef run_loop_mode; + CFRunLoopRef run_loop; + CFRunLoopSourceRef source; + uint8_t *input_report_buf; + CFIndex max_input_report_len; + struct input_report *input_reports; + + pthread_t thread; + pthread_mutex_t mutex; /* Protects input_reports */ + pthread_cond_t condition; + pthread_barrier_t barrier; /* Ensures correct startup sequence */ + pthread_barrier_t shutdown_barrier; /* Ensures correct shutdown sequence */ + int shutdown_thread; +}; + +static hid_device *new_hid_device(void) +{ + hid_device *dev = calloc(1, sizeof(hid_device)); + dev->device_handle = NULL; + dev->blocking = 1; + dev->uses_numbered_reports = 0; + dev->disconnected = 0; + dev->run_loop_mode = NULL; + dev->run_loop = NULL; + dev->source = NULL; + dev->input_report_buf = NULL; + dev->input_reports = NULL; + dev->shutdown_thread = 0; + + /* Thread objects */ + pthread_mutex_init(&dev->mutex, NULL); + pthread_cond_init(&dev->condition, NULL); + pthread_barrier_init(&dev->barrier, NULL, 2); + pthread_barrier_init(&dev->shutdown_barrier, NULL, 2); + + return dev; +} + +static void free_hid_device(hid_device *dev) +{ + if (!dev) + return; + + /* Delete any input reports still left over. */ + struct input_report *rpt = dev->input_reports; + while (rpt) { + struct input_report *next = rpt->next; + free(rpt->data); + free(rpt); + rpt = next; + } + + /* Free the string and the report buffer. The check for NULL + is necessary here as CFRelease() doesn't handle NULL like + free() and others do. */ + if (dev->run_loop_mode) + CFRelease(dev->run_loop_mode); + if (dev->source) + CFRelease(dev->source); + free(dev->input_report_buf); + + /* Clean up the thread objects */ + pthread_barrier_destroy(&dev->shutdown_barrier); + pthread_barrier_destroy(&dev->barrier); + pthread_cond_destroy(&dev->condition); + pthread_mutex_destroy(&dev->mutex); + + /* Free the structure itself. */ + free(dev); +} + +static IOHIDManagerRef hid_mgr = 0x0; + + +#if 0 +static void register_error(hid_device *device, const char *op) +{ + +} +#endif + + +static int32_t get_int_property(IOHIDDeviceRef device, CFStringRef key) +{ + CFTypeRef ref; + int32_t value; + + ref = IOHIDDeviceGetProperty(device, key); + if (ref) { + if (CFGetTypeID(ref) == CFNumberGetTypeID()) { + CFNumberGetValue((CFNumberRef) ref, kCFNumberSInt32Type, &value); + return value; + } + } + return 0; +} + +static unsigned short get_vendor_id(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDVendorIDKey)); +} + +static unsigned short get_product_id(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDProductIDKey)); +} + +static int32_t get_max_report_length(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDMaxInputReportSizeKey)); +} + +static int get_string_property(IOHIDDeviceRef device, CFStringRef prop, wchar_t *buf, size_t len) +{ + CFStringRef str; + + if (!len) + return 0; + + str = IOHIDDeviceGetProperty(device, prop); + + buf[0] = 0; + + if (str) { + CFIndex str_len = CFStringGetLength(str); + CFRange range; + CFIndex used_buf_len; + CFIndex chars_copied; + + len --; + + range.location = 0; + range.length = ((size_t)str_len > len)? len: (size_t)str_len; + chars_copied = CFStringGetBytes(str, + range, + kCFStringEncodingUTF32LE, + (char)'?', + FALSE, + (UInt8*)buf, + len * sizeof(wchar_t), + &used_buf_len); + + if (chars_copied == len) + buf[len] = 0; /* len is decremented above */ + else + buf[chars_copied] = 0; + + return 0; + } + else + return -1; + +} + +static int get_serial_number(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDSerialNumberKey), buf, len); +} + +static int get_manufacturer_string(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDManufacturerKey), buf, len); +} + +static int get_product_string(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDProductKey), buf, len); +} + + +/* Implementation of wcsdup() for Mac. */ +static wchar_t *dup_wcs(const wchar_t *s) +{ + size_t len = wcslen(s); + wchar_t *ret = malloc((len+1)*sizeof(wchar_t)); + wcscpy(ret, s); + + return ret; +} + +/* hidapi_IOHIDDeviceGetService() + * + * Return the io_service_t corresponding to a given IOHIDDeviceRef, either by: + * - on OS X 10.6 and above, calling IOHIDDeviceGetService() + * - on OS X 10.5, extract it from the IOHIDDevice struct + */ +static io_service_t hidapi_IOHIDDeviceGetService(IOHIDDeviceRef device) +{ + static void *iokit_framework = NULL; + static io_service_t (*dynamic_IOHIDDeviceGetService)(IOHIDDeviceRef device) = NULL; + + /* Use dlopen()/dlsym() to get a pointer to IOHIDDeviceGetService() if it exists. + * If any of these steps fail, dynamic_IOHIDDeviceGetService will be left NULL + * and the fallback method will be used. + */ + if (iokit_framework == NULL) { + iokit_framework = dlopen("/System/Library/IOKit.framework/IOKit", RTLD_LAZY); + + if (iokit_framework != NULL) + dynamic_IOHIDDeviceGetService = dlsym(iokit_framework, "IOHIDDeviceGetService"); + } + + if (dynamic_IOHIDDeviceGetService != NULL) { + /* Running on OS X 10.6 and above: IOHIDDeviceGetService() exists */ + return dynamic_IOHIDDeviceGetService(device); + } + else + { + /* Running on OS X 10.5: IOHIDDeviceGetService() doesn't exist. + * + * Be naughty and pull the service out of the IOHIDDevice. + * IOHIDDevice is an opaque struct not exposed to applications, but its + * layout is stable through all available versions of OS X. + * Tested and working on OS X 10.5.8 i386, x86_64, and ppc. + */ + struct IOHIDDevice_internal { + /* The first field of the IOHIDDevice struct is a + * CFRuntimeBase (which is a private CF struct). + * + * a, b, and c are the 3 fields that make up a CFRuntimeBase. + * See http://opensource.apple.com/source/CF/CF-476.18/CFRuntime.h + * + * The second field of the IOHIDDevice is the io_service_t we're looking for. + */ + uintptr_t a; + uint8_t b[4]; +#if __LP64__ + uint32_t c; +#endif + io_service_t service; + }; + struct IOHIDDevice_internal *tmp = (struct IOHIDDevice_internal *)device; + + return tmp->service; + } +} + +/* Initialize the IOHIDManager. Return 0 for success and -1 for failure. */ +static int init_hid_manager(void) +{ + /* Initialize all the HID Manager Objects */ + hid_mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); + if (hid_mgr) { + IOHIDManagerSetDeviceMatching(hid_mgr, NULL); + IOHIDManagerScheduleWithRunLoop(hid_mgr, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + return 0; + } + + return -1; +} + +/* Initialize the IOHIDManager if necessary. This is the public function, and + it is safe to call this function repeatedly. Return 0 for success and -1 + for failure. */ +int HID_API_EXPORT hid_init(void) +{ + if (!hid_mgr) { + return init_hid_manager(); + } + + /* Already initialized. */ + return 0; +} + +int HID_API_EXPORT hid_exit(void) +{ + if (hid_mgr) { + /* Close the HID manager. */ + IOHIDManagerClose(hid_mgr, kIOHIDOptionsTypeNone); + CFRelease(hid_mgr); + hid_mgr = NULL; + } + + return 0; +} + +static void process_pending_events(void) { + SInt32 res; + do { + res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.001, FALSE); + } while(res != kCFRunLoopRunFinished && res != kCFRunLoopRunTimedOut); +} + +struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) +{ + struct hid_device_info *root = NULL; /* return object */ + struct hid_device_info *cur_dev = NULL; + CFIndex num_devices; + int i; + + /* Set up the HID Manager if it hasn't been done */ + if (hid_init() < 0) + return NULL; + + /* give the IOHIDManager a chance to update itself */ + process_pending_events(); + + /* Get a list of the Devices */ + IOHIDManagerSetDeviceMatching(hid_mgr, NULL); + CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr); + + /* Convert the list into a C array so we can iterate easily. */ + num_devices = CFSetGetCount(device_set); + IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef)); + CFSetGetValues(device_set, (const void **) device_array); + + /* Iterate over each device, making an entry for it. */ + for (i = 0; i < num_devices; i++) { + unsigned short dev_vid; + unsigned short dev_pid; + #define BUF_LEN 256 + wchar_t buf[BUF_LEN]; + + IOHIDDeviceRef dev = device_array[i]; + + if (!dev) { + continue; + } + dev_vid = get_vendor_id(dev); + dev_pid = get_product_id(dev); + + /* Check the VID/PID against the arguments */ + if ((vendor_id == 0x0 || vendor_id == dev_vid) && + (product_id == 0x0 || product_id == dev_pid)) { + struct hid_device_info *tmp; + io_object_t iokit_dev; + kern_return_t res; + io_string_t path; + + /* VID/PID match. Create the record. */ + tmp = malloc(sizeof(struct hid_device_info)); + if (cur_dev) { + cur_dev->next = tmp; + } + else { + root = tmp; + } + cur_dev = tmp; + + /* Get the Usage Page and Usage for this device. */ + cur_dev->usage_page = get_int_property(dev, CFSTR(kIOHIDPrimaryUsagePageKey)); + cur_dev->usage = get_int_property(dev, CFSTR(kIOHIDPrimaryUsageKey)); + + /* Fill out the record */ + cur_dev->next = NULL; + + /* Fill in the path (IOService plane) */ + iokit_dev = hidapi_IOHIDDeviceGetService(dev); + res = IORegistryEntryGetPath(iokit_dev, kIOServicePlane, path); + if (res == KERN_SUCCESS) + cur_dev->path = strdup(path); + else + cur_dev->path = strdup(""); + + /* Serial Number */ + get_serial_number(dev, buf, BUF_LEN); + cur_dev->serial_number = dup_wcs(buf); + + /* Manufacturer and Product strings */ + get_manufacturer_string(dev, buf, BUF_LEN); + cur_dev->manufacturer_string = dup_wcs(buf); + get_product_string(dev, buf, BUF_LEN); + cur_dev->product_string = dup_wcs(buf); + + /* VID/PID */ + cur_dev->vendor_id = dev_vid; + cur_dev->product_id = dev_pid; + + /* Release Number */ + cur_dev->release_number = get_int_property(dev, CFSTR(kIOHIDVersionNumberKey)); + + /* Interface Number (Unsupported on Mac)*/ + cur_dev->interface_number = -1; + } + } + + free(device_array); + CFRelease(device_set); + + return root; +} + +void HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs) +{ + /* This function is identical to the Linux version. Platform independent. */ + struct hid_device_info *d = devs; + while (d) { + struct hid_device_info *next = d->next; + free(d->path); + free(d->serial_number); + free(d->manufacturer_string); + free(d->product_string); + free(d); + d = next; + } +} + +hid_device * HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) +{ + /* This function is identical to the Linux version. Platform independent. */ + struct hid_device_info *devs, *cur_dev; + const char *path_to_open = NULL; + hid_device * handle = NULL; + + devs = hid_enumerate(vendor_id, product_id); + cur_dev = devs; + while (cur_dev) { + if (cur_dev->vendor_id == vendor_id && + cur_dev->product_id == product_id) { + if (serial_number) { + if (wcscmp(serial_number, cur_dev->serial_number) == 0) { + path_to_open = cur_dev->path; + break; + } + } + else { + path_to_open = cur_dev->path; + break; + } + } + cur_dev = cur_dev->next; + } + + if (path_to_open) { + /* Open the device */ + handle = hid_open_path(path_to_open); + } + + hid_free_enumeration(devs); + + return handle; +} + +static void hid_device_removal_callback(void *context, IOReturn result, + void *sender) +{ + /* Stop the Run Loop for this device. */ + hid_device *d = context; + + d->disconnected = 1; + CFRunLoopStop(d->run_loop); +} + +/* The Run Loop calls this function for each input report received. + This function puts the data into a linked list to be picked up by + hid_read(). */ +static void hid_report_callback(void *context, IOReturn result, void *sender, + IOHIDReportType report_type, uint32_t report_id, + uint8_t *report, CFIndex report_length) +{ + struct input_report *rpt; + hid_device *dev = context; + + /* Make a new Input Report object */ + rpt = calloc(1, sizeof(struct input_report)); + rpt->data = calloc(1, report_length); + memcpy(rpt->data, report, report_length); + rpt->len = report_length; + rpt->next = NULL; + + /* Lock this section */ + pthread_mutex_lock(&dev->mutex); + + /* Attach the new report object to the end of the list. */ + if (dev->input_reports == NULL) { + /* The list is empty. Put it at the root. */ + dev->input_reports = rpt; + } + else { + /* Find the end of the list and attach. */ + struct input_report *cur = dev->input_reports; + int num_queued = 0; + while (cur->next != NULL) { + cur = cur->next; + num_queued++; + } + cur->next = rpt; + + /* Pop one off if we've reached 30 in the queue. This + way we don't grow forever if the user never reads + anything from the device. */ + if (num_queued > 30) { + return_data(dev, NULL, 0); + } + } + + /* Signal a waiting thread that there is data. */ + pthread_cond_signal(&dev->condition); + + /* Unlock */ + pthread_mutex_unlock(&dev->mutex); + +} + +/* This gets called when the read_thread's run loop gets signaled by + hid_close(), and serves to stop the read_thread's run loop. */ +static void perform_signal_callback(void *context) +{ + hid_device *dev = context; + CFRunLoopStop(dev->run_loop); /*TODO: CFRunLoopGetCurrent()*/ +} + +static void *read_thread(void *param) +{ + hid_device *dev = param; + SInt32 code; + + /* Move the device's run loop to this thread. */ + IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetCurrent(), dev->run_loop_mode); + + /* Create the RunLoopSource which is used to signal the + event loop to stop when hid_close() is called. */ + CFRunLoopSourceContext ctx; + memset(&ctx, 0, sizeof(ctx)); + ctx.version = 0; + ctx.info = dev; + ctx.perform = &perform_signal_callback; + dev->source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0/*order*/, &ctx); + CFRunLoopAddSource(CFRunLoopGetCurrent(), dev->source, dev->run_loop_mode); + + /* Store off the Run Loop so it can be stopped from hid_close() + and on device disconnection. */ + dev->run_loop = CFRunLoopGetCurrent(); + + /* Notify the main thread that the read thread is up and running. */ + pthread_barrier_wait(&dev->barrier); + + /* Run the Event Loop. CFRunLoopRunInMode() will dispatch HID input + reports into the hid_report_callback(). */ + while (!dev->shutdown_thread && !dev->disconnected) { + code = CFRunLoopRunInMode(dev->run_loop_mode, 1000/*sec*/, FALSE); + /* Return if the device has been disconnected */ + if (code == kCFRunLoopRunFinished) { + dev->disconnected = 1; + break; + } + + + /* Break if The Run Loop returns Finished or Stopped. */ + if (code != kCFRunLoopRunTimedOut && + code != kCFRunLoopRunHandledSource) { + /* There was some kind of error. Setting + shutdown seems to make sense, but + there may be something else more appropriate */ + dev->shutdown_thread = 1; + break; + } + } + + /* Now that the read thread is stopping, Wake any threads which are + waiting on data (in hid_read_timeout()). Do this under a mutex to + make sure that a thread which is about to go to sleep waiting on + the condition actually will go to sleep before the condition is + signaled. */ + pthread_mutex_lock(&dev->mutex); + pthread_cond_broadcast(&dev->condition); + pthread_mutex_unlock(&dev->mutex); + + /* Wait here until hid_close() is called and makes it past + the call to CFRunLoopWakeUp(). This thread still needs to + be valid when that function is called on the other thread. */ + pthread_barrier_wait(&dev->shutdown_barrier); + + return NULL; +} + +/* hid_open_path() + * + * path must be a valid path to an IOHIDDevice in the IOService plane + * Example: "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/EHC1@1D,7/AppleUSBEHCI/PLAYSTATION(R)3 Controller@fd120000/IOUSBInterface@0/IOUSBHIDDriver" + */ +hid_device * HID_API_EXPORT hid_open_path(const char *path) +{ + hid_device *dev = NULL; + io_registry_entry_t entry = MACH_PORT_NULL; + + dev = new_hid_device(); + + /* Set up the HID Manager if it hasn't been done */ + if (hid_init() < 0) + return NULL; + + /* Get the IORegistry entry for the given path */ + entry = IORegistryEntryFromPath(kIOMasterPortDefault, path); + if (entry == MACH_PORT_NULL) { + /* Path wasn't valid (maybe device was removed?) */ + goto return_error; + } + + /* Create an IOHIDDevice for the entry */ + dev->device_handle = IOHIDDeviceCreate(kCFAllocatorDefault, entry); + if (dev->device_handle == NULL) { + /* Error creating the HID device */ + goto return_error; + } + + /* Open the IOHIDDevice */ + IOReturn ret = IOHIDDeviceOpen(dev->device_handle, kIOHIDOptionsTypeSeizeDevice); + if (ret == kIOReturnSuccess) { + char str[32]; + + /* Create the buffers for receiving data */ + dev->max_input_report_len = (CFIndex) get_max_report_length(dev->device_handle); + dev->input_report_buf = calloc(dev->max_input_report_len, sizeof(uint8_t)); + + /* Create the Run Loop Mode for this device. + printing the reference seems to work. */ + sprintf(str, "HIDAPI_%p", dev->device_handle); + dev->run_loop_mode = + CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII); + + /* Attach the device to a Run Loop */ + IOHIDDeviceRegisterInputReportCallback( + dev->device_handle, dev->input_report_buf, dev->max_input_report_len, + &hid_report_callback, dev); + IOHIDDeviceRegisterRemovalCallback(dev->device_handle, hid_device_removal_callback, dev); + + /* Start the read thread */ + pthread_create(&dev->thread, NULL, read_thread, dev); + + /* Wait here for the read thread to be initialized. */ + pthread_barrier_wait(&dev->barrier); + + IOObjectRelease(entry); + return dev; + } + else { + goto return_error; + } + +return_error: + if (dev->device_handle != NULL) + CFRelease(dev->device_handle); + + if (entry != MACH_PORT_NULL) + IOObjectRelease(entry); + + free_hid_device(dev); + return NULL; +} + +static int set_report(hid_device *dev, IOHIDReportType type, const unsigned char *data, size_t length) +{ + const unsigned char *data_to_send; + size_t length_to_send; + IOReturn res; + + /* Return if the device has been disconnected. */ + if (dev->disconnected) + return -1; + + if (data[0] == 0x0) { + /* Not using numbered Reports. + Don't send the report number. */ + data_to_send = data+1; + length_to_send = length-1; + } + else { + /* Using numbered Reports. + Send the Report Number */ + data_to_send = data; + length_to_send = length; + } + + if (!dev->disconnected) { + res = IOHIDDeviceSetReport(dev->device_handle, + type, + data[0], /* Report ID*/ + data_to_send, length_to_send); + + if (res == kIOReturnSuccess) { + return length; + } + else + return -1; + } + + return -1; +} + +int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length) +{ + return set_report(dev, kIOHIDReportTypeOutput, data, length); +} + +/* Helper function, so that this isn't duplicated in hid_read(). */ +static int return_data(hid_device *dev, unsigned char *data, size_t length) +{ + /* Copy the data out of the linked list item (rpt) into the + return buffer (data), and delete the liked list item. */ + struct input_report *rpt = dev->input_reports; + size_t len = (length < rpt->len)? length: rpt->len; + memcpy(data, rpt->data, len); + dev->input_reports = rpt->next; + free(rpt->data); + free(rpt); + return len; +} + +static int cond_wait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex) +{ + while (!dev->input_reports) { + int res = pthread_cond_wait(cond, mutex); + if (res != 0) + return res; + + /* A res of 0 means we may have been signaled or it may + be a spurious wakeup. Check to see that there's acutally + data in the queue before returning, and if not, go back + to sleep. See the pthread_cond_timedwait() man page for + details. */ + + if (dev->shutdown_thread || dev->disconnected) + return -1; + } + + return 0; +} + +static int cond_timedwait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) +{ + while (!dev->input_reports) { + int res = pthread_cond_timedwait(cond, mutex, abstime); + if (res != 0) + return res; + + /* A res of 0 means we may have been signaled or it may + be a spurious wakeup. Check to see that there's acutally + data in the queue before returning, and if not, go back + to sleep. See the pthread_cond_timedwait() man page for + details. */ + + if (dev->shutdown_thread || dev->disconnected) + return -1; + } + + return 0; + +} + +int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) +{ + int bytes_read = -1; + + /* Lock the access to the report list. */ + pthread_mutex_lock(&dev->mutex); + + /* There's an input report queued up. Return it. */ + if (dev->input_reports) { + /* Return the first one */ + bytes_read = return_data(dev, data, length); + goto ret; + } + + /* Return if the device has been disconnected. */ + if (dev->disconnected) { + bytes_read = -1; + goto ret; + } + + if (dev->shutdown_thread) { + /* This means the device has been closed (or there + has been an error. An error code of -1 should + be returned. */ + bytes_read = -1; + goto ret; + } + + /* There is no data. Go to sleep and wait for data. */ + + if (milliseconds == -1) { + /* Blocking */ + int res; + res = cond_wait(dev, &dev->condition, &dev->mutex); + if (res == 0) + bytes_read = return_data(dev, data, length); + else { + /* There was an error, or a device disconnection. */ + bytes_read = -1; + } + } + else if (milliseconds > 0) { + /* Non-blocking, but called with timeout. */ + int res; + struct timespec ts; + struct timeval tv; + gettimeofday(&tv, NULL); + TIMEVAL_TO_TIMESPEC(&tv, &ts); + ts.tv_sec += milliseconds / 1000; + ts.tv_nsec += (milliseconds % 1000) * 1000000; + if (ts.tv_nsec >= 1000000000L) { + ts.tv_sec++; + ts.tv_nsec -= 1000000000L; + } + + res = cond_timedwait(dev, &dev->condition, &dev->mutex, &ts); + if (res == 0) + bytes_read = return_data(dev, data, length); + else if (res == ETIMEDOUT) + bytes_read = 0; + else + bytes_read = -1; + } + else { + /* Purely non-blocking */ + bytes_read = 0; + } + +ret: + /* Unlock */ + pthread_mutex_unlock(&dev->mutex); + return bytes_read; +} + +int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); +} + +int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) +{ + /* All Nonblocking operation is handled by the library. */ + dev->blocking = !nonblock; + + return 0; +} + +int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) +{ + return set_report(dev, kIOHIDReportTypeFeature, data, length); +} + +int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) +{ + CFIndex len = length; + IOReturn res; + + /* Return if the device has been unplugged. */ + if (dev->disconnected) + return -1; + + res = IOHIDDeviceGetReport(dev->device_handle, + kIOHIDReportTypeFeature, + data[0], /* Report ID */ + data, &len); + if (res == kIOReturnSuccess) + return len; + else + return -1; +} + + +void HID_API_EXPORT hid_close(hid_device *dev) +{ + if (!dev) + return; + + /* Disconnect the report callback before close. */ + if (!dev->disconnected) { + IOHIDDeviceRegisterInputReportCallback( + dev->device_handle, dev->input_report_buf, dev->max_input_report_len, + NULL, dev); + IOHIDDeviceRegisterRemovalCallback(dev->device_handle, NULL, dev); + IOHIDDeviceUnscheduleFromRunLoop(dev->device_handle, dev->run_loop, dev->run_loop_mode); + IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetMain(), kCFRunLoopDefaultMode); + } + + /* Cause read_thread() to stop. */ + dev->shutdown_thread = 1; + + /* Wake up the run thread's event loop so that the thread can exit. */ + CFRunLoopSourceSignal(dev->source); + CFRunLoopWakeUp(dev->run_loop); + + /* Notify the read thread that it can shut down now. */ + pthread_barrier_wait(&dev->shutdown_barrier); + + /* Wait for read_thread() to end. */ + pthread_join(dev->thread, NULL); + + /* Close the OS handle to the device, but only if it's not + been unplugged. If it's been unplugged, then calling + IOHIDDeviceClose() will crash. */ + if (!dev->disconnected) { + IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeSeizeDevice); + } + + /* Clear out the queue of received reports. */ + pthread_mutex_lock(&dev->mutex); + while (dev->input_reports) { + return_data(dev, NULL, 0); + } + pthread_mutex_unlock(&dev->mutex); + CFRelease(dev->device_handle); + + free_hid_device(dev); +} + +int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_manufacturer_string(dev->device_handle, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_product_string(dev->device_handle, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_serial_number(dev->device_handle, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) +{ + /* TODO: */ + + return 0; +} + + +HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) +{ + /* TODO: */ + + return NULL; +} + + + + + + + +#if 0 +static int32_t get_location_id(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDLocationIDKey)); +} + +static int32_t get_usage(IOHIDDeviceRef device) +{ + int32_t res; + res = get_int_property(device, CFSTR(kIOHIDDeviceUsageKey)); + if (!res) + res = get_int_property(device, CFSTR(kIOHIDPrimaryUsageKey)); + return res; +} + +static int32_t get_usage_page(IOHIDDeviceRef device) +{ + int32_t res; + res = get_int_property(device, CFSTR(kIOHIDDeviceUsagePageKey)); + if (!res) + res = get_int_property(device, CFSTR(kIOHIDPrimaryUsagePageKey)); + return res; +} + +static int get_transport(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDTransportKey), buf, len); +} + + +int main(void) +{ + IOHIDManagerRef mgr; + int i; + + mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); + IOHIDManagerSetDeviceMatching(mgr, NULL); + IOHIDManagerOpen(mgr, kIOHIDOptionsTypeNone); + + CFSetRef device_set = IOHIDManagerCopyDevices(mgr); + + CFIndex num_devices = CFSetGetCount(device_set); + IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef)); + CFSetGetValues(device_set, (const void **) device_array); + + for (i = 0; i < num_devices; i++) { + IOHIDDeviceRef dev = device_array[i]; + printf("Device: %p\n", dev); + printf(" %04hx %04hx\n", get_vendor_id(dev), get_product_id(dev)); + + wchar_t serial[256], buf[256]; + char cbuf[256]; + get_serial_number(dev, serial, 256); + + + printf(" Serial: %ls\n", serial); + printf(" Loc: %ld\n", get_location_id(dev)); + get_transport(dev, buf, 256); + printf(" Trans: %ls\n", buf); + make_path(dev, cbuf, 256); + printf(" Path: %s\n", cbuf); + + } + + return 0; +} +#endif + + +#else //Linux + +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 8/22/2009 + Linux Version - 6/2/2009 + + Copyright 2009, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + +/* C */ +#include +#include +#include +#include +#include + +/* Unix */ +#include +#include +#include +#include +#include +#include +#include + +/* Linux */ +#include +#include +#include +#include + +#include "hidapi.h" + +/* Definitions from linux/hidraw.h. Since these are new, some distros + may not have header files which contain them. */ +#ifndef HIDIOCSFEATURE +#define HIDIOCSFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len) +#endif +#ifndef HIDIOCGFEATURE +#define HIDIOCGFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len) +#endif + + +/* USB HID device property names */ +const char *device_string_names[] = { + "manufacturer", + "product", + "serial", +}; + +/* Symbolic names for the properties above */ +enum device_string_id { + DEVICE_STRING_MANUFACTURER, + DEVICE_STRING_PRODUCT, + DEVICE_STRING_SERIAL, + + DEVICE_STRING_COUNT, +}; + +struct hid_device_ { + int device_handle; + int blocking; + int uses_numbered_reports; +}; + + +static __u32 kernel_version = 0; + +static __u32 detect_kernel_version(void) +{ + struct utsname name; + int major, minor, release; + int ret; + + uname(&name); + ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release); + if (ret == 3) { + return KERNEL_VERSION(major, minor, release); + } + + ret = sscanf(name.release, "%d.%d", &major, &minor); + if (ret == 2) { + return KERNEL_VERSION(major, minor, 0); + } + + printf("Couldn't determine kernel version from version string \"%s\"\n", name.release); + return 0; +} + +static hid_device *new_hid_device(void) +{ + hid_device *dev = calloc(1, sizeof(hid_device)); + dev->device_handle = -1; + dev->blocking = 1; + dev->uses_numbered_reports = 0; + + return dev; +} + + +/* The caller must free the returned string with free(). */ +static wchar_t *utf8_to_wchar_t(const char *utf8) +{ + wchar_t *ret = NULL; + + if (utf8) { + size_t wlen = mbstowcs(NULL, utf8, 0); + if ((size_t) -1 == wlen) { + return wcsdup(L""); + } + ret = calloc(wlen+1, sizeof(wchar_t)); + mbstowcs(ret, utf8, wlen+1); + ret[wlen] = 0x0000; + } + + return ret; +} + +/* Get an attribute value from a udev_device and return it as a whar_t + string. The returned string must be freed with free() when done.*/ +static wchar_t *copy_udev_string(struct udev_device *dev, const char *udev_name) +{ + return utf8_to_wchar_t(udev_device_get_sysattr_value(dev, udev_name)); +} + +/* uses_numbered_reports() returns 1 if report_descriptor describes a device + which contains numbered reports. */ +static int uses_numbered_reports(__u8 *report_descriptor, __u32 size) { + unsigned int i = 0; + int size_code; + int data_len, key_size; + + while (i < size) { + int key = report_descriptor[i]; + + /* Check for the Report ID key */ + if (key == 0x85/*Report ID*/) { + /* This device has a Report ID, which means it uses + numbered reports. */ + return 1; + } + + //printf("key: %02hhx\n", key); + + if ((key & 0xf0) == 0xf0) { + /* This is a Long Item. The next byte contains the + length of the data section (value) for this key. + See the HID specification, version 1.11, section + 6.2.2.3, titled "Long Items." */ + if (i+1 < size) + data_len = report_descriptor[i+1]; + else + data_len = 0; /* malformed report */ + key_size = 3; + } + else { + /* This is a Short Item. The bottom two bits of the + key contain the size code for the data section + (value) for this key. Refer to the HID + specification, version 1.11, section 6.2.2.2, + titled "Short Items." */ + size_code = key & 0x3; + switch (size_code) { + case 0: + case 1: + case 2: + data_len = size_code; + break; + case 3: + data_len = 4; + break; + default: + /* Can't ever happen since size_code is & 0x3 */ + data_len = 0; + break; + }; + key_size = 1; + } + + /* Skip over this key and it's associated data */ + i += data_len + key_size; + } + + /* Didn't find a Report ID key. Device doesn't use numbered reports. */ + return 0; +} + +/* + * The caller is responsible for free()ing the (newly-allocated) character + * strings pointed to by serial_number_utf8 and product_name_utf8 after use. + */ +static int +parse_uevent_info(const char *uevent, int *bus_type, + unsigned short *vendor_id, unsigned short *product_id, + char **serial_number_utf8, char **product_name_utf8) +{ + char *tmp = strdup(uevent); + char *saveptr = NULL; + char *line; + char *key; + char *value; + + int found_id = 0; + int found_serial = 0; + int found_name = 0; + + line = strtok_r(tmp, "\n", &saveptr); + while (line != NULL) { + /* line: "KEY=value" */ + key = line; + value = strchr(line, '='); + if (!value) { + goto next_line; + } + *value = '\0'; + value++; + + if (strcmp(key, "HID_ID") == 0) { + /** + * type vendor product + * HID_ID=0003:000005AC:00008242 + **/ + int ret = sscanf(value, "%x:%hx:%hx", bus_type, vendor_id, product_id); + if (ret == 3) { + found_id = 1; + } + } else if (strcmp(key, "HID_NAME") == 0) { + /* The caller has to free the product name */ + *product_name_utf8 = strdup(value); + found_name = 1; + } else if (strcmp(key, "HID_UNIQ") == 0) { + /* The caller has to free the serial number */ + *serial_number_utf8 = strdup(value); + found_serial = 1; + } + +next_line: + line = strtok_r(NULL, "\n", &saveptr); + } + + free(tmp); + return (found_id && found_name && found_serial); +} + + +static int get_device_string(hid_device *dev, enum device_string_id key, wchar_t *string, size_t maxlen) +{ + struct udev *udev; + struct udev_device *udev_dev, *parent, *hid_dev; + struct stat s; + int ret = -1; + char *serial_number_utf8 = NULL; + char *product_name_utf8 = NULL; + + /* Create the udev object */ + udev = udev_new(); + if (!udev) { + printf("Can't create udev\n"); + return -1; + } + + /* Get the dev_t (major/minor numbers) from the file handle. */ + ret = fstat(dev->device_handle, &s); + if (-1 == ret) + return ret; + /* Open a udev device from the dev_t. 'c' means character device. */ + udev_dev = udev_device_new_from_devnum(udev, 'c', s.st_rdev); + if (udev_dev) { + hid_dev = udev_device_get_parent_with_subsystem_devtype( + udev_dev, + "hid", + NULL); + if (hid_dev) { + unsigned short dev_vid; + unsigned short dev_pid; + int bus_type; + size_t retm; + + ret = parse_uevent_info( + udev_device_get_sysattr_value(hid_dev, "uevent"), + &bus_type, + &dev_vid, + &dev_pid, + &serial_number_utf8, + &product_name_utf8); + + if (bus_type == BUS_BLUETOOTH) { + switch (key) { + case DEVICE_STRING_MANUFACTURER: + wcsncpy(string, L"", maxlen); + ret = 0; + break; + case DEVICE_STRING_PRODUCT: + retm = mbstowcs(string, product_name_utf8, maxlen); + ret = (retm == (size_t)-1)? -1: 0; + break; + case DEVICE_STRING_SERIAL: + retm = mbstowcs(string, serial_number_utf8, maxlen); + ret = (retm == (size_t)-1)? -1: 0; + break; + case DEVICE_STRING_COUNT: + default: + ret = -1; + break; + } + } + else { + /* This is a USB device. Find its parent USB Device node. */ + parent = udev_device_get_parent_with_subsystem_devtype( + udev_dev, + "usb", + "usb_device"); + if (parent) { + const char *str; + const char *key_str = NULL; + + if (key >= 0 && key < DEVICE_STRING_COUNT) { + key_str = device_string_names[key]; + } else { + ret = -1; + goto end; + } + + str = udev_device_get_sysattr_value(parent, key_str); + if (str) { + /* Convert the string from UTF-8 to wchar_t */ + retm = mbstowcs(string, str, maxlen); + ret = (retm == (size_t)-1)? -1: 0; + goto end; + } + } + } + } + } + +end: + free(serial_number_utf8); + free(product_name_utf8); + + udev_device_unref(udev_dev); + /* parent and hid_dev don't need to be (and can't be) unref'd. + I'm not sure why, but they'll throw double-free() errors. */ + udev_unref(udev); + + return ret; +} + +int HID_API_EXPORT hid_init(void) +{ + const char *locale; + + /* Set the locale if it's not set. */ + locale = setlocale(LC_CTYPE, NULL); + if (!locale) + setlocale(LC_CTYPE, ""); + + kernel_version = detect_kernel_version(); + + return 0; +} + +int HID_API_EXPORT hid_exit(void) +{ + /* Nothing to do for this in the Linux/hidraw implementation. */ + return 0; +} + + +struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) +{ + struct udev *udev; + struct udev_enumerate *enumerate; + struct udev_list_entry *devices, *dev_list_entry; + + struct hid_device_info *root = NULL; /* return object */ + struct hid_device_info *cur_dev = NULL; + struct hid_device_info *prev_dev = NULL; /* previous device */ + + hid_init(); + + /* Create the udev object */ + udev = udev_new(); + if (!udev) { + printf("Can't create udev\n"); + return NULL; + } + + /* Create a list of the devices in the 'hidraw' subsystem. */ + enumerate = udev_enumerate_new(udev); + udev_enumerate_add_match_subsystem(enumerate, "hidraw"); + udev_enumerate_scan_devices(enumerate); + devices = udev_enumerate_get_list_entry(enumerate); + /* For each item, see if it matches the vid/pid, and if so + create a udev_device record for it */ + udev_list_entry_foreach(dev_list_entry, devices) { + const char *sysfs_path; + const char *dev_path; + const char *str; + struct udev_device *raw_dev; /* The device's hidraw udev node. */ + struct udev_device *hid_dev; /* The device's HID udev node. */ + struct udev_device *usb_dev; /* The device's USB udev node. */ + struct udev_device *intf_dev; /* The device's interface (in the USB sense). */ + unsigned short dev_vid; + unsigned short dev_pid; + char *serial_number_utf8 = NULL; + char *product_name_utf8 = NULL; + int bus_type; + int result; + + /* Get the filename of the /sys entry for the device + and create a udev_device object (dev) representing it */ + sysfs_path = udev_list_entry_get_name(dev_list_entry); + raw_dev = udev_device_new_from_syspath(udev, sysfs_path); + dev_path = udev_device_get_devnode(raw_dev); + + hid_dev = udev_device_get_parent_with_subsystem_devtype( + raw_dev, + "hid", + NULL); + + if (!hid_dev) { + /* Unable to find parent hid device. */ + goto next; + } + + result = parse_uevent_info( + udev_device_get_sysattr_value(hid_dev, "uevent"), + &bus_type, + &dev_vid, + &dev_pid, + &serial_number_utf8, + &product_name_utf8); + + if (!result) { + /* parse_uevent_info() failed for at least one field. */ + goto next; + } + + if (bus_type != BUS_USB && bus_type != BUS_BLUETOOTH) { + /* We only know how to handle USB and BT devices. */ + goto next; + } + + /* Check the VID/PID against the arguments */ + if ((vendor_id == 0x0 || vendor_id == dev_vid) && + (product_id == 0x0 || product_id == dev_pid)) { + struct hid_device_info *tmp; + + /* VID/PID match. Create the record. */ + tmp = malloc(sizeof(struct hid_device_info)); + if (cur_dev) { + cur_dev->next = tmp; + } + else { + root = tmp; + } + prev_dev = cur_dev; + cur_dev = tmp; + + /* Fill out the record */ + cur_dev->next = NULL; + cur_dev->path = dev_path? strdup(dev_path): NULL; + + /* VID/PID */ + cur_dev->vendor_id = dev_vid; + cur_dev->product_id = dev_pid; + + /* Serial Number */ + cur_dev->serial_number = utf8_to_wchar_t(serial_number_utf8); + + /* Release Number */ + cur_dev->release_number = 0x0; + + /* Interface Number */ + cur_dev->interface_number = -1; + + switch (bus_type) { + case BUS_USB: + /* The device pointed to by raw_dev contains information about + the hidraw device. In order to get information about the + USB device, get the parent device with the + subsystem/devtype pair of "usb"/"usb_device". This will + be several levels up the tree, but the function will find + it. */ + usb_dev = udev_device_get_parent_with_subsystem_devtype( + raw_dev, + "usb", + "usb_device"); + + if (!usb_dev) { + /* Free this device */ + free(cur_dev->serial_number); + free(cur_dev->path); + free(cur_dev); + + /* Take it off the device list. */ + if (prev_dev) { + prev_dev->next = NULL; + cur_dev = prev_dev; + } + else { + cur_dev = root = NULL; + } + + goto next; + } + + /* Manufacturer and Product strings */ + cur_dev->manufacturer_string = copy_udev_string(usb_dev, device_string_names[DEVICE_STRING_MANUFACTURER]); + cur_dev->product_string = copy_udev_string(usb_dev, device_string_names[DEVICE_STRING_PRODUCT]); + + /* Release Number */ + str = udev_device_get_sysattr_value(usb_dev, "bcdDevice"); + cur_dev->release_number = (str)? strtol(str, NULL, 16): 0x0; + + /* Get a handle to the interface's udev node. */ + intf_dev = udev_device_get_parent_with_subsystem_devtype( + raw_dev, + "usb", + "usb_interface"); + if (intf_dev) { + str = udev_device_get_sysattr_value(intf_dev, "bInterfaceNumber"); + cur_dev->interface_number = (str)? strtol(str, NULL, 16): -1; + } + + break; + + case BUS_BLUETOOTH: + /* Manufacturer and Product strings */ + cur_dev->manufacturer_string = wcsdup(L""); + cur_dev->product_string = utf8_to_wchar_t(product_name_utf8); + + break; + + default: + /* Unknown device type - this should never happen, as we + * check for USB and Bluetooth devices above */ + break; + } + } + + next: + free(serial_number_utf8); + free(product_name_utf8); + udev_device_unref(raw_dev); + /* hid_dev, usb_dev and intf_dev don't need to be (and can't be) + unref()d. It will cause a double-free() error. I'm not + sure why. */ + } + /* Free the enumerator and udev objects. */ + udev_enumerate_unref(enumerate); + udev_unref(udev); + + return root; +} + +void HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs) +{ + struct hid_device_info *d = devs; + while (d) { + struct hid_device_info *next = d->next; + free(d->path); + free(d->serial_number); + free(d->manufacturer_string); + free(d->product_string); + free(d); + d = next; + } +} + +hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) +{ + struct hid_device_info *devs, *cur_dev; + const char *path_to_open = NULL; + hid_device *handle = NULL; + + devs = hid_enumerate(vendor_id, product_id); + cur_dev = devs; + while (cur_dev) { + if (cur_dev->vendor_id == vendor_id && + cur_dev->product_id == product_id) { + if (serial_number) { + if (wcscmp(serial_number, cur_dev->serial_number) == 0) { + path_to_open = cur_dev->path; + break; + } + } + else { + path_to_open = cur_dev->path; + break; + } + } + cur_dev = cur_dev->next; + } + + if (path_to_open) { + /* Open the device */ + handle = hid_open_path(path_to_open); + } + + hid_free_enumeration(devs); + + return handle; +} + +hid_device * HID_API_EXPORT hid_open_path(const char *path) +{ + hid_device *dev = NULL; + + hid_init(); + + dev = new_hid_device(); + + /* OPEN HERE */ + dev->device_handle = open(path, O_RDWR); + + /* If we have a good handle, return it. */ + if (dev->device_handle > 0) { + + /* Get the report descriptor */ + int res, desc_size = 0; + struct hidraw_report_descriptor rpt_desc; + + memset(&rpt_desc, 0x0, sizeof(rpt_desc)); + + /* Get Report Descriptor Size */ + res = ioctl(dev->device_handle, HIDIOCGRDESCSIZE, &desc_size); + if (res < 0) + perror("HIDIOCGRDESCSIZE"); + + + /* Get Report Descriptor */ + rpt_desc.size = desc_size; + res = ioctl(dev->device_handle, HIDIOCGRDESC, &rpt_desc); + if (res < 0) { + perror("HIDIOCGRDESC"); + } else { + /* Determine if this device uses numbered reports. */ + dev->uses_numbered_reports = + uses_numbered_reports(rpt_desc.value, + rpt_desc.size); + } + + return dev; + } + else { + /* Unable to open any devices. */ + free(dev); + return NULL; + } +} + + +int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length) +{ + int bytes_written; + + bytes_written = write(dev->device_handle, data, length); + + return bytes_written; +} + + +int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) +{ + int bytes_read; + + if (milliseconds >= 0) { + /* Milliseconds is either 0 (non-blocking) or > 0 (contains + a valid timeout). In both cases we want to call poll() + and wait for data to arrive. Don't rely on non-blocking + operation (O_NONBLOCK) since some kernels don't seem to + properly report device disconnection through read() when + in non-blocking mode. */ + int ret; + struct pollfd fds; + + fds.fd = dev->device_handle; + fds.events = POLLIN; + fds.revents = 0; + ret = poll(&fds, 1, milliseconds); + if (ret == -1 || ret == 0) { + /* Error or timeout */ + return ret; + } + else { + /* Check for errors on the file descriptor. This will + indicate a device disconnection. */ + if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) + return -1; + } + } + + bytes_read = read(dev->device_handle, data, length); + if (bytes_read < 0 && (errno == EAGAIN || errno == EINPROGRESS)) + bytes_read = 0; + + if (bytes_read >= 0 && + kernel_version != 0 && + kernel_version < KERNEL_VERSION(2,6,34) && + dev->uses_numbered_reports) { + /* Work around a kernel bug. Chop off the first byte. */ + memmove(data, data+1, bytes_read); + bytes_read--; + } + + return bytes_read; +} + +int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); +} + +int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) +{ + /* Do all non-blocking in userspace using poll(), since it looks + like there's a bug in the kernel in some versions where + read() will not return -1 on disconnection of the USB device */ + + dev->blocking = !nonblock; + return 0; /* Success */ +} + + +int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) +{ + int res; + + res = ioctl(dev->device_handle, HIDIOCSFEATURE(length), data); + if (res < 0) + perror("ioctl (SFEATURE)"); + + return res; +} + +int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) +{ + int res; + + res = ioctl(dev->device_handle, HIDIOCGFEATURE(length), data); + if (res < 0) + perror("ioctl (GFEATURE)"); + + + return res; +} + + +void HID_API_EXPORT hid_close(hid_device *dev) +{ + if (!dev) + return; + close(dev->device_handle); + free(dev); +} + + +int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_device_string(dev, DEVICE_STRING_MANUFACTURER, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_device_string(dev, DEVICE_STRING_PRODUCT, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_device_string(dev, DEVICE_STRING_SERIAL, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) +{ + return -1; +} + + +HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) +{ + return NULL; +} + + +#endif + diff --git a/colorchord2/hidapi.conf b/colorchord2/hidapi.conf new file mode 100644 index 0000000..f4155e3 --- /dev/null +++ b/colorchord2/hidapi.conf @@ -0,0 +1,30 @@ +#What display output driver should be used? +outdrivers = DisplayPie, OutputLinear, DisplayHIDAPI +leds = 107 +light_siding = 2.2 +satamp = 6.000 +is_loop=1 +led_floor = .1 +note_attach_amp_iir2 = .0500 +note_attach_amp_iir2 = .1500 +note_attach_freq_iir = 0.3000 +steady_bright = 0 +pie_min=.15 +pie_max=.25 +lightx=300 +lighty=1 + +ledoutamp = 1 + +sourcename = alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor + + +bank1_size = 40 +bank1_id = 8 +bank2_size = 27 +bank2_id = 2 +bank3_size = 40 +bank3_id = 4 +bank4_size = 0 +bank4_id = 0 +ledisrgby = 1 diff --git a/colorchord2/hidapi.h b/colorchord2/hidapi.h new file mode 100644 index 0000000..43b8e7a --- /dev/null +++ b/colorchord2/hidapi.h @@ -0,0 +1,405 @@ +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 8/22/2009 + + Copyright 2009, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + +/* Copy of LICENSE-orig.txt (compatible with MIT/x11 license) + + HIDAPI - Multi-Platform library for + communication with HID devices. + + Copyright 2009, Alan Ott, Signal 11 Software. + All Rights Reserved. + + This software may be used by anyone for any reason so + long as the copyright notice in the source files + remains intact. +*/ + + +/** @file + * @defgroup API hidapi API + */ + +#ifndef HIDAPI_H__ +#define HIDAPI_H__ + +#include + +#ifdef _WIN32 + #define HID_API_EXPORT __declspec(dllexport) + #define HID_API_CALL +#else + #define HID_API_EXPORT /**< API export macro */ + #define HID_API_CALL /**< API call macro */ +#endif + +#define HID_API_EXPORT_CALL HID_API_EXPORT HID_API_CALL /**< API export and call macro*/ + +#ifdef __cplusplus +extern "C" { +#endif + struct hid_device_; + typedef struct hid_device_ hid_device; /**< opaque hidapi structure */ + + /** hidapi info structure */ + struct hid_device_info { + /** Platform-specific device path */ + char *path; + /** Device Vendor ID */ + unsigned short vendor_id; + /** Device Product ID */ + unsigned short product_id; + /** Serial Number */ + wchar_t *serial_number; + /** Device Release Number in binary-coded decimal, + also known as Device Version Number */ + unsigned short release_number; + /** Manufacturer String */ + wchar_t *manufacturer_string; + /** Product string */ + wchar_t *product_string; + /** Usage Page for this Device/Interface + (Windows/Mac only). */ + unsigned short usage_page; + /** Usage for this Device/Interface + (Windows/Mac only).*/ + unsigned short usage; + /** The USB interface which this logical device + represents. Valid on both Linux implementations + in all cases, and valid on the Windows implementation + only if the device contains more than one interface. */ + int interface_number; + + /** Pointer to the next device */ + struct hid_device_info *next; + }; + + + /** @brief Initialize the HIDAPI library. + + This function initializes the HIDAPI library. Calling it is not + strictly necessary, as it will be called automatically by + hid_enumerate() and any of the hid_open_*() functions if it is + needed. This function should be called at the beginning of + execution however, if there is a chance of HIDAPI handles + being opened by different threads simultaneously. + + @ingroup API + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_init(void); + + /** @brief Finalize the HIDAPI library. + + This function frees all of the static data associated with + HIDAPI. It should be called at the end of execution to avoid + memory leaks. + + @ingroup API + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_exit(void); + + /** @brief Enumerate the HID Devices. + + This function returns a linked list of all the HID devices + attached to the system which match vendor_id and product_id. + If @p vendor_id is set to 0 then any vendor matches. + If @p product_id is set to 0 then any product matches. + If @p vendor_id and @p product_id are both set to 0, then + all HID devices will be returned. + + @ingroup API + @param vendor_id The Vendor ID (VID) of the types of device + to open. + @param product_id The Product ID (PID) of the types of + device to open. + + @returns + This function returns a pointer to a linked list of type + struct #hid_device, containing information about the HID devices + attached to the system, or NULL in the case of failure. Free + this linked list by calling hid_free_enumeration(). + */ + struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id); + + /** @brief Free an enumeration Linked List + + This function frees a linked list created by hid_enumerate(). + + @ingroup API + @param devs Pointer to a list of struct_device returned from + hid_enumerate(). + */ + void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs); + + /** @brief Open a HID device using a Vendor ID (VID), Product ID + (PID) and optionally a serial number. + + If @p serial_number is NULL, the first device with the + specified VID and PID is opened. + + @ingroup API + @param vendor_id The Vendor ID (VID) of the device to open. + @param product_id The Product ID (PID) of the device to open. + @param serial_number The Serial Number of the device to open + (Optionally NULL). + + @returns + This function returns a pointer to a #hid_device object on + success or NULL on failure. + */ + HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); + + /** @brief Open a HID device by its path name. + + The path name be determined by calling hid_enumerate(), or a + platform-specific path name can be used (eg: /dev/hidraw0 on + Linux). + + @ingroup API + @param path The path name of the device to open + + @returns + This function returns a pointer to a #hid_device object on + success or NULL on failure. + */ + HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path); + + /** @brief Write an Output report to a HID device. + + The first byte of @p data[] must contain the Report ID. For + devices which only support a single report, this must be set + to 0x0. The remaining bytes contain the report data. Since + the Report ID is mandatory, calls to hid_write() will always + contain one more byte than the report contains. For example, + if a hid report is 16 bytes long, 17 bytes must be passed to + hid_write(), the Report ID (or 0x0, for devices with a + single report), followed by the report data (16 bytes). In + this example, the length passed in would be 17. + + hid_write() will send the data on the first OUT endpoint, if + one exists. If it does not, it will send the data through + the Control Endpoint (Endpoint 0). + + @ingroup API + @param device A device handle returned from hid_open(). + @param data The data to send, including the report number as + the first byte. + @param length The length in bytes of the data to send. + + @returns + This function returns the actual number of bytes written and + -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length); + + /** @brief Read an Input report from a HID device with timeout. + + Input reports are returned + to the host through the INTERRUPT IN endpoint. The first byte will + contain the Report number if the device uses numbered reports. + + @ingroup API + @param device A device handle returned from hid_open(). + @param data A buffer to put the read data into. + @param length The number of bytes to read. For devices with + multiple reports, make sure to read an extra byte for + the report number. + @param milliseconds timeout in milliseconds or -1 for blocking wait. + + @returns + This function returns the actual number of bytes read and + -1 on error. If no packet was available to be read within + the timeout period, this function returns 0. + */ + int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds); + + /** @brief Read an Input report from a HID device. + + Input reports are returned + to the host through the INTERRUPT IN endpoint. The first byte will + contain the Report number if the device uses numbered reports. + + @ingroup API + @param device A device handle returned from hid_open(). + @param data A buffer to put the read data into. + @param length The number of bytes to read. For devices with + multiple reports, make sure to read an extra byte for + the report number. + + @returns + This function returns the actual number of bytes read and + -1 on error. If no packet was available to be read and + the handle is in non-blocking mode, this function returns 0. + */ + int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length); + + /** @brief Set the device handle to be non-blocking. + + In non-blocking mode calls to hid_read() will return + immediately with a value of 0 if there is no data to be + read. In blocking mode, hid_read() will wait (block) until + there is data to read before returning. + + Nonblocking can be turned on and off at any time. + + @ingroup API + @param device A device handle returned from hid_open(). + @param nonblock enable or not the nonblocking reads + - 1 to enable nonblocking + - 0 to disable nonblocking. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock); + + /** @brief Send a Feature report to the device. + + Feature reports are sent over the Control endpoint as a + Set_Report transfer. The first byte of @p data[] must + contain the Report ID. For devices which only support a + single report, this must be set to 0x0. The remaining bytes + contain the report data. Since the Report ID is mandatory, + calls to hid_send_feature_report() will always contain one + more byte than the report contains. For example, if a hid + report is 16 bytes long, 17 bytes must be passed to + hid_send_feature_report(): the Report ID (or 0x0, for + devices which do not use numbered reports), followed by the + report data (16 bytes). In this example, the length passed + in would be 17. + + @ingroup API + @param device A device handle returned from hid_open(). + @param data The data to send, including the report number as + the first byte. + @param length The length in bytes of the data to send, including + the report number. + + @returns + This function returns the actual number of bytes written and + -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length); + + /** @brief Get a feature report from a HID device. + + Set the first byte of @p data[] to the Report ID of the + report to be read. Make sure to allow space for this + extra byte in @p data[]. Upon return, the first byte will + still contain the Report ID, and the report data will + start in data[1]. + + @ingroup API + @param device A device handle returned from hid_open(). + @param data A buffer to put the read data into, including + the Report ID. Set the first byte of @p data[] to the + Report ID of the report to be read, or set it to zero + if your device does not use numbered reports. + @param length The number of bytes to read, including an + extra byte for the report ID. The buffer can be longer + than the actual report. + + @returns + This function returns the number of bytes read plus + one for the report ID (which is still in the first + byte), or -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length); + + /** @brief Close a HID device. + + @ingroup API + @param device A device handle returned from hid_open(). + */ + void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device); + + /** @brief Get The Manufacturer String from a HID device. + + @ingroup API + @param device A device handle returned from hid_open(). + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen); + + /** @brief Get The Product String from a HID device. + + @ingroup API + @param device A device handle returned from hid_open(). + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen); + + /** @brief Get The Serial Number String from a HID device. + + @ingroup API + @param device A device handle returned from hid_open(). + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen); + + /** @brief Get a string from a HID device, based on its string index. + + @ingroup API + @param device A device handle returned from hid_open(). + @param string_index The index of the string to get. + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen); + + /** @brief Get a string describing the last error which occurred. + + @ingroup API + @param device A device handle returned from hid_open(). + + @returns + This function returns a string containing the last error + which occurred or NULL if none has occurred. + */ + HID_API_EXPORT const wchar_t* HID_API_CALL hid_error(hid_device *device); + +#ifdef __cplusplus +} +#endif + +#endif + From e5dbe3a96bf246d2a0a07559192bca7bd40c9f45 Mon Sep 17 00:00:00 2001 From: bbkiwi Date: Mon, 17 Jul 2017 01:20:25 +1200 Subject: [PATCH 05/15] Start ADC HPATimer only once. Makes for more stable collection of audio when connected to wifi (especially station mode). However the range of output from the ADC is truncated. TODO fix, or use system_adc_fast_read with wifi off and RF off The devfixes branch of esp82xx needs to be used --- embedded8266/esp82xx | 2 +- embedded8266/user/user_main.c | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/embedded8266/esp82xx b/embedded8266/esp82xx index 21e23b5..c0fc3a4 160000 --- a/embedded8266/esp82xx +++ b/embedded8266/esp82xx @@ -1 +1 @@ -Subproject commit 21e23b5c360045425abe6c855853f2d973420fc2 +Subproject commit c0fc3a450ce5c84ce77809d05d885d4ea304f833 diff --git a/embedded8266/user/user_main.c b/embedded8266/user/user_main.c index 5b5267b..0a2d696 100644 --- a/embedded8266/user/user_main.c +++ b/embedded8266/user/user_main.c @@ -131,6 +131,7 @@ static void ICACHE_FLASH_ATTR myTimer(void *arg) { StartHPATimer(); //Init the high speed ADC timer. hpa_running = 1; + hpa_is_paused_for_wifi = 0; // only need to do once prevents unstable ADC } // uart0_sendStr("."); // printf( "%d/%d\n",soundtail,soundhead ); @@ -222,6 +223,12 @@ void ICACHE_FLASH_ATTR user_init(void) ws2812_init(); + // Attempt to make ADC more stable + // https://github.com/esp8266/Arduino/issues/2070 + // see peripherals https://espressif.com/en/support/explore/faq + //wifi_set_sleep_type(NONE_SLEEP_T); // on its own stopped wifi working + //wifi_fpm_set_sleep_type(NONE_SLEEP_T); // with this seemed no difference + system_os_post(procTaskPrio, 0, 0 ); } From bb7c21fcf3a48a7fb1ce06f17e50fbb5e91471b0 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Thu, 7 Sep 2017 21:58:22 -0400 Subject: [PATCH 06/15] Bump esp82xx --- embedded8266/esp82xx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded8266/esp82xx b/embedded8266/esp82xx index 21e23b5..6666ee9 160000 --- a/embedded8266/esp82xx +++ b/embedded8266/esp82xx @@ -1 +1 @@ -Subproject commit 21e23b5c360045425abe6c855853f2d973420fc2 +Subproject commit 6666ee94f388b9038fc9382b813287be65c20283 From 4f983efbfe452b87a305dd5d369d0d86fafca2cf Mon Sep 17 00:00:00 2001 From: CNLohr Date: Mon, 11 Sep 2017 02:56:50 -0400 Subject: [PATCH 07/15] Major progress to getting colorchord on Windows TCC Give it a shot. colorchord2/windows/compile.bat. I am having issues getting sound in. --- .gitignore | 2 + colorchord2/DisplayHIDAPI.c | 5 +- colorchord2/DisplayNetwork.c | 6 +- colorchord2/OutputCells.c | 1 - colorchord2/OutputLinear.c | 1 - colorchord2/OutputProminent.c | 1 - colorchord2/default.conf | 2 +- colorchord2/dft.c | 2 + colorchord2/main.c | 14 +- colorchord2/os_generic.c | 42 +- colorchord2/os_generic.h | 12 +- colorchord2/outdrivers.h | 2 +- colorchord2/parameters.h | 3 +- colorchord2/sound.c | 2 +- colorchord2/sound.h | 3 + colorchord2/sound_alsa.c | 2 +- colorchord2/sound_null.c | 3 +- colorchord2/sound_pulse.c | 2 +- colorchord2/sound_win.c | 13 +- colorchord2/util.c | 2 +- colorchord2/windows/32/WS2_32.Lib | Bin 0 -> 346832 bytes colorchord2/windows/32/WinMM.Lib | Bin 0 -> 36976 bytes colorchord2/windows/64/WS2_32.Lib | Bin 0 -> 350088 bytes colorchord2/windows/64/WinMM.Lib | Bin 0 -> 42736 bytes colorchord2/windows/compile.bat | 8 + colorchord2/windows/math.h | 926 +++++++++++ colorchord2/windows/mmsystem.h | 1950 +++++++++++++++++++++++ colorchord2/windows/symbol_enumerator.c | 245 +++ colorchord2/windows/symbol_enumerator.h | 12 + colorchord2/windows/tcc_stubs.c | 80 + colorchord2/windows/winsock2.h | 1303 +++++++++++++++ 31 files changed, 4581 insertions(+), 63 deletions(-) create mode 100644 .gitignore create mode 100644 colorchord2/windows/32/WS2_32.Lib create mode 100644 colorchord2/windows/32/WinMM.Lib create mode 100644 colorchord2/windows/64/WS2_32.Lib create mode 100644 colorchord2/windows/64/WinMM.Lib create mode 100644 colorchord2/windows/compile.bat create mode 100644 colorchord2/windows/math.h create mode 100644 colorchord2/windows/mmsystem.h create mode 100644 colorchord2/windows/symbol_enumerator.c create mode 100644 colorchord2/windows/symbol_enumerator.h create mode 100644 colorchord2/windows/tcc_stubs.c create mode 100644 colorchord2/windows/winsock2.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3841a63 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +colorchord2/windows/colorchord.def +colorchord2/colorchord.def \ No newline at end of file diff --git a/colorchord2/DisplayHIDAPI.c b/colorchord2/DisplayHIDAPI.c index 40792a1..5e4dd70 100644 --- a/colorchord2/DisplayHIDAPI.c +++ b/colorchord2/DisplayHIDAPI.c @@ -9,7 +9,6 @@ #include "hidapi.h" #include "color.h" #include -#include struct HIDAPIOutDriver { @@ -58,7 +57,7 @@ static void * LEDOutThread( void * v ) } led->readyFlag = 0; } - usleep(100); + OGUSleep(100); } return 0; } @@ -86,7 +85,7 @@ static void LEDUpdate(void * id, struct NoteFinder*nf) int leds_this_round = 0; int ledbid = 0; - while( led->readyFlag ) usleep(100); + while( led->readyFlag ) OGUSleep(100); int lastledplace = 1; led->last_leds[0] = 0; diff --git a/colorchord2/DisplayNetwork.c b/colorchord2/DisplayNetwork.c index 1a4dac5..deba2d0 100644 --- a/colorchord2/DisplayNetwork.c +++ b/colorchord2/DisplayNetwork.c @@ -9,10 +9,12 @@ #include #include "color.h" #include "DrawFunctions.h" -#include -#ifdef WIN32 +#if defined(WIN32) || defined(WINDOWS) #include +#ifdef TCC +#include +#endif #define MSG_NOSIGNAL 0 #else #include diff --git a/colorchord2/OutputCells.c b/colorchord2/OutputCells.c index 502f985..4f5bee6 100644 --- a/colorchord2/OutputCells.c +++ b/colorchord2/OutputCells.c @@ -12,7 +12,6 @@ #include "color.h" #include #include -#include extern float DeltaFrameTime; extern double Now; diff --git a/colorchord2/OutputLinear.c b/colorchord2/OutputLinear.c index bac98ae..5c3d334 100644 --- a/colorchord2/OutputLinear.c +++ b/colorchord2/OutputLinear.c @@ -12,7 +12,6 @@ #include "color.h" #include #include -#include struct LEDOutDriver { diff --git a/colorchord2/OutputProminent.c b/colorchord2/OutputProminent.c index a9cfb6c..c9f1792 100644 --- a/colorchord2/OutputProminent.c +++ b/colorchord2/OutputProminent.c @@ -11,7 +11,6 @@ #include "color.h" #include #include -#include struct ProminentDriver { diff --git a/colorchord2/default.conf b/colorchord2/default.conf index 6bc9161..41f76a5 100644 --- a/colorchord2/default.conf +++ b/colorchord2/default.conf @@ -18,7 +18,7 @@ play = 0 rec = 1 channels = 2 samplerate = 44100 -wininput = 0 +wininput = 1 #Compiled version will default this. #sound_source = ALSA diff --git a/colorchord2/dft.c b/colorchord2/dft.c index 2ee7174..a28a758 100644 --- a/colorchord2/dft.c +++ b/colorchord2/dft.c @@ -420,7 +420,9 @@ uint16_t Sdatspace[FIXBINS*4]; //(advances,places,isses,icses) static uint8_t Sdo_this_octave[BINCYCLE]; static int16_t Saccum_octavebins[OCTAVES]; static uint8_t Swhichoctaveplace; +#ifndef INCLUDING_EMBEDDED uint16_t embeddedbins[FIXBINS]; //This is updated every time the DFT hits the octavecount, or 1/32 updates. +#endif //From: http://stackoverflow.com/questions/1100090/looking-for-an-efficient-integer-square-root-algorithm-for-arm-thumb2 /** diff --git a/colorchord2/main.c b/colorchord2/main.c index 5d782ac..4136a90 100644 --- a/colorchord2/main.c +++ b/colorchord2/main.c @@ -17,10 +17,11 @@ #include "parameters.h" #include "hook.h" #include "configs.h" +#include struct SoundDriver * sd; -#ifdef WIN32 +#if defined(WIN32) || defined(USE_WINDOWS) #include #define ESCAPE_KEY 0x1B @@ -41,8 +42,8 @@ double Now = 0; int lastfps; short screenx, screeny; -struct DriverInstances * outdriver[MAX_OUT_DRIVERS]; +struct DriverInstances * outdriver[MAX_OUT_DRIVERS]; int headless = 0; REGISTER_PARAM( headless, PAINT ); int set_screenx = 640; REGISTER_PARAM( set_screenx, PAINT ); @@ -159,18 +160,19 @@ void SoundCB( float * out, float * in, int samplesr, int * samplesp, struct Soun *samplesp = samplesr; } - int main(int argc, char ** argv) { int i; - +#ifdef TCC + ManuallyRegisterDevices(); +#endif + printf( "Output Drivers:\n" ); for( i = 0; i < MAX_OUT_DRIVERS; i++ ) { if( ODList[i].Name ) printf( "\t%s\n", ODList[i].Name ); } - -#ifdef WIN32 +#if defined(WIN32) || defined(USE_WINDOWS) WSADATA wsaData; WSAStartup(0x202, &wsaData); diff --git a/colorchord2/os_generic.c b/colorchord2/os_generic.c index effe5eb..da281e3 100644 --- a/colorchord2/os_generic.c +++ b/colorchord2/os_generic.c @@ -2,7 +2,6 @@ #include "os_generic.h" - #ifdef USE_WINDOWS #include @@ -49,15 +48,16 @@ double OGGetFileTime( const char * file ) } -og_thread_t OGCreateThread( void * (function)( void * ), void * parameter ) +og_thread_t OGCreateThread( void * (routine)( void * ), void * parameter ) { - return (og_thread_t)CreateThread( 0, 0, (LPTHREAD_START_ROUTINE)function, parameter, 0, 0 ); + return (og_thread_t)CreateThread( 0, 0, (LPTHREAD_START_ROUTINE)routine, parameter, 0, 0 ); } void * OGJoinThread( og_thread_t ot ) { WaitForSingleObject( ot, INFINITE ); CloseHandle( ot ); + return 0; } void OGCancelThread( og_thread_t ot ) @@ -93,28 +93,23 @@ og_sema_t OGCreateSema() return (og_sema_t)sem; } - - -typedef LONG NTSTATUS; - -typedef NTSTATUS (NTAPI *_NtQuerySemaphore)( - HANDLE SemaphoreHandle, - DWORD SemaphoreInformationClass, /* Would be SEMAPHORE_INFORMATION_CLASS */ - PVOID SemaphoreInformation, /* but this is to much to dump here */ - ULONG SemaphoreInformationLength, - PULONG ReturnLength OPTIONAL -); - - -typedef struct _SEMAPHORE_BASIC_INFORMATION { - ULONG CurrentCount; - ULONG MaximumCount; -} SEMAPHORE_BASIC_INFORMATION; - - int OGGetSema( og_sema_t os ) { + typedef LONG NTSTATUS; HANDLE sem = (HANDLE)os; + typedef NTSTATUS (NTAPI *_NtQuerySemaphore)( + HANDLE SemaphoreHandle, + DWORD SemaphoreInformationClass, /* Would be SEMAPHORE_INFORMATION_CLASS */ + PVOID SemaphoreInformation, /* but this is to much to dump here */ + ULONG SemaphoreInformationLength, + PULONG ReturnLength OPTIONAL + ); + + typedef struct _SEMAPHORE_BASIC_INFORMATION { + ULONG CurrentCount; + ULONG MaximumCount; + } SEMAPHORE_BASIC_INFORMATION; + static _NtQuerySemaphore NtQuerySemaphore; SEMAPHORE_BASIC_INFORMATION BasicInfo; @@ -158,9 +153,8 @@ void OGDeleteSema( og_sema_t os ) #else -#ifndef _GNU_SOURCE #define _GNU_SOURCE -#endif + #include #include diff --git a/colorchord2/os_generic.h b/colorchord2/os_generic.h index c7de7db..163f2db 100644 --- a/colorchord2/os_generic.h +++ b/colorchord2/os_generic.h @@ -1,9 +1,8 @@ //Copyright 2015 <>< Charles Lohr under the NewBSD or MIT/x11 License. - #ifndef _OS_GENERIC_H #define _OS_GENERIC_H -#ifdef WIN32 +#if defined( WIN32 ) || defined (WINDOWS) || defined( _WIN32) #define USE_WINDOWS #endif @@ -12,12 +11,7 @@ extern "C" { #endif -#define EXECUTE_AT_BOOT( x, y ) \ - \ - void fn##x() __attribute__((constructor)); \ - void fn##x() \ - { y; } \ - + //Things that shouldn't be macro'd double OGGetAbsoluteTime(); void OGSleep( int is ); @@ -55,7 +49,7 @@ void OGDeleteSema( og_sema_t os ); #endif -//Date Stamp: 2014-06-12 +//Date Stamp: 2012-02-15 /* NOTE: Portions (namely the top section) are part of headers from other diff --git a/colorchord2/outdrivers.h b/colorchord2/outdrivers.h index 60f56ce..db3afce 100644 --- a/colorchord2/outdrivers.h +++ b/colorchord2/outdrivers.h @@ -41,6 +41,6 @@ struct DriverInstances * SetupOutDriver( ); void RegOutDriver( const char * ron, struct DriverInstances * (*Init)( ) ); #define REGISTER_OUT_DRIVER( name ) \ - EXECUTE_AT_BOOT( r##name, RegOutDriver( #name, name ) ); + void REGISTER##name() __attribute__((constructor)) { RegOutDriver( #name, name ); } #endif diff --git a/colorchord2/parameters.h b/colorchord2/parameters.h index f23bacd..b6c2fe2 100644 --- a/colorchord2/parameters.h +++ b/colorchord2/parameters.h @@ -58,8 +58,7 @@ void SetParametersFromString( const char * string ); void AddCallback( const char * name, ParamCallbackT t, void * v ); #define REGISTER_PARAM( parameter_name, type ) \ - void Register##parameter_name() __attribute__((constructor)); \ - void Register##parameter_name() { RegisterValue( #parameter_name, type, ¶meter_name, sizeof( parameter_name ) ); } + void REGISTER##parameter_name() __attribute__((constructor)) { RegisterValue( #parameter_name, type, ¶meter_name, sizeof( parameter_name ) ); } #endif diff --git a/colorchord2/sound.c b/colorchord2/sound.c index df7ff1c..9f03707 100644 --- a/colorchord2/sound.c +++ b/colorchord2/sound.c @@ -55,7 +55,6 @@ struct SoundDriver * InitSound( const char * driver_name, SoundCBType cb ) { int i; struct SoundDriver * ret = 0; - if( driver_name == 0 || strlen( driver_name ) == 0 ) { //Search for a driver. @@ -74,6 +73,7 @@ struct SoundDriver * InitSound( const char * driver_name, SoundCBType cb ) } else { + printf( "Initializing sound. Recommended driver: %s\n", driver_name ); for( i = 0; i < MAX_SOUND_DRIVERS; i++ ) { if( SoundDrivers[i] == 0 ) diff --git a/colorchord2/sound.h b/colorchord2/sound.h index 0bfe9b9..d83ed9b 100644 --- a/colorchord2/sound.h +++ b/colorchord2/sound.h @@ -34,5 +34,8 @@ void CloseSound( struct SoundDriver * soundobject ); //Called by various sound drivers. Notice priority must be greater than 0. Priority of 0 or less will not register. void RegSound( int priority, const char * name, SoundInitFn * fn ); +#define REGISTER_SOUND( sounddriver, priority, name, function ) \ + void REGISTER##sounddriver() __attribute__((constructor)) { RegSound( priority, name, function ); } + #endif diff --git a/colorchord2/sound_alsa.c b/colorchord2/sound_alsa.c index 64dc720..1161c1e 100644 --- a/colorchord2/sound_alsa.c +++ b/colorchord2/sound_alsa.c @@ -337,5 +337,5 @@ void * InitSoundAlsa( SoundCBType cb ) return InitASound(r); } -EXECUTE_AT_BOOT( AlsaSoundReg, RegSound( 10, "ALSA", InitSoundAlsa ) ); +REGISTER_SOUND( AlsaSound, 10, "ALSA", InitSoundAlsa ); diff --git a/colorchord2/sound_null.c b/colorchord2/sound_null.c index 47d5415..d7f8d16 100644 --- a/colorchord2/sound_null.c +++ b/colorchord2/sound_null.c @@ -41,6 +41,5 @@ void * InitSoundNull( SoundCBType cb ) } - -EXECUTE_AT_BOOT( NullSoundReg, RegSound( 1, "NULL", InitSoundNull ) ); +REGISTER_SOUND( NullSound, 1, "NULL", InitSoundNull ); diff --git a/colorchord2/sound_pulse.c b/colorchord2/sound_pulse.c index 2cecc35..4664c2e 100644 --- a/colorchord2/sound_pulse.c +++ b/colorchord2/sound_pulse.c @@ -374,6 +374,6 @@ fail: -EXECUTE_AT_BOOT( PulseSoundReg, RegSound( 11, "PULSE", InitSoundPulse ) ); +REGISTER_SOUND( PulseSound, 11, "PULSE", InitSoundPulse ); diff --git a/colorchord2/sound_win.c b/colorchord2/sound_win.c index 684e61c..559b87f 100644 --- a/colorchord2/sound_win.c +++ b/colorchord2/sound_win.c @@ -4,9 +4,9 @@ #include "parameters.h" #include "sound.h" #include "os_generic.h" -#include #include #include +#include #if defined(WIN32) #pragma comment(lib,"winmm.lib") @@ -106,7 +106,8 @@ static struct SoundDriverWin * InitWinSound( struct SoundDriverWin * r ) { int i; WAVEFORMATEX wfmt; - + memset( &wfmt, 0, sizeof(wfmt) ); + printf ("WFMT Size (debugging temp for TCC): %d\n", sizeof(wfmt) ); if( GetParameterI( "play", 0 ) ) { fprintf( stderr, "Error: This Windows Sound Driver does not support playback.\n" ); @@ -136,7 +137,7 @@ static struct SoundDriverWin * InitWinSound( struct SoundDriverWin * r ) int p = waveInOpen(&r->hMyWave, dwdevice, &wfmt,(DWORD)(void*)(&HANDLEMIC) , 0, CALLBACK_FUNCTION); - printf( "WIO: %d\n", p ); //On real windows, returns 11 + printf( "WIO: %d\n", p ); for ( i=0;ihMyWave); - printf( "WIS: %d\n", p ); //On real windows returns 5. + printf( "WIS: %d\n", p ); return r; } @@ -159,7 +160,7 @@ static struct SoundDriverWin * InitWinSound( struct SoundDriverWin * r ) void * InitSoundWin( SoundCBType cb ) { - struct SoundDriverWin * r = malloc( sizeof( struct SoundDriverWin ) ); + struct SoundDriverWin * r = (struct SoundDriverWin *)malloc( sizeof( struct SoundDriverWin ) ); r->CloseFn = CloseSoundWin; r->SoundStateFn = SoundStateWin; @@ -177,5 +178,5 @@ void * InitSoundWin( SoundCBType cb ) return InitWinSound(r); } -EXECUTE_AT_BOOT( WinSoundReg, RegSound( 10, "WIN", InitSoundWin ) ); +REGISTER_SOUND( SoundWin, 10, "WIN", InitSoundWin ); diff --git a/colorchord2/util.c b/colorchord2/util.c index d1e2d4e..9d1c8c4 100644 --- a/colorchord2/util.c +++ b/colorchord2/util.c @@ -2,8 +2,8 @@ //This file may be used in whole or part in any way for any purpose by anyone //without restriction. -#include "util.h" #include +#include "util.h" #include //Take the absolute distance between two points on a torus. diff --git a/colorchord2/windows/32/WS2_32.Lib b/colorchord2/windows/32/WS2_32.Lib new file mode 100644 index 0000000000000000000000000000000000000000..750a539f253150b1a6697f24fe29e2a434bf2798 GIT binary patch literal 346832 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 z%0DE}-jHBmD1hvncPq^UZ*XG(tv3VhC%6gD&yad8fH5ALCLuecA&Ce@2wukDg4Shz zIgm2G8JgBXaa;?IWEO^cr1Pdgdm0!Ria{X^_O}8XX#GY?BIq1XkXt}~sC!6m0pA53 zPk7G?sE=?Tl+MH$82X{}{r*V#cL_BAg7PEmo|8KGITR`RC5DFa1sRp`pwnpLOY^ex z^2@>V){uG$O+GOXJdOyGV`M;+OUoz*wd+7~Oz3hc#c(-hbh*qTP+|a`p$x9aSkUG3 z(^7JwYbRLIt!;S%nrm_K4>2^15AcWt zSN))57j6=dDhR5F&2ZiwQJj%jl$ruw3YD7)T7DG+T7m_NT)hm?+yf3K zNclyB0hV{c+jC$?U4&wYg4@b$V(+2(R}-3lZ$sOnAV1uN<{#Kt82TM&pmQ2=wB3<+ zaw2BaK`{y*f`YGBLCAsK!z}s*TK0qHqCj`Qfx-jShDE<`5F`dV!v^`h2T-`NAcfmk zaM&U)x&q}(SeSi74Krl-A{z1NqF^_&iG7ELSqyX^=1pjsCj{-Q&JYQIt2_KyX4K_m-MZ@|GpP=K|jwxlJ(~{vTLA4CHZUDD2nFQFO@e8v@5893iPAvf~ z)JRN$BuKV=Z7HsLF>xEL!^l%sg8LmL7>fjkewQ6Zg;H! z`4wc&UTE756i%Qy3UC{e5tLUEV;cz!3?H+g?Ep}`L-x@Z<>!Rw7lFzVSQ=r1j-P^s zp>0>toHYwWNMbrz5YqPniGl9kf%NwvqL;a7~BlVd=AJR5=ir#AifNQ z9}nIz2=y;`u8YAfCqJ>koRQ2(Hw<%-&e1I0fJgJVu+I(Q`(IPHPPayVe?Z=maSK=}+5_aHd|*q$XMIZ#}K z>JT}kxRzkBDb34E%uP+vElEtb1IIOr2(%oOhsO0s4F(2!x>b=3w<zPxFj{T2y*`fXq*Iejsd7$rXtC}5bqfj7!N(<4tljWrD5?fsN}Ryem1?pBAn8*SYV$SW`*P+JmIW@$j(dPReQ0dz+xD8GR67x?Tk z&{{UgR5&<~fyCi^|B%E%{^ekR-R%KMR3JZq%mSIu1G=*iyf6t>4piR>FhI_*NlihD zZSdJWtfHVbb6RAicWtPj{%b(aRR*~OPAFu)vxsE>IdRxwE28J@|+#jfq!NB00lUNLy(*yAtkk80WiylbsCpJBMLf!AD$-uw{?Pr17cA&K< zuyf%-?I#8X-_+cE#2rqcI)(vq-V*5CY_QuvWj^?h3uxK_m9Joa7^EKqD#I9HYd4^3 zKxGf?%rWTAzF@OJ`JDmn+$K=o1NZ;ZGSfkQTUh-CO5-s1!SWv{9l^z*X&e++Ffmv< z0{I_oCg=ib(ABb^KYaw9HP6eyz~(Ip+GB~*`USOzLr_GZ?O`8iIDXK8>^%gP3!pe< zV1S%V0dp%z3^OeRgT}5vL%-k?dGqriWf@2<^o&UOeqvDn5cBK>@Hvw3y~QB6a4?iI zfW~J)Z8<-rbfEw~3j@m-49I7A$7k5Y{Gon)p@AraLHUh=0oJKN)YBYjbCHm?4x)|+ zxeZhX2O_ymf&s_eF2rqU)2h%pVQBaVLEXmEf;xu*84a+3r_#MBF|P!E;taxE2?qb7%yiH-<1Q%1fczOI2|9N*xHKs%HMs<~y$-sp2A2Op zb4sAK<&dyIj87uVdoVbbR)7mQh`pe&4nXoROf4uJY8V_rVFr&-&^RZ^EueAZ1_sE0 z9&F4QCO!cw4%*)hlLNIMLE}C#;Pe3=^UEHo|Dq#@3429;9` z3^}0l_Q4m7fb0f|F)t^(6v(muFhnf-3IFOB}g(bD2XvJY-9kH70jZbvI&GM7#KdTg4W@XF@5;jWM|N* zAjl7(bi#tz?~Sqt0JNu>10e_5EDueypm-NR$iWIs@E9D(ObO_{N&$&QiMgqWdz+HL zX$tNRfXG=o%bk{=H7Qp7BanuvezMzZ$LOdOP;^B2DV$J}Utb+ps zZ2uMLoJwfB3FDkf7PR(Go+M~~6x7PgOw568mjn&}Gkp38%OCmRu!H1R74RNm(7i+m z#~~(JK!HNceq}bX0%)4Jt;PVl*FlJbfq~(Z7z4v{LD2e3P#K4y0|XfuVDn(0d<=4N z5p;cDu_WZY05t|ioMwRX1vWEEp=Ojp%>a$#!pw)sRY2uHZ3!&(Cg{eLcqhkTPiOGy zA1J3NVwZ!iji`c}E5*Pl#0vF0$nI)M1_n&GvNF^_-C7IP2RhRUmwSRk9Q|BCr&fbb zo5OSxHfeDE4jOZ=hnkP>t_B?LYJ|G0391id2I%Yp(43|g1EUZp)Ni181>qJ@xyS&C zUyy$>{mRME3N^D0YNiqcqYyg|b1?O@Gju@pcS7~U&VvA@FOdD1dRQ2`p?Z3tdXW7O zN4nkQ&EaI22sLLC)EwAa7m%Al=@PQ`i;-apRNYjl zI&5;&;c}35H=w)&!U(lY3^SqT%z~-~oh^$iJwZ=si1!b0^}~_OaVdePt2t16ki!)e zK651*7#>QX=WkYqc~JMwhw3xJejbP`tb~M=Ja8`D-i1*8pmezi%0^BPpftHy5@A22 zPG(_P0=0iBR1bO@1jQo=FBZaK9^Q6avK|C_X{wPQl^>6b7I>(^f&% zuZF4z#T7&jVb)rx9J>24&0}F$4>fNCR1av~C6@RF-Rc?S8XWBE67S*|;s}miNKj&v zftFpHpl0eZFbZ)YzCP<@~{how7M_t=^S{~y2HFm;1dlgB#39>ZAnpG;a2pUJ4&HU< zlvtdZ3~CBO#tE7wL3a@$$p@Dt=A|SSrGS+{%xISctyzPpf$ft3wX?b;85k@WAmX6) zV#(RTnR)3s@clNulAt>}k>x>~ZXjk(kObY!fhOlv>77~$ao1!}y#zHIvcv_{87j($ z-6cLv6127rdPcBYW=^VGevw}Z_&lmq=xJHtv7i}}ptWw$xmrBxW=n$BzCqmMk_x(A z4q_{;zqCLSv<40$4-QAa)ROZ2qHO;H$YH)Pb;~3f7%CWG?#c(Q7BpDbcfclo8+dh0#av+95^lg-6V3+~Y2Nr~D z1gE2Ipt*Ty_<^hf$rhy+gEotU<#$LjFsy*e!?i;dfZ}$SBm=_+kl8TJAU7cy0#dU_ zl7V3dNDbToG(}K9ACP2VH~_T^9Cn~UgZl5VBm=_<23Y)HhSxDk28Ihr;pv?0mQz}s z0gl@fk_-$tko3ajKx=hm7#NsNBDHTHFkq}^g_MWrD_@~)`%}<%tPu46S6JN(Dtlmc z7l;ijS3ua_a#) zdKtXO4oLuP#xCd>E#$5S$N`eDu0b)hZvcwd%iuD`zdSFsC^4(aKF(;Y}o8hp=jY7uNo7nXOffXgcIcxDRd zs^e7XzLr2iP#NV~k(^UnoLQC%lLDIu3KIhcuv@{auwiB?F@VY*h+9DtnW>QRbdb0U zO1EX_)Q+$@{?NvAYLUM+U(C4jGFFiAA7|bArYUB4Fp|IVC1% zgU${@x(f#+pTK}vPXcNu2{JG+T}4XM84U68h7lyyz`5Y~28~x-gQnwmQJ_9LlK`yU z14_HFJ`jkFyiOYwN1(nKtgi&?)4=Z1gN)mP%i7HRJkVZ1NW6o@IT%3uxgm!wgJqy; z2P7u|mID_SU@1^q1Bpw3=W5fzN4+D*ALu;OoK)0(1)%;KXm0y1QaETZfbOz&CAq%_ z3ZHw>@By_2aI~d-LOor;ms~l9gammyg@(9-54jAD$07j@cV^KCl907~ptB%R_Y%Q} z+aO5~8a|-31zLlcSAwYH9)jBfaP{Cd*PwB&M@W7bVZb&{j5)>&^6O)$U+Y95V^=UY zg3cBr*Nson+z5&vkQ<*NxlxB99_zq01GtpJDg_NkHnHbWH|M8;+{_^WNt=*1A*jrS z@DcqrSi2aMreXbm5F57FKnpfT2Oe+sDb0kQvk3}+4$!@_NPAd7=>fEc;T@7+co?un zJH#ir(*v8>d#FDwpnHU2{ZWt~AoT{M%?LX;7nCm;Amszi@)*bt1qSHC%gp>d@Qo2l=88Teg_8v|PvYu8LP88Yl!8kMJPmw- zh8?KA4ceazDmOr7DrlZGGc~USe4_%iJpnqejRVhlZ6JLDpz-kB#G*=wMsPg>5|?0r zuA>1Di$nH2gU0ee>khsl`Aq@otTs~Td_ei|JJdgsX`nKhv~kmU(DVzc9~dC@9%TJ3 z)c-%h`Oz~UR<}Ck=NE&HI|GH;FR&cAu7oeKg{_1A4VLrF56lln*9s1wKVW&VUW{^! zg8|%304E<%+XOVO{1+*_1Q_Cxnlq4?M-qU?^FL^~Jcxqibx^+=bV3wtYy>v$1Io{^ z{xpaU>tiA3CD8sO5Fb)LK*oVUe2AHdaS~WR6=V)QXu2FU76_{AxTGLsv>;Lf zny;`8_CZ1xoTso!!^4?d3bNJ~)aM5I6;}Sh_EaJIzOeEZ(T|3WPl3VRWnh4e2f@z8C>8+u5Of9)WW5h)O_Dg0-#HlKk(#s+-y#XX z{U-tS-}Vqt{$dh6NQ{XAy66{Df`iL-V%-O-1NF&pp8?c;UQ`MrBQo4z40S`O z8tD8cNEm_K#lR4hSPrc>L24Kv>q8-j7D3lWfzqNW8FrdM?ericEm|PiM{L@+gxZ&Z z5zfvTiFtXcuyHd;e1m7u;qi}H-)IP5-)K#S8*HF%C{$x$fb|tY_A!9_cj#^i0^Ms+ zT!OTg7gUZw&lZ5M(FNrpkT@s2PYv030}|tci$VI?ATe&Zm@(Kdptgt|8Gf;c`lVbA z|C(7xGR$^@n%#;KSE%J83)(s;P*@`33Q=yjkl_Ybs2h6K5bLo(=0ny5gPU^j^g-;J zSa&kq;Q@8WEF$v>XpJ7Mj_@MGK5wXfi-@()0us)ka=@1i`~0BxEho}G(Aq+n{{qOc zFA!?q8nuC6QyNT$`$M4a-v}zJq2raHdL4c3C#dd4US|rb2cc^t;A=`jWiV*XCitQy z@Tn+ZDR8<5m6sqnM$^bAQx&{@LZ?Ua61?43MwDlLDbPZDr-IS9I zUX}%I1Ax*Y%zjXs29_4v^NpbPC}_MGG`|R9W6m`~))*knU}b=< zgMh6A0O^Cxts~Sy=J}ENptTMNK4R_@Hdm;IvKKujH#09YKPC^f5jLivG$|*uI0Le$ zN()t8Nq&A#aZFiqOog#gOk!?|nMq7?j$Ud7c+QQBkyQ-TgVJ?#R?zhgQPA~Fv5F}w zHpFf^R67Ax2x-t+3o*XILCy#vWLIbACBr53z+On!ODjr^0Utt`mzV=`M0sXjOhHj* zS$r|{-jS4)Y|=I5rIrxX!~hEmbSn`$^OLglz##~7CB!FSXM;i>d=fx@QWi)GtOl<( zv}lXLt`TfFTA28ymVm56n2t?RSuUy?EDp!#0)~&@plJwh4Ja-$^9h;?x*3Lezd(Wz zS2D;?1m83RcLH(}L7cuoKpN!k^2|IUR3+yZrNYwyA@#{QpixAS7D6g>^HWlb@^Gt! zBx~%ZK;-ax0ilGD6)}X|3^NMqU2XVhKBfqT@xP~>U1{*#UwZ^KmqFFA07;{ zDLy>N2Xxe_o2Ppy^!7_1S9eF}$aqk6LzF|Dp`hym;fDGK$GiGDI{83-4-pOb4>vPG z5r=xq*#~rIdNAk)g7{!ZaQG)H=td=5l_zH;7R8t7D(FV#DCkBNSSaYaS1RZxCl!N_ z>QvATH&M_nPcbn!Fapy?28If{DTbN31^GoK@p<|2MXBkT#Uo?gPf09EEy>JH1@TIXGIP^1 zb5gCKZ8$7q$aN@a-W*ZSrx>DX*F$MEU^6QzGY`=m0tJp^PELL~XvI%r32611r%xE@ za=!e$VvuB1rnZ7^l!sNYhhw~vsTnw0EG=NPIhb!^ZV0B0%`73b0faU;g+!-`kvYhy zz_Qe2-Q2{IjGW9QUARDTajH>%UQVTgu6sGixtZyC`9-M#MTzOTiO}nVz=y7Y{0*zy zAhsAnU14slpzGq|?-vs9;u#D|r11gH9`WIhL4KZo?!ob%elT{t2Uw$-i2*n@mSljA zM+i<#O9kzO0wv01E6}-PDK4prIXU^D zp;(H6p+t&-p;U^2p-hT_L5_h{tQ@2^8D?XA1<1}2X9e8|hEE@bp!rHKCKGf3gI+QN zXs;urzX465kOm-nQ?xAE(8NHmASH?6qZ9+P7%M}j6azz+6az!06azz*6azzr6a&Mj zkM{qX41;JtpsC)*{ ztRV=asbc~g2hjs2|AUS(1hc>dnD-BK+8LM&A+9hoF>tdmGbk`IG5lxeXFxNPapgaV zI*?`%2H6Y35K%bEh%guIhkp+k82&zBU|kyW0AY|BY@pi{p%}?tMvy-gK#JhT zV=^8vFff6F1%yH7e`J8%4ynq(D|iXKngXOJGtVqBC8a371hktczn~~JEwds%KPLrr zYZE9Y85p=hS6MQE;+Bg6W{wF11A`F*kDwg5{|Yh(vQf*~GXQjiFZe81H~%2tcu$vj zcW2*tN7rCbvBLm5u$r3zW+sS*FjI|zfkB0VSCAc~2xKHfW}XSyZMmg6C7H>I#U&8u zF+kkL2R8@ALYM=(0TblMB)Hq48?f9Gb2D=)LF;5;N9u#!16m~q@gs%G=qi>Xdnk-CWwVF(~yCIL7&KYb9Qo$H+FFi21NzP zXR`3{2C)!k67NprlmPKND2yTQ1hEiis)BE-$CggZOmY(o3Q|+xNdX)Opcy)dIUp9o z99;$m25qcykeHK`nVwrvW?YnC3fh5}pO=%FmkskPC@n(F1F;b1k(2HXEsel#)P#p0 zh=njyj)8$ehJjb`5Ij$&mS&n*#3ND}B&>Ac`avv&eh^O!Yo1Qb$;r)0DKkR#A}B8P z;bwtY2(v&Vgz{L;GAqe9K@D?IyhFkW#6p+>;u$aylWt+@!O+M8nr=#v1M(5DQ@r?(~_MlarU9l3JXf2clr< z$qsG~h=ni*lshG`r_a1fXqY&{^@3Oky}11XO3C2exbO%A#kmXI91sg(4rmrhfq_R5 zbSnnPy$lRaZm#iYcV|G|;tn?h#6p-sOn87?1u`Gx7B9FtAQr+Ln4d7~0FZ7>Kl#GV z0kII~K>Wlj_#K|7ib1C|XQsrL=7HM(nQ57+DNsKJz|8=$5N5#gI+5issAX*kDuF@% z0~MN(^ao-g%rszNV9+D7`~}sSpqv3RFAVNR5DQ@*td7A<&!}}wBwRm;h0qW2BerrD z(jLgn%Ph$R6_t6};J^n}$En4|;5-%sHxtA{n5oUcz@UjeP3Po5jLpa|E-8kUxFG+< z!_5M*5N5&B6=r%sxH%ve!W=TnBukJUklRw>W`bAAQnO|tggbEX0g;&wQzGlEQC4c3=9mWMAf6<_8+MHF)}ra2Sp(` z%t754NcezQp#6cMTr!GBLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1c(g*1qB5L z2he1oUS>*eEE^+ej*6MVAuTnrM9;ur0wco#h=^WFYEo&s3TOa`0W?*^%s8bE#g0@4 z2B?}4kT__bhMDohACOuQAB;h2ia;y*z&yyj79)7u6$1l9?n?V@3=B-5VF?D%TpL0S z6N4U-F3_wEGb3mQ2c)7~Eu@!$ff1?;G?ot%1*<{P1)7Ot2G34`5DsJj%~&xrf=2T}N+kR@^danu1_?1RfYqS75Hz!guOUiNeLJu70^zUS zP+ed(D7rv1TnJrZ|Lj21p3soL2h{~ugQ5#GAIuDoWrv&vdI*0pL6Zka4XVF*85kH4 zp^^DzwGu*?Bvcnj4XQ5C+!?}!&Ss!1_%gk4{tx9D7j}HOgs{sQstcqB)h^J88^T|q9G3kE zT~Sb7AT_AEq`_ebD!U*d0U}}LVG&dpNDZnk8L%!;=>byzJ6)^<;jcERF0dLDe}PI$ zTq$Y|R2NtciZ0OX9wIcR8L*cl{B;hh3#10sg`jbLgsu}RO<4$C_o2E#YEX57N?k-4 z&OBc%iqORhT225x?+;ZMXwDCzYh7W*LWC|Qs4kEiR9&DM7DQ;QovFc%2t!M#F0dMu z&;X6i;?flh)dg0AqDuu&eAPpBfz_bs0?i#D?6Qw|vKrySg-~5!H7L43Gf)U!s3rDs zs4lP?6kVV(UqpPdFQ4Rw2*a09T_826VWP z!3bT-P+cH3sJgVkc0r{XL=*}w5W4iC!XP!Mx66 zX0$;HLtYFupjiY|yZA8Ffab_i{mze}#u6MCAeFE%6u?kp1y%zJZI~KC3^ky6bX4~U zVWJyC<*@LP!BFD{Rs#xcm>O9O zHK2KZ)U+Xop~eGj4zgYH7-~GhYLL^90)`sUS^!kPD`Kee2AhLymlB2=AFvu^e<@?A z0j(E6%{wX>YW%?FAls#ip~fGq2H7q(3^ky21*mCW9YakZ*c{~aqk*9&2&@J@t5=>)YtB^o*)iB?qtuli-3A7Rd%c3!e$=EE1nGIS4hQ6u` zW*7EVS}<9pbypB;aC-nW^9$34u`CKEfj*TE6GyD408O~VmtKOVyJ1Q|3oXE_K%g_| z*p>;w)FO-n>4F;v;vgG=ZB-5~Z^CD}!K-W_s<4GQY~2jZDe!az6M!rOz_qjmDXt+3 zkr%5VNrHk2wuS}b7(6j!X~Y0ggVVuyRe;hkXt@V&GvEo$$bx`P$jKb0EUKVjXkcJwW~QKEXk=ny zW(kr@;7V!ZXXwz*kMMrX$N*~ngKBT+cp9h>1aTQUycrmBV1*o51a!)zfD=?5s2~K3 z3QS~V_yVdDz&r@yz#!m+Jc#?n680AOX;+l>!b9*wl#-sZNDRbtXip1NEI; zh)@UeM>;ljNG)`b_ds<``F%!)`B1f>pmY#`haWtgL2c{J_Zb=P6QS<&eMScP2aqtt zXP)r`MuvC->Ok%*e!$2un}9ly`_?~TWVnr?t|&FRqzpP%0~tege++RO$p2u>B>-Rd z-p;_l;K{%U8g62M?4m&3sDph=1@fNUnBx58?3C0rkUj=01{*Z?y=7`Q8U9J`T05E*acq&oSG7xT3ige!b}vZl7RtPB{=9n zW->8=%=B~vAA$*vFl8}NfP&%ydU#@fQCMnTN`8@hYF=q(o@ZW3Y7PU)R8SZ(Gk_B! z>_{ShXwb1T1UP#-l@>GbLIpS(oIzZ926jPE)UZJ!(lxI%H?=6SBsDBCrxbLdJp;@D zE(YHKumQph?1H(V@k$17@Gd`J(A_&Q+gTVwN{f>6VYVxQyb4a$AlJiFkzamEaA^T( zYhh{%IB`^pfd&p(&q9C9h(UUOvDll?1CUo3{Xvo zmG2;XKw%3yDJtEsBq$ZM%@LG9VD_+rwRq;0CFW#8auvwi3Mk%&g{3kBB-ewE{DP%a za0)2MLF9Z;Y=VqXWPlfEF#VvE4yvt~AZY+}<`1N{0$mRcj!DosHfoCXPOWrIDh8!> zP`U)^W<=Kwx;2vlq#YDO?5G7ZxM%>S2Y3m_#Ne7)oCsE*F2umV#sDeX!xOVpT~Z55 zGGN&N7J*z0;b{ffgB+BYSQrqA$uT82GY?$$f&xGZB@BH_i%Wt_lao^sB|6B-`$3a2 z3@P~~hKBJ48I|!Rl?AEsrFq$T`Q>>Gs-SXEfPq035tQKa4XtJX#WBc21}5a1!LI_G z$UtsnMRH?sW=Sfz7y{L|3=A$gup|b_Cs)CHB_Opi6N5_*B0+=7Lr^9G-Fux6xiTG8 zg%p8u3#f1hrDjku1WL_OsYUtV5C$bZ&;_XJekH-FC7=Qqx+4#i1VP?A3yyK58oVU2 zBsHWcF%MJ<=jZt*Rxp4Pw=p=Fz*nZGr^1fG1!q!_|M-yn=bn?Fl$ZmrfA|>!`~pCQ z4740bw_;!rfM#HB2H${Sa1pG^z#*tF$-sc^sxKGBA)*Ql9D+uY3=H4{13dlXeO*8o zhB>;#gRXAzaSd^0kYnHw1YJN3QxW6}m4#gS!l2B+AqcwgGytZ+(K#^GGsqRZ_1@Xp z%_lV2gFzn6knkYS5Ld7rP*a2%I0UVc+~MQz?9Cv;z##}aD>(pqmtTm#x2qq6Gy{j= zRSATX;r4m@xH8Bxa0r5~WQ92fdLumOmdqf39|k1`4#DHt^!f+I!`uoo0(A2;+(Ry| zA&$--ptBM@on09e88`$jKo^F9SCGM=Yr^4y1vU-YaUg@=g3LfV zJ(oe7P_jcdL7ag@5ZUptuwam2;1K*P&cNUq6bOx-_yB(&Pv=MmHE8OOCy@LFKb-<}V2b2Dpddwuv%u2<`xR1m(bcaQ;vS348iuz0D33LO+oWgro+< zeQ)5*@dGJQVpRZ&25g=I#{wuIJ|WxT;u##^7~<>!j@C!w3=9#$j$z;|>FXH6pu)f* z_z}s%AXgt($6&B@ysy7YJU9-)k^ccnm9vMdvv<6wTYP|jaImM74!VDu&s+l0pzyNhYa0uu` zXMYAzng$Jcz%S8=5Agt%tl)CtDYB6$#T&>&PcXs;bf+2vsK9@WtPy*xiZO5qK9YdD z2cA$sUU>kDD4a)ngNx&P2(6$J%h3fadKcMVP-zHG(|3?XL7qd-)S&Y3Hj+~i)7m9gMx--jdx%Aeo_3pO2GWr4E8O@u?Cmp*t#xq>UJ8>r4gBz;%~01Arh z$cjK#z}*kF0hDepOE54X7nY!;4!V^SUUEPk4K32qt1Wo+fT}G}(9@(8HNZfSqyxSrimI zXbAvR=I%#IBM6tks%TKFW-~lY5QQ-;q(OFXKr#Vr0XX@%f^<3i#)Hq(f!!P!kJO|B z1-F9)14Font7AOQYhA%rJpObHPSDWy5h%NW%28-qM!Savl;AIlGoW6X4z3wM{s2{4 zsC5=7sm=ze2fHxQhmi%r zrT#)>h42gpDjh)4J0Ijjn7iSnHmE%dN|5-{BdDrz0+|gB47g@cMGH!(gf1xtS#Jrl z9{p-&aDET~r6YLR6Bz2~;~4@v!z@17H7E?!UFOD?T{HF~k*IZRmnrg(9lO zz#*6dG7y|Fv1OhxM;}iYC(n>z22dFcTBQXwz}GR@8=Pc7E6L#Q0X6(xBSJuDjyQXJ z`niMBjVriS1UeZ8)Nl+4^7Ie#42cA{{B#ht22xuARCKF?T;<~H81Lxf7!cwb1kNe( zVTRxy2PhTeNW>t$vEmF20iJ##u0d{&&aUx6u5PYDpxg#dr?ukHq9Vl8*EKlA(Ki5W zB&bP=qeaQhz#&-5z`zjd=@$Z4Yaqw~x=lMI-o+JEJArO~cJy@(aSaM);A7wr3jtNSfV(Tp`^H@KJrPLEr|LfG`6?d{Br_yi25?qpzoPyoY13M|=qA zz$^w$P@@#&0_^hfu707uu0f6={y|_re*h_U4RZw@xdpm(6v;K9l1NzyQW^$_I68aB z`}jLMhIsn>fgSN4q!YU(3_J`Rf}r%{?HLpZskK1EGx6Tw$O{S$2my649Kp#2R3c}I zF)+k~5(VT)8>CbLGDudKfg!*MKp_k+9D@U-X@3W~5`aO~ECw1oP3I{UkTTE#)0 ze(vDn<)9D)1IVe+j=iV9AE?b75(??^+!tVAfLjfTdDjSVaJ>du2MVrWXGb4UOvU>K z1&4!z)EjK>E0DaS4>*Wj&>l+VBWbuwcu8zh=44@M8B}f-I zjX3-J`uh9DL%hHMDga)9_lp z;-JFdHb^`;1e`2D&7^x^UxV}`n+z>B8NiNYV_*mf_3`&}j}HieWWG|65Xd2(ZeaTz zgF<{kInfi+9k>ay1ME0gzmT9vGZSz!2PH8?@`k4|P(A{cX4s7bRbFABqSwB9V(vylW_^)B}0^CMaKcgG&r>*Om#C z>p+%5QeJ$phhvbdOT4eEuYXV^xMc1DsqlvO3j;%4LtVic`6S3W(7Mz$BE;1XbWA2V zWr0RM<6Zni3=QK0JR%{<1k{M|6owY@kP0op(b*f6VnM|g=%6vj5U`7VMHm=@{hhrX zU0i~|71?D_Fv4?|i@&d_ITn-(z)pj@3^e!y%7Lh9doRdFPk&HA2SD=`EH{7*0G*5hIz|-~Nud0? z2c#UibYS3R;1FyUU|@h|GLZiZK>5Yl!!Zb4YJg^cpu-R-!47KBT!3arSa}H2oel~; z@YE_OGIxV4M9&Q%A1?-_10TmAcTg)n#MRw32%L&{fogxq@CV2rpixkeMYSRf44wgD zCh;DwjxMf2;4HBdWHda%!5TWw9*%x~u0CMHwj-r|e>8vFc|4-a01EbbU_&v39n>2IO&@~}5Dtn5 z`6&$4kqHQL4F)$6Kqc2)kY0=g1@^fcY8f94u8AO30H}ro^|rwpF*@6zq}2_|8X*yW zh?YCFmIFD;7uBE8MC|6{=niS{O$Ip%Ez&_AT`$JKfKq!wigIupR|r%ffeKo1JWm3d z04-#}kpn9zKrY`Y%D@orALQ*C1RbJ;Hzz=;;E^z*(gNopP?z_W7`VUV3A(z@Gs+dU zZ3Z$M)S&=niiseLJ^jqUu?}`h52RQ!i+2lhbO%){u!I5%{&G;RfDEUBvkKHhpz;GW zD;FQ+>JBhc`cJy<0^#SKs94!t=h5!}1+Mwj^?GoS&uG#xR z4n=Dlf)eyMu#3Q91}!N-F*Y4k?tp4!EKO$6;9{RR0|Q7JN6QctGQA)R;l%|gjdX%U zu%!`DebWw-bPf*=31Z-4;1J9c1Wk$rfU6?VdN1c-5C0%YAFdIk5?d(@%8Bm<85p4L z9Z;tal6*nsN(^X@1S$h9_hGRQS`!8;oZ~a|%)m1X4Imr*9DQ9~;sZPbT;rXCTpdGP z5lK6k0n~v7?Oy~ZKv000fC?In9#DLMzrPPSbJc_DFkeUHIvG~1fSk<%iYstY1Rh&} zI2)99zleeA3TM{&RCqGJw< zyepy%43KUDQsWVv0zCcP{K37BQ=n7<9;@*U4RMVCM+2z&32k?Pyl({xP+u1xaOzqG zQXh(0b<2Z75>*(K)?W%TFgS$<$3v12tUm%W71Z4c2=;UVn_9rYz~Bv?)`AR}xq|1# zia@4TZZ!oC12w?!_fIN@|u<9Aytdtc1^{1ipB%m%iwl)r+7!7zgqdyzz(HD+fi7ASehRg;~fr?F(W&kKQV?Yk@b@cQJ_VEwFQfh!45d{hdUqd4cN3c2C zAX~r*09q)4N^X!Eh!Rj{i2#`jcUwGE9Vi7)gEiTLT*Ex!eK=5O6V&7haSRC!hQt;) z@qq@>!0k6se-hMH0UfWGnP&!Rn1XBy6=Prk6)~WBSJxm|y#=a?LF-83!JQFM*VWYp zG*2Ar69Ueqfgtxm>t0aR2x^~$d;!Y6&fqQssOAd*slpsR0x1L~aPYJWIEDL*GcbUQ zG~|I8&i#WKs;N}_x>ITD#S5R(s23hXt7wj1i?b3jhJAnj! zTtTzSpk^bacM8t)pwbMjFavp^AJixSK&X796)A)g^|Wq!3BRbYHJ)^ z%tBHxI8tmu$pI8l+Vhyn^OxAS28mom<5i7+`HwNMei+@CT<2 zNNa9Cs4hSooHc{Cc9G)`w<{6NT~O0s8{|?@X%DF_;KNXm(E(6S76XkQ`+;1F(aZ*= zFVG5C(9oAFxS+fS%5h-v3K~*Uv%OVf; zf=Y7G5;AZr0%AR=XQcr$8BvmgJv9f^Qg#e*29I}wmY727cgQN;_;A+%=+G0m_YRr} z0J#jgMg+|RfZ7b`t>Jhd4{&J?ZcGM&Ta)?>9D>T?;65gCgL$AFxLTNj0Xa0mc|!^0 z6Quqq()c5&ouUYmcJ}uJ-?8EfA1a15aX^K1D=0EueB%8>J;C{q6P%rVLB$iK`vS^u z;Q9xYYC)@u!0jmXWD9DY&Jko_a06X*0U6Np^!I}{!9j@u+>XKM;eqB!OAge%yDf*BPC{KJAh4fpobR56~{owKul>8ur z=%}d=6vL-Lrh}?XqzMC13O@k~1oT1`Y#QhyjQDUz&k$H^7uqBPdFdOXw;CD@YFqpH zhj_YqLZm9ASv7F+1b&&i>v-LOss*+cMfmbL^0l9*x)B?%| z6F{o5Hzh%d8QcW`EfxZg2*NTSsI=|_X>`WOBB1i_DX2jV=`2DD8BpI1G&P5kz`>nN zchDdjXnf~81sa}Crkf;NjlrIrKg&@Q+x z1vvtgH&BxfC|8JpY6Q$-{dmWqAVJ;+)i}#6@wgxI(iQa zC{R6ID8|5mDhuoKfKo3c;ebXUK~Y@*@(CgdLi_{H+99B5!Eh3I`3E;h3P+3~E&l)| zQ_%P=XgtB#2wdWU7Ghu&7ob)-C{Qv$Zh_6&fg&^=BmgRYKw6+ZS5WY$fyB|;q2OlS zVNjf6_y!c)sUR&lD_&4$OaZ9?c?!CO1Jp!&2Qm*joa*ct;OOM(;~C=V8Vn8~P?d+J z#sjsWK;2>FMh&>Sg0^fx6U`Bz2*f+|3JMQUf(L~icsd`H`#>WXpo{CkOU4mH7a$YO zK(5DG3W28fK=~dtev4!H7UW$ckRjll0_!wEx)9*<+z=$`=^qaoWeoy%$3XL);OS0~ zV?pD@ej(6g4=N8-LF(N=r6|-8kOM#)Lm{0u#DHg*tDlR15IA`#iZL+2hqjPMMnKsZ z)VxF;WCf*#zo4=N6m7u)K8}&`KAwKwkkwR*pu#m2(u4*jCeWrM7qmhclpjD@*3&P< z*a+ML09`f~fNmTpQ^|sQ-&i}}pkxkee?k^efx`+MbD&Xk5C*4A8EifSkBvPBjg}&p zo1p4k8Z<@)X(NKu4k&wrMw~!$QlNnK4lzQXSp}sK5s(}xx1iR?pnwtrNqPBu`hg2| zXl??Pzk;Y^H}LQWt?7aIDF|GPfoAF2a1pFkl7%{L%tfOfaRX3oPM zy+QYv284KkOGwb5Z9Jp`0TBWFGfJ!aUN-T_Y z3=U1ubUCPp2A?kng%}IS>)><^8VH9Bt$-HYfr16pWyKhF1eF+|6AlBA3K`UOC!k3G z51N;74fgc$2iHbQ-~k90Cf{U)gQR_0~rEJD#e*qsqrP?Kn5jeP+%gb zW>EG5HxQ7z6|5Ztb_6IQKuZ{)jzF%0K>qs%ay`!a50qm-qwq)p z07{79JOZAN2?&L(<${(J;29-QzXQjzK}cgA++g|$vKXGqPzJC;vJ8^7LFLvpkQCILD8)2r@I)9CEua7~GXW>8S|M=l2z3Bx00cCL z?C%Hm0ccNPJjzNXP?Zho{z4|CKsg4~Qvv%EPgez01fB-F3$Ydz9C|9Cf+XBO$Qx4E z#)I1qpa?kyQjIaj0?PTIQBzPlJ_%BRr9%vAs-FPKfg%N4BNSx(F^~dC4+R=$(6uYU zpil>eupP){pt&wk$~g*B4hkG(E6F+I0GGl;THm~_&`MrXqg34ascHU1yHnxg1hIS$^kU;hO+pN z0i>B0@S~3C7!C*5XOG-hN)ecY)fMN=BN*xqj;E{jOS|L!0 z1e)^3?)PmVQ$XboyhwJ901qyK)*it|>Oo;)2dc@SsTf*if^y+Au&}RVJkk&=sEx4+ zWG-}+1{R^PK|_Ww3=9kf%%Hvd3=9g)6R-HOofn&!=3#DY^`S8)lwUIJy!pJ0`7VyT zLmYR=zhz(mos_7+eDIsH(SwzGv-yoAF7J0|RL6M1lFE#QqsO(~RdP zF$k4ZExly$Oh~tQL;S~!F1ypkITVD97#KijAuBN7SGURQ`d!`875wAt%RBW8txxp& zPTBui&!%a^|KAI(_A)Sl_6933?+j!+HP2mo+PZIF4<=^hPLLP2KE3OSYty9|mde@> zn#>FgUqPpjGS|+|e7tJk?U&bhKIp&KdK^`oE_1%}*}?upd1ASTdQEH@7?c@7;gV*Y zC*>z#u}9-f3vY4Wp%b^;rQen@=kZJvJTUjG=9Uc%3@%`Gee1sOmTdjn^1>h_+0)tN zPw1+vxig;5D|S=2d9&t+R1^b4Em&Qb&Ec@^R(CG3p{4y%vh3&i!H09%-8TEgRhF*VW3%~OT%33YlVJk`!ws-H^?OUM zyh*ONytFs*->s5-5l1!NVCyjU^MPBYp1z}dGKPWSJ6N5-w!IDO0=br3PP=+yd5cM& zq>*3Nd1j4`Q)jg#Z$8@ooq@ra3FKe(%BdbMOo{WdpU;nFnmW7Z=TcLKEw(>6{#dnSmh!tS%wMV-W+xL9n`$O-J+CYZ||DmY$u_z4E)d z@#cAN`FJ^RFF#Q=Gw}I)O9qCAV0G_)Z7rDhW7hFINsb?xYvP~fx;Qd;9DUaFI;LT|STHpDhDJ6Ifkp=!>AHosvVAlR@EIP>_>YoP*nFa4aW*kMn^mLiQSF z5SJGlWfqX-9*|!_@eQ{K!=ok1I8BBnn&hIAnBtP6%)E5m#uTNdr52^;C8y$6l9yWq zmqhk2-l$A1%PT1;$}hvJ6FH=c%R&7ONFagExB{Ki&Bov(7$6BcKZ${Xi-A!9l#Lk~ zK7Hh3U=m;uU|`^3U<8YUhW{Yqi~^uuFN_W9NW$2lVGjr!qL-_Ifx(P{Rg{6D0dyQ0 z_{c8^foRs4nK0NPMhxPgv3WPtHG7@WX-kUdNc z3{0G$1K1#zFbFUp8;ji@Bj|1Jq!e9z3~XYci4JZ71_n1a!hSS1LbKc02<}H-G(UpE z8QG5@J`0*3`H}p{f#gSA_JG_AS}_lDuLBz-oD~-N47dCoc%nWg;ILr(QEM`bT&5(ks)x(-L;=Q3G+n{s-O;fJ0HIC*G&u{?Z-hhK1S$@T3pD`- z29TM23>@J64LXs@3~IJHR4phzL1x4JVu?fC8X*pLvj)`7pzr~?*%oT99YUP|sOtoC zvjbEd<~A(>1_qE`WVbm%&2WaQ1-T7m2Fz`)2yw6*bf9hkg*nI#?oj<62z3IWd<1iY z7gQYP1_c2I29RE4H~2u!@P(=cxdCJb%nkksaj+Zopl$%gFUSpnQ2jv&b>O@Nb3+JJ z9Oeck0S539g~)CQgPIWzRSR+hC_lp75D6D&0>>*48>p;i5{O0@XM%{wLdA`+=Q~7U z2`;W63mw3-8V(K&p!^mO)sM`EmCc~R3*>SO#D|s5Ap1aNa}rXyCBT4WJ{J2xWfrId z3@WqO!DSYc0LV;OeFSm~tn5iccNYu9zZr0GMsOT~;tvtNj0{=O@Xdy*6JlT#0@Z(@ zaZMOTsAp!#g{seks^?;Wn418NdyrmG+!sLA6++cHVGnQ2o-??_!w`m-eZ^4oK;aK# z3qk8f&^QDGgI{Vz3ByN_eT)nYOl3&n&A||lVK5}vF@(YPfx;iuy$6LqXmKUTPLLg- z@VCP5AGB5eV9%h6LDNwc)E`bzw}bLF1A|X$UV2Fe!{<*QL3KMwj0tr38t7z6s1!&X zG?Bx>06BXQq!#2BW(EeP8YI68FvO$U3-Ktbn1cfY$d8~sDIhL-YO5Whg!P(OgiR6u@M1oZ>RJdhtijw@|T(ZzG?uVK!#lR>8xYWPJI}4gtr-9=nur#%(GAO^aBr`9S0i0ez z=5R2${T=PnbDxLH5O2GLPl%7HQ6c}7m(-KQ_O2Fsl zLDD}+y#`F&C9x!t0U{1kZvYdA<_l0*vokO-O$WOT()hJt0FTv@71nAv+r*&05~5!S z%0Hm}oiha(7&vqxZ5K%R!NQ(V0Mzb))mL+%VQIv`hSVpBN1fi%vv&+Z6#|z>TF~$Z z`JaISd@x;62{cSVcCs*lP9+RTEGl96XvV-Q3aW4BBZUVCgH353=q$z*-IBy~J8&*S z5rO8V1p*8VpuFV6!oc7~f}Nna1nFg9COqiW zu=yDjzM%O(kbB%&7#KiiAo^1AXv>(v0f#E);J|<{+(2Q8E!>uo5pK(&;TA_A+|ca= zg&RmOEZjil3;^x0f#CEjYrTrZ&0{Jg2N449~7KFpwoBo(g(tamN#pl z=~WLU9Rz1qrTV8iWtR9R7C`ep8v_G!`3-CDtV0S%0Z4v?m=AJyD3bk9H-qLBL3wGu zF{Ca6&8@-8aZq}KwRbi_-32P&L2Y)J_!cB_P?-%A--aX(3V)dR4kU3WA<}G6z5uO6 z2ZhyjXHY)H8o!{GVVEo4z|O@g1ukbm?VN*9ce|m)dsu1__*`g2ISe}EwK%n?EHwp^ z4nT3l!QhtPocotv)S95uwF<4ML4V2GM2rw{6FhCAc2Ju1a3>f@#Qap#61W;G~a-Bw1L9ovmGSgfGT-NzF`soxedk!*$-lyF)#};fntQg zFTW%+Ei)PEfM<|6BLmj6pFip`u!HLr(3sbG(84cpAVJmy=-E4ln;=c`J2)_W1jQ9- z<{wlJRj`8kn2`R(IROR+kT@vsg4!IAegiYZC1{)DGBj>LX%XgT5c?`r9MrzY5@(p( zd%#hTAq-CEV$is}4i0ON)Wnq3B2YYm(gP@8-T;e3^1K8?JR}W3!XLthhCOKKASmn) z*fB8Ra2Mub3Sf6(2!q`P^5<=+KSB8hi$5{eK!7(MpY{l0>$V-i5MoF97#P5ZMCXDI&IXljATjU(^PsB)pnY19UIqq8UW)(?d^50t zN+Gtd0-!UJp>c>O4nT1T+MEcoe~u;t!yzU_Ifl5)fZ-#k3}Zk!4BNFLHMz6|R2PBd z7!k)?Gl2L^C~A=o&Sv-oHj9}7?W}jGI17qCD|nv4i^m zpz9f+{UVS)RDXfbhX=b6)ej(XusM(ez_Gd)qz1)VU~^F2g{}r{CfIG*4{V2o7nYOQ z!DcI=_!(>##C^f3#o(sJXNZ1f^zcTLS3xlc*$*&<5OW9|V-9wc8cwso?t>W!R*P}o zIn=!@Xy>3Ky9iXLfZ|O7MGe$gzX}FWohr`2zyzvOe}L*##OirSl?vxOIDpIoS9p4 z88n6mE6YHG(-1kx+z7}_xcT6sgNcDj5Yp~o7KF{0F$u6h*|4z|P+18oCqZ_AXwVou z8&n@VR4tDB4*QaIa7}_$3SOshLd}JZYl8d<3nP#_Kz;#TEWr(R2M<&|Y>Wpa4^{{E zCnEzNR2@H5oe~415a{l3EBAs2&x}N!F;g885$Vku?7^xT&z-1v)RNz`%gh>?P3HZjzRte zr3X+w4e~FD?S_4<3+uXBaI|5Qf!487(6B-G7sw8fzhqGTh0P?0x3I~8+d*t%vVxF0 zY+59!4#V1i04)GRUaALnHku$fj6mTa4|g+cehHCQ6rpmkx)L;Q&%gk>zX(!aD}mAt zLwJ5sc4`r9Kn+xXg3_J@LqHZ2HK2X~`4!eT1f?@9ZBtOk61p1+X~!!#^sq{S z-3BsO8)^q4zaYX;7b*wqe}VEC0|VjysGcBbTmo{RjB{d6PEulWHmD4Rg|7euR1P{I z3Gx%DU8Ii`#uAWzD#?BVg*WKrPf&Qji(z0;!=6V#3opT;{VQ|v~S`RWb{0A8Z z8W<`7nc>91F3JI|+f2aAOu@(Zq3%3{)N)w%BqHiN(56LDI5r0}Fu=yJjRhfdx*$1F zUIC>E5C*3o@R&RsgE=()T0p}Sl+Ivbi(~E`e$xOrQeZr2*<=khXBo821sxLu>z9Di z6e!tnFo4F#AbA_a=VI_p$$<=ugU88j!1*0|K^AoU7UX^j2H(Vjg4C4Y%HopL+^|IC zbgIA*T#{H+5{5hmuEF3`35smk7zD`gI$$yXw6x;X5|DmSngfNuEyy9@Jk7vhzyP{d z0#Z)E(i|wQf|db;!g#kWq-+5B4OBM3>Ti%6L17LKU$9wB435z7b%KTq8v`SFXauB2 z4%)YHfvRzZs=*cR$ZH;4Asl#qaEIyz`3Fmx16m#qjxNuj0Jt7cs2)(9!`QI-Hg9lv z_$C&Yq!xJ=6@dFvV23k!78O8-b--~2@-qViBu1b!ZXZGYMrH;EHXm@=f--^*3e*r3 z5omqm3$1T#a&gu-piRBVhnhhAgLDFL%?AHx{k}SAQ@HxLHlbUvltjWi;GJ$^U`5S7D+wX&jXA=7H0iV-D#4SI~GH zI0t_I1db~v1_rhWaGpbn8Juwy33WqLE(3Us7E5|VU9Am{DHI`iJVisp8kUDZ=X8P6 z9wJ_t7-FIE5(iZaYUg0F6Jx4R&Q zgUkS(P2#}dTv}9=npYBBl9-(BlMfjSg_Pf*GSz`0ATc>R6*4smP5Y^W3=AF&uuCo7 zGILV>ld@8i;prb#=B9z&4N3n2M2@YbL(|@>T%7F%@P=k^z=Bu~4)8G;kX{A`|FYDg zoWx3Ky^;xbgJVH5ln+V|pmFQmf*jB);ymxvO7J)ss65LOWMGKEbSKvGEF0?16}b!y zw-_P$6l@g(xHSNdH&EY)38^jw)g2t5x)6F_H!RLTVJv_&Zwx9cB^Vrwi}RB+6H8K4 zVC6F?{$TM9YCS_@5fZnc^3Z_6Ge5W_v81#Z5_h0^R|ke5(AZdUNq!Od_D4{hgT|a4 z83I!CQZn<>gHlUMiy&F1y;O+{0d471z`QqYyx!$C~hklLJ~7`7(RmPThMiB zxsb>OC*}(b;FH+ENf1`wg4z$DGulAy2Z>xr`vH`i=Gv9=w z)Hcv|KnXP8c;+)OgkkRw;N2b!4j_CgpzYK$XgHNo6i%pP$hg9%To5#;g<2IP64 zRge)zmC!JX%4c8*!X8F=&SL?G5N>&B_*By|d}{E7Pc0eYQwI&7?0isL5>obp(kS}+ zF_0Js1E_?DX0E#D2Tde`f9TG&QOW%w!BZSiy3^C5d?{ ziA5>M(vY!fHn2SGLQ70}cCfr_BC-sqPtE}rhZIrha-3i}(3&e`8HjycU^&QjtjMw; zGr7TXKACyh$TARpJYYGHnZ?MG;IRWru$thKqSVA(WJ!?u;$XRe%z{*88Hm3m;Bugb z28!#!c1yzLgHm(zOHfPznJopD_f5>qDbC4od^N=rmg^rUcfz|k>mXzlgW&0PTVoRgSU^VbI zK}cdcvP&WHq5@VEQk0mSotcM4UKK3wnS!&#fQFeGR2?YAV=Y;r>eRvN!V+^bQ$VX9 zAKsFHKPc5i=NLw0wpLS4UUOGlP(}t>p z-Hq#k7W$z0)d8ysPRq=Pwk43QgSuZAt|lx$r!*JC9zC!;Xao~``J@k)hYn77rWA)3 zXXd4&=US*;24J;*pd^-)S(TcC9$+9h8$#4T(n~-_WpQS5Vh*}OsCh zR_0(e5Eld#<(K3q=c5!bAbTvJYCuaxk=*B0S&&#<45@aUGg2Yr=pgl$VD)JBVX6k_ zS1YhuNIatlDab5qusmu>0ur}@in~^nq~HrzOPPpW8grzfBJ#-`<*@vG$ zeRN}B7j=e?ySIVH-NAz}n8%tyhTgGD!q#trPDKOt>%1fx;OpN&ZAQag~?zEu~r9oU@@S`$d9U5qFV z-7-PdIAYCo50c%)j$8IZ?VgqoS_6gKZcunY!U!`wKy7i*n(clv?4JO&e||m#!zO5- z4-~fOafHu)(3k*dTniFkkUAYy2ZO{xV-pe#(0t{Y=30?iTmtJ;gXAO`98=0bBOv~H zIk2%Oko^)2(0Uy*ngSjd0*yOJK5FC@eMMNs?iZVUr4Np+NB(J0>KZoe>T#e**V#9L{)b0EQ=y?G)c8r|$ zA>(C`w15a>P#F!%3+s^VCpIsvhuSYyfSA_=na{w0+kQ~G;(*J$q!uR^Wfqj=gV(6T z+_I4jw`_vCMY#ay924j)Yw$p7Sb!6J?0pM#%oH>S2%Fc0?XB7hc1Ku25_HUb8+dLU zQbRz>Xh?nlh2M6tT1eU>HvD!#-K9=ik-X2uyZ%mPIGXaVO=8@>>TVF4?5M@ zH8=!%@HIHtFvX$c&U>L@2wT^_5A3esB2c)2;uO>d*bf$igb%TM_6|VZ>QI1l%pBav z2OX-4c@GcR&A8>EZa)NdJ8azmB>f`t2dIpMrdiNhmEcV1o}k0vx%c4A6wss{G<|^d zN-#jhphkfF4=OK@Ao-uz{CyPaf3E_~IQ zK`=>(9jpw&nR)3ssVKHX&0}K-DN4*MF32w`foTHIZ-Lfff!f!gHO8kvZ3yUc1=J%p zA&m)aQn0=t=yXm{n_^8KXfF?>EejH30M~zzJPu03XUPcTbI>r3$6YRgPn`v)RuBuE zE*S+b2!d8CgZ54^30#DxQP4grENc@GM*@Nkfpg(y+-0bKSbO0T*dO3A`n1I4RPf|B zD4m1m!jRW_f%sf#>k+Sj(>+`-Qd{;4BCAKYC3}ZzMwg?t6)1J`JdSIe+?RT z=>-f7IObcS(dvwRoG~~Qut>ne;|4T5q@eAmn_#y&Cl(|oW#(j-WTqA);`|m^4&rWN z%dOi`cNZ5hFhpUW>%)JzKiCI&mB9US7wQ)^s9)}Z-RlV&nanRON=^l>6v!+}1x?9= zODa%#1WL>I!Rko!*8`}(stZ8#ypVhXD)Sf^!ZR|HGlB~elT%@RYe<<1X^q0fKxzdT z5bO9rX$~YNfpkU$$bF#l@)45zh)pk#q3&xgK;&akKOVHNJUJT?r%#d0W+bvd`V4Az zUjYNdI{5lkr_y5ZkpYkr&C>-^mNA0LP_Q^?EDp3n)zbwut^g@BVR}GgHHjseNja$? zS&$qvT%TuNaS3SP!P5m4b|5(xxE#c;;MAhb#2mlU+$6~UK9Cw#xEfFoG%+(TwaC+j z;nPPe26j<4XkY6E)@%I0WhBP!ez5WpboC#od}K%J>x0A?7(7$Jg$J}x1xi=1k;0bP zdgu)_Y^Q@{y!2ohePO4`LB%Oim|A-V8#I^}P zLBnER0qEQXW>HZ31+8^sW?=Yu2%hdBVG~-Mm<}$zL-SHn)4+?P!SyUGeBkl{iRqbn z>EQiMOwh1{%Xwrbfv5XGfeWo~nbFm_l;#$I<{qHqEG+2qPWkzuGaEp0!-_5!kY8Nl zl382;TE6x9)5kERwD=XN&c=0@3OHrLPT$6%2$oJkSF?cP?QkAwjU%Ld0)-y~gJ&LS zv;>rwK=JhjT(?5!ZlLWskX{a?`X01?;0GD;_Y)d_%L^D7p26b_+)jclxDCxKhSZO# z;Pri=Fk^(YqagC2Efb)~g2n~3jRlbl&Ph!z$jnPOgp@PP$ogP%Mi4m`Y;wjBIaXvj zSp26#Qu535pz+R*EC(Ib0fng@(t7ycpg6_6FB-HiHQXc~Qvw!upiALF zakol|fdN)8gTxr1c9tZTfa?}e{QxRw{vpK;vE|HvXxwZp0HqJCeIMw#;;@ULz!fp7 z7`T1LBmi0w4jQ|Fxs?gL&>9lYpv8Hh69QmvWd_TUR@br!LH6?O#NGG73{3bXGhlb) zmUnPqFoLH|NYaA19309hWeBo3a=FS5I>;FsGLTcnL6_Y_ax1zpERI1p=7Qq*u@c5U zWh5=2q!NOBMLoE!^AGM`u!|g%L503wejd`^S5RLBA`Z{mkg-f?9)ie$^9dxaL-P+r z94#L}^AAK0EgwMh52_r<&Ju{Z&^&}H@1K?i$}6D!4$Vgp`S8S|TyXaaqL%}b-XU_( zaucK#G+xRHt;4zDHxEM(dj|(QBnTlQh`J1PVLB+xw<|F)z}C%y+FY>p|Dcuv=+Gii zxyS}ir|9VcrUEj41d2mgISJCkCB(oW09spG0vR_1*(bpO3ovjk37%&F^#S<6=0oxU zv28kjXg)Yp09qG@HP2$)dc;2bvIycv zkXslS9E;LRL0t<&ct4N>E@lK56M%~u!^I@vVkY1|BFJr$WVlTV>b6e>3=DP55VwKW zqcSi!7o|e$3{ZH0)?dQJKr56$VFD5dtviH?!&Vo;sDKL=w+3>Oh)E|YUA8?v+ z&d*EBOoxUYs6PpIvrm3~KL;K2fVA;_6SMM*+)DGnEd#JWK;n!HzL|Mg#F>!x zW`NW&gU>YrN7KTueK+y*+ouPieewmSx#oqFKGqVH930NV?yfj@l&?VAVH@k$U6gDVmbhIr7Pf)Ga{_cDR@EGR?6)Eqj` z2HV>N+ph(>eg}j>VGG$u$Hbrp4O?|+*n;**U>R!!-}D2nUqLKrovI1d1DZpDvBel5 z=Qn^ZAqLeIFpRL1g+T{ur!G`KY_Fe|5Cemr5F-8|Ze(WAhpIP#st27lhQ*E0YgwVU zj({DDA_Q(vg4}8ZH3!GuP5AX-U?X5WsGm)sdO>l9#SK`lQUjZUDemCF02{jl?FEAD zp@-}O0;M-Ia9RjY2F;~_@)u~|pScidpB74P!kND;plRVrHqJf|%2qp&L7}MEc!I+V zv`-(4KV8r-6a@PcT@)H-*03;Rg4ENHE*zwd2=Xgvycv0K70BzLv)G`=>qA!CK=YNc z5O@zfcqIfh$AR-9XfL7w_`F<5aS1EaLE;h&jwL0D$r-6BsB)maiwdxPP@s)jP&-V8 z7#K7dLNara&Ob9iDmOrFFB1mmjKreEgSsCSp9Ua(&{Za|xB!V8F$NbT7Nr`(#B4z2B-9K@d?G>#WCzF% z4ve5q7UWz$P~MkhU|_NZB@%E+$-of62pcFu$@{Khp3bh&>$|~e8B|7s?k58Ei>_uv z>J(6Tfco>Wa?3%8fdQ0eKxqSHH*&e<2rY-4py?S@mcaCb*e+0UA?O}LP}nj+=e|JW zl#a!rIr(|%;P?a8J+OHukUv3uMh4GZ&}0{A1Q-@RptI4L7!c#VAhn>gqB%fu2pZXk z6dB+=0O~&ofcg)h{a*P+9+{w>f|Zc;04i5O>(tUxi;7ZHV6_n>O@RCfKC>1q2WkgG z>Lrj}AUO@_o^eF0AED0xP0k3~MgZxv0J#y=ZDIHX-h0Q*z`*2&6mJd;@u1oSR`dio zL)!+RtK~p(WDDNA4>_9*)Gh$Ug(_G-BZDV2F1%o24n6A|REL1<24RqTP`HB5#PNZu z_l2ql#TRHVAt>%aY=0ziP~8m@2c4gRrR;;866oR>;u!DZ8tfe884%(h1n~q`DR9~Y z*%1V_BM;hs0mT;sLqJIpG|WKh1$iD0#OGl^q#sh!w!;ZK<8D4x%!2~ljsj8oM#CWd#A~#kDz=QD#XALCIq=-3r8IT4NUAo z3>SsgF%i(PZGwg^C=5XJ6tH{*3O6RSIZcolGpHQT%S#2FR|yMG76zZxvQ$X_2&9IU z!M`9Gv_J}}d}Ct>Ni5EWDC=NEz6?;!tx=BJ~uhBw^hC`kq`3e5wcOT0nh z)4>2Lrx*o5{)3(88VmI+=)72v-7xWZsCXahm>Hyi#y$QFk#{kG&J%#g*`Q*EU@_=; z8C1*&ECwAXgNhl0#h~M35HYlIVo>@6&C4W$#t)%WFp!Ze&~2-(ps)xxffeIO60k8u z&>fJVGU2ciBs@TTn7>n?{yqlxH^d2`9uW9+LBD)(ZzwS-Cl!<)Kx1*Rxe~YE!T^tq;=;Fp1`Oxt|*qjK$4&&tfoD^_au|ex*xExw|fzl5sywZ@u3+V<<@W>x5 zxDeuq@juYTouKe?sE5oafx-xsRwNi8<5pP8HPDT#&^!1*(Gd#1VihU?FT=8+VGXK> zahQR0#UG?qh;r>8G{5FR&4H}}gydJ$Gmt=H$nC;hNZT(r(Z3+I2)a-OG`Ia|S!@^Jo)n5+P4?FiBrUzsesNMpVIiR`=(*I#)sD$dPg6a!`rgKIH@6^-+ zNUI5!u0ivBiI9^+;QdrkdI!zzp^Ag_2BoHFf;OrZGl16AfWi@!=4wD`&eK00dT}Pw z?V^xmhfNBWPeB)xg3_H?HfZe2=D_rW z+zW{dW`<6v-Y%$Koc6MT#zG+R4~kciy**I9y->X%b3yI{t@weZt$wH+$W1Udjx{jB z&W<4=u0iqcjv*edLE!6GAo&)H1U&yvf|?IYuduk8j1Ia1}$X}3n;$WB#HDd|$e>3)MRhs#lMJQHYCyfq{^Fk>eTSZZ3ueP_q_7%>u;-$iJZS0Ty;3b3uLp zi7$qh6%hR_3`?N;mqPV}+5`+3_og8ivGJgF@Q?^ZD!ss>&@yv5)GXL|4#@r$DE2Zj ztc2RT3aS>zI0eWC_*Jf`7NZEm)6E*FdFb&0s#8Gm0gA`9C~je6SO;~>dZ=DxcZ0$l z5qC@s8=-19LDeGL11d{Fc7SM*Js>tnFUSl~zS;uSyA`SzJ)MHof%JedtSmVTJsS`b zUmOhEp=RuWnt_~7LHa;ufb4{*XJ*(1RlggHdQjegsRy|i)c@EERlg6a9&`pWs9a`X zaLG-C4ih5gG+lBN9h35lN)T%Wm_X`Wi;D7#AoGRHAU@=nmK@mGbfCEuQ2Bj8h=BnV z!Js>deOyC8+*--0N=LFo+UCy+cS93c6Xh2b#NUq_(+ zGGbs9;)doqP`&_#11ybz@+&AjKzRlfrbnS=2FN@}xNhD0+ zBfA}BFUakXcxGa_2UU9?u9gFQ4<&M4_z+1Bq#s%CF;q^C1u~`x@(Tmf`Aj9?wqihO z2`DS2Bo=_q90m37D!}vBuz6qS{M_99Jm_jg@EA(95a|3Dx1vZ- zs&hsnxcdn08@7YT4&8D}i!-1KAg05{2Rnp7XBL9Yhf1UA?*@&BF@WTK6AKW{GqBtG zgcukcK<6rgC!y0)VdDl9z~jR1sbIh6WTrz7VuFm(Oa!eN0MBKD%bC(VP(VQ4I#URA zMwWYONpNyvNl9vvdm?B`2Q;Vz>DSH?Vqi#M2q?uRKVJxP7E?}gDQHF<(-f#Zi-Z^$ z3K*P9GjmdKs#zw)z)%5E13F-`C_fidDJcF{3o$S>FhKnZi2=~i8hA`?gAfBl2UHFg zL|{p%J2ne3Fic?Z%*!mvOayJ1cganJDT57qfx~&55Ca2fY!!U|9!ffJtpK&NLGIWI z9$&?t7C?KXL2C90F)*wE&GV#Xrk56_qD43)e)bD7Fl>OHXN9H!?3NQk3=BJv;2}_FNTWV7LKJk5Jb^yBi?? zT@zwpcmQ=f#TYTgr2-e-iQ5vZ1rp#G{70|V1jkUq!| z7=r*Kxcx=2zY6Lrf-bP13A%T)71CD(l_Q|C6;#f``g0&QsQiG5!}@C=aZuR-6NmL# zK;oeC0w#{!9|4sUFmYJl1f(8RKET9beGrg1sBD0V!}=E>aZuR+6NmLDK;ocs0VIy2 zT?)FnEjYl(F*4rA)6W~+aDZHJgd_-W8~%ir#UOKGY}nbPzro=hkO(@G5EiE(F%AZw z)U*=kjLe)AaD0Nq1Q>!c(=(ugpFe#Bxee4O{R1`w5@`~UdzX-$0czA>cN>{wm7q(} z@=8*`S80RCD*p;GF#H3hbxug!gWL)VI~;5LL1E_->F4O{=^XFj80--r;^^e#in>M* zzZz(JpHUdHW(gLSpnEA9K;xB}c^;s}DWE(E660V9C`v5@omr8X4r)V!#6j%~0fykr z^t{B9(xO!GegsfhGJ`HPf&?W4G%P80D=2@k2t&eX3J)ZVK<)yCQ4;oj5IFqr>KE$k z8srEcPba7ho(9>WVTI!yI-CZD1Vthe5SEaD-Iog6C&md5Kaa%X49LU_D6Bz#WdO}1 zLWIEODo9KMEv`Uq6a@ySQqcLEu)X-8@By{kxxnT^B1Qv}#<9AFobUm~4>vS^X7S*> zUkiH};R_vTI^~6iJ!qXeC_F&^1l=7AyE_rYXJH7=$V`LWF9qUrFob}HW8w3gATb_> zfXuRdgc<<`m&~%v;`}0C&`>+1z67Zg0nLYj!Wy(=2U_NX#3ev?U%2KLlvF~(7}n+j z$;m+Ul;(m)4)Y=FRzPkAwJQ}E5X-ngb3UN882rS<2Z68wg*)iNYEap+mPako?HN5bqrv;OQ6dII#53@XDxSbza^_ZYJ%C>?|NJWxI;?SlBA zF@2DFn7j>C9>#Y-<0mjMeDs2@#gG7}8^4l}%p`CN8dO{WRVOP9>N^Fe=A=Q|fAYehF;M7v!~sR%wJe}Krzi|sUjbS%;8;|Y zSP8ZlDOg+XhmJW<@DA`I#SLC%zdwI@LR&;SPT$+Y0I7sL+)?KRKO zO99X1flu~_oxz(~mRSO^6QnMP!9S@uKPR;$6?KjsBo_=?Gnr!mcAu&+149S{#9jla ze?jvT2@K%%XRwJ2u>BzMB*^+R6md{|q=43SK}N3_ToaX&O(%*42%$akmu?-7`;=V zjs+i*1`AtIya+(m8$;ct35sXNfaD_ZafOE9yC9?(7?`xcX$O*LDj4HIB?vU11ULsl z=QXvV^^lb)sGR_r+Xsa;XlwvPgZlWo!XP;&0X=A50Nsa+B~N<#$3xe5IS08qhM={u zaLGdRr~%Y$9BaT_odb{t)L}fRUL&Yp9OLpK5q|OT%R-Ph(qoZ;=X(>VnV|9jhpEHO$I%_!2MUSD zAqkF0#Qi4W8L5e`MMa=RUC^WaVB@xo3`lamsk!+@mEiecCS>sdXHVCP0?d2RM61IF*9etAgZM(d8i1)L`@2kmcM{^HPg4lR;*J_W8i(o$ZAg z7?3?1g4pJR6a*kq#GJDOG|u#$AZOHo+yUAn3=WIn)Uu$|z><)NX1gDm{ zC6*+D)?k42z{4Uqwahuc2z2Z%()};c@C!~Y1C8xKkJkk21=6eWYA)z{e-%?}W9XJ2QqIKmH5@c@W= zcw7cU#6i&s@-sXxq2d9~p76B_@VJD^!J-VL4<46LIZr>&5Kvr#&}5r0u^bQIC*>&40K-<9?Y10|OUI+=CXf zxq;5wEb$C*3kFrJ$)M#v(EXZ_w2V*_ffQblw1ALnTBgwO~MmEzHdzdu`xr z_8{x{Kw=JHwU}ooxPZl>hs{9k1F8352q*?EbWSWugldAg5hUk>kb`Ojovq0#D!{2}!SyMqKj#OIOGXA9 zZ9oi-@gA;@F0Rl%EG}6G2Zl84<5HM9f?b`#GpOiGJ&92XZu2sW1`0DUfYO2o1H(rn zXj?4+9NwT|Jjgi?pmZAqZtn-Df_JhYEw={E;e-14!C*a*_Vo#rI3gUDp!f-a#t*j* zq)i2K7pP4I3g<9rI2&PU3kA7`c?Ns>`+;&bv;_nc0>@Jk7Cn%*7{pzm8!*tqFh0!D z$J52hGX%3)MT8y)2Zk&%?8M%T!)+f}Jv0tMYw|&HD8j(-@ftJ^L3s+amkS(U(A)-! zN02xRsBZ?^s|?L)An^!rdpsz$EEBv50NhWD1ow5o=VCi$mK1}_AW%Pu8(tPb+T&5+ z_(7CupfX1QW(T;?f#h?LxB`P)P$;zA0+n+HFm>>f4x%<%n1R6rq!zlj43sCh7#Nsh zkkXk4mUMprp3qBsA&;4$IK|ezyQLaFbDMwK{RL`MFKdy zm;@5R;laoNO1mIG!_sjwR2(!O0t!cvJ`V7GQONVepz;?|#)A6lEa0*fvTqf{X9M#g zdsb7yaRyRv!T{=ax%Rv4F^_#PyVUvTV z4t38LBSRikT|QJDXl@KkpA$45>>Csu4j%S`co0PhocBTDUkEkF2%0ZIVa~wdT9KSn zTAW#y3L5AEr)$vICFl-q(B1TqT_&J2YFI@J_<&b1hsI-yL;IRlQ1f7GB0zRmL*oy&o}&gDFSSs$u=5B(-mN!cl?&i+dn}iPfE;G}j;uIe#LH5tQa2<1?u4WMpW9y0aPT zPDJ=IFu?9dY=z3f(rOWkUl|$Np=NYI)q%`_gaac3Z2YGSE(f`*8Dxe68zjv`)G{&j zK+WmJrj`L!Z9i1)1gKijSU;Ay1*N@UXGb6KtR0pNfGG!!<4I6+@yrWi>Wz2y5A_Ry zwOFv*4O0UyJDEkNK-&`xj0_(^>&QUq0au;_)kUy82Oe!jnoF4q9!mx7a|hi;2fBIl z(??L4faVFOA*CY+#(3=Rf}|zva$vWziA{&*xkcdg#3TT6J1EbA%8i-O@PeHm2`V2z z_ql;w0t!RWc`vh(-2s^wqe2+6iOqq!YaSycjex=lRA$4{?>wm6VEJ{jFl3z+BAqfZ zEP$q`g;2Giwdh#VlV5;mysy7YsE;dbo(EY3oOT!m77K$)aLBoTOQ7a~_J@M{a*PbV zo*|HG2HbaJ0`ooHAhSH6d2)7e84Bu~Ed%wRt93v=>A#6r@(79NUFx(3EH~9W$ z&?!*hw&6CgSWqgqeX!fXa-jPW({l35A#FrR{s~LWDNSVnxu1oBfo+E{Xq7#NOL4lN zK%H6ybBtaFXikbvY^N{-!!B?+0-94~6Gf!|co&~|*HBLr3y57X9yE;hK*I>RoyNw% z@KFgh++BR){X;$BCisVXg7-~h*n?t?r-=o)Z31hL>;s1t=zd{HIPC}X{Yx{U^BD(( zK`l$yOcM*x9f543p!*{a3WHV_viN+KUZ8=PoBS zFEcr@7&4Z_$l#LWTbfe>5rLgw7zZ4VpnYa1kjkf%SmF*gM+qtm zKy?v_uLNxmo(6|EBK*&Q`Qf0^Gx(jhXN5uM2@&4gZiZ4;A-AoIL3bUdfLngKnR(@z zc`=!JW*`sgWiUYY9G(+qU^p)fI%f=2=0oxwNQ{A@lmRpk1gdW?g53tH2|(_F1p{W7 zfXbaqQ1c|Ay(>F z`axk2DYuveKw$}EgW5tMHuid_I6pZX(dkjJC4p4kEFcgCVDlIWL6MkO?NSp~G4%*TTZvTVILKcV^sL;yH zOUnm~gZ#$<5eGRKECy050TC-s&M!!f&xDM_Jpj*3f$f8c7nc;3CYONE5(4cpdU>M_t*BuEc4l6Y`wQeG-_KO+m0xMNCgChUAb zRwVJ@OvrhCAagj7#QlrX6Z0~wz`OQf_V6LeL++e{%o7M8iNpGddPrvteh`MGOdr=U zS07NshMPcACs+Vf=8+h$kXZc;DJMP(GcbG-W?+b80`-9)b+rsQUqjd|GN0h%cwfNj zEedoX9k|Z^3g&}@8=j6C7$9{rD35{K*5ANtAc>R(PaXr6G2fwX$z%exxv-bp$i+68 z4X$Gu1%4ux*}tIa0=AYAl5UFQlMEqsB8bn(P#m9Rgy1uQ_{Io6Gl*{j**^+utNlUo z2S(YAac3+kagvz_Dhd$o&cC4XB4GvwX$DX`98z|J$`}TQ;`nl?A3%JNo6C(LZUps* z8AKrA3?hj=FOpG&f#IJp1A`0$={4v<3*&o?sRMwZkyN2-Si$L;Nq|!XRyQ#UfZPrf=SGNw%eCLoat)MDK=l-_2q`zd`UMgYU@;*P(AuTq%)I!j)S`UQ_&cj8DD4U(g`EI$J%PoYpnNDI!T>H4 zD#2v}6F6^y%4AR(4zdHnW(4~OR)$MJ{RUD43O}eCaCl0JfZ8A&0uR7>h><}W8lEyx zJ+QJKqz{CV%X&GeT6w5ikoh3LBbyIuXMps8$}&)VDM9rpL-l~xjDX5$1_r;J#1iDg z0U&KpMyNPydlaPBF|QKZ9tG)V2CGA~TtQ+iU@=6?6(q(A7W2$21Kj}00BOsD>T6J2 zR#k+7!4F$o7EKUTt{aii{>y_l!a?z;Cc?m=F2caD1YB1$fx{gXUZ5}n$svc47Bq}t zW6_|x7KA}*AEX{cgL(`)&@k17st3h`A{!z|FC>!1QiFF3yL$4 zJ78@<6Sy2?{0rm;O=!A-v@e(#%%E;ChpGj+0i*`vH;6t^n*^4IVEU|}`mCY)kkcDT zKgc~WwYE^Tc4%t3K;lsMK*EHH!2u-3z$D-ZRSO&c1E~d>2~o$$;0#sg0#ygwQ+r>S zfdS-CP`&`=agZK}J6IUppnBY)di1c);launl#C2+vx36L6RH=vyy0U2m8p<&7Gx&_ zLvbRkxB->(-XaVPOdv7Pg;xxpK7#B8)h#|)%MeU^LFvyIT7J9+m+6r6?gT{`7(np? zvJ>G?W(I$#KLem{g@qv~Y!K=g8G@kdg3;80%tclg3RM?|P$vKi2Us~3fg}!c3rsu; zAr3CHUZd3kF;H`3q3S?(!r~WJp2b7uV0j5_K6Gvep`Mu`5o%TvR6Q&`!qg+wGBKn; z)uy7U1-TD|k=3R{)n=fn1(m-bjI1^bsx}*{7S!(rr9)VFtvD5aPhz96(y#F&bBQE+g%A32dRaLL)ybtU~%}WTyR)agT+8Vlq#jh4@Gt~} zm!vqRq=453!o&p_TvCfmGV{Oz0F#7{sR}bNFx7zL2-E^*U=U#-oHhxJZDkgiK)Oqy za;;W`fuT+WbPpM*J;*2k@)sm6G6^)m(=?+1$Zs(5CaAa@*76(VKC^hYAV+s!(D_uz z>p46F!Z2jO?MOy}7Noq?3N;^;mq7M%K=TZU&B%es15BI6CWc^x`pr?$F~NSYd)?q;*Au{e)bd~=SPXJ~ zBPgv;0`pPJ8ju~Z{hL1~)a=9rg2{bh$Ed|X4~ zokHE*P|n8jLluP9#Y_Urpk^5nG7IWwxG~T$UIEqbggSqLW*t(KAS52UoPz_dwQlI@ zo&Ehlm)M{?2)u6rw%Zi$ztvFpf!e*GGzm%rpfP%6{sjhxkL#dqg5}_N_X90l1gDRc z;C{4QW>Im8Un=yrQCPY7TmY0lz$1uYwX2|dp~^r93P1}|NWHyA1T?me*gpWu+aUWS zK<6%}<{>Nq>4df^KyFrG@Jq=o4#>~Xf!?$XEf3d+_nJqeS1Lrfl46j_F-yz!2X1}39>F}oe1dc0(j7a zLI$+_odJ~gg%}u^)`PHswBOn$9i2e%`kP(pliJln)96&{))dq_|UH0Qnxb2Z;>>J(O`0jQTte zv`Q+eG%YO^X>R|32m`}G5zxLdNIC%d6BJjV@Pw6*u=ClDh%hjKFep4>7!}{4SqUl|A?-y-xdS>IhXb@99CYY`Z%PiV zoCKvm0VHwgl2LG(0g{sduRDZxaiC=zsGOEyC@ul5K!nPG)r0I%VDL@Jan4B0%!Akq zGD8Dw2GnGz8R+HnX>fXjmnA4=GpOBZzyRxgIAtalL(B$=8=|Q_hKi&RPiu&jCaB zSAdI0a9DxPk6OWiaRdqjsICWDF{y&(_3~6VB+0gLEtOSOA#K@#$j{G%bVp3=IB7ndzB%i8-KDhnki^@+>Iw&{PRcYan?JhLEDtykyWN zIZ#PR9D(F`km|pyV84Od+=y|3YY?&Gf{>!b%$(FB@a2-QV|Jip2iL)Bob&U_Qo%>0 zf$Gg0V6mW7(2>`m^Uy$IH^E{c^Ye?6Q~mNwT$ADD^)0ZRUrInxWYl^ZF$sXwfbs*ZT>v`w4WtKT2dG`}3aaNdR1a+I7o-oA zMnL!tbX*zKMgqC}EmY4ts2)(A1alj@evqF(K=niX!@}?ps{a#IKde3ixd~(+$bF#j z0*&;3fvWuqSIYsO8w0r==HKsdImj40%ZIR-`sCh$ITCIMzq_`C~vtQr&sAax-1pm+nd0zhd7v~moRHkkxK z;Ra)KK=s4Y1xPNADwgZK-U&Omt+ zeF$PBP_${cf9Z*sfk`K9R9H@lg({-c^u+!8_GG zwFG)h3*-(MhL2KEc>@7ZFE}y9F}bibvnbU96!z$He)(>xdC919<^s?g^MX=yQWJ|) zEf_w*&4kOrH6rBfQ0+4`L(&J6gK9&Ob4Ihz&s2)I@Q@9AcM$rnQO6@YuMa5bPc-H^Ni z+S7rY*5OBUKn`R3s0H<#1~^Y3&ItwI1Z5PQT7q;I3QR4iJ>gmb>!7$5<>#W*b*>c* zpFS!<%>}g^Tq{6lyN2YWt1^SC5fTLLoI}{{7m%2qnu4M_-Y)`F=lU0vc;+z}LG@V( zGBEh&`X&~DhV)ZYK)Q;9!52aq-NWOVkC68)DhMt~OwI<~jt<%e3(6;IP`AR> zf`*qd6e7Y4w1><)H7GH&I2E+ZEhOKiAQ`f<65$8XUPsW0AfCnGJ+$Bi0Xk=-C%|zFO>P}eM1zH>I>1PJsG!X9^80zQ) z+HV1I18BWDNX|1DB8^n5Gr-a>x*8vU{{SaPXKzs4;!@)q>J#GW>=+!v@ChCs=;pYF zdVLbvaAx}RuQ2R4J*fqq_FA|Yn(d6K|Vd)68-Up`FGZ>^5 z5x1yvaINsVAG8h!p%;<}Vex{h7dZtY+zo112SXdq@xh)^u1NJLXg#E-p9v&vAVznxd18bKagVlSb77kS%a!UGY-|wFn^(&2@e%K z_BsXmJGwyAIWBXM^A;{O*wQw-dyvyMth`586XfP>XlZD{01Hoad0%JnNx_gT@)>mB z8>C#pqR!F9*V7N85U)Cfvpyrz7idkKr=JNd-NKRrynO~*x?RtLG85>Y zF=$;4-oF8l6POzKYFrdmh%khyLy<;mt7?fbFo5iW%7Z)iuy_Zp0R^S~P(No!KYu?@ zXGb5;DA#znmtpGAZ%+2|SU z7~&X!D67!rLG~b4MdOnz8wLC7J1^`K866IS|O1^x%^fk;-h) zxGqdRk}6Qk8J>PX<9`7KIR!zfB}JL3WvS3^HmG+3>2)BP2O7h~p%&f-1FOlyY99D3 z6xjVTzu@CD;9Xxur3EDc`8kQ8sgBUR?7aN)Jjh-vMh3V% z;>^5s*A(#i;vhLDbbUVg;5{&Ca&Cz^IWUdjz3a^A`keAhVD@2^3n|J>PfslZ84og> z1)F}T8nDwpgU-TW7X^(ig60l3i-Jz?^#q-;5EL2^5+C62q==l^p(0Bv63w8$&tb7NZ%i^61?LK1l z8^cGCzS&6kA;8Xk0f{5#a+w5R_b7tK>p|(7fgvQhAhQ5``DSoQVo56aDveA~*BNxl zMP^=lumLD8L24Ost91o!@q{Rb?Bij=trm2wA2?6qQ3Ee4f*9Dr`=&s7>I^7Pg*XRz z2E-%X)EN)%w0MFJ`T~tMhnvLXQv%w{Ltve82`E4cpkvQxMHv{*iGt2ZMx-^u@qyZR zhQ%Xj%+xzIur#%(5>n>D2ZF$}B;YX{SX&=74hvdY7MxlF85)Hglncr8CAq12C6FpL zj0Lu@KP0)p6EXxYJL9nFtxa%1j0=}1Fmp|+!+KiM*y^z5w`pTUR`*mK^iNN^afTFl zP0WF8PzQSxBreL}=?gar>TfZqd&+`S)1C7Zb5e_wQ^6Xb^5P6Z#mOPb1)y=>;*!MN z0+-aBl0-;a69?%9Wfy2JEDkO$D9A|#W&Fe(%;*BA0|^HAv=XR#kUg-(3v!<%NDdTa z;PGoj{7EtRCRSiE&yRs!R1tc%?PXB83toW@YG@-ZZ3bTw2`zMS$|Kq}S41J}stcj( zmu|r8Jjnib$bKg%8~MB%Dy}zzt!H9{?!f@fYcX;mtzqIuV)G!ed6C$BNNj#2wg3`a z5Q!~>#1=-dc|<__{+UHVcS?iWA2JLKA5TH=M*y|I2(`zqi-K0DKu*_nf$jmhfh-2y z({U3l25P&25)tHjM^M}B7FgUBw8{t}0b7p*mJ3SF%`XED3NwJz-vNuc;%;p zAo06k@zA`?!qQYv7f5^Q9#||mGbc5##51qBBrykaulaqjcu-Ydmn=3KsQ!{+i>9a2*}1+!&_*DOlVi zu_&cHu_)Cgvl!%K=$fx*U^&11JeSJ6#9YXEMf8fFo)NcZ-e+`y{sfUCuD9v&(fV!xu#mINf@GyjW zLT{4*uRnYPZks~_8r-&nhV>so1_m95VDRJ%$W~Z5fYPA>^jv;qagco`3@(N~i6yCd z$&foNKw=gQE=K5LHViJtFfq^`A$bM{rngA#WCsS=?cvUj0gg_dKAs_-uHeI1L$OJ~ z+x+jK?d7|9kiLv3yzF2SfZe|e+h-CFU6+)Xjr(4zFb2r^kDrj-hWlPB@D(zkf(~-w z7uFk+LV_Zp>p?z?Lhht0hTchqe2*Gz?F?*u4s_n5cWOv#aS5!S!tikw{QPfF3(&&A zDBjR8+%>>851KAPwEj;Yz^u2@|S* z@6<}iq+;mWbC4Ox@(42wG1M`mn&X#Wf+%i4<{-->%t28Gb`J}ZIS6$|D1K(et_H(R zY*^J9qnO2xT@8v^pflikp!MVrcs&V;v-oh=fOzB^a3R~6FeE{J5>n160bLT82idUn z5!9FbDayd`OO$~jnvH?s7#plV5R{tkR{}oRE!8^}yfzdR)}U1t>3$^vMX3lWkT__6 zVY**QaB2y-Nea>d4s)n@Kv62P6r{by#DHW6TpNlU+#a|zwC%$T(Hopvg49w0*@`L; zu@_AV$h|BO{XwaDiMh!BgNg?fr6Qz2>RBP`UGpF}ae=iUi3b#=qDX=L&W5H3-49TC zWW8`DAhX#a`oSGOkk^pJ0*WC0K#(xlF3?$->3$_(wQxhAVF8tc>48gw%;Q9|13dm- zkdq2m0M!pw1JjS83}g-$#GHVlRLGSrAcuj(LFYk((o24E2|@yDE)QIfe?e*+=ncp(#!S-!2sz|L z3bs=aAqPqD@W6q%RR|%EGc5`u)F2WS)LkM7Ig|th@{=eQIk@#u{bC3;;J62cB1o?| znmD>X2{d_(NQIg&iBN|%+@+xMNbwFHhXA=j8Y+hz_nC=} zaYWoB`gn3sxuR6?y{{mzg5yXYDxP0l0+#^Up#T*xO7+Q4OaUo}#F-*gJioXECIL1_ z2`XNc8kz@_0GXo<70)j&K}bNuM+GW}$dAFP$)%v-YDhm!6)K-!49T0`sg-aAAhXq= z^5F6jSrTf#I#fQt7*w_*D}eY#10wI7n3I!~n4Aq8<;eqG-Qb*)nwVEw01j78h&ph& z2HtA`3J$0pT2Q(C;*uc9ECWaqV!k$1t|&D)u?&>Apl7h@K*d4sf=YnHP!}o=DnAQy z5|hDNp!VoN<-qp9B_a0cL*)?R=$DwA3JF64s2oxlf+a!WX9((lf~yg~e9%1>&N+$T zHmwx{yQnR+Ui|~ASA$&L*abTCWVc;|em$4H;{O?A?Iw4T?wEDF$hyB6ZVIWTEX-CNW4q zTo2k0hu!B3+QSBNE2u9DIt%L)bZ-u9A6Ib+XtW5@2Pp=(v4b=7(sNQlV~k)KXx|ak zcLkjdQBaZr?!$oiLZEog%q`7@EYSw{Pe68wK+e~IEo1|)(FTPnNKOKNhqG^Had9dR zISF80N*8zX%0jjVFqYzxeE9U5r{uQ?$BTWEk#GHVb?*r@BOa; zXb&*V`H->>Fmx;kOvlu!S$jsoInOv0boRJ6`*M+EMVF)QLNL-+*ASN=RAH1KLNKoLXF*Uj+6a z$O9lVdEx#6Pbb06<6{W$3-E-P08+;f;)7(N^@;#PSZ;DL#9x98j?NIvA$Gyb4X{nH zkOZBx$Sw*xz62C!JfJv(PZJ`YNsO3E1Pj9AiWizT=ShLiwuF?dgx0Zw%3|33tCJvT z&1-00F3PG`$Q&GOZyBhbxeuL>gRMIT-7D#x247bSo;P0uRRbC;!Lm=s#n%xszXdu? z!qd;qKR(P5lomt5H^_r$zK~?V=cz!>69bhQ@UxYmbr>jPvoM5#$H|9}X%;emf~LkjHLo-?50p~j^96X+r9u=! z(m7--1_=B&Y3O9ia zHK5Bmz}FZki$TT=B*Y-?qZH_P8mPU2B^|@qh`OzUp!xf-f+T1@0i{C;2Df6^>=LLx2Z<>l#NcDf>SCZfg@Yk?XF&`N z$Om7y12G$<&wwGID6=fFBo(|O-Zv3;Z!u`^jRk`nXu~sTc(xQama8fTIzJ>RH3zhl z*)20C6=E*9Eug@_z~BMiOX*(#x>7tdKMyYM$pGo%2BhYtfDZEqxf`V3ivhHz+c6nb zWP{2vn7B7Xcu{6aDpUf}z5%KCftmxA0Jp6`;=a%}D#$csbNryr)<5X~$0Bjd%&wU2$yaLcf9<;d(ayLkS0Yi9VW=U!hEWAKs zB@9lb#gz~{Kw(}1ZV!RxJRo8x1VDEhqw;4kKuQacxtd}O3>&bVl>w3iwTE{wcor3a znq^=kAYlb+s~v!eL;Vf1`vTZMkVtc_C`ru&oo@#|dz4jF4s>5JQki>$A>Pf?$2A_3 zcOa!Lk^nfZgZeYt&~o--4g-T3bbOeR!6&~QypjNPvox$60j)-IDatPhN(8M#1J$?8 z48ggHIXRyG(6$8&gI_*mWm!N`YC%5e2)A@le1g;>%jKiVfyU6l6Z9#eMd_(|;IkoM z`q&si_QKAp15Xlz`>pI?asSd1|1|%il+>aC(C*-pVz3~g()TadP zg9o)4bj27LLYxEQLj!#L9bMvsTpfcU7tMv6Uf86Jub|7h_;p1Kl%f0&NF?%F8QI_NUSQ z7Xv77kEH$=sE!2nzl@Q}hy*PCulN9efA9(Pp_qL$upG3nZvrhhrbF*uJO@o%pm}gm z84a6r2eYAb?jSboj88Bddd41z4LjG<5_Fa-^ehjsII- z(6d57Y$oVgAs{v}Zo{R97WN{W$&Bn5WH+;a`k2QGX@kpy$4I~x2Dn}W)%TG5)cnFg zL}5b1~44UdN>3{G3uyT>%oa0E>ZVf5C3H1oK_wWR)fRxk_SXCzZA4+6(I|bM^CVv zdr^LAL2z z8c1OO1c1eTGxIWY!FSbz^ap~)U^bh8^#_5)LUW6uzJ{G;6bus&D9X%DECSCXgUkTA zje)_pv?MXF1T)Sc;^2sf#s^3}6N5`ZGQ`@y$h4%{XM zjY)!{DKRfO6?(=QNKSykGcPH>G%qEvG#|7E5N3x6gMVoWk_1Q`)IXA7a7j%|EX^qa z6?6He@bjfWVX6QwGxAGIpetEHaS2-Q0@|Apjub{34Do)BzOF9u0iFS_@yWV^S!1)bio&W=66_$S*bjTJO&#_{lbFhOe^O9lHeUS1r4lM4H zn+PfdKp_UR11uhuT9ogbSP+z&o>>g;^n&e40L#I14OpyE2(;G%GQJU%Us{rxmkQ2j zpgySrbX^zB3Q#%%xm5%1R!loU`e5t9AiY_LdqLtBu>QGcQ2{K^ItYQrEg(Hh@bQ3| zdFh~WHcW*WaFJc7u!O*zu_3-&^S$krn9BlkTI(@(6K~N zpUD7v&k%?WJ2Mi*ehhE#BJNH}g3kMa{LjFE@*#jfo=e@yh{?ANu;cfH&EMn}99~bp`cvLH6ZB z?b~bvy0Z>44huT-7&I!1IJg=z-VNSE!@vk0O9hqLpcbCI5aO;RP+DPN2*@vjo)HG( zb1*>Wr$K!k&_0?Xq%aa-h{rnU2T2-OrQqdvG1T4ja~K$mpm7XZ>&O6I>xf*BfYv%P zK=TAl9CT+A69WTVsTgQoE%F`{knNyR&v4fu@PaN-P=VI&vWb;J?YyT18vll@y<%eU z%>{1`fM$h6P(y+NbjK~bDCqtq(D*|IIQ+q9f5tmII(vBfxr65@;{Ag>-9grY;sl2@ zES@T%cGm|(@`F5d3>S31E0!@_7uPUP_(h^n-?>JFxcUWqLWVxzD=;C0QRqs*;S9=C zHPCU_C}=qeE+&!sFrfKfR9~YH)=0mbFxaPp!*WQ;Rc#>0?ix5dqXp2V5n;-xF`-q6$0luP}ucA zF+lGkIA>a~6(HYcDTEAIbnp5JJnx0q!y$1wTSAf=mg2X|s3sC(H5(BO0 z1c?RY7iYrM+A$#NjESH!3q0`ys;pf>qo%>3J|WQ33R41BPE8VntcSh`oofn&*3}?4 zg7PFNEEz!O@8%Z;rIuxaN6TU2j10bsS!m**@`ZuHu{bo?!#^klw2u^WckWbhzbZc5 z!__f9$TiFpR<4Dh3c6XIuZ&k0-(fcT6I!3Bv$sh~^;-{SxhM^2+4J~KiccrF(dR-kf<1tJbQ zZ4ItpRsb~T1@Q_fo0E%pu^<_g$dTHvYQmUl7*sx4F!<#c1Ji7zJQTqY@9h}i3`&EcU>3COn*+@+N1@}M$B^2J?$A5}s>}G{Y)BsgR(62H z6MAP0n2od-hy{6{5A@CvkQzo&#NHk*u}>fGLCc+mVE4kx2FO_5BCuEpXj5bfWG4nV zK)_||Vz8WRS{i6pu`Cr?8k|;^faRe(`jKU!Wz|x!yk~k|eo?ANW>RVqPpuHeajh{b#1kLG#`XXCU{YCbiKBzw03iaQV90mr&osQtP9H zT8IJehcH6gcp!1Ve9+bduoP^*60XNHFEJTh?SSecW`rKtLN2gbNaD~*LWYl^Js7a{ zTiZc(RA{hkP`smah-a8*NMw9KkZZ83ALKZJaFclKlCZjJ2h?Aelt5z{pwoLBm>?+| zMuPe$L9W5z)n7=bCVTqFqlkjjGPCF|F$M-u+d+eY;o~f5c>qd_4B$0>;I1M#PlMJZ zLC=_gFLDBvfgrUUpmqjiNCBJ-$!8!RQP(f%KPzB#*4$Hfc{0ven!{7+ol?y5b z%D{^?q2m#|!R-@JPGR^6>N9}aCwq|6hzGbY2KQBvYhb8nkSpkr)nFVR$4~;#4|}2E znyLxO)4b5~76$&mTIc z&4fkX(ai-s&&-TP&et)5!3pVXfdgU;43Go!LxMaV-CZFA63{Ei!%eVCfzk{m^TMEG zVd6``K8D{tbWn_e;gA@p-wnc$HVNo13()TGq#V#j80Q?&rO&YQWk6>HBcCk^>UTg> z#Ya$ihOHmy>lp9o;urur)DB}w8JYw*{?t&?E%e?h=-Br$a9pp5(n+^ zNz8$aZGy@Kka|!!NiYPb7G);pz|uTS9JD_L+Z{Srz-1ni{S2V9;8;aD85o$ZB86W9 zLws0(6C{em0-WICa}An4v$Gi(@}OY=atCM}F*Bz)C%*(TfDdyA3w#VNwYV5mIcHXZ z&o>3hgU0bed%F@-V1xLO_y@I11h9v1Uq?@$U?2YwTqF3n<)L}* zCe%;e8IU}885-xHIsr>QbB%Cz4FIpz3vzY$3=Ro$gmRqygIpjXhF1wVEJ1ng4m6*D z*b>n8(Kcw9-Ua*7wIVqcoXEkI6e!F0T!Fz2)G`Jgp9Rlb3ZQWqaPJcm41=qIDCC3NIeGwTs?TtKWHol z)E<5gwiOarJPfc7i)&ygthE@5CI*eW7ts8|m=DP>o1pFaDAfC-z~d0EK|%gO@jaEPOC03@)%_QAy*92kPI=)q=> zn~$SAA-90lI5;qX=I0P)0%Tw%z%?k?GdKhkYVZ?5px#24g2q2$ERu(T;UjDu85CEb zGcVHf62aS1K>0mF7&I0S9~J_)l|ky*AalbYb*_2Pvl>8k3l{^l--I-_>kKYif>X;< zA^ZA3=Dr5cFM^Nt17C;=5(Akl!hqO&1rmD$9*YK*&)^eUz-7e+LC`o!Ku%&wT7FS3 zWIPC@79?)K5Rh0@0`5?Q&;5akJ1~Ij?EE6n6u21y43Ir<;87rG8y-}@CNMxwlJ#Z2*{3*!bGswJmVxT)v15%5MK{JAR&_iV)W!8H!28I%(`?5fNKLG{?rVmJIy@3G| zZ&=a-C?$pBl!d1MkI=HK+nRx)4ZgPrURHyKi8Av_Q(Y@klS@H8QBZviX~Scv2~JHc z0^fBAl4oLo%loB*)_B6Xki8+y2zlrHoSe**)RfS?^2|KYei~385L7pU=2kv~`hbWk z2(%8sKN$IdFsyQrwehI;*CDU-ge~bzE-Hyhtw=5?fw$Seh%qpH6=PsfXTaHKMA!%^ z3LxQ(E(&cweuvhJdJI_mpU@^7#0V${oUcIj=ufC#*xf`wKx6W33=F@ZG-%HQ$i1Lk z^&2`K`vBm0Kzb^)kv_zz8A z*3fecPeaRB*qIri`#3$HIW(UdWOC z&~g>jrUtFe0ne|66eT8SXXd4&jWu&Jz{gzu^KvQ~K{3QVO z*A?hpU4`H}3Un4FWE>hat_hmY0;M5bYgHJbYf!;zpzCSDZ0LGgFdMoy6~vZg|Mc+| zv>hc3_EP|KQ5U4{5CMyUitohCJkTPt@WdkULPls9ih|`q<4chAEC%L-<`#-G@^ex^ zrFCjbDx`iB2g?Pe7K8U|`sJ56mL+E9fDW*Mw8167^5Bz#O2C&VK*tj#!Quf$`2~sT zpzSZ9v<0g3q`=}JyFu$+A!dO51fB=-@%M9Q`1CQ0feqA;W0MBwGc2_jY{V0h!Q;X0 z8c;5SHds*VL|p2j`A@LvBxoE${14iV1714>Ue1UJW=NcZ)S#_n zLFprbmWg65TG$w z6>vO(N;A+}C-8nkLRiGp<|Aqd<7~GV0jG8hOP$#u|aF!{h(p21NM(wP$;zB zrVHbTfEH>&!dMS1hMG1(=77_tvxj34!>5l$3~ZotOxg6sL2IswOPd7y30Tr6Tn{vj z8bH(NO=|`Qke@*1J7^7hIq0Sq_$8E(v3LRKJRgb_bibnlcpndn%tz3E8c;t9)aEh* zmHEED@d2Q*(|{mPf6z!AC|`lrv7iaV%64ODJReJj4)4phVF9MlksXhM;6*eg{KP3Nn8JLr@Yje+ENPF>DVe z$ovHiK}pE`6%0YenMn3+Uw#0^e-~v;P1?kR`010-1M$A;=Kf{}&j743YhR zgCWQe+5Zn1f(()U|AHaN5Ohx$%=`}wL58MC?)kwGlnHaMIjHPmbjv9L9q$5FV+j@m ztzJnjg1O5|oPj}s(I+)MF&Vyw8lS@DgOd!i^Vc`Xe#|119 zIZ%tJC?9fuB}jY)3wTXFOc0ePGOlSc3(+ z+ZMFu1$0+HYGR3BY6)cFB4}_lxFoR%RKJ7j)#cDK8MgPH0eoi|xJm|}>Jkj@+CbVd z520#7`Wm41E}|X7!k{ArD)Xt^)|F!W^zjt5-gX6tNkCC*S!RA|F{FhF3U4>CIIOOQ zq$78*m`7znYEfBcaefg*HKcC$0Luku=9YqYV}sL;Cs+(N{u7V}UbhWOAkaATLXmgL zEJ{r-NlgJA%nMqP4KddntOn)|Ncshpr{FdNv_0#_zy?}h!RCX}o(*tx_I3@y(Rf9c zgw}6tV!qILw{!xn1>_Kbv?rMun4o=Z*cbpfzMyd@1Px2%wSa02Y@ju)Y(e6nmA;_0 zey*M-7N8n61jd2e87vN2?-$3wz~BTm3$)IX0W?-$QVKu61~kqNS|beJNeeB*KzW9P z0W{wUJH;5XCKA-%2nB~7B*8=03xigfga$+AY(Z`b1x?Z;3&PzL25ob^mH?$cCV|b+ zeiy9I4zd^AK7zUfw1$ua-1dQt@q@-aB2n!JHzXjof|+o;qM&w7fu8YS4Q4R27p6qE*F?NTrs+AamN(e^38=AYuh?t!I8#CT)^SR8fiG7&6>IYyZT7Kf!r zNcju06FEJC#SxgUYgjsF zVQ>VWA%YlJW?*3W2x{+w^86a`oy~~xEKs|M1L<4{5TA zMt8_M8qjz^COE9%=@03&EzsZ$YWa&p5}rn~#35&KrGxjWFbT|qrv)Z~LrCex6FRm9 zoA>X8^oKwJ1G=UsKP5G|1a$5?sQv<_sa_;=Rw1z&q3Ioz)<9_;w%!fQhOT!5v!QF; zKx{?{P?^pu1Y)yGBG?=XNNf!xwgD2`;?u`N(7ay^4!7XcFvm`h?MH1Ae|`M&vi&~LSA+S^sd*)(MKC>}emf}5`#1)Q&40baNYX>xo9r8g!46KL9o%@u<3H3Qmw4oHlNA*2Fvx(lQ}2Gv0v z4B$Zx&?+?ex;vOZyHNcZ65)r~DTiF|V3C0Pvm2Tgn6)7O1g&2LjS+#`MUZ-tjbVxa zL~b55zk}ppb#*MXu08?vCn%p!g{B!08+4Wm$UIoy7J#mU2gRoZQhpXd%BxHkps<7F zZAL2uo7MUge7)Kfu;0OZ(n0fW;5N`yuo&tX>@=_#Y)l!^_m~bAcPuF>%1i=hb7&bm z11#>6@0VZVlMlV?eI{58HD80=56Y9Fpmq@mGl1?|ViRR&U|^etlpg~~o`+-;n+=T< zJLnjm4N}zNH{YIC_uv>cIVhD0nk0VC}}mn04b@0%+f_N>mJlT z*u5{Hd%Hnxad!guzJScx0ks>n?g~qJ;S%H-<{E^tR|HKII_I=p9CAhz4zt`GgF`@V zD$raSXiqI9Q=^MQ%~}aHi;n?vueq@h14Fd{r2K=Vb0&t>;*fN{2Cf!XmoqWI()l{5 z9PG|}kU5C_z{s!xYQ{#WI*=U9e3%)V;d0EPTcG9O0|thVanN=6p!G`l)-Qqf5yAF^ zKv&d)`+K1BQvm54BT)Gv!QfJqS(aJ^>obAsDUdn^m^jkfACP(tm^fsmFF0SV5C^R( zftUl|@dT~UK>6DOst2?q8C2JU>;Q$W2mBlyP_Hcsv@{0n&Q;=|_4c6atUbYZ5hRu* zXTbEW6$hQY1hEU$kbsG=7iVAqjmg0M;+YS2+a__)JTydoXddV^9!TA=Rh)sL0J2ZR ztuzn3_?Q8-#sai|X&X2{L+XbB#&~F&glsT_Bq9_ccv-m}S||ABK+;JwG_8Z;xE37A zEDZI~I@BL2KP`dgCs6)?oex$AJuiuYAtk@W&@jFrqcXmvvLH3S6nY~abc_>2J~0nG zRstF`WklDTmH|Ge79_`nE|*damt#hk%Pay#4(O}}@O&Bzx_o|G3hYcvR&=?HBCyFI zJK50XQX%_rL2~Tqav3FHyExFr%QC=gr9gT((dANd;b%fIH!v_TG@yl@r$<6*U>^wR|eI2Oah?u!C+-NtSm$> zzd&mcL1_=1^ca{JjzY_xW6<&iwtgQ}MlnG1C~|pm99&O1rldfZFoN|;yq>Wv6MXJ6ERTcAWKh531X5noV1VT%^u2(X-!R`Q^DZ;>zo0^-OUzW-MnlsoU09gZ|%z(J(Rb7aI0en9__(nqT)Eju* z16JQFi-T7Dm1O3Fc9`X)mZUo87gWMW;6MXv;GOggu(t3g5y;ISjwxlJ6C~g&L8U&d z-T}oaJ2ZY__UMU1^x?iw4l-^4(hD1}1F@Z;ezt<%k^T^5KWO1P>}*fRycGDQj~H%; zoO28^XD_rZ1qvt7I4rnL#|X-+h(3D)1H;EGXuS-IchK62ypp2)obdc2P&oq1BOq}m z==c#>7}}Nu&9||D&S?eTHkbVqgtPiB0jR8Eu=UVHy0rTw(kK* zoDtTxHemqGt%25tJw(bQ3`{69X^{MZHn#>UPaZ+@#$4#w)>LSE1I0D$j8_nw5t@EL z?Da_OrAX{5B=#R9b0#6x#8z|z#xR8S!Z?Psorre#<;ASJ-SP@Y_z2Roy757ZB+=S-mXl|b>z!r+*bnGRlQ z0Zvn(u?G&={5o_#9v0sqIRV&OawIuW9D?eGZ%A<{!C+IG2f7y}MYkj|-3}awC?e4E z?K?CMKWZ>A(9^9y$#Cm0s9S$%Ffho$+jE{pg#r0FnaP#DiOCt6d8yDdaiDvG7#ZO5 zjyXBt+eY9A?1JhDP`if-p~gQi6;%x=>_KXn5o#QBau7y%=0UB6+Q))W2S0fSp&GJ= zkri1@QEFm}FJxapv14*kesM91`7rz05PDGL;r54Tq~-;eq^1@@&YuG9*#_<90=2jP zfZAK0L4mN#wF3NoJe?y!Ng~`N9zz_m1`?FN|3bt2hz0`#XdeqG92mgvD9X$SEu%#o zW)5!uLBbj;2f8#F+NOqtFH{_|jTqb(g@h?o9CUOj1L!_(#QDbmVeUp-O8{~*ObFCQ z1i6(#0Vufi0*Qmp z!-CXhkbWUZjDrE@7(_kG0~u#aODzfquQmd?5mbh8Ah}V1NH=mq-6*I@-!hCF$*si3 zDG$`G5}Kg%%^_<@KzlYJ`+Y%Y+OvY@)|mK^%;q679QdJT%VWe9wtB}mGta5C7&7{c z99O=H65NNyxHu7sd&RM!NplZN;oltvgp=VOBl6@*(5X$jJ91F1ud zNgILNE}-#e5hQmI8&;xFcj#$C$~Hvaf`pX`bUg&fPNX{81h%FFR2P$5Pm3eDm)LY8 z0d=n>F84y$PoTTk0y=I)iF>8UaIZAfy$(3sYX)5}g63W`*qRqg+$&3ld*z_+b=PEI zD1+7?puPhG20+)r$JR)o6WPm_Ux4cdPKwe3K2>acUSK^J80Sgm9Joa7^Hs!D#I8U+*9*Xi!zg;YCvTV?A!(DN%vs0 zK>3{kZSOiL?}7VuX_@JuJ}a#L0;O@7`(XJGl#bwH&@>K;E0`E89fAB0HZu=8kox)4 zN6=YbybKI%$`YWnq)=MFpvF%KiU_nltO5pwDl1i1}V25Ta@O#)*Mkl1-j zHZd)z+gMsq=L%qBZLodSpgm1k<~!h!h9AjTb$EwSO*~a7p4{z4mAwmFoQ=ZsBa2#3urvJfdMj#3>yoEiBEuvgZ2)>?mB~(_XmNC zN_d?F8bybMF)mpL2k?FbkiS4@-$2_T7-!$GptT>IB|z(MK&__C#2nc6BG527!>5m+ z{aT><$ORmBko2zt-cv{E{ysJ_S7@5Jt;PU4k5Gt%fq?;ZPtS5e&{{Q6nSr1K1Q{4$ z^F^Ti4RWzNbiJX61Z19Fje!xT8K8WD%?vN78QxGcKx3gW^I>wnP&rWDjHMm|UoGS0 z80_f`-l+}RJ^?@c6T2LAPTwDDt`q~K5G&O0AiD!37#J|!%E}N3b!!k*AL#4~T406HYBy7^)`Vus58v->S-CdzL+!Y3OS2$E3$PCavQ_$R>76YRYC)97Ccm?4| z2}Hbt{fiN|oD5M=GoztqDlsq$vEwiYGpyJdVxjuup!#8ZcR}e3WIv`J7KQ|qT1AnQdyc?X0MYMB`FpyuR5)#5mt1e}KbTtmYBgS_MY16=)Zq$ylV;OVLm zY7cU_g2Jarf`MVTIC}nOWhjQauLP>k2>ae`S6B%NDIDQkxV>di{h)MN4rL>!2T+=< zkU-cEsgqe4DxvmQLG_@gK~Ow`@M0ls`IVia2CBans$YnKQ3w==p!fuxLjsErP#Az# ze%C|QH$c^c;tC>%FslhFhwgq%^H>;Kpystg^?=shVJR=1{e3~lxdpqr#Jf0#ID%sr z5|r3vpk-G()J#1FMj4TYJ8dUvs zsCwAi29SDGwM+~%p=xKr)p7_x%t6S_fy!kuL;5VBa0H#*QI+bShPK)W+-CCx*V_;o z=Zw_kY|pfS{Nm!wq#Vc@K0Xql_0|x1(2iDE``8cMe}{-8-!B&oZUaKZ!8=f#5{omF zK}|tOzdJ$#biOWM_SX|80MxV3D7zB5PcAN$DAB!n>JMfbUz=OoKvNDD)er;3{btq0Fj3*1p##~it=Il zvn4=lvK*5OOEZg7L3jVTJAPnXqZ$>Ffddwz}%G&I%OUb9Z>l?3DEs| zz9~82$b*D$qXYv(2Ln_Lw!Q%xPR$Yw3==?oHPDH-z9~5n!yx+FBp4WGfb@X{;Tpl| zs9OTmr-8T^WEDuZD7Cm4bjJm#E!iu1f*u71Ovkk z4EvE3LH#^cf`Q=x)Glz?fdUQczZnt?3?~?1@q-y&vn3c9E+B=cbFy1bX))x!?70#Q z3^$PU!sI|}T4Wd)nC2n1Zyzwkqp!k*l!xe|(6;@2XggL2dcGU1?gf=Su(}JxhLtOz zat@OB5p@i5c?Da03F>=dDX;y*{Xk1l{X&AkbB>|$NCNOWZ#lFq!C{6slze8`v#zRT>&m*{LAxFi$cIB5kTV+v<6gy0dg@7WHlBf z9fHQ`q`+%DA!Q1v?3IGA`S8gvhxBy8=@KL-4ZbTRwFthg8fyMZa9IT&A4~yV7Xs?Y zg4`1*2r8poE0S|ci!;koVNzi8Kw)CQ0Cp>Q^)M{IDlve{9*A2(5}B!xJrW>s7s#IA zJkXgt$o>Gyc|iNp{%M%*0LlBn<*~a5R7VED{SF!128l(WjT?f-3?g7>9XTZ?XM@h# zNJX6U43bY^fbZh@2x=z@GB7Z$LQ2ya4Ds-W5hTXpTyT7Y=6qK})A73~P#>L10M_mS zrCnGb2*gHSUkr*PP+ttzSAz9vVCTa_#zDblZDxKRXx|hh-a+CV;QK@&LrGv6XxxJ2 z1i*6O(grLAid&Gl1bFT7R0en6rmb~c`>gf{i=;spe7!nfX=@c5`3O)oZG#-ltG~Ag*w@N_PxPi{?LfuOO zAHISlJtY5v*6M-RaY4(*ZQ!;5Ts?TLFsR?Y9m($^4A{n9F~>|ne%%4}Yn=#W>a z&{;g>x^Wkp8$s~{a^r3!H|j9NV;u;Fq*<&|&~RiE+XHoTK6t#1LjaOCA#FlXnG4|~ z`fIRuF(^&L`u`v{Y>m7YbleFte(O`32|YUul-@W%_h2CHy#TeXL2CjIBl(4g0b8^~ ze1bbYu!$Xk`ojWxjt#6o3i1P_-hi|jVP_nI@&yB=e4tq#1KFX#09~M%nV$zfWf__t zL2?=lu6Zf`X`t2>xGe<=BLggX64b{8&ApsJ3MUI_p2XFGgoGI0ZYVqroP>tm5lO_^ zMxZhkH1C+1npYB%pPdT2w-!{MfX+AKz;nJ4NS^>`d>M2}8$=_x9s!9pVeYd7w2Hr;+@ofONJIsdFfxe0T=xpU5;&nM~Ta={#uq1=SA>ka`bvuuvjw-RC)Q ze)PL7b(U~}D|Ji&k`zi?p5FNizNd@}R0 zA#D(ln?#^@hr@2p1f^Y&xF~}Qcpp4y`WZA92&(JuBZZ{|G+$vG?1O|XI8R}dhUcdT z&~RQQ2?=Ld`2*Vvgy{Ri%3DM~8a6%!3NP3gEr^XgPKX%mViJI@`v<9kjX{FK7vxt4 z2FQ32Z2x>Q_#Rl$c^rr}K5vlx&cP6m)TD*@7D)i^zqe5TZ4UwEFD3!l_zJ>a4hGOT zGl&oIJEGqY+mi(<)3CG!u#M8YU><`P;D|QPk5B{dUoeY)hPDqxK<9cw^E9X(P0qUh zFW|fh9qUI-vw_#o!^*F(NZ}|09_z<&BT;h^pnUob8onphAn6Adm*`{Jpg4z(lflkR zgybQ}3VcwS2h}Oa^XH)Q161e!MshE)>pT8H-K7DZdw`6$5NqE*GVJ>gwa-8eeeEIS zNIjVUSQwxSD4}&LsO(0pp@gJ$P@9QS5;7M9B8goq#v}<@(`li`zz~L#j!@^sKxvDK z0lJ75Qi6labx`;d<33Ow$U=tuSfTFoqEZ;Kli>yqs2f7nKxer?(gny}3=Bbu<`!wrH^Hx#NdFu?kXAoCf({kyzW*w`IN476?$eQhkL9D(jFhp%}BX&jg{A*Cf$S_+RYIZ9|T%neWENJVBK;edn zD@3^=NroGwpl;|@L#%HCnGacG3vS9Gl@GA81QPZjbqIGL)|kqW;SO1-J7y7?Pe5zl zV0DB%8TKha?OQ~weHM^#29*O!WZ0(+wQo6*_JP*w!ThI6hJ9*K`_`xp{2EOSGTg5T zb^k_CSq&Yp1l8;4Ybil>FY>xgP(27;8v$RV2`Ym@YaqcFN`Ozr084?>HK@D<$sw=v z1eIUlHJs2o0aONn`Or0;pnQvM{U#_cp|9TrrE8d4=q8tB@G>W88vv9JVfKU4G^m^d zr4_gsbR8!sK4D^@v;k5F3L|XmIQbYD*t8`<^Fzd~Ytw;-wSpQ01MDmiP#KE6&mY8R zWB`waVyxMOv?(BiyC8Rg%wu6FWdOCELG1-Sr1%%X-sVKKiy_T<{OxOS+nG&FAL?!y zl=dfNJ{8oa2e}z}?iDuQ2x^al#*0B~7(i^yxkktu1B4l@46t<&uyp_+eXzN8ggVGP zKQbS*)&aps%zeV<3e^}`!KZ?!Sj7|-8^+{j=4Ix`7+m%zQ-1$7JRu$K)qvfuz7{@M=SgHXItk(VDCWG7=speyJrO zs}QDRQ&g6Vss@Y0@wtHE<2Ps;f?EUiE=rVPF%@?pU~?uUF`$@W^m zMX4!7NQ2y6o|y;t2XZLJ1)&VhFhzW)#%H46yuAluE#lSfx`S#^IBTDNo78Di2TW&`eL1B7DJwZXi@` zOj5m*p#Fsi zPYk>o!IfR1aTSwXRHC5k5+CmAXJ!IoIQqJnnZzsTx_}u9x-QQCelFlEL*hLg{ak!J z{oHL06?9$vLgGFBfdAk_jhyi@ppu1 z21^9FI=gy?xyFb3Ir@0I`?(^d%#1-E1t~H!1F<{KgCu6dVxb>E~_;ib-%-fCALTKRg&@Q+#-k59mln zH&6Fa=uKrluI`S`k@2ADhA4+PLqXRC!VUEej(7EQbn=1v9wHjqXbCMOkxk7`uV4L4EH zEl)8qH!uRzMh1oox+#X4xdr(}CGmOr@kObiLy5s>6aIq7yQ@dBu7a+sN3yPhu6q!O za8uBA4_464PA$qy%~8-zF-k4S%*jtL1?8<21zrCN1zrDQ1zmR^1>GofP?&fJ1vtC< zg@FPfKHkqi#3RT*JU-af$JIH+(J#_AK0YNiIj6WFHCdw=eC9=BUZo~TpL0-1d~k@1 zr+>VsZ-6a^NW7y@2v`)n+}hLMDbx+*pS=8(#FEsK%-mEEucRn5H!U+K)e72%!y<-U z{ejj!AnN%PLp1GrDAhYQvyw9N5X~V_;DF`@%R!5I5=%g<&pdsg7g`pBB%?C56?CIK ztb#opwyDiw6y%R$b~1mDseP?VUSn+Uyb1F|sybk+p4-3zhB5b6qZV+CCo7k|Hy zco)xLP$G>FaQ27~cMS6L^m7l6_w<9Y<2}F{%}flysj(yjblgC2Vp=L_XAvk-CR-I} zR;8x6q$cL%;7+fS77+gVX93&YS+$9+pJR}(yJS7FsCPhts$tANOiWp_ zp^1TBK}r(CM=1toF;)gUNd^XcNd^W#Nd^XgNd^XANd|^bA3dgU1y7-X^P_3`%)aB_6^hUn*JfawRZh|%xt;pyWNBY6HABEZ1Fz?2GMg31aI3#5jLK@Uk6NCu(HQfm4Qgf37% z1?d8*LDdD?R)o-XNU-h*LKkRg9;6GT22~du*rzZT`uB2NM(8pIX<=Ys0I5OM1=^m& z%m|vW1Syeozx4*8%M~QVz`y`fgQ^QuMj~7owZowRp$i=B43H9)2^P*^LC}^WW=0KA z$U#kJW?)6c1y~KJ^k8PxK~lqlp$1gKqN-uVPy?zWQPr?vsNn^N7_xiVG1P!cV^niE zz-p2h7#L7$5f}$vEx-ierY!q*7q?eMDqptu0h9(xqX6EL` zW=0?$0vkY?CYCT(0#`~KGs7mi{0J^aNJN0b8=B<7!3^R%FfcImfEY;FfkD7YFB6pP zRg7T5pd$VZ0|UbYr~oLLJ1`g=fT}Zt3NwI${2!7!khlYb!U0hB5@Y~HJ_7@ir_>pQ z1wbk50!SSLXrTcELvE~)Zzkycr~I@M1&tt01s_j8)T|3t46+O44iEp-3CWZh828MW0x4}OsBpxw39uILdLwvj+=n6(p-vCs3hI)ts zh;)cYsGm1@;}4QwiAyC$CYI3j0!k%J;8d~$DZ61yB`FZc!%3u60xMa-4T&Xi6%Ym} zm4L#4+OdzQ1aQYGsPTd`Fp-iWk)dW`f)r|yymf~_sNu<5rjYP~QD_sM@MC6RVQ^0^ zK?I*8vZo*g8S(X+sUdbhfl68ybeo((hr#9`TSszUH^X6{CIe_aBbv|r%TkMS5(^4a zQ-V^9OLIynvKe2RWJC8UO7xK$rY5lB3@!D87Rj-r+C(#ZI3V_TKu_d4+KaWCN@Z?|~1{Q{3 zs^wsO>6#baCKOMRny!s;lz;pT3=Cfw85qJ{11QR&X0RqUTD}2wBKR3t7{UWWK_jZ5 z^Q)0d2Jk{SWQ$4lmnpo>k6K%ShKB?o_PVE*1Qg|$Wu~MS1tgYaP*`W-Nr8eO`+^-o zTfhn^EAQ}?>_SjmQc^&hRzvb3w>qIzBqZl6eD(=rwGSmRl5QWKSQCNSSC(2-l3APz zi#v)^i81z?610vdje&t7JlN5(xH2!>N-_|YG`B&N%tWh8`H7b2r7jsvk^zl z1sWL1M71%XD8D4%sS@2vlJg#pa#Do>w4)p)RADxj<|d^UA$yZ#JMn~THmWa!Q;W(l zJxSG=%)(}4Kz%^8ST9q(lQBZs%H-nnz*kz~dhU zs7?8Kpo1=vJb}a{(mxj1OH5E7R}sY)r%Lb!dP>3$Ht>Shb^wi3D52Q}Dzhl7>)^vY zSZq_qVjE>O9lpG*0=2CuHL)ZWBVix{l(-nfSBI-YY;q|DP2DDzqz30FXQ!4>7LNGr zQ^RT>Wg%&bBSoq)Ffgb?>~qa4%>^Zp;DW?tc)Ot(#havtD!z8D20mL|D`;k~CVqQS zf|*qR;tORheD+diD~>V^)QZbVArpWE#QaJ43jQf&RhNXk+5&or9(yjo@~H8nl_osm?ix#l@fj z8^3EAH;Ttewc7;8 z=m=;A(F|g@M@fDjN<){Lc9FHSv>jfdzaHN-=COG=cphZbG5Z`#^XXg2&CZy*K?Qq$Mk~B!R5y$u+XwJnRi;b>%DU^jN zj<^GjTsdH|4|In;N|2JA_D%8F=!nBclprP9Mtteh31XvPaDXRzh9lh`Jf*NR)Si<3 z49apf9y?qRc2HCb8{_CNgI006LhK00r*PB+U%$r^I@4Awe_20SH?{@{uhe zIfa|zC}-su7#MOPt*7AB5?J%eBR@YI**cQ_geN}*!TdypG>5N8T>$qLb$ZnJMkYhx zeu8FPlqLnqp@(NgA{5;wl%@p9HsML(VNjbehd!xkOE|JEH1kU_G%bK`S1&D~BxU0p z#f^me1-ut6Bp);x0j*PI85x6r(d z{QPWOg%jz1#F4*1^RTfHKY~sUcFQmFEzK#(EXaXOHc-?C#kcMv9&D$xOKK)$EPyIA z_;}(m0f&9YMik`?JT@lcu#vL0CHV4262wN=JkYV!e!}$ z+lZsRqt3v@;%O75W3da> zYoykK_*!5YSZt#(Z{Qe>S7l&e$b{GiT3A~Enc&RK&vQ;JNlgcxC5rGD>Fsk%4w~BlPgNs(kMy*HrxY*1ZXc=#scK^(b{i?p4|wY0B3w37R{P@^X8?^u z72~pz(s0F->q}7VgynqXgo7yOi0h~0o69N1YMYr!JcT~QHwRaS)lSE}6z7b@%)DX@ z%SrYxo>HzHtKF!HmSp?z)L0b|`#=lH=~!b`;;7e%WEf4>q6bjd4<4H5kIBi4?R%+(P z79=}iNe07{q^BD^xv>?Oji{cas-11P?4&UL;LDBeAUhK?z^j-Y3z9uja|%$C4(UF` zQzLgE+2)a$my(l;X(6fU24Cx=6Ujcm{F2PH%;ZGSEm_pE8{c?Y7n0qOmAMdGk&8M~ z{fcjNzZ=Ou=oKmmSvK@)1=I?>pl%HDw+WCcL0|CNfB5lLdBkzUU23}7M2}01- ziK!JO;9FXdd`8`ofIehX}!ZT2z8!C2|0h>`y#tcq+t3aIUFz%*lb?LzRl+MUvAn zzERg{5F0@^abm5;NcJ6`T5LMPF6YvsBG8Rp;4}6p3Qat1${7gzAhCy8X_6e4W;kL` zn}LC0Cc-{&3=*g`Nwyo`eE2Mg-GQa4rKzFCsYQ+j$;iP(Zopf(m|mZXBtNd@gq zpvW#9z5|`$FdclxP6;i6f95=t+U}ki+92(0Oa=sU-!esYM{WC<`|n z{Z%8&#yptba3O9$OhT_zsGE7gA9#1$% zZ$N8CEs$-ZxF>3>H=#bPr^erVM#|XY$0y@75WCLZn1Yb)N)Y>dU+x|dm7~$Jb2P#cK z=BJ@;Mj+J=eC=^iY(p+8Ku)wI+km4U289r4?@ck-7RF}g<_0EasNx1tu7#1M1%#Qv#lXOr$-v+k$H3s+z`)?L zg@M822L#vTFff4e6$XZyD+~;tF;IMnfx+_-14FnH6!$PNgoE%m28Qr&3=9zo5FBj9 zzyQJ_Qy3UPICu#I0|~mfx-U)14Dop6mMf-2-wEJ5GV)1{#6VN zAncpRzyQK20t^fwocM-;0fdvH7#P6#1Or3T2?mB_3kXi#!@vN-i7gBaAe^SezyQMO z7Z@18IE{fJJ&l1O4Ae^v-fdPb*S1>SuaB2_( z0|;k@F))B|<_iV}5YAY`zyQWh3=A1g3=ElKP+Z5rkXgsTkaYxtvke#+Ksa&%0|N+0 zu`w`!aBLI<0|-YuFff4e8U}{wH4F?f5>VX6z!1~Mz!0Yg!BMvu7(h5~3IhWOCzvoW zfN)d+0|N-hXD~2;@i_*Dco1e{V2Ed8V2Jqw!Li2}7(m$j90LOgd;MZy0AcSG1_luJ zF=Jo=VP7@|1`zg{$G`x>otqdKK)Ah+fdPa&vKSaZxcv_U0|9tH*w?w`iM0KyYE7#KjfX9)uX2=_i=U;yJ928P}m28OO*P%Ov5&?U#f(B}ui z-5CrFAl$FTzyQKs9SjU0+_!^)0fgIjF))B|rxybQ2zOs$U;yD}76t|oZg|DO0K$!j z7#P4fjDevsjDexa0D@aw7#Kjfp@o3~gj-fIFo1BI7Xt$bH%KusfN*Oa0|OX8VPI$l zVF?C?RtW}%<^l+An#aHZ!p(OW7(lqLf`I{ypD-}gfiNEfLmeLjL#+)IFJoY+UBdFe7>ZS(xQBtE zxQBtE@D&7mO<`aFVYf#N3?S?=iGcxx-D(&ZK-f!zfdPcww=gh(u!j-@gNIUlyr*w~ ze^5xgi)*lRkY_-Me^7k5r=PDcLwvknsE-e(G($aD9wHm!5$fk1@8THZ$Pkc|SQ(sO znwP>5AD@|95Rc9;&P#y{IWnN~AUcr6!ckO&BTRQhHy+96aCAACKyGqoaB5zPbAE1a zVqS_P13DjKKdNXrnkqE2f=h}r^U~o)!MG?UK?LCj!MJcW?x`g%sb!hTsh%!igHZU` zRDq2`QibFuBvH4b{9MhQtUGAK66bqSVBa{GyP=;%tyQ_tX+(5oDDp=D8!AZ=ai- z=~|JRTw0Rq;1KEP5#Z|N;t&N*Rd^+HlQTgvP?TAgTI7;gk_dHz3qkK2r?6yi>Ageza%rQ5}^pnhpTccN==34 z7i3pr6NcF0oS2i7l$e|i4K1vKxw$SyWuAG(C5bsX3@99^y}6nB{spOdjtseQ7OG4* zTn3&-ax?RtbMlK*!7>mQLQha?VhUIS%s_~T7iE?}bU;`Lnc&paY_JY610f!inwOZH z3UL{XjV=pu9Yhw{eeS6xo_T5cU}Irygx+8zSr{8d)~PftEwu=&J2xhtqG7)m%oSo{NQJM#dDr7!F6{=q#af2>~ zP>tdlh+;G$h}x|DN>ENuEptvRD0XB(<6==0j;aQhE+88HN^@OO%Zi~&U_4|~0`g(9 zAQrMrNJdd=aYlYl3RE|O4_6hGnv~%+U+h`|vJ1|J%R1-hrDdi&XC&sOr-Gf0DgaTJo0*d7Us~dxS^^6X zOc8XIF0lAOD1{5*P#eyGp%xZ52nled6p~s|;)tXgNf6y^xD>MKNP;NpK}8+RSTGw! z7E+W!odV&Y$Ojaq79dZZ?%fC>jlprHz)s1MC6z@`IT7)4KTMt)I=Z*e-zm2f_a zDxdtkbRKY^4MG4#T`;;jgaC><=fvcU)PTg2 zQ1uDv2V1`3DDDvg*#S|7Du%2Yz1)DPM;Arb;h2&FZM#6!BKXLvg5fE| zGY`T>m4&7YkYs)VQabd^gOn-|vmtC`osj$qk%h34Wnp;}A`jz1R3w&GASD)59m#rt{!SoIFf3(5V~5pG03Ws1X0w3(>~M*U^a>@B=JL~ zAsiHW)MO7;hboAo9zEGZb)XBQ=z(-Rpei986nRJy3YCX&P~>4nCsYNDi>@ZM1Qxc) zc><~l(n5pOC|HD0%mS&+EJ@CQ83*U1s0vOk2|!i_=cA}XRPG2{p~)Ua9U_54)gc5> z)PdZRlUNDre+DI%q#`>JSr|nR$Yscq2pd4-RB)qE^f(ozCT9EO=NG_iKnS3ygA_1O z6CoTFc~};Os(^73YQXgYtoaL4g(85a4w_>iSq`iaE`p{Ko?DRAB8j1?hMEG&Zph}s z$}70T;ASAHMG`|c7n~U(8o^9tIY>@~NJ7}ivZ(nFq6$?ESv7jzgQ!OrMb?3+k05Fh zd}LLSItiiz!bX*arVW((38EU3|B%_pIzdSo){=v$K^8$%>FEMafZ#asbb;1_5M8je zgvx{HFUibJbx$n`t}HG|%?-)SO=Z9oK~agU2Fym0g{BXfAuujNjZ=D(N(xRf&yb_RBhTL2xtDHHBh|yA+kVrj^tGe#s=_J3fmYM7~&im7#f@z7`C`DF#PafV92RqV7OAl zz!2lfz;MWufk7#pfuSdyf#F*?14BXt1A|pC1H+UM28JcU3=A?M3=CPJ3=B6y85qnW z85qt5F)+A=F)(nsF);iKVPM!0#=vkYf`Q>vAOk~3AOk~85CemkI|D;gAp^sVat4M! zi;&SH-~asg!}?Q!xXBPBjC= zo-zi8FO>`oJ*5l`5hV-^N~H`8v#J>ww8|M6Zuv4WxcD(Jtn*`F5c6kXc;L^#;1$5Y zuq}XrK`xMip~|0uAJ;Y}g~LsSw2!-*sY28(0{hCQha3@wQa3`%JX3>VTF z7}C-i7+$0>Fic8gV5mu9VEC2Bz#x{$z_28Nfnh~514B?M14CFA1H+3<28J~m3=B>g z3=CqK3=DOd3=BuI7#Iw)85kBsGBB`3F)&2MGB7wqGcc@)W?+zrVPI&BVPMdUV_>)y z#lSEnj)B1>fq|hQih&^`o`K<9JOcw$JOjg*7zT!8u?!67ycrmNc`-1gcr!4V`7kiB z`7$uf^I>4v)XBim*UrF@)xp5 zp7b&>)buhi{OV$0kn3V#@atn>$mnKZ(CTMk=;&f#*wM$pu&a%M!K;&j;Yv3H14}al z!>a}chC_`E3}KB73X7`C`GFerI2Fk~_^Fo-d1X4uFe%dnMU z8^b0B76x_(4u&lZ8yFZFm~hHvF=R7jGUPDiG2}AXGMF%!GMF)#GuSX#Fjz8JF<3K5 zGe|MWFo-blGVn79Fz_*mGYB#WF^DoqFmN((F>o{RFi0{8Gej^%G9)u3Fhn!NFvK#% zF{Cp@F=Q~rGbA#kF{Ci0G9)qhGWamKFxWFVFgP+eG59gqF?ca}F!(b#Gq^H%GI%q% zGq^DXGXyb&FoZG$G6XP$F@!TLWLUwll3^ahe1@eA%NUk3EM{23FqdHw!vcm?3~~(X z8P+hYW?0LxjzOEjfI*SLkU^h8i$R@1m%*4poGL$h?GgL9uF*GqWFqAV?FpP#KHA9n` z0mmdPa>ayN!9l7h_~azfRSr@;2m+5KTy-0TF2jp#(7rC9FUTMPI2e|}v#k6|Y_n02c{()bpa{a80}(`Z4nz!n<_=cD9U0H zSjvDH2-Aq71QwF0O3*~Xi5k4d0@+INXai(+7u6yp2~>l?A%N5{&P~oFum%HZ1rgk8 zP_l-ulRz>aB#Pk}gdmDatP43%mc2kN%S_3{JK2Fy=9z~+b^#gJ1{WL9919TvW%^X; zR5r4HggD%-nJJmz@dj{!LZ(E~biidW^uWg`;I^V>6NoTsM*<=SDtS;`jBUgRq7*W| zg6t;b@fnC3w236oJnREPAjSTrCEy7|oYQ|`S=fXj!dj3%@Ol&!Aw+<}lP6?W5Fvpa zYLGE{cz|N+flFcPLJ4e$L71Tp5l1N}p`OM%eTx}2{-q^oapPZFf-7?TOH0sW$G@}$ zeJ~g5fMD39GfDvBj;LVpEGl~1hKQm$5h{pt0ux~)L}dVML=Hm&HfM`2fjSHi@)5)& zl!RB2T7>Fc$OsbZkOd;nvB@H$9U_ZXL4gM}uq7>sYNR9r5de(|L9H)Fw-{Lt-CB?w zWE=_>5D4=?;^^wp6JkYb5qi?9NG(E%wTjdt+#@qc>&c)FKp!8034=yYFvn%U^%`tE z0y4IPb94q~61KHem`jw9ivZ9PHPG@z=#nLbL72;)(3fz52ID|W#}Il@RwcpXDmOD9 zMFJl1I2Y0(Ohj872U)*{Y%)Xy*+{g-aiFRVEgo|-^RX>f3x+OsL)Z?fClSlgaLFKB zk33z5ylfceXk;;%KG0A%p#f-!-5`~SyaTO$pn^za=O~KNM#s^|ph3FP2Cg9k^yn2e zL=?GnfQTU61M?%gILx1Lad;Jhp#v_1p$A?tz)eBTv2bCuk`W?~ngk$XNO>6|fUS;z z$RJk{5E0}G93}#v^@j*xuNOda{-q^2rsvRu7g8Cb6`@cg5CM-ISP&iXa6}GaG$~A7 zC}9jyjTy)gamZ9EB%vYP1L|yHpP$4&Wdtz`rLKn>h8ba~)jCuemf2@qv4~dFLk&Q! z6`_Kl30Uw{F^c~{qR7*-=#tpHfj136$_hxo5FW)ST-a(1SS&y!p%$U`9#Q&@7(GTv zUk+{w3KzBv6lMuT64WzH5xv2z{7STbAY|nw>RL^Ndh}i&oDc5pfR=k>>*+!I zTj077+Q);4z&dHL<@_){N~aC4By4d%OedU==*2;-0%s*iRRA*(NeHG5>ysdaVC61C1l$h+_YPpzLmKSR#y@mI6cpar#6dw05r@VW zLLpQDp#mHw5XGQg0@MN=v&RT+Ahn>L1HxpO2to}af|2?UU{68A5Nn?SWy1-^JSwE| z59uL5*x>RIw1ENCb%6E?ATr=$2)yG0wyOfPUj^C+05PFqi`MQ3$-r9tAU33}4`RVu z`5-n*Gak!E3&`FCkVhesAQnUn+>Qqs0co#8q#4N}>IDTcJn33(|FEM3Aiz;h`?1Qz5F9w_3V z%Xm=B8HhBbV1}?E1v88dUt)w_wty6%w0fZe2=7CRL#S^d{znmlcnl(h76NF3$SR>> z08xP)2oMoSD;DY&P!kooeTO6r8*D)cLCbBZ0CMob3TmhnqR2SeQZ%RZvLaN?FCs zP$run!OqCQz`+0kdMT+%rRgfc5FP`AJp%(n4~zq)9T)_h^fFTtOA=L#ph65H3=9mX z85kJuLj{-_7#JKF3=TlmnL&jaxEL51{vxRZi90YT9AIK#U=U#71aTQS;hs`w5Efu( zU|{$L7H44KV_;y&jTQ3EOfJeV&QB{*&As8z2C!2zU?O0Tfox%h ziI{-YfONvum?A_#;&LDYib19`FqlJmAc~2>kAZ=KjCnpB34{yoQ6f`_kqLA`3pj-^ zfm6tKaFBtV$H0Isg`_~F;3QHCF@_0(QpjQ$2TFrd2q*}s9P`A)s4O^?acoK_Im|4K zFmlyx0%3+HSD8YC2b?QGxeCSy(GCm_uv}#V;)5_K_g)4ukT6IcmBW^paFu3Yz_q8J z)KE1wh6btv=mZ#0)=XIiDz6k77#L(3cyP_$!>wT;IqjRkq7ltTF>tuDFo0`5$c!fg z!WuY>$Q)*3g56&d3=9m63@i+&lkafT5jGNQ53Hz1^Nl1pWwJ0pJOZE4M_5F9xLIQN z5h#-}gM5U!W{(2fOmW1L0t2YnW?=v|$-n~wD69Su7Q$J?hNB^N--&`N6BY(g%L@{g zh$tc>?ZFN{LW?a>xyi=Bf;h7R$r5V%gdN!qM?yz8-}f#3pPLS`^p_?@VK9rN~2UbVof~3Sk+XMTMND0JjS^ zcZS@6Ak`*Q9PNE|1_lO244csA_u!V1UR&X_R|&tpl$G*$@`5sky~tL#!xLlbaNEEI z3U~q-5sYvakuip^OwoYYgl!=(+!`|C4UgY6AvS_KKhSl=$dLxOlt{lJ&gR9etFk}dfK6vYpYk`*)~U=OzieSV#M zUzy@a-AdqDZx--TbJ&)&QD7sU($5ju%j3cU=FjmY=zz`a9;J$Oo{Ot3wmVjk(VN=od)(=*8e+XdQ|1=+8K zum;W|GOqCTiL>FhKzD+{4JRYy@WfCK+#cvAGfM2i6Kc6|d%&|wNC^&ZA+e!`$Cf;> zEr>HR;ASK2Bi0r?byGgf7RW6@2unz>0r8Xw1yEZk?secPM+;$gARQ2b@D7|sY?$GR znIfo7uq}vivq_H`JYiN0wFR=dkpesL_@o4C2W;CU1-9VnWt2i~LEDgtu#EJyhR3!t zY_=g+-lW@xCzi^gwt=cTN?PJ3cGXuNtT=;GMv5=aUg$cuKTdxE*;Zm`yggrNo9A zo^g~qxJ|HI@!+PDUZ&wm0rd!bK+SiA*$5VqzQH#y*#NTzWqUOxxf7pljaY4?B;DaF z3!0#|LAJ(H5KDMcLkj~7%B``KgdDydU#)2NP!wi(@=+TD3wR$q@}_y(gj_q+Cd77p z3hco%y43--2QfW}$UtP2L3nz?od}zdPVAz z@bpG{p!UE|R6tlmdJ6h5J=fgXN>GR~)EXpvP);a=dxpBT%36ed=#31L{e^Eu;yM(2z~`z_;v+oe z#d?HI@FUw0R>4_BrU`uI#RgQHs8wFz$-x^@Y@|E~-7RF{4CgvuVsNx1tuAzasp)r`9z{SA8xRQY(lj$sLHHR1EBiABRt`TX-p0Vnv5kS1QwEBg7+5($_zeRq=NkrAt}rOx#=y$8 zje(V04~pk8uyW61VC7+f;t~c{9uR)Qz{>N4ft5D|ijOg{@*ZPg<+Fg|RSc|rs~A}M z<)C;111tXo237$kD9&ME6#(IT46Fk87+3`Zpm-YttKc>URv`r_Zew5-0^v^#tU{j{ zScMay_#6YP@Hqxn5eq0@!N4lAf`L_30*d<>SVj97SjE_&xQ>BU41~Whu!?e+ z;!6yy;+Gg$B^;o56$7ipDh5_bF(~d}V3h>nFAS`bUl>@WGNAYl1FO^>23F|^D89nL zDt(24RmK8}=Puqu3FU{#EQ;(ZLPiu)K?m6V{kje%7Og#R(HD*a<%RW5?!YYeQ) z*BDq;T%dRj1FOm!23A!$DDGfjRR!TU46Lee7+BS!p!fg-tJ(nuR&_Nfp2EPY4#IyJ zSk?b9uxeyL@g)XUjY|xynl@0ph=Eme5d*6h2NdTquxf$uJqA{-dkn1Feo%aXfmQne z1FMb^6fa|7)mg^Csw)P?9Sp3xApDDgRrePIt6mlq-(g_YyTib$9|Fba7+CesF|Zm~ zLGcO(R)ZA`tcGGx+{3_X*u%hT!~(@d46H^V{D^_o=n(^}aR3w_U|=;qz`$x^0L62g0uySnXahu-ZpK@ihik`)drW4sKAqfq~Uw0|Tq0928Gu zV0E0v!0N;Y#SILsP9Xe)fz{~;1FLfp6u)9%b$-Rb>XHD(ml#-GE-|pWxL&!nH4LnNApC-X)$auZtA7v_?_pr|-^0KfpaR8R46Fel{Dy%w;0*(7pdS=(VPFm1 z!oV6N1;q^vtU)0BjDa=i83Svu9~5t3U=7~Dz#1Y1#U%`^As~E(fi>g`18b-S6whK{ z4F%y}46LEQ7+Aw%p!g62YuF(M)^Iftc1%erN-ZvSOU%v8sr1ZC%P-1JEXmBzV@NH{ zG_ilb>IZl$eZgQ*LQaNhZh> zaD`@Iub7qOo1h6L=H%q&q?8$9w9M2L29L0K_fSulc&8wLM;B+u;1IZovxldT zOOUG{T)@ZQKfuY+*&8kp;27lUhtLq^8syJVoS&Qxa&&xgW>qRfe7vV`fPYX(yo+nF zbC731h<{Lgc(75tu@OUjykDq~52idrJwyRSI>aN?&pY15F~pI3$}h`I zNi7OUEXjbUDXdcA!H$l}$*Bc!!{L0845X9~$qz0m%FIiLB^Ycnm|`&RVv_-jm8BMy zWEQ8w+zJbXU`NLkbSaSf;>x^a_tX+lq&iiCQZbSSOgRi4pvcCh11yK6BcLe1B;TnL zEDXuRI3%$Mm*ys=7GYWhGZG?=q%SzNs0^1?NOBlD0`iNH;|v-C5FKDSn2zAooYZ7= zrBK1}U`I$kb_D4UN<~R#Smoe4oO1G$vorJ3ofC6l3>84gIaT^(BJxMDBUA-c7+D=CPLa|vTp>gpT_sW) zMo}5g08&|$nplG2bR@y>U`LnIf}G6c#FEtD{N(J^5+s{3WH41D*^Z_fY`<$>X)egw z!3BxQ@LW`kWCbn-;lYmBrCcir>INynqaVr1xU9hAc7nPQdQ(fv^NX^<>82QwuE2Jp zNI~5S&VI@HIq1QIB#y2U%`tG55I2AlEHo3rO9-%Qpn~DSj_#=?K8eL8u0=)pNCg6l zC`1)}}q>#X( z3mhJ3;-F;dR0***1-GSW$}nw5QGnYSXv)Ha9X(3&^N@-q2p1}jlwLsM#h|?GnO9tr zn3IDXB1q20DjOc`h(#R9kyvFxy7H4tklf}8=7PkFVPz^JL3<*^!h;>X@-y>%QWMh< z@^F#xU`L<){Or;Ks27}4(=+psynsy-s~#i|VCn(KHHxrnUJAlB7&7QK_@!1Lmw_ni zA#&Js;Bpd32iQe^!2ys^gl9##NO-WLUrBxjQg}nSP;sQR01^kMg@AnI8V$?~4|aq# zQ(&z#aE*yt`QcWAqCYP!Gu=5OF)tm|7Xft;aLI-TI|ijDmm$Iz%!7)$WELkw>p{4$ zLGnoAP?c^)`MIcOfJMNvx%p+O&=dpCt;p&y?K-LQt0Lhgk7L_2k zsDhyaU^!4@JtQC0Mouk8uJItvcqAE2)yUR?8~t$AVE2aRC1Nzr;gN|=GCbHZG%q7R zKO1}WV37+Cb_`FtOHw15LF)z6*zUf zRuI+?Rs%Hw-abNvIjA*;5Jp#rZaiEiB%Dz+BZo1%M0l_>Xn3Fi($LP#&vQ;JNlni$ zszf*hhdfT5$kt)k3yD{xo;Ij;g<>HruE7!zn~;T&eUD}g#Q#Wwpk6#yv%wOmW`l%q zm<^Q*4|ayOOhC;haOVMGIED-s)yT%9tB1H9T@*PyvB+Vu!?gl58VAjZm|DO&5mOkS z%V230stXnu7+!}Ox6@nA$+nAbkZXi6!vPHzF~GqKadvL~#>}TByHK#E@eG)nrJ_ zhZkj*q{2hUzbFN11j-qkWOy((VPr>P(FJiCSOONU*sMa8gV}^4ieVADELL5}p@8WM zP)H(o|BoMhoS(Q=Ap*o zR0cB#(#nIF082Dby(m&J^&uHWsfqB87E~ov5Tph=VvII`mzV+TtiU8dYQY0k5UZW@ z^GZ@HN)AmWv})I2O%22~iU z&bhRxC^fGHn)Kk22U3eF1yv7mJ9-8KDMyikss_6cZ}tM|#HlJgF(a@vwKO%fIJL;J zAQ=%UYydqz9z!S*GQ|U>AkmhTnU}%hWT(%%JwFo2%G8@iD$b#m9k}BZ} zkhmCXAQL<3sU-zaRS*HVy5iKLGK5h`JTw*HvMD{a1fl}WL#W74&W1S#6jNX}ifn#C z3CJrTNe~kvmjNCOg^&o5Vg`^1taQlCOD%~9#{+@|Q48khmEH&>*f}EFH!jOr?hREh*7MG;vF+eGZSRQ!z4niVCiWxv6FxMA>hRMJL zLY6-~ApddwJLiJ~qmZapD z=P?w+7*KKWXbpJrL23yD8LL9g%*>&yLQgO-FdPeEU^v6i%n739vHc2(U8T6JTWs5M*W8CdkU5AjHbhCdA6{Nr;spL70`{oG>ecg$OId z3K3QY2~k#tK2cT%HZfL)Ix$v;FJi0=DdMaQm&92a93)s7R!Oijh)J?CbV#x?e34{j z$dF=XxFf~N5FyRVa7CJx!9s?WVU7$dgMch6LyIgc!wXqfh9EgshFx;33_9|x4D;k! z8Tb@f85$H=89phnGDIn|GVD`iWl&OLWoT1kW%#GW%21@t%5Y7YmBB@Ym0^tvD}$UW zD?^7WE5jRAR)#1wR)zy=tPE=EtPE4sSsDJQvod68urgfIU}dn;WMx>S$;!Z?#mbPU z#maC`iw;T~>x)x~vRYdaMk0^jH}}^jR6s>9aCe z8L%>}Fkod6Gh}7xF=S<6F=AyXGGb+TWW>r4V9d&Jz?hZ6z=V}ykqIk9 zFH=^A3^P`SJ7%m55$3E6C(KzH>?~Lrwpp+;s93TxOtEBTV6$RnsIp>ZcxT1R5M#~C zaK@UI!N!J_VVw;tgOV*P!xURq1`az`h8jCohF5m13{m#14A<;g8QdIL88$euGRQfy zGE8%1W#DsSWoU3>W%%L5%24FY%J9mWl_9}}mEn>LD}#$GE5im?Rt5z(R)z^~tPDKv ztPB zhr(DH)WTUARx&a$urV+)urqKla58W)a5L~Q@G|f*@G}T7Fu|c9gAju-g9w8tgBXK2 zg9L*lgA{`_gA9W#gB*iAg93vhgA#)>g9?KxgBpW6g9d{pgBF7}gARi(gC2uEg8_pf zgAs!ngB61{gAIc%gB^oCg9C#jgA;=@gA0QzgByc8g9n2rgBOE0 zgAao*gCB!GLjXe{Ll8qSLkL4CLl{FiLj*%4Lli?aLkvSKLmWdqLjpr0LlQ$WLkdGG zLmERmLk2@8Ll#3eLk>eOLmopuLjgk}LlHwULkUAELm5LkLj^-6Llr|cLk&YMLmfjs zLjyx2LlZ+YLkmMILmNXoLkB}ALl;9gLk~kQLmxvw!vuzj43iipGfZKa$}o*#I>QWx znGCZSW;4uTn9DGaVLrnGhJ_4^7#1@uVPIxpVOYw*hBY)t!;rWzT*|PFVL8JJhLsGf z7*;c^VOYzsj$u8+28N9cn;14TY+=~Su#I6m!w!a>47(V1Gwfm5%dn4OKf?irgA9il z4l^8KILdI0;W)zyxG9VT%wc381!A+65y@UAh7$~|gci6#rx-Aofg&$ObFDyGndVx7 zzETY|#F~;)1RC`LEiXXfLYAkXE?mQyFGtYPpd~)&OSCY>z!NvbuBifP2dxEyue1V%7icyM zJl_c!lrDj-jY3ik9=&&}^n86JBEiQ3r~6Vga8#TDpF5THvb zunL0>L|MiFS`dM*6tqwQ>?9PGAW^V>%*6`u)d`@b0ifjwAR0P24ja=0=MPvmfF&pA ze5BO{;Q9LGGEiXQSs4IU1sb$K4nT+=jCuWV$oxL`8GEQC_6d2gBy`>#!bVAMh-qw=|0Q0)q` z4pLcw*CB(1AQmDCg61R9)PaN`>Y$kyl>foyB}gH<7Az!j=!b7D~CFef2G6?1+Hq!d#W;#o{_Xy~BMErE?d znTLXEM-hVrH+WDI9$AoSA=o4isxZV1uzHw3P?e*I;!+K=6*>)q7`g_{Fn|UzAw#p! zL1&mC^3W?*1&~4pBE00+++I6l^kBAG&?y&SQY* z7;sH;fF((qU%)-$7&LkQGD7wtzw!oXn8M z%1Ph(gJm$Cz8%KhIbTTOUzINp&cWL!6-5q?KUiGu-Jnn zgy=BAwSqD+sJwxx0(Eg9ogIi05FgUzf$%}48iof@1YstDIzbRUcsI7dm7vuiNVCG2 zJ6X^>M^Hn89YOuW)Z${;&K9^^Kr-l?PY{|=Iz}KPU~@RZj^Nf9YNrW9AGo50_Jwdt zLOM_w(xAo}F0BwbaAyitA9O7`To96Gz)ppAtkC38x>pD}XeSFv0KP#3AqMSmp$kB} zU6{h4Bn3;_m|ZZ0dT?n8>4?Dv(Yjtp#-Pa{#Vn{j1hNy{o`BUd$jc+KD*$!S;P&ED zLeLs?1t?uM6yw3E1k_DK@)XEgxHz&=NS!#iAt*ZxkVSD643J(IqFaZo1(dXqJ8?*E zLhH&Q7Y+~;k@bSY9o~<_Z3v1oB!7bXdPqySL0s6>52zmpS@el)ACeW&CLgjalF5+H zAl%DH>+RuU@HO^u5tMEmw0nq063IFgouIBFc5R@pA(9tRbb;iMOoVqH;U<9=vLgi+ zh>H|h;PvcqwXke}*{Q^$1gUEYmj!h!5v3rAhtxSlQ3YOfjwFK7J5;GQb7DzE@j)WOzl zBebA)S&{Xk${-nnZP7K{KrG9v;d0Pb2RIg4V=jM&hd!nh@_H_89bTB77)zTGW@735 zBI&}hc$t6-a7P$L4ZI9RwivZjj9ooaD}&6{#%LzMG9IYdL^uYiZ3B`(4p$^8P%jy) z9*_jG9%#`ADpkRi9zqkk3_e}RE=Sh~>Nvtf3{w(|u`rKgxCJHw>1d-H3X?_aZsSsh z>}F7_6SISjuphfTnh7xbLD7Pu6h${5nxW8Lg8J4*^th6a&#a>~KBc z{t-NRK>FeMB#})8>xKCqn^qJ#{5lbVjnS!xItMBa>1;#0j;K<|eLp^_#Bc#z3rHAs&;UgW5~k?!3(^F(3-8)Mlwkz8sW?~iA*ld0MIbgq zV-pcg&{`7Nb|gtGEA+4o7+@~DgV>FGl^sN$z=Ar6BIu$w=ps5aG1LWOpyhR_A|M`k zaU5J9{zY&IWds+w!Ik1&$c9jrpPUU^UIh^VtxSV8VL@zI`xU&d47^GWq7KXluT4Yc zW3EGk%Hvvb29X9WDT7%HV#BNjts;ZQI*18gSq9O8xsnVfo|l4c^%ztZ>q;?bG665i zL{1v8C70+&E1@J0NGD5o-j2yk}AcFq(u^MV$9!j^j?t?q;`=LD_% z1UUzCd=!Y6T7vULC@y`p<39@Hf&9CSNOjwYPzUnIF${Is{dX>Ok?KhM^8KK0x8Dg`v*D0a_oy>n#%o1_q-(CWbVq zT98W}1mN`+T%7|014C6G6T>b7>Okh5>tkYI>Ia#`zyKn#nFmrQ*3ZP?ML?Yn0|P@` zKNCY25$fjkGclYZpbq4Zd;LrdauYxBFP;dh?_0|P_Q zBqoL?0_s5Sn>LAw;Ti#Tpm2FLiHSjOGJbnO>Wn5cF{BZpu4*z9!#V=$G#D5d4ozla zctt=R$liaGnHY?w;CCM=T->HGF_aNd2Qsf~3KPRVBGg@)!oyANcq(=;ZACIad}>2KOJCWdna)Pch9 z(KIFovFU{E)tb)4kVQZp$iH>dnHY8vq3+ytCI+qj26n+j zm_FZlh|QkfuJM7s@gbppey%?8&i;NOt`Q*&dJOD>sbKH8g$MY?`?-cdjSh(naE0ph zb`1h)aS8GdfVgcA0|VHOLWCU<_XGs_hk3fV2BBzV&|+X01Sw@?0Na74)Xmc;1mqz< zcTYc822}=j!BTK|fz?8N>M+!B3Uc%d2A`b`3o4M) zW+I#B>l+{J7#|$s7~&cq930>o9}GHks0Tp6^X zX_gJ*T(mUn?Bf_5?CBO6@95*>AI>1gz%IB`2$aD1@y?C`j!vFFo*|L(o_-;q91#-l?BfZF zaZq;q3`?`|u=w$F4FPKeXQY52&oEFZK*Ai`c+m#vY65uC%LEHD7ms-NApg*Scq0Y{XcFcI zSprMKF8;v*pdba8bf7X9?`v2J7M@n%S5#0EQk0pVo?7IYmt2&Z z3p!yNRQQ9u!^wc+1&_qy3~<_)W?&ce76(=2e)*7W5m1y`kY8MqnU@Z($-fGN{OIc$ z0=}Vv0hCuj6+bg9mJq4Wz{CQaLjw?@66_ij=IIQ|zK%g5@d2)WE}nkw3?Mr}2_9D3 zffIbNha8U9J`T05ER*Pd!W_n&~N^oj% zG3c5TP&8G5qY0YuJ$(aQgM$7297EtmGN^P1na03?Y#KNpgMyKX0Thg$Zt*^$o-W|x z$qF1)pi&2Vc29m$SZZEMevx}>UTJ2YXI@Ea4!F($rDkRZa1#x5kZfLR4miJnnm6Fe zAC}iWydA7r7XG z1HfJcW!l+b4|t~*<)!BM=BK1GfYKJI#D`~EPNh}`EN5a8+p_6{f-(JEV5*&Q0-2X1n#0vGSTxo$;?xv7vc z0h}RHz=hamuxv;qsAU%K>*?zXiV<+7v{#&gfuAAXG04}}_w<9Mc|k@7aNOPj z2Mna`03v9nE+%9 z1H=}WRM3?*pwtK|CL3X)59vL-IePkll76V4x1WEwAH0JN4SBTA3bb7C^^J$>1Lu2C zQOJl|6hha)rGTq+W(iPR9NZuRo&N@Fp@RGiDofbG%`Zr&7@Xtc9sMHXgIz{UO|l7Nt+%*6Cm@U9)t6ko>(a1jVf zj_`IfbSMUtu|SO}P=becX`u<;*Wb?*bO#nB%OVCBg28=CP)vd=RMeOZ5AyeOj|a8G z9fLxAK^;C&3m6p8te}8`7TQ6eRxksk{V&DL08Z?naDYUHr(cM%5x9*Aauf?lpKm8WJBE>KY1aBZ6WP)U1OSRLIRba9IWF34q$oV7Fqno1K09gI&SnGoZ*60@;Np zGQ-TkNea~J;f0Jwv_JYd5ep zH8R{k$OY1E0kt)tMI>@t1K!XFRVSdP57^jvFY6%_C580-ypObSddqT++r4$#3Da6b-Y03@e+ z`h{44Q!c3Y02V^(Js|fTK+Q=|%?%GwM9mEvo&e3SM96rhr4hIuaui`;U}6XcT_xy~ zT9%sQ1G-ugRAzt@02{1v11?_?3BVa#@`Ku3(EJK%a|JnugOeLLm_Q`}1H1$P*S(;~ z<^o4{PJTHwq7nU1P%{lw%d;ZY@}L$dsQ87%@k2%iaG3`xE5QXZw5)Uwa&-ia`T7Sz z2W&y998~7P>j&gA4>ZOKDs@5K2~dd!EqgO(BL7cv;;R}eB;qldT=~!as*tqIWRJSCwo8> zO5mJhmBL)X zU2{;OD1cNbI_H<>m4J&dP@4{#96^;jtmX$5tDXVi-V>-~9y9?paTs7t z9A}?kPZw}FK4f5E5P*)Q@`6JEBm|^wF0qOC>`~L_> zLYw^Fu92{`oyP#FBS51~@SKP|+T;l?lzhOA98jqRR|G4yf?R_G{QY3lUZ6GsIKmM{ zHndIP?&{|n4i5S1%99lT{=fENs`;5_1) zSC*KQnZf|7dqERq;K~U!b^@Cq3o`@P6`+X%XrhMXZp1_ZcuWyAGXl;zpfZ^URwf6z zf*P}~E)2%d)*{ph*pwE;C>PMY0+zv3&;$#pE>%FOOJS`(P$>v%>~liG1Kd*w_Zkaw zQsK>hXxyx4WPsPO5FetIJMljL{-C)r|Ii?3*LYuOa~c$#ph^oI{n#rlP&+Qj&(Q~* zr9n|I2#)$tKTl^+>JAPG0#%ftyutt)KL+(#;nfPbO$ANB@HtLs(hhb74Wz(3`(Q_7 z6n@a!HW1O-2bI;JEDbG;p(zxWu)r}1D)Ye}!d>PgnlXwD@R592xPv-bpavzZH~={~ z9yI!B2yWqkRv|D!T78IB2tN7c44`@f)WQMVjgh}W0p=JS5)W_PfYWOg0|Pu!!JDF< z0byqG&hC!znw+h#q+!nduqe z-VvzVh^iajmWlWAcXspv_rE~h26#UPoW$YX27mCv0MH~gY94U*_XDj_aE%D?@pSeK zi4O@11t*2z5O5<1)F*%q(t}2&jX=|5pspUMRl<%s8wVa~2Xzj?ZUI$Wu&FWRYRec@ zZ-Md(sM`%KlRzaEXo4*$)XxvpmxhfyfqMtwxkod|%qpm^gL@FUu7f2Xcnm_@IG}a{ zq@)9t1ISGxa14U#Pf+>I4NAt)n{q+tJs_RY0Gsh)VsOnYPGm4(U>BSOUJ(MG3I>_) z6zb;Y8Wiv285|Pt=i(V0ALQyB1|DMqC1`M62WtL+%LQoj2i%U12Mqv$hw@m1JG>cv=gO;8^%Vf}i5vZNT0&8al1o^vrf|jU(-K)aL08Rj)vJRZ@ zG0HmMP@fP_a9<8IG3^Q;*@NU<&@8tFxFHEjXmD2{Cp5&`AXvGBoIMOpz`ZSyZg|%a zSvR=AhNo3faSn@9y!8rh9fq-K`0AewVXRyByxbp$7VnCI) z5=y1*TUuNaT$-GmikJlkwQCfiWvjU)sP&eTUt(w&UyxB5Us73+8ef{1od>!a02)`j z7#P5z0y10`Q7wVz)6gcEL9LCeu+=`n@y?*0M`#FW916UQ#|1Q<0bU~(;2#W{$n^E~ z3<1X(sOp6J7SbpKg%xzo66P{DP(cQdA8@LH7G&V^%he@5$lpH%y50sdezB2}0bEIf zy6y00C$wM!mr0Q!(i2hFsCmaW-9*GPd=KhbNX;z7l=YY@2I3M$yZx}gOdbTkNDv(337CE^K^!cUx264Kr5)gO>9swF)_I0 zAchA(?R3zz8!Rxu>Oq|X_yk|PTR1q0gW8dN;C3W<+7mR<>Easf9OM}Qnri@s9@uZ7 zY|9BNwUCBCK%ok%9#2YudVN0m$=Q(I{duLusVTt)iAAY~X5hvX$Sbgd8`Ue|#13A5 z1G0o0W{Im~0Jw~kXNII>P&*Lj9Z>QF4=jSL2aO+s`oZ96L7n{!aSd{H@dqy=0(Gsx zDlocM;IILQB`A_WMHxItAQxqz^^x(8AtAx=hB7o)fT~2~Di?W_Al}!}8LS>u>9T?< zU7TxU5dCpbMgm0(4>(%DQx8r){!ZYS2PZ<%XeSQ?eC-Kny-87CVh*^)1F8zZZ2^p` z0NiYf_xJOOgm*eXK?h3F;Bp9>qCpe*@&2&EO;Ak@8W;l29)bpjqEd_U!Br$EuHY@J zfFRdk4@b~=JE(IE>s^EU`WVgtCo}Zkbs%UxAb0^L$NYIAXm}5lzCpb|W=QWZ zIJE?{x}Yc*JlX1@T7rHemSVC6i}3z4_amgDew0&Le@@#!UtSF z;;D?l7J) z-uRHJH}{fU710$3jkkdc1#Sl4 z0LZ#YRR#{hHBt-=&c5*hjzJ-wjy~~0uECHY2N!tx&Y-}+A-G~vuGc>(9_Ch%5!;YG>F^WNvfkSXB zvUI2)$g!XW+wo43pxFwrEnARm2@G`&iUcjS_j3U)ZvhRTGsrM-2yRAF12qLQjmn_I zz#+H^*%FL+K@L1nBzj6QFhB+_K{a@AsFRngGpM-i&UMYyfG4#Xi_HWXFLF&H|a?9q#BE67TE* z>i=sKN_NO5h%;~qB0C-y77P*$9D?PN3=Ez@fza52tr${+rv7+r4o6D<0t_62-GU4Z z0j>c-{-B{#h?&S9g4-s_z#(V~@(5@-yr++=yDPXW3(6l0B^ek%xd&GcD?>IAk{X;G zgFT(&!ASv>IZBZt2de^5G+^@#I2J$wk&kSLi)U~EXy~3ng@Hpb56SExS07i<90X|T zsIR|EJUF_*v6zdb%Gtx!**o6T4K#Zm>3XbCkWgg~~ZgKhWp0k29%WTYTpNLNsjfkQA2q{Jo2 zGYqs##>EAiCKy05lnRo9rBO&u1`kw%3I$LJmVzt~aYk^6Bf=VRwogV@gc(Ml1i~W8 zzyNhYa0sZ}^=AMjUu6ac23L6M2=M?FqTnJR3E4<^X#^_CKpslO2pdqCFo4ST1Z0ia zV^xfSLoi+n?jCrW0EK2OD55~iVNi=DSZIPu-e`nYP~qh00xplEknIH(eBiP@5?K`F zIpq8cD(WJTe1ck@g8UhdBnz_3*&9@xg2UVzNeYw|!3h>@I(V!Jl=8z64uvK?&nVEQ z6Ar;pRA(WQKCGm1JP>bM^NF?WqCN*;u#c~?3><=vQVa~B1@7^VelDPHPLQWlXoxFl!4PVd33ohFl?l@CjK%+sK0e^;8e}$j z^*p-apd@M!(ukI4Kd&X5J*SX)z|;NC0Az!2`?>KN}D6yzTS8XENva*6kF zbp-7!1a}I+wLAWF4Nl9+D0o@K^edk~er`U30cBwwkS1s>LR|{Vg`hG~ z8zcpbNJwac;$R8L6~WGqA)v)H?v9`hb@8q~uHZF_pn%ju)&?&c{ewVjXrc9%AOnY> z1}G}wWh(>7LS>Lns9Qks@94sy%fKP11QLe112gF$hdHR)R76Sx*sTX8dj(`eAr%L> zj8b9@No?` zhzDnyVhQAiDQJf)sG#z90}rZsI=g~vmGvMypsjq!I5o(71k4BPTn_RcicT#C4#7(x zOL6)Qysgv8GbES+RG2Flp9o;urwR51@u& ze3&7)KLg4rIPwWd?`a7Jh5+!?u$!Z^YkZKan`;m#LxZ!zI|*oM1X{om9OCF305%fT zU_~x4kebAxV#5#;v5-}-prI!QP;v&%0%4s4LJWQxFmN+)2$nK1Fo0$jz*f}@GBAJ^ zUc^I3X96699DQ9wT!VrcK(+542?hoipLkbK6AK1VZIBO&Pj7JF85GpPj$y9g7Dg^e z95m8~+>eLG3kWHD%h8o3~sVwaD1^$YcN z4FWGx0~N%XAf=Gdb8!rDj7M?}s7x&pf^;i_LmZvG!Ly#A1*Tv}WPo&Hw**{Gf>t+! zx6eQ)dO>^LAQpi}bmJL#7&rt$3Dw&(C=gOdgQjESy}{`yC^R4h)RS_Ar)kjKCL~Qm z23R1YaUd^D5@lcrcMFL3bMgVV)xoW5(7vc327YMcDjwFl0@Y+Q#2FakK`9+Ffa40< z!RF=*k1b7EH2Z6gJprK6A(pmKN6A&+e%BDm~1_q>}$v-p%G?fPmJ0Xxg zuq6pT{{G&M!JaOV@qq+T*n!6-;Moll-@)J%xK4n9As)0u0I{Y5Tu4g@GcbT04xP;c zg(#?~3JnJ5Z9PE-2DmklsZrMma8$*EtOG?=u(P8ND3!$f1_g(MqSG6kMM1-0AYX!0 z0K{vcfQkcY15GA@x8A#j`axC~yMlHOa0teNWWmYP+27aK-w&E%89;?!3`ou?)YHcW z+`o4V^7oBLD?fZZgG0c%Ga97U-8BR=O2BCuG(-qp_yH=+T>U_EiJ(Ln@9P@k;qL-Y z2l3!y6qK*PlfjU@0uIV3km&*b;h+s=u7RQ8QVEo3K%@2G)QP-i4dQiBl?9rEhom;p z6e?tsG&t{qmXm->Adv4uJpCYRCxYX_mVFdqV1P_V2M2(pKqE+?lmObo8SfY12`aWj zeOx^uj%EN=-jN{pfr|EE*AUP!8LVIe6$KF>IZ(7gD)k^&chBIEpvd?jXd(j@R-i>p zpr}Kdh++V>NkH8_Z-grh7&rvOK*ssGhIsm8j7B0QC}hKrNH8#f6R@WM71UnNnwifCG+8`1T5(G{Ur63_tG3)6D zZVy2>jl_FGdVhf+J3xsi-qkN8DALS?0TjZZv=3U;1j%FY#1BfvpsE17aiECa532S& z{Xu=ukkH_GCvblf6fvO9?C~Ma0iFTz(BuOixday}0wRzaBNS9+fcoyBb{afOfoq)^BnMI)WN6&=wYWg(2v$2XK-EO*O~6_=gx8#s_#rf-?(v zL}rFCv{nY&9uHmn4K4sc1Lck(V2{ofVPF8Q<8^d#2?F=|y+NT5FA`k*K}%^sv4oWW zLEWE|paKj_%7s)>pl}Cu7?7)fP>h0WStfDV;5#V0LpJ(@Tomu=VgQb6Um*qtc%}vC zYtR8A;Kq=E00RTaAV|_MHUc}@1>|I8tDqY*K&|{>a7qDt)f%KM2pT=0il7Qq$$~2a zPy%xXNn@6-pb7?b91c7MgQ^4@kXnq`0F^o`K-DQY1%USrAlJ5_UIS?S99;c@n^B0Lx{dd>Jmnz~Jcz-X#HUv6_ICBbP@E zybK(ITLc&wpqUrs{{m1xboOuz0#`ktxl3>ghwYGrEDAM<2PaF=LM%`zgjj|JF5E!- zjG#kcuuKGwD^QzP9$GfQstr)G0WCfR83S7{3G1qWLIToY*b0gichDwyP$Du0`2#)k zf&vnw^%xH>yoDtg7{I3_xI!y^Sce;==MpH*`Zxx;gZiN%uI{cuV6W*TTFjsz1&!8$ zoPQP+qyb?j&~7z2`|5$51J4|=b~I=UsGqA3I5!F+I{-YF5Dd0N2PyyhgU8Lm9T#bQ z2FANafIamMRDxlvTtOiOnnQ!up70qoaARQ|Qc6V3#lR9vW?nq#6k~9H6BYzDa6p@o zQ7R}`MMtPqR$ z^aGu!!6E1&!rkO-N4^mIgq16I3}W)Wd?3He*qQom<1fTRSPj2b3N`8H^R=R!=|3Rz|Sv??8%Tvv{{4 zM|V)I4$F_As9XWcVUR&^a9s}#15oJ&T2B!lMkG1IjAiE&F5C5PLaNvIesl-G;2Gc= z?+o5EiQL5kjS~qmfcngS?%-~62&m)*=WR#i(mKH3-v{iv51@e}U(mi4@QGcZRu-(( z1EuXqQ1nB3nxIw=#8;pk6et0zL1Ckppb=2mj$n}Ndoj?=3uu@JS|)=gs6l58f>RM_ z^b9gYiWoiv^*BJw>~S1w2r6^p!43v(!G+fTpk^iH^b?3QDBXb8lS8_zpkxj0bAau=n7Et!I5@KL*3JnJB>ko>IhxM63HiG*30iYdSpfpy%z`)=Q zojQk%%)5dI;~s-d1?39NF*0~n3JQMEE^|KS4FOd>SVt`5!G+T`kPh(97K{x9 zpinS~2M>LLrVzkw1}u$Dq}C3oiZ}xb7I@bKbwCbOpbLV+5K?M`8Y^f6_Aai7A$!n- zE@&lfJYw_+lm$aww0i~=PVwNb%rTJ3 za1X>owSwBA*TkWN96_#Op5P%7kW29QHX!*Pw9XG&5y8765F0^d4rtH_)Lss8M2s1M zMgl-H3E;**Xj}*+pdiA)keO!&=}dtVU8y(&1E>N3t&DLEf;Ch?B_wEtD`?T5YY=D% z3bdNuH8|8K1Y8O11o;r!J_98@P}2<5-~g3<&fqROD820fslptJ1}OyPOYrPBIAd;? zU|;|b+#(O@f`S^<(u7ntkQ9f~)C4(yjRd$!>E;>)8kd4qexRsZ4YJ(PFW564I)ngH zz6vDh|4Jvd%#S6HL;^XP=2WroOV|fM0EU+-r{1mvB zs}o1*%7Ka*SipkfU@0iAfj+3rNtB z(V#=VN{o%-OBf6pI0Wlao8{21AeMd!q>&5CrL#fCgZzMHycJ|UXlX5ID>A4r1e#=r z%;J0@@c00KP@NtGnK9r4)zfHmR%X!76LO5=b|s?s1nNmn1i2Jcd!n@| zAp>}zA|w@LqaVnn7`--7iUXa92O92n1sCClpg0H%Z~_k~OaPhf?E;!4L{3GZ000e? zBacggYhv(FNC6}OLP7IEs7E%$`?!X=Le^D+j(>{ zJ17qP13=SYp8kH2IoK4`jtqGG3Us6fwCF)TPy_6XEudx(q!2)!83PS!gEpDOgIbLc z=Yv|?pp~@X_7A8Yfg~`Hiy*^NpcTiE!Une97#z2dNsVrhdqKJ&?K5z2J_Pmb90Q!e ztya)RO-L&aa_(PzxN87(I2-H<(8MmtzsRi@&}0{=AVcrH#rt@GYd~;MCJ5Y>(P!Wg zY=aDz5I1oEDh+-LGcX{>BRHS7f_#EBumbPv27?EIT0qi}scO*qUohu_x{#pZGtkh~ zE>Qj8;uG&5>Ip6razM$-*%xiq38*9kX7~)C>erV zq!>dLpcY>v$dQmX1tLx$9ZOgd11iix^&uoip#xeFe}Ns%4r&%*R98mO5{0n;4zdQLIs%0v zXfqQu`$2;dl4n3EEDfX!)?fu4EeMKK(An|vkl7OOL5-m4dyp1zt%s#E8V^qF;N~8r zZ3Jo_#DPo()j`Lh?Ns4K`KXxkk&eF^HdfX33mV+$Cm6qF2{L0*8h7a#)|po$MP=7~J@ z2XzN1s6lmNJeEok)OG|l_WTfSJ#gxeDEcB(g_r;pyUQmy`X*-tjht)0EG+;4B_Am0E#>lP`sw$_Ug4zAFY^KokI*0rT_&ty=eot_c7)XSq;jmCQ`QQQHCPoq-ztkhQ+h z(FIr;04gf@L4LtsRDe9E3~~*q9zh>`1!df~Vvvy?EPYtWfHBCTS1>Pt7C=Co{vnR; zpy5=Qdq7bP${g781}K>+fgAy9lpsyEf(k+fP;jDG9^hJ~4^$LGmeWJy95QtZa*#V> zcqcR%)bH{Gt$zU>;13!y0cS{%vRA?o&tZ;g#XI|lf=+M;mk*##{E*ZI8506;;RnlL zO?%+ZD=14BGlD9if1uVZu2vf;c>jVFK$d}k0vTGvgR<%$kPJrO4?N-q8rF@+Hm(cW zv9Sh}EHU)KYeFOkf|3MiXcwtMhR<|>T7aOle6f|K@%}-c?%K zY5}K?S0G_m=+FjeGVdiw0BMv9lqEn%Y(}q)Nh8= zTkwuE$o;T^7{?&+`r(TpClQs_K#Suph=U7SJd5KXOAXI}OvT=>0A(3)4-vHF7d%4% zD1MLTU zhPZ;x80HWJB^Yqy0yJD03h5q!1`(m{5YXT@cwh{4sS3DL1Dmgh1U|^g@!*8z4(d~Z z<{m*~ZlDcUpyG+B6ay-Dmw;T3I>`tNNl=J`4qky~P;gAak6i%``h!zHWGH75Xpk0V zX#{NC0#pQoHj;uC4}$InLUukVM?=y(Xc7dJ^5%hp3z2gmfd($m7K7p*!&~4Xyd;nm zj%0zf5)+iWKpQ<*sgL8}xo%1BVZ4b)bj2678*MF%Jy;9E5V8FC~zRt+xG zCxHwGmE9n#q2o26Qg|Xr9IeL#PF`)Gd3lUb0Xb;`NDIyu5~%5O9;6pKo#X5Xy&lFB zeBLaFAgF_aY2xUVW42dS@44vfq*OoOh9j zL;A$vss*&P0@T*Vv9bbGYWacmd-{XV;0po|L4X$GfY;%Gk|Ssq%`XI6T7Ww0pgtj} z{bdnf0&XpWHo-$<1bGWQxOwdaG8=i&7vvw%^%jsp4aC$=n5&b2#7>LIK{W}pH9)Ukq&MS{W{ zoJc@Z^dJn*Yr5Ec4Gu#i&|nmD1qTWT9dY=^J8&un6`r7xW00IS$cf$|Mxgzp$fNL} zJ``xbIXL{_XWoHyg4&6YECx!jsv!NKG6J;;2lBl#NXpCK(+^xjL(33Qfvto(P79x{ z0PTZ;_#3k3dX6ZLmIBCna47{^CkGiT2lXt$Wj(kc1|8i5TW=Qb=*QV_jRIi|0)dK6ZjdHW;RNXopsfJ~B{oga9BX`@nF+Z0 zzy(t88tm!g59TU?Q!G5mfIA5gLdrPJcfs?_)raNL0M5_;MPr7HZ!Ld!+Cq1kGL|MFS`Y zfm==B>H2_B$Z~aPX$qdx1NGH$Y|4NxIss(@!kzVaaH0GN<7F< z7vMxcNq~VN0OWG013zZ|0wN$mM}2^6 zI#A~kbUZ7#uMb&h3~48W7K}hjP*6>@9b`Q;vQX-L(7qMW-Em;+P!8LID}$K|s$qmd zNd=Swz^8U_2wo8a&%r`N43uD@%hf=2DCpP|)V188HY{XqG301=aMZwS0gPP|@Bs-> zZ(<493y7Uk;ABw@D%!(A7u|tZWygaX)1Z6?I?oyGC&+2ekdOoQG>F;D1WBwDKo(+* zBtZ*haQ)g3Qh{ao4%8j*2FZaEESB+1a60M)DS(VZK+`jHO>Qu#bpc8{F*XS*ttX*&ynC50Y?@ z;h+iwUbVVLfCt(^>$73At00p>%Uxl$9ke+ID!6Px$rw~MBTaCD^13(3TqtpfAGZ^}jwR_e{>H$1PZ5Y@z2)fH|Mx;jJp%*iK1BuQoq=qp z=DABxTlekj!NiQ*3G%|$r*}PZZMqc0Qd#>!lbL}bg8^i3?d;6QtM=V~d5!0T{(G&* zQMKtZ=PREb>_3zzmV2nz#Fl|!8d#nBy(L%PB-dMB+MD?AR!P2yqZ)6pbr}2kz%5fx z-_bo8!@#f=tnQcMHC0(Jsg}1QYvi~~(iE7AZL_ZZ6QAcUdcrF!WA+RNh6iAE>XlPH zT$mE)Wj~)E%QSU%&(Ec%3|nk}aQwOKZufIWNHPNhDy8x*UD{5XKiJ2sO!sk zdbRzo!v2}QvhQYQ`o30JBd}ahn-z+;b#)SEzg0W*Jk)jai>n6w3ae_AZ~t^3RrmVFg&-$)=-u z>@|&FIZMyZ=wA6<-FWl7w|u;ux0j!&ni=@~y(I&~39vc^P44!E2R)CkOz7Ds^Wfvw zVwRvYJ{wmq`QoyCW9y-m*9;7A!0J9q?4PkS&3JASgHTD;(n|)le!=L^M;0a%vG)If)yAzKH1H*T)I)QC_ z8`cGKEw`L@^~CZPlRQZyzpV4j8XKq1YDwOFwEa5+gE2G6zp0@wf|`==ncn;B`h&^n zMDF2y>;0l->(qp%sj?U@y?Kg(Ar`DI%{WiWPrzc2#+er0;=DsAZnsOnEo08(nI?E( z?pMt%8yFbs!0P(eecvtF`nBbSK}fQvv&o;(RabLoJe^nUrf&0Q%@3(428QimbzL@x z!?u@SIT`K}CZFs4hj-2+?PdA@eoJ1Tmpnhpja!?6;S*Thxx|K+_D9LGpXUc3&SiJo z>=Rd6x@M2f=5ujz;u%ba4GavQ85kIZKo>wmFMKX2P0Gnk)=Mi&jVVsaj>*hRj!7;m zi775A%FIjG%V2;gi^JsUJu!tjKreU6tF3|nR(@z zc`>=gC7??|ahsNsgVQi1HzyY5nwiAsrRL}1HVN#5B=9Y*a7FkXS6*zCS%Ay>Owjex zd5Jlo@B#UxpeVB}9u|%%DcLc3DVfDsEyAlawJfispeVl#t`lTFO8A!~qqqq}9_-JQ z)TB~8ahOt>SCCj#l39|86k^DMf!B?BsU=|FCFkcBz}<IS^-2PeUjloUkJA=?R(1!eg1lw3Vf{R%pRmV*Iwys?kqSt-!ftqcrY z42%NI44``d(?>1_CIJQk1_mAmMzA<&3WAXVB+e)R8smYnLBky|HfY!q!iMPOY5?84 z&ML~l(13O^J))gvX2PIn?-+_K;NSqZhe?1PYQGW#vkFk{@x|19C5DKP1S#4s4Kk1~p7! zaU}$G10Mq;sH$fW769EN0lN8^LjV%yObj9dAbm^%qENMw>ptJ$Jt^K#DmS7(Rmdp!9~! z2lY9S`JkakWIkxL0GSU;yU2V{_Y|2A3L|7bXyG3+-;n`y#|{Gn$UUc^X;cmzH+g0z z@ug-a44*!N(y2T`%-9GjrhpJLG=qvMBE&2hK11{>!NoG+<|!k@;O40y#Ng(sBE;b4 zslmn4;Cj^&VqiN!@xsNxpr#=J@*6ldKnWNgFL?3{t}6N?C=G%}tF#0d7(y99X^Bw) z6t}SSqXUg+P`U!e158{GF3u#t0%tP{fZ`IS#t=yy6z4E;VHq#189NA18BymtWfth26Bo0bX%+RvU0f)E~nm7|wy$cR;HzaXTxWUZ# zz#;C1CJr;-2Zy*Hk~pZ`hnXLMBo4|)F!3NHagchL`5{Q+AoVcuFeGtMoWjhBz#$%m zCJr+v28VbYLR^RubheHFq+A2V1*oP=fR;z3IW_=dS78Hac(R2){`xe72afXw7$ z-~iX5pxbTIp=M`5)q>JC$ZVLKvv7##AjH9L_Jq0_6u%%h=RwWQN2n73rA3&V3!&mL zxA_V%Fo5(TyR8^%MhR3c$Za4qU~Vfzh=bh_2z3J}PC;&{faY!>tZUC79b3+3{9PEZjs2f1(1muP$sQzYzI&dC_xuF#* z4s%1S00RR^FLF4vL(S-bss*_LRL{WN&;=J~0>>*48>l_RB+!E{&IA$fgNhq5U~Bh4 zmWM(X9)OxXNPK90Hvy_2RQJKyu=WpV3>Ud=0OG^iKOp-+?VriuvK-d_K{6jyf`=mU z9UK@yWin{g4Ad@Q2e%8D1VCoO+I%4UVddC#ba$~p{5uma&IpbpQ2ZgnmyuyMG<@ek z)d?{$3W4GuG{XhM2=&Yi^PuYIL)CLJK+K&8jeC$@P~0zss#^qA=Y&1HF~`-w!Hyve zZ;vg3ngR85sOhD@qtXg6v~tU|?E~6y6*R@fZd}f*nH`Y#%86L4$vw z@CWV60oe(%0~G#N*!_dHw-@XgR555eS`GDw6V&aXyv@MilbV-ak^yU5fW(+USKDRg zmgYjGKXp1_?kEd8c^*)mT$b66= zwXpjUx@!b%9)u0`(?$yX1UkY3*-s$5L4Mkd>L-YO&`1N{UIB64UL#xdlZ8nrF@nFff4fj1LO~ zgBJ;Qg5nIMmw}-a9M7OSn}H#)G%*F@CXk<57#P?tg2IG>I6s5J5wzk1M`!VRPs7H*(+47PB)0SPx$ z|AAsL1T7q(@d(-> zZMgsg1IT^IYF|OszD85qC;;j6BddK2Rr?N2Z8y>w2+R#1plUxt)xyFFa`&G7qF4;vZ&)|4{Xy4hE<`gsBI)Q;`ilte6>?1VL$tNq|`pGPVd)4{|SP!3w(h ztWfoAXzD@k1}$JlSI+@e&k0ozYP%rvIi%cXV2DTC9|^7*QN^J3Ave?M*M1ITPp8;}>&xq=$aLZsQC@(8q36I8Ar_5ziUSo;g0rB;|*4ZzODDg`dzLG4HZ zsJq=z%H6QkqTP`BeaNlq$*Y1Nj}akpkrR{18xCjMeW*tMI`dM)09=BMS8+s4a&rj=?Kc zK;>F!JmioH2M2~YXn26?IR*yE<;I|L6Vw*qVDK-`ODzJ|IiRo+U;sBG@<5X&pms1w zowy+AUQX9C(AAe9K1iJbgMUtnXHj7e!>5m+ei$nQ1Cs<&I9V{nBis&g4}uRZV?n2D zfWqUm9VCB%8d0G91d2vtU{9dsK>w#9w!Hl!N`Hua)1K~vaU_f-Z9(+X=R*)18AI;O$@YP4pjbEu!8#V zkp7#jAOizP98_K*mj{Z_{HFws8<6{9ZU(VcpyHtZ6P7r`+z=0rdJJK3Iv0b+r5ZS_ zJyH`>Qj0+G1WFH}e5no=hh$6%251_9gg-nzfYKu96cbR`AFyL!z~L^;0Qa*2)XyOQ!`QHL6SOQ9)^`TADM9WwMsl|R17SNr zZUyb%0J*hK6Lc>Tc>Vy^_JueJx!$(j##(;8}rfWrNa%l;uJ_5-xG9VO# z_)I8jkuKh3_yjhKnZYGLuOzfMH6$am7}^g6>0?3BhkUIj#0{(ndr%}ndf9O51>4U6 zQo{}!V*z;y$xc*%IVBdSLhM5I14tZf4&(w+s6SBM3sQsPEU;fu-G#0OY$n)k*l!qz zgcp`8u)$_4q4*hW7Q}tQsm0*t#b=0qW%TeylUG482iXrWg%EQH+<6LilNwI5!0v+? z2v&=6>nGH`ENHiZBD)AwuYlrG0YweeSicI;9ciFrf|)?|synD&MQmM!RI6~lg9FGc zP#ys7a0KN6wonEJF$PBPQXP;ODBpqF7243U2~_`sX6U`3Ws^6&3}O=SL1KgSg4zb4 z`WV(ffR$(dP<62W5y(uq`QYM%i6Ibbeh^eGs2mT5vSIo_%g zwK(cL>^u3uwFy=!c)bzJGDtZxO92de}7laV17 zsxA(yPKkk0h@F9fAySZmAqEt8f{=a-%nndkBJ{H}BtZ2iLiOWlGho!?II4HBKlz~b zLo&EL_hA5qA*hZ_0rSBQXJ}xE#~M%&bFoT6&1Mq=ozVhHYZoIR?Msk9L1_gP$MH~q zxM3ep#JWob9BtTSp!IAf)J$}Lf$RYJD;w2c*i3?W3!4nMEyN}U+Cu~K)3iti20QF- z2d&J7Y|n!%!v;GWO%NPLpm4~8yBRizhe#_0P&qqjJb~s$7#Msqi%TGNb|JX#3(qgg zPA!5BT7voqptL8!5Rh1un44OXS_F0{s2^2?F`FnO0 zBrZXAL*f$BrV)gd8{lNa$WR7NujNobfcy&UAA-^umi8&Aa|u247U^sjaOh!`0=o@l zZWYuHM1DbpVGUFc)&~QXaSRNE`=qttwvS6{PHIW2b7D?TQetv8s0@XLuK)v74m#)y z@)M|SREHGC5|F+s$$kQbH|Ww3P*50si$~pTQA&AYQL1x(251Fb z39>#G1|+jX^YV*QQj0)+dQhFk%HW$D8XWG7te%a*Hy3)7Jy;mrG=bKG3=RK5hL!jx z78HQYaAIH=-*#wtg3=i*Z1u3m2mA&_aHPO^(6XruYR)ofUIrao3G17H(iAA! za4-aCRzc?#KzuF+-;^B4)B|`f0(4KK0PNCZ=y(dq{Spk2Pz$asE=kP|OGHkm3Jk#| ziA5!0$ny*u3{I7x$S%z*0rv+$e%Aqu`KP57r9gVG!*{ChwS0q1E31_K7rbsCUz z0+!}LX%)0T0~E%)Z6Rd?$Zw#s0aky5+z1MDaQK4FVq%y84d02-aKRC#-q2$bz(ES- zz|;CJ5XY|E1ut2rW)6ax6%ORbJ5k9>^>P2G8Q+(#*Vc=pEmnGzrQlAUO^O zs6OyeSp_(~g8HVQI&K-*TyP>|AhvJ192!o|xrn|gNQ{BOu^2j_m0wy6uTP6%ZaE8{ zXK~EQ$%l-DfphO?NZ*u+fq`u$xPC^78Juyo3hIWYTn6wMFP8KM-L?kZYXgoc6d`y# zt$~I$EdQ+)WMBZLJw&`PF|32e%X+9_1tBqRa28C#)dT!N;-jo`H6l3JFT zoElh~TAB(O<^boxO%S=F%(B!XSTX~pznOxdIi8S=qSV9`SULdB%WE(=mR4luWF{6> zLbEJnz8BPHGXS^QAclj?0G-|Ez~Ee3RFs-m5?qp)ob3ZmL6CMGDC`^<0uqz6Qz28w z(0s8?5VW7kzbG?3GcPg6Ei)(8KPf9U8J_+@<@I*3yCLa6fXK0#9niG5Di>#41AMRy zIAB362L}dNn-rv%fx*8lwJ0aC5?Uwi0=vPnAQ{RBr3cWscWyxrXoE+dcWNaAZ2V@o zAOk}LraQ5gXM3RTT#?JbaElQ#h6J{X0o;-R#~Y~M#Dr9jg6bU(P(A9Hl2Vjf49~lu zFcv_X*9VoA5)6*T#resZi6yBiu<{uce+mqc_y)DSA+ZRFTTppuz~Gr5T#{H)S`3Lh z(0V)vh9J<`T5(B!k#BxVD!7~njafS~1f=GrWagy@rIwTyLE2fM^Z?T11gfW#vmvzr zG`>ON&aiX>Pa+VzLFTzIID=+Na$xBYB<2bg15XVgnd8RbSdi?RSC(0np9dangUW&Q zxHBNiFi3L)Vh5-^_W+l*p83T|5dSR#ZS@C>LB{<-?gy1!5ol>(gCJ;69mIXG;vJ+G zlokrW`k~nb>JCucRxpGlX67(_1l6~q3=B;BAdw4B%oiBIM>d0#AgsOxwLL(GIfL3B z61kAJ2PkiW+8#K{Gf)A8e$pAlOn=ZRRgm*Nogqhx!OM+9&~l>+T5cQ$yDK;~xwI&= z1itJ85@w)u#lhfT0GhukhNgc|niOCF;3MCeiw@R|tF9M2K3-QXZ$P{7PLp(wQtv>k91nr}Sw85qK_w_WibDFO~4d@7)A z+~d%2Dx)ZzP{*Kgh0h7_oEU1I45}MIVRVv=FggVdqo{lah9K-=gy&p8a0ua+hlbA? zI)=|#JmGVWjPN-R4WI0MP+JmG_JYzn`uaYQ7zYEWgomVKP#Z}At#1K}Cs14MB9c2K zh)m0upzbKAqC2jT;f||NcQocRFtBk#<`NjedE6zlC^fkxzo^nPFD<_)7d#OP8)pZV z0dA!^Ik?p@gUxWtFUi2Ih6SP~u{bjs!wy!kTyRNZUP@w73bHh0T$>Fn?+M*kh$+tw zmUm4=mI3wWIl$tOA_`rO6D$W>6NfAVv5yNZ7nBNGx`iwYGLsuD=aZS2jVuGv#{-rF znOTf12_CQD1LQwe}WErTNgkf^f)*iAFPfd7OV!+_VvV) z#^u2BATuECO=KfLZj}ei`{tLWI_H#vJL5<>73vNJu$sWq{1TL`0QQF>SS~2FAhD=8 zH6TAT55*&p@Kge;@k=c!&o9dMFG$7a4`r|#c$*+3F&){Z5OY+(YC?(peqz{&d4o-Nc6o(dP=B1_g49CU?H^Nhf1JyYCs@{S^0Wh3 zE%tiQwF1)Sa0IKtsDE86pmPCExa4t!r88JPbQB-iho3)vbYox_b%u`FUk8oZg9l+S zkC%lE+hdo6t^Wd@P7CVSc}X(B*Uy34mgwzG(0&C-+XNJ|kUlC%uK?JcNDg$)Ni2r; z(Lv@w>O0T8l++6Nx|Ul=?LcDtR=1(;!0vp|nnFVDVnk`^mIl z-P7_xYp8JB4GIrP7-5D7s4WiK!}Wj+`yWE>pP$dbunF4d1BESm9O1JcG$sHV*Mh_s zq)ta3&yZk%<}1%M*NV*I5?G%aG;Sfu;FwYd8UgXo%YltOf$W!HfY$4f(G>8w5NO;% z0y<~sk(if~lL`rY(Ef_YNPZ_a-k(7Iz5?8*#vS$`dpSV;c+jjZbgTp9Mggc8q=JQ{ zTaY-Y&ksqJpTK>7(468kGTiqZ>b^bspmiSD-3N+$(7gCdB=cE_?1#OAntwc>f#DJ( za{tGz7*f(Ar8Q_-!vxNgZpA){NvS9m0JL6%^nKilLF4GixLEzK z$E_INnnE@JYCap(e$aSsQ9gSrOPBkbaR{aWJ?aiS81JIgtL5TQR7S=A2)E(%A%s7o?Bm zR_vQvl9-ZMl89~!NDZWqpo>jF z<+iC5{xS)qj)TDsxpN08p+7^?J*Z52kCZNnEfYUL)8$11Wg;>5e%Y+^U$S1Wh1Ce5MXdChNf9(*myFiT#*2edmAHZgp_HZ zGUF?f+lejHzCqpoA|EoA3L3isjitiI`hS4U#O8M5#(RE(^+U!ki5>6x1$EOWs)i@1 zUy@f+l%GR%c>Y0hJF(&U7wUHY0`$B98#_kM`jGK5P<(SB?U@CY(V)EWAIW}V^8$kq zWX-Kq0b*VgWIh7}Zu>#$iUTh1l3JWxlvz-c4_@OAa|;t>(i$9*#JYtU>K5e!oO4W| zJ5j&`sbK+5@UeGRA;_K`&>SFaUK6$_jt%UNu!1D$I6J!#Xbm%@hJcjOko*7&KMt^3 zu#<_N7v_YzS+9Trz7LNSJGsfQlLu<2IXKR+?okPL4)%-(T}R;>90Ivh5;UtE8jmRs z9e3t~h9PWSJU`f7!9}2O1H~z*4FEo12@*UE#O}2egu2zC0Oy!FxRDP!&>i!_PHsF*3M< zrhzl_^AHjswM+~F`Q@oa2tjB&h?xP@7cWc9LCApH9V`qXiACwDC6F8hlZ4p8$`G8H zm!6Y~Vms74HinR*#Ju8y{Gt+=Ch+_gXbl&reGOWlEDgG@0=irQ^<-;EV*;BLtS<;U z6dTm0Sd$0Z3j}G)g2WiW^&cdUgVL}Z8DT6B4dZy+0{Z~361ZRVpng$<`b8h?UQf`-WPWK;aw=%0KxR=YXi6SjQh~}NP+B$s zt0T={hERW17l7t@A^8MU<}omYXJjU41Q#SGr^5QypfrJeHU%hsfz%2xAl3lF#3az# zBcSrq7|DIamX{___ca$F@-e6%4>}JZIU5nDW=Li;64@U$hnn42z`(E$zV_9rv=}@U z0V&ZuT_9x{Bd81oi-X4EK&x9lT|naskTMgd2Q*fbSdy8PlM0dr$uYzAdFBWJ=m5-pS%0cBLJ5paCB*wttnF206pnWP(y0SqETVm@WTWHu$1Gh;aeSHQ7 zh(AM8D@tIkM9`KkkUtrb}|4N%;$qRR#37nitX78ih)Z+-ssF$^g!x*^rs zxNgz|r%c!};5Zb)(kbX-K2SP6oCjLt2q~XH;m5$>nFksz0p%r7e7S<_R_NRfv^@vX z%YjtigVqmtk`aGi(D++kz`*bf9$(;g5@f+`XkIa-eoO_g?*oMyBcvS#kq2$J07Vuw zE}(5Jh+J?^YHC4dUb-QqoMA@R2a_{`$gyCPGls~qBFn+zAG%kM4OuQYqqHO?zZ|r; z9^_7TWI5=d4k%3Rkk-=sfZ`PM-a1eZBHSb%Qvw!uzR+-6rNqDhtCvAy3{X2u5=+2! z3#|U~M~WL_%b5VE9UBWk=>u!u2YSH<>@HGpMT{y2Zl5s;1VQUvm|KIv?t#QJXmK9s zgaMdaL%?#R)wQ8ex9-H<_rVNI_$?-2cjK0Ka9}Wkr%g!Gg18(U$|z+BvN&?N8Uc!D zXvjcrn}`f>g~l?vFf5KEp?-R-gt5;VNejr3ka#2ka9ige+`V8IIVOV&eZTxXqyq=;eT+l#M1_ns@KraCS7m~;#h`KBm8s^)T z7#Lvd=0NocZ2do|r2slq3REtJgVQN`dVr~bj30sG5LQlt^hAUE1E5)T$U0PzeG&|? z00Y;O;CTj6A0QrVJ|rIy+onr^y8loCXk8fAJd1IMGdT65i$e2l5;Wh!&TdKuy9v5J zH8mwDwHVxN2KO&P{sYN#z}BxK$%A{OIiQuii26PSY!<|S#MbwzQ2*Tk_Z1*@7HE$q z185&kS!POVktevG0J#OyrUrGZz_l58-U$?!0?>2qKx6QrGzL>E0Tl;{fyyFKyE+}o zjl{-52Gotu!DSJ|jUcx$FgO;amx8($hVXtM2VBeuE+zmMGlq*vz{O0!eMFGkvdC~- zHq>pO3P5)fK->mekIKN{T$Bo}GeF@1T7L->1FcX3g$YO;wC)fl4qIIWlLM^OW*U+tBoBe+HKF>zttyZ^ zo`A<+gHubuA`o?;IX0*|SJ?h4(7YIEe6_?i5$p!gd<0YtWLgY576qCo0IP$Fg6sf| zzcYa6s33V9l(UQSbHL_+#=#-|B$z0~4WKb*Si2WKstvURH2w><8#dqzHVZTs3$`0B z3NZ^b-pRn=n_rq&0(BKc95f~g-ZPn*Rtc2=hc{^akAWdLxi}Lte+e27gW3mPI0Xx9 z&^Q*@K8Pq-FKFBasut2%MvNSR3f4ve*#RnJq2ge@pfZU8 zv|peII#dU>4^$2?FogShLiwP)$H3rUl95^j_A_YDg&G3`Tdojj4-3jlad4%MA_84I zo(Ijp&iSA|JLDW5&^Y^SLCD#Rpgl#9Vu6{VKnOB#R0u7@&q2pLAZ>i##H{=xx6(Xt z%K+>TkT@fQZ)P4AaVDg_86b7c;B%2cxdD~RMB4-{4)w}H-A1nud8%>jVK zL2C>k>#(4r(6mw{1Ugd@)Ypfs6-3{w-~hH4R0Dtd2-q52T&nHd_O>Kmcz zL1&d=aia_5&U%!6Y{)|3_9V!y%}{f2?A?T42nzNujOXA0KEuBisuvVzSloc+YFDr+ znBoo&46v~~&|Vh+IN7Cjks2nq~?JSm4TEsAagvRa^My-)PB(ZEFVxgoSY4A+JVdk#b*EmcsC)q zj05SNfjHv`sTzWm`Q1Vc3=5!ULv%sx1m)8c3@-3JbRcs$7(v~RvQ)@!G)QoR>;$=8 zfDu-i!$#vEbG9IP&|X~$Mo5@~t23zkLGft-(pQpS1oi-uxDjJ;L1Iy=AuN7+LFFXW z3`l$;LJ4FC$PEsRpiUO#Tt86WmtH{Sba7oF)5Wol5mu3?_euJI5da9ReH zk)Ye?;)kw+$Ir(h){J%Gwp&^ooW)S{x)6j*HpNfRJ{ zg3lBN%YoW~ka`JZ7f4P6x@R2G>PP4^K$C;r2?Ek*0dga#+rsb(y!Vcqfq`i{QoK1Z z#Di)RSkV*U3~d{L?qLPRku7-NKja(`P`dyW7iD1mj104&aWNYf=Fqd)L3IeoZV(2k z2Zbx>Je|2v_4A4=!c|K9>hHKd>AerjX18ItMe%)h{HTM1MHpJOdi&cTF*FAIZDYFR3z-vm;_%HUs+3|csaRKBq>gd`ScL-HIb9>IIo%JYjr z?Rt=ZK=amXv4%I?!9J&0ljwy0zMm}_05jMAi zu){bxKPLqoR&3BZ9xjI#UZC^_3a`CL;e~W%Hh2UPR(m4E5#xxUo3=sW|#@dzcM+Sb-+0i`J> z0g(BidIEN4+aV!P*dfm0Iti_dPC?xcssmtaB4OC z)epPh0Hz0I7O4IM<#kXU2&&H*7+4uDK=oaO>I;IVb4CX5)YJk<>kF2yLGy))kP}E? zr$K<{2S9U#sNx{KL8 z!On65g(c{W2ar7=4AKt^PY?~dZSW3M?_H=~P&~ro6xOE&nFG@gaxWwC{G^*)5^ z#c3}aXiNnX|DbpU+4~r(_X$)l$Xt;7Kr4q}Y3mtO4&){n8^>CjU}wjW5Z9o1cgGM9 z*C6nLXOJJ> zLiK~f800TVJaI6*gPQRkY6f!ng6xE;huF!?@DZy16I4C6@CDfiKBt`x621_-*ciS* z^?rrw)ni~3;$mQ6Amm=;c!rq8#qb?!)(@yzp!fj!7gRpL!VY9E$PXa#U(m7wqMwD~ zH&p*0sD4lz0!MiXEpy{R>**m8h*WxkMWJQpKd4!-aUqcX|55B^0$(l#ax0@SWSuOI z@eYs;@C&_BEk+TBryFLddFb&0YJY&@0~C)e!l?1VDhw%C*`Run-3;Taqdq8ZEUXU4}e8mmb%LCPmo=!pPKzcwJR+h*>&nJY$7Y73$)C_*8 z8OZ4rqz_~U$WDlQW(Gm1dLb<8L3snF9^_t7KSl(qUKFYxbQUwH9m2rilA8z}ZbZzD zy5uH0Cgm5EAl4i(fz-Jc73CK}<{g^V(fdLf3pbP7LTth(R zH>i;n8VpKZ;U-w6VCA=jFl3FmehZ@f2BkBYpFr}UaDe1j76vJ(zoeo5GGbs9;)doq zP`&_#11ybz@+>GkKzRlfrZU2iu||-2kZ|Q@kcFBj2Q?3rmO<)4`Ob=gQHU36Hq1RB zJK*LsFfbsOLoo9dP|_tYgCf)pC8!-v42(kjB$x~G6SDh3e1sqP8C0O=t3u63PRk(o zg4Dy@3OYX(pnL>!KM3myL(Z86iJ|5RP6mCb`36w)k@Ez|AE<6;W-x-PH-@T5c00&kklP{g z%*0>{Rci)U%K=?-&d30(3oVf3K>CsENh_$F8Vh7>666;Kq;sB5gWHM$r6r)Ol#*Bg zI`0o*tA*MQKB!at} z(7xn7@ED|9PHAxlQ~|_v*f`^TA<(&rAoHQpX!;+4#?=@=^1g`$h~^o1oam_#1A_zT zY)9~9c3LWIoZ&fmeAzt}?AM&kbjX2Dkg=W@ptT3!IZ<#qQwloh1JqUog~bOU&{b_8W^B{g~R}8hz>k9$1cpk&;gZ$1rb;h z>JBbp28Ia?o_U!inTeo{_b$1KFlDg8GjKTb3NtW(#%RIk_@Sf&*9utJfi8bt0AFW- z8keBG)*!bE3o|gR0L>SrWu})FrJ^c=juD9oGcas`p3#M-0PGfdVFrdB$Z_sk0rso1 zFayH@kY6!^3E@UHVFrd1kTAuj3T(cnFayH{1}y0nYLAXE1H%n)dW5IIO=05(kwXFmYI) z1tbnCFJR)x{Si<(0TYMyO+e~FJpH`E4Tn(hMRQ1k@U~$9v@8ah3uD91I1K`acR(WOXhT?>g2X_3 z+R{p#Gct2h!0`zZ6JQ9+OwWJ{e*W|k|O59t4STFa#8(mVwT`NK6N{AwlAx_62CaQ+i%v zNoi3kcwYl3ETb^Pl47@l#!{l8VKjvY5=J0*fx;*W`#dBL|GWBy`nm==!pGkUDg(ze zDBZ@6ScCk^0Gf}42!YF0 zkeCEoT!Gps3JgxApmRK7d-_4)18TP?g3X1baSccs$Lbn#!Uq&TNznM2#e?&nFYIB2 zFLa>kGzA*=p!M#c@BsM}bVo4kj!Y1rg&{a2GYxURGzUWnXgC%;%?Q)O!w`^JmXA;) zz~GWumRX!%>_hqPxvW{H62)j(kl+W7-5^FiVgp!+vma|=o;Az=(_bAjY!AbLu3 zK_iFxko7MhdqM3=1qQ@&Fwh(kXiY~NG4VklY(U|j4h{FkJUI8c`hfW!lK77BtFE`3E~O}8(fz%i-N)&6ej}UduEvgVCI0zdo1R72M2ii z#rya>dqZwffS8Cb3UyNn)J>pshe7=lkUdNcpgY8vML}gEh;IPp!`xB9!0?d?y2hap z9FBe^A(=_wdZ`G^56MglNK7$+w%I`X1Q<}~!;6JM{f6MwoHR(=2c$-UAt1R3Hr;0c z5ib=6tx*8Yx;qvXC02s%0I4+qoq?JX4>kalET(p77L-5_yM>qm@`nfL z3|jDNK9Dp*+>-&ckUFs>IRhaH3KNi9y&(G*K^g)Qp?g8fg&7zE7y=UWGLwT#@{2%~ zAlMzCaBX1lPJwz1e25sV4N?K_D|mqRyh5+Ig3NV;&Y7(Q$2p`dW?+m5rFdwX3vdns zr(rg+DrmkwBnhhTAamUyKY{wVAR5$Ht%3G&YoTcpbbl|F^zG>%4_yM~9OUX4g4R;N zB@0dO^-!~Mtch}U4nP_hhVh_!8=-n}j4y{o_{GC7-ay`1jzt1q4>v>2#8Hm8dig_3 z1P}}Aj#j9iI_O+4WStQrJvD*a^9-&PB}IvlMZ)l7ULk1)6wd|=3(RQ%$M@9xDIp5UW{Gv+mye1Q}c!0B~YX$h=Mz9<+ zvYelo-Aitmtx(=~l3LY{+u%sd=eInaLnCLHk}{^QV2n z3=GJg4MA*sK?(wpC}Qrk9~x)+PLMNOK<)tTnFWVMaB5jlYI1&AY7waY0(J*HEP_+Z z+!9L?L2C~{df;IZoLc6bUj#Y^7U?b(X!r%EmVw47pa;W(^@8T&Ky5X#*h-jSH~3khFo21BEeYKP#wx56WB9 z(ZU#7;(}LDx%mhAI);FXUesKMsRohXW2=;13+`#|bF7y^nx3x5+!5}}$PZUo8sAmpGLL1#^} ziV83=FwH`$y8}>4erU`Qs82z4_H1Z8);odDNy55^4XN%3a&`6(f_C6Agu(SGXnbNW zI4&6(aI^t2G{z(DE)7M_>JZzYvJMUmX$-`<4|JOWcqR~ii6f@X!LH6|D#2}DX3+)E zxgrk+hL1+jw%UAfc!P$cAm@g}G^Z0r{l7YyLC5>lpu`ob(=K4jk}h|dP* zL-uSc3V_c(ODst=VF2~TK<&vbNZ}#C5Dz-N2;yH5%fSJ3m$w)wSEg9S6crol6_h6B zWG3sS6{W`DT??FEnwgT4nx+S?w?O%Gt1tt@Het~E0Z5pvgZc%wu5KQ5J|2`lK>g&M z(6HErrVe$_6C=YOsJgvSb)Y#NEd6QFIHqq^%JP9#S%8& zh+(vN4@W;2AMncC(0EL7Xy5V#)I8W+KFIEq(D;L`LpTMEm(x(Su=DspV{wo@s*s&5 zpt1wxUI7OGoD}Go7Ra5TI^ir*I7%>JaStRgvAPqK=FUOq=du_ zAZnQyZb8ktjZG~BWE~Yu?Omwadr-BYF={Mv3rc&z&W=9d*(NL*08YAL3ZZ}K~xU6IreFSYkFfcK|@1n<*=RoBhEYE>QN|ELO9)sH#pncw; zyVyXtR(|>j3KP)$))S<3)W8IpvLrQ3KklR6d4peSDhlUsI{6tXs z0J_f%NT*B; z@1W`FJyb1d4K@9Xap>f;KVpFkD?ryWLtkHVl59CGg6C#ZR#{gI%)8zY0S zX9%R40r%CIzFEo(ytz za}9F!bB67w1C^p7@#v!9xMUJw6oIT6C8ezJF;Z zbRLRN1k{pr%`~w9-I2#8%FMvP#xDX|5sTXo1oBKu4y5G)UiTm%!oVOX!oZNl0GdmJ zpYxUznwOcJSPU7vVPtU0@h#0Mfr!A)?{Ud-D#}kx0jmO?-^~tk8~E;KVG#xf7oT`X z7ndN{;9#UojwT2j#}a|M!GQsE1`)QtZf2fYd}2yU5h$=jVH|Kcg7#C1i6F`+aV&8M znu7$zC8#U_rFjrv3ECc%1cx^w{H4JBaL{NO`2Jnc-fn3T(7CdN_ja41lvT)W>tfJd ze<|RWUv6ezd1hWrW}X?yLwXqukiB&>A`A?&BA|1&KxIB8-+{y!7)lvH^FE;ZMjq@o zP+kPN2Nn#NVFD_56rkowLdzXc(Z#|5%HK=^O3*L@l{=fE>&-#zt#CG^Z6zTBatnt5 zs67V?VKos@yNgLc9Z5eZ>>=eAlK?0zVQf%a2*k!-?-b`JXM?;SpP6R{c0aNJG+vnm zbfETt{Ex`H5dSkU1Uvf&xW+@PEf@!^7qmAH)D8v3Hv>a4D4^03b2H)hMS#SaAmX4c zz2NpgC|$5X#6X2sW?ou8SRCX(4v09&!C*0vS_z0)adLh^YJ4VS+)YmeG(QZs4&3%7(?UJ1RBnuGyw81DBeJ9Gq^Y-I4&S{1(SdUT%1V<v)x83jP$0#joRRRe3I zfYgC7sEqblk!rb`}0_k#2r&|GhyfEu_B2FXF|@g1DV5tB<^37o|uS`Qvxg5!9G zWWGQENgURH)I&Oh&p`y1Vtri0TzxBifx%CNfkB!9wEiAa zri02J28QDJa;P6be2|;VjUa9W^^*fgbR#It1EF@wFo4cvgV+VKpMfDbzBDgB36y?8 zWgAW)Q@FkQm6^(maNb zp!GwbIxGyuZ<%@ExCiBiP$(PRk7N@Ihnfegzd-4N6`Y=#1R|m70#x^d+zu0uMu>yU zJ8x)t2TB*9`YRS%-o!!G8DSk)M=F=W?n2^&(Tw2(VZZsND*xU*fA$i}FF^@T{Vsw400+b^^%t z2NrjN(nJb0A6A0P1SW9af|S)v0w6meY(}tuVC8lO)Ni2j9~6F2HQ?~fgoY=mo&$wv zHZ(kQpn70sJxCu2BbW7gP__9`wIK6Ben&PR)cyeJ0hMJS^NXN*ilKTyYezt3Gy{WQ zPGSl2W_L)Nlo2Y9+D-+jbmKU6_bxo$*4yD$&hI0waFnFs?zxd;Qp5^x>PBmfF`PRJ#6rG1ck5Dn@{)Ih_u7OEZ;4~lHCJ|U$1g|!nK;A$8JKPYOG7YyT~K}9 zP<_bh4Wu9B9+=u*sMwNWAr3?K|r3kee@h6zx$6QOEh(vqcyfm_TBni=Y@jeFWJHs$1q@EkiKv1*N~a(DLIoxJ-wf1D7bm zzyOLDkevvBGBeDF`f~x)t*|fzg$+U-Bf}!7y2WVfK;|N=TMAXT453Z{6b`U*Y6X%w z$SpAORS0o#nPmx0dyu$hWLN_=cP&&M$WE9XtUOx}m4oFau=&tA9)x;khK*3OHbK?H z(j!bgLM;=+7O2{-Xlg<317T#f+o5WAps59wzaWgPb{ACbZm3#Nod`;Yu<+Om7iSVk zgR-&r$>Kc&!c3r(&fxTbEC5Z5i~_f{25{2vVM~3W3;+tO#*NHY7GXg3ZD4>Ek`=;-K zG^q*K2W~@y{KUi%l3$XT19cQ+9up+a!r+;bnpXn4j|1Mf0OeVb92?{;Ge^*c&}qe~ zC7|{gNbWdz%*Q1^uOzfM720+@0T%PkFG_VQN=yfx`C1IN`y^N#q!uO)X%C+Qi^CQx zL&Q#l#XxF9i&K%>(Hsn*GuA@#eKO0yYr8;h0EH1J=nP!&ZLSdgAUAU{K*AV&S!;1= zF3io4`aKxDG{rF`1$4PH*nJ>z&|1#olFU4C0Kg=nW39pr3`}RhaRljah%g{0MeJ#l zz?fHNfeEC$1S;3giZC#o69L`N1?np?g2y)?X^~0b0z6GK3V{3u6Tbu%$FZiB%{C;q`Y($YCb40f$Ze~w{@X;g9DKVm^cw^R_;$9VRvwX z;)Vfy#vUXtU~vEvXGEKyzYeY&pm7dOOE*n$}?T8)$7c^7;i3AJkTS0j*nJLe<0SH;{QCj9d@BhN^u7Rf}WZ z-p|D|I3B*&1Co_d#lU%kN#GsS9N0WFWDYU7ATtjjg~^S{E}3e1n>Wy&sEY7Szvhv!P-91FGK%bzTF_I;18+2$GrLEeB9J2M1hh-q6i* z_V)u_?t< z;+G1&brV(&nt?YQfJY3$YJWlXLY09w#6t^CNIm@rJm!zsHvr1ZAp0ah=MSgmAuIst zgtj3-Zd73KOUWz_$j{G#-Z%^`|3G_;48U@*vJ_H(ZW08|Pr+_TN0kHVNdWEJ$pnoT zpvr;lDqsjsE&^?#L9)Ms0aD*WZ3p`m6mAU+en~ly5*aK8nvZK?0PoEWN=<`|Sc3cr zQriJ(gMjO5P+zwPv`44}vR)sirU%6@ko8G_ML>J+;Xw}y8PKwK22ffTVqjqU2M%*c zzI0$jPfJ+S1UM~#>g@l}e02o87l%mzbdCk6zXsh#iG9k9zu}yB>Axub*oOZY5wpf$Zdj zx(!wigVGnsU7&IeK7iU`YdRD1d2n@S?1X0U_oYq&&p2CgSR1hMM3jM z(1U0|HwWgImSpBZ?uY<|n*;+w4wmvkVE`I?;uD3$8;De30Qnxb2jMY^TM0M}^iak{ zFxE)rfmTZ;m8PYoBF*vhgZv;0Iu`*FzaW2t;tCX=u<{UgzL>Bm0|N+y!V`u;;R*>i zRt6DhxQar<6;{8&^nlbt;(&=k9I93Vs@4i;nTcrpp%j-8VX(iE%QMhEML(SB3|1Ee zdpHKUy2Sgs`ufB6G9#6&D6-J9T?XpTebBNJR5n7|hmdjybhZlzZ116ON)D`?1f@R# zBys3cQE-_7l9K?hKZJH^pk*7VZkAvuE&;6+hsuD}gX~aX@J-2a&PdG6gV+l)Lj!CE z)MTg`=;gB%IK9Ek5|pwT)Xp?ufb}+?Ox4LHhV&>3(GzytYG5_a`FUlj;3K|3^`<&l zEGQLp^fTx@FOZl9SPW!-eo=C&Uw(;eGQ7Oj1k3rQ1QccFgExIZ-LC}}_be#RE68-q zFDg$gO7YBt-UbWH$J%(*fbNcmsROk!Ky#O{b_6JW@G>wk=^&*yY~?+%=>t@E>q5(H z(7C~|F;h^v4XTeo`4dz&gUVWv7^s)14=rmAzgsk1bRWs7`{p4P8IT&-PIL5dW|+I6(C~LiNMyBaoXw_JQ073NO&et}|4v3tTM+ zc>W#ac9?(N;Bt^Lb(q_c&GCSm;|W#kguN~b2=Iyb@%Q(34EA(!1-I5AB?G27v`p}Z zng=?^6qL@jpzZJC5=dFCEeJYy$|*59J2emazGhHek^#E65qeHDD4YtA&T|5t)eLeY zs7>OFltvpE;xXNV$Bkt6_wrIpVhRd!5{q;6G8jN<+fS5%!C#btK@~i%07<8yI0A*S z57>Q-41v%v4uXaWEX{$!0HhA29u#jOP<5ejbxZ=FaD${%CV_CMI4oU&^n>(*%>Y*o zObn4wGosMcg4Ds%5X46?9LNtK z7s1v9XF}yb;k**sZ-%8akXn!)P+kJ1vmB^-xllbg<^#e50^)=HoxMTp_#in6Sp?|} z6Oerj48i%y*`W3gB8-vuI)dx~jm;Dwg{1&PJhF*6>|jOOuY$dgkdm5Inhwp6g`x}$ zMWT>1>fNAcC^ImG`UMBLI(xc#y1K-JPRw)+3IPw)BJT2KWN>kHa}4zf!6I+QfLOy^ zBFeykW&-%YWK=N+2T=L}#doPF9|xQa;Rto=Xan1I0%NlkZL~nl#v>0kzZ+^ks2sp77vcIt9Npc)=?Xlwg=RRK zB)I}tUM0A|sCQPA2W1_lQvhL4~-vO#q* zDBUnHq~*ZQZt4*Q?IX*CH6fi#Dj?@G^?}-L3?+%_>8UBu@c?kS2r>gypGYud78Iu@ z!_|Yt6d3Z$^D^_&{gNPeF@WsS0G-R^mRMX8f@&1VoC%_!vocZa0B;2Wr`l*!phxg z(Dq#y*!_$Q)1moc23#GJ04VH1`3LLviPVdt~Ey2Lw0#)rEF zfWif&juB0rvyZSck8fu^(}dRgIO!SHh>*x+Iz&M>{~a4~165U6<^a4}c7 z9h`76Pq-KlTr40IW}YBiEYt-iCI%Ptgo{bT#e(2sns71DBqGEg+HkQT|IiRmKX<4b zb>QN#SxAU_Be=M0FwA~qxR|2{EInDl#X#X5W(E_thKu|8`$5mfuz`!Y1cxBSnJ--2 z&jqI64=(2E?Bf>Ux^)*AlG2mpfFdLc#sCj-X%;q&wyZ8XP94@amf3-x%v1zx`5B4V8K)q z?iU7$3sy`yki$NzF|dQqEd%eJm?z2r^9iU#3pas!0kn<`)Sj3x3R&m75xh4HaTk39 z18C0+f)CpJ?S!>nbo6nJ2YU-#*}6uAfOBvtrZBj!0*&2c)=%+%pzffvBYdqJ$gQCm zqR@JD3ADV!VV0|(OMt(pAE@O8u0bJYp^HMzS_U->Pn{1v1j5q~RPFl*K^hidL%~%h zR%x(bLG|(qsQK9IWk|S%c?N}qI{L(Wy2Xct`uVv++Aao=aKx_!Y>yE196C^W$iR@7 zlmqUXK>9tPv1bkj&^2s%C9u^Seo4>~ROt8*C=CcOWEMbYfx&&4g`%K-PG&)w8F>B+ zq!ne%6to{>1_Ks(@VFJE%?@g}Ex@J*d`uU_eT!iBm|(XDR9~!MC@x7%&W1J_5N9!i z`tG1QAEagtLrQ9DfpZRM5jse0u_$Oa!GRId=E*NYjKhN3$R3Q4c1?aB z=r9y;cwKrgG6i|8t z^*2E72DRDOL)$1Dp!oncZnX|Hmm&aK+s(iLia(GZkQiv(YZFw@W~d&}{03}YG-$6C zNG)WHi;)3l{x-N;NPh-omN0A%5A1y=h8<9Icf!>&i^9wmVqo|v#=r>f8-nKU0!oTP z@*!9F!Noyyf1y74dFdhfpbOhRN$K5>p(L3rjPLQY}E`JGz`-zFTTuGOApL z0Q9Empwyhy#Nt#7hEH%a;c{?|2)TSz`wY#H^ugqy+EC<5(CjlbV}RQSmqTcT`@0g= zJ_cAg!Nj3j7+`*`L$e1tJm7LLO`j3|YDTrk%mm3_Fgd6;6uAyG`^-!b{({RPG{XG_ zi?^V}a&Vl%`~?qtu*4_0dRW*7C6cxvwd(ipuMn=y#ECx@9O9hALQ!p84S8A z$*Md|4ma~Jes$nxp1Uf8CKw(ZmJ;dpsLF?%u z=?@g{1oVKt0J8%W?nI~uryW>&1fBQbo$8)i;#^t;Iw}}`Oef@kad?=Q3of_lp3H!}}MMc;+#{!lPY~fx$P|H?aV;tS>bMq^mf% zAT>ENtrC3dalBsyL<3S90L^*%=7R1tsVpu@%>@lQrxq8x>&3jgZ559;%~MP1A}KiLf*5eAQ;qm1vNH7M`D4}KP(>LYC%iRFcc!f3v|AW zcWO{#W^t-#QDIIxaMkcK8+0xWrnwAodC*xjK_xk8W`XvjLBj66 zFarZZKj;W)&~d3SJ5k*Si*KkNsF~<`P~8b@pMdrUd-|Dy4-|-Z4GeYk0iDGFaRX>C zI!Mkl7$S`{($4@(zvyaw{QU!*9G$&Eaf?fhZ>Ud*r?X=)XbcFJme9>{4fO=)Q&@R} zE*~7~1X`s78mMs%ig)yjgqlZ4J#1hCrURE7eLVd@XC*oMAmvpIH+Y7)`uIEJRTF07 z>lhH=3Ldk;WmlMqv%hbEBT7AqZdaHI_+B|5#}J5FuzUmBUk-|+VAl}LNcxP(HyG;R z5rt@Tg7yu0`k8^|q~e2JLmd4g5$P384z3%PjzD{UV0t}+L0S>*8&o;CR(N|Gv=;}V z7m^5JVTGy}IRzrz4Vr5U_J>TS#Rq#vxgxcdL3<)S{Y)TX12Os|EbKsg(m-;devUq# z?w}!Fu-74~kirhMrxm0QTRwoLH_*N{s2VimP~8mk7rL47P{CubQ;@%-3pAbMG6y+t z;ZlPwZKJy<7%6ST@+i8RAU9`2OG66=Sa_n#`#OVfzky_t&!F?+A>|4db&f8+o_-L8 zc-0}Ch19+V?ThpDGXY0luxkh`DZu++pnYyg@}R^CFNe|O;L!j}*P#7sFumyM8dVOi z6>c_Y?=DO)ur)oko(2()+Cv!KibdY%llt_Gjs0FM)x z8u*S}6jg{k3R8z7jnp3n?STc^1(gR6+`!@;v=0=N_Cx)g9sT_MJe?hVJfmFW;a-NR zLyvc}5PuU_A5V8rCm&Z(eE~~np#8I;GA$s;)y*>kS}P&NH+tFV8SEJ17=S3N(B(n) zAe)aaAL1J1>f(>kk6PxyOK^Bw5VQ{$5E0klshIJMBdBo%ZWF2o$Dm=8z{7T%yW zYkr`G&_R%8gYXrx;61$%eV}z-U^Sp-Y<^xzW_oFUX)$PBB;=ko@bE2CnGIU&1yhft z3e<9jrytOopn!s$f}qrrqRiB?RA|=&)B}g~I*`l*t!u)e7TyK}tI5M^9{5~TQRvxb z@8D}TJiT2(lM^l;@$NzXp#kxT`6osObUDcV?MxWrko()2F~kkQ{aVmGDyE!~0qCqP zkQ@t=KG3xqMy6)qIUZItabpV;us9o%IK<6HaC_J>>@sP<3khmdqP7O2%8|>-~Rtq}|A2bIG7XyVJR6nw~p$TLT3^X?jQ;Qa+a5sR& zk-`)%?&}LN12jhqGs6gKE@+MxCI$*wD+YE^(D}fivFZR&xWY|=#0)fC(L^EPO4NA` z;3)!F$U@HG2^3>s2ohspSi``;@Cy;Ppc9P1ciH6UB!ZUlhUR7G<(KC{{KCipKH&%? z@0eVYS(fUNnGQM=43z$mf#jIb_4(w3&vQYOb4$$0foTNKaWbRp zbILD)*@smwq$o2zJ+%mAJjiSoZ2F;Uz)t`C=_BZF3(&ebP}qlvF)+k?dxB084GIki zi4XAiaYVY?0*eeJ4nS!&R19)Y@dY2y+9@Uh*nPpEHKic8fLA5NJG#Y#3TbHi1h0#L ziJ3vd7`zSwB<2dbL>(dqUh@DF0~afhvpqm-NKkiR0u7#O0&7#PAC7#NPh(}`PnfM{mj1{DK0&Gpk^YkU4O0co5R(;u#FH4rCWNys+s3Wwy_t z`76YFkr+t$VN)FfTGIl_dpP_HRsjiHH{t*=Bv0@AiabgS% zn;94wq?ll9Pu#)-e4&%!-ma0Je(tb2ad3GK4quqOr?+c-pl>|5ha2D@1P)X1Rz{>S zMOPaNo*ag*Izvi#Fm;ZhAs(Iq*o}pjp)8=aIat)A8Vzv+E3#UUdwqRT{KJMU549Uf z3AlVAl4*=a05R76D2Skm#tDkF-qYqpPte+Di2dOwby?xPyb!ekLH=Q$F0Mf^lOW5O zpy?R2?uidtA16T4v2Q$f9q?p~O95!j22piMT6sY(EVX`y)Fp{x3=BzPkn_N=!S8kf zr&myG6;d{U^9rxC(xY(K_xk$4V{TasgT`fpl|`LGr(NW1Iez=o&g@N zL69O2bT>}CrwhuW7Oe8%bvcXz8DgN-1D`(bg4SoC^?RW97)%eS+;?#e2B!^J8xmR0 z7$gZT7hvs1WO+x|;CMqL3$T7z8xlj_64KrWt@T5<8>AoBeh01lLzf4|h#dpFDC~T% zEO?s{*%nA_poSL6XNb7ShPDCA7#J9gp!*y^Vhjw)nFSfCMc_dR=z0(Z@R=A8ap(NJ zw9Iq{@H!CCI{94i$_DU42nJZ&7UmLA;YLdQfYL}F)Lq>S3=H3(aRhGV_(Izm@G=fk zo`BK{C=WsFKuEa&SL5dC1Da}e^>g?1gOoSWG6YQ>B%~nu9i{%mst%ObVfI4H4>Wa- z0RhgSaw^WtT6ulq4km9!hmfx_chD0;Cu*D_~D%UA% zo4}ic;I>Jj7z0C*7z4w61_p*S)VP5*!94x_pwZ;$0$FDWjTa1g7grzG5a>EhXq;fE z0R;xAo&%lh32N__z`_DUB{=MmLIb-3P?&w}0j=v|U;vL=fY)7t_)KVbX@S<7bD-Tse5b$=5AL|QIXXkH(13Hn>-a!^u7UPZF6A*W z)FIc?@xG2B&K}T#K}g*Njx(sZJNO#VAaHpGjwh(Nk85x+$i1Mv2d-;&ftsCJbbptcgKyk8`e zJh;9@kq338zzPs`Bvc+esuu6;80;GF=@;zk7wj4083s+G;QA4&&d)yt>N$wp!EHaN z9AumoQig!rd{A+43I!!-@Yzx9qM*I2pfp_vNz=%x;OQ7y5SDi9p?$KQ44`wNAmeJF zJ4C!wp;MKfdEj|r@GU1Puybfo=PO}rU2X_7FnFi=%wf#!d~=^b=W3J((_m<`&a z24cg`Aa4ezInbmsWX)rX7-&BRXpWcRBWTSms6J=~tAW%90u1r!HzR}m7K$MX-UGrW z)&@3W~_c@_z2SX33^ueDtLJXsW;-Gl@zEt z2cT-ccjth@1hx;}55Bhn>#hh_&|rwG3#cCR^oQkjaM=(H z5`*sJhwQLGZ0i6YDFR9V;PL{e+AvQ?&_x&%r1bfy*g;_Q3U_S_sz10V*GHxX;fKRKCTd+6FDJ z!Tn?W`cQ3y>I0XPIP`@DhkJtR8c#oW@P!MYnR;;0K=p#lQ385h(X@i{F1Vb<)Q6NN zT|8m?b-;aVOtnF-j={mMzD_=_F7V^=z;zxU_V9zNk3>Z9$0!DNQ9)=wX(FUt$FvF3 zPy=OmNS_5fT!&v7C{L5Q4?HC$J0`8Xpct_)OpJkHvKRvc7dHb#9=uEhHzD0TU46j2 zOyWVejzaSeIKTVGL*zUIz;pkgsvi{Y;QS4f16R(FJOs|iFmaGi<3SZ4WDWr~b~zOi zJ}9ang&LAuz_+XpIjjEZ}85vKe4`h#?>~@G>7+4LlP-$`kn946+(f z@O_5dQ3Tp&2x>RXK-3G!Dj`9L#i^h)1ZoG)gw_l8%nS@|@OB_nLqL!#^o$;F*GP!J z5%r>LP>81+xEzMn1@Lh5b`5fJ4f2QOF?gK_n!%3r^$!h(m<11`;9wt^8SpUi3-R#< zT`&$U3*g}Z+ENzp?CuDSPx$i5_ z7FQ@~0j?g@N(cz@40eqV4)G6ywcFuo1KDh_k)WMy{{A6Q)gX7k(+jd%cuzlAo{sl%jC6(couK6?R(+7+iFi=A!qYE4$Tcw36LgAJfIp}M;_nBphoEIG zs(x2L(EWNY@oxU0-D9Am13>8utR7khqpElD492Pf9=^E!26bbQtACJ-YY-$qgWFZU z@u+ryqT(|oE?{F+3t?qFs!DLoLE-|7ydXX}B$lLx6eZ>rXM&c-`lKe7W#**^8z9m#PPML}Nl=JlNO{bJ+g#8U-rzPC z9yRbe)F7mN%1c3WjUmnfo&oUz{^71c&{_*TW#b8sLGV!x@%WU0%5wte%9elvqyT!} z#4<4khUH=m3>irMM#6n4)U~moeff~E2FDl5AeS>@v>H740BXiM`*?zCS#TIZ(?5}V z;=x;9gP`RoH0=}A8xZ6f2Cn{HLqG#>44`rqHg>cMmIiT|0#0v8sS&R_M7mrJO_wpu zpgUwB{c+Ga65gqSrKv@gkhyaBLU`~tJMfxy*jh)>*%Y9YID=D5AWOdelRzhALB_*N za#Qn4AWMo)!TV|<$pxN}Z6?K~x$tE+kOePk`LHw&&JX@+X*v0cDWF@!ioy9IEw!j9 zH3g;yH1=JbnhaGHW{7DRBoCmeGs2|~oDX~wi_%krQ}a?VRe{nDSWQrBa%yH-s$YIU zX>kUmEMaDF&PgmThMzSKITsYW87vH*si~-S*=GZ=*D2| zYI#xJ}&Tw_DfTcMB(D|;gBk|xv zoStcr#afW`238Z4>R4Km5uR26I>#EeB^Dwt2r84IX$V)^7Gm)9g`bEBb)PU)Us-T! zx^sSFPHJ&-Dzf`U7=ntELy`+X`%#KZ5_1b&QgccYA!$Mcq!*N|p}D0vxU`@kCl!=I z6LTi%ckn#v}GBh@ML^-rU zi~)R}bD<;y1NONySl11ac}G&cj8n9#F#48UTO(Amw?B@L32h-(DU}eBjiYPNz4qOWrwN7#o)+;j3t89vml)d4?QUn zZWb$pM}C1%W^QH)R0hdBHt1QxP*b4_Ap4v_=CU)mq@thU4^;#lbOUf_J zOYtlS0G;<%;*(gJS_HlG9i#@FH~mXXuquMO2c(V%WEM;vxZDMuiwrXj;x3RnKHTa+ zdk?|o2`DZ>bFW)a$5lbAKtXp_Lf8F}8kcNhTcPa%W9a!_n$Y$X>}*WPSuv11*%*=U zTczSTnQ*(HcLjj<^)qrIoxRD8#O6U_^CGeNkl6f4Yyl*;AQD>$i7kv^^N4`fGcb$p z6oRC283u-rr=aH_fZ~eKJkJg>&<=B#RM3SSF3`IQb|Q;G?;h9%76Xl$g9?y*_?er# z!Q!ro}H z`@v$tnK`L>C7yZ3C5btZGmj2{#e)*dAx8LnL(k_v2o?`6Eh;F=EKY^ko8#{dw)YTN zE<7rbuv)?pEOr_! z2J;`dfɣk0TP%fZw`!WNWfIbh`(H2gqfJPe_pexHmrdIRtDaRShaH%Awjc*wv5D9u2^6q`E8Ogl^|NFBI86&#P#y!ZhB zV9>fjUtdr77%6x>0YeYi>7alCuUUYN?OuWOwXmxOB`@fhH<|;$hJnI?*tKZIXlv1~ ziZL);6JuaF&cMI`I(r`ESMb`Ac+Y_NFxQ}9(DH;Z$QpQXe-uR=vSuC}Hpt>gW69t! zK$Zjf96Fy1^ZN~m-;q_peT*y!@+T<1Z$jsD{h;;mEa;r46?BaOX#D^K1LXXd%=|n^ zw+LExfaEw3a8)+!=^(2#G83oEV623|UVFp6def%^-0Mp2La~C(JVcG7voolTht#-(C1T{?mn*IxgM~w;7J;=JOk)F zpZGB7Mo(YIU~fqHGeX3n8=Mj1Oki>FstvG7u=0o*EDoAX0tqYxVd1H&XS$ejwHbAv$bH_%!J z5Js%=VPkj#ng?TG5_k$-;{%d|oG*lsdk&Sm2hES5{saRkNE-)q zK9mDPVnHVCV6M-gdW{vl59K9Nnc)FSCy+x=v7g-uiY`dO0Xq8$yBcuckxlFswCrGK z0gaPE?t`2lz`(%30J`fY5xidn6qb;%K%6ZQ#=t5HT37N0$z2i*@j)Rz@h*{mj=rAG z@g9!B9`PZdf$ex#zYy5H6Zlj>-Sk$Bfgx0wfuWd(0lePj6ub|_Bmg@P8n(am7-+3b zYDj8v32aRb!^cJNIY_tg0QfMtpDTFu5t8IX{k;AB!~LN72Na&z)j@|YA?hGyCTy@A z#XQK^s-q9Me1eptSk<{kgt!KQCMQ8_31M~9Cun}dssj|4kgSJQ8dhI@hUP&LMg|77 z@!;Ud;1E~ec<^%epaAE1*8pF{92vM?@Qp`S1KlbL8Pfs#8CBjhz#}9iAUNLB4_c;y z{fk|Ve<*aG7F>^@ssWXX;IhY!0Wm-H6%rO$RKf!SiyWdX`UV~MJtnq0R`!&#c(h zV7Q45t2$#8v)Hk#K`{%I26&+L&ky+68zj!+!(9Wwb1|XdPEfcBWZ(@$5|kH6xopVIUE}@-ZH+tVq)yN}aw#miwAo+#v8)QA0+!h;-HCjX!``V<{fMnY#|&}4z}JMA!iA1-@(?p!{w07 zgspQ2%R$@JpnZ|BwGRJ4{Vec~46q7teum^yBzJ;E5&82!bRBsxXzmtTcZ0+j7!pfM zGEm1US-@h@mF=HDeFUAO4XSe(#X0B!uq=`;_wv% z$SR>x0a>JoECI?Vpgs<(IAkxcH!}mnF*ewqwxHB>zY>?!oYaz3@6<|IngpGAnC@2+ zP?U<00+l(SyFt_aN`g~Mz*8w89pEwsDjrajiYx`IQ;_U{YeSKP+XI(|re$UZu-@R* z63`3*bb1J6E2=!iUNj{j_p(6r2c_mE<|6wKDjrajijV@SXN9PD%`44KElPw036gj~ zQ7VcQ*zas;deHp)Il2||yWd0H)47Q5{NiEzEXjnkyV0z%v zAoDnp^nuUKD9A~LD}d^Us)6apPzExG3t~<{QL1xMDpL4xL&fupOAr!Jb9tb0MXCM; zsd*r;K;oVkDxP0l0+Rsykq;v7omvU$W;^HP7pFq=2vjbh2o#yf(onnjA$kMyi!sx* z074Eqk%H|MM94uBJUnn9ZWThv<4lXf2sMaA1$CDQLJlPXfx=W2iyYi~sD3eo8kBS* zjwX(-PXbLIBT}K}OCr=^4Rq}-E%%E9B_wF2B`mW7HV z;vO+KDF>A+N_ERAEzSTX7;qfPL&fupOW+b9`xT(#MX5gdi76oEkT_F>isu)Xz$C!t zC_%-GQbY4#5+HMwq2l?)B?t*<_^3eT5cx4UHMtbDJs;vvRj7P^aS1Gb;0i!yt3l<# z<)e3MC0r6}zB*JszZg`uA}fISMFS%5oS2i7l$e|i>25+tnw)b|6Z1+7z~QP1Q3o#9 z!1soMf&*%Y7E~_3xFiU2ItWM-V!k$1t|&D)u?&>Ap!rP)Dh_fNR014^x=?XY`B{*Y zm<-kewMP#s2et<;39&~XDu)P1zr@^BNEjMG<&eS`Tusab!{Yy}v7<3;W zZgp|hjVaR`vS z42nGDuo#ejP+JMqKHx!WD?#pIgY6H1t|%q)PDoIDfma+dm#qiA6YwFlUk*C28RQla z=3rp>_z5}(4ZD-ExCFGy0Wub{1U$A7oSB!NlL}fJ1D1jM2Q)4Ny4Ss+Bm+D~0^$pS z;yE+7G#7H+5_n!1WRD0#NPbCT4(tF*_`M<^ISB@suy1B@aVicukIWM2y^kP0G7$4X zhg71dS6~1MVVVOGN0{Lu$iSe&fM~yh%+z224H`klmq2_Sq&;aqf}k-Wm^&e59VpIY zP{bi&7Ay!FD+0L#p)MXS22leVvvFVmg(&zCTyXe->I_6h2dk_LeTuzY{S4X z4?d2Av@S5ev?w{%5j@8TDhC)r>px)Y3&CBb?cMY+)Oj2T0}Z(;=~ zz2TIHEggic`v&DP(7JCCP+5brFwj3V2(s-j+yr&SAXoxc-iV4r*8fE?Fff4brv&+l zq2WJxf)lg}5tO1r^HNgNGV@Yl>zEiIXQ<>Q=0M6xMh4H~M5ue27+f=pp=)E98GJL7 zi}IZ_5rv-Z z;qsvY(6L8&KM_@bkejoG5z_fckWL(`8fVz}8@!*0D(@c(O%w37{Alu^dIA*w@HPFY z@-EI${U~eu-U1^Xu%7^<30VH{6qa*;ynYP z6K`SgbGX3crNNK|?4)S;UT9#4g-_YV!hbTA|z zfamJ)se>B~Q4gNW!=oN__W;OW?4U7oeCp851X$%P1DeQm4|4Q{%wEFdRuZ2YxN(qtA%#aREKa5I zsX;SO23akXK90aiWG^GQGf40VSg0d?r+8sS$Dce618 zb?D}rpsRQD@ehx84F=7xdj@;Bf~!)fn@x#Oi*CLdVLfoSn-ifH-FypVJ+Si5*U=fY ztJ~K#9=25;+|IW|Rtqm{uqcN5*9uuZrrD6~^w74fHL_YPWGCqbAo7Z+7ng_j~54YwTL_LeEfq$ zgTT&(hM6N_wQzHt(AC1SNsz0HXOJuSbZA&!cP6YBZmtWuS|?9G&_z55Lm^@7NLE9XN20X+pcRXrf=787Nz}iHxLlI!BFW@N^VxA|mdC)@;FqA^W+zVMPy17VA zDOj7>n@IIAcl#i#M{^5`@lf~p5~m&>Uw+8yVfhSUup8*M3s8CQkE{-!$Iui)-4KAR z7G@?Qt3$G5JlJS(o(x1*4>udT29R5Vkkvz`rM-RQU0i)bBS4uKY-TV%HPH4_2&Ni% zJ2DiD94t=4P~;%p_%P_1!{ONEp!P)|%Yjzyg!+QZ#z=H=$Z8(2KcX<@K%0la`l8Y0 z0)qS_B0-zQA^VtPu*-Y8LCeipWO;92@XB%jAkQf9N=c}iIEWgjP*0x_Pd{iM89HAL zI@32EI_@Gb4qp8m9FL+h7;#E2hKvLFylT)Gw1PO~oD5y)x?C&h-F~38hGx*Qde}Ki zwV<_OY4Ce=z-!5vp=vOgzw z!1BPl+U4S(4gk|`ull;*7!m)JhZy< z^!J0D9|;~iftv-bAp%2PLqXReL(3)bxCvZMNQ7T}xMPU3hl{^^e2Ay7tA8kHBVfEQ z=yqRl-UE-Dz|})ey@id7f!1ok*31|}(muLMP_%NzM!?_p!I36^_rHTabxh_(10L+ z&{A+vf8Ev3#XkrVNRZ`e=yHfM%t{=x&P+m#fuRdN#{nLH1hodi15ls?b3%jT{R3Pf z>#y%MFk}oCPC5}crPoG zJVG}_o)e@Ww5=M4e(*k5BzbiG+#vnV`FVM%$tB=jfSJX~5FTWX1ib&%1up2AR+3ue zk_y^2n+%@A1C>*-HJJ9|3=H9J0pJ7WAtf`otbinNEE2GCz(E{x7U@Z7{k#=g|A6MB zvDCN0uFl}zl)n?`vh8^AJ>ITC;ANhnpj{i-B*AqdsBUu>hnxZGh4r5Dcu#-W8DOCO zMbJ~_KpqIiE(JH&6>9D>=sr_H@KQt2OdMpc6~t#kn#*Mu0-d)A*%Js^hyhW@CImW9 zG^`*Ax)uO5-!H-7Rt#OH0iL4;i76n&!0R$W^T00RpuGgasmY+_$PhyVK$lR%_AP?+ z888GCWtJtDq=Iic^i3>)+5_4vVZq>*nU|OY+R|8B3>9}0XJBw(2m+lUkecF_nUe}J z7wituUI`Bd(EeBd0?M4-_LE?T;ajnZ_ate@rApHdl;fa|gsYS5x0*RF{ zIF%MxLhJyAc?EdB928CvF>yf#h6ZrBA^0;GAgv;hxo+a1d&xn^hU9>5;mJded(fVW z9SojD1)ynru#u3k0?p+gfQdu>4YK7e)osYRB{N0S4su>>DHk`h{! zo|;zzx>E?IkBtFjFX%e@+|;}h@ZlHW{tP=<+`qKMKh3`=CAA20G5}>W4*)~7($!_;zI*`{K2;hI|lpvfr3BW1Vb29W_po-M+Io< zdU8f)ZeD7oUIr+gNa24K^Rz?nc-RIur=h z@_?S92U|mF@r-{sTjdL#x=SvHc^BZ1lk zp!G<>NM&LImi0*S0sj6zp!|ttQ4&}Vx=$bkT24;4VF34wRiSAMbXEqaPJ*4w0cJzb z3#i>PQsVR_sm>@9*a2*1u$P6Z!Z0=6#(EC#Ls!F3wQ zO&~L&{xSl$W})VR#G!sOf>;D;hs1*245~|uj6Cz8rbG3_A<2Pl0W}Pva`8xVkORH~ zpe;v;xd}+}pxecvl3;fyBFP1n=H-Em1-U&5NgTer4r*UAk{s+55M+OV{Ko_dOCy*( z=sr4-xga@cIK$;Y>#ksO3=H5C+rhyF6JvykVWfi;usa-+67y2>L96vZ>QljDP!}UQ zyI{Yjf#tyF!<>a-CdhqE5c|N#HG#|oi7`XOVEVx603^=906DG>>|kj4fW#T0;&2T} za!gP;6w9IV>Ea9wObpJI$vLS3Mfqu&pxfYJc_{-TmtP7xoDm@l_FE=c&b=tVv>-S+ zBQ>QItPv9bSztNGw6x5;%#zCB)DmbLHybP-l9-+jISUWu*Br2zYhG$mdL_aNh&j1n zIf#E@{=()5kpGz(TvC%t)4{D;(B2V{*?HhR0ugcvG6#oYK3EKN8c$IvsKuEI-P>IN z7Wd7}%gjy8fx5R4EC#dL1gyUZEEbwu4D~fke=$rvpeQppu?W1c3giZm+ZY&pOG^^- zAg6Re!yP2f2o(oMJd!vQgG)g&#MxjwL28+yYGJN{#Sy5iWPz50kY+C=>_B}C4sd@5 z)cF9f!u|*vqqYQ%(IeHF5)7c3+yKznr)yBWhpQv#lu_`pWGF4Yj0Nq~=Uo(lS7Sxjb zn8m;@3LD2PN31~vt)4(S=@(Ta(#QtXk%X1Q+ME^8b&1Ig3=HQ`<^n+d&Xj=60>}}C zptuIL!9e@W5>tHhQ=n%NfW$!ekmMFX`iEc{Xk3Hj!2J!-dSpn+<0@{MMa3oX)B0d;hV3oL%VzlK#J~oMbGBM>(0B`YvH|(P zK18AgUq1lb{{UJ`15MCSH`PJ+H|&&TV3>qFE(^J@%nfoqT0F{lDzwi8n!td`hX?tC zF9P%pa106otuq3-8I;DMeJ5nKpoHcb0PSN#`%cL6&W@qMuCRFoOTzrr4)v2exE~EYYY^Hm0hLL(&K;Cx{`Aog+SlF)8YBhRFW~kKWK#;X zTm#iT3=A&0iJ;*&hzz*R05V&E0dhKqdUStIohn;f;8lz-jD9bD=DNW4rOoJS43q5-iB*(!}Qk0mM zmYE!!nv9{v>EU0*V_32BbIvAMXrFFCaM*8WU&?64WLD3w`>igw*Dl1)7`m^>+bZI2LXKDt=sH`Fb|gzRfla z46yTazKB3hKygnkft@-8zMlzv-xLEQ>RlwDA!W$DeWAYbZlOLt-~}Whj-Gz5pgB^A zTR~^;K+eC5cl8VPjrR|84f1ge2mlQOLdH zJgD3OrBMrp;F83m63=`{aRjb2K;kwqaZvJvngep9156xZGgv)n-qC{rb>1<6!6mgI zH7^BpI4QDQKyHkH?7st@rwXg$z~+GD5yh$C2KdZU zeFWwAKH%*mB=w+v2vnQ}ramCZ-`x{(2PP|A%+cA~(cKlS9JDC`1H%?^28L^5**fF?B|_1tzaA3Xj7ZpZ8Z^L_G@6LT1pp#7zt;4z7K z7oT|lP*0E_LZEDD9PJWkU=S2xVDM#NU~q%Z4e~R@I|lihnZ!Fe1_gP7?#O_gFUf}? z4msPA7hT*3687Ba;-0}CptcaG4&lNg7Ysc|j1!BT5A=>Wc62#Egqdtu85s77gZ8X5FwBDYb)kI=(4JU#@OhcO zE~b!v3B2EekPG&3Gz8DZ!uu>Ja`B*(q`-L?e%2AHJm~5suspnX5%Kmocw!HNNL|Liev zJ_n7XfYy)1dqXQ$(CS8TlQ0xj2wZQ1+9$`M<*}PDq`uw&oi~R0eKWG3f-8%`-f}GV zD*-i7N{hjBV$Yy@K=p70w7z$PrY+EUP{pM=C4Q;ti6xn3;PpnJybd~73M3BdsloC; z6GKocNGu>9bWspQEof~LtX+5(ly5+>90cn4fbOkw4G#4Qfg}RR-fa{KP(A_q@tip1 zT*-@45I@4s5Cyq+0kq$92wKj8S18AWPYeMa>I_@Z8R`SNEi4#xOBUk%Yw#ElhFTwg zf6(1qkWFX4&;~F#y+hi+=w^e?jCBOx?B(VPT4D;xci=H046}WmK`NcVq>m@Edhi@O zhI;V%x32Nf(Nr)Gbbme4-GJcrt_1W!#wp@`L1#&V&k+aRMhCAiLG6BYKY?w6+Y8kn zh)q8`Xgx57{XYKAjz01Jem;@$un>gW2i{MNp&rzQfV5>fp>5eq&^`pZ%fJN;B*kEJ zI9M8%ZZ1Rn68}K;AT%F?@*V?&Z)RS8QBZ1GCU_+ds0{}aXJqhA%t8|fwL2LY9E(GP zJ^X`0K=(yM#w@Rb=P=^KJzO2*gIvQrVeQ=zR3Ugiy#`Ig3f2q^u)B&XMB#ln$Ycm) zzyY-AD6t59R}tjC7}y=XiGmCat`&&V&MzP_Jv9Zj%md|#AJF`K37&@`9dz(c4mbZG z-*`uOoy`R8-y`H)g9E_31YqeHT`x%9*)zbyH3*jPS#X*W?+Ci#6`~l@hlHJ5h-qKE zTR61M2RpwIp#~hSphN=hXTt75yA7&Wz~>mEsf45tbccftfu)T*(DMU5z++`h0+XTT z9_UOQQ2QCwev@Ee_-F;~kATt#mU-%e#G+JC;|+dq14tcmy#V4fGX%rbf%g=E(i_Np z7Kpe{eqK6U|2=Wg*f}IQfWjA~7F4$gFgO+@gDMuJaku;83=E(%vmkTekh%rrb_)i- z{G!~%99YXAWClpw0orGEEJ_E@k-_FtL2@2waz!NgIt3H{QW>PchLF=+RlT?gK`A)ynL7+o`LcNWV;ef6~x(ST4DL%Ikat+ z$jkt43y4DV0jM0Afy9o3vmxWk97yBJEF6&aE8sMZbgv8x@|`gv2sMnN2sW44r;o6+ zz~6w=32b~9vZmuLSS$o|2^zHd22P0JzR^3doNHPdXtixwDx`G>kp}mJ--G3$W46e$ z(017eu)Jq_UVc%kM`luLQ66~BA!wC5*!+)R`GDfo(v*DgwL{?R4s&s41hwfv`4m*1z{aT%MG9no8RQ26hT#0763~DJ zL=2R#MUe6}Y%KLBl7A!^P#dVoM~9;{W+4*rdhr+34{^};>s)Ai4&(=8BsOf#coeiA z2bEb244@UK!JydB&x6#R;CKMZ!Om`jFR_NkIY>@`!811zbg3TFB5hEa0b1)0%18fE z{YCa#cTn4vK>~6v-IN>#hB|0{3>v#EPb~rs4hIya7K1iof%7*bWZViQ?w1cbvK1@^ zsW+Jra-MmKpf$d!;65BPLL7Dg7T7E#ap>Y%hL6a7GA0QIhWOB6*PwVu=Mc{@P^%Jj zTd}Jj{Ol|2lCW}v8S1Y~N{}%RP`UwO9tMVwb~xAdgZ5#Aj@N=*g9~1c;OQTaA_`91 z%%W@(p#4aoz7WGlP(K%xZb9aQ&bKcv0T1be^El{iCl<&!82qp(m|6}{9}6-q1x^y_l>p5@!}2mDe}mM@FgSv47hxlCMFe2Y9?0?kng8w4fQ~U>qLDPy){%oX~Ji)r916UIECQ4`R*|yn`^LC^IoV z)hQ=GIomS@w8aUOoc}F+MSPwH6IZ%}Y8taGcsp64f zVDNJd@$`=m3G#GwcZE!9#e2Gd%CK+~tWuyfM9KPT(1QH<60ncq<08Bg3=Dh{p!pF7 z2GIHk%&}_lJ}q$jARaVW3A%ebJ|r~2$2Ax_i-k`CI6iQsYw&I=SJxoOEhEr9Fld5c z{h%^UPy!NvpfVKGjgWm}AhSTTYtZ{lKp`25RR(-MIg@}e)J)J=0;ZXuZW8$367ZcX zV8c*_z;2rbZRdi@M+Sye$S#GXoK$FS2F^dAaSRTI%!1<7Wat7G$hDQ8(6v?|c>#u; z#NraiP?jvz*`U=#fNlt985)RF=30Rqh>gU0Q}kjj_} z22cuvBxmRrDeyx3P)uQP{DSHtaR~;7$)XGlNlXk3pn4QkKETehhun|@nt+V=b@YVo zU4)pABnO@(aB+o{5AePt_y!)R-UtSiJ*kosSZn|#!f+D|!$IW&$emIWkh9$dnLzm& zGKMD#8OQQV$^nJ3b54F`h0u3|#lIi77zK{MpTr zGQSjQulylsyAFF92ikfExiBd()X@i2sr$RZ_Ju&K1dr^1Brp|#{Rt|gRG{UF8TNV{ zbWTukF!*8z=+Gpx2((O6gPM^BZLg_AH@uycm~x;8en@swJ>PD4>a!!_c1h^K*GV( z9}!ki39$b`=}!|H{z2Ic3`OuZ8zi~H7K?$eF@uh2!R~#4$@xOpLBa9|Ogz99F=hh0 z_W>^F@97r;?UN$cuiEhZgQ^nb3s@FHl|l4Db)fl33EH<~h4v3XV;qIx{obIpD-0h` zLE{KCrj0zt0pcT%Wq`)QSdjMWf%t3;Vfi_wxv4&hNvS!|V~jy%+gd?TykhRH1c`&r zZ%@pD$bs4^AoZYlm0$=?Ey_&Hf#qG8IOy#0wA7;1yyR5K>?*X~rVnn1A=%IH2|VTi z8bdTdN(TuH@nHc@pb!fMG2roR2#x3LY{+_7n0=r%D499MIr$}sb(kRcvB1}Fq!t&0 zIuMyv;PG&fKF~T%(7FAIDWFOZv`7`;NmIpY34NIHg;>G1Wr@!%0#Xqyn0p3&7Hr(amwMppxB zAAZh{i3S`#Rn_}qst-Eumv;?bAszER_JYcko*lH<6R@1T?4=yj)Pp? zJ%dAnz-ODp2e~@?2Z5WRq4<@6(*vm7vx1gcAa)_N@3{?{H>|<&aRml9&Oa`@`eCx zZJcjP4s?4ixPJzclK}VAp@jo9?}FN35)8%QJ)=+=uzHXk3Jks}IpD=~5PLypXn@Ut znhZ4qc`dOO0~^S{Y!2WsKwe9XV;M0-7##PYGT%`Gaz?rY^o;cN(0bMj8WtcoFfasz zcAMrUr@Ekz_wj<-=b(Jyf)pn_4A50G!LEU!u-WT%mcJ zF&~n*IiYDZih&I&UqB`xAg576@&I(TbbJ`-`d25<5O5a-I#GdFor42|5f-ySvs}R; zj=lk)EDSXVF6Q9C5QIe!HhUn`SbFx3P&063b|hbWUdEztRW1vo7o9;kUdBYWUdGUG#5bAwxioqQykUCHwMS&q8C$S_gzX;TgfT{(F8!!YU7L|YpDB=AJkhlW_xSa%E-w87# zfB|y%0`guXP<~8c2ue-PFG_*+=e#69`|cqNlt6mDB^VfT7y?p@ib1P#^O93RO>yX+ z8XpM;h7!>HFL*y51NhD-0R{#pU!=6&zyOIiEb$DAx=@_5(Dd&IEu*@v85r8&?J{_o z4C=IH=9Q+pR-`7Ef{tGRmAjxm4kH7Gn&8yLqGZsT3XnV#Lf#L&mmIDfGRMG-kay0{ z$;nJfO$p5_&&&gz>kg{xK=nANt_uK-sUd13&_)~oU{6rZ1oB?E2~stLBnPSM@T@yR zS`U(1kz7y$AM*$V)r}Gi4C)M^y%+@RM(ougNEF&;4}sQydJI_2f;N*uehGz*RD<&s zsJ;w?>J?*P6k=guU@R0y*UnbTkR< z7&}BdLzRafiw7R31G0(E7O#+3kpVGU)CG=v|obb{}{M3^q>&RRf+|1)Xh#@CSxD z(CZ?g=785eV5kB4_!D^k7M5RHb#&l0hwRxhR)w6K-ZFk(qa&_ z?gp`wpzU8A{bgs!dT7KDvz+T7`k(qY_Gc0a6)&%FZnC z7y-E12p%5?rQ>X*bgaPuvI;(C4BF%bcL0hgv@FblwgsN4LDDL$&yMJ?!ur~ddHH#j zx%tq$7#KnI6!^X)&lJ!xS!tQc;7Ko78fHSs=N6-o5bxq|oXhnpZe-&mBu;lVGrtqf%fX;~=ihnNBK6L?*YkH4Qg z!>5l~3~ZvD3=C{_;CzOqB>|hoLuBxHyzNh1>Y@3s9$Hr%vWCPVC(;-lXe@w-fsp~W zZpRE%E~jJ`JEmlnB5jF8>PUg+!=JOzp^?=k0fYwcc_OE~^ z!_!iWLh~{~d%!_sZ=kiF?cjKV^fg5wduxzKHwlihg6g#nXx^CI44VIgjQySwU|#&3&zVAzL5a5+pn3|lA`&!b84%>@4_Y=2i8t^BB&11=sc$0?aSJ+zHZ76dTE~&*OMfsJUX`y+g#i^ja0w{i0L*p0JZUFVUK>6wg z1H(r(29!R$pR2#0p^*j1L7>ggU=FnYU>2PZZEr9zF?12O}I6&N6Vn7IyUd;tcA zkDH)pM8vZv#Vw5wiPsFhqdwjDnee zfFZ&N*?lJ%B8-sTcYz_o2-$r%7$S_2-S>bY!U)-YFBl?>VD6g-?o&m8>uFF}d|+^c z?_~w?e=ztIA%`skV=#(52V(&Eo;HwM7l6hx7{kD3fzpitvs*zjG~IysBFt{^bhHpO zp26&t4C=>$^e&QMV6b3zDueMs_tI4`hr{I;OE54rFo%QXLH$u}1_q`j;BpI6zf53; zbwNRS1hqd3sz;VW%aI?e=WN!3!z7?6wJbBg6tcP>93Shz;;=FvvX*W=Sj?lcAhoD0vpBy9x$U(9EEk-a zTbcuIdV%6-BUlVJ-V~4q-m6`d4{uj*LXmgLEJ{r-Nlo!jOUnW6!iLl}o55;e?m%8A z=U5yHZM(Ta$8NV^wA}(6oxNQ{a5U7AC81>_o7h%pyjwbf)+KQWK-x}B41v%-J#5SY z6kpe&@eJGlu>qz01|Q1JAOx*fk@snV%4$Xi2DaUxu?+^$-YZv66KGlO;u8S) z04A2C@ZU&VPN1$P#4DEw4Lfep_ba4jS_7-A7 zv_F!w14~m&Qz3OZcsaKLxKGRo-q(XJ2iso-I{OS=&IqiJ8LK{HupA3QE-W!Q31kRZ zoE0JNn+Q4=0W1S)3$Y>O{POca?Vgl?{QMlS3Q${?9U{ZmF2{k83(qftcoZxN zZA)x=<8*)GcRC!<(Ab0T~0q-k@)nzOUlfd^tAm*|d7(nwakh2l~pq<48nw#Q4I`bOD z=VCyeN4*JZ$HCUEgYq!LC-D3YsEoY@j(>PP13H)p`HUu%IRPA!@G|!{bdEJ0I>-7I zp1zp`gpt@Yp=B{_eb+8X{~r|Dp?R60lNf_bia-YpeulKco*?OEL~4&kz}c)qptdb+ z&jOeY-Ln8@L-#3w*o+b&Ga>5PB@t{61thix659ZYZSm>jA!y!v0uHy})a3lUlwxT8 z_Y^GVo0(Tyk_r=h1{U+kFD-(sWqc0i2Nb0yXBNZOLcIWsq2|GtU@@0O&^gbbI`RThXy;vBegh6d!CV}J7dKFZ*y@bXY=)4ZZ zye=f2F)+jjJ3EGe*5<+~t2X+Iq=x12pm;toj9g-&?txO*m2`2t!S1PNy*fkJ5b!}{~nz;_`b)(eAXF%nZiV{nl1W=qUGm|uXD1wr=K zAlan@jceGx-UjG6gL`TT#AwLgBv9)Yy014l8FUa0$Q*vCUqF2tEajj}kY^aE{EG;2 zMLtpoP1L~wymwDV64G|WVHW5zHqe4t(AopgxuBq+4+US*hAav-OAcxl9|NNh69WT7 zix30D8UaYT4#~ev3<}VCToJAo)<$7sfaL>as2mpqqYxw197KL$WKe~gp$1h4l7pEK zGeZL|$1JKT32Fl}Fg##j_!tM>vjAGBif`R2=-eLI*$j}VfTUwky&!-z#{nuAB^X?a zGRsnnVB6co1{oCk#Q`0HFMD0o4OKX%sfr z1`1mb_}vAdMi{6g1#zdmBxwJETVipEXTD2jaY159GWgyAu-ha-dk-LXff`6K^Hd~3 z`wk%DV83|ggWaYs30l(w5f9A+-Jk%mLrao@p#ZY~-K{hayfKaev|bIg??4-z-$CUI z1495~JTy&04%mStA`~HbzSWV0?0xggfz$!Fp!pCK$5+6S%))RD>0B?+-UkMTVo(T! z#|0GFK;=eCBIt}%kXt}=<_1V^0pG11Pk3(&s1IQ%30W`E4_z;?04e`|g62U`euUj2 zQwKj!A|=1X&@jFrqcR?J>Q8)WUUpu7Ie6Y1Qg5NjC+30A2nNY9GN8$&WfX(jeIPj| zbh(sbxEwROTxJm{F@Vme2G?^e=<@k#DY?+K7p&-V8AV`|L3XmC%cVljF$Br6qswKK zfbHTy7ca{IpFa!I!-+1Jk_+DN3X)@PU|?WqK=Z$+M_7C@=$I_Xx+;c-|5y~Hg4b1n z*2aL&PXw)vF_UCqh*hfRV0x!k!pam-9RTXTIUwa14F*`=1#jbl9a#~IAqs9wvxzxE^RFf}|7s!S z89iuThK-$~-x&uw0~1Hv9(l(nVm2NWqu|5%;HzB_a$xr`i@HI}e$YG@=q^1_c!1it z==V2*#6V}!K#%tTmnEQZV?hcxcW~GuE)fIeOIVnBpoST;dqHh^OqYU0!ER&|^Mr<3 z40OMy0kmupg6>s%DZ;>zo0^-OUzW-Mn!DQqF8>%n^Hd*UX|6(ufx$B$bY4+OVsbWk z${u`A6RdsF2HJB88b$-PC~{IuQl0Y)D&eykpveiy;%Qi)!V%gYaZD)#okR^+394nl zbpyB!$|S%J?Tf(dsfFqb#@UX6j46Tg0&MOB#GVXI8&*(18-UCKxfeX7o>-FVn3oa+ z+5`yM(Shc6*9uS_1~P{S+O~tGu^A|N(H(sLJV@O!sJlUI*u9w`b`aDZAT}E`9zg6r zNa7cf*xpF#`vH>ryHGWtyo|ht5fp!p(0w$Zxm6I~0f`SwqmZ_-PkuSH4Is<_s@FjG zBSGrkByf6j0oTvTV0JK=Ed?IS@c^?W!E7f6(A)zX0|Q%%BxuiaJf3-CHnCJ_yZJ5B z9N0zhxLHtYPHJLts%Ks>D20JXs8ir0Xy9{1Q;__>6zYFa*u_D`VQF<9^sY$IEfZjK zKp7v}M}3MkmiZgnMuz1BDFFtC^5o(?*nOqk(6C263l_ES0?EUUIhpC;6-wZ60gYjB zz}BTe*Rg=o52$Pa$qB&r>>$a3_O*e^#sY9yL)tYG3^t{Cd5O8HDY_+z>2}~ejv@lh z--Xcp{ZWH~fu3$HCc~{IP`CcjU|^7gw`V+y3Ip;_|`wtAXlvCWIRQyi`;*ps)w2VMeHN%*lb@`C06l2elSz9}7Yq z`~-W1YDhbQ6$NFK2BgXQ}q2YZ*17%#Js1UYpB{VN3H7yf##RzOX z10e@09-wn7knn}Bb%7k^18$2!!W1eFE?QB0t}EdT~bq!VjFyx4dgt$8Zy#*E!0o{H6Z6QgWLgfJKRss8Hss$ zh;^YLIk>-&4Dq`D#MzP+$cb#8=IkS6x5_|8PQsX#v>QIHto9yi4LAQlGC6rcQZ(1bL+4&q?&OaWDUU_oeI0XhqC7Lxmk zP0zET?)TGVU|@reBZAs?pfxzKbLC6G=K7}Q<|FQX0@X1Lkn@H>=Wc`D1}gKx_hLZX z_n`6>%nvgL%Y(`=_<9(q8c^8-JA(^)8!%WcD8DnHom<d*HR2X_@JuJ{zo#1*LHY z28jD$`45zi;9}4;4vH(77%Uxu{0}x0bm=tcI@-^lK7!7w=Vf4En=1+0dx+Bd1+|Am zP(+~Z;d#(-{Gb8ZlLsmnKyk{z06Ccf=2nmxW?Bdajmdz9G{Gmv=I24uI7lt@%tZJ) zQ&68C^XvieLLB(oQ;=IY7)lvH;|`#<+yZd?LE85UsAn=E#uh+6!#nQ4Cbkgj#}^ui zG8mNK7#Luk3Pe54fi?#RY3m^Bc#zvbW$Nb`Z)UkQkSQG3V z4$#?VSmqbt+f{-?oxnGFqfF@Il67zZhcOoOJi#X#`hYI}3iI@Fb$5*qb_E~s8yb&Q z3OrT}8r#KURzQ#^x)~@!P`!{kaV0oBK_lRqi8-JQm6?+YI^qqqKLL~`SApeGB*5vN ziGhJ_wIlisgX=Rh5w{A93+i1dfK zXCo*z7kVvCD)M0}(D^-38$pBtwth6H(!D4#uLOSL3c_3o2LGbWbkNo0E-1!;{JBCB zbRJr8X;M~datUnP8E7jJXv+cA9?)Eg1JeGn;^d;tf|7jr{3A%-gTb-10$jjB>;;8& z0Fr-^%aR%fM^Ko-BNQ}#2XYH&JhXuUGKvZt3x$bKfQp0mJ;UTcZ6eS<<#pin0VyjM zFvKIDXagxBkVT+n-+E|Ts7YgBfSs)fDyJA2azN+xgD)rn*$on7Vkk<@%`Zs>3qr#L z6rU^%nFRqw`6cgVxu9&Qbw|$qumnAn%rehY>(xpgZV5ZFBVX z*t@`LQP)@R28$u;29SPGIK$`B89-~x*hE2V>-I>3c1}a)(6Q{F$FW2j;$_(R58(Z7 zQ2+0Rjt$mA=hR_ytT^fkXJ61|fgzrbKJoDJdC;ggB#d#%Iyf-E_9cPNX@s_$FwSXY zL2K_E0FTXsT6vj?Ik0VnpkZx>Pak3V;~+TfAo*1VymuCKuMxs==oLKSeY|X9hoEWV zwi*NI?f@YU(3)*=28JJkkU3{ieg(x3h+ZhjzyO=y0r5d2x<{b%J4d1OJ8BG!IL!d% z3v6Z_hnjH$Y6fV`8D>6A?i5rG)Rw?fZ-Q=IiFa}g_H+iHih**9Aa*(Eoc|f9xl#;_ zLab1~gX}&l$-sc=R#t{{P`93k>I0o=gv&j_A&!17pi`Vdr>$W+37a&yeg};?Uxb>E z?ygHX+;ti1t}9S|ATzq4emIgjE+z1E^$uzea=3!R=e;BYgRvxf{$^$P0CnF- zs6Hd?=VZ9TN=OFqt_e67ZtrKPeo(sn0%aqo2T+>)iex{ePG({F2DSe?R1bO@1jQo= z{}RHMU)dRcLiPWG>K9^Q6avK|C_X{wF2Ujh6b7I>*Zx4&|Andt#T7&jVb*`B9J>24 z&0}F;gx=r5Bn4Tg1X^#1C4NCSfd;t-2fMn&yEuk8f@2pFl-OjTWfu$7Og#ohAugnR z2?`Go2BmdaxUfn=%5zlzaxt($-Nz0!3*ldc94CexGXpG~xH04qe&&VBf#MvN?qK0R zN05PmUkW|FF*682-6IIq3sVn@FHpLHxgU}~m>Gnj>P4XHVQUdU>QU7)F^ECcio?}% z2tdq1$Vo!wvY45L5N#9C*~|WEXseOH?YU#%dK)6+oRONG?U@#kUtFA-lmj^z?Id{4 z5+V=Y76ffSo(7LMK*S;2f*|ex3*a^&L>#>P&MC1tGa1wrgp3nhl?0s+jU*pjl9-p0 zSd;=*0x{zzcr6x04R{9!)XqDgwH^!*anL%b(d(F#<5cOLS_yI2Q{?qpsi1`!pw3WHKJ5PS7vMEp&@*z~GILVh@{9aRz~?lj zLQjzbj|IH~ui=8u)#6e27QChl;#QYb(Cu{41tUfYiVZKvM+uvyc=6!vUyW;IIP)8q|NH zQVa|y7+~>(8D0`n3=9{L!qYj~EvK|N101(fQVa|?ko3ajKxFvIkaof!MHe1ys&K@;;)DK`yUgYcoN8Wh~{j zf4CoLiK<^nP$a}zNCNOWPX$_*;4s4*axtz4=;&c^t%)Q6He(lbj23ct0ptKhSl6H! z+BX2jy{Z&wU4(ymUTRSY_{0%tJc8DUN-#Kr56*|Io`R%9P~Th%yap7KcR}@=6nyT+ zC%+uh(*>tHkeoF5ZsgP=*px0T@2E+E$3Q^inJJ*_kyD}jITi_m$|%>04jC-3ne^3^PlK0aW%t+zOJ&Oofc6gT!4R`*iX^=bIt>10?4G?MwTofyY%* z+yRpJfy-le52%g|fcqUX77r4OKpW=-jT=P3&XsdYOwIG)j~sE^Jh0BiSv(k`qI1Y#qvKL*7Ss4oWV zE5Z6SP0;ZT$ha-Itj)~N1MPu>#5+iwgTV)Ub~$LZ16T%{c0h6hU^#GM0hR)#HITRj zc&;`beAGE|{DIE%%t=LEPY>#^fzCyLu`0I4^a!0k!cxv`*p!2l^AXqLx7b|^4F7ZhgZ=Yd+Ku>1#-(_nDTOYu(w zwVJ^7Ehvl(7(iUqJPGP!g64``k;2IWnkR8}AR!?J9!kNb1e%xF#N41^2O1j!?Mnrf z8=x|kfx$T^Gc~USe4_xgJy8JOZ-@IFGmt(3(0F)mVo@bTBe)&`iAyj**U^B7#Ubl5 zL1THKbq5|uep5g?!;I89A5fb1g!(5k4OAwRHf}l(ntnm`0|TVqgY1ui`rjLzA3gJ7 zb*oc;elh46Fi@EJfaSn-C4A{9=u91uoG)0;Ge0mt7+otkeEh)jV7(aS76${knE*~c zptcEUT-hHfyaX8Hk(x7*m`4(T$8!KQTpmP0@;azr4LUgqHZ}qq_W|W+SbrMChV`+K z^Ac!Z4TujZA0XpEAU?!Q#5f78p9(SuHZFxw2iaQ#o0|va2?jj*g#$}|5rDTBd@}R0 zA#D(ln?x8u=l_+Y2BhYtfVSa+;s7Kr$^bb71Ta4hB$J0^&pbj_CKp_H2R5G%W3OY@_rpn8#fPI0m7P^CQ%N`xnfj1<>|^2J;Speo*-Vs&gxl+)M0wluD?(G{AEYknt8`?W-okz8a`~ z25RVQB_T&=!u-d=0A272ZR>%`Zp4~T$oe}_o2d@T4aBZ(tB1P5LJf3h6U5Jubc8x5 z1`=apfG+xll;GfU9Tfh=xDQkZHj?4KCaC+os1!ymWVoRf>V{A?&^cC+Fao)Yfgvan zwx0l`h5@oZ6mobIbZrzUEw+HnX7m|I%ru}ZHeHj?x>-|+|UPgL!lZ21FWwIvX24WzXL5AMs`CG=)C{p5~Q`fpmGGdryjmW z7nFxU;+*h4HDp~TNQ?_E2I*&m#JJ&N#$dmI+9DIk@XJJ~U&__+ubG`phS^h~X18L* z6>7Q2g0>C{6qbm%LX;cR$Z*4Ss2h6K5bLo(=0ny5gPU^j^g-;J*qLOwV;0mMvxv+m zpf!51I${nP_RWRbw}@E#EFj?wDhKA1Vc!C%eanfo545%r=D$T`*tZyJ-x{@nUsJl2 z4EHaCx_=|6tcH$Pg6ehjwV$B67kQm2s2+r_jexHy1(m^|HJjjzhQOzRfTh6c8dP3_ z~ z6i^w8d=3DJ&&U8C3&mJt3Tab726sX30-49cP|5&mJA>K_tC8Yg1bdqk(JltL5`0uV zM!OWD2HbXL6I%myw+u@A6EdF)YSV+HoEbB&NS1_(1)8DQ%m zVCw)tX29mw5$YiG{K$OJS_cFlG4~0ZD^x?-V;z&5nU|R#lLy-18B59rYt$8!q_M#u_)KfBqljWFSPAE>9==z2z=z6AD#S|4A zVmBSCoq#HYH0TV07~kL^XM_;4t26VG;SzdaFC^=w6{W_24`a+r%mF!~JTot*peVB} zz8HERM@mXI>6-FVO9*OWfQ1FRl?a{rNm+W}5Cpjr;uEm5K_L&`;hvwA1(E`*!K)1| z+G4P41RIVPCVr_UAgd6jV^dU?i>d~T!|}O*;o~=G8iHE`ii^yAf~IEXC6nM6ND$&m z2KkBEsP-ZG6mhBm+=a*~2q6t}cX?(W5vr2&i&EiffROrR@F*fk3n7)c`6;PIdAL3pl8aRyUI0Kd zJyDAA1rxe~P_;2>#l#uS@D7?Eax-y9C59yg0vtmxQac+eS7zMjFp;A5FS z{(}1%Vt>4ktD_%y7SGq!(GP5?Kj@G&&}v+#P){Ehu#k&um=BoY=i=%V>aL*c65tx- z204=vrUrB~c)YWRr>~!DWW2wdn~%REL^D_-$ko}^Gt4zU)X&k!)7{S%A!TL^3ILEI zGcyp&Ga$??J|M^yyZ|BC(ajZPo4>zLykA7Te?W+*U%X>zh(FjhpiAaK8>tNqGl7eP(g@U7&OV^4#DnAA{Db0y9U;LV?+fy1e5hY=Xh48} zP>8FGf^K<=iMffHf^J!UPGU)BPO4RIv4XCDr7i9=!3^Q{J@{3C1^YY`1QqwbwONuHL zbX`4)bwOmZu7a+65QuP7&~*=1(9KRQ%1g~r(DkoS(Dg4?&~^7w(2X(&g_w6xfU~P# z7$|t+2eC`Ucoyh{QYkgn&iCYqUN6okHC}b9IQkonn}mpORRTT9TQY3i3`#QD$x$D4d{; zKrCX&wJbJil$HiI1xcBCh&GghZi*3TGO--A)+n(Av}DcGCoHuHbo*v8NHQu@TR}I< z!z$RrG2Y133>@~B7BJcz%r`MN1k=W5mJr$iLYtdH;>^Uz94URL7zLK4ChO)VmSp5) zCV`@-9OTT*^t}9{)PSPI^xQ<~9X#N3+94(yLTxlRR?u~E@%Iafckv7cCD-@>XOH-B z#~?pXKlk8xPd^wt-UF=B%)|hkyh<`a=O+Xwrlo?mN`X>YvK8pStrVBk#GIUbP*RCX zw#v*c$jMC3Eb+@vtpHtksta(0CI#QHLJ=Y_Y~=6C}33yuUIv?B~RkB^#O;=oO?SF?^I_U>0L# z*e%7tut$o4;j|P3!x>O-Pl|!z(?|P%&GMlB4Ge?U*Ms&KJOG~sBf`ST!6N|L;UU1_ z&(L;PLx7E)LxPEcjX{XPpW*-i|NrYjlZjBxp!4`Z7-R+rLxmX_82HYuzKS()93WCKHQ27j?nMDvrQ^y204x$H4{s$f52WEi@Fz+Aeq%SZRLR?{F zV&G8>aV))O_&wyqol6x=74UG1o?3@+-=ZJT5gHCnK_l9wY0G7 z2f*$Dt)zqa5yV260~)!I!|I--qWr`ZkbA)TLC%Hf2eAvKr(wS-3kvEQFcFyAwGjK>Q90V~9IJEQFb=44@Olu%**7 zlib9Dg47gvQUJ#RWEKyUra&x&Il2rC4BA-ZATcK=Gd;JU%(y7O6tqh(KQAXUFB|4p zP+Ekz3&cX0M^3sov@`;{Q4=11AQr+*IR*v>83tZK0Z<@=9KeuTnrUJYk4R;Zu+o9+ z2eAtC>E6F!O4RcVuL&6BeLYM*K z888r&Zei&GbTJgfkEU>UfmjGLVR;&}+)B*JLG>OutS#W?fLI7~K(PrbV=&FZUdC9% z%>l6x=HO1Bi8(oW`6;Qz`FS7;6rG^(wu74kVj;`{W;BEx55N49NaL28OXtNp+{ z$h;OKcxx5|14Hgg`)v#iOrT*22GCp^LJbpx9+EE5tPL|GXa)zQqFXJbmw|y1stYuh z4-y5dLD2=8iDL%OPJ!et9P6(k>~aPPLFcBJ81xVhWB|=rF*AZj^Fc}^{5SL=?1}~n zF))DDpt=w=vxl(jvBK_q2)jVNdyqzu8dO~%A0c$bG(@`~bhUxBfP2;q45+$5r)42R z1ELHT8q*5>fs|oBlF8@C4??Xs4kEi)X)IUogrN4Yz8_j z7Zw^8P+ed(C@$n@U|?Wo1jRMT6N`PMKOpRigX#jQLA48%ZV~*Y^xgk6WB zxasC=6F#>OG9G>kCvDNDZnk(4;0J zmO(lZy11c52S^R7F3=Pr!i9e$=DkJe5{K#nsX^5RnomRM5<1fFiwHw~s4lP?lrRJx zWQfppVaJC{2)mr2x-_b%E8O=mO2|AwpxC0ed;ZU+18@ zKx$B32pZQ%=sKa&l!efBAF2za22~fR)J25h%=5*f2wkk8E)OHK=xhW>^rRv38~gHzEuzp}N3oP(lMVHj7JFEL0a*4T>%mJn>Zz)dg0A zq6;*4fUwIx;>l`+3l~Clfz_bs0?j}nbfK2m$Dz8wYEX26#(WX+#lC!!8zKx}LUn=E zpoXCa*k7;`VCsS+>kzv5poto!22~em_84IoCwbt{1>H@2QwPe7p9ng$4Gb3pJ0h&}9m>F0>Eg7U15ol(fnGtlm z6if{Zh8jJvn~}|7#ZUv9zecr-4MPoR)`FQ4=ECQ-sd>Cp#bL6Og z=f_ZE362YpN>~^QV5qSIs{w^JOpPFh8qhpCs(XYm)PQ`1>UUubHMU^8Kp_dUO9Vp= zXs#XA98nB4_F!`$xeOA9Vi;;bsT9>5aSSz}xp`(rWWP&bsBr?@h3sZY3^kyZHL6`w z7-~TC_o#MBW2kWj+XZqtEPP}z)VP7wfI=IlMixU2Xr3Q6ZOCD$@c^5HY?nNS8c(nq zjhBrjtYhvKd?E-cBx{h@dv9x zwo45|4QO2fYMNKaP!k9?2RZ#{V5kWKt3ghyniy(81u$wDYGJ4WbvKzAL8%B9@7iEB zg)9sVIM)M07M~GX;D>9;9?m6rFb#;+PB0Pp3I>SH_?Nvw)L?TRXsR5%j18g$(-_z) zB+y(n%=c)k%wSFet%Sg`XbfU9Hp^jVgVunduj+!?g?*J4OcrU~6~r3c9ste!!n9#5 zi-Jj@Po=}e5$h>H6YlV(m!Roxm=e%J3-Brs=nOixWkN8u2;)Gy;KqSC$VOmWm4nNh z@L6u~DjSF@Y+(*tHv@ADJRQLVAj<%7Ep0)HYluSR#VSaWpkRWnVSzXXPs~^vF+kMd zbTD2Opfn6x?t$A3ctSI>AYc=6GRM2f0yVgxaSjuNqzlOMT#U2^aVBPPz+(`$PJv6` z%v1px7@AlZn^~Bcn^+=?DkvBl7?_!vDJU2knVDM}gX9vpQdaRZ^jhaf#J^!=0JZ)> zwKsG;4O9q%xC}8q3=BE2LJlkfI*C%i391fM5Q0SmW->CI02TLO9)xgU5O6{sMFWX~ z+UgQ7pq+D&0O({(0S5NJQ{XF;So4b-eagMN=+^)gO1fe#!#c*K->oMKNxcfz}LOEGcYiCGBARMn;0NldGt{Ba_?munV>bg0@rm<~k=PgZ8S+Ft7_siGjA=!%td(oWAOm zUjkZm2G;wU1+?CtUC>$#bi%A(QV#4w9IzhHr52uPkTX!l7}y1O3W1CZ$S+SVf*i)| zV#J`%0MX6B5RzQrSpYsFySOwLejhXF7+cVCdj?qscEJSDs1$==N@lTzfl<7nVYq96 zYaZxC+Y|*M>mkVnnFU}62j`a-C8zo(R)FpSWe{Ru7c3D2ot72g7XaF9 zR9eiS2K5OO$R|FDMWCCO@=`E80&*!RBv=^0217%_m_ZJzpOXPak4Iv01~>qu8Q2A< zih5zT9km!8iOTqaMCHrK@=yTWB@WkkpW&t!t{fJ6;uT>K@tz>upvkl2)dUVlmtLY zoe4Fmd#6@9CKZD+2`E8>bTgvs23^<50MZT$A$HW#9$eml5)!;vWMXj5EKUTg-zUVt zz{UWnFv1hFQ(aOEN-|*i2Nr=`4B=@7*n=FD(pVS}Da|n@H!}}hpo0QH2_+1DON&c_ zOOumR5!D39$=aZ~8itho5<|oIf{e=elFEYA_|m-Wy!`S!232T1qKXJgaG{A--GJg4 zWFZ3+a&_ZZ0ZwEfH?ktRF*vg%6`Y6q2X zpwu3fT9glt0Z`He-OQTqR}!3B0xHR&+Wr-7z>M-qSxm$Q3FJxr&BCnSnzPbjf4@%m_#4z);U1SMc6{XJ7l_2H6_^7 z&)vtBL5G1u5OljL+!Bm<Np;Tl8A*lgz4;?sjq#&hPtO`KUfXy@D zSO5h?9I_oQp1}d&GgDL;I0R#n%now(adixaWKLgymw0e=f#W#_NtLsQtFw2!r(1l0 ze{is;lMf`-MRzyfTAfJ$zF)hG0u($=eaPj?Vdia zs2K@%Wu7DhhhQj3iA#_t=+qcT7Z+%n0LM@WND7wv(Fz4n2^Nej4{-)+eg$RwAY?_D zVFXGbzr`6Cpe_gw0Ua3a&j3okpz##=Js$BP9-u-LTm%Fn8;Meqfjks|5jLP}-55Y+ zyFaocpu)+~1uW``Y%i$b11Db(WKodk zkn=C7sB=g132J!?@~0b;EXXcrZ%}axj&?01DNt4fCs?rQ;Mxh4@?8-Qh2A^i8RZJD zmt0Vtg-H6adWnyLLoh;ufx*w!-w!nG4GJ1(WKAF|;r;>J2ujEHk_-&UNSJ0WX> zdIDOSqt{sQ=mOPPpvb%@!N3pzjtz{o4@=*mViaU8%BlOHY86!Q<1F_ z3><<6k_-%3F1r9%X2?}0-0}WF@vvY7={LgSe@7o5aCHqb8$5CVKCB7p$`w!&)dOin z%QK*wUl$|}%d((206RqoSrimIXbA#T+-f7G8E8x()y|*>jXXR|5alo|q(OGeAejKR z0GymQf{J-O7p8(U<{AkGhHwv8$9UYg(SmAs{OKB;z@beeQ1$_ptI)KKb~Owr1K5Jx z1#X%J`-cWOyT*en1&}{L^%ZJ$1xl)HAoXB32DkEot`h_Wjx0EcK_x9_ z;DC}La^QgD1(b!QL7Jek2z4na7lO(}DUcK_A|as(vSu2{6~WGqAtA0o@$QZxpaVZ( z_q&7Att7HGc+uz|6pyI41Q|F4#X(UCFIyQv77BrMLfrz2e@7PvT?P(8L69)a9hgZ6 zIm|)TrT|hJz-~P#+4CbC3aL22Wwbg2haexO97Yxd*8;rA3gHXmEb05@$fVH6<|A(Z@3c zbbMNTuxn5lsI3f2f(t>~p$+)p5XTT#a5XX$7&gT29d543O%UKWDd{H_rppd(J4y*>ThLFvX7+|JE`wiyG0JpF?_ zLn6VAz8Mnmni8q)04losL9TM~b&Pj(aSQ+@R?t-~ zLR^E~9GzX`gIwKQgFv|roK9beLyL+KPhZ#I5J%qtu#uqFByw&>YOiuLa0r$%FffFA z`h|ei)(bL#F8B_KcX0*PPN2)E9erIxT!VrcKy}+bP;;i-9C9R{o11G8xB!WV1|YZu2Y18ZL5t)fP%<NIA+sG{n=-l>y{<&_PI$Gcz20;(h%6y&Z!+ zT_D}sV36a%-D!A2gamjnIBM4kFfhc2`guD0yMUU=L7sl@;Ic(Rn1KQ0ENF+`)87x& zfDQ?TbanIu85rQ!K%(6>0vuLBAnQP373}Qj1B#}2-=N@dPrhi;#mVUBLn23(^wc9}XIhcMS{$=QdE<|0u%15D!)y9N_5( z@dzl$LDL)YegU4K@*&j6)zc+DBr?Di>m)+h4_LpmM5gO?+UU56dCcZpldA6Ou&g0lxPr%6P{{7xd2o+VK)v`7aatZq@MoJ z1Q_oG?mvK%3uvY-KEye|Gaw!sbKr&y11P6~&NFiHiFXYJ6=EQdYk~=;u_5(SfTOcFC~bmDAFL#`S?Q3H+=Um*sD z;K<+*S6^5Ff~#6kb4@^ifdQlr5{1S_U>8|{T!d^=kSlo94ix#p;1~t_L?5Iq2pZO) za;yqejDyQDP}VUANn;itpjZPZsA$%G^g*&KG^8u8Nv6a}M zcwUDTn}~rnSb%5d#e>fN0jF7EK~OCi5|386f|P>x2|!PL1y?q+K>>%-3Mo?07bq)nJVc=GQ3W!)C1_nr} z>j0ofN0u5MDiUuXz0FTIEPiIG;cu?sF8c_vR3tS-O z0gmpjE@<@zgDC@t;4G{`9_$KsO+2DFh)47QK*7!lHWV}1L7ht_kcUHqU4!C5ehLHi zO9FyigTajfP|3vs(u-$3?;MED^Z;?PDS(J^pVfqDp3et@Re;)7h>LB}k6x<$r2 z`#1&%gZqp~W2?@Ne$K8w;QWfC#R16>pb)A7C2wz+0B3N`{tM(#v{oP}LA!z)6(|WB z6k|_8aUh15$~t6b9u)2O$OqXnQ9FRMLTyFQ{Bu3!3eK z%0SC~SnPvVlz|H8_{=;r22g9~HOK}(M_*T$_yErU*Lde3S5R9YsUZyNkAikTf)gMp zz-EJ5THrJPkozz30sj6z;LP<3)FJhCM6Q!z#R|yTk)XJOG~Ge%7f8bkly>99L3M?* zYXG>D0UF2f4+bAm53U|!#6aVxpl&C$(2Ivvb)W_`sGAKL=s@(dL6HZVdWUofkQ$HR zTm$OhgZmefpi}`Kdhrbnag6{+1E~24ZFhjY-w6s(Ul$*6>beO^*P)nIcPA($QH4Qi z-Aago!6`I29+G@uJr9tnppH#Iu%`>y)B*+u25;yD6=eL&6+FXr7i20Z`C;~{;RQS> z@a}-r!8%c}5CZ!Vl=5$bWPKe2Km#Ry!EUZW;E@A(bIQyF++H{Y%L#~HASm730mV0@ z@_-EPfYLBXZ?I>SYdoZExCycVRy~88mCPU!Z|F1#s55l~Bmf=&2RSn^)IY=#+5AMvl!p9sy(Z&E$1 z?ulLpS?lcR;~eS(O4wL3Q#{BY;4}tWVFc;7g#>vzy1PQk^>|MgaAO0sC@;i0AU-qz zbaen|l04Yo51d>;O&QQ|jiDL1xVj3eAkfnrtRw|x&`aVB3~0SQ(D(>wXbfEKU}=^h z)r+7!coO6*c;gSX{|$;BK~NAt$`MfW8*PZn#T79~1)5&~Eue@;bYekiHPkiUFVxow zno_*MJ_?Bs@pOU@qJTVX0Um1um8&SlDk!>-fL!S7=;;&e;~#>hSOKN1NuZPkP7=^! z3Y1|EgEYe37Y~&IrQ&~}$_+H^9^@M43Gc^&I-Hq{-ms8U*SJ!-`l?xUK_P?&ufn84vB&fRwKV3HrD?hPi^Pct{Tw zobN#;8d`w{^1^pei3`fB;Fc!nRt!)T56%j!L1ux4k%mjbh5sQjlomNC&%y#06bCCn z2?-QxphgAAl5@fg4BntXh9)}5cp})61t3cxSsT$l1h+&$OY=ZWE=!D!;!79|88`&n zP@7%Q7Cn~cC8Q+=%0lx&#)JHTG-?J5L{NBv*6zgn`o@Erw4ezY$S^WUr@S}=1I%bh z@{AAg2d5TD8;=iEqo9qznnByZ$T5oBm54?#s6#Ln1=;8a zaw$gR8x&6kRbRHT5w4Xs0=Gl; z88`%cA-z-Lh5eB#<0c_ zsHgoJ6#Xtf@&2Kn;EYuaN&wEjph68i1P5-OgKI8O%8tjCv_b9Kw}K1|ZlF6hAVXoE z{(jKLJ1D_`TR<3nL(n{52gs3-niUZzU~A!x7?1(%pc)^e=r@AqZ{o5JB!h!eJ!qsq z6kH&K>f9QT6F`{=(YOI6!%m>F z6D%lhH=>Vjx?f^ts~$RcQa5;k}bYQlm>7QnqWj3fk#zW|UI zVAU?9YY3`8KqElNW8qMDfGTlN)e?`TZUKc4s6pe0XwQI~;$i-tF5o7m8^|hfc@7$m z1ouk|LBl`c0Ri!_SO9m=K#>hkJD|oktSt*lexTEf!@nfLiFFmLp^V6tuGjt4~2WjUVJt{5cJjkIg_!NmJ9>t|$^&Ra z4&)_wL_aq)7}P5F^AGWK^MuU#K}vj(vRA?oS7UbLf?zcW@h74CF>n|9D5F`7DsPMM2^?$|11l>OkoLL5ppW$_Qw^ z2{I4l5Ad`G*zuq{1Ogyar&vmBaPWfmRQSP1Um*bka*8sj*N5oGfqew(^?3S02kk%w zDX13(DZt^~D3Ft3oo2@%@XF*rpvFH@sRfh`et=YCZ-0UkGq@)KT1Eu!dBAcbsQCT{ z(&&tlML-3h38+mA=~jX>COET#X8BMOIJi4H12i5EZgzndy+nf&I;f_{QhvdTO3T4jMAd(=&Kj5sr7!)lSP696sNdigXh%uyvA)sUm8VUxDJQy2+OFYnu42^2e zD6F$%fTNSAk7tOdYcM!4K=mD#>JHR=0`;JgTQuOR3EHdyjo9u7nTvPC7UXwO;s%8i zcohIBr-24LKo{nL*Nh`ZJ3uDR1^ESMi36Gu1m$tiurH2LUyyfaf(!xY3RsT`(lrK` z-7`Rvp8oNm!Py{iUko%&3Z5keITkd$>=yz};-DT2sNoE%q%Go0z#~jOApOV#MIZ-( zcBevmaENi!Fjqep{~&PE=n!LIfRB(N53Yc+FsQAGI#vrx2O+R@7#!f^7#Z*5>E{hu zW2FcxSVJN0X;4A}ZBlYUD}X_H0hC=m{X&e5z_ouX$km`^jcgn!L*;;qHmtpMP!b0< zMxnzXuwn{aJAen^L3ykho6o@EWCZFXBbS+=s=Ns_%mryMg3}TxYl8-@Kyr;BCwhk% zp-<3)QcN{S4wO?+>tawqRf43v{5}1^1v)e*fy&+r)Zrg^_=6S!LHra1uE9VP{*VDS zP!k(cgMsV>ZGD5ywud`^k2XlKtTsudxepR!9fR_Vh8oj;B)Mt;K>I06P&0)gXfTe7tp#pP#AzZs~CM% zP|=VM(u7o+psrN`B@<216heHSnF+YoNdu{O4fgc$2XmFcX$>CPpb&wUB1i!O>Mnq4 zJ#eK5N;IJSUYuE#8eakqUr%O3c26#>i)c?S-ju1MD2paf^ z09g!AU?@Z2pdt&DJSGV+Fa&_?gK7hXS~y4>Xz~CQ5uoWdNUjDIVYVPCs5encY*3LT z42l*|fS8$pli3v^aHR-!0B9ftGz;zT2lfGIdtf}uS|?CV4e16$rnEqr1=M2!`x8%> z1=JEU0=o;bI29av#h@}I+&{=0QpLuDn+%``F$Af`=mCN`KE(6V$fl`hRNI5i+5K9QbO>j_847z|I z-p$e1(s9L{#mYzBZJ4$XFWeoJoC3)wS5x<1L%wu1?Gd_l#L#&)SJz3Byp*C%b!(K z4os<^A`r=X%h9v{?}d7vX#1KCc^bC;gB?%UUci5a;Qa1cTP67-j%vKY)?w`D1Gh{)eMk3X3GIJK1zJkG-bxD`)B18Qm+ts~c~g_m+>B z^Y-!+RWk#hzqe#yI006tpvm37@Sx}Ml?grjWFCCnTFer3#%JToC0|^YZ)`o3@|uAG zbc~Gx^GAvOGj^sK&rM5ogZt;frj~88br;Bqa2pKUj2r+^Ddtcoquj_Yp zM_2HVuP^V^FSI_<>pNxtXFZ#y4gY^HwA#zS5CB#;@robYd9jIU9_F@I9~xsq`6a{7 zo6pOb@8Y;S#BqoGTLy+2u)14|cCc9UAN2k@cXPs#rnWf_!O`YHvCo!1S||0ZA###A z1H*iXEE;|i)aA6UDyAz}HfjP0w#pZ*Ep316BtM~mmX6ORZ3!yd3Yfo*#m)&+7c zx14tM#PSxCJV_(Jtnh}{N#1<4{W}B053st_&=)~X$@fg}{dN7pWOO3;aK80^ z(Xw@FLeo@P442+K#lQeM(^i2w%{WiWPrzc2#+er0;=DsAZnsOnEo08(nI?E(?pMt% z8yFaznL**wx9+hkF=NN|NAX@eO~hXC^v3x28Qimb>|WrTG}5a%YL38d^nfgZL?2Y zW$BtdHk;4I#ffJy88$F5d}d%^xDGlq7J9%?L1|J>X0l#dQEE(aN;de)=j5W27|8wU zdKu7jh)`~G&df`W$t*Af9W#VS-UL}5$8FTPnR(@zc`>=gC7{!EaNCxWgVQi1HzyY5 znwiAsrRL}1HYpEu7Dy8Kj2yTk{EjOxHp(o(Wj*}9Y^YBPiZaXMVd0pPk{y$ml39$^ zBD^|N%koMJit@|gIx)h(BpJm`81i6$f{)w6ZAMCEUO{3}Nhav@7Pu z9%p0l5!@pQIunY4fs27r0F>n!89sgFVqg+r5MW^7VPFJ{gGLe|;*0{IPBn}T>X*XU zpb-=Z8={x1fq}t{fmM`&p#gNn8u%D92!UuSnVB%?**k_J3phAH?PrJDuf)JC#4F0o z0P2Y_Ft~w^Z)AY+IT)P4e2_g%3=B-1phM*#mVi#~fG?fJWsec`hI%Z;Tt;G1Y6`fd zLra%@3~XYcNfd4Y1_n1a!hSS1Li3}s5!{cwXnq8RGqN8+d=@l6@+0|?19f#iYFI+; z0l62njvwS+2R2ANgW86$xDtZ8fscU^R1Gr-3xMvu2AxgDApi+;CI%4!kUk~>QK(u_ zS^>>N!ORecio?v1z+#3Z)C?)8S~&(bP}%@_k%56B9^7r!vv&*uvm6{4Kxt40s+Ny| zSrp_JkYWx7hL0dVD7_)`LCt<-K4`25nGfoGBJ)9M7nu+0vmx_AVT8;FEe=8EgHBt9 z@lQe1s2n(M^2|))OU+CeK79nGQ+b4#u@O{E0U>5+1{G68h*>avhUis-i)F&iQ$~ov z%~L^$!Oc@eh{4TMgNvoX^{OMpz;=M*g^PhfO+$czfdfmt;K?(%s@adAGzc1;&=O!^ z2xS1JB}M^I+``h24m6%Y=?WANFmXM&IFkSioXsczic6RpLnLufoWsP8k;Fl1114?? z7iSV+g|ivKX&t7<0!bX%Oe-XDWHW7$#6jr9O8aR;-GRLW_|#YI4B>%#DkE;LF!@VhaicA)WgKXkiL@X2aZ^g+n|CAr5x4C)CZL_yxH+4{B~cLY)98 zEyCPf2o;C9%~ybd0i+k%ZN*SCN}y^%ZUdPCb6Xig9PEZbs2f0W3UWgQRDUHxodBpT zgt?&_Dh_i)r~m^4NH4M*YN2M-LDhoX05SvSh6aQ<*bR|TH-OR!$PG2#zCA{2{`ZkzqD8 zeCI&b2{AAVf!dg$sR$TGsAp!F2UR~Gs-BAhV(vs}+=KLj;(j4i-6E(uC+y*kIpPHl zb_`*7du$2RJW%+<*h0{{9W;K(z~Gl!QNr*MWFI2~1JiP(@aABM$1oTY>=?pe`#|9j z8kPfvKWJGs$WD+QpzycC?jN-MJz&qEib2!SYN$V)pl%1{Z3YIP)V%bP3|QL&B*p|f zUlDX7EmR8BUIER!axg&7ECs0rxrLd5foUz0Uj;C>i(_{S$d91iXdpkHVg=RvOadVD zL4MT2?nmg#Vz7A-Hq=iWDex0$>m{DY;5c{B!2HqVF%_pF-P>>%MLHz(S z599|>d4b#x-VSvmtjt*>z`(ErCG9dX?1ZM>U2wI`qM*0{ z7#a3L_3eY|^TQr~pxGI$>v_Q;ic1z6#s{EgOEEACf$rV|xe4U{g8~c;$oUmimNPK0 zG8}@s=`d8E90Mb0QyBv&jzM}sdSEn&4e}2}FB`*AsNQ2xy|bWc^*A_A0!veiDueP% zOEU9P8NlsmkU1O-ZaInR#o+!Q$PNJpzrgPohcL{aJi!e4QG%)86am! z7L`E#4lS zFo5!m4+{f>7YTNP;tZshfuR%}&ye~)urx6R;wF%vSr{1DE`q{@fjB>d!Vxqz4|0z? z3j+hl48*uZJlZA&aKNF8IXE!j3pY?$VhgvcWQ5x_Xt>1@2sd;)LE#3{3kx?;JBEP) zGu&=K!VT4bpjZq+3kPUCf_8C$!Yz^oRDMJ1;}mF_25QfO>f_tcynF|mmtkdC5mX(h zd;_Vw2UT|;OWJo)qaGkg@qHy zy&yAT;rSV=?hBeakXu3OK<)*F(>JKP?`Y~k?gXg=xfP`DCsf@pG<6_1g4Dsn^AA+r zU#L1*dky41(Cj0~Jdk>bf0!BmL)C*i7@+zPrXJ)@MK<)XVrF0x1f?M+0cJtS*dk0l z$i1NT3FzjtLe;aOsRy|mwB!I?JqJ`hCsaMC?SjbXkaC-WAs%fH4Y+1R6@%7?+)#61 zZ9tHH3=A%%xw(}LAhSVjKwePi3TiY9k!FL+BhYRhP`Q5C3sgR08z%)V=0jUR16lwK zb}ncQEymhlaQO~uM+!jQ?S@kBhNTvP&+CWOe;~hrj>#@gEhpcfIR!Y7Aj_om>>a~RkQPEYIDp1k*~CEW zqd?_<1uLiz59zZBzKa344H$m$MVSQ&%n-b)1 zVX# z0-Am;;p&(K5PFydtl{FULZCWR06abmVH*g5=FK2%79?>SmQNr3plQ_>Y!CR{eQ-Hr z2j&N-7M6l$G$CcMy&!1ZJt!5qTy_A9fyN%d{TuMS8VdshlOtF^B<=->Y?nI;Li!UM zH9_eelBPg@VPF8Cv!4sPdjM3nfyBU_L$P*~x}eFW7#tyVyZvETF4% zpnXq}K2(2!@8AHt5!DYMaj-d%dlay`7o-NoSzvQe-G#0OY$n)k*zdi7gcp_zEx=|g zq4*hW7Q}tQsm0*t#b=0qoOhc*;F9LGcb;f8%Y5$kpW zaI|5Qf!4E`P&3i}1+oL=uWVF*VKWKhEo?I2wh)^bXtM*zPtzh980@gS9ke(Wc^Na< z*=T~`Fam``9^B2aIXpyKDS*n^LE{NDH^RUGx?2uXXBUF&zVQ5_?9?LIpe3lj1f@L* zhJZxSEnp?7MPPS=`cXwl{#Rg#M{^Ry>u7>tcY?|d&;o6czh_55;u2&xBrYLs8bMgO z0ZulI3}w*tS`PIC$gi;eAt;?;X`g~Rm(UHGNT&jTLl3JI*li$ltDtru@(UsiYoKzl zJ{YKsV_+cMC#?myeIWOFIVa}iBqb(igUV1?_zEyU<)DMUAU}cHMs-MGECK1OlI$l? zc!Q2f28H*#7zPG4?CA`&C>YSgOl$nO@WdP2SadX6?9$!#OGr0P04{w zJ%HyTK=-}~FhDOagpQqq+%LfZ3ANzL;*!+dutel^s=yFjl2}v{hCI)p!QfO0ifq_8 z1jz3?U@`x+wBpnfkbY2_1BHJN$RXf7&A?#50J?q$Qcl3q94M`Vwn%`&c(*O2YykNU zR5rlsZ;%^7VGa&ouvttD6QJQc5gINy!W4Go7C1fWhP z^QS@8;4t46x;YwbK9mDDe+E=9C@ip)SD*1;&QWht2`J%{Q^Q zB(=!1r~up-13R3-v#0?LmjfW*ry)SQdxn}Wm`7#xeC7fI%q7Q^e)Vo?47<=L~~c^1bU(7oQE@j7ts{S4`wGBGf) ztpwN4C^3UGu2w!9(n z9;z19M#5qz%I%bF$IMU~Jj3mNYQwb=~7Z8nJEATvN`KRGZsmlhSJ z=9L7OBqnG3 z@eOKuLt+sUx1jRSfWb3AxFoTpv=|b1p!IkT3_+l=wc?WeBJi!gpg0GOSvxWWq~@h$ z=A{RvmXsDj+F2kukRB&cJ)N8lsRf|%4H9>Tr4x7(f!GZ)&xOGmG*glTONSsaSEv|x zY5>U`HwMRoWY@g1%%c1}@L(HM4y4DO0a1oQni~*1K;^jyxUBWeFHVB^ZxLuuHdqWX z9|0=6BGA&n20_q%H;DUS#XHEaptMi`)(_1lPy8 zV!prtJ|h#H1Yz|psOR3`z zl$lgok_u0UAUPq1V9>gM$7Iljo=`m?b0ipC6QN5%z-uBvb38}Dc7ub2K>;)0grd|o z(00I4Xuk2xXJ81!-gd=%0s}aJ@Tq{dagRg8sf?mr2L2XG$*$Yae=oLzgB2_nT#}fV zl30|2EDaggW&_K^?hMA1X9vr>CL+s#`tuxMaYzw`F2@O$1FeZemVwyE1(t){h>a`@ zGLsuD=aZS2jVuGv#{-rFnOTf12_ARg1d45s0e?cm?G^z|% z18)o^U^WW znKo1%?D}yJw9p5|uMSvEa9U)?j(mk_04f0~L3zC`rK=#skRVr<`!f;|NPE(u%z1v+FB)UN~G>5Mve11XX~kzl&ryvE!EapmtBo2d$yPZ8s=9AYp_V9-y{3Xs!JNGVFf{wSRs- z1H&e0pAQta=zRiw_JiUOG_D1SFG!sZi(AmxgaiXLUwNjvR%8~J!1~l6IY|b`lrqo= zh<{!VZ0reSzXSucUWbgPfX9VE;|>zgIXjQUyp)_&NZ5n+S3E}YJF)Tp1nTz{;663( zum{=80qVzR7K6v>K>h`}Q2;6iP0e68g2X|6en_hP1n%>L<`kci;lAfk_wC6Ct@FU{ zK2Y3)=EYwkna@IGKkOCM{Nwoy43`*@`#)~QkdhWDtwGBgX#c0!Cow4%r2>G~YmmN= zTQO)H9a%T1EQa)X+=?-4Fi1TF>G!x5!&_6x20+bc1D6SI#h~%rqI?t=fa?iJ-^Z;O zR5D|810)Z*6+==fX4wtt2e}oyfJco35=%0W9RYDCq(1};Bk*V&vLdiMApIh@;$Uz; z65S;bb0GaAw_;Eu%{jjSrLzeNFGwHBt=KoUBrzqiBoW;dkQzuI$*mYmY5viOfnAgj zT9&^7m*v5rf*f+U6|?|Hh#=-$K}YI?%576A{AChI9S4IOa_0_GLVt#&dr+D59w}WC zTPA*hrpt>2%0y!9|3rrUpP}~O$!B0FLMapdOG^q$OCY13&|D84`vm2C4hGLWbZJCc z0Z+5e`6;R3c|%aSA^{%vHb&A2Dbqk@##bb_6I-TzgS!1iK4dHvGZVUr4Np+NB(J0>KZoe>{Db6nV#D(<)b0EQ=y?G)c8r|$ zA>(C`w15a>P#F!%3;&VqCpIsDHot@NqErE5UK3|~4Jm{(koUsM9q1fJglt>FT- zuR-gRrIF6@L_NqD(wKm*WI&OE^#ws^AcM-WHF==DK#;a9NQ?no|3UINC=JVz5ytY+ zFpkGvE`bmB2B%gK3!E+)1r&uqI~+lKFPH?BplKAe4-3oM1jJFRU_;D}+J4dkyUjVVATcR3C$l6o zwHOiS+F&_|yNNBgbfE4oE?{7Y!amoB|E?6U5AZ61`$Z4x7d5C~^ug}+1dUAQmlh?b zf>sJ-7Nvrw5W{00UwTASlgYc;@Bq0FR9+e*xsTZL(gfg$8V7#KWLz=a32 zPX$U>Hb`MhY&~QP4clqpHVLG!&%gljXGm&A39OX}+Oh@mCnJ&^Xf_G7HV(O^3-T|h zO$MqL>=EbNgVtOiZ3=~!5O7gM9}{#{Fv!1BNMmjwF=RKv{0&RP91I|r8XkJQc8hBwfxSoZD z4_rPVF+DRc9lSS+2^w~AIgiXF@N^$2aG~`rGrAg=(%b^j+yiu+g#}&SDL)@{)&?kU zSkdJI@{3DcGK&j9%eOv%`WS|k7Tu8QY+QF$fm0^zjsqNuVCfWe^%W@I4(EZ^I6}%N zQ1~%0c;-#`q#t3OgLF7T(EkKb4jSFZS3nCYslbTwPnU`(|DQB3G^}*zfAaX3& zw>gF_jm3_%u0E>|N!@eB{ko zhYCRJ!m#F9jGINlsUKYwns1Y!`4)C|Q!?01(DkXQDM6{l;AS(pe+lv*NS*_>eica` z+#}5at>i`2_bFhrApRq^zE6ev?*_Q90I9P;do&q9`*6xKQ&NjO!Sw{lEs!=fs9OcD z&ERu70?>2qKx6QrGzL>E0Tl;{fyyFKyE+}ojl{-52Gotu!DSJ|jUcx$FgO;amx8($ zhVXtM2VBeuE+zmMGlq*vz{O0!eMFGkvdC~-Hq>pO3K$sbm?3Thtw&{Ga4t%P))}Di z0Ik1-iGfxqfx-kN4qA5z6NjxXg2{o_0x~cJfmY&!!y2?EkAVTalMU<-(A+HOEUMI^ zO8E3WOfP8e6to|{Br^?35|W2N^O{h7;8qpL9Z$gHufeG$U=fHq&>S07ohxjA6=+@z zG`?Emnh16SXg&g}1~M%M9g70Z6M)r0ML~9e#@`vhb5xK#4$9d@`8i;7K;z($eiBR+ z;s($dGpyYUAJvB10UG~>+6^1<1)BvLiv`;a7loJw8t-Ia@CBVu19cTd95f~g-ZPn* zRtc2=hc{^akAWdLxi}Lt?+zLdgW3mPI0Xx9&^Q*@K8Pq-FKFBasut2%MvNSR3f4ve*#RnJq2ge@pfZU8v|peII#dU>4^$2?FogShLiwP)$H3rU zl95^j_A}_r3^fJ@wp=059u}09;^0ahMFhHbJP(?Go%2C`cE~wApmFxuf{?QrL3@fI z#R4-!fe>Wgs1RC)pM#EhK-&1eiCOtYZl!tPmI2rwAaOIxV} z*vZ0B3$?Qjsvox3uUd$Kp4JVg zE7+IlqR=qwfrS|pq@D&>dC)#L$giOBX5_t9Ag_bYa)Vxt0$FVX%~vguxj67j2xyK2 z=R?q5L;>)5#*pF?R;Gi*B^Vq_N)nSZQd3anKzkPzVEdpz8?&Hxv9Xvmtc~C_F%G5n$!k zL?H$SP?`ay4UpZ)<<=x;jDd!@>u2c0CgVV!Rim7Ic<32Ph6fBm0md1Dppy{Rj9y z{`?}3OwdljN=SMDm8+n2YH6uOMX4#U+6a;+K>h@uDGZhawF4pb638x)oCb8yIHJ{$ z&}V=q2fGslq|XB6Mo_nf;S+f89XA65({!YGb6|)E)h4i_C%_rnHUM4O35p|I@V!M@+BW!%m{og z4`_a1IXFxqnF(|bW|*sANIZ%DaKd>8G~RojkZ%3@^bwRlR|qjMtQ2Bk0G&gQqwawQ zCiWnPi$d$3)zGkQf`%<93_$Z2u>1uICnmJHPLLQgsC>`MO9h>S2@78q2A|ZjR7k%G zq=uEjzaSa3a0;n>V`B(OEY61HIZ!-;_pFuY7lGRKApd~ot=D1=Z@9}*k_=oFnm5)# z!>0p!?+nO)uzL+QK>Z3j#~tKPnD{0nage)V;#-i!L2iYKZ-a{Wp^m*l3VPh**bsRa z1L%AMc)SiOW(XF8j=Mp{jKE^h@iwTKF<1;b&IS=f8*c`sSJ3><4$wFxbSeij0tUJm z8#WS&DFGXc1l`dKDq9XKfy#eI0T3VN@7+*;AA|cF;sj7n3Vh0;Up}~3m6(*13Q9kq zF+JFv3tSD{|7dz$U}1nR4hsi#apR19=(r+mZUte7adLi63OKCTpmjW44lTSu=?xTK zdy&Em>4s$R2qLWZM2I8C5kVI#gTl+99x^Wl3L{YYBf$U}|H4uZg04@6-jNDP%18q6 zGVdTXtU>iT4l|IhV1=|UeI4TwV$l437-|k|Eg>k~gU1w*+F2kmln1Hth%m7-O z0}4k_n!5~2bDsY3(2I?cZhwX(J8V+0dRs_zz5AM7kAP*{S_cmUZ0!XW*y@C4Be3~UT{ zpnC5@^@8FN7N@X2Eyx_0evo@1aly>+0IK&PR4-0@*+63|koX71E6Co*P`yu}dO_xb z+y`1Y1WQ}bpmHEL!Pq#~(gZs@hJ?5V#k)I(c(?|EuhoI1bu1F_{QDAWJ}kY$;^q}n z7(@KZ!tfgE-ZxM^Y7C4*p!*s@VFQXASU7|H@D{2c6viNbLE?#n;T_bB_fRvC!xv;H zOg+R-W`>VY^`D^Xv4t@DU*u}>11*-QeRIeTbqYxJZ0|O!VBF8htEG~xc zP_uqO%>u;-$iJZS0Ty;3b3uLpiT{F@6%hR_48NiJ|3LMF+7LL(OK6!J4_Z$Ti9n>% z3oHsPGyg%&f{hD-?EjBqFBAB3DUe$kg(2%?ag29>Y=B?2jcPH9Fg)EbL(M~v4^aC9 z6d#~?WD!P<4_0AFxylCBi|lStm?P2&69WfSEhkhhvOS=(6l4d82H68*gY<&T0Oc!g zs9qkZUi5SdQU}rl!mzSL26{drB)&Kp_@HL+L(M==ryzYGGeCAi)H5>(Le&dlQ4h)+ zF!dn!g8DHcQ1zlv^`NtuLFF<7gG+8Abhr^QH|mm`=$MpWRDxJ@zywm~T2z!@1etea z2Js=sspP=U#{fuBJIYQ8GeeB`tYaxX|d%*~+iK1T(fa*ogGoU&X zq!tqPObl93wc1d%ps<4F9}pXKo*^jQv=|tLIHCRn*$v7^Aoqi?o-pK`S&$fNp5SEA zhnjByH6J-ofc$~#c4h`6sCr|ldSthQ>;<_U5=Kl6rckwJaJ3xJCFhI`u)5F!Ne-kR zxt_Fw%BitH#wJ02VL&?P=`^^l7*JXQ%1SAT1)y_JLH)t=;Q4RZ{IPR>Zf<@abk!qx zEas9B=xznKqEyhvT{OAd;5HphuOq}%=Zr*fcN5x|yayhGbjv9%&VVX_m<}6fye|Yg zHxXn$R2ohHBha`S14!OCu>jFL1H0|15Cek)=xj&uWOiCAY@FdaczoGC73|lX%yh_s zPLQ#l7ofEV;5kunIa8Vk3J9oMKL~-&+Hy}V2~JKdDM>AIPXtX3fd;1_{ov0+3=9bj z0j0R)zX?IkbjnFC1z851;rne zFatva1JtjO7yu2?fyd_9g&7z+pmMMv0!u>O!6nSVFoD4{FS8^w5w!8%B{vbK3^sTM z4rg9r1_sa=E%+Qilyu-)0cvN1+yT1$bpd>x0cu==_F99~2n#bXtN_gyrDdj<7Nw#p zf{qc12{SNkfS%EXrU2{~d0_^I9msL+S^@T}vM>X~0gzuYf(hY9HDLyZ6Ob^)rV4Dn zrZ5A;1qLkX6>5);FayI4aC(Hg4%*!S`A=7vf#Ctv?T`~kVZjMWKZe2#3@_ke0pbRi+(bxzfrYcVFayI62Cw|gJeS-=h!J4_TY@f$Vf0B&EK5a5 zK+UrjW?9Di=WFINGJ48~TC+d>kX=eLVfV!3~E{@I`Y- zg7CIs0JJOynG0jX&NvMMhj&0C=x9S&oPxwS7<^LGN}Mw?b5g+Z2@(@v2+B;)fC_&8 z^bzDXP@gmyYz8FKBp~s?E|GqYzMjtU9*)5t@ga^*KCY;1{qU=Sw)Z2T;R*{&(EXzfpz+PjJP*(! z7f>DqiE%Il6s4Ad&b~-Y2elzV;-K~gXunf>USdgUQ7U*}11Kz`FvF5!w}Qq}qM>0l zg$EKwAa{YnC<*&KBo6<(`i1(s206mV-w7%M$1^D1#X-Xg$9Z-*4GIa0L?j?AApyQ8 z*TI1Sw%;rP9DW{&#Tk$Z98g$;{K^2DkAw(;%TaeQBatJ;zR&^&n%Mw%p6d8kHsAC-~dm*cprafZ^$hQ5EIcwp>8UHx(Rgd zFsOe5vWJNQbcYzTD5y*X@eQDSm^&&M7(OyV*Eke{!_luKBr^$IFBO6LA(=@5i75uq zHXBHv00ZiLc(E|3-w>RdlLl$~fYc~31SA*1ruz&a;-$i%H430vcgLcl#7eLoAhiad zGf-3F!3KcRCCKd-pfUwiae@zTg`|IwxFu*mc79$8cvcI1az5;w+RU=d5{Q{)!l3md z0f{Mw5PLym={5}DHCM394#4FUNZbyx<_bj|6iyDHwG25q!O4j^scwm&GYlbSf#h5; z+yKtXa5Fs^g7ec#zqC;D`VKPJ4e}GHj|-wf zebpLhAGa2oCPDZ2VoBeg{_)WDPR>EDjv;6*1zfVw^j;4&8^@X`SLXnvfngXAs<#oU z7svQ=NQ7TJ{NfGdjpbM*;Pr4b)Jz=Zh^v=Bv_t^0pzdge>Zyay^+MJeA<|P5s6Ef% zT2WGz2w5ZyKjsyZWQ0G&^RbWcF1z(M3%!1*$yA`h;o7@X(YghAu;!I?Svu&y8I zel%85(7N|_r1;kWujeB#en4ez2Q-}|X@SxSlK{wGP`e06n1_3~I>x&O1^EZX2RJ%= zyN1Mv89~w>HW_I6bwk6?4fQTMOdW1Mj_%;Ld`LVFNpL(O?g|OdNKJGtDgrHXf*x%L z8-HYEK$7!K&CM^W1kYD zB*%&_2bpdKo5zMM=boCET9la#G844#1vY=$C(OWr?AZ{+wil!z0Er^zPWz#8rtbtf zvjyZ1(4JXvSOlk*1*InEm!%eg+Am;tz{4UqwahKCBoVas0Hg;V7Qv}y&iO^4V_=c) zQh|nFaB3N7i~@SxBv>zKE)LWt1dZiRM00kJl0_yH;&08tN*%V3B&C^|uYhQ}pTJiyr#KIaaP zOQ;+y%0T+yaS4_4^z#e>#U)6N9Tv|}IVXRAxEu$XT(Gkz%vkWgC{8qa&j2@HXGh2w zIv1uK$lG9j+*srSTp{{+(Bz;NhJn^lf!xcBCXaAam=VlRd}wNX6Dt@%=jHK3_Y6%z zk9YsjAZJ&k?XW0OkC23o<4=Xg{W1#%1}>Di2QBP!1D!ot;u+u;45|Q=LCajA`xhZ; z8KEWuDZC(Q0U-y?_Tcb>qz8l?Qq~8{L(&C8-p|)FAit;toW>yO0wD)00zhF2Nf)Sc z&>{eAE+lOr zg9Aer8FpfC#^JUPtR5PNpf&2CJS4)v@bMZn4ncg--X?H-L30}@9zo(Ppne``?=Cc_ zfy9@C+v7p0Wtrf`THwCc3UFTsd``4eW=S!)3b896yLM4OHd`!0Z4Q zI*@!05?5ew3krpnTcC2z0HzLJ(m~X&5@uj90jY)VwF2b{E(Qjs)kx{g14}x?5}%-? zfhFl-Q3(!DHnBC(wD{N>H7&yCN*M(h7(f_QhJyNrAR4qDU_Cgzm;^R}!-EmLM+M|( zSUTPW6^D)eg5rV!TvkHLR8U`-1!7k?Khzu}Xg+|%jcY}6PHAywSt@9d2AqyTV{V{3s6ltT zLv~q!&S+r;-(i0cHB3<~!ezG>%9`t#+|0bp{Fpq@RY)REP`H572`D|m!VnfV$Dn=!m9<#H#v3t=7VqKc=i&oic^ev!DGu#ho`9MM zo685;eG(dfuyqKhpz(4Vsup%0A80HNvPTuNlLb_EfZQv<;GdHM9n%826I3UhMG8j= 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 literal 0 HcmV?d00001 diff --git a/colorchord2/windows/compile.bat b/colorchord2/windows/compile.bat new file mode 100644 index 0000000..32f1031 --- /dev/null +++ b/colorchord2/windows/compile.bat @@ -0,0 +1,8 @@ +@echo off +echo Unzip https://download.savannah.gnu.org/releases/tinycc/tcc-0.9.26-win64-bin.zip to C:\tcc +set CFLAGS=-v -DHIDAPI -DWINDOWS -DWIN32 -DTCC -DRUNTIME_SYMNUM -Os -Itccinc -DINCLUDING_EMBEDDED -I.. -I. -I../../embeddedcommon -rdynamic -g +set LDFLAGS=-lkernel32 -lgdi32 -luser32 -lsetupapi -ldbghelp -ltcc1 -lwinmm -lws2_32 +set SOURCES=..\chash.c ..\color.c ..\configs.c ..\decompose.c ..\dft.c ..\DisplayNetwork.c ..\DisplayArray.c ..\DisplayHIDAPI.c ..\DisplayOUTDriver.c ..\DisplayPie.c ..\DrawFunctions.c ..\filter.c ..\hidapi.c ..\hook.c ..\main.c ..\os_generic.c ..\outdrivers.c ..\OutputCells.c ..\OutputLinear.c ..\OutputProminent.c ..\OutputVoronoi.c ..\parameters.c ..\sound.c ..\sound_win.c ..\sound_null.c ..\util.c ..\WinDriver.c ..\notefinder.c ..\..\embeddedcommon\DFT32.c tcc_stubs.c symbol_enumerator.c +set ARCH_SPECIFIC=-L32 +@echo on +C:\tcc\tcc %CFLAGS% %ARCH_SPECIFIC% %SOURCES% %LDFLAGS% -o ..\colorchord.exe \ No newline at end of file diff --git a/colorchord2/windows/math.h b/colorchord2/windows/math.h new file mode 100644 index 0000000..cd5ee3d --- /dev/null +++ b/colorchord2/windows/math.h @@ -0,0 +1,926 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the w64 mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within this package. + */ +#ifndef _MATH_H_ +#define _MATH_H_ + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#include <_mingw.h> + +struct exception; + +#pragma pack(push,_CRT_PACKING) + +#define _DOMAIN 1 +#define _SING 2 +#define _OVERFLOW 3 +#define _UNDERFLOW 4 +#define _TLOSS 5 +#define _PLOSS 6 + +#ifndef __STRICT_ANSI__ +#ifndef NO_OLDNAMES +#define DOMAIN _DOMAIN +#define SING _SING +#define OVERFLOW _OVERFLOW +#define UNDERFLOW _UNDERFLOW +#define TLOSS _TLOSS +#define PLOSS _PLOSS +#endif +#endif + +#ifndef __STRICT_ANSI__ +#define M_E 2.71828182845904523536 +#define M_LOG2E 1.44269504088896340736 +#define M_LOG10E 0.434294481903251827651 +#define M_LN2 0.693147180559945309417 +#define M_LN10 2.30258509299404568402 +#define M_PI 3.14159265358979323846 +#define M_PI_2 1.57079632679489661923 +#define M_PI_4 0.785398163397448309616 +#define M_1_PI 0.318309886183790671538 +#define M_2_PI 0.636619772367581343076 +#define M_2_SQRTPI 1.12837916709551257390 +#define M_SQRT2 1.41421356237309504880 +#define M_SQRT1_2 0.707106781186547524401 +#endif + +#ifndef __STRICT_ANSI__ +/* See also float.h */ +#ifndef __MINGW_FPCLASS_DEFINED +#define __MINGW_FPCLASS_DEFINED 1 +#define _FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */ +#define _FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */ +#define _FPCLASS_NINF 0x0004 /* Negative Infinity */ +#define _FPCLASS_NN 0x0008 /* Negative Normal */ +#define _FPCLASS_ND 0x0010 /* Negative Denormal */ +#define _FPCLASS_NZ 0x0020 /* Negative Zero */ +#define _FPCLASS_PZ 0x0040 /* Positive Zero */ +#define _FPCLASS_PD 0x0080 /* Positive Denormal */ +#define _FPCLASS_PN 0x0100 /* Positive Normal */ +#define _FPCLASS_PINF 0x0200 /* Positive Infinity */ +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _EXCEPTION_DEFINED +#define _EXCEPTION_DEFINED + struct _exception { + int type; + char *name; + double arg1; + double arg2; + double retval; + }; +#endif + +#ifndef _COMPLEX_DEFINED +#define _COMPLEX_DEFINED + struct _complex { + double x,y; + }; +#endif + +#define EDOM 33 +#define ERANGE 34 + +#ifndef _HUGE +#ifdef _MSVCRT_ + extern double *_HUGE; +#else + extern double *_imp___HUGE; +#define _HUGE (*_imp___HUGE) +#endif +#endif + +#define HUGE_VAL _HUGE + +#ifndef _CRT_ABS_DEFINED +#define _CRT_ABS_DEFINED + int __cdecl abs(int _X); + long __cdecl labs(long _X); +#endif + double __cdecl acos(double _X); + double __cdecl asin(double _X); + double __cdecl atan(double _X); + double __cdecl atan2(double _Y,double _X); +#ifndef _SIGN_DEFINED +#define _SIGN_DEFINED + _CRTIMP double __cdecl _copysign (double _Number,double _Sign); + _CRTIMP double __cdecl _chgsign (double _X); +#endif + double __cdecl cos(double _X); + double __cdecl cosh(double _X); + double __cdecl exp(double _X); + double __cdecl expm1(double _X); + double __cdecl fabs(double _X); + double __cdecl fmod(double _X,double _Y); + double __cdecl log(double _X); + double __cdecl log10(double _X); + double __cdecl pow(double _X,double _Y); + double __cdecl sin(double _X); + double __cdecl sinh(double _X); + double __cdecl tan(double _X); + double __cdecl tanh(double _X); + double __cdecl sqrt(double _X); +#ifndef _CRT_ATOF_DEFINED +#define _CRT_ATOF_DEFINED + double __cdecl atof(const char *_String); + double __cdecl _atof_l(const char *_String,_locale_t _Locale); +#endif + + _CRTIMP double __cdecl _cabs(struct _complex _ComplexA); + double __cdecl ceil(double _X); + double __cdecl floor(double _X); + double __cdecl frexp(double _X,int *_Y); + double __cdecl _hypot(double _X,double _Y); + _CRTIMP double __cdecl _j0(double _X); + _CRTIMP double __cdecl _j1(double _X); + _CRTIMP double __cdecl _jn(int _X,double _Y); + double __cdecl ldexp(double _X,int _Y); +#ifndef _CRT_MATHERR_DEFINED +#define _CRT_MATHERR_DEFINED + int __cdecl _matherr(struct _exception *_Except); +#endif + double __cdecl modf(double _X,double *_Y); + _CRTIMP double __cdecl _y0(double _X); + _CRTIMP double __cdecl _y1(double _X); + _CRTIMP double __cdecl _yn(int _X,double _Y); + +#if(defined(_X86_) && !defined(__x86_64)) + _CRTIMP int __cdecl _set_SSE2_enable(int _Flag); + /* from libmingwex */ + float __cdecl _hypotf(float _X,float _Y); +#endif + + float frexpf(float _X,int *_Y); + float __cdecl ldexpf(float _X,int _Y); + long double __cdecl ldexpl(long double _X,int _Y); + float __cdecl acosf(float _X); + float __cdecl asinf(float _X); + float __cdecl atanf(float _X); + float __cdecl atan2f(float _X,float _Y); + float __cdecl cosf(float _X); + float __cdecl sinf(float _X); + float __cdecl tanf(float _X); + float __cdecl coshf(float _X); + float __cdecl sinhf(float _X); + float __cdecl tanhf(float _X); + float __cdecl expf(float _X); + float __cdecl expm1f(float _X); + float __cdecl logf(float _X); + float __cdecl log10f(float _X); + float __cdecl modff(float _X,float *_Y); + float __cdecl powf(float _X,float _Y); + float __cdecl sqrtf(float _X); + float __cdecl ceilf(float _X); + float __cdecl floorf(float _X); + float __cdecl fmodf(float _X,float _Y); + float __cdecl _hypotf(float _X,float _Y); + float __cdecl fabsf(float _X); +#if !defined(__ia64__) + /* from libmingwex */ + float __cdecl _copysignf (float _Number,float _Sign); + float __cdecl _chgsignf (float _X); + float __cdecl _logbf(float _X); + float __cdecl _nextafterf(float _X,float _Y); + int __cdecl _finitef(float _X); + int __cdecl _isnanf(float _X); + int __cdecl _fpclassf(float _X); +#endif + +#ifndef __cplusplus + __CRT_INLINE long double __cdecl fabsl (long double x) + { + long double res; + __asm__ ("fabs;" : "=t" (res) : "0" (x)); + return res; + } +#define _hypotl(x,y) ((long double)_hypot((double)(x),(double)(y))) +#define _matherrl _matherr + __CRT_INLINE long double _chgsignl(long double _Number) { return _chgsign((double)(_Number)); } + __CRT_INLINE long double _copysignl(long double _Number,long double _Sign) { return _copysign((double)(_Number),(double)(_Sign)); } + __CRT_INLINE float frexpf(float _X,int *_Y) { return ((float)frexp((double)_X,_Y)); } + +#if !defined (__ia64__) + __CRT_INLINE float __cdecl fabsf (float x) + { + return fabs(x); + } + + __CRT_INLINE float __cdecl ldexpf (float x, int expn) { return (float) ldexp (x, expn); } +#endif +#else + // cplusplus + __CRT_INLINE long double __cdecl fabsl (long double x) + { + long double res; + __asm__ ("fabs;" : "=t" (res) : "0" (x)); + return res; + } + __CRT_INLINE long double modfl(long double _X,long double *_Y) { + double _Di,_Df = modf((double)_X,&_Di); + *_Y = (long double)_Di; + return (_Df); + } + __CRT_INLINE long double _chgsignl(long double _Number) { return _chgsign(static_cast(_Number)); } + __CRT_INLINE long double _copysignl(long double _Number,long double _Sign) { return _copysign(static_cast(_Number),static_cast(_Sign)); } + __CRT_INLINE float frexpf(float _X,int *_Y) { return ((float)frexp((double)_X,_Y)); } +#ifndef __ia64__ + __CRT_INLINE float __cdecl fabsf (float x) + { + float res; + __asm__ ("fabs;" : "=t" (res) : "0" (x)); + return res; + } + __CRT_INLINE float __cdecl ldexpf (float x, int expn) { return (float) ldexp (x, expn); } +#ifndef __x86_64 + __CRT_INLINE float acosf(float _X) { return ((float)acos((double)_X)); } + __CRT_INLINE float asinf(float _X) { return ((float)asin((double)_X)); } + __CRT_INLINE float atanf(float _X) { return ((float)atan((double)_X)); } + __CRT_INLINE float atan2f(float _X,float _Y) { return ((float)atan2((double)_X,(double)_Y)); } + __CRT_INLINE float ceilf(float _X) { return ((float)ceil((double)_X)); } + __CRT_INLINE float cosf(float _X) { return ((float)cos((double)_X)); } + __CRT_INLINE float coshf(float _X) { return ((float)cosh((double)_X)); } + __CRT_INLINE float expf(float _X) { return ((float)exp((double)_X)); } + __CRT_INLINE float floorf(float _X) { return ((float)floor((double)_X)); } + __CRT_INLINE float fmodf(float _X,float _Y) { return ((float)fmod((double)_X,(double)_Y)); } + __CRT_INLINE float logf(float _X) { return ((float)log((double)_X)); } + __CRT_INLINE float log10f(float _X) { return ((float)log10((double)_X)); } + __CRT_INLINE float modff(float _X,float *_Y) { + double _Di,_Df = modf((double)_X,&_Di); + *_Y = (float)_Di; + return ((float)_Df); + } + __CRT_INLINE float powf(float _X,float _Y) { return ((float)pow((double)_X,(double)_Y)); } + __CRT_INLINE float sinf(float _X) { return ((float)sin((double)_X)); } + __CRT_INLINE float sinhf(float _X) { return ((float)sinh((double)_X)); } + __CRT_INLINE float sqrtf(float _X) { return ((float)sqrt((double)_X)); } + __CRT_INLINE float tanf(float _X) { return ((float)tan((double)_X)); } + __CRT_INLINE float tanhf(float _X) { return ((float)tanh((double)_X)); } +#endif +#endif +#endif + +#ifndef NO_OLDNAMES +#define matherr _matherr + +#define HUGE _HUGE + /* double __cdecl cabs(struct _complex _X); */ + double __cdecl hypot(double _X,double _Y); + _CRTIMP double __cdecl j0(double _X); + _CRTIMP double __cdecl j1(double _X); + _CRTIMP double __cdecl jn(int _X,double _Y); + _CRTIMP double __cdecl y0(double _X); + _CRTIMP double __cdecl y1(double _X); + _CRTIMP double __cdecl yn(int _X,double _Y); +#endif + +#ifndef __NO_ISOCEXT +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \ + || !defined __STRICT_ANSI__ || defined __GLIBCPP__ + +#define NAN (0.0F/0.0F) +#define HUGE_VALF (1.0F/0.0F) +#define HUGE_VALL (1.0L/0.0L) +#define INFINITY (1.0F/0.0F) + + +#define FP_NAN 0x0100 +#define FP_NORMAL 0x0400 +#define FP_INFINITE (FP_NAN | FP_NORMAL) +#define FP_ZERO 0x4000 +#define FP_SUBNORMAL (FP_NORMAL | FP_ZERO) + /* 0x0200 is signbit mask */ + + + /* + We can't __CRT_INLINE float or double, because we want to ensure truncation + to semantic type before classification. + (A normal long double value might become subnormal when + converted to double, and zero when converted to float.) + */ + + extern int __cdecl __fpclassifyf (float); + extern int __cdecl __fpclassify (double); + extern int __cdecl __fpclassifyl (long double); + +/* Implemented at tcc/tcc_libm.h */ +#define fpclassify(x) (sizeof (x) == sizeof (float) ? __fpclassifyf (x) \ + : sizeof (x) == sizeof (double) ? __fpclassify (x) \ + : __fpclassifyl (x)) + + /* 7.12.3.2 */ +#define isfinite(x) ((fpclassify(x) & FP_NAN) == 0) + + /* 7.12.3.3 */ +#define isinf(x) (fpclassify(x) == FP_INFINITE) + + /* 7.12.3.4 */ + /* We don't need to worry about trucation here: + A NaN stays a NaN. */ +#define isnan(x) (fpclassify(x) == FP_NAN) + + /* 7.12.3.5 */ +#define isnormal(x) (fpclassify(x) == FP_NORMAL) + + /* 7.12.3.6 The signbit macro */ + + extern int __cdecl __signbitf (float); + extern int __cdecl __signbit (double); + extern int __cdecl __signbitl (long double); + +/* Implemented at tcc/tcc_libm.h */ +#define signbit(x) (sizeof (x) == sizeof (float) ? __signbitf (x) \ + : sizeof (x) == sizeof (double) ? __signbit (x) \ + : __signbitl (x)) + + extern double __cdecl exp2(double); + extern float __cdecl exp2f(float); + extern long double __cdecl exp2l(long double); + +#define FP_ILOGB0 ((int)0x80000000) +#define FP_ILOGBNAN ((int)0x80000000) + extern int __cdecl ilogb (double); + extern int __cdecl ilogbf (float); + extern int __cdecl ilogbl (long double); + + extern double __cdecl log1p(double); + extern float __cdecl log1pf(float); + extern long double __cdecl log1pl(long double); + + extern double __cdecl log2 (double); + extern float __cdecl log2f (float); + extern long double __cdecl log2l (long double); + + extern double __cdecl logb (double); + extern float __cdecl logbf (float); + extern long double __cdecl logbl (long double); + + __CRT_INLINE double __cdecl logb (double x) + { + double res; + __asm__ ("fxtract\n\t" + "fstp %%st" : "=t" (res) : "0" (x)); + return res; + } + + __CRT_INLINE float __cdecl logbf (float x) + { + float res; + __asm__ ("fxtract\n\t" + "fstp %%st" : "=t" (res) : "0" (x)); + return res; + } + + __CRT_INLINE long double __cdecl logbl (long double x) + { + long double res; + __asm__ ("fxtract\n\t" + "fstp %%st" : "=t" (res) : "0" (x)); + return res; + } + + extern long double __cdecl modfl (long double, long double*); + + /* 7.12.6.13 */ + extern double __cdecl scalbn (double, int); + extern float __cdecl scalbnf (float, int); + extern long double __cdecl scalbnl (long double, int); + + extern double __cdecl scalbln (double, long); + extern float __cdecl scalblnf (float, long); + extern long double __cdecl scalblnl (long double, long); + + /* 7.12.7.1 */ + /* Implementations adapted from Cephes versions */ + extern double __cdecl cbrt (double); + extern float __cdecl cbrtf (float); + extern long double __cdecl cbrtl (long double); + + __CRT_INLINE float __cdecl hypotf (float x, float y) + { return (float) hypot (x, y);} + extern long double __cdecl hypotl (long double, long double); + + extern long double __cdecl powl (long double, long double); + extern long double __cdecl expl(long double); + extern long double __cdecl expm1l(long double); + extern long double __cdecl coshl(long double); + extern long double __cdecl fabsl (long double); + extern long double __cdecl acosl(long double); + extern long double __cdecl asinl(long double); + extern long double __cdecl atanl(long double); + extern long double __cdecl atan2l(long double,long double); + extern long double __cdecl sinhl(long double); + extern long double __cdecl tanhl(long double); + + /* 7.12.8.1 The erf functions */ + extern double __cdecl erf (double); + extern float __cdecl erff (float); + /* TODO + extern long double __cdecl erfl (long double); + */ + + /* 7.12.8.2 The erfc functions */ + extern double __cdecl erfc (double); + extern float __cdecl erfcf (float); + /* TODO + extern long double __cdecl erfcl (long double); + */ + + /* 7.12.8.3 The lgamma functions */ + extern double __cdecl lgamma (double); + extern float __cdecl lgammaf (float); + extern long double __cdecl lgammal (long double); + + /* 7.12.8.4 The tgamma functions */ + extern double __cdecl tgamma (double); + extern float __cdecl tgammaf (float); + extern long double __cdecl tgammal (long double); + + extern long double __cdecl ceill (long double); + extern long double __cdecl floorl (long double); + extern long double __cdecl frexpl(long double,int *); + extern long double __cdecl log10l(long double); + extern long double __cdecl logl(long double); + extern long double __cdecl cosl(long double); + extern long double __cdecl sinl(long double); + extern long double __cdecl tanl(long double); + extern long double sqrtl(long double); + + /* 7.12.9.3 */ + extern double __cdecl nearbyint ( double); + extern float __cdecl nearbyintf (float); + extern long double __cdecl nearbyintl (long double); + + /* 7.12.9.4 */ + /* round, using fpu control word settings */ + __CRT_INLINE double __cdecl rint (double x) + { + double retval; + __asm__ ( + "fldl %1\n" + "frndint \n" + "fstl %0\n" : "=m" (retval) : "m" (x)); + return retval; + } + + __CRT_INLINE float __cdecl rintf (float x) + { + float retval; + __asm__ ( + "flds %1\n" + "frndint \n" + "fsts %0\n" : "=m" (retval) : "m" (x)); + return retval; + } + + __CRT_INLINE long double __cdecl rintl (long double x) + { + long double retval; + __asm__ ( + "fldt %1\n" + "frndint \n" + "fstt %0\n" : "=m" (retval) : "m" (x)); + return retval; + } + + /* 7.12.9.5 */ + __CRT_INLINE long __cdecl lrint (double x) + { + long retval; + __asm__ __volatile__ \ + ("fldl %1\n" \ + "fistpl %0" : "=m" (retval) : "m" (x)); \ + return retval; + } + + __CRT_INLINE long __cdecl lrintf (float x) + { + long retval; + __asm__ __volatile__ \ + ("flds %1\n" \ + "fistpl %0" : "=m" (retval) : "m" (x)); \ + return retval; + } + + __CRT_INLINE long __cdecl lrintl (long double x) + { + long retval; + __asm__ __volatile__ \ + ("fldt %1\n" \ + "fistpl %0" : "=m" (retval) : "m" (x)); \ + return retval; + } + + __CRT_INLINE long long __cdecl llrint (double x) + { + long long retval; + __asm__ __volatile__ \ + ("fldl %1\n" \ + "fistpll %0" : "=m" (retval) : "m" (x)); \ + return retval; + } + + __CRT_INLINE long long __cdecl llrintf (float x) + { + long long retval; + __asm__ __volatile__ \ + ("flds %1\n" \ + "fistpll %0" : "=m" (retval) : "m" (x)); \ + return retval; + } + + __CRT_INLINE long long __cdecl llrintl (long double x) + { + long long retval; + __asm__ __volatile__ \ + ("fldt %1\n" \ + "fistpll %0" : "=m" (retval) : "m" (x)); \ + return retval; + } + + #define FE_TONEAREST 0x0000 + #define FE_DOWNWARD 0x0400 + #define FE_UPWARD 0x0800 + #define FE_TOWARDZERO 0x0c00 + + __CRT_INLINE double trunc (double _x) + { + double retval; + unsigned short saved_cw; + unsigned short tmp_cw; + __asm__ ("fnstcw %0;" : "=m" (saved_cw)); /* save FPU control word */ + tmp_cw = (saved_cw & ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)) + | FE_TOWARDZERO; + __asm__ ("fldcw %0;" : : "m" (tmp_cw)); + __asm__ ("fldl %1;" + "frndint;" + "fstl %0;" : "=m" (retval) : "m" (_x)); /* round towards zero */ + __asm__ ("fldcw %0;" : : "m" (saved_cw) ); /* restore saved control word */ + return retval; + } + + /* 7.12.9.6 */ + /* round away from zero, regardless of fpu control word settings */ + extern double __cdecl round (double); + extern float __cdecl roundf (float); + extern long double __cdecl roundl (long double); + + /* 7.12.9.7 */ + extern long __cdecl lround (double); + extern long __cdecl lroundf (float); + extern long __cdecl lroundl (long double); + + extern long long __cdecl llround (double); + extern long long __cdecl llroundf (float); + extern long long __cdecl llroundl (long double); + + /* 7.12.9.8 */ + /* round towards zero, regardless of fpu control word settings */ + extern double __cdecl trunc (double); + extern float __cdecl truncf (float); + extern long double __cdecl truncl (long double); + + extern long double __cdecl fmodl (long double, long double); + + /* 7.12.10.2 */ + extern double __cdecl remainder (double, double); + extern float __cdecl remainderf (float, float); + extern long double __cdecl remainderl (long double, long double); + + /* 7.12.10.3 */ + extern double __cdecl remquo(double, double, int *); + extern float __cdecl remquof(float, float, int *); + extern long double __cdecl remquol(long double, long double, int *); + + /* 7.12.11.1 */ + extern double __cdecl copysign (double, double); /* in libmoldname.a */ + extern float __cdecl copysignf (float, float); + extern long double __cdecl copysignl (long double, long double); + + /* 7.12.11.2 Return a NaN */ + extern double __cdecl nan(const char *tagp); + extern float __cdecl nanf(const char *tagp); + extern long double __cdecl nanl(const char *tagp); + +#ifndef __STRICT_ANSI__ +#define _nan() nan("") +#define _nanf() nanf("") +#define _nanl() nanl("") +#endif + + /* 7.12.11.3 */ + extern double __cdecl nextafter (double, double); /* in libmoldname.a */ + extern float __cdecl nextafterf (float, float); + extern long double __cdecl nextafterl (long double, long double); + + /* 7.12.11.4 The nexttoward functions: TODO */ + + /* 7.12.12.1 */ + /* x > y ? (x - y) : 0.0 */ + extern double __cdecl fdim (double x, double y); + extern float __cdecl fdimf (float x, float y); + extern long double __cdecl fdiml (long double x, long double y); + + /* fmax and fmin. + NaN arguments are treated as missing data: if one argument is a NaN + and the other numeric, then these functions choose the numeric + value. */ + + /* 7.12.12.2 */ + extern double __cdecl fmax (double, double); + extern float __cdecl fmaxf (float, float); + extern long double __cdecl fmaxl (long double, long double); + + /* 7.12.12.3 */ + extern double __cdecl fmin (double, double); + extern float __cdecl fminf (float, float); + extern long double __cdecl fminl (long double, long double); + + /* 7.12.13.1 */ + /* return x * y + z as a ternary op */ + extern double __cdecl fma (double, double, double); + extern float __cdecl fmaf (float, float, float); + extern long double __cdecl fmal (long double, long double, long double); + + +#if 0 // gr: duplicate, see below + /* 7.12.14 */ + /* + * With these functions, comparisons involving quiet NaNs set the FP + * condition code to "unordered". The IEEE floating-point spec + * dictates that the result of floating-point comparisons should be + * false whenever a NaN is involved, with the exception of the != op, + * which always returns true: yes, (NaN != NaN) is true). + */ + +#if __GNUC__ >= 3 + +#define isgreater(x, y) __builtin_isgreater(x, y) +#define isgreaterequal(x, y) __builtin_isgreaterequal(x, y) +#define isless(x, y) __builtin_isless(x, y) +#define islessequal(x, y) __builtin_islessequal(x, y) +#define islessgreater(x, y) __builtin_islessgreater(x, y) +#define isunordered(x, y) __builtin_isunordered(x, y) + +#else + /* helper */ + __CRT_INLINE int __cdecl + __fp_unordered_compare (long double x, long double y){ + unsigned short retval; + __asm__ ("fucom %%st(1);" + "fnstsw;": "=a" (retval) : "t" (x), "u" (y)); + return retval; + } + +#define isgreater(x, y) ((__fp_unordered_compare(x, y) \ + & 0x4500) == 0) +#define isless(x, y) ((__fp_unordered_compare (y, x) \ + & 0x4500) == 0) +#define isgreaterequal(x, y) ((__fp_unordered_compare (x, y) \ + & FP_INFINITE) == 0) +#define islessequal(x, y) ((__fp_unordered_compare(y, x) \ + & FP_INFINITE) == 0) +#define islessgreater(x, y) ((__fp_unordered_compare(x, y) \ + & FP_SUBNORMAL) == 0) +#define isunordered(x, y) ((__fp_unordered_compare(x, y) \ + & 0x4500) == 0x4500) + +#endif +#endif //0 + + +#endif /* __STDC_VERSION__ >= 199901L */ +#endif /* __NO_ISOCEXT */ + +#ifdef __cplusplus +} +extern "C++" { + template inline _Ty _Pow_int(_Ty _X,int _Y) { + unsigned int _N; + if(_Y >= 0) _N = (unsigned int)_Y; + else _N = (unsigned int)(-_Y); + for(_Ty _Z = _Ty(1);;_X *= _X) { + if((_N & 1)!=0) _Z *= _X; + if((_N >>= 1)==0) return (_Y < 0 ? _Ty(1) / _Z : _Z); + } + } +} +#endif + +#pragma pack(pop) + +/* 7.12.14 */ +/* + * With these functions, comparisons involving quiet NaNs set the FP + * condition code to "unordered". The IEEE floating-point spec + * dictates that the result of floating-point comparisons should be + * false whenever a NaN is involved, with the exception of the != op, + * which always returns true: yes, (NaN != NaN) is true). + */ + +/* Mini libm (inline __fpclassify*, __signbit* and variants) */ + +/* TCC uses 8 bytes for double and long double, so effectively the l variants + * are never used. For now, they just run the normal (double) variant. + */ + +/* + * most of the code in this file is taken from MUSL rs-1.0 (MIT license) + * - musl-libc: http://git.musl-libc.org/cgit/musl/tree/src/math?h=rs-1.0 + * - License: http://git.musl-libc.org/cgit/musl/tree/COPYRIGHT?h=rs-1.0 + */ + +/******************************************************************************* + Start of code based on MUSL +*******************************************************************************/ +/* +musl as a whole is licensed under the following standard MIT license: + +---------------------------------------------------------------------- +Copyright © 2005-2014 Rich Felker, et al. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +---------------------------------------------------------------------- +*/ + +/* fpclassify */ + +__CRT_INLINE int __cdecl __fpclassify (double x) { + union {double f; uint64_t i;} u = {x}; + int e = u.i>>52 & 0x7ff; + if (!e) return u.i<<1 ? FP_SUBNORMAL : FP_ZERO; + if (e==0x7ff) return u.i<<12 ? FP_NAN : FP_INFINITE; + return FP_NORMAL; +} + +__CRT_INLINE int __cdecl __fpclassifyf (float x) { + union {float f; uint32_t i;} u = {x}; + int e = u.i>>23 & 0xff; + if (!e) return u.i<<1 ? FP_SUBNORMAL : FP_ZERO; + if (e==0xff) return u.i<<9 ? FP_NAN : FP_INFINITE; + return FP_NORMAL; +} + +__CRT_INLINE int __cdecl __fpclassifyl (long double x) { + return __fpclassify(x); +} + + +/* signbit */ + +__CRT_INLINE int __cdecl __signbit (double x) { + union {double d; uint64_t i;} y = { x }; + return y.i>>63; +} + +__CRT_INLINE int __cdecl __signbitf (float x) { + union {float f; uint32_t i; } y = { x }; + return y.i>>31; +} + +__CRT_INLINE int __cdecl __signbitl (long double x) { + return __signbit(x); +} + + +/* fmin*, fmax* */ + +#define TCCFP_FMIN_EVAL (isnan(x) ? y : \ + isnan(y) ? x : \ + (signbit(x) != signbit(y)) ? (signbit(x) ? x : y) : \ + x < y ? x : y) + +__CRT_INLINE double __cdecl fmin (double x, double y) { + return TCCFP_FMIN_EVAL; +} + +__CRT_INLINE float __cdecl fminf (float x, float y) { + return TCCFP_FMIN_EVAL; +} + +__CRT_INLINE long double __cdecl fminl (long double x, long double y) { + return TCCFP_FMIN_EVAL; +} + +#define TCCFP_FMAX_EVAL (isnan(x) ? y : \ + isnan(y) ? x : \ + (signbit(x) != signbit(y)) ? (signbit(x) ? y : x) : \ + x < y ? y : x) + +__CRT_INLINE double __cdecl fmax (double x, double y) { + return TCCFP_FMAX_EVAL; +} + +__CRT_INLINE float __cdecl fmaxf (float x, float y) { + return TCCFP_FMAX_EVAL; +} + +__CRT_INLINE long double __cdecl fmaxl (long double x, long double y) { + return TCCFP_FMAX_EVAL; +} + + +/* *round* */ + +#define TCCFP_FORCE_EVAL(x) do { \ +if (sizeof(x) == sizeof(float)) { \ + volatile float __x; \ + __x = (x); \ +} else if (sizeof(x) == sizeof(double)) { \ + volatile double __x; \ + __x = (x); \ +} else { \ + volatile long double __x; \ + __x = (x); \ +} \ +} while(0) + +__CRT_INLINE double __cdecl round (double x) { + union {double f; uint64_t i;} u = {x}; + int e = u.i >> 52 & 0x7ff; + double y; + + if (e >= 0x3ff+52) + return x; + if (u.i >> 63) + x = -x; + if (e < 0x3ff-1) { + /* raise inexact if x!=0 */ + TCCFP_FORCE_EVAL(x + 0x1p52); + return 0*u.f; + } + y = (double)(x + 0x1p52) - 0x1p52 - x; + if (y > 0.5) + y = y + x - 1; + else if (y <= -0.5) + y = y + x + 1; + else + y = y + x; + if (u.i >> 63) + y = -y; + return y; +} + +__CRT_INLINE long __cdecl lround (double x) { + return round(x); +} + +__CRT_INLINE long long __cdecl llround (double x) { + return round(x); +} + +__CRT_INLINE float __cdecl roundf (float x) { + return round(x); +} + +__CRT_INLINE long __cdecl lroundf (float x) { + return round(x); +} + +__CRT_INLINE long long __cdecl llroundf (float x) { + return round(x); +} + +__CRT_INLINE long double __cdecl roundl (long double x) { + return round(x); +} + +__CRT_INLINE long __cdecl lroundl (long double x) { + return round(x); +} + +__CRT_INLINE long long __cdecl llroundl (long double x) { + return round(x); +} + + + +#endif /* End _MATH_H_ */ + diff --git a/colorchord2/windows/mmsystem.h b/colorchord2/windows/mmsystem.h new file mode 100644 index 0000000..3eb06a4 --- /dev/null +++ b/colorchord2/windows/mmsystem.h @@ -0,0 +1,1950 @@ + +#ifndef _MMSYSTEM_H +#define _MMSYSTEM_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif +#pragma pack(push,1) +#ifdef __cplusplus +extern "C" { +#endif + +#if defined( TCC ) || defined (TinyCC) || defined(TINYCC) +#define _STRUCT_NAME(x) x +typedef UINT* LPUINT; +#endif + +#define WINMMAPI DECLSPEC_IMPORT +#define _loadds +#define _huge +#define MAXPNAMELEN 32 +#define MAXERRORLENGTH 256 +#define MAX_JOYSTICKOEMVXDNAME 260 +#define _MMRESULT_ +#define TIME_MS 1 +#define TIME_SAMPLES 2 +#define TIME_BYTES 4 +#define TIME_SMPTE 8 +#define TIME_MIDI 16 +#define TIME_TICKS 32 +#define MAKEFOURCC(c0,c1,c2,c3) ((DWORD)(BYTE)(c0)|((DWORD)(BYTE)(c1)<<8)|((DWORD)(BYTE)(c2)<<16)|((DWORD)(BYTE)(c3)<<24)) +#ifndef mmioFOURCC +#define mmioFOURCC(c0,c1,c2,c3) MAKEFOURCC(c0,c1,c2,c3) +#endif +#define MM_JOY1MOVE 0x3A0 +#define MM_JOY2MOVE 0x3A1 +#define MM_JOY1ZMOVE 0x3A2 +#define MM_JOY2ZMOVE 0x3A3 +#define MM_JOY1BUTTONDOWN 0x3B5 +#define MM_JOY2BUTTONDOWN 0x3B6 +#define MM_JOY1BUTTONUP 0x3B7 +#define MM_JOY2BUTTONUP 0x3B8 +#define MM_MCINOTIFY 0x3B9 +#define MM_WOM_OPEN 0x3BB +#define MM_WOM_CLOSE 0x3BC +#define MM_WOM_DONE 0x3BD +#define MM_WIM_OPEN 0x3BE +#define MM_WIM_CLOSE 0x3BF +#define MM_WIM_DATA 0x3C0 +#define MM_MIM_OPEN 0x3C1 +#define MM_MIM_CLOSE 0x3C2 +#define MM_MIM_DATA 0x3C3 +#define MM_MIM_LONGDATA 0x3C4 +#define MM_MIM_ERROR 0x3C5 +#define MM_MIM_LONGERROR 0x3C6 +#define MM_MOM_OPEN 0x3C7 +#define MM_MOM_CLOSE 0x3C8 +#define MM_MOM_DONE 0x3C9 +#define MM_DRVM_OPEN 0x3D0 +#define MM_DRVM_CLOSE 0x3D1 +#define MM_DRVM_DATA 0x3D2 +#define MM_DRVM_ERROR 0x3D3 +#define MM_STREAM_OPEN 0x3D4 +#define MM_STREAM_CLOSE 0x3D5 +#define MM_STREAM_DONE 0x3D6 +#define MM_STREAM_ERROR 0x3D7 +#define MM_MOM_POSITIONCB 0x3CA +#define MM_MCISIGNAL 0x3CB +#define MM_MIM_MOREDATA 0x3CC +#define MM_MIXM_LINE_CHANGE 0x3D0 +#define MM_MIXM_CONTROL_CHANGE 0x3D1 +#define MMSYSERR_BASE 0 +#define WAVERR_BASE 32 +#define MIDIERR_BASE 64 +#define TIMERR_BASE 96 +#define JOYERR_BASE 160 +#define MCIERR_BASE 256 +#define MIXERR_BASE 1024 +#define MCI_STRING_OFFSET 512 +#define MCI_VD_OFFSET 1024 +#define MCI_CD_OFFSET 1088 +#define MCI_WAVE_OFFSET 1152 +#define MCI_SEQ_OFFSET 1216 +#define MMSYSERR_NOERROR 0 +#define MMSYSERR_ERROR (MMSYSERR_BASE+1) +#define MMSYSERR_BADDEVICEID (MMSYSERR_BASE+2) +#define MMSYSERR_NOTENABLED (MMSYSERR_BASE+3) +#define MMSYSERR_ALLOCATED (MMSYSERR_BASE+4) +#define MMSYSERR_INVALHANDLE (MMSYSERR_BASE+5) +#define MMSYSERR_NODRIVER (MMSYSERR_BASE+6) +#define MMSYSERR_NOMEM (MMSYSERR_BASE+7) +#define MMSYSERR_NOTSUPPORTED (MMSYSERR_BASE+8) +#define MMSYSERR_BADERRNUM (MMSYSERR_BASE+9) +#define MMSYSERR_INVALFLAG (MMSYSERR_BASE+10) +#define MMSYSERR_INVALPARAM (MMSYSERR_BASE+11) +#define MMSYSERR_HANDLEBUSY (MMSYSERR_BASE+12) +#define MMSYSERR_INVALIDALIAS (MMSYSERR_BASE+13) +#define MMSYSERR_BADDB (MMSYSERR_BASE+14) +#define MMSYSERR_KEYNOTFOUND (MMSYSERR_BASE+15) +#define MMSYSERR_READERROR (MMSYSERR_BASE+16) +#define MMSYSERR_WRITEERROR (MMSYSERR_BASE+17) +#define MMSYSERR_DELETEERROR (MMSYSERR_BASE+18) +#define MMSYSERR_VALNOTFOUND (MMSYSERR_BASE+19) +#define MMSYSERR_NODRIVERCB (MMSYSERR_BASE+20) +#define MMSYSERR_LASTERROR (MMSYSERR_BASE+20) +#define DRV_LOAD 1 +#define DRV_ENABLE 2 +#define DRV_OPEN 3 +#define DRV_CLOSE 4 +#define DRV_DISABLE 5 +#define DRV_FREE 6 +#define DRV_CONFIGURE 7 +#define DRV_QUERYCONFIGURE 8 +#define DRV_INSTALL 9 +#define DRV_REMOVE 10 +#define DRV_EXITSESSION 11 +#define DRV_POWER 15 +#define DRV_RESERVED 0x800 +#define DRV_USER 0x4000 +#define DRVCNF_CANCEL 0 +#define DRVCNF_OK 1 +#define DRVCNF_RESTART 2 +#define DRV_CANCEL DRVCNF_CANCEL +#define DRV_OK DRVCNF_OK +#define DRV_RESTART DRVCNF_RESTART +#define DRV_MCI_FIRST DRV_RESERVED +#define DRV_MCI_LAST (DRV_RESERVED+0xFFF) +#define CALLBACK_TYPEMASK 0x70000 +#define CALLBACK_NULL 0 +#define CALLBACK_WINDOW 0x10000 +#define CALLBACK_TASK 0x20000 +#define CALLBACK_FUNCTION 0x30000 +#define CALLBACK_THREAD CALLBACK_TASK +#define CALLBACK_EVENT 0x50000 +#define SND_SYNC 0 +#define SND_ASYNC 1 +#define SND_NODEFAULT 2 +#define SND_MEMORY 4 +#define SND_LOOP 8 +#define SND_NOSTOP 16 +#define SND_NOWAIT 0x2000 +#define SND_ALIAS 0x10000 +#define SND_ALIAS_ID 0x110000 +#define SND_FILENAME 0x20000 +#define SND_RESOURCE 0x40004 +#define SND_PURGE 0x40 +#define SND_APPLICATION 0x80 +#define SND_ALIAS_START 0 +#define sndAlias(c0,c1) (SND_ALIAS_START+(DWORD)(BYTE)(c0)|((DWORD)(BYTE)(c1)<<8)) +#define SND_ALIAS_SYSTEMASTERISK sndAlias('S','*') +#define SND_ALIAS_SYSTEMQUESTION sndAlias('S','?') +#define SND_ALIAS_SYSTEMHAND sndAlias('S','H') +#define SND_ALIAS_SYSTEMEXIT sndAlias('S','E') +#define SND_ALIAS_SYSTEMSTART sndAlias('S','S') +#define SND_ALIAS_SYSTEMWELCOME sndAlias('S','W') +#define SND_ALIAS_SYSTEMEXCLAMATION sndAlias('S','!') +#define SND_ALIAS_SYSTEMDEFAULT sndAlias('S','D') +#define WAVERR_BADFORMAT (WAVERR_BASE + 0) +#define WAVERR_STILLPLAYING (WAVERR_BASE + 1) +#define WAVERR_UNPREPARED (WAVERR_BASE + 2) +#define WAVERR_SYNC (WAVERR_BASE + 3) +#define WAVERR_LASTERROR (WAVERR_BASE + 3) +#define WOM_OPEN MM_WOM_OPEN +#define WOM_CLOSE MM_WOM_CLOSE +#define WOM_DONE MM_WOM_DONE +#define WIM_OPEN MM_WIM_OPEN +#define WIM_CLOSE MM_WIM_CLOSE +#define WIM_DATA MM_WIM_DATA +#define WAVE_MAPPER ((UINT)-1) +#define WAVE_FORMAT_QUERY 1 +#define WAVE_ALLOWSYNC 2 +#define WAVE_MAPPED 4 +#define WAVE_FORMAT_DIRECT 8 +#define WAVE_FORMAT_DIRECT_QUERY (WAVE_FORMAT_QUERY|WAVE_FORMAT_DIRECT) +#define WHDR_DONE 1 +#define WHDR_PREPARED 2 +#define WHDR_BEGINLOOP 4 +#define WHDR_ENDLOOP 8 +#define WHDR_INQUEUE 16 +#define WAVECAPS_PITCH 1 +#define WAVECAPS_PLAYBACKRATE 2 +#define WAVECAPS_VOLUME 4 +#define WAVECAPS_LRVOLUME 8 +#define WAVECAPS_SYNC 16 +#define WAVECAPS_SAMPLEACCURATE 32 +#define WAVECAPS_DIRECTSOUND 64 +#define WAVE_INVALIDFORMAT 0 +#define WAVE_FORMAT_1M08 1 +#define WAVE_FORMAT_1S08 2 +#define WAVE_FORMAT_1M16 4 +#define WAVE_FORMAT_1S16 8 +#define WAVE_FORMAT_2M08 16 +#define WAVE_FORMAT_2S08 32 +#define WAVE_FORMAT_2M16 64 +#define WAVE_FORMAT_2S16 128 +#define WAVE_FORMAT_4M08 256 +#define WAVE_FORMAT_4S08 512 +#define WAVE_FORMAT_4M16 1024 +#define WAVE_FORMAT_4S16 2048 +#define WAVE_FORMAT_PCM 1 +#define WAVE_FORMAT_EXTENSIBLE 0xFFFE +#define MIDIERR_UNPREPARED MIDIERR_BASE +#define MIDIERR_STILLPLAYING (MIDIERR_BASE+1) +#define MIDIERR_NOMAP (MIDIERR_BASE+2) +#define MIDIERR_NOTREADY (MIDIERR_BASE+3) +#define MIDIERR_NODEVICE (MIDIERR_BASE+4) +#define MIDIERR_INVALIDSETUP (MIDIERR_BASE+5) +#define MIDIERR_BADOPENMODE (MIDIERR_BASE+6) +#define MIDIERR_DONT_CONTINUE (MIDIERR_BASE+7) +#define MIDIERR_LASTERROR (MIDIERR_BASE+7) +#define MIDIPATCHSIZE 128 +#define MIM_OPEN MM_MIM_OPEN +#define MIM_CLOSE MM_MIM_CLOSE +#define MIM_DATA MM_MIM_DATA +#define MIM_LONGDATA MM_MIM_LONGDATA +#define MIM_ERROR MM_MIM_ERROR +#define MIM_LONGERROR MM_MIM_LONGERROR +#define MOM_OPEN MM_MOM_OPEN +#define MOM_CLOSE MM_MOM_CLOSE +#define MOM_DONE MM_MOM_DONE +#define MIM_MOREDATA MM_MIM_MOREDATA +#define MOM_POSITIONCB MM_MOM_POSITIONCB +#define MIDIMAPPER ((UINT)-1) +#define MIDI_MAPPER ((UINT)-1) +#define MIDI_IO_STATUS 32 +#define MIDI_CACHE_ALL 1 +#define MIDI_CACHE_BESTFIT 2 +#define MIDI_CACHE_QUERY 3 +#define MIDI_UNCACHE 4 +#define MOD_MIDIPORT 1 +#define MOD_SYNTH 2 +#define MOD_SQSYNTH 3 +#define MOD_FMSYNTH 4 +#define MOD_MAPPER 5 +#define MIDICAPS_VOLUME 1 +#define MIDICAPS_LRVOLUME 2 +#define MIDICAPS_CACHE 4 +#define MIDICAPS_STREAM 8 +#define MHDR_DONE 1 +#define MHDR_PREPARED 2 +#define MHDR_INQUEUE 4 +#define MHDR_ISSTRM 8 +#define MEVT_F_SHORT 0 +#define MEVT_F_LONG 0x80000000 +#define MEVT_F_CALLBACK 0x40000000 +#define MEVT_EVENTTYPE(x) ((BYTE)(((x)>>24)&0xFF)) +#define MEVT_EVENTPARM(x) ((DWORD)((x)&0xFFFFFFL)) +#define MEVT_SHORTMSG 0 +#define MEVT_TEMPO 1 +#define MEVT_NOP 2 +#define MEVT_LONGMSG ((BYTE)0x80) +#define MEVT_COMMENT ((BYTE)0x82) +#define MEVT_VERSION ((BYTE)0x84) +#define MIDISTRM_ERROR (-2) +#define MIDIPROP_SET 0x80000000 +#define MIDIPROP_GET 0x40000000 +#define MIDIPROP_TIMEDIV 1 +#define MIDIPROP_TEMPO 2 +#define AUX_MAPPER ((UINT)-1) +#define AUXCAPS_CDAUDIO 1 +#define AUXCAPS_AUXIN 2 +#define AUXCAPS_VOLUME 1 +#define AUXCAPS_LRVOLUME 2 +#define MIXER_SHORT_NAME_CHARS 16 +#define MIXER_LONG_NAME_CHARS 64 +#define MIXERR_INVALLINE MIXERR_BASE +#define MIXERR_INVALCONTROL (MIXERR_BASE+1) +#define MIXERR_INVALVALUE (MIXERR_BASE+2) +#define MIXERR_LASTERROR (MIXERR_BASE+2) +#define MIXER_OBJECTF_HANDLE 0x80000000 +#define MIXER_OBJECTF_MIXER 0 +#define MIXER_OBJECTF_HMIXER (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIXER) +#define MIXER_OBJECTF_WAVEOUT 0x10000000 +#define MIXER_OBJECTF_HWAVEOUT (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEOUT) +#define MIXER_OBJECTF_WAVEIN 0x20000000 +#define MIXER_OBJECTF_HWAVEIN (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEIN) +#define MIXER_OBJECTF_MIDIOUT 0x30000000 +#define MIXER_OBJECTF_HMIDIOUT (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIOUT) +#define MIXER_OBJECTF_MIDIIN 0x40000000 +#define MIXER_OBJECTF_HMIDIIN (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIIN) +#define MIXER_OBJECTF_AUX 0x50000000 +#define MIXERLINE_LINEF_ACTIVE 1 +#define MIXERLINE_LINEF_DISCONNECTED 0x8000 +#define MIXERLINE_LINEF_SOURCE 0x80000000 +#define MIXERLINE_COMPONENTTYPE_DST_FIRST 0 +#define MIXERLINE_COMPONENTTYPE_DST_UNDEFINED MIXERLINE_COMPONENTTYPE_DST_FIRST +#define MIXERLINE_COMPONENTTYPE_DST_DIGITAL (MIXERLINE_COMPONENTTYPE_DST_FIRST+1) +#define MIXERLINE_COMPONENTTYPE_DST_LINE (MIXERLINE_COMPONENTTYPE_DST_FIRST+2) +#define MIXERLINE_COMPONENTTYPE_DST_MONITOR (MIXERLINE_COMPONENTTYPE_DST_FIRST+3) +#define MIXERLINE_COMPONENTTYPE_DST_SPEAKERS (MIXERLINE_COMPONENTTYPE_DST_FIRST+4) +#define MIXERLINE_COMPONENTTYPE_DST_HEADPHONES (MIXERLINE_COMPONENTTYPE_DST_FIRST+5) +#define MIXERLINE_COMPONENTTYPE_DST_TELEPHONE (MIXERLINE_COMPONENTTYPE_DST_FIRST+6) +#define MIXERLINE_COMPONENTTYPE_DST_WAVEIN (MIXERLINE_COMPONENTTYPE_DST_FIRST+7) +#define MIXERLINE_COMPONENTTYPE_DST_VOICEIN (MIXERLINE_COMPONENTTYPE_DST_FIRST+8) +#define MIXERLINE_COMPONENTTYPE_DST_LAST (MIXERLINE_COMPONENTTYPE_DST_FIRST+8) +#define MIXERLINE_COMPONENTTYPE_SRC_FIRST 0x1000 +#define MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED MIXERLINE_COMPONENTTYPE_SRC_FIRST +#define MIXERLINE_COMPONENTTYPE_SRC_DIGITAL (MIXERLINE_COMPONENTTYPE_SRC_FIRST+1) +#define MIXERLINE_COMPONENTTYPE_SRC_LINE (MIXERLINE_COMPONENTTYPE_SRC_FIRST+2) +#define MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE (MIXERLINE_COMPONENTTYPE_SRC_FIRST+3) +#define MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER (MIXERLINE_COMPONENTTYPE_SRC_FIRST+4) +#define MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC (MIXERLINE_COMPONENTTYPE_SRC_FIRST+5) +#define MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE (MIXERLINE_COMPONENTTYPE_SRC_FIRST+6) +#define MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER (MIXERLINE_COMPONENTTYPE_SRC_FIRST+7) +#define MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT (MIXERLINE_COMPONENTTYPE_SRC_FIRST+8) +#define MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY (MIXERLINE_COMPONENTTYPE_SRC_FIRST+9) +#define MIXERLINE_COMPONENTTYPE_SRC_ANALOG (MIXERLINE_COMPONENTTYPE_SRC_FIRST+10) +#define MIXERLINE_COMPONENTTYPE_SRC_LAST (MIXERLINE_COMPONENTTYPE_SRC_FIRST+10) +#define MIXERLINE_TARGETTYPE_UNDEFINED 0 +#define MIXERLINE_TARGETTYPE_WAVEOUT 1 +#define MIXERLINE_TARGETTYPE_WAVEIN 2 +#define MIXERLINE_TARGETTYPE_MIDIOUT 3 +#define MIXERLINE_TARGETTYPE_MIDIIN 4 +#define MIXERLINE_TARGETTYPE_AUX 5 +#define MIXER_GETLINEINFOF_DESTINATION 0 +#define MIXER_GETLINEINFOF_SOURCE 1 +#define MIXER_GETLINEINFOF_LINEID 2 +#define MIXER_GETLINEINFOF_COMPONENTTYPE 3 +#define MIXER_GETLINEINFOF_TARGETTYPE 4 +#define MIXER_GETLINEINFOF_QUERYMASK 15 +#define MIXERCONTROL_CONTROLF_UNIFORM 1 +#define MIXERCONTROL_CONTROLF_MULTIPLE 2 +#define MIXERCONTROL_CONTROLF_DISABLED 0x80000000 +#define MIXERCONTROL_CT_CLASS_MASK 0xF0000000 +#define MIXERCONTROL_CT_CLASS_CUSTOM 0 +#define MIXERCONTROL_CT_CLASS_METER 0x10000000 +#define MIXERCONTROL_CT_CLASS_SWITCH 0x20000000 +#define MIXERCONTROL_CT_CLASS_NUMBER 0x30000000 +#define MIXERCONTROL_CT_CLASS_SLIDER 0x40000000 +#define MIXERCONTROL_CT_CLASS_FADER 0x50000000 +#define MIXERCONTROL_CT_CLASS_TIME 0x60000000 +#define MIXERCONTROL_CT_CLASS_LIST 0x70000000 +#define MIXERCONTROL_CT_SUBCLASS_MASK 0xF000000 +#define MIXERCONTROL_CT_SC_SWITCH_BOOLEAN 0 +#define MIXERCONTROL_CT_SC_SWITCH_BUTTON 0x1000000 +#define MIXERCONTROL_CT_SC_METER_POLLED 0 +#define MIXERCONTROL_CT_SC_TIME_MICROSECS 0 +#define MIXERCONTROL_CT_SC_TIME_MILLISECS 0x1000000 +#define MIXERCONTROL_CT_SC_LIST_SINGLE 0 +#define MIXERCONTROL_CT_SC_LIST_MULTIPLE 0x1000000 +#define MIXERCONTROL_CT_UNITS_MASK 0xFF0000 +#define MIXERCONTROL_CT_UNITS_CUSTOM 0 +#define MIXERCONTROL_CT_UNITS_BOOLEAN 0x10000 +#define MIXERCONTROL_CT_UNITS_SIGNED 0x20000 +#define MIXERCONTROL_CT_UNITS_UNSIGNED 0x30000 +#define MIXERCONTROL_CT_UNITS_DECIBELS 0x40000 +#define MIXERCONTROL_CT_UNITS_PERCENT 0x50000 +#define MIXERCONTROL_CONTROLTYPE_CUSTOM (MIXERCONTROL_CT_CLASS_CUSTOM|MIXERCONTROL_CT_UNITS_CUSTOM) +#define MIXERCONTROL_CONTROLTYPE_BOOLEANMETER (MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_SIGNEDMETER (MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_SIGNED) +#define MIXERCONTROL_CONTROLTYPE_PEAKMETER (MIXERCONTROL_CONTROLTYPE_SIGNEDMETER+1) +#define MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER (MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXERCONTROL_CONTROLTYPE_BOOLEAN (MIXERCONTROL_CT_CLASS_SWITCH|MIXERCONTROL_CT_SC_SWITCH_BOOLEAN|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_ONOFF (MIXERCONTROL_CONTROLTYPE_BOOLEAN+1) +#define MIXERCONTROL_CONTROLTYPE_MUTE (MIXERCONTROL_CONTROLTYPE_BOOLEAN+2) +#define MIXERCONTROL_CONTROLTYPE_MONO (MIXERCONTROL_CONTROLTYPE_BOOLEAN+3) +#define MIXERCONTROL_CONTROLTYPE_LOUDNESS (MIXERCONTROL_CONTROLTYPE_BOOLEAN+4) +#define MIXERCONTROL_CONTROLTYPE_STEREOENH (MIXERCONTROL_CONTROLTYPE_BOOLEAN+5) +#define MIXERCONTROL_CONTROLTYPE_BUTTON (MIXERCONTROL_CT_CLASS_SWITCH|MIXERCONTROL_CT_SC_SWITCH_BUTTON|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_DECIBELS (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_DECIBELS) +#define MIXERCONTROL_CONTROLTYPE_SIGNED (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_SIGNED) +#define MIXERCONTROL_CONTROLTYPE_UNSIGNED (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXERCONTROL_CONTROLTYPE_PERCENT (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_PERCENT) +#define MIXERCONTROL_CONTROLTYPE_SLIDER (MIXERCONTROL_CT_CLASS_SLIDER|MIXERCONTROL_CT_UNITS_SIGNED) +#define MIXERCONTROL_CONTROLTYPE_PAN (MIXERCONTROL_CONTROLTYPE_SLIDER+1) +#define MIXERCONTROL_CONTROLTYPE_QSOUNDPAN (MIXERCONTROL_CONTROLTYPE_SLIDER+2) +#define MIXERCONTROL_CONTROLTYPE_FADER (MIXERCONTROL_CT_CLASS_FADER|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXERCONTROL_CONTROLTYPE_VOLUME (MIXERCONTROL_CONTROLTYPE_FADER+1) +#define MIXERCONTROL_CONTROLTYPE_BASS (MIXERCONTROL_CONTROLTYPE_FADER+2) +#define MIXERCONTROL_CONTROLTYPE_TREBLE (MIXERCONTROL_CONTROLTYPE_FADER+3) +#define MIXERCONTROL_CONTROLTYPE_EQUALIZER (MIXERCONTROL_CONTROLTYPE_FADER+4) +#define MIXERCONTROL_CONTROLTYPE_SINGLESELECT (MIXERCONTROL_CT_CLASS_LIST|MIXERCONTROL_CT_SC_LIST_SINGLE|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_MUX (MIXERCONTROL_CONTROLTYPE_SINGLESELECT+1) +#define MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT (MIXERCONTROL_CT_CLASS_LIST|MIXERCONTROL_CT_SC_LIST_MULTIPLE|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_MIXER (MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT+1) +#define MIXERCONTROL_CONTROLTYPE_MICROTIME (MIXERCONTROL_CT_CLASS_TIME|MIXERCONTROL_CT_SC_TIME_MICROSECS|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXERCONTROL_CONTROLTYPE_MILLITIME (MIXERCONTROL_CT_CLASS_TIME|MIXERCONTROL_CT_SC_TIME_MILLISECS|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXER_GETLINECONTROLSF_ALL 0 +#define MIXER_GETLINECONTROLSF_ONEBYID 1 +#define MIXER_GETLINECONTROLSF_ONEBYTYPE 2 +#define MIXER_GETLINECONTROLSF_QUERYMASK 15 +#define MIXER_GETCONTROLDETAILSF_VALUE 0 +#define MIXER_GETCONTROLDETAILSF_LISTTEXT 1 +#define MIXER_GETCONTROLDETAILSF_QUERYMASK 15 +#define MIXER_SETCONTROLDETAILSF_VALUE 0 +#define MIXER_SETCONTROLDETAILSF_CUSTOM 1 +#define MIXER_SETCONTROLDETAILSF_QUERYMASK 15 +#define TIMERR_NOERROR 0 +#define TIMERR_NOCANDO (TIMERR_BASE+1) +#define TIMERR_STRUCT (TIMERR_BASE+33) +#define TIME_ONESHOT 0 +#define TIME_PERIODIC 1 +#define TIME_CALLBACK_FUNCTION 0 +#define TIME_CALLBACK_EVENT_SET 16 +#define TIME_CALLBACK_EVENT_PULSE 32 +#if (WINVER >= 0x0501) +#define TIME_KILL_SYNCHRONOUS 0x0100 +#endif +#define JOYERR_NOERROR (0) +#define JOYERR_PARMS (JOYERR_BASE+5) +#define JOYERR_NOCANDO (JOYERR_BASE+6) +#define JOYERR_UNPLUGGED (JOYERR_BASE+7) +#define JOY_BUTTON1 1 +#define JOY_BUTTON2 2 +#define JOY_BUTTON3 4 +#define JOY_BUTTON4 8 +#define JOY_BUTTON1CHG 256 +#define JOY_BUTTON2CHG 512 +#define JOY_BUTTON3CHG 1024 +#define JOY_BUTTON4CHG 2048 +#define JOY_BUTTON5 257 +#define JOY_BUTTON6 513 +#define JOY_BUTTON7 1025 +#define JOY_BUTTON8 2049 +#define JOY_BUTTON9 256 +#define JOY_BUTTON10 512 +#define JOY_BUTTON11 1024 +#define JOY_BUTTON12 2048 +#define JOY_BUTTON13 4096 +#define JOY_BUTTON14 8192 +#define JOY_BUTTON15 16384 +#define JOY_BUTTON16 32768 +#define JOY_BUTTON17 65536 +#define JOY_BUTTON18 0x20000 +#define JOY_BUTTON19 0x40000 +#define JOY_BUTTON20 0x80000 +#define JOY_BUTTON21 0x100000 +#define JOY_BUTTON22 0x200000 +#define JOY_BUTTON23 0x400000 +#define JOY_BUTTON24 0x800000 +#define JOY_BUTTON25 0x1000000 +#define JOY_BUTTON26 0x2000000 +#define JOY_BUTTON27 0x4000000 +#define JOY_BUTTON28 0x8000000 +#define JOY_BUTTON29 0x10000000 +#define JOY_BUTTON30 0x20000000 +#define JOY_BUTTON31 0x40000000 +#define JOY_BUTTON32 0x80000000 +#define JOY_POVCENTERED ((WORD)-1) +#define JOY_POVFORWARD 0 +#define JOY_POVRIGHT 9000 +#define JOY_POVBACKWARD 18000 +#define JOY_POVLEFT 27000 +#define JOY_RETURNX 1 +#define JOY_RETURNY 2 +#define JOY_RETURNZ 4l +#define JOY_RETURNR 8 +#define JOY_RETURNU 16 +#define JOY_RETURNV 32 +#define JOY_RETURNPOV 64 +#define JOY_RETURNBUTTONS 128 +#define JOY_RETURNRAWDATA 256 +#define JOY_RETURNPOVCTS 512 +#define JOY_RETURNCENTERED 1024 +#define JOY_USEDEADZONE 2048 +#define JOY_RETURNALL (JOY_RETURNX|JOY_RETURNY|JOY_RETURNZ|JOY_RETURNR|JOY_RETURNU|JOY_RETURNV|JOY_RETURNPOV|JOY_RETURNBUTTONS) +#define JOY_CAL_READALWAYS 0x10000 +#define JOY_CAL_READXYONLY 0x20000 +#define JOY_CAL_READ3 0x40000 +#define JOY_CAL_READ4 0x80000 +#define JOY_CAL_READXONLY 0x100000 +#define JOY_CAL_READYONLY 0x200000 +#define JOY_CAL_READ5 0x400000 +#define JOY_CAL_READ6 0x800000 +#define JOY_CAL_READZONLY 0x1000000 +#define JOY_CAL_READRONLY 0x2000000 +#define JOY_CAL_READUONLY 0x4000000 +#define JOY_CAL_READVONLY 0x8000000 +#define JOYSTICKID1 0 +#define JOYSTICKID2 1 +#define JOYCAPS_HASZ 1 +#define JOYCAPS_HASR 2 +#define JOYCAPS_HASU 4 +#define JOYCAPS_HASV 8 +#define JOYCAPS_HASPOV 16 +#define JOYCAPS_POV4DIR 32 +#define JOYCAPS_POVCTS 64 +#define MMIOERR_BASE 256 +#define MMIOERR_FILENOTFOUND (MMIOERR_BASE+1) +#define MMIOERR_OUTOFMEMORY (MMIOERR_BASE+2) +#define MMIOERR_CANNOTOPEN (MMIOERR_BASE+3) +#define MMIOERR_CANNOTCLOSE (MMIOERR_BASE+4) +#define MMIOERR_CANNOTREAD (MMIOERR_BASE+5) +#define MMIOERR_CANNOTWRITE (MMIOERR_BASE+6) +#define MMIOERR_CANNOTSEEK (MMIOERR_BASE+7) +#define MMIOERR_CANNOTEXPAND (MMIOERR_BASE+8) +#define MMIOERR_CHUNKNOTFOUND (MMIOERR_BASE+9) +#define MMIOERR_UNBUFFERED (MMIOERR_BASE+10) +#define MMIOERR_PATHNOTFOUND (MMIOERR_BASE+11) +#define MMIOERR_ACCESSDENIED (MMIOERR_BASE+12) +#define MMIOERR_SHARINGVIOLATION (MMIOERR_BASE+13) +#define MMIOERR_NETWORKERROR (MMIOERR_BASE+14) +#define MMIOERR_TOOMANYOPENFILES (MMIOERR_BASE+15) +#define MMIOERR_INVALIDFILE (MMIOERR_BASE+16) +#define CFSEPCHAR '+' +#define MMIO_RWMODE 3 +#define MMIO_SHAREMODE 0x70 +#define MMIO_CREATE 0x1000 +#define MMIO_PARSE 256 +#define MMIO_DELETE 512 +#define MMIO_EXIST 0x4000 +#define MMIO_ALLOCBUF 0x10000 +#define MMIO_GETTEMP 0x20000 +#define MMIO_DIRTY 0x10000000 +#define MMIO_READ 0 +#define MMIO_WRITE 1 +#define MMIO_READWRITE 2 +#define MMIO_COMPAT 0 +#define MMIO_EXCLUSIVE 16 +#define MMIO_DENYWRITE 32 +#define MMIO_DENYREAD 0x30 +#define MMIO_DENYNONE 64 +#define MMIO_FHOPEN 16 +#define MMIO_EMPTYBUF 16 +#define MMIO_TOUPPER 16 +#define MMIO_INSTALLPROC 0x10000 +#define MMIO_GLOBALPROC 0x10000000 +#define MMIO_REMOVEPROC 0x20000 +#define MMIO_UNICODEPROC 0x1000000 +#define MMIO_FINDPROC 0x40000 +#define MMIO_FINDCHUNK 16 +#define MMIO_FINDRIFF 32 +#define MMIO_FINDLIST 64 +#define MMIO_CREATERIFF 32 +#define MMIO_CREATELIST 64 +#define MMIOM_READ MMIO_READ +#define MMIOM_WRITE MMIO_WRITE +#define MMIOM_SEEK 2 +#define MMIOM_OPEN 3 +#define MMIOM_CLOSE 4 +#define MMIOM_WRITEFLUSH 5 +#define MMIOM_RENAME 6 +#define MMIOM_USER 0x8000 +#define FOURCC_RIFF mmioFOURCC('R', 'I', 'F', 'F') +#define FOURCC_LIST mmioFOURCC('L', 'I', 'S', 'T') +#define FOURCC_DOS mmioFOURCC('D', 'O', 'S', ' ') +#define FOURCC_MEM mmioFOURCC('M', 'E', 'M', ' ') +#define MMIO_DEFAULTBUFFER 8192 +#define MCIERR_INVALID_DEVICE_ID (MCIERR_BASE+1) +#define MCIERR_UNRECOGNIZED_KEYWORD (MCIERR_BASE+3) +#define MCIERR_UNRECOGNIZED_COMMAND (MCIERR_BASE+5) +#define MCIERR_HARDWARE (MCIERR_BASE+6) +#define MCIERR_INVALID_DEVICE_NAME (MCIERR_BASE+7) +#define MCIERR_OUT_OF_MEMORY (MCIERR_BASE+8) +#define MCIERR_DEVICE_OPEN (MCIERR_BASE+9) +#define MCIERR_CANNOT_LOAD_DRIVER (MCIERR_BASE+10) +#define MCIERR_MISSING_COMMAND_STRING (MCIERR_BASE+11) +#define MCIERR_PARAM_OVERFLOW (MCIERR_BASE+12) +#define MCIERR_MISSING_STRING_ARGUMENT (MCIERR_BASE+13) +#define MCIERR_BAD_INTEGER (MCIERR_BASE+14) +#define MCIERR_PARSER_INTERNAL (MCIERR_BASE+15) +#define MCIERR_DRIVER_INTERNAL (MCIERR_BASE+16) +#define MCIERR_MISSING_PARAMETER (MCIERR_BASE+17) +#define MCIERR_UNSUPPORTED_FUNCTION (MCIERR_BASE+18) +#define MCIERR_FILE_NOT_FOUND (MCIERR_BASE+19) +#define MCIERR_DEVICE_NOT_READY (MCIERR_BASE+20) +#define MCIERR_INTERNAL (MCIERR_BASE+21) +#define MCIERR_DRIVER (MCIERR_BASE+22) +#define MCIERR_CANNOT_USE_ALL (MCIERR_BASE+23) +#define MCIERR_MULTIPLE (MCIERR_BASE+24) +#define MCIERR_EXTENSION_NOT_FOUND (MCIERR_BASE+25) +#define MCIERR_OUTOFRANGE (MCIERR_BASE+26) +#define MCIERR_FLAGS_NOT_COMPATIBLE (MCIERR_BASE+28) +#define MCIERR_FILE_NOT_SAVED (MCIERR_BASE+30) +#define MCIERR_DEVICE_TYPE_REQUIRED (MCIERR_BASE+31) +#define MCIERR_DEVICE_LOCKED (MCIERR_BASE+32) +#define MCIERR_DUPLICATE_ALIAS (MCIERR_BASE+33) +#define MCIERR_BAD_CONSTANT (MCIERR_BASE+34) +#define MCIERR_MUST_USE_SHAREABLE (MCIERR_BASE+35) +#define MCIERR_MISSING_DEVICE_NAME (MCIERR_BASE+36) +#define MCIERR_BAD_TIME_FORMAT (MCIERR_BASE+37) +#define MCIERR_NO_CLOSING_QUOTE (MCIERR_BASE+38) +#define MCIERR_DUPLICATE_FLAGS (MCIERR_BASE+39) +#define MCIERR_INVALID_FILE (MCIERR_BASE+40) +#define MCIERR_NULL_PARAMETER_BLOCK (MCIERR_BASE+41) +#define MCIERR_UNNAMED_RESOURCE (MCIERR_BASE+42) +#define MCIERR_NEW_REQUIRES_ALIAS (MCIERR_BASE+43) +#define MCIERR_NOTIFY_ON_AUTO_OPEN (MCIERR_BASE+44) +#define MCIERR_NO_ELEMENT_ALLOWED (MCIERR_BASE+45) +#define MCIERR_NONAPPLICABLE_FUNCTION (MCIERR_BASE+46) +#define MCIERR_ILLEGAL_FOR_AUTO_OPEN (MCIERR_BASE+47) +#define MCIERR_FILENAME_REQUIRED (MCIERR_BASE+48) +#define MCIERR_EXTRA_CHARACTERS (MCIERR_BASE+49) +#define MCIERR_DEVICE_NOT_INSTALLED (MCIERR_BASE+50) +#define MCIERR_GET_CD (MCIERR_BASE+51) +#define MCIERR_SET_CD (MCIERR_BASE+52) +#define MCIERR_SET_DRIVE (MCIERR_BASE+53) +#define MCIERR_DEVICE_LENGTH (MCIERR_BASE+54) +#define MCIERR_DEVICE_ORD_LENGTH (MCIERR_BASE+55) +#define MCIERR_NO_INTEGER (MCIERR_BASE+56) +#define MCIERR_WAVE_OUTPUTSINUSE (MCIERR_BASE+64) +#define MCIERR_WAVE_SETOUTPUTINUSE (MCIERR_BASE+65) +#define MCIERR_WAVE_INPUTSINUSE (MCIERR_BASE+66) +#define MCIERR_WAVE_SETINPUTINUSE (MCIERR_BASE+67) +#define MCIERR_WAVE_OUTPUTUNSPECIFIED (MCIERR_BASE+68) +#define MCIERR_WAVE_INPUTUNSPECIFIED (MCIERR_BASE+69) +#define MCIERR_WAVE_OUTPUTSUNSUITABLE (MCIERR_BASE+70) +#define MCIERR_WAVE_SETOUTPUTUNSUITABLE (MCIERR_BASE+71) +#define MCIERR_WAVE_INPUTSUNSUITABLE (MCIERR_BASE+72) +#define MCIERR_WAVE_SETINPUTUNSUITABLE (MCIERR_BASE+73) +#define MCIERR_SEQ_DIV_INCOMPATIBLE (MCIERR_BASE+80) +#define MCIERR_SEQ_PORT_INUSE (MCIERR_BASE+81) +#define MCIERR_SEQ_PORT_NONEXISTENT (MCIERR_BASE+82) +#define MCIERR_SEQ_PORT_MAPNODEVICE (MCIERR_BASE+83) +#define MCIERR_SEQ_PORT_MISCERROR (MCIERR_BASE+84) +#define MCIERR_SEQ_TIMER (MCIERR_BASE+85) +#define MCIERR_SEQ_PORTUNSPECIFIED (MCIERR_BASE+86) +#define MCIERR_SEQ_NOMIDIPRESENT (MCIERR_BASE+87) +#define MCIERR_NO_WINDOW (MCIERR_BASE+90) +#define MCIERR_CREATEWINDOW (MCIERR_BASE+91) +#define MCIERR_FILE_READ (MCIERR_BASE+92) +#define MCIERR_FILE_WRITE (MCIERR_BASE+93) +#define MCIERR_NO_IDENTITY (MCIERR_BASE+94) +#define MCIERR_CUSTOM_DRIVER_BASE (MCIERR_BASE+256) +#define MCI_FIRST DRV_MCI_FIRST +#define MCI_OPEN 0x803 +#define MCI_CLOSE 0x804 +#define MCI_ESCAPE 0x805 +#define MCI_PLAY 0x806 +#define MCI_SEEK 0x807 +#define MCI_STOP 0x808 +#define MCI_PAUSE 0x809 +#define MCI_INFO 0x80A +#define MCI_GETDEVCAPS 0x80B +#define MCI_SPIN 0x80C +#define MCI_SET 0x80D +#define MCI_STEP 0x80E +#define MCI_RECORD 0x80F +#define MCI_SYSINFO 0x810 +#define MCI_BREAK 0x811 +#define MCI_SAVE 0x813 +#define MCI_STATUS 0x814 +#define MCI_CUE 0x830 +#define MCI_REALIZE 0x840 +#define MCI_WINDOW 0x841 +#define MCI_PUT 0x842 +#define MCI_WHERE 0x843 +#define MCI_FREEZE 0x844 +#define MCI_UNFREEZE 0x845 +#define MCI_LOAD 0x850 +#define MCI_CUT 0x851 +#define MCI_COPY 0x852 +#define MCI_PASTE 0x853 +#define MCI_UPDATE 0x854 +#define MCI_RESUME 0x855 +#define MCI_DELETE 0x856 +#define MCI_USER_MESSAGES (DRV_MCI_FIRST+0x400) +#define MCI_LAST 0xFFF +#define MCI_ALL_DEVICE_ID ((MCIDEVICEID)-1) +#define MCI_DEVTYPE_VCR 513 +#define MCI_DEVTYPE_VIDEODISC 514 +#define MCI_DEVTYPE_OVERLAY 515 +#define MCI_DEVTYPE_CD_AUDIO 516 +#define MCI_DEVTYPE_DAT 517 +#define MCI_DEVTYPE_SCANNER 518 +#define MCI_DEVTYPE_ANIMATION 519 +#define MCI_DEVTYPE_DIGITAL_VIDEO 520 +#define MCI_DEVTYPE_OTHER 521 +#define MCI_DEVTYPE_WAVEFORM_AUDIO 522 +#define MCI_DEVTYPE_SEQUENCER 523 +#define MCI_DEVTYPE_FIRST MCI_DEVTYPE_VCR +#define MCI_DEVTYPE_LAST MCI_DEVTYPE_SEQUENCER +#define MCI_DEVTYPE_FIRST_USER 0x1000 +#define MCI_MODE_NOT_READY (MCI_STRING_OFFSET+12) +#define MCI_MODE_STOP (MCI_STRING_OFFSET+13) +#define MCI_MODE_PLAY (MCI_STRING_OFFSET+14) +#define MCI_MODE_RECORD (MCI_STRING_OFFSET+15) +#define MCI_MODE_SEEK (MCI_STRING_OFFSET+16) +#define MCI_MODE_PAUSE (MCI_STRING_OFFSET+17) +#define MCI_MODE_OPEN (MCI_STRING_OFFSET+18) +#define MCI_FORMAT_MILLISECONDS 0 +#define MCI_FORMAT_HMS 1 +#define MCI_FORMAT_MSF 2 +#define MCI_FORMAT_FRAMES 3 +#define MCI_FORMAT_SMPTE_24 4 +#define MCI_FORMAT_SMPTE_25 5 +#define MCI_FORMAT_SMPTE_30 6 +#define MCI_FORMAT_SMPTE_30DROP 7 +#define MCI_FORMAT_BYTES 8 +#define MCI_FORMAT_SAMPLES 9 +#define MCI_FORMAT_TMSF 10 +#define MCI_MSF_MINUTE(t) ((BYTE)(t)) +#define MCI_MSF_SECOND(t) ((BYTE)(((WORD)(t))>>8)) +#define MCI_MSF_FRAME(t) ((BYTE)((t)>>16)) +#define MCI_MAKE_MSF(m,s,f) ((DWORD)(((BYTE)(m)|((WORD)(s)<<8))|(((DWORD)(BYTE)(f))<<16))) +#define MCI_TMSF_TRACK(t) ((BYTE)(t)) +#define MCI_TMSF_MINUTE(t) ((BYTE)(((WORD)(t))>>8)) +#define MCI_TMSF_SECOND(t) ((BYTE)((t)>>16)) +#define MCI_TMSF_FRAME(t) ((BYTE)((t)>>24)) +#define MCI_MAKE_TMSF(t,m,s,f) ((DWORD)(((BYTE)(t)|((WORD)(m)<<8))|(((DWORD)(BYTE)(s)|((WORD)(f)<<8))<<16))) +#define MCI_HMS_HOUR(t) ((BYTE)(t)) +#define MCI_HMS_MINUTE(t) ((BYTE)(((WORD)(t))>>8)) +#define MCI_HMS_SECOND(t) ((BYTE)((t)>>16)) +#define MCI_MAKE_HMS(h,m,s) ((DWORD)(((BYTE)(h)|((WORD)(m)<<8))|(((DWORD)(BYTE)(s))<<16))) +#define MCI_NOTIFY_SUCCESSFUL 1 +#define MCI_NOTIFY_SUPERSEDED 2 +#define MCI_NOTIFY_ABORTED 4 +#define MCI_NOTIFY_FAILURE 8 +#define MCI_NOTIFY 1 +#define MCI_WAIT 2 +#define MCI_FROM 4 +#define MCI_TO 8 +#define MCI_TRACK 16 +#define MCI_OPEN_SHAREABLE 256 +#define MCI_OPEN_ELEMENT 512 +#define MCI_OPEN_ALIAS 1024 +#define MCI_OPEN_ELEMENT_ID 2048 +#define MCI_OPEN_TYPE_ID 0x1000 +#define MCI_OPEN_TYPE 0x2000 +#define MCI_SEEK_TO_START 256 +#define MCI_SEEK_TO_END 512 +#define MCI_STATUS_ITEM 256 +#define MCI_STATUS_START 512 +#define MCI_STATUS_LENGTH 1 +#define MCI_STATUS_POSITION 2 +#define MCI_STATUS_NUMBER_OF_TRACKS 3 +#define MCI_STATUS_MODE 4 +#define MCI_STATUS_MEDIA_PRESENT 5 +#define MCI_STATUS_TIME_FORMAT 6 +#define MCI_STATUS_READY 7 +#define MCI_STATUS_CURRENT_TRACK 8 +#define MCI_INFO_PRODUCT 256 +#define MCI_INFO_FILE 512 +#define MCI_INFO_MEDIA_UPC 1024 +#define MCI_INFO_MEDIA_IDENTITY 2048 +#define MCI_INFO_NAME 0x1000 +#define MCI_INFO_COPYRIGHT 0x2000 +#define MCI_GETDEVCAPS_ITEM 256 +#define MCI_GETDEVCAPS_CAN_RECORD 1 +#define MCI_GETDEVCAPS_HAS_AUDIO 2 +#define MCI_GETDEVCAPS_HAS_VIDEO 3 +#define MCI_GETDEVCAPS_DEVICE_TYPE 4 +#define MCI_GETDEVCAPS_USES_FILES 5 +#define MCI_GETDEVCAPS_COMPOUND_DEVICE 6 +#define MCI_GETDEVCAPS_CAN_EJECT 7 +#define MCI_GETDEVCAPS_CAN_PLAY 8 +#define MCI_GETDEVCAPS_CAN_SAVE 9 +#define MCI_SYSINFO_QUANTITY 256 +#define MCI_SYSINFO_OPEN 512 +#define MCI_SYSINFO_NAME 1024 +#define MCI_SYSINFO_INSTALLNAME 2048 +#define MCI_SET_DOOR_OPEN 256 +#define MCI_SET_DOOR_CLOSED 512 +#define MCI_SET_TIME_FORMAT 1024 +#define MCI_SET_AUDIO 2048 +#define MCI_SET_VIDEO 0x1000 +#define MCI_SET_ON 0x2000 +#define MCI_SET_OFF 0x4000 +#define MCI_SET_AUDIO_ALL 0 +#define MCI_SET_AUDIO_LEFT 1 +#define MCI_SET_AUDIO_RIGHT 2 +#define MCI_BREAK_KEY 256 +#define MCI_BREAK_HWND 512 +#define MCI_BREAK_OFF 1024 +#define MCI_RECORD_INSERT 256 +#define MCI_RECORD_OVERWRITE 512 +#define MCI_SAVE_FILE 256 +#define MCI_LOAD_FILE 256 +#define MCI_VD_MODE_PARK (MCI_VD_OFFSET+1) +#define MCI_VD_MEDIA_CLV (MCI_VD_OFFSET+2) +#define MCI_VD_MEDIA_CAV (MCI_VD_OFFSET+3) +#define MCI_VD_MEDIA_OTHER (MCI_VD_OFFSET+4) +#define MCI_VD_FORMAT_TRACK 0x4001 +#define MCI_VD_PLAY_REVERSE 0x10000 +#define MCI_VD_PLAY_FAST 0x20000 +#define MCI_VD_PLAY_SPEED 0x40000 +#define MCI_VD_PLAY_SCAN 0x80000 +#define MCI_VD_PLAY_SLOW 0x100000 +#define MCI_VD_SEEK_REVERSE 0x10000 +#define MCI_VD_STATUS_SPEED 0x4002 +#define MCI_VD_STATUS_FORWARD 0x4003 +#define MCI_VD_STATUS_MEDIA_TYPE 0x4004 +#define MCI_VD_STATUS_SIDE 0x4005 +#define MCI_VD_STATUS_DISC_SIZE 0x4006 +#define MCI_VD_GETDEVCAPS_CLV 0x10000 +#define MCI_VD_GETDEVCAPS_CAV 0x20000 +#define MCI_VD_SPIN_UP 0x10000 +#define MCI_VD_SPIN_DOWN 0x20000 +#define MCI_VD_GETDEVCAPS_CAN_REVERSE 0x4002 +#define MCI_VD_GETDEVCAPS_FAST_RATE 0x4003 +#define MCI_VD_GETDEVCAPS_SLOW_RATE 0x4004 +#define MCI_VD_GETDEVCAPS_NORMAL_RATE 0x4005 +#define MCI_VD_STEP_FRAMES 0x10000 +#define MCI_VD_STEP_REVERSE 0x20000 +#define MCI_VD_ESCAPE_STRING 256 +#define MCI_CDA_STATUS_TYPE_TRACK 0x4001 +#define MCI_CDA_TRACK_AUDIO MCI_CD_OFFSET +#define MCI_CDA_TRACK_OTHER (MCI_CD_OFFSET+1) +#define MCI_WAVE_PCM MCI_WAVE_OFFSET +#define MCI_WAVE_MAPPER (MCI_WAVE_OFFSET+1) +#define MCI_WAVE_OPEN_BUFFER 0x10000 +#define MCI_WAVE_SET_FORMATTAG 0x10000 +#define MCI_WAVE_SET_CHANNELS 0x20000 +#define MCI_WAVE_SET_SAMPLESPERSEC 0x40000 +#define MCI_WAVE_SET_AVGBYTESPERSEC 0x80000 +#define MCI_WAVE_SET_BLOCKALIGN 0x100000 +#define MCI_WAVE_SET_BITSPERSAMPLE 0x200000 +#define MCI_WAVE_INPUT 0x400000 +#define MCI_WAVE_OUTPUT 0x800000 +#define MCI_WAVE_STATUS_FORMATTAG 0x4001 +#define MCI_WAVE_STATUS_CHANNELS 0x4002 +#define MCI_WAVE_STATUS_SAMPLESPERSEC 0x4003 +#define MCI_WAVE_STATUS_AVGBYTESPERSEC 0x4004 +#define MCI_WAVE_STATUS_BLOCKALIGN 0x4005 +#define MCI_WAVE_STATUS_BITSPERSAMPLE 0x4006 +#define MCI_WAVE_STATUS_LEVEL 0x4007 +#define MCI_WAVE_SET_ANYINPUT 0x4000000 +#define MCI_WAVE_SET_ANYOUTPUT 0x8000000 +#define MCI_WAVE_GETDEVCAPS_INPUTS 0x4001 +#define MCI_WAVE_GETDEVCAPS_OUTPUTS 0x4002 +#define MCI_SEQ_DIV_PPQN MCI_SEQ_OFFSET +#define MCI_SEQ_DIV_SMPTE_24 (MCI_SEQ_OFFSET+1) +#define MCI_SEQ_DIV_SMPTE_25 (MCI_SEQ_OFFSET+2) +#define MCI_SEQ_DIV_SMPTE_30DROP (MCI_SEQ_OFFSET+3) +#define MCI_SEQ_DIV_SMPTE_30 (MCI_SEQ_OFFSET+4) +#define MCI_SEQ_FORMAT_SONGPTR 0x4001 +#define MCI_SEQ_FILE 0x4002 +#define MCI_SEQ_MIDI 0x4003 +#define MCI_SEQ_SMPTE 0x4004 +#define MCI_SEQ_NONE 65533 +#define MCI_SEQ_MAPPER 65535 +#define MCI_SEQ_STATUS_TEMPO 0x4002 +#define MCI_SEQ_STATUS_PORT 0x4003 +#define MCI_SEQ_STATUS_SLAVE 0x4007 +#define MCI_SEQ_STATUS_MASTER 0x4008 +#define MCI_SEQ_STATUS_OFFSET 0x4009 +#define MCI_SEQ_STATUS_DIVTYPE 0x400A +#define MCI_SEQ_STATUS_NAME 0x400B +#define MCI_SEQ_STATUS_COPYRIGHT 0x400C +#define MCI_SEQ_SET_TEMPO 0x10000 +#define MCI_SEQ_SET_PORT 0x20000 +#define MCI_SEQ_SET_SLAVE 0x40000 +#define MCI_SEQ_SET_MASTER 0x80000 +#define MCI_SEQ_SET_OFFSET 0x1000000 +#define MCI_ANIM_OPEN_WS 0x10000 +#define MCI_ANIM_OPEN_PARENT 0x20000 +#define MCI_ANIM_OPEN_NOSTATIC 0x40000 +#define MCI_ANIM_PLAY_SPEED 0x10000 +#define MCI_ANIM_PLAY_REVERSE 0x20000 +#define MCI_ANIM_PLAY_FAST 0x40000 +#define MCI_ANIM_PLAY_SLOW 0x80000 +#define MCI_ANIM_PLAY_SCAN 0x100000 +#define MCI_ANIM_STEP_REVERSE 0x10000 +#define MCI_ANIM_STEP_FRAMES 0x20000 +#define MCI_ANIM_STATUS_SPEED 0x4001 +#define MCI_ANIM_STATUS_FORWARD 0x4002 +#define MCI_ANIM_STATUS_HWND 0x4003 +#define MCI_ANIM_STATUS_HPAL 0x4004 +#define MCI_ANIM_STATUS_STRETCH 0x4005 +#define MCI_ANIM_INFO_TEXT 0x10000 +#define MCI_ANIM_GETDEVCAPS_CAN_REVERSE 0x4001 +#define MCI_ANIM_GETDEVCAPS_FAST_RATE 0x4002 +#define MCI_ANIM_GETDEVCAPS_SLOW_RATE 0x4003 +#define MCI_ANIM_GETDEVCAPS_NORMAL_RATE 0x4004 +#define MCI_ANIM_GETDEVCAPS_PALETTES 0x4006 +#define MCI_ANIM_GETDEVCAPS_CAN_STRETCH 0x4007 +#define MCI_ANIM_GETDEVCAPS_MAX_WINDOWS 0x4008 +#define MCI_ANIM_REALIZE_NORM 0x10000 +#define MCI_ANIM_REALIZE_BKGD 0x20000 +#define MCI_ANIM_WINDOW_HWND 0x10000 +#define MCI_ANIM_WINDOW_STATE 0x40000 +#define MCI_ANIM_WINDOW_TEXT 0x80000 +#define MCI_ANIM_WINDOW_ENABLE_STRETCH 0x100000 +#define MCI_ANIM_WINDOW_DISABLE_STRETCH 0x200000 +#define MCI_ANIM_WINDOW_DEFAULT 0xL +#define MCI_ANIM_RECT 0x10000 +#define MCI_ANIM_PUT_SOURCE 0x20000 +#define MCI_ANIM_PUT_DESTINATION 0x40000 +#define MCI_ANIM_WHERE_SOURCE 0x20000 +#define MCI_ANIM_WHERE_DESTINATION 0x40000 +#define MCI_ANIM_UPDATE_HDC 0x20000 +#define MCI_OVLY_OPEN_WS 0x10000 +#define MCI_OVLY_OPEN_PARENT 0x20000 +#define MCI_OVLY_STATUS_HWND 0x4001 +#define MCI_OVLY_STATUS_STRETCH 0x4002 +#define MCI_OVLY_INFO_TEXT 0x10000 +#define MCI_OVLY_GETDEVCAPS_CAN_STRETCH 0x4001 +#define MCI_OVLY_GETDEVCAPS_CAN_FREEZE 0x4002 +#define MCI_OVLY_GETDEVCAPS_MAX_WINDOWS 0x4003 +#define MCI_OVLY_WINDOW_HWND 0x10000 +#define MCI_OVLY_WINDOW_STATE 0x40000 +#define MCI_OVLY_WINDOW_TEXT 0x80000 +#define MCI_OVLY_WINDOW_ENABLE_STRETCH 0x100000 +#define MCI_OVLY_WINDOW_DISABLE_STRETCH 0x200000 +#define MCI_OVLY_WINDOW_DEFAULT 0xL +#define MCI_OVLY_RECT 0x10000 +#define MCI_OVLY_PUT_SOURCE 0x20000 +#define MCI_OVLY_PUT_DESTINATION 0x40000 +#define MCI_OVLY_PUT_FRAME 0x80000 +#define MCI_OVLY_PUT_VIDEO 0x100000 +#define MCI_OVLY_WHERE_SOURCE 0x20000 +#define MCI_OVLY_WHERE_DESTINATION 0x40000 +#define MCI_OVLY_WHERE_FRAME 0x80000 +#define MCI_OVLY_WHERE_VIDEO 0x100000 +#define NEWTRANSPARENT 3 +#define QUERYROPSUPPORT 40 +#define SELECTDIB 41 +#define DIBINDEX(n) MAKELONG((n),0x10FF) +#define SC_SCREENSAVE 0xF140 +#define CAPS1 94 +#define C1_TRANSPARENT 1 +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +typedef DWORD MCIERROR; +typedef UINT MCIDEVICEID; +typedef UINT(CALLBACK *YIELDPROC)(MCIDEVICEID,DWORD); +typedef UINT MMVERSION; +typedef UINT MMRESULT; +typedef struct mmtime_tag { + UINT wType; + union { + DWORD ms; + DWORD sample; + DWORD cb; + DWORD ticks; + struct { + BYTE hour; + BYTE min; + BYTE sec; + BYTE frame; + BYTE fps; + BYTE dummy; + BYTE pad[2]; + } smpte; + struct { + DWORD songptrpos; + } midi; + } u; +} MMTIME,*PMMTIME,*LPMMTIME; +DECLARE_HANDLE(HDRVR); +typedef struct tagDRVCONFIGINFO { + DWORD dwDCISize; + LPCWSTR lpszDCISectionName; + LPCWSTR lpszDCIAliasName; +} DRVCONFIGINFO,*PDRVCONFIGINFO,*LPDRVCONFIGINFO; +typedef struct DRVCONFIGINFOEX { + DWORD dwDCISize; + LPCWSTR lpszDCISectionName; + LPCWSTR lpszDCIAliasName; + DWORD dnDevNode; +} DRVCONFIGINFOEX,*PDRVCONFIGINFOEX,*LPDRVCONFIGINFOEX; +typedef LRESULT(CALLBACK* DRIVERPROC)(DWORD,HDRVR,UINT,LPARAM,LPARAM); +typedef void (CALLBACK DRVCALLBACK)(HDRVR,UINT,DWORD,DWORD,DWORD); +typedef DRVCALLBACK *LPDRVCALLBACK; +typedef DRVCALLBACK *PDRVCALLBACK; +DECLARE_HANDLE(HWAVE); +DECLARE_HANDLE(HWAVEIN); +DECLARE_HANDLE(HWAVEOUT); +typedef HWAVEIN *LPHWAVEIN; +typedef HWAVEOUT *LPHWAVEOUT; +typedef DRVCALLBACK WAVECALLBACK; +typedef WAVECALLBACK *LPWAVECALLBACK; +typedef struct wavehdr_tag { + LPSTR lpData; + DWORD dwBufferLength; + DWORD dwBytesRecorded; + DWORD dwUser; + DWORD dwFlags; + DWORD dwLoops; + struct wavehdr_tag *lpNext; + DWORD reserved; +} WAVEHDR,*PWAVEHDR,*LPWAVEHDR; +typedef struct tagWAVEOUTCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + DWORD dwFormats; + WORD wChannels; + WORD wReserved1; + DWORD dwSupport; +} WAVEOUTCAPSA,*PWAVEOUTCAPSA,*LPWAVEOUTCAPSA; +typedef struct tagWAVEOUTCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + DWORD dwFormats; + WORD wChannels; + WORD wReserved1; + DWORD dwSupport; +} WAVEOUTCAPSW,*PWAVEOUTCAPSW,*LPWAVEOUTCAPSW; +typedef struct tagWAVEINCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + DWORD dwFormats; + WORD wChannels; + WORD wReserved1; +} WAVEINCAPSA,*PWAVEINCAPSA,*LPWAVEINCAPSA; +typedef struct tagWAVEINCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + DWORD dwFormats; + WORD wChannels; + WORD wReserved1; +} WAVEINCAPSW,*PWAVEINCAPSW,*LPWAVEINCAPSW; +typedef struct waveformat_tag { + WORD wFormatTag; + WORD nChannels; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; +} WAVEFORMAT,*PWAVEFORMAT,*LPWAVEFORMAT; +typedef struct pcmwaveformat_tag { + WAVEFORMAT wf; + WORD wBitsPerSample; +} PCMWAVEFORMAT, *PPCMWAVEFORMAT,*LPPCMWAVEFORMAT; +#ifndef _LPCWAVEFORMATEX_DEFINED +#define _LPCWAVEFORMATEX_DEFINED +#define _WAVEFORMATEX_ +typedef struct tWAVEFORMATEX { + WORD wFormatTag; + WORD nChannels; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; + WORD wBitsPerSample; + WORD cbSize; +} WAVEFORMATEX,*PWAVEFORMATEX,*LPWAVEFORMATEX; +typedef const WAVEFORMATEX *LPCWAVEFORMATEX; +#endif +DECLARE_HANDLE(HMIDI); +DECLARE_HANDLE(HMIDIIN); +DECLARE_HANDLE(HMIDIOUT); +DECLARE_HANDLE(HMIDISTRM); +typedef HMIDI *LPHMIDI; +typedef HMIDIIN *LPHMIDIIN; +typedef HMIDIOUT *LPHMIDIOUT; +typedef HMIDISTRM *LPHMIDISTRM; +typedef DRVCALLBACK MIDICALLBACK; +typedef MIDICALLBACK *LPMIDICALLBACK; +typedef WORD PATCHARRAY[MIDIPATCHSIZE]; +typedef WORD *LPPATCHARRAY; +typedef WORD KEYARRAY[MIDIPATCHSIZE]; +typedef WORD *LPKEYARRAY; +typedef struct tagMIDIOUTCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + WORD wTechnology; + WORD wVoices; + WORD wNotes; + WORD wChannelMask; + DWORD dwSupport; +} MIDIOUTCAPSA,*PMIDIOUTCAPSA,*LPMIDIOUTCAPSA; +typedef struct tagMIDIOUTCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + WORD wTechnology; + WORD wVoices; + WORD wNotes; + WORD wChannelMask; + DWORD dwSupport; +} MIDIOUTCAPSW,*PMIDIOUTCAPSW,*LPMIDIOUTCAPSW; +typedef struct tagMIDIINCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + DWORD dwSupport; +} MIDIINCAPSA,*PMIDIINCAPSA,*LPMIDIINCAPSA; +typedef struct tagMIDIINCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + DWORD dwSupport; +} MIDIINCAPSW,*PMIDIINCAPSW,*NPMIDIINCAPSW,*LPMIDIINCAPSW; +typedef struct midihdr_tag { + LPSTR lpData; + DWORD dwBufferLength; + DWORD dwBytesRecorded; + DWORD dwUser; + DWORD dwFlags; + struct midihdr_tag *lpNext; + DWORD reserved; + DWORD dwOffset; + DWORD dwReserved[8]; +} MIDIHDR,*PMIDIHDR,*LPMIDIHDR; +typedef struct midievent_tag { + DWORD dwDeltaTime; + DWORD dwStreamID; + DWORD dwEvent; + DWORD dwParms[1]; +} MIDIEVENT; +typedef struct midistrmbuffver_tag { + DWORD dwVersion; + DWORD dwMid; + DWORD dwOEMVersion; +} MIDISTRMBUFFVER; +typedef struct midiproptimediv_tag { + DWORD cbStruct; + DWORD dwTimeDiv; +} MIDIPROPTIMEDIV,*LPMIDIPROPTIMEDIV; +typedef struct midiproptempo_tag { + DWORD cbStruct; + DWORD dwTempo; +} MIDIPROPTEMPO,*LPMIDIPROPTEMPO; +typedef struct tagAUXCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + WORD wTechnology; + WORD wReserved1; + DWORD dwSupport; +} AUXCAPSA,*PAUXCAPSA,*LPAUXCAPSA; +typedef struct tagAUXCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + WORD wTechnology; + WORD wReserved1; + DWORD dwSupport; +} AUXCAPSW,*PAUXCAPSW,*LPAUXCAPSW; +DECLARE_HANDLE(HMIXEROBJ); +typedef HMIXEROBJ *LPHMIXEROBJ; +DECLARE_HANDLE(HMIXER); +typedef HMIXER *LPHMIXER; +typedef struct tagMIXERCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + DWORD fdwSupport; + DWORD cDestinations; +} MIXERCAPSA,*PMIXERCAPSA,*LPMIXERCAPSA; +typedef struct tagMIXERCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + DWORD fdwSupport; + DWORD cDestinations; +} MIXERCAPSW,*PMIXERCAPSW,*LPMIXERCAPSW; +typedef struct tagMIXERLINEA { + DWORD cbStruct; + DWORD dwDestination; + DWORD dwSource; + DWORD dwLineID; + DWORD fdwLine; + DWORD dwUser; + DWORD dwComponentType; + DWORD cChannels; + DWORD cConnections; + DWORD cControls; + CHAR szShortName[MIXER_SHORT_NAME_CHARS]; + CHAR szName[MIXER_LONG_NAME_CHARS]; + struct { + DWORD dwType; + DWORD dwDeviceID; + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + } Target; +} MIXERLINEA,*PMIXERLINEA,*LPMIXERLINEA; +typedef struct tagMIXERLINEW { + DWORD cbStruct; + DWORD dwDestination; + DWORD dwSource; + DWORD dwLineID; + DWORD fdwLine; + DWORD dwUser; + DWORD dwComponentType; + DWORD cChannels; + DWORD cConnections; + DWORD cControls; + WCHAR szShortName[MIXER_SHORT_NAME_CHARS]; + WCHAR szName[MIXER_LONG_NAME_CHARS]; + struct { + DWORD dwType; + DWORD dwDeviceID; + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + } Target; +} MIXERLINEW,*PMIXERLINEW,*LPMIXERLINEW; +typedef struct tagMIXERCONTROLA { + DWORD cbStruct; + DWORD dwControlID; + DWORD dwControlType; + DWORD fdwControl; + DWORD cMultipleItems; + CHAR szShortName[MIXER_SHORT_NAME_CHARS]; + CHAR szName[MIXER_LONG_NAME_CHARS]; + union { + _ANONYMOUS_STRUCT struct { + LONG lMinimum; + LONG lMaximum; + }_STRUCT_NAME(s); + _ANONYMOUS_STRUCT struct { + DWORD dwMinimum; + DWORD dwMaximum; + }_STRUCT_NAME(s1); + DWORD dwReserved[6]; + } Bounds; + union { + DWORD cSteps; + DWORD cbCustomData; + DWORD dwReserved[6]; + } Metrics; +} MIXERCONTROLA,*PMIXERCONTROLA,*LPMIXERCONTROLA; +typedef struct tagMIXERCONTROLW { + DWORD cbStruct; + DWORD dwControlID; + DWORD dwControlType; + DWORD fdwControl; + DWORD cMultipleItems; + WCHAR szShortName[MIXER_SHORT_NAME_CHARS]; + WCHAR szName[MIXER_LONG_NAME_CHARS]; + union { + _ANONYMOUS_STRUCT struct { + LONG lMinimum; + LONG lMaximum; + }_STRUCT_NAME(s); + _ANONYMOUS_STRUCT struct { + DWORD dwMinimum; + DWORD dwMaximum; + }_STRUCT_NAME(s1); + DWORD dwReserved[6]; + } Bounds; + union { + DWORD cSteps; + DWORD cbCustomData; + DWORD dwReserved[6]; + } Metrics; +} MIXERCONTROLW,*PMIXERCONTROLW,*LPMIXERCONTROLW; +typedef struct tagMIXERLINECONTROLSA { + DWORD cbStruct; + DWORD dwLineID; + _ANONYMOUS_UNION union { + DWORD dwControlID; + DWORD dwControlType; + } DUMMYUNIONNAME; + DWORD cControls; + DWORD cbmxctrl; + LPMIXERCONTROLA pamxctrl; +} MIXERLINECONTROLSA,*PMIXERLINECONTROLSA,*LPMIXERLINECONTROLSA; +typedef struct tagMIXERLINECONTROLSW { + DWORD cbStruct; + DWORD dwLineID; + _ANONYMOUS_UNION union { + DWORD dwControlID; + DWORD dwControlType; + } DUMMYUNIONNAME; + DWORD cControls; + DWORD cbmxctrl; + LPMIXERCONTROLW pamxctrl; +} MIXERLINECONTROLSW,*PMIXERLINECONTROLSW,*LPMIXERLINECONTROLSW; +typedef struct tMIXERCONTROLDETAILS { + DWORD cbStruct; + DWORD dwControlID; + DWORD cChannels; + _ANONYMOUS_UNION union { + HWND hwndOwner; + DWORD cMultipleItems; + } DUMMYUNIONNAME; + DWORD cbDetails; + PVOID paDetails; +} MIXERCONTROLDETAILS,*PMIXERCONTROLDETAILS,*LPMIXERCONTROLDETAILS; +typedef struct tagMIXERCONTROLDETAILS_LISTTEXTA { + DWORD dwParam1; + DWORD dwParam2; + CHAR szName[MIXER_LONG_NAME_CHARS]; +} MIXERCONTROLDETAILS_LISTTEXTA,*PMIXERCONTROLDETAILS_LISTTEXTA,*LPMIXERCONTROLDETAILS_LISTTEXTA; +typedef struct tagMIXERCONTROLDETAILS_LISTTEXTW { + DWORD dwParam1; + DWORD dwParam2; + WCHAR szName[MIXER_LONG_NAME_CHARS]; +} MIXERCONTROLDETAILS_LISTTEXTW,*PMIXERCONTROLDETAILS_LISTTEXTW,*LPMIXERCONTROLDETAILS_LISTTEXTW; +typedef struct tMIXERCONTROLDETAILS_BOOLEAN { + LONG fValue; +} MIXERCONTROLDETAILS_BOOLEAN,*PMIXERCONTROLDETAILS_BOOLEAN,*LPMIXERCONTROLDETAILS_BOOLEAN; +typedef struct tMIXERCONTROLDETAILS_SIGNED { + LONG lValue; +} MIXERCONTROLDETAILS_SIGNED,*PMIXERCONTROLDETAILS_SIGNED,*LPMIXERCONTROLDETAILS_SIGNED; +typedef struct tMIXERCONTROLDETAILS_UNSIGNED { + DWORD dwValue; +} MIXERCONTROLDETAILS_UNSIGNED,*PMIXERCONTROLDETAILS_UNSIGNED,*LPMIXERCONTROLDETAILS_UNSIGNED; +typedef void(CALLBACK TIMECALLBACK)(UINT,UINT,DWORD,DWORD,DWORD); +typedef TIMECALLBACK *LPTIMECALLBACK; +typedef struct timecaps_tag { + UINT wPeriodMin; + UINT wPeriodMax; +} TIMECAPS,*PTIMECAPS,*LPTIMECAPS; +typedef struct tagJOYCAPSA { + WORD wMid; + WORD wPid; + CHAR szPname[MAXPNAMELEN]; + UINT wXmin; + UINT wXmax; + UINT wYmin; + UINT wYmax; + UINT wZmin; + UINT wZmax; + UINT wNumButtons; + UINT wPeriodMin; + UINT wPeriodMax; + UINT wRmin; + UINT wRmax; + UINT wUmin; + UINT wUmax; + UINT wVmin; + UINT wVmax; + UINT wCaps; + UINT wMaxAxes; + UINT wNumAxes; + UINT wMaxButtons; + CHAR szRegKey[MAXPNAMELEN]; + CHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME]; +} JOYCAPSA,*PJOYCAPSA,*LPJOYCAPSA; +typedef struct tagJOYCAPSW { + WORD wMid; + WORD wPid; + WCHAR szPname[MAXPNAMELEN]; + UINT wXmin; + UINT wXmax; + UINT wYmin; + UINT wYmax; + UINT wZmin; + UINT wZmax; + UINT wNumButtons; + UINT wPeriodMin; + UINT wPeriodMax; + UINT wRmin; + UINT wRmax; + UINT wUmin; + UINT wUmax; + UINT wVmin; + UINT wVmax; + UINT wCaps; + UINT wMaxAxes; + UINT wNumAxes; + UINT wMaxButtons; + WCHAR szRegKey[MAXPNAMELEN]; + WCHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME]; +} JOYCAPSW,*PJOYCAPSW,*LPJOYCAPSW; +typedef struct joyinfo_tag { + UINT wXpos; + UINT wYpos; + UINT wZpos; + UINT wButtons; +} JOYINFO,*PJOYINFO,*LPJOYINFO; +typedef struct joyinfoex_tag { + DWORD dwSize; + DWORD dwFlags; + DWORD dwXpos; + DWORD dwYpos; + DWORD dwZpos; + DWORD dwRpos; + DWORD dwUpos; + DWORD dwVpos; + DWORD dwButtons; + DWORD dwButtonNumber; + DWORD dwPOV; + DWORD dwReserved1; + DWORD dwReserved2; +} JOYINFOEX,*PJOYINFOEX,*LPJOYINFOEX; +typedef DWORD FOURCC; +typedef char *HPSTR; +DECLARE_HANDLE(HMMIO); +typedef LRESULT (CALLBACK MMIOPROC)(LPSTR,UINT,LPARAM,LPARAM); +typedef MMIOPROC *LPMMIOPROC; +typedef struct _MMIOINFO { + DWORD dwFlags; + FOURCC fccIOProc; + LPMMIOPROC pIOProc; + UINT wErrorRet; + HTASK htask; + LONG cchBuffer; + HPSTR pchBuffer; + HPSTR pchNext; + HPSTR pchEndRead; + HPSTR pchEndWrite; + LONG lBufOffset; + LONG lDiskOffset; + DWORD adwInfo[3]; + DWORD dwReserved1; + DWORD dwReserved2; + HMMIO hmmio; +} MMIOINFO,*PMMIOINFO,*LPMMIOINFO; +typedef const MMIOINFO *LPCMMIOINFO; +typedef struct _MMCKINFO { + FOURCC ckid; + DWORD cksize; + FOURCC fccType; + DWORD dwDataOffset; + DWORD dwFlags; +} MMCKINFO,*PMMCKINFO,*LPMMCKINFO; +typedef const MMCKINFO *LPCMMCKINFO; +typedef struct tagMCI_GENERIC_PARMS { + DWORD dwCallback; +} MCI_GENERIC_PARMS,*PMCI_GENERIC_PARMS,*LPMCI_GENERIC_PARMS; +typedef struct tagMCI_OPEN_PARMSA { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; +} MCI_OPEN_PARMSA,*PMCI_OPEN_PARMSA,*LPMCI_OPEN_PARMSA; +typedef struct tagMCI_OPEN_PARMSW { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCWSTR lpstrDeviceType; + LPCWSTR lpstrElementName; + LPCWSTR lpstrAlias; +} MCI_OPEN_PARMSW,*PMCI_OPEN_PARMSW,*LPMCI_OPEN_PARMSW; +typedef struct tagMCI_PLAY_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; +} MCI_PLAY_PARMS,*PMCI_PLAY_PARMS,*LPMCI_PLAY_PARMS; +typedef struct tagMCI_SEEK_PARMS { + DWORD dwCallback; + DWORD dwTo; +} MCI_SEEK_PARMS, *PMCI_SEEK_PARMS,*LPMCI_SEEK_PARMS; +typedef struct tagMCI_STATUS_PARMS { + DWORD dwCallback; + DWORD dwReturn; + DWORD dwItem; + DWORD dwTrack; +} MCI_STATUS_PARMS,*PMCI_STATUS_PARMS,*LPMCI_STATUS_PARMS; +typedef struct tagMCI_INFO_PARMSA { + DWORD dwCallback; + LPSTR lpstrReturn; + DWORD dwRetSize; +} MCI_INFO_PARMSA,*LPMCI_INFO_PARMSA; +typedef struct tagMCI_INFO_PARMSW { + DWORD dwCallback; + LPWSTR lpstrReturn; + DWORD dwRetSize; +} MCI_INFO_PARMSW,*LPMCI_INFO_PARMSW; +typedef struct tagMCI_GETDEVCAPS_PARMS { + DWORD dwCallback; + DWORD dwReturn; + DWORD dwItem; +} MCI_GETDEVCAPS_PARMS,*PMCI_GETDEVCAPS_PARMS,*LPMCI_GETDEVCAPS_PARMS; +typedef struct tagMCI_SYSINFO_PARMSA { + DWORD dwCallback; + LPSTR lpstrReturn; + DWORD dwRetSize; + DWORD dwNumber; + UINT wDeviceType; +} MCI_SYSINFO_PARMSA,*PMCI_SYSINFO_PARMSA,*LPMCI_SYSINFO_PARMSA; +typedef struct tagMCI_SYSINFO_PARMSW { + DWORD dwCallback; + LPWSTR lpstrReturn; + DWORD dwRetSize; + DWORD dwNumber; + UINT wDeviceType; +} MCI_SYSINFO_PARMSW,*PMCI_SYSINFO_PARMSW,*LPMCI_SYSINFO_PARMSW; +typedef struct tagMCI_SET_PARMS { + DWORD dwCallback; + DWORD dwTimeFormat; + DWORD dwAudio; +} MCI_SET_PARMS,*PMCI_SET_PARMS,*LPMCI_SET_PARMS; +typedef struct tagMCI_BREAK_PARMS { + DWORD dwCallback; + int nVirtKey; + HWND hwndBreak; +} MCI_BREAK_PARMS,*PMCI_BREAK_PARMS,*LPMCI_BREAK_PARMS; +typedef struct tagMCI_SAVE_PARMSA { + DWORD dwCallback; + LPCSTR lpfilename; +} MCI_SAVE_PARMSA,*PMCI_SAVE_PARMSA,*LPMCI_SAVE_PARMSA; +typedef struct tagMCI_SAVE_PARMSW { + DWORD dwCallback; + LPCWSTR lpfilename; +} MCI_SAVE_PARMSW,*PMCI_SAVE_PARMSW,*LPMCI_SAVE_PARMSW; +typedef struct tagMCI_LOAD_PARMSA { + DWORD dwCallback; + LPCSTR lpfilename; +} MCI_LOAD_PARMSA,*PMCI_LOAD_PARMSA,*LPMCI_LOAD_PARMSA; +typedef struct tagMCI_LOAD_PARMSW { + DWORD dwCallback; + LPCWSTR lpfilename; +} MCI_LOAD_PARMSW,*PMCI_LOAD_PARMSW,*LPMCI_LOAD_PARMSW; +typedef struct tagMCI_RECORD_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; +} MCI_RECORD_PARMS,*LPMCI_RECORD_PARMS; +typedef struct tagMCI_VD_PLAY_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; + DWORD dwSpeed; +} MCI_VD_PLAY_PARMS,*PMCI_VD_PLAY_PARMS,*LPMCI_VD_PLAY_PARMS; +typedef struct tagMCI_VD_STEP_PARMS { + DWORD dwCallback; + DWORD dwFrames; +} MCI_VD_STEP_PARMS,*PMCI_VD_STEP_PARMS,*LPMCI_VD_STEP_PARMS; +typedef struct tagMCI_VD_ESCAPE_PARMSA { + DWORD dwCallback; + LPCSTR lpstrCommand; +} MCI_VD_ESCAPE_PARMSA,*PMCI_VD_ESCAPE_PARMSA,*LPMCI_VD_ESCAPE_PARMSA; +typedef struct tagMCI_VD_ESCAPE_PARMSW { + DWORD dwCallback; + LPCWSTR lpstrCommand; +} MCI_VD_ESCAPE_PARMSW,*PMCI_VD_ESCAPE_PARMSW,*LPMCI_VD_ESCAPE_PARMSW; +typedef struct tagMCI_WAVE_OPEN_PARMSA { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; + DWORD dwBufferSeconds; +} MCI_WAVE_OPEN_PARMSA,*PMCI_WAVE_OPEN_PARMSA,*LPMCI_WAVE_OPEN_PARMSA; +typedef struct tagMCI_WAVE_OPEN_PARMSW { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCWSTR lpstrDeviceType; + LPCWSTR lpstrElementName; + LPCWSTR lpstrAlias; + DWORD dwBufferSeconds; +} MCI_WAVE_OPEN_PARMSW,*PMCI_WAVE_OPEN_PARMSW,*LPMCI_WAVE_OPEN_PARMSW; +typedef struct tagMCI_WAVE_DELETE_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; +} MCI_WAVE_DELETE_PARMS, *PMCI_WAVE_DELETE_PARMS,*LPMCI_WAVE_DELETE_PARMS; +typedef struct tagMCI_WAVE_SET_PARMS { + DWORD dwCallback; + DWORD dwTimeFormat; + DWORD dwAudio; + UINT wInput; + UINT wOutput; + WORD wFormatTag; + WORD wReserved2; + WORD nChannels; + WORD wReserved3; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; + WORD wReserved4; + WORD wBitsPerSample; + WORD wReserved5; +} MCI_WAVE_SET_PARMS,*PMCI_WAVE_SET_PARMS,*LPMCI_WAVE_SET_PARMS; + +LRESULT WINAPI CloseDriver(HDRVR,LONG,LONG); +HDRVR WINAPI OpenDriver(LPCWSTR,LPCWSTR,LONG); +LRESULT WINAPI SendDriverMessage(HDRVR,UINT,LONG,LONG); +HMODULE WINAPI DrvGetModuleHandle(HDRVR); +HMODULE WINAPI GetDriverModuleHandle(HDRVR); +LRESULT WINAPI DefDriverProc(DWORD,HDRVR,UINT,LPARAM,LPARAM); +UINT WINAPI mmsystemGetVersion(void); +#define OutputDebugStr OutputDebugString +BOOL WINAPI sndPlaySoundA(LPCSTR,UINT); +BOOL WINAPI sndPlaySoundW(LPCWSTR,UINT); +BOOL WINAPI PlaySoundA(LPCSTR,HMODULE,DWORD); +BOOL WINAPI PlaySoundW(LPCWSTR,HMODULE,DWORD); +UINT WINAPI waveOutGetNumDevs(void); +MMRESULT WINAPI waveOutGetDevCapsA(UINT,LPWAVEOUTCAPSA,UINT); +MMRESULT WINAPI waveOutGetDevCapsW(UINT,LPWAVEOUTCAPSW,UINT); +MMRESULT WINAPI waveOutGetVolume(HWAVEOUT,PDWORD); +MMRESULT WINAPI waveOutSetVolume(HWAVEOUT,DWORD); +MMRESULT WINAPI waveOutGetErrorTextA(MMRESULT,LPSTR,UINT); +MMRESULT WINAPI waveOutGetErrorTextW(MMRESULT,LPWSTR,UINT); +MMRESULT WINAPI waveOutOpen(LPHWAVEOUT,UINT,LPCWAVEFORMATEX,DWORD,DWORD,DWORD); +MMRESULT WINAPI waveOutClose(HWAVEOUT); +MMRESULT WINAPI waveOutPrepareHeader(HWAVEOUT,LPWAVEHDR,UINT); +MMRESULT WINAPI waveOutUnprepareHeader(HWAVEOUT,LPWAVEHDR,UINT); +MMRESULT WINAPI waveOutWrite(HWAVEOUT,LPWAVEHDR,UINT); +MMRESULT WINAPI waveOutPause(HWAVEOUT); +MMRESULT WINAPI waveOutRestart(HWAVEOUT); +MMRESULT WINAPI waveOutReset(HWAVEOUT); +MMRESULT WINAPI waveOutBreakLoop(HWAVEOUT); +MMRESULT WINAPI waveOutGetPosition(HWAVEOUT,LPMMTIME,UINT); +MMRESULT WINAPI waveOutGetPitch(HWAVEOUT,PDWORD); +MMRESULT WINAPI waveOutSetPitch(HWAVEOUT,DWORD); +MMRESULT WINAPI waveOutGetPlaybackRate(HWAVEOUT,PDWORD); +MMRESULT WINAPI waveOutSetPlaybackRate(HWAVEOUT,DWORD); +MMRESULT WINAPI waveOutGetID(HWAVEOUT,LPUINT); +MMRESULT WINAPI waveOutMessage(HWAVEOUT,UINT,DWORD,DWORD); +UINT WINAPI waveInGetNumDevs(void); +MMRESULT WINAPI waveInGetDevCapsA(UINT,LPWAVEINCAPSA,UINT); +MMRESULT WINAPI waveInGetDevCapsW(UINT,LPWAVEINCAPSW,UINT); +MMRESULT WINAPI waveInGetErrorTextA(MMRESULT,LPSTR,UINT); +MMRESULT WINAPI waveInGetErrorTextW(MMRESULT,LPWSTR,UINT); +MMRESULT WINAPI waveInOpen(LPHWAVEIN,UINT,LPCWAVEFORMATEX,DWORD*,DWORD*,DWORD); +//MMRESULT WINAPI waveInOpen(LPHWAVEIN,UINT,LPCWAVEFORMATEX,DWORD,DWORD,DWORD); +MMRESULT WINAPI waveInClose(HWAVEIN); +MMRESULT WINAPI waveInPrepareHeader(HWAVEIN,LPWAVEHDR,UINT); +MMRESULT WINAPI waveInUnprepareHeader(HWAVEIN,LPWAVEHDR,UINT); +MMRESULT WINAPI waveInAddBuffer(HWAVEIN,LPWAVEHDR,UINT); +MMRESULT WINAPI waveInStart(HWAVEIN); +MMRESULT WINAPI waveInStop(HWAVEIN); +MMRESULT WINAPI waveInReset(HWAVEIN); +MMRESULT WINAPI waveInGetPosition(HWAVEIN,LPMMTIME,UINT); +MMRESULT WINAPI waveInGetID(HWAVEIN,LPUINT); +MMRESULT WINAPI waveInMessage(HWAVEIN,UINT,DWORD,DWORD); +UINT WINAPI midiOutGetNumDevs(void); +MMRESULT WINAPI midiStreamOpen(LPHMIDISTRM,LPUINT,DWORD,DWORD,DWORD,DWORD); +MMRESULT WINAPI midiStreamClose(HMIDISTRM); +MMRESULT WINAPI midiStreamProperty(HMIDISTRM,LPBYTE,DWORD); +MMRESULT WINAPI midiStreamPosition(HMIDISTRM,LPMMTIME,UINT); +MMRESULT WINAPI midiStreamOut(HMIDISTRM,LPMIDIHDR,UINT); +MMRESULT WINAPI midiStreamPause(HMIDISTRM); +MMRESULT WINAPI midiStreamRestart(HMIDISTRM); +MMRESULT WINAPI midiStreamStop(HMIDISTRM); +MMRESULT WINAPI midiConnect(HMIDI,HMIDIOUT,PVOID); +MMRESULT WINAPI midiDisconnect(HMIDI,HMIDIOUT,PVOID); +MMRESULT WINAPI midiOutGetDevCapsA(UINT,LPMIDIOUTCAPSA,UINT); +MMRESULT WINAPI midiOutGetDevCapsW(UINT,LPMIDIOUTCAPSW,UINT); +MMRESULT WINAPI midiOutGetVolume(HMIDIOUT,PDWORD); +MMRESULT WINAPI midiOutSetVolume(HMIDIOUT,DWORD); +MMRESULT WINAPI midiOutGetErrorTextA(MMRESULT,LPSTR,UINT); +MMRESULT WINAPI midiOutGetErrorTextW(MMRESULT,LPWSTR,UINT); +MMRESULT WINAPI midiOutOpen(LPHMIDIOUT,UINT,DWORD,DWORD,DWORD); +MMRESULT WINAPI midiOutClose(HMIDIOUT); +MMRESULT WINAPI midiOutPrepareHeader(HMIDIOUT,LPMIDIHDR,UINT); +MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT,LPMIDIHDR,UINT); +MMRESULT WINAPI midiOutShortMsg(HMIDIOUT,DWORD); +MMRESULT WINAPI midiOutLongMsg(HMIDIOUT,LPMIDIHDR,UINT); +MMRESULT WINAPI midiOutReset(HMIDIOUT); +MMRESULT WINAPI midiOutCachePatches(HMIDIOUT,UINT,LPWORD,UINT); +MMRESULT WINAPI midiOutCacheDrumPatches(HMIDIOUT,UINT,LPWORD,UINT); +MMRESULT WINAPI midiOutGetID(HMIDIOUT,LPUINT); +MMRESULT WINAPI midiOutMessage(HMIDIOUT,UINT,DWORD,DWORD); +UINT WINAPI midiInGetNumDevs(void); +MMRESULT WINAPI midiInGetDevCapsA(UINT,LPMIDIINCAPSA,UINT); +MMRESULT WINAPI midiInGetDevCapsW(UINT,LPMIDIINCAPSW,UINT); +MMRESULT WINAPI midiInGetErrorTextA(MMRESULT,LPSTR,UINT); +MMRESULT WINAPI midiInGetErrorTextW(MMRESULT,LPWSTR,UINT); +MMRESULT WINAPI midiInOpen(LPHMIDIIN,UINT,DWORD,DWORD,DWORD); +MMRESULT WINAPI midiInClose(HMIDIIN); +MMRESULT WINAPI midiInPrepareHeader(HMIDIIN,LPMIDIHDR,UINT); +MMRESULT WINAPI midiInUnprepareHeader(HMIDIIN,LPMIDIHDR,UINT); +MMRESULT WINAPI midiInAddBuffer(HMIDIIN,LPMIDIHDR,UINT); +MMRESULT WINAPI midiInStart(HMIDIIN); +MMRESULT WINAPI midiInStop(HMIDIIN); +MMRESULT WINAPI midiInReset(HMIDIIN); +MMRESULT WINAPI midiInGetID(HMIDIIN,LPUINT); +MMRESULT WINAPI midiInMessage(HMIDIIN,UINT,DWORD,DWORD); +UINT WINAPI auxGetNumDevs(void); +MMRESULT WINAPI auxGetDevCapsA(UINT,LPAUXCAPSA,UINT); +MMRESULT WINAPI auxGetDevCapsW(UINT,LPAUXCAPSW,UINT); +MMRESULT WINAPI auxSetVolume(UINT,DWORD); +MMRESULT WINAPI auxGetVolume(UINT,PDWORD); +MMRESULT WINAPI auxOutMessage(UINT,UINT,DWORD,DWORD); +UINT WINAPI mixerGetNumDevs(void); +MMRESULT WINAPI mixerGetDevCapsA(UINT,LPMIXERCAPSA,UINT); +MMRESULT WINAPI mixerGetDevCapsW(UINT,LPMIXERCAPSW,UINT); +MMRESULT WINAPI mixerOpen(LPHMIXER,UINT,DWORD,DWORD,DWORD); +MMRESULT WINAPI mixerClose(HMIXER); +DWORD WINAPI mixerMessage(HMIXER,UINT,DWORD,DWORD); +MMRESULT WINAPI mixerGetLineInfoA(HMIXEROBJ,LPMIXERLINEA,DWORD); +MMRESULT WINAPI mixerGetLineInfoW(HMIXEROBJ,LPMIXERLINEW,DWORD); +MMRESULT WINAPI mixerGetID(HMIXEROBJ,PUINT,DWORD); +MMRESULT WINAPI mixerGetLineControlsA(HMIXEROBJ,LPMIXERLINECONTROLSA,DWORD); +MMRESULT WINAPI mixerGetLineControlsW(HMIXEROBJ,LPMIXERLINECONTROLSW,DWORD); +MMRESULT WINAPI mixerGetControlDetailsA(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD); +MMRESULT WINAPI mixerGetControlDetailsW(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD); +MMRESULT WINAPI mixerSetControlDetails(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD); +MMRESULT WINAPI timeGetSystemTime(LPMMTIME,UINT); +DWORD WINAPI timeGetTime(void); +MMRESULT WINAPI timeSetEvent(UINT,UINT,LPTIMECALLBACK,DWORD,UINT); +MMRESULT WINAPI timeKillEvent(UINT); +MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS,UINT); +MMRESULT WINAPI timeBeginPeriod(UINT); +MMRESULT WINAPI timeEndPeriod(UINT); +UINT WINAPI joyGetNumDevs(void); +MMRESULT WINAPI joyGetDevCapsA(UINT,LPJOYCAPSA,UINT); +MMRESULT WINAPI joyGetDevCapsW(UINT,LPJOYCAPSW,UINT); +MMRESULT WINAPI joyGetPos(UINT,LPJOYINFO); +MMRESULT WINAPI joyGetPosEx(UINT,LPJOYINFOEX); +MMRESULT WINAPI joyGetThreshold(UINT,LPUINT); +MMRESULT WINAPI joyReleaseCapture(UINT); +MMRESULT WINAPI joySetCapture(HWND,UINT,UINT,BOOL); +MMRESULT WINAPI joySetThreshold(UINT,UINT); +FOURCC WINAPI mmioStringToFOURCCA(LPCSTR,UINT); +FOURCC WINAPI mmioStringToFOURCCW(LPCWSTR,UINT); +LPMMIOPROC WINAPI mmioInstallIOProcA(FOURCC,LPMMIOPROC,DWORD); +LPMMIOPROC WINAPI mmioInstallIOProcW(FOURCC,LPMMIOPROC,DWORD); +HMMIO WINAPI mmioOpenA(LPSTR,LPMMIOINFO,DWORD); +HMMIO WINAPI mmioOpenW(LPWSTR,LPMMIOINFO,DWORD); +MMRESULT WINAPI mmioRenameA(LPCSTR,LPCSTR,LPCMMIOINFO,DWORD); +MMRESULT WINAPI mmioRenameW(LPCWSTR,LPCWSTR,LPCMMIOINFO,DWORD); +MMRESULT WINAPI mmioClose(HMMIO,UINT); +LONG WINAPI mmioRead(HMMIO,HPSTR,LONG); +LONG WINAPI mmioWrite(HMMIO,LPCSTR,LONG); +LONG WINAPI mmioSeek(HMMIO,LONG,int); +MMRESULT WINAPI mmioGetInfo(HMMIO,LPMMIOINFO,UINT); +MMRESULT WINAPI mmioSetInfo(HMMIO,LPCMMIOINFO,UINT); +MMRESULT WINAPI mmioSetBuffer(HMMIO,LPSTR,LONG,UINT); +MMRESULT WINAPI mmioFlush(HMMIO,UINT); +MMRESULT WINAPI mmioAdvance(HMMIO,LPMMIOINFO,UINT); +LRESULT WINAPI mmioSendMessage(HMMIO,UINT,LPARAM,LPARAM); +MMRESULT WINAPI mmioDescend(HMMIO,LPMMCKINFO,const MMCKINFO*,UINT); +MMRESULT WINAPI mmioAscend(HMMIO,LPMMCKINFO,UINT); +MMRESULT WINAPI mmioCreateChunk(HMMIO,LPMMCKINFO,UINT); +MCIERROR WINAPI mciSendCommandA(MCIDEVICEID,UINT,DWORD,DWORD); +MCIERROR WINAPI mciSendCommandW(MCIDEVICEID,UINT,DWORD,DWORD); +MCIERROR WINAPI mciSendStringA(LPCSTR,LPSTR,UINT,HWND); +MCIERROR WINAPI mciSendStringW(LPCWSTR,LPWSTR,UINT,HWND); +MCIDEVICEID WINAPI mciGetDeviceIDA(LPCSTR); +MCIDEVICEID WINAPI mciGetDeviceIDW(LPCWSTR); +MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA(DWORD,LPCSTR); +MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW(DWORD,LPCWSTR); +BOOL WINAPI mciGetErrorStringA(MCIERROR,LPSTR,UINT); +BOOL WINAPI mciGetErrorStringW(MCIERROR,LPWSTR,UINT); +BOOL WINAPI mciSetYieldProc(MCIDEVICEID,YIELDPROC,DWORD); +HTASK WINAPI mciGetCreatorTask(MCIDEVICEID); +YIELDPROC WINAPI mciGetYieldProc(MCIDEVICEID,PDWORD); + +typedef struct tagMCI_SEQ_SET_PARMS { + DWORD dwCallback; + DWORD dwTimeFormat; + DWORD dwAudio; + DWORD dwTempo; + DWORD dwPort; + DWORD dwSlave; + DWORD dwMaster; + DWORD dwOffset; +} MCI_SEQ_SET_PARMS,*PMCI_SEQ_SET_PARMS,*LPMCI_SEQ_SET_PARMS; +typedef struct tagMCI_ANIM_OPEN_PARMSA { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; +} MCI_ANIM_OPEN_PARMSA,*PMCI_ANIM_OPEN_PARMSA,*LPMCI_ANIM_OPEN_PARMSA; +typedef struct tagMCI_ANIM_OPEN_PARMSW { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCWSTR lpstrDeviceType; + LPCWSTR lpstrElementName; + LPCWSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; +} MCI_ANIM_OPEN_PARMSW,*PMCI_ANIM_OPEN_PARMSW,*LPMCI_ANIM_OPEN_PARMSW; +typedef struct tagMCI_ANIM_PLAY_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; + DWORD dwSpeed; +} MCI_ANIM_PLAY_PARMS,*PMCI_ANIM_PLAY_PARMS,*LPMCI_ANIM_PLAY_PARMS; +typedef struct tagMCI_ANIM_STEP_PARMS { + DWORD dwCallback; + DWORD dwFrames; +} MCI_ANIM_STEP_PARMS,*PMCI_ANIM_STEP_PARMS,*LPMCI_ANIM_STEP_PARMS; +typedef struct tagMCI_ANIM_WINDOW_PARMSA { + DWORD dwCallback; + HWND hWnd; + UINT nCmdShow; + LPCSTR lpstrText; +} MCI_ANIM_WINDOW_PARMSA,*PMCI_ANIM_WINDOW_PARMSA,*LPMCI_ANIM_WINDOW_PARMSA; +typedef struct tagMCI_ANIM_WINDOW_PARMSW { + DWORD dwCallback; + HWND hWnd; + UINT nCmdShow; + LPCWSTR lpstrText; +} MCI_ANIM_WINDOW_PARMSW,*PMCI_ANIM_WINDOW_PARMSW,*LPMCI_ANIM_WINDOW_PARMSW; +typedef struct tagMCI_ANIM_RECT_PARMS { + DWORD dwCallback; +#ifdef MCI_USE_OFFEXT + POINT ptOffset; + POINT ptExtent; +#else + RECT rc; +#endif +} MCI_ANIM_RECT_PARMS,*PMCI_ANIM_RECT_PARMS,*LPMCI_ANIM_RECT_PARMS; +typedef struct tagMCI_ANIM_UPDATE_PARMS { + DWORD dwCallback; + RECT rc; + HDC hDC; +} MCI_ANIM_UPDATE_PARMS,*PMCI_ANIM_UPDATE_PARMS,*LPMCI_ANIM_UPDATE_PARMS; +typedef struct tagMCI_OVLY_OPEN_PARMSA { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; +} MCI_OVLY_OPEN_PARMSA,*PMCI_OVLY_OPEN_PARMSA,*LPMCI_OVLY_OPEN_PARMSA; +typedef struct tagMCI_OVLY_OPEN_PARMSW { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCWSTR lpstrDeviceType; + LPCWSTR lpstrElementName; + LPCWSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; +} MCI_OVLY_OPEN_PARMSW,*PMCI_OVLY_OPEN_PARMSW,*LPMCI_OVLY_OPEN_PARMSW; +typedef struct tagMCI_OVLY_WINDOW_PARMSA { + DWORD dwCallback; + HWND hWnd; + UINT nCmdShow; + LPCSTR lpstrText; +} MCI_OVLY_WINDOW_PARMSA,*PMCI_OVLY_WINDOW_PARMSA,*LPMCI_OVLY_WINDOW_PARMSA; +typedef struct tagMCI_OVLY_WINDOW_PARMSW { + DWORD dwCallback; + HWND hWnd; + UINT nCmdShow; + LPCWSTR lpstrText; +} MCI_OVLY_WINDOW_PARMSW,*PMCI_OVLY_WINDOW_PARMSW,*LPMCI_OVLY_WINDOW_PARMSW; +typedef struct tagMCI_OVLY_RECT_PARMS { + DWORD dwCallback; +#ifdef MCI_USE_OFFEXT + POINT ptOffset; + POINT ptExtent; +#else + RECT rc; +#endif +} MCI_OVLY_RECT_PARMS,*PMCI_OVLY_RECT_PARMS,*LPMCI_OVLY_RECT_PARMS; +typedef struct tagMCI_OVLY_SAVE_PARMSA { + DWORD dwCallback; + LPCSTR lpfilename; + RECT rc; +} MCI_OVLY_SAVE_PARMSA,*PMCI_OVLY_SAVE_PARMSA,*LPMCI_OVLY_SAVE_PARMSA; +typedef struct tagMCI_OVLY_SAVE_PARMSW { + DWORD dwCallback; + LPCWSTR lpfilename; + RECT rc; +} MCI_OVLY_SAVE_PARMSW,*PMCI_OVLY_SAVE_PARMSW,*LPMCI_OVLY_SAVE_PARMSW; +typedef struct tagMCI_OVLY_LOAD_PARMSA { + DWORD dwCallback; + LPCSTR lpfilename; + RECT rc; +} MCI_OVLY_LOAD_PARMSA,*PMCI_OVLY_LOAD_PARMSA,*LPMCI_OVLY_LOAD_PARMSA; +typedef struct tagMCI_OVLY_LOAD_PARMSW { + DWORD dwCallback; + LPCWSTR lpfilename; + RECT rc; +} MCI_OVLY_LOAD_PARMSW,*PMCI_OVLY_LOAD_PARMSW,*LPMCI_OVLY_LOAD_PARMSW; + +#ifdef UNICODE +typedef WAVEOUTCAPSW WAVEOUTCAPS,*PWAVEOUTCAPS,*LPWAVEOUTCAPS; +typedef WAVEINCAPSW WAVEINCAPS,*PWAVEINCAPS,*LPWAVEINCAPS; +typedef MIDIOUTCAPSW MIDIOUTCAPS,*PMIDIOUTCAPS,*LPMIDIOUTCAPS; +typedef MIDIINCAPSW MIDIINCAPS,*PMIDIINCAPS,*LPMIDIINCAPS; +typedef AUXCAPSW AUXCAPS,*PAUXCAPS,*LPAUXCAPS; +typedef MIXERCAPSW MIXERCAPS,*PMIXERCAPS,*LPMIXERCAPS; +typedef MIXERLINEW MIXERLINE,*PMIXERLINE,*LPMIXERLINE; +typedef MIXERCONTROLW MIXERCONTROL,*PMIXERCONTROL,*LPMIXERCONTROL; +typedef MIXERLINECONTROLSW MIXERLINECONTROLS,*PMIXERLINECONTROLS,*LPMIXERLINECONTROLS; +typedef MIXERCONTROLDETAILS_LISTTEXTW MIXERCONTROLDETAILS_LISTTEXT,*PMIXERCONTROLDETAILS_LISTTEXT,*LPMIXERCONTROLDETAILS_LISTTEXT; +typedef JOYCAPSW JOYCAPS,*PJOYCAPS,*LPJOYCAPS; +typedef MCI_OPEN_PARMSW MCI_OPEN_PARMS,*PMCI_OPEN_PARMS,*LPMCI_OPEN_PARMS; +typedef MCI_INFO_PARMSW MCI_INFO_PARMS,*LPMCI_INFO_PARMS; +typedef MCI_SYSINFO_PARMSW MCI_SYSINFO_PARMS,*PMCI_SYSINFO_PARMS,*LPMCI_SYSINFO_PARMS; +typedef MCI_SAVE_PARMSW MCI_SAVE_PARMS,*PMCI_SAVE_PARMS,*LPMCI_SAVE_PARMS; +typedef MCI_LOAD_PARMSW MCI_LOAD_PARMS,*PMCI_LOAD_PARMS,*LPMCI_LOAD_PARMS; +typedef MCI_VD_ESCAPE_PARMSW MCI_VD_ESCAPE_PARMS,*PMCI_VD_ESCAPE_PARMS,*LPMCI_VD_ESCAPE_PARMS; +typedef MCI_WAVE_OPEN_PARMSW MCI_WAVE_OPEN_PARMS,*PMCI_WAVE_OPEN_PARMS,*LPMCI_WAVE_OPEN_PARMS; +typedef MCI_ANIM_OPEN_PARMSW MCI_ANIM_OPEN_PARMS,*PMCI_ANIM_OPEN_PARMS,*LPMCI_ANIM_OPEN_PARMS; +typedef MCI_ANIM_WINDOW_PARMSW MCI_ANIM_WINDOW_PARMS,*PMCI_ANIM_WINDOW_PARMS,*LPMCI_ANIM_WINDOW_PARMS; +typedef MCI_OVLY_OPEN_PARMSW MCI_OVLY_OPEN_PARMS,*PMCI_OVLY_OPEN_PARMS,*LPMCI_OVLY_OPEN_PARMS; +typedef MCI_OVLY_WINDOW_PARMSW MCI_OVLY_WINDOW_PARMS,*PMCI_OVLY_WINDOW_PARMS,*LPMCI_OVLY_WINDOW_PARMS; +typedef MCI_OVLY_SAVE_PARMSW MCI_OVLY_SAVE_PARMS,*PMCI_OVLY_SAVE_PARMS,*LPMCI_OVLY_SAVE_PARMS; +#define sndPlaySound sndPlaySoundW +#define PlaySound PlaySoundW +#define waveOutGetDevCaps waveOutGetDevCapsW +#define waveOutGetErrorText waveOutGetErrorTextW +#define waveInGetDevCaps waveInGetDevCapsW +#define waveInGetErrorText waveInGetErrorTextW +#define midiOutGetDevCaps midiOutGetDevCapsW +#define midiOutGetErrorText midiOutGetErrorTextW +#define midiInGetDevCaps midiInGetDevCapsW +#define midiInGetErrorText midiInGetErrorTextW +#define auxGetDevCaps auxGetDevCapsW +#define mixerGetDevCaps mixerGetDevCapsW +#define mixerGetLineInfo mixerGetLineInfoW +#define mixerGetLineControls mixerGetLineControlsW +#define mixerGetControlDetails mixerGetControlDetailsW +#define joyGetDevCaps joyGetDevCapsW +#define mmioInstallIOProc mmioInstallIOProcW +#define mmioStringToFOURCC mmioStringToFOURCCW +#define mmioOpen mmioOpenW +#define mmioRename mmioRenameW +#define mciSendCommand mciSendCommandW +#define mciSendString mciSendStringW +#define mciGetDeviceID mciGetDeviceIDW +#define mciGetDeviceIDFromElementID mciGetDeviceIDFromElementIDW +#define mciGetErrorString mciGetErrorStringW +#else +typedef WAVEOUTCAPSA WAVEOUTCAPS,*PWAVEOUTCAPS,*LPWAVEOUTCAPS; +typedef WAVEINCAPSA WAVEINCAPS,*PWAVEINCAPS,*LPWAVEINCAPS; +typedef MIDIOUTCAPSA MIDIOUTCAPS,*PMIDIOUTCAPS,*LPMIDIOUTCAPS; +typedef MIDIINCAPSA MIDIINCAPS,*PMIDIINCAPS,*LPMIDIINCAPS; +typedef AUXCAPSA AUXCAPS,*PAUXCAPS,*LPAUXCAPS; +typedef MIXERCAPSA MIXERCAPS,*PMIXERCAPS,*LPMIXERCAPS; +typedef MIXERLINEA MIXERLINE,*PMIXERLINE,*LPMIXERLINE; +typedef MIXERCONTROLA MIXERCONTROL,*PMIXERCONTROL,*LPMIXERCONTROL; +typedef MIXERLINECONTROLSA MIXERLINECONTROLS,*PMIXERLINECONTROLS,*LPMIXERLINECONTROLS; +typedef MIXERCONTROLDETAILS_LISTTEXTA MIXERCONTROLDETAILS_LISTTEXT,*PMIXERCONTROLDETAILS_LISTTEXT,*LPMIXERCONTROLDETAILS_LISTTEXT; +typedef JOYCAPSA JOYCAPS,*PJOYCAPS,*LPJOYCAPS; +typedef MCI_OPEN_PARMSA MCI_OPEN_PARMS,*PMCI_OPEN_PARMS,*LPMCI_OPEN_PARMS; +typedef MCI_INFO_PARMSA MCI_INFO_PARMS,*LPMCI_INFO_PARMS; +typedef MCI_SYSINFO_PARMSA MCI_SYSINFO_PARMS,*PMCI_SYSINFO_PARMS,*LPMCI_SYSINFO_PARMS; +typedef MCI_SAVE_PARMSA MCI_SAVE_PARMS,*PMCI_SAVE_PARMS,*LPMCI_SAVE_PARMS; +typedef MCI_LOAD_PARMSA MCI_LOAD_PARMS,*PMCI_LOAD_PARMS,*LPMCI_LOAD_PARMS; +typedef MCI_VD_ESCAPE_PARMSA MCI_VD_ESCAPE_PARMS,*PMCI_VD_ESCAPE_PARMS,*LPMCI_VD_ESCAPE_PARMS; +typedef MCI_WAVE_OPEN_PARMSA MCI_WAVE_OPEN_PARMS,*PMCI_WAVE_OPEN_PARMS,*LPMCI_WAVE_OPEN_PARMS; +typedef MCI_ANIM_OPEN_PARMSA MCI_ANIM_OPEN_PARMS,*PMCI_ANIM_OPEN_PARMS,*LPMCI_ANIM_OPEN_PARMS; +typedef MCI_ANIM_WINDOW_PARMSA MCI_ANIM_WINDOW_PARMS,*PMCI_ANIM_WINDOW_PARMS,*LPMCI_ANIM_WINDOW_PARMS; +typedef MCI_OVLY_OPEN_PARMSA MCI_OVLY_OPEN_PARMS,*PMCI_OVLY_OPEN_PARMS,*LPMCI_OVLY_OPEN_PARMS; +typedef MCI_OVLY_WINDOW_PARMSA MCI_OVLY_WINDOW_PARMS,*PMCI_OVLY_WINDOW_PARMS,*LPMCI_OVLY_WINDOW_PARMS; +typedef MCI_OVLY_SAVE_PARMSA MCI_OVLY_SAVE_PARMS,*PMCI_OVLY_SAVE_PARMS,*LPMCI_OVLY_SAVE_PARMS; +#define sndPlaySound sndPlaySoundA +#define PlaySound PlaySoundA +#define waveOutGetDevCaps waveOutGetDevCapsA +#define waveOutGetErrorText waveOutGetErrorTextA +#define waveInGetDevCaps waveInGetDevCapsA +#define waveInGetErrorText waveInGetErrorTextA +#define midiOutGetDevCaps midiOutGetDevCapsA +#define midiOutGetErrorText midiOutGetErrorTextA +#define midiInGetDevCaps midiInGetDevCapsA +#define midiInGetErrorText midiInGetErrorTextA +#define auxGetDevCaps auxGetDevCapsA +#define mixerGetDevCaps mixerGetDevCapsA +#define mixerGetLineInfo mixerGetLineInfoA +#define mixerGetLineControls mixerGetLineControlsA +#define mixerGetControlDetails mixerGetControlDetailsA +#define joyGetDevCaps joyGetDevCapsA +#define mmioInstallIOProc mmioInstallIOProcA +#define mmioStringToFOURCC mmioStringToFOURCCA +#define mmioOpen mmioOpenA +#define mmioRename mmioRenameA +#define mciSendCommand mciSendCommandA +#define mciSendString mciSendStringA +#define mciGetDeviceID mciGetDeviceIDA +#define mciGetDeviceIDFromElementID mciGetDeviceIDFromElementIDA +#define mciGetErrorString mciGetErrorStringA +#endif +#ifdef __cplusplus +} +#endif +#pragma pack(pop) +#endif diff --git a/colorchord2/windows/symbol_enumerator.c b/colorchord2/windows/symbol_enumerator.c new file mode 100644 index 0000000..fcb3727 --- /dev/null +++ b/colorchord2/windows/symbol_enumerator.c @@ -0,0 +1,245 @@ +#include +#include "symbol_enumerator.h" + +#if defined( WIN32 ) || defined( WINDOWS ) || defined( USE_WINDOWS ) || defined( _WIN32 ) + +#include + +typedef struct _SYMBOL_INFO { + ULONG SizeOfStruct; + ULONG TypeIndex; + ULONG64 Reserved[2]; + ULONG Index; + ULONG Size; + ULONG64 ModBase; + ULONG Flags; + ULONG64 Value; + ULONG64 Address; + ULONG Register; + ULONG Scope; + ULONG Tag; + ULONG NameLen; + ULONG MaxNameLen; + TCHAR Name[1]; +} SYMBOL_INFO, *PSYMBOL_INFO; +typedef struct _IMAGEHLP_STACK_FRAME { + ULONG64 InstructionOffset; + ULONG64 ReturnOffset; + ULONG64 FrameOffset; + ULONG64 StackOffset; + ULONG64 BackingStoreOffset; + ULONG64 FuncTableEntry; + ULONG64 Params[4]; + ULONG64 Reserved[5]; + BOOL Virtual; + ULONG Reserved2; +} IMAGEHLP_STACK_FRAME, *PIMAGEHLP_STACK_FRAME; + + +typedef BOOL (*PSYM_ENUMERATESYMBOLS_CALLBACK)( + PSYMBOL_INFO pSymInfo, + ULONG SymbolSize, + PVOID UserContext + ); + +BOOL WINAPI SymEnumSymbols( + HANDLE hProcess, + ULONG64 BaseOfDll, + PCTSTR Mask, + PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + const PVOID UserContext +); + +BOOL WINAPI SymInitialize( + HANDLE hProcess, + PCTSTR UserSearchPath, + BOOL fInvadeProcess +); + +BOOL WINAPI SymCleanup( + HANDLE hProcess +); + +BOOL CALLBACK __cdecl mycb( + PSYMBOL_INFO pSymInfo, + ULONG SymbolSize, + PVOID UserContext + ){ + SymEnumeratorCallback cb = (SymEnumeratorCallback)UserContext; + return !cb( "", &pSymInfo->Name[0], (void*)pSymInfo->Address, (long) pSymInfo->Size ); + } + +int EnumerateSymbols( SymEnumeratorCallback cb ) +{ + HANDLE proc = GetCurrentProcess(); + if( !SymInitialize( proc, 0, 1 ) ) return -1; + if( !SymEnumSymbols( proc, 0, "*!*", &mycb, (void*)cb ) ) + { + SymCleanup(proc); + return -2; + } + SymCleanup(proc); + return 0; +} + +#else + + +#include +#include +#include +#include +#include + +#ifndef __GNUC__ +#define __int128_t long long long +#endif + +#include +#include + +#define UINTS_PER_WORD (__WORDSIZE / (CHAR_BIT * sizeof (unsigned int))) + + + struct dl_phdr_info { + ElfW(Addr) dlpi_addr; /* Base address of object */ + const char *dlpi_name; /* (Null-terminated) name of + object */ + const ElfW(Phdr) *dlpi_phdr; /* Pointer to array of + ELF program headers + for this object */ + ElfW(Half) dlpi_phnum; /* # of items in dlpi_phdr */ + }; + + + +void dl_iterate_phdr( void*, void*); + + +static ElfW(Word) gnu_hashtab_symbol_count(const unsigned int *const table) +{ + const unsigned int *const bucket = table + 4 + table[2] * (unsigned int)(UINTS_PER_WORD); + unsigned int b = table[0]; + unsigned int max = 0U; + + while (b-->0U) + if (bucket[b] > max) + max = bucket[b]; + + return (ElfW(Word))max; +} + +static static void *dynamic_pointer(const ElfW(Addr) addr, + const ElfW(Addr) base, const ElfW(Phdr) *const header, const ElfW(Half) headers) +{ + if (addr) { + ElfW(Half) h; + + for (h = 0; h < headers; h++) + if (header[h].p_type == PT_LOAD) + if (addr >= base + header[h].p_vaddr && + addr < base + header[h].p_vaddr + header[h].p_memsz) + return (void *)addr; + } + + return NULL; +} + +//Mostly based off of http://stackoverflow.com/questions/29903049/get-names-and-addresses-of-exported-functions-from-in-linux +static int callback(struct dl_phdr_info *info, + size_t size, void *data) +{ + SymEnumeratorCallback cb = (SymEnumeratorCallback)data; + const ElfW(Addr) base = info->dlpi_addr; + const ElfW(Phdr) *const header = info->dlpi_phdr; + const ElfW(Half) headers = info->dlpi_phnum; + const char *libpath, *libname; + ElfW(Half) h; + + if (info->dlpi_name && info->dlpi_name[0]) + libpath = info->dlpi_name; + else + libpath = ""; + + libname = strrchr(libpath, '/'); + + if (libname && libname[0] == '/' && libname[1]) + libname++; + else + libname = libpath; + + for (h = 0; h < headers; h++) + { + if (header[h].p_type == PT_DYNAMIC) + { + const ElfW(Dyn) *entry = (const ElfW(Dyn) *)(base + header[h].p_vaddr); + const ElfW(Word) *hashtab; + const ElfW(Sym) *symtab = NULL; + const char *strtab = NULL; + ElfW(Word) symbol_count = 0; + + for (; entry->d_tag != DT_NULL; entry++) + { + switch (entry->d_tag) + { + case DT_HASH: + hashtab = dynamic_pointer(entry->d_un.d_ptr, base, header, headers); + if (hashtab) + symbol_count = hashtab[1]; + break; + case DT_GNU_HASH: + hashtab = dynamic_pointer(entry->d_un.d_ptr, base, header, headers); + if (hashtab) + { + ElfW(Word) count = gnu_hashtab_symbol_count(hashtab); + if (count > symbol_count) + symbol_count = count; + } + break; + case DT_STRTAB: + strtab = dynamic_pointer(entry->d_un.d_ptr, base, header, headers); + break; + case DT_SYMTAB: + symtab = dynamic_pointer(entry->d_un.d_ptr, base, header, headers); + break; + } + } + + if (symtab && strtab && symbol_count > 0) { + ElfW(Word) s; + + for (s = 0; s < symbol_count; s++) { + const char *name; + void *const ptr = dynamic_pointer(base + symtab[s].st_value, base, header, headers); + int result; + + if (!ptr) + continue; + + if (symtab[s].st_name) + name = strtab + symtab[s].st_name; + else + name = ""; + + result = cb( libpath, name, ptr, symtab[s].st_size ); + if( result ) return result; //Bail early. + } + } + } + } + return 0; +} + + + + + +int EnumerateSymbols( SymEnumeratorCallback cb ) +{ + dl_iterate_phdr( callback, cb ); +} + + + + +#endif diff --git a/colorchord2/windows/symbol_enumerator.h b/colorchord2/windows/symbol_enumerator.h new file mode 100644 index 0000000..87e033b --- /dev/null +++ b/colorchord2/windows/symbol_enumerator.h @@ -0,0 +1,12 @@ +#ifndef _SYMBOL_ENUMERATOR_H +#define _SYMBOL_ENUMERATOR_H + +//Enumerates all symbols in the currently loaded excutable. +//Don't forget to compile with -rdynamic! + +//Return 0 to continue search. 1 to stop. +typedef int (*SymEnumeratorCallback)( const char * path, const char * name, void * location, long size ); + +int EnumerateSymbols( SymEnumeratorCallback cb ); + +#endif diff --git a/colorchord2/windows/tcc_stubs.c b/colorchord2/windows/tcc_stubs.c new file mode 100644 index 0000000..c6dfc76 --- /dev/null +++ b/colorchord2/windows/tcc_stubs.c @@ -0,0 +1,80 @@ + +#include <_mingw.h> + +#define REMATH(x) double __cdecl x( double f ); float x##f(float v) { return x(v); } + +int SymnumCheck( const char * path, const char * name, void * location, long size ) +{ + if( strncmp( name, "REGISTER", 8 ) == 0 ) + { + typedef void (*sf)(); + sf fn = (sf)location; + fn(); + } + return 0; +} + + + +void ManuallyRegisterDevices() +{ + EnumerateSymbols( SymnumCheck ); +} + +REMATH( acos ); +REMATH( cos ); +REMATH( sin ); +REMATH( sqrt ); +REMATH( asin ); +REMATH( exp ); +REMATH( fmod ); +REMATH( pow ); + +double __cdecl strtod (const char* str, char** endptr); +float strtof( const char* str, char** endptr) +{ + return strtod( str, endptr ); +} + +double __cdecl atan2(double a, double b); +float atan2f(float a, float b) +{ + return atan2( a, b ); +} + +//From http://stackoverflow.com/questions/40159892/using-asprintf-on-windows +int __cdecl vsprintf_s( + char *buffer, + size_t numberOfElements, + const char *format, + va_list argptr +); + +int asprintf(char **strp, const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + int r = vasprintf(strp, fmt, ap); + va_end(ap); + return r; +} + +int vasprintf(char **strp, const char *fmt, va_list ap) { + // _vscprintf tells you how big the buffer needs to be + int len = _vscprintf(fmt, ap); + if (len == -1) { + return -1; + } + size_t size = (size_t)len + 1; + char *str = (char*)malloc(size); + if (!str) { + return -1; + } + // _vsprintf_s is the "secure" version of vsprintf + int r = vsprintf_s(str, len + 1, fmt, ap); + if (r == -1) { + free(str); + return -1; + } + *strp = str; + return r; +} \ No newline at end of file diff --git a/colorchord2/windows/winsock2.h b/colorchord2/windows/winsock2.h new file mode 100644 index 0000000..d318eb6 --- /dev/null +++ b/colorchord2/windows/winsock2.h @@ -0,0 +1,1303 @@ +/* + + Definitions for winsock 2 + + Contributed by the WINE project. + + Portions Copyright (c) 1980, 1983, 1988, 1993 + The Regents of the University of California. All rights reserved. + + Portions Copyright (c) 1993 by Digital Equipment Corporation. + */ + +#if !(defined _WINSOCK2_H || defined _WINSOCK_H) +#define _WINSOCK2_H +#define _WINSOCK_H /* to prevent later inclusion of winsock.h */ +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#define _GNU_H_WINDOWS32_SOCKETS + +#include + +#ifndef WINSOCK_API_LINKAGE +#ifdef __W32API_USE_DLLIMPORT__ +#define WINSOCK_API_LINKAGE DECLSPEC_IMPORT +#else +#define WINSOCK_API_LINKAGE +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif +/* Names common to Winsock1.1 and Winsock2 */ +#if !defined ( _BSDTYPES_DEFINED ) +/* also defined in gmon.h and in cygwin's sys/types */ +typedef unsigned char u_char; +typedef unsigned short u_short; +typedef unsigned int u_int; +typedef unsigned long u_long; +#define _BSDTYPES_DEFINED +#endif /* ! def _BSDTYPES_DEFINED */ +typedef u_int SOCKET; +#ifndef FD_SETSIZE +#define FD_SETSIZE 64 +#endif + +/* shutdown() how types */ +#define SD_RECEIVE 0x00 +#define SD_SEND 0x01 +#define SD_BOTH 0x02 + +#ifndef _SYS_TYPES_FD_SET +/* fd_set may be defined by the newlib + * if __USE_W32_SOCKETS not defined. + */ +#ifdef fd_set +#undef fd_set +#endif +typedef struct fd_set { + u_int fd_count; + SOCKET fd_array[FD_SETSIZE]; +} fd_set; +int PASCAL __WSAFDIsSet(SOCKET,fd_set*); +#ifndef FD_CLR +#define FD_CLR(fd,set) do { u_int __i;\ +for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\ + if (((fd_set *)(set))->fd_array[__i] == (fd)) {\ + while (__i < ((fd_set *)(set))->fd_count-1) {\ + ((fd_set*)(set))->fd_array[__i] = ((fd_set*)(set))->fd_array[__i+1];\ + __i++;\ + }\ + ((fd_set*)(set))->fd_count--;\ + break;\ + }\ +}\ +} while (0) +#endif +#ifndef FD_SET +/* this differs from the define in winsock.h and in cygwin sys/types.h */ +#define FD_SET(fd, set) do { u_int __i;\ +for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\ + if (((fd_set *)(set))->fd_array[__i] == (fd)) {\ + break;\ + }\ +}\ +if (__i == ((fd_set *)(set))->fd_count) {\ + if (((fd_set *)(set))->fd_count < FD_SETSIZE) {\ + ((fd_set *)(set))->fd_array[__i] = (fd);\ + ((fd_set *)(set))->fd_count++;\ + }\ +}\ +} while(0) +#endif +#ifndef FD_ZERO +#define FD_ZERO(set) (((fd_set *)(set))->fd_count=0) +#endif +#ifndef FD_ISSET +#define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set *)(set)) +#endif +#elif !defined (USE_SYS_TYPES_FD_SET) +#warning "fd_set and associated macros have been defined in sys/types. \ + This may cause runtime problems with W32 sockets" +#endif /* ndef _SYS_TYPES_FD_SET */ +#if !(defined (__INSIDE_CYGWIN__) || (__INSIDE_MSYS__)) +#ifndef _TIMEVAL_DEFINED /* also in sys/time.h */ +#define _TIMEVAL_DEFINED +struct timeval { + long tv_sec; + long tv_usec; +}; +#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) +#define timercmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec != (uvp)->tv_sec) ? \ + ((tvp)->tv_sec cmp (uvp)->tv_sec) : \ + ((tvp)->tv_usec cmp (uvp)->tv_usec)) +#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0 +#endif /* _TIMEVAL_DEFINED */ +struct hostent { + char *h_name; + char **h_aliases; + short h_addrtype; + short h_length; + char **h_addr_list; +#define h_addr h_addr_list[0] +}; +struct linger { + u_short l_onoff; + u_short l_linger; +}; +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ +#define IOCPARM_MASK 0x7f +#define IOC_VOID 0x20000000 +#define IOC_OUT 0x40000000 +#define IOC_IN 0x80000000 +#define IOC_INOUT (IOC_IN|IOC_OUT) + +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) +#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) +#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) +#define FIONBIO _IOW('f', 126, u_long) +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +#define FIONREAD _IOR('f', 127, u_long) +#define FIOASYNC _IOW('f', 125, u_long) +#define SIOCSHIWAT _IOW('s', 0, u_long) +#define SIOCGHIWAT _IOR('s', 1, u_long) +#define SIOCSLOWAT _IOW('s', 2, u_long) +#define SIOCGLOWAT _IOR('s', 3, u_long) +#define SIOCATMARK _IOR('s', 7, u_long) + +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +struct netent { + char * n_name; + char **n_aliases; + short n_addrtype; + u_long n_net; +}; +struct servent { + char *s_name; + char **s_aliases; + short s_port; + char *s_proto; +}; +struct protoent { + char *p_name; + char **p_aliases; + short p_proto; +}; +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +#define IPPROTO_IP 0 +#define IPPROTO_ICMP 1 +#define IPPROTO_IGMP 2 +#define IPPROTO_GGP 3 +#define IPPROTO_TCP 6 +#define IPPROTO_PUP 12 +#define IPPROTO_UDP 17 +#define IPPROTO_IDP 22 +#define IPPROTO_ND 77 +#define IPPROTO_RAW 255 +#define IPPROTO_MAX 256 +/* IPv6 options */ +#define IPPROTO_HOPOPTS 0 /* IPv6 Hop-by-Hop options */ +#define IPPROTO_IPV6 41 /* IPv6 header */ +#define IPPROTO_ROUTING 43 /* IPv6 Routing header */ +#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */ +#define IPPROTO_ESP 50 /* encapsulating security payload */ +#define IPPROTO_AH 51 /* authentication header */ +#define IPPROTO_ICMPV6 58 /* ICMPv6 */ +#define IPPROTO_NONE 59 /* IPv6 no next header */ +#define IPPROTO_DSTOPTS 60 /* IPv6 Destination options */ +#define IPPORT_ECHO 7 +#define IPPORT_DISCARD 9 +#define IPPORT_SYSTAT 11 +#define IPPORT_DAYTIME 13 +#define IPPORT_NETSTAT 15 +#define IPPORT_FTP 21 +#define IPPORT_TELNET 23 +#define IPPORT_SMTP 25 +#define IPPORT_TIMESERVER 37 +#define IPPORT_NAMESERVER 42 +#define IPPORT_WHOIS 43 +#define IPPORT_MTP 57 +#define IPPORT_TFTP 69 +#define IPPORT_RJE 77 +#define IPPORT_FINGER 79 +#define IPPORT_TTYLINK 87 +#define IPPORT_SUPDUP 95 +#define IPPORT_EXECSERVER 512 +#define IPPORT_LOGINSERVER 513 +#define IPPORT_CMDSERVER 514 +#define IPPORT_EFSSERVER 520 +#define IPPORT_BIFFUDP 512 +#define IPPORT_WHOSERVER 513 +#define IPPORT_ROUTESERVER 520 +#define IPPORT_RESERVED 1024 +#define IMPLINK_IP 155 +#define IMPLINK_LOWEXPER 156 +#define IMPLINK_HIGHEXPER 158 +struct in_addr { + union { + struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; + struct { u_short s_w1,s_w2; } S_un_w; + u_long S_addr; + } S_un; +#define s_addr S_un.S_addr +#define s_host S_un.S_un_b.s_b2 +#define s_net S_un.S_un_b.s_b1 +#define s_imp S_un.S_un_w.s_w2 +#define s_impno S_un.S_un_b.s_b4 +#define s_lh S_un.S_un_b.s_b3 +}; +#define IN_CLASSA(i) (((long)(i)&0x80000000) == 0) +#define IN_CLASSA_NET 0xff000000 +#define IN_CLASSA_NSHIFT 24 +#define IN_CLASSA_HOST 0x00ffffff +#define IN_CLASSA_MAX 128 +#define IN_CLASSB(i) (((long)(i)&0xc0000000)==0x80000000) +#define IN_CLASSB_NET 0xffff0000 +#define IN_CLASSB_NSHIFT 16 +#define IN_CLASSB_HOST 0x0000ffff +#define IN_CLASSB_MAX 65536 +#define IN_CLASSC(i) (((long)(i)&0xe0000000)==0xc0000000) +#define IN_CLASSC_NET 0xffffff00 +#define IN_CLASSC_NSHIFT 8 +#define IN_CLASSC_HOST 0xff +#define INADDR_ANY (u_long)0 +#define INADDR_LOOPBACK 0x7f000001 +#define INADDR_BROADCAST (u_long)0xffffffff +#define INADDR_NONE 0xffffffff +struct sockaddr_in { + short sin_family; + u_short sin_port; + struct in_addr sin_addr; + char sin_zero[8]; +}; +#define WSADESCRIPTION_LEN 256 +#define WSASYS_STATUS_LEN 128 +typedef struct WSAData { + WORD wVersion; + WORD wHighVersion; + char szDescription[WSADESCRIPTION_LEN+1]; + char szSystemStatus[WSASYS_STATUS_LEN+1]; + unsigned short iMaxSockets; + unsigned short iMaxUdpDg; + char * lpVendorInfo; +} WSADATA; +typedef WSADATA *LPWSADATA; + +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define IP_OPTIONS 1 +#define SO_DEBUG 1 +#define SO_ACCEPTCONN 2 +#define SO_REUSEADDR 4 +#define SO_KEEPALIVE 8 +#define SO_DONTROUTE 16 +#define SO_BROADCAST 32 +#define SO_USELOOPBACK 64 +#define SO_LINGER 128 +#define SO_OOBINLINE 256 +#define SO_DONTLINGER (u_int)(~SO_LINGER) +#define SO_EXCLUSIVEADDRUSE ((u_int)(~SO_REUSEADDR)) +#define SO_SNDBUF 0x1001 +#define SO_RCVBUF 0x1002 +#define SO_SNDLOWAT 0x1003 +#define SO_RCVLOWAT 0x1004 +#define SO_SNDTIMEO 0x1005 +#define SO_RCVTIMEO 0x1006 +#define SO_ERROR 0x1007 +#define SO_TYPE 0x1008 +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +#define INVALID_SOCKET (SOCKET)(~0) +#define SOCKET_ERROR (-1) +#define SOCK_STREAM 1 +#define SOCK_DGRAM 2 +#define SOCK_RAW 3 +#define SOCK_RDM 4 +#define SOCK_SEQPACKET 5 +#define TCP_NODELAY 0x0001 +#define AF_UNSPEC 0 +#define AF_UNIX 1 +#define AF_INET 2 +#define AF_IMPLINK 3 +#define AF_PUP 4 +#define AF_CHAOS 5 +#define AF_IPX 6 +#define AF_NS 6 +#define AF_ISO 7 +#define AF_OSI AF_ISO +#define AF_ECMA 8 +#define AF_DATAKIT 9 +#define AF_CCITT 10 +#define AF_SNA 11 +#define AF_DECnet 12 +#define AF_DLI 13 +#define AF_LAT 14 +#define AF_HYLINK 15 +#define AF_APPLETALK 16 +#define AF_NETBIOS 17 +#define AF_VOICEVIEW 18 +#define AF_FIREFOX 19 +#define AF_UNKNOWN1 20 +#define AF_BAN 21 +#define AF_ATM 22 +#define AF_INET6 23 +#define AF_CLUSTER 24 +#define AF_12844 25 +#define AF_IRDA 26 +#define AF_NETDES 28 +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define AF_MAX 29 +struct sockaddr { + u_short sa_family; + char sa_data[14]; +}; + +/* Portable IPv6/IPv4 version of sockaddr. Based on RFC 2553. + Pad to force 8 byte alignment and maximum size of 128 bytes. */ + +/* + * Desired design of maximum size and alignment + */ +#define _SS_MAXSIZE 128 +#define _SS_ALIGNSIZE (sizeof (__int64)) +/* + * Definitions used for sockaddr_storage structure paddings design. + */ +#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (short)) +#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (short) \ + + _SS_PAD1SIZE \ + + _SS_ALIGNSIZE)) +struct sockaddr_storage { + short ss_family; + char __ss_pad1[_SS_PAD1SIZE]; /* pad to 8 */ + __int64 __ss_align; /* force alignment */ + char __ss_pad2[_SS_PAD2SIZE]; /* pad to 128 */ +}; +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +struct sockproto { + u_short sp_family; + u_short sp_protocol; +}; +#define PF_UNSPEC AF_UNSPEC +#define PF_UNIX AF_UNIX +#define PF_INET AF_INET +#define PF_IMPLINK AF_IMPLINK +#define PF_PUP AF_PUP +#define PF_CHAOS AF_CHAOS +#define PF_NS AF_NS +#define PF_IPX AF_IPX +#define PF_ISO AF_ISO +#define PF_OSI AF_OSI +#define PF_ECMA AF_ECMA +#define PF_DATAKIT AF_DATAKIT +#define PF_CCITT AF_CCITT +#define PF_SNA AF_SNA +#define PF_DECnet AF_DECnet +#define PF_DLI AF_DLI +#define PF_LAT AF_LAT +#define PF_HYLINK AF_HYLINK +#define PF_APPLETALK AF_APPLETALK +#define PF_VOICEVIEW AF_VOICEVIEW +#define PF_FIREFOX AF_FIREFOX +#define PF_UNKNOWN1 AF_UNKNOWN1 +#define PF_BAN AF_BAN +#define PF_ATM AF_ATM +#define PF_INET6 AF_INET6 +#define PF_MAX AF_MAX +#define SOL_SOCKET 0xffff +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define SOMAXCONN 0x7fffffff /* (5) in WinSock1.1 */ +#define MSG_OOB 1 +#define MSG_PEEK 2 +#define MSG_DONTROUTE 4 +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ +#define MSG_MAXIOVLEN 16 +#define MSG_PARTIAL 0x8000 +#define MAXGETHOSTSTRUCT 1024 + +#define FD_READ_BIT 0 +#define FD_READ (1 << FD_READ_BIT) +#define FD_WRITE_BIT 1 +#define FD_WRITE (1 << FD_WRITE_BIT) +#define FD_OOB_BIT 2 +#define FD_OOB (1 << FD_OOB_BIT) +#define FD_ACCEPT_BIT 3 +#define FD_ACCEPT (1 << FD_ACCEPT_BIT) +#define FD_CONNECT_BIT 4 +#define FD_CONNECT (1 << FD_CONNECT_BIT) +#define FD_CLOSE_BIT 5 +#define FD_CLOSE (1 << FD_CLOSE_BIT) +/* winsock1.1 defines stop at FD_CLOSE (32) */ +#define FD_QOS_BIT 6 +#define FD_QOS (1 << FD_QOS_BIT) +#define FD_GROUP_QOS_BIT 7 +#define FD_GROUP_QOS (1 << FD_GROUP_QOS_BIT) +#define FD_ROUTING_INTERFACE_CHANGE_BIT 8 +#define FD_ROUTING_INTERFACE_CHANGE (1 << FD_ROUTING_INTERFACE_CHANGE_BIT) +#define FD_ADDRESS_LIST_CHANGE_BIT 9 +#define FD_ADDRESS_LIST_CHANGE (1 << FD_ADDRESS_LIST_CHANGE_BIT) +#define FD_MAX_EVENTS 10 +#define FD_ALL_EVENTS ((1 << FD_MAX_EVENTS) - 1) + +#ifndef WSABASEERR +#define WSABASEERR 10000 +#define WSAEINTR (WSABASEERR+4) +#define WSAEBADF (WSABASEERR+9) +#define WSAEACCES (WSABASEERR+13) +#define WSAEFAULT (WSABASEERR+14) +#define WSAEINVAL (WSABASEERR+22) +#define WSAEMFILE (WSABASEERR+24) +#define WSAEWOULDBLOCK (WSABASEERR+35) +#define WSAEINPROGRESS (WSABASEERR+36) /* deprecated on WinSock2 */ +#define WSAEALREADY (WSABASEERR+37) +#define WSAENOTSOCK (WSABASEERR+38) +#define WSAEDESTADDRREQ (WSABASEERR+39) +#define WSAEMSGSIZE (WSABASEERR+40) +#define WSAEPROTOTYPE (WSABASEERR+41) +#define WSAENOPROTOOPT (WSABASEERR+42) +#define WSAEPROTONOSUPPORT (WSABASEERR+43) +#define WSAESOCKTNOSUPPORT (WSABASEERR+44) +#define WSAEOPNOTSUPP (WSABASEERR+45) +#define WSAEPFNOSUPPORT (WSABASEERR+46) +#define WSAEAFNOSUPPORT (WSABASEERR+47) +#define WSAEADDRINUSE (WSABASEERR+48) +#define WSAEADDRNOTAVAIL (WSABASEERR+49) +#define WSAENETDOWN (WSABASEERR+50) +#define WSAENETUNREACH (WSABASEERR+51) +#define WSAENETRESET (WSABASEERR+52) +#define WSAECONNABORTED (WSABASEERR+53) +#define WSAECONNRESET (WSABASEERR+54) +#define WSAENOBUFS (WSABASEERR+55) +#define WSAEISCONN (WSABASEERR+56) +#define WSAENOTCONN (WSABASEERR+57) +#define WSAESHUTDOWN (WSABASEERR+58) +#define WSAETOOMANYREFS (WSABASEERR+59) +#define WSAETIMEDOUT (WSABASEERR+60) +#define WSAECONNREFUSED (WSABASEERR+61) +#define WSAELOOP (WSABASEERR+62) +#define WSAENAMETOOLONG (WSABASEERR+63) +#define WSAEHOSTDOWN (WSABASEERR+64) +#define WSAEHOSTUNREACH (WSABASEERR+65) +#define WSAENOTEMPTY (WSABASEERR+66) +#define WSAEPROCLIM (WSABASEERR+67) +#define WSAEUSERS (WSABASEERR+68) +#define WSAEDQUOT (WSABASEERR+69) +#define WSAESTALE (WSABASEERR+70) +#define WSAEREMOTE (WSABASEERR+71) +#define WSAEDISCON (WSABASEERR+101) +#define WSASYSNOTREADY (WSABASEERR+91) +#define WSAVERNOTSUPPORTED (WSABASEERR+92) +#define WSANOTINITIALISED (WSABASEERR+93) +#define WSAHOST_NOT_FOUND (WSABASEERR+1001) +#define WSATRY_AGAIN (WSABASEERR+1002) +#define WSANO_RECOVERY (WSABASEERR+1003) +#define WSANO_DATA (WSABASEERR+1004) + +/* WinSock2 specific error codes */ +#define WSAENOMORE (WSABASEERR+102) +#define WSAECANCELLED (WSABASEERR+103) +#define WSAEINVALIDPROCTABLE (WSABASEERR+104) +#define WSAEINVALIDPROVIDER (WSABASEERR+105) +#define WSAEPROVIDERFAILEDINIT (WSABASEERR+106) +#define WSASYSCALLFAILURE (WSABASEERR+107) +#define WSASERVICE_NOT_FOUND (WSABASEERR+108) +#define WSATYPE_NOT_FOUND (WSABASEERR+109) +#define WSA_E_NO_MORE (WSABASEERR+110) +#define WSA_E_CANCELLED (WSABASEERR+111) +#define WSAEREFUSED (WSABASEERR+112) + +/* WS QualityofService errors */ +#define WSA_QOS_RECEIVERS (WSABASEERR + 1005) +#define WSA_QOS_SENDERS (WSABASEERR + 1006) +#define WSA_QOS_NO_SENDERS (WSABASEERR + 1007) +#define WSA_QOS_NO_RECEIVERS (WSABASEERR + 1008) +#define WSA_QOS_REQUEST_CONFIRMED (WSABASEERR + 1009) +#define WSA_QOS_ADMISSION_FAILURE (WSABASEERR + 1010) +#define WSA_QOS_POLICY_FAILURE (WSABASEERR + 1011) +#define WSA_QOS_BAD_STYLE (WSABASEERR + 1012) +#define WSA_QOS_BAD_OBJECT (WSABASEERR + 1013) +#define WSA_QOS_TRAFFIC_CTRL_ERROR (WSABASEERR + 1014) +#define WSA_QOS_GENERIC_ERROR (WSABASEERR + 1015) +#define WSA_QOS_ESERVICETYPE (WSABASEERR + 1016) +#define WSA_QOS_EFLOWSPEC (WSABASEERR + 1017) +#define WSA_QOS_EPROVSPECBUF (WSABASEERR + 1018) +#define WSA_QOS_EFILTERSTYLE (WSABASEERR + 1019) +#define WSA_QOS_EFILTERTYPE (WSABASEERR + 1020) +#define WSA_QOS_EFILTERCOUNT (WSABASEERR + 1021) +#define WSA_QOS_EOBJLENGTH (WSABASEERR + 1022) +#define WSA_QOS_EFLOWCOUNT (WSABASEERR + 1023) +#define WSA_QOS_EUNKOWNPSOBJ (WSABASEERR + 1024) +#define WSA_QOS_EPOLICYOBJ (WSABASEERR + 1025) +#define WSA_QOS_EFLOWDESC (WSABASEERR + 1026) +#define WSA_QOS_EPSFLOWSPEC (WSABASEERR + 1027) +#define WSA_QOS_EPSFILTERSPEC (WSABASEERR + 1028) +#define WSA_QOS_ESDMODEOBJ (WSABASEERR + 1029) +#define WSA_QOS_ESHAPERATEOBJ (WSABASEERR + 1030) +#define WSA_QOS_RESERVED_PETYPE (WSABASEERR + 1031) + +#endif /* !WSABASEERR */ + +#define WSANO_ADDRESS WSANO_DATA +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define h_errno WSAGetLastError() +#define HOST_NOT_FOUND WSAHOST_NOT_FOUND +#define TRY_AGAIN WSATRY_AGAIN +#define NO_RECOVERY WSANO_RECOVERY +#define NO_DATA WSANO_DATA +#define NO_ADDRESS WSANO_ADDRESS +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ +WINSOCK_API_LINKAGE SOCKET PASCAL accept(SOCKET,struct sockaddr*,int*); +WINSOCK_API_LINKAGE int PASCAL bind(SOCKET,const struct sockaddr*,int); +WINSOCK_API_LINKAGE int PASCAL closesocket(SOCKET); +WINSOCK_API_LINKAGE int PASCAL connect(SOCKET,const struct sockaddr*,int); +WINSOCK_API_LINKAGE int PASCAL ioctlsocket(SOCKET,long,u_long *); +WINSOCK_API_LINKAGE int PASCAL getpeername(SOCKET,struct sockaddr*,int*); +WINSOCK_API_LINKAGE int PASCAL getsockname(SOCKET,struct sockaddr*,int*); +WINSOCK_API_LINKAGE int PASCAL getsockopt(SOCKET,int,int,char*,int*); +WINSOCK_API_LINKAGE unsigned long PASCAL inet_addr(const char*); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(char *) inet_ntoa(struct in_addr); +WINSOCK_API_LINKAGE int PASCAL listen(SOCKET,int); +WINSOCK_API_LINKAGE int PASCAL recv(SOCKET,char*,int,int); +WINSOCK_API_LINKAGE int PASCAL recvfrom(SOCKET,char*,int,int,struct sockaddr*,int*); +WINSOCK_API_LINKAGE int PASCAL send(SOCKET,const char*,int,int); +WINSOCK_API_LINKAGE int PASCAL sendto(SOCKET,const char*,int,int,const struct sockaddr*,int); +WINSOCK_API_LINKAGE int PASCAL setsockopt(SOCKET,int,int,const char*,int); +WINSOCK_API_LINKAGE int PASCAL shutdown(SOCKET,int); +WINSOCK_API_LINKAGE SOCKET PASCAL socket(int,int,int); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(struct hostent *) gethostbyaddr(const char*,int,int); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(struct hostent *) gethostbyname(const char*); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(struct servent *) getservbyport(int,const char*); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(struct servent *) getservbyname(const char*,const char*); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(struct protoent *) getprotobynumber(int); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(struct protoent *) getprotobyname(const char*); +typedef SOCKET (PASCAL * LPFN_ACCEPT)(SOCKET, struct sockaddr*,int *); +typedef int (PASCAL * LPFN_BIND)(SOCKET, const struct sockaddr*,int); +typedef int (PASCAL * LPFN_CLOSESOCKET)(SOCKET); +typedef int (PASCAL * LPFN_CONNECT)(SOCKET, const struct sockaddr*,int); +typedef int (PASCAL * LPFN_IOCTLSOCKET)(SOCKET, long, u_long*); +typedef int (PASCAL * LPFN_GETPEERNAME)(SOCKET, struct sockaddr*, int*); +typedef int(PASCAL * LPFN_GETSOCKNAME)(SOCKET, struct sockaddr*, int*); +typedef int(PASCAL * LPFN_GETSOCKOPT)(SOCKET, int, int, char*, int*); +typedef u_long(PASCAL * LPFN_HTONL)(u_long); +typedef u_short(PASCAL * LPFN_HTONS)(u_short); +typedef unsigned long(PASCAL * LPFN_INET_ADDR)(const char*); +typedef char*(PASCAL * LPFN_INET_NTOA)(struct in_addr); +typedef int(PASCAL * LPFN_LISTEN)(SOCKET, int); +typedef u_long(PASCAL * LPFN_NTOHL)(u_long); +typedef u_short(PASCAL * LPFN_NTOHS)(u_short); +typedef int(PASCAL * LPFN_RECV)(SOCKET, char*, int, int); +typedef int(PASCAL * LPFN_RECVFROM)(SOCKET, char*, int, int, struct sockaddr*, int*); +typedef int(PASCAL * LPFN_SELECT)(int, fd_set*, fd_set*, fd_set*, const struct timeval*); +typedef int(PASCAL * LPFN_SEND)(SOCKET, const char*, int, int); +typedef int(PASCAL * LPFN_SENDTO)(SOCKET, const char*, int, int, const struct sockaddr*, int); +typedef int(PASCAL * LPFN_SETSOCKOPT)(SOCKET, int, int, const char*, int); +typedef int(PASCAL * LPFN_SHUTDOWN)(SOCKET, int); +typedef SOCKET(PASCAL * LPFN_SOCKET)(int, int, int); +typedef struct hostent*(PASCAL * LPFN_GETHOSTBYADDR)( const char*, int, int); +typedef struct hostent*(PASCAL * LPFN_GETHOSTBYNAME)( const char*); +typedef int(PASCAL * LPFN_GETHOSTNAME)(char*, int); +typedef struct servent*(PASCAL * LPFN_GETSERVBYPORT)(int, const char*); +typedef struct servent*(PASCAL * LPFN_GETSERVBYNAME)(const char*, const char*); +typedef struct protoent*(PASCAL * LPFN_GETPROTOBYNUMBER)(int); +typedef struct protoent*(PASCAL * LPFN_GETPROTOBYNAME)(const char*); + +WINSOCK_API_LINKAGE int PASCAL WSAStartup(WORD,LPWSADATA); +WINSOCK_API_LINKAGE int PASCAL WSACleanup(void); +WINSOCK_API_LINKAGE void PASCAL WSASetLastError(int); +WINSOCK_API_LINKAGE int PASCAL WSAGetLastError(void); +WINSOCK_API_LINKAGE typedef int(PASCAL * LPFN_WSASTARTUP)(WORD, LPWSADATA); +typedef int(PASCAL * LPFN_WSACLEANUP)(void); +typedef void(PASCAL * LPFN_WSASETLASTERROR)(int); +typedef int(PASCAL * LPFN_WSAGETLASTERROR)(void); +/* + * Pseudo-blocking functions are deprecated in WinSock2 + * spec. Use threads instead. + */ +WINSOCK_API_LINKAGE BOOL PASCAL WSAIsBlocking(void); +WINSOCK_API_LINKAGE int PASCAL WSAUnhookBlockingHook(void); +WINSOCK_API_LINKAGE FARPROC PASCAL WSASetBlockingHook(FARPROC); +WINSOCK_API_LINKAGE int PASCAL WSACancelBlockingCall(void); +typedef BOOL(PASCAL * LPFN_WSAISBLOCKING)(void); +typedef int(PASCAL * LPFN_WSAUNHOOKBLOCKINGHOOK)(void); +typedef FARPROC (PASCAL * LPFN_WSASETBLOCKINGHOOK)(FARPROC); +typedef int(PASCAL * LPFN_WSACANCELBLOCKINGCALL)(void); + +WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetServByName(HWND,u_int,const char*,const char*,char*,int); +WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetServByPort(HWND,u_int,int,const char*,char*,int); +WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetProtoByName(HWND,u_int,const char*,char*,int); +WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetProtoByNumber(HWND,u_int,int,char*,int); +WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetHostByName(HWND,u_int,const char*,char*,int); +WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetHostByAddr(HWND,u_int,const char*,int,int,char*,int); +WINSOCK_API_LINKAGE int PASCAL WSACancelAsyncRequest(HANDLE); +WINSOCK_API_LINKAGE int PASCAL WSAAsyncSelect(SOCKET,HWND,u_int,long); +typedef HANDLE(PASCAL * LPFN_WSAASYNCGETSERVBYNAME)(HWND, u_int, const char *, const char *, char *, int); +typedef HANDLE(PASCAL * LPFN_WSAASYNCGETSERVBYPORT)(HWND, u_int, int, const char *, char *, int); +typedef HANDLE(PASCAL * LPFN_WSAASYNCGETPROTOBYNAME)(HWND, u_int, const char*, char*, int); +typedef HANDLE(PASCAL * LPFN_WSAASYNCGETPROTOBYNUMBER)(HWND, u_int, int, char*, int); +typedef HANDLE(PASCAL * LPFN_WSAASYNCGETHOSTBYADDR)(HWND, u_int, const char*, int, int, char*, int); +typedef int(PASCAL * LPFN_WSACANCELASYNCREQUEST)(HANDLE); +typedef int(PASCAL * LPFN_WSAASYNCSELECT)(SOCKET, HWND, u_int, long); +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +WINSOCK_API_LINKAGE u_long PASCAL htonl(u_long); +WINSOCK_API_LINKAGE u_long PASCAL ntohl(u_long); +WINSOCK_API_LINKAGE u_short PASCAL htons(u_short); +WINSOCK_API_LINKAGE u_short PASCAL ntohs(u_short); +WINSOCK_API_LINKAGE int PASCAL select(int nfds,fd_set*,fd_set*,fd_set*,const struct timeval*); +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +int PASCAL gethostname(char*,int); + +#define WSAMAKEASYNCREPLY(b,e) MAKELONG(b,e) +#define WSAMAKESELECTREPLY(e,error) MAKELONG(e,error) +#define WSAGETASYNCBUFLEN(l) LOWORD(l) +#define WSAGETASYNCERROR(l) HIWORD(l) +#define WSAGETSELECTEVENT(l) LOWORD(l) +#define WSAGETSELECTERROR(l) HIWORD(l) + +typedef struct sockaddr SOCKADDR; +typedef struct sockaddr *PSOCKADDR; +typedef struct sockaddr *LPSOCKADDR; +typedef struct sockaddr_storage SOCKADDR_STORAGE, *PSOCKADDR_STORAGE; +typedef struct sockaddr_in SOCKADDR_IN; +typedef struct sockaddr_in *PSOCKADDR_IN; +typedef struct sockaddr_in *LPSOCKADDR_IN; +typedef struct linger LINGER; +typedef struct linger *PLINGER; +typedef struct linger *LPLINGER; +typedef struct in_addr IN_ADDR; +typedef struct in_addr *PIN_ADDR; +typedef struct in_addr *LPIN_ADDR; +typedef struct fd_set FD_SET; +typedef struct fd_set *PFD_SET; +typedef struct fd_set *LPFD_SET; +typedef struct hostent HOSTENT; +typedef struct hostent *PHOSTENT; +typedef struct hostent *LPHOSTENT; +typedef struct servent SERVENT; +typedef struct servent *PSERVENT; +typedef struct servent *LPSERVENT; +typedef struct protoent PROTOENT; +typedef struct protoent *PPROTOENT; +typedef struct protoent *LPPROTOENT; +typedef struct timeval TIMEVAL; +typedef struct timeval *PTIMEVAL; +typedef struct timeval *LPTIMEVAL; + +/* winsock2 additions */ +#define ADDR_ANY INADDR_ANY + +#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000) +#define IN_CLASSD_NET 0xf0000000 +#define IN_CLASSD_NSHIFT 28 +#define IN_CLASSD_HOST 0x0fffffff +#define IN_MULTICAST(i) IN_CLASSD(i) + +#define FROM_PROTOCOL_INFO (-1) + +#define SO_DONTLINGER (u_int)(~SO_LINGER) +#define SO_GROUP_ID 0x2001 +#define SO_GROUP_PRIORITY 0x2002 +#define SO_MAX_MSG_SIZE 0x2003 +#define SO_PROTOCOL_INFOA 0x2004 +#define SO_PROTOCOL_INFOW 0x2005 +#ifdef UNICODE +#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOW +#else +#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOA +#endif +#define PVD_CONFIG 0x3001 + +#define MSG_INTERRUPT 0x10 +#define MSG_MAXIOVLEN 16 + +#define WSAAPI WINAPI +#define WSAEVENT HANDLE +#define LPWSAEVENT LPHANDLE +#define WSAOVERLAPPED OVERLAPPED +typedef struct _OVERLAPPED *LPWSAOVERLAPPED; + +#define WSA_IO_PENDING (ERROR_IO_PENDING) +#define WSA_IO_INCOMPLETE (ERROR_IO_INCOMPLETE) +#define WSA_INVALID_HANDLE (ERROR_INVALID_HANDLE) +#define WSA_INVALID_PARAMETER (ERROR_INVALID_PARAMETER) +#define WSA_NOT_ENOUGH_MEMORY (ERROR_NOT_ENOUGH_MEMORY) +#define WSA_OPERATION_ABORTED (ERROR_OPERATION_ABORTED) + +#define WSA_INVALID_EVENT ((WSAEVENT)NULL) +#define WSA_MAXIMUM_WAIT_EVENTS (MAXIMUM_WAIT_OBJECTS) +#define WSA_WAIT_FAILED ((DWORD)-1L) +#define WSA_WAIT_EVENT_0 (WAIT_OBJECT_0) +#define WSA_WAIT_IO_COMPLETION (WAIT_IO_COMPLETION) +#define WSA_WAIT_TIMEOUT (WAIT_TIMEOUT) +#define WSA_INFINITE (INFINITE) + +typedef struct _WSABUF { + unsigned long len; + char *buf; +} WSABUF, *LPWSABUF; + +typedef enum +{ + BestEffortService, + ControlledLoadService, + PredictiveService, + GuaranteedDelayService, + GuaranteedService +} GUARANTEE; + +/* TODO: FLOWSPEC and related definitions belong in qos.h */ + +/* + Windows Sockets 2 Application Programming Interface, + revision 2.2.2 (1997) uses the type uint32 for SERVICETYPE + and the elements of _flowspec, but the type uint32 is not defined + or used anywhere else in the w32api. For now, just use + unsigned int, which is 32 bits on _WIN32 and _WIN64. +*/ + +typedef unsigned int SERVICETYPE; +typedef struct _flowspec +{ + unsigned int TokenRate; + unsigned int TokenBucketSize; + unsigned int PeakBandwidth; + unsigned int Latency; + unsigned int DelayVariation; + SERVICETYPE ServiceType; + unsigned int MaxSduSize; + unsigned int MinimumPolicedSize; + } FLOWSPEC, *PFLOWSPEC, *LPFLOWSPEC; + +typedef struct _QualityOfService +{ + FLOWSPEC SendingFlowspec; + FLOWSPEC ReceivingFlowspec; + WSABUF ProviderSpecific; +} QOS, *LPQOS; + +#define CF_ACCEPT 0x0000 +#define CF_REJECT 0x0001 +#define CF_DEFER 0x0002 +#define SD_RECEIVE 0x00 +#define SD_SEND 0x01 +#define SD_BOTH 0x02 +typedef unsigned int GROUP; + +#define SG_UNCONSTRAINED_GROUP 0x01 +#define SG_CONSTRAINED_GROUP 0x02 +typedef struct _WSANETWORKEVENTS { + long lNetworkEvents; + int iErrorCode[FD_MAX_EVENTS]; +} WSANETWORKEVENTS, *LPWSANETWORKEVENTS; + +#define MAX_PROTOCOL_CHAIN 7 + +#define BASE_PROTOCOL 1 +#define LAYERED_PROTOCOL 0 + +typedef enum _WSAESETSERVICEOP +{ + RNRSERVICE_REGISTER=0, + RNRSERVICE_DEREGISTER, + RNRSERVICE_DELETE +} WSAESETSERVICEOP, *PWSAESETSERVICEOP, *LPWSAESETSERVICEOP; + +typedef struct _AFPROTOCOLS { + INT iAddressFamily; + INT iProtocol; +} AFPROTOCOLS, *PAFPROTOCOLS, *LPAFPROTOCOLS; + +typedef enum _WSAEcomparator +{ + COMP_EQUAL = 0, + COMP_NOTLESS +} WSAECOMPARATOR, *PWSAECOMPARATOR, *LPWSAECOMPARATOR; + +typedef struct _WSAVersion +{ + DWORD dwVersion; + WSAECOMPARATOR ecHow; +} WSAVERSION, *PWSAVERSION, *LPWSAVERSION; + +#ifndef __CSADDR_T_DEFINED /* also in nspapi.h */ +#define __CSADDR_T_DEFINED +typedef struct _SOCKET_ADDRESS { + LPSOCKADDR lpSockaddr; + INT iSockaddrLength; +} SOCKET_ADDRESS,*PSOCKET_ADDRESS,*LPSOCKET_ADDRESS; +typedef struct _CSADDR_INFO { + SOCKET_ADDRESS LocalAddr; + SOCKET_ADDRESS RemoteAddr; + INT iSocketType; + INT iProtocol; +} CSADDR_INFO,*PCSADDR_INFO,*LPCSADDR_INFO; +#endif + +typedef struct _SOCKET_ADDRESS_LIST { + INT iAddressCount; + SOCKET_ADDRESS Address[1]; +} SOCKET_ADDRESS_LIST, * LPSOCKET_ADDRESS_LIST; + +#ifndef __BLOB_T_DEFINED /* also in wtypes.h and nspapi.h */ +#define __BLOB_T_DEFINED +typedef struct _BLOB { + ULONG cbSize; + BYTE *pBlobData; +} BLOB,*PBLOB,*LPBLOB; +#endif + +typedef struct _WSAQuerySetA +{ + DWORD dwSize; + LPSTR lpszServiceInstanceName; + LPGUID lpServiceClassId; + LPWSAVERSION lpVersion; + LPSTR lpszComment; + DWORD dwNameSpace; + LPGUID lpNSProviderId; + LPSTR lpszContext; + DWORD dwNumberOfProtocols; + LPAFPROTOCOLS lpafpProtocols; + LPSTR lpszQueryString; + DWORD dwNumberOfCsAddrs; + LPCSADDR_INFO lpcsaBuffer; + DWORD dwOutputFlags; + LPBLOB lpBlob; +} WSAQUERYSETA, *PWSAQUERYSETA, *LPWSAQUERYSETA; + +typedef struct _WSAQuerySetW +{ + DWORD dwSize; + LPWSTR lpszServiceInstanceName; + LPGUID lpServiceClassId; + LPWSAVERSION lpVersion; + LPWSTR lpszComment; + DWORD dwNameSpace; + LPGUID lpNSProviderId; + LPWSTR lpszContext; + DWORD dwNumberOfProtocols; + LPAFPROTOCOLS lpafpProtocols; + LPWSTR lpszQueryString; + DWORD dwNumberOfCsAddrs; + LPCSADDR_INFO lpcsaBuffer; + DWORD dwOutputFlags; + LPBLOB lpBlob; +} WSAQUERYSETW, *PWSAQUERYSETW, *LPWSAQUERYSETW; + +#ifdef UNICODE +typedef WSAQUERYSETW WSAQUERYSET; +typedef PWSAQUERYSETW PWSAQUERYSET; +typedef LPWSAQUERYSETW LPWSAQUERYSET; +#else +typedef WSAQUERYSETA WSAQUERYSET; +typedef PWSAQUERYSETA PWSAQUERYSET; +typedef LPWSAQUERYSETA LPWSAQUERYSET; +#endif + +#define LUP_DEEP 0x0001 +#define LUP_CONTAINERS 0x0002 +#define LUP_NOCONTAINERS 0x0004 +#define LUP_NEAREST 0x0008 +#define LUP_RETURN_NAME 0x0010 +#define LUP_RETURN_TYPE 0x0020 +#define LUP_RETURN_VERSION 0x0040 +#define LUP_RETURN_COMMENT 0x0080 +#define LUP_RETURN_ADDR 0x0100 +#define LUP_RETURN_BLOB 0x0200 +#define LUP_RETURN_ALIASES 0x0400 +#define LUP_RETURN_QUERY_STRING 0x0800 +#define LUP_RETURN_ALL 0x0FF0 +#define LUP_RES_SERVICE 0x8000 +#define LUP_FLUSHCACHE 0x1000 +#define LUP_FLUSHPREVIOUS 0x2000 + +typedef struct _WSANSClassInfoA +{ + LPSTR lpszName; + DWORD dwNameSpace; + DWORD dwValueType; + DWORD dwValueSize; + LPVOID lpValue; +} WSANSCLASSINFOA, *PWSANSCLASSINFOA, *LPWSANSCLASSINFOA; + +typedef struct _WSANSClassInfoW +{ + LPWSTR lpszName; + DWORD dwNameSpace; + DWORD dwValueType; + DWORD dwValueSize; + LPVOID lpValue; +} WSANSCLASSINFOW, *PWSANSCLASSINFOW, *LPWSANSCLASSINFOW; + +#ifdef UNICODE +typedef WSANSCLASSINFOW WSANSCLASSINFO; +typedef PWSANSCLASSINFOW PWSANSCLASSINFO; +typedef LPWSANSCLASSINFOW LPWSANSCLASSINFO; +#else +typedef WSANSCLASSINFOA WSANSCLASSINFO; +typedef PWSANSCLASSINFOA PWSANSCLASSINFO; +typedef LPWSANSCLASSINFOA LPWSANSCLASSINFO; +#endif + +typedef struct _WSAServiceClassInfoA +{ + LPGUID lpServiceClassId; + LPSTR lpszServiceClassName; + DWORD dwCount; + LPWSANSCLASSINFOA lpClassInfos; +} WSASERVICECLASSINFOA, *PWSASERVICECLASSINFOA, *LPWSASERVICECLASSINFOA; + +typedef struct _WSAServiceClassInfoW +{ + LPGUID lpServiceClassId; + LPWSTR lpszServiceClassName; + DWORD dwCount; + LPWSANSCLASSINFOW lpClassInfos; +} WSASERVICECLASSINFOW, *PWSASERVICECLASSINFOW, *LPWSASERVICECLASSINFOW; + +#ifdef UNICODE +typedef WSASERVICECLASSINFOW WSASERVICECLASSINFO; +typedef PWSASERVICECLASSINFOW PWSASERVICECLASSINFO; +typedef LPWSASERVICECLASSINFOW LPWSASERVICECLASSINFO; +#else +typedef WSASERVICECLASSINFOA WSASERVICECLASSINFO; +typedef PWSASERVICECLASSINFOA PWSASERVICECLASSINFO; +typedef LPWSASERVICECLASSINFOA LPWSASERVICECLASSINFO; +#endif + +typedef struct _WSANAMESPACE_INFOA { + GUID NSProviderId; + DWORD dwNameSpace; + BOOL fActive; + DWORD dwVersion; + LPSTR lpszIdentifier; +} WSANAMESPACE_INFOA, *PWSANAMESPACE_INFOA, *LPWSANAMESPACE_INFOA; + +typedef struct _WSANAMESPACE_INFOW { + GUID NSProviderId; + DWORD dwNameSpace; + BOOL fActive; + DWORD dwVersion; + LPWSTR lpszIdentifier; +} WSANAMESPACE_INFOW, *PWSANAMESPACE_INFOW, *LPWSANAMESPACE_INFOW; + +#ifdef UNICODE +typedef WSANAMESPACE_INFOW WSANAMESPACE_INFO; +typedef PWSANAMESPACE_INFOW PWSANAMESPACE_INFO; +typedef LPWSANAMESPACE_INFOW LPWSANAMESPACE_INFO; +#else +typedef WSANAMESPACE_INFOA WSANAMESPACE_INFO; +typedef PWSANAMESPACE_INFOA PWSANAMESPACE_INFO; +typedef LPWSANAMESPACE_INFOA LPWSANAMESPACE_INFO; +#endif + +typedef struct _WSAPROTOCOLCHAIN { + int ChainLen; + DWORD ChainEntries[MAX_PROTOCOL_CHAIN]; +} WSAPROTOCOLCHAIN, *LPWSAPROTOCOLCHAIN; + +#define WSAPROTOCOL_LEN 255 + +typedef struct _WSAPROTOCOL_INFOA { + DWORD dwServiceFlags1; + DWORD dwServiceFlags2; + DWORD dwServiceFlags3; + DWORD dwServiceFlags4; + DWORD dwProviderFlags; + GUID ProviderId; + DWORD dwCatalogEntryId; + WSAPROTOCOLCHAIN ProtocolChain; + int iVersion; + int iAddressFamily; + int iMaxSockAddr; + int iMinSockAddr; + int iSocketType; + int iProtocol; + int iProtocolMaxOffset; + int iNetworkByteOrder; + int iSecurityScheme; + DWORD dwMessageSize; + DWORD dwProviderReserved; + CHAR szProtocol[WSAPROTOCOL_LEN+1]; +} WSAPROTOCOL_INFOA, *LPWSAPROTOCOL_INFOA; + +typedef struct _WSAPROTOCOL_INFOW { + DWORD dwServiceFlags1; + DWORD dwServiceFlags2; + DWORD dwServiceFlags3; + DWORD dwServiceFlags4; + DWORD dwProviderFlags; + GUID ProviderId; + DWORD dwCatalogEntryId; + WSAPROTOCOLCHAIN ProtocolChain; + int iVersion; + int iAddressFamily; + int iMaxSockAddr; + int iMinSockAddr; + int iSocketType; + int iProtocol; + int iProtocolMaxOffset; + int iNetworkByteOrder; + int iSecurityScheme; + DWORD dwMessageSize; + DWORD dwProviderReserved; + WCHAR szProtocol[WSAPROTOCOL_LEN+1]; +} WSAPROTOCOL_INFOW, * LPWSAPROTOCOL_INFOW; + +typedef int (CALLBACK *LPCONDITIONPROC)(LPWSABUF, LPWSABUF, LPQOS, LPQOS, LPWSABUF, LPWSABUF, GROUP *, DWORD); +typedef void (WINAPI *LPWSAOVERLAPPED_COMPLETION_ROUTINE)(DWORD, DWORD, LPWSAOVERLAPPED, DWORD); + + +#ifdef UNICODE +typedef WSAPROTOCOL_INFOW WSAPROTOCOL_INFO; +typedef LPWSAPROTOCOL_INFOW LPWSAPROTOCOL_INFO; +#else +typedef WSAPROTOCOL_INFOA WSAPROTOCOL_INFO; +typedef LPWSAPROTOCOL_INFOA LPWSAPROTOCOL_INFO; +#endif + +/* Needed for XP & .NET Server function WSANSPIoctl. */ +typedef enum _WSACOMPLETIONTYPE { + NSP_NOTIFY_IMMEDIATELY = 0, + NSP_NOTIFY_HWND, + NSP_NOTIFY_EVENT, + NSP_NOTIFY_PORT, + NSP_NOTIFY_APC +} WSACOMPLETIONTYPE, * PWSACOMPLETIONTYPE, * LPWSACOMPLETIONTYPE; +typedef struct _WSACOMPLETION { + WSACOMPLETIONTYPE Type; + union { + struct { + HWND hWnd; + UINT uMsg; + WPARAM context; + } WindowMessage; + struct { + LPWSAOVERLAPPED lpOverlapped; + } Event; + struct { + LPWSAOVERLAPPED lpOverlapped; + LPWSAOVERLAPPED_COMPLETION_ROUTINE lpfnCompletionProc; + } Apc; + struct { + LPWSAOVERLAPPED lpOverlapped; + HANDLE hPort; + ULONG_PTR Key; + } Port; + } Parameters; +} WSACOMPLETION, *PWSACOMPLETION, *LPWSACOMPLETION; + +#define PFL_MULTIPLE_PROTO_ENTRIES 0x00000001 +#define PFL_RECOMMENDED_PROTO_ENTRY 0x00000002 +#define PFL_HIDDEN 0x00000004 +#define PFL_MATCHES_PROTOCOL_ZERO 0x00000008 +#define XP1_CONNECTIONLESS 0x00000001 +#define XP1_GUARANTEED_DELIVERY 0x00000002 +#define XP1_GUARANTEED_ORDER 0x00000004 +#define XP1_MESSAGE_ORIENTED 0x00000008 +#define XP1_PSEUDO_STREAM 0x00000010 +#define XP1_GRACEFUL_CLOSE 0x00000020 +#define XP1_EXPEDITED_DATA 0x00000040 +#define XP1_CONNECT_DATA 0x00000080 +#define XP1_DISCONNECT_DATA 0x00000100 +#define XP1_SUPPORT_BROADCAST 0x00000200 +#define XP1_SUPPORT_MULTIPOINT 0x00000400 +#define XP1_MULTIPOINT_CONTROL_PLANE 0x00000800 +#define XP1_MULTIPOINT_DATA_PLANE 0x00001000 +#define XP1_QOS_SUPPORTED 0x00002000 +#define XP1_INTERRUPT 0x00004000 +#define XP1_UNI_SEND 0x00008000 +#define XP1_UNI_RECV 0x00010000 +#define XP1_IFS_HANDLES 0x00020000 +#define XP1_PARTIAL_MESSAGE 0x00040000 + +#define BIGENDIAN 0x0000 +#define LITTLEENDIAN 0x0001 + +#define SECURITY_PROTOCOL_NONE 0x0000 +#define JL_SENDER_ONLY 0x01 +#define JL_RECEIVER_ONLY 0x02 +#define JL_BOTH 0x04 +#define WSA_FLAG_OVERLAPPED 0x01 +#define WSA_FLAG_MULTIPOINT_C_ROOT 0x02 +#define WSA_FLAG_MULTIPOINT_C_LEAF 0x04 +#define WSA_FLAG_MULTIPOINT_D_ROOT 0x08 +#define WSA_FLAG_MULTIPOINT_D_LEAF 0x10 +#define IOC_UNIX 0x00000000 +#define IOC_WS2 0x08000000 +#define IOC_PROTOCOL 0x10000000 +#define IOC_VENDOR 0x18000000 + +#define _WSAIO(x,y) (IOC_VOID|(x)|(y)) +#define _WSAIOR(x,y) (IOC_OUT|(x)|(y)) +#define _WSAIOW(x,y) (IOC_IN|(x)|(y)) +#define _WSAIORW(x,y) (IOC_INOUT|(x)|(y)) + +#define SIO_ASSOCIATE_HANDLE _WSAIOW(IOC_WS2,1) +#define SIO_ENABLE_CIRCULAR_QUEUEING _WSAIO(IOC_WS2,2) +#define SIO_FIND_ROUTE _WSAIOR(IOC_WS2,3) +#define SIO_FLUSH _WSAIO(IOC_WS2,4) +#define SIO_GET_BROADCAST_ADDRESS _WSAIOR(IOC_WS2,5) +#define SIO_GET_EXTENSION_FUNCTION_POINTER _WSAIORW(IOC_WS2,6) +#define SIO_GET_QOS _WSAIORW(IOC_WS2,7) +#define SIO_GET_GROUP_QOS _WSAIORW(IOC_WS2,8) +#define SIO_MULTIPOINT_LOOPBACK _WSAIOW(IOC_WS2,9) +#define SIO_MULTICAST_SCOPE _WSAIOW(IOC_WS2,10) +#define SIO_SET_QOS _WSAIOW(IOC_WS2,11) +#define SIO_SET_GROUP_QOS _WSAIOW(IOC_WS2,12) +#define SIO_TRANSLATE_HANDLE _WSAIORW(IOC_WS2,13) +#define SIO_ROUTING_INTERFACE_QUERY _WSAIORW(IOC_WS2,20) +#define SIO_ROUTING_INTERFACE_CHANGE _WSAIOW(IOC_WS2,21) +#define SIO_ADDRESS_LIST_QUERY _WSAIOR(IOC_WS2,22) +#define SIO_ADDRESS_LIST_CHANGE _WSAIO(IOC_WS2,23) +#define SIO_QUERY_TARGET_PNP_HANDLE _WSAIOR(IOC_WS2,24) +#define SIO_NSP_NOTIFY_CHANGE _WSAIOW(IOC_WS2,25) + +#define TH_NETDEV 0x00000001 +#define TH_TAPI 0x00000002 + +WINSOCK_API_LINKAGE SOCKET WINAPI WSAAccept(SOCKET, struct sockaddr *, LPINT, LPCONDITIONPROC, DWORD); +WINSOCK_API_LINKAGE INT WINAPI WSAAddressToStringA(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD); +WINSOCK_API_LINKAGE INT WINAPI WSAAddressToStringW(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOW, LPWSTR, LPDWORD); +WINSOCK_API_LINKAGE BOOL WINAPI WSACloseEvent(WSAEVENT); +WINSOCK_API_LINKAGE int WINAPI WSAConnect(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS); +WINSOCK_API_LINKAGE WSAEVENT WINAPI WSACreateEvent(void); +WINSOCK_API_LINKAGE int WINAPI WSADuplicateSocketA(SOCKET, DWORD, LPWSAPROTOCOL_INFOA); +WINSOCK_API_LINKAGE int WINAPI WSADuplicateSocketW(SOCKET, DWORD, LPWSAPROTOCOL_INFOW); +WINSOCK_API_LINKAGE INT WINAPI WSAEnumNameSpaceProvidersA(LPDWORD, LPWSANAMESPACE_INFOA); +WINSOCK_API_LINKAGE INT WINAPI WSAEnumNameSpaceProvidersW(LPDWORD, LPWSANAMESPACE_INFOW); +WINSOCK_API_LINKAGE int WINAPI WSAEnumNetworkEvents(SOCKET, WSAEVENT, LPWSANETWORKEVENTS); +WINSOCK_API_LINKAGE int WINAPI WSAEnumProtocolsA(LPINT, LPWSAPROTOCOL_INFOA, LPDWORD); +WINSOCK_API_LINKAGE int WINAPI WSAEnumProtocolsW(LPINT, LPWSAPROTOCOL_INFOW, LPDWORD); +WINSOCK_API_LINKAGE int WINAPI WSAEventSelect(SOCKET, WSAEVENT, long); +WINSOCK_API_LINKAGE BOOL WINAPI WSAGetOverlappedResult(SOCKET, LPWSAOVERLAPPED, LPDWORD, BOOL, LPDWORD); +WINSOCK_API_LINKAGE BOOL WINAPI WSAGetQOSByName(SOCKET, LPWSABUF, LPQOS); +WINSOCK_API_LINKAGE INT WINAPI WSAGetServiceClassInfoA(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOA); +WINSOCK_API_LINKAGE INT WINAPI WSAGetServiceClassInfoW(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOW); +WINSOCK_API_LINKAGE INT WINAPI WSAGetServiceClassNameByClassIdA(LPGUID, LPSTR, LPDWORD); +WINSOCK_API_LINKAGE INT WINAPI WSAGetServiceClassNameByClassIdW(LPGUID, LPWSTR, LPDWORD); +WINSOCK_API_LINKAGE int WINAPI WSAHtonl(SOCKET, unsigned long, unsigned long *); +WINSOCK_API_LINKAGE int WINAPI WSAHtons(SOCKET, unsigned short, unsigned short *); +WINSOCK_API_LINKAGE INT WINAPI WSAInstallServiceClassA(LPWSASERVICECLASSINFOA); +WINSOCK_API_LINKAGE INT WINAPI WSAInstallServiceClassW(LPWSASERVICECLASSINFOW); +WINSOCK_API_LINKAGE int WINAPI WSAIoctl(SOCKET, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +WINSOCK_API_LINKAGE SOCKET WINAPI WSAJoinLeaf(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS, DWORD); +WINSOCK_API_LINKAGE INT WINAPI WSALookupServiceBeginA(LPWSAQUERYSETA, DWORD, LPHANDLE); +WINSOCK_API_LINKAGE INT WINAPI WSALookupServiceBeginW(LPWSAQUERYSETW lpqsRestrictions, DWORD, LPHANDLE); +WINSOCK_API_LINKAGE INT WINAPI WSALookupServiceNextA(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETA); +WINSOCK_API_LINKAGE INT WINAPI WSALookupServiceNextW(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETW); +WINSOCK_API_LINKAGE INT WINAPI WSALookupServiceEnd(HANDLE); +WINSOCK_API_LINKAGE int WINAPI WSANSPIoctl(HANDLE,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION); /* XP or .NET Server */ +WINSOCK_API_LINKAGE int WINAPI WSANtohl(SOCKET, unsigned long, unsigned long *); +WINSOCK_API_LINKAGE int WINAPI WSANtohs(SOCKET, unsigned short, unsigned short *); +WINSOCK_API_LINKAGE int WINAPI WSARecv(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +WINSOCK_API_LINKAGE int WINAPI WSARecvDisconnect(SOCKET, LPWSABUF); +WINSOCK_API_LINKAGE int WINAPI WSARecvFrom(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, struct sockaddr *, LPINT, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +WINSOCK_API_LINKAGE INT WINAPI WSARemoveServiceClass(LPGUID); +WINSOCK_API_LINKAGE BOOL WINAPI WSAResetEvent(WSAEVENT); +WINSOCK_API_LINKAGE int WINAPI WSASend(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +WINSOCK_API_LINKAGE int WINAPI WSASendDisconnect(SOCKET, LPWSABUF); +WINSOCK_API_LINKAGE int WINAPI WSASendTo(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, const struct sockaddr *, int, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +WINSOCK_API_LINKAGE BOOL WINAPI WSASetEvent(WSAEVENT); +WINSOCK_API_LINKAGE INT WSAAPI WSASetServiceA(LPWSAQUERYSETA, WSAESETSERVICEOP, DWORD); +WINSOCK_API_LINKAGE INT WINAPI WSASetServiceW(LPWSAQUERYSETW, WSAESETSERVICEOP, DWORD); +WINSOCK_API_LINKAGE SOCKET WINAPI WSASocketA(int, int, int, LPWSAPROTOCOL_INFOA, GROUP, DWORD); +WINSOCK_API_LINKAGE SOCKET WINAPI WSASocketW(int, int, int, LPWSAPROTOCOL_INFOW, GROUP, DWORD); +WINSOCK_API_LINKAGE INT WINAPI WSAStringToAddressA(LPSTR, INT, LPWSAPROTOCOL_INFOA, LPSOCKADDR, LPINT); +WINSOCK_API_LINKAGE INT WINAPI WSAStringToAddressW(LPWSTR, INT, LPWSAPROTOCOL_INFOW, LPSOCKADDR, LPINT); +WINSOCK_API_LINKAGE DWORD WINAPI WSAWaitForMultipleEvents(DWORD, const WSAEVENT *, BOOL, DWORD, BOOL); + +typedef SOCKET (WINAPI *LPFN_WSAACCEPT)(SOCKET, struct sockaddr *, LPINT, LPCONDITIONPROC, DWORD); +typedef INT (WINAPI *LPFN_WSAADDRESSTOSTRINGA)(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD); +typedef INT (WINAPI *LPFN_WSAADDRESSTOSTRINGW)(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOW, LPWSTR, LPDWORD); +typedef BOOL (WINAPI *LPFN_WSACLOSEEVENT)(WSAEVENT); +typedef int (WINAPI *LPFN_WSACONNECT)(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS); +typedef WSAEVENT (WINAPI *LPFN_WSACREATEEVENT)(void); +typedef int (WINAPI *LPFN_WSADUPLICATESOCKETA)(SOCKET, DWORD, LPWSAPROTOCOL_INFOA); +typedef int (WINAPI *LPFN_WSADUPLICATESOCKETW)(SOCKET, DWORD, LPWSAPROTOCOL_INFOW); +typedef INT (WINAPI *LPFN_WSAENUMNAMESPACEPROVIDERSA)(LPDWORD, LPWSANAMESPACE_INFOA); +typedef INT (WINAPI *LPFN_WSAENUMNAMESPACEPROVIDERSW)(LPDWORD, LPWSANAMESPACE_INFOW); +typedef int (WINAPI *LPFN_WSAENUMNETWORKEVENTS)(SOCKET, WSAEVENT, LPWSANETWORKEVENTS); +typedef int (WINAPI *LPFN_WSAENUMPROTOCOLSA)(LPINT, LPWSAPROTOCOL_INFOA, LPDWORD); +typedef int (WINAPI *LPFN_WSAENUMPROTOCOLSW)(LPINT, LPWSAPROTOCOL_INFOW, LPDWORD); +typedef int (WINAPI *LPFN_WSAEVENTSELECT)(SOCKET, WSAEVENT, long); +typedef BOOL (WINAPI *LPFN_WSAGETOVERLAPPEDRESULT)(SOCKET, LPWSAOVERLAPPED, LPDWORD, BOOL, LPDWORD); +typedef BOOL (WINAPI *LPFN_WSAGETQOSBYNAME)(SOCKET, LPWSABUF, LPQOS); +typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSINFOA)(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOA); +typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSINFOW)(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOW); +typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA)(LPGUID, LPSTR, LPDWORD); +typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW)(LPGUID, LPWSTR, LPDWORD); +typedef int (WINAPI *LPFN_WSAHTONL)(SOCKET, unsigned long, unsigned long *); +typedef int (WINAPI *LPFN_WSAHTONS)(SOCKET, unsigned short, unsigned short *); +typedef INT (WINAPI *LPFN_WSAINSTALLSERVICECLASSA)(LPWSASERVICECLASSINFOA); +typedef INT (WINAPI *LPFN_WSAINSTALLSERVICECLASSW)(LPWSASERVICECLASSINFOW); +typedef int (WINAPI *LPFN_WSAIOCTL)(SOCKET, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef SOCKET (WINAPI *LPFN_WSAJOINLEAF)(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS, DWORD); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICEBEGINA)(LPWSAQUERYSETA, DWORD, LPHANDLE); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICEBEGINW)(LPWSAQUERYSETW, DWORD, LPHANDLE); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICENEXTA)(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETA); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICENEXTW)(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETW); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICEEND)(HANDLE); +typedef int (WINAPI *LPFN_WSANSPIoctl)(HANDLE, DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION); +typedef int (WINAPI *LPFN_WSANTOHL)(SOCKET, unsigned long, unsigned long *); +typedef int (WINAPI *LPFN_WSANTOHS)(SOCKET, unsigned short, unsigned short *); +typedef int (WINAPI *LPFN_WSARECV)(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef int (WINAPI *LPFN_WSARECVDISCONNECT)(SOCKET, LPWSABUF); +typedef int (WINAPI *LPFN_WSARECVFROM)(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, struct sockaddr *, LPINT, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef INT (WINAPI *LPFN_WSAREMOVESERVICECLASS)(LPGUID); +typedef BOOL (WINAPI *LPFN_WSARESETEVENT)(WSAEVENT); +typedef int (WINAPI *LPFN_WSASEND)(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef int (WINAPI *LPFN_WSASENDDISCONNECT)(SOCKET, LPWSABUF); +typedef int (WINAPI *LPFN_WSASENDTO)(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, const struct sockaddr *, int, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef BOOL (WINAPI *LPFN_WSASETEVENT)(WSAEVENT); +typedef INT (WINAPI *LPFN_WSASETSERVICEA)(LPWSAQUERYSETA, WSAESETSERVICEOP, DWORD); +typedef INT (WINAPI *LPFN_WSASETSERVICEW)(LPWSAQUERYSETW, WSAESETSERVICEOP, DWORD); +typedef SOCKET (WINAPI *LPFN_WSASOCKETA)(int, int, int, LPWSAPROTOCOL_INFOA, GROUP, DWORD); +typedef SOCKET (WINAPI *LPFN_WSASOCKETW)(int, int, int, LPWSAPROTOCOL_INFOW, GROUP, DWORD); +typedef INT (WINAPI *LPFN_WSASTRINGTOADDRESSA)(LPSTR, INT, LPWSAPROTOCOL_INFOA, LPSOCKADDR, LPINT); +typedef INT (WINAPI *LPFN_WSASTRINGTOADDRESSW)(LPWSTR, INT, LPWSAPROTOCOL_INFOW, LPSOCKADDR, LPINT); +typedef DWORD (WINAPI *LPFN_WSAWAITFORMULTIPLEEVENTS)(DWORD, const WSAEVENT *, BOOL, DWORD, BOOL); + +#ifdef UNICODE +#define LPFN_WSAADDRESSTOSTRING LPFN_WSAADDRESSTOSTRINGW +#define LPFN_WSADUPLICATESOCKET LPFN_WSADUPLICATESOCKETW +#define LPFN_WSAENUMNAMESPACEPROVIDERS LPFN_WSAENUMNAMESPACEPROVIDERSW +#define LPFN_WSAENUMPROTOCOLS LPFN_WSAENUMPROTOCOLSW +#define LPFN_WSAGETSERVICECLASSINFO LPFN_WSAGETSERVICECLASSINFOW +#define LPFN_WSAGETSERVICECLASSNAMEBYCLASSID LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW +#define LPFN_WSAINSTALLSERVICECLASS LPFN_WSAINSTALLSERVICECLASSW +#define LPFN_WSALOOKUPSERVICEBEGIN LPFN_WSALOOKUPSERVICEBEGINW +#define LPFN_WSALOOKUPSERVICENEXT LPFN_WSALOOKUPSERVICENEXTW +#define LPFN_WSASETSERVICE LPFN_WSASETSERVICEW +#define LPFN_WSASOCKET LPFN_WSASOCKETW +#define LPFN_WSASTRINGTOADDRESS LPFN_WSASTRINGTOADDRESSW +#define WSAAddressToString WSAAddressToStringW +#define WSADuplicateSocket WSADuplicateSocketW +#define WSAEnumNameSpaceProviders WSAEnumNameSpaceProvidersW +#define WSAEnumProtocols WSAEnumProtocolsW +#define WSAGetServiceClassInfo WSAGetServiceClassInfoW +#define WSAGetServiceClassNameByClassId WSAGetServiceClassNameByClassIdW +#define WSASetService WSASetServiceW +#define WSASocket WSASocketW +#define WSAStringToAddress WSAStringToAddressW +#define WSALookupServiceBegin WSALookupServiceBeginW +#define WSALookupServiceNext WSALookupServiceNextW +#define WSAInstallServiceClass WSAInstallServiceClassW +#else +#define LPFN_WSAADDRESSTOSTRING LPFN_WSAADDRESSTOSTRINGA +#define LPFN_WSADUPLICATESOCKET LPFN_WSADUPLICATESOCKETW +#define LPFN_WSAENUMNAMESPACEPROVIDERS LPFN_WSAENUMNAMESPACEPROVIDERSA +#define LPFN_WSAENUMPROTOCOLS LPFN_WSAENUMPROTOCOLSA +#define LPFN_WSAGETSERVICECLASSINFO LPFN_WSAGETSERVICECLASSINFOA +#define LPFN_WSAGETSERVICECLASSNAMEBYCLASSID LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA +#define LPFN_WSAINSTALLSERVICECLASS LPFN_WSAINSTALLSERVICECLASSA +#define LPFN_WSALOOKUPSERVICEBEGIN LPFN_WSALOOKUPSERVICEBEGINA +#define LPFN_WSALOOKUPSERVICENEXT LPFN_WSALOOKUPSERVICENEXTA +#define LPFN_WSASETSERVICE LPFN_WSASETSERVICEA +#define LPFN_WSASOCKET LPFN_WSASOCKETA +#define LPFN_WSASTRINGTOADDRESS LPFN_WSASTRINGTOADDRESSA +#define WSAAddressToString WSAAddressToStringA +#define WSADuplicateSocket WSADuplicateSocketA +#define WSAEnumNameSpaceProviders WSAEnumNameSpaceProvidersA +#define WSAEnumProtocols WSAEnumProtocolsA +#define WSAGetServiceClassInfo WSAGetServiceClassInfoA +#define WSAGetServiceClassNameByClassId WSAGetServiceClassNameByClassIdA +#define WSAInstallServiceClass WSAInstallServiceClassA +#define WSALookupServiceBegin WSALookupServiceBeginA +#define WSALookupServiceNext WSALookupServiceNextA +#define WSASocket WSASocketA +#define WSAStringToAddress WSAStringToAddressA +#define WSASetService WSASetServiceA +#endif + +#ifdef __cplusplus +} +#endif +#endif From 71fd5c5aee8515b81af1965c8bdbd414ed3c8bbf Mon Sep 17 00:00:00 2001 From: cnlohr Date: Sun, 10 Sep 2017 23:02:33 -0400 Subject: [PATCH 08/15] Fix Linux compile issues. --- colorchord2/main.c | 2 +- colorchord2/netlight.conf | 3 ++- colorchord2/outdrivers.h | 2 +- colorchord2/parameters.h | 2 +- colorchord2/sound.h | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/colorchord2/main.c b/colorchord2/main.c index 4136a90..0f766bf 100644 --- a/colorchord2/main.c +++ b/colorchord2/main.c @@ -17,11 +17,11 @@ #include "parameters.h" #include "hook.h" #include "configs.h" -#include struct SoundDriver * sd; #if defined(WIN32) || defined(USE_WINDOWS) +#include #include #define ESCAPE_KEY 0x1B diff --git a/colorchord2/netlight.conf b/colorchord2/netlight.conf index c426aad..edc1ce1 100644 --- a/colorchord2/netlight.conf +++ b/colorchord2/netlight.conf @@ -12,7 +12,8 @@ steady_bright = 0 #dft_q = 20.0000 #dft_speedup = 1000.0000 -sourcename = alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1.monitor +sourcename = alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor +# alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1.monitor #alsa_output.pci-0000_00_1f.3.analog-stereo.monitor skipfirst = 1 firstval = 0 diff --git a/colorchord2/outdrivers.h b/colorchord2/outdrivers.h index db3afce..44db767 100644 --- a/colorchord2/outdrivers.h +++ b/colorchord2/outdrivers.h @@ -41,6 +41,6 @@ struct DriverInstances * SetupOutDriver( ); void RegOutDriver( const char * ron, struct DriverInstances * (*Init)( ) ); #define REGISTER_OUT_DRIVER( name ) \ - void REGISTER##name() __attribute__((constructor)) { RegOutDriver( #name, name ); } + void __attribute__((constructor)) REGISTER##name() { RegOutDriver( #name, name ); } #endif diff --git a/colorchord2/parameters.h b/colorchord2/parameters.h index b6c2fe2..db1eecf 100644 --- a/colorchord2/parameters.h +++ b/colorchord2/parameters.h @@ -58,7 +58,7 @@ void SetParametersFromString( const char * string ); void AddCallback( const char * name, ParamCallbackT t, void * v ); #define REGISTER_PARAM( parameter_name, type ) \ - void REGISTER##parameter_name() __attribute__((constructor)) { RegisterValue( #parameter_name, type, ¶meter_name, sizeof( parameter_name ) ); } + void __attribute__((constructor)) REGISTER##parameter_name() { RegisterValue( #parameter_name, type, ¶meter_name, sizeof( parameter_name ) ); } #endif diff --git a/colorchord2/sound.h b/colorchord2/sound.h index d83ed9b..38a7f19 100644 --- a/colorchord2/sound.h +++ b/colorchord2/sound.h @@ -35,7 +35,7 @@ void CloseSound( struct SoundDriver * soundobject ); void RegSound( int priority, const char * name, SoundInitFn * fn ); #define REGISTER_SOUND( sounddriver, priority, name, function ) \ - void REGISTER##sounddriver() __attribute__((constructor)) { RegSound( priority, name, function ); } + void __attribute__((constructor)) REGISTER##sounddriver() { RegSound( priority, name, function ); } #endif From 1d86a1c52e59635994d1ed32229021031b65450d Mon Sep 17 00:00:00 2001 From: cnlohr Date: Sun, 10 Sep 2017 23:10:37 -0400 Subject: [PATCH 09/15] Add image files and update to newest everything. --- embedded8266/ccconfig.h | 2 ++ embedded8266/esp82xx | 2 +- embedded8266/image.elf-0x00000.bin | Bin 0 -> 37312 bytes embedded8266/image.elf-0x40000.bin | Bin 0 -> 213712 bytes embedded8266/user.cfg | 2 +- embedded8266/user/custom_commands.c | 8 ++++---- embedded8266/user/user_main.c | 6 ++++-- 7 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 embedded8266/image.elf-0x00000.bin create mode 100644 embedded8266/image.elf-0x40000.bin diff --git a/embedded8266/ccconfig.h b/embedded8266/ccconfig.h index b94ed85..02b9c33 100644 --- a/embedded8266/ccconfig.h +++ b/embedded8266/ccconfig.h @@ -29,6 +29,7 @@ #define USE_NUM_LIN_LEDS CCS.gUSE_NUM_LIN_LEDS #define COLORCHORD_OUTPUT_DRIVER CCS.gCOLORCHORD_OUTPUT_DRIVER #define COLORCHORD_ACTIVE CCS.gCOLORCHORD_ACTIVE +#define INITIAL_AMP CCS.gINITIAL_AMP //We are not enabling these for the ESP8266 port. #define LIN_WRAPAROUND 0 @@ -54,6 +55,7 @@ struct CCSettings uint8_t gUSE_NUM_LIN_LEDS; // = NUM_LIN_LEDS uint8_t gCOLORCHORD_ACTIVE; uint8_t gCOLORCHORD_OUTPUT_DRIVER; + uint8_t gINITIAL_AMP; }; extern struct CCSettings CCS; diff --git a/embedded8266/esp82xx b/embedded8266/esp82xx index 6666ee9..248dcac 160000 --- a/embedded8266/esp82xx +++ b/embedded8266/esp82xx @@ -1 +1 @@ -Subproject commit 6666ee94f388b9038fc9382b813287be65c20283 +Subproject commit 248dcac4022bf1e3d3574f2f49626c99d794dd06 diff --git a/embedded8266/image.elf-0x00000.bin b/embedded8266/image.elf-0x00000.bin new file mode 100644 index 0000000000000000000000000000000000000000..6d69844142d381c7af03d26290c8178f02c817fe GIT binary patch literal 37312 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 literal 0 HcmV?d00001 diff --git a/embedded8266/user.cfg b/embedded8266/user.cfg index 4677ca8..923a30e 100644 --- a/embedded8266/user.cfg +++ b/embedded8266/user.cfg @@ -15,7 +15,7 @@ ESP_GCC_VERS = 4.8.5 #SDK = $(HOME)/esp8266/esp_iot_sdk_v1.5.2 PAGE_SCRIPTS = main.js -FWBURNFLAGS = -b 1500000 +FWBURNFLAGS = -b 2000000 OPTS += -DICACHE_FLASH OPTS += -DDISABLE_CHARRX #Saves about 48 bytes. diff --git a/embedded8266/user/custom_commands.c b/embedded8266/user/custom_commands.c index 6832a76..3a04c75 100644 --- a/embedded8266/user/custom_commands.c +++ b/embedded8266/user/custom_commands.c @@ -11,7 +11,7 @@ extern volatile uint8_t sounddata[]; extern volatile uint16_t soundhead; -#define CONFIGURABLES 17 //(plus1) +#define CONFIGURABLES 18 //(plus1) struct SaveLoad @@ -22,17 +22,17 @@ struct SaveLoad struct CCSettings CCS; -uint8_t gConfigDefaults[CONFIGURABLES] = { 0, 6, 1, 2, 3, 4, 7, 4, 2, 80, 64, 12, 15, NUM_LIN_LEDS, 1, 0, 0 }; +uint8_t gConfigDefaults[CONFIGURABLES] = { 0, 6, 1, 2, 3, 4, 7, 4, 2, 80, 64, 12, 15, NUM_LIN_LEDS, 1, 0, 16, 0 }; uint8_t * gConfigurables[CONFIGURABLES] = { &CCS.gROOT_NOTE_OFFSET, &CCS.gDFTIIR, &CCS.gFUZZ_IIR_BITS, &CCS.gFILTER_BLUR_PASSES, &CCS.gSEMIBITSPERBIN, &CCS.gMAX_JUMP_DISTANCE, &CCS.gMAX_COMBINE_DISTANCE, &CCS.gAMP_1_IIR_BITS, &CCS.gAMP_2_IIR_BITS, &CCS.gMIN_AMP_FOR_NOTE, &CCS.gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR, &CCS.gNOTE_FINAL_AMP, - &CCS.gNERF_NOTE_PORP, &CCS.gUSE_NUM_LIN_LEDS, &CCS.gCOLORCHORD_ACTIVE, &CCS.gCOLORCHORD_OUTPUT_DRIVER, 0 }; + &CCS.gNERF_NOTE_PORP, &CCS.gUSE_NUM_LIN_LEDS, &CCS.gCOLORCHORD_ACTIVE, &CCS.gCOLORCHORD_OUTPUT_DRIVER, &CCS.gINITIAL_AMP, 0 }; char * gConfigurableNames[CONFIGURABLES] = { "gROOT_NOTE_OFFSET", "gDFTIIR", "gFUZZ_IIR_BITS", "gFILTER_BLUR_PASSES", "gSEMIBITSPERBIN", "gMAX_JUMP_DISTANCE", "gMAX_COMBINE_DISTANCE", "gAMP_1_IIR_BITS", "gAMP_2_IIR_BITS", "gMIN_AMP_FOR_NOTE", "gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR", "gNOTE_FINAL_AMP", - "gNERF_NOTE_PORP", "gUSE_NUM_LIN_LEDS", "gCOLORCHORD_ACTIVE", "gCOLORCHORD_OUTPUT_DRIVER", 0 }; + "gNERF_NOTE_PORP", "gUSE_NUM_LIN_LEDS", "gCOLORCHORD_ACTIVE", "gCOLORCHORD_OUTPUT_DRIVER", "gINITIAL_AMP", 0 }; void ICACHE_FLASH_ATTR CustomStart( ) { diff --git a/embedded8266/user/user_main.c b/embedded8266/user/user_main.c index 0a2d696..a047897 100644 --- a/embedded8266/user/user_main.c +++ b/embedded8266/user/user_main.c @@ -99,9 +99,11 @@ static void procTask(os_event_t *events) #endif while( soundtail != soundhead ) { - int16_t samp = sounddata[soundtail]; + int32_t samp = sounddata[soundtail]; samp_iir = samp_iir - (samp_iir>>10) + samp; - PushSample32( (samp - (samp_iir>>10))*16 ); + samp = (samp - (samp_iir>>10))*16; + samp = (samp * CCS.gINITIAL_AMP) >> 4; + PushSample32( samp ); soundtail = (soundtail+1)&(HPABUFFSIZE-1); wf++; From 941b75f0a679782edff0baebff377cf3639e8102 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Mon, 11 Sep 2017 23:17:22 -0400 Subject: [PATCH 10/15] Add the mpfs --- embedded8266/web/page.mpfs | Bin 0 -> 74240 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 embedded8266/web/page.mpfs diff --git a/embedded8266/web/page.mpfs b/embedded8266/web/page.mpfs new file mode 100644 index 0000000000000000000000000000000000000000..248e4c7f5ec7b322d8ca3633b4205a8a3c314d3d GIT binary patch literal 74240 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 D-_cUc literal 0 HcmV?d00001 From 9d873cf9b5e96f0a7626bbc45974843e73f14e0f Mon Sep 17 00:00:00 2001 From: OleLL Date: Mon, 30 Oct 2017 23:30:51 +0100 Subject: [PATCH 11/15] Fixed missing atoi + changed Init to InitColorChord --- embeddedlinux/embeddedcc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/embeddedlinux/embeddedcc.c b/embeddedlinux/embeddedcc.c index ee663eb..4ce7ea5 100644 --- a/embeddedlinux/embeddedcc.c +++ b/embeddedlinux/embeddedcc.c @@ -11,6 +11,7 @@ #include #include #include +#include // Added by [olel] for atoi #include "embeddedout.h" struct sockaddr_in servaddr; @@ -64,7 +65,7 @@ int main( int argc, char ** argv ) connect( sock, (struct sockaddr *)&servaddr, sizeof(servaddr) ); - Init(); + InitColorChord(); // Changed by [olel] cause this was changed in embeddednf while( ( ci = getchar() ) != EOF ) { From ad4f2d6d093e0f1f3523748cfba0e730226e7d46 Mon Sep 17 00:00:00 2001 From: OleLL Date: Mon, 30 Oct 2017 23:31:41 +0100 Subject: [PATCH 12/15] Removed -m32 to allow also 64 bit architectures --- embeddedlinux/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embeddedlinux/Makefile b/embeddedlinux/Makefile index 8ccdf93..961cce3 100644 --- a/embeddedlinux/Makefile +++ b/embeddedlinux/Makefile @@ -7,7 +7,7 @@ LDFLAGS:= -s -Wl,--relax -Wl,-Map=test.map -Wl,--gc-sections -ffunction-section embeddedcc : ../embeddedcommon/embeddednf.c ../embeddedcommon/DFT32.c embeddedcc.c ../embeddedcommon/embeddedout.c - gcc -o $@ $^ $(CFLAGS) $(LDFLAGS) -m32 + gcc -o $@ $^ $(CFLAGS) $(LDFLAGS) dummy_leds : dummy_leds.c gcc -o $@ $^ -lX11 -lpthread $(CFLAGS) $(LDFLAGS) From c158ca0b5b562184bc85185486095c0a30188dd0 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Mon, 7 May 2018 23:13:06 -0400 Subject: [PATCH 13/15] Add SHM display for outputting directly to shared memory. --- colorchord2/DisplaySHM.c | 77 ++++++++++++++++++++++++++++++++++++++++ colorchord2/Makefile | 4 +-- 2 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 colorchord2/DisplaySHM.c diff --git a/colorchord2/DisplaySHM.c b/colorchord2/DisplaySHM.c new file mode 100644 index 0000000..554759d --- /dev/null +++ b/colorchord2/DisplaySHM.c @@ -0,0 +1,77 @@ +//Copyright 2015 <>< Charles Lohr under the ColorChord License. + +#include "outdrivers.h" +#include "notefinder.h" +#include +#include "parameters.h" +#include +#include +#include +#include "color.h" +#include "DrawFunctions.h" +#include +#include /* For mode constants */ +#include /* For O_* constants */ +#include + +struct SHMDriver +{ + int lights_file; + //int dft_file; //Not available. + //uint8_t * dft_ptr; + uint8_t * lights_ptr; + //int total_dft; + int total_leds; +}; + + +static void SHMUpdate(void * id, struct NoteFinder*nf) +{ + struct SHMDriver * d = (struct SHMDriver*)id; + + + if( !d->lights_file ) + { + const char * shm_lights = GetParameterS( "shm_lights", 0 ); + //const char * shm_dft = GetParameterS( "shm_dft", 0 ); // Not available. + + if( shm_lights ) + { + d->lights_file = shm_open(shm_lights, O_CREAT | O_RDWR, 0644); + ftruncate( d->lights_file, 16384 ); + d->lights_ptr = mmap(0,16384, PROT_READ | PROT_WRITE, MAP_SHARED, d->lights_file, 0); + } + + printf( "Got SHM: %s->%d [%p]\n", shm_lights, d->lights_file, d->lights_ptr ); + } + + + if( d->lights_ptr ) + { + memcpy( d->lights_ptr, &d->total_leds, 4 ); + memcpy( d->lights_ptr + 4, OutLEDs, d->total_leds*3 ); + } + +} + +static void SHMParams(void * id ) +{ + struct SHMDriver * d = (struct SHMDriver*)id; + + d->total_leds = 300; RegisterValue( "leds", PAINT, &d->total_leds, sizeof( d->total_leds )); +} + +static struct DriverInstances * DisplaySHM(const char * parameters) +{ + struct DriverInstances * ret = malloc( sizeof( struct DriverInstances ) ); + struct SHMDriver * d = ret->id = malloc( sizeof( struct SHMDriver ) ); + memset( d, 0, sizeof( struct SHMDriver ) ); + ret->Func = SHMUpdate; + ret->Params = SHMParams; + SHMParams( d ); + return ret; +} + +REGISTER_OUT_DRIVER(DisplaySHM); + + diff --git a/colorchord2/Makefile b/colorchord2/Makefile index 5a7c35b..97b2fcf 100644 --- a/colorchord2/Makefile +++ b/colorchord2/Makefile @@ -3,14 +3,14 @@ all : colorchord RAWDRAW:=DrawFunctions.o XDriver.o SOUND:=sound.o sound_alsa.o sound_pulse.o sound_null.o -OUTS := OutputVoronoi.o DisplayArray.o OutputLinear.o DisplayPie.o DisplayNetwork.o DisplayUSB2812.o DisplayDMX.o OutputProminent.o RecorderPlugin.o DisplayHIDAPI.o hidapi.o OutputCells.o +OUTS := OutputVoronoi.o DisplayArray.o OutputLinear.o DisplayPie.o DisplayNetwork.o DisplayUSB2812.o DisplayDMX.o OutputProminent.o RecorderPlugin.o DisplayHIDAPI.o hidapi.o OutputCells.o DisplaySHM.o WINGCC:= i686-w64-mingw32-gcc WINGCCFLAGS:= -g -DICACHE_FLASH_ATTR= -I../embeddedcommon -I. -O1 #-O2 -Wl,--relax -Wl,--gc-sections -ffunction-sections -fdata-sections WINLDFLAGS:=-lwinmm -lgdi32 -lws2_32 -lsetupapi RAWDRAWLIBS:=-lX11 -lm -lpthread -lXinerama -lXext -LDLIBS:=-lpthread -lasound -lm -lpulse-simple -lpulse -ludev +LDLIBS:=-lpthread -lasound -lm -lpulse-simple -lpulse -ludev -lrt CFLAGS:=-g -Os -flto -Wall -ffast-math -I../embeddedcommon -I. -DICACHE_FLASH_ATTR= From 1908c75cf8a07e818f11eae365f1ff7c098e41ca Mon Sep 17 00:00:00 2001 From: cnlohr Date: Mon, 7 May 2018 23:32:50 -0400 Subject: [PATCH 14/15] Bump shm test --- colorchord2/DisplaySHM.c | 37 ++++++++++++++++++++++++++---- colorchord2/shmtest.conf | 49 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 colorchord2/shmtest.conf diff --git a/colorchord2/DisplaySHM.c b/colorchord2/DisplaySHM.c index 554759d..55f2c3e 100644 --- a/colorchord2/DisplaySHM.c +++ b/colorchord2/DisplaySHM.c @@ -14,13 +14,16 @@ #include /* For O_* constants */ #include +extern struct NoteFinder * nf; + + struct SHMDriver { int lights_file; - //int dft_file; //Not available. - //uint8_t * dft_ptr; + int dft_file; //Not available. + uint8_t * dft_ptr; uint8_t * lights_ptr; - //int total_dft; + int total_dft; int total_leds; }; @@ -29,7 +32,6 @@ static void SHMUpdate(void * id, struct NoteFinder*nf) { struct SHMDriver * d = (struct SHMDriver*)id; - if( !d->lights_file ) { const char * shm_lights = GetParameterS( "shm_lights", 0 ); @@ -46,6 +48,33 @@ static void SHMUpdate(void * id, struct NoteFinder*nf) } + if( !d->dft_file ) + { + const char * shmname = GetParameterS( "shm_dft", 0 ); + //const char * shm_dft = GetParameterS( "shm_dft", 0 ); // Not available. + + if( shmname ) + { + d->dft_file = shm_open(shmname, O_CREAT | O_RDWR, 0644); + ftruncate( d->dft_file, 16384 ); + d->dft_ptr = mmap(0,16384, PROT_READ | PROT_WRITE, MAP_SHARED, d->dft_file, 0); + } + + printf( "Got SHM: %s->%d [%p]\n", shmname, d->dft_file, d->dft_ptr ); + } + + + if( d->dft_ptr ) + { + + d->total_dft = nf->octaves * nf->freqbins; + memcpy( d->dft_ptr+0, &nf->octaves, 4 ); + memcpy( d->dft_ptr+4, &nf->freqbins, 4 ); + memcpy( d->dft_ptr+8, nf->folded_bins, nf->freqbins * sizeof(float) ); + memcpy( d->dft_ptr+8+nf->freqbins * sizeof(float), + nf->outbins, d->total_dft * sizeof(float) ); + } + if( d->lights_ptr ) { memcpy( d->lights_ptr, &d->total_leds, 4 ); diff --git a/colorchord2/shmtest.conf b/colorchord2/shmtest.conf new file mode 100644 index 0000000..fe205d2 --- /dev/null +++ b/colorchord2/shmtest.conf @@ -0,0 +1,49 @@ +cpu_autolimit = 1 + +#General GUI properties. +title = PA Test +set_screenx = 720 +set_screeny = 480 + +sample_channel = -1 +sourcename = alsa_output.pci-0000_01_00.1.hdmi-stereo-extra2.monitor +#alsa_output.pci-0000_00_1f.3.analog-stereo.monitor +#default +# alsa_output.pci-0000_00_1b.0.analog-stereo.monitor +#alsa_output.pci-0000_00_1f.3.analog-stereo.monitor << New laptop +#use pactl list | grep pci- | grep monitor + + +#How many bins a note can jump from frame to frame to be considered a slide. +#this is used to prevent notes from popping in and out a lot. +note_combine_distance = 0.5000 +note_jumpability = 1.8000 +note_minimum_new_distribution_value = 0.0200 +note_out_chop = 0.05000 + +#compress_coefficient = 4.0 +#compress_exponent = .5 + + +#======================================================================= +#Outputs + + +#DisplayArray +outdrivers = OutputCells, DisplaySHM + +shm_lights = /cclights +shm_dft = /ccdft + +lightx = 20 +lighty = 4 +fromsides = 1 +leds = 120 +qtyamp = 120 + +satamp = 2.800 +amppow = 2.510 +distpow = 1.500 + + + From b786fd1f45c11781640e7d2f94f9f7c726f1ead5 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Mon, 7 May 2018 23:47:06 -0400 Subject: [PATCH 15/15] Bump. Expose notes, too! --- colorchord2/DisplaySHM.c | 37 ++++++++++++++++++++++++++----------- colorchord2/shmtest.conf | 1 + 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/colorchord2/DisplaySHM.c b/colorchord2/DisplaySHM.c index 55f2c3e..e4eb3e1 100644 --- a/colorchord2/DisplaySHM.c +++ b/colorchord2/DisplaySHM.c @@ -20,9 +20,13 @@ extern struct NoteFinder * nf; struct SHMDriver { int lights_file; - int dft_file; //Not available. + int dft_file; + int notes_file; + uint8_t * dft_ptr; uint8_t * lights_ptr; + uint8_t * notes_ptr; + int total_dft; int total_leds; }; @@ -34,33 +38,37 @@ static void SHMUpdate(void * id, struct NoteFinder*nf) if( !d->lights_file ) { - const char * shm_lights = GetParameterS( "shm_lights", 0 ); - //const char * shm_dft = GetParameterS( "shm_dft", 0 ); // Not available. - - if( shm_lights ) + const char * shmname = GetParameterS( "shm_lights", 0 ); + if( shmname ) { - d->lights_file = shm_open(shm_lights, O_CREAT | O_RDWR, 0644); + d->lights_file = shm_open(shmname, O_CREAT | O_RDWR, 0644); ftruncate( d->lights_file, 16384 ); d->lights_ptr = mmap(0,16384, PROT_READ | PROT_WRITE, MAP_SHARED, d->lights_file, 0); } - - printf( "Got SHM: %s->%d [%p]\n", shm_lights, d->lights_file, d->lights_ptr ); } if( !d->dft_file ) { const char * shmname = GetParameterS( "shm_dft", 0 ); - //const char * shm_dft = GetParameterS( "shm_dft", 0 ); // Not available. - if( shmname ) { d->dft_file = shm_open(shmname, O_CREAT | O_RDWR, 0644); ftruncate( d->dft_file, 16384 ); d->dft_ptr = mmap(0,16384, PROT_READ | PROT_WRITE, MAP_SHARED, d->dft_file, 0); } + } - printf( "Got SHM: %s->%d [%p]\n", shmname, d->dft_file, d->dft_ptr ); + + if( !d->notes_file ) + { + const char * shmname = GetParameterS( "shm_notes", 0 ); + if( shmname ) + { + d->notes_file = shm_open(shmname, O_CREAT | O_RDWR, 0644); + ftruncate( d->notes_file, 16384 ); + d->notes_ptr = mmap(0,16384, PROT_READ | PROT_WRITE, MAP_SHARED, d->notes_file, 0); + } } @@ -81,6 +89,13 @@ static void SHMUpdate(void * id, struct NoteFinder*nf) memcpy( d->lights_ptr + 4, OutLEDs, d->total_leds*3 ); } + + if( d->notes_ptr ) + { + memcpy( d->notes_ptr, &nf->dists_count, 4 ); + memcpy( d->notes_ptr+4, nf->dists, sizeof( nf->dists[0] ) * nf->dists_count ); + } + } static void SHMParams(void * id ) diff --git a/colorchord2/shmtest.conf b/colorchord2/shmtest.conf index fe205d2..a6dc6ed 100644 --- a/colorchord2/shmtest.conf +++ b/colorchord2/shmtest.conf @@ -34,6 +34,7 @@ outdrivers = OutputCells, DisplaySHM shm_lights = /cclights shm_dft = /ccdft +shm_notes = /ccnotes lightx = 20 lighty = 4

Lofa@6&%XwQm^=s- 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