
    M@c]                         d dl Z d dlZd dlZddlmZ ddlmZmZmZm	Z	m
Z
 ddlmZ ddlmZmZmZ ddlmZ  ee      Zg d	Z G d
 de      Z G d de      Z G d d      Zy)    N   )requireBytes)bin2dec	bytes2bin	bin2bytesbin2synchsafedec2bin)core   )ID3_DEFAULT_VERSIONisValidVersionnormalizeVersion)	getLogger)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                       e Zd ZdZefdZd Zed        Zej                  d        Zed        Z
ed        Zed        Zd	 ZddZy
)	TagHeader
   c                 2    | j                          || _        y N)clearversion)selfr   s     3/usr/lib/python3/dist-packages/eyed3/id3/headers.py__init__zTagHeader.__init__   s    

    c                 J    d| _         d| _        d| _        d| _        d| _        y )Nr   F)tag_sizeunsyncextendedexperimentalfooterr   s    r   r   zTagHeader.clear   s&    !r   c                 R    t        | j                  D cg c]  }| c}      S c c}w r   )tuple_versionr   vs     r   r   zTagHeader.version    s    /Aa/00/s   	$c                 p    t        |      }t        |d      st        dt        |      z        || _        y )NT)fully_qualifiedzInvalid version: %s)r   r   
ValueErrorstrr$   r%   s     r   r   zTagHeader.version$   s2    Qa62SV;<<r   c                      | j                   d   S Nr   r$   r!   s    r   major_versionzTagHeader.major_version+       }}Qr   c                      | j                   d   S Nr   r-   r!   s    r   minor_versionzTagHeader.minor_version/   r/   r   c                      | j                   d   S )Nr   r-   r!   s    r   rev_versionzTagHeader.rev_version3   r/   r   c                    ddl m} | j                          |j                  d      dk7  ryt        j                  d       |j                  d      }t        |      dk7  ryd}|d   }|d   }t        j                  d	|z         t        j                  d
|z         t        j                  d|z         |dk(  r
|dk\  r|dk  s |d||fz        |||f| _        |j                  d      }|syd t        |      dd D        \  | _	        | _
        | _        | _        t        j                  d| j                  | j                  | j                  | j                  fz         |j                  d      }t        |      dk7  ryt        j                  d|d   |d   |d   |d   fz         t        t        |d            | _        t        j                  d| j                  | j                  fz         y)zParse an ID3 v2 header starting at the current position of `f`.

        If a header is parsed `True` is returned, otherwise `False`. If
        a header is found but malformed an `eyed3.id3.tag.TagException` is
        thrown.
        r   TagException      ID3FzLocated ID3 v2 tagr   r   zTagHeader [major]: %d zTagHeader [minor]: %d zTagHeader [rev]: %d    zID3 v%d.%d is not supportedc              3   2   K   | ]  }t        |        y wr   )bool).0bs     r   	<genexpr>z"TagHeader.parse.<locals>.<genexpr>\   s     ?Qa?s   zFTagHeader [flags]: unsync(%d) extended(%d) experimental(%d) footer(%d)z+TagHeader [size string]: 0x%02x%02x%02x%02x   zTagHeader [size]: %d (0x%x)T)tagr7   r   readlogdebuglenr   r   r   r   r   r    r   r   )	r   fr7   r   majorminorrevdatatag_size_bytess	            r   parsezTagHeader.parse7   s    	&

 66!9		&' &&)w<1
