diff --git a/CAN/2foc/2foc-special.hex b/CAN/2foc/2foc-special.hex
new file mode 100644
index 000000000..ca633ba7f
--- /dev/null
+++ b/CAN/2foc/2foc-special.hex
@@ -0,0 +1,1911 @@
+:020000040000fa
+:080000000002040000000000f2
+:020000040000fa
+:1000080036350000163500001a3500001e35000090
+:100018002235000036350000363500003635000040
+:1000280036350000363500003635000084270000dc
+:10003800be060000363500003635000036350000b3
+:10004800002e000036350000363500003635000039
+:1000580036350000363500000a3500003635000018
+:10006800363500003a35000036350000a63200006b
+:1000780036350000363500003635000036350000cc
+:100088008221000036350000363500003635000084
+:1000980036350000363500003635000036350000ac
+:1000a8003635000036350000363500004c2b000090
+:1000b800363500003635000036350000363500008c
+:1000c800363500003635000036350000363500007c
+:1000d800363500003635000036350000363500006c
+:1000e800363500003635000036350000363500005c
+:1000f800363500003635000036350000363500004c
+:1001080036350000363500009633000036350000dd
+:10011800363500003635000036350000742f0000f3
+:10012800363500003635000036350000363500001b
+:10013800363500003635000036350000363500000b
+:1001480036350000363500003635000036350000fb
+:1001580036350000363500003635000036350000eb
+:1001680036350000363500003635000036350000db
+:1001780036350000363500003635000036350000cb
+:1001880036350000363500003635000036350000bb
+:1001980036350000363500003635000036350000ab
+:1001a800363500003635000036350000363500009b
+:1001b800363500003635000036350000363500008b
+:1001c800363500003635000036350000363500007b
+:1001d800363500003635000036350000363500006b
+:1001e800363500003635000036350000363500005b
+:0801f800363500003635000029
+:020000040000fa
+:1002080036350000263500002a3500002e3500005e
+:10021800323500003635000036350000363500002e
+:1002280036350000363500003635000084270000da
+:10023800be060000363500003635000036350000b1
+:10024800002e000036350000363500003635000037
+:1002580036350000363500000a3500003635000016
+:10026800363500003a35000036350000a632000069
+:1002780036350000363500003635000036350000ca
+:100288008221000036350000363500003635000082
+:1002980036350000363500003635000036350000aa
+:1002a8003635000036350000363500004c2b00008e
+:1002b800363500003635000036350000363500008a
+:1002c800363500003635000036350000363500007a
+:1002d800363500003635000036350000363500006a
+:1002e800363500003635000036350000363500005a
+:1002f800363500003635000036350000363500004a
+:1003080036350000363500009633000036350000db
+:10031800363500003635000036350000742f0000f1
+:100328003635000036350000363500003635000019
+:100338003635000036350000363500003635000009
+:1003480036350000363500003635000036350000f9
+:1003580036350000363500003635000036350000e9
+:1003680036350000363500003635000036350000d9
+:1003780036350000363500003635000036350000c9
+:1003880036350000363500003635000036350000b9
+:1003980036350000363500003635000036350000a9
+:1003a8003635000036350000363500003635000099
+:1003b8003635000036350000363500003635000089
+:1003c8003635000036350000363500003635000079
+:1003d8003635000036350000363500003635000069
+:1003e8003635000036350000363500003635000059
+:0803f800363500003635000027
+:020000040000fa
+:100400008fc720000e6d24000e0188000000000040
+:10041000000020000000e000020032000001200087
+:10042000200288000c00070080322100010020001b
+:1004300011000700000020000000e0000200320070
+:100440000000020000000000901702000000000001
+:100450000040da000000fe004440a90040082000ef
+:100460000000e0000300320000002000a00188002e
+:100470004440a80000000600910188008000780038
+:100480000000eb0015003700e280400032a0b4000d
+:100490009101ba00e280400032a0b4009102ba009b
+:1004a000e280400032a0b4000002eb00472bde00e7
+:1004b000f507b200602ce10004003a000059eb009f
+:1004c0008301e900fdff3e00040037006128e100e0
+:1004d000010032000082eb00040007001101ba00a5
+:1004e0000200e000e8ff3a00000006003159ba00bf
+:1004f0008301e9000c0032002159ba008301e900b0
+:10050000080032000400e00003003a00e2804000ee
+:1005100032a0b400f5ff370011d9ba008301e90019
+:10052000faff3a008100e800e180400032a0b40008
+:100530000000060094290400000000000021ef00e4
+:100540001108880020088800000006000a21ef003a
+:100550007108880090088800000006001421ef0050
+:10056000d1088800f00888001e61a900000006007c
+:1005700000088800000006005008880000000600ff
+:10058000a008880000000600c008880000000600df
+:100590003200f800023b8800910188000008bb008f
+:1005a0000500fc0051052000313b8800a10a200015
+:1005b000313b880061e7a800000000000000000057
+:1005c0003200f900000006000400a100010037001d
+:1005d0000400a0003200f8009101880011002400fe
+:1005e000013b8800f10f20003208bb000400a70087
+:1005f000b20078000198bb008301e900faff3a00dd
+:10060000680151000400a700680151006800500013
+:100610001208bb00e2ff3700f30f20003200f800a1
+:100620009101880031002400013b88000208bb00d2
+:100630000388bb00daff37003200f800003b880077
+:10064000d7ff37003200f80091018800800278005f
+:1006500062004000e08048003549ba003204e00002
+:100660000410a700100032008301e9000e003200e0
+:100670002549ba003204e0000410a7000a00320045
+:100680008301e900080032000408a300eeff3200f5
+:1006900015c9ba003204e0000410a70002003200bd
+:1006a0008301e900e8ff3a003200f900000006008b
+:1006b000889fbe008a9fbe008c1f7800b000070094
+:1006c000b700330003866c006450e1002e00320056
+:1006d0006420e100330032006150e1002f0032005d
+:1006e0006120e1003100320085855500eb07b00044
+:1006f0000900200008042000050037000804440019
+:1007000089844c000a0031000603430087834b00b4
+:100710000001530081815b00f8ff33000203be003b
+:100720000800a0000804440089844c00f6ff39004a
+:10073000c639dd0083017300010032001300200080
+:100740008904d1000884d3000998a3000500320071
+:100750000800a7000300a0008904d1000884d3008a
+:100760008b05e8008904d1000884d3000001eb0068
+:100770000281d2004700070001f0a1000cf0a700a1
+:1007800001f0a0008f0037006420e10091003200ea
+:100790000801be000200be00f7ff37006120e10043
+:1007a0008c0032006000b800f3ff3700000020002a
+:1007b00001f82700f0ff3700839f68000100e00088
+:1007c00002003d0060001000e08018000300e0001f
+:1007d00002003d0060011100e0811900b400070033
+:1007e0004f00e00002003b0060001000e0801800b5
+:1007f0000000060014002000bd003700f4ff2f00a9
+:10080000bb0037000001be00480007000470a700cd
+:1008100003f0a1006509b100160032000d0035009b
+:100820006828e10006003500f0ff2f00f1ff2700e7
+:100830000300e00013003b00010028000000050059
+:1008400000004000818048008502e900fcff3a007a
+:1008500008003700f88f420002003c008000eb00e7
+:10086000000005008100d1000080d3008502e8006f
+:10087000fcff3a000300e00002003b0060001000b3
+:10088000e0801800000006004f89de008201780039
+:10089000b200370081002000618055000b003d0050
+:1008a0000b00200061fe2f000100e1001d0034005c
+:1008b00082817100610164008904d1000884d30041
+:1008c0000000e800faff3a007100200061006400b7
+:1008d000030070000200600009003200610444005f
+:1008e000e0844c000988a500050032008b05e80073
+:1008f0006808e10002003a008904d1000884d300ae
+:10090000f20f20000258e10005003d00c75ddd0048
+:10091000f907b20089807500080078000000060021
+:100920000bf827008b00780000000500c70ade00e6
+:10093000f107b200f50fb20008003200e1cf42002b
+:10094000020032000170a00024000500810f700039
+:10095000010032000408050044000500810f70000a
+:1009600002003a00140005008502e9000000400082
+:1009700081c04800fcff3b000170a000240005007e
+:100980000004be00e9ff07000003be000405be002e
+:100990000200be00e5ff0700844f7500000006005e
+:1009a0000200be006450e100050036006420e10052
+:1009b000020036000968a30001003a000800be00ea
+:1009c0000160a0004f0678004f05be004f04be0036
+:1009d00000000600f0ff2f00f1ff2700f9ff3700ad
+:1009e000889fbe008a9fbe008c1f7800e4ff07002e
+:1009f000ebff330003866c006450e10024003200fa
+:100a00006420e100270032006150e1002200320042
+:100a10006120e100210032008b854200eb07b1002c
+:100a20000134b800003ab8000804420089844a0042
+:100a3000013ab8000030b8008880400009014a003f
+:100a4000040033000000400081804800020149009a
+:100a50008b05e900c909dd00830170000100320047
+:100a600013002000c814de004814dd004709de0032
+:100a70001200b200c808de000884700085ff07007d
+:100a800001f0a1000cf0a70001f0a000cdff37009d
+:100a90006120e100cfff32000801be000200be006d
+:100aa000f7ff37006150e100fcff3a00c9ff370053
+:100ab0006022b800060220000000d0008180d20031
+:100ac0000482d2008582d2000000a00002025200ff
+:100ad00083825a00030031000202420083824a00ee
+:100ae0000000a1000603e900f3ff3a000000060041
+:100af000889fbe008a9fbe00841f7800a0ff070069
+:100b00004f00780011003300f0ff2f00838f6c003e
+:100b100006003b00040565000a00a7000800370036
+:100b200009f0a6001000200008003700820f5400d2
+:100b3000838f5c00030039001000200001003e009c
+:100b40000000200009f0a7000000ea004f05be00e9
+:100b50004f04be000000e00000000600881f78007f
+:100b6000030478000300e00007003d00600010006f
+:100b7000e080180060011900e081190002003b00cc
+:100b800001f02d00030037000400070008f0a70063
+:100b900001f0a0004f04780000000600889fbe000e
+:100ba0008a9fbe00008270000402710004827100fe
+:100bb000260032000004be000200be006011b80032
+:100bc0006b092000950220000182cf000a00390045
+:100bd0000541b1000082cf00070039000541b10096
+:100be0000982cf00040039000541b1000882cf001e
+:100bf000010039000541b1000542520012003200e7
+:100c00000a003b0082817100610164008100d10013
+:100c10000080d3008984d3000884d3008b05e800ca
+:100c20000442e800f7ff3a000700370008044400d8
+:100c300089844c0000004800818048008b05e90051
+:100c40000442e900f9ff3a0012ff07004f05be0019
+:100c50004f04be00000006000002780002003700ca
+:100c6000315a78000201e900e00f5100fcff3a0020
+:040c7000000006007a
+:020000040000fa
+:100c7400000600000201000004050000030000005b
+:100c8400000000004a01000094020000de0300009e
+:100c94002705000070060000b907000001090000e4
+:100ca400480a00008f0b0000d50c0000190e00004c
+:100cb4005d0f00009f100000e011000020130000f1
+:100cc4005e1400009b150000d61600000f180000eb
+:100cd400461900007b1a0000af1b0000e01c000056
+:100ce4000e1e00003b1f0000652000008c21000048
+:100cf400b1220000d3230000f3240000ff7f000092
+:100d0400fb7f0000ec7f0000d37f0000b07f000079
+:100d1400837f00004c7f00000b7f0000c17e000039
+:100d24006c7e00000e7e0000a57d0000337d000077
+:100d3400b87c0000327c0000a37b00000a7b00002a
+:100d4400687a0000bc79000006790000477800004a
+:100d54007f770000ad760000d3750000ef740000cb
+:100d6400017400000b7300000c7200000471000099
+:080d7400f36f0000d96e0000ce
+:020000040000fa
+:100d7c003600f800809fbe00829fbe00849fbe009c
+:100d8c00869fbe00889fbe008a9fbe008c1f780085
+:100d9c000400fa00440f2000240288009a11070076
+:100dac001654800026538800355480003553880033
+:100dbc0034002000110009000403d80010548800ee
+:100dcc000603ea0005035300110009000403d800d0
+:100ddc0020548800110009008402d8003054880087
+:100dec00e4a9200014427800614262008004eb0008
+:100dfc000b00320084a1200014427800e04f520016
+:100e0c0004003200e0a3200054090700800478009d
+:100e1c000300370040150700800478004953880010
+:100e2c00a90f070000457800e4a9200014427800bf
+:100e3c006242620005003200731007000082fb0062
+:100e4c00a563280065447a0004003700c80320001d
+:100e5c00110009008804d8000044e800f4aa20001e
+:100e6c0014427800884f5200c1003200e4a92000df
+:100e7c0014427800704262000f003200e416070042
+:100e8c0084a1200014427800e04f52000a003a007e
+:100e9c0064608000800f520006003a00e4aa200033
+:100eac0014427800884f520003003200626ca80094
+:100ebc000100370060608800e4a92000144278002b
+:100ecc006142620049003200e4a92000144278001b
+:100edc006242620045003200cd160700546080006b
+:100eec00800f520006003a00e4aa20001442780059
+:100efc00884f520003003200626ca80001003700da
+:100f0c0050608800e14f540013003a00f4aa20000e
+:100f1c0014427800e64f52000f003a007e824400e3
+:100f2c008455880075162000850f52004503340047
+:100f3c0064eb2f00090242008455880061c0b300a5
+:100f4c00e0aa20000148780013c0b300f2aa2000e8
+:100f5c000349780039003700e64f540010003a007e
+:100f6c00f4aa200014427800e14f52000c003a0021
+:100f7c007e8254008455880039033b00a414200061
+:100f8c00090242008455880016c0b300e5aa20006f
+:100f9c00864a780060c0b300afeab700680037003b
+:100fac00f4aa200014427800844f54000900340045
+:100fbc007e8244008455880075162000850f5200ef
+:100fcc000a00340064eb2f000902420084558800ab
+:100fdc00060037007e8254008455880003003b00d5
+:100fec00a41420000902420084558800f1aa2000b4
+:100ffc0091407800e2aa200001497800f3aa200071
+:10100c00884978000802fb00cfa2de006102520082
+:10101c00e0825a00e50f5200e08f5a0054003e0067
+:10102c000460010005003700110037001d00370077
+:10103c0029003700350037004100370024a8200074
+:10104c00b4558800c4ab20001456880044a8200076
+:10105c00a4558800a4ab20000456880064a8200086
+:10106c009455880084ab2000f4558800400037006c
+:10107c0024a82000b4558800c4ab20001456880066
+:10108c0064a82000a455880084ab20000456880076
+:10109c0044a8200094558800a4ab2000f455880087
+:1010ac003300370044a82000b4558800a4ab2000be
+:1010bc001456880064a82000a455880084ab200036
+:1010cc000456880024a8200094558800c4ab200046
+:1010dc00f45588002600370044a82000b455880039
+:1010ec00a4ab20001456880024a82000a455880026
+:1010fc00c4ab20000456880064a8200094558800d6
+:10110c0084ab2000f45588001900370064a8200037
+:10111c00b455880084ab20001456880024a8200005
+:10112c00a4558800c4ab20000456880044a82000b5
+:10113c0094558800a4ab2000f45588000c003700af
+:10114c0064a82000b455880084ab20001456880095
+:10115c0044a82000a4558800a4ab200004568800a5
+:10116c0024a8200094558800c4ab2000f4558800b6
+:10117c000804fb0024002000110009000404d8001e
+:10118c0001467800e4a92000144278006242620013
+:10119c0017003200e5a9200095427800e1c26200f8
+:1011ac000002eb00200032008455800004825400c1
+:1011bc00350b2000850f5200020034008416b1005c
+:1011cc0004003700c5f42f00850f520001003d00cc
+:1011dc008416b000fe0f420001003d0024fe2f00db
+:1011ec00fe0f520006003400e4012000040037001a
+:1011fc00c4032000110009008404d8007e82500032
+:10120c00e00f520008003d000402ea000402420014
+:10121c0005682800e5047a002564280065047a0036
+:10122c000804ea00050037000402420005682800a3
+:10123c00e5047a002564280065047a00e04f560026
+:10124c0028003200b5558000a455800015037800a5
+:10125c00140053000980b90096558000960378005d
+:10126c0008b9b900c11bdd004f11de00028173000b
+:10127c00cf99de00e2bf9f00f3bf9f00d3ff2f008a
+:10128c00efbb970003b9b900c10bdd004f00de00c6
+:10129c0000807300cf88de00800341003755880042
+:1012ac001603780009b3b900950278001482520035
+:1012bc0008a2b9004138dd004f33de000603700090
+:1012cc00cfbbde000603ea00c128dd004f22de00a2
+:1012dc0004827000cfaade0004025300445588003b
+:1012ec0022003700b5558000a45580001501780008
+:1012fc00140051000980b900965580001601780041
+:10130c000891b900c11bdd004f11de000281730092
+:10131c00cf99de006311b900c10bdd004f00de0078
+:10132c0000807300cf88de008003410037558800b1
+:10133c001603780009b3b9009502780014825200a4
+:10134c0008a2b9004138dd004f33de0006037000ff
+:10135c00cfbbde00c128dd004f22de00048270000e
+:10136c00cfaade00040253004455880084a120005b
+:10137c0014427800e04f5200c0003a0004c0200034
+:10138c00144278006a425200e14f52008b003e003a
+:10139c00e04f5500b90032002555800064508000a4
+:1013ac000482520005c0200095427800ebcf520019
+:1013bc0054003a00025280000052800000004200ab
+:1013cc00cf80de00165280002752800006004000bd
+:1013dc008780480002015200cf91de00441bdd00e3
+:1013ec00cc13de00870373004413dd0000014300bf
+:1013fc0081814b00125288002352880030518000aa
+:10140c001652800027528000cf80de00860f5000dd
+:10141c00878f580005003d0036518000cfb3de00a9
+:10142c0016528800275288000d003700305180007a
+:10143c0016528000275280000000ea00cf80de00a8
+:10144c00860f5000878f580005003400260aee00e6
+:10145c0000037800cfb3de001652880027528800b4
+:10146c00e5c0200095427800e0cf52002100320008
+:10147c001652800027528000e00f5300e08f5b0073
+:10148c000e003400f051800016528000275280006c
+:10149c00cf80de00860f5000878f580002003d0081
+:1014ac003e2aec0043003700165280002752800081
+:1014bc00f65188000e6cef003e003700f0518000b2
+:1014cc001652800027528000cf80de00860f50001d
+:1014dc00878f5800020034003e2aed00350037009b
+:1014ec001652800027528000f65188000e6cef00d7
+:1014fc00300037001652800027528000f6518800c9
+:10150c002c00370020608000025280000201520043
+:10151c000091b9003560800000528000000042004c
+:10152c000580b900d6518000e751800002004000d0
+:10153c00838048000001430081814b00d251880018
+:10154c00e3518800d0518000e1518000e6528000c8
+:10155c00f7528000860f5000878f5800050034002a
+:10156c00e6528000f7528000d6518800e75188007f
+:10157c000f003700e0528000f1528000d6518000fd
+:10158c00e751800060001000e0801800860f5000ca
+:10159c00878f580006003400e6528000f752800016
+:1015ac0060031300e0831b00d6518800e7518800cc
+:1015bc003e2aef00045288003000370004c020009f
+:1015cc0014427800e64f520013003a003a2aef001a
+:1015dc003c2aef00a20af8003e0af900f5518000ff
+:1015ec0034518000848f520003003400260af80026
+:1015fc003e0af9002100370035518000f45180007b
+:10160c008502ea00848f52001c003400260aee008a
+:10161c00f05188001900370005c020009542780071
+:10162c0004c5b30084cf520011003a000655800067
+:10163c0065a5200095427800cfb3de008502fb0043
+:10164c00e58252000600be00050178000201e900a7
+:10165c00030033000000400081804800fbff37008e
+:10166c00d0518800e15188003e2aef00030037007a
+:10167c003a2aef003c2aef003e2aef0004c020007b
+:10168c0014427800eb4f52000800320004c02000d6
+:10169c0014427800e64f52000400320084a120006e
+:1016ac0014427800e04f52003a003200f5518000ad
+:1016bc0034558000048252009252800035528000d2
+:1016cc008502520002a9b900a05280003552800058
+:1016dc008502420000a8b900765180008751800035
+:1016ec0002004000838048000001430081814b00d0
+:1016fc0072518800835188003452880076518000e2
+:10170c0087518000c4528000d5528000840f530052
+:10171c00858f5b0005003400c4528000d5528000d8
+:10172c0074518800855188000f003700c652800024
+:10173c00d7528000745180008551800060031300e3
+:10174c00e0831b00840f5300858f5b000600340080
+:10175c00c4528000d552800060021200e0821a0050
+:10176c0074518800855188007a5180008b5180001b
+:10177c0064a52000144278000402fb000402e90076
+:10178c00030033008b85d1000a85d300fbff3700a3
+:10179c007c0037003555800034518000848f520016
+:1017ac000300340014002000545288000500370058
+:1017bc0034558000260aee00800f520001003d00d7
+:1017cc004aaaef0054528000e00f5200530032003e
+:1017dc0054528000e10f52001f003a003551800036
+:1017ec0034558000048252009052800032528000a6
+:1017fc00020152000091b900a552800030528000c5
+:10180c00000042000580b90096518000a75180006d
+:10181c0002004000838048000001430081814b009e
+:10182c0092518800a3518800345288009451800052
+:10183c00a5518000e00f5200e08f5a0028003500bf
+:10184c00322aef00342aef000002eb0054528800d9
+:10185c00345288002200370054528000e10f4200bd
+:10186c001f003a0035518000345580008502ea0093
+:10187c0004825200905280003252800002015200c9
+:10188c000091b900a5528000305280000000420047
+:10189c000580b90096518000a751800002004000dd
+:1018ac00838048000001430081814b0092518800e5
+:1018bc00a35188003452880094518000a5518000b7
+:1018cc00e00f5200e08f5a0005003c00322aef0076
+:1018dc00342aef000002eb00545288003452880086
+:1018ec00d6518000e75180009a518000ab518000a6
+:1018fc0064a52000144278000a0543008b854b0038
+:10190c000402fb000402e900030033008b85d100c4
+:10191c000a85d300fbff37001a00370005c02000f2
+:10192c009542780004c5b30084cf52000b003a00f6
+:10193c00da518000eb51800064a52000144278003d
+:10194c000402fb000402e900030033008b85d10084
+:10195c000a85d300fbff37000a003700da518000fc
+:10196c00eb51800084c02000144278000402fb007c
+:10197c000402e900030033008b85d1000a85d300f3
+:10198c00fbff3700a80aee009652800042528000fe
+:10199c00020150000691b900a4528000465280000a
+:1019ac000603400004b3b900b4518000c551800057
+:1019bc000203430083834b000601420087814a00e7
+:1019cc00b2518800c351880040528800b651800043
+:1019dc00c7518000c4528000d5528000840f530040
+:1019ec00858f5b0005003400c4528000d552800006
+:1019fc00b4518800c55188000f003700c6528000d2
+:101a0c00d7528000b4518000c55180006003130090
+:101a1c00e0831b00840f5300858f5b0006003400ad
+:101a2c00c4528000d552800060021200e0821a007d
+:101a3c00b4518800c5518800b6518000c751800050
+:101a4c0065a52000954278008502fb000600be00cb
+:101a5c00050178000201e900030033008180d10008
+:101a6c000080d300fbff37008005780024032000a2
+:101a7c00f7ff270016032000050037000402e900d9
+:101a8c0003003a0072eca8009d1207000700370013
+:101a9c00150e8000e08f520004003d00130e8000f4
+:101aac0083826300868f5200f4ff3600146080003e
+:101abc00e00f520006003400022ced001460800090
+:101acc00e00f520002003a00712ca8008c120700a3
+:101adc006a53880009d3b90008d8b900410add005f
+:101aec004f00de0000007200cf88de00d5ff2f0013
+:101afc000582b9004138dd004f33de00060370006b
+:101b0c00cfbbde000602420008d0b90009dbb900e9
+:101b1c004139dd004f33de0006037100cfbbde0020
+:101b2c00cf8cde00c109dd004f04de00088471009b
+:101b3c0008044300e04f5600010032000804ea009c
+:101b4c0015568000880a5200f5558000880a44001a
+:101b5c000402ea0005568000880a5200c255800033
+:101b6c00d1558000e0558000b00a0700e4a92000a0
+:101b7c00144278006442620027003a0064558000e9
+:101b8c000402e80064558800f30f52002200340070
+:101b9c00ac2aef00305580003455800000a0b9000d
+:101bac001651800027518000f450800005518000b0
+:101bbc0006035000878358004638dd004a33de00a8
+:101bcc0006037000cabbde000601420087814a0092
+:101bdc00f250880003518800f450800005518000b9
+:101bec00e00f5200e08f5a0002003d001e2aef0069
+:101bfc00202aef00f650800007518000d45080005e
+:101c0c00e5508000840f5300858f5b000200340088
+:101c1c00722ca8003a1207008480a9000080fa00f8
+:101c2c004f0678004f05be004f04be004f03be00a8
+:101c3c004f02be004f01be004f00be003600f9003f
+:101c4c0000400600f3aa200093417800e4aa20008b
+:101c5c00034a7800f5aa2000884a7800f7fc370080
+:101c6c00f7aa200097437800e0aa200007487800e4
+:0c1c7c00f1aa20008848780031fd3700f4
+:020000040000fa
+:101c8800e6874700889fbe008a9fbe008c9fbe00e3
+:101c98008e1f7800104278008049eb00e94f52000f
+:101ca8000b003a008002eb00e2cf50005f023a00de
+:101cb80064c1200014427800e04f52005b023200f9
+:101cc80010409000b6120700150020005702370098
+:101cd800e74f52000b003a008002eb00e1cf5000c2
+:101ce80052023a000449780001c02000914078006f
+:101cf8001141980024c0b3008449780015002000e1
+:101d08004a02370035c3b300854f52000c003a0031
+:101d18008002eb00e1cf500044023a0034c3b30024
+:101d28000449780074c120001442780014419800d6
+:101d380024c0b30084497800150020003b02370016
+:101d480025c3b300854f52003a003a008002eb00e9
+:101d5800e2cf500035023a0004c020001442780057
+:101d6800e04f52000500320006c0200016437800fc
+:101d780004cbb300844f53002c023a00104090006b
+:101d880017ecb7001f13070017ccbf00d80e0700c9
+:101d98000002eb0083042000a2b62000000025000a
+:101da8001100200025fa0700220424000000250065
+:101db80011002000f4f9070074c1200014427800d3
+:101dc8000482fb0005002000545b8800655b8800e6
+:101dd80016c0b300a5ba2000864a7800ab6bef00a6
+:101de800c4aa2c00645d880002042000a1b620006b
+:101df8000080eb00f21107006102b800745d8800f2
+:101e0800855d880003042000a2b62000000025009c
+:101e180011002000eaf9070003042000a2ba2000fc
+:101e28000004250011002000e5f907001500200036
+:101e3800fe01370085c4b300854f520029003a00df
+:101e480064c12000144278008002eb00e04f520089
+:101e5800f6013200e5cf50000d003a00a040900096
+:101e6800c808dd00104290000482fb008102720065
+:101e780024002000110009008402d80002e2240096
+:101e8800850078003210070015002000e7013700b0
+:101e98008002eb00e8cf5000e4013a007041900066
+:101ea8004811dd00604290000482fb0002017200cc
+:101eb800d0409000c808dd00404290000482fb003a
+:101ec80081007200b0429000c82add0020429000d4
+:101ed8000482fb00050072001d1007001500200099
+:101ee800d201370095c7b300854f52000f003a0062
+:101ef80064c12000144278008002eb00e04f5200d9
+:101f0800ca013200e3cf5000c8013a00a042900055
+:101f1800c82add00104290000482fb000500720010
+:101f2800a412070015002000c001370075c7b300d0
+:101f3800854f52003a003a008002eb00e6cf50008d
+:101f4800ba01360064c1200014427800e04f520004
+:101f5800b6013200104290000482fb00e5a920007f
+:101f68009542780004437800e5a92000864a780065
+:101f7800f4a92000144278009f6aef0020429000e4
+:101f88000482fb00b0429000c82add00850272007e
+:101f980095628800404290000482fb00d042900085
+:101fa800c82add0085027200a562880060429000a0
+:101fb8000482fb000402d10004437800a5c5200078
+:101fc800864a7800a4628000e10f420005003a00ca
+:101fd8009ecaa80016c0b300b5c52000864a78007e
+:101fe800020037009ecaa9005b6cef004402200083
+:101ff800e8cf500002003a00704290000482fb00d3
+:10200800c4628800e4a9200014427800614262009a
+:1020180015002000850132009e8aa900830137003f
+:10202800b5c5b300854f520024003a008002eb008a
+:10203800e3cf50007d013a00204390009042900089
+:102048000002eb00e1cf520004003a0066c0b20083
+:102058000682fb000402e9004f22de008442780079
+:1020680061c120008548780084c0b30084497800a5
+:10207800b5c5b300054978001441980034c0b300d1
+:102088002441980034419800b4c1b30044419800f9
+:1020980014c0b3005441980064c0b3006441980070
+:1020a80066c12000164378007641980064c120007c
+:1020b80014427800150020005c01370055c6b300b3
+:1020c800854f52006a003a0064c12000144278002b
+:1020d8008002eb00e04f520054013200e8cf50007c
+:1020e8000e003a0070419000c0409000c808dd0022
+:1020f800304290000482fb0081007200a0429000f0
+:10210800c82add00104290000482fb00050072001e
+:102118009510070015002000440137008002eb00ed
+:10212800e6cf500041013a0010429000e14f5200c2
+:10213800040032008002eb00e24f52003b013a00fb
+:102148000500370010029000a0029000246188006a
+:10215800356188000400370010029000a00290004a
+:102168000461880015618800246180003561800061
+:10217800f4b79f0085bf9f000c6180001d6180003f
+:102188000401be000c00be009af90700e00f5000e1
+:1021980003003c007fb597008fbd97000100370012
+:1021a8000c05be000200200003f823000a00be0050
+:1021b8008ef90700e00f50000c0035001e002000cb
+:1021c800150020000e28dd00cf80de00acf90700e6
+:1021d8000004be000001be000a00be0083f907002b
+:1021e800e00f50001d003d000300370008002000ec
+:1021f80009f823000007eb00f4c0b3000e475200b3
+:1022080002002000037024000c00be00f2f9070051
+:102218000801be0024f9070078f907000005be0090
+:1022280002002000037024007fb097008fb8970049
+:10223800e9f907000801be001bf907006ff907005c
+:102248000002be000e4178008a0078000400780081
+:102258004510070015002000f40037000e07e800bd
+:10226800f00f5700d6ff3a008002eb00ef0037006e
+:1022780095c6b300854f52006a003a0064c1200039
+:10228800144278008002eb00e04f5200e700320071
+:10229800e8cf50000e003a0070419000c040900016
+:1022a800c808dd00304290000482fb008100720003
+:1022b800a0429000c82add00104290000482fb0072
+:1022c800050072003a10070015002000d7003700fb
+:1022d8008002eb00e6cf5000d4003a001042900094
+:1022e800e14f5200040032008002eb00e24f52003e
+:1022f800ce003a000500370010029000a0029000be
+:10230800e4608800f560880004003700100290003f
+:10231800a0029000c4608800d5608800e460800056
+:10232800f5608000f4b79f0085bf9f00cc608000f7
+:10233800dd6080000401be000c00be002df907001e
+:10234800e00f500003003c007fb597008fbd970059
+:10235800010037000c05be000200200003f823002e
+:102368000a00be0021f90700e00f50000c003500fc
+:102378001e002000150020000e28dd00cf80de00a2
+:102388003ff907000004be000001be000a00be00bd
+:1023980016f90700e00f50001d003d00030037004c
+:1023a8000800200009f823000007eb00f4c0b30080
+:1023b8000e47520002002000037024000c00be00eb
+:1023c80085f907000801be00b7f807000bf90700f8
+:1023d8000005be0002002000037024007fb09700b3
+:1023e8008fb897007cf907000801be00aef8070017
+:1023f80002f907000002be000e4178008a0078004a
+:1024080004007800ea0f0700150020008700370055
+:102418000e07e800f00f5700d6ff3a008002eb00e5
+:1024280082003700f74f52001b003a008002eb0091
+:10243800e5cf50007d003a0064c1200014427800c6
+:10244800e04f52007900320004c0200014427800a6
+:102458006a425200e14f520074003e00a0429000d0
+:10246800c82add00104290000482fb0005027200b9
+:10247800245588002455800026558000150020002a
+:1024880004002800840f530068003a000402e800a2
+:10249800245588006500370025c7b300854f5200d2
+:1024a80020003a008002eb00e3cf50005f003a00c2
+:1024b80064c1200014427800e04f52005b003200f3
+:1024c80006c020001643780004c5b300844f5300ab
+:1024d80056003a00a0429000c82add001042900041
+:1024e8000482fb000502720004558800055580002f
+:1024f80004402600848f52000300340004558800ed
+:1025080015002000490037000655800015002000fe
+:1025180004c02900840f530044003d00045588007e
+:1025280042003700d5c6b300854f520021003a005b
+:102538008002eb00e5cf50003c003a0064c1200067
+:1025480014427800e04f52003800320004c02000e6
+:1025580014427800e64f520034003a00a04290003e
+:10256800c82add00104290000482fb0005027200b8
+:10257800145588001555800034518000848f52000e
+:1025880004003400260af800a20af9001500200009
+:102598002600370014558000260aee00150020009a
+:1025a800800f520021003d00260aee0010558800d9
+:1025b8001e003700e5c6b300854f520013003a00ed
+:1025c8008002eb00e1cf500018003a0054c0b3007d
+:1025d80084497800e4c6b300044978000202780010
+:1025e80026aa200016437800066a780031aa20003f
+:1025f80091407800114298000042eb004441980055
+:102608003441980015002000080037008002eb00d4
+:1026180006c7b300864f520004003a0051c0b2000a
+:102628008182fb008502e900cf2ade0005007800e0
+:102638004f0778004f06be004f05be004f04be008e
+:082648006f00b1000000060064
+:020000040000fa
+:10265000000a0000dc00000000000000000c000088
+:102660001600000002000000b0b2ff00ff0c0000e6
+:1026700010000a0000ff7f00ff7f010000ff7f00c5
+:10268000c4ff3c0000000000e0460000080000001d
+:1026900000000000740c00000200000000000000b8
+:1026a000b20b000032000000020000000000000039
+:1026b000000000000002000002010200ff02020010
+:1026c0000200ff000202010002ff010000020200fe
+:1026d000020202000202000001ff020001020200e9
+:1026e000ff0002000202ff000201020000000000e1
+:1026f000dc0a00008e000000000000006e0c0000ec
+:102700000600000000000000660c00000800000049
+:1027100000000000760c0000020000000200000033
+:1027200001000000280c00000e0000000000000066
+:10273000160c000012000000000000006a0b0000f0
+:10274000480000000200000001000000000000003e
+:102750000000000000000000000000000000000079
+:102760000000000000000000000000000000000069
+:102770000000000000000000000000000000000059
+:102780000000000000000000000000000000000049
+:102790000000000000000000000000000000000039
+:1027a0000000000000000000360c00000e000000d9
+:1027b000000000000008000000020000020000000d
+:1027c00000002100104220006330840040a550002a
+:1027d000c660e7007008810029914a00a16bb10032
+:1027e0008cc1ad00d1cee100eff13100121002003a
+:1027f0007332520022b552009442f70072d6620042
+:1028000039931800837bb3005aa3bd00d39cc30047
+:10281000fff3de00e36224004334200004011400cf
+:10282000e664c70074a4440085546a00a54bb50053
+:102830002885090095eee500cff5ac00c58dd500e3
+:1028400053367200261116003006d70076f6660061
+:102850009556b400465bb7007aa7190097388700f1
+:10286000dff7fe00e79dd700bcc7c40048e558006d
+:102870008668a70078400800611802002823380005
+:10288000ccc9ed00d98ee900aff9480089699900fb
+:102890000aa92b00b9f55a00d44ab7007a966a0003
+:1028a000711a50000a333a00122afd00dbdccb001b
+:1028b000bffb9e00eb799b00588b3b00bb1aab0023
+:1028c000a66c87007ce44c00c55c22002c033c0015
+:1028d000600c41001caeed008ffdec00cdcddd00a5
+:1028e0002aad0b00bd688d00499d97007eb66e0035
+:1028f000d55ef4004e133e00322e51001e700e00c5
+:102900009fffbe00efdddf00fccf1b00bf3aaf0032
+:10291000599f78008f889100a981ca00b1eba1006e
+:102920000cd12d00c14ef1006fe1800010a100001c
+:10293000c230e3002004500025404600706760006c
+:10294000b983980093fba300dab33d00c31cd30006
+:102950007fe35e00f3b102009012f30022d2320056
+:1029600035421400527762005672ea00b5cba500da
+:10297000a8958900856ef5004fe52c00d50dc500a2
+:10298000e234c30024a0140081046600744764008c
+:102990002454050044dba700fab7990087b89700d4
+:1029a0005fe77e00f71dc7003cd7d30026f2360054
+:1029b0009106b0001657660076761500463456002c
+:1029c0004cd96d00c90ef9002fe9c80099e98900ba
+:1029d0008ab9ab00a944580065480600782768000a
+:1029e000c018e10008823800a3287d00cb5cdb0022
+:1029f0003feb1e00fbf98b00d89bbb00ab9abb00e2
+:102a0000754a54005a376a00167af1000ad01a0043
+:102a1000b32a92003a2efd000fed6c00dd4dcd0083
+:102a2000aabd8b00ade89d00c98d26007c076c0017
+:102a3000645c45004ca23c00832ce0001cc10c00ef
+:102a40001fef3e00ff5dcf007cdf9b00afbabf00f1
+:102a5000d98ff8009f176e00367e55004e745e00c9
+:102a6000932eb2003ed10e00f01e0000e40b0000d9
+:102a70001c00000000000000004700008000000073
+:102a800000000000804700008000000000000000ff
+:102a9000440c00000e00000000000000520c00007a
+:102aa0000a0000000200000000005a0000000000c0
+:102ab00000000000000000005c0c00000a000000a4
+:082ac00000000000000000000e
+:020000040000fa
+:102ac8000600fa00889fbe008a1f78004a2cef0093
+:102ad800b4b82f000408780006a2a9000602a800ce
+:102ae80004902100346288000602ab0007013a0016
+:102af800b80037000402e900030032000602ab0008
+:102b0800fcff3a00b30037003462880074ff2f00de
+:102b180054628800780037000402e900030032009c
+:102b28000802ab00fcff3a00b000370034628800ae
+:102b380064ff2f00546288006f0037000602e90026
+:102b4800060032000403780041108000818263008f
+:102b5800faff3a0034628800aa003700346288001d
+:102b680054ff2f005462880063003700f40f2000e0
+:102b7800a4bf9f00b4bf9f00c4bf9f00ee81570051
+:102b88008000eb0002902100f78f2100f8fd2f0054
+:102b98000662a80000000000326288000822ab002c
+:102ba800ce0032009d0037000602e9000400320022
+:102bb800040378000822ab00fbff320096003700c0
+:102bc8003462880034ff2f00546288004a003700be
+:102bd8000602e90005003200040378000682ab0013
+:102be800fbff3a00346288009d0037003462880099
+:102bf80024ff2f00546288003f0037004fba970027
+:102c0800f90f52000e003a00afba9700c82add004b
+:102c18003fba970005027200f5ff2700850f5200a2
+:102c280004003a00e4fe2f0054628800482cec00af
+:102c38001300370004087800482cef001000370014
+:102c4800482cec00f00f520005003a00c4fe2f009b
+:102c58005462880094d82f000408780026003700b2
+:102c680064e82f0004087800d4fe2f00546288001e
+:102c780021003700482cec00f4fe2f005462880035
+:102c88004562800044062000848f5200780034009a
+:102c9800b4fe2f005462880094d82f00900f1200c1
+:102ca8000500320064e82f00900f12000200320085
+:102cb800a4c82f00040878000662a9000642a800ec
+:102cc80004902100346288000642ab007b003a0081
+:102cd8006d0037000602e9000400320004037800a2
+:102ce8000642ab00fbff3a006600370034628800fa
+:102cf80014ff2f00546288004e2cec0007e2a90054
+:102d0800c902a90004fe2f00856c2000950a620004
+:102d1800cf02a8000004eb0029002000faef2f00e2
+:102d2800110009000904d800618260004822dd0012
+:102d380056168000860265008502720055168800c6
+:102d480000192000010020002b0e07000804e800ed
+:102d5800f30f5400f2ff3a0007e2a8000019200020
+:102d680001002000240e070004fe2f00612020002f
+:102d7800910862000642a80004902100346288008d
+:102d88000642ab0049003a00420037000602e9005b
+:102d980004003200040378000642ab00fbff3a004f
+:102da8003b0037003462880004ff2f00546288001b
+:102db80016c0b300c5c42000864a78004504070041
+:102dc800506280004f0578004f04be000080fa0072
+:102dd80000000600340d2000141088000490210023
+:102de800346288000802ab0045003a0004902100d4
+:102df800346288000400240041108000010262004f
+:102e08003a003a00040028004510800005026200dc
+:102e180056ff320097ff37003462880006108000a2
+:102e280086297800010278000410a20004f0a700a7
+:102e38000402ea000402e9004f22de004522dd0018
+:102e48003610800086026400850272003510880002
+:102e58000682a800326288000682ab001b003a0096
+:102e68008100e800e38f500049ff3a0063ff370014
+:102e78000662a9000642a800049021003462880076
+:102e880091ff37003462880050628000cdff370020
+:102e9800346288000019200001002000d60d0700c8
+:102ea8000c04070050628000c6ff3700f48f210031
+:102eb8003462880004037800b7ff3700f48f2100dc
+:102ec800346288000403780085ff37003762880081
+:102ed800070278000703780040ff37003762880050
+:102ee800070278000703780032ff3700f48f2100cb
+:102ef80034628800040378000700240012ff3700ba
+:102f0800f48f21003462880005ff3700f48f210018
+:082f180034628800f9fe370065
+:020000040000fa
+:102f20000400fa00889fbe008a9fbe00c90a0700fd
+:102f3000550b0700ad0c0700a4002000345088009a
+:102f40001d0607008660a9009660a8004f0e0700c6
+:102f5000540e07009460a80080a720000300090019
+:102f60000058eb00626cef000001eb006000b8005d
+:102f7000f90b0700d70d0700bf0b0700e00f50004b
+:102f800002003200042aef00faff370004aaef0023
+:102f9000620e0700800c0700e400200005002000fe
+:102fa000a4bf9f00b5bf9f000002eb0043002000bc
+:102fb0006c8157000000250011002000a1f50700da
+:102fc0009760a8004ff097001e0d0700e4a92000ad
+:102fd000144278000042eb00e5a92000844a780002
+:102fe000f5a920009542780084427800f0a92000dd
+:102ff0000548780064c1200014427800e04f520078
+:10300000fcff3200e4a92000144278006142620013
+:1030100004003a00e4a920001442780062426200f1
+:10302000f4ff320034518000e00f5200f1ff320013
+:10303000c4528000d5528000e00f5200e08f5a0049
+:10304000ecff3200e4a920001442780061426200e3
+:1030500004003a00e4a920001442780070426200a3
+:103060000a003200e2a92000124178004311de007c
+:1030700061016100a1c5200091407800906280004c
+:103080008180fb005a070700020037008b40a9002f
+:103090009b40a900186aef00628ca900e4a92000f7
+:1030a00014427800624262000b0032009e4aa9007e
+:1030b000a0c520001040780062c0b3000440bc00ee
+:1030c000cf91de00000020001100200078f60700fc
+:1030d000420e070010003700e4a9200014427800d7
+:1030e0006442620003003200420e07007050880004
+:1030f000010037000e2aef00e4a9200014427800f6
+:10310000614262000400320016c0b30085a12000b5
+:10311000864a7800628ca80082c0200012417800a4
+:103120003160800020608000a30c0700000e0700c3
+:10313000006cef0004a02000650920003502980013
+:103140008082eb0025029800800207000005eb005a
+:1031500009cab3006b092000470b0700e00f5000bd
+:103160000b003200a4aa200014427800e04f520065
+:1031700001003200b70d070000c0200009487800a8
+:1031800006aaef00e4012000245088000e0037005a
+:10319000c262ab000c003200700ca800a4aa200090
+:1031a00014427800e04f520001003200a90d0700e0
+:1031b000006cef0004a020003b0298008082eb002e
+:1031c00025029800e4ff3700700ca90004c020001d
+:1031d00014427800e04f52000700320004c0200083
+:1031e00014427800894f520003003200f90d0700a5
+:1031f000900d0700820c070064518000840f550079
+:10320000d5ff32006a51800018c0200018447800b1
+:1032100004c0200014427800894f520011003a0087
+:10322000e94f5400ccff3a00bc0d0700ef0b07003c
+:103230000042eb0025c62000844a780084427800d2
+:1032400000c020000548780004a020003b02980040
+:103250008082eb0025029800843e200014608800e4
+:10326000bdff370004c0200014427800e04f520038
+:1032700011003a00e64f540007003200ea4f5400b4
+:1032800005003200eb4f54000300320004c5b300c8
+:10329000844f5400b0ff3a000840780000ecb700bb
+:1032a000062aef0004aaef00843e20001460880084
+:1032b000460d0700a8ff370004c020001442780024
+:1032c000e64f52000d00320004c020001442780086
+:1032d000ea4f52000900320004c020001442780076
+:1032e000eb4f52000500320005c0200095427800e7
+:1032f00004c5b30084cf520097ff3a00e04f54005a
+:1033000002003200e94f540007003a00510d070057
+:10331000006cef0004a020003b0298008082eb00cc
+:10332000250298008cff3700e64f5400070032005a
+:10333000ea4f540005003200eb4f54000300320006
+:1033400004c5b300844f540083ff3a00920b07007a
+:10335000843e2000146088008842780004c0200069
+:08336000054a78007cff3700ec
+:020000040000fa
+:10336800889fbe0080047800e4a9200014427800f9
+:10337800624262000000eb0000013a0084a12000d4
+:1033880014427800e04f5200fc003200b662800020
+:103398006333b90024002000110009000403d80099
+:1033a8000004780084a1200014427800e24f520003
+:1033b8000f003c0014c6200014427800e04f520071
+:1033c8000b003200b5c52000954278000042eb00a2
+:1033d80084cf52000100320034c0b3008442780028
+:1033e80081a1200085487800628ca9008b0d070018
+:1033f80084a1200014427800e14f52001c003a00da
+:1034080055518000865680002400200011000900d4
+:103418008402d800860f5000030034000603e80039
+:10342800865688001200370094568000840f540096
+:103438000a003400455680008502e8004556880099
+:10344800860c2000868f520009003400c82aef003d
+:103458000402e800945688000500370084f82f001d
+:10346800a4608800122cef0020c0b30018eab7004f
+:1034780084a1200014427800e24f520017003a005d
+:10348800945680000804ea00840f54000a003d00a6
+:10349800355680008502e80035568800860c2000e5
+:1034a800868f52000d003400c62aef000402e9009e
+:1034b80094568800090037000004eb0088568800fd
+:1034c800880c7800624ca800728ca8000d0c0700cc
+:1034d8000842780081a120008448780084a1200057
+:1034e80014427800e34f520012003a00d20af80062
+:1034f800100cf9008456800055518000850f520049
+:1035080003003d000402e8008456880009003700e3
+:10351800245680000402e800245688000571220021
+:10352800850f52000300340046c0b30085a1200077
+:10353800864a780084a1200014427800e44f5200a3
+:1035480014003a0080608000140cb4009056880083
+:10355800545680000402e80054568800055327009a
+:10356800850f52000b003600e4628000b0628000d4
+:10357800250f800000abb90011000900443bd800ba
+:1035880070568800ca2aef0056c0b30085a12000f3
+:10359800864a780084a1200014427800e54f520042
+:1035a80069003a0080608000120cb40090568800d0
+:1035b800545680000402e8005456880005a62e00e0
+:1035c800850f520060003600d02aef00e4628000c8
+:1035d800b0628000250f800000a9b9001100090021
+:1035e8004419d80000017800625688007656800099
+:1035f80006025100350b2000850f520003003400ed
+:103608008416b100850f5200fdff3c00c5f42f0061
+:10361800850f520003003d008416b000850f52004c
+:10362800fdff35008403780007f0a7008703ea0050
+:10363800a5052000858f53002e00340025002000aa
+:10364800110009000502d8000002780006024200b5
+:1036580075162000850f5200030034008416b1004f
+:10366800850f5200fdff3c00e00f520002003d00b4
+:103678008416b000feff33000653880012538800fa
+:1036880085608000a505b000a0608000120cb40021
+:1036980026002000110009000600d80080824200a0
+:1036a80004825200a4628800a5628000741620007b
+:1036b800848f52000500340080e92f00542cb40098
+:1036c800a5628000848f5200fbff3c00a46280004a
+:1036d800e00f520005003d0080162000542cb40075
+:1036e800a4628000e00f5200fbff3500186aef006b
+:1036f8001500370094608000e00f52000900320086
+:103708000002eb009460880085f82f00a56088000f
+:103718005456880045c0b30081a120008548780030
+:10372800090037000004eb0088568800880c7800f0
+:10373800628ca90062aca800728ca800710b07000b
+:103748000840780018eab70081568000810c78009c
+:103758009056800074162000840f50000300340037
+:103768008016b100840f5000fdff3c00e00f5000b0
+:1037780002003d008016b000feff33004f04be007b
+:043788000000060037
+:020000040000fa
+:10378c000003be003064ab000b003200048020004c
+:10379c008021800000026200070032003264ab001e
+:1037ac00050032000480200091218000010262009b
+:1037bc000080eb00e1003a003064ab0038003a00c6
+:1037cc0003027800824078000601be0000702400dd
+:1037dc00a804070084be2000000aeb00140290002d
+:1037ec00e20f52000d003c00655f8000e28f52003a
+:1037fc000a003c00765f8000e20f530007003c009b
+:10380c0087be20000402e800940398008502e800bb
+:10381c00a50398000603e800b603980084be2000b8
+:10382c0014437800e3426300e3826200c6ff2f007a
+:10383c0080218000800363008783720087218800c9
+:10384c00a4439000e3836300c83bdd00f5cf2f0059
+:10385c00812180000180620000807300802188003b
+:10386c00c4439000e3836300902180000003630055
+:10387c000683730096218800644290006302620004
+:10388c004822dd0091218000818262008502720055
+:10389c00952188003064a8000000eb00a7003700d9
+:1038ac0004802000852180000502620036003a0069
+:1038bc0003027800824078000601be0000712400eb
+:1038cc006c040700ea2bef00445f8000e20f52000b
+:1038dc000c003c00655f8000e28f520009003c0048
+:1038ec00765f8000e20f530006003c0087be20008c
+:1038fc00840be8008502e800a50398000603e800a5
+:10390c00b603980084be200014437800e3426300a1
+:10391c00e3826200c6ff2f008021800080036300d9
+:10392c008783720087218800a4439000e38363009f
+:10393c00c83bdd00f5cf2f008121800001806200a3
+:10394c000080730080218800c4439000e3836300ef
+:10395c009021800000036300068373009621880089
+:10396c0064429000630262004822dd0091218000d5
+:10397c008182620085027200952188003164a80062
+:10398c000000eb006d0037003264ab0036003a00eb
+:10399c0003027800824078000601be000072240009
+:1039ac0034040700ec2bef00445f8000e20f520060
+:1039bc000c003c00555f8000e28f520009003c0077
+:1039cc00765f8000e20f530006003c0087be2000ab
+:1039dc00840be8008502e800950398000603e800d4
+:1039ec00b603980084be200014437800e3426300c1
+:1039fc00e3826200c6ff2f008021800080036300f9
+:103a0c008783720087218800a4439000e3836300be
+:103a1c00c83bdd00f5cf2f008121800001806200c2
+:103a2c000080730080218800c4439000e38363000e
+:103a3c0090218000000363000683730096218800a8
+:103a4c0064429000630262004822dd0091218000f4
+:103a5c008182620085027200952188003264a80080
+:103a6c000000eb003500370003027800824078003c
+:103a7c000601be0000732400fe030700ee2bef00ce
+:103a8c00445f8000e20f52000c003c00555f800048
+:103a9c00e28f520009003c00665f8000e20f530089
+:103aac0006003c0087be2000840be8008502e8007d
+:103abc00950398000603e800a603980084be200036
+:103acc0014437800e3426300e3826200c6ff2f00d8
+:103adc008021800080036300878372008721880027
+:103aec00a4439000e3836300c83bdd00f5cf2f00b7
+:103afc008121800001806200008073008021880099
+:103b0c00c4439000e38363009021800000036300b2
+:103b1c000683730096218800644290006302620061
+:103b2c004822dd00912180008182620085027200b2
+:103b3c00952188003364a8000000eb00000006000b
+:020000040000fa
+:103b4c00881f780034558000c0c3200004487800da
+:103b5c004822de0084427800d2c320000549780058
+:103b6c0064508000e6c32000044b78004822de003d
+:103b7c0084407800f0c32000014878004450800055
+:103b8c005550800002c42000044978004823de0010
+:103b9c000640780041ecb70021c42000854878002d
+:103bac00482ade000443780035c42000864a780099
+:103bbc0036ccbf000080fb004400dd000080a0007c
+:103bcc00cf80de00c3c3200082c0b300ecfe070030
+:103bdc00e4a92000144278000444b20036003200fc
+:103bec0036ccbf000080fb00440620000482b900e4
+:103bfc00451f200084824200d461800018c0b300ad
+:103c0c00ea0f5200040034006a835200860f5200ff
+:103c1c0001003d000044eb000402e800d461880080
+:103c2c00848f520058003c003a2cef00a4628000b4
+:103c3c00c7c32000844b78004822de008442780001
+:103c4c00d2c3200005497800240f8000e6c3200071
+:103c5c00044b78004822de0004417800f1c32000b8
+:103c6c00824878000453800005c42000844a780000
+:103c7c004822de008440780017c42000814b780075
+:103c8c001453800022c42000044978004822de002e
+:103c9c008443780036c42000074b78004400dd00d4
+:103cac009010b300cf80de00c3c3200082c0b300ed
+:103cbc00b3fe070034003700e4a92000144278005a
+:103ccc000442b2003200320036ccbf000080fb0050
+:103cdc00440620000482b900451f20008482420063
+:103cec00c461800018c0b300ea0f52000400340015
+:103cfc006a835200860f520001003d000044eb0025
+:103d0c000402e800c4618800848f52001e003c004d
+:103d1c00382cef0054628000e1c320008448780006
+:103d2c004822de0004437800f5c32000864a780060
+:103d3c00c4c42000144278000402fb0007c4200015
+:103d4c00844b78004822de008442780012c42000a4
+:103d5c00054978007462800026c42000044b78006a
+:103d6c004822de000441780031c4200082487800eb
+:103d7c004400dd009010b300cf80de00c3c32000f0
+:103d8c0082c0b3007efe0700e04f54004e003a00a4
+:103d9c0044a1200014427800e04f52001800320079
+:103dac000044eb00c4c32000084a7800d6c32000ae
+:103dbc00084b780074508000e0c320000448780061
+:103dcc004822de0084427800f2c3200005497800c6
+:103ddc0036ccbf000080fb004400dd00c010b300f7
+:103dec00cf80de00c3c3200042c0b30064fe0700d6
+:103dfc008843780046a12000074b7800320037003a
+:103e0c0001c0200091407800c2c320000149780015
+:103e1c0024c6200014427800d5c32000844a7800c0
+:103e2c00d6518000e751800065a5200095427800ae
+:103e3c008502fb00e58252000600be0005017800f9
+:103e4c000201e900030033008180d1000080d3001f
+:103e5c00fbff37003eecb7004802de0084407800e0
+:103e6c00f0c320000148780002c7200012417800fe
+:103e7c0004c42000024a780015c72000954278003f
+:103e8c0016c42000054b780027c720009743780004
+:103e9c0020c420000748780031c7200091407800ea
+:103eac0032c420000149780036ccbf000080fb00f2
+:103ebc004400dd003010b300cf80de00c3c320000f
+:103ecc0082c0b3002efe07004f04780000000600ed
+:020000040000fa
+:103edc004a2cef0006a2a9000602a80004902100bb
+:103eec00346288000602ab0093003a004e003700a3
+:103efc000402e900030032000602ab00fcff3a00aa
+:103f0c0049003700346288004aacef0044003700a7
+:103f1c000402e900030032000802ab00fcff3a0087
+:103f2c004700370034628800e4ff2f005462880099
+:103f3c003b0037000402e900040032004710800007
+:103f4c0087026300fbff3a004300370034628800ad
+:103f5c00d4ff2f0054628800310037000402e900be
+:103f6c00040032004710800087026300fbff3a0018
+:103f7c003f00370034628800c4ff2f005462880071
+:103f8c00270037000402e900030032000802ab00ee
+:103f9c00fcff3a003c00370034628800b4ff2f006d
+:103fac00546288001e0037000402e900040032004d
+:103fbc004710800087026300fbff3a00380037008f
+:103fcc0034628800a4ff2f0054628800140037006c
+:103fdc000402e900040032004710800087026300ed
+:103fec00fbff3a00340037003462880094ff2f0046
+:103ffc00546288000a0037000602e900050032000e
+:10400c00040378000642ab00fbff3a0034628800e0
+:10401c00030037003462880084ff2f00546288004c
+:10402c005062800000000600240d2000141088004f
+:10403c0004902100346288000802ab003b003a0077
+:10404c000490210034628800040024004510800094
+:10405c000502620031003a000490210034628800ad
+:10406c0004002800471080000702620027003a0075
+:10407c009401200014108800049021003462880000
+:10408c000802ab001e003a00049021003462880044
+:10409c0004002400451080000502620014003a0060
+:1040ac00049021003462880004002800471080002e
+:1040bc00070262000a003a000662a9000642a80044
+:1040cc0004902100346288000642ab00d4ff320019
+:1040dc00f48f21003462880004037800c9ff370094
+:1040ec00f48f21003462880006002800baff3700e4
+:1040fc00f48f21003462880006002400acff3700e6
+:10410c00f48f210034628800a0ff3700f48f210067
+:10411c00346288000600280092ff3700f48f2100db
+:10412c00346288000600240084ff3700f48f2100dd
+:10413c003462880078ff3700f48f210034628800e5
+:04414c006dff3700cc
+:020000040000fa
+:10415000e6874700889fbe008a9fbe008c9fbe00f6
+:104160008e1f78000007eb008e538800ae53880046
+:1041700021e3a8006044b8000805be000dfe2f0032
+:104180008c3e200084322000148a66002003a9009f
+:104190002023a80040062000010020001809070085
+:1041a0002023a9000002eb00030037000402e8000e
+:1041b0008c0f5200460032002003ab00fbff3200a0
+:1041c0000518800085bf9f004619800006826600a2
+:1041d0000400a000441988002003a9002023a8009f
+:1041e0004006200001002000050907002023a90047
+:1041f0000c027800020037000402e90036003200a9
+:104200002003ab00fcff320004188000f4b79f00cd
+:1042100045198000058266000410a000441988003a
+:104220002003a9002023a800400620000100200050
+:10423000f30807002023a9000002eb000300370069
+:104240000402e8008c0f5200250032002003ab006e
+:10425000fbff320004188000001880007509070079
+:1042600074072000840f50001f0036000fbb97001a
+:104270006132b9000a0542008b854a007fb397007e
+:104280006132b9000804420089844a000e07e80040
+:10429000840c2000840f5700baff3a00820c2000e3
+:1042a000030020000a00be0043f10700805388008d
+:1042b000820c2000030020000800be003ef1070031
+:1042c000a053880021e3a9000000eb00070037009d
+:1042d0000080eb00050037000080eb000300370092
+:1042e0000080eb0001003700e0ff2f004f0778004f
+:1042f0004f06be004f05be004f04be006f00b10068
+:0443000000000600b3
+:020000040000fa
+:104304003600f800809fbe00829fbe00849fbe00de
+:10431400869fbe00889fbe008a9fbe008c9fbe0001
+:104324008e1f7800ea8747008700a9001c00200040
+:104334000e7824004a208000fa03b2001d002000f9
+:104344008a6edd00052180000d8262004a00320081
+:104354004455dd000e054500ca459000ef85650013
+:10436400e88f550002003400738ca8008b002000f5
+:104374009a42780061c26200230032005a449000dd
+:104384000884fb004244de000884fb00090020008e
+:1043940004002000050028000404740085847400cf
+:1043a4002a4290000482fb003a4390006f036300aa
+:1043b4004833dd000603720007002000463add00a2
+:1043c400ca32de00850272004632dd000404740045
+:1043d400858474001a4278008482fb00c22ade00bd
+:1043e4001a4290007f0262004622dd0004827200bd
+:1043f40005002000c222dd00040020000404740033
+:1044040085847400080037009a4278000582fb0016
+:104414004222de001a4490007f0464004644dd001a
+:104424000804720009002000e60045000b01780032
+:104434006880570007f207008d86ea000d21880086
+:104444005a4290006242620002003200734ca8009b
+:1044540005003700e88157000b4178000800be00d2
+:10446400345f8000040001000c06e800e60f5600eb
+:10447400b0ff3a0003003700e50f560001003a0090
+:10448400710ca800af00b1004f0778004f06be00c2
+:104494004f05be004f04be004f03be004f02be00d6
+:1044a4004f01be004f00be003600f9000040060078
+:020000040000fa
+:1044b400889fbe000044eb0009f0230064c620007e
+:1044c400084a7800d421ef00606380006500400052
+:1044d400cf80de00490807006a0cf800da01f90011
+:1044e400da01f800d801f900d801f800d601f90082
+:1044f400c1e1a8008be0a9009be0a80074002000a3
+:10450400840e880014002000a40e880064c62000d5
+:1045140014427800e04f520039003a006063800092
+:10452400a00fb000cf80de003408070064c620006e
+:1045340014427800e04f520031003a005400200049
+:10454400a40e880064c6200014427800e04f520094
+:104554002b003a0060638000a00fb000cf80de0023
+:104564002608070064c6200014427800e04f520079
+:1045740023003a0054012000a40e880064c62000e1
+:1045840014427800e04f52001d003a00606380003e
+:10459400a00fb000cf80de001808070064c620001a
+:1045a40014427800e04f520015003a00d421ef0085
+:1045b40064c6200014427800e04f520010003a0014
+:1045c4006063800065004000cf80de000b080700b8
+:1045d40064c6200014427800e04f520008003a00fc
+:1045e400a90e880064c6200014427800e04f5200ef
+:1045f40003003a00766cef0010c0b3000b003700e4
+:1046040064c72000084a780074c620001442780069
+:10461400e04f520004003200803e200001002000e0
+:10462400f6070700a5ff37000040eb004f04be006b
+:04463400000006007c
+:020000040000fa
+:10463800889fbe00000478008103780044638000ee
+:10464800880f52000b003d0004bab90011000900a0
+:10465800482ad80080037800446380000491b90098
+:10466800110009004819d8000001780004047800f6
+:104678000e0037008402ea00850f54000b003d004d
+:104688008802ea0004bbb90011000900453bd800c4
+:1046980080037800446380000491b9001100090088
+:1046a8004519d800000178000404ea00446380003a
+:1046b800848f53000b00340004c2b90011000900b4
+:1046c800472ad80000047800446380000491b900a8
+:1046d800110009004719d800000178008403780008
+:1046e8000e0037008402ea00858f53000b003d005e
+:1046f8008702ea0004c4b90011000900454cd8003b
+:1047080000047800446380000491b9001100090096
+:104718004519d800000178008403ea00446380004a
+:10472800840f51000b00340004c2b90011000900c5
+:10473800422ad800000478004463800004bbb90012
+:1047480011000900423bd80080037800040178007a
+:104758000e0037008402ea00850f51000b003d006f
+:104768000201ea0004c2b90011000900422ad80077
+:10477800000478004463800004bbb90011000900fc
+:10478800423bd800800378000401ea0054638000ab
+:1047980004004400b00e880084804300c10e8800e5
+:1047a80004014100d20e88004f04be00000006003c
+:020000040000fa
+:1047b8000002eb00240588002505800005c0a00044
+:1047c80005d0a10005e0a100250588003405880072
+:1047d800350580000500a1006500b3003505880097
+:1047e80044058800450580000580a0000590a100cb
+:1047f80005a0a00045058800450580000540a000eb
+:104808000550a1000560a000450588004505800009
+:104818000500a0000510a1000520a000450588009e
+:1048280054058800f5cf2f00560580008682620067
+:1048380005a0a00055058800550580000540a10089
+:104848000506b300550588006405880065058000e5
+:1048580005c0a00005d0a00005e0a00065058800ff
+:104868007405880084058800c5ff2f008605800030
+:10487800868262000520a00085058800f5ff2c00cf
+:10488800860580008682620005e0a0008505880014
+:1048980094058800a4058800f58f2f00460b20009a
+:1048a800168b6200f5ff2c00a60580008682620048
+:1048b80005e0a000a5058800b4058800b5058000be
+:1048c8000500a0000510a1000520a000b50588007e
+:1048d800d405880004068800050680000530b3006a
+:1048e80005a0a100050688001406880015068000aa
+:1048f80005c0a00005d0a00005e0a00015068800ae
+:1049080024068800340688004406880081e0a9004f
+:044918000000060095
+:020000040000fa
+:10491c00889fbe008a9fbe008c9fbe000082eb0069
+:10492c00855f8000ef8f52004d003e00faff2f0094
+:10493c00fbff29000383650007002000c036dd0063
+:10494c000c0020006113b8000606760087867600fe
+:10495c000182650005002000c024dd000800200055
+:10496c006102b80004047400858474008a0f560038
+:10497c008b8f5e002e003200f2cbbf008082fb00da
+:10498c004240a90012003400a65f8000b75f80008f
+:10499c0044bf20000005eb008c0f53008d8f5b0093
+:1049ac0005003a00240037005403be008c0f53005e
+:1049bc008d8f5b00040032000a05e800850f55005e
+:1049cc00f9ff350002003700e10f45001b003a00eb
+:1049dc00e4ff2f00e34f500021003200c22add001b
+:1049ec0044bf2000050242000c8abe000045e800ce
+:1049fc0024bf20000a4a78000a85fb00cf68de003d
+:104a0c00f4ff21000d02620005002000c021dd0032
+:104a1c00020020006162b800040171008581710000
+:104a2c004f4ade000a007800de030700030037005f
+:104a3c003a002000010037000005eb00805f800089
+:104a4c000002e800845f8800cf48de008a0278000c
+:104a5c00f40020000801be00d70207000002eb00a2
+:104a6c00040078004f06be004f05be004f04be0088
+:044a7c000000060030
+:020000040000fa
+:104a8000881f7800e00f5100e08f590023003d009f
+:104a9000f5c3b3008543610025002000853bdd00a0
+:104aa00050439000634363000743730056409800ef
+:104ab000c61bde004a1cdd004613de000603740040
+:104ac000f8ff200006036400264098004833de000b
+:104ad0003044900007cfb3008743640006c37300df
+:104ae000364098004219de00f67f20000201630084
+:104af00002037800f603b2008532dd004611de00c5
+:104b00009043900006ceb30006c3630002417300d9
+:104b10001240980063c8720017003700f57f20002c
+:104b20000281620002037800f603b2002500200033
+:104b30000533dd004611de009043900005ceb30042
+:104b400085c2630002c1720012409800d0429000fa
+:104b5000e3c26200554098008042eb002540980077
+:104b6000b043900005cfb30085c263003540980084
+:104b7000c5cfb30005486300d04290000510a100e6
+:104b8000554098006fc36000c043900005cfb3004c
+:104b900085c2630086c272004540980066004000ee
+:104ba0000181fb00840078002bf007004f0478009f
+:044bb00000000600fb
+:020000040000fa
+:104bb40080427800004aeb000000eb00efcf520087
+:104bc40042003a00843e20001460880074c1200032
+:104bd400144278000482fb00840242000281fb003c
+:104be400828f520039003c008402e9008582420031
+:104bf40061c37a000683fb00858040001142900067
+:104c04004822dd000402730005c0200095427800ac
+:104c1400e6cf52001400320005003e00e0cf5200ff
+:104c240027003200e2cf520026003a000800370085
+:104c3400eacf520023003900ebcf520004003600c3
+:104c440006c5b30086cf52001e003a00120037009a
+:104c540005002800850f520001003a0014002800c6
+:104c6400245588001700370035518000850f520005
+:104c7400020034003451800005003700260aee009b
+:104c8400800f520002003d00260aee000002780068
+:104c9400145588000b00370005c02900850f520009
+:104ca40001003d000502780005402600850f5200f2
+:104cb4000100340005027800045588000100370023
+:104cc40034050700a0fb07001000200000000600c8
+:020000040000fa
+:104cd400e4a92000144278006142620004003a0012
+:104ce400e4a92000144278007042620032003200cd
+:104cf400d0020700c5568000c056880084a1200059
+:104d040014427800e04f520005003200082aef00f8
+:104d14000a2aef000000eb006050880032003700e0
+:104d2400465080005750800005005000cf80de00c0
+:104d34000002430081824b00445088005550880093
+:104d4400d45680000402e800d45688000040eb00ea
+:104d5400f40f520024003a00da2aef006650800073
+:104d64004050800051508000a4568000b556800009
+:104d740004025000858258000603e800cfb3de0029
+:104d84000402430085824b004f2bde0006024200e2
+:104d9400e0824a008582d1000482d30064508800f6
+:104da4004450800055508000a4568800b5568800b1
+:104db40010c0b3000c003700e4a9200014427800ae
+:104dc400624262000040eb00804f52000600320055
+:104dd400f00607004050880051508800eb0307009c
+:0c4de400605088000040eb00000006005a
+:020000040000fa
+:104df000889fbe00010478008242780004c620002b
+:104e0000054a7800f48f2f00051e2000950a6200e5
+:104e1000e1e1a900e1a1a900e00f500004003d007c
+:104e2000e0e1a8000000ea00e0628800020037002c
+:104e3000e0e1a900e0628800e4628000c0628000d6
+:104e4000cf80de00cfa2de00048bb90000a9b9003c
+:104e5000060341000400b8008100430002e1200085
+:104e60000300200054ee0700f06288008416200042
+:104e700004c4b900b8628800e0c1a900e301a80039
+:104e8000e2e1a800140f80000440a1000450a0003b
+:104e90000460a100140f8800140f80000490a0008b
+:104ea00004a0a000140f8800e421ef008b40a900ab
+:104eb000e041a800e46280000402e900340f8800a9
+:104ec00004c6200014427800e04f52000700320070
+:104ed000040f80000480a1000490a00004a0a000a2
+:104ee000040f88009b40a80005003700040f8000d5
+:104ef0000430b30004a0a000040f88009b40a90068
+:084f00004f04be000000060092
+:020000040000fa
+:104f08003600f800809fbe00829fbe00849fbe00ce
+:104f1800869fbe00db040700c00007003e040700b0
+:104f2800e4a9200014427800644262003000320094
+:104f38000400280035108000050262002c003200b1
+:104f4800446180000402e80044618800f40f5200c4
+:104f580027003400282cef00e0a02000d8f6070036
+:104f6800f50f400004003a0015c0b30006c5200044
+:104f7800054b780011003700e00f50000f003a0091
+:104f88007550800084508000848f520002003400e5
+:104f9800122aec0009003700755080008450800008
+:104fa800848f520005003d000002eb0094508800f9
+:104fb8008442780006c52000054b78009550800093
+:104fc80044062000848f520004003c0004c52000e1
+:104fd80014427800e04f52000200320014c720004b
+:104fe8001442780015c0b30046a12000054b780094
+:104ff8008460a9004f03be004f02be004f01be00ef
+:0c5008004f00be003600f900004006001a
+:020000040000fa
+:10501400881f7800581680005516800054168000aa
+:105024004922de00614262000804d1006404640085
+:10503400c72ade00e282620005447400044474005e
+:1050440002003200e74f540006003a000044eb002f
+:1050540024ae2000084a7800708ca8002a050700b6
+:105064002a003700e2cabf00884f500026003200f1
+:1050740072c0b3000440bc000882fb00040041007d
+:1050840024bb200064427800e24f520006003a003c
+:105094000044eb0026ae2000084b780070cca8003a
+:1050a4001905070019003700e14f520009003a00c2
+:1050b400e4568000cfa2de00f65680000757800039
+:1050c4000603420087834a00f65688000757880083
+:1050d4000a003700e14f420008003a00e45680001d
+:1050e400cfa2de00f656800007578000040253006a
+:1050f40085825b00f45688000557880027ae20009f
+:10510400884b78000100370000447800084078009c
+:085114004f04780000000600c2
+:020000040000fa
+:10511c00881f78008a9fbe000004a8008082fb00d4
+:10512c0005834200060343000744200007034300a5
+:10513c008683e800e0cf50000800320063846100f1
+:10514c0068044400421dde000b002000c550dd0049
+:10515c00010b4400820b7800030037004511dd0081
+:10516c00020b7800800beb008741200006422000e8
+:10517c00e34f50000f003600e44050002642200060
+:10518c00e3cf50000b003600e8405000a741200050
+:10519c0046422000e3cf5000060036006c40500021
+:1051ac0066422000e34f5000020036008003eb0003
+:1051bc0007037800638062004200dd00f1002000ec
+:1051cc000008dd008080ea0096806000008b700093
+:1051dc00e24f520009003e00678362000603430061
+:1051ec00300020000600dd000080ea00170060009f
+:1051fc000482fb000623dd00860b700010002000eb
+:10520c000500dd001424b7000004a9004f05be0002
+:08521c004f04780000000600b9
+:020000040000fa
+:10522400846180009561800061024200e0824a004e
+:1052340084618800956188006461800075618000e4
+:1052440061034200e0834a00666188007761880058
+:1052540034508000e00f520003003200e10f42009e
+:1052640006003a00030037001400200014508800a0
+:1052740010003700022aef000e003700345080007f
+:1052840005002000840f5300858f5b000900350062
+:105294002c2cef002e2cef0004a020009402900090
+:1052a40005f0a7008502ea008502e900cf2ade00a6
+:1052b4001502980024508000e00f520003003200d1
+:1052c400e10f420006003a000300370014002000fa
+:1052d4000450880012003700002aef001000370045
+:1052e40026508000070020008461800095618000c2
+:1052f400840f5300858f5b0009003c00302cef00c5
+:10530400322cef0004a020009402780005f0a700de
+:105314008502ea008502e900cf2ade00050a78004a
+:04532400000006007f
+:020000040000fa
+:105328000a00fa00889fbe008a9fbe000004be00e3
+:1053380082407800030078000042eb00e4f79f0009
+:105348000a702000080565000b002000485add009f
+:105358004855de000a057200c85dde00e14f5500c1
+:105368000800320003003900e74f550011003a00e9
+:105378000c003700ea8157007281570040f207009d
+:105388000d003700ef4264006a825700f28157002f
+:1053980001417800800078000540780003fe07008e
+:1053a80005003700ea81570072815700560207004e
+:1053b800010037000000eb00e00f50000f00320042
+:1053c800eff09700e0cf50000c0032006705650051
+:1053d8004855dd0074c12000144278000482fb00a7
+:1053e8004422dd000a057200080fb2004440de00c6
+:1053f8000000750072815700400507004f05be0088
+:0c5408004f04be000080fa000000060007
+:020000040000fa
+:1054140010018000801f780020018000801f780028
+:1054240030018000801f780000378200700ab500c8
+:1054340080027800745380001301c0000400cd0082
+:105444001454880010378200740ab50000037800f1
+:10545400b75380001301c6000400cd003454880003
+:105464004f007800300188004f0078002001880048
+:105474004f00780010018800000006001001800031
+:10548400801f780020018000801f78003001800098
+:10549400801f780000378200700ab500800278000f
+:1054a400745380001301c0000400cd00145488001c
+:1054b40010378200740ab50080027800945380008b
+:1054c4001301c0000400cd00245488004f0078006c
+:1054d400300188004f007800200188004f007800d8
+:0854e400100188000000060021
+:020000040000fa
+:1054ec00042080000480a0000490a10004a0a1006e
+:1054fc0004208800060e20000502200007208000f2
+:10550c0007026300850f5200fcff3a00f48f2f0056
+:10551c0005402000950a6200050e20000620800040
+:10552c0006826200fdff3a0030e4a80031e4a800d6
+:10553c0032e4a80033e4a80034e4a90035e4a9005f
+:10554c0036e4a90037e4a900c4ff2f00074320006c
+:10555c00970b6200f4cf2f0005432000950a6200e0
+:10556c00c4ff2f0026432000160b6200f4cf2f003f
+:10557c0027432000970b620004fe2f00352080008b
+:10558c00050262000420a000342088003420800032
+:10559c0004d0a10004e0a00004f0a1003420880095
+:1055ac000ca4a8009860a8009700a8002c04070081
+:0855bc0038040700000006009e
+:020000040000fa
+:1055c400889fbe008a9fbe000004a800000340001c
+:1055d400060343000744200007044300c283de009f
+:1055e4008783430006422000868343004383de0012
+:1055f400060343008941200009034300e18f500062
+:1056040008003a00e3846100e8844400429dde001f
+:10561400cfd5de00c550dd00018c44001204980093
+:10562400050037004511dd00020c7800f27f2000f0
+:105634000300200013049800e3006000c208dd00aa
+:10564400f20020000111dd000281ea00170161006f
+:105654000122dd00840b7100670260000402420035
+:1056640037002000843bdd008783ea0096836300d3
+:10567400042add00048b7300140020000020dd00e8
+:105684001424b7000004a9004f05be004f04be0057
+:04569400000006000c
+:020000040000fa
+:105698003600f800809fbe00829fbe00849fbe0037
+:1056a800869fbe00881f78008860a9000004a800b3
+:1056b800040022005520800005026200020032002a
+:1056c80014002000245f8800040021005520800079
+:1056d800050262000004eb00880f5200030032004c
+:1056e800714ca800730ca80018002000048020004a
+:1056f800552080000502620002003200716ca8008b
+:10570800732ca800041020005520800005026200b8
+:1057180003003200736ca800718ca80071aca8005b
+:10572800f4002000542088000004a900245f8000b1
+:10573800e10f520001003a0072030700e00f540025
+:10574800010032006f0307004f0478004f03be00ca
+:105758004f02be004f01be004f00be003600f900e8
+:0457680000400600f7
+:020000040000fa
+:10576c000002eb0004198800141988002419880021
+:10577c002143a90047c0b30046322000074b7800f4
+:10578c00151980000580a1000590a000151988004e
+:10579c002063a8002043a800051980000506b3006b
+:1057ac000570a10005198800051980000530b300ab
+:1057bc000519880035fc2f0026322000168b62005c
+:1057cc00941988002343a90044198800fd824200e3
+:1057dc0047198000878262003500b30045198800a4
+:1057ec002603a900041c8800041c80000440a100ae
+:1057fc000450a000041c8800c4ff2f0005382000b2
+:10580c00950a620081c3a90004302000441c880062
+:10581c0034002000541c8800d4002000141c880084
+:0c582c00046e2000241c88000000060010
+:020000040000fa
+:10583800240f800005c6200095427800e0cf520072
+:105848002400320015c6200095427800e0cf5200af
+:105858002000320005002100010f800081826200d3
+:105868000a00320025638000f6628000868f5200ad
+:1058780017003400e762800006835300868f5200c9
+:1058880013003d00620ca80011003700f00f420021
+:1058980004003500e5628000f0824200850f520066
+:1058a8000b003400624ca800e00f520002003d00db
+:1058b800e562800005024200e5628000850f520023
+:1058c80002003500e562800005025200240f8800be
+:1058d80024638800e56280006120b900c003dd0010
+:1058e8000600200011000900453bd8000000060012
+:020000040000fa
+:1058f800881f7800004478000043eb000882fb0012
+:105908000500200086407800f2ff200003002000f8
+:10591800064078006e0207000043eb00f400200008
+:105928000500200011c0b300f2ff20000300200092
+:1059380006407800660207000884fb000470200017
+:10594800080272000043eb00cfa2de0021c0b300c2
+:10595800f2ff200003002000064078005c020700e8
+:105968000043eb00f47020000500200031c0b300b4
+:10597800f2ff2000030020000640780054020700d0
+:105988000043eb00f41020000500200041c0b300e4
+:10599800f2ff200003002000064078004c020700b8
+:0859a8004f0478000000060026
+:020000040000fa
+:1059b000889fbe000004a8000000400000004000d6
+:1059c0000543200005004000e10f520012003a009c
+:1059d0006112b800638361006134b8004299de004f
+:1059e000cf91de00f67f200002016300030020005b
+:1059f000e18f500004003a00680444004511dd00c6
+:105a000002084400020037004511dd00080841008b
+:105a1000140098000c003700f47f2000020162009f
+:105a200003002000e18f500003003a004511dd0023
+:105a300068084100020037004511dd0002087800c7
+:105a40000002eb00140098000004a9004f04be00ff
+:045a5000000006004c
+:020000040000fa
+:105a540005002700143a80008482620004002300b9
+:105a6400848f520020003200e4012000343a880080
+:105a7400f4f32f0045742000950a620004fe2f0001
+:105a840046742000160b6200a50920003600200091
+:105a94008407200037742000844b7800854b7800fd
+:105aa400864b780075052000160020006404200051
+:105ab40027742000844b7800854b7800864b78004f
+:105ac4000600270005002300173a80000702630040
+:105ad400850f5200fcff3a0005022000163a8000b0
+:0c5ae40006826200fdff32000000060098
+:020000040000fa
+:105af000365580003455800006a3b900105180004f
+:105b000021518000f45080000551800000035300b3
+:105b100081835b004638dd004a33de0006037000f7
+:105b2000cabbde000600420087804a00f0508800b1
+:105b300001518800f450800005518000e00f5200b0
+:105b4000e08f5a0002003d001e2aef00202aef00dd
+:105b5000f650800007518000d4508000e55080004e
+:105b6000840f5300858f5b0002003400722ca80064
+:085b70006602070000000600b8
+:020000040000fa
+:105b7800889fbe000004be000200780058638800b9
+:105b880069638800dc020700370307000002eb00a6
+:105b9800a40e8800c1e1a90075c62000844a7800d7
+:105ba80016c0b30067c72000864b78000804e900d8
+:105bb800280e880075072000450e8800690e8800a9
+:105bc800740e8800840e880025002000050e8800c9
+:105bd800340e8800c7e1a80004002800671c2000d4
+:105be800970b6200f40f2f00a51c2000950a620095
+:085bf8004f04be00000006008e
+:020000040000fa
+:105c00003600f800809fbe00829fbe00849fbe00c9
+:105c1000869fbe003a2aef003c2aef000002eb000c
+:105c20003455880044558800e4a9200014427800c7
+:105c30006442620007003a00546180000402e800f8
+:105c400054618800f30f5200020034002a2cef0048
+:105c5000a7ff0700e4a92000144278006242620016
+:105c600001003200ebfc07001afc07008500a900c8
+:105c70004f03be004f02be004f01be004f00be00ea
+:085c80003600f90000400600a7
+:020000040000fa
+:105c8800889fbe008a9fbe000004eb00281688008b
+:105c98008084eb0009168800681688004916880079
+:105ca80050030700f4fb2f00153a8000050262003c
+:105cb8006b0420007a052000257420008b4a7800a8
+:105cc8008a4a7800844a780069198800aa0207007d
+:105cd800fe0207002603070057010700143a800058
+:105ce8000460a000257420008b4a78008a4a780056
+:105cf800844a780008038800180388004f05be000e
+:085d08004f04be00000006007c
+:020000040000fa
+:105d1000104278008049eb00e14f42000f003a004a
+:105d20000000eb00e1cf500018003a0054c0b3006f
+:105d30008449780000c9eb0084c0b3001441980086
+:105d400034c0b3002441980034419800b4c1b3007a
+:105d500044419800100020000c003700e04f520032
+:105d600003003a000000fe0010002000070037008a
+:105d700010002000ec4f520004003200d4c0b200ea
+:105d80000480fb000000e9004f00de000000060078
+:020000040000fa
+:105d9000345780000402e80034578800f40f5200a2
+:105da00017003a00e62aef00415b8000f4568000bd
+:105db0000557800086ae2000c20bdd00870343003c
+:105dc000848bbe008100e80007022000110009005a
+:105dd0008700d800415b8800c208dd000103430052
+:105de00036005200a6805a000002be00cb28dd001b
+:105df0004522de0004827000c5aade002457880018
+:085e000020578000000006009d
+:020000040000fa
+:105e0800889fbe008a9fbe006a0007008004eb00de
+:105e18000afa20000b002000087122000a00be00c8
+:105e2800f50107008904e800888f5400fbff3a0059
+:105e380028508000c4f80700e10f400003003a0032
+:105e4800720ca800042aef00ffff3700e20f4000a1
+:105e580003003a00720ca800042aef00f5ff37008f
+:105e6800285088004f05be004f04be000000060001
+:020000040000fa
+:105e780006c72000164378000683fb0017c72000da
+:105e880097437800c83bdd000702730027c720004e
+:105e9800974378008783fb0036c7200016437800b5
+:105ea8004833dd0006837300040078000000a10079
+:105eb80007002000c032dd00040020006103b800a4
+:105ec800060272008782720010002000e00f520064
+:105ed800e08f5a0001003a0070638000000006005d
+:020000040000fa
+:105ee8003600f800809fbe00829fbe00849fbe00df
+:105ef800869fbe00d421ef00c1e1a90016c0b300ff
+:105f080065c62000864a780064c7200014427800dd
+:105f1800e04f52000400320075c62000864a78001f
+:105f2800766cef0003003700676cef00706ca80018
+:105f3800740107008be0a9004f03be004f02be00aa
+:105f48004f01be004f00be003600f90000400600b9
+:020000040000fa
+:105f580050518800315188006102b90004abb90082
+:105f6800060343000422b800850243001451880048
+:105f780025518800610ab900105180002151800024
+:105f880004abb900060343000422b80085024300ad
+:105f98000002520081825a006a2bb9006a22b800b6
+:105fa80085024300d4508800e5508800425188009b
+:045fb80000000600df
+:020000040000fa
+:105fbc000002eb00041988001419880024198800c9
+:105fcc0047c0b30046322000074b7800f5cf2f00b6
+:105fdc0026322000168b62002063a9002043a80003
+:105fec00f5f12f0007322000978b62000519800015
+:105ffc000530b3000519880035fc2f00263220002f
+:10600c00168b6200941988002343a9004419880058
+:04601c00000006007a
+:020000040000fa
+:1060200044c3200014427800e04f520009003200bf
+:1060300004508000e00f520003003200c082a9002b
+:10604000c282a90001003700c082a800346cef00b2
+:106050000a00370014508000e00f520003003200a5
+:10606000c082a900c282a80001003700c082a80037
+:1060700016c0b30045c32000864a78000000060021
+:020000040000fa
+:10608000c902a90004fe2f00856c2000950a620059
+:10609000c922a900f40f2e00856c2000950a620029
+:1060a000cf02a800cf22a800440c200024108800b2
+:1060b00007e2a9000722a8000742a9000782a8005a
+:1060c00007e2a8009620a9008620a90080382100b8
+:1060d000010020004a01070080f7070000000600c9
+:020000040000fa
+:1060e000889fbe000004a8004200dd00c03fb2004f
+:1060f00004432000040040000082e800e0cf50008c
+:10610000080032006383610068034300421cde0024
+:1061100009002000c542dd0005084300020a78009e
+:10612000030037004511dd0068084100000aeb005c
+:0c6130000004a9004f04be00000006009f
+:020000040000fa
+:10613c000164a80084208000040cb3008420880033
+:10614c0004fc2f0005412000950a62009420800079
+:10615c008403b3009420880012e4a80094208000eb
+:10616c000480a0000490a10004a0a000942088004a
+:10617c00c4ff2f0095208000050262000420a000bf
+:0c618c009420880012c4a8000000060047
+:020000040000fa
+:106198000002eb0004558800145588002455880037
+:1061a8006033b800b6518800c7518800765188001e
+:1061b8008751880096518800a7518800d6518800d9
+:1061c800e7518800f451880004528800165288006c
+:1061d800275288003452880044528800545288005c
+:0461e80000000600ad
+:020000040000fa
+:1061ec000002eb007463880004aaef0005c72000ce
+:1061fc00954278000443780005c72000864a780051
+:10620c0015c720009542780015c72000864a7800f3
+:10621c0025c720009542780025c72000864a7800c3
+:10622c0035c720009542780035c72000864a780093
+:04623c000000060058
+:020000040000fa
+:1062400004fe2f00e6348000860262005500b30091
+:10625000e5348800f60f2e00e53480000503630066
+:106260000560200086827200e5348800f6348000e4
+:10627000060262007400b300f434880064198000e0
+:0c628000040eb300641988000000060042
+:020000040000fa
+:10628c000004a800040021005520800005026200d3
+:10629c0001003a00714ca9000480200055208000b8
+:1062ac000502620001003a00716ca9000410200084
+:1062bc00552080000502620002003a00718ca90092
+:0c62cc0071aca9000004a900000006004d
+:020000040000fa
+:1062d800889fbe008a9fbe008c1f7800004578000a
+:1062e800014678000404be00864578008b4078009b
+:1062f8000a40780078ff07000a4278008b4078004f
+:106308000801be000c40780082fb07004f067800a9
+:0c6318004f05be004f04be000000060050
+:020000040000fa
+:10632400a4628000e5628000b0628000260f8000d5
+:1063340000b3b90011000900453bd8000400400037
+:1063440074162000840f5000030034008016b1003e
+:10635400840f5000fdff3c00e00f500002003d00a0
+:0c6364008016b000feff330000000600b1
+:020000040000fa
+:106370009052880024002000110009008400d800f9
+:10638000a052880064a52000024a78000201fb00a8
+:1063900004322000050020000201e9000300330060
+:1063a0000402420085824a00fbff3700c452880085
+:0863b000d55288000000060030
+:020000040000fa
+:1063b8002060880024002000110009008400d80013
+:1063c8003060880084c02000024a78000201fb0087
+:1063d80004322000050020000201e9000300330018
+:1063e8000402420085824a00fbff3700e45288001d
+:0863f800f552880000000600c8
+:020000040000fa
+:10640000a46380000402e800000042000000d10004
+:10641000a063880034062000840f500003003e0073
+:10642000702ca800390007000500370084252000e3
+:10643000840f500002003600704ca80033000700a3
+:046440000000060052
+:020000040000fa
+:10644400881f7800004478000842e900ed4f5200ac
+:1064540001003600a8c0b3000840780068010700b6
+:1064640008407800640107004099220005000700f5
+:10647400084078001ffd07001bfc07004f0478004c
+:04648400000006000e
+:020000040000fa
+:10648800305f8800f4cf2f000520800005026200ed
+:1064980004a0a00004208800060e200005082000a3
+:1064a8000720800007026300850f5200fcff3a00b6
+:1064b80020ff0700f4002000542088000004a900f1
+:0464c80000000600ca
+:020000040000fa
+:1064cc0074638000e00f52000c00320014002000b6
+:1064dc0074638800dc0007001201070004a0200090
+:1064ec00e5012000250298008082eb00350298001f
+:1064fc0006cab30005c02000864a780000000600da
+:020000040000fa
+:10650c0074638000e00f52000c003a00140020006d
+:10651c0074638800cc0007000201070004a020006f
+:10652c00e5012000250298008082eb0035029800de
+:10653c0006cab30005c02000864a78000000060099
+:020000040000fa
+:10654c003600f800809fbe00829fbe00849fbe0074
+:10655c00869fbe008660a900c262ab0002003200ba
+:10656c00700ca800b80007004f03be004f02be001d
+:10657c004f01be004f00be003600f900004006007f
+:020000040000fa
+:10658c00c902a90004fe2f00856c2000950a620048
+:10659c00c862a900f50f2e001636800086826200b4
+:1065ac0005b0a00015368800453580000502620054
+:0c65bc009400b300443588000000060085
+:020000040000fa
+:1065c800e00f51000b0032004802dd004800de00f9
+:1065d800314378008682fb00050068000000400017
+:1065e8000580200065007800040068000201e900c9
+:0865f800f5ff3a000000060067
+:020000040000fa
+:10660000f03fb1000180b10006003500ee03090043
+:1066100000000000403fb1000180b100fbff3d00e1
+:106620001000b000203fb0000200350000800900db
+:0866300000000000000006005c
+:020000040000fa
+:106638004580a90044a0a80044e0a8004480a80020
+:106648004440a9004420a8004400a900f4ff270002
+:10665800745388000500280095538800b4538800b7
+:046668000000060028
+:020000040000fa
+:10666c00e023ef0004022200641c88002444200074
+:10667c00a41c880074002000b41c88006404200052
+:10668c00741c880004702000841c88008de3a80012
+:04669c0000000600f4
+:020000040000fa
+:1066a000e023ef0004022000c41c88000444200002
+:1066b000041d880074002000141d88007b02420025
+:1066c000d41c880004782000e41c880099e3a8000a
+:0466d00000000600c0
+:020000040000fa
+:1066d40002322000a1002000803e200025fd07009a
+:1066e400c8fd070020fc0700d2ff0700786aef000e
+:0c66f400a8fe0700aa0007000000060036
+:020000040000fa
+:1067000080027800566380006933b900a40020003d
+:10671000110009000403d80000027800850f520020
+:0c67200001003400456388000000060002
+:020000040000fa
+:10672c00849fbe00861f78009b40a90016c0b30052
+:10673c0015c62000864a78008b40a9009b40a80013
+:0c674c004f0378004f02be000040060022
+:020000040000fa
+:106758000002eb00a40e8800c1e1a9000443780000
+:1067680075c62000864a780016c0b30065c72000a9
+:08677800864a780000000600cb
+:020000040000fa
+:1067800004fe2f0026368000860262000540a0002d
+:1067900025368800a5358000050262000410a0009f
+:0867a000a4358800000006008a
+:020000040000fa
+:1067a800881f78000044780079fe07002c2aec0046
+:1067b8008842780014c02000054a78004f04780009
+:0467c80000000600c7
+:020000040000fa
+:1067cc0016c0b300a5aa2000864a780082000700f4
+:1067dc00240007000c0007007200070032f70700c6
+:0467ec0000000600a3
+:020000040000fa
+:1067f00024628000e10f52000400340014382000ad
+:1068000010084200442cef0001003700442cec003b
+:04681000000006007e
+:020000040000fa
+:106814008480a9009480a8002023a8002003a90054
+:1068240085a0a90081e3a80021e3a80000000600d8
+:020000040000fa
+:1068340014002800040040004300de006500b90095
+:1068440094032000110009000480d8000000060011
+:020000040000fa
+:10685400c0ff0700050007004200070033000700df
+:0c6864004cfe0700aa6aef0000000600ce
+:020000040000fa
+:106870006a0cf800da01f900da01f800d801f90031
+:0c688000d801f800d601f9000000060065
+:020000040000fa
+:10688c000000eb0037e7070081bb200090fa2f00d7
+:08689c0027e7070000000600d9
+:020000040000fa
+:1068a4000000eb0033e70700017d2000d0f82f0043
+:0868b40025e7070000000600c3
+:020000040000fa
+:1068bc000000eb002fe70700d1072000d0fa2f00d3
+:0868cc0023e7070000000600ad
+:020000040000fa
+:1068d40004fe2f00c5348000050262000400a000fd
+:0868e400c43488000000060026
+:020000040000fa
+:1068ec000142780082017800010020000441780008
+:0868fc00a3f3070000000600f1
+:020000040000fa
+:1069040001427800820178000100200004417800ef
+:086914009df3070000000600de
+:020000040000fa
+:10691c00e4152000a4638800704ca900702ca90019
+:04692c000000060061
+:020000040000fa
+:106930000000eb0010e707008500a9009500a80003
+:04694000000006004d
+:020000040000fa
+:10694400010020008001eb00034178008ef3070072
+:046954000000060039
+:020000040000fa
+:106958000000eb000ae707008780a9000000060096
+:020000040000fa
+:1069680081e3a90021e3a9009480a90000000600a2
+:020000040000fa
+:106978002c03a9002c23a9002c43a9000000060021
+:020000040000fa
+:1069880000002800e001b6004f00de00000006000d
+:020000040000fa
+:0c699800f056800001578000000006004f
+:020000040000fa
+:0c69a40063a0a8008660a90000000600a7
+:020000040000fa
+:0c69b0008be0a9009be0a800000006009e
+:020000040000fa
+:0869bc00805088000000060075
+:020000040000fa
+:0869c400daff070000000600e5
+:020000040000fa
+:0869cc000500070000000600b1
+:020000040000fa
+:0869d4002037820000000600dc
+:020000040000fa
+:0869dc00e056880000000600ef
+:020000040000fa
+:0869e4009500a9000000060067
+:020000040000fa
+:0869ec00c082a90000000600b2
+:020000040000fa
+:0869f400a2fd070000000600ef
+:020000040000fa
+:0869fc0017ecb70000000600d3
+:020000040000fa
+:086a040036ecb70000000600ab
+:020000040000fa
+:086a0c0036ecb70000000600a3
+:020000040000fa
+:086a140085c0a9000040060046
+:020000040000fa
+:086a1c00200f800000000600bd
+:020000040000fa
+:086a2400e1e1a90000000600f9
+:020000040000fa
+:086a2c008020a900ffff3700e4
+:020000040000fa
+:086a34008060a900ffff37009c
+:020000040000fa
+:086a3c008040a900ffff3700b4
+:020000040000fa
+:086a44008080a900ffff37006c
+:020000040000fa
+:086a4c008020a900ffff3700c4
+:020000040000fa
+:086a54008060a900ffff37007c
+:020000040000fa
+:086a5c008040a900ffff370094
+:020000040000fa
+:086a64008080a900ffff37004c
+:020000040000fa
+:086a6c000040da000000fe000a
+:020000040000fa
+:046a740000400600d8
+:020000040000fa
+:046a78000000060014
+:020000040000fa
+:046a7c000000060010
+:020000040000fa
+:0200000401f009
+:04000000ffff0000fe
+:020000040000fa
+:0200000401f009
+:04000400ffff0000fa
+:020000040000fa
+:0200000401f009
+:04000800ffff0000f6
+:020000040000fa
+:0200000401f009
+:04000c0078ff000079
+:020000040000fa
+:0200000401f009
+:0400100078ff000075
+:020000040000fa
+:0200000401f009
+:040014007fff00006a
+:020000040000fa
+:0200000401f009
+:04001800ffff0000e6
+:020000040000fa
+:0200000401f009
+:04001c00ddff000004
+:00000001FF
diff --git a/info/firmware.info.xml b/info/firmware.info.xml
index 88ab0cda5..cb9d7159a 100644
--- a/info/firmware.info.xml
+++ b/info/firmware.info.xml
@@ -120,6 +120,13 @@
+
+
+ ../CAN/2foc/2foc-special.hex
+
+
+
+
../CAN/2foc/2foc.r1.dc.hex
diff --git a/scripts/FirmwareUpdater.script.info.all.sh b/scripts/FirmwareUpdater.script.info.all.sh
index 2246850a5..96692c96a 100755
--- a/scripts/FirmwareUpdater.script.info.all.sh
+++ b/scripts/FirmwareUpdater.script.info.all.sh
@@ -10,7 +10,9 @@ echo ""
echo "this bash is executing: ./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml` -f ../info/firmware.info.xml -p all -a info | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.info.all.txt"
echo ""
-./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml` -f ../info/firmware.info.xml -p all -a info | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.info.all.txt
+# ./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml` -f ../info/firmware.info.xml -p all -a info | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.info.all.txt
+./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml | grep ^\".*$ | sed 's/"//g'` -f ../info/firmware.info.xml -p all -a info | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.info.all.txt
+
echo ""
echo "this bash has executed: ./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml` -f ../info/firmware.info.xml -p all -a info | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.info.all.txt"
echo ""
diff --git a/scripts/FirmwareUpdater.script.program.all.sh b/scripts/FirmwareUpdater.script.program.all.sh
index 10a08b4c7..90b27b99f 100755
--- a/scripts/FirmwareUpdater.script.program.all.sh
+++ b/scripts/FirmwareUpdater.script.program.all.sh
@@ -10,7 +10,7 @@ echo ""
echo "this bash is executing: ./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml` -f ../info/firmware.info.xml -p all -a program | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.program.all.txt"
echo ""
-./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml` -f ../info/firmware.info.xml -p all -a program | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.program.all.txt
+./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml | grep ^\".*$ | sed 's/"//g'` -f ../info/firmware.info.xml -p all -a program | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.program.all.txt
echo ""
echo "this bash has executed: ./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml` -f ../info/firmware.info.xml -p all -a program | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.program.all.txt"
echo ""
diff --git a/scripts/FirmwareUpdater.script.update.all.foc-special.sh b/scripts/FirmwareUpdater.script.update.all.foc-special.sh
new file mode 100644
index 000000000..ba4c11406
--- /dev/null
+++ b/scripts/FirmwareUpdater.script.update.all.foc-special.sh
@@ -0,0 +1,21 @@
+
+#!/bin/bash
+
+
+# this script which uses FirmwareUpdater by means of the python program manageFWrobot.py
+
+echo ""
+echo ""
+echo ""
+echo "This script is about to install the 2foc-special.hex FW binary with the HW FAULT on overheating disabled on all 2FOC boards of $YARP_ROBOT_NAME"
+read -p "Continue? (Y/N): " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1
+
+echo "Starting the 2FOC update with 2foc-special.hex..."
+
+
+echo "this bash is executing: ./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.2foc-special.xml` -f ../info/firmware.info.xml -p all -b foc-special -a update | tee ../logs/log.of.FirmwareUpdater.ergocub-2foc-special.update.all.foc-special.txt"
+echo ""
+./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.2foc-special.xml | grep ^\".*$ | sed 's/"//g'` -f ../info/firmware.info.xml -p all -b foc-special -a update | tee ../logs/log.of.FirmwareUpdater.ergocub-2foc-special.update.all.foc-special.txt
+echo ""
+echo "this bash has executed: ./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.2foc-special.xml` -f ../info/firmware.info.xml -p all -b foc-special -a update | tee ../logs/log.of.FirmwareUpdater.ergocub-2foc-special.update.all.foc-special.txt"
+echo ""
diff --git a/scripts/FirmwareUpdater.script.update.all.foc.sh b/scripts/FirmwareUpdater.script.update.all.foc.sh
index 4c914d794..ecd7490a8 100644
--- a/scripts/FirmwareUpdater.script.update.all.foc.sh
+++ b/scripts/FirmwareUpdater.script.update.all.foc.sh
@@ -7,10 +7,14 @@
echo ""
echo ""
echo ""
+echo "This script is about to install the standard 2foc.hex FW binary on all 2FOC boards of $YARP_ROBOT_NAME"
+read -p "Continue? (Y/N): " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1
-echo "this bash is executing: ./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml` -f ../info/firmware.info.xml -p all -b foc -a update | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.update.all.foc.txt"
+echo "Starting the 2FOC update with 2foc.hex..."
+
+echo "this bash is executing: ./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.2foc.xml` -f ../info/firmware.info.xml -p all -b foc -a update | tee ../logs/log.of.FirmwareUpdater.ergocub-2foc..update.all.foc.txt"
echo ""
-./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml` -f ../info/firmware.info.xml -p all -b foc -a update | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.update.all.foc.txt
+./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.2foc.xml | grep ^\".*$ | sed 's/"//g'` -f ../info/firmware.info.xml -p all -b foc -a update | tee ../logs/log.of.FirmwareUpdater..ergocub-2foc.update.all.foc.txt
echo ""
-echo "this bash has executed: ./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml` -f ../info/firmware.info.xml -p all -b foc -a update | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.update.all.foc.txt"
+echo "this bash has executed: ./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.2foc.xml` -f ../info/firmware.info.xml -p all -b foc -a update | tee ../logs/log.of.FirmwareUpdater..ergocub-2foc.update.all.foc.txt"
echo ""
diff --git a/scripts/FirmwareUpdater.script.verify.all.sh b/scripts/FirmwareUpdater.script.verify.all.sh
index afeee9d20..fa3b3b13b 100755
--- a/scripts/FirmwareUpdater.script.verify.all.sh
+++ b/scripts/FirmwareUpdater.script.verify.all.sh
@@ -10,7 +10,7 @@ echo ""
echo "this bash is executing: ./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml` -f ../info/firmware.info.xml -p all -a verify | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.verify.all.txt"
echo ""
-./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml` -f ../info/firmware.info.xml -p all -a verify | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.verify.all.txt
+./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml | grep ^\".*$ | sed 's/"//g'` -f ../info/firmware.info.xml -p all -a verify | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.verify.all.txt
echo ""
echo "this bash has executed: ./manageFWrobot.py -n `yarp resource --from network.$YARP_ROBOT_NAME.xml` -f ../info/firmware.info.xml -p all -a verify | tee ../logs/log.of.FirmwareUpdater.$YARP_ROBOT_NAME.verify.all.txt"
echo ""
diff --git a/scripts/firmwareupdater.ini b/scripts/firmwareupdater.ini
new file mode 100644
index 000000000..9fb67c5a4
--- /dev/null
+++ b/scripts/firmwareupdater.ini
@@ -0,0 +1,7 @@
+[DRIVERS]
+CFW2_CAN "0"
+CFW2_CAN "1"
+ESD_CAN "5"
+ESD_CAN "6"
+SOCKETCAN "can0"
+ETH "10.0.1.104:3333"
diff --git a/scripts/manageFWrobot.py b/scripts/manageFWrobot.py
index 49b3fe504..d5e142928 100755
--- a/scripts/manageFWrobot.py
+++ b/scripts/manageFWrobot.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
# Copyright (C) 2018 iCub Facility - Istituto Italiano di Tecnologia
@@ -79,16 +79,16 @@ def get_board_properties2(boardroot, brd):
if brd.get('required', '') == 'version':
findAlsoByVersion = True
if None == brd.find('version'):
- print pyprefix + errorprefix + 'syntax error in the xml robot network: cannot find tag as indicated by '
- print pyprefix + errorprefix + 'i will not consider this board. please rewrite the xml file.'
+ print (pyprefix + errorprefix + 'syntax error in the xml robot network: cannot find tag as indicated by ' )
+ print (pyprefix + errorprefix + 'i will not consider this board. please rewrite the xml file.')
return prop
targetversion = brd.find('version').attrib
tmajor = targetversion.get('major', '0')
tminor = targetversion.get('minor', '0')
tbuild = targetversion.get('build', '0')
elif brd.get('required', '') != '':
- print pyprefix + errorprefix + 'syntax error in the xml robot network: is not allowed. if required is present, it can be only: ="version"'
- print pyprefix + errorprefix + 'i will not consider this board. please rewrite the xml file.'
+ print (pyprefix + errorprefix + 'syntax error in the xml robot network: is not allowed. if required is present, it can be only: ="version"')
+ print (pyprefix + errorprefix + 'i will not consider this board. please rewrite the xml file.')
return prop
for p in boardroot.findall('board'):
@@ -162,8 +162,8 @@ def eth_force_maintenance(brd, prp):
command = 'FirmwareUpdater --nogui --force-eth-maintenance --device ' + brd.find('ondevice').text + ' --id eth1 --eth_board ' + adr.get('ip') + ' --verbosity ' + str(_verbosityFU)
if _verbose > 1:
- print pyprefix + debugprefix + 'eth_force_maintenance(): sending eth board in maintenance mode w/ command:'
- print pyprefix + debugprefix+ command
+ print (pyprefix + debugprefix + 'eth_force_maintenance(): sending eth board in maintenance mode w/ command:')
+ print (pyprefix + debugprefix+ command)
if 1 == _debugmode:
r = 0
@@ -173,7 +173,7 @@ def eth_force_maintenance(brd, prp):
r = r / 256
if 0 != r:
- print pyprefix + errorprefix + 'eth_force_maintenance(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip')
+ print (pyprefix + errorprefix + 'eth_force_maintenance(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip'))
return r
return r
@@ -189,8 +189,8 @@ def eth_force_application(brd, prp):
command = 'FirmwareUpdater --nogui --force-eth-application --device ' + brd.find('ondevice').text + ' --id eth1 --eth_board ' + adr.get('ip') + ' --verbosity ' + str(_verbosityFU)
if _verbose > 1:
- print pyprefix + debugprefix + 'eth_force_application(): sending eth board in application mode w/ command:'
- print pyprefix + debugprefix + command
+ print (pyprefix + debugprefix + 'eth_force_application(): sending eth board in application mode w/ command:')
+ print (pyprefix + debugprefix + command)
if 1 == _debugmode:
r = 0
@@ -200,7 +200,7 @@ def eth_force_application(brd, prp):
r = r / 256
if 0 != r:
- print pyprefix + errorprefix + 'eth_force_application(): FAILURE sending in application mode eth board @ ' + adr.get('ip')
+ print (pyprefix + errorprefix + 'eth_force_application(): FAILURE sending in application mode eth board @ ' + adr.get('ip'))
return r
return r
@@ -218,13 +218,13 @@ def goto_maintenance(brd, prp):
elif 0 != adr.get('canadr', 0):
r = eth_force_maintenance(brd, prp)
else:
- print pyprefix + errorprefix + 'goto_maintenance(): FAILURE the device ' + ondevice + ' with CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') + ' is unsupported'
+ print (pyprefix + errorprefix + 'goto_maintenance(): FAILURE the device ' + ondevice + ' with CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') + ' is unsupported')
r = 1
elif 'CFW' == ondevice:
- print pyprefix + ' [info]: boards on device ' + ondevice + ' dont need to be forced in maintenance mode!'
+ print (pyprefix + ' [info]: boards on device ' + ondevice + ' dont need to be forced in maintenance mode!' )
r = 0
else:
- print pyprefix + errorprefix + 'goto_maintenance(): FAILURE the device ' + ondevice + ' is unsupported'
+ print (pyprefix + errorprefix + 'goto_maintenance(): FAILURE the device ' + ondevice + ' is unsupported')
r = 1
return r
@@ -242,13 +242,13 @@ def goto_application(brd, prp):
elif 0 != adr.get('canadr', 0):
r = eth_force_application(brd, prp)
else:
- print pyprefix + errorprefix + 'goto_application(): FAILURE the device ' + ondevice + ' with CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') + ' is unsupported'
+ print (pyprefix + errorprefix + 'goto_application(): FAILURE the device ' + ondevice + ' with CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') + ' is unsupported')
r = 1
elif 'CFW' == ondevice:
- print pyprefix + ' [info]: boards on device ' + ondevice + ' dont need to be forced in application mode!'
+ print (pyprefix + ' [info]: boards on device ' + ondevice + ' dont need to be forced in application mode!' )
r = 0
else:
- print pyprefix + errorprefix + 'goto_application(): FAILURE the device ' + ondevice + ' is unsupported'
+ print (pyprefix + errorprefix + 'goto_application(): FAILURE the device ' + ondevice + ' is unsupported')
r = 1
return r
@@ -261,7 +261,7 @@ def do_firmware_verify_cfw(brd, prp):
fw = prp.find('firmware')
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_verify_cfw(): performing fw verify on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_verify_cfw(): performing fw verify on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
stringOfCANfwversion = from_firmware_to_stringofversion(fw)
tmp1 = 'FirmwareUpdater --nogui --verify ' + stringOfCANfwversion + ' --device CFW2 --id ' + adr.get('canbus', '0')
@@ -269,8 +269,8 @@ def do_firmware_verify_cfw(brd, prp):
command = tmp1 + tmp2
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_verify_cfw(): verifying can firmware w/ command:'
- print pyprefix + debugprefix + command
+ print (pyprefix + debugprefix + 'do_firmware_verify_cfw(): verifying can firmware w/ command:')
+ print (pyprefix + debugprefix + command )
if 1 == _debugmode:
r = 0
@@ -283,14 +283,14 @@ def do_firmware_verify_cfw(brd, prp):
r = 0
elif 1 == r:
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_verify_cfw(): TODO update FW of can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_verify_cfw(): TODO update FW of can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
return r
else:
- print pyprefix + errorprefix + 'do_firmware_verify_cfw(): ERROR cannot find can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + errorprefix + 'do_firmware_verify_cfw(): ERROR cannot find can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
return r
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_verify_cfw(): FW is OK!'
+ print (pyprefix + debugprefix + 'do_firmware_verify_cfw(): FW is OK!')
return r
# end of: def
@@ -304,12 +304,12 @@ def do_firmware_verify_canovereth(brd, prp):
fw = prp.find('firmware')
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_verify_canovereth(): performing fw verify on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_verify_canovereth(): performing fw verify on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
r = eth_force_maintenance(brd, prp)
if 0 != r:
- print pyprefix + errorprefix + 'do_firmware_verify_canovereth(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip', '0')
+ print (pyprefix + errorprefix + 'do_firmware_verify_canovereth(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip', '0'))
return r
stringOfCANfwversion = from_firmware_to_stringofversion(fw)
@@ -318,8 +318,8 @@ def do_firmware_verify_canovereth(brd, prp):
command = tmp1 + tmp2
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_verify_canovereth(): verifying can firmware w/ command:'
- print pyprefix + debugprefix + command
+ print (pyprefix + debugprefix + 'do_firmware_verify_canovereth(): verifying can firmware w/ command:')
+ print (pyprefix + debugprefix + command )
if 1 == _debugmode:
@@ -333,14 +333,14 @@ def do_firmware_verify_canovereth(brd, prp):
r = 0
elif 1 == r:
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_verify_canovereth(): TODO update FW of can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_verify_canovereth(): TODO update FW of can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
return r
else:
- print pyprefix + errorprefix + 'do_firmware_verify_canovereth(): ERROR cannot find can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + errorprefix + 'do_firmware_verify_canovereth(): ERROR cannot find can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
return r
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_verify_canovereth(): FW is OK!'
+ print (pyprefix + debugprefix + 'do_firmware_verify_canovereth(): FW is OK!')
return r
# end of: def
@@ -353,20 +353,20 @@ def do_firmware_verify_eth(brd, prp):
fw = prp.find('firmware')
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_verify_eth(): performing fw verify on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_verify_eth(): performing fw verify on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
# r = eth_force_maintenance(brd, prp)
#
# if 0 != r:
-# print pyprefix + errorprefix + 'do_firmware_verify_eth(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip', '0')
+# print (pyprefix + errorprefix + 'do_firmware_verify_eth(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip', '0'))
# return r
stringOfETHfwversion = from_firmware_to_stringofversionETH(fw)
command = 'FirmwareUpdater --nogui --verify ' + stringOfETHfwversion + ' --device ' + brd.find('ondevice').text + ' --id eth1 --eth_board ' + adr.get('ip', '0') + ' --verbosity ' + str(_verbosityFU)
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_verify_eth(): verifying eth firmware w/ command:'
- print pyprefix + debugprefix + command
+ print (pyprefix + debugprefix + 'do_firmware_verify_eth(): verifying eth firmware w/ command:' )
+ print (pyprefix + debugprefix + command )
if 1 == _debugmode:
r = 0
@@ -379,14 +379,14 @@ def do_firmware_verify_eth(brd, prp):
r = 0
elif 1 == r:
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_verify_eth(): TODO update FW of eth board @ ' + adr.get('ip', '0')
+ print (pyprefix + debugprefix + 'do_firmware_verify_eth(): TODO update FW of eth board @ ' + adr.get('ip', '0'))
return r
else:
- print pyprefix + errorprefix + 'do_firmware_verify_eth(): ERROR cannot find eth board @ ' + adr.get('ip', '0')
+ print (pyprefix + errorprefix + 'do_firmware_verify_eth(): ERROR cannot find eth board @ ' + adr.get('ip', '0'))
return r
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_verify_eth(): FW is the latest one!'
+ print (pyprefix + debugprefix + 'do_firmware_verify_eth(): FW is the latest one!')
return r
# end of: def
@@ -404,12 +404,12 @@ def do_firmware_verify(brd, prp):
elif 0 != adr.get('canadr', 0):
r = do_firmware_verify_canovereth(brd, prp)
else:
- print pyprefix + errorprefix + 'do_firmware_verify(): FAILURE the device ' + ondevice + ' with CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') + ' is unsupported'
+ print (pyprefix + errorprefix + 'do_firmware_verify(): FAILURE the device ' + ondevice + ' with CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') + ' is unsupported')
r = 2
elif 'CFW' == ondevice:
r = do_firmware_verify_cfw(brd, prp)
else:
- print pyprefix + errorprefix + 'do_firmware_verify(): FAILURE the device ' + ondevice + ' is unsupported'
+ print (pyprefix + errorprefix + 'do_firmware_verify(): FAILURE the device ' + ondevice + ' is unsupported')
r = 2
return r
@@ -423,7 +423,7 @@ def do_firmware_query_cfw(brd, prp):
fw = prp.find('firmware')
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_query_cfw(): performing query on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_query_cfw(): performing query on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
stringOfCANfwversion = from_firmware_to_stringofversion(fw)
tmp1 = 'FirmwareUpdater --nogui --query' + ' --device CFW2 --id ' + adr.get('canbus', '0')
@@ -431,8 +431,8 @@ def do_firmware_query_cfw(brd, prp):
command = tmp1 + tmp2
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_query_cfw(): querying can board type + firmware w/ command:'
- print pyprefix + debugprefix + command
+ print (pyprefix + debugprefix + 'do_firmware_query_cfw(): querying can board type + firmware w/ command:')
+ print (pyprefix + debugprefix + command )
if 1 == _debugmode:
r = 0
@@ -444,11 +444,11 @@ def do_firmware_query_cfw(brd, prp):
if 0 == r:
r = 0
else:
- print pyprefix + errorprefix + 'do_firmware_query_cfw(): ERROR cannot find can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + errorprefix + 'do_firmware_query_cfw(): ERROR cannot find can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
return r
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_query_cfw(): board is found!'
+ print (pyprefix + debugprefix + 'do_firmware_query_cfw(): board is found!')
return r
# end of: def
@@ -462,12 +462,12 @@ def do_firmware_query_canovereth(brd, prp):
fw = prp.find('firmware')
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_query_canovereth(): performing query on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_query_canovereth(): performing query on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
r = eth_force_maintenance(brd, prp)
if 0 != r:
- print pyprefix + errorprefix + 'do_firmware_query_canovereth(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip', '0')
+ print (pyprefix + errorprefix + 'do_firmware_query_canovereth(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip', '0'))
return r
#stringOfCANfwversion = from_firmware_to_stringofversion(fw)
@@ -476,8 +476,8 @@ def do_firmware_query_canovereth(brd, prp):
command = tmp1 + tmp2
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_query_canovereth(): querying can board + firmware w/ command:'
- print pyprefix + debugprefix + command
+ print (pyprefix + debugprefix + 'do_firmware_query_canovereth(): querying can board + firmware w/ command:')
+ print (pyprefix + debugprefix + command )
if 1 == _debugmode:
@@ -490,11 +490,11 @@ def do_firmware_query_canovereth(brd, prp):
if 0 == r:
r = 0
else:
- print pyprefix + errorprefix + 'do_firmware_query_canovereth(): ERROR cannot find can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + errorprefix + 'do_firmware_query_canovereth(): ERROR cannot find can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
return r
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_query_canovereth(): FW is OK!'
+ print (pyprefix + debugprefix + 'do_firmware_query_canovereth(): FW is OK!')
return r
# end of: def
@@ -507,20 +507,20 @@ def do_firmware_query_eth(brd, prp):
fw = prp.find('firmware')
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_query_eth(): performing fw query on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_query_eth(): performing fw query on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
# r = eth_force_maintenance(brd, prp)
#
# if 0 != r:
-# print pyprefix + errorprefix + 'do_firmware_query_eth(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip', '0')
+# print (pyprefix + errorprefix + 'do_firmware_query_eth(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip', '0'))
# return r
# stringOfETHfwversion = from_firmware_to_stringofversionETH(fw)
command = 'FirmwareUpdater --nogui --query' + ' --device ' + brd.find('ondevice').text + ' --id eth1 --eth_board ' + adr.get('ip', '0') + ' --verbosity ' + str(_verbosityFU)
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_query_eth(): querying eth board + firmware w/ command:'
- print pyprefix + debugprefix + command
+ print (pyprefix + debugprefix + 'do_firmware_query_eth(): querying eth board + firmware w/ command:' )
+ print (pyprefix + debugprefix + command )
if 1 == _debugmode:
r = 0
@@ -532,11 +532,11 @@ def do_firmware_query_eth(brd, prp):
if 0 == r:
r = 0
else:
- print pyprefix + errorprefix + 'do_firmware_query_eth(): ERROR cannot find eth board @ ' + adr.get('ip', '0')
+ print (pyprefix + errorprefix + 'do_firmware_query_eth(): ERROR cannot find eth board @ ' + adr.get('ip', '0'))
return r
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_query_eth(): board found!'
+ print (pyprefix + debugprefix + 'do_firmware_query_eth(): board found!')
return r
# end of: def
@@ -554,12 +554,12 @@ def do_firmware_query(brd, prp):
elif 0 != adr.get('canadr', 0):
r = do_firmware_query_canovereth(brd, prp)
else:
- print pyprefix + errorprefix + 'do_firmware_query(): FAILURE the device ' + ondevice + ' with CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') + ' is unsupported'
+ print (pyprefix + errorprefix + 'do_firmware_query(): FAILURE the device ' + ondevice + ' with CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') + ' is unsupported')
r = 2
elif 'CFW' == ondevice:
r = do_firmware_query_cfw(brd, prp)
else:
- print pyprefix + errorprefix + 'do_firmware_query(): FAILURE the device ' + ondevice + ' is unsupported'
+ print (pyprefix + errorprefix + 'do_firmware_query(): FAILURE the device ' + ondevice + ' is unsupported')
r = 2
return r
@@ -579,22 +579,36 @@ def getTimeOfFirmwareUpdate(brdtype):
r = 15
elif brdtype == 'foc':
r = 105
+ elif brdtype == 'foc-special':
+ r = 105
elif brdtype == 'mtb':
r = 105
elif brdtype == 'mtb4':
r = 280
+ elif brdtype == 'mtb4c':
+ r = 280
elif brdtype == 'mais':
r = 50
elif brdtype == 'strain':
r = 70
elif brdtype == 'strain2':
r = 280
+ elif brdtype == 'strain2c':
+ r = 280
+ elif brdtype == 'rfe':
+ r = 280
elif brdtype == 'mc4':
r = 66
elif brdtype == 'bll':
r = 66
elif brdtype == 'dsp':
r = 66
+ elif brdtype == 'amc':
+ r = 30
+ elif brdtype == 'amc2c':
+ r = 30
+ elif brdtype == 'amcbldc':
+ r = 280
else:
r = 666
@@ -616,12 +630,12 @@ def do_firmware_program(brd, prp):
elif 0 != adr.get('canadr', 0):
r = do_firmware_program_canovereth(brd, prp)
else:
- print pyprefix + errorprefix + 'do_firmware_program(): FAILURE the device ' + ondevice + ' with CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') + ' is unsupported'
+ print (pyprefix + errorprefix + 'do_firmware_program(): FAILURE the device ' + ondevice + ' with CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') + ' is unsupported')
r = 1
elif 'CFW' == ondevice:
r = do_firmware_program_cfw(brd, prp)
else:
- print pyprefix + errorprefix + 'do_firmware_program(): FAILURE the device ' + ondevice + ' is unsupported'
+ print (pyprefix + errorprefix + 'do_firmware_program(): FAILURE the device ' + ondevice + ' is unsupported')
r = 1
return r
@@ -634,7 +648,7 @@ def do_firmware_program_cfw(brd, prp):
fw = prp.find('firmware')
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_program_cfw(): performing fw program on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_program_cfw(): performing fw program on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
tmp1 = 'FirmwareUpdater --nogui --program --device CFW2 --id ' + adr.get('canbus', '0')
@@ -642,13 +656,13 @@ def do_firmware_program_cfw(brd, prp):
command = tmp1 + tmp2
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_program_cfw(): uploading can firmware w/ command:'
- print pyprefix + debugprefix + command
+ print (pyprefix + debugprefix + 'do_firmware_program_cfw(): uploading can firmware w/ command:')
+ print (pyprefix + debugprefix + command )
if _verbose > 0:
boardtype = brd.get('type')
timeofupload = getTimeOfFirmwareUpdate(boardtype)
- print pyprefix + ' - message: please be prepared to wait for some time ... fw program of a ' + boardtype + ' typically lasts ' + str(timeofupload) + ' seconds'
+ print (pyprefix + ' - message: please be prepared to wait for some time ... fw program of a ' + boardtype + ' typically lasts ' + str(timeofupload) + ' seconds')
if 1 == _debugmode:
r = 0
@@ -658,12 +672,12 @@ def do_firmware_program_cfw(brd, prp):
r = r / 256
if 0 != r:
- print pyprefix + errorprefix + 'do_firmware_program_cfw(): FAILURE programming can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + errorprefix + 'do_firmware_program_cfw(): FAILURE programming can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
return r
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_program_cfw(): done!'
+ print (pyprefix + debugprefix + 'do_firmware_program_cfw(): done!')
return r
# end of: def
@@ -677,12 +691,12 @@ def do_firmware_program_canovereth(brd, prp):
fw = prp.find('firmware')
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_program_canovereth(): performing fw program on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_program_canovereth(): performing fw program on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
r = eth_force_maintenance(brd, prp)
if 0 != r:
- print pyprefix + errorprefix + 'do_firmware_program_canovereth(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip', '0')
+ print (pyprefix + errorprefix + 'do_firmware_program_canovereth(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip', '0'))
return r
tmp1 = 'FirmwareUpdater --nogui --program --device ' + brd.find('ondevice').text + ' --id eth1 --eth_board ' + adr.get('ip', '0')
@@ -690,13 +704,13 @@ def do_firmware_program_canovereth(brd, prp):
command = tmp1 + tmp2
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_program_canovereth(): uploading can firmware w/ command:'
- print pyprefix + debugprefix + command
+ print (pyprefix + debugprefix + 'do_firmware_program_canovereth(): uploading can firmware w/ command:')
+ print (pyprefix + debugprefix + command )
if _verbose > 0:
boardtype = brd.get('type')
timeofupload = getTimeOfFirmwareUpdate(boardtype)
- print pyprefix + ' - message: please be prepared to wait for some time ... fw program of a ' + boardtype + ' typically lasts ' + str(timeofupload) + ' seconds'
+ print (pyprefix + ' - message: please be prepared to wait for some time ... fw program of a ' + boardtype + ' typically lasts ' + str(timeofupload) + ' seconds')
if 1 == _debugmode:
r = 0
@@ -706,12 +720,12 @@ def do_firmware_program_canovereth(brd, prp):
r = r / 256
if 0 != r:
- print pyprefix + errorprefix + 'do_firmware_program_canovereth(): FAILURE programming can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + errorprefix + 'do_firmware_program_canovereth(): FAILURE programming can board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
return r
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_program_canovereth(): done!'
+ print (pyprefix + debugprefix + 'do_firmware_program_canovereth(): done!')
return r
# end of: def
@@ -724,25 +738,25 @@ def do_firmware_program_eth(brd, prp):
fw = prp.find('firmware')
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_program_eth(): performing fw program on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_program_eth(): performing fw program on board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0'))
r = eth_force_maintenance(brd, prp)
if 0 != r:
- print pyprefix + errorprefix + 'do_firmware_program_eth(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip', '0')
+ print (pyprefix + errorprefix + 'do_firmware_program_eth(): FAILURE sending in maintenance mode eth board @ ' + adr.get('ip', '0'))
return r
command = 'FirmwareUpdater --nogui --program --device ' + brd.find('ondevice').text + ' --id eth1 --eth_board ' + adr.get('ip', '0') + ' --file ' + fw.find('file').text + ' --verbosity ' + str(_verbosityFU)
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_program_eth(): uploading eth firmware w/ command:'
- print pyprefix + debugprefix + command
+ print (pyprefix + debugprefix + 'do_firmware_program_eth(): uploading eth firmware w/ command:' )
+ print (pyprefix + debugprefix + command )
if _verbose > 0:
boardtype = brd.get('type')
timeofupload = getTimeOfFirmwareUpdate(boardtype)
- print pyprefix + ' - message: please be prepared to wait for some time ... fw program of a ' + boardtype + ' typically lasts ' + str(timeofupload) + ' seconds'
+ print (pyprefix + ' - message: please be prepared to wait for some time ... fw program of a ' + boardtype + ' typically lasts ' + str(timeofupload) + ' seconds')
if 1 == _debugmode:
r = 0
@@ -752,18 +766,18 @@ def do_firmware_program_eth(brd, prp):
r = r / 256
if 0 != r:
- print pyprefix + errorprefix + 'do_firmware_program_eth(): FAILURE programming eth board @ ' + adr.get('ip', '0')
+ print (pyprefix + errorprefix + 'do_firmware_program_eth(): FAILURE programming eth board @ ' + adr.get('ip', '0'))
return r
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_program_eth(): done!'
+ print (pyprefix + debugprefix + 'do_firmware_program_eth(): done!')
return r
# end of: def
-#print pyprefix + 'processing: part = ' + part.get('name') + ', board = ' + brd.get('type') + ', name = ' + brd.get('name') + ', address = ' + from_board_to_stringofaddress(brd)
+#print (pyprefix + 'processing: part = ' + part.get('name') + ', board = ' + brd.get('type') + ', name = ' + brd.get('name') + ', address = ' + from_board_to_stringofaddress(brd))
def get_string_of_firmwareproperties(prp):
fw = prp.find('firmware')
@@ -774,12 +788,12 @@ def get_string_of_firmwareproperties(prp):
# it prints info about a given board as found in firmware xml file
def print_firmware_info(partname, brd, prp):
r = 0
- print pyprefix + ' - [INFO] board = ' + brd.get('type') + ', ' + get_string_of_firmwareproperties(prp)
+ print (pyprefix + ' - [INFO] board = ' + brd.get('type') + ', ' + get_string_of_firmwareproperties(prp))
import os.path
fw = prp.find('firmware')
fname = fw.find('file').text
if False == os.path.exists(fname):
- print pyprefix + ' - [ERROR] file ' + fname + ' does not exist'
+ print (pyprefix + ' - [ERROR] file ' + fname + ' does not exist')
return 1
return r
# end of: def
@@ -799,40 +813,40 @@ def do_firmware_update(brd, prp):
r = do_firmware_verify_eth(brd, prp)
if 0 == r:
- print pyprefix + ' - message: the board already has the most recent FW.'
+ print (pyprefix + ' - message: the board already has the most recent FW.')
r = 10
if _verbose > 1:
adr = brd.find('ataddress').attrib
- print pyprefix + debugprefix + 'do_firmware_update(): no need to program board @ ' + adr.get('ip', '0')
+ print (pyprefix + debugprefix + 'do_firmware_update(): no need to program board @ ' + adr.get('ip', '0') )
elif 1 == r:
- print pyprefix + ' - message: the board has an old FW which is going to be udapted.'
+ print (pyprefix + ' - message: the board has an old FW which is going to be udapted.')
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_update(): will program board @ ' + adr.get('ip', '0')
+ print (pyprefix + debugprefix + 'do_firmware_update(): will program board @ ' + adr.get('ip', '0'))
r = do_firmware_program_eth(brd, prp)
else:
- print pyprefix + errorprefix + 'do_firmware_update(): FAILURE because cannot verify board @ ' + adr.get('ip', '0')
+ print (pyprefix + errorprefix + 'do_firmware_update(): FAILURE because cannot verify board @ ' + adr.get('ip', '0') )
elif 0 != adr.get('canadr', 0):
r = do_firmware_verify_canovereth(brd, prp)
if 0 == r:
- print pyprefix + ' - message: the board already has the most recent FW.'
+ print (pyprefix + ' - message: the board already has the most recent FW.')
r = 10
if _verbose > 1:
adr = brd.find('ataddress').attrib
- print pyprefix + debugprefix + 'do_firmware_update(): no need to program board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_update(): no need to program board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') )
elif 1 == r:
- print pyprefix + ' - message: the board has an old FW which is going to be udapted.'
+ print (pyprefix + ' - message: the board has an old FW which is going to be udapted.')
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_update(): will program board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_update(): will program board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') )
r = do_firmware_program_canovereth(brd, prp)
else:
- print pyprefix + errorprefix + 'do_firmware_update(): FAILURE because cannot find board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + errorprefix + 'do_firmware_update(): FAILURE because cannot find board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') )
else:
- print pyprefix + errorprefix + 'do_firmware_update(): FAILURE the device ' + ondevice + ' with CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') + ' is unsupported'
+ print (pyprefix + errorprefix + 'do_firmware_update(): FAILURE the device ' + ondevice + ' with CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') + ' is unsupported')
r = 2
elif 'CFW' == ondevice:
@@ -840,21 +854,21 @@ def do_firmware_update(brd, prp):
r = do_firmware_verify_cfw(brd, prp)
if 0 == r:
- print pyprefix + ' - message: the board already has the most recent FW.'
+ print (pyprefix + ' - message: the board already has the most recent FW.')
r = 10
if _verbose > 1:
adr = brd.find('ataddress').attrib
- print pyprefix + debugprefix + 'do_firmware_update(): no need to program board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_update(): no need to program board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') )
elif 1 == r:
- print pyprefix + ' - message: the board has an old FW which is going to be udapted.'
+ print (pyprefix + ' - message: the board has an old FW which is going to be udapted.')
if _verbose > 1:
- print pyprefix + debugprefix + 'do_firmware_update(): will program board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + debugprefix + 'do_firmware_update(): will program board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') )
r = do_firmware_program_cfw(brd, prp)
else:
- print pyprefix + errorprefix + 'do_firmware_update(): FAILURE because cannot find board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0')
+ print (pyprefix + errorprefix + 'do_firmware_update(): FAILURE because cannot find board @ ' + adr.get('ip', '0') + ':CAN' + adr.get('canbus', '0') + ':' + adr.get('canadr', '0') )
else:
- print pyprefix + errorprefix + 'do_firmware_update(): FAILURE the device ' + ondevice + ' is unsupported'
+ print (pyprefix + errorprefix + 'do_firmware_update(): FAILURE the device ' + ondevice + ' is unsupported')
r = 1
return r
@@ -874,19 +888,19 @@ def query(targetpart, targetboard, robotroot, boardroot, verbose):
countOfAttempts = 0
if _verbose > 1:
- print pyprefix + '[debug] processing a --query request:'
+ print (pyprefix + '[debug] processing a --query request:')
for part in robotroot.findall('part'):
- # print pyprefix + part.tag, part.attrib
+ # print (pyprefix + part.tag, part.attrib)
if ('all' == targetpart) or (targetpart == part.get('name')):
- #print pyprefix + 'processing part = ' + part.get('name')
+ #print (pyprefix + 'processing part = ' + part.get('name'))
for brd in part.findall('board'):
prp = get_board_properties2(boardroot, brd)
if len(prp) == 0:
- print pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file'
- print pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd)
+ print (pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file')
+ print (pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd))
continue
if ('all' == targetboard) or (targetboard == brd.get('type')):
@@ -899,31 +913,31 @@ def query(targetpart, targetboard, robotroot, boardroot, verbose):
countOfExcluded = countOfExcluded + 1
if _verbose > 0:
- print pyprefix + '- EXCLUSION #' + str(countOfExcluded)
- print pyprefix + ' - of: ' + details
+ print (pyprefix + '- EXCLUSION #' + str(countOfExcluded))
+ print (pyprefix + ' - of: ' + details)
else:
countOfAttempts = countOfAttempts + 1
if _verbose > 0:
- print pyprefix + '- OPERATION #' + str(countOfAttempts)
- print pyprefix + ' - type: firmware query'
- print pyprefix + ' - target: ' + details
- print pyprefix + ' - using: ' + get_string_of_firmwareproperties(prp)
+ print (pyprefix + '- OPERATION #' + str(countOfAttempts))
+ print (pyprefix + ' - type: firmware query')
+ print (pyprefix + ' - target: ' + details)
+ print (pyprefix + ' - using: ' + get_string_of_firmwareproperties(prp))
r = do_firmware_query(brd, prp)
if 0 == r:
if _verbose > 0:
- print pyprefix + ' - result: SUCCESS!! found the board'
+ print (pyprefix + ' - result: SUCCESS!! found the board')
elif 1 == r:
countOfFailures = countOfFailures + 1
- print pyprefix + ' - result: FAILURE!! the remote board cannot be found'
+ print (pyprefix + ' - result: FAILURE!! the remote board cannot be found')
else:
countOfFailures = countOfFailures + 1
- print pyprefix + ' - result: FAILURE!! unknown return value from FirmwareUpdater =' + r
+ print (pyprefix + ' - result: FAILURE!! unknown return value from FirmwareUpdater =' + r)
# end of: if _excl...
# end of: if targetboard
@@ -954,19 +968,19 @@ def verify(targetpart, targetboard, robotroot, boardroot, verbose):
estimatedTimeForFWprogram = 0
if _verbose > 1:
- print pyprefix + '[debug] processing a --verify request:'
+ print (pyprefix + '[debug] processing a --verify request:')
for part in robotroot.findall('part'):
- # print pyprefix + part.tag, part.attrib
+ # print (pyprefix + part.tag, part.attrib)
if ('all' == targetpart) or (targetpart == part.get('name')):
- #print pyprefix + 'processing part = ' + part.get('name')
+ #print (pyprefix + 'processing part = ' + part.get('name'))
for brd in part.findall('board'):
prp = get_board_properties2(boardroot, brd)
if len(prp) == 0:
- print pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file'
- print pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd)
+ print (pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file')
+ print (pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd))
continue
if ('all' == targetboard) or (targetboard == brd.get('type')):
@@ -979,36 +993,36 @@ def verify(targetpart, targetboard, robotroot, boardroot, verbose):
countOfExcluded = countOfExcluded + 1
if _verbose > 0:
- print pyprefix + '- EXCLUSION #' + str(countOfExcluded)
- print pyprefix + ' - of: ' + details
+ print (pyprefix + '- EXCLUSION #' + str(countOfExcluded))
+ print (pyprefix + ' - of: ' + details)
else:
countOfAttempts = countOfAttempts + 1
if _verbose > 0:
- print pyprefix + '- OPERATION #' + str(countOfAttempts)
- print pyprefix + ' - type: firmware verify'
- print pyprefix + ' - target: ' + details
- print pyprefix + ' - using: ' + get_string_of_firmwareproperties(prp)
+ print (pyprefix + '- OPERATION #' + str(countOfAttempts))
+ print (pyprefix + ' - type: firmware verify')
+ print (pyprefix + ' - target: ' + details)
+ print (pyprefix + ' - using: ' + get_string_of_firmwareproperties(prp))
r = do_firmware_verify(brd, prp)
if 0 == r:
if _verbose > 0:
- print pyprefix + ' - result: SUCCESS!! the fw version on remote board matches the requirements'
+ print (pyprefix + ' - result: SUCCESS!! the fw version on remote board matches the requirements')
elif 1 == r:
countOfRequiredUpdates = countOfRequiredUpdates + 1
brdtime = getTimeOfFirmwareUpdate(brd.get('type'))
estimatedTimeForFWprogram = estimatedTimeForFWprogram + brdtime
- print pyprefix + ' - result: ACTION!! the fw version of remote board must be updated (estimated time = ' + str(brdtime) + ' seconds)'
+ print (pyprefix + ' - result: ACTION!! the fw version of remote board must be updated (estimated time = ' + str(brdtime) + ' seconds)')
elif 2 == r:
countOfFailures = countOfFailures + 1
- print pyprefix + ' - result: FAILURE!! the remote board cannot be found'
+ print (pyprefix + ' - result: FAILURE!! the remote board cannot be found')
else:
countOfFailures = countOfFailures + 1
- print pyprefix + ' - result: FAILURE!! unknown return value from FirmwareUpdater =' + r
+ print (pyprefix + ' - result: FAILURE!! unknown return value from FirmwareUpdater =' + r)
# end of: if _excl...
# end of: if targetboard
@@ -1018,14 +1032,14 @@ def verify(targetpart, targetboard, robotroot, boardroot, verbose):
if _verbose > 0:
print_result('verify()', countOfFound, countOfExcluded, countOfFailures)
- print pyprefix + '-- Number of boards which need FW update: ' + str(countOfRequiredUpdates)
+ print (pyprefix + '-- Number of boards which need FW update: ' + str(countOfRequiredUpdates))
mi = estimatedTimeForFWprogram // 60
ho = mi // 60
h = ho
m = mi % 60
s = estimatedTimeForFWprogram % 60
- print pyprefix + '-- Estimated time for FW program of boards w/ old FW version: ' + str(estimatedTimeForFWprogram) + ' seconds (' + str(h) + 'h' + str(m) + 'm' + str(s) + 's)'
- print pyprefix + '--'
+ print (pyprefix + '-- Estimated time for FW program of boards w/ old FW version: ' + str(estimatedTimeForFWprogram) + ' seconds (' + str(h) + 'h' + str(m) + 'm' + str(s) + 's)')
+ print (pyprefix + '--')
# end of if ...
# end of if ...
@@ -1044,19 +1058,19 @@ def maintenance(targetpart, targetboard, robotroot, boardroot, verbose):
countOfAttempts = 0
if _verbose > 1:
- print pyprefix + '[debug] processing a --forcemaintenance request:'
+ print (pyprefix + '[debug] processing a --forcemaintenance request:')
for part in robotroot.findall('part'):
- # print pyprefix + part.tag, part.attrib
+ # print (pyprefix + part.tag, part.attrib)
if ('all' == targetpart) or (targetpart == part.get('name')):
- #print pyprefix + 'processing part = ' + part.get('name')
+ #print (pyprefix + 'processing part = ' + part.get('name'))
for brd in part.findall('board'):
prp = get_board_properties2(boardroot, brd)
if len(prp) == 0:
- print pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file'
- print pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd)
+ print (pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file')
+ print (pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd))
continue
if ('all' == targetboard) or (targetboard == brd.get('type')):
@@ -1069,26 +1083,26 @@ def maintenance(targetpart, targetboard, robotroot, boardroot, verbose):
countOfExcluded = countOfExcluded + 1
if _verbose > 0:
- print pyprefix + '- EXCLUSION #' + str(countOfExcluded)
- print pyprefix + ' - of: ' + details
+ print (pyprefix + '- EXCLUSION #' + str(countOfExcluded))
+ print (pyprefix + ' - of: ' + details)
else:
countOfAttempts = countOfAttempts + 1
if _verbose > 0:
- print pyprefix + '- OPERATION #' + str(countOfAttempts)
- print pyprefix + ' - type: force maintenance'
- print pyprefix + ' - target: ' + details
+ print (pyprefix + '- OPERATION #' + str(countOfAttempts))
+ print (pyprefix + ' - type: force maintenance')
+ print (pyprefix + ' - target: ' + details )
r = goto_maintenance(brd, prp)
if 0 != r:
countOfFailures = countOfFailures + 1
- print pyprefix + ' - result: FAILURE!! (However, the operation will be attempted with other boards until completion)'
+ print (pyprefix + ' - result: FAILURE!! (However, the operation will be attempted with other boards until completion)')
# exit()
elif _verbose > 0:
- print pyprefix + ' - result: SUCCESS'
+ print (pyprefix + ' - result: SUCCESS')
# end of: if _excl...
# end of: if targetboard
@@ -1117,19 +1131,19 @@ def program(targetpart, targetboard, robotroot, boardroot, verbose):
countOfAttempts = 0
if _verbose > 1:
- print pyprefix + '[debug] processing a --program request:'
+ print (pyprefix + '[debug] processing a --program request:')
for part in robotroot.findall('part'):
- # print pyprefix + part.tag, part.attrib
+ # print (pyprefix + part.tag, part.attrib)
if ('all' == targetpart) or (targetpart == part.get('name')):
- #print pyprefix + 'processing part = ' + part.get('name')
+ #print (pyprefix + 'processing part = ' + part.get('name'))
for brd in part.findall('board'):
prp = get_board_properties2(boardroot, brd)
if len(prp) == 0:
- print pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file'
- print pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd)
+ print (pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file')
+ print (pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd))
continue
if ('all' == targetboard) or (targetboard == brd.get('type')):
@@ -1142,27 +1156,27 @@ def program(targetpart, targetboard, robotroot, boardroot, verbose):
countOfExcluded = countOfExcluded + 1
if _verbose > 0:
- print pyprefix + '- EXCLUSION #' + str(countOfExcluded)
- print pyprefix + ' - of: ' + details
+ print (pyprefix + '- EXCLUSION #' + str(countOfExcluded))
+ print (pyprefix + ' - of: ' + details)
else:
countOfAttempts = countOfAttempts + 1
if _verbose > 0:
- print pyprefix + '- OPERATION #' + str(countOfAttempts)
- print pyprefix + ' - type: firmware program'
- print pyprefix + ' - target: ' + details
- print pyprefix + ' - using: ' + get_string_of_firmwareproperties(prp)
+ print (pyprefix + '- OPERATION #' + str(countOfAttempts))
+ print (pyprefix + ' - type: firmware program')
+ print (pyprefix + ' - target: ' + details)
+ print (pyprefix + ' - using: ' + get_string_of_firmwareproperties(prp))
r = do_firmware_program(brd, prp)
if 0 != r:
countOfFailures = countOfFailures + 1
- print pyprefix + ' - result: FAILURE!! (However, the operation will be attempted with other boards until completion)'
+ print (pyprefix + ' - result: FAILURE!! (However, the operation will be attempted with other boards until completion)')
# exit()
elif _verbose > 0:
- print pyprefix + ' - result: SUCCESS'
+ print (pyprefix + ' - result: SUCCESS')
# end of: if _excl...
# end of: if targetboard
@@ -1189,19 +1203,19 @@ def update(targetpart, targetboard, robotroot, boardroot, verbose):
countOfAttempts = 0
if _verbose > 1:
- print pyprefix + '[debug] processing a --update request:'
+ print (pyprefix + '[debug] processing a --update request:')
for part in robotroot.findall('part'):
- # print pyprefix + part.tag, part.attrib
+ # print (pyprefix + part.tag, part.attrib)
if ('all' == targetpart) or (targetpart == part.get('name')):
- #print pyprefix + 'processing part = ' + part.get('name')
+ #print (pyprefix + 'processing part = ' + part.get('name'))
for brd in part.findall('board'):
prp = get_board_properties2(boardroot, brd)
if len(prp) == 0:
- print pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file'
- print pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd)
+ print (pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file')
+ print (pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd))
continue
if ('all' == targetboard) or (targetboard == brd.get('type')):
@@ -1214,30 +1228,30 @@ def update(targetpart, targetboard, robotroot, boardroot, verbose):
countOfExcluded = countOfExcluded + 1
if _verbose > 0:
- print pyprefix + '- EXCLUSION #' + str(countOfExcluded)
- print pyprefix + ' - of: ' + details
+ print (pyprefix + '- EXCLUSION #' + str(countOfExcluded))
+ print (pyprefix + ' - of: ' + details)
else:
countOfAttempts = countOfAttempts + 1
if _verbose > 0:
- print pyprefix + '- OPERATION #' + str(countOfAttempts)
- print pyprefix + ' - type: firmware update'
- print pyprefix + ' - target: ' + details
- print pyprefix + ' - using: ' + get_string_of_firmwareproperties(prp)
+ print (pyprefix + '- OPERATION #' + str(countOfAttempts))
+ print (pyprefix + ' - type: firmware update')
+ print (pyprefix + ' - target: ' + details)
+ print (pyprefix + ' - using: ' + get_string_of_firmwareproperties(prp))
r = do_firmware_update(brd, prp)
if 0 == r:
if _verbose > 0:
- print pyprefix + ' - result: SUCCESS: the board has been programmed with latest firmware version'
+ print (pyprefix + ' - result: SUCCESS: the board has been programmed with latest firmware version')
elif 10 == r:
if _verbose > 0:
- print pyprefix + ' - result: SUCCESS: the board already has the latest version of firmware'
+ print (pyprefix + ' - result: SUCCESS: the board already has the latest version of firmware')
else:
countOfFailures = countOfFailures + 1
- print pyprefix + ' - result: FAILURE!! (However, the operation will be attempted with other boards until completion)'
+ print (pyprefix + ' - result: FAILURE!! (However, the operation will be attempted with other boards until completion)')
# exit()
@@ -1266,19 +1280,19 @@ def maintenance(targetpart, targetboard, robotroot, boardroot, verbose):
countOfAttempts = 0
if _verbose > 1:
- print pyprefix + '[debug] processing a --forcemaintenance request:'
+ print (pyprefix + '[debug] processing a --forcemaintenance request:')
for part in robotroot.findall('part'):
- # print pyprefix + part.tag, part.attrib
+ # print (pyprefix + part.tag, part.attrib)
if ('all' == targetpart) or (targetpart == part.get('name')):
- #print pyprefix + 'processing part = ' + part.get('name')
+ #print (pyprefix + 'processing part = ' + part.get('name'))
for brd in part.findall('board'):
prp = get_board_properties2(boardroot, brd)
if len(prp) == 0:
- print pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file'
- print pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd)
+ print (pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file')
+ print (pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd))
continue
if ('all' == targetboard) or (targetboard == brd.get('type')):
@@ -1291,26 +1305,26 @@ def maintenance(targetpart, targetboard, robotroot, boardroot, verbose):
countOfExcluded = countOfExcluded + 1
if _verbose > 0:
- print pyprefix + '- EXCLUSION #' + str(countOfExcluded)
- print pyprefix + ' - of: ' + details
+ print (pyprefix + '- EXCLUSION #' + str(countOfExcluded))
+ print (pyprefix + ' - of: ' + details)
else:
countOfAttempts = countOfAttempts + 1
if _verbose > 0:
- print pyprefix + '- OPERATION #' + str(countOfAttempts)
- print pyprefix + ' - type: force maintenance'
- print pyprefix + ' - target: ' + details
+ print (pyprefix + '- OPERATION #' + str(countOfAttempts))
+ print (pyprefix + ' - type: force maintenance')
+ print (pyprefix + ' - target: ' + details )
r = goto_maintenance(brd, prp)
if 0 != r:
countOfFailures = countOfFailures + 1
- print pyprefix + ' - result: FAILURE!! (However, the operation will be attempted with other boards until completion)'
+ print (pyprefix + ' - result: FAILURE!! (However, the operation will be attempted with other boards until completion)')
# exit()
elif _verbose > 0:
- print pyprefix + ' - result: SUCCESS'
+ print (pyprefix + ' - result: SUCCESS')
# end of: if _excl...
# end of: if targetboard
@@ -1337,19 +1351,19 @@ def application(targetpart, targetboard, robotroot, boardroot, verbose):
countOfAttempts = 0
if _verbose > 1:
- print pyprefix + '[debug] processing a --forceapplication request:'
+ print (pyprefix + '[debug] processing a --forceapplication request:')
for part in robotroot.findall('part'):
- # print pyprefix + part.tag, part.attrib
+ # print (pyprefix + part.tag, part.attrib)
if ('all' == targetpart) or (targetpart == part.get('name')):
- #print pyprefix + 'processing part = ' + part.get('name')
+ #print (pyprefix + 'processing part = ' + part.get('name'))
for brd in part.findall('board'):
prp = get_board_properties2(boardroot, brd)
if len(prp) == 0:
- print pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file'
- print pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd)
+ print (pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file')
+ print (pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd))
continue
if ('all' == targetboard) or (targetboard == brd.get('type')):
@@ -1362,26 +1376,26 @@ def application(targetpart, targetboard, robotroot, boardroot, verbose):
countOfExcluded = countOfExcluded + 1
if _verbose > 0:
- print pyprefix + '- EXCLUSION #' + str(countOfExcluded)
- print pyprefix + ' - of: ' + details
+ print (pyprefix + '- EXCLUSION #' + str(countOfExcluded))
+ print (pyprefix + ' - of: ' + details)
else:
countOfAttempts = countOfAttempts + 1
if _verbose > 0:
- print pyprefix + '- OPERATION #' + str(countOfAttempts)
- print pyprefix + ' - type: force application'
- print pyprefix + ' - target: ' + details
+ print (pyprefix + '- OPERATION #' + str(countOfAttempts))
+ print (pyprefix + ' - type: force application')
+ print (pyprefix + ' - target: ' + details)
r = goto_application(brd, prp)
if 0 != r:
countOfFailures = countOfFailures + 1
- print pyprefix + ' - result: FAILURE!! (However, the operation will be attempted with other boards until completion)'
+ print (pyprefix + ' - result: FAILURE!! (However, the operation will be attempted with other boards until completion)')
# exit()
elif _verbose > 0:
- print pyprefix + ' - result: SUCCESS'
+ print (pyprefix + ' - result: SUCCESS')
# end of: if _excl...
# end of: if targetboard
@@ -1411,19 +1425,19 @@ def info(targetpart, targetboard, robotroot, boardroot, verbose):
estimatedTimeForFWprogram = 0;
if _verbose > 1:
- print pyprefix + '[debug] processing a --info request:'
+ print (pyprefix + '[debug] processing a --info request:')
for part in robotroot.findall('part'):
- # print pyprefix + part.tag, part.attrib
+ # print (pyprefix + part.tag, part.attrib)
if ('all' == targetpart) or (targetpart == part.get('name')):
- #print pyprefix + 'processing part = ' + part.get('name')
+ #print (pyprefix + 'processing part = ' + part.get('name'))
for brd in part.findall('board'):
prp = get_board_properties2(boardroot, brd)
if len(prp) == 0:
- print pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file'
- print pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd)
+ print (pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file')
+ print (pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd))
continue
if ('all' == targetboard) or (targetboard == brd.get('type')):
@@ -1436,8 +1450,8 @@ def info(targetpart, targetboard, robotroot, boardroot, verbose):
countOfExcluded = countOfExcluded + 1
if _verbose > 0:
- print pyprefix + '- EXCLUSION #' + str(countOfExcluded)
- print pyprefix + ' - of: ' + details
+ print (pyprefix + '- EXCLUSION #' + str(countOfExcluded))
+ print (pyprefix + ' - of: ' + details)
else:
@@ -1446,18 +1460,18 @@ def info(targetpart, targetboard, robotroot, boardroot, verbose):
estimatedTimeForFWprogram = estimatedTimeForFWprogram + getTimeOfFirmwareUpdate(brd.get('type'))
if _verbose > 0:
- print pyprefix + '- OPERATION #' + str(countOfAttempts)
- print pyprefix + ' - type: info from xml file'
- print pyprefix + ' - target: ' + details
+ print (pyprefix + '- OPERATION #' + str(countOfAttempts))
+ print (pyprefix + ' - type: info from xml file')
+ print (pyprefix + ' - target: ' + details)
r = print_firmware_info(part.get('name'), brd, prp)
if 0 != r:
countOfFailures = countOfFailures + 1
- print pyprefix + ' - result: FAILURE!! (However, the operation will be attempted with other boards until completion)'
+ print (pyprefix + ' - result: FAILURE!! (However, the operation will be attempted with other boards until completion)')
# exit()
elif _verbose > 0:
- print pyprefix + ' - result: SUCCESS'
+ print (pyprefix + ' - result: SUCCESS')
# end of: if _excl...
@@ -1474,8 +1488,8 @@ def info(targetpart, targetboard, robotroot, boardroot, verbose):
h = ho
m = mi % 60
s = estimatedTimeForFWprogram % 60
- print pyprefix + '-- Estimated time for FW program of all boards: ' + str(estimatedTimeForFWprogram) + ' seconds (' + str(h) + 'h' + str(m) + 'm' + str(s) + 's)'
- print pyprefix + '--'
+ print (pyprefix + '-- Estimated time for FW program of all boards: ' + str(estimatedTimeForFWprogram) + ' seconds (' + str(h) + 'h' + str(m) + 'm' + str(s) + 's)')
+ print (pyprefix + '--')
# end of if ...
return r
@@ -1495,16 +1509,15 @@ def findInprev(currIP, targetpart, targetboard, robotroot, boardroot, verbose):
#print 'looking for a prev = ' + currIP
for part in robotroot.findall('part'):
- # print pyprefix + part.tag, part.attrib
+ # print (pyprefix + part.tag, part.attrib)
if ('all' == targetpart) or (targetpart == part.get('name')):
- #print pyprefix + 'processing part = ' + part.get('name')
+ #print (pyprefix + 'processing part = ' + part.get('name'))
for brd in part.findall('board'):
prp = get_board_properties2(boardroot, brd)
-
if len(prp) == 0:
- print pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file'
- print pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd)
+ print (pyprefix + errorprefix + 'cannot find a match for ' + 'following board' + ' in firmware xml file. i continue parsing other boards of network file')
+ print (pyprefix + errorprefix + 'part = ' + part.get('name') + ', ' + get_string_of_fulldescriptionofboard(brd))
continue
if ('all' == targetboard) or (targetboard == brd.get('type')):
@@ -1516,8 +1529,8 @@ def findInprev(currIP, targetpart, targetboard, robotroot, boardroot, verbose):
countOfExcluded = countOfExcluded + 1
if _verbose > 0:
- print pyprefix + '- EXCLUSION #' + str(countOfExcluded)
- print pyprefix + ' - of: ' + details
+ print (pyprefix + '- EXCLUSION #' + str(countOfExcluded))
+ print (pyprefix + ' - of: ' + details)
else:
@@ -1564,26 +1577,26 @@ def topology(targetpart, targetboard, robotroot, boardroot, verbose):
estimatedTimeForFWprogram = 0;
if _verbose > 1:
- print pyprefix + '[debug] processing a --topology request:'
+ print (pyprefix + '[debug] processing a --topology request:')
currIP = '10.0.1.104'
nextIP = 'none'
prevIP = 'none'
- print pyprefix + ' (in daisy chain order)'
- #print pyprefix + ' | (in daisy chain order)'
- print pyprefix + ' -> 10.0.1.104 [linux host] ->'
+ print (pyprefix + ' (in daisy chain order)' )
+ #print (pyprefix + ' | (in daisy chain order)')
+ print (pyprefix + ' -> 10.0.1.104 [linux host] ->')
while True:
brd = findInprev(currIP, targetpart, targetboard, robotroot, boardroot, verbose)
if 'none' == brd:
break
- print pyprefix + ' -> ' + from_board_to_stringofIPaddress(brd) + ' [' + brd.get('type') + ', ' + brd.get('name') + '] ->'
+ print (pyprefix + ' -> ' + from_board_to_stringofIPaddress(brd) + ' [' + brd.get('type') + ', ' + brd.get('name') + '] ->')
adr = brd.find('ataddress').attrib
currIP = adr.get('ip', '0')
- print pyprefix + ' -> END'
- print pyprefix + ''
+ print (pyprefix + ' -> END')
+ print (pyprefix + '')
return r
@@ -1593,14 +1606,14 @@ def topology(targetpart, targetboard, robotroot, boardroot, verbose):
def print_result(nameOfCaller, nFound, nExcluded, nFailures):
- print pyprefix + '--'
- print pyprefix + '-- FINAL REPORT for ' + str(nameOfCaller)
- print pyprefix + '-- Number of boards matching your criteria (w/ --part ' + _part + ' --board ' + _board + '): ' + str(nFound)
- print pyprefix + '-- Number of boards excluded from the above number (w/ --excludeboard ' + _excludedboard + '): ' + str(nExcluded)
- print pyprefix + '-- Number of boards for which the operation was attempted: ' + str(nFound - nExcluded)
- print pyprefix + '-- Number of boards for which the operation had success: ' + str(nFound - nExcluded - nFailures)
- print pyprefix + '-- Number of boards for which the operation failed: ' + str(nFailures)
- print pyprefix + '--'
+ print (pyprefix + '--')
+ print (pyprefix + '-- FINAL REPORT for ' + str(nameOfCaller) )
+ print (pyprefix + '-- Number of boards matching your criteria (w/ --part ' + _part + ' --board ' + _board + '): ' + str(nFound) )
+ print (pyprefix + '-- Number of boards excluded from the above number (w/ --excludeboard ' + _excludedboard + '): ' + str(nExcluded))
+ print (pyprefix + '-- Number of boards for which the operation was attempted: ' + str(nFound - nExcluded))
+ print (pyprefix + '-- Number of boards for which the operation had success: ' + str(nFound - nExcluded - nFailures))
+ print (pyprefix + '-- Number of boards for which the operation failed: ' + str(nFailures) )
+ print (pyprefix + '--')
# end of: def print_result()
@@ -1609,6 +1622,7 @@ def print_result(nameOfCaller, nFound, nExcluded, nFailures):
if __name__ == '__main__':
import argparse
+
from argparse import RawTextHelpFormatter
parser = argparse.ArgumentParser(description='This script is a front-end for the FirmwareUpdater program in non GUI mode. ' +
'It performs automatic firmware program on the whole robot, on parts of it, or even on selected board types. ' +
@@ -1625,11 +1639,12 @@ def print_result(nameOfCaller, nFound, nExcluded, nFailures):
parser.add_argument('-p', '--part', action='store', required=False, default='all',
choices=['all', 'head', 'face', 'left_arm', 'right_arm', 'torso', 'left_leg', 'right_leg', 'custom', 'test'],
help='the part on which to perform the action. default = all')
+ #tumme
parser.add_argument('-b', '--board', action='store', required=False, default='all',
- choices=['all', 'ems4', 'mc4plus', 'mc2plus', 'mtb', 'mtb4', 'strain', 'strain2', 'foc', 'mc4', 'mais', 'bll', 'dsp'],
+ choices=['all', 'ems4', 'mc4plus', 'mc2plus', 'mtb', 'mtb4', 'mtb4c','strain', 'strain2', 'strain2c', 'rfe', 'foc', 'foc-special', 'mc4', 'mais', 'bll', 'dsp', 'amc', 'amcbldc'],
help='the board on which to perform the action. default = all')
parser.add_argument('-xb', '--excludeboard', action='store', required=False, default='none',
- choices=['none', 'ems4', 'mc4plus', 'mc2plus', 'mtb', 'mtb4', 'strain', 'strain2', 'foc', 'mc4', 'mais', 'bll', 'dsp'],
+ choices=['none', 'ems4', 'mc4plus', 'mc2plus', 'mtb', 'mtb4', 'mtb4c', 'strain', 'strain2', 'strain2c', 'rfe', 'foc', 'foc-special', 'mc4', 'mais', 'bll', 'dsp', 'amc', 'amcbldc'],
help='exclude a board on which to perform the action. default = none')
parser.add_argument('-a', '--action', action='store', required=True, default='info', choices=['info', 'topology', 'query', 'verify', 'update', 'program', 'forcemaintenance', 'forceapplication'],
help='the action to perform on board(s) selected by --part and --board. ' +
@@ -1661,34 +1676,38 @@ def print_result(nameOfCaller, nFound, nExcluded, nFailures):
_excludedboard = args.excludeboard
+ import datetime
# some warnings ...
if _debugmode:
- print pyprefix + '[warning] debugmode is enabled!'
+ print (pyprefix + '[warning] debugmode is enabled!')
if _verbosity > 0:
- print pyprefix + '[info] the script is executing'
+ print (pyprefix + '[info] the script is executing')
if 0 == _verbosity:
_verbose = 0
_verbosityFU = 0
elif 1 == _verbosity:
- print pyprefix + "[info] verbosity turned on for basic python only"
+ print (pyprefix + "[info] verbosity turned on for basic python only" )
_verbose = 1
_verbosityFU = 0
elif 2 == _verbosity:
- print pyprefix + "[info] verbosity turned on for full python only"
+ print (pyprefix + "[info] verbosity turned on for full python only" )
_verbose = 2
_verbosityFU = 0
else:
- print pyprefix + "[info] verbosity turned on for full python and FirmwareUpdater"
+ print (pyprefix + "[info] verbosity turned on for full python and FirmwareUpdater" )
_verbose = 3
_verbosityFU = 1
+ # get the current date and time
+ now = datetime.datetime.now()
+ print(now)
# open the xml files: one for robot description and one for board properties
@@ -1720,10 +1739,15 @@ def print_result(nameOfCaller, nFound, nExcluded, nFailures):
elif _action == 'topology':
r = topology(_part, _board, xmlrootOfRobot, xmlrootOfBoards, _verbose)
else:
- print pyprefix + '[error] unsupported action: ' + _action
+ print (pyprefix + '[error] unsupported action: ' + _action)
if _verbosity > 0:
- print pyprefix + '[info] the script is over'
+ print (pyprefix + '[info] the script is over')
+
+
+ # get the current date and time
+ now = datetime.datetime.now()
+ print(now)