
    Rj)                        U d 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ddd	Z
eeef         ed
<    G d de          Z	 d%dededede	ee         ef         fdZdededededede	ee         ef         fdZdee         defdZdededefdZdede	eef         fdZdededefdZdee         dededefdZdededefd Z G d! d"          Z G d# d$          ZdS )&zSparse Bit Set encoding/decoding for IFT (Incremental Font Transfer).

Implements the sparse bit set format defined in the W3C IFT specification:
https://w3c.github.io/IFT/Overview.html#sparse-bit-set-decoding
    N)deque)DictIterableOptionalSetTuple                         _BF_MAX_HEIGHTc                       e Zd ZdS )SparseBitSetDecodeErrorN)__name__
__module____qualname__     _/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/fontTools/misc/iftSparseBitSet.pyr   r      s        Dr   r       databiasmaxValuereturnc                     | st          d          t          | d                   \  }}t          |         }||k    rt          d| d| d|           t          | ||||          S )aM  Decode a sparse bit set from binary data.

    Args:
        data: bytes-like object containing the sparse bit set encoding.
        bias: integer added to each decoded value.

    Returns:
        A tuple (values, bytesConsumed) where values is a set of integers
        and bytesConsumed is the number of bytes read from data.
    z
Empty datar   zHeight z exceeds max z for branch factor )r   _decodeHeaderr   _decodeImpl)r   r   r   branchFactorheight	maxHeights         r   decoder&      s      4%l333(a11L&|,I	%WfWW9WWWW
 
 	
 t\64BBBr   r#   r$   c                 `   |dk    rt                      dfS t          | |          }t                      }t                      }|                    d           |r?|                                \  }}	|                                }
|
t          d          |
dk    rg||	z
  dz   }||z  }||z   }||k    r^t          |||z   dz
  |z             }|dk     rd}||k    r&|                    t          ||dz                        ||	z
  }||z  }	 t          |
d          }|dk    rnq|	|k    r?||z   |z   }||k    r|                                 nH|dk    r|                    |           n"||z  }|                    ||z   |	dz   f           |
d|z   z  }
|?||                                fS )Nr      )r   r(   zUnexpected end of dataTr   )set_InputBitStreamr   appendpopleftnextr   minupdaterange_trailingZerosclearaddbytesConsumed)r   r#   r$   r   r   	bitStreamresultqueuestartdepthbitsexpnodeSize	fillStartfillEndnextNodeSizebitIndexval
startDeltas                      r   r"   r"   1   s    {{qzl33IuuF %*GGE	LL
 &%}}u~~<)*BCCC 1995.1$C#S(HI8##(EH$4q$84$?@@G1}}	G##eIw{;;<<< un#S(	%%dB//H2~~h&->>KKMMM!88JJsOOO%4
ej0%!)<===a8m$$D	%1  &%P I++--..r   valuesc                 t   t          t          |                     }|st          dd          S |d         }t          |          }d}dD ]Y}t          ||          }|t          |         k    r$t          |||          }| t          |          t          |          k     r|}Z|t          d|           |S )zEncode a set of integers as a sparse bit set.

    Tries all branching factors and returns the shortest encoding.

    Args:
        values: iterable of non-negative integers.

    Returns:
        bytes containing the sparse bit set encoding.
    r   r   Nr   zCannot encode max value )sortedr)   _encodeHeader_treeHeightr   _encodeWithBflen
ValueError)rC   valuesSortedr   valueSetbestr#   r$   encodeds           r   encoderP   j   s     #f++&&L #Q"""BH<  H D%  \844N<000,??<3w<<#d))33D|>H>>???Kr   c                 H    ddddd}t          |dz  ||          z  g          S )Nr   r(   r      r   )bytes)r#   r$   branchFactorToIds      r   rG   rG      s4    qa006Q;"2<"@@ABBBr   
headerBytec                 >    | dz  }ddddd}| dz	  dz  }||         |fS )NrR   r   r   r   r   )r   r(   r   rR   r	   r   )rU   ididToBranchFactorr$   s       r   r!   r!      s<    	d	BqR00Ao%FB''r   c                 :    d}| }||k    r|| z  }|dz  }||k    |S )z<Return the minimum tree height needed to represent maxValue.r(   r   )r#   r   r$   capacitys       r   rH   rH      s>    FH
h

L ! h

 Mr   rM   c                    |dk    rt          |d          S i g}| D ]:}||z  }||z  }||d         vrd|d         |<   |d         |xx         d|z  z  cc<   ;t          d|          D ]a}|d         }i }	|                                D ]+\  }}
||z  }||z  }||	vrd|	|<   |	|xx         d|z  z  cc<   ,|                    |	           bt	          |           dt
          dt
          dt
          ffd}t          |          }||z  }t          ddd|dz
  fg          }|r|                                \  }}}}|dz
  |z
  }d|cxk    rt          |          k     rn n||         
                    |d          nd}
||dz
  k     r, |||          ||z
  dz   k    r|                    d           |                    |
           |
dk    rg||dz
  k     r^||z
  dz   |z  }|
}|rOt          |d          }||z  |z   }|||z  z   }||z   dz
  }|                    ||dz   ||f           |d|z   z  }|O|t          ||          |                                z   S )	Nr   r(   rE   lohir   c                 Z    t          j        |          t          j        |           z
  S N)bisectbisect_rightbisect_left)r\   r]   rL   s     r   
