
    jke                    	   d Z ddlmZ ddlmZ ddlmZmZ ddlmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlZddlZddlZej6                  dz
  Z ej8                  e      ZdZdZ  G d de!      Z" G d dejF                        Z$ G d de%      Z& G d de%      Z'd Z( G d de%      Z) G d de)      Z* G d de)      Z+ G d de)      Z, G d  d!e)      Z- G d" d#e-      Z. G d$ d%e-      Z/ G d& d'e%      Z0 G d( d)e0      Z1 G d* d+e1      Z2 G d, d-e0      Z3 G d. d/e0      Z4 G d0 d1e%      Z5 G d2 d3e%      Z6 G d4 d5e%      Z7d6 Z8d7 Z9d8 Z:d9 Z;d: Z<d; Z=d< Z>d= Z?d> Z@d? ZAd@ ZBdA ZCdB ZDdC ZE G dD dEe%      ZF G dF dGeF      ZG G dH dIeF      ZHdJ ZIdK ZJ G dL dMeF      ZK G dN dOeF      ZL G dP dQeF      ZM G dR dSeM      ZN G dT dUeM      ZO G dV dWeM      ZP G dX dYeF      ZQ G dZ d[e%      ZRd\ ZSd] ZTd^ ZUd_ ZVd` ZWda ZXdb ZY G dc dde%      ZZ G de dfeF      Z[dg Z\dh Z]di Z^dj Z_ G dk dleM      Z` G dm dneF      Za G do dpeF      Zbdq Zcdr Zdds Ze G dt due%      Zf G dv dwe%      Zg G dx dyeF      Zhg dzd{d|d}d eh       fd~ddddd eH       fdddd eH       fdddd eH       fdddd eH       fdddd eH       fddddddddddg ddfddddg ddfddddddddddddd eQ       fddddd e[       fdddd eN       fdd3dd ea       fdddd e`       fdd5dd eP       fdddd eb       fZidzdddg ddfdd3dd ea       fdddd e`       fdd5dd eP       fdddd eb       fgZjdZkdZldelekdddfddddddddddddddddddddddd eO       fgZmdelekdddfddddddddddddddddd eO       fgZndʄ Zo eoem        eoei        G d˄ dej                        Zq G d̈́ dej                        Zr G dτ de%      Zsdф Zt G d҄ des      Zu G dԄ des      Zv G dք des      Zw G d؄ de%      Zx G dڄ dex      Zy G d܄ dex      Zz G dބ dex      Z{ G d de%      Z|g dZ}dZ~ ee}      e~k(  sJ i Z ee~      D ]
  Zeee}e   <    g dZdZ ee      ek(  sJ g dZdZ ee      ek(  sJ g dZdZ ee      ek(  sJ y)a+  cffLib: read/write Adobe CFF fonts

OpenType fonts with PostScript outlines contain a completely independent
font file, Adobe's *Compact Font Format*. So dealing with OpenType fonts
requires also dealing with CFF. This module allows you to read and write
fonts written in the CFF format.

In 2016, OpenType 1.8 introduced the `CFF2 <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2>`_
format which, along with other changes, extended the CFF format to deal with
the demands of variable fonts. This module parses both original CFF and CFF2.

    )sstruct)psCharStrings)	unionRectintRect)bytechrbyteord	bytesjointobytestostrsafeEval)TTFont)OTTableWriter)OTTableReader)otTables)BytesION   z%
	major:   B
	minor:   B
	hdrSize: B
i  c                       e Zd Zy)StopHintCountEventN)__name__
__module____qualname__     ;/usr/lib/python3/dist-packages/fontTools/cffLib/__init__.pyr   r   0   s    r   r   c                   <    e Zd ZdZd
dZd Zd Zd Zd Zd Z	d	 Z
y)_DesubroutinizingT2Decompiler)op_hintmaskop_cntrmask
op_rmoveto
op_hmoveto
op_vmovetoNc                 H    t         j                  j                  | |||       y N)r   SimpleT2Decompiler__init__)self
localSubrsglobalSubrsprivates       r   r%   z&_DesubroutinizingT2Decompiler.__init__=   s    ((11*k7	
r   c                 &   d| _         | j                  D ]  }t        | || j                          t	        |d      r;| j                   r.| j
                  r"	 t        j                  j                  | |       y y g |_
        t        j                  j                  | |       |j                  d d  }t        |j                        D ]R  \  }}|dk\  sJ ||dz
     dv sJ ||dz
            t        ||dz
           t        k(  sJ |d   dk(  r|d d }|||dz
  | T | j                  j                   s@d|v r|d |j#                  d      dz    }n$t%        |      r|d   dk7  r|j'                  d       ||_        |`
y # t        $ r | j
                  d= Y y w xY w)	NT_desubroutinized   r   )callsubr	callgsubrreturnendchar)need_hintcountstop_hintcount_opssetattrstop_hint_counthasattrcallingStackr   r$   executer   _patchesprogramreversedtypeintr)   in_cff2indexlenappendr+   )r&   
charStringop_namedesubroutinizedidx	expansions         r   r8   z%_DesubroutinizingT2Decompiler.executeB   s   ".. 	9GD'4#7#78	9 :12
 ""t'8'8.!44<<T:N  
((00zB$,,Q/&z':':; 		7NC!8O8"37+ 0  ( sQw'(  a01S888}(%crN	-6OC!Gc*		7 ||##O+"1:o++I6:# ?+r/Bh/N#**84&5
#9 * .))"-.s    E7 7FFc                     | j                   | j                  d   | j                  z      }t        j                  j                  | |       | j                  ||       y Nr,   )r'   operandStack	localBiasr   r$   op_callsubrprocessSubrr&   r?   subrs      r   rK   z)_DesubroutinizingT2Decompiler.op_callsubrm   sJ    t004t~~EF((44T5A%r   c                     | j                   | j                  d   | j                  z      }t        j                  j                  | |       | j                  ||       y rH   )r(   rI   
globalBiasr   r$   op_callgsubrrL   rM   s      r   rQ   z*_DesubroutinizingT2Decompiler.op_callgsubrr   sL     1 1" 5 GH((55dEB%r   c                     d| _         | j                  D ]  }t        | |d         | j                  d   }t	        |d      r
t               y )NFr,   r+   )r2   r3   r4   r7   r6   r   )r&   argsrC   css       r   r5   z-_DesubroutinizingT2Decompiler.stop_hint_countw   sT    #.. 	)GD'4(	)r"2)*$&& +r   c                 ~    t         j                  j                  | |       | j                  r| j	                          y y r#   )r   r$   r   r2   r5   r&   r?   s     r   r   z)_DesubroutinizingT2Decompiler.op_hintmask   s2    ((44T5A  " r   c                     | j                   d   }t        |d      s(|j                  j                  ||j                  f       y y )Nr,   r+   )r7   r6   r9   rA   r+   )r&   r?   rN   rT   s       r   rL   z)_DesubroutinizingT2Decompiler.processSubr   s?    r"r-.KKt'<'<=> /r   r#   )r   r   r   r3   r%   r8   rK   rQ   r5   r   rL   r   r   r   r   r   4   s.    

) V&
&
'#
?r   r   c                   R    e Zd ZdZddZd Zd Zd Zd ZddZ	d	 Z
dd
Zd Zd Zy)
CFFFontSetan  A CFF font "file" can contain more than one font, although this is
    extremely rare (and not allowed within OpenType fonts).

    This class is the entry point for parsing a CFF table. To actually
    manipulate the data inside the CFF font, you will want to access the
    ``CFFFontSet``'s :class:`TopDict` object. To do this, a ``CFFFontSet``
    object can either be treated as a dictionary (with appropriate
    ``keys()`` and ``values()`` methods) mapping font names to :class:`TopDict`
    objects, or as a list.

    .. code:: python

            from fontTools import ttLib
            tt = ttLib.TTFont("Tests/cffLib/data/LinLibertine_RBI.otf")
            tt["CFF "].cff
            # <fontTools.cffLib.CFFFontSet object at 0x101e24c90>
            tt["CFF "].cff[0] # Here's your actual font data
            # <fontTools.cffLib.TopDict object at 0x1020f1fd0>

    Nc                    || _         t        j                  t        |j	                  d      |        |/|rdnd}| j
                  |k7  r>t        d|| j
                  fz        | j
                  dv sJ d       | j
                  dk(  }|st        j                  d|j	                  d            d	   | _        |j                  | j                         t        d
 t        ||      D              | _        t        ||      | _        t!        |      | _        nt        j                  d|j	                  d            d	   | _        |j                  | j                         dg| _        |j&                  }t        ||| j$                  |      | _        d| _        t)        ||      | _        | j"                  | j                  _        | j*                  | j                  _        y)a  Parse a binary CFF file into an internal representation. ``file``
        should be a file handle object. ``otFont`` is the top-level
        :py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

        If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
        library makes an assertion that the CFF header is of the appropriate
        version.
           Nr-   r   2Invalid CFF 'major' version: expected %d, found %dr   r-   Unknown CFF formatBr   c              3   2   K   | ]  }t        |        y wr#   r   ).0ss     r   	<genexpr>z'CFFFontSet.decompile.<locals>.<genexpr>   s     !Oq%(!Os   isCFF2>HCFF2Font)otFontr   unpackcffHeaderFormatreadmajor
ValueErrorstructoffSizeseekhdrSizelistIndex	fontNamesTopDictIndextopDictIndexIndexedStringsstringstopDictSizegetGlyphOrderGlobalSubrsIndexGlobalSubrs)r&   fileri   rf   expected_majorcff2GetGlyphOrders         r   	decompilezCFFFontSet.decompile   s    		!d; #)QaNzz^+ H%tzz23  ::'=)=='ZZ1_F!==diil;A>DLIIdll#!!OE$v4N!OODN ,T& AD)$/DL%}}T499Q<@CDIIdll#(\DN & 4 4 ,')9)9&!D  DL+D@$(LL!(,(8(8%r   c                 ,    t        | j                        S r#   )r@   ru   r&   s    r   __len__zCFFFontSet.__len__   s    4>>""r   c                 ,    t        | j                        S r#   )rs   ru   r   s    r   keyszCFFFontSet.keys   s    DNN##r   c                     | j                   S r#   )rw   r   s    r   valueszCFFFontSet.values   s       r   c                     t        |d      r|j                         }n:t        |t              r|}	 | j                  j                  |      }nt        |      | j                  |   S # t        $ r t        |      w xY w)z{Return TopDict instance identified by name (str) or index (int
        or any object that implements `__index__`).
        	__index__)
r6   r   
isinstancestrru   r?   rn   KeyError	TypeErrorrw   )r&   nameOrIndexr?   names       r   __getitem__zCFFFontSet.__getitem__   s~     ;,))+ES)D,,,T2 K((  ''	  ,{++,s   A' 'A<c                    || _         |/|rdnd}| j                  |k7  r>t        d|| j                  fz        | j                  dv sJ d       | j                  dk(  }|j                  r#|s!| j                  D ]  }|j                           |st               }nd}t        |      }| j                  j                  || |      }|rud| _	        |j                  t        j                  t        |              |j                         | _        |j                  t!        j                  d	| j                               nfd
| _	        d
| _        |j                  t        j                  t        |              |j                  t!        j                  d| j"                               |sOt%               }	| j&                  D ]  }
|	j)                  |
        |j                  |	j                  || |             |j                  |       |s|j                  |j                                |j                  | j*                  j                  || |             | j                  D ]2  }t-        |d      r|j.                  |j1                         }||_        4 |j3                  |      }|D ]  }|j                  |        |j5                  |       y)a  Write the object back into binary representation onto the given file.
        ``file`` should be a file handle object. ``otFont`` is the top-level
        :py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

        If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
        library makes an assertion that the CFF header is of the appropriate
        version.
        Nr-   r   r\   r]   r^   re      rg      r_   charset)ri   rm   rn   recalcBBoxesrw   recalcFontBBoxrx   	CFFWritergetCompilerrr   addr   packrk   getDataLengthrz   ro   rp   rt   ru   rA   r}   r6   r   r{   getChildrentoFile)r&   r~   ri   rf   r   topDictry   writertopCompilerru   r   r   childrenchilds                 r   compilezCFFFontSet.compile   sk    "(QaNzz^+ H%tzz23  ::'=)=='ZZ1_Fv,, )&&() $&GG6"''33GT&3QDLJJw||OT:;*88:DJJv{{4)9)9:;DLDLJJw||OT:;JJv{{356I '  &'JJy,,Wd6,JK

;JJw**,-

4##//f/MN(( 	*G7I.'//2I ..0")	* **73 	EJJu	 	dr   c                 z   |j                  d| j                         |j                          |j                  d| j                         |j                          | j                  D ]e  }|j                  dt        |             |j                          | |   }|j                  |       |j                  d       |j                          g |j                          |j                  d       |j                          | j                  j                  |       |j                  d       |j                          y)zWrite the object into XML representation onto the given
        :class:`fontTools.misc.xmlWriter.XMLWriter`.

        .. code:: python

                writer = xmlWriter.XMLWriter(sys.stdout)
                tt["CFF "].cff.toXML(writer)

        rm   valueminorCFFFontr   r}   N)
	simpletagrm   newliner   ru   begintagr   toXMLendtagr}   )r&   	xmlWriterfontNamefonts       r   r   zCFFFontSet.toXML&  s    	G4::6G4::6 	 HyuX?>DJJy!Y'	  	=)y)'r   c                    || _         t        | d      sd| _        t        | d      sd| _        |dk(  r| j                  dk(  rt        | d      sd| _        t        | d      sd| _        t        | d	      st               | _        t        | d
      sg | _        t               | _
        |d   }| j                  j                  |       t        | j                        }d|_        n| j                  dk(  rt        | d      sd| _        t        | d	      st               | _        t        | d
      sdg| _        | j                   j                  }t        | j                  |      }t        d|      | _
        | j                  j                         |D ],  }t        |t               r|\  }}}|j#                  |||       . t        |d      rV|j$                  d   j&                  <|j$                  }	|	D ]*  }
