
    ;)di                     z   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$ d	 Z%d
e&e'         de&e(e'e'f                  fdZ)dede&e(e'e	e*         f                  fdZ+	 d<de	e*         de'dz  de&e(e'dz  e	e*         f                  fdZ,de-de"fdZ. G d d          Z/ G d de/          Z0 G d d          Z1 G d de1          Z2e2e_3         G d de1          Z4d Z5 G d  d!e1          Z6 G d" d#e6          Z7e6e_3         G d$ d%e6          Z8e8e_3         G d& d'e6          Z9e9e_3         G d( d)e6          Z:e:e_3         G d* d+e6          Z;e;e_3         G d, d-e6          Z<e<e_3         G d. d/e<          Z=e=e_3         G d0 d1e6          Z>e>e_3         G d2 d3e<          Z?e?e_3         G d4 d5e6          Z@e@e_3         G d6 d7e<          ZAeAe_3         G d8 d9e<          ZBeBe_3         G d: d;          ZCdS )=    N)IO)HexRecordErrorIntelHex   )	ESPLoader)log)
ESP32C2ROM
ESP32C3ROM
ESP32C5ROM
ESP32C6ROMESP32C61ROM
ESP32H2ROMESP32H21ROM
ESP32H4ROM
ESP32P4ROMESP32ROM
ESP32S2ROM
ESP32S3ROM
ESP8266ROM)
FatalErrorbyteImageSource	get_bytespad_toc                 l    |dz
  |                                  |z  z
  }|                     |d           dS )zBAlign the position in the file to the next block of specified sizer   N)tellseek)fsizealigns      X/var/www/menimich/repos/protonApp/venv/lib/python3.11/site-packages/esptool/bin_image.pyalign_file_positionr"   &   s6    AX!&&((T/*EFF5!    	addressesreturnc                     | sg S t          |           }g }|d         }t          ||dd                   D ]'\  }}||dz   k    r|                    ||f           |}(|                    ||d         f           |S )z3Find continuous subsequences in a list of addressesr   r   N)sortedzipappend)r$   
sorted_seqsubsequencesstartprevnums         r!   _find_subsequencesr0   ,   s     		""JLqMEZ^44  	c$(??...E 
2/000r#   ihc                    t          |                                           }g }|D ]_\  }}t          j        dd          }|                     |||           |                    d           |                    ||f           `|S )zbSplit an IntelHex file into multiple temporary binary files based on the gaps
    in the addresses.binF)suffixdelete)r-   endr   )r0   r$   tempfileNamedTemporaryFile	tobinfiler   r*   )r1   r,   binsr-   r6   bins         r!   _split_intel_hex_filer<   B   s     &bllnn55L(*D" " "
s)FFF
S3///UCL!!!!Kr#   file
start_addrc                 @   d}|                      d          }|                     d           	 ||k    rKt                      }|                    | j                   |                                  t          |          S || fgS # t          t          f$ r || fgcY S w xY w)zbConvert IntelHex file to list of temp binary files
    If not hex file return input file otherwise   :r   r   )	readr   r   loadhexnamecloser<   r   UnicodeDecodeError)r=   r>   INTEL_HEX_MAGICmagicr1   s        r!   intel_hex_to_binrH   O   s    
 OIIaLLEIIaLLL
$O##BJJty!!!JJLLL(,,,&''./ $ $ $T"####$s   AB ?B BBchip
image_datac                 l   t          |          \  }}t          j        |          }t          j        dd|                                           } | dk    rt          |                    d                    }|                    d           |t          j
        k    rt          |          S |t          j        k    rt          |          S t          d|           	 t          t           t"          t$          t&          t(          t*          t,          t.          t0          t2          t4          d|          |          S )a  
    Load a firmware image. Can be for any supported SoC.

    ESP8266 images will be examined to determine if they are original ROM firmware
    images (ESP8266ROMFirmwareImage) or "v2" OTA bootloader images.

    Returns a BaseFirmwareImage subclass.
    z[-()] esp8266r   r   zInvalid image magic number: )esp32esp32s2esp32s3esp32c3esp32c2esp32c6esp32c61esp32c5esp32h2esp32h21esp32p4esp32h4)r   ioBytesIOresublowerordrA   r   r   ESP_IMAGE_MAGICESP8266ROMFirmwareImageESP8266V2FirmwareImageIMAGE_V2_MAGICr   ESP32FirmwareImageESP32S2FirmwareImageESP32S3FirmwareImageESP32C3FirmwareImageESP32C2FirmwareImageESP32C6FirmwareImageESP32C61FirmwareImageESP32C5FirmwareImageESP32H2FirmwareImageESP32H21FirmwareImageESP32P4FirmwareImageESP32H4FirmwareImage)rI   rJ   data_r   rG   s         r!   LoadFirmwareImagerr   d   s    
##GD!

4A6(B

--DyAFF1II	q			I---*1---,;;;)!,,,CECCDDD'+++++-++-++
 
    	r#   c                   D    e Zd ZdZddZd Zd Zd Zd	 Zd
 Z	d Z
d ZdS )ImageSegmentz_Wrapper class for a segment in an ESP image
    (very similar to a section in an ELFImage also)Nr      c                     || _         || _        || _        || _        || _        d| _        | j         dk    r|                     d           d S d S )NTr   ru   )addrrp   	file_offsflagsr    include_in_checksumpad_to_alignment)selfrw   rp   rx   ry   r    s         r!   __init__zImageSegment.__init__   sd    		"

#' 9>>!!     >r#   c                 .    t          || j        d          S )zNReturn a new ImageSegment with same data, but mapped at
        a new address.r   )rt   rp   )r|   new_addrs     r!   copy_with_new_addrzImageSegment.copy_with_new_addr   s     Hdi333r#   c                     t          j         |           }| j        d|         |_        | j        |d         | _        | xj        |z  c_        d| _        d|_        |S )zReturn a new ImageSegment which splits "split_len" bytes
        from the beginning of the data. Remaining bytes are kept in
        this segment object (and the start address is adjusted to match.)N)copyrp   rw   rx   )r|   	split_lenresults      r!   split_imagezImageSegment.split_image   sY     4i

+Iijj)			Y		r#   c                 r    dt          | j                  dd| j        d}| j        |d| j        dz  }|S )Nzlen #07xz load #010xz file_offs )lenrp   rw   rx   )r|   rs     r!   __repr__zImageSegment.__repr__   sL    ?3ty>>???di???>%5t~5555Ar#   c                 4      fd|j         j        D             S )zv
        Return a list describing the memory type(s) that is covered by this
        segment's start address.
        c                 b    g | ]+}|d          j         cxk    r|d         k      n n|d         ,S )r   r      rw   ).0	map_ranger|   s     r!   