aj		*U23		*U23		(3./

uz<u~MNNuc* vvay @)D/!A*>?							 037;;373D3D37;;3@@ 	A ~!#		?!!$nQ&7!!$nQ&799 	:  	.! <=		/4==37==3B B 	C r   Nc                 J   ||| _         | j                  rt        d      d}|t        | j                  g      t        | j
                  g      z   z  }|t        t        | j                        t        | j                        t        | j                        t        | j                        ddddg      z  }t        j                  d| j                   z         |t        t        t        | j                   d                  z  }t        j                  dt        |      z         |S )N/eyeD3 does not write (only reads) unsync'd datar9   r   zSetting tag size to %d    zTagHeader rendered %d bytes)r   r   NotImplementedErrorbytesr2   r4   r   intr   r   r    rC   rD   r   r	   rE   )r   tag_lenrJ   s      r   renderzTagHeader.renderq   s    #DM;;% '6 7 7 t))*+eT5E5E4F.GGG	3t{{+t}}-t001t{{+aA	' ( 	(
 			*T]]:;	-r(BCDD		/#d);<r   r   )__name__
__module____qualname__SIZEr   r   r   propertyr   setterr.   r2   r4   rL   rT    r   r   r   r      s    D2  1 1 ^^             8tr   r   c                      e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZd Zed        Zej,                  d        Zed        Zej,                  d	        Zed
        Zej,                  d        Zed        Zej,                  d        Zed        Zej,                  d        Zed        Zed        Zej,                  d        Zed        Zed        Zej,                  d        Zed        Zed        Z e j,                  d        Z ed        Z!ed        Z"e"j,                  d        Z"ed        Z#d Z$d!dZ%d Z&y )"ExtendedTagHeaderr   r   r   r8   c                 <    d| _         d| _        d | _        d| _        y r,   )size_flagscrc_restrictionsr!   s    r   r   zExtendedTagHeader.__init__   s    	r   c                 2    t        | j                  dz        S )N@   r<   r`   r!   s    r   
update_bitzExtendedTagHeader.update_bit       DKK$&''r   c                 ^    |r| xj                   dz  c_         y | xj                   dz  c_         y )Nrd   ir`   r%   s     r   rf   zExtendedTagHeader.update_bit   !    KK4KKK5 Kr   c                 2    t        | j                  dz        S )NrO   re   r!   s    r   crc_bitzExtendedTagHeader.crc_bit   rg   r   c                 ^    |r| xj                   dz  c_         y | xj                   dz  c_         y )NrO   iri   r%   s     r   rl   zExtendedTagHeader.crc_bit   rj   r   c                     | j                   S r   )_crcr!   s    r   ra   zExtendedTagHeader.crc   s    yyr   c                 (    |rdnd| _         || _        y )Nr   r   )rl   ro   r%   s     r   ra   zExtendedTagHeader.crc   s    q1	r   c                 2    t        | j                  dz        S )N   re   r!   s    r   restrictions_bitz"ExtendedTagHeader.restrictions_bit   rg   r   c                 ^    |r| xj                   dz  c_         y | xj                   dz  c_         y )Nrr   iri   r%   s     r   rs   z"ExtendedTagHeader.restrictions_bit   rj   r   c                      | j                   dz	  S )N   rb   r!   s    r   tag_size_restrictionz&ExtendedTagHeader.tag_size_restriction   s    !!Q&&r   c                 ^    |dk\  r|dk  sJ d| _         |dz  | j                  dz  z  | _        y )Nr   r8   r   rv   ?   rs   rb   r%   s     r   rx   z&ExtendedTagHeader.tag_size_restriction   9    Av!q&!  !1f););d)BCr   c                     | j                   }|t        j                  k(  ry|t        j                  k(  ry|t        j                  k(  ry|t        j
                  k(  ryy )Nz/No more than 128 frames and 1 MB total tag sizez0No more than 64 frames and 128 KB total tag sizez/No more than 32 frames and 40 KB total tag sizez.No more than 32 frames and 4 KB total tag size)rx   r]   RESTRICT_TAG_SZ_LARGERESTRICT_TAG_SZ_MEDRESTRICT_TAG_SZ_SMALLRESTRICT_TAG_SZ_TINYr   vals     r    tag_size_restriction_descriptionz2ExtendedTagHeader.tag_size_restriction_description   sZ    ''#999D%999E%;;;D%:::C ;r   c                 &    | j                   dz  dz	  S )NrO      rw   r!   s    r   text_enc_restrictionz&ExtendedTagHeader.text_enc_restriction       ""T)a//r   c                 T    |dk(  s|dk(  sJ d| _         | xj                  dz  c_        y )Nr   r   rO   r{   r%   s     r   r   z&ExtendedTagHeader.text_enc_restriction   .    Ava  !d"r   c                     | j                   ryy)Nz1Strings are only encoded with ISO-8859-1 or UTF-8None)r   r!   s    r    text_enc_restriction_descriptionz2ExtendedTagHeader.text_enc_restriction_description   s    $$Fr   c                 &    | j                   dz	  dz  S Nr8   rw   r!   s    r   text_length_restrictionz)ExtendedTagHeader.text_length_restriction   s    ""a'4//r   c                 ^    |dk\  r|dk  sJ d| _         |dz  | j                  dz  z  | _        y )Nr   r8   r      r{   r%   s     r   r   z)ExtendedTagHeader.text_length_restriction   r|   r   c                     | j                   }|t        j                  k(  ry|t        j                  k(  ry|t        j                  k(  ry|t        j
                  k(  ryy )Nr   z)No string is longer than 1024 characters.z(No string is longer than 128 characters.z'No string is longer than 30 characters.)r   r]   RESTRICT_TEXT_LEN_NONERESTRICT_TEXT_LEN_1024RESTRICT_TEXT_LEN_128RESTRICT_TEXT_LEN_30r   s     r   #text_length_restriction_descriptionz5ExtendedTagHeader.text_length_restriction_description   sZ    **#:::%<<<>%;;;=%:::< ;r   c                 &    | j                   dz  dz	  S )Nr:   r   rw   r!   s    r   image_enc_restrictionz'ExtendedTagHeader.image_enc_restriction	  r   r   c                 T    |dk(  s|dk(  sJ d| _         | xj                  dz  c_        y )Nr   r   r:   r{   r%   s     r   r   z'ExtendedTagHeader.image_enc_restriction  r   r   c                     | j                   ryy)Nz6Images are encoded only with PNG [PNG] or JPEG [JFIF].r   )r   r!   s    r   !image_enc_restriction_descriptionz3ExtendedTagHeader.image_enc_restriction_description  s    %%Kr   c                      | j                   dz  S r   rw   r!   s    r   image_size_restrictionz(ExtendedTagHeader.image_size_restriction  s    !!D((r   c                 X    |dk\  r|dk  sJ d| _         || j                  dz  z  | _        y )Nr   r8   r      r{   r%   s     r   r   z(ExtendedTagHeader.image_size_restriction  s5    Av!q&!  !$"4"4t";<r   c                     | j                   }|t        j                  k(  ry|t        j                  k(  ry|t        j                  k(  ry|t        j
                  k(  ryy )Nr   z)All images are 256x256 pixels or smaller.z'All images are 64x64 pixels or smaller.z?All images are exactly 64x64 pixels, unless required otherwise.)r   r]   RESTRICT_IMG_SZ_NONERESTRICT_IMG_SZ_256RESTRICT_IMG_SZ_64RESTRICT_IMG_SZ_64_EXACTr   s     r   "image_size_restriction_descriptionz4ExtendedTagHeader.image_size_restriction_description$  s\    ))#888%999>%888<%>>>  ?r   c                     t        | j                  dz	  dz  | j                  dz	  dz  | j                  dz	  dz  | j                  dz	  dz  | j                  dz	  dz  g      S )N            r@   r   )rQ   ra   r!   s    r   _syncsafeCRCzExtendedTagHeader._syncsafeCRC1  sd    XX^t#XX^t#XX^t#XX]d"XX]d"
  	r   c           	         |d   dk7  rt        d| d      d}|d   dk(  rvd}| j                  r|d	z  }| j                  r|d