t        |
d      s|j(                  |
j*                  _        , yyy|d	k(  rt,        j.                  }t        | d	      st               | _        |D ]N  }t        |t               r|\  }}} |       }|j#                  |||       | j                  j                  |       P y|dk(  rt1        |d         | _        y|dk(  rt1        |d         | _        yy)z?Reads data from the XML element into the ``CFFFontSet`` object.rm   r   r   r   r   rp   r   rr   r}   ru   r   )r}   Nr-   r   rh   )r}   r   VarStorePrivater   )ri   r6   rm   r   rp   rr   r|   r}   ru   rv   rw   rA   TopDictr   r{   r   r   fromXMLFDArrayvstorer   r   r   T2CharStringr=   )r&   r   attrscontentri   r   r   r   elementfdArrayfontDictsubrCharStringClassrN   s                r   r   zCFFFontSet.fromXMLC  s    tW%DJtW%DJ9zzQtY/#$DLtY/#$DLt]3'7'9D$t[1%'DN(4D% =%%h/!d.>.>?"&qtY/#$DLt]3'7'9D$t[1&0\DN$(KK$=$=!! $ 0 0DU %17H$I!$$W-" 6gs+'.$eWeW5	6 w
+0B0I0I0Q!// ' CHx3292B2B((/C 1R+ ]""/"<"<4/#3#5 " .gs+'.$eW*,T5'2  ''-. W_U7^,DJW_U7^,DJ r   c                    d| _         | j                  j                  }t        d|      }| j                  j
                  |_        || _        |d   }t        |d      r|j                  }nd}t        t              }||_
        ||_        t        D ]@  }|d   }||vs||j                  v r|j                  |= t        ||      s5t        ||       B t        |d      st               x}	|_        d|	_        |j$                  |	_        |	|j$                  _        |j(                  }
|
j*                  r|	|
j,                  _        n|	|
_        t/               }|j1                  d       |	j3                  |       ||_        t        t4              }t6        D ]@  }|d   }||vs||j                  v r|j                  |= t        ||      s5t        ||       B n|j                   }	t        t4              }|	D ]  }|j1                  d       |j                  j9                         D ]7  }||j                  vs|j                  |= t        ||      s,t        ||       9 |j                  }t6        D ]@  }|d   }||vs||j                  v r|j                  |= t        ||      s5t        ||       B  t;               }| j=                  ||d       |j?                  d       | jA                  ||d       y)	zConverts this object from CFF format to CFF2 format. This conversion
        is done 'in-place'. The conversion cannot be reversed.

        This assumes a decompiled CFF table. (i.e. that the object has been
        filled via :meth:`decompile`.)r-   Nr   r   r   r   Tre   )!rm   ri   r{   rv   rw   itemsr6   r   
buildOrdertopDictOperators2orderr   topDictOperatorsrawDictdelattrFDArrayIndexr   ry   r}   r   CharStringscharStringsAreIndexedcharStringsIndexFontDictsetCFF2rA   privateDictOperators2privateDictOperatorsr   r   r   rq   r   )r&   ri   r   topDictDatar   privateDictopOrderentrykeyr   charStringsr   privateOpOrderr~   s                 r   convertCFFToCFF2zCFFFontSet.convertCFFToCFF2  s    
 KK55"4):; --33'a.7I&!//KK./$5!% 	*E(C'!'//),7C(GS)	* w	*(46Ggo"GO")"5"5G*1G'!--K007>,,4&-#zHT"NN8$*H'(=>N- 2Ahn,k111'//4{C0S12 ooG'(=>N# 6  &#++002 3C(..0$,,S1"8S1#Hc2	3 '..1 6E(C.0+"5"55 + 3 3C 8";4#K566( yT6$/		!tVD1r   c                    | j                   D ]0  }| |   }|j                  }|j                  D ]  }|j                  |      \  }}|j	                          t        |j                  dg       }t        ||j                  |j                        }|j                  |       |j                  |_        |`
 t        |d      rH|j                  D ]8  }	|	j                  }
t        |
d      r|
`d|
j                   v s,|
j                   d= : |j                  }
t        |
d      r|
`d|
j                   v s$|
j                   d= 3 | j"                  j%                          y )NSubrsr   )ru   r   r   getItemAndSelectorr   getattrr)   r   r(   r8   r+   r:   r6   r   r   r   r   r}   clear)r&   r   r   rT   gc_subrs
decompilerfdpds              r   desubroutinizezCFFFontSet.desubroutinize  s<    	,H>D!!B\\ 	',,Q/1		7B7:1==!))
 ""1%..	&	' tY',, 0BBr7+H"**,JJw/0 \\2w'bjj(

7+5	,8 	 r   r#   )r   r   r   __doc__r   r   r   r   r   r   r   r   r   r   r   r   r   rY   rY      s?    *+9Z#$!( >@:B-HN2`!r   rY   c                   "    e Zd ZdZd Zd Zd Zy)r   zXHelper class for serializing CFF data to binary. Used by
    :meth:`CFFFontSet.compile`.c                      g | _         || _        y r#   )datarf   r&   rf   s     r   r%   zCFFWriter.__init__  s    	r   c                 :    | j                   j                  |       y r#   )r   rA   )r&   tables     r   r   zCFFWriter.add  s    		r   c                    d }d}	 t         j                  t        d|       |dz   }d}|g}| j                  D ]  }t        |d      rE||j	                         z   }t        |t              r0|j                  r$|j	                         | _        n|t        |      z   }t        |d      r|j                  ||       |}|j                  |        ||k(  rn|}t         j                  t        d       |j                         }| j                  r.t        j                  d| j                        | j                  d<   n@t        |d         | _        t        j                  d	| j                         | j                  d<   dg}| j                  D ]S  }t        |d
      r|j#                  |       n|j%                  |       |j                  |j                         |z
         U ||k(  sJ y )Nr   z CFFWriter.toFile() iteration: %dr   r   setPosz#CFFWriter.toFile() writing to file.rg   r,   r_   r   )logDEBUGr   r6   r   r   TopDictIndexCompilerrf   rz   r@   r   rA   tellro   r   calcOffSizerp   r   write)	r&   r~   lastPosListcountposposListitemendPosbegins	            r   r   zCFFWriter.toFile  s   GGE=uEAIECeG		 
$41 4#5#5#77F!$(<=$+++/+=+=+?( 3t9_F4*KKV,s#
$ +%!K% & 	<=		;;!;;tT-=-=>DIIaL&{27DL!;;sDLL9DIIaL#II 	0DtX&D!

4 NN499;./	0 +%%%r   N)r   r   r   r   r%   r   r   r   r   r   r   r     s    # $&r   r   c                 @    | dk  rd}|S | dk  rd}|S | dk  rd}|S d}|S )N   r   i   r-   i   r[   r   r   )largestOffsetrp   s     r   r   r   )  sN    u N 
	 
 N	 
	" N Nr   c                   0    e Zd ZdZddZd Zd Zd Zd Zy)	IndexCompilerzBase class for writing CFF `INDEX data <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#5-index-data>`_
    to binary.Nc                     |t        |d      r|j                  }|J || _        | j                  ||      | _        || _        y Nrf   )r6   rf   getItemsr   parent)r&   r   ry   r  rf   s        r   r%   zIndexCompiler.__init__9  sE    >gfh7]]F%%%]]5'2
r   c                     |S r#   r   r&   r   ry   s      r   r  zIndexCompiler.getItemsA      r   c                     | j                   rWd}|g}| j                   D ]A  }t        |d      r||j                         z   }n|t        |      z   }|j	                  |       C |S g }|S )Nr   r   )r   r6   r   r@   rA   )r&   r   offsetsr   s       r   
getOffsetszIndexCompiler.getOffsetsD  sq    ::CeG

 $41 2 2 44CD	/Cs#$  Gr   c                     | j                   rd}nd}| j                  rG| j                         d   }t        |      }|dz   t	        | j                        dz   |z  z   |z   dz
  }|S |}|S )Nr   r-   r,   r   )rf   r   r
  r   r@   )r&   	countSize
lastOffsetrp   
dataLengths        r   r   zIndexCompiler.getDataLengthS  s    ;;II::*2.J!*-Gtzz?Q&'12  	   #Jr   c                 2   | j                         }| j                  r t        |t        | j                               nt        |t        | j                               | j                  rt        |d         }t        ||       | }t        j                  }|D ]0  } |d|      |d  }t        |      | k(  sJ |j                  |       2 | j                  D ]>  }t        |d      r|j                  |       !t        |d      }|j                  |       @ y y )Nr,   >lr   latin1encoding)r
  rf   writeCard32r@   r   writeCard16r   
writeCard8ro   r   r   r6   r   r
   )	r&   r~   r	  rp   r   offset	binOffsetr   r   s	            r   r   zIndexCompiler.toFilei  s    //#;;c$**o.c$**o.::!'"+.GtW%hG;;D! & v.wx8	9~'111

9%& 

 %4*KK%"4(;DJJt$% r   r#   )	r   r   r   r   r%   r  r
  r   r   r   r   r   r   r   5  s     ,%r   r   c                       e Zd Zd Zy)IndexedStringsCompilerc                     |j                   S r#   ry   r  s      r   r  zIndexedStringsCompiler.getItems  s    }}r   N)r   r   r   r  r   r   r   r  r    s    r   r  c                   B     e Zd ZdZd Zd Z fdZ fdZ fdZ xZ	S )r   z/Helper class for writing the TopDict to binary.c                 Z    g }|D ]#  }|j                  |j                  ||              % |S r#   rA   r   r&   r   ry   outr   s        r   r  zTopDictIndexCompiler.getItems  4     	8DJJt''67	8
r   c                 l    g }| j                   D ]"  }|j                  |j                  |             $ |S r#   r   extendr   )r&   ry   r   r   s       r   r   z TopDictIndexCompiler.getChildren  s6    zz 	:GOOG//89	:r   c                     | j                   r!d| j                  d   j                         g}|S t        t        |          S Nr   )rf   r   r   superr   r
  )r&   r	  	__class__s     r   r
  zTopDictIndexCompiler.getOffsets  s;    ;;$**Q-5578GN-t?AAr   c                 ~    | j                   r| j                  d   j                         }|S t        t        |          S r'  )rf   r   r   r(  r   )r&   r  r)  s     r   r   z"TopDictIndexCompiler.getDataLength  s7    ;;A446J-tBDDr   c                     | j                   r| j                  d   j                  |       y t        t        |   |       y r'  )rf   r   r   r(  r   )r&   r~   r)  s     r   r   zTopDictIndexCompiler.toFile  s0    ;;JJqM  &&4T:r   )
