diff --git a/surfactant/cmd/tui.py b/surfactant/cmd/tui.py index 027c4f382..dc44cc862 100644 --- a/surfactant/cmd/tui.py +++ b/surfactant/cmd/tui.py @@ -482,11 +482,21 @@ def __init__(self, plugin_name: str, info: surfactant.utils.get_plugin_settings. self.input_field = textual.widgets.Checkbox() default_value = self.info.default if default_value is None: - default_value = True + default_value = False else: # Have to convert from string to Boolean default_value = default_value.lower() == "true" - self.value = self.__config_manager.get(self.plugin_name, self.info.name, default_value) + self.value = str( + self.__config_manager.get(self.plugin_name, self.info.name, default_value) + ) + elif self.info.type_ == "int": + self.input_field = textual.widgets.Input(type="integer") + default_value = self.info.default + if default_value is None: + default_value = 0 + self.value = str( + self.__config_manager.get(self.plugin_name, self.info.name, int(default_value)) + ) else: raise TypeError(f'Invalid plugin setting of type "{self.info.type_}"') diff --git a/surfactant/infoextractors/srec_hex.py b/surfactant/infoextractors/srec_hex.py new file mode 100644 index 000000000..027cd261f --- /dev/null +++ b/surfactant/infoextractors/srec_hex.py @@ -0,0 +1,228 @@ +# Copyright 2025 Lawrence Livermore National Security, LLC +# See the top-level LICENSE file for details. +# +# SPDX-License-Identifier: MIT + +""" +Config Options: + max_file_size(int): The maximum file size to extract in bytes. [default=1000000] + strip_leading_zeros(bool): If leading zeros should be stripped from the binary. [default=False] + output_path(str): The path to output files to. Outputs to the current directory if empty. +""" + +import os.path +import pathlib +from dataclasses import dataclass +from queue import Queue +from typing import List, Optional, Tuple + +from loguru import logger + +import surfactant.plugin +from surfactant import ContextEntry +from surfactant.configmanager import ConfigManager +from surfactant.sbomtypes import SBOM, Software + +MAX_FILE_SIZE = int(ConfigManager().get("srec_hex", "max_file_size", 1000000)) +STRIP_LEADING_ZEROS = bool(ConfigManager().get("srec_hex", "strip_leading_zeros", False)) +EXTRACT_DIR = pathlib.Path(ConfigManager().get("srec_hex", "output_path", "")).absolute() +EXTRACT_DIR.mkdir(parents=True, exist_ok=True) + + +@surfactant.plugin.hookimpl +def settings_name() -> Optional[str]: + return "srec_hex" + + +def supports_file(filetype: List[str]) -> bool: + # We only want to support one of the expected formats at a time + seen_supported = False + for ftype in filetype: + is_supported = ftype in ("INTEL_HEX", "MOTOROLA_SREC") + if seen_supported: + return False + if is_supported: + seen_supported = True + return seen_supported + + +# pylint: disable=too-many-positional-arguments +@surfactant.plugin.hookimpl +def extract_file_info( + sbom: SBOM, + software: Software, + filename: str, + filetype: List[str], + context_queue: "Queue[ContextEntry]", + current_context: Optional[ContextEntry], +) -> object: + if not supports_file(filetype): + return + + # If there's no current context do nothing + if not current_context: + return + + if software.installPath and len(software.installPath) > 0: + info = None + if "INTEL_HEX" in filetype: + info = read_hex_info(filename) + elif "MOTOROLA_SREC" in filetype: + info = read_srecord_info(filename) + if info is None: + logger.error(f"Failed to parse {filename} - skipping") + return + first, last = get_first_and_last_address(info) + # Skip files that are too large + # If stripping leading zeros, need to compare the first/last address + # Otherwise, only need to compare the last + if (STRIP_LEADING_ZEROS and last - first >= MAX_FILE_SIZE) or ( + not STRIP_LEADING_ZEROS and last >= MAX_FILE_SIZE + ): + logger.info(f"Skipping {filename} as it is too large") + return + + install_loc = (EXTRACT_DIR / os.path.basename(filename)).as_posix() + with open(install_loc, "wb") as f: + write_write_info_to_file(f, info, trim_leading_zeros=STRIP_LEADING_ZEROS) + + new_entry = ContextEntry( + installPrefix=install_loc, + extractPaths=[install_loc], + ) + context_queue.put(new_entry) + + +@dataclass +class WriteInfo: + start_address: int + data: bytearray + + +def read_srecord_info(file: str) -> Optional[List[WriteInfo]]: + ret_info: List[WriteInfo] = [] + with open(file) as f: + for line in f: + line = line.strip() + if len(line) == 0: + continue + if line[0] != "S": + return None + srec_type = line[1] + byte_count = int(line[2:4], base=16) + bytes_sum = byte_count + if srec_type == "1": + addr = (int(line[4:6], base=16) << 8) | (int(line[6:8], base=16)) + next_byte = 8 + bytes_sum += int(line[4:6], base=16) + int(line[6:8], base=16) + # Byte count is address + data + checksum, so exclude the data and address bytes + bytes_to_read = byte_count - 2 - 1 + elif srec_type == "2": + addr = ( + (int(line[4:6], base=16) << 16) + | (int(line[6:8], base=16) << 8) + | (int(line[8:10], base=16)) + ) + next_byte = 10 + bytes_sum += ( + int(line[4:6], base=16) + int(line[6:8], base=16) + int(line[8:10], base=16) + ) + bytes_to_read = byte_count - 3 - 1 + elif srec_type == "3": + addr = ( + (int(line[4:6], base=16) << 24) + | (int(line[6:8], base=16) << 16) + | (int(line[8:10], base=16) << 8) + | (int(line[10:12], base=16)) + ) + next_byte = 12 + bytes_sum += ( + int(line[4:6], base=16) + + int(line[6:8], base=16) + + int(line[8:10], base=16) + + int(line[10:12], base=16) + ) + bytes_to_read = byte_count - 4 - 1 + else: + continue + temp_bytes: List[int] = [] + i = 0 + for byte_no in range(bytes_to_read): + i += 1 + start_byte = next_byte + byte_no * 2 + temp_bytes.append(int(line[start_byte : start_byte + 2], base=16)) + bytes_sum += temp_bytes[-1] + # verify checksum + expected_checksum = int(line[-2:], base=16) + checksum = 0xFF - (bytes_sum & 0xFF) + if expected_checksum != checksum: + return None + ret_info.append(WriteInfo(addr, bytearray(temp_bytes))) + return ret_info + + +def read_hex_info(file: str) -> Optional[List[WriteInfo]]: + ret_info: List[WriteInfo] = [] + with open(file) as f: + addr_top_bytes = 0 + for line in f: + line = line.strip() + if len(line) == 0: + continue + if line[0] != ":": + return None + byte_count = int(line[1:3], base=16) + bytes_sum = byte_count + addr = (int(line[3:5], base=16) << 8) | (int(line[5:7], base=16)) + bytes_sum += int(line[3:5], base=16) + int(line[5:7], base=16) + data_type = int(line[7:9], base=16) + bytes_sum += data_type + data_bytes: List[int] = [] + for byte_no in range(byte_count): + start_byte = 9 + byte_no * 2 + data_bytes.append(int(line[start_byte : start_byte + 2], base=16)) + bytes_sum += data_bytes[-1] + if data_type == 0: + addr = addr_top_bytes + addr + ret_info.append(WriteInfo(addr, bytearray(data_bytes))) + elif data_type == 2: + addr_top_bytes = ((data_bytes[0] << 8) | data_bytes[1]) * 16 + elif data_type == 4: + addr_top_bytes = ((data_bytes[0] << 8) | data_bytes[1]) << 16 + expected_checksum = int(line[-2:], base=16) + # Do a second 0xFF in the case of the +1 going to 0x0100 + check_sum = ((~bytes_sum & 0xFF) + 1) & 0xFF + if expected_checksum != check_sum: + return None + return ret_info + + +def get_first_and_last_address(data: List[WriteInfo]) -> Tuple[int, int]: + # Arbitrarly large number so smaller addresses will always compare true + first_address = 2 << 65 + last_address = 0 + for entry in data: + first_address = min(entry.start_address, first_address) + entry_end = entry.start_address + len(entry.data) + last_address = max(entry_end, last_address) + return first_address, last_address + + +# write_to is a file-like object +# returns true if the file was successfully written +def write_write_info_to_file(write_to, data: List[WriteInfo], *, trim_leading_zeros: bool) -> bool: + first_address, _ = get_first_and_last_address(data) + if not trim_leading_zeros and first_address > 0: + write_to.write(b"0" * first_address) + data = sorted(data, key=lambda x: x.start_address) + write_address = 0 + for entry in data: + if write_address > entry.start_address: + # Error: Overlapping data, skip writting the file? + return False + if write_address < entry.start_address: + write_to.write(b"0" * (entry.start_address - write_address)) + write_address = entry.start_address + write_to.write(entry.data) + write_address += len(entry.data) + return True diff --git a/surfactant/plugin/manager.py b/surfactant/plugin/manager.py index 252d7baab..e88d0cb56 100644 --- a/surfactant/plugin/manager.py +++ b/surfactant/plugin/manager.py @@ -29,6 +29,7 @@ def _register_plugins(pm: pluggy.PluginManager) -> None: ole_file, pe_file, rpm_file, + srec_hex, uimage_file, ) from surfactant.input_readers import cytrics_reader @@ -58,6 +59,7 @@ def _register_plugins(pm: pluggy.PluginManager) -> None: js_file, pe_file, ole_file, + srec_hex, uimage_file, rpm_file, dotnet_relationship, diff --git a/tests/data/binary/test.hex b/tests/data/binary/test.hex new file mode 100644 index 000000000..6ad2c8032 --- /dev/null +++ b/tests/data/binary/test.hex @@ -0,0 +1,386 @@ +:020000040000FA +:20000000D0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF0900BC +:20002000060000000000000000000000010000001100000000000000001000001000000088 +:2000400001000000FEFFFFFF0000000016000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:20006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:20008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:2000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:2000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:2000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:20010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:20012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:20014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:20016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:20018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:2001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:2001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:2001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:2002000053657276696365436F6E74726F6C4E616D654576656E74417267756D656E7473F3 +:2002200057616974436F6D706F6E656E745F5369676E617475726546696C654E616D654D17 +:20024000696E56657273696F6E4D617856657273696F6E4D696E53697A654D617853697ABA +:20026000654D696E446174654D6178446174654C616E6775616765734572726F724D65730D +:200280007361676552656D6F766546696C6546696C654B657944697250726F7065727479A3 +:2002A000496E7374616C6C4D6F6465496E7374616C6C4578656375746553657175656E6364 +:2002C00065416374696F6E436F6E646974696F6E53657175656E636556616C696461746551 +:2002E00050726F647563744944436F7374496E697469616C697A6546696C65436F73744389 +:200300006F737446696E616C697A65496E7374616C6C56616C6964617465496E7374616CE9 +:200320006C496E697469616C697A6550726F63657373436F6D706F6E656E7473556E707592 +:20034000626C697368466561747572657352656D6F766546696C6573496E7374616C6C46CE +:20036000696C6573526567697374657255736572526567697374657250726F647563745076 +:2003800075626C69736846656174757265735075626C69736850726F64756374496E737441 +:2003A000616C6C46696E616C697A6546656174757265436F6D706F6E656E74734665617460 +:2003C0007572655F436F6D706C6574654D61696E45786563757461626C6541647674457866 +:2003E000656375746553657175656E636550726F706572747956616C75654469736B5072FF +:200400006F6D707454657374696E672048656C6C6F20312E3020496E7374616C6C61746946 +:200420006F6E205B315D4D616E7566616374757265725465737450726F647563744C616E4D +:2004400067756167653130333350726F64756374436F64657B41424344444342412D383646 +:2004600043372D344431342D414543302D3836343136413639414244457D50726F647563F6 +:20048000744E616D6548656C6C6F20312E3050726F6475637456657273696F6E312E302E40 +:2004A0003055706772616465436F64657B41424344444342412D373334392D343533462DFA +:2004C000393446362D4243423531313042413446447D466561747572654665617475726522 +:2004E0005F506172656E745469746C654465736372697074696F6E446973706C61794C6526 +:2005000076656C4469726563746F72795F41747472696275746573417070536561726368E2 +:200520005369676E61747572655F496E7374616C6C554953657175656E6365457865637502 +:200540007465416374696F6E46696C6546696C6553697A6556657273696F6E4C616E6775EC +:2005600061676548656C6C6F48656C6C6F2E6578654C61756E6368436F6E646974696F6EF4 +:20058000436F6D706F6E656E74436F6D706F6E656E7449644B6579506174687B414243440D +:2005A000444342412D383346312D344632322D393835422D464442334338414244343731F8 +:2005C0007D494E5354414C4C44495253657276696365496E7374616C6C446973706C61792A +:2005E0004E616D6553657276696365547970655374617274547970654572726F72436F6E2D +:2006000074726F6C4C6F61644F7264657247726F7570446570656E64656E63696573537402 +:200620006172744E616D6550617373776F7264437573746F6D416374696F6E5479706553D1 +:200640006F75726365546172676574457874656E64656454797065557067726164655665BF +:200660007273696F6E4D696E56657273696F6E4D617852656D6F7665416374696F6E507291 +:200680006F70657274794D656469614469736B49644C61737453657175656E6365436162CC +:2006A000696E6574566F6C756D654C6162656C43442D524F4D2023312353616D706C652E69 +:2006C0006361624D736946696C654861736846696C655F4F7074696F6E73486173685061C7 +:2006E00072743148617368506172743248617368506172743348617368506172743442694E +:200700006E6172794461746149636F6E41646D696E4578656375746553657175656E636527 +:20072000496E7374616C6C41646D696E5061636B616765437265617465466F6C6465724459 +:2007400069726563746F72794469726563746F72795F506172656E7444656661756C7444A1 +:20076000697250726F6772616D46696C6573466F6C646572544152474554444952504669D2 +:200780006C6573536F757263654469725265674C6F6361746F72526F6F744B657941646DB4 +:2007A000696E554953657175656E6365526567697374727953686F7274637574486F746B40 +:2007C000657949636F6E5F49636F6E496E64657853686F77436D64576B44697244697370AC +:2007E0006C61795265736F75726365444C4C446973706C61795265736F7572636549644480 +:2008000065736372697074696F6E5265736F75726365444C4C4465736372697074696F6EF0 +:200820005265736F75726365496400000000000000000000000000000000000000000000C3 +:20084000000000000E000700040007000500010009000300040001000A00080009000A003C +:20086000080003000A0001000A00010007000100070001000700010007000100090001002D +:2008800005000300070001000A000500070001000B0001000B0001001600030006000600F4 +:2008A0000900070008000600110001000E000100080001000C0001000F00010011000100C1 +:2008C00011000100110001000B0001000C0001000C0001000F0001000F0001000E0001009F +:2008E0000F0001001100020008000100080001000E0001001300030008000400050002008B +:200900000A000200220001000C000100040001000F000100040001000B000100260001004E +:200920000B000100090001000E000100050001000B00020026000100070009000E00010039 +:20094000050001000B00040007000100050001000A0004000A000400090002000A00020041 +:20096000110003000D0001000400090008000100070001000800020005000100090001001D +:200980000F000200090007000B00010007000100260001000A0001000E000E000B000100C8 +:2009A0000B000100090001000C0001000E0001000C00010009000100080001000C000500D4 +:2009C0000400020006000200060002000C000100070007000A0001000A00010006000100C9 +:2009E0000E00010005000600060001000C000100070001000B000100090001000B0001009F +:200A00000B0006000500010007000100090001000900010009000100090001000600020087 +:200A2000040002000400020014000300130001000C00020009000400100001000A00010048 +:200A4000120001000900010006000100090001000A00050004000200030002000F0003003C +:200A600008000700000000000000000008001100060001000500010009000100070001002F +:200A80000500010012000100110001001600010015000100000000000000000000000000FE +:200AA000000000000000000000000000000000000000000000000000000000000000000036 +:200AC000000000000000000000000000000000000000000000000000000000000000000016 +:200AE0000000000000000000000000000000000000000000000000000000000000000000F6 +:200B00000000000000000000000000000000000000000000000000000000000000000000D5 +:200B20000000000000000000000000000000000000000000000000000000000000000000B5 +:200B4000000000000000000000000000000000000000000000000000000000000000000095 +:200B6000000000000000000000000000000000000000000000000000000000000000000075 +:200B8000000000000000000000000000000000000000000000000000000000000000000055 +:200BA000000000000000000000000000000000000000000000000000000000000000000035 +:200BC000FEFF0000050002000000000000000000000000000000000001000000E0859FF21A +:200BE000F94F6810AB9108002B27B3D930000000A40100000E0000000100000078000000B7 +:200C0000020000008000000003000000A000000004000000C400000005000000D40000000E +:200C200006000000E80000000700000018010000090000002C0100000C0000005C01000007 +:200C40000D000000680100000E000000740100000F0000007C010000120000008401000078 +:200C6000130000009C01000002000000E40400001E00000016000000496E7374616C6C616E +:200C800074696F6E2044617461626173650000001E0000001C00000054657374696E67202D +:200CA00048656C6C6F20312E3020496E7374616C6C6572001E000000050000005465737400 +:200CC000000000001E0000000A000000496E7374616C6C65720000001E00000026000000FA +:200CE00054686973206973206120746573742066696C6520746F2063726561746520616EB9 +:200D0000206D73692E0000001E0000000B000000496E74656C3B3130333300001E000000F7 +:200D2000270000007B44414133383442302D323644372D344433342D423630452D42393428 +:200D40003341443437333446387D00004000000080CFB65C664CD9014000000080CFB65C40 +:200D6000664CD901030000006400000003000000020000001E0000000F0000006D73697491 +:200D80006F6F6C7320302E3130310000030000000200000000000000000000000000000081 +:200DA000000000000000000000000000000000000000000000000000000000000000000033 +:200DC0004D53434600000000A80A0000000000002C00000000000000030101000100000006 +:200DE000000000004200000001000100F83F00000000000000005C561DBF200048656C6C45 +:200E00006F001C7484C95E0AF83F434BED5B6F6C14C7159F5DDBE77330F8EC60624C032EC2 +:200E200025510878EDB30D31092E67ECB3EF1A1B1C6CA7346A98ACEFD6BEADEE8F7BB797F6 +:200E4000D8A8A46E9C56B6081269DA8446F9E04A6DD3AA5545D47C2052944069C89FA61569 +:200E60007CA844545522558988445B434B44DA94ED9B9D99BBDDF12D2148FD50695FB4BC98 +:200E800079BF79EFCD9B7F9B59DF9B6F8607FA6449429CCAD01711911602540E31BCB3B3BC +:200EA000A00258275A0EFFAE436B910FE4729B9EC8CFCA4EEE2FB443ED1ACAA82CF2CF21D5 +:200EC00027976CBC1CB9D3B14A274781A25D854D16F936D9C9ED76567B4D0C17F876C9C93E +:200EE000ED76646CE69AA93CD72570D6CEE932A79DCCEC1698DD42979323D9C9F97896B3BD +:200F0000A793F913792B7272D12EC1F444DE8B9C9C8FFDF079237E33ED0D31BBEA262A8BF6 +:200F2000DCADBD07C0CE876E9CF8F4EE61EDB9CDC394ECE47C1A5B92FAD8D68E9664BC39C8 +:200F4000A9A7F353CD539D5B9BB77628B98CD256888B844CD654FFAE51321DC709C6A7539C +:200F60009EA132F747CA2B593DD11F7EEBDD1F64B6CF0C76FE6A5FD3F7DFE979FEFDE75F64 +:200F8000A92867714B4C07317D3EE58895AB50717D21F4B455AE62F5A7B5DFA7EA8F54F76A +:200FA000B88DCB9BF0D495C0DF73C1F7B9E0CFBAE024FEA612B8E4826F76C1FB5CFC1F83CE +:200FC000677D09FC97F0D4A246140AB138F8C0633C91CAA471CE50B306C608474706715C11 +:200FE000CB6A137ACED0B223833DC94C5A1B51C7921AAD2B5DF3D0AE61A353CFE4F0989ADC +:20100000D33AA269DDE80D861F057CD848E6A2C34630184BA8596C6455DDC84563E1F01E1A +:20102000C0DA41598FE14CCEC86A6A2A1A1BC1E1E12D78E8FE58297F3DDC5F472C93372014 +:20104000ECD8948AC7F5B49AD4F7430018D6638CF522A5EA69A6A01ADA946E20A8CC19F1D0 +:20106000D8A64D64816E25628C96FA07A23B7BF6EEC5ED4A072DE336A5BD586C53B620B222 +:20108000C664589FE53047E4BF724B22A50F6CF3696CFCAE9FAC62B3309F32BA828AFBECB1 +:2010A000E5A79FF5114FCB248AE51BF52AB25A57B179E0FB8DBF07666A293F2CE0756CD266 +:2010C0008F087888E9FB434E9CCBA777504EF604DF0B84CEDA70C9869FB3E11536FC820D09 +:2010E000B7BF6F166D78A50DBF6AC3FD369CAF43E2FB161B7E8CE9131FF67D7DDC8697D9BC +:20110000F0B76CF8F5FEBFE791471E79E491471E7974A3F48F9AB5FF8ACC5EF4470E56BC72 +:20112000D78250E4DBC70DD93C1D99FD8DFFA4556F6E7902E0CBE61DB3C06AD659FA0952BF +:2011400071F9C3F74DD33C6CC992259F29C8B2259FE032586B96752F6D0FE42E41DE22C877 +:20116000CD7639F8D7E8FC997D91F93F4766FFB23834120E1E0FBE1D39D4F50E09AFFE5653 +:20118000D0FCE7B852B3EE492B5EC0B7917E1CAA68236CDB55A31EBAF69142BB56659EABA9 +:2011A000593743F44E320EFA5596FE1699B08DD722F38B91137FDB113971B52C229D8A9C15 +:2011C000B966AC04076F30077EF3DCB81517B727F1CD745590CFDCFCA6D1C86CD77E8578C9 +:2011E0009D3F6F54470E76FD04840B1F5F33CD0B71188C53157F8236A487C1D661FFE16352 +:2012000050490AA360079311983FF049643EBF089D50571067A7A0F40C8960FECD0BBF057F +:201220006FE42308BD7D523099CF5F9D3DF08994BFEF5B07AE9A704ECFB78159AA859AFD8A +:2012400008CC40ACB7BCFC1A4A232DD4F3C18A4BCD54450595C345AFAF111FAF93A9BDF020 +:201260000CC4F7F0C9E25A29AC0E8F3CF2C8238F3CF2C8238F3CF2C8238FFE5F88FC8E13C6 +:20128000D192C9CC2D505E53765F08D1DF1A562E9AA6017C04F80BC0E3C05F06FE3DE05FF7 +:2012A000057EE09269BE0BFC28F08BC07D974DB35AA2BF715A7EF7EF41D254405A535DE910 +:2012C0003FCC70F25B7E2BD8DF49147A2BAD9F8E36C0D301CF91BF9B26691BAD08F4AD681E +:2012E000F852CDB2C7FC336847E3BD77B76FB07EEE23F6A4DDA3A0C77F73E23889F3A780D4 +:20130000B7DA70D2D653F0FC0CDA6B27407845E03B72CF72DFD7202056FF0B785E85FA07F0 +:20132000EDF5F2A0A540EA49FF2E43FD6A7BFD10B5F7C8238F3CF2C8238F3CF2C8238F3C10 +:20134000BA59E2F9703CFF8DE7BBF19CB50F9053BEC2783577C03E8A96337133F3B39AC9EF +:201360003CFF6E8D531D3532CEF3ED78BE35FFC6B972CDCC107E9425A5F15CB9732C198D87 +:20138000E7C89D65F53CD76D3D0B7419931B18AF474EE2B96E0B2CCF8DE7C44518E7DF934B +:2013A0003CE7EE36C6272B9D78C2E78CDBCFDAE7B980BCFDB5C8A9F76F93F64F62D0352636 +:2013C00037307F2693795C8B5C66F51F33F97F959B57C8FB16A895E7E7333E1428AD77A3AE +:2013E000C4F328FB7B7AEE6DBA6B742C9F36F24DC1A0D2AEB43607F396187CBCAD4D69EDEF +:20140000D8C8E0EBFBA379F3974C11A7B9CBE5E82936F14D0CBFD5459FCC970CABF5B4D0B7 +:20142000BF2686A35A27DECEF0908047AD761BD15077313E42A356795561FD73FA06F333E5 +:2014400023F899B3F4EB0BFB89D38B2EF1BFC4DA7D4068F738F3FF2AF3FF20C317195E27E3 +:20146000EC5FB7F1299788CF95A8F3F3624D69FD3A897AE3F9F69CEEB0FCDCB664BD2916F3 +:20148000DE50D89F9C7AAD3CDFD5281072E29B653237AB8B174018DD2F91A9AA2B4C38DFDC +:2014A0002F0F49A5F3B949E075D0C23C1B9F7686E7891F797561BD727A02F03AB9B6F0DE42 +:2014C000E3342795CE23FFB10BDE2AD376F9FD973B19FE9A8BBE4CF4E5EAE20B95915FA653 +:2014E000718AE3B3522E9DA77EB74CC7531CB77B2CBC11EDED76E2DB192EFA8FC8A5E34C3C +:20150000CAA5F3ECE75CF0E75CF0975CFCA3E158D6082A1984B13AA663439D4000E48CFC27 +:20152000F8B81243C5847B6CA4708C24D6E740339EC113C9CC989AC4712393CD61353F8537 +:201540006299D4645233B438BC614A6A90A4781DABD9AC3A8DB5B4919D46E35935A5E1780A +:201560003E959A06139B8441D370A826C89F3A95D8E4A4956A3FD089B19E214A20760431C2 +:20158000C9AF37F49865A693C47B903269ACA6E338AEE58C6C3E66C9ADBA8E70FFC0EE9DF4 +:2015A000DD0360921FC3519E92DFB7A77B308CC3BB7AC94D03DCBF6B1487230C8CF4EE41F2 +:2015C000B8F72BBBBA07A33D05EBDD7D7DC3E1113CD2BD73200C165A5C355484A3BB219007 +:2015E000B89EC6F99C16176E0284ECA9FB303EB90C4E407CE48E021997A5170542B6B47F3C +:20160000FB9D01A7A39BBBC710B25F2FC0741CF1C8600F1F017E9BC1A987492F6984D0E5BE +:2016200034E9E1582EC781D237239C1EAE7787A3C4758FCF72A5C3D1105272D329431D0334 +:201640006E64294FF0929E068F934849670C4D9948E795C96C6652CB1AD336682CAF27E322 +:20166000CD7A9C41DD3BA3CD64635875093597404A7C3A0D4D506E6469CDA35A3607CBCC92 +:201680002160A8CB6A499528B2D264D22051C09893A2329161859C16430A4C3188D68A50D1 +:2016A000B2196B59295A82ED8D443C5B94A80FBA49A8052F43536A4A0767D41CE60829B0A8 +:2016C0003B53B0934ABD003E1B91732879F5F17395DBFD3F4E92207F0139EF50B8DD3FE380 +:2016E00024FECD7EAB602FDE7BDB20E88BE7BBA860CFCF33E2B9C6CDFECBF07C0467476E7E +:20170000CFCFD79CDFC5707EBE16E357113D5B737B7EFEE69C9F7F498C92CD9E9F8375E418 +:20172000BC5BC6CFF39CAF17065C1CFFAF237A362E5C47F439F92A217EE1DA227A1CD1B3F2 +:201740007661FE7D4E3E848AF1CB6869FF0F213AA685F9F33939EFBF387EBCFFCF31FB9D67 +:201760004CE6DF139CF3EF0F1FB311ED7F88EC77F0D092FBA4FC3B8B9338FF2F08F64D0186 +:20178000270F09FAE2B5D51705FB47024E2E7E0E88F64705FBC980938BFB47B47F45B0E7BF +:2017A000E725CE0F0A0B468CE775C19E9FDB385F2EE88BE3F70672BE3FC47BB9CB047DD188 +:2017C000FE7782BDDB3D5437FB3F0AF6434D4E7E51D017D7EF797856A0E2F76FE15E2ABBCB +:2017E000A72A8E975FE097E0A9B1D9F3EF9723CDA5DB13EDFF83E8D817BEBFF93D6366CF7D +:201800003B5629D8F1B87E8E68FFC5EFF78516CA1FF994F67D92D3BEB0E05B9DED88F69C39 +:20182000AAD9073BB72F9CA7997D83B0FE424E11D5B2F697AC73066C1270A90497D1520A3A +:20184000317B3F5B30B723FA370FF1FD51859CF7FC38453A28FF83E05C7CFFD6BAD8DF7EC8 +:201860000FE58D9FF2FEFE2F0000000000000000000000000000000000000000000000002B +:201880001B001C001D004900000000000000000020838483E88314850000000000000000FD +:2018A000000000000000000000000000000000000000000000000000000000000000000028 +:2018C0003300550080008100800033008100000033003900820083000000000000000000DA +:2018E0000000000000000000000000000000000000000000000000000000000000000000E8 +:201900001B001C001D001E001F00230028007B000000000000000000000000000000000070 +:2019200020838483E8837885DC85A08FC8993C8F00000000000000000000000000000000D9 +:201940004E000080F52CD43C72CB46CFE9AA53441301819C000000000000000000000000DB +:20196000000000000000000000000000000000000000000000000000000000000000000067 +:201980000180010000806E006F000000000000000000000000000000000000000000000068 +:2019A000000000000000000000000000000000000000000000000000000000000000000027 +:2019C0002C0054005500008000004E00000000000000000000000000000000000000000064 +:2019E0000000000000000000000000000000000000000000000000000000000000000000E7 +:201A00004E002C004F00F83F00800000000000820100008000000000000000000000000043 +:201A20000000000000000000000000000000000000000000000000000000000000000000A6 +:201A40001A001B001C001D00490000000000000000000000BC8220838483E88314850000E3 +:201A6000000000000000000000000000000000000000000000000000000000000000000066 +:201A80002B0000000000000002800180000000800000000000000000000000000000000098 +:201AA000000000000000000000000000000000000000000000000000000000000000000026 +:201AC000300032003400360038003A003C00310033003500370039003B003D00000000000B +:201AE0000000000000000000000000000000000000000000000000000000000000000000E6 +:201B00001B001D001E001F0026002700280000000000000000000000000000002083E883CD +:201B20007885DC859C980099C8990000000000000000000000000000000000000000000019 +:201B40002B002C00000000000000000000000000000000000000000000000000000000002E +:201B6000000000000000000000000000000000000000000000000000000000000000000065 +:201B80001A001B001C001D001E001F00200021002200230024002500260027002800000056 +:201BA00000000000000000000000000000000000000000000000000000000000BC82208344 +:201BC0008483E8837885DC8540860887AC8DA08F7097D4979C980099C899000000000000D8 +:201BE0000000000000000000000000000000000000000000000000000000000000000000E5 +:201C000001000100010001000100010007000700070007000700070007000700070010006F +:201C2000100012001200120012001200160016001600290029002D002D002D002E002E00C3 +:201C40003E003E003E003E003E003E003E003E00460046004800480048004A004A004A0052 +:201C60004A004A004A004A004A00500050005100510051005100510051005600560056006A +:201C800056005600560056005600560056005600560056005F005F005F005F005F006400A9 +:201CA000640064006400640064006400690069006900690069006900700070007000700096 +:201CC0007000700077007700790079007A007A007A007C007C007D007D007D00840084005F +:201CE0008400840084008700870087008800880088008800880088008B008B008B008B0067 +:201D00008B008B008B008B008B008B008B008B008B008B008B008B00018002800380048035 +:201D2000058006800180028003800480058006800780088009800180028001800280038062 +:201D400004800580018002800380018002800180028003800180028001800280038004805E +:201D6000058006800780088001800280018002800380018002800380048005800680078024 +:201D8000088001800280018002800380048005800680018002800380048005800680078007 +:201DA000088009800A800B800C800D800180028003800480058001800280038004800580C6 +:201DC0000680078001800280038004800580068001800280038004800580068001800280C9 +:201DE0000180028001800280038001800280018002800380018002800380048005800180C1 +:201E0000028003800180028003800480058006800180028003800480058006800780088084 +:201E200009800A800B800C800D800E800F801080010002000300040005000600070008001A +:201E400009000A000B000C000D000E000F0010001100130006000800140015001700180094 +:201E600019002A0006001700180019002E002F003E003F0040004100420043004400450068 +:201E80002E0047001700180019004A00060008004B004C004D004500190018004100510041 +:201EA00052004400450018005300560002005700580059005A005B005C005D005E000400AC +:201EC00006004100170060006100620063003C00650066004D004500670068006A006B00E1 +:201EE00030006C006D006100710072007300740075007600020078000200780017001800A0 +:201F00001900440006007D007E007F004700850086000200600017001800190088008500DB +:201F2000860002002F0006008B004400020006006200040041008C008D008E008F009000A0 +:201F4000910092009300940048ADFF8F0285FF9F0295488D48ADFF8D149D149D0491049116 +:201F600004910491FF9D02A5009F48AD488DFF9F488D028548ADFF9D029526AD48AD48ADAC +:201F8000FF9D029548AD008F26AD269D409FFF9F02950285489D028548AD48AD48ADFF9D72 +:201FA000029548AD488DFF8F0481489D149D02950481FFADFF8F48AD269D488D0285FF9D11 +:201FC000489D48ADFF8DFF9F048104810481FF9DFF9DFF9DFF9DFF9D488DFF9F48AD028573 +:201FE000489DFF9D049126AD14BD14BDFFBD04A1FF9D488D02A50481409FFF9D209D489D3B +:2020000048AD0285048104810481048148AD008948AD008948ADFF9D029548AD48AD48AD2D +:20202000489DFF8F48AD0285FF8DFF9D029548ADFF9D029548AD0285FF8FFF9F009F488DAE +:2020400048AD488D808F488D488DFF9DFF9F0295489D02950295489DFF9D0295FF9D0295CE +:20206000000000000000000000000000000000000000000000000000000000000000000060 +:202080000100070010001200160029002D002E003E00460048004A005000510056005F0010 +:2020A000640069007000770079007A007C007D008400870088008B00000000000000000062 +:2020C000000000000000000000000000000000000000000000000000000000000000000000 +:2020E0000000000000000000000000000000000000000000000000000000000000000000E0 +:202100000000000000000000000000000000000000000000000000000000000000000000BF +:2021200000000000000000000000000000000000000000000000000000000000000000009F +:2021400000000000000000000000000000000000000000000000000000000000000000007F +:2021600000000000000000000000000000000000000000000000000000000000000000005F +:2021800000000000000000000000000000000000000000000000000000000000000000003F +:2021A00000000000000000000000000000000000000000000000000000000000000000001F +:2021C0000000000000000000000000000000000000000000000000000000000000000000FF +:2021E0000000000000000000000000000000000000000000000000000000000000000000DF +:2022000001000000020000000300000004000000050000000600000007000000080000009A +:20222000090000000A0000000B0000000C0000000D0000000E0000000F000000100000003A +:202240001100000012000000130000001400000015000000160000001700000018000000DA +:20226000FEFFFFFF1A0000001B0000001C0000001D0000001E0000001F0000002000000098 +:20228000210000002200000023000000240000002500000026000000FEFFFFFF2800000046 +:2022A000290000002A0000002B0000002C0000002D0000002E000000FEFFFFFF30000000EE +:2022C00031000000320000003300000034000000350000003600000037000000380000005A +:2022E000390000003A0000003B0000003C0000003D0000003E0000003F00000040000000FA +:20230000410000004200000043000000440000004500000046000000470000004800000099 +:20232000490000004A0000004B0000004C0000004D0000004E0000004F0000005000000039 +:202340005100000052000000530000005400000055000000560000005700000058000000D9 +:2023600059000000FEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFF27 +:20238000FEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFF67000000FEFFFFFFF9 +:2023A000690000006A0000006B0000006C0000006D0000006E0000006F00000070000000B9 +:2023C000710000007200000073000000740000007500000076000000770000007800000059 +:2023E00079000000FEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:2024000052006F006F007400200045006E00740072007900000000000000000000000000E6 +:2024200000000000000000000000000000000000000000000000000000000000000000009C +:2024400016000501FFFFFFFFFFFFFFFF0B00000084100C0000000000C000000000000046B7 +:20246000000000000000000000000000000000000000000000000000C01E0000000000007E +:2024800040483F3F77456C446A3BE445244800000000000000000000000000000000000090 +:2024A00000000000000000000000000000000000000000000000000000000000000000001C +:2024C00010000201FFFFFFFF02000000FFFFFFFF00000000000000000000000000000000EF +:2024E0000000000000000000000000000000000000000000000000002A06000000000000AC +:2025000040483F3F77456C446A3EB2442F4800000000000000000000000000000000000034 +:2025200000000000000000000000000000000000000000000000000000000000000000009B +:2025400010000201FFFFFFFF08000000FFFFFFFF0000000000000000000000000000000068 +:202560000000000000000000000000000000000000000000190000004403000000000000FB +:202580000500530075006D006D0061007200790049006E0066006F0072006D006100740008 +:2025A00069006F006E000000000000000000000000000000000000000000000000000000D5 +:2025C00028000201FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000DC +:2025E000000000000000000000000000000000000000000027000000D401000000000000DF +:202600001C41F0442F42BE4164410000000000000000000000000000000000000000000014 +:2026200000000000000000000000000000000000000000000000000000000000000000009A +:202640000C000201FFFFFFFF12000000FFFFFFFF0000000000000000000000000000000061 +:2026600000000000000000000000000000000000000000002F000000A80A00000000000079 +:202680004048CA413043B13F123F28453842B14128480000000000000000000000000000AA +:2026A00000000000000000000000000000000000000000000000000000000000000000001A +:2026C00014000201FFFFFFFF10000000FFFFFFFF00000000000000000000000000000000DB +:2026E00000000000000000000000000000000000000000005A000000180000000000000068 +:2027000040480D433542E64572453C48000000000000000000000000000000000000000004 +:20272000000000000000000000000000000000000000000000000000000000000000000099 +:202740000E000201FFFFFFFF0A000000FFFFFFFF0000000000000000000000000000000066 +:2027600000000000000000000000000000000000000000005B0000001800000000000000E6 +:202780004048CA413043B13B3B42264637421C4234466844264200000000000000000000F9 +:2027A000000000000000000000000000000000000000000000000000000000000000000019 +:2027C00018000201FFFFFFFF0F000000FFFFFFFF00000000000000000000000000000000D7 +:2027E00000000000000000000000000000000000000000005C00000030000000000000004D +:2028000040489645EC3BEC43683CA4452B48000000000000000000000000000000000000FF +:20282000000000000000000000000000000000000000000000000000000000000000000098 +:2028400010000201FFFFFFFF05000000FFFFFFFF0000000000000000000000000000000068 +:2028600000000000000000000000000000000000000000005D0000001400000000000000E7 +:20288000404816422743244800000000000000000000000000000000000000000000000082 +:2028A000000000000000000000000000000000000000000000000000000000000000000018 +:2028C0000A000201FFFFFFFF04000000FFFFFFFF00000000000000000000000000000000EF +:2028E00000000000000000000000000000000000000000005E0000000E000000000000006C +:2029000040488C44F04472446844374800000000000000000000000000000000000000004A +:20292000000000000000000000000000000000000000000000000000000000000000000097 +:202940000E000201FFFFFFFF01000000FFFFFFFF000000000000000000000000000000006D +:2029600000000000000000000000000000000000000000005F0000000C00000000000000EC +:2029800040480F432F420000000000000000000000000000000000000000000000000000EC +:2029A000000000000000000000000000000000000000000000000000000000000000000017 +:2029C00008000201FFFFFFFF09000000FFFFFFFF00000000000000000000000000000000EB +:2029E000000000000000000000000000000000000000000060000000140000000000000063 +:202A000040485244F645E443AF3F123F28453842B1412848000000000000000000000000AE +:202A2000000000000000000000000000000000000000000000000000000000000000000096 +:202A400016000201FFFFFFFF07000000FFFFFFFF000000000000000000000000000000005E +:202A60000000000000000000000000000000000000000000610000001E00000000000000D7 +:202A800040480F42E445784528480000000000000000000000000000000000000000000007 +:202AA000000000000000000000000000000000000000000000000000000000000000000016 +:202AC0000C000201FFFFFFFF0E000000FFFFFFFF00000000000000000000000000000000E1 +:202AE000000000000000000000000000000000000000000062000000100000000000000064 +:202B000040485945F24468453747000000000000000000000000000000000000000000002E +:202B2000000000000000000000000000000000000000000000000000000000000000000095 +:202B40000C000201FFFFFFFF06000000FFFFFFFF0000000000000000000000000000000068 +:202B60000000000000000000000000000000000000000000630000001C00000000000000D6 +:202B80004048CA41F945CE46A841F845283F28453842B1412848000000000000000000007A +:202BA000000000000000000000000000000000000000000000000000000000000000000015 +:202BC00018000201FFFFFFFF11000000FFFFFFFF00000000000000000000000000000000D1 +:202BE0000000000000000000000000000000000000000000640000002A0000000000000047 +:202C000040480F42E4457845283B3244B3443142F1453648000000000000000000000000FE +:202C2000000000000000000000000000000000000000000000000000000000000000000094 +:202C400016000201FFFFFFFF0C000000FFFFFFFF0000000000000000000000000000000057 +:202C60000000000000000000000000000000000000000000650000000400000000000000EB +:202C800040485244F645E443AF3B3B42264637421C4234466844264200000000000000007C +:202CA000000000000000000000000000000000000000000000000000000000000000000014 +:202CC0001A000201FFFFFFFF03000000FFFFFFFF00000000000000000000000000000000DC +:202CE0000000000000000000000000000000000000000000660000005A0000000000000014 +:202D000040483F3BF2433844B145000000000000000000000000000000000000000000000A +:202D2000000000000000000000000000000000000000000000000000000000000000000093 +:202D40000C000201FFFFFFFF13000000FFFFFFFF0000000000000000000000000000000059 +:202D6000000000000000000000000000000000000000000068000000600400000000000087 +:202D800040487F3F64412F4236480000000000000000000000000000000000000000000059 +:202DA000000000000000000000000000000000000000000000000000000000000000000013 +:202DC0000C000201FFFFFFFF0D000000FFFFFFFF00000000000000000000000000000000DF +:202DE00000000000000000000000000000000000000000007A000000380000000000000021 +:202E000001000000020000000300000004000000050000000600000007000000080000008E +:202E2000090000000A0000000B0000000C0000000D0000000E0000000F000000FEFFFFFF43 +:202E4000FEFFFFFF12000000130000001400000015000000FEFFFFFFFDFFFFFFFFFFFFFF38 +:202E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:202E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:202EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:202EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:202EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:202F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:202F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:202F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:202F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:202F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:202FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:202FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:202FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:00000001FF diff --git a/tests/data/binary/test.srec b/tests/data/binary/test.srec new file mode 100644 index 000000000..032e63d22 --- /dev/null +++ b/tests/data/binary/test.srec @@ -0,0 +1,386 @@ +S0220000687474703A2F2F737265636F72642E736F75726365666F7267652E6E65742F1D +S1230000D0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF0900B8 +S1230020060000000000000000000000010000001100000000000000001000001000000084 +S123004001000000FEFFFFFF0000000016000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +S1230060FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +S1230080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +S12300A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +S12300C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +S12300E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +S1230100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +S1230120FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +S1230140FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +S1230160FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +S1230180FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +S12301A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +S12301C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +S12301E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +S123020053657276696365436F6E74726F6C4E616D654576656E74417267756D656E7473EF +S123022057616974436F6D706F6E656E745F5369676E617475726546696C654E616D654D13 +S1230240696E56657273696F6E4D617856657273696F6E4D696E53697A654D617853697AB6 +S1230260654D696E446174654D6178446174654C616E6775616765734572726F724D657309 +S12302807361676552656D6F766546696C6546696C654B657944697250726F70657274799F +S12302A0496E7374616C6C4D6F6465496E7374616C6C4578656375746553657175656E6360 +S12302C065416374696F6E436F6E646974696F6E53657175656E636556616C69646174654D +S12302E050726F647563744944436F7374496E697469616C697A6546696C65436F73744385 +S12303006F737446696E616C697A65496E7374616C6C56616C6964617465496E7374616CE5 +S12303206C496E697469616C697A6550726F63657373436F6D706F6E656E7473556E70758E +S1230340626C697368466561747572657352656D6F766546696C6573496E7374616C6C46CA +S1230360696C6573526567697374657255736572526567697374657250726F647563745072 +S123038075626C69736846656174757265735075626C69736850726F64756374496E73743D +S12303A0616C6C46696E616C697A6546656174757265436F6D706F6E656E7473466561745C +S12303C07572655F436F6D706C6574654D61696E45786563757461626C6541647674457862 +S12303E0656375746553657175656E636550726F706572747956616C75654469736B5072FB +S12304006F6D707454657374696E672048656C6C6F20312E3020496E7374616C6C61746942 +S12304206F6E205B315D4D616E7566616374757265725465737450726F647563744C616E49 +S123044067756167653130333350726F64756374436F64657B41424344444342412D383642 +S123046043372D344431342D414543302D3836343136413639414244457D50726F647563F2 +S1230480744E616D6548656C6C6F20312E3050726F6475637456657273696F6E312E302E3C +S12304A03055706772616465436F64657B41424344444342412D373334392D343533462DF6 +S12304C0393446362D4243423531313042413446447D46656174757265466561747572651E +S12304E05F506172656E745469746C654465736372697074696F6E446973706C61794C6522 +S123050076656C4469726563746F72795F41747472696275746573417070536561726368DE +S12305205369676E61747572655F496E7374616C6C554953657175656E63654578656375FE +S12305407465416374696F6E46696C6546696C6553697A6556657273696F6E4C616E6775E8 +S123056061676548656C6C6F48656C6C6F2E6578654C61756E6368436F6E646974696F6EF0 +S1230580436F6D706F6E656E74436F6D706F6E656E7449644B6579506174687B4142434409 +S12305A0444342412D383346312D344632322D393835422D464442334338414244343731F4 +S12305C07D494E5354414C4C44495253657276696365496E7374616C6C446973706C617926 +S12305E04E616D6553657276696365547970655374617274547970654572726F72436F6E29 +S123060074726F6C4C6F61644F7264657247726F7570446570656E64656E636965735374FE +S12306206172744E616D6550617373776F7264437573746F6D416374696F6E5479706553CD +S12306406F75726365546172676574457874656E64656454797065557067726164655665BB +S12306607273696F6E4D696E56657273696F6E4D617852656D6F7665416374696F6E50728D +S12306806F70657274794D656469614469736B49644C61737453657175656E6365436162C8 +S12306A0696E6574566F6C756D654C6162656C43442D524F4D2023312353616D706C652E65 +S12306C06361624D736946696C654861736846696C655F4F7074696F6E73486173685061C3 +S12306E072743148617368506172743248617368506172743348617368506172743442694A +S12307006E6172794461746149636F6E41646D696E4578656375746553657175656E636523 +S1230720496E7374616C6C41646D696E5061636B616765437265617465466F6C6465724455 +S123074069726563746F72794469726563746F72795F506172656E7444656661756C74449D +S1230760697250726F6772616D46696C6573466F6C646572544152474554444952504669CE +S12307806C6573536F757263654469725265674C6F6361746F72526F6F744B657941646DB0 +S12307A0696E554953657175656E6365526567697374727953686F7274637574486F746B3C +S12307C0657949636F6E5F49636F6E496E64657853686F77436D64576B44697244697370A8 +S12307E06C61795265736F75726365444C4C446973706C61795265736F757263654964447C +S123080065736372697074696F6E5265736F75726365444C4C4465736372697074696F6EEC +S12308205265736F75726365496400000000000000000000000000000000000000000000BF +S1230840000000000E000700040007000500010009000300040001000A00080009000A0038 +S1230860080003000A0001000A000100070001000700010007000100070001000900010029 +S123088005000300070001000A000500070001000B0001000B0001001600030006000600F0 +S12308A00900070008000600110001000E000100080001000C0001000F00010011000100BD +S12308C011000100110001000B0001000C0001000C0001000F0001000F0001000E0001009B +S12308E00F0001001100020008000100080001000E00010013000300080004000500020087 +S12309000A000200220001000C000100040001000F000100040001000B000100260001004A +S12309200B000100090001000E000100050001000B00020026000100070009000E00010035 +S1230940050001000B00040007000100050001000A0004000A000400090002000A0002003D +S1230960110003000D00010004000900080001000700010008000200050001000900010019 +S12309800F000200090007000B00010007000100260001000A0001000E000E000B000100C4 +S12309A00B000100090001000C0001000E0001000C00010009000100080001000C000500D0 +S12309C00400020006000200060002000C000100070007000A0001000A00010006000100C5 +S12309E00E00010005000600060001000C000100070001000B000100090001000B0001009B +S1230A000B0006000500010007000100090001000900010009000100090001000600020083 +S1230A20040002000400020014000300130001000C00020009000400100001000A00010044 +S1230A40120001000900010006000100090001000A00050004000200030002000F00030038 +S1230A6008000700000000000000000008001100060001000500010009000100070001002B +S1230A800500010012000100110001001600010015000100000000000000000000000000FA +S1230AA0000000000000000000000000000000000000000000000000000000000000000032 +S1230AC0000000000000000000000000000000000000000000000000000000000000000012 +S1230AE00000000000000000000000000000000000000000000000000000000000000000F2 +S1230B000000000000000000000000000000000000000000000000000000000000000000D1 +S1230B200000000000000000000000000000000000000000000000000000000000000000B1 +S1230B40000000000000000000000000000000000000000000000000000000000000000091 +S1230B60000000000000000000000000000000000000000000000000000000000000000071 +S1230B80000000000000000000000000000000000000000000000000000000000000000051 +S1230BA0000000000000000000000000000000000000000000000000000000000000000031 +S1230BC0FEFF0000050002000000000000000000000000000000000001000000E0859FF216 +S1230BE0F94F6810AB9108002B27B3D930000000A40100000E0000000100000078000000B3 +S1230C00020000008000000003000000A000000004000000C400000005000000D40000000A +S1230C2006000000E80000000700000018010000090000002C0100000C0000005C01000003 +S1230C400D000000680100000E000000740100000F0000007C010000120000008401000074 +S1230C60130000009C01000002000000E40400001E00000016000000496E7374616C6C616A +S1230C8074696F6E2044617461626173650000001E0000001C00000054657374696E672029 +S1230CA048656C6C6F20312E3020496E7374616C6C6572001E0000000500000054657374FC +S1230CC0000000001E0000000A000000496E7374616C6C65720000001E00000026000000F6 +S1230CE054686973206973206120746573742066696C6520746F2063726561746520616EB5 +S1230D00206D73692E0000001E0000000B000000496E74656C3B3130333300001E000000F3 +S1230D20270000007B44414133383442302D323644372D344433342D423630452D42393424 +S1230D403341443437333446387D00004000000080CFB65C664CD9014000000080CFB65C3C +S1230D60664CD901030000006400000003000000020000001E0000000F0000006D7369748D +S1230D806F6F6C7320302E313031000003000000020000000000000000000000000000007D +S1230DA000000000000000000000000000000000000000000000000000000000000000002F +S1230DC04D53434600000000A80A0000000000002C00000000000000030101000100000002 +S1230DE0000000004200000001000100F83F00000000000000005C561DBF200048656C6C41 +S1230E006F001C7484C95E0AF83F434BED5B6F6C14C7159F5DDBE77330F8EC60624C032EBE +S1230E2025510878EDB30D31092E67ECB3EF1A1B1C6CA7346A98ACEFD6BEADEE8F7BB797F2 +S1230E40D8A8A46E9C56B6081269DA8446F9E04A6DD3AA5545D47C2052944069C89FA61565 +S1230E607CA844545522558988445B434B44DA94ED9B9D99BBDDF12D2148FD50695FB4BC94 +S1230E8079BF79EFCD9B7F9B59DF9B6F8607FA6449429CCAD01711911602540E31BCB3B3B8 +S1230EA0A00258275A0EFFAE436B910FE4729B9EC8CFCA4EEE2FB443ED1ACAA82CF2CF21D1 +S1230EC027976CBC1CB9D3B14A274781A25D854D16F936D9C9ED76567B4D0C17F876C9C93A +S1230EE0ED76646CE69AA93CD72570D6CEE932A79DCCEC1698DD42979323D9C9F97896B3B9 +S1230F00A793F913792B7272D12EC1F444DE8B9C9C8FFDF079237E33ED0D31BBEA262A8BF2 +S1230F20DCADBD07C0CE876E9CF8F4EE61EDB9CDC394ECE47C1A5B92FAD8D68E9664BC39C4 +S1230F40A9A7F353CD539D5B9BB77628B98CD256888B844CD654FFAE51321DC709C6A75398 +S1230F609EA132F747CA2B593DD11F7EEBDD1F64B6CF0C76FE6A5FD3F7DFE979FEFDE75F60 +S1230F80A92867714B4C07317D3EE58895AB50717D21F4B455AE62F5A7B5DFA7EA8F54F766 +S1230FA0B88DCB9BF0D495C0DF73C1F7B9E0CFBAE024FEA612B8E4826F76C1FB5CFC1F83CA +S1230FC0677D09FC97F0D4A246140AB138F8C0633C91CAA471CE50B306C608474706715C0D +S1230FE0CB6A137ACED0B223833DC94C5A1B51C7921AAD2B5DF3D0AE61A353CFE4F0989AD8 +S1231000D33AA269DDE80D861F057CD848E6A2C34630184BA8596C6455DDC84563E1F01E16 +S1231020C0DA41598FE14CCEC86A6A2A1A1BC1E1E12D78E8FE58297F3DDC5F472C93372010 +S1231040ECD8948AC7F5B49AD4F7430018D6638CF522A5EA69A6A01ADA946E20A8CC19F1CC +S1231060D8A64D64816E25628C96FA07A23B7BF6EEC5ED4A072DE336A5BD586C53B620B21E +S1231080C664589FE53047E4BF724B22A50F6CF3696CFCAE9FAC62B3309F32BA828AFBECAD +S12310A0E5A79FF5114FCB248AE51BF52AB25A57B179E0FB8DBF07666A293F2CE0756CD262 +S12310C08F087888E9FB434E9CCBA777504EF604DF0B84CEDA70C9869FB3E11536FC820D05 +S12310E0B7BF6F166D78A50DBF6AC3FD369CAF43E2FB161B7E8CE9131FF67D7DDC8697D9B8 +S1231100F0B76CF8F5FEBFE791471E79E491471E7974A3F48F9AB5FF8ACC5EF4470E56BC6E +S1231120D78250E4DBC70DD93C1D99FD8DFFA4556F6E7902E0CBE61DB3C06AD659FA0952BB +S123114071F9C3F74DD33C6CC992259F29C8B2259FE032586B96752F6D0FE42E41DE22C873 +S1231160CD7639F8D7E8FC997D91F93F4766FFB23834120E1E0FBE1D39D4F50E09AFFE564F +S1231180D0FCE7B852B3EE492B5EC0B7917E1CAA68236CDB55A31EBAF69142BB56659EABA5 +S12311A0593743F44E320EFA5596FE1699B08DD722F38B91137FDB113971B52C229D8A9C11 +S12311C0B966AC04076F30077EF3DCB81517B727F1CD745590CFDCFCA6D1C86CD77E8578C5 +S12311E09D3F6F54470E76FD04840B1F5F33CD0B71188C53157F8236A487C1D661FFE1634E +S123120050490AA360079311983FF049643EBF089D50571067A7A0F40C8960FECD0BBF057B +S12312206FE42308BD7D523099CF5F9D3DF08994BFEF5B07AE9A704ECFB78159AA859AFD86 +S123124008CC40ACB7BCFC1A4A232DD4F3C18A4BCD54450595C345AFAF111FAF93A9BDF01C +S12312600CC4F7F0C9E25A29AC0E8F3CF2C8238F3CF2C8238F3CF2C8238FFE5F88FC8E13C2 +S1231280D192C9CC2D505E53765F08D1DF1A562E9AA6017C04F80BC0E3C05F06FE3DE05FF3 +S12312A0057EE09269BE0BFC28F08BC07D974DB35AA2BF715A7EF7EF41D254405A535DE90C +S12312C03FCC70F25B7E2BD8DF49147A2BAD9F8E36C0D301CF91BF9B26691BAD08F4AD681A +S12312E0F852CDB2C7FC336847E3BD77B76FB07EEE23F6A4DDA3A0C77F73E23889F3A780D0 +S1231300B7DA70D2D653F0FC0CDA6B27407845E03B72CF72DFD7202056FF0B785E85FA07EC +S1231320EDF5F2A0A540EA49FF2E43FD6A7BFD10B5F7C8238F3CF2C8238F3CF2C8238F3C0C +S1231340BA59E2F9703CFF8DE7BBF19CB50F9053BEC2783577C03E8A96337133F3B39AC9EB +S12313603CFF6E8D531D3532CEF3ED78BE35FFC6B972CDCC107E9425A5F15CB9732C198D83 +S1231380E7C89D65F53CD76D3D0B7419931B18AF474EE2B96E0B2CCF8DE7C44518E7DF9347 +S12313A03CE7EE36C6272B9D78C2E78CDBCFDAE7B980BCFDB5C8A9F76F93F64F62D0352632 +S12313C037307F2693795C8B5C66F51F33F97F959B57C8FB16A895E7E7333E1428AD77A3AA +S12313E0C4F328FB7B7AEE6DBA6B742C9F36F24DC1A0D2AEB43607F396187CBCAD4D69EDEB +S1231400D8C8E0EBFBA379F3974C11A7B9CBE5E82936F14D0CBFD5459FCC970CABF5B4D0B3 +S1231420BF2686A35A27DECEF0908047AD761BD15077313E42A356795561FD73FA06F333E1 +S123144023F899B3F4EB0BFB89D38B2EF1BFC4DA7D4068F738F3FF2AF3FF20C317195E27DF +S1231460EC5FB7F1299788CF95A8F3F3624D69FD3A897AE3F9F69CEEB0FCDCB664BD2916EF +S1231480DE50D89F9C7AAD3CDFD5281072E29B653237AB8B174018DD2F91A9AA2B4C38DFD8 +S12314A02F0F49A5F3B949E075D0C23C1B9F7686E7891F797561BD727A02F03AB9B6F0DE3E +S12314C0E3342795CE23FFB10BDE2AD376F9FD973B19FE9A8BBE4CF4E5EAE20B95915FA64F +S12314E0718AE3B3522E9DA77EB74CC7531CB77B2CBC11EDED76E2DB192EFA8FC8A5E34C38 +S1231500CAA5F3ECE75CF0E75CF0975CFCA3E158D6082A1984B13AA663439D4000E48CFC23 +S1231520F8B81243C5847B6CA4708C24D6E740339EC113C9CC989AC4712393CD61353F8533 +S12315406299D4645233B438BC614A6A90A4781DABD9AC3A8DB5B4919D46E35935A5E17806 +S12315603E959A06139B8441D370A826C89F3A95D8E4A4956A3FD089B19E214A20760431BE +S1231580C9AF37F49865A693C47B903269ACA6E338AEE58C6C3E66C9ADBA8E70FFC0EE9DF0 +S12315A0DD0360921FC3519E92DFB7A77B308CC3BB7AC94D03DCBF6B1487230C8CF4EE41EE +S12315C0B8F72BBBBA07A33D05EBDD7D7DC3E1113CD2BD73200C165A5C355484A3BB219003 +S12315E0B89EC6F99C16176E0284ECA9FB303EB90C4E407CE48E021997A5170542B6B47F38 +S1231600FB9D01A7A39BBBC710B25F2FC0741CF1C8600F1F017E9BC1A987492F6984D0E5BA +S123162034E9E1582EC781D237239C1EAE7787A3C4758FCF72A5C3D1105272D329431D0330 +S12316406E64294FF0929E068F934849670C4D9948E795C96C6652CB1AD336682CAF27E31E +S1231660CD7A9C41DD3BA3CD64635875093597404A7C3A0D4D506E6469CDA35A3607CBCC8E +S12316802160A8CB6A499528B2D264D22051C09893A2329161859C16430A4C3188D68A50CD +S12316A0B2196B59295A82ED8D443C5B94A80FBA49A8052F43536A4A0767D41CE60829B0A4 +S12316C03B53B0934ABD003E1B91732879F5F17395DBFD3F4E92207F0139EF50B8DD3FE37C +S12316E024FECD7EAB602FDE7BDB20E88BE7BBA860CFCF33E2B9C6CDFECBF07C0467476E7A +S1231700CFCFD79CDFC5707EBE16E357113D5B737B7EFEE69C9F7F498C92CD9E9F8375E414 +S1231720BC5BC6CFF39CAF17065C1CFFAF237A362E5C47F439F92A217EE1DA227A1CD1B3EE +S12317407661FE7D4E3E848AF1CB6869FF0F213AA685F9F33939EFBF387EBCFFCF31FB9D63 +S12317604CE6DF139CF3EF0F1FB311ED7F88EC77F0D092FBA4FC3B8B9338FF2F08F64D0182 +S1231780270F09FAE2B5D51705FB47024E2E7E0E88F64705FBC980938BFB47B47F45B0E7BB +S12317A0E725CE0F0A0B468CE775C19E9FDB385F2EE88BE3F70672BE3FC47BB9CB047DD184 +S12317C0FE7782BDDB3D5437FB3F0AF6434D4E7E51D017D7EF797856A0E2F76FE15E2ABBC7 +S12317E0A72A8E975FE097E0A9B1D9F3EF9723CDA5DB13EDFF83E8D817BEBFF93D6366CF79 +S12318003B5629D8F1B87E8E68FFC5EFF78516CA1FF994F67D92D3BEB0E05B9DED88F69C35 +S1231820AAD9073BB72F9CA7997D83B0FE424E11D5B2F697AC73066C1270A90497D1520A36 +S1231840317B3F5B30B723FA370FF1FD51859CF7FC38453A28FF83E05C7CFFD6BAD8DF7EC4 +S12318600FE58D9FF2FEFE2F00000000000000000000000000000000000000000000000027 +S12318801B001C001D004900000000000000000020838483E88314850000000000000000F9 +S12318A0000000000000000000000000000000000000000000000000000000000000000024 +S12318C03300550080008100800033008100000033003900820083000000000000000000D6 +S12318E00000000000000000000000000000000000000000000000000000000000000000E4 +S12319001B001C001D001E001F00230028007B00000000000000000000000000000000006C +S123192020838483E8837885DC85A08FC8993C8F00000000000000000000000000000000D5 +S12319404E000080F52CD43C72CB46CFE9AA53441301819C000000000000000000000000D7 +S1231960000000000000000000000000000000000000000000000000000000000000000063 +S12319800180010000806E006F000000000000000000000000000000000000000000000064 +S12319A0000000000000000000000000000000000000000000000000000000000000000023 +S12319C02C0054005500008000004E00000000000000000000000000000000000000000060 +S12319E00000000000000000000000000000000000000000000000000000000000000000E3 +S1231A004E002C004F00F83F0080000000000082010000800000000000000000000000003F +S1231A200000000000000000000000000000000000000000000000000000000000000000A2 +S1231A401A001B001C001D00490000000000000000000000BC8220838483E88314850000DF +S1231A60000000000000000000000000000000000000000000000000000000000000000062 +S1231A802B0000000000000002800180000000800000000000000000000000000000000094 +S1231AA0000000000000000000000000000000000000000000000000000000000000000022 +S1231AC0300032003400360038003A003C00310033003500370039003B003D000000000007 +S1231AE00000000000000000000000000000000000000000000000000000000000000000E2 +S1231B001B001D001E001F0026002700280000000000000000000000000000002083E883C9 +S1231B207885DC859C980099C8990000000000000000000000000000000000000000000015 +S1231B402B002C00000000000000000000000000000000000000000000000000000000002A +S1231B60000000000000000000000000000000000000000000000000000000000000000061 +S1231B801A001B001C001D001E001F00200021002200230024002500260027002800000052 +S1231BA000000000000000000000000000000000000000000000000000000000BC82208340 +S1231BC08483E8837885DC8540860887AC8DA08F7097D4979C980099C899000000000000D4 +S1231BE00000000000000000000000000000000000000000000000000000000000000000E1 +S1231C0001000100010001000100010007000700070007000700070007000700070010006B +S1231C20100012001200120012001200160016001600290029002D002D002D002E002E00BF +S1231C403E003E003E003E003E003E003E003E00460046004800480048004A004A004A004E +S1231C604A004A004A004A004A005000500051005100510051005100510056005600560066 +S1231C8056005600560056005600560056005600560056005F005F005F005F005F006400A5 +S1231CA0640064006400640064006400690069006900690069006900700070007000700092 +S1231CC07000700077007700790079007A007A007A007C007C007D007D007D00840084005B +S1231CE08400840084008700870087008800880088008800880088008B008B008B008B0063 +S1231D008B008B008B008B008B008B008B008B008B008B008B008B00018002800380048031 +S1231D2005800680018002800380048005800680078008800980018002800180028003805E +S1231D4004800580018002800380018002800180028003800180028001800280038004805A +S1231D60058006800780088001800280018002800380018002800380048005800680078020 +S1231D80088001800280018002800380048005800680018002800380048005800680078003 +S1231DA0088009800A800B800C800D800180028003800480058001800280038004800580C2 +S1231DC00680078001800280038004800580068001800280038004800580068001800280C5 +S1231DE00180028001800280038001800280018002800380018002800380048005800180BD +S1231E00028003800180028003800480058006800180028003800480058006800780088080 +S1231E2009800A800B800C800D800E800F8010800100020003000400050006000700080016 +S1231E4009000A000B000C000D000E000F0010001100130006000800140015001700180090 +S1231E6019002A0006001700180019002E002F003E003F0040004100420043004400450064 +S1231E802E0047001700180019004A00060008004B004C004D00450019001800410051003D +S1231EA052004400450018005300560002005700580059005A005B005C005D005E000400A8 +S1231EC006004100170060006100620063003C00650066004D004500670068006A006B00DD +S1231EE030006C006D0061007100720073007400750076000200780002007800170018009C +S1231F001900440006007D007E007F004700850086000200600017001800190088008500D7 +S1231F20860002002F0006008B004400020006006200040041008C008D008E008F0090009C +S1231F40910092009300940048ADFF8F0285FF9F0295488D48ADFF8D149D149D0491049112 +S1231F6004910491FF9D02A5009F48AD488DFF9F488D028548ADFF9D029526AD48AD48ADA8 +S1231F80FF9D029548AD008F26AD269D409FFF9F02950285489D028548AD48AD48ADFF9D6E +S1231FA0029548AD488DFF8F0481489D149D02950481FFADFF8F48AD269D488D0285FF9D0D +S1231FC0489D48ADFF8DFF9F048104810481FF9DFF9DFF9DFF9DFF9D488DFF9F48AD02856F +S1231FE0489DFF9D049126AD14BD14BDFFBD04A1FF9D488D02A50481409FFF9D209D489D37 +S123200048AD0285048104810481048148AD008948AD008948ADFF9D029548AD48AD48AD29 +S1232020489DFF8F48AD0285FF8DFF9D029548ADFF9D029548AD0285FF8FFF9F009F488DAA +S123204048AD488D808F488D488DFF9DFF9F0295489D02950295489DFF9D0295FF9D0295CA +S123206000000000000000000000000000000000000000000000000000000000000000005C +S12320800100070010001200160029002D002E003E00460048004A005000510056005F000C +S12320A0640069007000770079007A007C007D008400870088008B0000000000000000005E +S12320C00000000000000000000000000000000000000000000000000000000000000000FC +S12320E00000000000000000000000000000000000000000000000000000000000000000DC +S12321000000000000000000000000000000000000000000000000000000000000000000BB +S123212000000000000000000000000000000000000000000000000000000000000000009B +S123214000000000000000000000000000000000000000000000000000000000000000007B +S123216000000000000000000000000000000000000000000000000000000000000000005B +S123218000000000000000000000000000000000000000000000000000000000000000003B +S12321A000000000000000000000000000000000000000000000000000000000000000001B +S12321C00000000000000000000000000000000000000000000000000000000000000000FB +S12321E00000000000000000000000000000000000000000000000000000000000000000DB +S1232200010000000200000003000000040000000500000006000000070000000800000096 +S1232220090000000A0000000B0000000C0000000D0000000E0000000F0000001000000036 +S12322401100000012000000130000001400000015000000160000001700000018000000D6 +S1232260FEFFFFFF1A0000001B0000001C0000001D0000001E0000001F0000002000000094 +S1232280210000002200000023000000240000002500000026000000FEFFFFFF2800000042 +S12322A0290000002A0000002B0000002C0000002D0000002E000000FEFFFFFF30000000EA +S12322C0310000003200000033000000340000003500000036000000370000003800000056 +S12322E0390000003A0000003B0000003C0000003D0000003E0000003F00000040000000F6 +S1232300410000004200000043000000440000004500000046000000470000004800000095 +S1232320490000004A0000004B0000004C0000004D0000004E0000004F0000005000000035 +S12323405100000052000000530000005400000055000000560000005700000058000000D5 +S123236059000000FEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFF23 +S1232380FEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFF67000000FEFFFFFFF5 +S12323A0690000006A0000006B0000006C0000006D0000006E0000006F00000070000000B5 +S12323C0710000007200000073000000740000007500000076000000770000007800000055 +S12323E079000000FEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +S123240052006F006F007400200045006E00740072007900000000000000000000000000E2 +S1232420000000000000000000000000000000000000000000000000000000000000000098 +S123244016000501FFFFFFFFFFFFFFFF0B00000084100C0000000000C000000000000046B3 +S1232460000000000000000000000000000000000000000000000000C01E0000000000007A +S123248040483F3F77456C446A3BE44524480000000000000000000000000000000000008C +S12324A0000000000000000000000000000000000000000000000000000000000000000018 +S12324C010000201FFFFFFFF02000000FFFFFFFF00000000000000000000000000000000EB +S12324E00000000000000000000000000000000000000000000000002A06000000000000A8 +S123250040483F3F77456C446A3EB2442F4800000000000000000000000000000000000030 +S1232520000000000000000000000000000000000000000000000000000000000000000097 +S123254010000201FFFFFFFF08000000FFFFFFFF0000000000000000000000000000000064 +S12325600000000000000000000000000000000000000000190000004403000000000000F7 +S12325800500530075006D006D0061007200790049006E0066006F0072006D006100740004 +S12325A069006F006E000000000000000000000000000000000000000000000000000000D1 +S12325C028000201FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000D8 +S12325E0000000000000000000000000000000000000000027000000D401000000000000DB +S12326001C41F0442F42BE4164410000000000000000000000000000000000000000000010 +S1232620000000000000000000000000000000000000000000000000000000000000000096 +S12326400C000201FFFFFFFF12000000FFFFFFFF000000000000000000000000000000005D +S123266000000000000000000000000000000000000000002F000000A80A00000000000075 +S12326804048CA413043B13F123F28453842B14128480000000000000000000000000000A6 +S12326A0000000000000000000000000000000000000000000000000000000000000000016 +S12326C014000201FFFFFFFF10000000FFFFFFFF00000000000000000000000000000000D7 +S12326E000000000000000000000000000000000000000005A000000180000000000000064 +S123270040480D433542E64572453C48000000000000000000000000000000000000000000 +S1232720000000000000000000000000000000000000000000000000000000000000000095 +S12327400E000201FFFFFFFF0A000000FFFFFFFF0000000000000000000000000000000062 +S123276000000000000000000000000000000000000000005B0000001800000000000000E2 +S12327804048CA413043B13B3B42264637421C4234466844264200000000000000000000F5 +S12327A0000000000000000000000000000000000000000000000000000000000000000015 +S12327C018000201FFFFFFFF0F000000FFFFFFFF00000000000000000000000000000000D3 +S12327E000000000000000000000000000000000000000005C000000300000000000000049 +S123280040489645EC3BEC43683CA4452B48000000000000000000000000000000000000FB +S1232820000000000000000000000000000000000000000000000000000000000000000094 +S123284010000201FFFFFFFF05000000FFFFFFFF0000000000000000000000000000000064 +S123286000000000000000000000000000000000000000005D0000001400000000000000E3 +S123288040481642274324480000000000000000000000000000000000000000000000007E +S12328A0000000000000000000000000000000000000000000000000000000000000000014 +S12328C00A000201FFFFFFFF04000000FFFFFFFF00000000000000000000000000000000EB +S12328E000000000000000000000000000000000000000005E0000000E0000000000000068 +S123290040488C44F044724468443748000000000000000000000000000000000000000046 +S1232920000000000000000000000000000000000000000000000000000000000000000093 +S12329400E000201FFFFFFFF01000000FFFFFFFF0000000000000000000000000000000069 +S123296000000000000000000000000000000000000000005F0000000C00000000000000E8 +S123298040480F432F420000000000000000000000000000000000000000000000000000E8 +S12329A0000000000000000000000000000000000000000000000000000000000000000013 +S12329C008000201FFFFFFFF09000000FFFFFFFF00000000000000000000000000000000E7 +S12329E000000000000000000000000000000000000000006000000014000000000000005F +S1232A0040485244F645E443AF3F123F28453842B1412848000000000000000000000000AA +S1232A20000000000000000000000000000000000000000000000000000000000000000092 +S1232A4016000201FFFFFFFF07000000FFFFFFFF000000000000000000000000000000005A +S1232A600000000000000000000000000000000000000000610000001E00000000000000D3 +S1232A8040480F42E445784528480000000000000000000000000000000000000000000003 +S1232AA0000000000000000000000000000000000000000000000000000000000000000012 +S1232AC00C000201FFFFFFFF0E000000FFFFFFFF00000000000000000000000000000000DD +S1232AE0000000000000000000000000000000000000000062000000100000000000000060 +S1232B0040485945F24468453747000000000000000000000000000000000000000000002A +S1232B20000000000000000000000000000000000000000000000000000000000000000091 +S1232B400C000201FFFFFFFF06000000FFFFFFFF0000000000000000000000000000000064 +S1232B600000000000000000000000000000000000000000630000001C00000000000000D2 +S1232B804048CA41F945CE46A841F845283F28453842B14128480000000000000000000076 +S1232BA0000000000000000000000000000000000000000000000000000000000000000011 +S1232BC018000201FFFFFFFF11000000FFFFFFFF00000000000000000000000000000000CD +S1232BE00000000000000000000000000000000000000000640000002A0000000000000043 +S1232C0040480F42E4457845283B3244B3443142F1453648000000000000000000000000FA +S1232C20000000000000000000000000000000000000000000000000000000000000000090 +S1232C4016000201FFFFFFFF0C000000FFFFFFFF0000000000000000000000000000000053 +S1232C600000000000000000000000000000000000000000650000000400000000000000E7 +S1232C8040485244F645E443AF3B3B42264637421C42344668442642000000000000000078 +S1232CA0000000000000000000000000000000000000000000000000000000000000000010 +S1232CC01A000201FFFFFFFF03000000FFFFFFFF00000000000000000000000000000000D8 +S1232CE00000000000000000000000000000000000000000660000005A0000000000000010 +S1232D0040483F3BF2433844B1450000000000000000000000000000000000000000000006 +S1232D2000000000000000000000000000000000000000000000000000000000000000008F +S1232D400C000201FFFFFFFF13000000FFFFFFFF0000000000000000000000000000000055 +S1232D60000000000000000000000000000000000000000068000000600400000000000083 +S1232D8040487F3F64412F4236480000000000000000000000000000000000000000000055 +S1232DA000000000000000000000000000000000000000000000000000000000000000000F +S1232DC00C000201FFFFFFFF0D000000FFFFFFFF00000000000000000000000000000000DB +S1232DE000000000000000000000000000000000000000007A00000038000000000000001D +S1232E0001000000020000000300000004000000050000000600000007000000080000008A +S1232E20090000000A0000000B0000000C0000000D0000000E0000000F000000FEFFFFFF3F +S1232E40FEFFFFFF12000000130000001400000015000000FEFFFFFFFDFFFFFFFFFFFFFF34 +S1232E60FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +S1232E80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +S1232EA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +S1232EC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +S1232EE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +S1232F00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +S1232F20FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +S1232F40FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +S1232F60FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +S1232F80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +S1232FA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +S1232FC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +S1232FE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +S50301807B diff --git a/tests/file_types/test_srec_hex_files.py b/tests/file_types/test_srec_hex_files.py new file mode 100644 index 000000000..1c2efbb5d --- /dev/null +++ b/tests/file_types/test_srec_hex_files.py @@ -0,0 +1,41 @@ +# Copyright 2025 Lawrence Livermore National Security, LLC +# See the top-level LICENSE file for details. +# +# SPDX-License-Identifier: MIT + +import os +import pathlib + +from surfactant.infoextractors.srec_hex import ( + read_hex_info, + read_srecord_info, + write_write_info_to_file, +) + +_base_path = pathlib.Path(__file__).parent.absolute() +_data_dir = os.path.join(_base_path, "..", "data", "binary") +_expected_output_loc = os.path.join(_base_path, "..", "data", "msitest_no1", "test.msi") + + +def test_srec_extract(tmp_path): + with open(tmp_path / "srec_test.bin", "wb") as f: + write_info = read_srecord_info(os.path.join(_data_dir, "test.srec")) + assert write_info is not None + assert write_write_info_to_file(f, write_info, trim_leading_zeros=False) + with open(tmp_path / "srec_test.bin", "rb") as f: + output_data = f.read() + with open(_expected_output_loc, "rb") as f: + expected_data = f.read() + assert output_data == expected_data + + +def test_hex_extract(tmp_path): + with open(tmp_path / "hex_test.bin", "wb") as f: + write_info = read_hex_info(os.path.join(_data_dir, "test.hex")) + assert write_info is not None + assert write_write_info_to_file(f, write_info, trim_leading_zeros=False) + with open(tmp_path / "hex_test.bin", "rb") as f: + output_data = f.read() + with open(_expected_output_loc, "rb") as f: + expected_data = f.read() + assert output_data == expected_data