z  }t        t	        j
                  t        j                  |d	|z  z                     | _        | j                         }t        |      dk  rd	dt        |      z
  z  |z   }t        |      dk(  sJ ||z  }| j                  r|dz  }|t        | j                  g      z  }t        j                  dt        |      z         t!        t#        t%        t        |      dz   d                  }t        |      dk(  sJ |dz   t!        t%        | j&                              z   |z   }t        j                  dt        |      z         |S d}dgdz  }d }| j                  rtd|d<   t        t	        j
                  t        j                  |d	|z  z                     | _        t!        t%        | j                              }t        |      dk(  sJ |dz  }t!        |      }	t        |	      dk(  sJ t!        t%        |d            }t        |      dk(  sJ t!        t%        |d            }
||	z   |
z   }|r||z  }|S )Nr   r   zInvalid version: z != 2 (expected)r   r   r:   rv          r      z(Rendered extended header data (%d bytes)rO   z#Rendered extended header of size %drr   )r)   rf   rl   rR   mathfabsbinasciicrc32ra   r   rE   rs   rQ   rb   rC   rD   r   r   r	   r`   )r   r   
frame_datapaddingrJ   r_   crc_datarF   ra   flagspadding_sizes              r   rT   zExtendedTagHeader.render:  s   1:?0	9IJKK1:?D|| tyy
9@79J9L *M  N O,,.x=1$ '1s8}+< =IH8})*) $$t11233II@3t9LM ]73t9q="+EFGDt9>">'>Igdkk.B$CCdJDII;c$iGH8 3 DbAC||! tyy
9@79J9L *M  N O 123x1}%}	aLEu:?#?WT2./Dt9>">$WWb%9:L%<,.Dr   c                    ddl m} |d   dk(  sJ t        j                  d|j	                         z         |j                  d      }|d   dk(  rxt        t        |d            }|| _        t        j                  d|z         |j                  |dz
        }|d   dk7  s|d   d	z  r |d
      |d   | _	        t        j                  d| j                  z         d}| j                  r$t        j                  d       ||   dk(  sJ |dz  }| j                  rmt        j                  d       ||   dk(  sJ |dz  }|||dz    }t        t        |d            | _        t        j                  d| j                  z         |dz  }| j                  r4t        j                  d       ||   dk(  sJ |dz  }||   | _        |dz  }yyt        t        |            }|| _        t        j                  d|z         |j                  d      }|j                  d      }	t        j                  dt        t        |	            z         |d   dz	  | _	        | j                  rbt        j                  d       |j                  d      }t        t        |            | _        t        j                  d| j                  z         yy)a  Parse an ID3 v2 extended header starting at the current position
        of ``fp`` and per the format defined by ``version``. This method
        should only be called when the presence of an extended header is known
        since it moves the file position. If a header is found but malformed
        an ``eyed3.id3.tag.TagException`` is thrown. The return value is
        ``None``.
        r   r6   r   r   zParsing extended header @ 0x%xr:   r@   z4Extended header size (includes the 4 size bytes): %d   zInvalid Extended HeaderzExtended header flags: %xz"Extended header has update bit setzExtended header has CRC bit setr   zExtended header CRC: %dz(Extended header has restrictions bit setz5Extended header size (not including 4 size bytes): %dz1Extended header says there is %d bytes of paddingN)rA   r7   rC   rD   tellrB   r   r   r_   r`   rf   rl   ra   rs   rb   )