r   r   r   r   r  r   r
  r   r   __classcell__r)  s   @r   r   r     s&    9BE; ;r   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)FDArrayIndexCompilerzHelper class for writing the
    `Font DICT INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#10-font-dict-index-font-dicts-and-fdselect>`_
    to binary.c                 Z    g }|D ]#  }|j                  |j                  ||              % |S r#   r  r   s        r   r  zFDArrayIndexCompiler.getItems  r"  r   c                 l    g }| j                   D ]"  }|j                  |j                  |             $ |S r#   r$  )r&   ry   r   r   s       r   r   z FDArrayIndexCompiler.getChildren  s6    

 	;HOOH009:	;r   c                    | j                         }| j                  r t        |t        | j                               nt        |t        | j                               t        |d         }t        ||       | }t        j                  }|D ]0  } |d|      |d  }t        |      | k(  sJ |j                  |       2 | j                  D ]1  }t        |d      r|j                  |       !|j                  |       3 y )Nr,   r  r   )r
  rf   r  r@   r   r  r   r  ro   r   r   r6   r   )r&   r~   r	  rp   r   r  r  r   s           r   r   zFDArrayIndexCompiler.toFile  s    //#;;c$**o.c$**o.gbk*4!({{ 	"FT6*784Iy>gX---JJy!	" JJ 	!DtX&D!

4 		!r   c                 6    || j                   j                  d<   y )Nr   r  r   r&   r   r   s      r   r   zFDArrayIndexCompiler.setPos      ),I&r   N)r   r   r   r   r  r   r   r   r   r   r   r/  r/    s    !(-r   r/  c                       e Zd ZdZd Zy)GlobalSubrsCompilerzHelper class for writing the `global subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                     g }|D ]8  }|j                  | j                         |j                  |j                         : |S r#   r   rf   rA   bytecoder&   r   ry   r!  rT   s        r   r  zGlobalSubrsCompiler.getItems  =     	$BJJt{{#JJr{{#	$ 
r   N)r   r   r   r   r  r   r   r   r8  r8    s    r   r8  c                       e Zd ZdZd Zy)SubrsCompilerzHelper class for writing the `local subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                 h    || j                   j                  z
  }|| j                   j                  d<   y Nr   )r  r   r   )r&   r   r   r  s       r   r   zSubrsCompiler.setPos  s(    t{{&'-G$r   N)r   r   r   r   r   r   r   r   r?  r?    s    .r   r?  c                       e Zd ZdZd Zd Zy)CharStringsCompilerzHelper class for writing the `CharStrings INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
    to binary.c                     g }|D ]8  }|j                  | j                         |j                  |j                         : |S r#   r:  r<  s        r   r  zCharStringsCompiler.getItems  r=  r   c                 6    || j                   j                  d<   y Nr   r4  r5  s      r   r   zCharStringsCompiler.setPos  s    -0M*r   N)r   r   r   r   r  r   r   r   r   rC  rC    s    1r   rC  c                   H    e Zd ZdZeZddZd Zd Zd Z	d Z
d Zdd	Zd
 Zy)rt   zThis class represents what the CFF spec calls an INDEX (an array of
    variable-sized objects). `Index` items can be addressed and set using
    Python list indexing.Nc                 (   |d u |d u k(  sJ g | _         | j                  j                  }|y || _        t        j	                  t
        d||j                                || _        |rt        |      }nt        |      }|dk(  ry d g|z  | _         t        |      }t        j	                  t
        d||       |dk  s
J d|z         g x| _        }dd|z
  z  }t        |dz         D ]J  }|j                  |      }	||	z   }	t        j                  d|	      \  }
|j!                  t#        |
             L |j                         dz
  | _        |j'                  | j$                  |d	   z          t        j	                  t
        d
||j                                y )Nloading %s at %sr   z    index count: %s offSize: %sr   zoffSize too large: %s    r   >Lr,       end of %s at %s)r   r)  r   _isCFF2r   r   r   r~   
readCard32
readCard16	readCard8r	  rangerl   ro   rj   rA   r=   
offsetBaserq   )r&   r~   rf   r   r   rp   r	  padr?   chunkr  s              r   r%   zIndex.__init__  sn   $DDL111
~~&&<)4=	t$Et$EA:Ve^
D/8%I!|>4w>>|!##wq7{#519% 	(EIIg&E%KEdE2IVNN3v;'		(
 ))+/		$//GBK/0,dDIIK@r   c                 ,    t        | j                        S r#   )r@   r   r   s    r   r   zIndex.__len__  s    4::r   c                 j   | j                   |   }||S | j                  |   | j                  z   }| j                  |dz      | j                  |   z
  }| j                  }|j	                  |       |j                  |      }t        |      |k(  sJ | j                  ||||      }|| j                   |<   |S Nr   )r   r	  rR  r~   rq   rl   r@   produceItem)r&   r?   r   r  sizer~   r   s          r   r   zIndex.__getitem__  s    zz% Ke$t6||EAI&e)<<yy		&yy4yD   tT6: 

5r   c                 "    || j                   |<   y r#   r   )r&   r?   r   s      r   __setitem__zIndex.__setitem__-  s     

5r   c                     |S r#   r   )r&   r?   r   r~   r  s        r   rX  zIndex.produceItem0  s    r   c                 :    | j                   j                  |       y)zAdd an item to an INDEX.N)r   rA   )r&   r   s     r   rA   zIndex.append3  s    

$r   c                 ,    | j                  | |||      S Nre   compilerClassr&   ry   r  rf   s       r   r   zIndex.getCompiler7      !!$!GGr   c                 "    | j                   dd= y)zEmpty the INDEX.Nr[  r   s    r   r   zIndex.clear:  s    JJqMr   NNr#   )r   r   r   r   r   rb  r%   r   r   r\  rX  rA   r   r   r   r   r   rt   rt     s8     "MA<! Hr   rt   c                   |     e Zd ZdZeZej                  Zej                  Z		 	 	 	 	 	 d fd	Z
d Zd Zd Zd Z xZS )r|   ay  This index contains all the global subroutines in the font. A global
    subroutine is a set of ``CharString`` data which is accessible to any
    glyph in the font, and are used to store repeated instructions - for
    example, components may be encoded as global subroutines, but so could
    hinting instructions.

    Remember that when interpreting a ``callgsubr`` instruction (or indeed
    a ``callsubr`` instruction) that you will need to add the "subroutine
    number bias" to number given:

    .. code:: python

            tt = ttLib.TTFont("Almendra-Bold.otf")
            u = tt["CFF "].cff[0].CharStrings["udieresis"]
            u.decompile()

            u.toXML(XMLWriter(sys.stdout))
            # <some stuff>
            # -64 callgsubr <-- Subroutine which implements the dieresis mark
            # <other stuff>

            tt["CFF "].cff[0].GlobalSubrs[-64] # <-- WRONG
            # <T2CharString (bytecode) at 103451d10>

            tt["CFF "].cff[0].GlobalSubrs[-64 + 107] # <-- RIGHT
            # <T2CharString (source) at 103451390>

    ("The bias applied depends on the number of subrs (gsubrs). If the number of
    subrs (gsubrs) is less than 1240, the bias is 107. Otherwise if it is less
    than 33900, it is 1131; otherwise it is 32768.",
    `Subroutine Operators <https://docs.microsoft.com/en-us/typography/opentype/otspec180/cff2charstr#section4.4>`)
    c                 r    t         t        |   ||       || _        || _        |r|| _        |r|| _        y y r`  )r(  r|   r%   r(   r)   fdSelectr   )r&   r~   r(   r)   ri  r   rf   r)  s          r   r%   zGlobalSubrsIndex.__init__e  sB     	.tF.C&$DM"DL r   c                 ,   | j                   | j                   }n^t        | d      rP| j                  Dt        | d      r| j                  | j                  |   }nd}| j                  |   j                  }nd }| j                  ||| j                        S )Nr   ri  r   r)   r(   )r)   r6   r   ri  r   	subrClassr(   )r&   r?   r   r~   r  r)   fdIndexs          r   rX  zGlobalSubrsIndex.produceItemv  s    <<#llGT9%$,,*BtZ(T]]-F--.ll7+33GG~~dGAQAQ~RRr   c                 v   |j                  d       |j                          t        t        |             D ]  }| |   }|j	                         r|j                  d|d       n|j                  d|       |j                          |j                  |       |j                  d       |j                           y)a  Write the subroutines index into XML representation onto the given
        :class:`fontTools.misc.xmlWriter.XMLWriter`.

        .. code:: python

                writer = xmlWriter.XMLWriter(sys.stdout)
                tt["CFF "].cff[0].GlobalSubrs.toXML(writer)

        zDThe 'index' attribute is only for humans; it is ignored when parsed.
CharStringr   )r?   rawr?   N)commentr   rQ  r@   needsDecompilationr   r   r   )r&   r   irN   s       r   r   zGlobalSubrsIndex.toXML  s     	U	
 	s4y! 		 A7D&&(""<qa"@""<q"9JJy!\*		 r   c                 x    |dk7  ry | j                         }|j                  |||       | j                  |       y )Nro  )rl  r   rA   )r&   r   r   r   rN   s        r   r   zGlobalSubrsIndex.fromXML  s5    <~~T5'*Dr   c                 J    d }t        | d      r| j                  |   }| |   |fS )Nri  )r6   ri  )r&   r?   sels      r   r   z#GlobalSubrsIndex.getItemAndSelector  s.    4$--&CE{Cr   NNNNNN)r   r   r   r   r8  rb  r   r   rl  charStringClassr%   rX  r   r   r   r,  r-  s   @r   r|   r|   ?  sT    B (M**I#00O #"S 2 r   r|   c                       e Zd ZdZeZy)
SubrsIndexzThis index contains a glyph's local subroutines. A local subroutine is a
    private set of ``CharString`` data which is accessible only to the glyph to
    which the index is attached.N)r   r   r   r   r?  rb  r   r   r   r{  r{    s    $ "Mr   r{  c                   4     e Zd ZdZeZd fd	Zd Zd Z xZ	S )rv   a  This index represents the array of ``TopDict`` structures in the font
    (again, usually only one entry is present). Hence the following calls are
    equivalent:

    .. code:: python

            tt["CFF "].cff[0]
            # <fontTools.cffLib.TopDict object at 0x102ed6e50>
            tt["CFF "].cff.topDictIndex[0]
            # <fontTools.cffLib.TopDict object at 0x102ed6e50>

    c                    |d u |d u k(  sJ || _         ||r|| _        g | _        | j                  j                  }t
        j                  t        d||j                                || _        d}d g|z  | _        d|g| _	        |j                         | _
        |j                  | j                  |z          t
        j                  t        d||j                                y t        t        | ;  ||       y )NrI  r   r   rL  re   )r   rM  r   r)  r   r   r   r   r~   r	  rR  rq   r(  rv   r%   )r&   r~   r   topSizerf   r   r   r)  s          r   r%   zTopDictIndex.__init__  s    $DDL111!2!DLDJ>>**DGGE-tTYY[ADIE%DJw<DL"iikDOIIdoo/0GGE0$		D,.tF.Cr   c                     t        | j                  ||| j                  | j                  | j                        }|j                  |       |S r`  )r   ry   r}   r   rM  r   )r&   r?   r   r~   r  tops         r   rX  zTopDictIndex.produceItem  sE    LL""<<
 	d
r   c                     t        t        |             D ]Z  }|j                  d|       |j                          | |   j	                  |       |j                  d       |j                          \ y Nr   rq  rQ  r@   r   r   r   r   r&   r   rt  s      r   r   zTopDictIndex.toXML  c    s4y! 	 Az3GMM)$Z(	 r   )NNr   N)
r   r   r   r   r   rb  r%   rX  r   r,  r-  s   @r   rv   rv     s     )MD&
 r   rv   c                   "    e Zd ZeZd Zd Zd Zy)r   c                     t        t        |             D ]Z  }|j                  d|       |j                          | |   j	                  |       |j                  d       |j                          \ y r  r  r  s      r   r   zFDArrayIndex.toXML  r  r   c                     t        | j                  ||| j                  | j                  | j                        }|j                  |       |S N)rf   r   )r   ry   r}   rM  r   r   )r&   r?   r   r~   r  r   s         r   rX  zFDArrayIndex.produceItem  sE    LL<<;;
 	4 r   c                     |dk7  ry t               }|D ],  }t        |t              r|\  }}}|j                  |||       . | j	                  |       y )Nr   )r   r   r   r   rA   )r&   r   r   r   r   r   s         r   r   zFDArrayIndex.fromXML  s\    :: 	3G'3'#* D%T5'2		3
 	Hr   N)r   r   r   r/  rb  r   rX  r   r   r   r   r   r     s    (M 
	r   r   c                   8    e Zd Zd	dZd Zd Zd Zd Zd Zd Z	y)