rangeCountz!_encodeWithBf.<locals>.rangeCount   s1    "<44v7I"8
 8
 
 	
r   r   )rG   r0   itemsr+   rF   int_OutputBitStreamr   r,   rJ   getwriter1   toBytes)rM   r#   r$   layersv	nodeIndexbitPos_	prevLayernewLayerbitmaskparentIndexrc   streamsubtreeSizer7   r9   
rangeStartrangeEndlayerIdx	childSizer:   r@   
childIndex
childStartchildEndrL   s                             @r   rI   rI      sQ   {{\1--- %'4F , ,%	\!F1I%%#$F1Ii q	)V+1f 	  	 2J	#%"+//"3"3 	1 	1Iw#|3K-F(**()%[!!!Q&[0!!!!h (##L
s 
 
 
 
 
 
 
 
 l++F&K.3aA{Q5O4P.Q.QE
 )16.	5*hA:% 34x2M2M2M2M#f++2M2M2M2M2MF8  A...ST 	 FQJ
:x00Hz4IA4MMMLLOOOWa<<EFQJ..!J.2|CID ))$33&5@
'(Y*>>
%	1A5j%!)ZJKKK!x-((  )/  )> v..1A1AAAr   rA   maxBitsc                 R    | dk    r|S d}| dz  dk    r| dz  } |dz  }| dz  dk    |S Nr   r(   r   )rA   r|   counts      r   r1   r1      sJ    
axxE7q..	
 7q.. Lr   c                   F    e Zd ZdZdedefdZdee         fdZdefdZ	dS )	r*   zBReads bit nodes from a byte array, starting after the header byte.r   r#   c                 >    || _         || _        d| _        d| _        d S )Nr(   r   )r   r#   	byteIndexsubIndex)selfr   r#   s      r   __init__z_InputBitStream.__init__   s#    	(r   r   c                    | j         dv r| j        t          | j                  k    rd S d| j         z  dz
  }| j        | j                 | j        z	  |z  }| xj        | j         z  c_        | j        dk    rd| _        | xj        dz  c_        |S | j         dk    rC| j        t          | j                  k    rd S | j        | j                 }| xj        dz  c_        |S | j         dk    rw| j        dz   t          | j                  k    rd S | j        }| j        }||         ||dz            dz  z  ||dz            dz  z  ||dz            d	z  z  }| xj        d
z  c_        |S d S )Nr   r   r(   r   r   r   rR   r   r
      r   )r#   r   rJ   r   r   )r   maskrA   bis        r   r-   z_InputBitStream.next   sn   &&~TY//t**a/D9T^,=ECMMT..MM}!! !!#J!##~TY//t)DN+CNNaNNJ"$$~!S^^33t	AAA$!AE(a-(Aa!eHN;qQx2~NCNNaNNJtr   c                 0    | j         | j        dk    rdndz   S r~   )r   r   r   s    r   r4   z_InputBitStream.bytesConsumed  s    ~dma&7&7Q??r   N)
r   r   r   __doc__rS   re   r   r   r-   r4   r   r   r   r*   r*      s}        LLU #    hsm    6@s @ @ @ @ @ @r   r*   c                   :    e Zd ZdZdefdZdeddfdZdefdZdS )	rf   z#Writes bit nodes into a byte array.r#   c                 H    || _         t                      | _        d| _        d S )Nr   )r#   	bytearrayr   r   )r   r#   s     r   r   z_OutputBitStream.__init__  s     (KK	r   valuer   Nc                 ~   | j         dv rd| j         z  dz
  }||z  }| j        dk    r| j                            d           | j        dxx         || j        z  z  cc<   | xj        | j         z  c_        | j        dk    r	d| _        d S d S | j         dk    r| j                            |dz             d S | j         dk    r| j                            |dz             | j                            |dz	  dz             | j                            |dz	  dz             | j                            |d	z	  dz             d S d S )
Nr   r(   r   rE   r      r   r
   r   )r#   r   r   r+   )r   r   r   s      r   rh   z_OutputBitStream.write$  sa   &&**a/DTME}!!	  ###IbMMMUdm33MMMMMT..MM}!! ! "!!##IUT\*****"$$IUT\***IeqjD0111IerkT1222IerkT122222	 %$r   c                 *    t          | j                  S r_   )rS   r   r   s    r   ri   z_OutputBitStream.toBytes6  s    TYr   )	r   r   r   r   re   r   rh   rS   ri   r   r   r   rf   rf     sr        --S    
33 34 3 3 3 3$             r   rf   )r   r   )r   r`   collectionsr   typingr   r   r   r   r   r   re   __annotations__	Exceptionr   rS   r&   r"   rP   rG   r!   rH   rI   r1   r*   rf   r   r   r   <module>r      s            7 7 7 7 7 7 7 7 7 7 7 7 7 7 &(B21!=!=S#X = = =	 	 	 	 	i 	 	 	
 1;C C
CC*-C
3s8S=C C C C66/
6/"6/,/6/7:6/FI6/
3s8S=6/ 6/ 6/ 6/r8C= U    @C CS CU C C C C
(c (eCHo ( ( ( (c S S    GBCH GBC GB GB GB GB GB GBT c c    %@ %@ %@ %@ %@ %@ %@ %@P                   r   