<listcomp>z0ImageSegment.get_memory_type.<locals>.<listcomp>   sS     
 
 
|ty77779Q<77777 aL777r#   )
ROM_LOADER
MEMORY_MAP)r|   images   ` r!   get_memory_typezImageSegment.get_memory_type   s4    

 
 
 
"-8
 
 
 	
r#   c                 <    t          | j        |d          | _        d S N    )r   rp   )r|   	alignments     r!   r{   zImageSegment.pad_to_alignment   s    49i99			r#   c                 d    | j         t          | j                  z   }||z  }|dk    r|||z
  z  }|S )zp
        Return the segment end address as it would be if
        aligned as requested by the argument.
        r   rw   r   rp   )r|   r   end_addraddr_mods       r!   end_addr_if_alignedz ImageSegment.end_addr_if_aligned   s?    
 9s49~~-i'q==	H,,Hr#   c                 z    || j         t          | j                  z   z
  }|dk    r| xj        d|z  z  c_        dS dS )z|
        Pad the segment with `0x00` starting with segment address
        until the address given by the argument.
        r   r   Nr   )r|   rw   pads      r!   pad_until_addrzImageSegment.pad_until_addr   sE    
 di#di..0177II3&IIII 7r#   )Nr   ru   )__name__
__module____qualname____doc__r}   r   r   r   r   r{   r   r    r#   r!   rt   rt      s        7 7
 
 
 
4 4 4

 
 
  	
 	
 	
: : :	 	 	' ' ' ' 'r#   rt   c                   .     e Zd ZdZd fd	Z fdZ xZS )
ELFSectionzxWrapper class for a section in an ELF image, has a section
    name as well as the common properties of an ImageSegment.ru   c                     t                                          ||||           |                    d          | _        d S )Nry   r    zutf-8)superr}   decoderC   )r|   rC   rw   rp   ry   r    	__class__s         r!   r}   zELFSection.__init__   s;    t5>>>KK((			r#   c                 X    | j          dt                                                       S )N )rC   r   r   )r|   r   s    r!   r   zELFSection.__repr__   s)    )22egg..00222r#   )ru   )r   r   r   r   r}   r   __classcell__r   s   @r!   r   r      sb        A A) ) ) ) ) )3 3 3 3 3 3 3 3 3r#   r   c                       e Zd ZU dZdZdZdZeedf         e	d<   	 d Z
d Zd	 ZddZd Zd ZddZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )BaseFirmwareImage       r   r   .MMU_PAGE_SIZE_CONFc                 L    g | _         d| _        d | _        d| _        d| _        d S Nr   )segments
entrypoint
elf_sha256elf_sha256_offsetpad_to_sizer|   s    r!   r}   zBaseFirmwareImage.__init__   s-    !"r#   c                     t          j        d|                    d                    \  }}| _        | _        | _        ||k    rt          d|d          |S )N<BBBBIr   zInvalid firmware image magic=#x)structunpackrA   
flash_modeflash_size_freqr   r   )r|   	load_fileexpected_magicrG   r   s        r!   load_common_headerz$BaseFirmwareImage.load_common_header   sf     M(INN1$5$566	
O O N""GUGGGHHHr#   c                     t          | j                  dk    r%t          dt          | j                   d          d S )N   zInvalid segment count z: (max 16). Usually this indicates a linker script problem.)r   r   r   r   s    r!   verifyzBaseFirmwareImage.verify   sU    t}""BT]);); B B B   #"r#   Fc           
         |                                 }t          j        d|                    d                    \  }}|                     |||           |                    |          }t          |          |k     r't          d|dd| dt          |           d          t          |||          }| j        	                    |           |S )z)Load the next segment from the image file<IIr   zEnd of file reading segment r   	, length z (actual length ))
r   r   r   rA   warn_if_unusual_segmentr   r   rt   r   r*   )r|   r   is_irom_segmentrx   offsetr   segment_datasegments           r!   load_segmentzBaseFirmwareImage.load_segment  s    FFHH	uaffQii88$$VT?CCCvvd|||t##7vJ 7 74 7 7"%l"3"37 7 7   v|Y??W%%%r#   c                 l    |s/|dk    s|dk     s|dk    rt          j        d|dd|            d S d S d S )Ni   @i  ?   zSuspicious segment r   r   )r   warningr|   r   r   r   s       r!   r   z)BaseFirmwareImage.warn_if_unusual_segment  sc     	N
""fz&9&9TE\\L&LLLdLLMMMMM	N 	N=I\r#   c           	      
   t          |          }|                                }| j        |k    r| j        ||z   k     r| j        |z
  }|| j        k     s|| j        z   |k    rt          d| j         d| d| d          || j        z  }|||| j        z            d| j        z  k    rt          d| j        dd          t          | j                  | j        k    sJ |d	|         | j        z   ||| j        z   d
         z   }|S )z
        If SHA256 digest of the ELF file needs to be inserted into this segment, do so.
        Returns segment data.
        zACannot place SHA256 digest on segment boundary(elf_sha256_offset=z, file_pos=z, segment_size=r   r   z,Contents of segment at SHA256 digest offset r   z% are not zero. Refusing to overwrite.r   N)r   r   r   SEG_HEADER_LENSHA256_DIGEST_LENr   r   )r|   r   r   segment_lenfile_pospatch_offsets         r!   maybe_patch_segment_dataz*BaseFirmwareImage.maybe_patch_segment_data  s   
 ,''6688"h..&K)???  1H<L t222$"88;FF H*.*@H H (H H9DH H H   D//L\L4;Q,QQRT334 4 !--A- - -  
 t''4+AAAAAQ|^,/"|d.DDFFGH 
 r#   Nc                    |                      ||j                  }t          |          }||nd}|dz  rt          d| d|dd          d}||k    rt          d| d|dd	          |                    t          j        d
|j        |                     |                    |           |t          j	        ||          S dS )zi
        Save the next segment to the image file,
        return next checksum value if provided
        NrL      zInvalid z segment length r   z. It has to be multiple of 4.i   z$. The 16 MB limit has been exceeded.r   )
r   rp   r   r   writer   packrw   r   checksum)r|   r   r   r   segment_namer   r   
SIXTEEN_MBs           r!   save_segmentzBaseFirmwareImage.save_segmentC  s   
 44QEE,'''3'?||R? 	.< . .K . . .   
*$$5< 5 5K 5 5 5   	
E7<==>>>	%lH===  r#   c                 "   | j         j        dk    rW|                                t          |j                  z   | j        z   }|| j        z  }|dk     r|xj        dd|z
  z  z  c_        t          |dd          }|                     ||||          S )za
        Save the next segment to the image file, return next checksum value if provided
        ESP32$   r   rC   N)	r   	CHIP_NAMEr   r   rp   r   
IROM_ALIGNgetattrr   )r|   r   r   r   segment_end_possegment_len_remainderr   s          r!   save_flash_segmentz$BaseFirmwareImage.save_flash_segment[  s     ?$//  ffhhW\):)::T=PPO$3do$E!$t++42G+G HHw55  GX|DDDr#   c                 f    t          |d           t          |                    d                    S )z5Return ESPLoader checksum from end of just-read imager   r   )r"   r_   rA   )r|   r   s     r!   read_checksumzBaseFirmwareImage.read_checksumj  s*     	Ar"""166!99~~r#   c                 t    t           j        }| j        D ]#}|j        rt          j        |j        |          }$|S )za
        Calculate checksum of loaded image, based on segments in
        segment array.
        )r   ESP_CHECKSUM_MAGICr   rz   r   rp   )r|   r   segs      r!   calculate_checksumz$BaseFirmwareImage.calculate_checksumq  sE    
 /= 	B 	BC& B$-chAAr#   c                 v    t          |d           |                    t          j        d|                     dS )z3Append ESPLoader checksum to the just-written imager      BN)r"   r   r   r   )r|   r   r   s      r!   append_checksumz!BaseFirmwareImage.append_checksum|  s6    Ar"""	D(++,,,,,r#   c           
          |                     t          j        dt          j        t          |          | j        | j        | j                             d S )Nr   )	r   r   r   r   r`   r   r   r   r   )r|   r   r   s      r!   write_common_headerz%BaseFirmwareImage.write_common_header  sS    	K)H$ 		
 		
 		
 		
 		