VarStoreDataNc                 L    || _         d | _        || _        t               | _        y r#   )r~   r   
otVarStorer   r   )r&   r~   r  s      r   r%   zVarStoreData.__init__  s     		$H	r   c                 6   | j                   rt        | j                         }| j                   j                  |      | _        i }t	        | j                  |      }t        j                         | _        | j                  j                  || j                         | S r#   )
r~   rO  rl   r   r   otr   r  r   r   )r&   lengthglobalStatereaders       r   r   zVarStoreData.decompile  sj    99		*F		v.DIK"499k:F kkmDOOO%%fdii8r   c                     t               }| j                  j                  || j                         |j	                         | _        y r#   )r   r  r   r   
getAllDatar   )r&   r   s     r   r   zVarStoreData.compile  s3    		2 %%'	r   c                 P    | j                   j                  || j                         y r#   )r  r   r   )r&   r   r   s      r   writeXMLzVarStoreData.writeXML&  s    i3r   c                     t        j                         | _        |D ]A  }t        |t              r/|\  }}}| j                  j                  |||| j                         BC y r#   )r  r   r  r   tupler   r   )r&   r   r   r   r  r   s         r   xmlReadzVarStoreData.xmlRead)  sX    ++- 	G'5)'.$eW''eWdiiH	 r   c                 ,    t        | j                        S r#   r@   r   r   s    r   r   zVarStoreData.__len__3      499~r   c                 X    |d}| j                   j                  |   }|j                  }|S r'  )r  VarDataVarRegionCount)r&   vsIndexvarData
numRegionss       r   getNumRegionszVarStoreData.getNumRegions6  s1    ?G//))'2++
r   rf  )
r   r   r   r%   r   r   r  r  r   r  r   r   r   r  r    s%    	(4r   r  c                   ,    e Zd ZddZd Zd Zd Zd Zy)FDSelectNc                    |ryt        |      | _        | j                  dk(  r2ddlm}  |d|j                  |            j	                         | _        y | j                  dk(  rd g|z  }t        |      }d }d }t        |      D ]2  }	t        |      }
|t        ||
      D ]  }|||<   	 |
}t        |      }4 |!t        |      }
t        ||
      D ]  }|||<   	 || _        y | j                  dk(  rd g|z  }t        |      }d }d }t        |      D ]2  }	t        |      }
|t        ||
      D ]  }|||<   	 |
}t        |      }4 |!t        |      }
t        ||
      D ]  }|||<   	 || _        y J d|z         || _        g | _        y )Nr   )arrayr_   r[   r   zunsupported FDSelect format: %s)	rP  formatr  rl   tolistgidArrayrO  rQ  rN  )r&   r~   	numGlyphsr  r  r  nRangesr   prevrt  firstglyphIDs               r   r%   zFDSelect.__init__?  s   #D/DK{{a' %c499Y+? @ G G I! 6I-$T*w )A&t,E'',T5'9 3G02HW-3 D"4B) #&t,E#(u#5 /,.)/ (! 6I-$T*w *A&t,E'',T5'9 3G02HW-3 D#D)B* #&t,E#(u#5 /,.)/ (H?&HHu !DKDMr   c                 ,    t        | j                        S r#   )r@   r  r   s    r   r   zFDSelect.__len__q  s    4==!!r   c                      | j                   |   S r#   r  rV   s     r   r   zFDSelect.__getitem__t  s    }}U##r   c                 "    || j                   |<   y r#   r  )r&   r?   fdSelectValues      r   r\  zFDSelect.__setitem__w  s    ,er   c                 :    | j                   j                  |       y r#   )r  rA   )r&   r  s     r   rA   zFDSelect.appendz  s    ]+r   )NNN)r   r   r   r%   r   r   r\  rA   r   r   r   r  r  >  s    0d"$-,r   r  c                   V    e Zd ZdZ	 	 ddZd Zd Zd ZeZd Z	d Z
d	 Zd
 Zd Zd Zy)r   a  The ``CharStrings`` in the font represent the instructions for drawing
    each glyph. This object presents a dictionary interface to the font's
    CharStrings, indexed by glyph name:

    .. code:: python

            tt["CFF "].cff[0].CharStrings["a"]
            # <T2CharString (bytecode) at 103451e90>

    See :class:`fontTools.misc.psCharStrings.T1CharString` and
    :class:`fontTools.misc.psCharStrings.T2CharString` for how to decompile,
    compile and interpret the glyph drawing instructions in the returned objects.

    Nc	                    || _         || _        |Ht        ||||||      | _        i x| _        }	t        t        |            D ]
  }
|
|	||
   <    d| _        y i | _        d| _        || _        ||| _	        ||| _
        y y )Nre   r   r   )r(   varStorer{  r   r   rQ  r@   r   r)   ri  r   )r&   r~   r   r(   r)   ri  r   rf   r  r   rt  s              r   r%   zCharStrings.__init__  s     ' $.k7Hgf%D! .0/D{3w<( ,*+GAJ', *+D&!D)*D&"DL# ("& #r   c                 H    t        | j                  j                               S r#   )rs   r   r   r   s    r   r   zCharStrings.keys  s    D$$))+,,r   c                 x    | j                   r| j                  S t        | j                  j	                               S r#   )r   r   rs   r   r   r   s    r   r   zCharStrings.values  s1    %%(((((//122r   c                     || j                   v S r#   )r   )r&   r   s     r   has_keyzCharStrings.has_key  s    t''''r   c                 ,    t        | j                        S r#   )r@   r   r   s    r   r   zCharStrings.__len__  s    4##$$r   c                 Z    | j                   |   }| j                  r| j                  |   }|S r#   )r   r   r   )r&   r   rB   s      r   r   zCharStrings.__getitem__  s1    %%d+
%%..z:Jr   c                 x    | j                   r| j                  |   }|| j                  |<   y || j                  |<   y r#   )r   r   r   )r&   r   rB   r?   s       r   r\  zCharStrings.__setitem__  s;    %%$$T*E+5D!!%(%/DT"r   c                     | j                   r*| j                  |   }| j                  j                  |      S t	        | d      r)t	        | d      r| j                  |   j
                  }nd}nd }| j                  |   |fS )Nr   ri  r   )r   r   r   r   r6   fdSelectIndex)r&   r   r?   rw  s       r   r   zCharStrings.getItemAndSelector  s|    %%$$T*E((;;EBBtY'4,**40>>CC##D)3..r   c                    t        | j                               }|D ]  }| j                  |      \  }}|j                         rdg}ng }||j	                  dd|fg|z          n|j	                  dd|fd|fg|z          |j                          |j                  |       |j                  d       |j                           y )N)rp  r   ro  r   r  )sortedr   r   rs  r   r   r   r   )r&   r   namesr   charStrr  rp  s          r   r   zCharStrings.toXML  s    tyy{# 	 D%)%<%<T%B"G]))+!l$""<64.1AC1GH"" d^o}%EFL MM)$\*!	 r   c                    |D ]  }t        |t              r|\  }}}|dk7  r d}t        | d      r)	 t        |d         }| j
                  |   j                  }n| j                  }|d   }t        j                  } ||| j                        }	|	j                  |||       |dk\  r||	_        |	| |<    y # t        $ r d}Y w xY w)Nro  r,   r   r  r   r   rk  )r   r   r6   r   r   r   r   r)   r   r   r(   r   r  )
r&   r   r   r   r   fdIDr)   	glyphNamery  rB   s
             r   r   zCharStrings.fromXML  s     	)G'3'#* D%|#DtY'#E/$:;D ,,t,44,,fI+88O(dFVFVWJtUG4qy+/
((DO-	)   Ds   B66CCrf  )r   r   r   r   r%   r   r   r  __contains__r   r   r\  r   r   r   r   r   r   r   r   ~  sI    . 'B-3( L%0/ ()r   r   c                 6    t        | j                  d            S rW  )r   rl   )r~   s    r   rP  rP  	  s    499Q<  r   c                 T    t        j                  d| j                  d            \  }|S )Nrg   r-   ro   rj   rl   r~   r   s     r   rO  rO    !    }}T499Q<0HULr   c                 T    t        j                  d| j                  d            \  }|S )NrK  r   r  r  s     r   rN  rN    r  r   c                 8    | j                  t        |             y r#   )r   r   r  s     r   r  r    s    JJwu~r   c                 N    | j                  t        j                  d|             y Nrg   r   ro   r   r  s     r   r  r        JJv{{4'(r   c                 N    | j                  t        j                  d|             y NrK  r  r  s     r   r  r    r  r   c                     t        |       S r#   )r   r   s    r   	packCard8r  #  s    5>r   c                 .    t        j                  d|       S r  ro   r   r   s    r   
packCard16r  '      ;;tU##r   c                 .    t        j                  d|       S r  r  r   s    r   
packCard32r  +  r  r   c                 2    i }| D ]  \  }}}}}||f||<    |S r#   r   r   dopr   argdefaultconvs          r   buildOperatorDictr  /  s3    
A(- $D#ws"Hr   c                     i }| D ]H  \  }}}}}t        |t              rt        |d         t        |d         z   }nt        |      }||f||<   J |S Nr   r   )r   r  r   r  s          r   buildOpcodeDictr  6  sb    
A(- $D#wb% A'"Q%.0BBs)$ Hr   c                 F    g }| D ]  \  }}}}}|j                  |        |S r#   )rA   )r   lr  r   r  r  r  s          r   r   r   A  s1    
A(- $D#w	Hr   c                 4    i }| D ]  \  }}}}}||||<    |S r#   r   r  s          r   buildDefaultsr  H  s7    
A(- $D#wAdG Hr   c                 .    i }| D ]  \  }}}}}|||<    |S r#   r   r  s          r   buildConvertersr  P  s/    
A(- $D#w$Hr   c                   *    e Zd Zd Zd Zd Zd Zd Zy)SimpleConverterc                     t        |d      s| j                  ||      S |j                  }|j                         }	 | j                  ||      |j	                  |       S # |j	                  |       w xY w)Nr~   )r6   _readr~   r   rq   )r&   r  r   r~   r   s        r   rl   zSimpleConverter.readX  s[    vv&::fe,,{{iik	::fe,IIcNDIIcNs   A A2c                     |S r#   r   r&   r  r   s      r   r  zSimpleConverter._readb  r  r   c                     |S r#   r   r  s      r   r   zSimpleConverter.writee  r  r   c                 J    |j                  ||       |j                          y )Nr   )r   r   r&   r   r   r   s       r   xmlWritezSimpleConverter.xmlWriteh  s!    D.r   c                     |d   S Nr   r   r&   r   r   r   r  s        r   r  zSimpleConverter.xmlReadl  s    W~r   N)r   r   r   rl   r  r   r  r  r   r   r   r  r  W  s    r   r  c                   $    e Zd Zd Zd Zd Zd Zy)ASCIIConverterc                     t        |d      S Nasciir  ra   r  s      r   r  zASCIIConverter._readq  s    UW--r   c                     t        |d      S r  r
   r  s      r   r   zASCIIConverter.writet  s    uw//r   c                 `    |j                  |t        |d             |j                          y )Nr  r  r   r   r   r   r  s       r   r  zASCIIConverter.xmlWritew  s(    Deg(FGr   c                 "    t        |d   d      S )Nr   r  r  r  r  s        r   r  zASCIIConverter.xmlRead{  s    uW~::r   Nr   r   r   r  r   r  r  r   r   r   r  r  p  s    .0;r   r  c                   $    e Zd Zd Zd Zd Zd Zy)Latin1Converterc                     t        |d      S Nr  r  ra   r  s      r   r  zLatin1Converter._read  s    UX..r   c                     t        |d      S r  r  r  s      r   r   zLatin1Converter.write  s    ux00r   c                     t        |d      }|dv rt        j                  dd|      }|j                  ||       |j	                          y )Nr  r  )Notice	Copyrightz	[\r\n]\s+ r   )r   resubr   r   r  s       r   r  zLatin1Converter.xmlWrite  sH    eh/**FF<e4ED.r   c                 "    t        |d   d      S )Nr   r  r  r  r  s        r   r  zLatin1Converter.xmlRead  s    uW~;;r   Nr  r   r   r   r
  r
    s    /1<r   r
  c                 D    	 t        |       }|S #  t        |       }Y |S xY wr#   )r=   float)rc   r   s     r   parseNumr    s,    A LaLs    c                     g }| D ]U  }t        |t              r|\  }}}|d   j                         }|D cg c]  }t        |       }}|j	                  |       W t        |      dk(  r|d   }|S c c}w )Nr   r   r   )r   r   splitevalrA   r@   )rc   	valueListr   r   r   r   	blendListvals           r   parseBlendListr    s    I $gs#&eW'N((*	*343T#Y4	4#$ 9~aL		 5s   A2c                       e Zd Zd Zd Zy)NumberConverterc                    t        |t              r|j                  |       |j                          |j	                          dj                  |D cg c]  }t        |       c}      }|j                  t        |       |j                          |j                          |j                  |       |j                          y |j                  ||       |j                          y c c}w )Nr  r   r   rs   r   r   indentjoinr   r   kBlendDictOpNamededentr   )r&   r   r   r   r  
blendValues         r   r  zNumberConverter.xmlWrite  s    eT"t$u"=3s8"=>J 0
CT"E2 #>s   C'c                 d    |j                  dd       }|t        |      }|S t        |d         }|S r  )getr  r  )r&   r   r   r   r  valueStringr   s          r   r  zNumberConverter.xmlRead  s>    ii."7+E  U7^,Er   Nr   r   r   r  r  r   r   r   r   r     s     r   r   c                       e Zd Zd Zd Zy)ArrayConverterc           	      J   |rt        |d   t              r|j                  |       |j                          |j	                          |D ]Q  }dj                  |D cg c]  }t        |       c}      }|j                  t        |       |j                          S |j                          |j                  |       |j                          y dj                  |D cg c]  }t        |       c}      }|j                  ||       |j                          y c c}w c c}w )Nr   r  r   r"  )r&   r   r   r   r  r  r'  s          r   r  zArrayConverter.xmlWrite  s    Za$/t$" $	 XX9&ECs3x&EF
##$4J#G!!#$ T"HH%83c#h89EE2 'F 9s   D
D c                     |j                  dd       }|t        |      }|S |j                         }|D cg c]  }t        |       }}|S c c}w r  )r)  r  r  r  )	r&   r   r   r   r  r*  r  r   r   s	            r   r  zArrayConverter.xmlRead  s\    ii.&w/I  !&&(F6<=U%=I= >s   ANr+  r   r   r   r-  r-    s     "r   r-  c                       e Zd Zd Zd Zy)TableConverterc                     |j                  |       |j                          |j                  |       |j                  |       |j                          y r#   )r   r   r   r   r  s       r   r  zTableConverter.xmlWrite  sB    4 Ir   c                      | j                                }|D ],  }t        |t              r|\  }}}|j                  |||       . |S r#   )getClassr   r   r   )r&   r   r   r   r  obr   s          r   r  zTableConverter.xmlRead  sQ    T]]_ 	-G'3'#* D%JJtUG,		-
 	r   Nr+  r   r   r   r1  r1    s    r   r1  c                       e Zd Zd Zd Zd Zy)PrivateDictConverterc                     t         S r#   )PrivateDictr   s    r   r4  zPrivateDictConverter.getClass  s    r   c                 6   |\  }}|j                   }|j                  }	 |j                  }t	        |j
                  ||||      }|j                  |       |j                  |      }	t        |	      |k(  sJ |j                  |	       |S # t        $ r d }Y lw xY wr  )
r~   rM  r   AttributeErrorr9  ry   rq   rl   r@   r   )
r&   r  r   rY  r  r~   rf   r   privr   s
             r   r  zPrivateDictConverter._read  s    f{{	]]F 6>>4vV		&yy4yD   t  	F	s   B
 
