From 6230d6dc18c74fbfaac41cf1c390ab610a56ef2f Mon Sep 17 00:00:00 2001 From: "Daniil A. Smirnov" Date: Wed, 8 Mar 2023 13:15:50 +0300 Subject: [PATCH] first commit --- README.md | 24 ++ fw/Makefile | 53 ++++ fw/main.c | 511 +++++++++++++++++++++++++++++++++++++++ fw/obj/dxa_rotor_ctl.elf | Bin 0 -> 14904 bytes fw/obj/main.o | Bin 0 -> 10520 bytes fw/out/dxa_rotor_ctl.eep | 2 + fw/out/dxa_rotor_ctl.hex | 336 +++++++++++++++++++++++++ 7 files changed, 926 insertions(+) create mode 100644 README.md create mode 100644 fw/Makefile create mode 100755 fw/main.c create mode 100755 fw/obj/dxa_rotor_ctl.elf create mode 100644 fw/obj/main.o create mode 100644 fw/out/dxa_rotor_ctl.eep create mode 100644 fw/out/dxa_rotor_ctl.hex diff --git a/README.md b/README.md new file mode 100644 index 0000000..88f034f --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +Модуль для управления поворотными устройствами Yaesu серий DXA/DXC через usb +Эмулирует протокол Yaesu GS232B для повороток с углом 450 градусов +Параметры порта: 9600 8N1 +Поддерживаемые команды: +BOOT - переход в bootloader +0x18 (hex) - переход в bootloader +CAL0 - калибровка в позиции 0 градусов(левый концевик) +CAL90 - калибровка в позиции 90 градусов +CAL180 - калибровка в позиции 180 градусов +CAL270 - калибровка в позиции 270 градусов +CAL360 - калибровка в позиции 360 градусов +CAL450 - калибровка в позиции 450 градусов(overlap, правый концевик) +C - чтения текущего азимута +S - остановка вращения +L - вращение в лево(против часовой стрелки) +R - вращение в право(по часовой стрелке) +Mxxx - вращение на заданный азимут, xxx - азимут +X1 - установка скорости вращения, минимум +X2 - установка скорости вращения, средняя 1 +X3 - установка скорости вращения, средняя 2 +X4 - установка скорости вращения, максимальная + +Каждая команда должна заканчиваться символом возврата каретки(0x0D, \r) + diff --git a/fw/Makefile b/fw/Makefile new file mode 100644 index 0000000..b5275d3 --- /dev/null +++ b/fw/Makefile @@ -0,0 +1,53 @@ +# Название проекта +PRG=dxa_rotor_ctl +# МК +MCU=atmega88 +# Частота МК в герцах +FREQ=8000000UL +# GCC +CC=avr-gcc +# OBJCOPY +OBJCOPY= avr-objcopy +# SIZE +SIZE=avr-size +# Флаги GCC +CFLAGS= -Wall -Os -std=gnu99 -lm +# Флаги LD +LDFLAGS= -Wall -lm +# Папка с промежуточными файлами +OBJDIR=obj +# +OUTDIR=out + +# Cписок .c файлов +C_SRC= \ +main.c + +# Список объектных файлов (формируется автоматически на основе списка .с файлов) +OBJS=$(C_SRC:.c=.o) +OBJ=$(addprefix $(OBJDIR)/, $(OBJS)) + +.PHONY: all LD DIR clean + +# Выполняем цели в указанном порядке +all: DIR $(C_SRC) $(OBJS) LD + +# Линковка +LD: $(OBJ) + $(CC) $^ -o $(OBJDIR)/$(PRG).elf $(LDFLAGS) -mmcu=$(MCU) + $(OBJCOPY) -O ihex -R .eeprom -R .fuse -R .lock $(OBJDIR)/$(PRG).elf $(OUTDIR)/$(PRG).hex + $(OBJCOPY) -O ihex -j .eeprom --change-section-lma .eeprom=0 $(OBJDIR)/$(PRG).elf $(OUTDIR)/$(PRG).eep + $(SIZE) -C --format=avr --mcu=$(MCU) $(OBJDIR)/$(PRG).elf + +# +%.o: %.c + $(CC) $< -o $(OBJDIR)/$@ $(CFLAGS) -mmcu=$(MCU) -DF_CPU=$(FREQ) -c + +# Создание папок +DIR: + mkdir -p $(OBJDIR) + mkdir -p $(OUTDIR) + +# +clean: + rm -rf $(OBJDIR) $(OUTDIR) *.hex *.eep diff --git a/fw/main.c b/fw/main.c new file mode 100755 index 0000000..c9229ac --- /dev/null +++ b/fw/main.c @@ -0,0 +1,511 @@ +/* + * USB rotor card + * + * Created: 30.05.2022 + * Update: 11.06.2022 00:34:00 + * Author : R5CA + * Support only GS232B 450deg + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BAUD 9600 +#define MYUBRR F_CPU/16/BAUD-1 + +volatile uint8_t uartRXBuf[16]; // Буфер для данных принятых по UART +volatile uint8_t uartRXBufNum = 0; // Кол-во принятых байт по UART +volatile uint8_t uartRXC = 0; // Флаг окончания приема данных по UART + +#define ROTOR_DDR DDRD +#define ROTOR_PORT PORTD +#define ROTOR_CW PD5 +#define ROTOR_CCW PD6 +#define ROTOR_AZ_IN 0 // Канал АЦП измерения азимута +#define ROTOR_SPEED_DDR DDRB // DDR регулировки скорости +#define ROTOR_SPEED_PORT PORTB // Порт регулировки скорости +#define ROTOR_SPEED_PINNUM PB3 // Номер пина регулировки скорости(обязательно OC2A) + +#define STOP 0 +#define SLOW_START 1 +#define ROTARY 2 +#define SLOW_DOWN 3 + +#define SLOW_DOWN_AZ 20 // Расстояние начала плавной остановки + +uint16_t EEMEM EEPcal0 = 0; // EEProm значение калибровки 0 градусов +uint16_t EEMEM EEPcal90 = 0; // EEProm значение калибровки 90 градусов +uint16_t EEMEM EEPcal180 = 0; // EEProm значение калибровки 180 градусов +uint16_t EEMEM EEPcal270 = 0; // EEProm значение калибровки 270 градусов +uint16_t EEMEM EEPcal360 = 0; // EEProm значение калибровки 360 градусов +uint16_t EEMEM EEPcal450 = 0; // EEProm значение калибровки 450 градусов +uint8_t EEMEM EEPspeed = 128; // EEProm скорость вращения + +uint16_t cal0 = 0; // Значение калибровки 0 градусов +uint16_t cal90 = 0; // Значение калибровки 90 градусов +uint16_t cal180 = 0; // Значение калибровки 180 градусов +uint16_t cal270 = 0; // Значение калибровки 270 градусов +uint16_t cal360 = 0; // Значение калибровки 360 градусов +uint16_t cal450 = 0; // Значение калибровки 450 градусов + +uint8_t rot_cw = 0; // Вращение по часовой +uint8_t rot_ccw = 0; // Вращение против часовой + +volatile uint8_t timer = 0; // Переменная таймера задержки плавного старта/остановки +volatile uint16_t timer2 = 0; // Переменная таймера + +void uartbuf_zero(void) // Обнуление буфера UART +{ + for(uint8_t i=0; i<16; i++) // Обнуление буфера UART + { + uartRXBuf[i] = 0x00; // Обнуление буфера UART + } +} + +void usart_init(unsigned int ubrr) // Инициализация USART +{ + UBRR0H = (unsigned char) (ubrr >> 8); // Установка скорости + UBRR0L = (unsigned char) ubrr; // Установка скорости + UCSR0B = (1<= cal450) // Если считанное значение АЦП больше 450-ой калибровки + { + return 450; // То возвращаем 450 + } + else if(az_raw_data > 0 && az_raw_data < 90) // Если приблизительный азимут от 0 до 90 градусов + { + az_raw_data = lround((adc_val - cal0)*90.0/(cal90-cal0)); // То делаем уточненный расчет по части шкалы в 90 градусов(0-90) с использованием дополнительных калибровок + return az_raw_data; // Возвращаем значчение азимута + } + else if(az_raw_data >= 90 && az_raw_data < 180) // Если приблизительный азимут от 90 до 180 градусов + { + az_raw_data = lround(90.0+((adc_val - cal90)*90.0/(cal180-cal90))); // То делаем уточненный расчет по части шкалы в 90 градусов(90-180) с использованием дополнительных калибровок + return az_raw_data; // Возвращаем значчение азимута + } + else if(az_raw_data >= 180 && az_raw_data < 270) // Если приблизительный азимут от 180 до 270 градусов + { + az_raw_data = lround(180.0+((adc_val - cal180)*90.0/(cal270-cal180))); // То делаем уточненный расчет по части шкалы в 90 градусов(180-270) с использованием дополнительных калибровок + return az_raw_data; // Возвращаем значчение азимута + } + else if(az_raw_data >= 270 && az_raw_data < 360) // Если приблизительный азимут от 270 до 360 градусов + { + az_raw_data = lround(270.0+((adc_val - cal270)*90.0/(cal360-cal270))); // То делаем уточненный расчет по части шкалы в 90 градусов(270-360) с использованием дополнительных калибровок + return az_raw_data; // Возвращаем значчение азимута + } + else if(az_raw_data >= 360 && az_raw_data <= 450) // Если приблизительный азимут от 360 до 450 градусов + { + az_raw_data = lround(360.0+((adc_val - cal360)*90.0/(cal450-cal360))); // То делаем уточненный расчет по части шкалы в 90 градусов(360-450) с использованием дополнительных калибровок + return az_raw_data; // Возвращаем значчение азимута + } + else + { + return az_raw_data; + } +} + +void set_az(uint16_t az_r, uint16_t az_n) // Расчет кратчайшего пути для поворота антенны +{ + int16_t cw; // Переменная для длины пути по часовой стрелке + int16_t ccw; // Переменная для длины пути против часовой стрелки + ccw = az_r - az_n; // Расчет пути против часовой стрелки + if(ccw < 0) // Расчет пути против часовой стрелки + { + ccw += 360; // Расчет пути против часовой стрелки + } + cw = az_n - az_r; // Расчет пути по часовой стрелке + if(cw < 0) // Расчет пути по часовой стрелке + { + cw += 360; // Расчет пути по часовой стрелке + } + if(cw < ccw) // Если по часовой короче, чем против + { + if(cw + az_r <= 450) // и получившийся азимут не выходит за возможности редуктора + { + rot_cw = 1; // То вращаем по часовой стрелке + } + else // Иначе + { + rot_ccw = 1; // против часовой стрелки + } + } + else // Если против часовой короче, чем по + { + if((int16_t)az_r - (int16_t)ccw > 0) // и получившийся азимут не выходит за возможности редуктора + { + rot_ccw = 1; // То вращаем против часовой + } + else // Иначе + { + rot_cw = 1; // По часовой + } + } +} + +void pwm_init(void) // Инициализация ШИМ +{ + TCCR2A |= (1< 0) + { + timer2--; + } +} + +void timer0_stop(void) // Остановка таймера 0 +{ + TCCR0B &= ~(1< 20) // Текущая скорость меньше максимальной и таймер дотикал до переключения + { + step_val += 16; // чуть добавляем скорость + OCR2A = step_val; // чуть добавляем скорость + timer = 0; // обнуляем таймер + } + if(step_val == speed) // Если достигли максимальной скорости + { + rot_stat = ROTARY; // Меняем статус + } + } + if((rot_stat == SLOW_START || rot_stat == ROTARY) && ((rot_ccw == 1 && ((raw_az - new_az) < SLOW_DOWN_AZ)) || (rot_cw == 1 && ((new_az - raw_az) < SLOW_DOWN_AZ))) && manual == 0) // Разница между текущим и заданным азимутом меньше, чем задана для плавной остановки + { + rot_stat = SLOW_DOWN; // Меняем статус + } + if(rot_stat == SLOW_DOWN) // Плавная остановка + { + if(step_val > 31 && timer > 15) // Если значение скорости больше минимальной и таймер дотикал до переключения + { + OCR2A = step_val; // Чуть уменьшаем скорость + step_val -= 16; // Чуть уменьшаем скорость + timer = 0; // обнуляем таймер + } + if(step_val <= 31 && need_stop == 1) + { + ROTOR_PORT &= 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Ð-=LWZqMC>-bH`J+iMD9kUJwK>i{jB6q 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 literal 0 HcmV?d00001 diff --git a/fw/obj/main.o b/fw/obj/main.o new file mode 100644 index 0000000000000000000000000000000000000000..d70edc4a90fcf0e8ab27e945e33745927a969afc GIT binary patch literal 10520 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 literal 0 HcmV?d00001 diff --git a/fw/out/dxa_rotor_ctl.eep b/fw/out/dxa_rotor_ctl.eep new file mode 100644 index 0000000..aed799c --- /dev/null +++ b/fw/out/dxa_rotor_ctl.eep @@ -0,0 +1,2 @@ +:0D0000008000000000000000000000000073 +:00000001FF diff --git a/fw/out/dxa_rotor_ctl.hex b/fw/out/dxa_rotor_ctl.hex new file mode 100644 index 0000000..79c6103 --- /dev/null +++ b/fw/out/dxa_rotor_ctl.hex @@ -0,0 +1,336 @@ +:1000000050C06AC069C068C067C066C065C064C0CF +:1000100063C062C061C060C05FC05EC05DC05CC0E4 +:1000200037C25AC087C058C057C056C055C054C008 +:1000300053C052C058340058330058320058310071 +:100040004F4B0A0043414C343530004F4B0A0043BC +:10005000414C333630004F4B0A0043414C3237306D +:10006000004F4B0A0043414C313830004F4B0A00DF +:1000700043414C3930004F4B0A0043414C30004261 +:100080004F4F540059414553552044584120524F39 +:10009000544F52204341524420627920523543410B +:1000A0000A0011241FBECFEFD4E0DEBFCDBF11E0A8 +:1000B000A0E0B1E0E8ECF4E102C005900D92A431BB +:1000C000B107D9F721E0A4E1B1E001C01D92AD3341 +:1000D000B207E1F717D2F6C993CFCF93C82F8A3072 +:1000E00011F48DE0FADF8091C00085FFFCCFC09352 +:1000F000C60080E090E0CF91089580E090E0FC01A0 +:10010000E95DFE4F1082019680319105C1F7089597 +:100110009093C5008093C40088E98093C10086E075 +:100120008093C20008959091C00095FFFCCF80930A +:10013000C60008951F920F920FB60F9211248F934D +:100140009F93EF93FF93E0912601F0E08091C6002A +:10015000E95DFE4F8083E0912601F0E0E95DFE4F0E +:100160008081E0912601F0E0E95DFE4F8D3029F4B9 +:10017000108281E08093250119C080818831B1F41B +:100180000FB6F894A8958091600088618093600014 +:10019000109260000FBE98E088E10FB6F894A89521 +:1001A000809360000FBE90936000FFCF8091260186 +:1001B0008F5F80932601FF91EF919F918F910F9018 +:1001C0000FBE0F901F901895ECE7F0E080818064DF +:1001D0008083EAE7F0E080818668808308959091CB +:1001E0007C00987F8770892B80937C0080917A00B7 +:1001F000806480937A0080917A0086FDFCCF8091A4 +:1002000078009091790008954F925F926F927F925B +:100210008F929F92AF92BF92EF92FF920F931F9394 +:10022000CF93DF9380E0DBDF8C01E0902301F0903F +:100230002401BC016E197F0980E090E0CBD44B0112 +:100240005C01C0911901D0911A0120E030E041EE2B +:1002500053E47ED52B013C01BE016E197F0980E07D +:1002600090E0B8D49B01AC01C301B2014BD440D59E +:10027000E016F10608F0C9C00C171D0708F0C8C049 +:100280009B012150310929353105C0F420E030E0CF +:1002900044EB52E4C501B4015BD54B015C016091B4 +:1002A0002101709122016E197F0980E090E092D4C3 +:1002B0009B01AC01C501B40125D4A5C09B012A5501 +:1002C00031092A35310520F5C0912101D091220153 +:1002D000B8016C1B7D0B80E090E07CD420E030E026 +:1002E00044EB52E435D54B015C0160911F017091E4 +:1002F00020016C1B7D0B80E090E06CD49B01AC0175 +:10030000C501B401FFD320E030E044EB52E47AC0F1 +:100310009B01245B31092A35310520F5C0911F016D +:10032000D0912001B8016C1B7D0B80E090E052D48D +:1003300020E030E044EB52E40BD54B015C016091CE +:100340001D0170911E016C1B7D0B80E090E042D47A +:100350009B01AC01C501B401D5D320E030E044E3FA +:1003600053E450C09B012E5031402A35310520F511 +:10037000C0911D01D0911E01B8016C1B7D0B80E066 +:1003800090E028D420E030E044EB52E4E1D44B018B +:100390005C0160911B0170911C016C1B7D0B80E066 +:1003A00090E018D49B01AC01C501B401ABD320E0AF +:1003B00030E047E853E426C09B01285631402B35F6 +:1003C000310548F5E0901B01F0901C01B8016E1951 +:1003D0007F0980E090E0FED320E030E044EB52E47F +:1003E000B7D44B015C01CE19DF09BE0180E090E07B +:1003F000F1D39B01AC01C501B40184D320E030E00E +:1004000044EB53E41BD374D406C080E090E004C0F6 +:1004100082EC91E001C0CB01DF91CF911F910F9150 +:10042000FF90EF90BF90AF909F908F907F906F90D4 +:100430005F904F9008959C01261B370B37FF02C039 +:1004400028593E4F681B790B77FF02C068597E4FD1 +:10045000621773074CF4860F971F833C914048F452 +:1004600081E0809318010895821B930B18161906DA +:10047000BCF781E0809317010895E0EBF0E0808104 +:1004800083688083E1EBF0E0808181608083089560 +:100490001F920F920FB60F9211248F939F9380910A +:1004A00016018F3F29F0809116018F5F809316010E +:1004B0008091140190911501892B49F080911401CC +:1004C00090911501019790931501809314019F91CC +:1004D0008F910F900FBE0F901F90189585B58B7F51 +:1004E00085BDEEE6F0E080818E7F8083109216015C +:1004F000089585B5846085BDEEE6F0E08081816079 +:1005000080830895CF93DF93CDB7DEB72A970FB6D8 +:10051000F894DEBF0FBECDBF9FE088E10FB6F89420 +:10052000A895809360000FBE90936000A8958AB153 +:1005300080668AB98BB18F798BB9239A2B9844DE68 +:1005400083E390E0E5DD80E091E090933A018093D1 +:1005500039018BE090E059D79093240180932301D7 +:1005600089E090E052D7909322018093210187E0A7 +:1005700090E04BD79093200180931F0185E090E09D +:1005800044D790931E0180931D0183E090E03DD7F6 +:1005900090931C0180931B0181E090E036D79093EB +:1005A0001A018093190180E090E027D7682E65DF5B +:1005B0001092B30084E890E09F938F935AD478947C +:1005C00098DFA8950F900F90512CC12CD12C10E0E2 +:1005D000712C0FE14424439447E7242E33243394B1 +:1005E000CE0101965C0156E7852E50E0952EA89528 +:1005F0000BDE7C0180911801813039F4CE14DF04C8 +:1006000021F4711002C010921801809117018130FD +:1006100039F4CE14DF0421F4711002C010921701D6 +:10062000112371F08091180181110AC08091170186 +:10063000811106C08BB18F798BB91092B30010E095 +:100640008091140190911501892BA1F4111112C010 +:1006500080911801813029F45D9A9FE19093B30055 +:10066000EAC1809117018130B9F45E9AEFE1E0931D +:10067000B300E1C1113081F4061548F480911601F0 +:10068000853128F0005F0093B30010921601061127 +:1006900002C012E001C011E08FEF810F8230A8F498 +:1006A00080911701813029F4C7018C199D09449765 +:1006B00048F080911801813019F5C6018E199F0903 +:1006C0004497F0F4772019F01BC01330C9F40032BE +:1006D00058F080911601803190F00093B3000051E2 +:1006E00010921601003258F4F1E05F1208C08BB18D +:1006F0008F798BB91092B300512C10E001C013E038 +:1007000080912501813009F072CF6FE770E087E2B8 +:1007100091E09ED3892BB1F40FB6F894A8958091FF +:100720006000886180936000109260000FBE98E0C6 +:1007300088E10FB6F894A895809360000FBE90935F +:100740006000FFCF6AE770E087E291E081D3892BF8 +:1007500069F480E044DD9093240180932301BC017F +:100760008BE090E065D69F928F9215C060E770E0B5 +:1007700087E291E06DD3892B91F480E030DD909396 +:10078000220180932101BC0189E090E051D68CE6E2 +:1007900090E09F938F936DD30F900F9044C165E6C7 +:1007A00070E087E291E054D3892B69F480E017DD93 +:1007B0009093200180931F01BC0187E090E038D620 +:1007C00081E690E0E6CF6AE570E087E291E040D311 +:1007D000892B69F480E003DD90931E0180931D0155 +:1007E000BC0185E090E024D686E590E0D2CF6FE4AE +:1007F00070E087E291E02CD3892B69F480E0EFDC94 +:1008000090931C0180931B01BC0183E090E010D603 +:100810008BE490E0BECF64E470E087E291E018D30F +:10082000892B69F480E0DBDC90931A018093190135 +:10083000BC0181E090E0FCD580E490E0AACFE7E243 +:10084000F1E001900020E9F73197CF018752914004 +:100850008130910509F04EC080912701833471F5F4 +:1008600081E461DC8AE55FDC8DE35DDC8AE0F50133 +:1008700011928A95E9F7FF92EF928EE091E09F93B3 +:100880008F93BF92AF9218D30F900F900F900F904D +:100890000F900F90F12CF50101900020E9F73197AE +:1008A000EA19FB098F2D90E08E179F0768F4F50178 +:1008B000E80FF91F808137DCF394EDCF833539F4ED +:1008C00010921801109217018DE02DDCACC08C3411 +:1008D00029F41111A8C04092170107C0823509F010 +:1008E000A2C01111A0C0409218018DE01CDC772439 +:1008F000739499C08430910509F051C0809127010B +:100900008D3409F090C08091280180932701809157 +:1009100029018093280180912A0180932901109256 +:100920002A018DE000DC87E291E075D26C018091B4 +:100930001801813039F080911701813031F432E0B3 +:10094000732E04C07724739401C0712C1092180187 +:1009500010921701B601C7016EDD80911801813038 +:1009600031F080911701813021F482E003C081E0F1 +:1009700001C080E0772009F455C0781659F01123A2 +:1009800009F450C03092150120921401552453945B +:1009900013E048C0133009F045C011E043C002978E +:1009A00009F041C06DE370E087E291E051D2892BFC +:1009B00049F48DE0B8DB6FE380E090E02BD52FE3C6 +:1009C000622E31C06AE370E087E291E041D2892B68 +:1009D00049F48DE0A8DB6FE780E090E01BD59FE74E +:1009E000692E21C067E370E087E291E031D2892B64 +:1009F00049F48DE098DB6FEB80E090E00BD58FEB56 +:100A0000682E11C064E370E087E291E021D2892B67 +:100A100051F48DE088DB6FEF80E090E0FBD466243A +:100A20006A9401C0712CF89468DB10922601109230 +:100A300025017894DCCD0FE11FCE5058BB27AA27A3 +:100A40000ED01CC10DD130F012D120F031F49F3FF7 +:100A500011F41EF402C10EF4E095E7FBF8C0E92F93 +:100A60001ED180F3BA17620773078407950718F041 +:100A700071F49EF536C10EF4E0950B2EBA2FA02D21 +:100A80000B01B90190010C01CA01A0011124FF273B +:100A9000591B99F0593F50F4503E68F11A16F04036 +:100AA000A22F232F342F4427585FF3CF4695379535 +:100AB0002795A795F0405395C9F77EF41F16BA0BFA +:100AC000620B730B840BBAF09150A1F0FF0FBB1FA8 +:100AD000661F771F881FC2F70EC0BA0F621F731FF1 +:100AE000841F48F4879577956795B795F7959E3F4E +:100AF00008F0B3CF9395880F08F09927EE0F9795DC +:100B0000879508950CD0BAC0B2D040F0A9D030F08B +:100B100021F45F3F19F09BC05111E4C09EC0BFD0CB +:100B200098F39923C9F35523B1F3951B550BBB27B4 +:100B3000AA2762177307840738F09F5F5F4F220F61 +:100B4000331F441FAA1FA9F333D00E2E3AF0E0E85A +:100B500030D091505040E695001CCAF729D0FE2FA6 +:100B600027D0660F771F881FBB1F26173707480738 +:100B7000AB07B0E809F0BB0B802DBF01FF279358EE +:100B80005F4F2AF09E3F510568F061C0ABC05F3FE8 +:100B9000ECF3983EDCF3869577956795B795F795D6 +:100BA0009F5FC9F7880F911D9695879597F90895CE +:100BB000E1E0660F771F881FBB1F6217730784076A +:100BC000BA0720F0621B730B840BBA0BEE1F88F779 +:100BD000E0950895E89409C097FB3EF490958095C0 +:100BE000709561957F4F8F4F9F4F9923A9F0F92FF3 +:100BF00096E9BB279395F695879577956795B79571 +:100C0000F111F8CFFAF4BB0F11F460FF1BC06F5F56 +:100C10007F4F8F4F9F4F16C0882311F096E911C068 +:100C2000772321F09EE8872F762F05C0662371F089 +:100C300096E8862F70E060E02AF09A95660F771F9D +:100C4000881FDAF7880F9695879597F9089597F991 +:100C50009F6780E870E060E008959FEF80EC089562 +:100C600000240A941616170618060906089500248B +:100C70000A9412161306140605060895092E039405 +:100C8000000C11F4882352F0BB0F40F4BF2B11F479 +:100C900060FF04C06F5F7F4F8F4F9F4F089557FDD8 +:100CA0009058440F551F59F05F3F71F04795880FDA +:100CB00097FB991F61F09F3F79F087950895121671 +:100CC00013061406551FF2CF4695F1DF08C016161D +:100CD00017061806991FF1CF8695710561050894CE +:100CE0000895E894BB2766277727CB0197F90895E5 +:100CF000DEDF58F19E5758F19851A0F0E9F0983096 +:100D000020F5092E9927660F771F881F991F0A94CF +:100D1000D1F712C0062E672F782F8827985F11F41D +:100D2000000C07C0993FB4F3869577956795939526 +:100D3000D9F7611D711D811D3EF4909580957095C8 +:100D400061957F4F8F4F9F4F08956894CBCFC9CF48 +:100D50000BD094CF85DF28F08ADF18F0952309F0B7 +:100D600076CF7BCF1124BECF9ADFA0F3959FD1F32E +:100D7000950F50E0551F629FF001729FBB27F00D49 +:100D8000B11D639FAA27F00DB11DAA1F649F66279E +:100D9000B00DA11D661F829F2227B00DA11D621FED +:100DA000739FB00DA11D621F839FA00D611D221FA7 +:100DB000749F3327A00D611D231F849F600D211D8B +:100DC000822F762F6A2F11249F5750408AF0E1F02E +:100DD00088234AF0EE0FFF1FBB1F661F771F881F77 +:100DE00091505040A9F79E3F510570F030CF7ACF17 +:100DF0005F3FECF3983EDCF3869577956795B79562 +:100E0000F795E7959F5FC1F7FE2B880F911D96958B +:100E1000879597F90895FC0188279927E8942191EF +:100E20002032E9F3293010F02E30C8F32B3239F09C +:100E30002D3231F4689403C014D0820F911D21919A +:100E400020532A30C8F31EF4909581959F4F089542 +:100E5000FB01DC018D91059080190110D9F3990BEC +:100E600008957AE0979F902D879F802D910D1124F2 +:100E70000895A0E0B0E0EEE3F7E0FBC2AE01495F09 +:100E80005F4FDA016D917D91AD0107E311E0F8014B +:100E900082819381DC0113962C911397286013961D +:100EA0002C9329D0D8011296ED91FC9113972381B0 +:100EB000277F2383E4E0F9C2AEE0B0E0E1E6F7E0AB +:100EC000D8C20D891E8986E08C831A8309838FEF2F +:100ED0009FE79E838D83AE01475E5F4F6F89788D5C +:100EE000CE01019608D0EF81F885E00FF11F108246 +:100EF0002E96E4E0DAC2ABE0B0E0E0E8F7E0ABC2A7 +:100F00006C017B018A01FC0117821682838181FFBB +:100F1000BFC1CE0101963C01F6019381F70193FD1B +:100F2000859193FF81917F01882309F4ADC18532BA +:100F300039F493FD859193FF81917F01853221F4EE +:100F4000B60190E0C0D1E8CF912C212C312CFFE1EB +:100F5000F315D8F08B3279F038F4803279F083329F +:100F6000A1F4232D20611DC08D3261F0803369F41E +:100F7000232D216016C0832D8260382EE32DE4607E +:100F80003E2E2AC0F32DF8601DC037FC2DC020ED89 +:100F9000280F2A3040F08E32B9F436FC75C1232D6B +:100FA0002064322E19C036FE06C08AE0989E200DBD +:100FB0001124922E11C0EAE02E9E200D1124222E23 +:100FC000F32DF0623F2E08C08C3621F4832D80680B +:100FD000382E02C0883641F4F70193FD859193FFC6 +:100FE00081917F018111B3CF982F9F7D95549330CC +:100FF00028F40C5F1F4F9FE399830DC0833631F0B7 +:10100000833771F0833509F055C020C0F801808125 +:1010100089830E5F1F4F88248394912C530112C043 +:101020002801F2E04F0E511CF801A080B18036FE7D +:1010300003C0692D70E002C06FEF7FEFC50138D1AA +:101040004C018201F32DFF773F2E15C0280122E0CD +:10105000420E511CF801A080B18036FE03C0692DFC +:1010600070E002C06FEF7FEFC50117D14C01F32D87 +:10107000F0683F2E820133FC19C0822D90E0881663 +:101080009906A0F4B60180E290E01DD12A94F5CF34 +:10109000F50137FC859137FE81915F01B60190E043 +:1010A00012D121102A9421E0821A9108811491040E +:1010B00079F7E1C0843611F0893639F5F80137FE49 +:1010C00007C060817181828193810C5F1F4F08C0CE +:1010D00060817181072E000C880B990B0E5F1F4FEA +:1010E000F32DFF763F2E97FF09C090958095709560 +:1010F00061957F4F8F4F9F4FF0683F2E2AE030E081 +:10110000A3011DD1882E861844C0853731F4232DC4 +:101110002F7EB22E2AE030E025C0932D997FB92E84 +:101120008F36C1F018F4883579F0AEC0803719F0E9 +:10113000883721F0A9C0E92FE061BE2EB4FE0DC0B2 +:10114000FB2DF460BF2E09C034FE0AC0292F266093 +:10115000B22E06C028E030E005C020E130E002C039 +:1011600020E132E0F801B7FE07C060817181828121 +:1011700093810C5F1F4F06C06081718180E090E019 +:101180000E5F1F4FA301DBD0882E8618FB2DFF7743 +:101190003F2E36FE0DC0232D2E7FA22E891458F42B +:1011A00034FE0BC032FC09C0832D8E7EA82E05C0F4 +:1011B000B82CA32C03C0B82C01C0B92CA4FE0FC0BE +:1011C000FE01E80DF11D8081803321F49A2D997E76 +:1011D000A92E09C0A2FE06C0B394B39404C08A2D00 +:1011E000867809F0B394A3FC10C0A0FE06C0B21428 +:1011F00080F4280C922C9B180DC0B21458F4B60140 +:1012000080E290E060D0B394F8CFB21418F42B18B9 +:1012100002C0982C212CA4FE0FC0B60180E390E000 +:1012200052D0A2FE16C0A1FC03C088E790E002C025 +:1012300088E590E0B6010CC08A2D867851F0A1FEB9 +:1012400002C08BE201C080E2A7FC8DE2B60190E013 +:101250003AD0891430F4B60180E390E034D09A9407 +:10126000F8CF8A94F301E80DF11D8081B60190E07A +:101270002AD08110F6CF222009F44ECEB60180E2AA +:1012800090E021D02A94F7CFF6018681978102C0A1 +:101290008FEF9FEF2B96E2E1FAC0FC0105906150C1 +:1012A00070400110D8F7809590958E0F9F1F08957C +:1012B000FC016150704001900110D8F78095909525 +:1012C0008E0F9F1F08950F931F93CF93DF93FB0102 +:1012D000238121FD03C08FEF9FEF2CC022FF16C09A +:1012E00046815781248135814217530744F4A081F8 +:1012F000B1819D012F5F3F4F318320838C932681E5 +:1013000037812F5F3F4F3783268314C08B01EC0159 +:10131000FB010084F185E02D0995892BE1F6D801C8 +:1013200016968D919C911797019617969C938E9384 +:101330001697CE01DF91CF911F910F910895FA0179 +:10134000AA27283051F1203181F1E8946F936E7F04 +:101350006E5F7F4F8F4F9F4FAF4FB1E03ED0B4E0F5 +:101360003CD0670F781F891F9A1FA11D680F791F36 +:101370008A1F911DA11D6A0F711D811D911DA11D47 +:1013800020D009F468943F912AE0269F1124301957 +:10139000305D3193DEF6CF010895462F4770405DF2 +:1013A0004193B3E00FD0C9F7F6CF462F4F70405DA1 +:1013B0004A3318F0495D31FD4052419302D0A9F7FC +:1013C000EACFB4E0A6959795879577956795BA95F6 +:1013D000C9F700976105710508959B01AC010A2EBC +:1013E00006945795479537952795BA95C9F7620F93 +:1013F000731F841F951FA01D0895F999FECF92BDFC +:1014000081BDF89A992780B50895A8E1B0E042E03F +:1014100050E013C0262FF999FECF1FBA92BD81BDAF +:1014200020BD0FB6F894FA9AF99A0FBE0196089566 +:10143000F1DF272FF0CFDC01CB01FC01F999FECFC2 +:1014400006C0F2BDE1BDF89A319600B40D9241504C +:101450005040B8F708952F923F924F925F926F924B +:101460007F928F929F92AF92BF92CF92DF92EF9234 +:10147000FF920F931F93CF93DF93CDB7DEB7CA1BB5 +:10148000DB0B0FB6F894DEBF0FBECDBF09942A88E0 +:10149000398848885F846E847D848C849B84AA8488 +:1014A000B984C884DF80EE80FD800C811B81AA8115 +:1014B000B981CE0FD11D0FB6F894DEBF0FBECDBFE0 +:0814C000ED010895F894FFCF3F +:1014C80000000002000000006D0000000000253050 +:0414D8003364000079 +:00000001FF