r#   c                 J    t           j        |cxk    ot           j        k     nc S )zg
        Returns True if an address starts in the irom region.
        Valid for ESP8266 only.
        )r   IROM_MAP_STARTIROM_MAP_ENDr|   rw   s     r!   is_irom_addrzBaseFirmwareImage.is_irom_addr  s,    
 (DJJJJ:3JJJJJJr#   c                       fd j         D             }t          |          dk    r;t          |          dk    r t          dt          |           d          |d         S d S )Nc                 H    g | ]}                     |j                  |S r   )r  rw   r   sr|   s     r!   r   z6BaseFirmwareImage.get_irom_segment.<locals>.<listcomp>  s.    OOOqT5F5Fqv5N5NOOOOr#   r   r   zFound z, segments that could be irom0. Bad ELF file?)r   r   r   )r|   irom_segmentss   ` r!   get_irom_segmentz"BaseFirmwareImage.get_irom_segment  s    OOOODMOOO}!!=!!Q&& $S// $ $ $   !##tr#   c                 R    |                                  fd| j        D             S )Nc                      g | ]
}|k    |S r   r   )r   r  irom_segments     r!   r   z;BaseFirmwareImage.get_non_irom_segments.<locals>.<listcomp>  s#    >>>aA,=,=,=,=,=r#   )r  r   )r|   r  s    @r!   get_non_irom_segmentsz'BaseFirmwareImage.get_non_irom_segments  s0    ,,..>>>>4=>>>>r#   c                 P    | j         sd S t          | j         d           | _         d S )Nc                     | j         S Nr   r  s    r!   <lambda>z1BaseFirmwareImage.sort_segments.<locals>.<lambda>  s    AF r#   key)r   r(   r   s    r!   sort_segmentszBaseFirmwareImage.sort_segments  s/    } 	Ft}2B2BCCCr#   c           
         | j         sd S g }t          t          | j                   dz
  dd          D ]t}| j         |dz
           }| j         |         }| j        t          k    r| j        r|                    |j                  }||j        t          |j	                  z   k    ri||j        k    r^t          j        d|j        |j        t          |j	                  z   z
   d|j         d|j                    |                    |           t          |                    |           |                    |           k    |j        |j        k    |j        |j        t          |j	                  z   k    f          r|xj	        |j	        z  c_	        ^|                    d|           v|                    d| j         d                    || _         d S )Nr   r   r'   z
Inserting z bytes padding between z and )r   ranger   r   r   ram_only_headerr   r    rw   rp   r   noterC   r   allr   rz   insert)r|   r   ielem	next_elemelem_pad_addrs         r!   merge_adjacent_segmentsz)BaseFirmwareImage.merge_adjacent_segments  s   } 	Fs4=))A-q"55 (	. (	.A =Q'Da(I *,,1E, $ 8 8 I I "TYTY%???%77HRY^ty3ty>>7Q%R R R15R RAJR R   ''666((..)2K2KD2Q2QQ,	0MMNdi#di..&@@  . 		Y^+			 9---- 	4=+,,, !r#   c                 \   | j         sG|| j        k    r<t          j        | j        dk    rd| j        j         d| j        dz   dnd           dS | j         rO|| j         vrFd                    d | j         D                       }t          | d	| j        j         d
| d          || _        dS )z=Set the MMU page size for the image if supported by the chip.r   z+Changing MMU page size is not supported on z! Defaulting to    zKB.rL   z, c              3   &   K   | ]}|d z   dV  dS )r!  KBNr   )r   xs     r!   	<genexpr>z6BaseFirmwareImage.set_mmu_page_size.<locals>.<genexpr>  s/      #V#VqDy$4$4$4#V#V#V#V#V#Vr#   z bytes is not a valid z page size, select from .N)r   r   r   r   r   r   joinr   )r|   r   valid_sizess      r!   set_mmu_page_sizez#BaseFirmwareImage.set_mmu_page_size  s   & 	#44?+B+B K ?a''0?,0 0?d*0 0 0 0      $ 		#T5L)L)L ))#V#Vd>U#V#V#VVVK . .t/H . .*. . .  
 #DOOOr#   )F)NNr  )r   r   r   r   r   r   r   tupleint__annotations__r}   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r)  r   r#   r!   r   r      sn        NJ*,c3h,,,;         N N N
) ) )V> > > >0E E E E  	 	 	- - -


 

 

