From b0db08390d94c94270ef78aa154a502f8ea4a65b Mon Sep 17 00:00:00 2001 From: Leo C Date: Sun, 6 Dec 2015 23:15:12 +0100 Subject: [PATCH] Add AVR-CP/M system (cpxac.asm) and a Makefile --- .gitignore | 6 + Makefile | 122 ++++ cpsker.asm | 4 +- cpsker.hex | 1589 ---------------------------------------------------- cpxac.asm | 762 +++++++++++++++++++++++++ cpxcom.asm | 10 +- cpxswt.asm | 6 + cpxtyp.asm | 28 +- 8 files changed, 925 insertions(+), 1602 deletions(-) create mode 100644 .gitignore create mode 100644 Makefile delete mode 100644 cpsker.hex create mode 100644 cpxac.asm diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6cb9215 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +cpsker.hex +cpxtyp.hex +*.com +*.rel +*.prn + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..792e082 --- /dev/null +++ b/Makefile @@ -0,0 +1,122 @@ + +# The system-independent files: + +SRC_CPSKER = cpsker.asm cpsdef.asm cpsmit.asm cpscom.asm cpspk1.asm \ + cpspk2.asm cpsrem.asm cpsser.asm cpstt.asm cpscpm.asm \ + cpswld.asm cpscmd.asm cpsutl.asm cpsdat.asm cpxlnk.asm + +# The system-dependent files: + +SRC_SYSDEP = cpxtyp.asm cpxlnk.asm cpxcom.asm cpxswt.asm cpxvdu.asm + +# One of: + +SRC_SYSTEM = cpxsys.asm cpxtor.asm cpxnor.asm cpxmrl.asm cpxsb.asm \ + cpxcif.asm cpxhea.asm cpxapp.asm cpxpcw.asm cpxbbi.asm cpxbee.asm \ + cpxsyo.asm cpxtm4.asm cpxgni.asm cpxpro.asm cpxz80.asm cpxac.asm + + +OVLADR = 7000 + + + + +# CP/M emulator +#CPMEMU = aliados +CPMEMU = zxcc + +ifeq "$(OS)" "Windows_NT" + PLATFORM=win32 +else + PLATFORM=Linux +endif + +#Location of M80/L80 +ifeq ($(PLATFORM),Linux) + CPMBIN = /usr/local/lib/cpm/bin80 +else + CPMBIN = C:/cpmbin +endif + +AS = $(CPMEMU) $(CPMBIN)/m80.com +LINK = $(CPMEMU) $(CPMBIN)/l80.com + +do_as = + @COMMAND="$(AS) =$<"; \ + OUTPUT=$$(mktemp); echo $${COMMAND}; \ + $${COMMAND} > $${OUTPUT}; \ + grep -q 'No Fatal error(s).$$' $${OUTPUT}; ERROR=$$? ; \ + if [ "$${ERROR}" != "0" ]; then cat $${OUTPUT}; rm $@; fi ; \ + rm $${OUTPUT}; \ + exit $${ERROR} + + +.PHONY: all + +.SUFFIXES: + +all: kerm411.com cpxtyp.prn cpsker.prn + + +kerm411.com: cpsker.rel cpxtyp.rel + $(LINK) -/P:100,cpsker,cpsker/N/X/E + $(LINK) -/P:$(OVLADR),cpxtyp,cpxtyp/N/X/E + $(CPMEMU) mload.com -kerm411.com=cpsker.hex,cpxtyp.hex + +# grep -v -P '^(\x1A)|(:..7)|(:00....01)' cpsker.hex >kerm411.hex +# grep -v -P '^\x1A' cpxtyp.hex >>kerm411.hex +# objcopy -I ihex -O binary kerm411.hex kerm411.com + + +cpxtyp.rel: $(SRC_SYSDEP) $(SRC_SYSTEM) +cpsker.rel: $(SRC_CPSKER) +cpxtyp.prn: $(SRC_SYSDEP) $(SRC_SYSTEM) +cpsker.prn: $(SRC_CPSKER) + +mload.com: mload.rel + $(LINK) -/P:100,mload,mload/N/E + +mload.rel: mload.asm + echo -e 'aseg\r' >tmp.mac + cat mload.asm >>tmp.mac + @COMMAND="$(AS) -mload=tmp.mac"; \ + OUTPUT=$$(mktemp); echo $${COMMAND}; \ + $${COMMAND} > $${OUTPUT}; \ + grep -q 'No Fatal error(s).$$' $${OUTPUT}; ERROR=$$? ; \ + if [ "$${ERROR}" != "0" ]; then cat $${OUTPUT}; rm $@; fi ; \ + rm $${OUTPUT}; \ + exit $${ERROR} + + +%.rel: %.asm + @COMMAND="$(AS) =$<"; \ + OUTPUT=$$(mktemp); echo $${COMMAND}; \ + $${COMMAND} | tee $${OUTPUT}; \ + grep -q 'No Fatal error(s).$$' $${OUTPUT}; ERROR=$$? ; \ + if [ "$${ERROR}" != "0" ]; then cat $${OUTPUT}; rm $@; fi ; \ + #rm $${OUTPUT}; \ + exit $${ERROR} + + +%.prn: %.asm + @COMMAND="$(AS) ,$@=$<"; \ + OUTPUT=$$(mktemp); echo $${COMMAND}; \ + $${COMMAND} > $${OUTPUT}; \ + grep -q 'No Fatal error(s).$$' $${OUTPUT}; ERROR=$$? ; \ + if [ "$${ERROR}" != "0" ]; then cat $${OUTPUT}; fi ; \ + #rm $${OUTPUT}; \ + exit $${ERROR} + + +#%.BIN: %.rel +# $(LINK) $<,$@/N/E +## zxcc l80.com -$<,$@/N/E + +%.com: %.rel + $(LINK) $<,$@/N/E + + +.PHONY: clean + +clean: + rm -f *.rel *.prn diff --git a/cpsker.asm b/cpsker.asm index b3d4831..c232c11 100644 --- a/cpsker.asm +++ b/cpsker.asm @@ -266,8 +266,8 @@ debug equ FALSE ; set false for running system. True => does some ; Assembler type. Define the appropriate one TRUE, the rest FALSE. (We can't ; use ASM, because it cannot handle multiple input files) mac80 EQU FALSE ; For assembly via MAC80 cross-assembler. -m80 EQU false ; For assembly via Microsoft's M80. -lasm EQU true ; For assembly via LASM, a public-domain +m80 EQU TRUE ; For assembly via Microsoft's M80. +lasm EQU FALSE ; For assembly via LASM, a public-domain ; assembler. ; ; Get the other modules... diff --git a/cpsker.hex b/cpsker.hex deleted file mode 100644 index 9120b31..0000000 --- a/cpsker.hex +++ /dev/null @@ -1,1589 +0,0 @@ -:100100000000C32701C3C201C3234F4350534D49CD -:10011000542E41534D20283330292032392D4D6142 -:10012000722D313939312421000039220F63319188 -:1001300063117C54CD554F0E19CD82513C329463DE -:100140003A8670FEFF3E00C24D013286702A007072 -:100150007CB5CAB0011154FF197CB5C2B9012A029D -:100160007011FAFF197CB5C2B901218251222770A2 -:10017000CD4D703AA570322D6711C95ACD777021D7 -:10018000800011A26A018000CD74703A8000A7CA75 -:10019000A1013DCAA1013AAD63F61032AD6332ACA4 -:1001A000633EFF322C67CD1A08AF32AE63C3C20183 -:1001B000115556CD554FC3D006118B56CD554FC353 -:1001C000D006319163CD1470AF32324732334732AB -:1001D000344732AC6C3271623272623299663A9450 -:1001E00063C64032C654CD09543AA26CFE30C2F305 -:1001F000013E2032C4543AA16C32C5543AAD63E694 -:1002000011C20B023AAC63A7C2CA0611B954CD524F -:1002100047112502213C03CD084FEBE911E554CDF0 -:100220007770C3C2012005425245414B24AA060300 -:1002300042594524BB06014324CA3D07434F4E4E55 -:1002400045435424CA3D04434F5059249344094420 -:1002500049524543544F525924E4400545524153B5 -:100260004524C042044558495424CA060646494E0E -:10027000495348240F270347455424371904484558 -:100280004C5024850705494E50555424D306034C41 -:100290004F47249107064C4F474F55542465270676 -:1002A0004F555450555424DC18055041555345249E -:1002B000B307055052494E5424F60704515549548A -:1002C00024CA060152246D19075245434549564533 -:1002D000246D190652454D4F544524542D06524560 -:1002E0004E414D45248345015324A31D0453454EDF -:1002F0004424A31D035345542484080453484F57F2 -:100300002449150653544154555324551504535448 -:1003100041592458100454414B45240908085452AB -:10032000414E534D495424283C04545950452447C8 -:10033000430756455253494F4E241D180D0A425249 -:1003400045414B20746F2073656E6420612062729A -:1003500065616B20746F2074686520686F73740D1D -:100360000A42594520746F20686F737420284C4FDF -:10037000474F55542920616E642065786974207454 -:100380006F2043502F4D0D0A434F4E4E454354208E -:10039000746F20686F7374206F6E2073656C656373 -:1003A00074656420706F72740D0A434F5059207445 -:1003B0006F20636F707920612043502F4D20666954 -:1003C0006C650D0A4449524543544F5259206F669B -:1003D0002063757272656E742075736564204D6953 -:1003E00063726F2D6469736B0D0A4552415345204A -:1003F000612043502F4D2066696C650D0A455849B0 -:100400005420746F2043502F4D0D0A46494E4953D6 -:10041000482072756E6E696E67204B65726D6974E7 -:10042000206F6E2074686520686F73740D0A4745ED -:100430005420612066696C652066726F6D20746857 -:100440006520686F73740D0A48454C50206279200E -:10045000676976696E672074686973206D65737368 -:100460006167650D0A494E50555420746F206D61C7 -:100470006B6520746865206D6963726F20776169B0 -:100480007420666F72206120737472696E672066D3 -:10049000726F6D2074686520686F73740D0A4C4F1D -:1004A0004720746865207465726D696E616C207395 -:1004B000657373696F6E7320746F20612066696C59 -:1004C000650D0A4C4F474F55542074686520686F7E -:1004D00073740D0A4F555450555420746F20736532 -:1004E0006E6420612073706563696669656420735A -:1004F0007472696E6720746F2074686520686F730A -:10050000740D0A504155534520746F20776169740A -:1005100020666F722061206C6974746C6520746948 -:100520006D650D0A5052494E5420612066696C6514 -:1005300020746F20746865207072696E7465720D26 -:100540000A5155495420746F2043502F4D0D0A52C3 -:100550004543454956452066696C652066726F6D56 -:1005600020686F73740D0A52454D4F544520746FC7 -:100570002073656E6420636F6D6D616E64732074AB -:100580006F20612072656D6F74652073657276658A -:10059000720D0A52454E414D4520746F2072656EB2 -:1005A000616D6520612043502F4D2066696C650D9B -:1005B0000A53454E442066696C6520746F20686F4D -:1005C00073740D0A534554206120706172616D652A -:1005D0007465720D0A53484F572074686520706126 -:1005E00072616D65746572730D0A535441545553AD -:1005F000206F66204B65726D69740D0A5354415922 -:10060000206174204B65726D697420636F6D6D613C -:100610006E642D6C6576656C206166746572206110 -:1006200020636F6D6D616E64207461696C0D0A5496 -:10063000414B4520636F6D6D616E64732066726F10 -:100640006D20612066696C650D0A5452414E534D10 -:1006500049542066696C6520746F20686F7374203C -:1006600028696E20636F6E6E6563742073746174A5 -:1006700065290D0A5459504520612066696C652032 -:10068000746F2074686520636F6E736F6C650D0AFC -:1006900056455253494F4E206F66204B65726D6927 -:1006A000742072756E6E696E6724CD1A4F3E42CD0E -:1006B0005C70C3C20111AF58C3C201CD1A4FCD71D6 -:1006C00027C3C201CD6270C3CD06CD1A4FCD507085 -:1006D000C300003E06CDA547C3C2012A2A67221BDC -:1006E00067119B663E05CDA547C3C20132226BCD83 -:1006F0001A4F2A1B6729292923221B67221D67AF4E -:10070000326D652A1B672B221B677CB5C217073E1B -:1007100003329766C37C07CDA63DE67FC24E07CD68 -:100720008844F5CD0870F1E67FC236073A226BA700 -:10073000C20307C3C201FE03C246073AAD63E60126 -:10074000C47752C3C201FE1ACAC201C303075F3A8B -:100750006D65219B66856F3E008C677BBEC2FF0680 -:100760003A6D653C326D652A1D67221B675F3A2230 -:100770006B93C20307AF329766C3C201119857CD7E -:100780007770C3C201CD1A4F113C03CD3554C3C29B -:10079000013E03115C00CDA547C31C02CD1A4F21B9 -:1007A0005C0011A063010C00CD74703E01329F63A8 -:1007B000C3C2013E06CDA547C3C2012A2A67EB2A60 -:1007C00027677CE67F6719222A67CD8B523AAD6393 -:1007D000A7C2DF070E061EFFCD8251A7C2C2012AA3 -:1007E0002A67EB2A27677CE67F677B955F7A9CB355 -:1007F000C2CA07C3C2013EFF322067CD4743AF32B2 -:100800002067C3C201AFC3F8073E0211BD63CDA587 -:1008100047C3C201CD2608C3C201010C0011BD634C -:1008200021AF63CD74703AAD63E601C477520E1AFE -:1008300011E163CD8251AF32CB6332DD6311BD6311 -:100840000E0FCD82513CCA5A0821000022BB633AE8 -:10085000AD63F60132AD63C353523AAE63B7C01114 -:10086000C355CD7770C37A51435053434F4D2E41FA -:10087000534D20283133292032352D4D61722D31D1 -:1008800039393124118F0821D109CD084FEBE91AEC -:100890000B4155544F52454345495645241A0D10B6 -:1008A000424C4F434B2D434845434B2D54595045E3 -:1008B00024230D0B4255464645522D53495A452493 -:1008C000C00D09434F4C4C4953494F4E2463110509 -:1008D00044454255472491100C44454641554C54DB -:1008E0002D4449534B24E70D134449524543544F7B -:1008F00052592D46494C452D53495A45247B1106E2 -:10090000455343415045246B100946494C452D4DF4 -:100910004F444524B4110C464C4F572D434F4E5471 -:10092000524F4C2472110349424D24841110494EF8 -:10093000434F4D504C4554452D46494C455324F9A1 -:10094000110A4C4F43414C2D4543484F247F10071B -:100950004C4F4747494E47246210074E4F2D45588C -:10096000495424581006504152495459242B12041A -:10097000504F525424D314075052494E54455224D8 -:100980008810075245434549564524830F04534573 -:100990004E4424110E05535045454424B5140754C4 -:1009A000414354524150247E12085445524D494E01 -:1009B000414C2431130554494D4552249A10045595 -:1009C00053455224F942075741524E494E4724A3FA -:1009D000100D0A4155544F52454345495645207420 -:1009E0006F206175746F6D61746963616C6C7920DF -:1009F00072652D726563656976652066696C6573DD -:100A00000D0A424C4F434B2D434845434B2D5459FF -:100A1000504520666F72206572726F722064657433 -:100A2000656374696F6E0D0A4255464645522D53F3 -:100A3000495A4520666F72206D756C74692D736517 -:100A400063746F7220627566666572696E670D0AFF -:100A5000434F4C4C4953494F4E20746F207370657F -:100A60006369667920616374696F6E20666F7220B6 -:100A700066696C656E616D6520636F6E666C696337 -:100A800074730D0A4445425547206D657373616761 -:100A90006520636F6E74726F6C0D0A444546415554 -:100AA0004C542D4449534B20746F20726563656923 -:100AB000766520646174610D0A4449524543544F80 -:100AC00052592D46494C452D53495A452077686562 -:100AD0006E20646973706C6179696E6720646972F5 -:100AE0006563746F726965730D0A455343415045E0 -:100AF0002063686172616374657220647572696EE7 -:100B00006720434F4E4E4543540D0A46494C452DF0 -:100B10004D4F444520666F72206F7574676F696E24 -:100B2000672066696C65730D0A464C4F572D434F1D -:100B30004E54524F4C20746F2073657420584F4EA2 -:100B40002F584F464620666C6F7720636F6E747225 -:100B50006F6C0D0A49424D206D6F64653A207061DB -:100B60007269747920616E64207475726E2061728E -:100B70006F756E642068616E646C696E670D0A49FA -:100B80004E434F4D504C4554452D46494C452064ED -:100B90006973706F736974696F6E0D0A4C4F4341CE -:100BA0004C2D4543484F202868616C662D64757054 -:100BB0006C6578290D0A4C4F4747494E47206F66B0 -:100BC000207465726D696E616C2073657373696FF3 -:100BD0006E730D0A4E4F2D4558495420746F207086 -:100BE000726576656E74206578697420746F204331 -:100BF000502F4D206166746572206120636F6D6DAA -:100C0000616E64207461696C0D0A504152495459F7 -:100C100020666F7220636F6D6D756E6963617469B4 -:100C20006F6E206C696E650D0A504F525420746FC0 -:100C300020636F6D6D756E6963617465206F6E0DF5 -:100C40000A5052494E54455220636F707920636FA9 -:100C50006E74726F6C0D0A524543454956452070BB -:100C60006172616D65746572730D0A53454E44205F -:100C7000706172616D65746572730D0A53504545FC -:100C800044206F6620636F6D6D756E696361746972 -:100C90006F6E206C696E650D0A54414320696E7455 -:100CA00065726661636520737570706F72740D0A8A -:100CB0005445524D494E414C20746F207365742049 -:100CC00061207465726D696E616C20747970650D58 -:100CD0000A54494D455220636F6E74726F6C0D0A51 -:100CE0005553455220746F207365742061207573CD -:100CF0006572206E756D6265720D0A5741524E49DC -:100D00004E4720666F722066696C656E616D652066 -:100D1000636F6E666C6963747324CD071532A06CC3 -:100D2000C3C20111320D217C0DCD0D1532A070C34F -:100D3000C2010314312D4348415241435445522DC1 -:100D4000434845434B53554D24313114322D4348CC -:100D5000415241435445522D434845434B53554D11 -:100D600024323215332D4348415241435445522DCC -:100D70004352432D43434954542433330D0A312DF8 -:100D80004348415241435445522D434845434B53F8 -:100D9000554D0D0A322D4348415241435445522D81 -:100DA000434845434B53554D0D0A332D434841525B -:100DB00041435445522D4352432D434349545424F7 -:100DC0003E06CDA547C3C2012A2A677CA7C2DE0D15 -:100DD0003A2D67BDFADE0D7D32A570C3C20111093F -:100DE00057CD7770C3C201115C003E10CDA547C33B -:100DF000F20D3A5C00B7C2FC0D3A94633294630E74 -:100E00000DCD82513A94633D5F0E0ECD8251C3C227 -:100E100001111C0E21580ECD084FEBE9040850417A -:100E2000442D4348415224410F0750414444494E08 -:100E30004724380F0F53544152542D4F462D5041E3 -:100E4000434B455424240F0D5041434B45542D4CE6 -:100E5000454E475448244A0F0D0A5041442D4348FB -:100E6000415220746F20646566696E652074686500 -:100E700020706164206368617261637465722074BC -:100E80006F207573650D0A50414444494E472074E4 -:100E90006F20646566696E6520746865206E756D87 -:100EA000626572206F66205041442D4348415220B4 -:100EB000746F207573650D0A53544152542D4F467B -:100EC0002D5041434B455420746F20646566696E14 -:100ED0006520746865207374617274206F66207079 -:100EE00061636B6574206368617261637465720D20 -:100EF0000A5041434B45542D4C454E4754482066BB -:100F00006F7220746865206C656E677468206F6608 -:100F1000207472616E736D697474656420706163AE -:100F20006B657424CD1A4F11195CCD77700E01CD0D -:100F30008251329763C3C201CD4310320000C3C255 -:100F400001CDF20F320000C3C201CD4310015F009A -:100F5000E5CD2854E1112A57D2620F7D329470C337 -:100F6000C201CD7770C3C201CD4310FE04C2760F1B -:100F7000114E57C3C201FE00CA700FC63032536B08 -:100F8000C3C201118E0F21580ECD084FEBE90408A2 -:100F90005041442D434841522401100750414444DC -:100FA000494E4724DE0F0F53544152542D4F462DC6 -:100FB0005041434B455424CA0F0D5041434B4554B7 -:100FC0002D4C454E475448240A10CD1A4F11195C38 -:100FD000CD77700E01CD8251329663C3C2013E06B9 -:100FE000CDA547C3C2013E04CDA5472A2A677D325D -:100FF0000000CD1A4F11405CCD77700E01CD8251AB -:10100000C9CDF20F320000C3C201CD4310015F0011 -:10101000E5CD2854E1112A57D222107D329570C3B4 -:10102000C201CD7770C3C201CD4310FE04C2361099 -:10103000114E57C3C201FE00CA3010C63032546B85 -:10104000C3C2013E06CDA547C3C2013E04CDA5479C -:10105000C3C2012A2A677DC9CD1A4FAF32AC63C320 -:10106000C201CD0715329F63C3C201CD1A4F11CC07 -:101070005BCD77700E01CD8251328770C3C201CD36 -:101080000715328E70C3C201CD0715328C70C3C2F2 -:1010900001CD0715328D70C3C201CD07153299639A -:1010A000C3C201CD0715328F70C3C201040642418D -:1010B000434B5550240202074449534341524424B0 -:1010C0000303094F56455257524954452400000620 -:1010D00052454E414D452401010D0A4241434B55B5 -:1010E00050202872656E616D65292065786973747A -:1010F000696E672066696C65730D0A444953434104 -:101100005244206E65772076657273696F6E732026 -:101110006F66206578697374696E672066696C65AF -:10112000730D0A4F56455257524954452065786908 -:101130007374696E672066696C65730D0A52454E5B -:10114000414D45206E65772076657273696F6E73C9 -:10115000206F66206578697374696E672066696CB4 -:1011600065732411AC1021D910CD0D15328F70C3C9 -:10117000C201CD0715326E62C3C201CD0715323DE3 -:101180006AC3C201CD0715329070B7CAA2113E03DF -:101190003293703E01328E70329963AF326E62C309 -:1011A000B1113E06329370AF328E70329963326E57 -:1011B00062C3C20111C31121E211CD0D153291702C -:1011C000C3C2010305415343494924010106424971 -:1011D0004E4152592402020744454641554C54247D -:1011E00000000D0A41534349490942494E415259B1 -:1011F0000944454641554C5424110812211C12CD76 -:101200000D15329270C3C201020744495343415243 -:1012100044240000044B4545502401010D0A444973 -:101220005343415244094B45455024113A1221631E -:1012300012CD0D15329370C3C20105044556454EBB -:10124000240000044D41524B240303044E4F4E45ED -:10125000240606034F4444240909055350414345DD -:10126000240C0C0D0A4556454E094D41524B094E72 -:101270004F4E45094F44440953504143452411A75B -:101280001221C212CD0D15B7CAA112FE01CA9E12BB -:1012900011EF5BCD77700E01CD825132A2703AA270 -:1012A0007032A170C3C20103094348415241435403 -:1012B0004552240202034F4646240000024F4E24AA -:1012C00001010D0A4F4E20746F20656E61626C65DE -:1012D0002054414320747261700D0A4F46462074B9 -:1012E0006F2064697361626C65205441432074729D -:1012F00061700D0A43484152414354455220746F76 -:1013000020656E61626C6520544143207472617087 -:1013100020616E64207370656369667920696E74FC -:10132000657263657074206368617261637465726D -:101330002411731321AB13CD0D157AFE03C256137E -:101340002A24707CB53E03C25613CD4F4F119D58D1 -:10135000CD7770C3C201FE40C2611332AD6CC3C20F -:1013600001FE80C26D13AF32AD6CC3C20132867014 -:10137000C3C201060444554D422402020845585494 -:1013800045524E414C2403030551554945542440D0 -:101390004007524547554C4152248080034F4646F2 -:1013A00024000004565435322401010D0A44554DE1 -:1013B00042202D206F6E6C79207072696E746162AC -:1013C0006C6520636861726163746572732070611B -:1013D0007373656420746F207465726D696E616CDF -:1013E0000D0A45585445524E414C202D20776974C2 -:1013F0006820656D756C6174696F6E20636F6465DC -:101400002073797374656D207370656369666963B1 -:101410000D0A4F4646202D20616C6C206368617276 -:101420006163746572732070617373656420746F97 -:10143000207465726D696E616C0D0A515549455491 -:10144000202D20646973706C6179206E6F746869F7 -:101450006E6720647572696E67207472616E736660 -:101460006572730D0A524547554C4152202D206E2E -:101470006F726D616C20646973706C617920666F46 -:1014800072207472616E73666572730D0A565435FC -:1014900032202D20617373756D65204B65726D6907 -:1014A000742063616E20656D756C617465206120C8 -:1014B00056543532242A7C707CB5CA1219EB2A7E28 -:1014C00070CD084FD5CD1A4FE1228870EBCD6570F5 -:1014D000C3C2012A80707CB5CA1219EB2A8270CD72 -:1014E000084FD5CD1A4FE1228A70CD6870C3C20172 -:1014F00002034F4646240000024F4E2401010D0A0C -:101500004F4646094F4E2411F01421FE14CD084FCA -:1015100032A16CCD1A4F3AA16CC95623460423223E -:10152000A16C2305C222154EB9CA3715232315C253 -:101530001C15213C1537C9B72AA16CC90D0A3F4EAD -:101540006F7420666F756E6424CD1A4FCD3270CDE6 -:101550006115C3C201CD1A4FCD3270CD6115C3C222 -:10156000013A2467B7CA6E15115D5DCD7770CDCD98 -:1015700015CDBE17CDF017CDD317CDB218CDBE18EF -:10158000CD5D16CDE617CD2916CD9018CD6916CDB7 -:101590004716CD604FCDD915CD8D16CDEF162A80CB -:1015A000707CB5C45E17CD8116CD4017CD2F17CDF9 -:1015B0004F17CD1E172A7C707CB5C47E17CD7718C7 -:1015C000CD1118CD9C18CDE515CD7516C911735DDB -:1015D000CD77703AA06CC3CF1811845DCD77703A87 -:1015E0008E70C3CF1811A95DCD777011C05D3AAD73 -:1015F0006CB7CAF81511C85DCD777011CE5DCD7787 -:10160000703A8670FEFFC20F16219D58C326164FF2 -:1016100021731346235E160023EB192323BECA262B -:101620001605C8C31416C3777011E75DCD77703AFD -:10163000917011F35DB7CA777011FC5DFE01CA7736 -:101640007011035EC37770113F5ECD777011655ED8 -:101650003A9270B7CA7770116E5EC37770110B5EE5 -:10166000CD77703A3D6AC3CF1811345ECD77703AAA -:101670009070C3CF1811745ECD77703A8F70C3CF5E -:101680001811835ECD77703A8C70C3CF1811925EBB -:10169000CD777011806C21A0637EB7C2A1163A94F9 -:1016A00063C64012133E3A12130E0821A1630600CE -:1016B0007E23FE20CABD1612130DC2B01678B7C223 -:1016C000D0163E2E121306FF0E0321A963C3B016D7 -:1016D0003E241211806CCD777011A05ECD77703AE8 -:1016E0009F63E67FFE02C2CF1811A45EF2777011ED -:1016F000A95FCD77703A937011B45FFE06CA777018 -:1017000011B95FFE03CA777011BE5FFE0CCA777015 -:1017100011C45FFE09CA777011C85FC3777011AF3B -:101720005ECD77703A9763C6405F0E02C382511157 -:10173000CB5ECD77703A9663C6405F0E02C382518E -:1017400011015FCD77703A95706F2600C3234F115A -:10175000EA5ECD77703A94706F2600C3234F11CDA7 -:101760005FCD77703A8A7021FA5FFEFFCABA172AF6 -:101770008070CD1A15D27B1721FA5FC3BA1711E01A -:101780005FCD77703A887021FA5FFEFFCABA172AD8 -:101790007C70562346042322A16C2305C29A174E5F -:1017A000B9CAB017232315C2941721FA5FC3BA1719 -:1017B0002AA16CEBCD777021F55FEBC377701175C3 -:1017C0005FCD77703AA0705F0E02CD8251118A5FB3 -:1017D000C3777011955FCD777021AC103A8F70CDC3 -:1017E0001A15EBC37770111B5FCD7770CDEF4EC923 -:1017F000112B5FCD77702100003AA5706FCD234F7C -:1018000011485FCD77702100003A2D676FCD234FCF -:10181000C9111260CD77703A9963C3CF18CD1A4FB2 -:10182000CD4F4F117C54CD7770118D54CD7770CD45 -:101830004F4F215D185E2356237AB3CA4918E5CD70 -:101840007770CD4F4FE1C335182A0470EBCD777018 -:10185000CD4F4F2A0670EBCD7770C3C2010B0168E4 -:10186000081B192925372DF33B0C3CC840E44535AE -:1018700047934E5F540000111A60CD777011955D4B -:101880003AA170B7CA77700E025FCD8251C34F4F35 -:10189000119A5DCD77703A6E62C3CF180E201EFF8D -:1018A000CD82516F2600E5114A60CD7770E1CD23DE -:1018B0004FC9116360CD77703A8D70C3CF18116F27 -:1018C00060CD77703A9463C6405F0E02C3825111B7 -:1018D000915DB7C2777011955DC377703E05119B1E -:1018E00066CDA547C3C20132226BA7CAC201CD1A79 -:1018F0004FCD0870119B661A13D5CDAF4E5FCD0B3F -:1019000070D13A226B3D32226BC2F718CD1470C3EE -:10191000C20111AF58CD7770C3C201435053504B31 -:10192000312E41534D20283233292031362D4A6142 -:101930006E2D31393931243EFF32AC6C11316D3EA0 -:1019400005CDA547C31C02B7CA1C02322F6DEB366A -:1019500024CD362C3AAD6CA7CA6119CD4F4FC36464 -:1019600019CD3B7011316DCD7770C378193E0032BF -:101970002F6D32AC6CCD362C11EE6C3E05CDA547EB -:10198000C31C02322A6D32AC6C3A2F6DB7CA95195E -:101990003E4932426BAF32396B210000223C6B2250 -:1019A0003E6B323B6B32406B3AAD6CA7C2B819CD7F -:1019B0004170210000CD234F3A2F6DB7C2C4193EAC -:1019C0005232426B3AAD6CA7C2DB193A9966B7C284 -:1019D000DB19CD3E702A3C6BCD234F3A426BFE445F -:1019E000C2E919CD4F1CC3C419FE58C2F419CD1851 -:1019F0001BC3C419FE46C2FF19CD181BC3C419FE70 -:101A000052C2181ACDB21A3A426BFE46C2C419111C -:101A1000985ACD912CC3C419FE43C24C1A11E157F8 -:101A20003A396BB7CA2E1AAF32396B11C4583A998A -:101A300066B7CC912C3A2F6DB7C2C2013AA06CA701 -:101A4000CAC20111685BCD7770C39519FE59CAC22D -:101A500001FE49C2A41ACD951E3A426BFE58CA69CE -:101A60001AFE41C2C419C3C2013A2F6D32AF6C4F86 -:101A7000060021316D115A6BCD74703E3132376BD7 -:101A8000AF32AE6C3E52CDC027C31C02AF32396BB1 -:101A9000210000223C6B323B6B32406B3E523242A3 -:101AA0006BC3DB19FE41C2A91A11EC57CD912CC3AF -:101AB000C2013A406BFE10FAC31A11F654CD212C24 -:101AC000C34D2C3C32406B3E3132376BCDEF28C3D7 -:101AD000562CFE53C20D1B3A406B32416BAF324065 -:101AE0006B3AAE6CCDDD2C3AAF6C215A6BCD8E22A9 -:101AF000215A6BCD4D2232AF6C3E59CDC027C34D1C -:101B00002C3A386B32376B3E4632426BC9FE45C2C7 -:101B1000532CCDDC2BC34D2C3A406BFE05FA291B10 -:101B2000111455CD212CC34D2C3C32406BCDEF28E8 -:101B3000C3562CFE53C2741B3A416BFE10FA491B6C -:101B400011F654CD212CC34D2C3C32416B3A3B6BEA -:101B50003DE63F473AAE6CB8C2532CCD692CAF324C -:101B6000406B215A6BCD4D2232AF6C3E59CDC02710 -:101B7000C34D2CC9FE5AC28E1B3A416BFE05FA8A30 -:101B80001B113355CD212CC34D2CCDFB2CC9FE464A -:101B9000C2CD1B4F3A9966B779C2D21BCDD42CC2A5 -:101BA000532CCDDD2C4F3A9966B779C2B41BCD4684 -:101BB00025C34D2C3A406B32416BCDEB2C3E443269 -:101BC000426B3A396BFE5AC8AF32396BC9FE58C204 -:101BD000271CCDD42CC2532CCDDD2CCD14703AAFA4 -:101BE0006CB7CA0E1CF51E3CD5CD1770D1CD177041 -:101BF000F1215A6BF55E23E5CD1770E1F13DC2F49A -:101C00001B1E3ED5CD1770D1CD1770CD4F4F3A402A -:101C10006B32416BCDEB2C3E4432426B3A396BFE5A -:101C20005AC8AF32396BC9FE42C2441CCDD42CC253 -:101C3000532CAF32AF6C3E59CDC027C34D2C3E4321 -:101C400032426BC9FE45C24D2CCDDC2BC34D2C3A24 -:101C5000406BFE05FA861C115455CD212C3A99662D -:101C6000B7C24D2C3A9270B7C27D1C115C00D50EE4 -:101C700010CD8251D10E13CD8251C34D2CCD475181 -:101C8000C3751DC34D2C3C32406BCDEF28C3562C81 -:101C9000FE44C2E41CCDD42CCAB01C3A416BFE05F4 -:101CA000FAAC1C115455CD212CC35D1CCDFB2CC9A5 -:101CB000CDDD2C3A406B32416B3AAF6CCD2623C35D -:101CC000781DAF32406B32AF6C4F3A396BB7CADB1D -:101CD0001C4F3E0132AF6C79325A6B3E59CDC02752 -:101CE000C35D1CC9FE46C2FE1C3A416BFE05FAFAF2 -:101CF0001C111455CD212CC35D1CCDFB2CC9FE5AE3 -:101D0000C2981DCDD42CC2532CCDDD2C3AAF6CFE25 -:101D100001C21C1D3A5A6BFE44CA391D3A9966B776 -:101D2000C2291DCD4751C3751DAF32396B3A406B87 -:101D300032416BCDEB2CC36F1D3A406B32416BCD02 -:101D4000EB2C3A9966B7C26F1D3A3A6BB7C26F1D5A -:101D50003A9270B7C2691D115C000E10D5CD825148 -:101D6000D10E13CD8251C36F1DCD4751C3751D3E9A -:101D70004632426BC9CDDF233A9966B7C24D2C116A -:101D80005C00D50E10CD8251D13A9270B7C24D2C65 -:101D90000E13CD8251C34D2CFE45C25D1CCDDC2BF4 -:101DA000C35D1C3E02115C00CDA547C3C20111EE0C -:101DB0006C3E05CDA547C31C02322A6DAF323247B7 -:101DC000323347323447323067213167222E67CDB4 -:101DD000FE45D2DE1D11C355CD7770C3C201CD368D -:101DE0002CAF323B6B32406B329C63210000223CB3 -:101DF0006B223E6B3AAD6CA7C2041ECD4170210030 -:101E000000CD234F3E3132376B3E5332426B3AADF9 -:101E10006CA7C21E1ECD3E702A3C6BCD234F3A42AA -:101E20006BFE44C22C1ECD4620C30E1EFE46C2379A -:101E30001ECD401FC30E1EFE5AC2421ECD4321C3FB -:101E40000E1EFE53C25B1ECD951E3A426BFE46C26D -:101E50000E1E118D5ACD912CC30E1EFE42C2661E5F -:101E6000CDE221C30E1EFE43C27E1E11E1573A3958 -:101E70006BB7CA781E11C458CD912CC3C201FE4164 -:101E8000C28C1E11EC57CD912CC3C20111EC57CD61 -:101E9000912CC3C2013A406BFE10FAA61E118D555B -:101EA000CD212CC34D2C3C32406B3E3132376B3A46 -:101EB000A07032386B215A6BCD4D2232AF6C3A3C58 -:101EC0006B32AE6C3A426BCDC027C34D2CCDEF28A0 -:101ED000C35F4FFE59C20F1FCDD42CC0CDDD2C3AAD -:101EE000AF6C215A6BCD8E223A406B32416BAF32D0 -:101EF000406B3A426BFE49C2001F3E5832426BC9EA -:101F00003A386B32376B3E4632426BCD6E4FC9FE6C -:101F10004EC22D1FCD692C3A3B6B3CE63F473AAE93 -:101F20006CB8C0AF32406B3E4632426BC9FE45C210 -:101F30004D2C3A426BFE49CAFA1ECDDC2BC34D2C08 -:101F40003A406BFE05FA511F118D55CD212CC34D22 -:101F50002C3C32406BAF32396B215A6B22306B3ADA -:101F60002A6DB7C22F20215D00222E6B06000E00C5 -:101F700078FE08C2811F3E2E2A306B772322306BF9 -:101F80000C0478FE0CF2A31F2A2E6B7EE67F232220 -:101F90002E6BFE21FA701F2A306B772322306B0CD8 -:101FA000C3701F7932AF6C2A306B3E24773AAD6C28 -:101FB000A7C2B71FCD3B70115A6BCD77703A3B6B00 -:101FC00032AE6C3E46CDC027C34D2CCDEF28C35F4B -:101FD0004FFE59C20D20CDD42CC0CDDD2C3A406B24 -:101FE00032416BAF32406B32256B32266B32276B3E -:101FF00032286BCD1B24C3022032366B3E44324262 -:102000006BC9FEFFC24D2C3E5A32426BC9FE4EC216 -:102010002420CD692C3A3B6B3CE63F473AAE6CB886 -:10202000C0C3DA1FFE45C24D2CCDDC2BC34D2CEBBB -:1020300021EE6C4F477E1223130578B7C23520EB93 -:1020400022306BC3A31F3A406BFE05FA5720118D57 -:1020500055CD212CC34D2C3C32406B215A6B223084 -:102060006B211B6C22326B06012A326B7E232232DB -:102070006B4F3A9E63B779C29B203A9370FE067904 -:10208000CA9B203A9C63B7C2982079E680CA982000 -:10209000CD842C3EFF329C6379E67F2A306B772318 -:1020A00022306B043A366BB8F269203A366B32AFA5 -:1020B0006C3A3B6B32AE6C3E44CDC027C34D2CCD49 -:1020C000EF28C35F4FFE59C22121CDD42CC03AAEB8 -:1020D0006CCDDD2C3A406B32416BAF32406B3AAF86 -:1020E0006CFE01C2FF203A5A6BFE5AC2F42032390C -:1020F0006BC30621FE58C2FF2032396BC306213A5A -:10210000396BB7CA0C213E5A32426BC9CD1B24C36E -:10211000162132366BC9FEFFC24D2C3E5A32426B3D -:10212000C9FE4EC23821CD692C3A3B6B3CE63F4795 -:102130003AAE6CB8C0C30C21FE45C24D2CCDDC2B91 -:10214000C34D2C3A406BFE05FA5421118D55CD211B -:102150002CC34D2C3C32406B3A3B6B32AE6CAF32F1 -:10216000AF6C3A396BB7CA73213E44325A6B3E01A9 -:1021700032AF6C3E5ACDC027C34D2CCDEF28C35F84 -:102180004FFE59C2C021CDD42CC0CDDD2C3A406BBE -:1021900032416BAF32406B0E10115C00CD82513A70 -:1021A000396BFE5ACABA21CDFE45DABA21CD6E4F3F -:1021B000AF32396B3E4632426BC93E4232426BC946 -:1021C000FE4EC2D721CD692C3A3B6B3CE63F473AE5 -:1021D000AE6CB8C0C38A21FE45C24D2CCDDC2BC3EA -:1021E0004D2C3A406BFE05FAF321118D55CD212C73 -:1021F000C34D2C3C32406B3A3B6B32AE6CAF32AFCE -:102200006C3E42CDC027C34D2CCDEF28C35F4FFE9F -:1022100059C22B22CDD42CC0CDDD2C3A406B32419B -:102220006BAF32406B3E4332426BC9FE4EC242221C -:10223000CD692C3A3B6B3CE63F473AAE6CB8C0C325 -:102240001822FE45C24D2CCDDC2BC34D2C3A957087 -:10225000C62077233A9770C62077233A9970C62014 -:1022600077233A9B70C640E67F77233A9D70C6205D -:1022700077233A9F70772336593A9370FE06CA85C2 -:10228000223A9D6377233AA07077233E08C932A48F -:102290006C3E0D329C703E23329E703E26329D6312 -:1022A0003E3132386B7EDE203294703AA46CFE03ED -:1022B000F823237EDE203298703AA46CFE04F823C3 -:1022C0007EC640E67F329A703AA46CFE05F8237E03 -:1022D000DE20329C703AA46CFE06F8237E329E709B -:1022E0003AA46CFE07F8233E00329E637EFE4ECA7F -:1022F0001423FE20CA1423FE59C20C233A9370FE05 -:1023000006CA14233EFF329E63C31423329D633EEC -:10231000FF329E633AA46CFE08F8237E473AA07011 -:10232000B8C032386BC932A16C3A9966B7C247233C -:102330003A8F70FE03C247233A3A6BB7CA47233E2F -:102340005832396BC35A4F215A6B222A6B3A9F700D -:10235000470E003A9E63B7CA5E233A9D634F21A1A0 -:102360006C35FA5A4F3A9966A7C2792321246B3506 -:10237000F27923CDEB50C3DF232A2A6B7E23222A56 -:102380006B1E00B9C295231E803AA16C3D32A16C30 -:102390007E23222A6BB8C2B7237E23222A6B21A177 -:1023A0006C3557E680B35F7AE67FB8CAB723B9CAFF -:1023B000B7237AC640E67FB332A36C3A9966A73A50 -:1023C000A36CCAD423E5D5C55F0E06CD8251C1D119 -:1023D000E1C35E232A2C6B7723222C6BC35E23116F -:1023E0006E55D5CD212CD1215A6B3AAE6CCDDD2C5A -:1023F00032AE6CAF32A16C1AFE0DCA0A24771323D9 -:102400003AA16C3C32A16CC3F72336003AA16C327E -:10241000AF6C3E45CDC027000000C93A9E704F3AD0 -:10242000376BD631473A9470D6059032A16C211B98 -:102430006C22326B06003AA16C3DF2412478C35AFB -:102440004F32A16C3A246B3DFA512432246BC362A3 -:1024500024CD8D4FC35A24C3622478B7C25A4FC3C8 -:1024600026252A2C6B7E23222C6B57E6805FCA928E -:10247000243A9E63B7CA92243AA16CFE02FA172549 -:102480003D32A16C2A326B3A9D63772322326B0472 -:102490001E007AE67F57FE20FAC424FE7FCAC424B9 -:1024A0003A9E63B7CAAE243A9D63BACAB3247AB9D6 -:1024B000C20A2521A16C352A326B712322326B04AA -:1024C0007AC30A25FE1AC2F3243A9170FE01CAE2C9 -:1024D00024FE02CAF1242A2C6B3A246B57157AF297 -:1024E000EA24AF32246B78C35A4F7E23FE1ACADD2A -:1024F000243E1A32A26C21A16C352A326B71232240 -:10250000326B043AA26CC640E67F2A326BB3772363 -:1025100022326B04C336242A2C6B2B222C6B2124F1 -:102520006B3478C35A4F3EFFC9435053504B322E41 -:1025300041534D2028313129202032312D4D6172F7 -:102540002D3139393124AF325C00215A6B3A2A6D72 -:10255000B7CA692521EE6C3AEF6CFE3AC269257E56 -:10256000E65FD640325C00232322306B215D0022DF -:102570002E6BAF32A16C32A26C062070233CFE0B96 -:10258000FA7B2536002A306B7EFE61FA9025E65FE5 -:1025900023FE2EC2AD2522306B216500222E6B3A20 -:1025A000A16C32A26C3E0932A16CC3DC25B7CA0310 -:1025B0002622306B2A2E6B7723222E6B3AA16C3C9D -:1025C00032A16CFE08FA852532A26C2A306B7E237C -:1025D00022306BB7CA0326FE2EC2C8252A306B7E76 -:1025E000FE61FAE725E65FB7CA03262322306B2A8D -:1025F0002E6B7723222E6B3AA16C3C32A16CFE0C21 -:10260000FADC252A306B36243AAD6CA7C21226CDEF -:102610003B70115A6B3AAC6CA7CA1F2611EE6CCDF9 -:102620007770AF323A6B3A8F70B7CAFF260E0F1130 -:102630005C00CD8251FEFFCAFF263A8F70FE03C2B6 -:102640004A263EFF323A6BC35A4FF511F457CD215B -:102650002CF1FE01CA6326215C0011806A01210071 -:10266000CD74700E083E30216400770DCA78262B99 -:102670007EFE203E30CA6A26215D000E0B7EE67F7C -:1026800077230DC27D26115C000E0FCD82513CCA0E -:10269000A5263A64003C326400FE3AC2782611DC7A -:1026A00055CD7770C911806C215D000E087E122314 -:1026B000130DC2AD263E2E12130E037E1223130DF0 -:1026C000C2BB263E241211806CCD77703A8F70FE0B -:1026D00002C2FF26215C0011906A011000CD7470C7 -:1026E00011806A0E17CD8251FEFFC2F32611DC5510 -:1026F000C3212C21806A115C00011000CD7470CDC3 -:10270000A750C30827C35A4F116E55CD212CC9CDF0 -:102710001A4FCD0870CD1170CD1470AF32406B3EA2 -:102720003132376B3A406BFE05FA3527110056CD32 -:102730007770C3C2013C32406BAF32AE6C3E0132A7 -:10274000AF6C215A6B36463E47CDC027C32C27CDF0 -:10275000EF28C32427FE59CAC201FE45C22427CD53 -:10276000F52BC3C201CD1A4FCD7127C3C201C3C21D -:1027700001CD0870CD1170CD1470AF32406B3E3179 -:1027800032376B3A406BFE05FA9227113456CD77FB -:1027900070C93C32406BAF32AE6C3E0132AF6C213F -:1027A0005A6B364C3E47CDC027C38B27CDEF28C38D -:1027B0008327FE59CA5A4FFE45C28327CDF52BC940 -:1027C00032B06C21566B3A976377233A376BD63128 -:1027D000473AAF6CC6238077230100004F3AAE6CB6 -:1027E000C6207723814F3E0088473AB06C7723811B -:1027F0004F3E0088473AAF6CB7CA0B283D32AF6CEA -:102800007E23814F3E008847C3F5273A376BFE325F -:10281000CA3C28D2252879E6C0070781E63FC620B2 -:102820007723C353283600E521576BCD662BE14B48 -:10283000427A07070707E60FC620772378E60F07D7 -:102840000747790707E603B0C620772379E63FC636 -:102850002077233A8D70B7CAA028E536003AAD6CD0 -:10286000A7C29F28CD4A7021576BCD142D3A8C708A -:10287000A7CA9F2821E161CD212D3A426B5FCDC1CE -:1028800052211F62CD212D21F761CD212D21576BC2 -:10289000CD212D211F62CD212D211F62CD212DE1C2 -:1028A0003A9C707723AF77CD08703A987032A16C5C -:1028B0003AA16C3DB7FAC82832A16C3A9A70CDAFF4 -:1028C0004E5FCD0B70C3B02821566B7EB7CAE92886 -:1028D000CDAF4E5FCD0B703AA170BEC2E528CDAF33 -:1028E0004E5FCD0B7023C3CB28CD1470C35A4FCD90 -:1028F000262AC35F4FCDE62AC3EF28219663BEC2C6 -:10290000F528CDE62AC35F4F219663BECA0229325D -:10291000576B4F3A376BD6314779D6239032AF6C2D -:102920000600CDE62AC35F4F219663BECA02293254 -:10293000AE6C32586B814F3E0088473AAE6CD62061 -:1029400032AE6CCDE62AC35F4F219663BECA022920 -:1029500032A16C32596B814F3E0088473AAF6C32DE -:10296000A26C215A6B22306B3AA26CD601FA9129E3 -:1029700032A26CCDE62AC35F4F219663BECA0229FC -:102980002A306B772322306B814F3E008847C36823 -:1029900029CDE62AC35F4F219663BECA0229D620FD -:1029A00032A36C3A376BFE32CAF029D2C22979E6DB -:1029B000C0070781E63F473AA36CB8CA1B2ACD6916 -:1029C0002CC92A306B360021576BCD662B4B427ACF -:1029D00007070707E60F573AA36CBAC2BE29CDE630 -:1029E0002AC35F4F219663BECA0229D62032A36C48 -:1029F00078E60F070747790707E603B0473AA36C65 -:102A0000B8C2BE29CDE62AC35F4F219663BECA0273 -:102A100029D6204779E63FB8C2BE292A306B360056 -:102A20003AA16CC35A4F21B46B22346BCDF32AC345 -:102A30005F4F219663BEC22C2AC34F2ACDF32AC30F -:102A40005F4F219663BEC24F2A21B46B22346B2A9A -:102A5000346B772322346B4711E79319DA262A3A2D -:102A60009D70B8C23C2A21B76B3A596BBECA262A60 -:102A70003A9070B7CA8A2A3A426BFE53CA8A2ACD64 -:102A8000F32AC38A2AFE11C27F2A2A346B2B36000E -:102A9000CD14703A8D70B7CADD2A233AAD6CA7C247 -:102AA000DD2ACD477021B56BCD142D3A8C70A7CAA5 -:102AB000DD2A21EC61CD212D3A426B5FCDC152213F -:102AC0001F62CD212D210B62CD212D21B56BCD2192 -:102AD0002D211F62CD212D211F62CD212D21B46B0F -:102AE00022346BC35A4F2A346B7E2322346BB7C215 -:102AF0005A4FC9E5C52A8470229A63CD0870CD0E5D -:102B000070B7CA162B473A9370FE0678CA112BE6A7 -:102B10007FC1E1C35A4FCD1470CD1A70B7CA3F2B95 -:102B2000FE0DCA3C2BFE1ACA342BFE03CA582BFEDC -:102B300018C23F2BC64032396BC33F2BC1E1C93AA3 -:102B40009963B7CAFB2A2A9A632B229A637CB5C27F -:102B5000FB2ACD692CC1E1C9CD32703AAD63E601E3 -:102B6000C47752C3C201E5C51100007EB7CA992BD4 -:102B7000E5AB5FE60F4F060021BC2B0909E57B0F93 -:102B80000F0FE61E4F219C2B097EAA2356E1AE5F54 -:102B9000237EAA57E123C36B2BC1E1C9000081103A -:102BA0000221833104428552066387730884899425 -:102BB0000AA58BB50CC68DD60EE78FF700008911DC -:102BC00012239B322446AD573665BF74488CC19D95 -:102BD0005AAFD3BE6CCAE5DB7EE9F7F83AAD6CA715 -:102BE000C2ED2B3A9966B7C2ED2BCD38703E41321B -:102BF000426BC3022C11CA543AAD6CA7C2022CCD51 -:102C000077703AAF6C4F0600215A6B093624115A7F -:102C10006B3A9966B7C21D2C3AAD6CA7C0CD7770E0 -:102C2000C93AAD6CA7C03A9966B7C2322CD5CD3837 -:102C300070D1CD7770C9117C543AAD6CA7C2432CCA -:102C4000CD6B70CD0870CD1170CD1470C93E41327E -:102C5000426BC9CD692C3A3B6B32AE6CAF32AF6C74 -:102C60003E4ECDC027C34D2CC92A3E6B23223E6B5E -:102C70003A9966B7C03AAD6CA7C0CD41702A3E6B99 -:102C8000CD234FC9C5D5E511A55ACD212CE1D1C120 -:102C9000C93AAD6CA7CAAF2CD5CD4F4FD1CD777007 -:102CA0001E200E06C5D5CD8251D1C1CD8251C9D5C8 -:102CB000CD4470D1CD7770C90E0421C4545EE5C5F2 -:102CC000CD0200C1E1230DC2BD2C118860CD77700B -:102CD000CD3570C93A3B6B473AAE6CB8C93CE63F5C -:102CE000323B6B2A3C6B23223C6BC9AF32406B32C8 -:102CF000AF6C3E59CDC027C34D2CC93C32416B3A15 -:102D00003B6B3DE63F473AAE6CB8C2532CCD692CC5 -:102D1000CDEB2CC97EB7C8E55FCD1770E123C31496 -:102D20002D7EB7C8E55FCDC152E123C3212DC54F2C -:102D30003A556BB979C1C943505352454D2E415351 -:102D40004D2028313329202032312D4D61722D3113 -:102D500039393124CD0870CD1170CD147011682D22 -:102D6000211A2ECD084FEBE913024344248E31047F -:102D7000434F5059243D310644454C45544524F8B1 -:102D800031094449524543544F52592436320A447A -:102D900049534B2D5553414745243B32054552413C -:102DA000534524F8310646494E495348240F270419 -:102DB00048454C5024403204484F53542445320671 -:102DC0004B45524D4954245E32054C4F47494E24E1 -:102DD0006332064C4F474F5554246527074D4553E2 -:102DE0005341474524F1320652454E414D4524E6B4 -:102DF000320353455424FC32055350414345243B90 -:102E000032065354415455532453330454595045B6 -:102E10002468330357484F246D330D0A4344202D53 -:102E2000206368616E67652064656661756C7420F7 -:102E30006469726563746F727920666F722072655F -:102E40006D6F746520736572766572206F70657240 -:102E50006174696F6E730D0A434F5059202D2063C2 -:102E60006F70792066696C6573206F6E20612072C7 -:102E7000656D6F74652073797374656D0D0A4445D3 -:102E80004C455445202D2064656C65746520666949 -:102E90006C6573206F6E20612072656D6F746520A4 -:102EA00073797374656D0D0A4449524543544F520A -:102EB00059202D206C6973742061206469726563E8 -:102EC000746F7279206F6E20612072656D6F74650A -:102ED0002073797374656D0D0A4449534B2D555316 -:102EE000414745202D2073686F77206469736B20FC -:102EF0007573616765206F6E20612072656D6F74F8 -:102F0000652073797374656D0D0A46494E495348BF -:102F1000202D2073746F7020612072656D6F746551 -:102F2000207365727665720D0A48454C50202D203D -:102F30006765742068656C702066726F6D20612013 -:102F400072656D6F7465207365727665720D0A48DF -:102F50004F5354202D20657865637574652061207A -:102F6000636F6D6D616E64206F6E20612072656DA0 -:102F70006F74652073797374656D0D0A4B45524DFE -:102F80004954202D2074656C6C20612072656D6F32 -:102F900074652073657276657220746F206578653C -:102FA000637574652061204B65726D697420636F71 -:102FB0006D6D616E640D0A4C4F47494E202D207394 -:102FC000656E6420757365722D6964656E746966DB -:102FD00069636174696F6E20746F20612072656D22 -:102FE0006F7465207365727665720D0A4C4F474F9A -:102FF0005554202D202073746F7020616E64206CF6 -:103000006F676F757420612072656D6F74652073D2 -:1030100065727665720D0A4D455353414745202D23 -:103020002073656E642061206D6573736167652030 -:10303000746F20612072656D6F746520737973748D -:10304000656D20757365720D0A52454E414D4520E0 -:103050002D2072656E616D652066696C6573206FE9 -:103060006E20612072656D6F74652073797374656D -:103070006D0D0A534554202D207365742072656DC3 -:103080006F74652073657276657220706172616D10 -:1030900065746572730D0A5350414345202D2073AA -:1030A000686F77206469736B2D7573616765206F36 -:1030B0006E20612072656D6F74652073797374651D -:1030C0006D0D0A535441545553202D2047657420EB -:1030D000737461747573206F6620612072656D6F03 -:1030E0007465207365727665720D0A5459504520D7 -:1030F0002D20747970652066696C6573206F6E2071 -:10310000612072656D6F74652073797374656D0DE0 -:103110000A57484F202D2073686F772063757272AD -:10312000656E74207573657273206F6E20612072F6 -:10313000656D6F74652073797374656D24212262E7 -:1031400022916D3E4B32316D3E02322F6D3E473241 -:10315000906D11336DCD0035B7CA1C0247C62032C1 -:10316000326D3A2F6D80322F6D2A916DEB22936D67 -:10317000CD52472A936D23EBCD00352A936D4FC670 -:1031800020773A2F6D81C601322F6DC37833212FFE -:103190006222916D3E4332316D3E01322F6D3E47CA -:1031A00032906D11336DCD003547C62032326D3A05 -:1031B0002F6D80C601322F6D3A316DFE43C2CA3188 -:1031C00078B7CA78333EFF3272622A916DEB229350 -:1031D0006D3EFF327162CD52472A936DEB13CD00E5 -:1031E00035B7CA78334FC6202A936D773A2F6DC60C -:1031F0000181322F6DC378333E4532316D3E01324D -:103200002F6D3E4732906D11336DCD0035473A3109 -:103210006DFE45CA2032FE54CA203278B7CA7833D0 -:1032200078B7CA1C02C62032326D3A2F6D80C601B3 -:10323000322F6DC378333E44C3FA313E55C3FA3161 -:103240003E48C3FA313E4332906DAF322F6D11319B -:103250006DCD0035B7CA1C02322F6DC378333E4B9B -:10326000C347323E4732906D3E4932316D3E0132A6 -:103270002F6D11336DCD0035B7CA783347C6203274 -:10328000326D3A2F6D80C601322F6DEB22936D3E69 -:10329000FF327162327262112F62CD52472A936DF2 -:1032A000EB13CD0035B7CA78334FC6202A936D771C -:1032B0003A2F6DC60181322F6DEB22936DAF3272C2 -:1032C00062113C62CD52472A936DEB13CD0035B7A6 -:1032D000CA78334FC6202A936D773A2F6DC6018185 -:1032E000322F6DC3783321226222916D3E52C34545 -:1032F0003121556222916D3E4DC345313E06322F3C -:103300006D3E5332316D3E4732906D3E2332326D09 -:10331000113D35219935CD084FEBE911376D3E054B -:10332000CDA547C31C02B7CA1C024FC62032366D5A -:103330003A2F6D81322F6DCD1A4FC37833CD0D15D5 -:1033400032376D3E2132366D3A2F6DC601322F6D08 -:10335000C37833CD1A4F3E5132316D3E4732906DB6 -:103360003E01322F6DC378333E54C3FA312161627E -:1033700022916D3E57C396313EFF3299663A906D69 -:10338000FE47C28D333A316DFE53CA9033CD327051 -:10339000AF32406B32396B323B6B210000223C6B09 -:1033A000223E6B3E3132376B3E4932426BCD951E29 -:1033B0003A426BFE58CAC033FE41C2A833C3C201B1 -:1033C000AF32406B32396B323B6B210000223C6BD9 -:1033D000223E6B3E3132376B3A2F6DB7CA423432E0 -:1033E000A16C3A9470D60532A26C11316D215A6BE2 -:1033F0003A9D63473A9E704F3AA26C3D32A26CFAF6 -:1034000038341AFE20FA1834B9CA18343A9E63B711 -:10341000CA2B341AB8C2353471233AA26C3D32A299 -:103420006CFA38343A2F6D3C322F6D1AFE20F2358B -:1034300034C640E67F7723133AA16C3D32A16CC2BB -:10344000F833AF32AE6C3A2F6D32AF6C3A906DCD2F -:10345000C027C31C02C35B34CD532C3A406B3CFEE7 -:1034600005FA6D34116357CD7770C3C20132406BDA -:10347000CDEF28C35834FE45C291343A906DFE47D3 -:10348000C28B343A316DFE53CC4F4FCDED2BC3C2BE -:1034900001FE53C2A934CDD71A3A426BFE41CAC2CB -:1034A000013E5832426BC3C419FE4ECA5B343242ED -:1034B0006BCD1470215A6B3AAF6CB7CAEA34E5F59C -:1034C0001E3CD5CD1770D1CD1770F1E1B7CADD34F0 -:1034D0003D5E23F5E5CD1770E1F1C3CC341E3ED53A -:1034E000CD1770D1CD1770CD4F4F3A426BFE59CAF0 -:1034F000C201CDEB2CCDDD2C3E4432426BC3C4194E -:10350000AF32306D47CD4F4DE67FFE0DCA3835FEE8 -:103510000ACA3835120413FE1BCA2F35FE0CCA2600 -:1035200035FE3FC20535E52A066323220663E1F531 -:10353000AF327062F1C305357832306DC907104281 -:103540004C4F434B2D434845434B2D545950452434 -:10355000FF3A0446494C4524133B0A494E434F4D1C -:10356000504C45544524493B07524543454956452F -:10357000241E3B075245504C41434524933B055282 -:103580004554525924D73B0E5345525645522D545B -:10359000494D454F555424E53B0D0A424C4F434B92 -:1035A0002D434845434B2D5459504520666F72209A -:1035B000612072656D6F7465207365727665720D3A -:1035C0000A46494C4520706172616D65746572737D -:1035D00020666F7220612072656D6F74652073655F -:1035E000727665720D0A494E434F4D504C45544515 -:1035F0002066696C6520646973706F736974696FA4 -:103600006E20666F7220612072656D6F7465207325 -:1036100065727665720D0A524543454956452070DC -:103620006172616D657465727320666F72206120CE -:1036300072656D6F7465207365727665720D0A52DE -:1036400045504C4143452066696C65206174747235 -:1036500069627574652068616E646C696E67206666 -:103660006F7220612072656D6F746520736572766C -:1036700065720D0A5245545259206D6178696D7515 -:103680006D20666F7220612072656D6F74652073A6 -:1036900065727665720D0A5345525645522D54494E -:1036A0004D454F555420696E74657276616C206685 -:1036B0006F7220612072656D6F746520736572761C -:1036C000657224080A424C4F434B2D53495A4524F6 -:1036D000273B09434F4C4C4953494F4E24353B0A35 -:1036E000494E434F4D504C45544524493B054E41AE -:1036F0004D4553245D3B0D5245434F52442D464F9B -:10370000524D415424713B0D5245434F52442D4C70 -:10371000454E47544824853B075245504C4143454C -:1037200024933B045459504524A73B0D0A424C4F67 -:10373000434B2D53495A45206F662066696C65736B -:1037400020666F7220612072656D6F7465207365ED -:10375000727665720D0A434F4C4C4953494F4E20C7 -:10376000616374696F6E206F6E2066696C656E614F -:103770006D6520636F6E666C6963747320666F722B -:1037800020612072656D6F74652073657276657255 -:103790000D0A494E434F4D504C4554452066696CC7 -:1037A0006520646973706F736974696F6E20666FEA -:1037B0007220612072656D6F746520736572766525 -:1037C000720D0A4E414D4553207472616E736C61E7 -:1037D00074696F6E206F662066696C657320666F12 -:1037E0007220612072656D6F7465207365727665F5 -:1037F000720D0A5245434F52442D464F524D41548B -:10380000206F662066696C657320666F7220612088 -:1038100072656D6F7465207365727665720D0A52FC -:1038200045434F52442D4C454E47544820666F72D5 -:1038300020612072656D6F746520736572766572A4 -:103840000D0A5245504C4143452066696C65206124 -:1038500074747269627574652068616E646C696EF7 -:103860006720666F7220612072656D6F74652073CA -:1038700065727665720D0A54595045206F66206650 -:10388000696C657320666F7220612072656D6F745C -:103890006520736572766572240205464958454471 -:1038A000244646085641524941424C452456560D3D -:1038B0000A4649584544095641524941424C45241B -:1038C000020D5041434B45542D4C454E475448241E -:1038D000BB3B0754494D454F555424C93B0D0A5035 -:1038E00041434B45542D6C656E6774680954494DCE -:1038F000454F5554240606415050454E4424333319 -:103900000341534B243535064241434B5550243235 -:10391000320744495343415244243434094F5645F5 -:103920005257524954452431310652454E414D4576 -:103930002430300D0A41534B2061626F757420654D -:1039400078697374696E672066696C6573206F6E41 -:1039500020612072656D6F74652073797374656D75 -:103960000D0A415050454E4420746F2065786973AC -:1039700074696E672066696C6573206F6E206120C4 -:1039800072656D6F74652073797374656D0D0A428D -:1039900041434B5550202872656E616D6529206545 -:1039A00078697374696E672066696C6573206F6EE1 -:1039B00020612072656D6F74652073797374656D15 -:1039C0000D0A44495343415244206E657720766581 -:1039D0007273696F6E73206F66206578697374699E -:1039E0006E672066696C6573206F6E20612072655A -:1039F0006D6F74652073797374656D0D0A4F56454C -:103A0000525752495445206578697374696E67202E -:103A100066696C6573206F6E20612072656D6F74CE -:103A2000652073797374656D0D0A52454E414D459D -:103A3000206E65772076657273696F6E73206F668E -:103A4000206578697374696E672066696C65732098 -:103A50006F6E20612072656D6F7465207379737469 -:103A6000656D2402074449534341524424303004D5 -:103A70004B4545502431310D0A444953434152448A -:103A8000094B454550240209434F4E564552544573 -:103A900044243030074C49544552414C2431310DB7 -:103AA0000A434F4E564552544544094C49544552D9 -:103AB000414C24020850524553455256452430305B -:103AC0000744454641554C542431310D0A50524566 -:103AD00053455256450944454641554C5424020627 -:103AE00042494E41525924313104544558542430EE -:103AF000300D0A42494E4152590954455854242127 -:103B0000343022336D3E3032356D11320D217C0D53 -:103B1000C33D3311C336212B37CD084FEBE911C01C -:103B20003821DD38C3193B21333122336D3E313228 -:103B3000356DC31B3321333022336D3E3232356D48 -:103B400011F538213339C33D3321333122336D3EF2 -:103B50003032356D11633A21773AC33D332133302A -:103B600022336D3E3132356D11863A219F3AC33D85 -:103B70003321333122336D3E3332356D1199382183 -:103B8000AF38C33D3321333122336D3E3232356D90 -:103B9000C31B3321333022336D3E3332356D11B3C5 -:103BA0003A21CB3AC33D3321333022336D3E30329C -:103BB000356D11DE3A21F13AC33D332134302233E1 -:103BC0006D3E3132356DC31B3321343022336D3EAF -:103BD0003232356DC31B3321343022336D3E3332E4 -:103BE000356DC31B3321343022336D3E3432356D95 -:103BF000C31B334350535345522E41534D2028315C -:103C0000292020382D5345502D3837244350535404 -:103C1000542E41534D2020283132292033312D4A52 -:103C2000616E2D31393931243E03115C00CDA54739 -:103C3000C3C201119B663E05CDA547C3C201322216 -:103C40006BA7C24F3C3E0132226B3E0D329B66CDCC -:103C50001A4FCD6E4FFEFFC2633C11C355CD777036 -:103C6000C3C201112659CD7770AF326D65326E65D2 -:103C7000AF326F65327065CD333DE67FFE0DC277A2 -:103C80003CAF327065CD14701E2ACD17703A6E6548 -:103C90003C326E65FE3CC2A03CAF326E65CD4F4FEC -:103CA0003A9363A7C2AF3DAF326D65CDA63DE67FC7 -:103CB000C2EC3CCD8844F5CD0870F1E67FC2CA3C29 -:103CC0003A226BA7CA773CC3EC3CFE03CAAF3DFE69 -:103CD0001AC2DF3C115C000E10CD8251C3C201FE3E -:103CE0000DC2AB3C3E01326F65C3773CC30F3DFE56 -:103CF00013C20F3DCDA63DE67FC20F3DCD8844F5F2 -:103D0000CD0870F1E67FFE03CAAF3DA7CAF43C5F61 -:103D10003A6D65219B66856F3E008C677BBEC2A0B5 -:103D20003C3A6D653C326D655F3A226B93CA703CDC -:103D3000C3AB3CCD08703A9363A7C23F3D3E0DCD67 -:103D40007A3DFE0AFE1ACAAF3DFE20F25B3DFE0D33 -:103D5000CA5B3DFE09CA5B3DC33F3DCDAF4EF55F3B -:103D6000CD0B70F15F3AA170A77BCA793D3AA27082 -:103D7000BBC2793DF5CD0B70F1C93A6F65A7CA9109 -:103D80003D2171653A706516005F193C3270657EA1 -:103D9000C9CD0C504F3A70655F1600217165193C12 -:103DA0003270657971C9CD0870CD0E70E67FC9118A -:103DB0005C000E10CD8251CD14703A9363114C5AB1 -:103DC000A7CAC73D11245BC3D03DCD1A4F1120585F -:103DD000CD7770CDEF4E114458CD7770CDEF4E11A9 -:103DE0005958CD7770CD53703A9F63B7C4B03ECD6C -:103DF000FB3DCDA53FC3C201C3EF3DCD0870CD0E45 -:103E000070F5CD1470F1B7C20E3E329863C9E67FEB -:103E1000326D623A8670FE033A6D62CA2370A7CA99 -:103E2000FB3DFE7FCAFB3DFE11CAA93EFE13CAAA96 -:103E30003E5F3A8670FE01C2553E3A2367B7CA47D5 -:103E40003ECD2C3FC3FB3D7BFE1BC2553E3E0132A7 -:103E50002367C3FB3DFE03C2633E2124707CB5CAC9 -:103E6000633EE9FE02C27D3E3A6D62FE0DCA7D3EB2 -:103E7000FE0ACA7D3EFE09CA7D3EFE20F8CD5F7077 -:103E8000B7CAFB3D3A9F63FE81CCDB3ECD14703A4E -:103E90008C70B7C41D70CD1770219863347EFE33CB -:103EA000FAFB3D36003A6D62C9AF322567C3FB3D70 -:103EB0003E1ABBC821A063115C00010C00CD7470D8 -:103EC000CD4150C3193F219F633E80B677110E5BF1 -:103ED000FE81CA777011F65AC3777021246B35F2D0 -:103EE000EF3ED5CDDC50CDF83ED13A9F63B7C82A1E -:103EF0002C6B7323222C6BC9CD6A53CDEB50CD199B -:103F00003FCDA453C9110758CD7770CD4751C31980 -:103F10003F219F637EE67F77C911B856CD77700E3B -:103F200010115C00CD8251AF329F63C9FE01C28186 -:103F30003F7BFE59C23D3F3E02322367C9FE5ACA4B -:103F4000633FFE41FA5E3FFE4CF25E3FD6410707FB -:103F50002A7A705F160019EBCD1470CD7770AF32EE -:103F60002367C93E1BCDAF4E5FCD0B703E2FCDAF4B -:103F70004E5FCD0B703E4BCDAF4E5FCD0B70C35E31 -:103F80003FFE02C2923F7BD61F32236B3E03322399 -:103F900067C9AF3223677BD61F4F3A236B47CD14D7 -:103FA00070CD6E70C9CD1A70E67FCA5A4F5F32A1CC -:103FB0006C3A8770BBCAD93FCD08707BCDAF4E5FDE -:103FC000D5CD0B70D1CD14703A8E70B7CA5A4F7BD5 -:103FD000E67F5FCD1770C35A4FCD1A70B7CAD93F6D -:103FE00047FE03CAED3FE65FFE43C2FE3F116F5836 -:103FF000CD7770CD56703A9F63B7FC053FC9FE532D -:10400000C20C40CD6115CD4F4FC35A4F78FE3FC211 -:104010003A403A9F63B7F21F4011805CCD77701130 -:10402000A85CCD7770CD597011255DCD7770CDEF3F -:104030004E11375DCD7770C3D93F78FE30C2514005 -:10404000AFCDAF4E5FCD0870CD0B70CD1470C35A9D -:104050004F3A8770B8C2694078CDAF4E5FCD0870D7 -:10406000CD0B70CD1470C35A4F78E65FFE50C27C02 -:10407000403A8C70EE01328C70C35A4F3A9F63B74E -:10408000F2AC4078E65FFE52C299403E81329F63B7 -:10409000110E5BCD7770C35A4FFE51C2AC403E82C9 -:1040A000329F6311F65ACD7770C35A4F78F5CD5CC5 -:1040B00070C3BD40F11E07CD1770C35A4FF1E65FC4 -:1040C000FE44CAED3FC35A4F43505343504D2E4117 -:1040D000534D20283134292020312D4170722D314B -:1040E00039393124115C003E10CDA547C3F240C3DD -:1040F0000A413A5C00FE20C2FE40AF325C00215D06 -:1041000000060B363F2305C20341CD09543A5C003B -:10411000B7C217413A9463C64032ED583AA26CFEDA -:1041200030C226413E2032EB583AA16C32EC58CDD9 -:104130004F4F11D158CD77703E0432AB703A3D6A83 -:10414000A7C24B413AAB703C32AB70AF32306732F2 -:104150003247323347323447213167222E67CDA6AA -:1041600042AF323067CDFE45D26E41C3F5413AAD24 -:1041700063A7C286410E0BCD8251B7CA86410E019C -:10418000CD8251C3F541215D000608CDC7413E2EC9 -:10419000CDBA410603CDC741CD394221AB7035F5CB -:1041A000C4AA41F1CCD341C36541CDB8413E3ACD1B -:1041B000BA41C3B841CDB8413E20C5D5E55F0E0236 -:1041C000CD8251E1D1C1C97EE67FCDBA412305C27E -:1041D000C741C9C5D5E5CD4F4FE1D1C136043A3D00 -:1041E0006AA7C034C9CD4F4F3A94633D5F0E0ECDE0 -:1041F0008251C3C201AF3232473233473A5C00B713 -:10420000CA0A423D5F0E0ECD8251CD7170E511F2AA -:1042100058CD77703A5C00B7C221420E19CD825159 -:104220003CC64032FD5811FD58CD7770E1CD234F8B -:10423000110459CD7770C3E5413A3D6AA7C80E23F2 -:10424000115C00CD82513A7D000100006FE607CA83 -:104250005542010100C50603AF3A7E001F327E00C1 -:104260003A7D001F327D0005C258426F3A7E0067DA -:10427000C1093AA9700F0F0FE61F4F092FA56FE56F -:1042800001F6FF09DA8D42CDB541C39942E1E5015E -:104290009CFF09DA9942CDB841CDB841E1CD234F19 -:1042A0003E6BCDBA41C90E1FCD825123237E32AA67 -:1042B00070237E32A97023235E2356EB22A770C998 -:1042C0003E02115C00CDA547C3C2013E04CDA54707 -:1042D000C3C201115C000E11CD82513CC2E84211F3 -:1042E000C355CD7770C3C201115C000E13CD82514E -:1042F000111359CD7770C3C2013E06CDA547C3C285 -:10430000013E04CDA547C3C2012A2A67EB21E0FF85 -:1043100019DA3E43EB7D3295635D0E20CD8251CD9F -:1043200009543AA26CFE30C22C433E2032C45432AF -:10433000EB583AA16C32C55432EC58C3C20111D7C4 -:1043400056CD7770C3C2013E02115C00CDA547C3B4 -:104350002244AF323247323347323447323067215A -:104360003167222E6BCDFE45DA2244CD3270AF325A -:10437000A16C115C00CD6E4FCD8D4FC3E243C3885D -:10438000433A246B3DFA784332246B2A2C6B7E230C -:10439000222C6BE67FFE20F2DC43FE09C2AF433ED7 -:1043A00020CD2F443AA16CE607C29F43C38143FE50 -:1043B0000DC2BE43CD2F44AF32A16CC38143FE0A70 -:1043C000C2CD43CD2F44AF32A16CC38143FE1AC28C -:1043D000D543C3E243F53E5ECD2F44F1CD2F44C318 -:1043E00081430E10115C00CD82513E0DCD2F443E15 -:1043F0000ACD2F44CDFE45D26B43AF322067C3C2F6 -:10440000010E10115C00CD82513E0DCD2F443E0AAD -:10441000CD2F44AF3220673AAD63E601C47752C373 -:10442000C20111C160CD7770AF322067C3C2015F96 -:10443000CD5644C35244DA4E44D5CD17703AA16CE0 -:104440003C32A16CD13A2067A7C8CDC152C9D1C3B3 -:10445000E243D1C30144D5CD8844E67FCA7B44FE04 -:1044600003CA8644FE18CA8144CD8844E67FCA69DF -:1044700044FE03CA8644FE18CA8144D1373FC35A5A -:104480004FD137C35A4FD1C9CD14701EFF0E06CD80 -:104490000500C93E03113E6ACDA547C3C2013E03D4 -:1044A000115F6ACDA547C3C2013E04CDA547C3C273 -:1044B00001060C113E6A215F6AAF3221671ABECA3B -:1044C000C9443A21673C322167231305C2BD443AEF -:1044D0002167A7C2DF44119860CD7770C3C2011174 -:1044E0003E6A0E0FCD82513CC2F44411C160CD77BB -:1044F00070C3C201115F6A0E13CD8251115F6A0E43 -:1045000016CD82513CC21145117B55CD7770C36DDC -:1045100045115F6A0E0FCD82513CC2264511C3552D -:10452000CD7770C36D45AF322D6D322E6D329363F2 -:10453000213E6A115C00012100CD7470CD8D4FC306 -:1045400078452A2C6BEB0E1ACD8251115F6A0E153D -:10455000CD8251A7CA3C4511F355CD7770115F6AE2 -:104560000E10CD8251115F6A0E13CD8251113E6A39 -:104570000E10CD8251C3C201115F6A0E10CD82515F -:10458000C36D453E03113E6ACDA547C3C2013E033C -:10459000115F6ACDA547C3C201113E6A0E0FCD82DD -:1045A000513CC2AE4511C160CD7770C3C201115FED -:1045B0006A0E0FCD82513CCAC34511CA57CD7770E0 -:1045C000C3C201215F6A114E6A011000CD747011DF -:1045D0003E6A0E17CD82513CC2C20111DC55CD7727 -:1045E00070C3C201435053574C442E41534D2028B1 -:1045F0003429202032302D4A756E2D383624B7C527 -:10460000D5E5C30B46213167222E673A3067A7CA2A -:104610003A462A2E67115C00010C00CD7470AF324F -:104620006800327D002A2E67110C0019222E673A8D -:1046300030673D323067AFC3F4463A3447A7C20211 -:1046400047213167222E67AF3230670E1A11800082 -:10465000CD8251AF3268003A3247B7C27846323322 -:1046600047215C00112647010C00CD74700E11111A -:104670005C00CD8251C395463D3233472126471118 -:104680005C00010C00CD74700E11115C00CD8251E4 -:104690000E12CD8251F53A3347B7CAA5463D3233A3 -:1046A00047F1C39046F1B7FAF846CD10473A26478E -:1046B000325C003A32473C3232473E0032680032C8 -:1046C0007D002A2E67EB215C00010C00CD74702A5E -:1046D0002E67110C0019222E673A30673C32306782 -:1046E000FE40F20546115C00212647010C00CD7406 -:1046F00070C39046E1D1C1C93234473A3067A7C28E -:104700000546AF32344732334732324737C3F44677 -:1047100087878787874F060021800009115C000189 -:064720000C00CD7470C90D -:10473200000000435053434D442E41534D20283135 -:104742003329202031372D4A616E2D3139393124F8 -:10475200E1E522776221000039227562EB2279625B -:10476200EB217F62220463220663AF3270623273EE -:1047720062CD4F4FC3844E2A7562F9217F622206B1 -:10478200632A7762E92A7562F9217F622204632231 -:104792000663AF327062327362CD4F4FCD844E2AC0 -:1047A2007762E9326F62CDA84DF53EFF327462F155 -:1047B200FE04CA6549FE01CAC049FE02CA154BFE83 -:1047C20010CA154BFE03CA134BFE05CADC47FE0690 -:1047D200CACB4811D360CD7770C9AF320C63320EA9 -:1047E20063320D63EB227B620600CD4F4DB7F22898 -:1047F20048E67FFE1BC216480E021E07CD8251AF4D -:104802003270622A04632B220463220663217362DC -:1048120035C3EC47FE3FCA7648FE0CCC3270782A8C -:104822007B62EBC35A4FFE5CC23B483A0C63A72F34 -:10483200C23B48320C63C3EC475F3A0C63A77BCAA6 -:104842007D48FE5CC24F483A0E63C38348D630FAB5 -:10485200A248FE08F2A2485F3A0E63878787833236 -:104862000E633A0D633C320D63FE033A0E63CA7D5A -:1048720048C3EC472A066323220663CD8E48C3EC65 -:1048820047CD8E483E5C320C63C3EC47042A7B6200 -:104892007723227B62AF320D63320E63320C63C91F -:0948A200117061CD7770C3C201F1 -:1048CB00210000222A67CD4F4DB7F23C49E67FFE0F -:1048DB001BFE20C2EA48C35A4F000000000000FE36 -:1048EB003FCAFE48FE0DCAF748C3874700000000C9 -:1048FB00C35A4F2A2A677DB411B561C20C4911A561 -:10490B0061CD7770CD4F4FCD844E2A066336242A66 -:10491B0004632B220463117F62CD7770AF32706218 -:10492B00C379473E040000000000000000000000B7 -:10493B0000E67FD630DA5C49FE0AD25C493F2A2A70 -:10494B0067E5D12929192916005F19222A67C3D1D6 -:10495B0048115961CD7770C35A4FCD4F4DB7F0E623 -:10496B007FFE1BC28D490E021E07CD8251AF3270E6 -:10497B00622A04632B22046322066321736235C30C -:10498B006549FE3FC2B849118761CD7770CD4F4F56 -:10499B00CD844E2A06633E24772A04632B220463BC -:1049AB00117F62CD7770AF327062C37947FE0CCC4A -:1049BB003270C35A4F227D62EB227B624623220860 -:1049CB00632A0663220A6378B7C83EFF3274622AF1 -:1049DB0008635E231D7BFEFFFABF4ACD4F4DB7F236 -:1049EB00AD4AE67FFE3FC21F4AAF3270622173624F -:1049FB00352A7D62EBCD3554CD4F4FCD844E2A06F3 -:104A0B00633E24772A04632B220463117F62CD77E4 -:104A1B0070C37947FE1BC28E4AAF327062D5C5E5B3 -:104A2B00CDDA4AC34D4A0E021E07CD82512A0463CA -:104A3B002B22046322066321736235E1C1D11CC3AF -:104A4B00DF492A04632BEBE1E57EFE24CA694A2386 -:104A5B00EB7723EB3A73623C327362C3544A3A737B -:104A6B00623C327362EB3E2077232204632206639F -:104A7B00E1E5EBCD77700E021E20CD8251E1C1D165 -:104A8B00C3A14AE5D5CDDA4AC39F4A11F960CD7768 -:104A9B0070C38747D1E11C160019235E23567BC3D5 -:104AAB005A4FFE61FAB94AFE7BF2B94AE65F5623CA -:104ABB00BACADF4916007BB7F2C84A16FF191103B1 -:104ACB000019220863052A0A63220663C3D249052B -:104ADB00F81C4B7BB7C81600191E03194623EB2A8B -:104AEB0008637E914FB8CAF54AF02A0A630DFA5A49 -:104AFB004FEB4623EB7E23FE61FA0E4BFE7BF20E51 -:104B0B004BE65FB8C0C3F84A3E00320363EB22FFAB -:104B1B00621E00360023220163AF3620233CFE0BBE -:104B2B00FA254B3600233CFE20FA2E4BCD4F4DB7CA -:104B3B00F2444CE67FFE3FC2634B3A0363B7CA2293 -:104B4B004D2A0663232206633A0463BDC25E4BAF54 -:104B5B003270623E3FC3054DFE1BC2374CAF327005 -:104B6B00622A04632B220463220663217362357B62 -:104B7B0032A16CFE09FA844B3D2A0163FE0BF293C2 -:104B8B004B363F233CC3874B0E112AFF62EBCD8282 -:104B9B0051FEFFCA2D4C21CE6CCD284D21DE6CCDA4 -:104BAB00284D0E122AFF62EBCD8251FEFFCAC14B7C -:104BBB0021DE6CCD284D11CE6C21DE6C3AA16CFE42 -:104BCB0009FAD04B3D0E00B9CADC4B13230CC3D2F0 -:104BDB004B79FE0BCA084CFE08C2F44B3AA16CFE93 -:104BEB0009CAF44B3E2ECD404D1A134623B8C208CA -:104BFB004C0CFE20CADC4BCD404DC3DC4B7932A1B3 -:104C0B006C3E24CD404D2A0663EB0E09CD82512A12 -:104C1B0004632B220463217362353AA16CFE0BCA29 -:104C2B0079470E021E07CD8251C379477BB7CA1154 -:104C3B004DFE0DF2114DC35A4FFE2EC2654C1C7B1F -:104C4B00FE01CA114DFE0AF2114D0E0906002AFF94 -:104C5B0062092201631E09C3374BFE3AC2844C1C06 -:104C6B007BFE02C2114D2A01632B7ED640220163CB -:104C7B0036202B771E00C3374BFE2AC2B44C3A03A7 -:104C8B0063FE00CA224D7BFE08CA114DF29F4C06F3 -:104C9B0008C3A14C060C2A01633E3F772322016314 -:104CAB001C7BB8FAA14CC3374BFE21FA114D673A66 -:104CBB00A670B77CCAF94CFE25CA114DFE28CA1145 -:104CCB004DFE29CA114DFE2CCA114DFE2FCA114D96 -:104CDB00FE3AFA054DFE40FA114DFE5BFA054DFE0C -:104CEB005EFA114DFE5FCA114DFE7CCA114DFE617D -:104CFB00FA054DFE7BF2054DE65F2A016377232211 -:104D0B0001631CC3374B3A6F62FE10CA5F4F11062B -:104D1B00610E09CD8251C9112961C31C4DF511805A -:104D2B00000707070707833C5F060B1A137723055A -:104D3B00C2364DF1C9E52A0463772322046321733C -:104D4B006234E1C9E5C53A7062B7CCA84D2A066357 -:104D5B007E23220663FE20CA6A4DFE09C27D4D3AB0 -:104D6B007462B7C2514D3EFF3274623E20C1E1C343 -:104D7B00A54DF5AF327462F1C1E1FE1BCAA54DFE24 -:104D8B003FCA9C4DFE0DCA9C4DFE0ACA9C4DFE0CA3 -:104D9B00C0E52A06632B220663E1F680C9F5D5E54B -:104DAB003A7062B7C2804E217362340E013A72625E -:104DBB00B7CACD4D1EFF0E06CD8251B7CABF4DC32C -:104DCB00D04DCD82512A04637723220463FE15CA8A -:104DDB00E24DFE18C2F64DCD2970CD844E217F6277 -:104DEB002204632173623600C37947FE08CA074E5B -:104DFB00FE7FC22F4E3A7262B7CC2F703A73623D70 -:104E0B003DB7F21A4E0E021E07CD8251C3E24D3250 -:104E1B0073623A7262B7CC2C702A04632B2B220478 -:104E2B0063C37947FE3FCA5A4EFE1BCA5A4EFE0D4C -:104E3B00CA4B4EFE0ACA4B4EFE0CC2624ECD3270AE -:104E4B003A7162B7C25A4E3A7362FE01CA87473E45 -:104E5B00FF327062C3804E3A7362FE7DFAB24D1E12 -:104E6B0007CD17703A73623D3273622A04632B22AB -:104E7B000463C3B24DE1D1F1C91E0D0E06CD8251B3 -:104E8B002A7962EBCD7770C943505355544C2E4160 -:104E9B00534D20283331292032312D4D61722D3164 -:104EAB0039393124E5C52193704E060021BC4E09DA -:104EBB00E9C3CE4EC3D84EC3CB4EC3DD4EC3E74E74 -:104ECB00C3EC4EE67FEAEC4EF680C3EC4EF680C3A5 -:104EDB00EC4EE67FE2EC4EF680C3EC4EE67FC3EC85 -:104EEB004EC1E1C93A8770FE20F2014FF51194587B -:104EFB00CD7770F1F6400E025FCD8251C93E01CDE8 -:104F0B00A547C3114FC911CD54CD7770C3C2013E14 -:104F1B0004CDA547C31C02C93E30CDDE5301F6FFBD -:104F2B0011FFFF0913DA2E4FE5EB7CB5C42B4FE1D4 -:104F3B007DC63ACDF05332A16C5F3A2267A7C00E03 -:104F4B0002C3825111CA54C377700E09C38251E157 -:104F5B00232323E9C9119C5BCD7770CD2054A7CABD -:104F6B00664FC9AF32246B322D6D329363322E6D87 -:104F7B00326800326A00327C000E0F115C00CD8269 -:104F8B0051C93A9363B7C0C5D5E53A2D6DB7CAB8C9 -:104F9B004F2A2B6D222C6B01800009222B6D3D3289 -:104FAB002D6D3E7F32246BE1D1C1C35A4F3A2E6D2A -:104FBB00B7CACA4F329363AF32246BE1D1C1C92A4E -:104FCB00A370222B6D222C6BEB0E1ACD82510E147B -:104FDB00115C00CD8251322E6DB7C2FD4F212D6D6C -:104FEB00343AA570BECA03502A2C6B11800019C32A -:104FFB00D04FCD7A51C3954FCD7A513A2D6DC39C7D -:10500B004F3A9363B7C0117F622A2C6B3A246B47DC -:10501B0005F22C50CD8D4FC33B502A2C6B3A246B91 -:10502B00477832246B7E23222C6BE67FCA1B50C938 -:10503B003EFF329363C9AF326800326A00327C00A4 -:10504B000E0F115C00CD8251FEFFCAB9500E231119 -:10505B005C00CD82512A7D007CB5CAC4502B227DC9 -:10506B00002AA370EB0E1ACD82510E21115C00CDDC -:10507B008251B7C27A512AA3701180003E1ABECA60 -:10508B009250231DC28950222C6B19222B6D7B321F -:10509B00246BAF322D6DCD7A51C35A4F0E13115C69 -:1050AB0000CD8251AF326800326A00327C000E169E -:1050BB00115C00CD8251FEFFC82AA370222C6B110C -:1050CB00800019222B6D7B32246BAF322D6DC35AAE -:1050DB004FC5212D6D343AA570BEC2FD5035C1C9E7 -:1050EB00C5212D6D343AA570BEC2FD50CD1551C3EF -:1050FB0013512A2B6D222C6B11800019222B6D3E24 -:10510B007F32246BC1C35A4FC1C92AA370222B6DA6 -:10511B00222C6B2A2C6BEB21800019222C6B0E1A84 -:10512B00CD8251115C000E15CD8251B7C27A51213F -:10513B002D6D35C21E51CD7A51C35A4F3A246BFE99 -:10514B0080CA62512A2C6B3DFA5C51361A23C3522A -:10515B0051CDEB50C35F4F3A2D6DB7CA6F51CD1583 -:10516B0051C35F4F0E10115C00CD8251C35A4F11CA -:10517B0080000E1AC38251F53AAD63A7CA9F5179CD -:10518B00FE01CAA351FE06CAA851FE0ACAB251FEBD -:10519B000BCAD551F1C30500F1CDEA51C97B3CC215 -:1051AB009F51F1CDEA51C9F113CDEA51FE0DCAD38E -:1051BB0051FE0ACAB451F526001A6F26001319F1D5 -:1051CB00771BEB34EBC3B4511BC9F1E5D511E1638C -:1051DB002ABB63197ED1E1FE1A3EFFC0C37752E5AD -:1051EB00D53AAD63E601CA205211E1632ABB6319BC -:1051FB007E2ABB632322BB63CDA352F57DA7F20F9F -:10520B0052CD5352F1D1E1FE0ACAEA51FE1AC0CD7A -:10521B0077523E0DC911A26A3AA16A6F3AA26ABDD2 -:10522B00F23C523AAD63E6EF32AD633E1AF5C30F73 -:10523B00527D2600193C32A16A7EFE3BC24C523E87 -:10524B000DCDA352F5C30F52C5D5E50E1A11E1636F -:10525B00CD82510E1411BD63CD8251A7C47752215B -:10526B00000022BB63CD7A51E1D1C1C93AAD63E6EF -:10527B00FE32AD630E1011BD63CD8251CD7A51C993 -:10528B00F5E52A2667232226677CB5C2A0522A2879 -:10529B006723222867E1F1C9FE0ACAC052FE0DCA74 -:1052AB00C052FE1ACAC052F5C5D5E55F0E02CD0538 -:1052BB0000E1D1C1F1C97B321F67C3EE52CDF3526E -:1052CB00FE02F2D652CD0A53C3C852FE04FC6A53F7 -:1052DB0078CD5F5347326264216364CD56533A1FD6 -:1052EB006777C95FCD1D70C93A61644F3A626447F5 -:1052FB007891FA07533E7F9081C309537990C9E5A2 -:10530B00D5C5F53A2C67A7CA4D53CD5253A7CA4DF5 -:10531B00532161647E23BECA4D532BCD5F53326143 -:10532B00642323CD56534E3A9A66FE13C24953C596 -:10533B00CDF352C1FE04CA4D53C5CDA453C179CD93 -:10534B00EE52F1C1D1E1C9CD2070C9F5856F3E0098 -:10535B008C67F1C9C53C473E7F9078C1C0AFC9F59A -:10536B00C5D5E53A6E62A7CA87533E13329A66CD0E -:10537B00AF4E5FCD0B70118C53CD7770E1D1C1F176 -:10538B00C90D0A5B584F46462073656E7420746FC7 -:10539B0020686F73745D0D0A24F5C5D5E53A6E620E -:1053AB00A7CAC253AF329A663E11CDAF4E5FCD0B3B -:1053BB007011C753CD7770E1D1C1F1C90D0A5B589C -:1053CB004F4E2073656E7420746F20686F73745D1D -:1053DB000D0A24C5D5E521A16C060A772305C2E683 -:1053EB0053E1D1C1C9F5C5D5E511A96C21AA6C064C -:1053FB00091A771B2B05C2FC53E1D1C1F1C93EFF42 -:10540B003222670E201EFFCD82516F2600CD234F17 -:10541B00AF322267C91EFF0E06CD8251C932A16C75 -:10542B007D916F7C98673AA16CC9AF32A36C1A134C -:10543B00FE24C8D5F55FCD1770F1D1FE0AC23954E1 -:10544B003AA36C3C32A36CFE14C23954D5CD604FD9 -:10545B00D1C335544350534441542E41534D20280E -:10546B00313929202032392D4D61722D31393931A5 -:10547B00244B65726D69742D38302076342E3131A2 -:10548B00202420686173206265656E206275696CEB -:10549B00742066726F6D2074686520666F6C6C6F1C -:1054AB0077696E67206D6F64756C65733A244B6515 -:1054BB00726D69742D383020206E6E783A3E240D53 -:1054CB000A240D0A3F556E7265636F676E697A65C4 -:1054DB006420636F6D6D616E64240D0A3F4E6F74B3 -:1054EB0020636F6E6669726D6564243F556E6162F1 -:1054FB006C6520746F207265636569766520696ED3 -:10550B006974696174650D0A243F556E61626C653F -:10551B0020746F20726563656976652066696C65BA -:10552B00206E616D650D0A243F556E61626C6520BE -:10553B00746F207265636569766520656E64206F94 -:10554B00662066696C650D0A243F556E61626C6559 -:10555B0020746F2072656365697665206461746180 -:10556B000D0A243F4469736B2066756C6C0D0A241D -:10557B003F4469726563746F72792066756C6C0D4C -:10558B000A243F556E61626C6520746F20726563EF -:10559B006569766520616E2061636B6E6F776C65F4 -:1055AB006467656D656E742066726F6D20746865D7 -:1055BB0020686F73740D0A240D0A3F556E61626C7F -:1055CB006520746F2066696E642066696C650D0AD0 -:1055DB00243F556E61626C6520746F2072656E613D -:1055EB006D652066696C65240D0A3F4469736B20F9 -:1055FB0066756C6C240D0A3F556E61626C65207488 -:10560B006F2074656C6C20686F73742074686174A0 -:10561B00207468652073657373696F6E20697320DE -:10562B0066696E6973686564240D0A3F556E616225 -:10563B006C6520746F2074656C6C20686F737420BC -:10564B00746F206C6F676F7574240D0A3F4B657216 -:10565B006D697420686173206E6F74206265656E6E -:10566B0020636F6E6669677572656420666F722062 -:10567B0061207461726765742073797374656D242E -:10568B000D0A3F436F6E73697374656E63792063A4 -:10569B006865636B206F6E20636F6E6669677572EA -:1056AB006174696F6E206661696C6564240D0A3FD5 -:1056BB004572726F722077726974696E6720746FAE -:1056CB00206C6F672066696C650D0A240D0A3F49D3 -:1056DB006E76616C69642075736572206E756D6290 -:1056EB006572240D0A3F496E76616C6964205061C6 -:1056FB0075736520706172616D65746572240D0A36 -:10570B003F496E76616C6964204255464645522D81 -:10571B0053495A4520706172616D65746572240D31 -:10572B000A3F496E76616C6964207061636B6574C6 -:10573B00206C656E6774682028746F6F206C6F6EB9 -:10574B006729240D0A3F496E76616C6964204368B2 -:10575B0065636B74797065240D0A3F546F6F206D10 -:10576B00616E792072657472696573240D0A3F4608 -:10577B0061696C656420746F2065786368616E671E -:10578B006520706172616D6574657273240D0A3FDB -:10579B004661696C656420746F2072656365697618 -:1057AB006520696E70757420737472696E672069F9 -:1057BB006E20616C6C6F7465642074696D65240D6B -:1057CB000A3F46696C6520616C726561647920657E -:1057DB0078697374732407436F6D706C65746564BB -:1057EB0024074661696C6564242552656E616D6999 -:1057FB006E672066696C6520746F20240D0A5B430D -:10580B006C6F73696E6720746865206C6F672066B8 -:10581B00696C655D240D0A5B436F6E6E6563746521 -:10582B006420746F2072656D6F746520686F73747C -:10583B002E20205479706520244320746F207265CC -:10584B007475726E3B0D0A207479706520243F20AD -:10585B00666F7220636F6D6D616E64206C6973741B -:10586B005D0D0A240D0A5B436F6E6E656374696F81 -:10587B006E20636C6F7365642C206261636B2061B7 -:10588B0074206D6963726F5D24436F6E74726F6CFD -:10589B002D24204E6F7420696D706C656D656E7470 -:1058AB0065642E2420284E6F7420696D706C656DB5 -:1058BB00656E746564290D0A2407496E74657272EE -:1058CB007570746564240909202020204469726571 -:1058DB0063746F727920666F7220647269766520CB -:1058EB006E6E783A0D0A240D0A09094472697665C1 -:1058FB002024202068617320244B20627974657307 -:10590B0020667265650D0A240D0A46696C6528735D -:10591B002920657261736564240D0A0D0A5B54724C -:10592B00616E736D697474696E672066696C65204E -:10593B00746F20686F73743A0D0A20312E204C69F6 -:10594B006E6573206175746F6D61746963616C6CE6 -:10595B00792073656E742C20616E64207761697495 -:10596B0020666F7220706F737369626C652072654D -:10597B00706C790D0A20322E20434F4E54524F4CEF -:10598B002D432061626F727473207472616E736643 -:10599B0065720D0A20332E204966207472616E7376 -:1059AB006665722068616E67732C20747279206152 -:1059BB002072657475726E20746F20636F6E7469DC -:1059CB006E75650D0A20342E206F6E206578697414 -:1059DB002C20796F752077696C6C20626520706C58 -:1059EB006163656420696E20434F4E4E45435420DE -:1059FB0073746174652E0D0A245220746F207365C5 -:105A0B006E64207468652073616D65206C696E65CA -:105A1B0020616761696E2C0D0A2020206F72207443 -:105A2B0079706520244320746F2061626F7274203B -:105A3B007472616E736D697373696F6E2E5D0D0A8F -:105A4B00240D0A5B5472616E736D697373696F6EAB -:105A5B0020646F6E652E20436F6E6E656374656494 -:105A6B00206E6F726D616C6C7920746F2072656D36 -:105A7B006F746520686F73742C0D0A2074797065D0 -:105A8B00202453656E64696E672E2E2E2452656337 -:105A9B00656976696E672E2E2E24075761726E69C3 -:105AAB006E673A2065696768746820626974206361 -:105ABB00616E6E6F742062652073656E74240D0ABF -:105ACB00466F722068656C702C2074797065203F6E -:105ADB0020617420616E7920706F696E7420696E1D -:105AEB00206120636F6D6D616E64240D0A5B4C6FDA -:105AFB006767696E672073757370656E6465645D47 -:105B0B000D0A240D0A5B4C6F6767696E672072651F -:105B1B0073756D65645D0D0A240D0A5B5472616EBD -:105B2B00736D697373696F6E2041626F7274656414 -:105B3B002E20436F6E6E6563746564206E6F726D9D -:105B4B00616C6C7920746F2072656D6F7465206861 -:105B5B006F73742C0D0A207479706520240D0A0D57 -:105B6B000A5B4175746F6D61746963616C6C79204C -:105B7B00726563656976696E673B20747970652021 -:105B8B005E4320746F2061626F72745D0D0A0D0AA3 -:105B9B00240D0A0D0A202A202A202A205072657310 -:105BAB007320616E79206B657920746F20636F6E43 -:105BBB0074696E7565202A202A202A200D0A0D0A89 -:105BCB00240D0A5479706520746865206E65772002 -:105BDB00657363617065206368617261637465727C -:105BEB003A2020240D0A5479706520746865206E64 -:105BFB0065772054414320696E74657263657074D8 -:105C0B00206368617261637465723A2020240D0A07 -:105C1B0047697665207468652073746172742D6FA3 -:105C2B00662D7061636B6574206368617261637468 -:105C3B0065723A20240D0A547970652074686520CA -:105C4B006E65772070616464696E6720636861724A -:105C5B0061637465723A20240D0A522053656E6499 -:105C6B00207468652073616D65206C696E652061B9 -:105C7B006761696E240D0A51202053757370656E30 -:105C8B0064206C6F6767696E670D0A52202052653E -:105C9B0073756D65206C6F6767696E67240D0A3FBE -:105CAB00202054686973206D6573736167650D0AF5 -:105CBB00432020436C6F73652074686520636F6E9F -:105CCB006E656374696F6E0D0A302020287A6572D9 -:105CDB006F29205472616E736D69742061204E556B -:105CEB004C4C0D0A502020546F67676C6520707206 -:105CFB00696E746572206F6E2F6F66660D0A532086 -:105D0B0020537461747573206F662074686520630B -:105D1B006F6E6E656374696F6E240D0A54797069CA -:105D2B006E6720616E6F7468657220242077696CD2 -:105D3B006C2073656E6420697420746F20746865C1 -:105D4B0020686F73740D0A0D0A436F6D6D616E647D -:105D5B003E240D0A5472616E736D697474696E67BB -:105D6B0020612066696C65240D0A4175746F72653C -:105D7B006365697665206973240D0A4C6F63616CEA -:105D8B00206563686F24206F6E24206F6666240D78 -:105D9B000A466C6F7720636F6E74726F6C240D0AFA -:105DAB005465726D696E616C20646973706C617996 -:105DBB002069732024524547554C41522451554973 -:105DCB004554240D0A5465726D696E616C20656DC6 -:105DDB00756C6174696F6E20697320240D0A4669B6 -:105DEB006C65204D6F6465242064656661756C7409 -:105DFB0024204153434949242062696E61727924FE -:105E0B000D0A446973706C61792066696C65207347 -:105E1B00697A65206F6E204449524543544F52595D -:105E2B0020636F6D6D616E64240D0A49424D2066CF -:105E3B006C6167240D0A446973706F736974696FC1 -:105E4B006E20666F7220696E636F6D706C65746522 -:105E5B002066696C657320697324206469736361C0 -:105E6B00726424206B656570240D0A46696C65208D -:105E7B007761726E696E67240D0A5072696E746574 -:105E8B007220636F7079240D0A4C6F6767696E67B8 -:105E9B0020746F2024206973242073757370656ED2 -:105EAB00646564240D0A53454E4420737461727407 -:105EBB002D6F662D706B74206368617220205E24D9 -:105ECB000D0A524543454956452073746172742D32 -:105EDB006F662D706B74206368617220205E240DD9 -:105EEB000A53454E44207061636B6574206C656E7C -:105EFB006774682020240D0A5245434549564520B6 -:105F0B007061636B6574206C656E67746820202408 -:105F1B000D0A45736361706520636861723A2024D2 -:105F2B000D0A4D756C74692D736563746F72206205 -:105F3B007566666572696E672061742024206F66D2 -:105F4B002061206D6178696D756D206F6620240D61 -:105F5B000A5472616E736D69742070726F746F6323 -:105F6B006F6C20636861723A20240D0A426C6F6378 -:105F7B006B20636865636B20747970653A20242D00 -:105F8B00636861726163746572240D0A46696C659E -:105F9B0020434F4C4C4953494F4E3A2020240D0A75 -:105FAB005061726974793A20246E6F6E65246D614D -:105FBB00726B247370616365246F6464246576650A -:105FCB006E240D0A506F727420696E2075736520F4 -:105FDB0069733A20240D0A43757272656E742073CF -:105FEB00706565642069733A20242062707324699C -:105FFB006E64657465726D696E61746520286E6F71 -:10600B00742053455429240D0A54696D6572240D6F -:10601B000A43757272656E742054414354726170F9 -:10602B00205374617475732F496E74657263657058 -:10603B0074204368617261637465723A2020240D89 -:10604B000A43757272656E742075736572206E7576 -:10605B006D6265723A2020240D0A4465627567678C -:10606B00696E67240D0A43757272656E74206465E0 -:10607B006661756C74206469736B3A202420202050 -:10608B00202020202020202020202020240D0A3F0B -:10609B00536F7572636520616E64206465737469F8 -:1060AB006E6174696F6E2066696C657320746865C8 -:1060BB002073616D65240D0A3F46696C65206E6F18 -:1060CB007420666F756E64240D0A3F50726F677291 -:1060DB00616D206572726F723A2020496E76616C29 -:1060EB00696420434F4D4E442063616C6C240D0A50 -:1060FB003F416D626967756F7573240D0A3F496C7B -:10610B006C6567616C2043502F4D2066696C652070 -:10611B0073706563696669636174696F6E240D0AD8 -:10612B003F57696C642D6361726473206E6F7420CA -:10613B00616C6C6F77656420696E2066696C652095 -:10614B0073706563696669636174696F6E240D0AA8 -:10615B003F496E76616C69642075736572206E754C -:10616B006D626572240D0A3F496E76616C6964201D -:10617B005C20706172616D657465722420436F6E73 -:10618B006669726D207769746820636172726961E8 -:10619B0067652072657475726E2420456E74657226 -:1061AB002061206E756D6265722420436F6E666987 -:1061BB00726D2077697468206361727269616765BB -:1061CB002072657475726E206F7220656E746572C5 -:1061DB00206D6F7265243C5353746174653A3E2095 -:1061EB00003C5253746174653A3E20003C44617428 -:1061FB0061207472616E736D69747465643E200006 -:10620B003C44617461207265636569766564202026 -:10621B00203E20000D0A000D0A4E65772066696C42 -:10622B00653A20240D0A50617373776F72643A20BC -:10623B00240D0A4163636F756E743A20240D0A4E68 -:10624B006577206E616D653A20240D0A4D65737379 -:10625B006167653A20240D0A4F7074696F6E733A4B -:02626B002024ED -:01626E00002F -:03630C000000008E -:10639400000001010000000000260000004B4552EF -:1063A4004D495420204C4F470000FF004B45524DAF -:0763B40049542020494E4925 -:0463C90000000000D0 -:0463DD0000000000BC -:04656D00000000002A -:016671000028 -:046696000000000000 -:0A672000000000000000000000006F -:01672C00006C -:016A3D00FF59 -:016AA10002F2 -:016B22000072 -:046B2500000000006C -:106B43000000000000000000000000000000000042 -:036B53000000013E -:026C19000D2448 -:016CA00000F3 -:016CAD0000E6 -:046D910000000000FE -:107000000000000000000000C30000C30000C30037 -:1070100000C30000C30000C30000C30000C30000A1 -:10702000C30000C30000C30000C30000C30000C3CE -:107030000000C30000C30000C30000C30000C30081 -:1070400000C30000C30000C30000C30000C3000071 -:10705000C30000C30000C30000C30000C30000C39E -:107060000000C30000C30000C30000C30000C30051 -:0A70700000C30000C30000C30000CD -:00012700D8 diff --git a/cpxac.asm b/cpxac.asm new file mode 100644 index 0000000..611f22a --- /dev/null +++ b/cpxac.asm @@ -0,0 +1,762 @@ +IF NOT lasm +.printx * CPXAC.ASM * +ENDIF ;NOT lasm +; KERMIT - (Celtic for "FREE") +; +; This is the CP/M-80 implementation of the Columbia University +; KERMIT file transfer protocol. +; +; Version 4.0 +; +; Copyright June 1981,1982,1983,1984,1985 +; Columbia University +; +; Originally written by Bill Catchings of the Columbia University Center for +; Computing Activities, 612 W. 115th St., New York, NY 10025. +; +; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben, +; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many +; others. +; +; +; + +; +; Keep module name, edit number, and last revision date in memory. +; +family: db 'CPXCP.ASM (1) 3-DEC-2015$' ; First entry for V4.11 + +; +; Assembly time message to let me know I'm building the right version. +; + +.printx * Assembling Kermit-80 for AVR-CP/M * + + + +SC16IS740_ADDR equ 90H ;SC16IS740 I2C address. (8bit, A0=VDD, A1=VDD) +OUTSIZE equ 64 + +; Virtual I2C Interface + +VI2C_STAT equ 05h +VI2C_CTRL equ 05h +VI2C_BLEN equ 06h +VI2C_ADR equ 07h +VI2C_BSIZ equ 66 ;largest message size including address byte (SLA) + +;----------------------------- ISC16IS740 UART ------------------------------- +I2C_UART_PORT equ 50H + +I2C_UART_RHR equ I2C_UART_PORT+00H ;R Receive Holding +I2C_UART_THR equ I2C_UART_PORT+00H ;W Transmit Holding +I2C_UART_IER equ I2C_UART_PORT+01H ;R/W Interrupt Enable +I2C_UART_FCR equ I2C_UART_PORT+02H ;W FIFO Control + TX_FIFO_RES equ 04H ; TX FIFO reset + RX_FIFO_RES equ 02H ; RX FIFO reset + FIFO_ENABLE equ 01H ; FIFO enable + +I2C_UART_IIR equ I2C_UART_PORT+02H ;R Interrupt Identification +I2C_UART_LCR equ I2C_UART_PORT+03H ;R/W Line Control + DLAB equ 80H ; Devisor latch enable + WLS0 equ 01H ; Word Length Select Bit 0 + WLS1 equ 02H ; Word Length Select Bit 1 for 8 bit word + STB equ 04H ; Stop bit count - 2 stop bits + +I2C_UART_MCR equ I2C_UART_PORT+04H ;R/W Modem Control + RTS equ 02H ;RTS pin, 1 = active (low) + DTR equ 01H ;DTR pin (not on '740) +I2C_UART_LSR equ I2C_UART_PORT+05H ;R Line Status + TXE equ 40H ; THR and TSR empty + TXRDY equ 20H ; THR empty + RX_FE equ 08H ; Framig error + RX_PE equ 04H ; Parity error + RX_OE equ 02H ; Overrun error + RXRDY equ 01H ; Receved byte available +I2C_UART_MSR equ I2C_UART_PORT+06H ;R Modem Status +I2C_UART_SPR equ I2C_UART_PORT+07H ;R/W Scratchpad +I2C_UART_TCR equ I2C_UART_PORT+06H ;R/W Transmission Control +I2C_UART_TLR equ I2C_UART_PORT+07H ;R/W Trigger Level +I2C_UART_TXLVL equ I2C_UART_PORT+08H ;R Transmit FIFO Level +I2C_UART_RXLVL equ I2C_UART_PORT+09H ;R Receive FIFO Level +I2C_UART_EFCR equ I2C_UART_PORT+0FH ;R/W Extra Features +I2C_UART_DLL equ I2C_UART_PORT+00H ;R/W divisor latch LSB +I2C_UART_DLH equ I2C_UART_PORT+01H ;R/W divisor latch MSB +I2C_UART_EFR equ I2C_UART_PORT+02H ;R/W Enhanced Feature +I2C_UART_XON1 equ I2C_UART_PORT+04H ;R/W Xon1 word +I2C_UART_XON2 equ I2C_UART_PORT+05H ;R/W Xon2 word +I2C_UART_XOFF1 equ I2C_UART_PORT+06H ;R/W Xoff1 word +I2C_UART_XOFF2 equ I2C_UART_PORT+07H ;R/W Xoff2 word + + + +z80 set TRUE ;This one emulates an Z80. + + + .z80 + +sysxin: ; continuation of system initialisation from sysinit + + call speedtest + call prspeedmsg + + ld hl,6 ;set default baud rate + ld (speed),hl + ex de,hl + call sysspd + + ld a,RTS+DTR + out (I2C_UART_MCR),a + ret + +; ld a,07H ;Enable and clear fifos +; out (I2C_UART_FCR),a ; +; ld a,03H ;8N1 +; out (I2C_UART_LCR),a ; + +prspeedmsg: + push af + ld de,freqmsg + call prtstr + pop af + cp 13+1 + jr c,$+3 + xor a + ld e,a + ld d,0 + ld hl,fm_tab + add hl,de + add hl,de + ld e,(hl) + inc hl + ld d,(hl) + call prtstr + ld de,fdimmsg + call prtstr + ret + +mkftab macro x + irp y, +fm&y: + db '&y','$' + endm +fm_tab: + irp y, + dw fm&y + endm + endm + + +freqmsg: + db 'UART crystal frequency: ','$' + mkftab +fdimmsg: + db ' MHz.',cr,lf,'$' + + +; +; system-dependent KERMIT termination processing +; If we've changed anything, this is our last chance to put it back. +; +sysexit: + ret + +; +; system-dependent processing for start of CONNECT command +; +syscon: + ret + +conmsg: ; Messages printed when entering transparent (CONNECT) mode: + + db '$' + +; +; syscls - system-dependent close routine +; called when exiting transparent session. +; +syscls: + ret + + .8080 + +; +; sysinh - help for system-dependent special functions. +; called in response to ?, after listing all the +; system-independent escape sequences. +; +sysinh: + lxi d, inhlps + call prtstr + ret + +; Additional, system-dependent help for transparent mode +; (two-character escape sequences) +inhlps: + db cr,lf,'B Transmit a BREAK (0.3s)' + db cr,lf,'L Transmit a LONG BREAK (1.8s)' + db '$' ; string terminator + + .z80 +; +; sysint - system dependent special functions +; called when transparent escape character has been typed; +; the second character of the sequence is in A (and in B). +; returns: +; non-skip: sequence has been processed +; skip: seqence was not recognized +; +sysint: + and 5FH ; convert lower case to upper, for testing... + cp 'B' ; send break ? + jr z,sendbr ; then jump to send break routine + cp 'L' ; long break ? + jr z,longbr ; then jump to long break routine + jp rskp ; take skip return - command not recognised + +; +; Break routines +; +longbr: + ld e,180 ; time for long break is 1800 ms + jr setbit + +sendbr: + ld e,25 ; time for break is 300 ms + +setbit: + in a,(I2C_UART_LCR) + set 6,a ; Break contol bit + out (I2C_UART_LCR),a +; +; Now, delay for duration of hangup or break + ld a,e ; delay count + call delay +; +; Time's up. Put transmitter back in normal state and return. + + in a,(I2C_UART_LCR) + res 6,a ; Break contol bit + out (I2C_UART_LCR),a + ret ; done. + + .8080 +; +; sysflt - system-dependent filter +; called with character in E. +; if this character should not be printed, return with A = zero. +; preserves bc, de, hl. +; note: ,,, and are always discarded. +; +sysflt: + mov a,e ; get character for testing + ret + +; +; mdmflt - modem filter +; called with character to be sent to printer in E +; with parity set as appropriate. +; return with accumulator = 0 do do nothing, +; <> 0 to send char in E. +mdmflt: + mov a,e ; get character to test + ret + +; +; prtflt - printer filter +; called with character to be sent to printer in E +; returns with a = 0 to do nothing +; a <> 0 to print it. +; +; this routine for those printer that automatically insert +; a lf on cr, or cr for lf. Should this be shifted to +; the system indep. stuff, in say 4.06? +; +prtflt: + mov a,e ; get character to test + +IF FALSE ; strip out lf from printer stream + ani 7fh ; make sure it is parity less + cpi lf ; is it a line feed? + rnz ; no, print it +; xra a ; yes, don't. + +ENDIF + + ret + +; +; system-dependent processing for BYE command. +; +sysbye: + ret + +; +; This is the system-dependent command to change the baud rate. +; DE contains the two-byte value from the baud rate table; both +; bytes of this value are also stored in 'speed'. +; + .z80 +sysspd: + ld hl,0 + ld a,(clk_div) + ld b,a +sysspd_1: + add hl,de + djnz sysspd_1 + ld a,l + ld (sysspd_dll),a + ld a,h + ld (sysspd_dlh),a + + ld hl,sysspd_tab + call ioinil + + in a,(I2C_UART_MSR) ;Clear Modem Status Register + in a,(I2C_UART_LSR) ;Clear Line Status Register + in a,(I2C_UART_RHR) ;Clear Receiver Buffers + in a,(I2C_UART_RHR) + ret + +sysspd_tab: + db (sysspd_tab_end - ($+1))/2 + db I2C_UART_LCR, DLAB+03H ;Set devisor latch access bit + db I2C_UART_DLL +sysspd_dll: + ds 1 ;1200 bit/s at 1.832 MHz + db I2C_UART_DLH +sysspd_dlh: + ds 1 ;Out to the MSB divisor port + db I2C_UART_LCR, 03H ;Disable Divisor Access Latch + db I2C_UART_FCR, 07H ;Clear and enable fifos + db I2C_UART_MCR, 00H ;Enable loopback + db I2C_UART_IER, 0 ;Set no interrupts +sysspd_tab_end: + + + +; +; Speed tables +; (Note that speed tables MUST be in alphabetical order for later +; lookup procedures, and must begin with a value showing the total +; number of entries. The speed help tables are just for us poor +; humans. +; +; db string length, string, divisor (2 bytes or 1 word, ab) +; the data byte a is return in A and E, and b in D +; only byte 'a' is the key for the table + +spdtbl: db 15 ; Number of entries + db 3,'110$' + dw 1047 + db 6,'115200$' + dw 1 + db 4,'1200$' + dw 96 + db 3,'150$' + dw 768 + db 5,'19200$' + dw 6 + db 4,'2400$' + dw 48 + db 5,'28800$' + dw 5 + db 3,'300$' + dw 384 + db 5,'38400$' + dw 3 + db 3,'450$' + dw 288 + db 4,'4800$' + dw 24 + db 5,'57600$' + dw 2 + db 3,'600$' + dw 192 + db 2,'75$' + dw 1536 + db 4,'9600$' + dw 12 +IF 0 +sphtbl: db cr,lf,' 75 110 150 300 450 600 1200 2400' + db cr,lf,'4800 9600 19200 28800 38400 57600 115200$' +ENDIF + +sphtbl: db cr,lf,' 110 300 600 2400 9600 28800 57600' + db cr,lf,' 75 150 450 1200 4800 19200 38400 115200$' + + +speedtest: + ld hl,spt_tab + call ioinil + + in a,(I2C_UART_MSR) ;Clear Modem Status Register + in a,(I2C_UART_LSR) ;Clear Line Status Register + in a,(I2C_UART_RHR) ;Clear Receiver Buffers + in a,(I2C_UART_RHR) + + ld a,2 ;start write transaction + out (VI2C_CTRL),a + + ; get time stamp + in a,(41H) ;lsb ms + ld e,a + in a,(42H) ;msb ms + ld d,a + in a,(43H) ;lsb seconds + ld c,a + +spt_1: + in a,(I2C_UART_RXLVL) + cp 60 + jr nz,spt_1 + + ; get 2nd time stamp + in a,(41H) ;lsb ms + ld l,a + in a,(42H) ;msb ms + ld h,a + in a,(43H) ;lsb seconds + sub c + jr z,spt_3 + ld bc,1000 +spt_2: + add hl,bc + dec a + jr nz,spt_2 +spt_3: + sbc hl,de + ld d,h + ld e,l + inc hl + srl h + rr l + ld bc,500 + add hl,bc + + xor a ;clear carry +spt_4: + inc a + sbc hl,de + jr nc,spt_4 + dec a + ld (clk_div),a + ret + +spt_tab: + db (spt_tab_end - ($+1))/2 + db I2C_UART_LCR, DLAB+03H ;Set devisor latch access bit + db I2C_UART_DLL, low 96 ;1200 bit/s at 1.832 MHz + db I2C_UART_DLH, high 96 ;Out to the MSB divisor port + db I2C_UART_LCR, 03H ;Disable Divisor Access Latch + db I2C_UART_FCR, 07H ;Clear and enable fifos + db I2C_UART_MCR, 10H ;Enable loopback + db I2C_UART_IER, 0 ;Set no interrupts + db VI2C_ADR+0, low outbuf + db VI2C_ADR+1, high outbuf + db VI2C_BLEN, 60+2 +spt_tab_end: + +;---------------------------------------------------------------------- +; output bytes to ports +; +; hl: tables of port,value pairs: +; db n ;number of pairs +; db port1,val1, port2,val2,... portn,valn +; ... +; db 0 ; Terminate table + +ioinil: + push bc + ld b,(hl) ;count + inc hl +io1_lp: + ld c,(hl) ;port address + inc hl + outi + jr nz,io1_lp + pop bc + ret + +; +; This is the system-dependent SET PORT command. +; HL contains the argument from the command table. +; +sysprt: + ret + +prttbl EQU 0 ; SET PORT is not supported +prhtbl EQU 0 + +; +; selmdm - select modem port +; selcon - select console port +; selmdm is called before using inpmdm or outmdm; +; selcon is called before using inpcon or outcon. +; For iobyt systems, diddle the I/O byte to select console or comm port; +; For the rest, does nothing. +; preserves bc, de, hl. +; +selmdm: + ret + +selcon: +IF 1 + jr omflush +ELSE + ret +ENDIF + +; +; Get character from console, or return zero. +; result is returned in A. destroys bc, de, hl. +; +inpcon: + ld c,dconio ;Direct console I/O BDOS call. + ld e,0FFH ;Input. + call BDOS + + ret + +; +; Output character in E to the console. +; destroys bc, de, hl +; +outcon: + ld c,dconio ;Console output bdos call. + call bdos ;Output the char to the console. + + ret + +; +; outmdm - output a char from E to the modem. +; the parity bit has been set as necessary. +; returns nonskip; bc, de, hl preserved. +; +outmdm: +IF 0 + in a,(I2C_UART_LSR) ;Get the output done flag. + and TXRDY ;Is it set? + jr z,outmdm ;If not, loop until it is. + ld a,e + out (I2C_UART_THR),a ;Output it. +ENDIF +IF 1 + + push hl + ld hl,(outptr) + ld (hl),e ;return buffered char + inc hl + ld (outptr),hl + ld a,(outcnt) + inc a + ld (outcnt),a + cp OUTSIZE + jr nc,omflush_1 ;buffer full + pop hl + ret + +omflush: + ld a,(outcnt) + or a + ret z + + scf + push hl +omflush_1: + push bc + ld c,a ;outcnt + ld b,a + jr c,$+4 + ld b,1 + ld hl,outbuf + ld a,h + out (VI2C_ADR+1),a + ld a,l + out (VI2C_ADR+0),a +omf_0: + in a,(I2C_UART_TXLVL) + cp b + jr c,omf_0 + cp c + jr nc,omf_2 + ld c,a +omf_2: + ld a,c + add a,2 + out (VI2C_BLEN),a + ld a,2 ;start write transaction + out (VI2C_CTRL),a + + ld hl,outbuf+2 + ld (outptr),hl + ld a,(outcnt) + sub c + ld (outcnt),a + jr z,omfex + + push de + ld d,h + ld e,l + ld b,0 + add hl,bc + ld c,a + ldir + pop de +omfex: + pop bc + pop hl + ret +ENDIF +; +; get character from modem; return zero if none available. +; for IOBYT systems, the modem port has already been selected. +; destroys bc, de, hl. +; +inpmdm: +if 0 + in a,(I2C_UART_LSR) ;Get the port status into A. + and RXRDY ;See if the input ready bit is on. + ret z ;If not then return. + + in a,(I2C_UART_MCR) ;debug + xor RTS + out (I2C_UART_MCR),a + + in a,(I2C_UART_RHR);If so, get the char. + ret +endif + +if 1 + ld a,(inpcnt) + dec a + jp m,imdrdi2c ;buffer empty + ld (inpcnt),a + ld hl,(inpptr) + ld a,(hl) ;return buffered char + inc hl + ld (inpptr),hl + ret + +imdrdi2c: + in a,(I2C_UART_RXLVL) ;get rx fifo count + or a + ret z ;fifo is empty, return 0 + + ; prepare fifo read + inc a ;+ slave address + ld (VI2C_BLEN),a + ld hl,inbuf + ld a,h + out (VI2C_ADR+1),a + ld a,l + out (VI2C_ADR+0),a + inc hl + ld (hl),0 ;select subaddr 0 (RHR) for next read + ld a,3 ;write 1 byte (subaddr.), then read fifo + ld (VI2C_CTRL),a + in a,(VI2C_CTRL) ;get i2c result + xor 01h + and 11h ;transfer completed? + jr nz,imrdex + in a,(VI2C_BLEN) ;get actual transfer count + + sub 2 ;- (slave address + char to return now) + jr c,imrdex + ld (inpcnt),a ;save new buffer count + ld a,(hl) + inc hl + ld (inpptr),hl + ret + +imrdex: + xor a + ret +endif + + .8080 + +; +; flsmdm - flush comm line. +; Modem is selected. +; Currently, just gets characters until none are available. +; +flsmdm: + call inpmdm ; Try to get a character + ora a ; Got one? + jnz flsmdm ; If so, try for another + ret ; Receiver is drained. Return. + + +; +; lptstat - get the printer status. Return a=0 if ok, or 0ffh if not. +lptstat: +IF iobyte ;[33] + call bprtst ; get status +ENDIF ;iobyte[33] +IF NOT iobyte ;[33] + xra a ; assume it is ok.. this may not be necessary +ENDIF ;iobyte [33] + ret +; +; outlpt - output character in E to printer +; console is selected. +; preserves de. +; +outlpt: + push d ; save DE in either case + call prtflt ; go through printer filter [30] + ana a ; if A = 0 do nothing, + jz outlp1 ; if a=0 do nothing + +outlp1: pop d ; restore saved register pair + ret + +; delchr - make delete look like a backspace. Unless delete is a printing +; character, we just need to print a backspace. (we'll output clrspc +; afterwards) +delchr: + + mvi e,bs ;get a backspace + jmp outcon + +; erase the character at the current cursor position +clrspc: mvi e,' ' + call outcon + mvi e,bs ;get a backspace + jmp outcon + +; erase the current line +clrlin: lxi d,eralin + jmp prtstr + +; erase the whole screen, and go home. preserves b (but not c) +clrtop: lxi d,erascr + jmp prtstr + + +sysver: db 'AVR-CP/M' + db '$' + + +clk_div: + db 1 ;default div + +inpptr: dw 0 +inpcnt: db 0 +inbuf: + db SC16IS740_ADDR + ds VI2C_BSIZ-1 + + +outptr: dw outbuf+2 +outcnt: db 0 +outbuf: + db SC16IS740_ADDR + db 0 ;RHR subaddress + ds OUTSIZE + + +IF lasm +LINK CPXVDU.ASM ; get terminal defs etc +ENDIF ;lasm diff --git a/cpxcom.asm b/cpxcom.asm index 6123f64..fcd7dfa 100644 --- a/cpxcom.asm +++ b/cpxcom.asm @@ -439,7 +439,7 @@ rskp: pop h ; Get the return address ; called by: cpxsys, mfname ; mover: -;IF NOT z80 ; 8080's have to do it the hard way +IF NOT z80 ; 8080's have to do it the hard way ;OBS assume its an 8080 for now - this will work on Z80s anyway. mov a,m stax d @@ -449,10 +449,10 @@ mover: mov a,b ora c jnz mover -;ENDIF;NOT z80 -;IF z80 -; db 0EDh,0B0h ; Z80 LDIR instruction -;ENDIF;z80 +ENDIF;NOT z80 +IF z80 + db 0EDh,0B0h ; Z80 LDIR instruction +ENDIF;z80 ret ; diff --git a/cpxswt.asm b/cpxswt.asm index 1942c41..c018d63 100644 --- a/cpxswt.asm +++ b/cpxswt.asm @@ -154,6 +154,12 @@ LINK CPXBEE.ASM ENDIF ; (beefam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM +IF (acfam AND lasm) +; Link to the AVR-CP/M family file +.printx * linking to the AVRCPM family file* +LINK CPXAC.ASM +ENDIF ; (acfam AND lasm) - m80 use: INCLUDE from CPXTYP.ASM + ; If we have come here, we are assembling the CPXSYS.ASM file IF robin diff --git a/cpxtyp.asm b/cpxtyp.asm index 83528a9..1acf241 100644 --- a/cpxtyp.asm +++ b/cpxtyp.asm @@ -248,8 +248,8 @@ TRUE EQU NOT FALSE ; Assembler type. Define the appropriate one TRUE, the rest FALSE. (We can't ; use ASM, because it cannot handle multiple input files) mac80 EQU FALSE ; For assembly via MAC80 cross-assembler. -m80 EQU FALSE ; For assembly via Microsoft's M80. -lasm EQU TRUE ; For assembly via LASM, a public-domain +m80 EQU TRUE ; For assembly via Microsoft's M80. +lasm EQU FALSE ; For assembly via LASM, a public-domain ; assembler. ; ; Address at which the overlay should be loaded. This will not @@ -269,7 +269,7 @@ termin SET FALSE ; we are not using a terminal ; Also set the CPU speed to a default 2.0 Mhz cpuspd SET 20 ; default to 2 Mhz, in case we dont know ; Assume kit is Z80 based, and set z80 false for non z80 systems. -;z80 SET TRUE +z80 SET TRUE ;Which CP/M system hardware are we building KERMIT-80 for? ;One of the following should be TRUE, the rest FALSE: @@ -363,6 +363,8 @@ hp125 EQU FALSE ;[MF]HP-125 Business Assistant, 8-bit data ; for binary transfers on Data Comm 2) ; set VT52 TRUE mbee EQU FALSE ; Microbee Systems - Microbee +avrcpm EQU TRUE ;AVR-CP/M (terminal required) + ;.. and for Micros, like the MDI, which have "terminals of choice", you must ;select one of these in addition to selecting the micro itself. @@ -378,7 +380,7 @@ tvi912 EQU FALSE ;[10] TVI912/920 tvi925 EQU FALSE ;TVI925 Display ; (works for Freedom 100 also) [Toad Hall] vt52 EQU FALSE ;VT52 or equivalent (or H19) -vt100 EQU FALSE ;VT100 or equivalent +vt100 EQU TRUE ;VT100 or equivalent wyse EQU FALSE ;Wyse 100 terminal ; ; Several systems are basically the same, with very slight variations, @@ -462,6 +464,10 @@ tacval EQU '@' ;Typical TAC intercept character ; trs80 (both), telcon, mmdI, mdI, delphi, ncrdmv, ; cromemco, teletek, osi, lobo +IF avrcpm ; For the kermit delay loop, a 20Mhz AVR-CP/M +cpuspd SET 22 ; behaves like a 2.2MHz Z80. +ENDIF; avrcpm + IF z80mu cpuspd SET 2 ; a PC is about 200khz Z80 equivalent ENDIF; z80mu @@ -535,6 +541,7 @@ genfam SET FALSE ; not a genie trsfam SET FALSE ; not a trs-80 Model 4 z80fam SET FALSE ; not z80mu system beefam SET FALSE ; not a Microbee system +acfam SET FALSE ; not avrcpm system sysfam SET TRUE ; ... but assume the worst, and its in ; the CPXSYS.ASM file @@ -615,6 +622,11 @@ beefam SET TRUE ; doing a Microbee system .printx * beefam set TRUE * ENDIF ; mbee +IF avrcpm +acfam SET TRUE ; doing a AVR-CP/M System +.printx * acfam set TRUE * +ENDIF ; avrcpm + ; Now, if none of the above, then its the older CPXSYS.ASM file we want IF (torfam OR ciffam OR appfam OR norfam OR sanfam OR comfam) AND sysfam @@ -627,10 +639,10 @@ sysfam SET FALSE ; Were not doing the CPXSYS.ASM file .printx * sysfam set FALSE * ENDIF ; (pcwfam OR bbifam OR heafam OR sbfam OR merfam) AND sysfam -IF (genfam OR trsfam OR z80fam OR beefam) AND sysfam +IF (genfam OR trsfam OR z80fam OR beefam OR acfam) AND sysfam sysfam SET FALSE ; Were not doing the CPXSYS.ASM file .printx * sysfam set FALSE * -ENDIF ; (genfam OR trsfam OR z80fam OR mbeefam) AND sysfam +ENDIF ; (genfam OR trsfam OR z80fam OR mbeefam OR acfam) AND sysfam IF sysfam .printx * sysfam set TRUE * @@ -716,6 +728,10 @@ IF beefam INCLUDE CPXBEE.ASM ENDIF ;beefam +IF acfam + INCLUDE CPXAC.ASM +ENDIF ;acfam + IF termin ; any terminal selected? INCLUDE CPXVDU.ASM ;[15] Just in case we need a VDU... ENDIF ;termin -- 2.39.2