BBc                      y)N)r   r   r   r  s      r   r   zPrivateDictConverter.write  s    r   Nr   r   r   r4  r  r   r   r   r   r7  r7    s    r   r7  c                       e Zd Zd Zd Zd Zy)SubrsConverterc                     t         S r#   )r{  r   s    r   r4  zSubrsConverter.getClass  s    r   c                     |j                   }|j                  }|j                  |j                  |z          t	        ||      S r`  )r~   rM  rq   r  r{  )r&   r  r   r~   rf   s        r   r  zSubrsConverter._read	  s6    {{		&--%'($v..r   c                      yr'  r   r  s      r   r   zSubrsConverter.write      r   Nr>  r   r   r   r@  r@    s    /r   r@  c                       e Zd Zd Zd Zd Zy)CharStringsConverterc           
      V   |j                   }|j                  }|j                  }t        |dd       }|j                  }t        |d      r*|j                  }t        |d      r|j                  }	nd }	d }
nd\  }	}|j                  }
|j                  |       t        ||||
|	|||      }|S )Nr   r   r  rf  )rf   r  )r~   rM  r   r   r}   r6   r   r  r   rq   r   )r&   r  r   r~   rf   r   r  r(   r   ri  r)   r   s               r   r  zCharStringsConverter._read  s    {{..6:t4((69%nnGvz*!??G *HgnnG		%!	
 r   c                      yr'  r   r  s      r   r   zCharStringsConverter.write1  rD  r   c                    t        |d      r*|j                  }t        |d      r|j                  }nd }d }n|j                  d d }}}t	        d d |j
                  |||t        |dd             }|j                  |||       |S )Nr   r  r   )r  )r6   r   r  r   r   r}   r   r   )	r&   r   r   r   r  r   ri  r)   r   s	            r   r  zCharStringsConverter.xmlRead4  s    69% nnGvz*!??G
 *0twXG!VZ6
 	D%1r   Nr   r   r   r  r   r  r   r   r   rF  rF    s    :r   rF  c                   $    e Zd Zd Zd Zd Zd Zy)CharsetConverterc                 z   t        |d      }|dkD  rB|j                  }|j                  }|j                  |       t        j	                  t
        d|       t        |      }|dk(  rt        |||j                  |      }n*|dk(  s|dk(  rt        |||j                  ||      }nt        t        |      |k(  sJ t        j	                  t
        d|j                                i }g }	|D ]f  }
|
|v rJ||
   }|
dz   t        |      z   |v r|dz  }|
dz   t        |      z   |v r|dz   ||
<   |
dz   t        |      z   }
d||
<   |	j                  |
       h |	}n=|sd|j                  vr
|dk(  sJ d }n#|dk(  rt         }n|dk(  rt"        }n|dk(  rt$        }r't        |      |j                  k7  r|d |j                   }|S )	NROSr-   zloading charset at %sr   r   z    charset end at %s#r   )r6   r  r~   rq   r   r   rP  parseCharset0ry   parseCharsetNotImplementedErrorr@   r   r   rA   r   cffISOAdobeStringscffIExpertStringscffExpertSubsetStrings)r&   r  r   isCIDr  r~   r  r   allNames
newCharsetr  ns               r   r  zCharsetConverter._readQ  s   &19((I;;DIIeGGE2E:t_F{'	4O1!&y$vV))w<9,,,GGE2DIIK@HJ$ 	-	( +A$s?SV3@Q %s?SV3@*+a%HY' )C#a& 8I&'#!!),	- !GV^^; z!z!,!+!0G(8(880 0 01Gr   c                      yr'  r   r  s      r   r   zCharsetConverter.write  rD  r   c                 F    |j                  d       |j                          y )Nz8charset is dumped separately as the 'GlyphOrder' element)rr  r   r  s       r   r  zCharsetConverter.xmlWrite  s     	TUr   c                      y r#   r   r  s        r   r  zCharsetConverter.xmlRead      r   Nr  r   r   r   rL  rL  P  s    ,\r   rL  c                   $    e Zd Zd Zd Zd Zd Zy)CharsetCompilerc                     |d   dk(  sJ t        |j                  d      }t        |||      }t        |||      }t	        |      t	        |      k  r|| _        || _        y || _        || _        y )Nr   .notdefrN  )r6   dictObjpackCharset0packCharsetr@   r   r  )r&   ry   r   r  rV  data0r   s          r   r%   zCharsetCompiler.__init__  sp    qzY&&&.WeW57E73t9s5z!DI  DIr   c                 6    || j                   j                  d<   y )Nr   r4  r5  s      r   r   zCharsetCompiler.setPos  r6  r   c                 ,    t        | j                        S r#   r  r   s    r   r   zCharsetCompiler.getDataLength  r  r   c                 :    |j                  | j                         y r#   r   r   r&   r~   s     r   r   zCharsetCompiler.toFile      

499r   Nr   r   r   r%   r   r   r   r   r   r   r_  r_    s    	-r   r_  c                     d }t         t        dft        t        dft        t
        dfg}t        |       }|D ]2  \  }}}| |S ||kD  r|}t        |      D ]  }| |   ||   k7  sd } 2 4 |S )Nr   r   r-   )cffISOAdobeStringCountrS  cffExpertStringCountrT  cffExpertSubsetStringCountrU  r@   rQ  )r   predefinedCharSetValpredefinedCharSetslcscntpcscsvrt  s           r   getStdCharSetrw    s    	!3Q7	0!4	#%;Q?
 g,C+ 	S#+   9"s 	AqzSV#'+$		  r   c                     t        | dd        S )Nr[   )r=   r   ry   s     r   getCIDfromNamerz    s    tABx=r   c                 $    |j                  |       S r#   )getSIDry  s     r   getSIDfromNamer}    s    >>$r   c           	          d}t        |      g}|rt        }nt        }| dd  D ]#  }|j                  t	         |||                   % t        |      S r  )r  rz  r}  rA   r  r	   )r   rV  ry   fmtr   	getNameIDr   s          r   rc  rc    sW    
CcND"	"	 :Jyw789:T?r   c                    d}g }d }d}|rt         }nt        }| dd  D ];  } |||      }	||	}n)|dz   |	k7  r!||z
  }
|
dkD  rd}|j                  ||
f       |	}|	}= |r||z
  }
|
dkD  rd}|j                  ||
f       t        |      g}|dk(  rt        }nt        }|D ](  \  }}
|j                  t	        |       ||
      z          * t        |      S )Nr   r      r-   )rz  r}  rA   r  r  r	   )r   rV  ry   r  rangesr  endr  r   SIDnLeftr   	nLeftFuncs                r   rd  rd    s   
CFE
C"	"	 
g&=E1W^%KEs{MM5%.)E
 e3;Cuen%cND
ax		 :uJu%	%(889:T?r   c                    dg}|rLt        | dz
        D ]9  }t        |      }|j                  dt        |      j	                  d      z          ; |S t        | dz
        D ]!  }t        |      }|j                  ||          # |S Nra  r   cidr   )rQ  rO  rA   r   zfill)r  r~   ry   rV  r   rt  CIDr  s           r   rP  rP    s    kGy1}% 	6AT"CNN53s8>>!#445	6 N y1}% 	)AT"CNN73<(	) Nr   c                 b   dg}d}|dk(  rt         }nt        }|| k  rt        |      } ||      }	|rDt        |||	z   dz         D ].  }
|j                  dt	        |
      j                  d      z          0 n+t        |||	z   dz         D ]  }|j                  ||           ||	z   dz   }|| k  r|S r  )rP  rO  rQ  rA   r   r  )r  r~   ry   rV  r  r   r   r  r  r  r  r  s               r   rQ  rQ     s    kGE
ax		
)
4 $UEEMA$56 :us3x~~a'889: UEEMA$56 -ws|,-! )
 Nr   c                   $    e Zd Zd Zd Zd Zd Zy)EncodingCompilerc                 <   t        |t              rJ t        |j                  j                  ||j
                        }t        |j                  j                  ||j
                        }t        |      t        |      k  r|| _        || _	        y || _        || _	        y r#   )
