fix 0xB0/0xB1 high/low bucket marking

improved filtering of 0xB1 sniffing
This commit is contained in:
Portisch 2019-01-30 16:00:36 +01:00
parent 24782ab36c
commit 651cce696a
5 changed files with 525 additions and 494 deletions

View File

@ -82,7 +82,7 @@ def sendCommand(szOutFinal, mydevice):
#print(body)
def DrawImage(buckets, data):
lines = []
lines = {'time': [], 'high': []}
font = ImageFont.load_default()
Bucket_High_Low_Marking = False
repeats = 2
@ -98,13 +98,13 @@ def DrawImage(buckets, data):
break;
for i in range(0, len(data)):
if (data[i:i+1] != 'F'):
lines.append(buckets[int(data[i:i+1], 16) & 0x07])
lines['time'].append(buckets[int(data[i:i+1], 16) & 0x07])
lines['high'].append(int(data[i:i+1], 16) >> 3)
f = 0.03
import math
picture = Image.new("L", (int(math.ceil(sum(lines * repeats) * f)) + 10, 150))
picture = Image.new("L", (int(math.ceil(sum(lines['time'] * repeats) * f)) + 10, 150))
draw = ImageDraw.Draw(picture)
draw.rectangle(((0, 0), (picture.width - 1, picture.height - 1)), fill="white", outline="black")
@ -121,9 +121,12 @@ def DrawImage(buckets, data):
for a in range(0, repeats):
y = inverted
for i in range(len(lines)):
for i in range(len(lines['time'])):
lastX = x
x += lines[i]
x += lines['time'][i]
if Bucket_High_Low_Marking:
y = not lines['high'][i]
# horizontal line
draw.line(((lastX * f, y * 50 + 25), (x * f, y * 50 + 25)), fill="black")
@ -134,10 +137,10 @@ def DrawImage(buckets, data):
draw.line(((lastX * f, picture.height - 70), (lastX * f, picture.height - 30)), fill="grey")
img_txt = Image.new("L", font.getsize(str(lines[i])))
img_txt = Image.new("L", font.getsize(str(lines['time'][i])))
draw_txt = ImageDraw.Draw(img_txt)
draw_txt.rectangle(((0, 0), (img_txt.width, img_txt.height)), fill="white")
draw_txt.text((0,0), str(lines[i]), font=font, fill="black")
draw_txt.text((0,0), str(lines['time'][i]), font=font, fill="black")
picture.paste(img_txt.rotate(90, expand=1), (int(math.ceil(lastX * f)) + 2, 10 + 50 + 25))
lastY = y
y = not y
@ -253,7 +256,8 @@ def main(szInpStr, repVal):
szOutAux += szInpStr[6+i*4:10+i*4] + " "
arrBuckets.append(int(szInpStr[6+i*4:10+i*4], 16))
syncData = findSyncPattern(szInpStr[10+i*4:-2])
#syncData = findSyncPattern(szInpStr[10+i*4:-2])
syncData = None
if (syncData != None):
szOutAux += syncData
@ -307,7 +311,7 @@ parser = OptionParser(usage=usage, version="%prog 0.4")
parser.add_option("-e", "--dev", action="store", type="string",
dest="device", help="device (ip or hostname) to send RfRaw B0 command")
parser.add_option("-r", "--repeat", action="store",
dest="repeat", default=4, help="number of times to repeat")
dest="repeat", default=8, help="number of times to repeat")
parser.add_option("-d", "--debug", action="store_true",
dest="debug", default=False, help="show debug info")
parser.add_option("-v", "--verbose", action="store_true",

View File

@ -1,37 +1,37 @@
:020000040000FA
:100000000211A9A2029290A2029280AD41AC407F5F
:10000000021302A2029290A2029280AD41AC407F04
:100010000A7E0012002E12001DA202B322E59120DA
:10002000E2FB220211197597A522220214D68E42F4
:100030008F438C448D451216A1121940E54524BF0B
:10002000E2FB220212727597A522220215B78E42B8
:100030008F438C448D451217341219E0E54524BFD7
:100040009000E9F0E54434FF9000E8F09000E4E52A
:1000500042F0A3E543F04391042222021238121920
:10006000D453D87853DAFE1219A5E4900087F02211
:10007000D2DE22021529121872C290C296C280E402
:10008000FBFD7F1012198C12053174A4F0D2AF124F
:1000900017BCD2969000EDE004F070069000ECE002
:1000500042F0A3E543F04391042222021391121AC5
:100060007453D87853DAFE121A45E4900087F022D0
:10007000D2DE2202160A121935C290C296C280E45C
:10008000FBFD7F10121A2C12053874A4F0D2AF12A7
:10009000184FD2969000EDE004F070069000ECE06E
:1000A00004F09000ECE0B427E9A3E0B410E4C296B9
:1000B0001200263003091217618E228F23800675E5
:1000B0001200263003091217F48E228F2380067552
:1000C0002201752300E5237004E522640170469047
:1000D00000DFE070061217BD0202959000ECE47597
:1000E000F001120665FED3E5F09410EE942740026D
:1000D00000DFE070061218500202959000ECE47503
:1000E000F00112066CFED3E5F09410EE9427400266
:1000F000D296D39000EDE094309000ECE0947550EF
:1001000003020295E4F0A3F09000DFF090009AF073
:10011000C2960202951217BC9000DFE014602A1408
:10011000C29602029512184F9000DFE014602A1474
:1001200070030202591470030202171470030202D2
:100130003024046003020295E52364AA60030202EE
:10014000959000DF04F0020295E52390009AF0906C
:1001500000DF7402F0E5231207AC0201A0017FA1C9
:1001500000DF7402F0E5231207B30201A0017FA1C2
:10016000018BA501A9A601BDA701C6A801DDA901B2
:10017000CCB001D5B1019DC00295FF0000020C1268
:10018000051EE490008AF07FA1806512054E900064
:10019000EB7408F0E4F52575240902029512054E6A
:100180000525E490008AF07FA18065120555900056
:10019000EB7408F0E4F52575240902029512055563
:1001A000E4F52575240202029590008A7401F07F1F
:1001B000A612161690007974A6F002029512053167
:1001B000A61216A990007974A6F0020295120538CD
:1001C00074A4F00202959000EB7408F09000DF74C4
:1001D00003F00202957FB112056C02029512051E12
:1001D00003F00202957FB112057302029512052504
:1001E00090008AE09000EAF090008A7401F07FA904
:1001F00012056C7D307C757F017E00121849020269
:1002000095120575900079EFF0E48005E490009A6E
:1001F0001205737D307C757F017E0012190C02029E
:100200009512057C900079EFF0E48005E490009A67
:10021000F09000DFF0807EE4F525E523F524E52469
:10022000D39400402C12005E9000DF7404F08065CF
:1002300074032525F582E43400F583E523F00525D4
@ -39,420 +39,430 @@
:10025000709000DF7402F0803CE5236455703690A6
:1002600000DFF0C20390009AE02460601B24FC6071
:100270001224FE600E14600B24F760101460042436
:100280001070127FA0121927D2038009900004E099
:10029000049000EBF090009AE01207AC02BEA103BC
:100280001070127FA01219C7D2038009900004E0F9
:10029000049000EBF090009AE01207B302BEA103B5
:1002A00033A40377A50333A6044CA802BEA9048196
:1002B000B004E3B10423C00447FF000000B0900085
:1002C00086E030E73F7DC87C0012053F90009AE051
:1002D0002457600E2408701F1205757FA312165C48
:1002B000B004EAB10423C00447FF000000B090007E
:1002C00086E030E73F7DC87C0012054690009AE04A
:1002D0002457600E2408701F12057C7FA31216EFAE
:1002E00080159000EAE090008AF0900079E0FF121B
:1002F00016167FAB12057EE4900086F043DA01D239
:10030000030200B012199D50207DE87C0312053FC6
:1002F00016A97FAB120585E4900086F043DA01D29F
:10030000030200B0121A3D50207DE87C031205461E
:1003100090009AE02457600C240860030200B07F2C
:10032000A20204D57FAA0204D51205584003020098
:10032000A20204DC7FAA0204DC12055F4003020083
:10033000B0802E900086E030E71F90009AE0245AAB
:10034000600F240260030204EF7FA412165C020413
:10035000EF7FA612057E0204EF120558400302004B
:10036000B01217A1C006C0071217B09200D007D074
:10037000061207FE0200B09000DFE060030200B04A
:100380001217C47003020416240560030200B012A1
:100390000562900005E0FFA3E090008CCFF0A3EF92
:10034000600F240260030204F67FA41216EF020479
:10035000F67FA61205850204F612055F400302002F
:10036000B0121834C006C0071218439200D007D04C
:10037000061208050200B09000DFE060030200B042
:100380001218577003020416240560030200B0120D
:100390000569900005E0FFA3E090008CCFF0A3EF8B
:1003A000F0900007E0FFA3E090008ECFF0A3EFF005
:1003B000900003E0FFA3E0900090CFF0A3EFF09057
:1003C0001A52E493FD121797752DFF8A2EF52F9080
:1003D0001A55E493F5301217977531FF8A32F533C9
:1003E000901A58E493F5341217977535FF8A36F54D
:1003F00037901A5BE493F538A3E493F539A3E493BB
:1003C0001AF2E493FD12182A752DFF8A2EF52F904C
:1003D0001AF5E493F53012182A7531FF8A32F53395
:1003E000901AF8E493F53412182A7535FF8A36F519
:1003F00037901AFBE493F538A3E493F539A3E4931B
:1004000024FF9200753A00753B097B017A00798CD4
:10041000120FB60200B09000EBE07063C2807FA0C4
:100420000204D59000DFE060030200B0900003E01A
:10043000FCA3E0FD7F017E00121849D29612001D38
:10044000C2967FA00204D57F030204D59000DFE0AE
:1004500060030200B01217C4601924056003020093
:10046000B0120562900003E0FF7C007D0412106F63
:100470000200B09000EBE07006C2807FA080568042
:100480005A9000DFE060030200B01217C4603C2401
:100490000560030200B09000EBE014F012005E90E3
:1004A0000003E0FF25E02405F582E43400AD82FC82
:1004B000900005E0F97A007B00EF25E0FFE52424B9
:1004C000FEC39FF52B12157C0200B09000EBE0708C
:1004D0000AC2807FA012191A0200B0E4900087F0CF
:1004E0000200B0900086E030E7107FB1121338E4CC
:1004F000900086F043DA010200B07B017A0079EEC9
:100500001216E540030200B01217A1C006C0071280
:1005100017B09200D007D006120E0D0200B07D3247
:100520007C007F017E00121849D29612001DC296EF
:1005300022E490008AF07FA4121616900079227FA0
:10054000017E00121849D29612001DC29622120096
:100550005E9000DF7404F0227B017A0079EE1216BF
:10056000E5229000EBE014F012005E2212161690C5
:100570000079EFF022900079E0FF12161622900029
:1005800086E0547FFD1215CA22BB010CE58229F5D5
:1005900082E5833AF583E0225006E92582F8E622D7
:1005A000BBFE06E92582F8E222E58229F582E58391
:1005B0003AF583E49322BB010689828A83F02250B4
:1005C00002F722BBFE01F322EF8DF0A4A8F0CF8C3E
:1005D000F0A428CE8DF0A42EFE22BC000BBE002974
:1005E000EF8DF084FFADF022E4CCF875F008EF2F2A
:1005F000FFEE33FEEC33FCEE9DEC984005FCEE9DE7
:10060000FE0FD5F0E9E4CEFD22EDF8F5F0EE842002
:10061000D21CFEADF075F008EF2FFFED33FD400763
:10062000985006D5F0F222C398FD0FD5F0EA22C209
:10063000D5EC30E709B2D5E4C39DFDE49CFCEE3077
:10064000E715B2D5E4C39FFFE49EFE1205DAC3E4CA
:100650009DFDE49CFC80031205DA30D507C3E49FBE
:10066000FFE49EFE22C5F0F8A3E028F0C5F0F8E50F
:1006700082158270021583E038F022BB0110E582FA
:1006800029F582E5833AF583E0F5F0A3E0225009ED
:10069000E92582F886F008E622BBFE0AE92582F801
:1006A000E2F5F008E222E5832AF583E993F5F0A369
:1006B000E99322BB010A89828A83F0E5F0A3F02244
:1006C0005006F709A7F01922BBFE06F3E5F009F37F
:1006D000192275F008758200EF2FFFEE33FECD333F
:1006E000CDCC33CCC58233C5829BED9AEC99E582A3
:1006F00098400CF582EE9BFEED9AFDEC99FC0FD52F
:10070000F0D6E4CEFBE4CDFAE4CCF9A88222B8001E
:10071000C1B90059BA002DEC8BF084CFCECDFCE5E9
:10072000F0CBF97818EF2FFFEE33FEED33FDEC330D
:10073000FCEB33FB10D703994004EB99FB0FD8E592
:10074000E4F9FA227818EF2FFFEE33FEED33FDECDB
:1007500033FCC933C910D7059BE99A4007EC9BFCD1
:10076000E99AF90FD8E0E4C9FAE4CCFB2275F0105D
:10077000EF2FFFEE33FEED33FDCC33CCC833C81082
:10078000D7079BEC9AE899400AED9BFDEC9AFCE8B0
:1007900099F80FD5F0DAE4CDFBE4CCFAE4C8F922FD
:1007A000A42582F582E5F03583F58322D083D082BB
:1007B000F8E4937012740193700DA3A393F874017D
:1007C00093F5828883E4737402936860EFA3A3A314
:1007D00080DFEF4E6012EF60010EEDBB010B8982EE
:1007E0008A83F0A3DFFCDEFA2289F05007F709DFE5
:1007F000FCA9F022BBFEFCF309DFFCA9F0228E2647
:100800008F27E4F528C3E5279464E5269400501E5D
:10081000E4F528E528120C51F8E4F608F6E528126C
:100820000C92E4F60528E528B408E8C2902290006E
:100830008AE01470030208E6046003020A40786745
:10084000E6C4540F704CD3E5279494E526941150D8
:1008500003020A40300003020A40120C9A18F6ED17
:1008600008F618120C9A18F6ED08F6120D60AE266E
:10087000FF7C007D1F1205DA90008CEEF0A3EFF0F4
:100880007C007D031205C8A3EEF0A3EFF0A3120DC8
:1008900063227867E6C4540F64026003020A40A230
:1008A0000033FF901B36E4936FC36001D392018540
:1008B000262A85272B752C01752D00752E8C901BF3
:1008C0002F120C84120DF9901B31E493F532A31210
:1008D0000C84120E03901B34E493F536A3E493F5D5
:1008E00037E4FF020A41E4F528E528120C51F9E744
:1008F000C4540F7044120CB0120D2CD3940140114B
:10090000120CB0120D38FFA200E4336F7003020A1C
:1009100034120C75F5828E83C083C082120CB01223
:100920000DB0120C82F5828E83E493D082D08312B4
:10093000142A4003020A34805CE528120C51F9E7BE
:10094000C4540F7E00540FFF120CB0120D2CF9FD91
:10095000C3EF9DEE94005067120CB02429F582E499
:10096000341BF583E493FC740193F5828C83C0837C
:10097000C082120CB0120DB0F583E493FC740193A5
:100980002FF582EE3CF583E493D082D08312142AB3
:10099000501A120D60E528120C51F8120C9AFEED57
:1009A000FFE528120C51120DE8020A34E528120C5A
:1009B00051F8E4F608F6E528120C92E4F68075E5A5
:1009C00028120C51F8E6FEEEC4540FFFE96F7001D7
:1009D000E47061120CB0120D38FFA200E4336FC353
:1009E0006001D3920185262A85272B120C75AA0651
:1009F000752CFF8A2DF52E120CB0242FF582E434CD
:100A00001B120C82120DF9120CB0120DB8F5321235
:100A10000CB02432F582E4341B120C82120E031245
:100A20000CB0120DC4F536120CB0120DD0F537AF64
:100A300028120A410528E528C3940850030208E952
:100A4000228F29E4F538EF120C92E6701A90008B91
:100A50007408F07E007F707D007B017A00790312BC
:100A600007D2E490007AF0AB2CAA2DA92EC003C0C7
:100A700002C001120C4FF9E7AB2FAA30A931120DB9
:100A800018D001D002D003120D6B5040120C4FF958
:100A9000E77E00540FFF7003200109D3EF9400EEAE
:100AA00094004030EF4E700A900077E52AF0A3E5FD
:100AB0002BF0120C4F120D9C2401FFEFFEEC54F0B2
:100AC0004EFEEDFF120C4F120DE88008120C4FF88D
:100AD00074F056F6AB2CAA2DA92EC003C002C0019B
:100AE000120C4F120CEEAB33AA34A935120D18D0EC
:100AF00001D002D003120D6B505F120C4F120CEE9E
:100B00007E00540FFF7003200109D3EF9400EE9490
:100B100000404AEF4E700A900088E52AF0A3E52BCA
:100B2000F0120C4F120D9CC4F854F0C868FEEDC4CE
:100B3000540F482401FFE43EFEEFC4F8540FC86888
:100B4000FFEEC454F048FEED540FFDEE4CFEEF4DA9
:100B5000FF120C4F120DE88004120D82F6120C4F9A
:100B6000120D9CFB7A00540F7019ECC4F854F0C8B5
:100B7000EDC4540F48540F700A120C4D120C8BE444
:100B8000F6C322120C90E537146670037538017EA7
:100B900000EB540FFFE532120DEFB50719EEB50467
:100BA00015D290120C4FF874F056120C8F0690006C
:100BB0008BE014F08042120C4F120CEE540FFFE544
:100BC00036120DEF6F7001EC702ED290120D821262
:100BD0000C8F0690008BE014F0120CD4C083C082FE
:100BE000E0FF90008BE0FE7401A806088002C3338A
:100BF000D8FC4FD082D083F090008BE07015120C9F
:100C000090120CD4120D47FF1218DFEFF090008BFA
:100C10007408F0120C90E6C39537402F12199550C6
:100C200005E4900085F0120D4460181219A57D208E
:100C30007C037F017E00121820120DA4A3E529F089
:100C40004480F0120C4D120C8BE4F6D322C290E5D6
:100C50002975F003A4246722A2019202AB29AA2AD3
:100C6000A92B75F002EFA4F58285F08312067BF5BF
:100C70004185F04022E52875F00EA42429F582E490
:100C8000341BF583E493FE74019322F8E4F608F62E
:100C9000E52975F003A42469F822E6FC08E6FDECDA
:100CA000C4540F2401FFEFC454F0FEEC540F4E2245
:100CB000E52875F00EA422A200E433C43333335484
:100CC000804526FFE527900074CFF0A3EFF0E49075
:100CD000007BF022E624FFFFE434FFFE7C007D0869
:100CE00012062F74032FF58274003EF58322F9E774
:100CF000C4F854F0C809E7C4540F4822E52E25E093
:100D0000248CF582E43400F58322853D82758300CE
:100D1000120589FFC3952C22540FF58275830012AA
:100D2000058975F002A4F58285F08322242EF582D0
:100D3000E4341BF583E493222436F582E4341BF576
:100D400083E49322900085E0FF90007AE06F22A276
:100D5000009202AB26AA27A928EF540775F00222B9
:100D6000900001E526F0A3E527F02212067BFDACFA
:100D7000F0AF2BAE2A02143B2403F582E43400F5D5
:100D80008322E52975F003A42468F8740F5622E540
:100D90002A252CF582E43529F583E022F8E6FC08C3
:100DA000E6FDEC2290007AE0900085F053DAFE2216
:100DB000242CF582E4341B222431F582E4341BF523
:100DC00083E493222434F582E4341BF583E49322F4
:100DD0002435F582E4341BF583E4932225E0247D59
:100DE000F582E43400F58322F8A60608A60722C39C
:100DF0009538FDE49400FCED22AA06752FFF8A3099
:100E0000F53122AA067533FF8A34F535228E268FF6
:100E100027C3E5279464E52694005003020FB090A1
:100E20000087E024FE6025147003020EB6240360E0
:100E300003020FB5C290AF27AE2612190C40030271
:100E40000FB5120CB79000877402F022A200920135
:100E5000AF27AE261217F6503290007BE094044084
:100E600023D290E4900000F0900073F090008BF09B
:100E700090007CF090007AF0900003F0900087746E
:100E800003F08025E4900087F0801E900074E05409
:100E90007FFEA3E0FFD3E5279FE5269E4005120CC9
:100EA000B7800690007BE004F090007BE0F46003E4
:100EB000020FB5020FB190007CE004F07B007A00D5
:100EC0007928AF27AE261213B24023900000E0FF2E
:100ED000120CFEE526F0A3E527F08F28900000E035
:100EE00004F0E0D394074006E4F0900087F090000F
:100EF0008BE0B40422A200E433C43333335480FFC4
:100F0000E528C454F04FFF900073E0120D78EFF025
:100F1000E490008BF08042900073E0FF120D78E0C7
:100F2000FEA200E43333333354F84528FDEE4DF090
:100F300074032F120D7A120D47FF1218DFEFF09095
:100F40000073E004F090008B7404F0900073E0D321
:100F500094704005E4900087F090007CE0FF9000E2
:100F60007BE06F70501219955005E4900085F012E7
:100F70000D44603A1219A57D207C037F017E00128A
:100F80001820120DA4900003E0FD900074E054803E
:100F9000FF900000E0C454F04FFFED4F900003F0CD
:100FA000900074E0547FF0900086E04480F0C2909E
:100FB000E4900087F0228B298A2A892B8D2CD3304C
:100FC0000001C39201E4F53E753F80F53CE53CC36A
:100FD0009530501EAB2DAA2EA92F853C82120D0DE7
:100FE000500A120C5812000392018002B201053C13
:100FF00080DBE4F53CE53CC39539506AE53B253E92
:10100000F582E4353AF583E0553F7024F53DE53D42
:10101000C395345040AB31AA32A933120D0A500A9D
:10102000120C5812000392018002B201053D80DECD
:10103000E4F53DE53DC39538501BAB35AA36A937DD
:10104000120D0A500A120C5812000392018002B2CB
:1010500001053D80DEE53FC313F53F7005053E7594
:101060003F80053C808FC2909000877405F0228FEE
:10107000268C278D28EF120C77AA06F97BFFC00378
:10108000C002C001EF75F00EA4242BF582E4341BDE
:10109000F583E493FDEF75F00EA4120DB0120C82EF
:1010A000AA068B2D8A2EF52FEF75F00EA4120D2CAB
:1010B000F530EF75F00EA4242FF582E4341B120CEA
:1010C00082AA068B318A32F533EF75F00EA4120D29
:1010D000B8F534EF75F00EA42432F582E4341B1217
:1010E0000C82AA068B358A36F537EF75F00EA412FE
:1010F0000DC4F538EF75F00EA4120DD0F539EF756B
:10110000F00EA4120D3824FF920085273A85283B63
:10111000D001D002D003020FB6C0E0C0F0C083C03F
:1011200082C0D075D000C000C001C002C003C0049E
:10113000C005C006C007E5985403F546F45298E58B
:101140004630E0171219DD9000DE1217EBEFF09039
:1011500000DEE004F0E0B44002E4F0E54630E12EC9
:101160009000E1E0D39400401A9000DDE02447F8BD
:10117000E6FF1219DA9000DDE004F09000E1E014DF
:10118000F08002D2049000DDE0B42002E4F0D00749
:10119000D006D005D004D003D002D001D000D0D0EA
:1011A000D082D083D0F0D0E03212005A787FE4F6BB
:1011B000D8FD7581960211F3020076E493A3F8E45A
:1011C00093A34003F68001F208DFF48029E493A39F
:1011D000F85407240CC8C333C4540F4420C88340B8
:1011E00004F456800146F6DFE4800B010204081087
:1011F0002040809012BDE47E019360BCA3FF543F69
:1012000030E509541FFEE493A360010ECF54C025BE
:10121000E060A840B8E493A3FAE493A3F8E493A3AE
:10122000C8C582C8CAC583CAF0A3C8C582C8CAC512
:1012300083CADFE9DEE780BEC0E0C0F0C083C082C1
:10124000C0D075D000C000C001C002C003C004C03F
:1012500005C006C007E5D85487F521F452D8E5F754
:1012600030E508E5F730E6031219E453F7DFE5212E
:1012700030E708E5D930E0031219E3E52130E00852
:10128000E5DA30E003121725E52130E108E5DB302F
:10129000E0031219E5E52130E208E5DC30E0031255
:1012A00019E6D007D006D005D004D003D002D00173
:1012B000D000D0D0D082D083D0F0D0E0324200E64F
:1012C00000004200E200004200E800004200E400AA
:1012D00000C183410086004100870041008A00412F
:1012E00000790042000100004200880000420077BF
:1012F000000041008B004100730041008500410067
:101300007A004100000048007D000000000000005D
:1013100000410076004100DE004100E0004100DCB9
:10132000004100DD004100E1004100DB00C104415B
:1013300000DF0041009A0000AE07E4F5261218BC59
:10134000900000E004FF1218C31213AB900000E0FD
:10135000FFE526C39F50141217DDE0547FFF1218DB
:10136000C31217DD1217D7052680E1900074E054F0
:101370007FFF1218C39000741217D71213ABE4F555
:1013800026900073E0FFE526C39F501774032526BF
:101390001217CB0526E526541F70E61219D712192D
:1013A000D080DE7F551218C30219D71219D712192F
:1013B000D0228E298F2A8B2B8A2C892DE4F52E9012
:1013C0000000E0FFE52EC39F505EE529C4F854F00D
:1013D000C868FCE52AC4540F48FDE52AAE29780206
:1013E000CEC313CE13D8F92DFFEE3CAB07FA120C87
:1013F000FCE0FEA3E0FFC39BEE9A50028004AE0225
:10140000AF03AA06AB07120CFCE0FCA3E0FDAF2A79
:10141000AE29121899500DAB2BAA2CA92DE52E122E
:1014200005B6D322052E8097C32275F0021207A0BD
:10143000E493FC740193FDAF27AE268F828E83AFB9
:1014400005AE04121958AB07AA06D3EB94F4EA943C
:101450000140067E017FF48004AE02AF03AA06AB12
:1014600007C3EB9464EA940050067E007F64800416
:10147000AE02AF03AA06AB07AF82AE831218992261
:10148000900076E0FDC4540F2401FBE433FAED54E0
:101490000FF96B7001EA603DE97010E0C4540F244D
:1014A00001FDE433FCED64044C602A900076E0C456
:1014B000540FFD540F120DDCEEF0A3EFF0ED04C459
:1014C00054F049900076F0E0FFC4540FC3940440F8
:1014D00004EF540FF022C0E0C083C082C0D075D0AA
:1014E00000C004C005C006C00753C87F9000E6E0F6
:1014F000FEA3E0FF4E700353C8FB9000E21216DA21
:1015000050099000E6E4F0A3F0800DC39000E7E0FE
:101510009DF09000E6E09CF0D007D006D005D00406
:10152000D0D0D082D083D0E032C0E0C083C082C0AF
:10153000D075D000C004C005C006C00753917F908D
:1015400000E8E0FEA3E0FF4E70035391FB9000E43F
:101550001216DA50099000E8E4F0A3F0800DC39071
:1015600000E9E09DF09000E8E09CF0D007D006D0C4
:1015700005D004D0D0D082D083D0E0328B268A2709
:1015800089288C298D2AD200E4F52CE52CC3952BD3
:10159000502F120D8FC4540FFF640F600B120D4FAC
:1015A000120C661200039200120D8FFF540F640F8D
:1015B000600B120D4F120C661200039200052C8076
:1015C000CAC2909000877405F022AE05AD07E4FC16
:1015D000FB7FAA1218C3AF051218C3EE75F00EA454
:1015E000240EF582E4341CF583E493FFECC39F5092
:1015F0000774082CFC0B80F4EB04FF1218BEE4FC0B
:10160000ECC39B500974032C1217CB0C80F27F554E
:101610001218C30219D78F26900079E0F5277E00B3
:101620007F187D007B007A0079671207D27F0B124A
:1016300019E043DA011200707D0A7C007F017E0010
:1016400012184912001DE4900087F0900086F09077
:10165000009AE526F0900079F0AF2722AE07E4FD6E
:10166000F5261218BC900001E0FF1218C39000018B
:101670001217D7900077E0FF1218C3900077121767
:10168000D7900088E0FF1218C39000881217D77413
:10169000032D1217CB0DBD03F67F551218C3021987
:1016A000D7AB07AA06E4F9F87F407E427D0FFC1213
:1016B000070EA804A905AA06AB077F207ED77D7573
:1016C0007C0112070EC3E49FFFE49EFE22AB07AA33
:1016D00006E4F9F87FE87E03FD22E0FCA3E0FDC309
:1016E000EF9DEE9C22ADDA900076E0FFC4540FFE31
:1016F000EF540FFFB50602C32253DAFEEF120DDCE2
:10170000E0FFA3E0CF8FF01206B3900076E0FF5425
:10171000F0FEEF044EF0540FC394044004E054F084
:10172000F08DDAD322AFFBAEFC7C007D0A1205C837
:10173000AD07AC06AFD953D9BFE4F5FAF5F98FD9A7
:10174000C3EC948050157F002093027F01EFC433D7
:10175000333354804CFEEDFF021480E4900076F0A9
:10176000229000DEE0FF9000DCE0B507057E017FFF
:1017700000229000DC1217EBE0FD7C009000DCE022
:1017800004F0E0B44002E4F09000DBE0FEEE42043E
:10179000E4F0AE04AF0522A3E493FE740193AA061D
:1017A000229000EEE0FCA3E0FDEC547FFEAF0522AA
:1017B000EC5480C4131313540124FF22E49000EC72
:1017C000F0A3F022900087E024FB22F582E43400AD
:1017D000F583E0FF0218C3A3E0FF0218C3E5262546
:1017E000E0248CF582E43400F58322E0249BF5822A
:1017F000E43400F58322AD07AC06900074E0FAA350
:10180000E0FBEA5480C41313135401700530010245
:10181000C322AF05AE04EA547FFCAD0312143B2291
:101820008E398F3A8C3B8D3C1216CD1216AE1219A2
:10183000349000E6E53BF0A3E53CF09000E2E539AA
:10184000F0A3E53AF043C804228E288F298C2A8D14
:101850002B1216CD1216AE1219409000E8E52AF0B0
:10186000A3E52BF09000E4E528F0A3E529F04391EF
:10187000042212002A1219AC1219B3121964121997
:10188000C81218F612198212196E12197812194C10
:101890001219BA1219CC0219C1C3ED9BF582EC9A48
:1018A000F583C3E5829FE5839E500FED2BFDEC3A57
:1018B000FCC3EF9DEE9C50028001C3227FAA121848
:1018C000C3AF06C2049000E0E0B42002E4F0900050
:1018D000E0E02447F8A607E004F0A3E004F0227E4D
:1018E0001DE4FDEF30E70625E06EFF8004EF25E004
:1018F000FF0DBD08EE22AF885388AF758CA0758DA3
:10190000CBEF5440FEEF54104E428822C3EF942C8C
:10191000EE94014003D38001C322121927D2039011
:101920000079E0FF021616AE071218BC7F55121898
:10193000C30219D7AD07AC06ECF5CBAF058FCA22B1
:10194000AD07AC06ECF593AF058F9222C2DE75D9D8
:101950000575F9FF75960122EF7802CEC313CE13F9
:10196000D8F9FF2275E34075E10175E20122E591A6
:1019700054045391FB429122758E547589224388F9
:101980005022E5C8540453C8FB42C82253984FEB79
:101990004F4DF59822E5C8C320E201D322E591C35B
:1019A00020E201D32253C8FB53C87F2275A41175CE
:1019B000D4CF2275A54175D5772253F77F75DA30DC
:1019C0002275E69075A8B022E4F5A922439810226A
:1019D0003004FD22C2DE22D299228F9922AF9922B1
:1019E0008F8C2222222222015E041A2A6200020027
:1019F000010100017202E412C005DC0203000101D2
:101A000000017C044C0BB8232802030001010001F3
:101A1000F403E805DC733C0302010001019004B00B
:101A20000BB81C5202030001010001C20384286E9E
:101A300002000001010000D201A41D880200000183
:101A40000100028A1E82071C0F8C000100020003A5
:101A500019E70319ED0219EF0219F102180019F341
:101A60000419FB0219FD0219FF0228001A01041AC9
:101A700009021A0B021A0D0218001A0F041A170194
:101A80001A18021A1A0247001A1C041A24021A26EB
:101A9000021A280218001A2A031A30021A32021AED
:101AA000340218011A36031A3C021A3E021A400286
:101AB0000C011A42041A4A021A4C021A4E02280059
:101AC000015E041A2A62000200010100017202E4B0
:101AD00012C005DC020300010100017C044C0BB8BC
:101AE000232802030001010001F403E805DC733C34
:101AF0000302010001019004B00BB81C5202030064
:101B000001010001C20384286E02000001010000EF
:101B1000D201A41D88020000010100028A1E820772
:101B20001C0F8C0001000200031AC0031AC6021A1F
:101B3000C8021ACA0218001ACC041AD4021AD60211
:101B40001AD80228001ADA041AE2021AE4021AE683
:101B50000218001AE8041AF0011AF1021AF30247F7
:101B6000001AF5041AFD021AFF021B010218001BDD
:101B700003031B09021B0B021B0D0218011B0F03A1
:101B80001B15021B17021B19020C011B1B041B2334
:101B9000021B25021B27022800015E041A2A62008C
:101BA0000200010100017202E412C005DC02030020
:101BB000010100017C044C0BB82328020300010141
:101BC0000001F403E805DC733C030201000101900D
:101BD00004B00BB81C5202030001010001C20384CF
:101BE000286E02000001010000D201A41D8802003D
:101BF00000010100028A1E82071C0F8C00010002F6
:101C000000031B99031B9F021BA1021BA3021800C8
:101C10001BA5041BAD021BAF021BB10228001BB3A6
:101C2000041BBB021BBD021BBF0218001BC1041B0F
:101C3000C9011BCA021BCC0247001BCE041BD602E3
:101C40001BD8021BDA0218001BDC031BE2021BE498
:101C5000021BE60218011BE8031BEE021BF0021B2D
:101C6000F2020C011BF4041BFC021BFE021C00020E
:021C700028004A
:10041000120F9B0200B09000EBE07063C2807FA0DF
:100420000204DC9000DFE060030200B0900003E013
:10043000FCA3E0FD7F017E0012190CD29612001D74
:10044000C2967FA00204DC7F030204DC9000DFE0A0
:1004500060030200B01218576019240560030200FF
:10046000B0120569900003E0FF7C007D0412108348
:100470000200B09000EBE07006C2807FA0805D803B
:10048000619000DFE060030200B01218576043245F
:100490000560030200B09000EBE014F012005E7EF5
:1004A000007F05C006C007900003E0FB25E0FFE4E5
:1004B00033FE74052FF58274003EAD82FCEB25E01F
:1004C000FFE52424FEC39FFBD007D0061211D10202
:1004D00000B09000EBE0700AC2807FA01219BA024F
:1004E00000B0E4900087F00200B0900086E030E7B2
:1004F000107FB1121491E4900086F043DA010200FB
:10050000B07B017A0079EE12177840030200B01236
:100510001834C006C0071218439200D007D0061244
:100520000C540200B07D327C007F017E0012190C59
:10053000D29612001DC29622E490008AF07FA41287
:1005400016A9900079227F017E0012190CD2961212
:10055000001DC2962212005E9000DF7404F0227B20
:10056000017A0079EE121778229000EBE014F01275
:10057000005E221216A9900079EFF022900079E037
:10058000FF1216A922900086E0547FFD12165D220C
:10059000BB010CE58229F582E5833AF583E0225020
:1005A00006E92582F8E622BBFE06E92582F8E2226A
:1005B000E58229F582E5833AF583E49322BB0106BF
:1005C00089828A83F0225002F722BBFE01F322EFD8
:1005D0008DF0A4A8F0CF8CF0A428CE8DF0A42EFE30
:1005E00022BC000BBE0029EF8DF084FFADF022E4A9
:1005F000CCF875F008EF2FFFEE33FEEC33FCEE9DE8
:10060000EC984005FCEE9DFE0FD5F0E9E4CEFD220E
:10061000EDF8F5F0EE8420D21CFEADF075F008EF99
:100620002FFFED33FD4007985006D5F0F222C39816
:10063000FD0FD5F0EA22C2D5EC30E709B2D5E4C30C
:100640009DFDE49CFCEE30E715B2D5E4C39FFFE4CA
:100650009EFE1205E1C3E49DFDE49CFC80031205AF
:10066000E130D507C3E49FFFE49EFE22C5F0F8A366
:10067000E028F0C5F0F8E582158270021583E038B5
:10068000F022BB0110E58229F582E5833AF583E08B
:10069000F5F0A3E0225009E92582F886F008E62269
:1006A000BBFE0AE92582F8E2F5F008E222E5832A9A
:1006B000F583E993F5F0A3E99322BB010A89828AC5
:1006C00083F0E5F0A3F0225006F709A7F01922BB4A
:1006D000FE06F3E5F009F3192275F008758200EFC4
:1006E0002FFFEE33FECD33CDCC33CCC58233C58264
:1006F0009BED9AEC99E58298400CF582EE9BFEED1D
:100700009AFDEC99FC0FD5F0D6E4CEFBE4CDFAE4EB
:10071000CCF9A88222B800C1B90059BA002DEC8BDF
:10072000F084CFCECDFCE5F0CBF97818EF2FFFEEBB
:1007300033FEED33FDEC33FCEB33FB10D703994074
:1007400004EB99FB0FD8E5E4F9FA227818EF2FFFB4
:10075000EE33FEED33FDEC33FCC933C910D7059BF6
:10076000E99A4007EC9BFCE99AF90FD8E0E4C9FA52
:10077000E4CCFB2275F010EF2FFFEE33FEED33FDDE
:10078000CC33CCC833C810D7079BEC9AE899400A01
:10079000ED9BFDEC9AFCE899F80FD5F0DAE4CDFB7F
:1007A000E4CCFAE4C8F922A42582F582E5F0358389
:1007B000F58322D083D082F8E49370127401937091
:1007C0000DA3A393F8740193F5828883E4737402F4
:1007D000936860EFA3A3A380DFEF4E6012EF600188
:1007E0000EEDBB010B89828A83F0A3DFFCDEFA22C7
:1007F00089F05007F709DFFCA9F022BBFEFCF309E2
:10080000DFFCA9F0228E268F27E4F528C3E5279484
:1008100064E5269400501EE4F528E528120E0BF836
:10082000E4F608F6E528120E2FE4F60528E528B4CC
:1008300008E8C2902290008AE01470030208ED04D8
:100840006003020A477867E6C4540F704CD3E5276B
:100850009494E52694115003020A47300003020ADB
:1008600047120E4718F6ED08F618120E4718F6ED67
:1008700008F6120EFBAE26FF7C007D1F1205E190EC
:10088000008CEEF0A3EFF07C007D031205CFA3EE09
:10089000F0A3EFF0A3120EFE227867E6C4540F64B3
:1008A000026003020A47A20033FF901BD6E4936F55
:1008B000C36001D3920185262A85272B752C0175EB
:1008C0002D00752E8C901BCF120E21120F87901BBE
:1008D000D1E493F532A3120E21120F91901BD4E4B0
:1008E00093F536A3E493F537E4FF020A48E4F528CC
:1008F000E528120E0BF9E7C4540F7044120E5D1276
:100900000ED8D394014011120E5D120EE4FFA20026
:10091000E4336F7003020A3B120E12F5828E83C01D
:1009200083C082120E5D120F3E120E1FF5828E835F
:10093000E493D082D08312150B4003020A3B805C03
:10094000E528120E0BF9E7C4540F7E00540FFF1276
:100950000E5D120ED8F9FDC3EF9DEE9400506712A4
:100960000E5D24C9F582E4341BF583E493FC740125
:1009700093F5828C83C083C082120E5D120F3EF508
:1009800083E493FC7401932FF582EE3CF583E493AA
:10099000D082D08312150B501A120EFBE528120ECE
:1009A0000BF8120E47FEEDFFE528120E0B120F7624
:1009B000020A3BE528120E0BF8E4F608F6E52812C9
:1009C0000E2FE4F68075E528120E0BF8E6FEEEC455
:1009D000540FFFE96F7001E47061120E5D120EE4B6
:1009E000FFA200E4336FC36001D3920185262A85FC
:1009F000272B120E12AA06752CFF8A2DF52E120E29
:100A00005D24CFF582E4341B120E1F120F87120EE5
:100A10005D120F46F532120E5D24D2F582E4341BCE
:100A2000120E1F120F91120E5D120F52F536120E9A
:100A30005D120F5EF537AF28120A480528E528C376
:100A4000940850030208F0228F29E4F538EF120EC3
:100A50002FE6701A90008B7408F07E007F707D0086
:100A60007B017A0079031207D9E490007AF0AB2C6D
:100A7000AA2DA92EC003C002C001120E09F9E7ABCE
:100A80002FAA30A931120EB6D001D002D003120F16
:100A9000065040120E09F9E77E00540FFF70032044
:100AA0000109D3EF9400EE94004030EF4E700A90AD
:100AB0000077E52AF0A3E52BF0120E09120F2A2485
:100AC00001FFEFFEEC54F04EFEEDFF120E09120F87
:100AD000768008120E09F874F056F6AB2CAA2DA9F0
:100AE0002EC003C002C001120E09120EA8AB33AA19
:100AF00034A935120EB6D001D002D003120F065021
:100B00005F120E09120EA87E00540FFF7003200121
:100B100009D3EF9400EE9400404AEF4E700A900023
:100B200088E52AF0A3E52BF0120E09120F2AC4F86B
:100B300054F0C868FEEDC4540F482401FFE43EFEA3
:100B4000EFC4F8540FC868FFEEC454F048FEED54EB
:100B50000FFDEE4CFEEF4DFF120E09120F768004D2
:100B6000120F1DF6120E09120F2AFB7A00540F7095
:100B700019ECC4F854F0C8EDC4540F48540F700A6F
:100B8000120E07120E28E4F6C322120E2DE53714BA
:100B90006670037538017E00EB540FFFE532120FCB
:100BA0007DB50719EEB50415D290120E09F874F050
:100BB00056120E2C0690008BE014F08042120E09A3
:100BC000120EA8540FFFE536120F7D6F7001EC7006
:100BD0002ED290120F1D120E2C0690008BE014F0F6
:100BE000120E8EC083C082E0FF90008BE0FE740185
:100BF000A806088002C333D8FC4FD082D083F0907F
:100C0000008BE07015120E2D120E8E120EF3FF12D5
:100C1000197FEFF090008B7408F0120E2DE6C3954B
:100C200037402F121A355005E4900085F0120EF06F
:100C30006018121A457D207C037F017E001218E3A4
:100C4000120F32A3E529F04480F0120E07120E288D
:100C5000E4F6D3228E268F27C3E5279464E52694F5
:100C6000005003020DF5900087E024FE602514700B
:100C700003020CF724036003020DFAC290AF27AE03
:100C8000261219AC4003020DFA120E7190008774FF
:100C900002F022120DFB503290007BE094044023BE
:100CA000D290E4900000F0900073F090008BF090F0
:100CB000007CF090007AF0900003F09000877403BD
:100CC000F08025E4900087F0801E900074E0547F4F
:100CD000FEA3E0FFD3E5279FE5269E4005120E7197
:100CE000800690007BE004F090007BE0C394E0502D
:100CF00003020DFA020DF590007CE004F090007BF9
:100D0000E0FFA3E0D39F4003020DA37B007A0079AC
:100D100028AF27AE2612112D4022900000E0FF12CE
:100D20000E3BE526F0A3E527F08F28900000E004B5
:100D3000F0E0D394074005E4900087F090008BE04A
:100D4000B40421A200E433C43333335480FFE528D4
:100D5000C454F04FFF900073E0120F13EFF0E490D3
:100D6000008BF022900073E0FF120F13E0FEA20050
:100D7000E43333333354F84528FDEE4DF074032F3C
:100D8000120F15120EF3FF12197FEFF0900073E0AF
:100D900004F090008B7404F0900073E0D3947040E2
:100DA000598052120DFB504D121A355005E4900037
:100DB00085F0120EF0603A121A457D207C037F0107
:100DC0007E001218E3120F32900003E0FD900074D1
:100DD000E05480FF900000E0C454F04FFFED4F90CE
:100DE0000003F0900074E0547FF0900086E04480AF
:100DF000F0C2908000E4900087F022A2009201AF40
:100E000027AE261218B922C290E52975F003A42452
:100E10006722E52875F00EA424C9F582E4341BF599
:100E200083E493FE74019322F8E4F608F6E529754D
:100E3000F003A42469F822F52FE52E25E0248CF593
:100E400082E43400F58322E6FC08E6FDECC4540F8E
:100E50002401FFEFC454F0FEEC540F4E22E5287538
:100E6000F00EA422E529252BF582E43528F583E050
:100E700022A200E433C433333354804526FFE527F0
:100E8000900074CFF0A3EFF0E490007BF022E62412
:100E9000FFFFE434FFFE7C007D0812063674032F4A
:100EA000F58274003EF58322F9E7C4F854F0C809CE
:100EB000E7C4540F4822540FF58275830012059041
:100EC00075F002A4F58285F08322853D827583004A
:100ED000120590FFC3952C2224CEF582E4341BF535
:100EE00083E4932224D6F582E4341BF583E4932231
:100EF000900085E0FF90007AE06F22900001E526E7
:100F0000F0A3E527F022120682FDACF0AF2BAE2A4B
:100F100002151C2403F582E43400F58322E52975CB
:100F2000F003A42468F8740F5622F8E6FC08E6FDE6
:100F3000EC2290007AE0900085F053DAFE2224CC77
:100F4000F582E4341B2224D1F582E4341BF583E4DA
:100F5000932224D4F582E4341BF583E4932224D530
:100F6000F582E4341BF583E4932225E0247DF582A9
:100F7000E43400F58322F8A60608A60722C39538B4
:100F8000FDE49400FCED22AA06752FFF8A30F531AE
:100F900022AA067533FF8A34F535228B298A2A89DD
:100FA0002B8D2CD3300001C39201E4F53E753F80B8
:100FB000F53CE53CC395305019AB2DAA2EA92F85E1
:100FC0003C82120ECD50051210618002B201053C28
:100FD00080E0E4F53CE53CC39539507CE53B253E9B
:100FE000F582E4353AF583E0553F701FF53DE53D68
:100FF000C395345051AB31AA32A933120ECA5005F1
:101000001210618002B201053D80E3E4F53DE53D4B
:10101000C395385031AB35AA36A937120ECA5020C5
:10102000A2019202AB29AA2AA92B75F002EF120E97
:10103000C3120682F54185F040120003920180023E
:10104000B201053D80C8E53FC313F53F7005053E7D
:10105000753F80053C020FD5C2909000877405F063
:1010600022A2019202AB29AA2AA92B75F002EFA4B1
:10107000F58285F083120682F54185F04012000367
:101080009201228F268C278D28EF120E14AA06F9C2
:101090007BFFC003C002C001EF75F00EA424CBF5A6
:1010A00082E4341BF583E493FDEF75F00EA4120F78
:1010B0003E120E1FAA068B2D8A2EF52FEF75F00E0D
:1010C000A4120ED8F530EF75F00EA424CFF582E40B
:1010D000341B120E1FAA068B318A32F533EF75F0DE
:1010E0000EA4120F46F534EF75F00EA424D2F5824B
:1010F000E4341B120E1FAA068B358A36F537EF75BE
:10110000F00EA4120F52F538EF75F00EA4120F5E18
:10111000F539EF75F00EA4120EE424FF9200852736
:101120003A85283BD001D002D003020F9B8E298F35
:101130002A8B2B8A2C892DE4F52E900000E0FFE508
:101140002EC39F40030211CFE52AAE297803CEC3F8
:1011500013CE13D8F9FDAC06E52AAE297802CEC32A
:1011600013CE13D8F92DF530EE3C120E37E0FEA366
:10117000E0FFC39530EE952F50028004AE2FAF30C4
:101180008E2F8F30120E3912185E5002802F120EE1
:1011900039E0FCA3E0FDAE047803CEC313CE13D830
:1011A000F9FBAA06EDAE047802CEC313CE13D8F92C
:1011B0002BF530EE3A120E3712185E500DAB2BAAFB
:1011C0002CA92DE52E1205BDD322052E02113AC3FE
:1011D000228E268F278C288D298B2AD200C201854A
:1011E0002982852883E05488D394004003D380016A
:1011F000C39201E4F52BE52BC3952A505930010D1C
:10120000120E64C4131313540124FF8002A200922F
:1012100002852782852683C083C082120E64FFC4A4
:101220005407D082D08312125F30010C120E64FF7B
:10123000131313541F138002A20092028527828584
:101240002683C083C082120E645407D082D08312DA
:10125000125F052B80A0C2909000877405F0227564
:10126000F0021207A7E0F540A3E0F5411200039257
:101270000022C0E0C0F0C083C082C0D075D000C0E2
:1012800000C001C002C003C004C005C006C007E51D
:10129000985403F546F45298E54630E017121A7D4B
:1012A0009000DE1218AEEFF09000DEE004F0E0B443
:1012B0004002E4F0E54630E12E9000E1E0D39400F6
:1012C000401A9000DDE02447F8E6FF121A7A9000F9
:1012D000DDE004F09000E1E014F08002D204900020
:1012E000DDE0B42002E4F0D007D006D005D004D071
:1012F00003D002D001D000D0D0D082D083D0F0D0A3
:10130000E03212005A787FE4F6D8FD758196021318
:101310004C020076E493A3F8E493A34003F6800123
:10132000F208DFF48029E493A3F85407240CC8C31F
:1013300033C4540F4420C8834004F456800146F659
:10134000DFE4800B0102040810204080901416E4B2
:101350007E019360BCA3FF543F30E509541FFEE4B7
:1013600093A360010ECF54C025E060A840B8E49379
:10137000A3FAE493A3F8E493A3C8C582C8CAC583BB
:10138000CAF0A3C8C582C8CAC583CADFE9DEE78040
:10139000BEC0E0C0F0C083C082C0D075D000C00025
:1013A000C001C002C003C004C005C006C007E5D824
:1013B0005487F521F452D8E5F730E508E5F730E633
:1013C00003121A8453F7DFE52130E708E5D930E04E
:1013D00003121A83E52130E008E5DA30E003121742
:1013E000B8E52130E108E5DB30E003121A85E5219C
:1013F00030E208E5DC30E003121A86D007D006D0D0
:1014000005D004D003D002D001D000D0D0D082D0FB
:1014100083D0F0D0E0324200E600004200E200005B
:101420004200E800004200E40000C1834100860061
:101430004100870041008A0041007900420001001C
:10144000004200880000420077000041008B00410C
:101450000073004100850041007A0041000000480F
:10146000007D000000000000000041007600410007
:10147000DE004100E0004100DC004100DD004100F1
:10148000E1004100DB00C1044100DF0041009A009F
:1014900000AE07E4F52612195C900000E004FF128C
:1014A0001963121504900000E0FFE526C39F501455
:1014B0001218A0E0547FFF1219631218A012189A94
:1014C000052680E1900074E0547FFF1219639000BC
:1014D0007412189A121504E4F526900073E0FFE5E3
:1014E00026C39F50177403252612188E0526E5265D
:1014F000541F70E6121A77121A7080DE7F55121987
:1015000063021A77121A77121A702275F002120704
:10151000A7E493FC740193FDAF27AE268F828E83E0
:10152000AF05AE041219F8AB07AA06D3EB94F4EAA0
:10153000940140067E017FF48004AE02AF03AA0648
:10154000AB07C3EB9464EA940050067E007F64808E
:1015500004AE02AF03AA06AB07AF82AE8312186BCC
:1015600022900076E0FDC4540F2401FBE433FAED31
:10157000540FF96B7001EA603DE97010E0C4540F3C
:101580002401FDE433FCED64044C602A900076E015
:10159000C4540FFD540F120F6AEEF0A3EFF0ED04E8
:1015A000C454F049900076F0E0FFC4540FC3940493
:1015B0004004EF540FF022C0E0C083C082C0D07559
:1015C000D000C004C005C006C00753C87F9000E625
:1015D000E0FEA3E0FF4E700353C8FB9000E2121739
:1015E0006D50099000E6E4F0A3F0800DC39000E791
:1015F000E09DF09000E6E09CF0D007D006D005D04A
:1016000004D0D0D082D083D0E032C0E0C083C0828A
:10161000C0D075D000C004C005C006C00753917F7C
:101620009000E8E0FEA3E0FF4E70035391FB9000B2
:10163000E412176D50099000E8E4F0A3F0800DC3A8
:101640009000E9E09DF09000E8E09CF0D007D00623
:10165000D005D004D0D0D082D083D0E032AE05AD5A
:1016600007E4FCFB7FAA121963AF05121963EE753C
:10167000F00EA424AEF582E4341CF583E493FFEC71
:10168000C39F500774082CFC0B80F4EB04FF121965
:101690005EE4FCECC39B500974032C12188E0C8082
:1016A000F27F55121963021A778F26900079E0F5C0
:1016B000277E007F187D007B007A0079671207D9AA
:1016C0007F0B121A8043DA011200707D0A7C007FC2
:1016D000017E0012190C12001DE4900087F09000AA
:1016E00086F090009AE526F0900079F0AF2722AEC0
:1016F00007E4FDF52612195C900001E0FF12196362
:1017000090000112189A900077E0FF121963900080
:101710007712189A900088E0FF12196390008812DF
:10172000189A74032D12188E0DBD03F67F551219E9
:1017300063021A77AB07AA06E4F9F87F407E427D80
:101740000FFC120715A804A905AA06AB077F207E87
:10175000D77D757C01120715C3E49FFFE49EFE222E
:10176000AB07AA06E4F9F87FE87E03FD22E0FCA3BC
:10177000E0FDC3EF9DEE9C22ADDA900076E0FFC461
:10178000540FFEEF540FFFB50602C32253DAFEEFEB
:10179000120F6AE0FFA3E0CF8FF01206BA90007636
:1017A000E0FF54F0FEEF044EF0540FC394044004E5
:1017B000E054F0F08DDAD322AFFBAEFC7C007D0A62
:1017C0001205CFAD07AC06AFD953D9BFE4F5FAF592
:1017D000F98FD9C3EC948050157F002093027F01CC
:1017E000EFC433333354804CFEEDFF021561E490B7
:1017F0000076F0229000DEE0FF9000DCE0B5070507
:101800007E017F00229000DC1218AEE0FD7C00908B
:1018100000DCE004F0E0B44002E4F09000DBE0FE25
:10182000EE4204E4F0AE04AF0522A3E493FE74019B
:1018300093AA06229000EEE0FCA3E0FDEC547FFEAC
:10184000AF0522EC5480C4131313540124FF22E487
:101850009000ECF0A3F022900087E024FB22E0FC53
:10186000A3E0FDAB30AA2FAF2AAE29C3ED9BF582D2
:10187000EC9AF583C3E5829FE5839E500FED2BFD27
:10188000EC3AFCC3EF9DEE9C50028001C322F5822E
:10189000E43400F583E0FF021963A3E0FF0219635B
:1018A000E52625E0248CF582E43400F58322E0244B
:1018B0009BF582E43400F58322AD07AC06900074FA
:1018C000E0FAA3E0FBEA5480C4131313540170053B
:1018D000300102C322AF05AE04EA547FFCAD03120F
:1018E000151C228E398F3A8C3B8D3C1217601217D3
:1018F000411219D49000E6E53BF0A3E53CF09000DE
:10190000E2E539F0A3E53AF043C804228E288F2996
:101910008C2A8D2B1217601217411219E09000E8E3
:10192000E52AF0A3E52BF09000E4E528F0A3E529F3
:10193000F04391042212002A121A4C121A53121A5E
:1019400004121A68121996121A22121A0E121A1872
:101950001219EC121A5A121A6C021A617FAA121981
:1019600063AF06C2049000E0E0B42002E4F090000F
:10197000E0E02447F8A607E004F0A3E004F0227EAC
:101980001DE4FDEF30E70625E06EFF8004EF25E063
:10199000FF0DBD08EE22AF885388AF758CA0758D02
:1019A000CBEF5440FEEF54104E428822C3EF942CEC
:1019B000EE94014003D38001C3221219C7D20390D1
:1019C0000079E0FF0216A9AE0712195C7F551219C3
:1019D00063021A77AD07AC06ECF5CBAF058FCA22D0
:1019E000AD07AC06ECF593AF058F9222C2DE75D938
:1019F0000575F9FF75960122EF7802CEC313CE1359
:101A0000D8F9FF2275E34075E10175E20122E59105
:101A100054045391FB429122758E54758922438858
:101A20005022E5C8540453C8FB42C82253984FEBD8
:101A30004F4DF59822E5C8C320E201D322E591C3BA
:101A400020E201D32253C8FB53C87F2275A411752D
:101A5000D4CF2275A54175D5772253F77F75DA303B
:101A60002275E69075A8B022E4F5A92243981022C9
:101A70003004FD22C2DE22D299228F9922AF992210
:101A80008F8C2222222222015E041A2A6200020086
:101A9000010100017202E412C005DC020300010131
:101AA00000017C044C0BB823280203000101000153
:101AB000F403E805DC733C0302010001019004B06B
:101AC0000BB81C5202030001010001C20384286EFE
:101AD00002000001010000D201A41D8802000001E3
:101AE0000100028A1E82071C0F8C00010002000305
:101AF0001A87031A8D021A8F021A910218001A937C
:101B0000041A9B021A9D021A9F0228001AA1041AA5
:101B1000A9021AAB021AAD0218001AAF041AB701D3
:101B20001AB8021ABA0247001ABC041AC4021AC62A
:101B3000021AC80218001ACA031AD0021AD2021ACC
:101B4000D40218011AD6031ADC021ADE021AE002C5
:101B50000C011AE2041AEA021AEC021AEE02280038
:101B6000015E041A2A62000200010100017202E40F
:101B700012C005DC020300010100017C044C0BB81B
:101B8000232802030001010001F403E805DC733C93
:101B90000302010001019004B00BB81C52020300C3
:101BA00001010001C20384286E020000010100004F
:101BB000D201A41D88020000010100028A1E8207D2
:101BC0001C0F8C0001000200031B60031B66021B3C
:101BD00068021B6A0218001B6C041B74021B76024D
:101BE0001B780228001B7A041B82021B84021B86BE
:101BF0000218001B88041B90011B91021B930247D3
:101C0000001B95041B9D021B9F021BA10218001BB9
:101C1000A3031BA9021BAB021BAD0218011BAF03E0
:101C20001BB5021BB7021BB9020C011BBB041BC373
:101C3000021BC5021BC7022800015E041A2A6200AB
:101C40000200010100017202E412C005DC0203007F
:101C5000010100017C044C0BB823280203000101A0
:101C60000001F403E805DC733C030201000101906C
:101C700004B00BB81C5202030001010001C203842E
:101C8000286E02000001010000D201A41D8802009C
:101C900000010100028A1E82071C0F8C0001000255
:101CA00000031C39031C3F021C41021C43021800A4
:101CB0001C45041C4D021C4F021C510228001C53E1
:101CC000041C5B021C5D021C5F0218001C61041CEA
:101CD00069011C6A021C6C0247001C6E041C76021F
:101CE0001C78021C7A0218001C7C031C82021C84D3
:101CF000021C860218011C88031C8E021C90021C08
:101D000092020C011C94041C9C021C9E021CA0024A
:021D10002800A9
:00000001FF

View File

@ -12,7 +12,8 @@ extern bool buffer_out(uint16_t *bucket);
extern void HandleRFBucket(uint16_t duration, bool high_low);
extern uint8_t PCA0_DoSniffing(uint8_t active_command);
extern void PCA0_StopSniffing(void);
extern void SendRFBuckets(uint16_t buckets[],
extern void SendRFBuckets(
SI_VARIABLE_SEGMENT_POINTER(buckets, uint16_t, SI_SEG_XDATA),
SI_VARIABLE_SEGMENT_POINTER(rfdata, uint8_t, SI_SEG_XDATA), uint8_t data_len);
extern void SendBuckets(
uint16_t pulses[], uint8_t pulses_size,

View File

@ -417,7 +417,7 @@ int main (void)
PROTOCOL_DATA[0].bit1.dat, PROTOCOL_DATA[0].bit1.size,
PROTOCOL_DATA[0].bit_count,
PROTOCOL_DATA[0].inverse,
&RF_DATA[6]
RF_DATA + 6
);
break;
@ -476,7 +476,7 @@ int main (void)
// byte 0: PROTOCOL_DATA index
// byte 1..: Data
SendBucketsByIndex(RF_DATA[0], &RF_DATA[1]);
SendBucketsByIndex(RF_DATA[0], RF_DATA + 1);
break;
// wait until data got transfered
@ -516,7 +516,7 @@ int main (void)
// byte 2*(1..k): bucket time high
// byte 2*(1..k)+1: bucket time low
// byte 2*k+2..N: RF buckets to send
SendRFBuckets((uint16_t *)RF_DATA[2], &RF_DATA[2 + RF_DATA[0] * 2], len - 2 - RF_DATA[0] * 2);
SendRFBuckets((uint16_t *)(RF_DATA + 2), RF_DATA + (RF_DATA[0] << 1) + 2, len - 2 - (RF_DATA[0] << 1));
break;
// wait until data got transfered

View File

@ -460,26 +460,23 @@ bool SendSingleBucket(bool high_low, uint16_t bucket_time)
//-----------------------------------------------------------------------------
// Send generic signal based on n time bucket pairs (high/low timing)
//-----------------------------------------------------------------------------
void SendRFBuckets(uint16_t buckets[],
void SendRFBuckets(
SI_VARIABLE_SEGMENT_POINTER(buckets, uint16_t, SI_SEG_XDATA),
SI_VARIABLE_SEGMENT_POINTER(rfdata, uint8_t, SI_SEG_XDATA), uint8_t data_len)
{
// start transmit of the buckets with a high bucket
bool high_low = true;
bool high_low_mark = false;
uint8_t i;
// check first two buckets if high/low marking is included
high_low_mark = (rfdata[0] & 0x88) > 0;
// transmit data
for (i = 0; i < data_len; i++)
{
// ignore 'F' bucket number
if (rfdata[i] >> 4 != 0x0F)
{
high_low = SendSingleBucket(high_low, buckets[(rfdata[i] >> 4) & 0x07]);
}
if ((rfdata[i] & 0x0F) != 0x0F)
{
high_low = SendSingleBucket(high_low, buckets[rfdata[i] & 0x07]);
}
high_low = SendSingleBucket(high_low_mark ? (bool)(rfdata[i] >> 7) : high_low, buckets[(rfdata[i] >> 4) & 0x07]);
high_low = SendSingleBucket(high_low_mark ? (bool)((rfdata[i] >> 3) & 0x01) : high_low, buckets[rfdata[i] & 0x07]);
}
LED = LED_OFF;
@ -577,8 +574,8 @@ bool findBucket(uint16_t duration, uint8_t *index)
for (i = 0; i < bucket_count; i++)
{
// calculate delta by the current bucket and check if the new duration fits into
delta = ((duration >> 2) + (duration >> 4));
// calculate delta by the current duration and check if the new duration fits into
delta = ((duration >> 2) + (duration >> 3));
delta = delta > buckets[i] ? buckets[i] : delta;
if (CheckRFBucket(duration, buckets[i], delta))
@ -586,6 +583,17 @@ bool findBucket(uint16_t duration, uint8_t *index)
*index = i;
return true;
}
else
{
// calculate delta by the current bucket and check if the new duration fits into
delta = ((buckets[i] >> 2) + (buckets[i] >> 3));
if (CheckRFBucket(duration, buckets[i], delta))
{
*index = i;
return true;
}
}
}
return false;
@ -650,7 +658,7 @@ void Bucket_Received(uint16_t duration, bool high_low)
}
// no more buckets are possible, reset
if (bucket_count_sync_1 == 0xFF)
if (bucket_count_sync_1 >= RF_DATA_BUFFERSIZE << 1)
rf_state = RF_IDLE;
break;
@ -659,48 +667,50 @@ void Bucket_Received(uint16_t duration, bool high_low)
case RF_BUCKET_IN_SYNC:
bucket_count_sync_2++;
// check if bucket was already received
if (!findBucket(duration, &bucket_index))
// check if all buckets got received
if (bucket_count_sync_2 <= bucket_count_sync_1)
{
// new bucket received, add to array
buckets[bucket_count] = duration;
bucket_index = bucket_count;
bucket_count++;
// check if maximum of array got reached
if (bucket_count > ARRAY_LENGTH(buckets))
// check if bucket was already received
if (!findBucket(duration, &bucket_index))
{
bucket_count = 0;
// restart sync
rf_state = RF_IDLE;
// new bucket received, add to array
buckets[bucket_count] = duration;
bucket_index = bucket_count;
bucket_count++;
// check if maximum of array got reached
if (bucket_count > ARRAY_LENGTH(buckets))
{
// restart sync
rf_state = RF_IDLE;
}
}
// fill rf data with the current bucket number
if (actual_bit_of_byte == 4)
{
RF_DATA[actual_byte] = (bucket_index << 4) | ((uint8_t)high_low << 7);
actual_bit_of_byte = 0;
}
else
{
RF_DATA[actual_byte] |= (bucket_index | ((uint8_t)high_low << 3));
crc = Compute_CRC8_Simple_OneByte(crc ^ RF_DATA[actual_byte]);
actual_byte++;
actual_bit_of_byte = 4;
// check if maximum of array got reached
if (actual_byte > RF_DATA_BUFFERSIZE)
{
// restart sync
rf_state = RF_IDLE;
}
}
}
// fill rf data with the current bucket number
if (actual_bit_of_byte == 4)
{
RF_DATA[actual_byte] = (bucket_index << 4) | ((uint8_t)high_low << 7);
actual_bit_of_byte = 0;
}
else
{
RF_DATA[actual_byte] |= (bucket_index | ((uint8_t)high_low << 3));
crc = Compute_CRC8_Simple_OneByte(crc ^ RF_DATA[actual_byte]);
actual_byte++;
actual_bit_of_byte = 4;
// check if maximum of array got reached
if (actual_byte > RF_DATA_BUFFERSIZE)
{
// restart sync
rf_state = RF_IDLE;
}
}
// same amount of bucket where received, send by uart
if (bucket_count_sync_1 == bucket_count_sync_2)
// next bucket after data have to be a sync bucket
else if (matchesFooter(duration, high_low))
{
// check if timeout timer for crc is finished
if (IsTimer2Finished())
@ -729,6 +739,12 @@ void Bucket_Received(uint16_t duration, bool high_low)
LED = LED_OFF;
rf_state = RF_IDLE;
}
// next bucket after receiving all data buckets was not a sync bucket, restart
else
{
// restart sync
rf_state = RF_IDLE;
}
break;
}
}