K K K	 	 	? ? ?D D D
8! 8! 8!t# # # # #r#   r   c                   `     e Zd ZdZeZd fd	Zd Zdedz  de	e
dz  e
f         dz  fdZ xZS )	ra   zK'Version 1' firmware image, segments loaded directly by the ROM bootloader.Nc                 d   t                                                       d| _        d| _        d| _        |w|                     |t          j                  }t          |          D ]}| 	                    |           | 
                    |          | _        |                                  d S d S )Nr   r   )r   r}   r   r   versionr   r   r`   r  r   r   r   r   )r|   r   r   rq   r   s       r!   r}   z ESP8266ROMFirmwareImage.__init__  s      ..y):STTH8__ - -!!),,,, ..y99DMKKMMMMM ! r#   c                     |dz   S )/Derive a default output name from the ELF name.-r   r|   
input_files     r!   default_output_namez+ESP8266ROMFirmwareImage.default_output_name  s    Cr#   filenamer%   c                    d }d }|                                  }||j        }t          j                    5 }|                                 }|                     ||           t          j        }|D ]}|                     |||          }| 	                    ||           |
                                }d d d            n# 1 swxY w Y   ||W|j        t          j        z
  }	t          | |	ddd          5 }|                    |           d d d            n# 1 swxY w Y   |Ct          | dddd          5 }|                    |           d d d            n# 1 swxY w Y   d S ||fS )Nr   r3   wbr   )r  rp   rZ   r[   r  r   r   r   r   r   getvaluerw   r   r   openr   )
r|   r6  	irom_data
other_datar  r   normal_segmentsr   r   r   s
             r!   savezESP8266ROMFirmwareImage.save  sI   "&	#'
 ,,..#$)I Z\\ 	&Q"88::O$$Q888 3H* C C,,QBB  H---J	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& $%*Z-FFX8v8888$?? '1GGI&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' %X3q3333T:: (aGGJ'''( ( ( ( ( ( ( ( ( ( ( ( ( ( (4z**s6   A=B>>CC7DD D<EE"%E"r  )r   r   r   r   r   r   r}   r5  strr*  bytesr>  r   r   s   @r!   ra   ra     s        UUJ           +S4Z  +E%$,2E,F,M  +  +  +  +  +  +  +  +r#   ra   c                   R     e Zd ZdZeZdZdZd
 fd	Zd Z	de
dz  dedz  fd	Z xZS )rb   zs'Version 2' firmware image, segments loaded by software bootloader stub
    (ie Espressif bootloader or rboot)
       ru   Nc                 F   t                                                       d| _        |u|                     || j                  }|| j        k    rt          j        d| d           |                     |d          }d|_	        d|_
        | j        }| j        }| j        }|                     |t          j                  }|| j        k    r"t          j        d|dd	| j        dd
           || j        k    r"t          j        d|dd	| j        dd
           || j        k    r"t          j        d|dd| j        dd
           t!          |          D ]}|                     |           |                     |          | _        |                                  d S d S )Nr   z)V2 header has unexpected "segment" count z (usually 4)Tr   Fz"Flash mode value in first header (#04xz) disagrees with second (z). Using second value.z'Flash size/freq value in first header (z$Entrypoint address in first header (r   z ) disagrees with second header ()r   r}   r/  r   rc   IMAGE_V2_SEGMENTr   r   r   rw   rz   r   r   r   r   r`   r  r   r   r   )	r|   r   r   r  first_flash_modefirst_flash_size_freqfirst_entrypointrq   r   s	           r!   r}   zESP8266V2FirmwareImage.__init__E  s    ..y$:MNNH4000 VVVV    ,,Y==L !L/4L,#$($8!# ..y):STTH4?22*9IR * *.2oG* * *  
 %(<<<J-LJ J,IJ J J  
  4?22*;KU * *59_O* * *   8__ - -!!),,,, ..y99DMKKMMMMMc ! r#   c                     |                                  }||j        t          j        z
  }nd}t          j        dz
   }t          j                            |          d          d||z  ddS )r1  Nr   r   r2  r   r3   )	r  rw   r   r   r   FLASH_SECTOR_SIZEospathsplitext)r|   r4  r  	irom_offssector_masks        r!   r5  z*ESP8266V2FirmwareImage.default_output_name{  st    ,,..#$)J,EEIII!3a78'"":..q1VVI4KVVVVVr#   r6  r%   c                    t          j                    5 }|                    t          j        d| j        | j        | j        | j        | j	                             | 
                                }|@|                    d          }|                    d           |                     ||           |                                 }|                     ||           t           j        }|D ]}|                     |||          }|                     ||           |                    d           t)          |                                          }|                    t          j        d|                     |]t-          |d          5 }|                    |                                           d d d            n# 1 swxY w Y   	 d d d            d S |                                cd d d            S # 1 swxY w Y   d S )Ns   <BBBBIr   r   s   <Ir8  )rZ   r[   r   r   r   rc   rE  r   r   r   r  r   r{   r   r  r   r   r   r   r   esp8266_crc32rA   r:  r9  )	r|   r6  r   r  r=  r   r   crc	real_files	            r!   r>  zESP8266V2FirmwareImage.save  s   Z\\ *	$QGG')O(O 	 	 	  0022L'+>>qAA--   !!!\222 #88::O$$Q888 3H* C C,,QBB  H--- FF1III))CGGFKs++,,,#(D)) 2YOOAJJLL1112 2 2 2 2 2 2 2 2 2 2 2 2 2 2O*	$ *	$ *	$ *	$ *	$ *	$ *	$ *	$T zz||U*	$ *	$ *	$ *	$ *	$ *	$ *	$ *	$ *	$ *	$ *	$ *	$ *	$ *	$ *	$ *	$ *	$ *	$s<   E4G5(F<0G5<G 	 G5G 	G5G55G9<G9r  )r   r   r   r   r   r   rc   rE  r}   r5  r?  r@  r>  r   r   s   @r!   rb   rb   8  s          JN 4 4 4 4 4 4lW W W+$S4Z +$EDL +$ +$ +$ +$ +$ +$ +$ +$r#   rb   c                 P    t          j        | d          dz  }|dz  r|dz  S |dz   S )zJ
    CRC32 algorithm used by 8266 SDK bootloader (and gen_appbin.py).
    r   l    l        r   )binasciicrc32)rp   rR  s     r!   rQ  rQ    s;     .q
!
!J
.C
Z ZQwr#   c                        e Zd ZU dZeZee         ed<   dZ	dZ
dZd fd		Zd
 Zd Zd Zdedz  dedz  fdZd Zd Z xZS )rd   a  ESP32 firmware image is very similar to V1 ESP8266 image,
    except with an additional 16 byte reserved header at top of image,
    and because of new flash mapping capabilities the flash-mapped regions
    can be placed in the normal image (just @ MMU page size padded offsets).
    r      z<BBBBHBHHBBBBBr   NTFc                    t                                                       d | _        d| _        d| _        d| _        | j        | _        d| _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        d| _        d| _        || _        || _        d | _        |K|                                }|                     |t.          j                  }|                     |           t5          |          D ]}|                     |           |                     |          | _        | j        r|                                }|                    d          | _        |                     |           tC          j"                    }|#                    |                    ||z
                       |$                                | _%        ||z
  | _        | &                                 d S d S )Nr   r   r   )'r   r}   