r   fpr   r7   rJ   szoffsetr   tmpFlagspss
             r   rL   zExtendedTagHeader.parsez  s    	&qzQ		2RWWY>?wwqz1:?4+,BDIIIL 7726?D Aw!|Q$ ##<==q'DKII1DKK?@F		>?F|q()(!||		;<F|q()(!vz2"9Xq#9:		3dhh>?!$$		DEF|q()(!%)&\"! % 4)BDIIIM wwqzHBIIIim,- . #1+*DK||		;<771:"9X#67		3dhh>?	 r   N)r   )'rU   rV   rW   r~   r   r   r   RESTRICT_TEXT_ENC_NONERESTRICT_TEXT_ENC_UTF8r   r   r   r   RESTRICT_IMG_ENC_NONERESTRICT_IMG_ENC_PNG_JPGr   r   r   r   r   rY   rf   rZ   rl   ra   rs   rx   r   r   r   r   r   r   r   r   r   r   rT   rL   r[   r   r   r]   r]      s}     !!!!  ## ( ( ! ! ( ( ^^! !   	ZZ  ( ( ! ! ' '   D !D
 	D 	D 0 0   # !#
   0 0 ##D $D
 	= 	= 0 0 !!# "#
   ) ) ""= #=
 
  
 =@D@r   r]   c                   ^   e Zd ZdZdZdZdZdZdZdZ	dZ