r   r   packEncoding0rb  r   ry   packEncoding1r@   r   r  )r&   ry   r  r  re  data1s         r   r%   zEncodingCompiler.__init__  sz    h,,,fnn44hOfnn44hOu:E
"DI  DIr   c                 6    || j                   j                  d<   y )NEncodingr4  r5  s      r   r   zEncodingCompiler.setPos      *-J'r   c                 ,    t        | j                        S r#   r  r   s    r   r   zEncodingCompiler.getDataLength"  r  r   c                 :    |j                  | j                         y r#   ri  rj  s     r   r   zEncodingCompiler.toFile%  rk  r   Nrl  r   r   r   r  r    s    .r   r  c                   $    e Zd Zd Zd Zd Zd Zy)EncodingConverterc                    |dk(  ry|dk(  ry|dkD  sJ |j                   }|j                  |       t        j                  t        d|       t	        |      }|dz  }|rt        d      |dz  }|dk(  r$t        |j                  |||j                        }|S |dk(  r"t        |j                  |||j                        }S )	Nr   StandardEncodingr   ExpertEncodingzloading Encoding at %s   z*Encoding supplements are not yet supported   )
r~   rq   r   r   rP  rR  parseEncoding0r   ry   parseEncoding1)r&   r  r   r~   r  haveSupplementr  s          r   r  zEncodingConverter._read*  s    A:%aZ#199;;DIIeGGE3U;D/C 4ZN)*VWW*Cax)NND.&.. O	 )NND.&.. Or   c                     |dk(  ry|dk(  ryy)Nr  r   r  r   r   r  s      r   r   zEncodingConverter.writeC  s    &&&&r   c                 z   |dv r$|j                  ||       |j                          y |j                  |       |j                          t        t	        |            D ]:  }||   }|dk7  s|j                  dt        |      |       |j                          < |j                  |       |j                          y )N)r  r  r   ra  map)coder   )r   r   r   rQ  r@   hexr   )r&   r   r   r   r  r  s         r   r  zEncodingConverter.xmlWriteJ  s    ::514 #e*% 	$DdII%##ED		#J!!#		$
 	r   c                     d|v r|d   S dgdz  }|D ]1  }t        |t              r|\  }}}t        |d         }|d   }|||<   3 |S )Nr   ra  r   r  )r   r   r   )	r&   r   r   r   r  r  r   r  r  s	            r   r  zEncodingConverter.xmlReadY  sn    U?= ;$ 	'G'3'#* D%E&M*DfI&HTN	' r   Nr  r   r   r   r  r  )  s    2r   r  c                     t        |      }dgdz  }t        d|dz         D ]  }t        |      }|dk7  s| |   ||<    |S )Nra  r   r   r   rP  rQ  )r   r~   r  ry   nCodesr  r  r  s           r   r  r  g  sV    t_F{S HFQJ' .19$W-HTN. Or   c                     t        |      }dgdz  }d}t        |      D ]A  }t        |      }t        |      }	t        |||	z   dz         D ]  }| |   ||<   |dz   } |dz   }C |S )Nra  r   r   r  )
r   r~   r  ry   r  r  r  rt  r  r  s
             r   r  r  q  s    oG{S HG7^ $Wgo&9: 	G$W-HTN!8D	 A+ Or   c                    d}i }t        t        |            D ]  }||   }|dk7  s|||<    g }| dd  D ]$  }|j                  |      }|j                  |       & |r|d   |j	                          |r|d   t        |      t        t        |            g}|D ]   }|d}|j                  t        |             " t        |      S )Nr   ra  r   r,   rQ  r@   r)  rA   popr  r	   )	r   r  ry   r  mr  r   codesr   s	            r   r  r    s    
C
Ac(m$ ~9AdG E uuT{T E"I%		 E"I% cNIc%j12D %<DIdO$% T?r   c                 :   d}i }t        t        |            D ]  }||   }|dk7  s|||<    g }d }d}	| dd  D ]=  }|j                  |d      }||}n"|	dz   |k7  r|	|z
  }
|j                  ||
f       |}|}	? |	|z
  }
|j                  ||
f       |r)|d   d   dk(  r|j	                          |r|d   d   dk(  rt        |      t        t        |            g}|D ]2  \  }}
|dk(  rd}|j                  t        |      t        |
      z          4 t        |      S )Nr   ra  r   r,   r  )r   r  ry   r  r  r  r   r  r  r  r  r   s               r   r  r    sV   
C
Ac(m$ ~9AdG FE
C uuT2=E1W_%KEMM5%.)E %KE
MM5%.! VBZ]b(

 VBZ]b( cNIc&k23D 9uB;EIe$y'7789 T?r   c                       e Zd Zd Zd Zd Zy)FDArrayConverterc                     	 |j                   }|j                  }|j                  }|j	                  |       t        ||      }||_        |j                  |_        |j                  |_        |S # t        $ r d }Y nw xY wr`  )	r   r;  r~   rM  rq   r   r   ry   r}   )r&   r  r   r   r~   rf   r   s          r   r  zFDArrayConverter._read  sw    	__F {{		%tF3 ..$00  	F	s   A/ /A=<A=c                      yr'  r   r  s      r   r   zFDArrayConverter.write  rD  r   c                 |    t               }|D ],  }t        |t              r|\  }}}|j                  |||       . |S r#   )r   r   r   r   )r&   r   r   r   r  r   r   s          r   r  zFDArrayConverter.xmlRead  sH    . 	2G'3'#* D%OOD%1		2
 r   NrJ  r   r   r   r  r    s    r   r  c                   $    e Zd Zd Zd Zd Zd Zy)FDSelectConverterc                 l    |j                   }|j                  |       t        ||j                        }|S r#   )r~   rq   r  r  )r&   r  r   r~   ri  s        r   r  zFDSelectConverter._read  s.    {{		%D&"2"23r   c                      yr'  r   r  s      r   r   zFDSelectConverter.write  rD  r   c                 b    |j                  |d|j                  fg       |j                          y Nr  )r   r  r   r  s       r   r  zFDSelectConverter.xmlWrite  s*    DHell#;"<=r   c                 D    t        |d         }d }d }t        |||      }|S r  )r   r  )	r&   r   r   r   r  r  r~   r  ri  s	            r   r  zFDSelectConverter.xmlRead  s-    uX'	D)S1r   Nr  r   r   r   r  r    s    
r   r  c                   $    e Zd Zd Zd Zd Zd Zy)VarStoreConverterc                 v    |j                   }|j                  |       t        |      }|j                          |S r#   )r~   rq   r  r   )r&   r  r   r~   r  s        r   r  zVarStoreConverter._read  s2    {{		%%r   c                      yr'  r   r  s      r   r   zVarStoreConverter.write  rD  r   c                 (    |j                  ||       y r#   )r  r  s       r   r  zVarStoreConverter.xmlWrite  s    y$'r   c                 B    t               }|j                  ||||       |S r#   )r  r  )r&   r   r   r   r  r  s         r   r  zVarStoreConverter.xmlRead  s"    >ugv6r   Nr  r   r   r   r  r    s    (r   r  c                 v    d}t        |      g}| D ]  }|j                  t        |              t        |      S r'  )r  rA   r	   )fdSelectArrayr  r   r?   s       r   packFDSelect0r     s=    
CcND &Ie$%&T?r   c                    d}g }t        |       }d}t        |      D ]"  }| |   }||k7  s|j                  ||g       |}$ dz   }t        |      g}|j                  t	        t        |                   |D ]<  }	|j                  t	        |	d                |j                  t        |	d                > |j                  t	        |             t        |      S )Nr[   r,   r   r   )r@   rQ  rA   r  r  r	   
r  r  fdRangeslenArraylastFDIndexrt  rm  sentinelGIDr   fdRanges
             r   packFDSelect3r    s    
CH=!HK8_ ""'!OOQL)!K	"
 a%KcNDKK
3x=)* +Jwqz*+Igaj)*+ 	KK
;'(T?r   c                    d}g }t        |       }d}t        |      D ]"  }| |   }||k7  s|j                  ||g       |}$ dz   }t        |      g}|j                  t	        t        |                   |D ]<  }	|j                  t	        |	d                |j                  t        |	d                > |j                  t	        |             t        |      S )Nr   r,   r   r   )r@   rQ  rA   r  r  r  r	   r  s
             r   packFDSelect4r    s    
CH=!HK8_ ""'!OOQL)!K	"
 a%KcNDKK
3x=)* ,Jwqz*+Jwqz*+, 	KK
;'(T?r   c                   $    e Zd Zd Zd Zd Zd Zy)FDSelectCompilerc                    |j                   }|j                  }|dk(  rt        |      | _        || _        y |dk(  rt	        |      | _        || _        y |dk(  rt        |      | _        || _        y t        |      }t	        |      }t        |      t        |      k  r|| _        d|_         || _        y || _        d|_         || _        y )Nr   r[   r   )r  r  r  r   r  r  r@   r  )r&   ri  r  r  r  re  data3s          r   r%   zFDSelectCompiler.__init__3  s    oo ))!8%m4DI   AX%m4DI  AX%m4DI  "-0E!-0E5zCJ&!	"#
  "	"#r   c                 6    || j                   j                  d<   y )Nr  r4  r5  s      r   r   zFDSelectCompiler.setPosI  r  r   c                 ,    t        | j                        S r#   r  r   s    r   r   zFDSelectCompiler.getDataLengthL  r  r   c                 :    |j                  | j                         y r#   ri  rj  s     r   r   zFDSelectCompiler.toFileO  rk  r   Nrl  r   r   r   r  r  2  s    ,.r   r  c                   $    e Zd Zd Zd Zd Zd Zy)VarStoreCompilerc                     || _         |j                  s|j                          t        t	        |j                              |j                  g}t        |      | _        y r#   )r  r   r   r  r@   r	   )r&   varStoreDatar  r   s       r   r%   zVarStoreCompiler.__init__T  sI        "3|0012L4E4EFdO	r   c                 6    || j                   j                  d<   y )Nr   r4  r5  s      r   r   zVarStoreCompiler.setPos[  r  r   c                 ,    t        | j                        S r#   r  r   s    r   r   zVarStoreCompiler.getDataLength^  r  r   c                 :    |j                  | j                         y r#   ri  rj  s     r   r   zVarStoreCompiler.toFilea  rk  r   Nrl  r   r   r   r  r  S  s    $.r   r  c                       e Zd Zd Zd Zy)ROSConverterc                     |\  }}}|j                  |dt        |      fdt        |      fd|fg       |j                          y NRegistryOrder
Supplementr  )r&   r   r   r   registryr   
supplements          r   r  zROSConverter.xmlWritef  sR    &+#%U8_-%,'z*	
 	r   c                 0    |d   |d   t        |d         fS r  )r   r  s        r   r  zROSConverter.xmlReadr  s"    j!5>8E,<O3PQQr   Nr+  r   r   r   r  r  e  s    
Rr   r  )   maxstacknumberNN)      rN  )r  r  r  ))r     SyntheticBaser  NN)r   versionr  NNr  r  )r  r   r  r-   FullName)r  &   FontNamer[   
FamilyName)r   Weightr  NN))r  r   isFixedPitchr  r   N))r  r-   ItalicAngler  r   N))r  r[   UnderlinePositionr  iN))r  r   UnderlineThicknessr  2   N))r  r   	PaintTyper  r   N))r     CharstringTyper  r-   N)r     
FontMatrixr  )MbP?r   r   r  r   r   )   UniqueIDr  NNr   FontBBox)r   r   r   r   ))r     StrokeWidthr  r   N)   XUIDr  NN))r     
PostScriptr  NN))r     BaseFontNamer  NN))r     BaseFontBlenddeltaNN))r     CIDFontVersionr  r   N))r      CIDFontRevisionr  r   N))r  !   CIDFontTyper  r   N))r  "   CIDCountr  i"  N   r   r  ))r  #   UIDBaser  NN   r     r   )r  r  )r  %   )r  $   r         r   blendr  )r  vsindexr  NNr  )r  
BlueValuesr  NN)r  
OtherBluesr  NN)r  FamilyBluesr  NN)	   FamilyOtherBluesr  NN))r  r&  	BlueScaler  g}?5^I?N))r  
   	BlueShiftr  r  N))r     BlueFuzzr  r   N)r)  StdHWr  NN)r+  StdVWr  NN))r  r  	StemSnapHr  NN))r  r  	StemSnapVr  NN))r  r  	ForceBoldr  r   N))r  r  ForceBoldThresholdr  NN))r  r  lenIVr  NN))r  r  LanguageGroupr  r   N))r  r  ExpansionFactorr  gQ?N))r     initialRandomSeedr  r   N)r  defaultWidthXr  r   N)r	  nominalWidthXr  r   Nr6  r   c                     t        t        |             D ]S  }| |   \  }}}}}||dv rt               }n*|dk(  rt               }n|dk(  rt	               }n
|dk(  rd }nJ |||||f| |<   U y )N)r  r  r  r  r  )rQ  r@   r-  r   r  )r   rt  r  r   r  r  r  s          r   addConvertersr;    s    3u: 0',Qx$D#w$$!#DH_"$DE\!#DKD5tS'4/a0r   c                       e Zd Z ee      Zy)TopDictDecompilerN)r   r   r   r  r   	operatorsr   r   r   r=  r=    s    !"23Ir   r=  c                       e Zd Z ee      Zy)PrivateDictDecompilerN)r   r   r   r  r   r>  r   r   r   r@  r@  	  s    !"67Ir   r@  c                   N    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zy)DictCompilerr   Nc                 ~   |rt        |t              sJ |t        |d      r|j                  }|J || _        || _        || _        || _        i }|j                  D ]W  }t        ||d       }||j                  |   }|j                  ||      }||j                  j                  |      k(  rS|||<   Y || _        y r  )r   rx   r6   rf   rb  ry   r  r   r   
convertersr   defaultsr)  r   )	r&   rb  ry   r  rf   r   r   r   r  s	            r   r%   zDictCompiler.__init__
	  s    g~666>gfh7]]F%%%MM 	"DGT40E}%%d+DJJw.E((,,T22!GDM	" r   c                      y r#   r   r5  s      r   r   zDictCompiler.setPos 	  r]  r   c                 6    t        | j                  d            S )Nr   )r@   r   r   s    r   r   zDictCompiler.getDataLength#	  s    4<<011r   c                 j   t         j                  t        d| j                  j                  |       | j                  }g }| j
                  j                  D ]  }|j                  |      }|| j                  |   \  }}t        |t              rat        |      }t        |      |k(  sJ d       t        |      D ]2  }	||	   }