secure_padr   r   r/  WP_PIN_DISABLEDwp_pinclk_drvq_drvd_drvcs_drvhd_drvwp_drvchip_idmin_revmin_rev_fullmax_rev_fullr  append_digestdata_lengthr   r   r   r`   load_extended_headerr  r   r   r   rA   stored_digestr   hashlibsha256updatedigestcalc_digestr   )
r|   r   rg  r  r-   r   rq   r6   ro  r   s
            r!   r}   zESP32FirmwareImage.__init__  s    *

.* NN$$E..y):STTH%%i0008__ - -!!),,,, ..y99DM! /nn&&%.^^B%7%7"u%%%%n..""9>>#+#>#>???#.#5#5#7#7 #&; KKMMMMM' ! r#   c                     | j         j        |cxk    o| j         j        k     nc p#| j         j        |cxk    o| j         j        k     nc S r  )r   r   r   DROM_MAP_STARTDROM_MAP_ENDr  s     r!   is_flash_addrz ESP32FirmwareImage.is_flash_addr  s`    O*dQQQQT_5QQQQQUo,SSSSt7SSSSS	Ur#   c                 R    t           j                            |          d          dS )r1  r   r3   )rK  rL  rM  r3  s     r!   r5  z&ESP32FirmwareImage.default_output_name  s&    '"":..q17777r#   c                     d S r  r   r   s       r!   r   z*ESP32FirmwareImage.warn_if_unusual_segment  s    r#   r6  r%   c                     d}t          j                    5                       j                                                   t
          j        } fdt           j        d           D             } fdt           j        d           D             }|D ]O}t          |t                    r8|j
        dk    r-|                    |           |                    d|            nP|D ]O}t          |t                    r8|j
        dk    r-|                    |           |                    d|            nPt          |          dk    rd|d         j        }|d	d          D ]L}|j         j        z  | j        z  k    r(t!          d
|j        dd j        dz   d|dd          |j        }M fd} j        r.|D ]$}                     |||j
                  }|d	z  }%                     |           |                                 |D ]} ||          }	|	 j        j        k     r
|	 j        z  }	|	 j        j        z  }	t/          dd|	z                                            }
                     |
d |j
                   |d	z  }                                dz    j        j        z    j        z  |j         j        z  k    sJ                      |           |d	z  }ِnt          |          dk    rF|d         } ||          }	|	dk    rt          |          dk    rZ|	 j        k    rO|d                             |	          }
t          |d         j                  dk    r|                    d           n&t/          dd|	z                                            }
                     |
||j
                  }|d	z  }nc                                dz    j        z  |j         j        z  k    sJ                      ||          }|                    d           |d	z  }t          |          dk    F|D ]$}                     |||j
                  }|d	z  }% j        r j        st!          d                                           j        z    j        z  }d} j        dk    rd}n j        dk    rd} j        |z
  |z
  |z
   j        z  }	t/          dd|	z                                            }
                     |
|          }|d	z  } j        s                     |                                           } j        r||z    j        z  dk    sJ                      d	            j        r1!                    tE          t          |          g                     n#!                    tE          |g                      j        rw                     d           tG          j$                    }|%                    &                    |                     !                    |'                                            j(        rL                                }| j(        z  dk    r* j(        | j(        z  z
  }!                    d|z             |]tS          |d          5 }|!                    *                                           d d d            n# 1 swxY w Y   	 d d d            d S *                                cd d d            S # 1 swxY w Y   d S )Nr   c                 l    g | ]0}                     |j                  t          j        |          1S r   rs  rw   r   deepcopyr  s     r!   r   z+ESP32FirmwareImage.save.<locals>.<listcomp>  sI       %%af--a    r#   c                     | j         S r  r   r  s    r!   r  z)ESP32FirmwareImage.save.<locals>.<lambda>      QV r#   r  c                 l    g | ]0}                     |j                  t          j        |          1S r   rx  r  s     r!   r   z+ESP32FirmwareImage.save.<locals>.<listcomp>  sI       ))!&11a    r#   c                     | j         S r  r   r  s    r!   r  z)ESP32FirmwareImage.save.<locals>.<lambda>  r{  r#   z.flash.appdescz.dram0.bootdescr   Segment loaded at r    lands in same r!  ' KB flash mapping as segment loaded at Q. Can't generate binary. Suggest changing linker script or ELF to merge sections.c                     | j         j        z  j        z
  }j                                        j        z  z
  |z   }|dk    s|j        k    rdS |j        z  }|dk     r