dZ ed      d        Zd Zed        Zed        Zed        Zed	        Zej(                  d
        Zed        Zej(                  d        Zed        Zej(                  d        Zed        Zej(                  d        Zed        Zej(                  d        Zed        Zej(                  d        Zed        Zej(                  d        Zed        Zej(                  d        Zd Zd Zed        Zed        Z ed        Z!y)FrameHeaderz/A header for each and every ID3 frame in a tag.Nr   c                     || _         | j                          | j                  dk7  rdnd| _        || _        dgdz  | _        d| _        y )Nr   r   rv   r   rr   )r$   _setBitMaskr2   r_   idr`   	data_size)r   fidr   s      r   r   zFrameHeader.__init__  sJ     ,,1Bq	 cBhr   c                    |j                   |j                     | _        |j                   |j                     | _        |j                   |j
                     | _        |j                   |j                     | _        |j                   |j                     | _
        |j                   |j                     | _        |j                   |j                     | _        |j                   |j                     | _        y r   )r`   	TAG_ALTER	tag_alter
FILE_ALTER
file_alter	READ_ONLY	read_only
COMPRESSED
compressed	ENCRYPTED	encryptedGROUPEDgroupedUNSYNCr   DATA_LENdata_length_indicator)r   rhss     r   	copyFlagszFrameHeader.copyFlags  s    CMM2**S^^4CMM2**S^^4CMM2zz#++.jj,%(ZZ%="r   c                      | j                   d   S r,   r-   r!   s    r   r.   zFrameHeader.major_version  r/   r   c                      | j                   d   S r1   r-   r!   s    r   r2   zFrameHeader.minor_version  r/   r   c                     | j                   S r   r-   r!   s    r   r   zFrameHeader.version  s    }}r   c                 4    | j                   | j                     S r   )r`   r   r!   s    r   r   zFrameHeader.tag_alter      {{4>>**r   c                 Z    t        t        |            | j                  | j                  <   y r   )rR   r<   r`   r   r   r>   s     r   r   zFrameHeader.tag_alter      &)$q'lDNN#r   c                 4    | j                   | j                     S r   )r`   r   r!   s    r   r   zFrameHeader.file_alter      {{4??++r   c                 Z    t        t        |            | j                  | j                  <   y r   )rR   r<   r`   r   r   s     r   r   zFrameHeader.file_alter      '*47|DOO$r   c                 4    | j                   | j                     S r   )r`   r   r!   s    r   r   zFrameHeader.read_only  r   r   c                 Z    t        t        |            | j                  | j                  <   y r   )rR   r<   r`   r   r   s     r   r   zFrameHeader.read_only	  r   r   c                 4    | j                   | j                     S r   )r`   r   r!   s    r   r   zFrameHeader.compressed  r   r   c                 Z    t        t        |            | j                  | j                  <   y r   )rR   r<   r`   r   r   s     r   r   zFrameHeader.compressed  r   r   c                 4    | j                   | j                     S r   )r`   r   r!   s    r   r   zFrameHeader.encrypted  r   r   c                 Z    t        t        |            | j                  | j                  <   y r   )rR   r<   r`   r   r   s     r   r   zFrameHeader.encrypted  r   r   c                 4    | j                   | j                     S r   )r`   r   r!   s    r   r   zFrameHeader.grouped  s    {{4<<((r   c                 Z    t        t        |            | j                  | j                  <   y r   )rR   r<   r`   r   r   s     r   r   zFrameHeader.grouped!  s    $'QLDLL!r   c                 4    | j                   | j                     S r   )r`   r   r!   s    r   r   zFrameHeader.unsync%  s    {{4;;''r   c                 Z    t        t        |            | j                  | j                  <   y r   )rR   r<   r`   r   r   s     r   r   zFrameHeader.unsync)  s    #&tAw<DKK r   c                 4    | j                   | j                     S r   )r`   r   r!   s    r   r   z!FrameHeader.data_length_indicator-  s    {{4==))r   c                 Z    t        t        |            | j                  | j                  <   y r   )rR   r<   r`   r   r   s     r   r   z!FrameHeader.data_length_indicator1  s    %(a\DMM"r   c                    | j                   }| j                  }|dk(  r=|dv r9d| _        d| _        d| _        d| _        d| _        d| _        d| _        d	| _	        y |dk(  r|d	k(  s	|dk(  r=|d
v r9d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        y t        dt        |      z   dz   t        |      z   dz         )Nr   )r8   r   r   r      	   r   r   r:   )r   r   r8            zID3 v.z is not supported.)r.   r2   r   r   r   r   r   r   r   r   r)   r*   )r   rG   rH   s      r   r   zFrameHeader._setBitMask5  s    """"
 QJ5F? DNDODNDODNDLDKDMzeqjeqjUf_DNDODN DODNDLDKDMWs5z1C7#e*D12 3 3r   c           	      `   d}t        | j                        t        u sJ || j                  z  }|| _        | j                  dk(  r|t        t        |d            z  }n!|t        t        t        |d                  z  }| j                  rt        d      |t        | j                        z  }|S )Nr   r8   rO   rN   )typer   rQ   r   r2   r   r	   r   r   rP   r`   )r   r   rJ   s      r   rT   zFrameHeader.renderV  s    DGG}%&%""Igi455DImGIr,BCDDD;;% '6 7 7	$++&&r   c                 $   ddl m} ddl m} | j                  d      } ||      }t        j                  |      rt        j                  d||d   |d   |d   fz         t	        ||      }| j                  d      }t        t        |d            |_
        t        j                  d	|j                  |j                  fz         |S |d
k(  r't        j                  d| j                         z         y t        j                   |d|z               y )Nr   )map2_2FrameIdFrameExceptionr8   zFrameHeader [id]: %s (0x%x%x%x)r   r   r   "FrameHeader [data size]: %d (0x%X)s      +FrameHeader: Null frame id found at byte %d!FrameHeader: Illegal Frame ID: %s)framesr  r  rB   r   _isValidFrameIdrC   rD   r   r   r   r   r
   
parseError)rF   r   r  r  frame_id_22frame_idframe_headerr   s           r   	_parse2_2zFrameHeader._parse2_2j  s   )*ffQi -&&x0II7"KNKNKPQNST U&x9L B%,Yr1-=%>L"II:#--|/E/EFG H(IICaffhNO
  OON+N+3,4 5 6 r   c                    ddl m} t        j                  d| j	                         | j	                         fz         |d d \  }}|dk(  rt
        j                  | |      S | j                  d      }t
        j                  |      rt        j                  d||d   |d   |d   |d   fz         t        ||      }| j                  d      }|dk(  rt        t        |d	            |_        nt        t        |d
            |_        t        j                  d|j                  |j                  fz         | j                  d      }t        |      |_        t        j                         t        j                  k  rpt        j                  d|j                   |j"                  |j$                  |j&                  |j(                  |j*                  |j,                  |j.                  fz         |j0                  dk\  r3|j&                  r'|j.                  st3        j4                   |d             |S |dk(  r't        j                  d| j	                         z         y t3        j4                   |d|z               y )Nr   r  z#FrameHeader [start byte]: %d (0x%X)r   r:   z!FrameHeader [id]: %s (0x%x%x%x%x)r   r8   r   r@   r  zLFrameHeader [flags]: ta(%d) fa(%d) ro(%d) co(%d) en(%d) gr(%d) un(%d) dl(%d)z7Invalid frame; compressed with no data length indicators       r  r  )r  r  rC   rD   r   r   r  rB   r	  r   r   r   r`   getEffectiveLevelloggingDEBUGr   r   r   r   r   r   r   r   r2   r
   r
  )	rF   r   r  r.   r2   r  r  r   r   s	            r   rL   zFrameHeader.parse  sD   *		71668;<668;E E 	F'.r{$}A((G4466!9&&x0II9!hqk8A;QRTU V&x9L B !)02q1A)B&)02q1A)B&II:#--|/E/EFG H FF1IE"+E"2L$$&'--7		 8'11'22L4J4J'22L4J4J'//1D1D'==	?? @ **a/L4K4K#99 0J !K L  $IICaffhNO
  OON+N+3,4 5 6 r   c                 J    dd l }|j                  d      j                  |       S )Nr   s"   ^[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]$)recompilematch)r   r  s     r   r	  zFrameHeader._isValidFrameId  s     zz?@FFrJJr   )"rU   rV   rW   __doc__r   r   r   r   r   r   r   r   r   r   r   rY   r.   r2   r   r   rZ   r   r   r   r   r   r   r   r   rT   staticmethodr  rL   r	  r[   r   r   r   r     s>   9
 IJIJIGFH !_ >           + + 3 3 , , 4 4 + + 3 3 , , 4 4 + + 3 3 ) ) ^^1 1 ( ( ]]0 0 * * !!2 "23B(  0 0 0d K Kr   r   )r   r  r   utilsr   utils.binfuncsr   r   r   r   r	    r
   r   r   r   	utils.logr   rU   rC   NULL_FRAME_FLAGSobjectr   r]   r   r[   r   r   <module>r     se        6 6  C C !C s slx@ x@v	xK xKr   