diff --git a/src/smpclient/transport/serial/__init__.py b/src/smpclient/transport/serial/__init__.py index 50d5009..eaa3cfc 100644 --- a/src/smpclient/transport/serial/__init__.py +++ b/src/smpclient/transport/serial/__init__.py @@ -8,4 +8,6 @@ from smpclient.transport.serial.encoded import BufferSize as BufferSize from smpclient.transport.serial.encoded import FragmentationStrategy as FragmentationStrategy from smpclient.transport.serial.encoded import SMPSerialTransport as SMPSerialTransport +from smpclient.transport.serial.framing import SerialFraming as SerialFraming +from smpclient.transport.serial.framing.cobs import Cobs as Cobs from smpclient.transport.serial.unencoded import SMPSerialRawTransport as SMPSerialRawTransport diff --git a/src/smpclient/transport/serial/framing/__init__.py b/src/smpclient/transport/serial/framing/__init__.py new file mode 100644 index 0000000..470994e --- /dev/null +++ b/src/smpclient/transport/serial/framing/__init__.py @@ -0,0 +1,28 @@ +"""Pluggable wire framing for the raw serial SMP transport. + +`SMPSerialRawTransport` sends bare bytes when its `framing` is `None`; a `SerialFraming` +wraps each SMP message instead (e.g. `cobs.Cobs`). A framing owns its connection's +reassembly buffer, so it is stateful: one instance per transport. +""" + +from typing import Iterator, Protocol + + +class SerialFraming(Protocol): + """Wire framing plus a stateful frame decoder for one serial connection.""" + + def encode(self, data: bytes) -> Iterator[bytes]: # pragma: no cover + """Yield the wire bytes framing the SMP message `data`.""" + + def feed(self, data: bytes) -> None: # pragma: no cover + """Buffer received bytes for decoding.""" + + def take(self) -> bytes | None: # pragma: no cover + """Return the next decoded SMP message, or `None` if no complete frame is buffered. + + Unconsumed bytes persist for the next call (a read may span frame boundaries), and a + framing that can detect corruption drops the damaged frame and resynchronises. + """ + + def reset(self) -> None: # pragma: no cover + """Discard buffered bytes so a new connection starts clean.""" diff --git a/src/smpclient/transport/serial/framing/cobs.py b/src/smpclient/transport/serial/framing/cobs.py new file mode 100644 index 0000000..f5da3e3 --- /dev/null +++ b/src/smpclient/transport/serial/framing/cobs.py @@ -0,0 +1,150 @@ +"""COBS+CRC16 framing for MCUboot raw serial recovery (intercreate/mcuboot#5). + +The COBS codec matches MCUboot's ``boot/boot_serial/src/cobs.c``; the CRC is +reused from `smp.packet`. +""" + +import logging +from dataclasses import dataclass, field +from typing import Final, Iterator + +from smp.packet import CRC16_STRUCT, crc16_func + +logger = logging.getLogger(__name__) + +_DELIMITER: Final = 0 +_CODE_FULL: Final = 0xFF + +_MAX_BUFFER_BYTES: Final = 1 << 16 +"""Resync ceiling: bytes with no `0x00` delimiter past this are noise, not a frame, so the +buffer is dropped. 64 KiB is far above any SMP-over-serial frame (recovery's +`BOOT_SERIAL_MAX_RECEIVE_SIZE` is a few KiB), and bounds memory on a delimiter-free stream +(e.g. a wrong-baud or wrong-protocol peer) the way the length-prefixed transport already does.""" + + +def cobs_encode(data: bytes) -> bytes: + r"""COBS-encode `data`, with no frame delimiter appended. + + >>> cobs_encode(b"").hex() + '01' + >>> cobs_encode(b"\x01\x02\x03").hex() + '04010203' + >>> cobs_encode(b"\x00").hex() + '0101' + >>> cobs_encode(b"\x11\x00\x22").hex() + '02110222' + >>> cobs_decode(cobs_encode(bytes(range(256)))) == bytes(range(256)) + True + """ + out = bytearray([_DELIMITER]) + code_index = 0 + code = 1 + for byte in data: + if byte != _DELIMITER: + out.append(byte) + code += 1 + if code != _CODE_FULL: + continue + out[code_index] = code + code_index = len(out) + out.append(_DELIMITER) + code = 1 + out[code_index] = code + return bytes(out) + + +def cobs_decode(encoded: bytes) -> bytes: + r"""Decode a COBS frame whose delimiter has been stripped; inverse of `cobs_encode`. + + >>> cobs_decode(bytes.fromhex("04010203")).hex() + '010203' + >>> cobs_decode(bytes.fromhex("0101")) + b'\x00' + >>> cobs_decode(bytes.fromhex("00")) + Traceback (most recent call last): + ... + ValueError: 0x00 code byte in COBS frame + >>> cobs_decode(bytes.fromhex("0511")) + Traceback (most recent call last): + ... + ValueError: truncated COBS frame + """ + out = bytearray() + src = 0 + while src < len(encoded): + code = encoded[src] + src += 1 + if code == _DELIMITER: + raise ValueError("0x00 code byte in COBS frame") + for _ in range(1, code): + if src >= len(encoded): + raise ValueError("truncated COBS frame") + out.append(encoded[src]) + src += 1 + if code != _CODE_FULL and src < len(encoded): + out.append(_DELIMITER) + return bytes(out) + + +def _decode_frame(frame: bytes) -> bytes | None: + r"""Decode and CRC-verify one COBS frame; return its SMP message, or `None` if damaged. + + >>> message = b"\x0a\x00\x00\x01\x00\x01\x00\x05" + >>> _decode_frame(cobs_encode(message + CRC16_STRUCT.pack(crc16_func(message)))) == message + True + >>> _decode_frame(cobs_encode(message + b"\x00\x00")) is None # wrong CRC + True + >>> _decode_frame(b"") is None # empty frame (a stray delimiter) + True + >>> _decode_frame(cobs_encode(b"\x00\x00")) is None # decodes to an empty message + CRC + True + """ + try: + decoded = cobs_decode(frame) + except ValueError: + return None + if len(decoded) <= CRC16_STRUCT.size: # nothing but (at most) a CRC: no message to carry + return None + message, crc = decoded[: -CRC16_STRUCT.size], decoded[-CRC16_STRUCT.size :] + if crc16_func(message) != CRC16_STRUCT.unpack(crc)[0]: + return None + return message + + +@dataclass(frozen=True, slots=True) +class Cobs: + """`SerialFraming` for MCUboot COBS+CRC16 raw serial recovery. + + A value that also owns its connection's reassembly buffer, mutated in place (frozen + forbids rebinding the field, not mutating the `bytearray`); `reset` clears it. Self- + synchronising: a corrupt or truncated frame is dropped and decoding resumes at the next + `0x00` delimiter. Stateful, so use one instance per transport. + """ + + _buffer: bytearray = field(default_factory=bytearray, repr=False, compare=False) + + def encode(self, data: bytes) -> Iterator[bytes]: + """Yield the one COBS frame for the SMP message `data`.""" + yield cobs_encode(data + CRC16_STRUCT.pack(crc16_func(data))) + bytes([_DELIMITER]) + + def feed(self, data: bytes) -> None: + """Buffer received bytes for decoding.""" + self._buffer.extend(data) + + def take(self) -> bytes | None: + """Pop the next CRC-valid SMP message from the buffer, resyncing past bad frames.""" + while (end := self._buffer.find(_DELIMITER)) != -1: + frame = bytes(self._buffer[:end]) + del self._buffer[: end + 1] + if (message := _decode_frame(frame)) is not None: + return message + if frame: # a stray delimiter gives an empty frame; only log real drops + logger.warning(f"COBS: dropped a {len(frame)} B frame, resyncing") + if len(self._buffer) > _MAX_BUFFER_BYTES: # no delimiter in this much: noise, not a frame + logger.warning(f"COBS: discarding {len(self._buffer)} delimiter-less bytes, resyncing") + self._buffer.clear() + return None + + def reset(self) -> None: + """Discard buffered bytes so a new connection starts clean.""" + self._buffer.clear() diff --git a/src/smpclient/transport/serial/unencoded.py b/src/smpclient/transport/serial/unencoded.py index 05dcf0c..0c1a281 100644 --- a/src/smpclient/transport/serial/unencoded.py +++ b/src/smpclient/transport/serial/unencoded.py @@ -20,6 +20,7 @@ from smpclient.exceptions import SMPClientException from smpclient.transport.serial.common import _SerialTransportBase +from smpclient.transport.serial.framing import SerialFraming logger = logging.getLogger(__name__) @@ -28,6 +29,8 @@ class SMPSerialRawTransport(_SerialTransportBase): def __init__( self, mtu: int = 384, + *, + framing: SerialFraming | None = None, baudrate: int = 115200, bytesize: int = 8, parity: str = "N", @@ -47,6 +50,8 @@ def __init__( bytes. A serial link has no MTU of its own, but the SMP server's receive buffer does -- this should match the server's `CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE` (Zephyr default 384). + framing: optional wire framing for each SMP message (e.g. `Cobs()`); + `None` sends the bare `[header][payload]`. baudrate: The baudrate of the serial connection. OK to ignore for USB CDC ACM. bytesize: The number of data bits. @@ -76,9 +81,16 @@ def __init__( exclusive=exclusive, ) self._mtu: Final = mtu + self._framing: Final = framing logger.debug(f"Initialized {self.__class__.__name__}") + @override + def _reset_state(self) -> None: + """Clear the framing's reassembly buffer so a (re)connection starts clean.""" + if self._framing is not None: + self._framing.reset() + @override async def send(self, data: bytes) -> None: if len(data) > self.max_unencoded_size: @@ -87,12 +99,41 @@ async def send(self, data: bytes) -> None: ) logger.debug(f"Sending {len(data)} bytes") with self._serial_exception_to_disconnected(): - self._conn.write(data) + if self._framing is None: + self._conn.write(data) + else: + for frame in self._framing.encode(data): + self._conn.write(frame) await self._drain_tx() logger.debug(f"Sent {len(data)} bytes") @override async def receive(self) -> bytes: + if self._framing is None: + return await self._receive_length_prefixed() + return await self._receive_framed(self._framing) + + async def _receive_framed(self, framing: SerialFraming) -> bytes: + """Return the next message from `framing`, reading more bytes as needed. + + `framing` owns the buffer, so a read that spanned into the next frame -- or that + delivered several frames at once -- is drained from it before any further read. + """ + logger.debug("Waiting for framed response") + while (message := framing.take()) is None: + data = await self._read_all() + if data: + framing.feed(data) + # `_read_all` does not await (pyserial is synchronous), so yield each + # iteration -- otherwise a non-stop non-framing stream would spin without + # ever suspending, and an outer request timeout could never fire. + await asyncio.sleep(0) + else: + await asyncio.sleep(self._POLLING_INTERVAL_S) + logger.debug(f"Finished receiving framed {len(message)} B response") + return bytes(message) + + async def _receive_length_prefixed(self) -> bytes: logger.debug("Waiting for response") message = bytearray() diff --git a/tests/fixtures/smp-server/SHA256SUMS b/tests/fixtures/smp-server/SHA256SUMS index e75b525..96f935e 100644 --- a/tests/fixtures/smp-server/SHA256SUMS +++ b/tests/fixtures/smp-server/SHA256SUMS @@ -43,3 +43,5 @@ bf5b803bc5b3a108e7c5bfba025a6b923bf39603525b9e980638940dd24dd482 zephyr_4.4.0_s 5cb70b1a4dee7ec367dd298813e40e01f05f62f408025c607880a3f1f8e96fa5 zephyr_4.4.0_smp_server_0eae053d_qemu_cortex_m0_serial_buf512.hex afd094784f98011121b292e2325afc30fd0d342378d9a091f05f0a7b95859f54 zephyr_f33aa2bc4a43_smp_server_27c54835_mps2_an385_serial_recovery_raw.hex f73694b0eb9feb6e53311a0143be81b0cb5c163a7af29ff7cb6a44fe5c618798 zephyr_f33aa2bc4a43_smp_server_27c54835_mps2_an385_serial_recovery_raw.signed.bin +d38b208c0259d772e60eaa534c1bee7a1522cd6b4043cbba4ed52bbd9ac5eed2 zephyr_f33aa2bc4a43_smp_server_fa39f8c2_mps2_an385_serial_recovery_raw_cobs.hex +ebe37ddd46f94b06b34a4ac081f32b482b32c6f83e29114c27b13fc56a4e729a zephyr_f33aa2bc4a43_smp_server_fa39f8c2_mps2_an385_serial_recovery_raw_cobs.signed.bin diff --git a/tests/fixtures/smp-server/VERSION b/tests/fixtures/smp-server/VERSION index 23fbf46..a7eba85 100644 --- a/tests/fixtures/smp-server/VERSION +++ b/tests/fixtures/smp-server/VERSION @@ -33,5 +33,14 @@ # next includes #2755 and #2746, re-vendor the whole set from a single release and drop # this note. # +# Additional pin — the COBS raw serial-recovery fixture `serial_recovery_raw_cobs` (mps2): +# tag: fa39f8c2 https://github.com/intercreate/smp-server-fixtures/releases/tag/fa39f8c2 +# commit: fa39f8c2ce1bacf9907af8df4b04c397be2763cb (smp-server-fixtures) +# zephyr: main f33aa2bc (post-4.4.0) +# +# COBS+CRC16 framing (CONFIG_BOOT_SERIAL_RAW_PROTOCOL_COBS) is not upstream MCUboot +# (intercreate/mcuboot#5); the fixtures repo's build-patched job applies it to this one +# fixture, whose artifacts carry the fa39f8c2 hash and so do not collide with the others. +# # To bump: re-download the artifacts + SHA256SUMS + manifest.json from a newer # per-commit release and update the `tag` above. diff --git a/tests/fixtures/smp-server/manifest.json b/tests/fixtures/smp-server/manifest.json index 3300dbb..bc58a63 100644 --- a/tests/fixtures/smp-server/manifest.json +++ b/tests/fixtures/smp-server/manifest.json @@ -745,5 +745,32 @@ "target": "mps2_an385", "transport": "serial_raw", "udp_port": null + }, + { + "artifact": "zephyr_f33aa2bc4a43_smp_server_fa39f8c2_mps2_an385_serial_recovery_raw_cobs.hex", + "buf_count": 4, + "buf_size": 384, + "config": "serial_recovery_raw_cobs", + "groups": [ + "os", + "img", + "stat", + "settings", + "fs", + "shell", + "enum", + "zbasic" + ], + "ip_family": null, + "line_length_max": 128, + "mcuboot": true, + "qemu_cmd": "qemu-system-arm -cpu cortex-m3 -machine mps2-an385 -nographic -chardev socket,id=con,host=127.0.0.1,port=,server=on,wait=off -serial chardev:con -serial null -monitor none -device loader,file=zephyr_f33aa2bc4a43_smp_server_fa39f8c2_mps2_an385_serial_recovery_raw_cobs.hex -device loader,file=zephyr_f33aa2bc4a43_smp_server_fa39f8c2_mps2_an385_serial_recovery_raw_cobs.signed.bin,addr=0x20050000", + "recovery_buf_count": 1, + "recovery_buf_size": 1024, + "run": null, + "serial_recovery": true, + "target": "mps2_an385", + "transport": "serial_raw", + "udp_port": null } ] diff --git a/tests/fixtures/smp-server/zephyr_f33aa2bc4a43_smp_server_fa39f8c2_mps2_an385_serial_recovery_raw_cobs.hex b/tests/fixtures/smp-server/zephyr_f33aa2bc4a43_smp_server_fa39f8c2_mps2_an385_serial_recovery_raw_cobs.hex new file mode 100644 index 0000000..a120209 --- /dev/null +++ b/tests/fixtures/smp-server/zephyr_f33aa2bc4a43_smp_server_fa39f8c2_mps2_an385_serial_recovery_raw_cobs.hex @@ -0,0 +1,2649 @@ +:10000000A84F0020B11E0000711A00009D1E0000C4 +:100010009D1E00009D1E00009D1E000000000000AF +:100020000000000000000000000000002D1F000084 +:100030009D1E0000000000008120000071280000CB +:10004000ED200000ED200000ED200000ED2000007C +:10005000ED200000ED200000ED200000ED2000006C +:10006000ED200000ED200000ED200000ED2000005C +:10007000ED200000ED200000ED200000ED2000004C +:10008000ED200000ED200000ED200000ED2000003C +:10009000ED200000ED200000ED200000ED2000002C +:1000A000ED200000ED200000ED200000ED2000001C +:1000B000ED200000ED200000ED200000ED2000000C +:1000C00010F8012B11F8013B012A28BF9A42F7D002 +:1000D000D01A7047034613F8012B002AFBD1181AD7 +:1000E00001387047492108B5094803F049FE01F07D +:1000F00063F8024620B14421064803F041FEFEE7C2 +:10010000054801F0CDFB4421044803F039FEFEE729 +:10011000865C0000AA5C00004C590000D85C00001E +:1001200030B587B003F01AFE03F019FE49211E48CE +:1001300003F026FE03F011FE03A800F0DBFD0446E9 +:100140001A4D44212A68131A5A425A41184803F09A +:1001500017FE03F0D8FD28B14421164803F010FE25 +:10016000FFF7C0FF2B68A34202D045211248F5E7F4 +:10017000039B49215A68114803F002FE0399104875 +:100180004B7D0A7DC98A0091492103F0F9FD49217F +:100190000C4803F0F5FD03A800F02AF845210A48B1 +:1001A00003F0EEFDFEE700BF135D00008C020020AF +:1001B0002C5D0000515D0000715D0000945D000049 +:1001C000C35D0000E15D0000065E000021B1012971 +:1001D00006D06FF015007047044B53F8300070479D +:1001E000024B03EBC0035868704700BF545900002E +:1001F00010B502680D4C536812891344236004F053 +:1002000076FC01F0ABFB01F07FFE23681B6883F3F3 +:100210000888002383F31488BFF36F8FBFF36F8FB9 +:100220002368BDE810405B68184700BF80020020CB +:1002300008B5024803F096FD002008BD315E0000BD +:10024000014B1B68184700BF00000020014B1860DD +:10025000704700BF0000002030B5044685B00D4651 +:1002600010220021684605F021F902238DF80230A2 +:10027000044B2A4621466846019303F00BFC05B067 +:1002800030BD00BF41020000044608B5EFF3118302 +:10029000202383F31288BFF36F8F04F028FC2046DD +:1002A00001F020FE024803F05DFD03F0DEFFFCE7F5 +:1002B0006E5E0000014B0360002070475C59000037 +:1002C000F8B506460C4600230A4F3D6825B95BB9D0 +:1002D0003C6000202660F8BD31462868FFF7F0FE3C +:1002E00020B12B466D69F1E75C61F2E76FF07700B2 +:1002F000F1E700BF8402002070B5104B0D461C686A +:10030000B4B10F4B196800238B4202DB6FF0010080 +:1003100070BD224612F8106B864202D0144601339B +:10032000F2E7E06804F0A8FF28B100202C60EFE7B6 +:100330006FF00C00ECE76FF01200E9E7040000201A +:100340005C59000080B505460E461746984603F0F6 +:100350006FF9034601F0DCFE0446DFF818904246D0 +:1003600049F8003039463046A84754F8090001F0F2 +:1003700071FE00BF080000002DE9F347174642F266 +:100380001602424DADF800202A888046ADF80220C2 +:1003900000220C461E4601921BB9032002B0BDE8A4 +:1003A000F087DFF8EC9099F8003053B9394804F041 +:1003B00037F8384803F0BFFF374B1860012389F83E +:1003C00000304FF00409B5F800A0CA4524D8C4F3A2 +:1003D0000B0444EA0830BCB2B5F80080ADF8040064 +:1003E000201D80B24044B0F5803FADF80640D4DA1D +:1003F000294B80B21B68834246DB042341460DEB48 +:100400000302244803F0E7FF0246D8B14521234800 +:1004100003F0B6FC0420C1E7042349461D480DEB58 +:10042000030203F09EFF58BBBDF80430B8EB133F46 +:1004300003D1C3F30B03A34224D0BDF80630043329 +:100440009944C2E708F104013B463246114803F0E3 +:10045000C2FF014618B1024645211148D8E72B8852 +:100460006A4604331C44A4B204230A482C80ADF825 +:10047000024003F0B0FF003818BF012080008DE774 +:1004800005208BE7022089E7012087E7A8000020EC +:10049000EE1000201457000088020020A85E000023 +:1004A000D55E00002DE9F04F9B4682460E469146F0 +:1004B000484F9DB044214848299D3C6803F060FCAA +:1004C000289B0DF150080393279B4A460293269BD5 +:1004D0003146009350465B46CDF8048000F08CF81E +:1004E00078BB5DB1C4462B46624603CA59601CA95D +:1004F0008A421860944603F10803F5D100234A4666 +:10050000009331464FF6FF7306A800F09BF80546AE +:1005100028B144210246314803F032FC11E0DDF8F5 +:100520002CB044215B460A9A2D4803F029FC494629 +:10053000504603F0B6FC58452AD24421294803F01E +:100540001FFC3C6842E0934237D1102A20D144215D +:10055000254803F015FCBDF81030202BF1D1059A89 +:100560007368134403F120050CAA144618685968EF +:10057000083303C4AB422246F7D1202240460CA9DF +:1005800003F08DFC0446194B01251B689842D8D115 +:100590000DF1120304AA05A906A800F09FF800288F +:1005A000CFDB11D1059906A803F06BFCBDF8122032 +:1005B0000028CAD14FF6FF700D4931F8023B834243 +:1005C000C1D144210B48A7E7012DBAD120461DB067 +:1005D000BDE8F08F0C000020105F00003A5F0000C3 +:1005E0006E5F00009D5F0000006000008C02002034 +:1005F000685C0000CF5F000070B511489CB00C46ED +:10060000DDE92256442103F0BBFB684600F0F0FC14 +:1006100035B1002E04DD32462946684603F0E1FC80 +:100620006289238961681344E26868461A4403F0CA +:10063000D8FC6946219803F0FAFC00201CB070BD7C +:10064000346000002DE9F3411E4604469DF82080E9 +:100650000D4617464346324644211F4803F090FB9F +:1006600024B94FF0FF3002B0BDE8F081002DF8D082 +:10067000002FF6D046F6081CEB68298919446B68F0 +:100680005A5858181FFA82FE0192E6456B891FD10D +:10069000B3EB124F4FEA124CE3D15CF800300193F8 +:1006A00046F60713BDF804209A42DAD1C4E9005790 +:1006B000268184F80A806B89BDF806200B44E3602C +:1006C0006B89002013440B44043163612161CAE744 +:1006D000002BE5D0C5E700BF4B6000002DE9F743D4 +:1006E0000D4616461F46044600283BD00368002BE3 +:1006F00038D04368002B35D04FF6FF78436944214A +:1007000001930369009302894FF6FF732E4803F0AB +:1007100037FBD4F814E02269724503D344212289BF +:100720002A4807E0A07A48B1E368934206D84421FA +:100730002289274803F024FB012015E021684B891A +:100740002BB1E368934202D104322261E3E770B136 +:10075000E3689A4202D8981A03280AD844211D480F +:1007600003F00EFB4FF0FF3003B0BDE8F08373469B +:10077000EFE7496804388958B0EB114FC1F30F49CE +:100780004FEA114C02D244211348E9E720898BB289 +:10079000404501D0984214D107B13B8023690F48EE +:1007A00004332B60A6F8009023698AB204336344B3 +:1007B00023613388442100932B6803F0E1FA002081 +:1007C000D2E704326244C0E77D600000D4610000DB +:1007D000D36000000B610000516100009A610000CD +:1007E0002DE9F04306460C4685B0CDE9002391463D +:1007F0001F4602460B462348442103F0C1FAB36862 +:10080000A34239D91B1B4B4536D344211E4803F064 +:10081000B7FA0FB32146304602AA03F083FA051E49 +:100820002CDB013CDDF808804C442146304602AA0E +:1008300003F078FA051E21DBDDE9024930464A461D +:10084000214603F0FBFA051E18DB03F088FA77B1A6 +:10085000444513D9013CE8E7611E304602AA4944E9 +:1008600003F060FA051E09DBDDF80880DDE74C4483 +:10087000A04503D30134D8E74FF0FF35284605B033 +:10088000BDE8F083026200004F620000F7B5144635 +:10089000CDE9002305460E461F4602460B46084892 +:1008A000442103F06DFA44B13B46224631462846C6 +:1008B00003B0BDE8F040FFF793BF204603B0F0BDA2 +:1008C000796200002C2310B559434218146A0CB900 +:1008D00003F0E8FC41580D4B994206D1D1681389C9 +:1008E0005B1802D25189C91801D300200CE0A3681B +:1008F0009942FAD2106920F4F97020F00100000545 +:10090000000DB0FA80F0400910BD00BF3DB8F3966D +:100910001FB52C2303FB02010A6A0AB903F0C2FCCB +:100920000023CDE9023301934FF480730093034B0E +:10093000FFF7B8FD05B05DF804FB00BFEF10002025 +:1009400030B505460C464B8885B003934B7802932F +:100950000B784421019343880093437802780D4833 +:1009600003F00EFA2A7823789A4210D80CD36A78CA +:1009700063789A420BD807D36A8863889A4206D86C +:1009800060EB000005B030BD4FF0FF30FAE701200A +:10099000F8E700BFA06200002C2370B503FB010440 +:1009A0000D46266A00F06AF82A460346314620467C +:1009B00000F00AF8044618B14521024803F0E0F9B6 +:1009C000204670BDD6620000F0B51D460623002407 +:1009D000012787B08DF80720244A254E51681068FA +:1009E0008DF80D3004AB03C331788DF80E408DF8CF +:1009F0000F70A1BB3A4602200DF10D03FFF7BCFCBE +:100A0000044660BB3A46394602200DF10E03FFF75B +:100A1000B3FC044618BB02213A4608460DF10F0309 +:100A2000FFF7AAFC0446D0B93A46032102200DF193 +:100A30000703FFF7A1FC044688B90822042102201D +:100A400004ABFFF799FC044648B92B7853B1042254 +:100A5000052102202B1DFFF78FFC18B1044620460C +:100A600007B0F0BD01233370F9E700BF445900001F +:100A7000EF1100200048704798020020004870479E +:100A8000900200202DE9F84305464FF000083D4E46 +:100A90002B6E013373D195F8643095F86520013BD6 +:100AA000DAB1013323D005F1140105F14000FFF75D +:100AB00047FF431E5C425C4128462C6600F02CF93F +:100AC0000346C0B12146284600F08EF94FF0FF33AF +:100AD0002C4484F864802B66DAE7013309D149217C +:100AE000294803F04DF9294B1868BDE8F883012423 +:100AF000E2E71446E0E74FF02C0909FB04592246CF +:100B00004421234803F03CF9D9F820700FB903F0D1 +:100B1000C9FB2146284603F012FA20B9D9F8101073 +:100B200011F0100908D01B4B18683368834226D097 +:100B3000284600F045F9C9E721462846FFF7C2FEDE +:100B4000B8B915482246442103F01AF90F4B18682A +:100B500033688342E9D0114B114A4521002C18BF5C +:100B60001A46104803F00CF92146384603F0E2F922 +:100B7000D9E7224649462846FFF7CAFEE8E7014B77 +:100B8000B2E700BF8C020020176300000C000020B9 +:100B90003963000008000020716300000D6300004D +:100BA00005630000A66300002DE9F043DFF81C9107 +:100BB00085B004460F46D9F8006003F0E5F9024617 +:100BC00028B1D9F80060304605B0BDE8F083014691 +:100BD000204603F0C1F9054648B157213C4803F0CF +:100BE000CFF8204603F0E8F9002DEAD1EBE7014603 +:100BF0002046FFF767FE70BB2A464921354B364831 +:100C000084F8645003F0BCF801212046FFF75AFE37 +:100C1000024600282FD0012384F86530636C4921F7 +:100C20000293B4F842302D4A019394F841302C4895 +:100C3000009394F8403003F0A3F84FF0FF3323669D +:100C40002046FFF71FFF0646264B1B6883421AD03B +:100C5000D9F80060C5E7012384F86430A36949210D +:100C60000293E38A204A0193637D1D480093237D0C +:100C700003F086F8C8E784F8650049211B4B164845 +:100C800003F07EF8D9E7204694F86010FFF784FE61 +:100C900005460028DCD1226E14490E4B002A18BFED +:100CA0000B4602464921124803F06AF82C22236EB3 +:100CB00002FB0348D8F8200003F032F83871D8F866 +:100CC00020305B68C7F80080BB608AE70C0000201A +:100CD000CE63000005630000F1630000446400007F +:100CE000206400008C020020186400000D630000E6 +:100CF0004E64000010B50446064803F05EF905484E +:100D00002146FFF751FF0446024803F012F920463E +:100D100010BD00BF98020020F7B52C25016E0646D5 +:100D200005FB01052B699B063BD501AA6F6803F003 +:100D3000BBF80446A8B91C4A019B9742B766F36604 +:100D400008D9D91906D2194A914203D8286A58B944 +:100D500003F0A8FA3B4600224921154803F010F899 +:100D60000324204603B0F0BD21463A4603F03CF888 +:100D7000044678B10346002249210E4803F000F8EA +:100D80003B46002249210C4802F0FAFF0023C6E945 +:100D90001A33E6E702463B464921084802F0F0FFD5 +:100DA000DFE70324F2E700BFFFFF232000F03F202E +:100DB00074640000A4640000DE6400000B650000A1 +:100DC00010B50446836E00224921064802F0D8FF80 +:100DD0000021E26EA06E04F069FB0020C4E91A0055 +:100DE00010BD00BF3B65000038B500220B4605462C +:100DF0000C460848492102F0C3FF2C2303FB04558D +:100E0000286A08B903F04EFA2146BDE8384003F0DD +:100E100091B800BF6C6500002DE9F04F0026036813 +:100E20009DB002934368DFF8C0E1039383688A466C +:100E3000DDE902150493C36805930369DDE904B78E +:100E40000693436907938369DDE9062C0893C36918 +:100E500098460993089B00935AF806400CAB24BAB5 +:100E60005EF8049B9C514FEAF223A14483EAB2133B +:100E7000009C83EA72634B4424EA020402EA0C09F0 +:100E800084EA09042344434485EA0B044FEA713899 +:100E900088EAB1080C4005EA0B0984EA090488EAEB +:100EA000B1580436A044402E03EB070443445F4688 +:100EB000DDF8008040F088804FF0100A4B4E0A9613 +:100EC00056460AF1010A0DF1700E0AF00F070EEBFB +:100ED000870757F8407C06F00F094FEAB74801979B +:100EE00088EAF71806F10E0707F00F070EEB8707E1 +:100EF00057F8407C09364FEAF74E8EEA774ECDF828 +:100F00002CE006F00F060DF1700E0EEB86060EEBD0 +:100F1000890959F840EC56F8406CBAF1400F764414 +:100F2000DDF804E088EADE08DDF82CE046448EEACD +:100F3000972E764404EA02084FEAF42E2CEA0407BE +:100F400087EA08078EEAB41EDDF828808EEA746E00 +:100F5000774458F804EF49F8406C77443744009ED2 +:100F60004FEA733E3E4481EA0507CDF828808EEAB9 +:100F7000B30E07EA030701EA05088EEAB35E87EAC3 +:100F800008077744374406EB0B0ECDF800C0AB469C +:100F900022D1029E3E440660039E1E44049B46608E +:100FA0000B448360059B2B44C360069B7344036121 +:100FB000079B23444361089B13448361099B63445B +:100FC000C3611DB0BDE8F08FAB46CDF800C00D4643 +:100FD0009446194622463FE794460D462246194656 +:100FE00074463B466CE700BFA0590000DC59000086 +:100FF00010B50446C8B17022002103F06CF80B4B09 +:101000000B4A0C49C4E900230B4B0C48C4E90213FA +:101010000B4BC4E9040301200A4BA36103F1745391 +:10102000A3F52303A3F69243E36110BD85AE67BB2E +:1010300067E6096A72F36E3C3AF54FA57F520E518E +:101040008C68059BABD9831FF7B5274E3068836842 +:101050005B6C03B19847306883685B6B002B2AD1C7 +:10106000224C234D234F306883689B69002B2CD082 +:101070000DF10701012298470128216825D141B9C6 +:101080002968E9B16A680B6891422B6000D16B60F6 +:1010900021603A889DF80700531C9BB20A447F2BBD +:1010A0003B801072DFD94B60134803F016F8002321 +:1010B0003B802360D6E798470028D1D103B0F0BD2C +:1010C00045210E4802F05CFEF8E721680029F5D0C2 +:1010D000084A1388002BF1D04B60074802F0FDFF4F +:1010E000002313802360E9E768070020080300203D +:1010F00020030020EC10002018030020966500005B +:1011000010B5044B044618688368E1B25B689847E1 +:10111000204610BD680700202DE9F047DFF88490D5 +:101120008046D9F800500C4617461F4E65BBEFF3BA +:10113000118A202383F31288BFF36F8F1B4A116833 +:1011400029B11B4843688B4201D002F0C6FF194801 +:10115000036833B1D0F804C019686345016008BF63 +:1011600041608AF31188BFF36F8F136043B919464A +:101170001A463360C9F800103A602846BDE8F08787 +:1011800003F108025D683260AC42A8BF2C463168AA +:101190002246404604F063F93368291B01222546A4 +:1011A0002344E6E714030020100300200C03002072 +:1011B000200300201803002037B5204D2B7813B1F1 +:1011C000002003B030BD1E4A1E48C2E900331A4653 +:1011D000C0E900331C49013202F07FFF082A01F107 +:1011E0008801F8D1194C1A48206004F045F810B372 +:1011F0002068836823B19B6C13B10022154998477E +:10120000206883685B6B0BB1984748B1206883689E +:101210009B69002BFAD001220DF107019847F4E7F2 +:1012200000220D4B20681A8083689B6A03B198479F +:1012300001232B70C4E74FF0FF30C2E7F01100200C +:101240001803002020030020280300206807002046 +:10125000C056000049100000EC1000202DE9F041BC +:101260000025DFF88080204BD8F800101C680B7830 +:101270001E4F5A1CE41B62F30203D8B00B7063BA12 +:101280004B808B884D705BBA8B800822284603F018 +:1012900011F82246394603F00DF86B46D8F80020C5 +:1012A00046BA51681068224603C33946184604F00E +:1012B000D6F82CAA6946065304F10A0002F07BFF17 +:1012C00000F5B0736B4403F8B05C094B411C1B681C +:1012D0002CA85B6898474421064802F051FD58B09D +:1012E000BDE8F081C007002078070020F111002040 +:1012F000C4070020D46500002DE9F0474FF0FF340B +:1013000000250B460121D4B00594069407940AAE3B +:101310000246C6E90055089530A80091CDE901556F +:101320000421099503F0C3FE4022294620A804F0B9 +:10133000BDF8814B03211C93052304221D937F4B91 +:101340000DF1180ACDE91E3A7D4B7E4821937E4B64 +:1013500005AFCDE923367D4B0DF11C0826937C4B60 +:10136000CDE92B01CDE92838CDE92D37279109ABFF +:101370001CA930A808AC229202F0C7FE30B30325A6 +:101380002A464421734802F0FBFC0A21724803F00C +:1013900047FF72490222704803F035FF29466E4824 +:1013A00003F00EFF4DB9674903226B4803F02BFF92 +:1013B0006B4B6948196803F00DFF0A21664803F07A +:1013C00037FFFFF74BFF54B0BDE8F0873B685A1C6E +:1013D000D5D0D6F80090B9F1000FD0D07668614A28 +:1013E00033B9DAF80010B1F1FF3F18BF0B461360B4 +:1013F00000211068FEF7EAFE2146C0B2FEF77CFF2E +:1014000005460028BBD13B68554F002B3DD12068D5 +:10141000D8F8003082683D609342B0D82B46294608 +:10142000FFF7DEF90028AAD1D8F800204E4B1A6049 +:10143000206802F018FDB6FBF0F303FB00FA3A68EF +:10144000494902EB0A030968A6EB0A069819884283 +:1014500038BF00264421454802F092FC206802F083 +:1014600002FD0128D04606D9206802F0FCFC0138B4 +:1014700019EA000F3DD153464A463968206802F008 +:10148000C8FC00287FF47BAF2DE03A6893427FF4DC +:1014900077AF354A334412689342C9D96FE7C245E2 +:1014A000206828BFC24602F0E5FC402201460CA895 +:1014B00003F0FCFF524649460CA803F0D0FF534608 +:1014C000396820680CAA02F0A4FC08B1054657E769 +:1014D0003B68D14453443B60A8EB0A08206802F003 +:1014E000C2FC4045DBD93EB93B68334443443B60D2 +:1014F00046E74FF0400AF1E7206802F0BBFC082203 +:1015000001460CA803F0D2FF324609EB08010CA8F3 +:1015100003F0A5FFD4F800903968484608EB0104B1 +:1015200002F0A1FC214603460CAA484602F071FCD9 +:1015300000287FF424AFD7E7DC650000DD4E000013 +:10154000E2650000E7650000E74E0000DB6C00008C +:10155000E34E00000B6600007807002019660000CB +:1015600070070020740700206C070020EB65000066 +:1015700010B504460A210A4803F052FE0222094926 +:10158000074803F040FE2146054803F019FE0A21F2 +:10159000034803F04DFEBDE81040FFF75FBE00BFFB +:1015A0007807002019660000002307B50221009388 +:1015B000034AA423034803F03DFE03B05DF804FB97 +:1015C000F1110020780700202DE9F04F072904468B +:1015D000ADB040F24581037813F0050F40F0408133 +:1015E0004388A1F108055BBA9BB2AB42C0F03881D9 +:1015F0009D4B186083885BBA8380FFF7D5FFA68870 +:10160000012E40F0E880E37923B1012B00F0DB806C +:101610000820ECE02778FFF72DFA054602F0CDFC14 +:10162000284602F0B1FC07F00707044688B10246DD +:1016300045218E4802F0A4FB3446284602F079FC8E +:1016400014B12046FFF794FF2DB0BDE8F04FFFF72F +:10165000ABBF002F40F0B5803146854803F0E0FD78 +:1016600006228449824803F0CEFD0521804803F01C +:10167000D3FD2746DFF80082DFF80092DFF800A2F2 +:101680007B4205F1200203F02C03D658002E6AD0CD +:101690002023002130460CAAD8F800B002F0A4FBA9 +:1016A0000C9B4B450CD10023CDE902330193402321 +:1016B0003246009328461CAB0CA9FEF7F3FE834686 +:1016C000DAF800305B454ED10023324600930CA976 +:1016D0004FF6FF7306A8FEF7B5FF002856D04FF06F +:1016E000FF361421624803F09BFD664904226048DE +:1016F00003F089FD39465E4803F06CFD4EB90422C3 +:1017000061495B4803F07FFD2022594814A903F08A +:1017100071FD07225D49564803F075FDBDF846305E +:101720001CAE01939DF845304021009330469DF852 +:101730004430574A02F084F9129B43B1421E3E2ABC +:1017400005D8C0F14001534A304402F079F93046DF +:10175000FEF7C0FC31460246454803F054FD142113 +:10176000434803F065FD7B1C022B4FF0010787D136 +:1017700005213F4803F058FD39463D4803F058FD28 +:10178000FFF76CFD284602F017FC56E70DF1120337 +:1017900004AA05A906A8FEF7A1FF00289FD1BDF85D +:1017A0001230102BF2D1BDF81030202B97D13046DB +:1017B000059914AA02F018FB061E18BF01267642EE +:1017C0008FE70824DEE7294604F108002DB0BDE8C4 +:1017D000F04FFFF791BD002E7FF41AAFE379052B90 +:1017E0000AD0062B12D0012B7FF412AF30462DB059 +:1017F000BDE8F04FFFF7BCBE3046FFF7B9FE192039 +:10180000002103F0F8FD0120FEF73EFD02211848FB +:1018100003F006FD00B308221F49154803F0F3FC4E +:10182000D0B14FF48061124803F0D4FCA0B109227A +:101830001A490F4803F0E7FC70B101210C4803F08E +:10184000C9FC48B102210A4803F0F2FC20B12DB0D6 +:10185000BDE8F04FFFF702BDFFF7A6FE0220C6E786 +:101860002DB0BDE8F08F00BFC00700201C6600004F +:1018700078070020406600000C0000203DB8F39679 +:101880008C020020476600004C6600005166000094 +:101890005966000065660000696600007266000017 +:1018A00001232DE9F04F06460024DFF8A48085B01F +:1018B00088F80030274B284F186098F8003013B98B +:1018C00005B0BDE8F08F02F04AFA336803AAC4F508 +:1018D000816138199847002802DC039B002BECD06B +:1018E000251800200146DFF8709085420DDC6C1A47 +:1018F00031B18D42E1DD22463846394403F0BDFD69 +:10190000B4F5816F08BF0024D7E719F801BB00F1D7 +:10191000010ABBF1000F19D1401A002815DD7C180F +:101920002246214602F061FCA0F10A03B3F57E7F56 +:1019300002460AD801902146584602F0BBFC019AA3 +:1019400018B92046911EFFF73FFE51465046CCE79E +:1019500095120020C407002096120020BFF36F8F5D +:1019600072B64FF0FF32114BC3F88020C3F88420C9 +:10197000C3F88820C3F88C20C3F89020C3F89420C3 +:10198000C3F89820C3F89C20C3F88021C3F88421B1 +:10199000C3F88821C3F88C21C3F89021C3F894219F +:1019A000C3F89821C3F89C21704700BF00E100E014 +:1019B00008B50348034A0021121A02F035FC08BD9D +:1019C000E0000020A8160020074808B5074A08498B +:1019D000121A02F02BFCBDE808400648064A0749E7 +:1019E000121A02F023BC00BF00000020DC0000201F +:1019F00048A40000000000200000002048A40000CF +:101A000037B505460C46C9B18B6814480093D1E937 +:101A10000023452102F0B4F9636945210093D4E91C +:101A200003230F4802F0ACF94521E2690D4802F0AA +:101A3000A7F94521A2690C4802F0A2F9012D06D1AF +:101A4000EFF3058245210948103A02F099F9214641 +:101A5000284603B0BDE8304001F000B87C660000C5 +:101A6000B0660000E4660000F86600002B67000026 +:101A700008B5034B1B689847BDE8084000F0DABA88 +:101A80001000002030BFFFF7FDBF00BF2DE9F0417F +:101A900005460B4EDFF82C80324606EB0807CC1BC0 +:101AA0002046094903F0DBFCA01942460021083C0E +:101AB00003F0FCFC2C6707F10800BDE8F08100BFD3 +:101AC00000000000040000004459000010B5204C44 +:101AD0004521204802F054F9A36A990136D51E48E1 +:101AE000452102F04DF91E20A36ADA0104D51B48F6 +:101AF000452102F045F91F20154CA36A1B0304D5AC +:101B00001748452102F03CF92120A36A590304D566 +:101B10001448452102F034F922200D4CA36A9A039F +:101B200004D51148452102F02BF92320A36ADB03D9 +:101B300004D50E48452102F023F92420044A936A73 +:101B40006FEA03436FEA1343936210BD1D20CBE796 +:101B500000ED00E043670000606700007867000068 +:101B600097670000BA670000E467000003680000A0 +:101B700070B5244C06460D462348452102F000F975 +:101B8000A36AD9043BD52148452102F0F9F8172072 +:101B9000A36A1A0504D51E48452102F0F1F8182061 +:101BA000184CA36A9B0511D545211A4802F0E8F8A4 +:101BB000A26BA36A190408D54521174802F0E0F882 +:101BC0001EB1A36A23F40043A36219200D4CA36A3B +:101BD0005A0504D51148452102F0D2F81A20A36A0B +:101BE000DB0504D50E48452102F0CAF81B20054A42 +:101BF000936A43F47F43936200232B7070BD1620D9 +:101C0000C6E700BF00ED00E0336800004E6800004A +:101C1000646800007C6800009A680000B4680000F6 +:101C2000D468000070B5224C06460D462148452177 +:101C300002F0A6F8A36AD90637D51F48452102F05D +:101C40009FF81120A36A1A0704D51C48452102F009 +:101C500097F81220164CA36A9B0711D54521184806 +:101C600002F08EF8626BA36A190608D54521154863 +:101C700002F086F81EB1A36A23F08003A36213204A +:101C80000B4CA36ADA0704D50F48452102F078F817 +:101C90001420A36A064ADB0658BFA36A936A43F07E +:101CA000FF03936200232B7070BD1020CAE700BFB2 +:101CB00000ED00E0F16800000C69000064680000BD +:101CC00044690000616900007C6900002DE9F04171 +:101CD000614B04465F6800258AB0C7F3080685F3A8 +:101CE0001188BFF36F8F02F07F43B3F17F4F07D1AD +:101CF00002F00C03082B14D14521584802F040F89B +:101D000000252C464FF00008F31E8DF80780092BA4 +:101D100000F29180DFE803F00A8488808F8F8F8F34 +:101D20008F8C10074CBF0C460125EBE745214C4832 +:101D3000494E02F025F88DF80780F36A9A0705D519 +:101D40004521484802F01CF800232DE0F36A002BDF +:101D500002DA45214448F5E7F36A5B00F4D54521F2 +:101D6000424802F00DF87369A26943F4807373610D +:101D7000BFF34F8FBFF36F8F32F8023C726922F4CA +:101D800080727261BFF34F8FBFF36F8F03F47F4296 +:101D9000B2F55F4F28D1DBB2022B25D14521226855 +:101DA000334801F0EDFF23689DF80720CAB902AE61 +:101DB00004F12007324620686168083403C2BC423F +:101DC0001646F7D1099A002D42D0C2F3080121B975 +:101DD0006FEA52226FEA42220992184602A9FFF7DF +:101DE0000FFE0AB0BDE8F0811B4B9A6AD2B22AB14D +:101DF00001200DF10701FFF715FF0FE09A6A12F4B9 +:101E00007F4F05D001200DF10701FFF7B1FE05E07E +:101E10009B6AB3F5803F97D3FFF758FE0346C3E7AD +:101E200000200DF10701E6E700200DF10701ECE7C6 +:101E30004521104886E7104917F4F87F0F4A1048EB +:101E400018BF0A46A6F11003452101F099FF7BE770 +:101E50006FF30802C0E700BF00ED00E0CE690000AC +:101E6000FE6900001A6A0000406A0000536A000020 +:101E7000776A0000986A0000B5690000A069000058 +:101E8000C16A0000044B5A6942F010025A615A6953 +:101E900022F008025A61704700ED00E0EFF308807D +:101EA000EFF3098101B57246FFF710FF01BD00BFD6 +:101EB0000A4880F30888202080F3118808484FF4EE +:101EC0008051401880F30988EFF314800221084301 +:101ED00080F31488BFF36F8F02F0B2F9A84F00208F +:101EE000A8160020BFF34F8F0549064BCA6802F4BD +:101EF000E0621343CB60BFF34F8F00BFFDE700BF2D +:101F000000ED00E00400FA05002318460649D1F868 +:101F10009020C2F30722934200DB7047C1F898304B +:101F2000C1F8A0000133F6E700ED00E01EF0040F59 +:101F30000CBFEFF30880EFF30980816911F8021CF0 +:101F40000229FFD001B5724602F072F901BD00BF4F +:101F500040B2002807DB01234109034A00F01F00BB +:101F6000834042F82130704700E100E040B2002891 +:101F700001F10101ACBF00F16040064B4FEA411195 +:101F8000C9B2ABBF00F5614000F00F0080F800134C +:101F90001954704714ED00E0054B064A23F0404306 +:101FA00023F07F039360BFF34F8FBFF36F8F7047B2 +:101FB0000000000000ED00E042F8203C009B0B49CF +:101FC00042F81C3C019B21F0010142F8183C029BA5 +:101FD00042F8081C42F8143C4FF0807342F8043C6D +:101FE0000023203A02654367704700BF45030000A5 +:101FF00000B50B4B15469860026F0A4B0E461A60EF +:102000002C4686F309880020034B98472046002180 +:1020100000220023014C20475D42000045030000E0 +:10202000BC100020C80700201022014B1A61704725 +:1020300000ED00E0054B5A699B689A421FBF044AB5 +:10204000536843F080535360704700BFBC100020BA +:1020500000ED00E0084B9B6883420BD1EFF3058352 +:1020600043B1064B5A6842F080525A605A6A22F4D1 +:1020700000425A6203F027B9BC10002000ED00E0D6 +:1020800011498A684FF030001044EFF3098C80E862 +:10209000F01F202080F31288BFF36F8F0B4F4FF09B +:1020A00000664A698A603E60106F094C2060506F7C +:1020B0000023536780F3118802F1300090E8F01F8D +:1020C0008CF3098870470000BC10002004ED00E08C +:1020D000C8070020002320210348C2180133202B09 +:1020E00082F80013F9D1704700E100E008B5EFF382 +:1020F0000583064A103B02EBC30152F833004968DE +:102100008847BDE80840FFF795BF00BF3057000083 +:102110000148006870470000C80700200121024BF9 +:10212000024A034800F09EB800000420000000208E +:10213000A05A000007B502460C48C0F898200B686A +:1021400023F01F03134343F01003C0F89C308B6847 +:1021500043F00103C0F8A0308B68054800930B687A +:10216000442101F00DFE03B05DF804FB00ED00E03A +:10217000DD6A000038B50E4B0D46D3F890300446AA +:10218000C3F30723013B9842024607D9452109487A +:1021900001F0F6FD6FF01504204638BD44210648D5 +:1021A00001F0EEFD29462046FFF7C4FFF4E700BF2B +:1021B00000ED00E0F56A0000206B00002DE9FF4112 +:1021C0000F46984605460026BE420EDA6B685BB3A2 +:1021D000B8F1000F12D0591E0B420AD032464521E9 +:1021E000134801F0CDFD6FF01502104604B0BDE8B4 +:1021F000F0811F2BF2D92B681942EFD1D4B22246BD +:1022000044210C4801F0BCFD2B6801A90193D5E9DC +:10221000010302F037F8034320460393FFF7AAFFB8 +:1022200010F1160FDFD0421C01360C35CCE700BF91 +:10223000466B0000716B00000522044BC3F894202C +:10224000BFF34F8FBFF36F8F704700BF00ED00E00B +:10225000BFF35F8F0022024BC3F89420704700BF8A +:1022600000ED00E010B5034C01232278FFF7A6FF34 +:10227000207010BD9E1600202DE9F0435A4A5B4E97 +:10228000D2F890303568C3F307239D4285B000F241 +:10229000A880D2F890204421C2F30722544801F0CC +:1022A0006FFD0024FFF7D4FF0C27A54219D1514F31 +:1022B00068463D70FDF7FEFF4FF0000881464E4C2A +:1022C0004E4D4F4EC14514D100203B784649D1F8C0 +:1022D0009020C2F3072293427DDBFFF7ADFF002081 +:1022E00045E07168204607FB0411FFF723FF013426 +:1022F000DBE700984FEA081C00EB0811CB6823408D +:10230000B3F5000F49D00BD8B3F5001F32D0B3F5A9 +:10231000800F37D0B3F5801F14D008F10108D1E742 +:10232000B3F1007F42D0B3F1805F48D0B3F1807F3A +:10233000F3D150F80C30886801F0A4FF4A6840F0EF +:10234000887009E050F80C30886801F09BFF4A68FB +:1023500040F0885040F43020039001A93878CDE94E +:102360000123FFF707FF002831DA6FF0150005B0F1 +:10237000BDE8F08350F80C30886801F083FF4A68AC +:102380003043E9E750F80C30886801F07BFF40F0FB +:1023900000704A6840F40030DEE750F80C3088687E +:1023A00001F070FF4A6840F08270D5E750F80C30B9 +:1023B000886801F067FF4A6840F48020CCE750F855 +:1023C0000C30886801F05EFF4A682843C4E73B7818 +:1023D00001333B70A1E7C1F89830C1F8A000013388 +:1023E00075E74FF0FF30C2E700ED00E0AC5A0000A7 +:1023F000996B00009E1600200000F0FF0000021103 +:102400000000081108B5024B1B689847002008BD62 +:10241000CC070020034B044A1860937843F0020372 +:1024200093707047CC0700201400002008B50548C1 +:1024300001F098FC002383F31188BFF36F8F04230E +:10244000184602DFC46B000070B54568066928684D +:1024500002F012FF38B94521124801F091FC6FF0EB +:102460001204204670BD286883681B689847041EC4 +:1024700005DA224645210C4801F082FCF1E7D5E956 +:1024800001231A44A24207D923464521074801F0F7 +:1024900077FC6FF01504E4E7301D02F00BFF002419 +:1024A000DFE700BFCD6B0000ED6B0000146C000097 +:1024B00013B504460B4801F043FF012802D010F188 +:1024C000860F0CD10123002106480DF1070201F00F +:1024D00048FF20B99DF807301B1B5842584102B0F5 +:1024E00010BD00BFF8560000014801F099BF00BFC1 +:1024F000F856000008B5074802F0BEFE38B106489D +:10250000FFF788FF0448FDF7A1FE002008BD6FF02B +:102510001200FBE7A45600001D2500000A2838B56C +:102520000446074D04D1AB680D2128465B689847E7 +:10253000AB6803485B68E1B29847204638BD00BFEE +:10254000A456000038B50546002910461C462A69E5 +:1025500014DB6B685B698B4210D95B1A9C420DD807 +:10256000084D6B6A01336B6213682246194402F00E +:1025700076FF0020AB692344AB6138BD6FF01500D6 +:10258000FBE700BF2408002040F2092213B50F4BDF +:1025900004460421019300920D4B0E4801F004FC07 +:1025A00003220D4B0092019304210C4B0C4801F0C7 +:1025B000FBFB23691A7932B1626818685168526965 +:1025C000497902F073FF002002B010BD7D6C00005D +:1025D0000B980000240800208D6C0000F997000083 +:1025E0000008002000292DE9F8438046174646DB05 +:1025F000D0F80490D9F814308B4240D95B1A9A4233 +:102600003DD8D9F81030B1FBF3F203FB1212002AC7 +:1026100035D1B7FBF3F603FB167686BB194C1A4A85 +:10262000636BD2690133636322B1934202D300200A +:10263000BDE8F883D9F81030B1FBF3F505F10F03CD +:1026400004EB8304D9F81030B7FBF3F3B342EED9AF +:102650007019FF2898BF236806F101069CBF01335B +:102660002360D8F8043004341A695968D8F8103057 +:1026700049791B6802FB003002F018FFE2E76FF0B7 +:102680001500D5E724080020000800202DE9F74FA9 +:102690000D1E91461F46D0F810A06BDBD0F80480C9 +:1026A000D8F81430AB4265D95B1B9F4262D8D8F88A +:1026B00004301B68B5FBF3F203FB1252002A59D118 +:1026C000B7FBF3F403FB1474002C53D12B4EA34639 +:1026D000F36A0133F362D8F80430D8F800001A68BE +:1026E000597902F0E3FEBB4510D32548836933B125 +:1026F000F26A934208D322D1036A2BB10123BC4270 +:102700001FD1F3692344F361002013E0D8F80430AB +:102710000BEB05011A68DAF80030D8F8000019440C +:10272000019202F0CBFE019A38B16FF00400336AD7 +:102730000133336203B0BDE8F08F9344D3E7002345 +:10274000DDE713B1026AA242DED9D8F80420DAF834 +:1027500000E004EB050C527919F804101EF80CB0D7 +:10276000FF2A0CBF01EA0B0141EA0B010EF80C1025 +:102770000134C4E76FF01500DCE700BF2408002037 +:102780000008002070B50F4D00EB8104A04201D17C +:10279000002070BD4378017813F0010FC1F30113DD +:1027A0000CBF4FF400324FF48032061D01F00F01D0 +:1027B00055F8230001F063FF10F1860FE9D0304691 +:1027C000E4E700BFD85B0000054B1B7833B180689D +:1027D0004FF0FF324FF0FF3300F0BCBA704700BF3C +:1027E000A3160020034B1B7813B1806800F060BB78 +:1027F000704700BFA31600204FF0E0230D4A9969EF +:10280000126818699B69002908BF1146002B08BF90 +:10281000134610F4803F084801D1994205D201685F +:10282000114401604FF0E021096900681044C01AAA +:10283000704700BFB8100020A81000202022002000 +:10284000074B83F82320074B074A1A60074B013ACE +:1028500018604FF0E0235A61072298611A617047AF +:1028600000ED00E0B810002090D00300A810002078 +:10287000684620F007018D4631B5EFF3118520231E +:1028800083F31288BFF36F8FFFF7B6FF0D4B0E4A2D +:10289000186811680D4C0844106000221A60236803 +:1028A0000B49C01AB0FBF1F001FB00332360094B68 +:1028B00029461A6001F042F8FFF7BCFBBDE8314041 +:1028C00085467047A8100020B4100020B0100020EA +:1028D00090D00300AC1000202DE9F04180462E4F2F +:1028E00069B1B0F1FF3F0AD14FF0E022136923F044 +:1028F000010313614FF07F433B60BDE8F081FFF7B8 +:102900007BFF4FF0E0230022244C99692368B8F143 +:10291000FF3F00EB0306224B3D681A601FD0214B9E +:102920001868301A34D4204BDFF880E01B684FEA77 +:10293000E87C13EB0803A3FB0E324CF1000C1B1ACE +:1029400043F60A500EFB0C2262F10002834272F140 +:1029500000001DDBB3F1807F72F1000201DB6FF03C +:102960007F434FF0E0203B60013B826943610023DD +:1029700083614FF000700E4B914258603BBF481985 +:10298000801A891A80192ABF891920602160B4E74A +:1029900043F60953E5E700BFB8100020B41000204B +:1029A000A8100020B0100020AC10002090D0030030 +:1029B00000ED00E010B5074B1C68074B1B68E41ADC +:1029C000FFF71AFF054B2044B0FBF3F0044B1860EF +:1029D00010BD00BFB4100020B010002090D0030044 +:1029E000AC10002070B516461D465A1C03680446FC +:1029F0001344C2689A4205D20821006A02F059FBCA +:102A0000002070BD65B93278204602F055FB0028E1 +:102A1000F6D03544B5420CD1A3680133A360F0E78A +:102A2000AB1E062B8EBF0023054AD35C1833DAB2E7 +:102A3000EAE723685A1C226015F8012D1A70E9E7AD +:102A400041A4000010B504464521034801F098F95F +:102A5000204602F01CFC00BF5F950000F7B504465D +:102A60000D46EFF31187202383F31288BFF36F8F96 +:102A70001A4A0428966898BF194B127C94BF53F8E1 +:102A80002030184B009245210246174801F078F992 +:102A90003DB1EB69C3F308031BB14521134801F0B5 +:102AA0006FF936B1304602F00CFC034608B10278EB +:102AB00002B90F4B324645210E4801F061F9294613 +:102AC0002046FFF7BFFF87F31188BFF36F8F3046B3 +:102AD00003B0BDE8F040FFF7BDBA00BFBC10002056 +:102AE0003C5C00007395000089950000B6950000DD +:102AF00081950000DC95000038B50A4B53F8204062 +:102B0000013053F82050A54200D838BD606830B17C +:102B1000037EDB0701D402F097FB0834F3E7236858 +:102B20009847FAE7505C0000012270B5284B86B048 +:102B300003201A70FFF7E0FF0420FFF7DDFF254CAC +:102B4000254D2646AE4204F130040FD300F04CFD73 +:102B5000204CAC4226D300F05BFDFDF7E1FA1F4AA2 +:102B6000938923F00103938106B070BD54F80C3CA7 +:102B7000059354F8103C049354F8143C039354F810 +:102B8000183C029354F81C3C019354F8203C0093E9 +:102B900054E90A2354E90C0100F0F4F954F8303CEC +:102BA0005E65CEE7D4E90A23B3F1FF3F08BFB2F177 +:102BB000FF3F05D052EA0301206803D100F040FA3C +:102BC0003034C6E70649183000F0C8FDF8E700BF0A +:102BD000A31600203058000030580000600100208B +:102BE000C75300000023012270B586B0CDE904234D +:102BF0000F220193CDE9023214230F4D0F4E03FB38 +:102C000000550F4906EBC016044601EB00214FF4B6 +:102C1000807230460B4B009500F0B4F9337C2C7475 +:102C200023F004033374084B013403EB0433EE60E8 +:102C30006B6006B070BD00BFBC100020E00000203B +:102C4000A82600209F520000A81600207FB5002073 +:102C5000FFF752FF264B83F30888264C0025636953 +:102C600043F400736361E02384F82230E57725762E +:102C70006576A576636A43F4E0236362FFF702F9A1 +:102C8000FFF7D2F94FF0FF33A362E362FFF7F4FAE4 +:102C9000FFF744FA184800F0C7F90120FFF72CFFAE +:102CA0000220164CFFF728FF00F096FC144B4FF45F +:102CB00020525C61134B1449059301232046CDE952 +:102CC0000353CDE90155114B009500F05BF9064621 +:102CD000237C204623F00403237402F04DFB284696 +:102CE000FFF780FF31462046084AFFF781F900BF11 +:102CF000A826002000ED00E0E00100206001002097 +:102D0000BC10002043960000A8270020292B0000BB +:102D100037B58268054692F90E300C468B4213D0C7 +:102D2000117C0B4811F01F0FCDE900434FF0440117 +:102D300014BF6E23792301F023F82146A86803B05D +:102D4000BDE8304000F09CBB002003B030BD00BFA8 +:102D50004B9600002DE9F743044690461E46EFF3DC +:102D60001189202383F31288BFF36F8F484FC16806 +:102D7000BA6871B1836893421FD058EA06011ED128 +:102D800089F31188BFF36F8F6FF00F0003B0BDE8B8 +:102D9000F08392F90E000131C4E902212061CDE9EE +:102DA000001023464421BA683A4800F0E9FF89F34D +:102DB0001188BFF36F8F0020E8E70069EBE792F915 +:102DC0000E5093F90E3002469D42A8BF1D46442185 +:102DD000314800F0D5FFA36893F90E30AB424EDDC9 +:102DE00029462046FFF794FF054622464946CDE98D +:102DF00000862A4800F018FB064603462246442176 +:102E0000274800F0BDFF002E0CBF6E2379230093EE +:102E100044212346BA68234800F0B2FF002ECAD0EE +:102E200023464421BA68204800F0AAFFEFF3118737 +:102E3000202383F31288BFF36F8FA3680BB323683B +:102E400026699C420AD04BB193F90E309E42A8BF2E +:102E50001E466FF07F039E42B8BF1E4644211348B2 +:102E6000224600F08DFF31462046FFF751FF40B16A +:102E700039460A4802F0BCFA6FF00A0086E70025DE +:102E8000B3E7002DF4D187F31188BFF36F8FF3E719 +:102E9000BC10002081960000B1960000A41600200E +:102EA000D4960000F99600001897000034970000AF +:102EB00073B583680546002B53D02D4A9268934220 +:102EC00052D1C368024644212A4800F059FFEB68FA +:102ED000012B04D9013BEB60002002B070BDEFF381 +:102EE0001186202383F31288BFF36F8F2846296948 +:102EF000FFF70EFF2C68A54217D100241E4BAC60D3 +:102F000000932A46234644211C4800F039FF14B39D +:102F100094F90E3020462B610023A36702F03BFAA0 +:102F20003146174802F064FAD6E7002CE5D0D4E920 +:102F3000003213605A600023227CC4E9003322F07F +:102F40000202A360227404F1180000F09FFCAC6040 +:102F500094F90E30D4E7EC6086F31188BFF36F8FDD +:102F6000BAE76FF01500B8E74FF0FF30B5E700BFE4 +:102F7000BC1000205997000018FCFFFF7697000056 +:102F8000A41600202DE9FF47994600F15803C0E937 +:102F90001633109B4FF000088381042303740F9BAA +:102FA0000F4604468373C0E90688C0F8088080F89D +:102FB0000F8000210020073222F0070607EB060AE7 +:102FC000C4E90A0123463A4644211548CDE9026A7C +:102FD000CDE9006700F0D4FE51462046FEF756FDCD +:102FE0000E9BC51D25F00705A566C4E9187602935A +:102FF0000D9BAAEB050501930C9B2A4600933946CD +:103000004B462046FEF7D8FF064BC4F854809B6819 +:1030100003B1DB6E2846E36604B0BDE8F08700BF6D +:10302000A0970000BC1000200123037483810023BB +:10303000C0E91833C366014B98607047BC1000208C +:1030400038B50446EFF31185202383F31288BFF3CC +:103050006F8F037C5B070FD5183000F017FC237CC3 +:10306000204623F00403237402F095F92946BDE8B5 +:103070003840044802F0BCB985F31188BFF36F8F64 +:1030800038BD00BFA41600206FF00A01084A9368FB +:103090009967084958674B6843F080534B60002399 +:1030A00083F31188BFF36F8F9368986F704700BFE9 +:1030B000BC10002000ED00E038B590F9102001466A +:1030C000002A037C04DA03F07F03037402F01CF986 +:1030D0000D4D2A4652F8184FAB68944200D004B9FF +:1030E000EC688B4207D01A7CD20604D1DA897F2A99 +:1030F00001D9A2692AB1A34202D0204600F0CEFA3B +:1031000023466B6138BD00BFBC10002070B590F93C +:103110001020037C002A2FDBD9062DD11A4C63F036 +:103120007F032246037452F8183FE169934207D1A6 +:10313000C0E900210860E0610FE09942F8D01B6807 +:10314000002BF5D093F90E6090F90E50AE42F4DDED +:103150005968C0E9003108605860A569954200D0FF +:1031600005B9E568A3681A7CD20606D1DA897F2AF8 +:1031700003D9AA690AB9636170BDAB4202D028467F +:1031800000F08CFA6561F7E7BC100020034648B9EF +:10319000EFF3058232B9064A51699268914201D033 +:1031A000FFF772BF83F31188BFF36F8F704700BFC3 +:1031B000BC10002038B5184CA168E0690B6881424A +:1031C00014BF1A46002249680B605960A368E16980 +:1031D0002AB9124AC3E900210B60E3610AE092F9BF +:1031E0000E5093F90E00854212DD5168C3E90021AB +:1031F0000B605360A569094B9D4200D005B9E56895 +:10320000A3689D4202D0284600F048FA656138BDA7 +:103210008A42DED01268DBE7BC100020D410002008 +:10322000002A2DE9F8430CBF4FF010084FF00808B2 +:10323000027C044618EA020F0D4664D148EA0203F4 +:10324000D2090CD10374B8F1080F7DD1A36813B172 +:10325000204602F061F8202704F118060FE003F081 +:103260007F03037402F050F8EDE785F31188BFF394 +:103270006F8FEFF3118587F31288BFF36F8F30469E +:1032800000F004FB0B30F0D0A66D04F15807B742F4 +:1032900013D04FF0000986B1304602F03DF8C6F871 +:1032A000789006F1180000F0F1FA0B3002D03046A9 +:1032B000FFF72CFFA66DB742EDD1274B9B689C42D0 +:1032C00042D1EFF30587003F18BF0127DFF8889050 +:1032D0004B4653F8186F9E4200D00EB9D9F80C60D7 +:1032E000D9F80830B34202D0304600F0D7F9B8F12F +:1032F000100FC9F8146006D0204600F0ACFF17B1DB +:103300001648FFF791FE144B9B68A3421ED1EFF3C2 +:103310000583DBB9A289D20711D585F31188BFF3E4 +:103320006F8F83F31188BFF36F8F0423184602DF7A +:10333000EFF31185202383F31288BFF36F8F2846A4 +:10334000BDE8F843FFF7A0BE0027BFE785F311886B +:10335000BFF36F8FBDE8F883BC100020E0010020B0 +:1033600070B50F4D06462B4653F8184F9C4200D0BF +:1033700004B9EC68AB681A7CD20604D1DA897F2ADA +:1033800001D9A2692AB1A34202D0204600F086F9F1 +:1033900023466B613046BDE87040FFF7F7BE00BFC3 +:1033A000BC10002070B5EFF31186202383F3128840 +:1033B000BFF36F8F1A4CA168E0690B68814214BF9C +:1033C0001A46002249680B605960A368E1692AB96E +:1033D000144AC3E900210B60E3610AE092F90E5040 +:1033E00093F90E00854216DD5168C3E900210B6098 +:1033F0005360A5690B4B9D4200D005B9E568A368F1 +:103400009D4202D0284600F049F965613046BDE88A +:103410007040FFF739BE8A42DAD01268D7E700BFA2 +:10342000BC100020D4100020F8B5124B0C46DDE98A +:10343000067611469868104A1060EFF31182202238 +:1034400082F31288BFF36F8F9D68284601F06EFFEC +:10345000B6F1FF3F08BFB7F1FF3F06D03A4633460B +:10346000064905F1180000F079F92046BDE8F8405A +:10347000FFF70ABEBC100020DC100020C75300007C +:10348000F8B50446EFF31187202383F31288BFF3C6 +:103490006F8F037C49B203F01F02002A0CBF012684 +:1034A000002635D103F07F032A4D037401F02CFF71 +:1034B0002A46037C817363F07F03037452F8183F3C +:1034C000E869934207D1C4E900200460EC610DE093 +:1034D0009842F8D01B68002BF5D093F90EC08C45AC +:1034E000F6DD5968C4E900310C605C60AC69944257 +:1034F00000D004B9EC68AB689C4202D0204600F0D2 +:10350000CDF86C6187F31188BFF36F8F3046F8BD3B +:103510009B071CD5856801F0F7FE81732B689D42DF +:1035200009D16B68C4E900531C606C60EAE76A6803 +:103530009A42F6D01B68002BF3D093F90E208A42F2 +:10354000F5DD5A68C4E9003214605C60DAE7817323 +:10355000D8E700BFBC100020F8B550EA01030546CB +:103560000C4603D101F0CEFE0020F8BDEFF3118729 +:10357000202383F31288BFF36F8F134E134BB06871 +:10358000186001F00AFFB0682A4623461049183037 +:1035900000F0E4F8B36804461A7C5F6742F0040266 +:1035A0001A746FF00A029A670A4A536843F080530C +:1035B0005360002383F31188BFF36F8F01F04BFF3B +:1035C000201A20EAE070D0E7BC100020DC100020B8 +:1035D000C753000000ED00E0024B03F11802C3E9FD +:1035E00006227047BC100020EFF31181202383F3E3 +:1035F0001288BFF36F8F054B9A68D37B013BD3735F +:1036000081F31188BFF36F8F704700BFBC1000209B +:10361000EFF31180202383F31288BFF36F8F034BE6 +:103620009A68D37B0133D373FFF79ABEBC10002096 +:10363000014B9868704700BFBC100020027C034615 +:1036400012F01F0210D10A4988420DD009490868BA +:1036500068B1D9897F2909D893F90E20064B1B68D8 +:103660009A42B8BF0020704700207047104670474C +:10367000E000002098000020E01000200122044B10 +:10368000C01A044BC0105843034B1A54704700BF74 +:1036900060020020ABAAAAAAA4160020F8B50C4B21 +:1036A0000C4D1E7CFFF7CAFF1823044603FB06558A +:1036B000284600F0EBF8084F34B1BB5D2846E21A0B +:1036C0000649D31700F04AF80023BB55F8BD00BFE8 +:1036D000BC10002060020020A41600207D360000EF +:1036E00070B5EFF31186202383F31288BFF36F8F39 +:1036F0000F4D104BAC681868A04202D1FFF7CEFF07 +:1037000011E000221A602B7C0B4AD35C5BB120468F +:10371000FFF794FF38B1237CDB0604D1FFF74AFDA5 +:103720006869A042EAD086F31188BFF36F8F70BD3D +:10373000BC100020DC100020A4160020024B1868EA +:10374000984208BF00207047A0000020024B186874 +:1037500008B1FFF72FB970479C000020B3F1FF3F7D +:1037600008BFB2F1FF3F2DE9F84F044699461546D0 +:103770001F4600F081808160EFF31188202383F3DE +:103780001288BFF36F8FB9F1000FDFF8F4A025DBCB +:10379000FFF7DCFF3B4B06461B68003B18BF0123CD +:1037A000451949EBE0795B1949F100024FF0010935 +:1037B000DAE90057C4E904325D1942EB0707FFF765 +:1037C000BDFF0346DFF8C0E0DEF804A0EBB9C4E9B2 +:1037D00000EACAF80040CEF8044028E06FF0010388 +:1037E000DAE900125B1A4FF0FF3161EB02025B1B5A +:1037F00062EB0902012B72F10001BCBF0123002220 +:103800004FF00009C0E90432D9E7D3E9041CD4E938 +:1038100004208A4270EB0C0B25DA891A5A686CEB8B +:103820000000C3E90410C4E9003214605C60FFF7D3 +:1038300085FF84420FD1134B1B6801330BD1B9F1C3 +:10384000000F02D1FFF782FF0646304601F0ECFD83 +:103850000021FFF741F888F31188BFF36F8F2846E6 +:103860003946BDE8F88F521A60EB0C005345C4E9A5 +:103870000420ACD01B68A9E700252F46EFE700BF66 +:10388000780200209C000020A0000020F8B504462B +:10389000EFF31186202383F31288BFF36F8F026842 +:1038A00072B3FFF74BFF184B5B689C4208D0D2E91C +:1038B0000431D4E90475DB1941EB0501C2E9043197 +:1038C000D4E900320025A04213605A60C4E90055D3 +:1038D0000ED000200D4A136823F001018C4204BF72 +:1038E00043F00103136086F31188BFF36F8FF8BDB7 +:1038F000FFF72CFF01F098FD2946FEF7EDFFE8E702 +:103900006FF01500E6E700BFA0000020E4100020E3 +:10391000EFF31182202383F31288BFF36F8F064BDE +:1039200040F001001B681B1A5842584182F311886D +:10393000BFF36F8F704700BFE410002000232DE914 +:10394000F047DFF8BC902F4CC9F8000023600E460A +:10395000FFF7F4FE2C4FDFF8B480D9F80050D7E918 +:1039600000CE4FEAE57A50B1D0E904319D427AEBBE +:1039700001021EDA5B1B61EB0A01C0E9043115EBA1 +:103980000C054EEB0A02C7E9005200254FF0FF3349 +:1039900028462360C9F8005001F046FD2946FEF78D +:1039A0009BFF86F31188BFF36F8FBDE8F047FFF7E9 +:1039B00097BE13EB0C0CA5EB03034FF0000541EB96 +:1039C0000E018268C7E900C1C9F80030C8F80000DC +:1039D000D0E900310B605960C0E9005586F31188C9 +:1039E000BFF36F8F9047EFF31186202383F3128884 +:1039F000BFF36F8FC8F80050FFF7A0FEADE700BF20 +:103A0000E81000209C00002078020020E410002034 +:103A100010B5EFF31184202383F31288BFF36F8F67 +:103A2000FFF794FE0346054AD2E90001181841EB5E +:103A3000E37184F31188BFF36F8F10BD780200200B +:103A40000CB430B58BB004460D462022002102A8EC +:103A500001F02CFD02238DF80A300D4B002D03934D +:103A6000069412DB01D06B1E1C440FAA0E9902A80B +:103A70000794019200F00EF815B10022069B1A700F +:103A80000BB0BDE8304002B070470024EDE700BF46 +:103A90000F5500002DE9F04F837815469A07074629 +:103AA000D0F8048085B040F19F8000260878002877 +:103AB00000F09C80252808D001F1010A3946013622 +:103AC000C047002880F286808AE091F801B001F1B9 +:103AD000020ABBF1250FF1D0002401211F2C25D8AB +:103AE000ABF12002102A06D8844B01FA02F01842EA +:103AF0000ED1032A5AD0ABF13002092A08D9BBF102 +:103B00002A0F33D1630605F1040501D444F02004E3 +:103B10001AF801BBBBF1000FE0D139462520C047A0 +:103B200000285DDB394658460236C9E77F2CE2D9CA +:103B3000BBF16C0F29D021D8BBF1680F2CD0BBF1A1 +:103B40006A0F30D0BBF14C0F2DD0ABF16302122ABB +:103B500000F2A580DFE802F02C4EA3A3A3A34EA39E +:103B6000A3A3A3A3AD9DA3A331A37700BBF12E0F05 +:103B7000DED160063AD444F04004C9E7BBF1740FCB +:103B8000C6D0BBF17A0FC3D0DFE7220648BF44F4AA +:103B9000007444F08004BBE7E30548BF44F40074BC +:103BA00044F48074B4E744F42074B1E71024AFE720 +:103BB000394615F8040B013682E72C68504B002C6F +:103BC00008BF1C46A1464B4619F8010B20B9341B0F +:103BD0001E190435514669E73946C0470028F2DA14 +:103BE000BB7843F00403BB704FF0FF36304605B09E +:103BF000BDE8F08F20061DD5A10543BF073525F090 +:103C0000070555F8080B55F8040B00280DF10409B9 +:103C10004946B8BF40424FF00A02B8BF44F480643E +:103C200001F05CFC6405A0EB090956D44C460DF18B +:103C3000040B5EE0E20555F8040BE6D5A3054CBF86 +:103C400040B200B2E1E70A2224F01004A4B2200638 +:103C500033D5A10543BF073525F0070555F8080BF7 +:103C600055F8040B10B924F01004A4B20DF10409A6 +:103C7000494601F033FCE306A0EB0909D6D53946E5 +:103C80003020C0470028ABDBBBF1000F1ED101364E +:103C9000CCE710224FF0780B44F01004D7E74BF03C +:103CA0002002782A7FF439AFCBF1780242F010027B +:103CB000CDE708224FF0000BC9E7E30555F8040BE8 +:103CC000D0D5A1054CBFC0B280B2CBE7394658462B +:103CD0000236C0470028A9DA82E739462D2001368E +:103CE000F7E7013C39461BF80400C0470028FFF6FF +:103CF00077AF002CF5D14E446CE700BF812801005E +:103D0000F2970000704710B50120FEF7D1FB0128A3 +:103D1000044603D1FEF7E8FB204610BD0020FCE777 +:103D20000020704730B500290446154685B011DBE8 +:103D300083688B420ED96368C068194401AA00F0F9 +:103D4000CCFB28B96268019B9B1A2B60029B6B60BD +:103D500005B030BD6FF02100FAE77047704770473B +:103D6000002070470FB407B504A951F8040B019166 +:103D7000FCF772FA03B05DF804EB04B070477047CB +:103D80000FB407B504A951F8040B0191FCF764FACC +:103D900003B05DF804EB04B070470379C2880021DA +:103DA0005A43183001F082BB10B50446C360BDF819 +:103DB0000830C28003610171FFF7EFFF21460398CD +:103DC000FCF77EFA002818BF6FF0770010BD0029BD +:103DD00008DB8068884205D9401A904234BF002031 +:103DE000012070470020704770B516461A460546F8 +:103DF0000C46FFF7ECFF48B16968E8682144826827 +:103E000014683246A446BDE8704060476FF0150064 +:103E100070BD70B516461A4605460C46FFF7D7FF2B +:103E200048B16968E8682144826854683246A4460B +:103E3000BDE8704060476FF0150070BD10B50B46CF +:103E40000446FFF7C4FF40B16168E0681944836825 +:103E50009B682BB1BDE8104018476FF0150010BDEE +:103E60006FF05700FBE708B5C0688368DB689847C8 +:103E7000006808BD08B5C0688368DB68984740796A +:103E800008BD48B103683BB143682BB1C0688842A4 +:103E900094BF0020012070474FF0FF30704701F0C1 +:103EA0000DBB084600F02ABE01292DE9F341174653 +:103EB00001D900F0F7F92C2303FB0104D4F820808A +:103EC000B8F1000FF5D0E368268940461E4404236C +:103ED00031460DEB0302FFF787FF054620B10125B0 +:103EE000284602B0BDE8F08146F60813BDF804206C +:103EF00064899A421AD1BDF806309C4201D003254C +:103F0000EEE7042340460DEB0302A119FFF76CFF17 +:103F10000028E4D146F60713BDF804209A42EED1FA +:103F2000BDF80610214431443960D9E7002CF1D0A6 +:103F3000E5E77047002382681946FCF7A7BC08B57F +:103F40002C2303FB0101086A08B900F0ABF9042235 +:103F5000BDE8084000F0D8BDF8B513460F46164638 +:103F600000210246054600F02CF8044650B93346BD +:103F70000121284605F12C0200F023F810B1002F92 +:103F800018BF04462046F8BD002110B50446084677 +:103F9000FCF71CF904F12001C0B2FCF7ADF940B9FF +:103FA0000121FCF713F904F14C01C0B2FCF7A4F9AC +:103FB00008B100F077F910BD70477022002101F0C0 +:103FC00075BA08B52C2303FB0100006A08B900F09C +:103FD00069F920230021FFF707FF003818BF0120EF +:103FE00008BDF8B50C4610B1F9B10AB90120F8BD09 +:103FF00000278D1800F12806AC42F7D0836E5A1CBA +:10400000826614F8011B03443F2A83F82810F3D971 +:104010003146FCF701FFD0E9083213F5007342F195 +:104020000002C0E908328766E6E70846DFE7F8B530 +:104030000C46054600284BD000294AD08B6ED1E9AA +:104040000821D800121841F10001C4E9082180229A +:10405000581C38282344A0664FF0000783F8282016 +:1040600004F128060BD9C0F140023946304400F073 +:1040700032F820463146FCF7CFFE3846A766C0F13D +:1040800038020021304400F026F8236A626A1BBA25 +:1040900012BA3146C4E918232046FCF7BDFE2B1D99 +:1040A000211F243551F8042F0433100E03F8080C97 +:1040B000100C03F8070C100A03F8060C03F8052C83 +:1040C000AB42EFD120467022002100F004F801201D +:1040D000F8BD0846FCE701F0E9B900230B6043682E +:1040E00013B9C0E90011704719604160704770B59D +:1040F00006460D460024AC4200DB70BD305DFCF787 +:10410000FFFF0130F9D00134F5E72DE9F04F85B01C +:1041100005460E4690461F4600F0FDFE20B96FF0A2 +:104120004C0005B0BDE8F08F4FF014090023344671 +:104130004FF0010A09FB08693B60284602A900F01C +:10414000DEFE60B1DDE902324FF0000B0093C345A3 +:104150000CD10021284600F01EFF0028EDD1284692 +:1041600000F002FF0028DAD00020DAE7A14598BF6E +:10417000344661688A4214D121680098019201F0A6 +:104180009DF9019A68B9237C7BB9D4E902312846AC +:10419000984768B184F810A03B68143401333B6041 +:1041A000CBE714340BF1010BD1E76FF06F00B8E7E8 +:1041B0006FF02200B5E70123F0B50D180024184672 +:1041C000A94201D11355F0BD11F8017B3FB1013374 +:1041D000DBB2FF2B00F10106175404D13046135512 +:1041E00004460123461C3046EAE7F0B500240546A4 +:1041F0002046AC4204D20E5D631C46B94FF0FF303E +:10420000F0BDAB42FAD0CF5C0133175401301F1B15 +:10421000FFB2BE42F5D8FF2E04D0AB423EBF002411 +:10422000145401301C46E4E701F040B901F017B91D +:1042300001460068FDF7E4BB00210120FDF7E0BB6B +:1042400008B5FDF7A9FEFDF7B3FBFDF7BDFBFDF7D4 +:1042500041FFFEF7FBFC6FF08500704761B662B668 +:1042600080F31188BFF36F8F704772B6002383F31A +:104270001188BFF36F8FBFF34F8F30BF62B6BFF3AC +:104280006F8F7047202809D9B0F1004F08D8013846 +:10429000B0FA80F0C0F11F0040007047082070475E +:1042A0003E20704708B5FEF7C1F808B5FEF7AAF83A +:1042B000002008BD0A448A4200D1704711F8013B32 +:1042C00040BA80B25840C0F303134340180380B291 +:1042D0004340580100F4FF505840ECE72DE9F0410D +:1042E00006460D4617461C46ABB1D0F80880D8F8F4 +:1042F00000309847002D11DB84420FD8031BAB42DE +:104300000CD3D8F808E023463A4629463046F4460E +:10431000BDE8F04160471846BDE8F0816FF0150038 +:10432000FAE74FF0FF324FF0FF330430FEF712BDD3 +:104330000430FEF7BDBD4368D3E90203C01A7047DD +:1043400038B5456804460069FFF7EBFF2B8A206902 +:10435000002B0CBF6FF085050125FFF7E9FF28460C +:1043600038BD2DE9F8430D1E064690461C46D0F890 +:1043700004902DDBEA18D9E902315B1A9A4227D85A +:104380000069FFF7CEFFD9E9007299F81130B4B196 +:10439000D7F8089015441D443846D9F8003098479E +:1043A000002D12DB844210D8031B9D420DD82346FA +:1043B000424629463846D9F80490C8470446306931 +:1043C000FFF7B6FF2046BDE8F8836FF01504F6E767 +:1043D0006FF01504F6E72DE9F0410C4646680546F6 +:1043E000006990461F46FFF79CFF002C15DBD6E9BD +:1043F0000231E2195B1A9A420FD8D6E90003E1189C +:10440000737C19443B464246FFF768FF044628691F +:10441000FFF78EFF2046BDE8F0816FF01504F6E748 +:10442000F0B50024056985B01022002147680646D2 +:10443000684601F03BF82846FFF773FF2C702546CD +:10444000BB68A34205D83069FFF772FF284605B064 +:10445000F0BDD7E9000121441B1B102B28BF1023FE +:104460006A46FFF73BFF051EEDDBBB681B1B102BED +:1044700094BFE4181034E3E7F7B51C460023164652 +:1044800082682360A3600D465369694601AA984774 +:10449000019B5A1E01921BB96FF0150003B0F0BDCD +:1044A0000098A26847682168676085B9B31AD0F898 +:1044B00000C0634528BF634603FB07111A4421600F +:1044C000A26002689A4206D808300090E0E76B1AB2 +:1044D000B3FBF7F3EBE70020E0E713460022FFF71A +:1044E000CBBF43689B680B60012313607047436830 +:1044F00000205B69C1E90030704743685868704725 +:10450000436800205B681B680B60704743685B680A +:10451000586842400A4042405A6000207047436851 +:1045200000205A6853680B4353607047436800206B +:104530005A68536823EA01035360704743680020B8 +:104540005A6853684B405360704730B5B3F1C06F41 +:1045500044681CD0B2F5800F19D00120B2F5001FBD +:10456000656800FA01F102D16962002030BDB2F144 +:10457000A07F0CBFA962E9626268B3F1806F0CBFD3 +:10458000116351636368996363681962EDE76FF0C3 +:104590008500EBE730B50369586800B30024884212 +:1045A00019D108688CB99C685860A14200D1986004 +:1045B000002008602AB15A680A609A68596002B9F6 +:1045C000996000200FE02846E9E720609868814262 +:1045D00008BF9C60ECE705680446002DF3D1002A73 +:1045E000E9D16FF0150030BD08B543689B68984766 +:1045F000002008BD08B5062000220321FDF7B6FC07 +:10460000BDE808400620FDF7A3BC08B5072000223E +:104610000321FDF7ABFCBDE808400720FDF798BC7F +:1046200008B5102000220321FDF7A0FCBDE80840DA +:104630001020FDF78DBC08B5112000220321FDF7E5 +:1046400095FCBDE808401120FDF782BC70B54368B9 +:1046500002695B6805469E6B9E63516809B10C68F0 +:1046600001B970BD8A68324002D028464B6898472D +:104670001CB1236821461C46F2E72346FAE738B509 +:1046800012F4403F0C46456816D012F0320F13D199 +:1046900093030ED5130307D5FFF741FF6B681C6129 +:1046A00000206B68DC6138BD5303F7D5FFF73EFF90 +:1046B000F4E76B685961F3E76FF08500F3E70123D6 +:1046C00003FA01F1FFF7DBBF30B503695C68012332 +:1046D00003FA01F1236819422BD022F4702323F04E +:1046E00001031BB9237A23B1930317D56FF085001B +:1046F00015E0D503FAD4900310D56068EFF3118567 +:10470000202383F31288BFF36F8F130308D5036848 +:104710001943016085F31188BFF36F8F002030BD0E +:104720005303F7D52368026823EA010313400360AB +:10473000F0E76FF01500F2E7036900205B685A6844 +:104740001B68126813400B60704710B50369586806 +:1047500009C80140EFF31184202080F31288BFF3D1 +:104760006F8F186842400A4042401A6084F31188F3 +:10477000BFF36F8F002010BD03695B685A681B6828 +:104780001940EFF31180202383F31288BFF36F8F5A +:1047900013680B43136080F31188BFF36F8F002001 +:1047A000704703695B685A681B681940EFF3118012 +:1047B000202383F31288BFF36F8F136823EA01036A +:1047C000136080F31188BFF36F8F00207047036977 +:1047D0005B685A681B681940EFF31180202383F34C +:1047E0001288BFF36F8F13684B40136080F31188FA +:1047F000BFF36F8F002070476FF08500704703692B +:10480000426800205A60704730B50368136005792C +:10481000046804EBC504A34202D36FF0010030BD6D +:104820005C7908338C42F1D10020F8E7436858687E +:1048300070472DE9F0411F460E4615460446D0F854 +:1048400004804046FDF7C0FFD8F800103A463144D6 +:10485000284600F004FE6068FDF7C4FF0020BDE8B4 +:10486000F0812DE9F0411F460D4616460446D0F86A +:1048700004804046FDF7A8FFD8F800003A463146CC +:10488000284400F0ECFD6068FDF7ACFF0020BDE8B7 +:10489000F08138B5044645682846FDF795FF0021AC +:1048A0006A68286800F002FE6068FDF79BFF002040 +:1048B00038BD43681B685A68920743BF1B680020D5 +:1048C0000B704FF0FF30704743681B685A68D2077F +:1048D000FCD419607047034610465AB15B681A68E9 +:1048E0005068C00705D40120D0601B680A781A60A0 +:1048F000704700207047034610465AB15B681A683B +:10490000506810F0020005D00220D06001201B6822 +:104910001B680B7070474268EFF31180202383F30C +:104920001288BFF36F8F11688B6823F004038B60CC +:1049300013680122DA6080F31188BFF36F8F70472C +:1049400043681B685A68D2075ABF9868C0F3800052 +:10495000002070474268EFF31180202383F3128810 +:10496000BFF36F8F11688B6823F008038B601368A7 +:104970000222DA6080F31188BFF36F8F7047FFF770 +:10498000DFBF43681B68586810F002001CBF9868BE +:10499000C0F3C0007047704708B50246FFF7F1FF4B +:1049A00020B9BDE808401046FFF7CABF08BD03693B +:1049B000C3E901127047026953680BB19168184747 +:1049C000704710B54268EFF31184202383F31288F7 +:1049D000BFF36F8F11688B6843F008038B60136817 +:1049E0005B689B0701D5FFF7E6FF84F31188BFF3EF +:1049F0006F8F10BD10B54268EFF31184202383F34D +:104A00001288BFF36F8F11688B6843F004038B60CB +:104A100013685B68DB0701D4FFF7CDFF84F31188CF +:104A2000BFF36F8F10BD08B5002203210120FDF7F1 +:104A30009DFA0120FDF78CFA002203211046FDF7B4 +:104A400095FABDE808400020FDF782BA032108B5B9 +:104A500008460022FDF78AFA0320FDF779FA0220C2 +:104A600000220321FDF782FABDE808400220FDF78D +:104A70006FBA08B5002203210520FDF777FA05205B +:104A8000FDF766FA042000220321FDF76FFABDE866 +:104A900008400420FDF75CBA37B54568044600219C +:104AA000A86801AAFFF7B0FE002812DB019B0022D4 +:104AB00019791868FDF766FE00280ADB23691A6871 +:104AC0005AB903222B6820469A60EB689847002069 +:104AD00001E0831CF2D003B030BD61684B68002B4D +:104AE000EFD0B3FBF2F309680B61EAE770474FF0D0 +:104AF000E022136923F001031361704780681838BE +:104B000020F007001038704738B515460C4661B1E3 +:104B10005AB1FFF7AFF92146254411F8013B834212 +:104B200003D1A942F9D1012038BD0020FCE730B5FE +:104B3000026A0346D2E9014084424FF0000002D3EA +:104B40000123D36030BD18745068242501305060B3 +:104B5000186A4268541E0268184605FB04225C1954 +:104B600050F8045BA04242F8045BF9D1012099603F +:104B7000E8E7F0B5064604468BB001AD0F46944613 +:104B80000FCE0FC50FCE0FC5216A33684A682B6060 +:104B900022B90223CB6000200BB0F0BDFB072068D8 +:104BA000A56813D524260B68013A06FB02337E075D +:104BB00003D41A7C0AB10F23ECE7224603F1240147 +:104BC00053F8046B8B4242F8046BF9D1B90741BF2B +:104BD000226A536803F1FF335360AC4505D2236A60 +:104BE000002BD8D00422DA60D5E77A0748BF2060CE +:104BF0003B0701D40120CFE7143406AB93E807004C +:104C000084E80700F6E710B502601A44029B012908 +:104C100083604FF00003C26003740375836101D8A1 +:104C2000036210BD24224A43243A8418046283504C +:104C3000026A8C1E9460026A02295360026AD36081 +:104C4000026A1374026A53741EBF036A2430186028 +:104C5000E7E7182871F100030ED3B0F5807F71F1FA +:104C600000030BD3B0F5803F71F1000308D3002996 +:104C700014BF0920052070470120704702207047AB +:104C80000320704737B50024002508290A46CDE9DE +:104C900000450AD80146684600F0E1FBDDE9000165 +:104CA00003B0BDE83040FFF7D4BF002003B030BDF3 +:104CB00000B1C1607047436803608368013383605B +:104CC000006AFFF7F5BF08B50268C3689A4205D3CA +:104CD000006A0821FFF7ECFF002008BD0120FCE777 +:104CE00038B504460D46FFF7EEFF40B123681B7848 +:104CF000B5EB531F04D00A21206AFFF7D9FF00202B +:104D000038BD10B50446FFF7DEFF38B123681A78C6 +:104D1000FF2A05D00A21206AFFF7CAFF002010BD34 +:104D200001332360FBE710B5027D044632B1FFF783 +:104D3000E8FF48B100234FF0FF3223752046BDE85D +:104D400010400721FFF715BF10BD2DE9F84F0446AD +:104D50000E4691461D46FFF7B6FF804628B1A36870 +:104D600043B90321206AFFF7A3FF4FF00008404634 +:104D7000BDE8F88F2268177807F01F0BBBF11F0FF3 +:104D800012D1FDB1206A18B1037C0BB11521EAE7FD +:104D900001232B7000252368013563602B442360B9 +:104DA000A368013BA360E2E7BBF1170F0CD9ABF19D +:104DB0001803D9B2032905D801259D40A94504D27D +:104DC0000521CFE70721CDE70025E36805F1010ABA +:104DD0005244934201D20821C4E74A46002130469A +:104DE00000F064FB15B986F800B0D3E72268711EA5 +:104DF000531913F80109934201F8010FF9D1236AFD +:104E0000002BC8D01B7C002BC5D00737FFB2022F68 +:104E1000C1D949463046FFF735FF8245BBD0152141 +:104E2000A0E738B50C4611460546FFF759FF08B90B +:104E3000002038BD042200232846A118FFF785FF73 +:104E40000028F5D02B682360F3E7002337B504462C +:104E50008DF80330FFF744FFA8B1042220460DF17E +:104E600003030DEB0201FFF770FF60B19DF80350E3 +:104E700065B901992046FFF75AFE50B9636823606F +:104E8000A3680133A360002003B030BD6FF00F01B1 +:104E9000F0E72575F8E738B504460D46FFF7C1FF82 +:104EA00048B12268E3689B1A6A689A4204D90821CB +:104EB0002046FFF700FF002038BD70B50D460021E9 +:104EC00004461646FFF70CFF38B132462946204605 +:104ED000BDE870400023FFF738BF70BD0422FFF724 +:104EE000ECBFFFF7FBBF38B5022204460D46FFF7C3 +:104EF000D2FF18B123686A681344236038BD38B5FF +:104F0000032204460D46FFF7C6FF18B123686A68FE +:104F10001344236038BD10B505210446FFF795FF03 +:104F200050B1237D4BB96FF00042A368934205D383 +:104F300005212046FFF7BFFE002010BD5B00A360E7 +:104F4000FBE7037D23B98068B0FA80F04009704721 +:104F50000368C268934205D21878A0F1FF03584253 +:104F60005841704700207047FFF7DDBE38B50D4649 +:104F700006210446FFF7B4FE08B9002038BD00231F +:104F8000042229462046FFF7E0FE0028F5D0A3685A +:104F90000133A360F2E7F0B58FB00446FFF793FE4C +:104FA00000285DD0236800221D780023CDE902236C +:104FB00023466D0905AA04F12007164618685968AA +:104FC000083303C6BB423246F7D118683060062D5D +:104FD0001CD02A1F0023012A4FF008028DF804304C +:104FE0000DEB020198BF01AB05A8FFF7AEFE064628 +:104FF000002835D0042D3BD019D8023D012D21D9F0 +:10500000059B2360A368013BA3602AE001A905A8D2 +:10501000FFF7ACFF20B3059B089A934204D3082105 +:10502000206AFFF745FE1BE01D786D09CFE7052DCF +:10503000E6D1DDE90232B3F1004F72F1000113D382 +:105040002946EDE7E3682168029A5B1A9A4203D881 +:10505000059B13440593D3E708212046FFF72BFE59 +:10506000002630460FB0F0BDDB185241CDE90232C8 +:105070009DF8045025B16FF00F020023CDE9022303 +:10508000029B8DF82850079305A8FFF75AFF0146A9 +:1050900038B1002DB4D005A8FFF733FE0028AFD1FA +:1050A000DEE705A8FFF777FF0028EDD1D8E7FFF787 +:1050B000AABD00B1C160704710B50368C468A342BF +:1050C00005D3006A0821FFF7F4FF002010BD02F0AD +:1050D0001F0242EA41111970036801330360012085 +:1050E000F4E770B505460E46104619461446FFF71C +:1050F000C9FD22463146431E2846BDE87040FDF7F3 +:1051000071BCF8B51746C368026804469A420D465A +:1051100006D30821206AFFF7CCFF00263046F8BDF1 +:105120009B1A4A689A42F4D80E4656F8043B53B18B +:1051300004213046FFF7A6FD6A6823681344E2683D +:1051400003449A42E5D33246042339462046FFF70A +:10515000C8FF06460028E0D020682968884202D0AF +:105160006A6800F08AF923686A6813442360D5E707 +:10517000082A73B513460C4606D9006A0521FFF7C5 +:1051800098FF002002B070BD8E1816F9012C002A7D +:105190000FDA0A466C466946B24204D10121224622 +:1051A000FFF79FFFEEE712F8015BED4301F8015BAB +:1051B000F2E70021F3E713460A460021FFF791BF0B +:1051C00007B5042201910DEB0201FFF7D1FF03B0F7 +:1051D0005DF804FB07B5042201910DEB0201FFF716 +:1051E000EAFF03B05DF804FB0222FFF78ABF032247 +:1051F000FFF787BF07B5CDE900126946FFF7F4FF57 +:1052000003B05DF804FB07B5CDE900126946FFF76E +:10521000EEFF03B05DF804FB1F220421FFF74CBF33 +:105220001F220521FFF748BF1F220721FFF744BFB8 +:10523000FFF7FABF1FB50024CDE90144069C009496 +:10524000FFF7E1FC04B010BD10B5436904463BB95B +:105250000020E2684042537843F00103537010BDD0 +:1052600098470028F4D00028B8BF4042FF28A8BFC4 +:10527000FF20E3681870ECE740B1C368587810F07D +:1052800001001EBF1878B0FA80F040097047EFF3B4 +:105290001183202383F31288BFF36F8FFEE710B5CD +:1052A0002024EFF3118384F31288BFF36F8FFEF78E +:1052B000DCFFF6E703460020C3E90033C3E9020040 +:1052C00070470020704738B58589EFF3118120229F +:1052D00082F31288BFF36F8F037C13F0080404D0AD +:1052E00081F31188BFF36F8F38BD0122FDF798FF5E +:1052F000EB07F9D584F31188BFF36F8F04231846A9 +:1053000002DFF1E7FEF74EB8D0E9003213605A60D1 +:105310000023C0E90033704708B5FFF7F5FF037CB1 +:1053200023F0020303740023836008BD38B50446EC +:105330000D46FDF7C1FE237C43F002032374D5B173 +:10534000A5602B689D4209D16B68C4E900531C60BD +:105350006C6010E06A689A42F6D01B68002BF3D0AC +:1053600093F90E1094F90E209142F3DD5A68C4E9C6 +:10537000003214605C6038BD10B5EFF31184202357 +:1053800083F31288BFF36F8FFDF7C0FE84F311889B +:10539000BFF36F8F10BDFDF7B9BEFDF78DBE08B529 +:1053A000037C014613F0280F0CD183680BB1FFF783 +:1053B000B3FF0B7C084623F004030B74BDE80840E0 +:1053C000FDF7A4BE08BD38B50446EFF311852023D0 +:1053D00083F31288BFF36F8FFEF79AFA18B9A4F11E +:1053E0001800FFF7DCFF85F31188BFF36F8F38BD1E +:1053F0000846FDF7CBBE38B505460C46FEF7ACF8BF +:10540000B4F1FF3F08BFB5F1FF3F0AD00A23A0FB6C +:105410000303B0F1004F73F1000301D36FF00040BC +:1054200038BD4FF0FF30FBE708B50246FEF786F9BE +:1054300070B1D0E904319B1A61EBE272B3F1004F15 +:1054400072F1000104DA002AACBF1846002008BD42 +:105450006FF00040FBE708B5FEF7DAFA08BD0A4432 +:10546000914200F1FF3300D1704710B511F8014BA4 +:10547000914203F8014FF9D110BD884210B501EBFC +:10548000020402D98442234607D8431EA14207D012 +:1054900011F8012B03F8012FF8E70244824200D1F2 +:1054A00010BD13F8011D02F8011DF7E70346024481 +:1054B000934200D1704703F8011BF9E710B5013999 +:1054C0000244904201D1002005E0037811F8014F19 +:1054D000A34201D0181B10BD0130F2E7F0B504461D +:1054E0000846C2F13705EDB202F01F02B4FBF2F636 +:1054F000274602FB1641CBB2092984BF5B19DBB2F8 +:105500003033BA42344600F8013BEFD9F0BDD1E95F +:10551000043293421EBF5A1C0A6118707047000083 +:10552000000000001856000000000000FC550000BC +:1055300000000000E055000000000000C45500001D +:1055400000000000A85500000000000050560000B8 +:10555000000000006C5600000000000034560000FF +:1055600000000000C056000000000000A45600002B +:105570000000000088560000F52400000000000034 +:105580003D2800000000000000000000DC56000084 +:10559000000000001457000000000000F856000052 +:0855A0003102000000000000D0 +:1055A8009A940000245B000048580000B2000020D4 +:1055B80060100020E945000000000000A8940000E9 +:1055C800485B000048580000B40000206C10002020 +:1055D800E945000000000000B69400006C5B000084 +:1055E80048580000B600002078100020E945000067 +:1055F80000000000C4940000905B000048580000C0 +:10560800B800002084100020E945000000000000D8 +:1056180011950000E85B000090580000C0000020D1 +:10562800000000000000000000000000D29400000C +:10563800B45B00006C580000BA00002090100020F5 +:10564800FF47000000000000E7940000C05B000076 +:105658006C580000BC00002098100020FF47000094 +:1056680000000000FC940000CC5B00006C580000B7 +:10567800BE000020A0100020FF470000000000002E +:1056880035950000F45B0000A0580000C20000201F +:105698002C000020994A00000000000043950000FB +:1056A8000C5C0000A0580000C4000020500000203E +:1056B800994A00000000000051950000245C000099 +:1056C800A0580000C600002074000020994A00007D +:1056D80000000000A26C0000FC5A000030580000D6 +:1056E800B0000020240000208925000000000000F0 +:1056F800596C0000CC5A000000000000AC000020EB +:10570800D00700204924000000000000676C00005A +:10571800E45A000000000000AE000020E807002066 +:0857280049240000000000000C +:10573000C0560000B7490000C0560000B74900003D +:10574000A4560000B7490000A4560000B749000065 +:1057500088560000B749000088560000B74900008D +:10576000FC5500004D460000E05500004D4600008D +:105770000000000039420000000000003942000033 +:105780000000000039420000000000003942000023 +:105790000000000039420000000000003942000013 +:1057A0000000000039420000000000003942000003 +:1057B000C45500004D460000A85500004D460000AD +:1057C00000000000394200000000000039420000E3 +:1057D00000000000394200000000000039420000D3 +:1057E00000000000394200000000000039420000C3 +:1057F00000000000394200000000000039420000B3 +:1058000000000000394200000000000039420000A2 +:105810000000000039420000000000003942000092 +:105820000000000039420000000000003942000082 +:10583000452500008D260000E5250000FB44000002 +:10584000EF440000E3440000BF46000001450000B3 +:105850000D4500001F4500002D4500003D4500009E +:105860004B4500009545000000000000C9460000BF +:10587000394700004B47000079470000A34700006C +:10588000CF470000F94700000000000000000000C2 +:105890002D48000033480000634800009348000092 +:1058A000B3480000C94800000000000000000000EC +:1058B00000000000D7480000F7480000F54900004C +:1058C0001749000041490000C34900005549000044 +:1058D0007F4900008349000097490000ED4A00001D +:0C58E0009949000000000000AF490000E2 +:1058EC00005F0000040000005D5E0000040000008A +:1058FC00A25E000004000000215E00000400000015 +:10590C00D96A000004000000489600000400000062 +:10591C00295E0000040000001D950000040000003A +:10592C00736C000004000000C5650000040000005A +:08593C00975E0000040000006A +:10594400020400000000000019110000EF400000F4 +:10595400010000000200000004000000000000003C +:105964000000000000000100DC56000001000000FF +:105974000000010000000800DC56000002000000E6 +:105984000000090000000800DC56000003000000CD +:105994000000110000000400DC560000982F8A4229 +:1059A40091443771CFFBC0B5A5DBB5E95BC256396D +:1059B400F111F159A4823F92D55E1CAB98AA07D885 +:1059C400015B8312BE853124C37D0C55745DBE72A8 +:1059D400FEB1DE80A706DC9B74F19BC1C1699BE428 +:1059E4008647BEEFC69DC10FCCA10C246F2CE92DB8 +:1059F400AA84744ADCA9B05CDA88F97652513E98DC +:105A04006DC631A8C82703B0C77F59BFF30BE0C6E2 +:105A14004791A7D55163CA0667292914850AB72770 +:105A240038211B2EFC6D2C4D130D385354730A650D +:105A3400BB0A6A762EC9C281852C7292A1E8BFA2E4 +:105A44004B661AA8708B4BC2A3516CC719E892D14C +:105A5400240699D685350EF470A06A1016C1A419CF +:105A6400086C371E4C774827B5BCB034B30C1C39CE +:105A74004AAAD84E4FCA9C5BF36F2E68EE828F748D +:105A84006F63A5781478C8840802C78CFAFFBE90A7 +:105A9400EB6C50A4F7A3F9BEF27871C600000020A5 +:105AA4000000000000000B0602000000B45A0000D1 +:105AB40000000000B56B00002A0002020000002074 +:105AC400BD6B000022000B111856000000010000FD +:105AD40010000000000000000000000000000000B2 +:105AE4001856000000000000000100000000000043 +:105AF40000000000000000009F1600201C5B000056 +:105B0400145B0000000000000010000000002000F2 +:105B1400000200000010000004000000000000006B +:105B2400FFFFFFFF00300140374600000000000087 +:105B3400003001400001000000300140000200007C +:105B440000300140FFFFFFFF00200140214600001C +:105B5400000000000020014000010000002001407E +:105B64000002000000200140FFFFFFFF0010014081 +:105B74000B4600000000000000100140000100007E +:105B8400001001400002000000100140FFFFFFFF71 +:105B940000000140F5450000000000000000014045 +:105BA400000100000000014000020000000001406C +:105BB400FF0300004C8002400000000003000000CE +:105BC4000880024001000000030000000080024041 +:105BD40000000000FC550000E0550000C455000022 +:105BE400A855000000FC3F2000040000C80000206D +:105BF4000060004040787D01045C0000734A0000AE +:105C04000C5C0000000000000050004040787D0162 +:105C14001C5C00004D4A0000245C000000000000F1 +:105C24000040004040787D01345C0000274A0000B9 +:105C34003C5C000000000000F9950000079600009D +:105C44001B9600002A96000036960000205500009E +:105C5400205500008055000088550000A055000024 +:105C6400A8550000010002001000110012002000DD +:105C740021002200230024003000310032003300D0 +:105C8400FFFF25633A20456E7465722074686520B1 +:105C940073657269616C207265636F7665727920D1 +:105CA4006D6F64650A0025633A204572726F722035 +:105CB400696E697469616C697A696E6720626F6F75 +:105CC4007420636F6E736F6C652E207263203D20A9 +:105CD40025640A0025633A20426F6F746C6F616417 +:105CE40065722073657269616C2070726F6365738D +:105CF4007320776173207465726D696E6174656475 +:105D040020756E65787065637465646C790A002526 +:105D1400633A205374617274696E6720626F6F74A2 +:105D24006C6F616465720A0025633A204C65667481 +:105D340020626F6F745F676F207769746820737572 +:105D44006363657373203D3D2025640A0025633A2F +:105D54002053746179696E6720696E207365726976 +:105D6400616C207265636F766572790A0025633A07 +:105D740020556E61626C6520746F2066696E6420C4 +:105D8400626F6F7461626C6520696D6167650A009A +:105D940025633A20426F6F746C6F6164657220638F +:105DA4006861696E6C6F61642061646472657373A9 +:105DB400206F66667365743A20307825780A00256A +:105DC400633A20496D6167652076657273696F6E09 +:105DD4003A207625642E25642E25640A0025633A2C +:105DE400204A756D70696E6720746F207468652031 +:105DF400666972737420696D61676520736C6F7472 +:105E04000A0025633A204E657665722073686F75C3 +:105E14006C642067657420686572650A006D63753B +:105E2400626F6F74006F735F68656170002A2A2A5D +:105E3400205573696E67205A6570687972204F53D4 +:105E4400206275696C642066333361613262633445 +:105E5400613433202A2A2A0A0063627072696E74DC +:105E6400665F7061636B616765004661696C656458 +:105E740020746F207265626F6F743A207370696E5C +:105E84006E696E6720656E646C6573736C792E2E13 +:105E94002E0A007379735F6765746F707400666CA3 +:105EA4006173680025633A205368617265642064F5 +:105EB40061746120544C5620686561646572207772 +:105EC40072697465206661696C65643A2025640AA8 +:105ED4000025633A205368617265642064617461CB +:105EE40020544C5620646174612077726974652073 +:105EF4006661696C65643A2025640A00626F6F7498 +:105F04006C6F616465725F696E666F0025633A2029 +:105F1400626F6F747574696C5F696D675F76616CCD +:105F240069646174653A20666C61736820617265A6 +:105F3400612025700A0025633A20626F6F747574BE +:105F4400696C5F696D675F76616C69646174653AF9 +:105F540020544C5620697465726174696F6E2066B2 +:105F640061696C65642025640A0025633A20626FC8 +:105F74006F747574696C5F696D675F76616C696471 +:105F84006174653A20544C56206F66662025752C42 +:105F940020656E642025750A0025633A20626F6FC0 +:105FA400747574696C5F696D675F76616C6964614F +:105FB40074653A20544C56206265796F6E6420698A +:105FC4006D6167652073697A650A0025633A20620A +:105FD4006F6F747574696C5F696D675F76616C6906 +:105FE400646174653A20544C56202564206E6F74A5 +:105FF400207065726D69747465640A0025633A20C3 +:10600400626F6F747574696C5F696D675F76616CDC +:1060140069646174653A2045585045435445445F6A +:10602400484153485F544C56203D3D2025640A00A6 +:1060340025633A20626F6F747574696C5F696D676C +:106044005F686173680A0025633A20626F6F747534 +:1060540074696C5F746C765F697465725F6265679E +:10606400696E3A20747970652025642C2070726FF3 +:1060740074203D3D2025640A0025633A20626F6F39 +:10608400747574696C5F746C765F697465725F6E45 +:106094006578743A20736561726368696E67206617 +:1060A4006F722025642028256420697320616E792D +:1060B40029207374617274696E6720617420257578 +:1060C40020656E64696E672061742025750A002559 +:1060D400633A20626F6F747574696C5F746C765F79 +:1060E400697465725F6E6578743A2070726F746556 +:1060F4006374656420544C56202564206E6F7420AC +:10610400666F756E640A0025633A20626F6F74755A +:1061140074696C5F746C765F697465725F6E6578C0 +:10612400743A20544C562068656164657220617429 +:10613400202575206F76657272756E7320736563A2 +:1061440074696F6E20656E642025750A0025633AB4 +:1061540020626F6F747574696C5F746C765F6974B8 +:1061640065725F6E6578743A206D616C666F726DEE +:10617400656420544C56206174202575206F766523 +:106184007272756E732073656374696F6E20656EC9 +:10619400642025750A0025633A20626F6F74757454 +:1061A400696C5F746C765F697465725F6E65787430 +:1061B4003A20544C5620256420666F756E64206125 +:1061C40074202575202873697A65202564290A00BE +:1061D40025633A20626F6F747574696C5F746C76B2 +:1061E4005F697465725F6E6578743A20544C56200A +:1061F4002564206E6F7420666F756E640A002563D3 +:106204003A20626F6F745F65726173655F72656770 +:10621400696F6E3A20666C6173685F6172656120B4 +:1062240025702C206F66667365742025752C207389 +:10623400697A652025752C206261636B77617264CD +:1062440073203D3D20256868750A0025633A206265 +:106254006F6F745F65726173655F726567696F6E96 +:106264003A2064657669636520776974682065728D +:106274006173650A0025633A20626F6F745F73630C +:1062840072616D626C655F726567696F6E3A202535 +:10629400702025752025752025640A0025633A2081 +:1062A400626F6F745F76657273696F6E5F636D7032 +:1062B4003A20766572312025752E25752E25752098 +:1062C400767320766572322025752E25752E2575F8 +:1062D4000A0025633A204661696C656420746F2066 +:1062E400616464206461746120746F2073686172F6 +:1062F4006564206D656D6F727920617265612E0A27 +:10630400007072696D617279007365636F6E6461A8 +:1063140072790025633A204E6F20736C6F74207479 +:106324006F206C6F616420666F7220696D616765B0 +:106334002025640A0025633A20626F6F745F7661DA +:106344006C69646174655F736C6F743A20736C6F0D +:10635400742025642C2065787065637465645F73AC +:106364007761705F747970652025640A0025633A4B +:1063740020626F6F745F76616C69646174655F73CA +:106384006C6F743A206865616465722076616C692B +:10639400646174696F6E206661696C65642025644C +:1063A4000A0025633A20496D61676520696E20748F +:1063B400686520257320736C6F74206973206E6F79 +:1063C400742076616C6964210A0025633A20466171 +:1063D400696C65642072656164696E6720696D61CA +:1063E400676520686561646572732E0A0025633AE7 +:1063F40020496D61676520256420257320736C6FC7 +:10640400743A20696D616765206E6F7420666F75DC +:106414006E640A005072696D6172790025633A20D6 +:10642400252D397320736C6F743A20766572736905 +:106434006F6E3D25752E25752E25752B25750A0045 +:106444005365636F6E646172790025633A20496D08 +:10645400616765202564206C6F61646564206672E1 +:106464006F6D2074686520257320736C6F740A0047 +:1064740025633A20496D6167652025642052414DAA +:10648400206C6F616420616464726573732030787A +:10649400257820697320696E76616C69642E0A0020 +:1064A40025633A204572726F72207768696C737441 +:1064B40020636F7079696E6720696D616765202557 +:1064C400642066726F6D20466C61736820746F205F +:1064D4005352414D3A2025640A0025633A20496D00 +:1064E4006167652025642052414D206C6F616469A9 +:1064F4006E6720746F203078257820697320666178 +:10650400696C65642E0A0025633A20496D616765EC +:106514002025642052414D206C6F6164696E6720B0 +:10652400746F2030782578206973207375636365F0 +:10653400656465642E0A0025633A2052656D6F76A2 +:10654400696E6720696D6167652025642066726FD6 +:106554006D205352414D20617420616464726573EF +:106564007320307825780A0025633A2052656D6FD0 +:1065740076696E6720696D61676520256420736C98 +:106584006F742025642066726F6D20666C61736879 +:106594000A0025633A204E6F7420656E6F75676834 +:1065A400206D656D6F727920746F2073746F7265DE +:1065B40020696E636F6D696E672064617461210A7E +:1065C4000073657269616C5F616461707465720007 +:1065D40025633A2054580A00696D61676500646157 +:1065E4007461006F66660025633A205772697469A6 +:1065F4006E67206174203078257820756E74696C1C +:1066040020307825780A0025633A2052583A203001 +:106614007825780A0072630025633A204661696C24 +:10662400656420746F206F70656E20666C6173689A +:106634002061726561733A2025640A00696D61679F +:10664400657300736C6F74006861736800766572BB +:1066540073696F6E002568752E2568752E2568751B +:10666400002E2575006275665F73697A6500627530 +:10667400665F636F756E740025633A2072302F6114 +:10668400313A2020307825303878202072312F613B +:10669400323A2020307825303878202072322F6129 +:1066A400333A20203078253038780A0025633A20A0 +:1066B40072332F61343A20203078253038782072B4 +:1066C40031322F69703A20203078253038782072A2 +:1066D40031342F6C723A20203078253038780A0013 +:1066E40025633A2020787073723A20203078253060 +:1066F40038780A0025633A204661756C74696E67C0 +:1067040020696E737472756374696F6E206164645A +:106714007265737320287231352F7063293A2030E3 +:1067240078253038780A0025633A20556E68616E02 +:10673400646C6564204952516E3A2025640A002530 +:10674400633A202A2A2A2A2A2055534147452046BB +:1067540041554C54202A2A2A2A2A0A0025633A2021 +:1067640020204469766973696F6E206279207A65A6 +:10677400726F0A0025633A202020556E616C6967A8 +:106784006E6564206D656D6F7279206163636573F6 +:10679400730A0025633A2020204E6F20636F7072C5 +:1067A4006F636573736F7220696E7374727563744B +:1067B400696F6E730A0025633A202020496C6C656A +:1067C40067616C206C6F6164206F66204558435F7D +:1067D40052455455524E20696E746F2050430A003E +:1067E40025633A202020496C6C6567616C207573C1 +:1067F40065206F662074686520455053520A002551 +:10680400633A202020417474656D707420746F2085 +:106814006578656375746520756E646566696E6513 +:106824006420696E737472756374696F6E0A0025EF +:10683400633A202A2A2A2A2A2042555320464155BF +:106844004C54202A2A2A2A2A0A0025633A20202086 +:10685400537461636B696E67206572726F720A00AC +:1068640025633A202020556E737461636B696E67EB +:10687400206572726F720A0025633A2020205072DC +:106884006563697365206461746120627573206552 +:1068940072726F720A0025633A20202042464152E8 +:1068A40020416464726573733A20307825780A0055 +:1068B40025633A202020496D7072656369736520F1 +:1068C4006461746120627573206572726F720A006C +:1068D40025633A202020496E737472756374696F5E +:1068E4006E20627573206572726F720A0025633AB6 +:1068F400202A2A2A2A2A204D5055204641554C54F4 +:10690400202A2A2A2A2A0A0025633A20202053749E +:1069140061636B696E67206572726F722028636FA2 +:106924006E746578742061726561206D696768743E +:10693400206265206E6F742076616C6964290A0098 +:1069440025633A20202044617461204163636573A8 +:10695400732056696F6C6174696F6E0A0025633A1F +:106964002020204D4D46415220416464726573736A +:106974003A20307825780A0025633A202020496E91 +:10698400737472756374696F6E20416363657373A6 +:106994002056696F6C6174696F6E0A005265736585 +:1069A4007276656420457863657074696F6E20281B +:1069B4000053707572696F757320696E74657272B5 +:1069C4007570742028495251200025633A20535091 +:1069D40053454C20696E20746872656164206D6F44 +:1069E400646520646F6573206E6F7420696E6469DA +:1069F40063617465205053500A0025633A202A2AA3 +:106A04002A2A2A2048415244204641554C54202ADF +:106A14002A2A2A2A0A0025633A2020204275732054 +:106A24006661756C74206F6E20766563746F722076 +:106A34007461626C6520726561640A0025633A20A2 +:106A440020204465627567206576656E740A0025AA +:106A5400633A2020204661756C7420657363616C11 +:106A64006174696F6E20287365652062656C6F7749 +:106A7400290A0025633A20415243485F455843455B +:106A84005054207769746820726561736F6E202595 +:106A9400780A0A0025633A202A2A2A2A2A204465E9 +:106AA400627567206D6F6E69746F722065786365B7 +:106AB4007074696F6E202A2A2A2A2A0A0025633AEA +:106AC400202A2A2A2A2A20257320256429202A2AD2 +:106AD4002A2A2A0A006D70750025633A205B256412 +:106AE4005D20307825303878203078253038780AA1 +:106AF4000025633A204661696C656420746F2061E7 +:106B04006C6C6F63617465206E6577204D50552001 +:106B1400726567696F6E2025750A0A0025633A203D +:106B240050726F6772616D204D50552072656769B0 +:106B34006F6E20617420696E6465782030782578E2 +:106B44000A0025633A20506172746974696F6E207B +:106B540025753A20636F686572656E6365206368A6 +:106B640065636B206661696C65642E0A0025633A6F +:106B740020436F6E666967757265204D50552072AB +:106B84006567696F6E20617420696E646578203072 +:106B94007825780A0025633A20746F74616C20723A +:106BA4006567696F6E20636F756E743A2025640A99 +:106BB40000464C4153485F30005352414D5F300012 +:106BC40061626F727428290A0025633A2050617249 +:106BD400656E7420646576696365206973206E6FE1 +:106BE400742072656164790A0025633A20506172E9 +:106BF400656E7420696E697469616C697361746926 +:106C04006F6E206661696C7572653A2025640A00AE +:106C140025633A20556E6465726C79696E672061EC +:106C24007265612073697A6520697320696E737572 +:106C34006666696369656E742C2072657175697224 +:106C440065733A20307825782C206861733A2030B7 +:106C54007825780A00626F6F745F6D6F64654031E8 +:106C6400303000626F6F745F696E666F403000721F +:106C74006574656E74696F6E00666C6173685F73CA +:106C8400696D5F737461747300666C6173685F73BC +:106C9400696D5F7468726573686F6C64730073699F +:106CA4006D5F666C6173685F636F6E74726F6C6C3A +:106CB4006572006D61785F77726974655F63616C9A +:106CC4006C73006D61785F65726173655F63616C9D +:106CD4006C73006D61785F6C656E006279746573C6 +:106CE4005F726561640062797465735F7772697459 +:106CF40074656E00646F75626C655F777269746544 +:106D04007300666C6173685F726561645F63616C74 +:106D14006C7300666C6173685F726561645F74694B +:106D24006D655F757300666C6173685F7772697413 +:106D3400655F63616C6C7300666C6173685F777226 +:106D44006974655F74696D655F757300666C617302 +:106D5400685F65726173655F63616C6C7300666C18 +:106D64006173685F65726173655F74696D655F7592 +:106D7400730065726173655F6379636C65735F75D6 +:106D84006E6974300065726173655F6379636C6505 +:106D9400735F756E6974310065726173655F6379E1 +:106DA400636C65735F756E697432006572617365D7 +:106DB4005F6379636C65735F756E697433006572C4 +:106DC4006173655F6379636C65735F756E69743451 +:106DD4000065726173655F6379636C65735F756E7B +:106DE4006974350065726173655F6379636C65739B +:106DF4005F756E6974360065726173655F6379638C +:106E04006C65735F756E6974370065726173655F75 +:106E14006379636C65735F756E697438006572615C +:106E240073655F6379636C65735F756E697439004C +:106E340065726173655F6379636C65735F756E69B1 +:106E44007431300065726173655F6379636C657377 +:106E54005F756E697431310065726173655F637962 +:106E6400636C65735F756E6974313200657261734A +:106E7400655F6379636C65735F756E697431330044 +:106E840065726173655F6379636C65735F756E6961 +:106E94007431340065726173655F6379636C657323 +:106EA4005F756E697431350065726173655F63790E +:106EB400636C65735F756E697431360065726173F6 +:106EC400655F6379636C65735F756E6974313700F0 +:106ED40065726173655F6379636C65735F756E6911 +:106EE4007431380065726173655F6379636C6573CF +:106EF4005F756E697431390065726173655F6379BA +:106F0400636C65735F756E697432300065726173AA +:106F1400655F6379636C65735F756E6974323100A4 +:106F240065726173655F6379636C65735F756E69C0 +:106F34007432320065726173655F6379636C657383 +:106F44005F756E697432330065726173655F63796E +:106F5400636C65735F756E69743234006572617356 +:106F6400655F6379636C65735F756E697432350050 +:106F740065726173655F6379636C65735F756E6970 +:106F84007432360065726173655F6379636C65732F +:106F94005F756E697432370065726173655F63791A +:106FA400636C65735F756E69743238006572617302 +:106FB400655F6379636C65735F756E6974323900FC +:106FC40065726173655F6379636C65735F756E6920 +:106FD4007433300065726173655F6379636C6573E4 +:106FE4005F756E697433310065726173655F6379CF +:106FF400636C65735F756E697433320065726173B7 +:10700400655F6379636C65735F756E6974333300B0 +:1070140065726173655F6379636C65735F756E69CF +:107024007433340065726173655F6379636C65738F +:107034005F756E697433350065726173655F63797A +:10704400636C65735F756E69743336006572617362 +:10705400655F6379636C65735F756E69743337005C +:1070640065726173655F6379636C65735F756E697F +:107074007433380065726173655F6379636C65733B +:107084005F756E697433390065726173655F637926 +:10709400636C65735F756E69743430006572617317 +:1070A400655F6379636C65735F756E697434310011 +:1070B40065726173655F6379636C65735F756E692F +:1070C4007434320065726173655F6379636C6573F0 +:1070D4005F756E697434330065726173655F6379DB +:1070E400636C65735F756E697434340065726173C3 +:1070F400655F6379636C65735F756E6974343500BD +:1071040065726173655F6379636C65735F756E69DE +:107114007434360065726173655F6379636C65739B +:107124005F756E697434370065726173655F637986 +:10713400636C65735F756E6974343800657261736E +:10714400655F6379636C65735F756E697434390068 +:1071540065726173655F6379636C65735F756E698E +:107164007435300065726173655F6379636C657350 +:107174005F756E697435310065726173655F63793B +:10718400636C65735F756E69743532006572617323 +:10719400655F6379636C65735F756E69743533001D +:1071A40065726173655F6379636C65735F756E693E +:1071B4007435340065726173655F6379636C6573FC +:1071C4005F756E697435350065726173655F6379E7 +:1071D400636C65735F756E697435360065726173CF +:1071E400655F6379636C65735F756E6974353700C9 +:1071F40065726173655F6379636C65735F756E69EE +:107204007435380065726173655F6379636C6573A7 +:107214005F756E697435390065726173655F637992 +:10722400636C65735F756E69743630006572617383 +:10723400655F6379636C65735F756E69743631007D +:1072440065726173655F6379636C65735F756E699D +:107254007436320065726173655F6379636C65735C +:107264005F756E697436330065726173655F637947 +:10727400636C65735F756E6974363400657261732F +:10728400655F6379636C65735F756E697436350029 +:1072940065726173655F6379636C65735F756E694D +:1072A4007436360065726173655F6379636C657308 +:1072B4005F756E697436370065726173655F6379F3 +:1072C400636C65735F756E697436380065726173DB +:1072D400655F6379636C65735F756E6974363900D5 +:1072E40065726173655F6379636C65735F756E69FD +:1072F4007437300065726173655F6379636C6573BD +:107304005F756E697437310065726173655F6379A7 +:10731400636C65735F756E6974373200657261738F +:10732400655F6379636C65735F756E697437330089 +:1073340065726173655F6379636C65735F756E69AC +:107344007437340065726173655F6379636C657368 +:107354005F756E697437350065726173655F637953 +:10736400636C65735F756E6974373600657261733B +:10737400655F6379636C65735F756E697437370035 +:1073840065726173655F6379636C65735F756E695C +:107394007437380065726173655F6379636C657314 +:1073A4005F756E697437390065726173655F6379FF +:1073B400636C65735F756E697438300065726173F0 +:1073C400655F6379636C65735F756E6974383100EA +:1073D40065726173655F6379636C65735F756E690C +:1073E4007438320065726173655F6379636C6573C9 +:1073F4005F756E697438330065726173655F6379B4 +:10740400636C65735F756E6974383400657261739B +:10741400655F6379636C65735F756E697438350095 +:1074240065726173655F6379636C65735F756E69BB +:107434007438360065726173655F6379636C657374 +:107444005F756E697438370065726173655F63795F +:10745400636C65735F756E69743838006572617347 +:10746400655F6379636C65735F756E697438390041 +:1074740065726173655F6379636C65735F756E696B +:107484007439300065726173655F6379636C657329 +:107494005F756E697439310065726173655F637914 +:1074A400636C65735F756E697439320065726173FC +:1074B400655F6379636C65735F756E6974393300F6 +:1074C40065726173655F6379636C65735F756E691B +:1074D4007439340065726173655F6379636C6573D5 +:1074E4005F756E697439350065726173655F6379C0 +:1074F400636C65735F756E697439360065726173A8 +:10750400655F6379636C65735F756E6974393700A1 +:1075140065726173655F6379636C65735F756E69CA +:107524007439380065726173655F6379636C657380 +:107534005F756E697439390065726173655F63796B +:10754400636C65735F756E697431303000657261A8 +:1075540073655F6379636C65735F756E69743130ED +:10756400310065726173655F6379636C65735F7520 +:107574006E69743130320065726173655F6379637B +:107584006C65735F756E6974313033006572617355 +:10759400655F6379636C65735F756E6974313034EC +:1075A4000065726173655F6379636C65735F756EA3 +:1075B40069743130350065726173655F6379636C3A +:1075C40065735F756E697431303600657261736519 +:1075D4005F6379636C65735F756E6974313037000E +:1075E40065726173655F6379636C65735F756E69FA +:1075F400743130380065726173655F6379636C65FB +:10760400735F756E69743130390065726173655FDB +:107614006379636C65735F756E69743131300065CD +:10762400726173655F6379636C65735F756E6974AA +:107634003131310065726173655F6379636C6573C1 +:107644005F756E69743131320065726173655F63B1 +:1076540079636C65735F756E69743131330065727B +:107664006173655F6379636C65735F756E697431AB +:1076740031340065726173655F6379636C65735F50 +:10768400756E69743131350065726173655F637954 +:10769400636C65735F756E69743131360065726150 +:1076A40073655F6379636C65735F756E697431319B +:1076B400370065726173655F6379636C65735F75C9 +:1076C4006E69743131380065726173655F63796323 +:1076D4006C65735F756E69743131390065726173FD +:1076E400655F6379636C65735F756E69743132309D +:1076F4000065726173655F6379636C65735F756E52 +:1077040069743132310065726173655F6379636CEA +:1077140065735F756E6974313232006572617365C9 +:107724005F6379636C65735F756E697431323300BE +:1077340065726173655F6379636C65735F756E69A8 +:10774400743132340065726173655F6379636C65AB +:10775400735F756E69743132350065726173655F8C +:107764006379636C65735F756E6974313236006575 +:10777400726173655F6379636C65735F756E697459 +:107784003132370065726173655F6379636C657369 +:107794005F756E69743132380065726173655F6359 +:1077A40079636C65735F756E697431323900657223 +:1077B4006173655F6379636C65735F756E6974315A +:1077C40033300065726173655F6379636C65735F01 +:1077D400756E69743133310065726173655F637905 +:1077E400636C65735F756E69743133320065726101 +:1077F40073655F6379636C65735F756E6974313348 +:10780400330065726173655F6379636C65735F757B +:107814006E69743133340065726173655F637963D3 +:107824006C65735F756E69743133350065726173AD +:10783400655F6379636C65735F756E697431333644 +:107844000065726173655F6379636C65735F756E00 +:1078540069743133370065726173655F6379636C92 +:1078640065735F756E697431333800657261736571 +:107874005F6379636C65735F756E69743133390066 +:1078840065726173655F6379636C65735F756E6957 +:10789400743134300065726173655F6379636C655C +:1078A400735F756E69743134310065726173655F3D +:1078B4006379636C65735F756E6974313432006526 +:1078C400726173655F6379636C65735F756E697408 +:1078D4003134330065726173655F6379636C65731A +:1078E4005F756E69743134340065726173655F630A +:1078F40079636C65735F756E6974313435006572D4 +:107904006173655F6379636C65735F756E69743108 +:1079140034360065726173655F6379636C65735FA8 +:10792400756E69743134370065726173655F6379AC +:10793400636C65735F756E697431343800657261A8 +:1079440073655F6379636C65735F756E69743134F5 +:10795400390065726173655F6379636C65735F7524 +:107964006E69743135300065726173655F63796384 +:107974006C65735F756E697431353100657261735E +:10798400655F6379636C65735F756E6974313532F5 +:107994000065726173655F6379636C65735F756EAF +:1079A40069743135330065726173655F6379636C43 +:1079B40065735F756E697431353400657261736522 +:1079C4005F6379636C65735F756E69743135350017 +:1079D40065726173655F6379636C65735F756E6906 +:1079E400743135360065726173655F6379636C6504 +:1079F400735F756E69743135370065726173655FE5 +:107A04006379636C65735F756E69743135380065CD +:107A1400726173655F6379636C65735F756E6974B6 +:107A24003135390065726173655F6379636C6573C1 +:107A34005F756E69743136300065726173655F63BA +:107A440079636C65735F756E697431363100657284 +:107A54006173655F6379636C65735F756E697431B7 +:107A640036320065726173655F6379636C65735F59 +:107A7400756E69743136330065726173655F63795D +:107A8400636C65735F756E69743136340065726159 +:107A940073655F6379636C65735F756E69743136A2 +:107AA400350065726173655F6379636C65735F75D7 +:107AB4006E69743136360065726173655F6379632C +:107AC4006C65735F756E6974313637006572617306 +:107AD400655F6379636C65735F756E69743136389D +:107AE4000065726173655F6379636C65735F756E5E +:107AF40069743136390065726173655F6379636CEB +:107B040065735F756E6974313730006572617365D2 +:107B14005F6379636C65735F756E697431373100C7 +:107B240065726173655F6379636C65735F756E69B4 +:107B3400743137320065726173655F6379636C65B4 +:107B4400735F756E69743137330065726173655F95 +:107B54006379636C65735F756E697431373400657E +:107B6400726173655F6379636C65735F756E697465 +:107B74003137350065726173655F6379636C657372 +:107B84005F756E69743137360065726173655F6362 +:107B940079636C65735F756E69743137370065722C +:107BA4006173655F6379636C65735F756E69743166 +:107BB40037380065726173655F6379636C65735F01 +:107BC400756E69743137390065726173655F637905 +:107BD400636C65735F756E6974313830006572610A +:107BE40073655F6379636C65735F756E697431384F +:107BF400310065726173655F6379636C65735F758A +:107C04006E69743138320065726173655F637963DC +:107C14006C65735F756E69743138330065726173B6 +:107C2400655F6379636C65735F756E69743138344D +:107C34000065726173655F6379636C65735F756E0C +:107C440069743138350065726173655F6379636C9B +:107C540065735F756E69743138360065726173657A +:107C64005F6379636C65735F756E6974313837006F +:107C740065726173655F6379636C65735F756E6963 +:107C8400743138380065726173655F6379636C655C +:107C9400735F756E69743138390065726173655F3D +:107CA4006379636C65735F756E697431393000652F +:107CB400726173655F6379636C65735F756E697414 +:107CC4003139310065726173655F6379636C657323 +:107CD4005F756E69743139320065726173655F6313 +:107CE40079636C65735F756E6974313933006572DD +:107CF4006173655F6379636C65735F756E69743115 +:107D040039340065726173655F6379636C65735FB1 +:107D1400756E69743139350065726173655F6379B5 +:107D2400636C65735F756E697431393600657261B1 +:107D340073655F6379636C65735F756E69743139FC +:107D4400370065726173655F6379636C65735F7532 +:107D54006E69743139380065726173655F63796384 +:107D64006C65735F756E697431393900657261735E +:107D7400655F6379636C65735F756E697432303007 +:107D84000065726173655F6379636C65735F756EBB +:107D940069743230310065726173655F6379636C55 +:107DA40065735F756E697432303200657261736534 +:107DB4005F6379636C65735F756E69743230330029 +:107DC40065726173655F6379636C65735F756E6912 +:107DD400743230340065726173655F6379636C6516 +:107DE400735F756E69743230350065726173655FF7 +:107DF4006379636C65735F756E69743230360065E0 +:107E0400726173655F6379636C65735F756E6974C2 +:107E14003230370065726173655F6379636C6573D3 +:107E24005F756E69743230380065726173655F63C3 +:107E340079636C65735F756E69743230390065728D +:107E44006173655F6379636C65735F756E697432C2 +:107E540031300065726173655F6379636C65735F6C +:107E6400756E69743231310065726173655F63796F +:107E7400636C65735F756E6974323132006572616B +:107E840073655F6379636C65735F756E69743231B2 +:107E9400330065726173655F6379636C65735F75E5 +:107EA4006E69743231340065726173655F6379633E +:107EB4006C65735F756E6974323135006572617318 +:107EC400655F6379636C65735F756E6974323136AF +:107ED4000065726173655F6379636C65735F756E6A +:107EE40069743231370065726173655F6379636CFD +:107EF40065735F756E6974323138006572617365DC +:107F04005F6379636C65735F756E697432313900D0 +:107F140065726173655F6379636C65735F756E69C0 +:107F2400743232300065726173655F6379636C65C6 +:107F3400735F756E69743232310065726173655FA7 +:107F44006379636C65735F756E6974323232006590 +:107F5400726173655F6379636C65735F756E697471 +:107F64003232330065726173655F6379636C657384 +:107F74005F756E69743232340065726173655F6374 +:107F840079636C65735F756E69743232350065723E +:107F94006173655F6379636C65735F756E69743271 +:107FA40032360065726173655F6379636C65735F14 +:107FB400756E69743232370065726173655F637917 +:107FC400636C65735F756E69743232380065726113 +:107FD40073655F6379636C65735F756E6974323260 +:107FE400390065726173655F6379636C65735F758E +:107FF4006E69743233300065726173655F637963EF +:108004006C65735F756E69743233310065726173C8 +:10801400655F6379636C65735F756E69743233325F +:108024000065726173655F6379636C65735F756E18 +:1080340069743233330065726173655F6379636CAD +:1080440065735F756E69743233340065726173658C +:108054005F6379636C65735F756E69743233350081 +:1080640065726173655F6379636C65735F756E696F +:10807400743233360065726173655F6379636C656E +:10808400735F756E69743233370065726173655F4F +:108094006379636C65735F756E6974323338006538 +:1080A400726173655F6379636C65735F756E697420 +:1080B4003233390065726173655F6379636C65732C +:1080C4005F756E69743234300065726173655F6325 +:1080D40079636C65735F756E6974323431006572EF +:1080E4006173655F6379636C65735F756E69743220 +:1080F40034320065726173655F6379636C65735FC5 +:10810400756E69743234330065726173655F6379C7 +:10811400636C65735F756E697432343400657261C3 +:1081240073655F6379636C65735F756E697432340C +:10813400350065726173655F6379636C65735F7540 +:108144006E69743234360065726173655F63796396 +:108154006C65735F756E6974323437006572617370 +:10816400655F6379636C65735F756E697432343807 +:108174000065726173655F6379636C65735F756EC7 +:1081840069743234390065726173655F6379636C55 +:1081940065735F756E69743235300065726173653D +:1081A4005F6379636C65735F756E69743235310032 +:1081B40065726173655F6379636C65735F756E691E +:1081C400743235320065726173655F6379636C651F +:1081D400735F756E69743235330065726173655F00 +:1081E4006379636C65735F756E69743235340065E9 +:1081F400726173655F6379636C65735F756E6974CF +:108204003235350064697274795F726561645F75D3 +:108214006E6974300064697274795F726561645F59 +:10822400756E6974310064697274795F7265616432 +:108234005F756E6974320064697274795F72656126 +:10824400645F756E6974330064697274795F726512 +:1082540061645F756E6974340064697274795F7205 +:108264006561645F756E6974350064697274795F01 +:10827400726561645F756E697436006469727479DD +:108284005F726561645F756E6974370064697274E6 +:10829400795F726561645F756E69743800646972D0 +:1082A40074795F726561645F756E697439006469BD +:1082B4007274795F726561645F756E6974313000E0 +:1082C40064697274795F726561645F756E69743133 +:1082D400310064697274795F726561645F756E6997 +:1082E4007431320064697274795F726561645F75B8 +:1082F4006E697431330064697274795F72656164A4 +:108304005F756E697431340064697274795F726583 +:1083140061645F756E697431350064697274795F84 +:10832400726561645F756E69743136006469727474 +:10833400795F726561645F756E6974313700646971 +:108344007274795F726561645F756E697431380047 +:1083540064697274795F726561645F756E697431A2 +:10836400390064697274795F726561645F756E69FE +:108374007432300064697274795F726561645F7528 +:108384006E697432310064697274795F7265616414 +:108394005F756E697432320064697274795F7265F4 +:1083A40061645F756E697432330064697274795FF5 +:1083B400726561645F756E697432340064697274E5 +:1083C400795F726561645F756E69743235006469E2 +:1083D4007274795F726561645F756E6974323600B8 +:1083E40064697274795F726561645F756E69743211 +:1083F400370064697274795F726561645F756E6970 +:108404007432380064697274795F726561645F758F +:108414006E697432390064697274795F726561647B +:108424005F756E697433300064697274795F726564 +:1084340061645F756E697433310064697274795F65 +:10844400726561645F756E69743332006469727455 +:10845400795F726561645F756E6974333300646952 +:108464007274795F726561645F756E697433340028 +:1084740064697274795F726561645F756E6974337F +:10848400350064697274795F726561645F756E69E1 +:108494007433360064697274795F726561645F7500 +:1084A4006E697433370064697274795F72656164EC +:1084B4005F756E697433380064697274795F7265CC +:1084C40061645F756E697433390064697274795FCD +:1084D400726561645F756E697434300064697274C6 +:1084E400795F726561645F756E69743431006469C3 +:1084F4007274795F726561645F756E697434320099 +:1085040064697274795F726561645F756E697434ED +:10851400330064697274795F726561645F756E6952 +:108524007434340064697274795F726561645F7570 +:108534006E697434350064697274795F726561645C +:108544005F756E697434360064697274795F72653C +:1085540061645F756E697434370064697274795F3D +:10856400726561645F756E6974343800646972742D +:10857400795F726561645F756E697434390064692A +:108584007274795F726561645F756E697435300009 +:1085940064697274795F726561645F756E6974355C +:1085A400310064697274795F726561645F756E69C4 +:1085B4007435320064697274795F726561645F75E1 +:1085C4006E697435330064697274795F72656164CD +:1085D4005F756E697435340064697274795F7265AD +:1085E40061645F756E697435350064697274795FAE +:1085F400726561645F756E6974353600646972749E +:10860400795F726561645F756E697435370064699A +:108614007274795F726561645F756E697435380070 +:1086240064697274795F726561645F756E697435CB +:10863400390064697274795F726561645F756E692B +:108644007436300064697274795F726561645F7551 +:108654006E697436310064697274795F726561643D +:108664005F756E697436320064697274795F72651D +:1086740061645F756E697436330064697274795F1E +:10868400726561645F756E6974363400646972740E +:10869400795F726561645F756E697436350064690B +:1086A4007274795F726561645F756E6974363600E1 +:1086B40064697274795F726561645F756E6974363A +:1086C400370064697274795F726561645F756E699D +:1086D4007436380064697274795F726561645F75B9 +:1086E4006E697436390064697274795F72656164A5 +:1086F4005F756E697437300064697274795F72658E +:1087040061645F756E697437310064697274795F8E +:10871400726561645F756E6974373200646972747E +:10872400795F726561645F756E697437330064697B +:108734007274795F726561645F756E697437340051 +:1087440064697274795F726561645F756E697437A8 +:10875400350064697274795F726561645F756E690E +:108764007437360064697274795F726561645F7529 +:108774006E697437370064697274795F7265616415 +:108784005F756E697437380064697274795F7265F5 +:1087940061645F756E697437390064697274795FF6 +:1087A400726561645F756E697438300064697274EF +:1087B400795F726561645F756E69743831006469EC +:1087C4007274795F726561645F756E6974383200C2 +:1087D40064697274795F726561645F756E69743817 +:1087E400330064697274795F726561645F756E6980 +:1087F4007438340064697274795F726561645F759A +:108804006E697438350064697274795F7265616485 +:108814005F756E697438360064697274795F726565 +:1088240061645F756E697438370064697274795F66 +:10883400726561645F756E69743838006469727456 +:10884400795F726561645F756E6974383900646953 +:108854007274795F726561645F756E697439300032 +:1088640064697274795F726561645F756E69743985 +:10887400310064697274795F726561645F756E69F1 +:108884007439320064697274795F726561645F750A +:108894006E697439330064697274795F72656164F6 +:1088A4005F756E697439340064697274795F7265D6 +:1088B40061645F756E697439350064697274795FD7 +:1088C400726561645F756E697439360064697274C7 +:1088D400795F726561645F756E69743937006469C4 +:1088E4007274795F726561645F756E69743938009A +:1088F40064697274795F726561645F756E697439F5 +:10890400390064697274795F726561645F756E6958 +:10891400743130300064697274795F726561645FC8 +:10892400756E69743130310064697274795F72658F +:1089340061645F756E697431303200646972747990 +:108944005F726561645F756E6974313033006469A8 +:108954007274795F726561645F756E697431303405 +:108964000064697274795F726561645F756E6974BD +:108974003130350064697274795F726561645F7562 +:108984006E69743130360064697274795F7265613E +:10899400645F756E69743130370064697274795F2D +:1089A400726561645F756E69743130380064697230 +:1089B40074795F726561645F756E69743130390012 +:1089C40064697274795F726561645F756E6974312C +:1089D40031300064697274795F726561645F756EC9 +:1089E40069743131310064697274795F72656164EC +:1089F4005F756E69743131320064697274795F72C3 +:108A04006561645F756E69743131330064697274D1 +:108A1400795F726561645F756E69743131340064C5 +:108A2400697274795F726561645F756E69743131FE +:108A3400350064697274795F726561645F756E692B +:108A4400743131360064697274795F726561645F90 +:108A5400756E69743131370064697274795F726557 +:108A640061645F756E697431313800646972747958 +:108A74005F726561645F756E697431313900646970 +:108A84007274795F726561645F756E6974313230D6 +:108A94000064697274795F726561645F756E69748C +:108AA4003132310064697274795F726561645F7533 +:108AB4006E69743132320064697274795F7265610F +:108AC400645F756E69743132330064697274795FFE +:108AD400726561645F756E69743132340064697201 +:108AE40074795F726561645F756E697431323500E3 +:108AF40064697274795F726561645F756E697431FB +:108B040032360064697274795F726561645F756E90 +:108B140069743132370064697274795F72656164B3 +:108B24005F756E69743132380064697274795F728A +:108B34006561645F756E6974313239006469727499 +:108B4400795F726561645F756E6974313330006496 +:108B5400697274795F726561645F756E69743133CB +:108B6400310064697274795F726561645F756E69FE +:108B7400743133320064697274795F726561645F61 +:108B8400756E69743133330064697274795F726528 +:108B940061645F756E697431333400646972747929 +:108BA4005F726561645F756E697431333500646941 +:108BB4007274795F726561645F756E69743133369E +:108BC4000064697274795F726561645F756E69745B +:108BD4003133370064697274795F726561645F75FB +:108BE4006E69743133380064697274795F726561D7 +:108BF400645F756E69743133390064697274795FC6 +:108C0400726561645F756E697431343000646972D1 +:108C140074795F726561645F756E697431343100B3 +:108C240064697274795F726561645F756E697431C9 +:108C340034320064697274795F726561645F756E61 +:108C440069743134330064697274795F7265616484 +:108C54005F756E69743134340064697274795F725B +:108C64006561645F756E697431343500646972746A +:108C7400795F726561645F756E697431343600645E +:108C8400697274795F726561645F756E6974313499 +:108C9400370064697274795F726561645F756E69C7 +:108CA400743134380064697274795F726561645F29 +:108CB400756E69743134390064697274795F7265F0 +:108CC40061645F756E6974313530006469727479FA +:108CD4005F726561645F756E697431353100646912 +:108CE4007274795F726561645F756E69743135326F +:108CF4000064697274795F726561645F756E69742A +:108D04003135330064697274795F726561645F75CB +:108D14006E69743135340064697274795F726561A7 +:108D2400645F756E69743135350064697274795F96 +:108D3400726561645F756E69743135360064697299 +:108D440074795F726561645F756E6974313537007B +:108D540064697274795F726561645F756E69743198 +:108D640035380064697274795F726561645F756E29 +:108D740069743135390064697274795F726561644C +:108D84005F756E69743136300064697274795F722C +:108D94006561645F756E697431363100646972743B +:108DA400795F726561645F756E697431363200642F +:108DB400697274795F726561645F756E6974313666 +:108DC400330064697274795F726561645F756E699A +:108DD400743136340064697274795F726561645FFA +:108DE400756E69743136350064697274795F7265C1 +:108DF40061645F756E6974313636006469727479C2 +:108E04005F726561645F756E6974313637006469D9 +:108E14007274795F726561645F756E697431363836 +:108E24000064697274795F726561645F756E6974F8 +:108E34003136390064697274795F726561645F7593 +:108E44006E69743137300064697274795F72656178 +:108E5400645F756E69743137310064697274795F67 +:108E6400726561645F756E6974313732006469726A +:108E740074795F726561645F756E6974313733004C +:108E840064697274795F726561645F756E69743167 +:108E940037340064697274795F726561645F756EFA +:108EA40069743137350064697274795F726561641D +:108EB4005F756E69743137360064697274795F72F4 +:108EC4006561645F756E6974313737006469727403 +:108ED400795F726561645F756E69743137380064F7 +:108EE400697274795F726561645F756E6974313734 +:108EF400390064697274795F726561645F756E6963 +:108F0400743138300064697274795F726561645FCA +:108F1400756E69743138310064697274795F726591 +:108F240061645F756E697431383200646972747992 +:108F34005F726561645F756E6974313833006469AA +:108F44007274795F726561645F756E697431383407 +:108F54000064697274795F726561645F756E6974C7 +:108F64003138350064697274795F726561645F7564 +:108F74006E69743138360064697274795F72656140 +:108F8400645F756E69743138370064697274795F2F +:108F9400726561645F756E69743138380064697232 +:108FA40074795F726561645F756E69743138390014 +:108FB40064697274795F726561645F756E69743136 +:108FC40039300064697274795F726561645F756ECB +:108FD40069743139310064697274795F72656164EE +:108FE4005F756E69743139320064697274795F72C5 +:108FF4006561645F756E69743139330064697274D4 +:10900400795F726561645F756E69743139340064C7 +:10901400697274795F726561645F756E6974313900 +:10902400350064697274795F726561645F756E6935 +:10903400743139360064697274795F726561645F92 +:10904400756E69743139370064697274795F726559 +:1090540061645F756E69743139380064697274795A +:109064005F726561645F756E697431393900646972 +:109074007274795F726561645F756E6974323030E1 +:109084000064697274795F726561645F756E697496 +:109094003230310064697274795F726561645F753E +:1090A4006E69743230320064697274795F7265611A +:1090B400645F756E69743230330064697274795F09 +:1090C400726561645F756E6974323034006469720C +:1090D40074795F726561645F756E697432303500EE +:1090E40064697274795F726561645F756E69743204 +:1090F40030360064697274795F726561645F756E9D +:1091040069743230370064697274795F72656164BE +:109114005F756E69743230380064697274795F7295 +:109124006561645F756E69743230390064697274A4 +:10913400795F726561645F756E69743231300064A1 +:10914400697274795F726561645F756E69743231D6 +:10915400310064697274795F726561645F756E6908 +:10916400743231320064697274795F726561645F6C +:10917400756E69743231330064697274795F726533 +:1091840061645F756E697432313400646972747934 +:109194005F726561645F756E69743231350064694C +:1091A4007274795F726561645F756E6974323136A9 +:1091B4000064697274795F726561645F756E697465 +:1091C4003231370064697274795F726561645F7506 +:1091D4006E69743231380064697274795F726561E2 +:1091E400645F756E69743231390064697274795FD1 +:1091F400726561645F756E697432323000646972DD +:1092040074795F726561645F756E697432323100BE +:1092140064697274795F726561645F756E697432D2 +:1092240032320064697274795F726561645F756E6D +:1092340069743232330064697274795F726561648F +:109244005F756E69743232340064697274795F7266 +:109254006561645F756E6974323235006469727475 +:10926400795F726561645F756E6974323236006469 +:10927400697274795F726561645F756E69743232A4 +:10928400370064697274795F726561645F756E69D1 +:10929400743232380064697274795F726561645F34 +:1092A400756E69743232390064697274795F7265FB +:1092B40061645F756E697432333000646972747905 +:1092C4005F726561645F756E69743233310064691D +:1092D4007274795F726561645F756E69743233327A +:1092E4000064697274795F726561645F756E697434 +:1092F4003233330064697274795F726561645F75D7 +:109304006E69743233340064697274795F726561B2 +:10931400645F756E69743233350064697274795FA1 +:10932400726561645F756E697432333600646972A4 +:1093340074795F726561645F756E69743233370086 +:1093440064697274795F726561645F756E697432A1 +:1093540033380064697274795F726561645F756E35 +:1093640069743233390064697274795F7265616457 +:109374005F756E69743234300064697274795F7237 +:109384006561645F756E6974323431006469727446 +:10939400795F726561645F756E697432343200643A +:1093A400697274795F726561645F756E6974323471 +:1093B400330064697274795F726561645F756E69A4 +:1093C400743234340064697274795F726561645F05 +:1093D400756E69743234350064697274795F7265CC +:1093E40061645F756E6974323436006469727479CD +:1093F4005F726561645F756E6974323437006469E5 +:109404007274795F726561645F756E697432343841 +:109414000064697274795F726561645F756E697402 +:109424003234390064697274795F726561645F759E +:109434006E69743235300064697274795F72656183 +:10944400645F756E69743235310064697274795F72 +:10945400726561645F756E69743235320064697275 +:1094640074795F726561645F756E69743235330057 +:1094740064697274795F726561645F756E69743270 +:1094840035340064697274795F726561645F756E06 +:109494006974323535006770696F40343030313368 +:1094A400303030006770696F4034303031323030E2 +:1094B40030006770696F4034303031313030300003 +:1094C4006770696F403430303130303030006D7047 +:1094D40073325F66706761696F40343030323830A0 +:1094E4003463006D7073325F66706761696F403416 +:1094F40030303238303038006D7073325F667067E8 +:1095040061696F4034303032383030300072657405 +:1095140061696E65646D656D0072657461696E651F +:10952400645F6D656D5F7A65706879725F72616D95 +:10953400007561727440343030303630303000752C +:1095440061727440343030303530303000756172BF +:10955400744034303030343030300025633A2048A1 +:10956400616C74696E672073797374656D0A005554 +:109574006E6B6E6F776E206572726F7200756E6BB4 +:109584006E6F776E0025633A203E3E3E205A45506A +:1095940048595220464154414C204552524F522082 +:1095A40025643A202573206F6E204350552025648E +:1095B4000A0025633A204661756C742064757269EB +:1095C4006E6720696E746572727570742068616E5E +:1095D400646C696E670A0A0025633A2043757272E7 +:1095E400656E74207468726561643A202570202861 +:1095F4002573290A004350552065786365707469A2 +:109604006F6E00556E68616E646C656420696E747B +:1096140065727275707400537461636B206F766544 +:1096240072666C6F77004B65726E656C206F6F703D +:1096340073004B65726E656C2070616E6963006DBA +:1096440061696E006F730025633A202570202872CB +:10965400656164792028792F6E293A2025632920B1 +:109664007072696F206368616E67656420746F202F +:1096740025642028776173202564290A0025633A2C +:1096840020257020746F6F6B206D757465782025AC +:10969400702C20636F756E743A2025642C206F72D1 +:1096A4006967207072696F3A2025640A0025633A5D +:1096B4002061646A757374696E67207072696F20C3 +:1096C4007570206F6E206D757465782025700A00A2 +:1096D40025633A206F6E206D75746578202570209F +:1096E400676F745F6D757465782076616C75653A23 +:1096F4002025640A0025633A20257020676F7420B2 +:109704006D757465782025702028792F6E293A208C +:1097140025630A0025633A2025702074696D656FFE +:109724007574206F6E206D757465782025700A003D +:1097340025633A2061646A757374696E6720707278 +:10974400696F20646F776E206F6E206D7574657815 +:109754002025700A0025633A206D757465782025EC +:1097640070206C6F636B5F636F756E743A20256451 +:109774000A0025633A206E6577206F776E65722044 +:109784006F66206D757465782025703A20257020E9 +:10979400287072696F3A202564290A0025633A20EB +:1097A400737461636B20257020666F722074687215 +:1097B4006561642025703A206F626A5F73697A6517 +:1097C4003D257A75206275665F73746172743D25F8 +:1097D4007020206275665F73697A6520257A75202A +:1097E400737461636B5F7074723D25700A00286E38 +:1097F400756C6C29001800B76C00001C00C76C0065 +:10980400002000D76C00001800DF6C00001C00EA88 +:109814006C00002000F86C00002400066D00002895 +:1098240000176D00002C002A6D000030003C6D0014 +:10983400003400506D00003800626D00003C00767A +:109844006D00004000896D000044009C6D000048DC +:1098540000AF6D00004C00C26D00005000D56D00DB +:10986400005400E86D00005800FB6D00005C000E21 +:109874006E00006000216E00006400346E00006819 +:1098840000486E00006C005C6E00007000706E009A +:10989400007400846E00007800986E00007C00ACB8 +:1098A4006E00008000C06E00008400D46E0000884A +:1098B40000E86E00008C00FC6E00009000106F0049 +:1098C400009400246F00009800386F00009C004C46 +:1098D4006F0000A000606F0000A400746F0000A877 +:1098E40000886F0000AC009C6F0000B000B06F00F7 +:1098F40000B400C46F0000B800D86F0000BC00ECD6 +:109904006F0000C00000700000C40014700000C8A4 +:109914000028700000CC003C700000D000507000A3 +:1099240000D40064700000D80078700000DC008C63 +:10993400700000E000A0700000E400B4700000E8D3 +:1099440000C8700000EC00DC700000F000F0700053 +:1099540000F40004710000F80018710000FC002CF1 +:1099640071000000014071000004015471000008FE +:1099740001687100000C017C7100001001907100FD +:10998400001401A47100001801B87100001C01CC7E +:109994007100002001E07100002401F4710000282E +:1099A40001087200002C011C7200003001307200AA +:1099B400003401447200003801587200003C016C0C +:1099C400720000400180720000440194720000485B +:1099D40001A87200004C01BC7200005001D072005A +:1099E400005401E47200005801F87200005C010C9C +:1099F4007300006001207300006401347300006888 +:109A040001487300006C015C730000700170730006 +:109A1400007401847300007801987300007C01AC29 +:109A24007300008001C07300008401D473000088B7 +:109A340001E87300008C01FC7300009001107400B5 +:109A4400009401247400009801387400009C014CB7 +:109A5400740000A00160740000A40174740000A8E4 +:109A64000188740000AC019C740000B001B0740063 +:109A740000B401C4740000B801D8740000BC01EC47 +:109A8400740000C00100750000C40114750000C812 +:109A94000128750000CC013C750000D0015175000F +:109AA40000D40166750000D8017B750000DC0190CC +:109AB400750000E001A5750000E401BA750000E836 +:109AC40001CF750000EC01E4750000F001F97500A8 +:109AD40000F4010E760000F80123760000FC013842 +:109AE40076000000024D7600000402627600000851 +:109AF40002777600000C028C7600001002A176003A +:109B0400001402B67600001802CB7600001C02E0B6 +:109B14007600002002F576000024020A770000286F +:109B2400021F7700002C02347700003002497700CE +:109B34000034025E7700003802737700003C02882C +:109B440077000040029D7700004402B2770000488D +:109B540002C77700004C02DC7700005002F1770066 +:109B64000054020678000058021B7800005C0230A2 +:109B740078000060024578000064025A78000068AA +:109B8400026F7800006C02847800007002997800FB +:109B9400007402AE7800007802C37800007C02D81A +:109BA4007800008002ED78000084020279000088C9 +:109BB40002177900008C022C790000900241790090 +:109BC4000094025679000098026B7900009C028090 +:109BD400790000A00295790000A402AA790000A8E7 +:109BE40002BF790000AC02D4790000B002E9790028 +:109BF40000B402FE790000B802137A0000BC022807 +:109C04007A0000C0023D7A0000C402527A0000C803 +:109C140002677A0000CC027C7A0000D002917A00BC +:109C240000D402A67A0000D802BB7A0000DC02D07D +:109C34007A0000E002E57A0000E402FA7A0000E823 +:109C4400020F7B0000EC02247B0000F002397B0051 +:109C540000F4024E7B0000F802637B0000FC0278F3 +:109C64007B000000038D7B00000403A27B0000083E +:109C740003B77B00000C03CC7B00001003E17B00E6 +:109C8400001403F67B000018030B7C00001C032067 +:109C94007C00002003357C000024034A7C0000285B +:109CA400035F7C00002C03747C00003003897C007B +:109CB4000034039E7C00003803B37C00003C03C8DE +:109CC4007C00004003DD7C00004403F27C0000487B +:109CD40003077D00004C031C7D00005003317D0010 +:109CE400005403467D000058035B7D00005C037054 +:109CF4007D00006003857D000064039A7D00006898 +:109D040003AF7D00006C03C47D00007003D97D00A7 +:109D1400007403EE7D00007803037E00007C0318CA +:109D24007E000080032D7E00008403427E000088B4 +:109D340003577E00008C036C7E00009003817E003C +:109D4400009403967E00009803AB7E00009C03C041 +:109D54007E0000A003D57E0000A403EA7E0000A8D4 +:109D640003FF7E0000AC03147F0000B003297F00D2 +:109D740000B4033E7F0000B803537F0000BC0368B7 +:109D84007F0000C0037D7F0000C403927F0000C8F1 +:109D940003A77F0000CC03BC7F0000D003D17F0069 +:109DA40000D403E67F0000D803FB7F0000DC03102F +:109DB400800000E00325800000E4033A800000E80E +:109DC400034F800000EC0364800000F003798000FE +:109DD40000F4038E800000F803A3800000FC03B8A5 +:109DE4008000000004CD8000000404E2800000082C +:109DF40004F78000000C040C810000100421810091 +:109E04000014043681000018044B8100001C046017 +:109E140081000020047581000024048A8100002848 +:109E2400049F8100002C04B48100003004C9810027 +:109E3400003404DE8100003804F38100003C04088F +:109E440082000040041982000044042A8200004871 +:109E5400043B8200004C044C82000050045D8200EC +:109E64000054046E82000058047F8200005C049059 +:109E74008200006004A18200006404B282000068D1 +:109E840004C48200006C04D68200007004E88200DE +:109E9400007404FA82000078040C8300007C041E21 +:109EA400830000800430830000840442830000881F +:109EB40004548300008C04668300009004788300BB +:109EC4000094048A83000098049C8300009C04AEE0 +:109ED400830000A004C0830000A404D2830000A86F +:109EE40004E4830000AC04F6830000B0040884009A +:109EF40000B4041A840000B8042C840000BC043E9E +:109F0400840000C00450840000C40462840000C8BB +:109F14000474840000CC0486840000D00498840077 +:109F240000D404AA840000D804BC840000DC04CE5D +:109F3400840000E004E0840000E404F2840000E80B +:109F44000404850000EC0416850000F00428850054 +:109F540000F4043A850000F8044C850000FC045E1B +:109F64008500000005708500000405828500000856 +:109F740005948500000C05A68500001005B8850031 +:109F8400001405CA8500001805DC8500001C05EED8 +:109F940085000020050086000024051286000028A4 +:109FA40005248600002C053686000030054886000E +:109FB4000034055A86000038056C8600003C057E96 +:109FC4008600004005908600004405A286000048F3 +:109FD40005B48600004C05C68600005005D88600EE +:109FE400005405EA8600005805FC8600005C050E56 +:109FF4008700006005208700006405328700006840 +:10A0040005448700006C05568700007005688700CA +:10A014000074057A87000078058C8700007C059E13 +:10A024008700008005B08700008405C2870000888F +:10A0340005D48700008C05E68700009005F88700AA +:10A044000094050A88000098051C8800009C052ED1 +:10A05400880000A00540880000A40552880000A8DC +:10A064000564880000AC0576880000B00588880087 +:10A0740000B4059A880000B805AC880000BC05BE91 +:10A08400880000C005D0880000C405E2880000C82C +:10A0940005F4880000CC0506890000D00519890064 +:10A0A40000D4052C890000D8053F890000DC055246 +:10A0B400890000E00565890000E40578890000E86E +:10A0C400058B890000EC059E890000F005B189002C +:10A0D40000F405C4890000F805D7890000FC05EAEE +:10A0E4008900000006FD8900000406108A000008AB +:10A0F40006238A00000C06368A00001006498A00EE +:10A104000014065C8A000018066F8A00001C068290 +:10A114008A00002006958A00002406A88A000028E8 +:10A1240006BB8A00002C06CE8A00003006E18A00B5 +:10A13400003406F48A00003806078B00003C061A37 +:10A144008B000040062D8B00004406408B00004825 +:10A1540006538B00004C06668B00005006798B007A +:10A164000054068C8B000058069F8B00005C06B2DE +:10A174008B00006006C58B00006406D88B00006865 +:10A1840006EB8B00006C06FE8B00007006118C0041 +:10A19400007406248C00007806378C00007C064A84 +:10A1A4008C000080065D8C00008406708C000088A2 +:10A1B40006838C00008C06968C00009006A98C0007 +:10A1C400009406BC8C00009806CF8C00009C06E22C +:10A1D4008C0000A006F58C0000A406088D0000A8E1 +:10A1E400061B8D0000AC062E8D0000B006418D00CC +:10A1F40000B406548D0000B806678D0000BC067AD2 +:10A204008D0000C0068D8D0000C406A08D0000C81E +:10A2140006B38D0000CC06C68D0000D006D98D0093 +:10A2240000D406EC8D0000D806FF8D0000DC061279 +:10A234008E0000E006258E0000E406388E0000E85B +:10A24400064B8E0000EC065E8E0000F006718E0058 +:10A2540000F406848E0000F806978E0000FC06AA1F +:10A264008E00000007BD8E00000407D08E00000899 +:10A2740007E38E00000C07F68E00001007098F001C +:10A284000014071C8F000018072F8F00001C0742C2 +:10A294008F00002007558F00002407688F000028D6 +:10A2A400077B8F00002C078E8F00003007A18F00E2 +:10A2B400003407B48F00003807C78F00003C07DA6A +:10A2C4008F00004007ED8F00004407009000004815 +:10A2D40007139000004C07269000005007399000A7 +:10A2E4000054074C90000058075F9000005C077210 +:10A2F4009000006007859000006407989000006853 +:10A3040007AB9000006C07BE9000007007D190006E +:10A31400007407E49000007807F79000007C070AB7 +:10A3240091000080071D910000840730910000888F +:10A3340007439100008C0756910000900769910033 +:10A344000094077C91000098078F9100009C07A25D +:10A35400910000A007B5910000A407C8910000A8CF +:10A3640007DB910000AC07EE910000B007019200FA +:10A3740000B40714920000B80727920000BC073A03 +:10A38400920000C0074D920000C40760920000C80C +:10A394000773920000CC0786920000D007999200C0 +:10A3A40000D407AC920000D807BF920000DC07D2AB +:10A3B400920000E007E5920000E407F8920000E84C +:10A3C400070B930000EC071E930000F00731930085 +:10A3D40000F40744930000F80757930000FC076A51 +:10A3E40093000000087D9300000408909300000887 +:10A3F40008A39300000C08B69300001008C993004A +:10A40400001408DC9300001808EF9300001C0802F5 +:10A4140094000020081594000024082894000028C3 +:10A42400083B9400002C084E94000030086194000E +:10A434000034087494000038088794000001020274 +:04A444000303030308 +:10A44800613D00006059000001000000FFFFFFFFB0 +:10A45800851A000000000000AB4200000000000068 +:10A4680000000000000004200000000000C20100FD +:10A478000000000000000000010000000060004033 +:10A48800010100000060004001020000006000407F +:10A4980000C20100000000000000000001000000F0 +:10A4A800005000400101000000500040010200007F +:10A4B8000050004000C20100000000000000000041 +:10A4C8000100000000400040010100000040004081 +:10A4D800010200000040004002000000FFFFFFFFF3 +:0AA4E800A0000020A00000200400E6 +:10A4F200000000000000000000000000000000005A +:0EA5020000000000000000000000000000004B +:10A51000C8000020C800002000000000000000006B +:04A520000E00000029 +:04A5240015E015E049 +:0400000300001EB12A +:00000001FF diff --git a/tests/fixtures/smp-server/zephyr_f33aa2bc4a43_smp_server_fa39f8c2_mps2_an385_serial_recovery_raw_cobs.signed.bin b/tests/fixtures/smp-server/zephyr_f33aa2bc4a43_smp_server_fa39f8c2_mps2_an385_serial_recovery_raw_cobs.signed.bin new file mode 100644 index 0000000..77bc229 Binary files /dev/null and b/tests/fixtures/smp-server/zephyr_f33aa2bc4a43_smp_server_fa39f8c2_mps2_an385_serial_recovery_raw_cobs.signed.bin differ diff --git a/tests/integration/servers.py b/tests/integration/servers.py index 6b16d63..d264a3f 100644 --- a/tests/integration/servers.py +++ b/tests/integration/servers.py @@ -40,6 +40,7 @@ from smpclient.transport import SMPTransportDisconnected from smpclient.transport.serial import ( FragmentationStrategy, + SerialFraming, SMPSerialRawTransport, SMPSerialTransport, ) @@ -304,8 +305,8 @@ class QemuSocketSerialRawTransport(SMPSerialRawTransport): `SMPSerialRawTransport` unchanged. """ - def __init__(self, url: str, mtu: int = 384) -> None: # noqa: DOC301 - super().__init__(mtu=mtu) + def __init__(self, url: str, mtu: int = 384, framing: SerialFraming | None = None) -> None: # noqa: DOC301 + super().__init__(mtu=mtu, framing=framing) self._url: Final = url @override diff --git a/tests/integration/test_image_management.py b/tests/integration/test_image_management.py index f895d86..f80914d 100644 --- a/tests/integration/test_image_management.py +++ b/tests/integration/test_image_management.py @@ -11,6 +11,7 @@ from smp import packet as smppacket from smpclient.generics import success +from smpclient.mcuboot import IMAGE_TLV, ImageInfo from smpclient.requests.image_management import ImageStatesRead from smpclient.transport.serial import SMPSerialRawTransport, SMPSerialTransport from tests.integration.conftest import ( @@ -70,7 +71,12 @@ async def test_dfu_upload(fixture: ServerFixture) -> None: assert offsets[-1] == len(image) # ran to completion (incl. SHA match) states = await cs.client.request(ImageStatesRead()) assert success(states) - assert any(not im.confirmed for im in states.images) # landed in a second slot + uploaded_hash = ( + ImageInfo.load_file(str(signed_image(fixture))).get_tlv(IMAGE_TLV.SHA256).value + ) + assert any(im.hash == uploaded_hash for im in states.images), ( + "the uploaded image's SHA256 must land in a slot" + ) else: assert ( offsets[-1] >= cap diff --git a/tests/integration/test_serial_recovery.py b/tests/integration/test_serial_recovery.py index 87f80d0..292dd4f 100644 --- a/tests/integration/test_serial_recovery.py +++ b/tests/integration/test_serial_recovery.py @@ -1,62 +1,174 @@ -"""Reset-into-bootloader (MCUboot serial recovery) integration test. +"""Reset-into-bootloader (MCUboot serial recovery) integration test, over every framing. A fully-featured app reboots into MCUboot serial recovery via `os reset -boot_mode=BOOTLOADER` (smp 4.1.0, PR #113), and the bootloader's SMP server accepts a -fragmented image upload -- the path a client uses to recover a device that can't be -updated from the app. - -Recovery advertises MCUmgr params (`CONFIG_BOOT_MGMT_MCUMGR_PARAMS`, -mcu-tools/mcuboot#2746), so the client negotiates the decoded reassembly buffer (`Auto`) -rather than being told it out of band. An explicit `BufferSize` that caps below the -advertised buffer covers the override path a client uses when it opts out of negotiation. +boot_mode=BOOTLOADER` (smp 4.1.0), and the bootloader's SMP server reassembles a +fragmented image upload -- the path a client uses to recover a device it can't update +from the app. Recovery advertises MCUmgr params (mcu-tools/mcuboot#2746), so the client +negotiates the cap rather than being told it out of band. + +One parameterized test covers every recovery transport permutation as a sum type: + +- `Console` -- SMP-over-console (base64 + length + CRC16 + line framing), negotiated via + `Auto` and, as the opt-out path, an explicit `BufferSize` capped below the buffer. The + cap is `buf_size - 4` and the message expands ~1.37x on the wire. +- `Raw` -- the unframed `[header][payload]` (`BOOT_SERIAL_RAW_PROTOCOL`, mcu-tools/mcuboot#2755). +- `RawCobs` -- raw + COBS+CRC16 framing (`BOOT_SERIAL_RAW_PROTOCOL_COBS`, intercreate/mcuboot#5). + +Both raw framings carry the whole SMP message into the server's decode buffer, so the cap +is the advertised `buf_size` itself. A full recovery upload stalls intermittently under +emulation (flash-erase latency), so each leg proves fragmented *progress* and then reads +image state to confirm the recovery img group is still coherent; byte-level upload +verification lives in `test_image_management.py`. """ from __future__ import annotations +from typing import NamedTuple + import pytest +from _pytest.mark.structures import ParameterSet from smp import packet as smppacket from typing_extensions import assert_never from smpclient.generics import success +from smpclient.requests.image_management import ImageStatesRead from smpclient.requests.os_management import MCUMgrParametersRead -from smpclient.transport.serial import Auto, BufferSize +from smpclient.transport.serial import Auto, BufferSize, Cobs, SMPSerialTransport from smpclient.transport.serial.encoded import _FRAME_OVERHEAD from tests.integration.conftest import ( RECOVERY_UPLOAD_TIMEOUT_S, assert_chunks_maximized, connected, - fixture_params, reboot_into_recovery, signed_image, upload_image, ) -from tests.integration.servers import QemuSocketSerialTransport, ServerFixture, SocketSerialEndpoint +from tests.integration.servers import ( + FIXTURES, + QemuSocketSerialRawTransport, + QemuSocketSerialTransport, + ServerFixture, + SocketSerialEndpoint, +) pytestmark = [pytest.mark.integration, pytest.mark.asyncio] -_RecoveryBuffer = Auto | BufferSize -"""How the client sizes recovery uploads: negotiate from params, or cap explicitly.""" +_SocketTransport = QemuSocketSerialTransport | QemuSocketSerialRawTransport + + +class Console(NamedTuple): + """SMP-over-console framing, sized by a fragmentation strategy.""" + + strategy: Auto | BufferSize + + +class Raw(NamedTuple): + """Unframed raw `[header][payload]`.""" -_BUFFERS = [ - pytest.param(Auto(), id="negotiated"), - pytest.param(BufferSize(buf_size=256), id="buffersize-256"), + +class RawCobs(NamedTuple): + """Raw framing wrapped in COBS+CRC16.""" + + +_Recovery = Console | Raw | RawCobs + +_VARIANTS: list[_Recovery] = [ + Console(Auto()), + Console(BufferSize(buf_size=256)), + Raw(), + RawCobs(), ] -# Only the canonical recovery image: the `serial_recovery_buf` matrix varies the app's -# netbuf but drops into the same MCUboot recovery server, so its buffers are exercised in -# app mode (echo/fs/img buffer-fill tests), not here. -@pytest.mark.parametrize("buffer", _BUFFERS) -@pytest.mark.parametrize("fixture", fixture_params(lambda f: f.config == "serial_recovery")) -async def test_upload_to_mcuboot_recovery_smp_server( - fixture: ServerFixture, buffer: _RecoveryBuffer -) -> None: +def _fixture(variant: _Recovery) -> tuple[str, str]: + """The fixture `config` and a test-id `label` for `variant`.""" + match variant: + case Console(strategy=strategy): + match strategy: + case Auto(): + return "serial_recovery", "console-negotiated" + case BufferSize(): + return "serial_recovery", "console-buffersize-256" + case _ as unreachable: + assert_never(unreachable) + case Raw(): + return "serial_recovery_raw", "raw" + case RawCobs(): + return "serial_recovery_raw_cobs", "raw-cobs" + case _ as unreachable: + assert_never(unreachable) + + +def _build_transport(variant: _Recovery, url: str) -> _SocketTransport: + match variant: + case Console(strategy=strategy): + return QemuSocketSerialTransport(url, fragmentation_strategy=strategy) + case Raw(): + return QemuSocketSerialRawTransport(url) + case RawCobs(): + return QemuSocketSerialRawTransport(url, framing=Cobs()) + case _ as unreachable: + assert_never(unreachable) + + +def _assert_negotiated_cap(variant: _Recovery, transport: _SocketTransport, advertised: int) -> int: + """Assert the negotiated message cap and the on-wire size for `variant`; return the cap.""" + match variant: + case Console(strategy=strategy): + assert isinstance(transport, SMPSerialTransport) + match strategy: + case Auto(): + cap = advertised - _FRAME_OVERHEAD + case BufferSize(buf_size=buf_size): + cap = buf_size - _FRAME_OVERHEAD + case _ as unreachable: + assert_never(unreachable) + assert transport.max_unencoded_size == cap + wire = sum(len(p) for p in smppacket.encode(bytes(cap), transport._line_length)) + assert cap < wire < 2 * cap # base64 + line framing expands the message ~1.37x + return cap + case Raw(): + assert transport.max_unencoded_size == advertised # the message is the wire + return advertised + case RawCobs(): + assert transport.max_unencoded_size == advertised + (frame,) = Cobs().encode(bytes(advertised)) + assert ( + advertised < len(frame) <= advertised + advertised // 254 + 4 + ) # COBS + CRC + 0x00 + return advertised + case _ as unreachable: + assert_never(unreachable) + + +def _recovery_params() -> list[ParameterSet]: + """One skip-aware param per permutation, pairing each variant with its fixture.""" + by_config = {fixture.config: fixture for fixture in FIXTURES} + params: list[ParameterSet] = [] + for variant in _VARIANTS: + config, label = _fixture(variant) + fixture = by_config.get(config) + if fixture is None: + params.append( + pytest.param( + variant, None, id=label, marks=pytest.mark.skip(reason=f"{config} not vendored") + ) + ) + continue + reason = fixture.unavailable_reason() + marks = [pytest.mark.skip(reason=reason)] if reason else [] + params.append(pytest.param(variant, fixture, id=f"{fixture.id}-{label}", marks=marks)) + return params + + +@pytest.mark.parametrize("variant, fixture", _recovery_params()) +async def test_upload_to_mcuboot_recovery(variant: _Recovery, fixture: ServerFixture) -> None: advertised = fixture.recovery_buf_size - assert advertised is not None, "serial_recovery fixture must advertise recovery params" + assert advertised is not None, "recovery fixture must advertise MCUmgr params" async with connected(fixture) as cs: assert isinstance(cs.endpoint, SocketSerialEndpoint) - transport = QemuSocketSerialTransport(cs.endpoint.url, fragmentation_strategy=buffer) + transport = _build_transport(variant, cs.endpoint.url) async with reboot_into_recovery(cs.client, transport, cs.endpoint.url) as bootloader: await bootloader._initialize() # negotiate buf_size (a no-op for explicit BufferSize) @@ -65,26 +177,7 @@ async def test_upload_to_mcuboot_recovery_smp_server( assert success(params) assert (params.buf_count, params.buf_size) == (1, advertised) - match buffer: - case Auto(): - target = advertised - case BufferSize(buf_size=override): - target = override - case _ as unreachable: - assert_never(unreachable) - - # The decoded payload fills the buffer minus the 2-byte frame length + 2-byte - # CRC16 that share it; base64 + 128-byte line framing then expands it ~1.37x on - # the wire (the negotiated 1024 B buffer -> ~1400 B per message), which the - # server decodes incrementally back into the buffer. - assert transport.max_unencoded_size == target - _FRAME_OVERHEAD - wire = sum( - len(packet) - for packet in smppacket.encode( - bytes(transport.max_unencoded_size), transport._line_length - ) - ) - assert target < wire < 2 * target + cap = _assert_negotiated_cap(variant, transport, advertised) offsets = await upload_image( bootloader, @@ -93,4 +186,8 @@ async def test_upload_to_mcuboot_recovery_smp_server( subsequent_timeout_s=RECOVERY_UPLOAD_TIMEOUT_S, ) assert offsets[-1] >= 4096 # the bootloader reassembles the fragmented upload - assert_chunks_maximized(offsets, transport.max_unencoded_size) + assert_chunks_maximized(offsets, cap) + + states = await bootloader.request(ImageStatesRead(), timeout_s=5.0) + assert success(states) + assert len(states.images) >= 1 # the recovery img group is coherent after the upload diff --git a/tests/integration/test_serial_recovery_raw.py b/tests/integration/test_serial_recovery_raw.py deleted file mode 100644 index 486a392..0000000 --- a/tests/integration/test_serial_recovery_raw.py +++ /dev/null @@ -1,62 +0,0 @@ -"""Reset-into-bootloader MCUboot *raw* serial-recovery integration test. - -The raw-framing analog of `test_serial_recovery.py`: the app reboots into MCUboot serial -recovery and the bootloader's SMP server -- built with the raw (non-console) protocol -(`BOOT_SERIAL_RAW_PROTOCOL`, mcu-tools/mcuboot#2755) -- reassembles a fragmented upload -sent over `SMPSerialRawTransport`. - -Recovery advertises MCUmgr params (mcu-tools/mcuboot#2746), so the client negotiates the -cap. Raw framing carries the whole `[header][payload]` with no base64/length/CRC, so the -negotiated cap is the advertised `buf_size` itself (no `- 4`): ~1024 B per message on the -wire, versus the encoded transport's ~1400 B. -""" - -from __future__ import annotations - -import pytest - -from smpclient.generics import success -from smpclient.requests.os_management import MCUMgrParametersRead -from tests.integration.conftest import ( - RECOVERY_UPLOAD_TIMEOUT_S, - assert_chunks_maximized, - connected, - fixture_params, - reboot_into_recovery, - signed_image, - upload_image, -) -from tests.integration.servers import ( - QemuSocketSerialRawTransport, - ServerFixture, - SocketSerialEndpoint, -) - -pytestmark = [pytest.mark.integration, pytest.mark.asyncio] - - -@pytest.mark.parametrize("fixture", fixture_params(lambda f: f.config == "serial_recovery_raw")) -async def test_upload_to_mcuboot_raw_recovery_smp_server(fixture: ServerFixture) -> None: - advertised = fixture.recovery_buf_size - assert advertised is not None, "serial_recovery_raw fixture must advertise recovery params" - - async with connected(fixture) as cs: - assert isinstance(cs.endpoint, SocketSerialEndpoint) - transport = QemuSocketSerialRawTransport(cs.endpoint.url) - - async with reboot_into_recovery(cs.client, transport, cs.endpoint.url) as bootloader: - params = await bootloader.request(MCUMgrParametersRead(), timeout_s=2.0) - assert success(params) - assert (params.buf_count, params.buf_size) == (1, advertised) - - await bootloader._initialize() # adopt the advertised buf_size as the message cap - assert transport.max_unencoded_size == advertised - - offsets = await upload_image( - bootloader, - signed_image(fixture).read_bytes(), - max_bytes=4096, - subsequent_timeout_s=RECOVERY_UPLOAD_TIMEOUT_S, - ) - assert offsets[-1] >= 4096 # the bootloader reassembles the fragmented upload - assert_chunks_maximized(offsets, transport.max_unencoded_size) diff --git a/tests/test_cobs.py b/tests/test_cobs.py new file mode 100644 index 0000000..5ddeb1d --- /dev/null +++ b/tests/test_cobs.py @@ -0,0 +1,214 @@ +"""Tests for the COBS+CRC16 serial framing (`smpclient.transport.serial.framing.cobs`).""" + +from __future__ import annotations + +import doctest +import random + +import pytest +from smp.packet import CRC16_STRUCT, crc16_func + +from smpclient.transport.serial.framing import cobs +from smpclient.transport.serial.framing.cobs import ( + _MAX_BUFFER_BYTES, + Cobs, + cobs_decode, + cobs_encode, +) + + +def test_doctests() -> None: + """Run the module's doctests under pytest (CLAUDE.md: specific docstrings must be tested).""" + results = doctest.testmod(cobs) + assert results.attempted > 0 + assert results.failed == 0 + + +def _frame(message: bytes) -> bytes: + """The full COBS wire frame (delimiter included) for `message`.""" + (wire,) = Cobs().encode(message) + return wire + + +def _corrupt(message: bytes) -> bytes: + """A full COBS frame that decodes cleanly but whose CRC16 is wrong.""" + return cobs_encode(message + CRC16_STRUCT.pack(crc16_func(message) ^ 0xFFFF)) + b"\x00" + + +_M1 = b"\x0a\x00\x00\x01msg-one" +_M2 = b"second\x00message" +_M3 = b"\xff\xff third\x00" + + +@pytest.mark.parametrize( + "data", + [ + b"", + bytes([0]), + bytes(10), + bytes([0xFF]) * 253, # the COBS off-by-one lives at a 254-byte non-zero run + bytes([0xFF]) * 254, + bytes([0xFF]) * 255, + bytes([0xFF]) * 508, # two maximal runs back to back + bytes(range(256)), + b"\x00leading\x00and\x00trailing\x00", + ], +) +def test_cobs_roundtrip(data: bytes) -> None: + encoded = cobs_encode(data) + assert 0 not in encoded, "COBS output must contain no 0x00" + assert cobs_decode(encoded) == data + + +def test_cobs_roundtrip_fuzz() -> None: + """Deterministic fuzz over the payload shapes that stress COBS (mirrors mcuboot's ztest).""" + rng = random.Random(0x1234567) + for _ in range(2000): + n = rng.randrange(600) + mode = rng.randrange(4) + if mode == 0: + data = bytes(rng.randrange(256) for _ in range(n)) + elif mode == 1: + data = bytes(n) + elif mode == 2: + data = bytes([0xFF]) * n + else: + data = bytes(rng.randrange(256) if rng.randrange(4) else 0 for _ in range(n)) + encoded = cobs_encode(data) + assert 0 not in encoded + assert cobs_decode(encoded) == data + + +def test_cobs_decode_zero_code_raises() -> None: + with pytest.raises(ValueError): + cobs_decode(b"\x00") + + +def test_cobs_decode_truncated_raises() -> None: + with pytest.raises(ValueError): + cobs_decode(b"\x05\x11") # code promises 4 more bytes, only 1 present + + +def test_cobs_framing_one_terminated_frame() -> None: + frames = list(Cobs().encode(b"\x00message\xff" * 8)) + assert len(frames) == 1 + assert frames[0][-1] == 0, "frame is 0x00-terminated" + assert 0 not in frames[0][:-1], "only the trailing delimiter is 0x00" + + +def test_cobs_framing_roundtrip() -> None: + decoder = Cobs() + decoder.feed(_frame(bytes(range(256)))) + assert decoder.take() == bytes(range(256)) + + +def test_cobs_framing_split_across_feeds() -> None: + decoder = Cobs() + wire = _frame(_M1) + decoder.feed(wire[:4]) + assert decoder.take() is None # no delimiter yet + decoder.feed(wire[4:]) + assert decoder.take() == _M1 + + +def test_cobs_framing_byte_at_a_time() -> None: + decoder = Cobs() + wire = _frame(_M1) + results = [] + for b in wire: + decoder.feed(bytes([b])) + results.append(decoder.take()) + assert results[-1] == _M1 + assert all(r is None for r in results[:-1]) + + +def test_cobs_framing_multiple_frames_drained_one_per_take() -> None: + decoder = Cobs() + decoder.feed(_frame(_M1) + _frame(_M2) + _frame(_M3)) # three frames in one feed + assert decoder.take() == _M1 + assert decoder.take() == _M2 + assert decoder.take() == _M3 + assert decoder.take() is None + + +def test_cobs_framing_leftover_preserved_across_feeds() -> None: + decoder = Cobs() + w1, w2 = _frame(_M1), _frame(_M2) + decoder.feed(w1 + w2[: len(w2) // 2]) # feed ends partway into frame 2 + assert decoder.take() == _M1 + assert decoder.take() is None # frame 2 incomplete; its prefix is retained + decoder.feed(w2[len(w2) // 2 :]) + assert decoder.take() == _M2 + + +def test_cobs_framing_resyncs_past_bad_crc() -> None: + decoder = Cobs() + decoder.feed(_corrupt(_M1) + _frame(_M2)) + assert decoder.take() == _M2 + + +def test_cobs_framing_resyncs_past_leading_garbage() -> None: + decoder = Cobs() + decoder.feed(b"\x11\x22\x33\x44\x00" + _frame(_M1)) # truncated-frame tail + delimiter + assert decoder.take() == _M1 + + +def test_cobs_framing_skips_empty_frames() -> None: + decoder = Cobs() + decoder.feed(b"\x00\x00\x00" + _frame(_M1)) + assert decoder.take() == _M1 + + +def test_cobs_framing_lone_corrupt_frame_yields_none() -> None: + decoder = Cobs() + decoder.feed(_corrupt(_M1)) + assert decoder.take() is None # no false message; the caller times out and retransmits + + +def test_cobs_framing_drops_empty_message_frame() -> None: + decoder = Cobs() + (empty_frame,) = Cobs().encode(b"") # a structurally valid frame carrying a 0-length message + decoder.feed(empty_frame) + assert ( + decoder.take() is None + ) # not a real message (CRC of b"" is 0x0000); dropped, not surfaced + + +def test_cobs_framing_caps_delimiterless_buffer_and_resyncs() -> None: + decoder = Cobs() + decoder.feed(b"\x11" * (_MAX_BUFFER_BYTES + 1)) # a stream with no 0x00 delimiter: noise + assert decoder.take() is None # dropped at the ceiling rather than buffered without bound + decoder.feed(_frame(_M1)) + assert decoder.take() == _M1 # and a real frame after the noise still decodes + + +def test_cobs_instances_have_independent_buffers() -> None: + a, b = Cobs(), Cobs() # default_factory gives each its own buffer (no shared-default trap) + a.feed(_frame(_M1)) + assert b.take() is None + assert a.take() == _M1 + + +def test_cobs_reset_clears_buffer() -> None: + decoder = Cobs() + decoder.feed(_frame(_M1)[:4]) # a partial frame from a prior (aborted) connection + decoder.reset() + decoder.feed(_frame(_M2)) + assert decoder.take() == _M2 # the stale partial was discarded, not prepended + + +def test_cobs_framing_stream_fuzz() -> None: + """Many frames as a randomly-chunked stream: every message round-trips, in order.""" + rng = random.Random(0xC0B5) + messages = [bytes(rng.randrange(256) for _ in range(rng.randrange(8, 300))) for _ in range(50)] + stream = b"".join(_frame(m) for m in messages) + decoder = Cobs() + received: list[bytes] = [] + i = 0 + while i < len(stream): + step = rng.randrange(1, 64) + decoder.feed(stream[i : i + step]) + i += step + while (out := decoder.take()) is not None: # drain every frame the chunk completed + received.append(out) + assert received == messages diff --git a/tests/test_smp_serial_raw_transport.py b/tests/test_smp_serial_raw_transport.py index 53ef77e..83dbcf5 100644 --- a/tests/test_smp_serial_raw_transport.py +++ b/tests/test_smp_serial_raw_transport.py @@ -10,11 +10,13 @@ import pytest from serial import SerialException from smp import header as smphdr +from smp.packet import CRC16_STRUCT, crc16_func from smpclient.exceptions import SMPClientException from smpclient.requests.os_management import EchoWrite from smpclient.transport import SMPTransportDisconnected -from smpclient.transport.serial import SMPSerialRawTransport +from smpclient.transport.serial import Cobs, SMPSerialRawTransport +from smpclient.transport.serial.framing.cobs import cobs_encode @pytest.fixture(autouse=True) @@ -252,3 +254,110 @@ async def test_send_and_receive() -> None: t.send.assert_awaited_once_with(b"some data") t.receive.assert_awaited_once_with() + + +@pytest.mark.asyncio +async def test_send_with_cobs_framing_encodes() -> None: + t = SMPSerialRawTransport(framing=Cobs()) + t._conn.write = MagicMock() # type: ignore + p = PropertyMock(return_value=0) + type(t._conn).out_waiting = p # type: ignore + + msg = EchoWrite(d="Hello pytest!").BYTES + await t.send(msg) + + expected = cobs_encode(msg + CRC16_STRUCT.pack(crc16_func(msg))) + b"\x00" + t._conn.write.assert_called_once_with(expected) + + +@pytest.mark.asyncio +async def test_receive_with_cobs_framing_decodes() -> None: + t = SMPSerialRawTransport(framing=Cobs()) + await t.connect("/dev/ttyUSB0", timeout_s=1.0) + + m = EchoWrite._Response.get_default()(sequence=0, r="Hello pytest!") # type: ignore + (wire,) = Cobs().encode(m.BYTES) + t._conn.read_all = MagicMock(side_effect=[wire]) # type: ignore + + assert await t.receive() == m.BYTES + + await t.disconnect() + + +@pytest.mark.asyncio +async def test_receive_with_cobs_framing_fragmented() -> None: + t = SMPSerialRawTransport(framing=Cobs()) + await t.connect("/dev/ttyUSB0", timeout_s=1.0) + + m = EchoWrite._Response.get_default()(sequence=0, r="fragment me across reads") # type: ignore + (wire,) = Cobs().encode(m.BYTES) + t._conn.read_all = MagicMock(side_effect=[wire[:5], b"", wire[5:]]) # type: ignore + + assert await t.receive() == m.BYTES + + await t.disconnect() + + +@pytest.mark.asyncio +async def test_receive_two_cobs_frames_in_one_read() -> None: + """Two frames in one read: the second is drained from the persisted decoder buffer. + + The next receive returns it without consulting read_all again. + """ + t = SMPSerialRawTransport(framing=Cobs()) + await t.connect("/dev/ttyUSB0", timeout_s=1.0) + + m1 = EchoWrite._Response.get_default()(sequence=0, r="first") # type: ignore + m2 = EchoWrite._Response.get_default()(sequence=1, r="second") # type: ignore + (w1,) = Cobs().encode(m1.BYTES) + (w2,) = Cobs().encode(m2.BYTES) + t._conn.read_all = MagicMock(side_effect=[w1 + w2]) # type: ignore + + assert await t.receive() == m1.BYTES + assert await t.receive() == m2.BYTES # from leftover; read_all not consulted again + assert t._conn.read_all.call_count == 1 + + await t.disconnect() + + +@pytest.mark.asyncio +async def test_receive_cobs_framing_resyncs_past_corrupt_frame() -> None: + """A corrupt frame ahead of a good one is dropped; receive resyncs to the good frame. + + The two frames carry *different* payloads, so a decoder that wrongly accepted the + corrupt frame would surface `dropped`, not `recovered`. + """ + t = SMPSerialRawTransport(framing=Cobs()) + await t.connect("/dev/ttyUSB0", timeout_s=1.0) + + dropped = EchoWrite._Response.get_default()(sequence=0, r="dropped") # type: ignore + recovered = EchoWrite._Response.get_default()(sequence=1, r="recovered") # type: ignore + corrupt = ( + cobs_encode(dropped.BYTES + CRC16_STRUCT.pack(crc16_func(dropped.BYTES) ^ 0xFFFF)) + b"\x00" + ) + (good,) = Cobs().encode(recovered.BYTES) + t._conn.read_all = MagicMock(side_effect=[corrupt + good]) # type: ignore + + assert await t.receive() == recovered.BYTES + + await t.disconnect() + + +@pytest.mark.asyncio +async def test_receive_framed_yields_so_an_outer_timeout_can_fire() -> None: + """A non-stop stream that never forms a valid frame must not wedge the loop. + + `_read_all` is synchronous, so the loop must yield each iteration; otherwise an outer + `asyncio.timeout` could never fire on a wrong-baud / wrong-protocol / noisy peer. + """ + t = SMPSerialRawTransport(framing=Cobs()) + await t.connect("/dev/ttyUSB0", timeout_s=1.0) + + m = EchoWrite._Response.get_default()(sequence=0, r="never valid") # type: ignore + corrupt = cobs_encode(m.BYTES + CRC16_STRUCT.pack(crc16_func(m.BYTES) ^ 0xFFFF)) + b"\x00" + t._conn.read_all = MagicMock(return_value=corrupt) # type: ignore # endless, never valid + + with pytest.raises(asyncio.TimeoutError): + await asyncio.wait_for(t.receive(), timeout=0.2) + + await t.disconnect()