|j        z  }|S r   )rw   r   r   r   )r   
align_pastpad_lenr   r|   s      r!   get_alignment_data_neededz:ESP32FirmwareImage.save.<locals>.get_alignment_data_neededE  s~     &lT_<@SS
?affhh.HIZWa<<7do#=#=1 4..Q;;t.Gr#   r   r   zIsecure_pad only applies if a SHA-256 digest is also appended to the imager   1p   2r      r8  )+rZ   r[   r   r   save_extended_headerr   r   r(   
isinstancer   rC   remover  r   rw   r   r   r  r   r   reverser   BOOTLOADER_FLASH_OFFSETrt   r   r   r   r   rp   poprZ  rg  r   r   r@  rk  rl  rm  rA   rn  r   r:  r9  )r|   r6  total_segmentsr   flash_segmentsram_segmentsr   	last_addrr  r  pad_segmentr  checksum_spacespace_after_checksumimage_lengthrn  pad_byrS  r   s   `                 @r!   r>  zESP32FirmwareImage.save	  s   Z\\ S	$Q$$Q666 %%a((( 3H   3C3CDDD  N
   3C3CDDD  L *  gz22 w|GW7W7W"))'222"))!W555E (  w
33(999 ''000 ''7333E
 >""Q&&*1-2	-abb1 - -G|t6)t:VVV(WT W W#$6W W)2SW W W   !(II     ( # ?(  , ( (G#00GXw|TTH"a'NN$$Q111 &&(((- ( (G77@@G !HHH  4?2tFFG".q'G2CQVVXX"N"NK%%adGLIII"a'NFFHHqL4?+RR 78 8 8 8 ++Aw777"a'NN-(4 .))A--,Q/G77@@G{{|,,q00Wt?R5R5R*6q/*E*Eg*N*NK"<?#788A== , 0 0 3 3 3*6q'G:KQVVXX*V*VK#'#4#4{Hgl$ $ '!+ FFHHqL O ,/6|do/M N  N  N  N $(#:#:1gx#P#P&**1---&!++ .))A--0  , ( (G#00GXw|TTH"a'NN $ ) $8    ffhh)<<O
 "$?c)) ,<((_++ ,.(Oj0>ADXXO$ +1g.?JJ,,QXFF!#' 2$$Q1116688L V%(<<OTUUUUU FF1III# 1 s<001223333~.//000! )q			 ))aff\22333((( . vvxx$"22a77!-@P1PQFGGGf,---#(D)) 2YOOAJJLL1112 2 2 2 2 2 2 2 2 2 2 2 2 2 2aS	$ S	$ S	$ S	$ S	$ S	$ S	$ S	$f zz||gS	$ S	$ S	$ S	$ S	$ S	$ S	$ S	$ S	$ S	$ S	$ S	$ S	$ S	$ S	$ S	$ S	$ S	$s<   Z1\6	([=1\6=\	\6\	\6\66\:=\:c                    d }t          t          j        | j        |                    d                              }|d         | _         ||d                   \  | _        | _         ||d                   \  | _        | _	         ||d                   \  | _
        | _        |d         | _        | j        | j        j        k    r*t          j        d| j        j         d	| j         d
           |d         | _        |d         | _        |d         | _        |d         }|dv r|dk    | _        d S t+          d|          )Nc                     | dz  | dz	  dz  fS N   ru   r   ns    r!   
split_bytez;ESP32FirmwareImage.load_extended_header.<locals>.split_byte      HqAvo..r#   r   r   r   r   r   ru   z&Unexpected chip ID in image. Expected z but value was z+. Is this image for a different chip model?         r'   r   r   AInvalid value for append_digest field (0x%02x). Should be 0 or 1.)listr   r   EXTENDED_HEADER_STRUCT_FMTrA   r\  r]  r^  r_  r`  ra  rb  rc  r   IMAGE_CHIP_IDr   r   rd  re  rf  rg  RuntimeError)r|   r   r  fieldsrg  s        r!   ri  z'ESP32FirmwareImage.load_extended_header  sb   	/ 	/ 	/ M$99>>";M;MNN
 
 Qi $.:fQi#8#8 dj",*VAY"7"7
DK#-:fQi#8#8 T[ay<4?888K9V  "&,     ay"1I"1Ir
F""!.!!3DS  r#   c                 `   d }| j         rdnd}| j         || j        | j                   || j        | j                   || j        | j                  | j        j	        | j
        | j        | j        g}|dgdz  z  }||gz  }t          j        | j        g|R  }|                    |           d S )Nc                     | dz  |dz  dz  z   S r  r   )lnhns     r!   	join_bytez:ESP32FirmwareImage.save_extended_header.<locals>.join_byte  s    I29"233r#   r   r   ru   )rg  r\  r]  r^  r_  r`  ra  rb  r   r  rd  re  rf  r   r   r  r   )r|   	save_filer  rg  r  packeds         r!   r  z'ESP32FirmwareImage.save_extended_header  s    	4 	4 	4 "/6Q KIdlDJ//Idj$+..Idk4;//O)L	
 	1#'=/!T<FvFFFr#   )NTF)r   r   r   r   r   r   typer   r,  r[  r  r   r}   rs  r5  r   r?  r@  r>  ri  r  r   r   s   @r!   rd   rd     s           #+JY*** O!>J* * * * * *XU U U
8 8 8  U$S4Z U$EDL U$ U$ U$ U$n" " "H             r#   rd   c                   >    e Zd ZdZdZd Zdedz  dedz  fdZd Z	dS )	ESP8266V3FirmwareImagez8ESP8266 V3 firmware image is very similar to ESP32 imageBBBBBBBBBBBBBBBBc                 "    |t           j        k    S r  )r   r   r  s     r!   rs  z$ESP8266V3FirmwareImage.is_flash_addr   s    j///r#   r6  Nr%   c                 8    d}t          j                    5 }                     | j                   t          j        } fdt           j        d           D             } fdt           j        d           D             }t          |          dk    rd|d         j        }|dd          D ]L}|j         j	        z  | j	        z  k    r(t          d|j        d	d
 j	        dz   d|d	d          |j        }Mt          |          dk    r|d         }t          |t                    r|j        dk    r|j        dd          |_                             |||          }|                    d           |dz  }t          |          dk    |D ]}                     |||          }|dz  }                     ||           |                                }	|                    d           |                    t+          |g                      j        rw|                    d           t/          j                    }
|
                    |                    |	                     |                    |
                                           |]t9          |d          5 }|                    |                                           d d d            n# 1 swxY w Y   	 d d d            d S |                                cd d d            S # 1 swxY w Y   d S )Nr   c                     g | ]D}                     |j                  t          |j                  0t	          j        |          ES r   rs  rw   r   rp   r   ry  r  s     r!   r   z/ESP8266V3FirmwareImage.save.<locals>.<listcomp>,  s[       %%af-- 36af++a    r#   c                     | j         S r  r   r  s    r!   r  z-ESP8266V3FirmwareImage.save.<locals>.<lambda>.  r{  r#   r  c                     g | ]D}                     |j                  t          |j                  0t	          j        |          ES r   r  r  s     r!   r   z/ESP8266V3FirmwareImage.save.<locals>.<listcomp>1  s[       ))!&11 7:!&kka    r#   c                     | j         S r  r   r  s    r!   r  z-ESP8266V3FirmwareImage.save.<locals>.<lambda>3  r{  r#   r   r~  r   r  r!  r  r  z.flash.rodatar   r8  )rZ   r[   r   r   r   r   r(   r   rw   r   r   r  r   rC   rp   r   r  r   r   r   r   r@  rg  rk  rl  rm  rA   rn  r:  r9  )r|   r6  r  r   r   r  r  r  r   r  rn  rS  s   `           r!   r>  zESP8266V3FirmwareImage.save#  s   Z\\ I	$Q$$Q666 3H   3C3CDDD  N
   3C3CDDD  L >""Q&&*1-2	-abb1 - -G|t6)t:VVV(WT W W#$6W W)2SW W W   !(II n%%))(+gz22 4w|7V7V#*<#3GL,,QBB""1%%%!# n%%)) ( $ $,,QBB!#   H---6688L FF1IIIGGE>*++,,,! )q			 ))aff\22333(((#(D)) 2YOOAJJLL1112 2 2 2 2 2 2 2 2 2 2 2 2 2 2MI	$ I	$ I	$ I	$ I	$ I	$ I	$ I	$R zz||SI	$ I	$ I	$ I	$ I	$ I	$ I	$ I	$ I	$ I	$ I	$ I	$ I	$ I	$ I	$ I	$ I	$ I	$s<   JL"(K
LK	LK	L/LLLc                     d }t          t          j        | j        |                    d                              }|d         | _         ||d                   \  | _        | _         ||d                   \  | _        | _	         ||d                   \  | _
        | _        |d         dv r|d         dk    | _        nt          d	|d                   t          d
 |dd         D                       rt          j        d           d S d S )Nc                     | dz  | dz	  dz  fS r  r   r  s    r!   r  z?ESP8266V3FirmwareImage.load_extended_header.<locals>.split_byteq  r  r#   r   r   r   r   r   r  r  r  c              3   &   K   | ]}|d k    |V  dS )r   Nr   )r   r   s     r!   r%  z>ESP8266V3FirmwareImage.load_extended_header.<locals>.<genexpr>  s&      11Q!q&&q&&&&11r#   ru   zYSome reserved header fields have non-zero values. This image may be from a newer esptool?)r  r   r   r  rA   r\  r]  r^  r_  r`  ra  rb  rg  r  anyr   r   )r|   r   r  r  s       r!   ri  z+ESP8266V3FirmwareImage.load_extended_headerp  s7   	/ 	/ 	/ M$99>>";M;MNN
 
 Qi $.:fQi#8#8 dj",*VAY"7"7