||	   }t        | d|
z         }|j                   ||             4 n&t        | d|z         }|j                   ||             |j                  |        t        |      }|S )Nz-- compiling %s for %szvalue doesn't match arg typearg_)r   r   r)  r   r   rb  r   r)  opcodesr   r  r@   rQ  r   rA   r	   )r&   reasonr   r   r   r   r  argTyper  rt  r  v
arghandlers                r   r   zDictCompiler.compile&	  s   /1H1H&Q,,LL&& 	DKK%E},,t,KB'5)L5zQF(FFq /A!!*CaA!(v|!<JKK
1.	/ %T6G+;<
Ju-.KKO!	" r   c                 H    | j                  d      }|j                  |       y )Nr   )r   r   )r&   r~   r   s      r   r   zDictCompiler.toFile>	  s    ||H%

4r   c                     t        |t              r]|D cg c]  }t        |       }}|j                  t        d             |j                  t	        t
                     t        |      }|S t        |      }|S c c}w rW  )r   rs   encodeNumberrA   r   blendOpr	   )r&   numr  r   datums        r   
arg_numberzDictCompiler.arg_numberB	  sk    c4 145#L%5D5KKQ(KK()dOE  !%E 6s   A;c                 ^    t        j                  | j                  j                  |            S r#   )r   encodeIntCFFry   r|  )r&   rc   s     r   arg_SIDzDictCompiler.arg_SIDL	  s"    ))$,,*=*=a*@AAr   c                 j    g }|D ]"  }|j                  | j                  |             $ t        |      S r#   )rA   rU  r	   )r&   r   r   rS  s       r   	arg_arrayzDictCompiler.arg_arrayO	  s5     	.CKK,-	.r   c                    |sy|d   }t        |t              r| j                  |      }t        |      S g }d}|D ]  }|j                  ||z
         |} g }|D ]  }|j                  t	        |              t        |      S )Nr   r   )r   rs   arg_delta_blendrA   rQ  r	   )r&   r   val0r   r!  lastrM  rS  s           r   	arg_deltazDictCompiler.arg_deltaU	  s    QxdD!''.D  CD 

1t8$ D /L-./r   c                    t        |d         }t        |      }||z  dz   }|| j                  kD  rht        | j                  dz
  |z        }g }	 t        t        |      |      }|dk(  r	 |S |d| }| j	                  |      }	|j                  |	       ||d }Jdg|z  }
dg|z  }d}d}||k  r(||   d   }||z
  |
|<   |}||   dd ||<   |dz  }||k  r(|
}|D ]  }|j                  |        |D cg c]  }t        |       }}|j                  t        |             |j                  t        t                     |S c c}w )aM  A delta list with blend lists has to be *all* blend lists.

        The value is a list is arranged as follows::

                [
                        [V0, d0..dn]
                        [V1, d0..dn]
                        ...
                        [Vm, d0..dn]
                ]

        ``V`` is the absolute coordinate value from the default font, and ``d0-dn``
        are the delta values from the *n* regions. Each ``V`` is an absolute
        coordinate from the default font.

        We want to return a list::

                [
                        [v0, v1..vm]
                        [d0..dn]
                        ...
                        [d0..dn]
                        numBlends
                        blendOp
                ]

        where each ``v`` is relative to the previous default font value.
        r   r   N)
r@   maxBlendStackr=   minr\  r%  rQ  rA   r   rR  )r&   r   
numMasters	numBlendsnumStacknumBlendValuesr!  numValvalListout1	firstList	deltaListrt  prevValdefaultValuerelValueListr  r  s                     r   r\  zDictCompiler.arg_delta_blendf	  s   : q]
J	
*a/d((( !$"4"4q"8J!FGNCSZ8Q;6 
5  &/++G4

4 fg  iI*IAGi-
  %Qx{+g5	!&$Qx|	!Q i- %L& /	##I./0<=<$=C=JJ|I./JJww'(
 >s   4Er#   )r   r   r   ra  r%   r   r   r   r   rU  rX  rZ  r_  r\  r   r   r   rB  rB  	  s;    M,20B"Dr   rB  c                 v    t        | t              rt        j                  |       S t        j                  |       S r#   )r   r  r   encodeFloatrW  )rS  s    r   rQ  rQ  	  s.    #u((--))#..r   c                   "    e Zd Z ee      Zd Zy)TopDictCompilerc                    | j                   }g }| j                  j                  t        | j                  d      r| j                  j                  rzt        | j                  d      rd }nt        | j                  j                        }|1|j                  t        || j                  j                  |              n|| j                  d<   t        | j                  d      r| j                  j                  r| j                  j                  }t        |t              sf|j                  t        |||              nIt        | j                  d      r3| j                  j                  }t        ||       }|j                  |       t        | j                  d      r| j                  j                  }t!        |      dk(  rO| j                  j"                  }	| j                  j                  D ]   }
|j                  |	|
   j$                         " t'        ||       }|j                  |       t        | j                  d      rgg }| j                  j"                  }	| j                  j                  D ]  }
|j                  |	|
           t)        ||| |      }|j                  |       t        | j                  d	      rW| j                  j*                  j-                  ||       }|j                  |       |j/                  |j1                  |             t        | j                  d
      rW| j                  j2                  j-                  ||       }|j                  |       |j/                  |j1                  |             |S )Nr   rN  r  r   r  r   r   re   r   r   )rf   rb  r   r6   r   rw  rA   r_  r   r  r   r   r  r   r  r  r@   r   r  r  rC  r   r   r%  r   r   )r&   ry   rf   r   charsetCoder  r  varStoreCompri  r   r   fdSelectCompr   charStringsCompfdArrayIndexCompprivComps                   r   r   zTopDictCompiler.getChildren	  s   <<))1t||Y/DLL4H4H4<</"&K"/0D0D"EK&OO'1E1EtL /:DLL+t||Z0T\\5J5J<<00!(C0OO$4Wh$MNt||Z0#||44/dC-4<<,
 ||,,H8}!"ll66 LL00 EDOOK$5$C$CDE+Hd;LOOL)4<</E,,22K,, 0[./01%$vVOOOO,4<<+  $||33??NOO,-OO,88AB4<<+||++77FHOOH%OOH009:r   N)r   r   r   r  r   rJ  r   r   r   r   rr  rr  	  s    ./G7r   rr  c                   6     e Zd Z ee      Zd fd	Zd Z xZS )FontDictCompilerc                 (   t         t        |   ||||       g }| j                  }t	        t        |j                        t        |j                        z
        D ]  }||j                  v r|j                  |       #|j                  j                  |      }|!|j                  |   }|j                  ||      }t        ||d       |k7  sr|j                  |        |r1t        j                  ddj!                  t	        |            z          y y )Nre   z:Some CFF FDArray/FontDict keys were ignored upon compile: r  )r(  r{  r%   rb  r  setrD  r   r   rA   rE  r)  rl   r   r   warningr$  )
r&   rb  ry   r  rf   ignoredNamesr   r  r  r)  s
            r   r%   zFontDictCompiler.__init__	  s   .wPV.W ,,3w112S5GGH 	.Dw&
 ##D) "**..t4&"--d3D"ii9G7D$/7: ''-#	.$ KKL((6,/01 r   c                     g }t        | j                  d      rW| j                  j                  j                  ||       }|j	                  |       |j                  |j                  |             |S Nr   )r6   rb  r   r   rA   r%  r   )r&   ry   r   ry  s       r   r   zFontDictCompiler.getChildren
  sY    4<<+||++77FHOOH%OOH009:r   r#   )	r   r   r   r  r   rJ  r%   r   r,  r-  s   @r   r{  r{  	  s    ./GBr   r{  c                   ,    e Zd ZeZ ee      Zd Zd Z	y)PrivateDictCompilerc                 R    ||z
  }||f| j                   j                  d<   || _        y r  )r  r   r   )r&   r   r   rY  s       r   r   zPrivateDictCompiler.setPos"
  s*    |)-sI&r   c                     g }t        | j                  d      r5|j                  | j                  j                  j	                  ||              |S rA  )r6   rb  rA   r   r   )r&   ry   r   s      r   r   zPrivateDictCompiler.getChildren'
  s=    4<<)OODLL..::7DIJr   N)
r   r   r   maxStackLimitra  r  r   rJ  r   r   r   r   r   r  r  
  s    !M23G
r   r  c                   :    e Zd Zd	dZd Zd Zd
dZd Zd Zd Z	y)BaseDictNc                     |d u |d u k(  sJ i | _         g | _        || _        |y || _        || _        |8t
        j                  t        d| j                  j                  |       || _	        y y )NrI  )
