diff --git a/Inc/config.h b/Inc/config.h index 73729fa..aaa8259 100644 --- a/Inc/config.h +++ b/Inc/config.h @@ -6,23 +6,29 @@ #define PWM_FREQ 16000 // PWM frequency in Hz #define DEAD_TIME 32 // PWM deadtime -#define DC_CUR_LIMIT 15 // Motor DC current limit in amps. it does not disable motors, it is a soft current limit. +#define DC_CUR_LIMIT 15 // DC current limit in amps per motor. so 15 means it will draw 30A out of your battery. it does not disable motors, it is a soft current limit. -// Battery voltage calibration: connect power source. use multimeter to measure real voltage and write it to BAT_CALIB_REAL_VOLTAGE. watch UART on one of the sensor board cables. write value nr 4 to BAT_CALIB_ADC. make and flash firmware. you can verify voltage on UART debug value 5 (devide it by 100.0 to get calibrated voltage). +#define DELAY_IN_MAIN_LOOP 5 // in ms. default 5. it is independent of all the timing critical stuff. do not touch if you do not know what you are doing. + +// Battery voltage calibration: connect power source. use multimeter to measure real voltage and write it to BAT_CALIB_REAL_VOLTAGE. enable DEBUG_SERIAL_USART3 and DEBUG_SERIAL_ASCII (and disconnect and disable CONTROL_NUNCHUCK) and watch UART on right sensor board cable. write value nr 5 to BAT_CALIB_ADC. make and flash firmware. you can verify voltage on UART debug value 6 (devide it by 100.0 to get calibrated voltage). #define BAT_CALIB_REAL_VOLTAGE 42.0 // input voltage measured by multimeter #define BAT_CALIB_ADC 1667 // adc-value measured by mainboard (value nr 4 on UART debug output) -#define BAT_NUMBER_OF_CELLS 10 // normal Hoverboard battery: 10s +#define BAT_NUMBER_OF_CELLS 12 // normal Hoverboard battery: 10s +#define BAT_LOW_LVL1_ENABLE 0 // to beep or not to beep, 1 or 0 #define BAT_LOW_LVL1 3.6 // gently beeps at this voltage level. [V/cell] -#define BAT_LOW_LVL2 3.5 // your battery is almost empty. Charge now! [V/cell] -#define BAT_LOW_DEAD 3.37 // undervoltage lockout. [V/cell] +#define BAT_LOW_LVL2_ENABLE 1 // to beep or not to beep, 1 or 0 +#define BAT_LOW_LVL2 3.5 // your battery is almost empty. Charge now! [V/cell] +#define BAT_LOW_DEAD 3.37 // undervoltage lockout. [V/cell] + +#define INACTIVITY_TIMEOUT 8 // minutes of not driving until poweroff. it is not very precise. // ################################################################################ //#define DEBUG_SERIAL_USART3 // right sensor board cable, disable if I2C (nunchuck) is used! #define DEBUG_BAUD 115200 // UART baud rate //#define DEBUG_SERIAL_SERVOTERM -//#define DEBUG_SERIAL_ASCII // human readable output. i.e. "345;1337;0;0\n\r" +#define DEBUG_SERIAL_ASCII // "1:345 2:1337 3:0 4:0 5:0 6:0 7:0 8:0\r\n" //#define CONTROL_SERIAL_USART2 // left sensor board cable, disable if ADC or PPM is used! #define CONTROL_BAUD 19200 // control via usart from eg an Arduino or raspberry @@ -40,7 +46,7 @@ //#define PPM_NUM_CHANNELS 6 // total number of PPM channels to receive, even if they are not used. // ###### CONTROL VIA TWO POTENTIOMETERS ###### -// ADC-calibration to cover the full poti-range: connect potis to left sensor board cable (0 to 3.3V), watch UART on the right sensor board cable. the first 2 values are ADC1 and ADC2. write minimum and maximum poti position-values to ADC?_MIN and ADC?_MAX. +// ADC-calibration to cover the full poti-range: connect potis to left sensor board cable (0 to 3.3V) (do NOT use the red 15V wire in the cable!). enable DEBUG_SERIAL_USART3 and DEBUG_SERIAL_ASCII (and disconnect and disable CONTROL_NUNCHUCK) and watch UART on right sensor board cable. value1 == ADC1 and value2 == ADC2. write minimum and maximum poti position-values to ADC?_MIN and ADC?_MAX. //#define CONTROL_ADC // use ADC as input. disable DEBUG_SERIAL_USART2! //#define ADC1_MIN 0 // min ADC1-value while poti at minimum-position (0 - 4095) //#define ADC1_MAX 4095 // max ADC1-value while poti at maximum-position (0 - 4095) @@ -64,7 +70,7 @@ // - weakr and weakl: field weakening for extra boost at high speed (speedR > 700 and speedL > 700). 0 to ~400 #define FILTER 0.1 // lower value == softer filter. do not use values <0.01, you will get float precision issues. -#define SPEED_COEFFICIENT 0.5 // higher value == stronger. 0.0 to 1.0 +#define SPEED_COEFFICIENT 0.5 // higher value == stronger. 0.0 to ~2.0? #define STEER_COEFFICIENT 0.5 // higher value == stronger. if you do not want any steering, set it to 0.0; 0.0 to 1.0 //#define INVERT_R_DIRECTION //#define INVERT_L_DIRECTION @@ -108,7 +114,7 @@ else {\ weakl = 0;\ weakr = 0; -// #define BEEPS_BACKWARD +#define BEEPS_BACKWARD 1 // 0 or 1 // ################################################################################ diff --git a/Src/bldc.c b/Src/bldc.c index d4ad416..9c0c853 100644 --- a/Src/bldc.c +++ b/Src/bldc.c @@ -165,18 +165,6 @@ void DMA1_Channel1_IRQHandler() { batteryVoltage = batteryVoltage * 0.999 + ((float)adc_buffer.batt1 * ((float)BAT_CALIB_REAL_VOLTAGE / (float)BAT_CALIB_ADC)) * 0.001; } - - #ifdef BEEPS_BACKWARD - if (speed < -50 && enable == 1) { - buzzerFreq = 5; - buzzerPattern = 1; - } else if (enable == 1) { - buzzerFreq = 0; - buzzerPattern = 1; - } - #endif - - //disable PWM when current limit is reached (current chopping) if(ABS((adc_buffer.dcl - offsetdcl) * MOTOR_AMP_CONV_DC_AMP) > DC_CUR_LIMIT || timeout > TIMEOUT || enable == 0) { LEFT_TIM->BDTR &= ~TIM_BDTR_MOE; diff --git a/Src/comms.c b/Src/comms.c index dbd1bec..6074546 100644 --- a/Src/comms.c +++ b/Src/comms.c @@ -25,7 +25,7 @@ void setScopeChannel(uint8_t ch, int16_t val) { } void consoleScope() { - #ifdef DEBUG_SERIAL_SERVOTERM + #if defined DEBUG_SERIAL_SERVOTERM && defined DEBUG_SERIAL_USART3 uart_buf[0] = 0xff; uart_buf[1] = CLAMP(ch_buf[0]+127, 0, 255); uart_buf[2] = CLAMP(ch_buf[1]+127, 0, 255); @@ -45,7 +45,7 @@ void consoleScope() { } #endif - #ifdef DEBUG_SERIAL_ASCII + #if defined DEBUG_SERIAL_ASCII && defined DEBUG_SERIAL_USART3 memset(uart_buf, 0, sizeof(uart_buf)); sprintf(uart_buf, "1:%i 2:%i 3:%i 4:%i 5:%i 6:%i 7:%i 8:%i\r\n", ch_buf[0], ch_buf[1], ch_buf[2], ch_buf[3], ch_buf[4], ch_buf[5], ch_buf[6], ch_buf[7]); diff --git a/Src/main.c b/Src/main.c index 75ab909..19db37c 100644 --- a/Src/main.c +++ b/Src/main.c @@ -67,6 +67,8 @@ extern uint8_t enable; // global variable for motor enable extern volatile uint32_t timeout; // global variable for timeout extern float batteryVoltage; // global variable for battery voltage +uint32_t inactivity_timeout_counter; + extern uint8_t nunchuck_data[6]; #ifdef CONTROL_PPM extern volatile uint16_t ppm_captured_value[PPM_NUM_CHANNELS+1]; @@ -162,7 +164,7 @@ int main(void) { enable = 1; // enable motors while(1) { - HAL_Delay(5); + HAL_Delay(DELAY_IN_MAIN_LOOP); //delay in ms #ifdef CONTROL_NUNCHUCK Nunchuck_Read(); @@ -211,17 +213,19 @@ int main(void) { // ####### DEBUG SERIAL OUT ####### - #ifdef CONTROL_ADC - setScopeChannel(0, (int)adc_buffer.l_tx2); // 1: ADC1 - setScopeChannel(1, (int)adc_buffer.l_rx2); // 2: ADC2 - #endif - setScopeChannel(2, (int)speedR); // 3: - setScopeChannel(3, (int)speedL); // 4: - setScopeChannel(4, (int)adc_buffer.batt1); // 5: for battery voltage calibration - setScopeChannel(5, (int)(batteryVoltage * 100.0f)); // 6: for verifying battery voltage calibration - // setScopeChannel(6, (int)); // 7: - // setScopeChannel(7, (int)); // 8: - consoleScope(); + if (inactivity_timeout_counter % 10 == 0) { + #ifdef CONTROL_ADC + setScopeChannel(0, (int)adc_buffer.l_tx2); // 1: ADC1 + setScopeChannel(1, (int)adc_buffer.l_rx2); // 2: ADC2 + #endif + setScopeChannel(2, (int)speedR); // 3: + setScopeChannel(3, (int)speedL); // 4: + setScopeChannel(4, (int)adc_buffer.batt1); // 5: for battery voltage calibration + setScopeChannel(5, (int)(batteryVoltage * 100.0f)); // 6: for verifying battery voltage calibration + // setScopeChannel(6, (int)); // 7: + // setScopeChannel(7, (int)); // 8: + consoleScope(); + } #ifdef ADDITIONAL_CODE @@ -263,13 +267,16 @@ int main(void) { // ####### BATTERY VOLTAGE ####### - if (batteryVoltage < ((float)BAT_LOW_LVL1 * (float)BAT_NUMBER_OF_CELLS) && batteryVoltage > ((float)BAT_LOW_LVL2 * (float)BAT_NUMBER_OF_CELLS)) { + if (BEEPS_BACKWARD && speed < -50) { // backward beep + buzzerFreq = 5; + buzzerPattern = 1; + } else if (batteryVoltage < ((float)BAT_LOW_LVL1 * (float)BAT_NUMBER_OF_CELLS) && batteryVoltage > ((float)BAT_LOW_LVL2 * (float)BAT_NUMBER_OF_CELLS) && BAT_LOW_LVL1_ENABLE) { // low bat 1: slow beep buzzerFreq = 5; buzzerPattern = 42; - } else if (batteryVoltage < ((float)BAT_LOW_LVL2 * (float)BAT_NUMBER_OF_CELLS) && batteryVoltage > ((float)BAT_LOW_DEAD * (float)BAT_NUMBER_OF_CELLS)) { + } else if (batteryVoltage < ((float)BAT_LOW_LVL2 * (float)BAT_NUMBER_OF_CELLS) && batteryVoltage > ((float)BAT_LOW_DEAD * (float)BAT_NUMBER_OF_CELLS) && BAT_LOW_LVL2_ENABLE) { // low bat 2: fast beep buzzerFreq = 5; buzzerPattern = 6; - } else if (batteryVoltage < ((float)BAT_LOW_DEAD * (float)BAT_NUMBER_OF_CELLS)) { + } else if (batteryVoltage < ((float)BAT_LOW_DEAD * (float)BAT_NUMBER_OF_CELLS) && abs(speed) < 20) { // low bat 3: power off buzzerPattern = 0; enable = 0; for (int i = 0; i < 8; i++) { @@ -278,10 +285,28 @@ int main(void) { } HAL_GPIO_WritePin(OFF_PORT, OFF_PIN, 0); while(1) {} - } else { + } else { // do not beep buzzerFreq = 0; buzzerPattern = 0; } + + + // ####### INACTIVITY TIMEOUT ####### + if (abs(speedL) > 50 || abs(speedR) > 50) { + inactivity_timeout_counter = 0; + } else { + inactivity_timeout_counter ++; + } + if (inactivity_timeout_counter > (INACTIVITY_TIMEOUT * 60 * 1000) / (DELAY_IN_MAIN_LOOP + 1)) { // rest of main loop needs maybe 1ms + buzzerPattern = 0; + enable = 0; + for (int i = 0; i < 8; i++) { + buzzerFreq = i; + HAL_Delay(100); + } + HAL_GPIO_WritePin(OFF_PORT, OFF_PIN, 0); + while(1) {} + } } } diff --git a/build/hover.hex b/build/hover.hex index 63434ea..b25343d 100644 --- a/build/hover.hex +++ b/build/hover.hex @@ -1,23 +1,23 @@ :020000040800F2 -:1000000000C000206538000847380008493800085B -:100010004B3800084D3800084F3800080000000039 -:10002000000000000000000000000000513800083F -:100030005338000800000000553800085738000801 -:10004000AD380008AD380008AD380008AD380008FC -:10005000AD380008AD380008AD380008AD380008EC -:10006000AD380008AD380008AD380008E9300008A8 -:10007000AD380008AD380008AD380008AD380008CC -:10008000AD380008AD380008AD380008AD380008BC -:10009000AD380008AD380008AD380008AD380008AC -:1000A000AD380008AD380008AD380008AD3800089C -:1000B000AD380008AD380008AD380008AD3800088C -:1000C000AD380008AD380008AD380008AD3800087C -:1000D000AD380008AD380008AD380008AD3800086C -:1000E000AD380008AD380008AD380008AD3800085C -:1000F000AD380008AD380008AD380008AD3800084C -:10010000AD380008AD380008AD380008AD3800083B -:10011000AD380008AD380008AD380008AD3800082B -:10012000AD380008AD380008AD380008AD3800081B +:1000000000C00020D5380008B7380008B93800080B +:10001000BB380008BD380008BF38000800000000E9 +:10002000000000000000000000000000C1380008CF +:10003000C338000800000000C5380008C7380008B1 +:100040001D3900081D3900081D3900081D39000838 +:100050001D3900081D3900081D3900081D39000828 +:100060001D3900081D3900081D39000859310008E4 +:100070001D3900081D3900081D3900081D39000808 +:100080001D3900081D3900081D3900081D390008F8 +:100090001D3900081D3900081D3900081D390008E8 +:1000A0001D3900081D3900081D3900081D390008D8 +:1000B0001D3900081D3900081D3900081D390008C8 +:1000C0001D3900081D3900081D3900081D390008B8 +:1000D0001D3900081D3900081D3900081D390008A8 +:1000E0001D3900081D3900081D3900081D39000898 +:1000F0001D3900081D3900081D3900081D39000888 +:100100001D3900081D3900081D3900081D39000877 +:100110001D3900081D3900081D3900081D39000867 +:100120001D3900081D3900081D3900081D39000857 :1001300000000000000000000000000000000000BF :1001400000000000000000000000000000000000AF :10015000000000000000000000000000000000009F @@ -32,8 +32,8 @@ :0401E0005FF8E0F1F3 :1001E80010B5054C237833B9044B13B10448AFF369 :1001F80000800123237010BD2400002000000000AF -:10020800F838000808B5034B1BB103490348AFF39E -:10021800008008BD0000000028000020F838000811 +:100208006839000808B5034B1BB103490348AFF32D +:10021800008008BD000000002800002068390008A0 :1002280081F0004102E000BF83F0004330B54FEA9F :1002380041044FEA430594EA050F08BF90EA020F0C :100248001FBF54EA000C55EA020C7FEA645C7FEA9F @@ -353,7 +353,7 @@ :1015E800624412F8100C13F4803F05D10C4B03FB36 :1015F80000F007B010BC7047084B5B68C3F340436A :10160800634413F8142C074BB3FBF2F300FB03F00D -:10161800EFE70448EDE700BF10390008001002406A +:10161800EFE70448EDE700BF8039000800100240FA :1016280000093D0000127A00594B1B6803F00703BC :101638008B420CD2564A136823F007030B431360FE :10164800136803F007038B4201D00120704770B57F @@ -377,7 +377,7 @@ :1017680023F46053296943EAC1035360FFF724FF58 :10177800084B5B68C3F30313074AD35CD840074B95 :101788001860002000F01EFD002070BD0120FCE75D -:101798000020024000100240243900080000002008 +:101798000020024000100240943900080000002098 :1017A800014B1868704700BF0000002030B4036A7E :1017B80023F001030362056A4268846924F0730414 :1017C8000B681C4325F002058B682B43104DA8427B @@ -720,7 +720,7 @@ :102CD800FFF7ECF9FEF764FD084BA3FB0030800911 :102CE800FFF7AEF80420FFF7C1F8224621464FF05F :102CF800FF30FFF765F817B030BD00BFD34D621045 -:102D08002DE9F04F83B0FFF773FA874CA36943F0BE +:102D08002DE9F04F83B0FFF773FAC94CA36943F07C :102D18000103A361A36903F001030193019B03204D :102D2800FFF73CF8002211466FF00B00FFF748F858 :102D3800002211466FF00A00FFF742F80022114600 @@ -729,197 +729,204 @@ :102D6800002211466FF00100FFF72AF800221146F1 :102D78004FF0FF30FFF724F8FFF788FF636923F06F :102D880001036361FFF79CFCFFF79CFDFFF792FED0 -:102D9800FFF724FF012220216448FFF77CF96448EB -:102DA800FFF736FB6348FFF733FB082405E0624B67 +:102D9800FFF724FF01222021A648FFF77CF9A64867 +:102DA800FFF736FBA548FFF733FB082405E0A44BE3 :102DB8001C706420FFF73CFA013C002CF7DA4FF056 -:102DC800000A5D4B83F800A0012204215B48FFF74D -:102DD80062F95B4B01221A70D346D8E04FF47A7837 +:102DC800000A9F4B83F800A0012204219D48FFF7C9 +:102DD80062F99D4B01221A70D34674E04FF47A7859 :102DE80032463B4620462946FDF720FA04460D4662 -:102DF8000022544BFDF760FE88B949A3D3E90023AC -:102E080020462946FDF73AFE002856D12046294695 -:102E1800FDF75CFE044604E0DFF85081E0E74FF47C -:102E28007A744146022000F003FD2146032000F099 -:102E3800FFFC454B9989042000F0FAFC4349444BB8 -:102E48001868FDF7C9FFFEF78DF90146052000F067 -:102E5800EFFC00F0F3FC0AF13203A34215DDAAF1FE -:102E6800320AA24511DA0BF1320343450DDDABF10D -:102E7800320BC34509DA374B1B68042B05D8C8F158 -:102E88000003354A1360354B1C6002212748FFF7C1 -:102E9800FBF8A0B92E4B1D6831492846FEF73AF9D0 -:102EA80050B330492846FEF753F928B3224B052280 -:102EB8001A702D4B2A221A7067E02C4CB1E7204B70 -:102EC80000221A7002211948FFF7DEF80028F9D10C -:102ED8000024194B1C70244B1C7005E0164B1C7009 -:102EE8006420FFF7A5F90134072CF7DD0022202123 -:102EF8000E48FFF7D0F8FEE71A492846FEF70AF908 -:102F0800C0B31B492846FEF723F998B30A4B05229C -:102F18001A70154B06221A7037E000BFAFF3008015 -:102F28000000000000408FC000100240000801406F -:102F3800FC010020B000002040000020000C0140EF -:102F48004800002000408F40700200200000C84266 -:102F580008000020040000205C0000205800002029 -:102F6800CCCC2C42000028424100002018FCFFFF76 -:102F78008FC221424E492846FEF7CCF8002874D16A -:102F880000234C4A13704C4A1370C346A2460520CE -:102F9800FFF74EF9494C2068FDF794FA3EA3D3E9B0 -:102FA8000023FDF7F9FA06460F46454B1868FDF76A -:102FB80089FA3BA3D3E90023FDF7EEFA02460B4654 -:102FC80030463946FDF732F9FDF780FD06462060A8 -:102FD8003C4F3868FDF776FA2FA3D3E90023FDF7B5 -:102FE800DBFA04460D46384B1868FDF76BFA2CA33C -:102FF800D3E90023FDF7D0FA02460B4620462946BE -:10300800FDF714F9FDF762FD3860FDF75BFA002261 -:103018002E4BFDF7C1FA04460D463046FDF752FA2D -:1030280000222A4BFDF7B8FA06460F4602460B4621 -:1030380020462946FDF7F8F8804689460022244BA9 -:10304800FDF73AFD00287FF4C9AE17A3D3E90023A2 -:1030580040464946FDF712FD00287FF4DDAE4046A4 -:103068004946FDF733FD8046BAE60024124B1C7032 -:10307800184B1C7005E00F4B1C706420FFF7D8F844 -:103088000134072CF7DD002220211348FFF703F84D -:10309800FEE700BFAFF30080CDCCCCCCCCCCEC3F6E -:1030A8009A9999999999B93F0000000000408FC0FA -:1030B8008FC2214240000020410000201003002060 -:1030C80020030020180300200C0300200000E03F2C -:1030D80000408F4048000020000801400000000028 -:1030E800774B02225A60774B1B68B3F57A7F5EDB19 -:1030F8002DE9F041744B1A88744BA3FB02135B094A -:10310800642101FB13239BB20BBB714C2068FDF7B4 -:10311800EBF965A3D3E90023FDF73EFA06460F460F -:103128006C4B9889FDF700FE6B49FDF755FEFDF7DE -:10313800DBF95FA3D3E90023FDF72EFA02460B461D -:1031480030463946FDF772F8FDF7E8FC2060614B20 -:103158005889624B1C68001BFDF7B4F956A3D3E9E4 -:103168000023FDF719FA00220023FDF787FC002849 -:1031780052D1584B5889001BFDF7A4F94EA3D3E947 -:103188000023FDF709FA0022554BFDF795FC0028AE -:1031980052D1544B1B68052B4ED8534B1B78002B30 -:1031A8004AD0524A536C43F40043536449E0013314 -:1031B800444A1360474A90884D490B68034403EB1F -:1031C800D3735B100B60D0884A490B68034403EB48 -:1031D800D3735B100B60108847490B68034403EBFB -:1031E800D3735B100B60508844490B68034403EBAE -:1031F800D3735B100B60508938490B68034403EBA9 -:10320800D3735B100B6011893D4A13680B4403EBC1 -:10321800D3735B10136070472E4B5889001BFDF762 -:1032280051F925A3D3E90023FDF7B6F90022354B60 -:10323800FDF724FC0028ACD02C4A536C23F400433F -:103248005364244B18892E4B1C68001BFDF73AF970 -:1032580019A3D3E90023FDF79FF900220023FDF706 -:103268000DFC002852D11B4B1889001BFDF72AF9C9 -:1032780011A3D3E90023FDF78FF90022184BFDF7BE -:103288001BFC002852D1174B1B68052B4ED8164B38 -:103298001B78002B4AD01C4A536C43F400435364F8 -:1032A80049E000BFAFF300802B8716D9CEF7EF3F78 -:1032B800FCA9F1D24D62503F7B14AE47E17A943FAE -:1032C800000002404C000020420000201F85EB5106 -:1032D8000800002070020020AA65CE3C0C000020E7 -:1032E80000002E4004000020480000200034014067 -:1032F80014000020180000201C00002020000020DE -:103308001000002000002EC0002C0140924B1889AC -:10331800001BFDF7D7F88EA3D3E90023FDF73CF98E -:1033280000228E4BFDF7AAFB0028ACD08C4A536CC8 -:1033380023F4004353648B498B6813F0200F0CBFB0 -:10334800012300238A6812F0400F0CBF01220022DB -:10335800896811F0800F0CBF012500258249886813 -:1033680010F4806F0CBF012000208C6814F4006FEB -:103378000CBF01240024896811F4805F02EB450228 -:1033880003EB4203794EF35C79490B600B6803F158 -:1033980002030B600D68774B83FB0572A2EBE572A5 -:1033A80002EB42024FEA4207A5EB07020A600CBF94 -:1033B80002220022224400EB4202B05C6E4A1060F6 -:1033C800106802301060106883FB0043A3EBE073C1 -:1033D80003EB43035C00031B136009685E488388A2 -:1033E800664A12689A1AC388654800681B1A052934 -:1033F80035D8DFE801F00324272A2D30D31A614A93 -:103408001360614A138801339BB213805F4A1478B2 -:103418004CB35F4AA2FB0312120B5E4909780131D3 -:1034280092FBF1F001FB1022EAB993FBF4F204FBE2 -:103438001233EBB910215848FEF733FE18E0514B10 -:103448001A60DEE74F4B1A60DBE74E4A1360D8E795 -:103458004C4A1360D5E79B1A4A4A1360D1E7494B97 -:1034680000221A60CDE7002210214B48FEF713FE18 -:103478004A4BD3F800C03E4B1B68052B2BD8DFE81E -:1034880003F00312171C2226CCF1000064469C4668 -:10349800434B1968384B1B68052B52D8DFE803F0FB -:1034A8001F3F43474B4E6446CCF1000C0020EFE72A -:1034B8006046CCF1000C0024EAE7CCF10004604639 -:1034C8004FF0000CE4E7CCF100040020E0E7CCF179 -:1034D80000000024DCE7002004468446D8E74E427A -:1034E8000F4619462D4B1B68002B40F39B802D4B34 -:1034F8001D681F4B1B6805331E4A82FB03E2A2EBC3 -:10350800E37202EB42024FEA420EA3EB0E02052AD7 -:1035180000F2BC80DFE802F0486D72777C810F46CC -:1035280049420026DEE70E4649420027DAE74F42C5 -:103538000E460021D6E74F420026D3E74E42002729 -:10354800D0E7002637463146CCE700BFAFF300800E -:103558007B14AE47E17A943F7002002000002EC031 -:10356800002C0140000C01400010014034390008D3 -:1035780050000020ABAAAA2A540000201400002002 -:1035880018000020440000204200002040000020D5 -:103598005917B7D141000020000801405800002009 -:1035A8005C00002060000020C5F10008AE4615460A -:1035B800654474444044964B1B68002B40F3D78005 -:1035C800944B1B68944A126802F1050C934A82FBDB -:1035D8000CE2A2EBEC7202EB42024FEA420EACEBB9 -:1035E8000E02052A00F2F980DFE802F058A8ADB211 -:1035F800B7BCAE466D424FF00008D9E7A8466D4209 -:103608004FF0000ED4E7C5F1000EA8460025CFE71D -:10361800C5F1000E4FF00008CAE7C5F100084FF0E9 -:10362800000EC5E77E4B1D68C5F1000E7D4B1A687C -:1036380001327A4B83FB0283A3EBE27303EB430370 -:103648004FEA4308A2EB0803052B1AD8DFE803F07A -:103658000323060A0E14A8461D46A9E7F0464FF0B4 -:10366800000EA5E7F046AE460025A1E72B467546B5 -:103678009E464FF000089BE7A84675464FF0000E9F -:1036880096E74FF00008C646454691E74FF0000818 -:10369800C64645468CE74FF0000889E7C3F10008A5 -:1036A8009E461346194407EB0E0206EB080305F580 -:1036B8007A7540F2C676B54200F397800A2DB8BFF6 -:1036C8000A25594E756304F57A7440F2C675AC4202 -:1036D80000F38E800A2CB8BF0A24534DAC6300F562 -:1036E8007A7040F2C674A04200F385800A28B8BFF9 -:1036F8000A204D4CE06301F57A7140F2C6708142B0 -:103708007CDC0A29B8BF0A214848416302F57A726D -:1037180040F2C6718A4274DC0A2AB8BF0A224349B9 -:103728008A6303F57A7340F2C67293426CDC0A2B03 -:10373800B8BF0A233D4AD363BDE8F0819E465B4289 -:103748004FF00008AEE798465B424FF0000EA9E73D -:10375800C3F1000E98460023A4E7C3F1000E4FF012 -:1037680000089FE7C3F100084FF0000E9AE7294BC5 -:103778001B68C3F1000E284A12680132DFF89CC0AA -:103788008CFB028CACEBE27C0CEB4C0C4FEA4C084B -:10379800A2EB080CBCF1050F1AD8DFE80CF00323E4 -:1037A800060A0E14984663467CE7F0464FF0000E72 -:1037B80078E7F0469E46002374E71A467346964615 -:1037C8004FF000086EE7984673464FF0000E69E721 -:1037D8004FF00008C646434664E74FF00008C64667 -:1037E80043465FE74FF000085CE740F2C67568E7BC -:1037F80040F2C67471E740F2C6707AE740F2C671CB -:1038080082E740F2C6728AE740F2C67392E700BFC9 -:103818005C0000206400002054000020ABAAAA2A03 -:10382800600000205000002000340140002C0140BE -:10383800014B23F810107047880300207047704729 -:10384800FEE7FEE7FEE7FEE770477047704708B5FA -:10385800FEF7E0FCFEF71BFB08BD0000002103E0BB -:103868000B4B5B58435004310A480B4B42189A42A1 -:10387800F6D30A4A02E0002342F8043B084B9A4276 -:10388800F9D3FEF7F7FE00F00FF8FFF739FA7047A3 -:1038980044390008000000202400002024000020F3 -:1038A80098030020FEE7000070B500250C4E0D4C73 -:1038B800A41BA410A54209D100F01AF800250A4E4D -:1038C8000A4CA41BA410A54205D170BD56F825309A -:1038D80098470135EEE756F8253098470135F2E765 -:1038E8003C3900083C3900083C39000840390008D8 -:1038F800F8B500BFF8BC08BC9E467047F8B500BFD5 -:08390800F8BC08BC9E467047A4 -:1039100002030405060708090A0B0C0D0E0F101010 -:10392000010200000000000000000000010203048A -:0C3930000607080900000201040503005E -:04393C000D02000870 -:04394000E901000891 -:1039440000A24A046400000000002042D0070000E6 -:10395400D0070000D0070000D0070000D007000007 -:04396400D007000088 -:040000050800386552 +:102DF8000022964BFDF760FE90B987A3D3E9002324 +:102E080020462946FDF73AFE002840F0CA802046B1 +:102E18002946FDF75BFE044604E0DFF86482DFE73D +:102E28004FF47A748A4B19688A4BA3FB0123DB0899 +:102E380003EB83035A00914200F0B5800AF1320394 +:102E4800A34215DDAAF1320AA24511DA0BF13203C9 +:102E580043450DDDABF1320BC34509DA7E4B1B68E8 +:102E6800042B05D8C8F100037C4A13607C4B1C6016 +:102E780002217048FFF708F9002840F0AF80794B2D +:102E88001D6815F1320F80F203816D4B05221A700F +:102E9800754B01221A7084EAE473A3EBE473322BB6 +:102EA80006DC88EAE873A3EBE873322B40F325814C +:102EB800674B00221A60664B1A68A246C3466B4BE2 +:102EC8009A4200F21F810520FFF7B2F9684C20688A +:102ED800FDF7F8FA52A3D3E90023FDF75DFB064698 +:102EE8000F46644B1868FDF7EDFA4FA3D3E90023AA +:102EF800FDF752FB02460B4630463946FDF796F978 +:102F0800FDF7E4FD06462060564F3868FDF7DAFA0B +:102F180043A3D3E90023FDF73FFB04460D46564B78 +:102F28001868FDF7CFFA40A3D3E90023FDF734FB77 +:102F380002460B4620462946FDF778F9FDF7C6FDFF +:102F48003860FDF7BFFA00224C4BFDF725FB04461D +:102F58000D463046FDF7B6FA0022484BFDF71CFB3C +:102F680006460F4602460B4620462946FDF75CF901 +:102F7800804689460022354BFDF79EFD00287FF4E8 +:102F88002DAF25A3D3E9002340464946FDF776FD3A +:102F980000287FF442AF40464946FDF797FD80463A +:102FA8001EE7374C3EE74146022000F079FC2146F7 +:102FB800032000F075FC334B9989042000F070FC65 +:102FC8003149324B1868FDF707FFFEF7CBF8014689 +:102FD800052000F065FC00F069FC2FE71A4B002281 +:102FE8001A7002211348FFF74FF80028F9D100247E +:102FF800134B1C701C4B1C7005E0114B1C7064209B +:10300800FFF716F90134072CF7DD002220210948C3 +:10301800FFF741F8FEE700BF0000000000408FC046 +:10302800CDCCCCCCCCCCEC3F9A9999999999B93F15 +:103038000010024000080140FC010020B000002000 +:1030480040000020000C01404800002000408F4054 +:1030580004030020CDCCCCCC040000205C00002070 +:10306800580000201C030020410000208038010087 +:103078001403002024030020100300200000E03F78 +:1030880018FCFFFF700200200000C8420800002062 +:10309800264B1E6826493046FEF73CF858B12549AC +:1030A8003046FEF755F830B1234B05221A70234BF2 +:1030B80006221A70EFE61F493046FEF72BF810B1CA +:1030C8001335262D05D900231B4A13701B4A13708C +:1030D800E1E60024194B1C70194B1C70072C06DC08 +:1030E800154B1C706420FFF7A3F80134F6E70022A3 +:1030F80020211448FEF7CFFFFEE7134A1368013377 +:103108001360D8E600240D4B1C700D4B1C7005E0B5 +:10311800094B1C706420FFF78BF80134072CF7DD8E +:10312800002220210748FEF7B6FFFEE7080000202E +:10313800000028428FC221424000002041000020A8 +:10314800480000200008014004030020000000009F +:10315800774B02225A60774B1B68B3F57A7F5EDBA8 +:103168002DE9F041744B1A88744BA3FB02135B09D9 +:10317800642101FB13239BB20BBB714C2068FDF744 +:10318800B3F965A3D3E90023FDF706FA06460F460F +:103198006C4B9889FDF7C8FD6B49FDF71DFEFDF7DF +:1031A800A3F95FA3D3E90023FDF7F6F902460B461E +:1031B80030463946FDF73AF8FDF7B0FC2060614B20 +:1031C8005889624B1C68001BFDF77CF956A3D3E9AC +:1031D8000023FDF7E1F900220023FDF74FFC00284A +:1031E80052D1584B5889001BFDF76CF94EA3D3E90F +:1031F8000023FDF7D1F90022554BFDF75DFC0028AF +:1032080052D1544B1B68052B4ED8534B1B78002BBF +:103218004AD0524A536C43F40043536449E00133A3 +:10322800444A1360474A90884D490B68034403EBAE +:10323800D3735B100B60D0884A490B68034403EBD7 +:10324800D3735B100B60108847490B68034403EB8A +:10325800D3735B100B60508844490B68034403EB3D +:10326800D3735B100B60508938490B68034403EB38 +:10327800D3735B100B6011893D4A13680B4403EB51 +:10328800D3735B10136070472E4B5889001BFDF7F2 +:1032980019F925A3D3E90023FDF77EF90022354B60 +:1032A800FDF7ECFB0028ACD02C4A536C23F4004308 +:1032B8005364244B18892E4B1C68001BFDF702F938 +:1032C80019A3D3E90023FDF767F900220023FDF7CE +:1032D800D5FB002852D11B4B1889001BFDF7F2F8CB +:1032E80011A3D3E90023FDF757F90022184BFDF786 +:1032F800E3FB002852D1174B1B68052B4ED8164B01 +:103308001B78002B4AD01C4A536C43F40043536487 +:1033180049E000BFAFF300802B8716D9CEF7EF3F07 +:10332800FCA9F1D24D62503F7B14AE47E17A943F3D +:10333800000002404C000020420000201F85EB5195 +:103348000800002070020020AA65CE3C0C00002076 +:1033580000002E40040000204800002000340140F6 +:1033680014000020180000201C000020200000206D +:103378001000002000002EC0002C0140924B18893C +:10338800001BFDF79FF88EA3D3E90023FDF704F98E +:1033980000228E4BFDF772FB0028ACD08C4A536C90 +:1033A80023F4004353648B498B6813F0200F0CBF40 +:1033B800012300238A6812F0400F0CBF012200226B +:1033C800896811F0800F0CBF0125002582498868A3 +:1033D80010F4806F0CBF012000208C6814F4006F7B +:1033E8000CBF01240024896811F4805F02EB4502B8 +:1033F80003EB4203794EF35C79490B600B6803F1E8 +:1034080002030B600D68774B83FB0572A2EBE57234 +:1034180002EB42024FEA4207A5EB07020A600CBF23 +:1034280002220022224400EB4202B05C6E4A106085 +:10343800106802301060106883FB0043A3EBE07350 +:1034480003EB43035C00031B136009685E48838831 +:10345800664A12689A1AC388654800681B1A0529C3 +:1034680035D8DFE801F00324272A2D30D31A614A22 +:103478001360614A138801339BB213805F4A147842 +:103488004CB35F4AA2FB0312120B5E490978013163 +:1034980092FBF1F001FB1022EAB993FBF4F204FB72 +:1034A8001233EBB910215848FEF7FBFD18E0514BD9 +:1034B8001A60DEE74F4B1A60DBE74E4A1360D8E725 +:1034C8004C4A1360D5E79B1A4A4A1360D1E7494B27 +:1034D80000221A60CDE7002210214B48FEF7DBFDE1 +:1034E8004A4BD3F800C03E4B1B68052B2BD8DFE8AE +:1034F80003F00312171C2226CCF1000064469C46F8 +:10350800434B1968384B1B68052B52D8DFE803F08A +:103518001F3F43474B4E6446CCF1000C0020EFE7B9 +:103528006046CCF1000C0024EAE7CCF100046046C8 +:103538004FF0000CE4E7CCF100040020E0E7CCF108 +:1035480000000024DCE7002004468446D8E74E4209 +:103558000F4619462D4B1B68002B40F39B802D4BC3 +:103568001D681F4B1B6805331E4A82FB03E2A2EB52 +:10357800E37202EB42024FEA420EA3EB0E02052A67 +:1035880000F2BC80DFE802F0486D72777C810F465C +:1035980049420026DEE70E4649420027DAE74F4255 +:1035A8000E460021D6E74F420026D3E74E420027B9 +:1035B800D0E7002637463146CCE700BFAFF300809E +:1035C8007B14AE47E17A943F7002002000002EC0C1 +:1035D800002C0140000C014000100140A4390008F3 +:1035E80050000020ABAAAA2A540000201400002092 +:1035F8001800002044000020420000204000002065 +:103608005917B7D141000020000801405800002098 +:103618005C00002060000020C5F10008AE46154699 +:10362800654474444044964B1B68002B40F3D78094 +:10363800944B1B68944A126802F1050C934A82FB6A +:103648000CE2A2EBEC7202EB42024FEA420EACEB48 +:103658000E02052A00F2F980DFE802F058A8ADB2A0 +:10366800B7BCAE466D424FF00008D9E7A8466D4298 +:103678004FF0000ED4E7C5F1000EA8460025CFE7AD +:10368800C5F1000E4FF00008CAE7C5F100084FF079 +:10369800000EC5E77E4B1D68C5F1000E7D4B1A680C +:1036A80001327A4B83FB0283A3EBE27303EB430300 +:1036B8004FEA4308A2EB0803052B1AD8DFE803F00A +:1036C8000323060A0E14A8461D46A9E7F0464FF044 +:1036D800000EA5E7F046AE460025A1E72B46754645 +:1036E8009E464FF000089BE7A84675464FF0000E2F +:1036F80096E74FF00008C646454691E74FF00008A8 +:10370800C64645468CE74FF0000889E7C3F1000834 +:103718009E461346194407EB0E0206EB080305F50F +:103728007A7540F2C676B54200F397800A2DB8BF85 +:103738000A25594E756304F57A7440F2C675AC4291 +:1037480000F38E800A2CB8BF0A24534DAC6300F5F1 +:103758007A7040F2C674A04200F385800A28B8BF88 +:103768000A204D4CE06301F57A7140F2C67081423F +:103778007CDC0A29B8BF0A214848416302F57A72FD +:1037880040F2C6718A4274DC0A2AB8BF0A22434949 +:103798008A6303F57A7340F2C67293426CDC0A2B93 +:1037A800B8BF0A233D4AD363BDE8F0819E465B4219 +:1037B8004FF00008AEE798465B424FF0000EA9E7CD +:1037C800C3F1000E98460023A4E7C3F1000E4FF0A2 +:1037D80000089FE7C3F100084FF0000E9AE7294B55 +:1037E8001B68C3F1000E284A12680132DFF89CC03A +:1037F8008CFB028CACEBE27C0CEB4C0C4FEA4C08DB +:10380800A2EB080CBCF1050F1AD8DFE80CF0032373 +:10381800060A0E14984663467CE7F0464FF0000E01 +:1038280078E7F0469E46002374E71A4673469646A4 +:103838004FF000086EE7984673464FF0000E69E7B0 +:103848004FF00008C646434664E74FF00008C646F6 +:1038580043465FE74FF000085CE740F2C67568E74B +:1038680040F2C67471E740F2C6707AE740F2C6715A +:1038780082E740F2C6728AE740F2C67392E700BF59 +:103888005C0000206400002054000020ABAAAA2A93 +:10389800600000205000002000340140002C01404E +:1038A800014B23F8101070478C03002070477047B5 +:1038B800FEE7FEE7FEE7FEE770477047704708B58A +:1038C800FEF7A8FCFEF7E3FA08BD0000002103E0BC +:1038D8000B4B5B58435004310A480B4B42189A4231 +:1038E800F6D30A4A02E0002342F8043B084B9A4206 +:1038F800F9D3FEF7BFFE00F00FF8FFF701FA7047A3 +:10390800B439000800000020240000202400002012 +:103918009C030020FEE7000070B500250C4E0D4CFE +:10392800A41BA410A54209D100F01AF800250A4EDC +:103938000A4CA41BA410A54205D170BD56F8253029 +:1039480098470135EEE756F8253098470135F2E7F4 +:10395800AC390008AC390008AC390008B0390008A7 +:10396800F8B500BFF8BC08BC9E467047F8B500BF64 +:08397800F8BC08BC9E46704734 +:1039800002030405060708090A0B0C0D0E0F1010A0 +:10399000010200000000000000000000010203041A +:0C39A000060708090000020104050300EE +:0439AC000D02000800 +:0439B000E901000821 +:1039B40000A24A046400000000004042D007000056 +:1039C400D0070000D0070000D0070000D007000097 +:0439D400D007000018 +:04000005080038D5E2 :00000001FF