DK#-:fQi#8#8 T[":!'qDSr
   11&2,11111 	K:    	 	r#   )
r   r   r   r   r  rs  r?  r@  r>  ri  r   r#   r!   r  r    so        BB!)0 0 0K$S4Z K$EDL K$ K$ K$ K$Z    r#   r  c                       e Zd ZdZeZdS )re   zDESP32S2 Firmware Image almost exactly the same as ESP32FirmwareImageN)r   r   r   r   r   r   r   r#   r!   re   re             NNJJJr#   re   c                       e Zd ZdZeZdS )rf   zDESP32S3 Firmware Image almost exactly the same as ESP32FirmwareImageN)r   r   r   r   r   r   r   r#   r!   rf   rf     r  r#   rf   c                       e Zd ZdZeZdS )rg   zDESP32C3 Firmware Image almost exactly the same as ESP32FirmwareImageN)r   r   r   r   r
   r   r   r#   r!   rg   rg     r  r#   rg   c                       e Zd ZdZeZdZdS )rh   zDESP32C2 Firmware Image almost exactly the same as ESP32FirmwareImage) @     r   N)r   r   r   r   r	   r   r   r   r#   r!   rh   rh     s!        NNJ.r#   rh   c                   2    e Zd ZU dZeZee         ed<   dZ	dS )ri   zDESP32C6 Firmware Image almost exactly the same as ESP32FirmwareImager   )i    r  r  r   N)
r   r   r   r   r   r   r  r   r,  r   r   r#   r!   ri   ri     s2         NN",JY,,,4r#   ri   c                       e Zd ZdZeZdS )rj   zGESP32C61 Firmware Image almost exactly the same as ESP32C6FirmwareImageN)r   r   r   r   r   r   r   r#   r!   rj   rj     s        QQJJJr#   rj   c                       e Zd ZdZeZdS )rk   zDESP32C5 Firmware Image almost exactly the same as ESP32FirmwareImageN)r   r   r   r   r   r   r   r#   r!   rk   rk     r  r#   rk   c                       e Zd ZdZeZdS )ro   zFESP32H4 Firmware Image almost exactly the same as ESP32C6FirmwareImageN)r   r   r   r   r   r   r   r#   r!   ro   ro     s        PPJJJr#   ro   c                       e Zd ZdZeZdS )rn   zDESP32P4 Firmware Image almost exactly the same as ESP32FirmwareImageN)r   r   r   r   r   r   r   r#   r!   rn   rn     r  r#   rn   c                       e Zd ZdZeZdS )rl   zDESP32H2 Firmware Image almost exactly the same as ESP32FirmwareImageN)r   r   r   r   r   r   r   r#   r!   rl   rl     r  r#   rl   c                       e Zd ZdZeZdS )rm   zEESP32H21 Firmware Image almost exactly the same as ESP32FirmwareImageN)r   r   r   r   r   r   r   r#   r!   rm   rm     s        OOJJJr#   rm   c                   >    e Zd ZdZdZdZd Zd Zd Zd Z	d Z
d	 Zd
S )ELFFile(   r   r   c                     t          |          \  | _        | _        t          j        | j                  }|                     |           d S r  )r   rp   rC   rZ   r[   _read_elf_file)r|   rp   r   s      r!   r}   zELFFile.__init__  sA    (	49Jty!!Ar#   c                 Z    | j         D ]}|j        |k    r|c S t          d| d          )NzNo section  in ELF file)sectionsrC   
ValueError)r|   section_namer  s      r!   get_sectionzELFFile.get_section  sH     	 	Av%% &A|AAABBBr#   c                    d}| j         dn
d| j          d}	 t          j        d|                    |                    \  }}}}| _        }}	}
}}}}}}n+# t          j        $ r}t          | d|           d }~ww xY wt          |d          dk    s|dd	         d
k    rt          | d          |dvrt          | d|dd          || j        k    rt          | d|dd| j        dd          |dk    rt          | d          | 	                    ||	||           | 
                    ||||           d S )N4   Image'z<16sHHLLLLLHHHHHHz# does not have a valid ELF header: r      r   ru   s   ELFz has invalid ELF magic header)^      zE does not appear to be an Xtensa or an RISCV ELF image. (e_machine = #06xr   z* has unexpected section header entry size r   z (not z has 0 section headers)rC   r   r   rA   r   errorr   r   LEN_SEC_HEADER_read_sections_read_segments)r|   r   LEN_FILE_HEADERsourceident_typemachine_version_phoffshoff_flags_ehsize
_phentsize_phnum	shentsizeshnumshstrndxes                     r!   r  zELFFile._read_elf_file  s    I-3Cty3C3C3C	P  1166/3J3JKK | 	P 	P 	PNN1NNOOO	Pq>>T!!U1Q3Z6%9%9EEEFFF,&& 0 0 '/0 0 0   +++ 2 2YT 2 2+12 2 2   A::>>>???AueX666Avvx88888s   <A A=$A88A=c                 v   d}d}d}d}d}	d}
|||	|
f}|||fz   }                     |           || j        z  }                    |          t                    dk    rt	          d|d	d
          t                    |k    r%t	          dt                    dd|dd          t          dt                    | j                  }fd|| j        z  |vrt	          d|            || j        z            \  }}}}}}}||k    rt          j        d|d                                |                               |          fd}fd}fd|D             }g | _        g | _	        |D ]}|\  }}}}}}}|dk    s|dk    r||vrt          j        d|dd           7||v r@| j        
                    t           ||          | |||          ||                     {||k    r5| j	        
                    t           ||          |d||                     d S )Nr   r   r      r  r   r   z"No section header found at offset r   in ELF image.