r   	skipNamesry   rM  r~   r   r   r)  r   r  )r&   ry   r~   r  rf   s        r   r%   zBaseDict.__init__/
  sr    $DDL111<	GGE-t~~/F/FO DK r   c                    t         j                  t        d| j                  j                  t	        |             | j                  | j                  |       }|j                  |       |j                         | _	        | j                          y )Nz    length %s is %d)r   r   r)  r   r@   decompilerClassry   r   getDictr   postDecompile)r&   r   decs      r   r   zBaseDict.decompile<
  s^    ,dnn.E.Es4yQ""4<<6d{{}r   c                      y r#   r   r   s    r   r  zBaseDict.postDecompileC
  r]  r   c                 ,    | j                  | |||      S r`  ra  rc  s       r   r   zBaseDict.getCompilerF
  rd  r   c                 (   |d d |dd  cxk(  rdk(  rt        |       | j                  j                  |d       }|| j                  j                  |      }|t        |      | j                  |   }|j                  | |      }t        | ||       |S )Nr-   __)r;  r   r)  rE  rD  rl   r4   )r&   r   r   r  s       r   __getattr__zBaseDict.__getattr__I
  s    8tBCy(D(
 !&& )   t,=MM%%d+E= &&t$		$&dE"r   c                    | j                   D ]H  }|| j                  v rt        | |d       }||dk7  r'| j                  |   }|j	                  |||       J t        | j                        t        | j                         z
  }|r=|j                  ddj                  t        |            z         |j                          y y )Nr   zsome keys were ignored: %sr  )r   r  r   rD  r  r}  r   rr  r$  r  r   )r&   r   r   r   r  r  s         r   r   zBaseDict.toXMLZ
  s    JJ 	2Dt~~%D$-E }!2??4(DMM)T51!	2" 4<<(3tzz?:,sxx|8L/MM 	 r   c                 d    | j                   |   }|j                  ||||       }t        | ||       y r#   )rD  r  r4   )r&   r   r   r   r  r   s         r   r   zBaseDict.fromXMLs
  s0    t$T5'48dE"r   )NNNNr#   )
r   r   r   r%   r   r  r   r  r   r   r   r   r   r  r  .
  s&    !H" 2#r   r  c                        e Zd ZdZ ee      Z ee      Ze	Z
 ee      ZeZ	 	 	 	 	 	 d fd	Zd Zd Zd Zd Zd Z xZS )	r   ad  The ``TopDict`` represents the top-level dictionary holding font
    information. CFF2 tables contain a restricted set of top-level entries
    as described `here <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#7-top-dict-data>`_,
    but CFF tables may contain a wider range of information. This information
    can be accessed through attributes or through the dictionary returned
    through the ``rawDict`` property:

    .. code:: python

            font = tt["CFF "].cff[0]
            font.FamilyName
            # 'Linux Libertine O'
            font.rawDict["FamilyName"]
            # 'Linux Libertine O'

    More information is available in the CFF file's private dictionary, accessed
    via the ``Private`` property:

    .. code:: python

            tt["CFF "].cff[0].Private.BlueValues
            # [-15, 0, 515, 515, 666, 666]

    c                    t         t        |   ||||       || _        || _        |r5t        t              | _         |       | _        t        t              | _
        y t        t              | _        t        t              | _
        y r`  )r(  r   r%   r   r}   r  r   rE  r   r   r   r   )r&   ry   r~   r  r}   r   rf   r)  s          r   r%   zTopDict.__init__
  sn     	gt%gtVF%K!2&)*;<DM,.DL#$56DJ)*:;DM#$45DJr   c                     | j                   S )z.Returns a list of glyph names in the CFF font.)r   r   s    r   r{   zTopDict.getGlyphOrder
      ||r   c                     | j                   j                  d      }|y | j                  j                  |       | j                  rt        | j                        | _        y t        | j                        | _        y rF  )r   r)  r~   rq   rM  rN  r  rO  )r&   r  s     r   r  zTopDict.postDecompile
  sU    !!-0>		v<<'		2DN'		2DNr   c                     t        | d      r| j                          t        | d      rdg| _        t        | d      rt        | d      s	g d| _        t        j	                  | |       y )Nr   rN  r  )r  r  r  r  )r6   decompileAllCharStringsr  r  r   )r&   r   s     r   r   zTopDict.toXML
  sW    4'((*4(\DNtU#74+GDN 	tY'r   c                     t        | j                  j                               D ]  \  }}	 |j                           y #  t        j                  d|        xY w)NzError in charstring %s)	enumerater   r   r   r   error)r&   rt  rB   s      r   r  zTopDict.decompileAllCharStrings
  sS    &t'7'7'>'>'@A 	MAz$$&			2A6s	   >Ac                 
   d }| j                   j                         D ]1  }|j                  | j                         }|!|t        ||      }0|}3 || j                  d   d d  | _        y t        t        |            | _        y )Nr  )r   r   
calcBoundsr   rE  r  rs   r   )r&   fontBBoxrB   boundss       r   r   zTopDict.recalcFontBBox
  s    **113 	&J**4+;+;<F!'(6:H%H	&  MM*5a8DM !23DMr   rx  )r   r   r   r   r  r   rE  r  rD  rr  rb  r   r   r=  r  r%   r{   r  r   r  r   r,  r-  s   @r   r   r   y
  sg    2 -.H !12J#M'(E'O 6(	3( 4r   r   c                   \     e Zd Zi Z ee      ZeZg dZ	dgZ
eZ	 	 	 	 	 	 d fd	Zd Z xZS )r   )r  r   r  r   r   c                 d    t         t        |   ||||       || _        | j	                  |       y r`  )r(  r   r%   r   r   )r&   ry   r~   r  r}   rf   r   r)  s          r   r%   zFontDict.__init__  s0     	h&wfV&LVr   c                 j    |r| j                   | _        d| _        y | j                  | _        d| _        y )NTF)	orderCFF2r   rM  orderCFFr   s     r   r   zFontDict.setCFF2  s)    DJDLDJ DLr   rx  )r   r   r   rE  r  r   rD  r{  rb  r  r  r=  r  r%   r   r,  r-  s   @r   r   r   
  sI    8 H !12J$M>HI'O !r   r   c                   p     e Zd Z ee      Z ee      Z ee      Z	e
ZeZd fd	Zed        ZddZ xZS )r9  c                    t         t        |   ||||       || _        |r7t	        t
              | _        t        t
              | _        d x| _	        | _
        y t	        t              | _        t        t              | _        y r`  )r(  r9  r%   r   r  r   rE  r   r   r9  r8  r   )r&   ry   r~   r  rf   r   r)  s         r   r%   zPrivateDict.__init__&  sk    k4)'4)O)*?@DM#$9:DJ 7;:D!3)*>?DM#$89DJr   c                     | j                   S r#   )rM  r   s    r   r>   zPrivateDict.in_cff23  r  r   c                 v    |t        | d      r| j                  }nd}| j                  j                  |      }|S )Nr"  r   )r6   r"  r   r  )r&   vir  s      r   r  zPrivateDict.getNumRegions7  s9    :tY'\\[[..r2
r   )NNNNNr#   )r   r   r   r  r   rE  r  rD  r   r   r@  r  r  rb  r%   propertyr>   r  r,  r-  s   @r   r9  r9    sL    12H !56J+,E+O'M:  r   r9  c                   <    e Zd ZdZd
dZd Zd Zd Zd Zd Z	d	 Z
y)rx   zSID -> string mapping.Nc                 ~    |
g }|| _        y t        |d      D cg c]  }t        |d       }}|| _        y c c}w )NFre   r  r  )rt   r   ry   )r&   r~   ry   rc   s       r   r%   zIndexedStrings.__init__F  sF    <G  =B$u<UVquQ2VGV Ws   :c                      t        | d | d      S )NFre   )r  r   s    r   r   zIndexedStrings.getCompilerM  s    %dD$uEEr   c                 ,    t        | j                        S r#   )r@   ry   r   s    r   r   zIndexedStrings.__len__P  s    4<<  r   c                 R    |t         k  r	t        |   S | j                  |t         z
     S r#   )cffStandardStringCountcffStandardStringsry   )r&   r  s     r   r   zIndexedStrings.__getitem__S  s+    ''%c**<<&< <==r   c                 H   t        | d      s| j                          t        |d      }|t        v rt        |   }|S || j                  v r| j                  |   }|S t        | j                        t        z   }| j                  j                  |       || j                  |<   |S )NstringMappingr  r  )	r6   buildStringMappingr   cffStandardStringMappingr  r@   ry   r  rA   )r&   rc   r  s      r   r|  zIndexedStrings.getSIDY  s    t_-##%!h'((*1-C 
 $$$$$$Q'C
 
 dll#&<<CLL"$'Dq!
r   c                     | j                   S r#   r  r   s    r   
getStringszIndexedStrings.getStringsg  s    ||r   c                     i | _         t        t        | j                              D ]%  }|t        z   | j                   | j                  |   <   ' y r#   )r  rQ  r@   ry   r  rV   s     r   r  z!IndexedStrings.buildStringMappingj  sH    3t||,- 	UE6;>T6TDt||E23	Ur   r#   )r   r   r   r   r%   r   r   r   r|  r  r  r   r   r   rx   rx   B  s*     F!>Ur   rx   (  ra  spaceexclamquotedbl
numbersigndollarpercent	ampersand
quoteright	parenleft
parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon	semicolonlessequalgreaterquestionatAr_   CDEFGHIJKLMNOPQRSTUVWXYZbracketleft	backslashbracketrightasciicircum
underscore	quoteleftabr   r  efr   hrt  jkr  r  rY  opqrrc   turM  wxyz	braceleftbar
braceright
asciitilde
exclamdowncentsterlingfractionyenflorinsectioncurrencyquotesinglequotedblleftguillemotleftguilsinglleftguilsinglrightfiflendashdagger	daggerdblperiodcentered	paragraphbulletquotesinglbasequotedblbasequotedblrightguillemotrightellipsisperthousandquestiondowngraveacute
circumflextildemacronbreve	dotaccentdieresisringcedillahungarumlautogonekcaronemdashAEordfeminineLslashOslashOEordmasculineaedotlessilslashoslashoe
germandblsonesuperior
logicalnotmu	trademarkEthonehalf	plusminusThorn
onequarterdivide	brokenbardegreethornthreequarterstwosuperior
registeredminusethmultiplythreesuperior	copyrightAacuteAcircumflex	AdieresisAgraveAringAtildeCcedillaEacuteEcircumflex	EdieresisEgraveIacuteIcircumflex	IdieresisIgraveNtildeOacuteOcircumflex	OdieresisOgraveOtildeScaronUacuteUcircumflex	UdieresisUgraveYacute	YdieresisZcaronaacuteacircumflex	adieresisagravearingatildeccedillaeacuteecircumflex	edieresisegraveiacuteicircumflex	idieresisigraventildeoacuteocircumflex	odieresisograveotildescaronuacuteucircumflex	udieresisugraveyacute	ydieresiszcaronexclamsmallHungarumlautsmalldollaroldstyledollarsuperiorampersandsmall
Acutesmallparenleftsuperiorparenrightsuperiortwodotenleaderonedotenleaderzerooldstyleoneoldstyletwooldstylethreeoldstylefouroldstylefiveoldstylesixoldstylesevenoldstyleeightoldstylenineoldstylecommasuperiorthreequartersemdashperiodsuperiorquestionsmall	asuperior	bsuperiorcentsuperior	dsuperior	esuperior	isuperior	lsuperior	msuperior	nsuperior	osuperior	rsuperior	ssuperior	tsuperiorffffifflparenleftinferiorparenrightinferiorCircumflexsmallhyphensuperior
GravesmallAsmallBsmallCsmallDsmallEsmallFsmallGsmallHsmallIsmallJsmallKsmallLsmallMsmallNsmallOsmallPsmallQsmallRsmallSsmallTsmallUsmallVsmallWsmallXsmallYsmallZsmallcolonmonetary	onefittedrupiah
TildesmallexclamdownsmallcentoldstyleLslashsmallScaronsmallZcaronsmallDieresissmall
Brevesmall
CaronsmallDotaccentsmallMacronsmall
figuredashhypheninferiorOgoneksmall	RingsmallCedillasmallquestiondownsmall	oneeighththreeeighthsfiveeighthsseveneighthsonethird	twothirdszerosuperiorfoursuperiorfivesuperiorsixsuperiorsevensuperioreightsuperiorninesuperiorzeroinferioroneinferiortwoinferiorthreeinferiorfourinferiorfiveinferiorsixinferiorseveninferioreightinferiornineinferiorcentinferiordollarinferiorperiodinferiorcommainferiorAgravesmallAacutesmallAcircumflexsmallAtildesmallAdieresissmall
AringsmallAEsmallCcedillasmallEgravesmallEacutesmallEcircumflexsmallEdieresissmallIgravesmallIacutesmallIcircumflexsmallIdieresissmallEthsmallNtildesmallOgravesmallOacutesmallOcircumflexsmallOtildesmallOdieresissmallOEsmallOslashsmallUgravesmallUacutesmallUcircumflexsmallUdieresissmallYacutesmall
ThornsmallYdieresissmallz001.000z001.001z001.002z001.003BlackBoldBookLightMediumRegularRomanSemiboldi  )ra  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r_   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r  r   r  rt  r  r  r  r  rY  r  r  r  r	  rc   r
  r  rM  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r     )ra  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r"  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rR  rO  rW  r  r  r  r  r  r  r  r  rJ  rX  r]  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.     )Wra  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r"  r  r  r  r  r  r  r  r  r  r  r  rR  rO  rW  r  r  r  r  r  r  r  rJ  rX  r]  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  W   )r   fontTools.miscr   r   fontTools.misc.arrayToolsr   r   fontTools.misc.textToolsr   r   r	   r
   r   r   fontTools.ttLibr   fontTools.ttLib.tables.otBaser   r   fontTools.ttLib.tablesr   r  ior   ro   loggingr  r   	getLoggerr   r   rk   r  	Exceptionr   r$   r   objectrY   r   r   r   r  r   r/  r8  r?  rC  rt   r|   r{  rv   r   r  r  r   rP  rO  rN  r  r  r  r  r  r  r  r  r   r  r  r  r  r
  r  r  r   r-  r1  r7  r@  rF  rL  r_  rw  rz  r}  rc  rd  rP  rQ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r%  rR  r   r   r;  DictDecompilerr=  r@  rB  rQ  rr  r{  r  r  r   r   r9  rx   r  r  r@   r  rQ  _irS  rn  rT  ro  rU  rp  r   r   r   <module>rG     s   # ( 8  # 7 7 1    	 	g! 	 	S?M$D$D S?lj! j!Z/& /&d	I%F I%X] 
!;= !;H&-= &-R	- 	.' .1- 1EF EPh u h V"! "5 5 5 p 5  F.6 .b=,v =,@H)& H)V!

))$$f 2;_ ;<o <$o 2_ 8_ $> .^ :> :z: :zf , , 
"J
(v *; ;|.D~ 8 0 (**v Bv $R? R"&*& u.lnE& 6	&
 && %01& k5$(9:& 
E4!23& z5$(9:& eT?#45& %& 1& 0& 9& 8&  .!&" 3#&$ lG%?F%&& +'&( 
G\40)&* 0+&, &-&. 0/&0 21&2 53&4 45&6 57&8 19&: 1;&< Hd$4$67=&> 0?&@ Xq"3"56A&B ($0D0FGC&D z8T+<+>?E&F y(D*:*<=G&H $(<(>?I&J Xt%6%89K& T +lG%?Fz8T+<+>?y(D*:*<=$(<(>?Xt%6%89   
 * +*+04.-''00.:-276,,(D."23; D * +*+04.-''0027(D."23/ 60$ " #  444 48M88 8c6 cL/:l :z*| *Z,  H#v H#Vi4h i4X7!x 7!t (  F+UV +UbH T  
"88 88 
&
' :B79/34:f P  
"88 88g R  
!55 55X t   
!"&@@ @@r   