Only read r   z% bytes from section header (expected ). Truncated ELF image?c           	      d    t          j        d	| d                    \	  }}}}}}}}}|||||||fS )Nz
<LLLLLLLLLr   unpack_from)
offs	name_offssec_typer  lmasec_offsr   rq   r    section_headers
            r!   read_section_headerz3ELFFile._read_sections.<locals>.read_section_headerS  sS     "<1FGG
xdHfeLLr#   z+ELF file has no STRTAB section at shstrndx z+ELF file has incorrect STRTAB section type rD  c                 R    | d          }|d |                     d                   S r   )index)r  rawstring_tables     r!   lookup_stringz-ELFFile._read_sections.<locals>.lookup_stringo  s.    tuu%C+7+++,,r#   c                 X                         |                                |          S r  r   rA   r  r   r   s     r!   	read_dataz)ELFFile._read_sections.<locals>.read_datas  "    FF4LLL66$<<r#   c                 &    g | ]} |          S r   r   )r   r  r  s     r!   r   z*ELFFile._read_sections.<locals>.<listcomp>w  %    UUUd++D11UUUr#   zUnknown section type r  r   r#   )r   r  rA   r   r   r  r   r   r  nobits_sectionsr*   r   ) r|   r   section_header_offssection_header_countr  SEC_TYPE_PROGBITSSEC_TYPE_STRTABSEC_TYPE_NOBITSSEC_TYPE_INITARRAYSEC_TYPE_FINIARRAYSEC_TYPE_PREINITARRAYPROG_SEC_TYPESKNOWN_SEC_TYPES	len_bytessection_header_offsetsrq   r   sec_sizer  r  r    r	  r  all_sectionssectionn_offsr  r   r  r  r  r  s     `                           @@@r!   r  zELFFile._read_sections1  s    !! $ !	
 )O_+MM	"###(4+>>		**~!## 5HP         ~9--CS00P C C&BC C C   "'q#n*=*=t?R!S!S	M 	M 	M 	M 	M t**3IIIU8UUVVV<O<Ot**=
 =
98Q(FE &&KUhUUUVVV	xvvh''
	- 	- 	- 	- 	-	  	  	  	  	  VUUU>TUUU!# 	 	G?F<FHc4vu axx4199..OHOOOOPPP>))$$%f--!	$--$#      _,,$++%f--$#    -	 	r#   c                   	
 |dk    rd S                      |           || j        z  }                    |          t                    dk    rt	          d|dd          t                    |k    r%t	          dt                    dd|dd          t          dt                    | j                  }fd	

fd
|D             }d |D             }fd		fd|D             }|| _        d S )Nr   z"No segment header found at offset r  r  r  r   z% bytes from segment header (expected r  c                 `    t          j        d	| d                    \  }}}}}}}}||||||fS )Nz	<LLLLLLLLr  )
r  seg_typeseg_offs_vaddrr  r   _memsizer  _alignsegment_headers
            r!   read_segment_headerz3ELFFile._read_segments.<locals>.read_segment_header  sN     ";tuu0EFF	c466BBr#   c                 &    g | ]} |          S r   r   )r   r  r*  s     r!   r   z*ELFFile._read_segments.<locals>.<listcomp>  r  r#   c                 >    g | ]}|d          t           j        k    |S )r   )r  SEG_TYPE_LOAD)r   r  s     r!   r   z*ELFFile._read_segments.<locals>.<listcomp>  s)    RRRqAaDG<Q4Q4Q4Q4Q4Qr#   c                 X                         |                                |          S r  r  r  s     r!   r  z)ELFFile._read_segments.<locals>.read_data  r  r#   c           
      r    g | ]3\  }}}}}}|d k    |d k    t          d| ||          ||          4S )r   s   PHDRr   )r   )r   r  r  r   r  r  r(  r  s          r!   r   z*ELFFile._read_segments.<locals>.<listcomp>  s^     
 
 
8T4axxD1HH wYYtT%:%:&PVWWW$HHr#   )r   LEN_SEG_HEADERrA   r   r   r  r   )r|   r   segment_header_offssegment_header_countr  r  segment_header_offsetsall_segmentsprog_segmentsr  r*  r)  s    `       @@@r!   r  zELFFile._read_segments  s   1$$F	"###(4+>>		**~!## 5HP         ~9--CS00P C C&BC C C   "'q#n*=*=t?R!S!S	C 	C 	C 	C 	C VUUU>TUUURRLRRR	  	  	  	  	 
 
 
 
<I
 
 

 &r#   c                     t          j                    }t          j        | j                  }|                    |                                           |                                S r  )rk  rl  rZ   r[   rp   rm  rA   rn  )r|   rl  r   s      r!   rl  zELFFile.sha256  sH    !!Jty!!affhh}}r#   N)r   r   r   r  r-  r0  r}   r  r  r  r  rl  r   r#   r!   r  r    s        NMN  
C C C'9 '9 '9Ri i iV-& -& -&^    r#   r  r  )DrU  r   rk  rZ   rK  r\   r   r7   typingr   intelhexr   r   loaderr   loggerr   targetsr	   r
   r   r   r   r   r   r   r   r   r   r   r   utilr   r   r   r   r   r"   r  r+  r*  r0   r@  r<   rH   r?  rr   rt   r   r   ra   BOOTLOADER_IMAGErb   rQ  rd   r  re   rf   rg   rh   ri   rj   rk   ro   rn   rl   rm   r  r   r#   r!   <module>r>     sH      				 				 				         - - - - - - - -                                          C B B B B B B B B B B B B B  $s) U38_0E    ,
h 
4c2e9n0E+F 
 
 
 
 /3$ $
U)$!$t$	%d
BuI%
&'$ $ $ $*$C $[ $ $ $ $NG' G' G' G' G' G' G' G'T	3 	3 	3 	3 	3 	3 	3 	3V# V# V# V# V# V# V# V#r8+ 8+ 8+ 8+ 8+/ 8+ 8+ 8+v 6
 x$ x$ x$ x$ x$. x$ x$ x$v  Z  Z  Z  Z  Z * Z  Z  Z z
q q q q q/ q q qh /     -    3
     -    3
     -    3
 / / / / /- / / / 3
 5 5 5 5 5- 5 5 5 3
     0     5     -    3
     /    3
     -    3
     /    3
     0     5 Y Y Y Y Y Y Y Y Y Yr#   