
    h                        S SK Jr  S SKJr  S SKJr  S SKJrJ	r	  S SK
Jr  S SKJr  S SKJr  S SKJrJr  S S	KJr  S S
KrS S
Kr " S S\5      r " S S\5      r " S S\5      r " S S\5      r\R:                  " S5      rS rS r S r!S r"S r# " S S\$5      r%SWS jr&SXS jr'S r(SWS jr)SWS jr*SWS  jr+SWS! jr,SWS" jr-SWS# jr.SWS$ jr/\R`                  4S% jr1SWS& jr2S' r3S( r4S) r5S* r6 " S+ S,\75      r8 " S- S.\85      r9 " S/ S0\85      r: " S1 S2\85      r;SWS3 jr<SWS4 jr=SWS5 jr>S6 r?S7 r@ " S8 S9\75      rASWS: jrB\R                  4S; jrD\R                  4S< jrF\R                  4S= jrG\R                  4S> jrHS? rISWS@ jrJSWSA jrKSWSB jrLSWSC jrMSWSD jrNSWSE jrOSWSF jrPSG rQSH rRSI rSSJ rTSK rUSL rVSM rWSN rXSO rYSP rZSWSQ jr[ " SR SS\75      r\SWST jr]SXSU jr^\_SV:X  a  S S
K`r`\`R                  " \^" 5       5        g
g
)Y    )ttLib)cmap_classes)otTables)ValueRecordvalueRecordFormatDict)builder)contextmanager)newTable)LOOKUP_DEBUG_ENV_VARLOOKUP_DEBUG_INFO_KEY)setitemNc                       \ rS rSrSrg)MtiLibError    N__name__
__module____qualname____firstlineno____static_attributes__r       K/var/www/html/env/lib/python3.13/site-packages/fontTools/mtiLib/__init__.pyr   r          r   r   c                       \ rS rSrSrg)ReferenceNotFoundError   r   Nr   r   r   r   r   r      r   r   r   c                       \ rS rSrSrg)FeatureNotFoundError   r   Nr   r   r   r   r   r      r   r   r   c                       \ rS rSrSrg)LookupNotFoundError"   r   Nr   r   r   r   r"   r"   "   r   r   r"   zfontTools.mtiLibc                     U S S S;   a,  [         R                  R                  [        U SS  S5      5      $ U S S S:X  a  S[        U SS  5      -  $ U R	                  S5      S:  d
   SU -  5       eU (       d   S	5       eU $ )
N   )zU zu    z# z	glyph%.5d r   zSpace found in glyph name: %szGlyph name is empty)r   TTFont_makeGlyphNameintfind)ss    r   	makeGlyphr-   )   s    !u||**3qub>::	
2A$S12Z''66#;??;a???###1Hr   c                 D    U  Vs/ s H  n[        U5      PM     sn$ s  snf N)r-   )lgs     r   
makeGlyphsr2   3   s    "#$!QIaL!$$$s   c                 b    Ub   X   nU$ [        U 5      nU$ ! [          a    [        U 5      ef = fr/   )KeyErrorr"   r*   symmappingidxs      r   	mapLookupr9   7   sI     	+,C
 J #hJ	  	+%c**	+s    .c                 |     [        U 5      nU$ ! [         a"     X   n U$ ! [         a    [        U 5      ef = ff = fr/   )r*   
ValueErrorr4   r   r5   s      r   
mapFeaturer<   D   sW    ,#h J  ,	,,C J  	,&s++	,,s    
;!7;c                    ^^^  U " X!5      nT" TTU5        g ! [          a8  n Ub  UR                  UUU4S jX'5         S nAg  e ! [         a     e f = fS nAff = f)Nc                    > T" TTU 5      $ r/   r   )ref
collectionkeysetters    r   <lambda>setReference.<locals>.<lambda>X   s    z3 <r   )r   addDeferredMappingAttributeError)mapperr7   r6   rB   r@   rA   mappedes      ```  r   setReferencerJ   Q   su    % :sF# " 		"**<c 	 # 	  			s2    
AAA
AAAAAc                   &    \ rS rSrS rS rS rSrg)DeferredMappinga   c                     / U l         g r/   _deferredMappingsselfs    r   __init__DeferredMapping.__init__b   s
    !#r   c                     [         R                  SU[        U5      R                  5        U R                  R                  XU45        g )Nz*Adding deferred mapping for symbol '%s' %s)logdebugtyper   rP   append)rR   rB   r6   rI   s       r   rE   "DeferredMapping.addDeferredMappinge   s6    		>T!WEUEUV%%vA&67r   c                     U R                    HS  u  pn[        R                  SU[        U5      R                  5         X   nU" U5        [        R                  SU5        MU     / U l         g ! [
         a    Uef = f)Nz,Applying deferred mapping for symbol '%s' %sz	Set to %s)rP   rV   rW   rX   r   r4   )rR   rB   r6   rI   rH   s        r   applyDeferredMappings%DeferredMapping.applyDeferredMappingsi   sv    "44NFII>T!WEUEU 6NIIk6* 5 "$	  s   A,,A9rO   N)r   r   r   r   rS   rE   r\   r   r   r   r   rL   rL   a   s    $8$r   rL   c                    [         R                  " 5       n/ nU R                  S5         U  GH%  n[        U5      S:  a"  UR	                  S5        [        U5      S:  a  M"  Uu  pVpx[
        R                  SXV5        [         R                  " 5       n	S U	l        U(       a  [        [        UU[        U	S5        OSU	l        [        U5      n
S/[        U
5      -  =U	l        n[        U
5       H  u  p[        [        X[         X5        M     [        U	R                  5      U	l        U Vs/ s H  oR$                  U:X  d  M  UPM     nnU(       a  US   R&                  nOz[         R(                  " 5       nUS	S[        U5      -
  -  -   Ul        [         R&                  " 5       Ul        UR	                  U5        UR&                  nS Ul        / Ul        SUl        US
:X  a	  Xl        GM  [         R,                  " 5       nUS	S[        U5      -
  -  -   Ul        U	Ul        UR,                  R	                  U5        [        UR,                  5      Ul        GM(     S S S 5        U H1  n[3        UR&                  R,                  S S9UR&                  l        M3     [3        US S9Ul        [        UR(                  5      Ul        U$ s  snf ! , (       d  f       Nv= f)Nzscript table    z#Adding script %s language-system %sReqFeatureIndexi     r   r'   defaultc                     U R                   $ r/   )
LangSysTagrecs    r   rC   !parseScriptList.<locals>.<lambda>   s    r   rA   c                     U R                   $ r/   )	ScriptTagrf   s    r   rC   rh      s    r   )ot
ScriptListbetweenlenrY   rV   rW   LangSysLookupOrderrJ   r<   setattrra   stripSplitCommaFeatureIndex	enumerater   FeatureCountrk   ScriptScriptRecordDefaultLangSysLangSysRecordLangSysCountre   sortedScriptCount)lines
featureMaprR   recordsline	scriptTag
langSysTagdefaultFeaturefeatureslangSyssymstheListir6   r,   script	scriptRec
langSysRecs                     r   parseScriptListr   w   sV   ==?DG	~	&Dd)a-B d)a->B;I>II;YSjjlG"&G"% +1'"8,D./S3t9_<G 7#D/Z'7N *#&w';';#<G !(EAKK9,DaFE))OO-	&/#S^9K2L&L	##%99;	 y)"))(,%')$&'#Y&(/%--/
(2SAJ<O5P(P
%%,
"$$++J7&)&*>*>&?#[  
'` &,MM''-G'
#  w,EFD4,,-DK9 F5 
'	&s+   6K!CK(K?KDKK
Kc                 p   [         R                  " 5       n/ Ul        U R                  S5         U  GH=  nUu  pVnUb&  XR;  d
   SU-  5       e[	        UR                  5      X%'    [        U5      [	        UR                  5      :X  d   SU[	        UR                  5      4-  5       e [         R                  " 5       nXhl        [         R                  " 5       Ul        UR                  R                  U5        UR                  n	S U	l
        [        U5      n
S /[	        U
5      -  =U	l        n[        U
5       H  u  p[        [        X[         X5        M     [	        U	R                  5      U	l        GM@     S S S 5        [	        UR                  5      Ul        U$ ! [         a     Nf = f! , (       d  f       N:= f)Nzfeature tablezDuplicate feature name: %s%d %d)rl   FeatureListFeatureRecordrn   ro   r*   r;   
FeatureTagFeaturerY   FeatureParamsrs   LookupListIndexru   rJ   r9   r   LookupCountrv   )r~   	lookupMapr   rR   r   name
featureTaglookups
featureRecfeaturer   r   r   r6   s                 r   parseFeatureListr      s   >>DD		'D(,%Dg%-R/Kd/RR-#&t'9'9#:
 4yC(:(:$;; W**+H > ; ))+J$.!!#J%%j1 ((G$(G!"7+D15T0BBG#g#D/Y	L *"%g&=&=">G/  
(4 D../DK   
(	's1   5F'$AF%CF'
F$!F'#F$$F''
F5c                 L   SnS n/ SQnU R                  5       S   R                  5       U;   a  [        U 5      nSSSSS.R                  US   R                  5       5      nU(       a>  US   R                  5       S;   d
   US   5       eUS   R                  5       S	:X  a  X-  nM  US   R                  5       S
:X  a  U[	        US   5      S-  -  nM  US   R                  5       S:X  a  US-  n[	        US   5      nU R                  5       S   R                  5       U;   a  M  X4$ )Nr   )righttoleftignorebaseglyphsignoreligaturesignoremarksmarkattachmenttypemarkfiltertype   r%   r_      )r   r   r   r   )yesnor   r   r   r&   )peekslowernextgetr*   )r~   flags	filtersetallFlagsr   flags         r   parseLookupFlagsr      s'   EIH ++-

 
 
"h
.E{! &%!	

 #d1gmmo
 	 7==?m3<T!W<3Aw}}%'7==?22Sa\Q&&E7==?..TMEDGI% ++-

 
 
"h
.& r   c                     0 nU  H.  n[        U5      S:X  d   U5       e[        U5      nUS   X4S   '   M0     [        R                  " U5      $ )Nr%   r   r   )ro   r2   otlbuildSingleSubstSubtabler~   font
_lookupMapr7   r   s        r   parseSingleSubstr      sS    G4yA~#t#~$7Q  ''00r   c                 n    0 nU  H  n[        U5      nUSS  X4S   '   M     [        R                  " U5      $ Nr   r   )r2   r   buildMultipleSubstSubtabler   s        r   parseMultipler      s@    G$8Q  ))'22r   c                 n    0 nU  H  n[        U5      nUSS  X4S   '   M     [        R                  " U5      $ r   )r2   r   buildAlternateSubstSubtabler   s        r   parseAlternater     s@    G$8Q  **733r   c                     0 nU  H8  n[        U5      S:  d   U5       e[        U5      nUS   U[        USS  5      '   M:     [        R                  " U5      $ )Nr%   r   r   )ro   r2   tupler   buildLigatureSubstSubtabler   s        r   parseLigaturer     s[    G4yA~#t#~$#'7d12h   ))'22r   c                    0 nU  H  n[        U5      S:X  d   U5       eUS   R                  5       R                  SS5      nU[        ;   d   e[	        US   5      n[        US   5      nXc;  a  [        5       X6'   [        X6   U5      (       a   Xe45       e[        X6   XW5        M     [        R                  " X1R                  5       5      $ )Nrb   r   r'   r`   r   r%   )ro   titlereplacer   r-   r*   r   hasattrrr   r   buildSinglePosSubtablegetReverseGlyphMap)r~   r   r   valuesr   wr1   vs           r   parseSinglePosr     s    F4yA~#t#~GMMO##C,))))d1gQL?#FI69a((01&0(	1   %%f.E.E.GHHr   c                 <   [         R                  " 5       nS=Ul        Ul        U R	                  5       S   R                  5       S   R                  5       nUS;   Ga  SUl        0 nU  GH4  n[        U5      S:X  d   U5       eUS   R                  5       S   R                  5       nUS;   d   U5       eUS   [        U5      S  R                  5       R                  SS5      n[        U   S   n	[        USS 5      u  p[        US   5      nX;  a  0 XZ'   XU
   ;  a  [        5       [        5       4XZ   U'   XZ   U   nUS:X  a  U=R                  U	-  sl        US   nOU=R                  U	-  sl        US   n[        X5      (       a   X45       e[!        XU5        GM7     [#        [%        UR'                  5       5      U5      Ul        / Ul        UR(                  R,                   H  n
XZ   n[         R*                  " 5       n/ =nUl        [1        UR'                  5       UR2                  S	9 H[  nX   n[         R.                  " 5       nUUl        US   Ul        UR                  (       a  US   OS Ul        UR;                  U5        M]     [        UR.                  5      Ul        UR*                  R;                  U5        M     [        UR*                  5      Ul        U$ URA                  S
5      (       Ga  SUl        S S /nU R	                  5       S   RA                  S5      (       a  U RC                  5       S   S [        S5      *  R                  5       nS[         RD                  4S[         RF                  4S.U   u  nnUU   b   e[I        XUS9UU'   U R	                  5       S   RA                  S5      (       a  M  Uu  Ul"        Ul#        S U 5       u  Ul%        Ul&        [O        URJ                  5       Vs/ s H  n[         RP                  " 5       PM     snUl(        URP                   Hr  n[O        URL                  5       Vs/ s H  n[         RR                  " 5       PM     snUl)        URR                   H!  n[        5       Ul        [        5       Ul        M#     Mt     U  GH  n[        U5      S:X  d   U5       eUS   R                  5       S   R                  5       nUS;   d   U5       eUS   [        U5      S  R                  5       R                  SS5      n[        U   S   n	S USS  5       u  nnnURP                  U   RR                  U   nUS:X  a"  U=R                  U	-  sl        UR6                  nO!U=R                  U	-  sl        UR8                  n[        X5      (       a   X45       e[!        XU5        GM"     URP                   Hs  nURR                   H`  n[        UR                  UR6                  5      Ul        UR                  (       a   [        UR                  UR8                  5      OS Ul        Mb     Mu     [#        [%        URD                  RT                  R'                  5       5      U5      Ul        U$  U5       es  snf s  snf )Nr   leftrightr   r_   r'   r`   rb   r   ri   classr%   class definition begin)firstsecondklassc              3   n   #    U  H+  nS [        UR                  R                  5       5      -   v   M-     g7fr   N)max	classDefsr   ).0cs     r   	<genexpr>parsePair.<locals>.<genexpr>^  s*      .
3<aAAKK&&())9s   35c              3   8   #    U  H  n[        U5      v   M     g 7fr/   r*   r   xs     r   r   r   m  s     $?YSVVY   )+rl   PairPosValueFormat1ValueFormat2r   splitr   Formatro   r   r   r   r2   r*   r   r   rr   makeCoveragesetkeysCoveragePairSetglyphsPairValueRecordr|   
getGlyphIDSecondGlyphValue1Value2rY   PairValueCountPairSetCountendswithpeek	ClassDef1	ClassDef2parseClassDefClass1CountClass2CountrangeClass1RecordClass2Recordr   )r~   r   r   rR   typr   r   sidewhatmaskglyph1glyph2valuerec2vrvalues1pairsetr   values2pairr   r8   r   r   rec1jclass1class2s                               r   	parsePairr  &  s   ::<D,--D)
++-

 
 
"1
%
+
+
-C
Dt9>'4'>7==?1%++-D,,2d2,73t9;'--/77R@D(.q1D'Qq	2NFQLE#!#F^+*5-)Gv&>&)Dv~!!T)!!W!!T)!!Wr((42*4(Be$) * %S%7>mm**FnGjjlG022Gg- T__E!/))+#) %aj,0,=,=gaj4t$ F &))@)@%AG"LL( +  -d Kc 
g		4L	kkmA''(@AA**,q/"BS)A%B$BCIIKCR\\*bll+ JC S>)))*5eDIcN kkmA''(@AA *3&.
3<.
*$* 9>d>N>N8OP8O1R__.8OP%%D<A$BRBR<S T<Sq!2<S TD)))m)m * &
 Dt9>'4'>7==?1%++-D,,2d2,73t9;'--/77R@D(.q1D$?T!AY$?!FFE$$V,99&ADv~!!T)![[!!T)![[r((42*4(Be$   %%D)))$*;*;T[[I ((   1 14;;?  * & %S)A)A)F)F)H%I4P K 	#qC Q Ts   =Z
Zc                     U R                  5       S   R                  5       S   R                  5       nUS;   a&  U R                  S5         [	        X5      sS S S 5        $ [	        X5      $ ! , (       d  f       N= f)Nr   r   )zfirstclass definition beginzsecondclass definition begin)r   r   r   untilr  )r~   r   r   r  s       r   parseKernsetr    sm    
++-

 
 
"1
%
+
+
-C
[[K
 U)
 
 U!!	
 
s   
A**
A8c                     [        U 5      S::  d   eU" 5       nSUl        [        U S   5      u  Ul        Ul        [        U 5      S:  a#  U S   S:w  a  SUl        [        U S   5      Ul        U$ )Nr%   r   r   r`   )ro   r   intSplitCommaXCoordinateYCoordinater*   AnchorPoint)datar   anchors      r   
makeAnchorr    sj    t9>>WFFM-:47-C*F*
4y1}aB a\Mr   c                 `   0 nU  H  n[        U5      S;   d   U5       eS[        R                  4S[        R                  4S.US      u  pV[	        US   5      nXs;  a  S S /X7'   X7   U   b   Xu45       e[        USS  U5      X7   U'   M     [        R                  " X1R                  5       5      $ )N)rb   r_   r   r   )entryexitr%   )	ro   rl   EntryAnchor
ExitAnchorr-   r  r   buildCursivePosSubtabler   )r~   r   r   r   r   r8   r   glyphs           r   parseCursiver%    s    G4yF"(D("(&
 q'
 $q'""D\GN~c"*8UL8*(ab59s  &&w0G0G0IJJr   c                     / nUR                    HF  nX   u  pVUR                  5       nXWl        [        XrR                  U5        UR                  U5        MH     U$ r/   )r   MarkRecordClassClassrr   
MarkAnchorrY   )r  coverager   r   r$  r   r  records           r   makeMarkRecordsr,    sR    G""$f-v ! Nr   c                 Z   / n0 nUR                    HM  n[        U5      XV'   UR                  5       nS /U-  n[        XrR                  U5        UR                  U5        MO     U R                  5        H5  u  u  pin
XEU      n[        XrR                  5      nX   b   Xi45       eXU	'   M7     U$ r/   )r   ro   BaseRecordClassrr   
BaseAnchorrY   itemsgetattr)r  r*  r   
classCountr   r8   r$  r+  anchorsr   r  s              r   makeBaseRecordsr4    s    G
C\
""$&:%g.v ! #'**,U$&,,/~%5~5%	 #/
 Nr   c                 x   S /[        UR                  5      -  n[        UR                  5       VVs0 s H  u  pVXe_M	     nnnU R                  5        H  u  u  ppnXGU      nUcs  [        R
                  " 5       =oXx   '   Xl        [        U5       Vs/ s H  n[        R                  " 5       PM     snUl        UR                   H  nS /U-  Ul	        M     UR                  U:X  d   UUR                  U45       eUR                  U
S-
     R                  nX   b	   XU	45       eXU	'   M     U$ s  snnf s  snf Nr   )
ro   r   ru   r0  rl   LigatureAttachComponentCountr   ComponentRecordLigatureAnchor)r  r*  r   r2  r   r   r1   r8   r$  r   compIdx	compCountr  r+  compRecr3  s                   r   makeLigatureRecordsr>    sF   fs8??++G%hoo6
76DA146C
76:jjl2*wFU$>+-+<+<+>>FSZ($-!DI)DT%UDTqb&8&8&:DT%UF"!11*.*)<& 2$$	1 	
!!4
 	
1 ((15DD~%>'>>%! 7C" N' 8 &Vs   D1D7c           	         UR                  5       nSUl        0 n0 nXBR                  4XRR                  4XRR                  4S.nSnU  H  nUS   n	U	S;   d   e[	        US   5      n
Xi   u  pU	S:X  a  SOSn[        S USSU-     5       5      n[        USU-      5      n[        USU-   S  U5      nU	S:X  a  XU4nnOX4U-   UnnUU;  d   U5       eUUU'   [        X5      nM     [        [        UR                  5       5      XR                  5      nUR                  5       n[        UUU5      n[        UUR                   U5        [        UUR"                  [%        U5      5        [        X2R&                  U5        [        X2R(                  U5        US-   Ul        U(       d  SO"S[        S	 UR-                  5        5       5      -   Ul        [        [        UR                  5        Vs/ s H  nUS   PM
     sn5      XR0                  5      nUR3                  5       nUR4                  S
:X  a  [7        UUX#R.                  5      nO[9        UUX#R.                  5      n[        UUR:                  U5        [        UUR<                  [%        U5      5        [        X2R>                  U5        [        X2R@                  U5        U$ s  snf )Nr   )markbaseligaturer   rB  r%   c              3   8   #    U  H  n[        U5      v   M     g 7fr/   r   r   r   s     r   r   'parseMarkToSomething.<locals>.<genexpr>  s     @'?!s1vv'?r   rb   r@  c              3   0   #    U  H  u  pUS    v   M     g7fr   r   )r   kr   s      r   r   rE    s     4WFVdaQqTFVs   Ligature)!Typer   MarkAnchorClassBaseAnchorClassr-   r   r*   r  r   r   r   r   MarkCoverageClassMarkArrayClassr,  rr   
MarkRecord	MarkCountro   MarkCoverage	MarkArray
ClassCountr0  r2  BaseCoverageClassBaseArrayClassBaser>  r4  
BaseRecord	BaseCountBaseCoverage	BaseArray)r~   r   r   rR   markDatabaseDataDatamaxKlassr   r  r$  r  anchorClass
extraItemsextrasr   r  rA   r  markCoverage	markArraymarkRecordsrG  baseCoverage	baseArraybaseRecordss                             r   parseMarkToSomethingrg    s   668DDKHH,,-,,-001D
 H1g2222$q'" I+Q
@tAJ'?@@DZ()DZ!12K@&=C .61FC$##S	x' $  HMMO 4d<O<OPL  "I!(L!<KIq||[1Iq{{C$45D..,/D++y)lDO  (aQ4WhnnFV4W1W-WDO8==?+?aQqT?+,d4G4GL   "Ivv)(L!__U%haQIq||[1Iq{{C$45D..,/D++y)K ,s   )Kc                       \ rS rSrS rSrg)
MarkHelperi  c                     S Hh  nS H_  nX-   nUS:X  a	  US;   a  UnO[        X5      U-   nUS:X  a  Sn[        XU5        US:w  d  M@  [        [        U5      n[        XS-   U5        Ma     Mj     g )	N)MarkrU  )r   ArrayCountRecordAnchorrk  )rm  rn  ro  LigatureRecordr7  rm  r(  )r1  rr   rl   )rR   WhichWhatrA   r  r   s         r   rS   MarkHelper.__init__  sz    %EJlF?t/L'LE#D047E,,,E5)7?#B.ED-7 K &r   r   Nr   r   r   r   rS   r   r   r   r   ri  ri    s    8r   ri  c                   4    \ rS rSrSrSr\R                  rSr	g)MarkToBaseHelperi(  rk  rU  r   N)
r   r   r   r   rk  rU  rl   MarkBasePosrI  r   r   r   r   rv  rv  (  s    DD>>Dr   rv  c                   4    \ rS rSrSrSr\R                  rSr	g)MarkToMarkHelperi.  Mark1Mark2r   N)
r   r   r   r   rk  rU  rl   MarkMarkPosrI  r   r   r   r   ry  ry  .  s    DD>>Dr   ry  c                   4    \ rS rSrSrSr\R                  rSr	g)MarkToLigatureHelperi4  rk  rH  r   N)
r   r   r   r   rk  rU  rl   
MarkLigPosrI  r   r   r   r   r~  r~  4  s    DD==Dr   r~  c                 *    [        X[        5       5      $ r/   )rg  rv  r~   r   r   s      r   parseMarkToBaser  :      -=-?@@r   c                 *    [        X[        5       5      $ r/   )rg  ry  r  s      r   parseMarkToMarkr  >  r  r   c                 *    [        X[        5       5      $ r/   )rg  r~  r  s      r   parseMarkToLigaturer  B  s    -A-CDDr   c                 |    U (       a/  U R                  S5       Vs/ s H  oR                  5       PM     sn$ / $ s  snf N,)r   strip)r   r,   s     r   rs   rs   F  s-    37tzz#/!GGI/?R?/s   9c                 t    U (       a+  U R                  S5       Vs/ s H  n[        U5      PM     sn$ / $ s  snf r  )r   r*   )r   r   s     r   r  r  J  s-    04DJJsO,OqCFO,<"<,s   5c                       \ rS rSrS rSrg)ContextHelperiO  c                    UR                  S5      (       a  SnSnOSnSnUR                  S5      (       a  SnSnSnOSnSnSnXS-   nX0l        X@l        XPl        Xl        X`l        Xpl        US	-   U l        US:X  a  S
 n	S n
S nS nS nS nS nS nS nS nOPUS:X  a  S n	S n
S nS nS nS nS nS nS nS nO+US:X  a  S n	S n
S nS nS nS nS nS  nS! nS" nO
 S#U-  5       eU(       a!  Xl	        Xl
        Xl        UU l        UU l        OXl	        Xl
        Xl        Xl        UU l        US:X  a1  US$-   U l        US%-   U l        US&-   U l        US'-   U l        S( U l        g US:X  aa  US)-   U l        US*-   U l        US+-   U l        US,-   U l        S- U l        U(       a  S.OS/U l        U(       a  SOSU l        U(       a  S0OS1U l        g g )2NSubstSubPosChainr   rb   r`   r   LookupRecordc                     U R                   $ r/   r   rs    r   rC   (ContextHelper.__init__.<locals>.<lambda>k      r   c                     U R                   $ r/   r  r  s    r   rC   r  l      ajjr   c                     g)Nr/   r   r  s    r   rC   r  m  s    Gr   c                     g)N)NNNr   r  s    r   rC   r  n  s    );r   c                     U R                   4$ r/   )Inputr  s    r   rC   r  q  
    !''r   c                 H    U R                   U R                  U R                  4$ r/   	Backtrackr  	LookAheadr  s    r   rC   r  r      q{{AGGQ[[&Ir   c                 6    Uu  U l         S U 5       u  U l        g )Nc              3   >   #    U  H  n[        U5      S -   v   M     g7fr   ro   r   s     r   r   >ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>v       "9q!3q6A:q   )r  
GlyphCountr  ds     r   SetRuleData+ContextHelper.__init__.<locals>.SetRuleDatat      
"9q"9r   c                     Uu  U l         U l        U l        [        US   5      [        US   5      S-   [        US   5      sU l        U l        U l        g Nr   r   r%   r  r  r  ro   BacktrackGlyphCountInputGlyphCountLookAheadGlyphCountr  s     r   ChainSetRuleData0ContextHelper.__init__.<locals>.ChainSetRuleDatax  P    673agq{
 1YAaD	As1Q4y	)%)r   r%   c                     U R                   $ r/   r  r  s    r   rC   r    r  r   c                     U R                   $ r/   r  r  s    r   rC   r    r  r   c                     U R                   4$ r/   ClassDefr  s    r   rC   r    s
    QZZMr   c                 H    U R                   U R                  U R                  4$ r/   BacktrackClassDefInputClassDefLookAheadClassDefr  s    r   rC   r    s     ####*r   c                     Uu  U l         g r/   r  r  s     r   SetContextData.ContextHelper.__init__.<locals>.SetContextData  s     !r   c                 .    Uu  U l         U l        U l        g r/   r  r  s     r   SetChainContextData3ContextHelper.__init__.<locals>.SetChainContextData  s    NOK$aoq7Jr   c                     U R                   4$ r/   )r(  r  s    r   rC   r    r  r   c                 H    U R                   U R                  U R                  4$ r/   r  r  s    r   rC   r    r  r   c                 6    Uu  U l         S U 5       u  U l        g )Nc              3   >   #    U  H  n[        U5      S -   v   M     g7fr   r  r   s     r   r   r    r  r  )r(  r  r  s     r   r  r    r  r   c                     Uu  U l         U l        U l        [        US   5      [        US   5      S-   [        US   5      sU l        U l        U l        g r  r  r  s     r   r  r    r  r   c                      U R                   S   $ Nr   r  r  s    r   rC   r    s    Ar   c                      U R                   S   $ r  )InputCoverager  s    r   rC   r    s    aooa&8r   c                     U R                   $ r/   r  r  s    r   rC   r    r  r   c                 N    U R                   U R                  -   U R                  -   $ r/   )BacktrackCoverager  LookAheadCoverager  s    r   rC   r    s    ##aoo58K8KKr   c                 6    Uu  U l         S U 5       u  U l        g )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr/   r  r   s     r   r   r    s     "51a3q661r   )r   r  r  s     r   r  r    s     !"51"5r   c                 f    Uu  U l         U l        U l        S U 5       u  U l        U l        U l        g )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr/   r  r   s     r   r   CContextHelper.__init__.<locals>.ChainSetRuleData.<locals>.<genexpr>  s     'QSVVQr   )r  r  r  r  r  r  r  s     r   r  r    s7    NOK$aoq7J
 (Q'	)%)r   zunknown format: %sRule	RuleCountRuleSetRuleSetCountc                     X ;   a  U/$ / $ r/   r   r   r   r  s      r   rC   r    s    1#2L"2Lr   	ClassRuleClassRuleCountClassSetClassSetCountc                 h    U(       a  UR                  X5      $ US:X  a  [        U 5      $ [        5       $ r  )intersect_classr   r  s      r   rC   r    s6     !!&, 8%&!Vc&k8148r   r  r  r  r(  )r   
startswithTyprI  r  ChainTypInputIdxDataLenr  r   ContextDatar  RuleDatar  r  r  r  r  	Intersectr  ClassDefIndexr  )rR   	klassNamer   r  rI  r  r  r  r  r   ChainCoverager  ChainContextDatar  r  r  ChainRuleDatar  r  s                      r   rS   ContextHelper.__init__P  s@   g&&CDCD((EHGEHG;	
   >1Q;+H0M+K;!N"&+HIM:: q[+H0M1K "P ,HIM:: q[.H8MK#!N"&+HM6( 4*V331)M/"5)DM/D$M*"0$M*DQ; 6)DI%3DN#i/DL (> 9DLDNq[ ;.DI%(88DN#j0DL (? :DDN 05O*DM&+D$)wDJ r   )r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  rI  Nrt  r   r   r   r  r  O  s    J7r   r  c           	      ,   [        [        U5      n/ nU  H{  nU" 5       n[        U5      n[        U5      S:X  d   U5       e[	        US   5      nUS:  d   U5       eUS-
  Ul        [        [        X%S   [        US5        UR                  U5        M}     U$ )Nr%   r   r   r   )
r1  rl   rs   ro   r*   SequenceIndexrJ   r9   rr   rY   )r0  r  r   r   lstitemrg   r8   s           r   parseLookupRecordsr    s    B	"E
Cgt$4yA~#t#~$q'lQww!GY	7GSBST

3  Jr   c                 D    U (       d  g U" 5       n[        U 5      Ul        U$ r/   )dictr   )r   r   r   rR   s       r   makeClassDefr    s    7D)_DNKr   c                     0 nU R                  S5         U  H-  n[        US   5      nXS;  d   U5       e[        US   5      X5'   M/     S S S 5        [        X1U5      $ ! , (       d  f       N= f)Nzclass definitionr   r   )rn   r-   r*   r  )r~   r   r   r   r   r$  s         r   r   r     sj    I	)	*Dd1g&E)050)"47|I  
+
 	// 
+	*s   4A
A*c                     U (       d  g [        U [        5      (       a  [        U 5      n U" 5       n[        [        U 5      UR                  S9Ul        U$ )Nri   )
isinstancer   r|   r   r   )r   r   r   r*  s       r   r   r     s@    &#wHS[doo>HOOr   c                     / nU R                  S5         U  H   nUR                  [        US   5      5        M"     S S S 5        [        X1U5      $ ! , (       d  f       N= f)Nzcoverage definitionr   )rn   rY   r-   r   )r~   r   r   r   r   s        r   parseCoverager    sP    F	,	-DMM)DG,-  
. e,, 
.	-s   'A
Ac           	      X  ^ 0 nU HT  u  pVUR                  UTR                     S   / 5      R                  [        U4S j[	        U5       5       5      U45        MV     / nU GH  nX;  a  UR                  S 5        M  / n	XH    H  u  pV[        [        TR                  5      " 5       n
TR                  X5        [        U
TR                  S-   [        U5      5        [        U
TR                  U5        U	R                  U
5        M     [        [        TR                  5      " 5       n[        UTR                  U	5        [        UTR                  [        U	5      5        UR                  U5        GM     [        U TR                  U5        [        U TR                  [        U5      5        g )Nr   c              3   T   >#    U  H  u  pX!TR                   :X  a  S OSS v   M     g7f)r   r   Nr  )r   r   r,   r   s      r   r   !bucketizeRules.<locals>.<genexpr>  s%     O1qzz/Qq23s   %(rm  )
setdefaultr  rY   r   ru   r1  rl   r  r  rr   rI  ro   r  r  r  r  )rR   r   rules
bucketKeysbucketsseqrecsrulesets
firstGlyph	thisRulesrulerulesets    `          r   bucketizeRulesr    sO   G	3qzz?1-r299O	#OOQUV	
 
 H 
$OOD!	 ,IC2qvv&(DMM$$D!&&7*CI6D!..$/T" - "aii(*+c)n5  !" D!))X&D!..#h-0r   c           
      $  ^^ [        [        U5      " 5       nU R                  5       S   R                  5       S   R	                  5       nUS:X  GaV  SUl        [        R                  SX$R
                  5        [        X$R
                  5      m/ nU  H  nUS   R	                  5       S:X  d
   US   5       e[        U5      STR                  -   :  a/  UR                  S5        [        U5      STR                  -   :  a  M/  [        S USSTR                  -     5       5      n[        USTR                  -   S  TR                  U5      n	UR                  X45        M     [        U4S jU 5       5      n
[!        X5      Ul        [%        UTXdR"                  R&                  5        U$ UR)                  S5      (       Ga  S	Ul        [        R                  SX$R
                  5        [        X$R
                  5      mS /TR                  -  nU R                  5       S   R)                  S
5      (       a  U R+                  5       S   S [        S
5      *  R	                  5       nSS[        R,                  40S[        R.                  4S[        R0                  4S	[        R2                  4S.S.TR                     U   u  pX   b   U5       e[5        XUS9X'   U R                  5       S   R)                  S
5      (       a  M  TR7                  XK5        / nU  H  nUS   R	                  5       R9                  S5      (       d
   US   5       e[        U5      STR                  -   :  a/  UR                  S5        [        U5      STR                  -   :  a  M/  [        S USSTR                  -     5       5      n[        USTR                  -   S  TR                  U5      n	UR                  X45        M     [        U4S jU 5       5      m[        U4S jUTR:                     R<                  R?                  5        5       5      n
[!        X5      Ul        [%        UTU[A        [C        T5      S-   5      5        U$ UR)                  S5      (       Ga   SUl        [        R                  SX$R
                  5        [        X$R
                  5      m[        S [A        TR                  5       5       5      nU R                  5       S   R)                  S5      (       a  U R+                  5       S   S [        S5      *  R	                  5       nSS[        R"                  40S[        RD                  4S[        RF                  4S	[        RH                  4S.S.TR                     U   u  pX   R                  [K        XUS95        U R                  5       S   R)                  S5      (       a  M  TRM                  XN5        [O        U 5      n [        U 5      S:X  d   eU S   nUS   R	                  5       S:X  d
   US   5       e[        USS  TR                  U5      n	[Q        UTRR                  S-   [        U	5      5        [Q        UTR                  U	5        U$  U5       e)Nr   r$  r   zParsing %s format %sr`   c              3   J   #    U  H  n[        [        U5      5      v   M     g 7fr/   )r2   rs   rD  s     r   r   parseContext.<locals>.<genexpr>9  s     X@W1
?1#566@Ws   !#c              3   L   >#    U  H  u  pUTR                      S    v   M     g7fr   Nr  r   r  r  r   s      r   r   r  =  s      De#ajj/!,e   !$r   r%   r   )	backtrackr`   	lookahead)r   rb   r   c              3   8   #    U  H  n[        U5      v   M     g 7fr/   )r  rD  s     r   r   r  Y  s     J2IQa((2Ir   c              3   L   >#    U  H  u  pUTR                      S    v   M     g7fr  r  r  s      r   r   r  \  s      Eu)#3qzz?1-ur  c              3   <   >#    U  H  u  pUT;   d  M  Uv   M     g 7fr/   r   )r   r1   r   firstClassess      r   r   r  ]  s       
A$!Q,EVAAAs   	r*  rb   c              3   &   #    U  H  n/ v   M	     g 7fr/   r   rD  s     r   r   r  f  s     7&6"&6s   coverage definition begin)r  inputr  rm  )*r1  rl   r   r   r   r   rV   rW   r  ro   r  rY   r   r  r  r   r   r   r  r   r   r   r  r  r  r  r   r  r  r  r   r0  r   r   r  r  r  r  r  listrr   rI  )r~   r   rI  r   rR   r  r
  r   r  r  firstGlyphsr   r8   r   	coveragesr   r!  s                  @@r   parseContextr(  -  s   2tD
++-

 
 
"1
%
+
+
-C
g~		($<$,D7==?g-6tAw6-d)a!))m+B d)a!))m+XQQYY@WXXC%d1qyy=?&;Q^^YWDLL#%  DeDD$[7tQ}}';';<~ K} 
g				($<$,FQYY&	kkmA''(@AA**,q/"BS)A%B$BCIIKC BKK( #$R%9%9!:B,,-"#R%9%9!:		 ii	 	JC >).3.)*5eDIN kkmA''(@AA 	
)D7==?--g66?Q?6d)a!))m+B d)a!))m+J$q1qyy=2IJJC%d1qyy=?&;Q^^YWDLL#%  EuEE 
#AJJ/99??A
 
 %[7tQuS->-B'CD: K9 
j	!	!		($<$,7eAII&677	kkmA''(CDD**,q/"ES)D%E$EFLLNC BKK( #$R%9%9!:!1!12"#R%9%9!:		 ii	 	JC N!!-5"IJ kkmA''(CDD 	
d&U5zQQxAw}}*,5d1g5,!$qr(ANNIFaffw&D	2annd+ K 	#qr   c                     [        XSUS9$ )NContextSubstr   r(  r~   r   r   s      r   parseContextSubstr.    s    ^yIIr   c                     [        XSUS9$ )N
ContextPosr+  r,  r-  s      r   parseContextPosr1    s    \YGGr   c                     [        XSUS9$ )NChainContextSubstr+  r,  r-  s      r   parseChainedSubstr4    s    %8INNr   c                     [        XSUS9$ )NChainContextPosr+  r,  r-  s      r   parseChainedPosr7    s    %6)LLr   c                    [         R                  " 5       nSUl        / / 4nU R                  5       S   R	                  S5      (       a  U R                  5       S   S [        S5      *  R                  5       nS[         R                  4S[         R                  4S.U   u  pgXF   R                  [        XUS95        U R                  5       S   R	                  S5      (       a  M  US   Ul        [        UR                  5      Ul        US   Ul	        [        UR                  5      Ul        0 nU  H.  n	[        U	5      S:X  d   U	5       e[        U	5      n	U	S   XS   '   M0     [        [!        UR#                  5       5      U5      Ul        UR$                  R&                   V
s/ s H  oU
   PM	     sn
Ul        [        UR(                  5      Ul        U$ s  sn
f )Nr   r   r#  )r  r  r   r%   )rl   ReverseChainSingleSubstr   r   r   r   ro   r   r  r  rY   r  r  r  r2   r   r   r   r   r   
Substituter  )r~   r   r   rR   r'  r  r8   r   r7   r   rG  s              r   parseReverseChainedSubstr;    s   %%'DDKRI
++-

#
#$?
@
@jjl1oA%@!A ABHHJR112R112
 
 	mEuEF ++-

#
#$?
@
@ 'q\D"4#9#9:D&q\D"4#9#9:DG4yA~#t#~$7Q  !W\\^!4d;DM+/==+?+?@+?aqz+?@DO$//*DOK As   "Gc                 `   U R                  S5      nUu  pVn[        R                  SXv5        [        R                  " 5       n[        U 5      u  Ul        n	U	b  Xl        S[        4S[        4S[        4S[        4S[        4S[        4S	[        4S
.S[        4S[         4S["        4S[$        4S[&        4S[(        4S[*        4S[,        4S	[.        4S.	S.U   U   u  Ul        n
U R3                  S5         / nU R5                  5       (       a  U R3                  S5         U R5                  5       (       aM  U
" XU5      nUR0                  UR0                  :X  d   eUR7                  U5        U R5                  5       (       a  MM  S S S 5        U R9                  5       S   S;   a  [;        U 5        U R5                  5       (       a  M  S S S 5        U R                  S5        WUl        [?        UR<                  5      Ul         UR@                  S:X  a  g U$ ! , (       d  f       N= f! , (       d  f       Nd= f)NlookupzParsing lookup type %s %sr   r%   rb   r_         r   )singlemultiple	alternaterB  contextchainedreversechained   )	r@  r  kernsetcursivezmark to basezmark to ligaturezmark to markrC  rD  GSUBGPOSz
lookup end)
% subtablezsubtable endr   )!expectrV   rW   rl   Lookupr   
LookupFlagMarkFilteringSetr   r   r   r   r.  r4  r;  r   r  r  r%  r  r  r  r1  r7  
LookupTyper  r   rY   r   r   SubTablero   SubTableCount)r~   tableTagr   r   r   _r   r  r=  r   parseLookupSubTable	subtablessubtables                r   parseLookuprY    s   <<!DLASII)35YY[F#3E#: Fy"+ *+M*^,M*,-,- ":;
 .)	N<(<(0!"$7 80?+?+

.* +.* +.*F*. 
\	"	jjll;<jjll25	JH!,,0C0CCCC$$X. jjll =
 {{}Q#AAU jjll 
# 
LLFOv/Fq  M =<	 
#	"s%   4)HA!H ?H
H	H
H-c                   ^^ [         R                  " U5      " 5       n[        5       m[        5       mUS;   d   e[        R	                  SU5        [        [        U5      " 5       nSUl        SU4S j4SUU4S j4SS	.nUR                  5        H  u  pg[        XFS 5        M     U R                  5       Gb  U R                  5       S
   R                  5       nX;  a1  [        R	                  SU R                  5       5        [        U 5        Mi  XX   u  pgUS:X  a  UR                  c+  [        R                  " 5       Ul        / UR                  l        U R                  5       u  pn	[        XUT5      nTb3  U
T;  d
   SU
-  5       e[!        UR                  R                  5      TU
'   OK[#        U
5      [!        UR                  R                  5      :X  d   SU
[!        UR                  5      4-  5       eUR                  R                  R%                  U5        O%[        XF5      b   U5       e[        XFU" U 5      5        U R                  5       b  GM  UR                  (       a.  [!        UR                  R                  5      UR                  l        Tb  TR)                  5         [*        R,                  R/                  [0        5      (       a{  SU;  a  [3        S5      US'   0 US   l        US   R4                  R7                  [8        0 5      R7                  U0 5      nTR;                  5        H  u  pSU
S/U[=        U5      '   M     TR)                  5         XCl        U$ )NrI  z
Parsing %s   rm   c                    > [        U T5      $ r/   )r   )r~   r   s    r   rC   parseGSUBGPOS.<locals>.<lambda>  s    /%<r   r   c                    > [        U TT5      $ r/   )r   )r~   r   r   s    r   rC   r]    s    *5)ZHr   )
LookupListN)zscript table beginzfeature table beginr=  r   Skipping %sr=  zDuplicate lookup name: %sr   Debgr`   ) r   getTableClassrL   rV   rW   r1  rl   Versionr   rr   r   r   r   r_  rN  rY  ro   r*   rY   r   r\   osenvironr   r   r
   r  r	  r   r0  strtable)r~   r   rT  	containerrR   fieldsattrparserr  rU  r   r=  rW   r   r   s                @@r   parseGSUBGPOSrl    s   ##H-/I!I "J''''IIlH%2x "DDL <

 H 
 '
F D! (
**,
"jjl1o##%IImUZZ\2K{(?&"$--/)+&JAQ $	BF$9,P.ID.PP,"%doo&<&<"=	$4yC(>(>$?? $L B ? OO""))&14&.44.Du.1 **,
"2 &)$//*@*@&A#'')::>>.//T!'/V$&V!Vjj!6;Hb) 
 !* 1&($^c&k" !2 	((*Or   c                     [        XS5      $ )NrJ  rl  r~   r   s     r   	parseGSUBrp  #      f--r   c                     [        XS5      $ )NrK  rn  ro  s     r   	parseGPOSrs  '  rq  r   c                 6   0 nU R                  S5         U  H>  n[        US   5      nXB;  d   U5       eUSS   Vs/ s H  n[        U5      PM     snX$'   M@     S S S 5        [        R                  " X!R                  5       5      $ s  snf ! , (       d  f       N7= f)Nzattachment listr   r   )rn   r-   r*   r   buildAttachListr   )r~   r   pointsr   r$  r   s         r   parseAttachListrw  +  s    F	(	)Dd1g&E&--&-1!"X6XSVX6FM  
*
 v'>'>'@AA 7	 
*	)s   'B
B	B
B


Bc                    0 nU R                  S5         U  Hc  n[        US   5      nXB;  d   U5       e[        US   5      nUSS   Vs/ s H  n[        U5      PM     nnU[        U5      :X  d   U5       eXrU'   Me     S S S 5        [        R
                  " U0 UR                  5       5      $ s  snf ! , (       d  f       N9= f)Ncaretsr   r   r%   )rn   r-   r*   ro   r   buildLigCaretListr   )r~   r   ry  r   r$  numr   
thisCaretss           r   parseCaretListr}  5  s    F	x	 Dd1g&E&--&d1g,C*.qr(3(Q#a&(J3#j/)/4/)&5M  
!   T-D-D-FGG 4 
!	 s   5B1	B, B1,B11
B?c                 2   [         R                  " 5       nSUl        S[        U R	                  5       5      -   Ul        S /UR
                  -  Ul        [        U R                  5       5       H'  u  p4[        [        U5      U5      UR                  U'   M)     U$ r6  )rl   MarkGlyphSetsDefMarkSetTableFormatr   r   MarkSetCountr   r|   r0  r   r   )setsr   rR   rG  r   s        r   makeMarkFilteringSetsr  B  sy     DDC		,,DFT...DMtzz|$'A5a %Kr   c                     0 nU R                  S5         U  HQ  n[        U5      S:X  d   U5       e[        US   5      n[        US   5      nXR;  a  / X%'   X%   R	                  U5        MS     S S S 5        [        X!5      $ ! , (       d  f       N= f)Nzset definitionr%   r   r   )rn   ro   r-   r*   rY   r  )r~   r   r  r   r$  sts         r   parseMarkFilteringSetsr  L  s    D	'	(Dt9>'4'>d1g&ET!WB~HOOE"  
) !,, 
)	(s   AA??
Bc                    [         R                  " S5      " 5       n[        R                  S5        [        R
                  " 5       nSS 4S[        4S[        4SS 4S	[        4S
.nUR                  5        H  u  pV[        X5S 5        M     U R                  5       b  U R                  5       S   R                  5       nXt;  a#  [        R                  SU5        [        U 5        MZ  XG   u  pV[        X55      b   U5       e[        X5U" X5      5        U R                  5       b  M  UR                  c  SOSUl        X2l        U$ )NGDEFzParsing GDEFGlyphClassDefc                 2    [        X[        R                  S9$ Nr   )r   rl   r  ro  s     r   rC   parseGDEF.<locals>.<lambda>a  s    eAQAQ Rr   
AttachListLigCaretListMarkAttachClassDefc                 2    [        X[        R                  S9$ r  )r   rl   r  ro  s     r   rC   r  g  s    eAVAV Wr   r  )r   zattachment list beginzcarets beginz&mark attachment class definition beginzmarkfilter set definition beginr   r`  r[  i  )r   rb  rV   rW   rl   r  rw  r}  r  r   rr   r   r   r   r1  r  rc  rg  )r~   r   rh  rR   ri  rj  rk  r  s           r   	parseGDEFr  Z  s%   ##F+-IIIn779D R#
 #/!@'8 W3
 -?@V+WF D! (
**,
"jjl1o##%IImS)K{t"*0D0*F5/0 **,
" "&!6!6!>:JDLOr   c                 R   [         R                  " S5      " 5       n[        R                  S5        / nU R	                  5       b  U R                  S[        U5      -  5        S Vs/ s H  n[        X5      PM     snu  pVpx[        U   " U5      n	XYl	        Xil
        Xl        0 U	l        [        U 5      n
U
S   S:w  a5  U
S   U	R                  [        U
S   S5      '   [        U 5      n
U
S   S:w  a  M5  UR                  U	5        U R	                  5       b  M  SUl        X2l        U$ s  snf )	NcmapzParsing cmapzcmap subtable %d)
platformID
encodingIDformatlanguager   zend subtabler   r&   )r   rb  rV   rW   r   rM  ro   parseCmapIdr   r  	platEncIDr  r  r   r*   rY   tableVersiontables)r~   r   rh  r  fieldplatIdencIdfmtlangrg  r   s              r   	parseCmapr  {  s   ##F+-IIInF
**,
"'#f+56 L$
K %K$
 s S!#&!
E{1g'+/7EJJs47B'(;D 1g' 	e **,
"  I!$
s   %D$c                 H    [        U 5      nXS   :X  d   e[        US   5      $ )Nr   r   )r   r*   )r~   r  r   s      r   r  r    s)    ;DGtAw<r   c                    [         R                  S5        U R                  5       nS nUS   R                  5       S   S:X  a  US   R                  5       S   nO?SR	                  US   R                  5       S S 5      S:X  a  US   R                  5       S   nUb/  [        U 5        UR                  S5      nUc  UnOX$:X  d   X$45       eUc   S	5       e[        [        [        [        S
.U   " X5      $ )NzParsing tabler   FontDamer   r'   rb   zFont Chef Tabler_   z7Don't know what table to parse and data doesn't specify)rJ  rK  r  r  )rV   rW   r   r   joinr   ljustrp  rs  r  r  )r~   r   rT  r   tags        r   
parseTabler    s    IIo;;=D
CAw}}qZ'1gmmoa 	$q'--/"1%	&*;	;1gmmoa 
UiilH?3XO3? 	A@A 	
 
  r   c                   v    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 r\S 5       r\S 5       rS rS rSrg)	Tokenizeri  c                     [        U5      n UR                  U l        [        U5      U l        SU l        SU l        / U l        S U l        g !   S U l         N8= f)Nr`   r   )iterr   filenamer~   r   linenostoppersbuffer)rR   fr~   s      r   rS   Tokenizer.__init__  sR    Q	!FFDM %[
		! DMs   A 	Ac                     U $ r/   r   rQ   s    r   __iter__Tokenizer.__iter__  s    r   c                    U =R                   S-  sl         [        U R                  5      =ol        UR	                  S5       Vs/ s H  o"R                  5       PM     nn[        U5      S:X  a  US   (       d  US	 U(       a_  US   (       dU  [        R                  SU R                   U R                  4-  5        U(       a   US   (       d  US	 U(       a  US   (       d  M  U$ s  snf )Nr   	r   z!trailing tab found on line %d: %s)	r  r   r~   r   r   r  ro   rV   warning)rR   r   r,   s      r   
_next_lineTokenizer._next_line  s    q

++y#'::d#34#3a	#34t9>$q'QRKK;t{{DII>VVWtBxH tBxx 5s   C#c                 x     U R                  5       nU(       a!  US   (       a  US   S   S:w  d	  US   S:X  a  U$ M:  )Nr   %rL  )r  rR   r   s     r   _next_nonemptyTokenizer._next_nonempty  s>    ??$DQT!WQZ3%6$q'\:Q	 r   c                 n    U R                   (       a  U R                   nS U l         U$ U R                  5       $ r/   )r  r  rR   rets     r   _next_bufferedTokenizer._next_buffered  s-    ;;++CDKJ&&((r   c                     U R                  5       nUS   R                  5       U R                  ;   a  Xl        [        eU$ r  )r  r   r  r  StopIterationr  s     r   __next__Tokenizer.__next__  s6    ""$7==?dmm+Kr   c                 "    U R                  5       $ r/   )r  rQ   s    r   r   Tokenizer.next  s    }}r   c                     U R                   (       d   U R                  5       U l         U R                   S   R                  5       U R                  ;   a  g U R                   $ ! [         a     g f = fr  )r  r  r  r   r  rQ   s    r   r   Tokenizer.peek  s^    {{"113 ;;q>!T]]2{{	 ! s   A   
A-,A-c                 0    U R                  5       nUb  U$ S$ )N)r`   )r   r  s     r   r   Tokenizer.peeks  s    iikos050r   c              #      #    US-   nUS-   nU R                  U5        U R                  R                  U5        S v   U R                  S	 U R                  US-   5        g 7f)Nz beginz endr  )expectendswithr  rY   rM  )rR   r  startends       r   rn   Tokenizer.between  sV     hFlE"S!MM"C&L!s   AAc              #      #    [        U5      [        La  U4nU R                  R                  U5        S v   U R                  [	        U5      * S 2	 g 7fr/   )rX   r   r  extendro   )rR   tagss     r   r  Tokenizer.until  sA     :U"7DT"MM3t9*,'s   AAc                 l    [        U 5      nUS   R                  5       nX1:X  d   SU< SU< S35       eU$ )Nr   z
Expected '', got '')r   r   rR   r,   r   r  s       r   rM  Tokenizer.expect  s3    Dz1gmmox=a==xr   c                     [        U 5      nUS   R                  5       nUR                  U5      (       d   SU< SU< S35       eU$ )Nr   zExpected '*r  r  )r   r   r   r  s       r   r  Tokenizer.expectendswith  s;    Dz1gmmo||AEa EEr   )r  r  r   r  r~   r  N)r   r   r   r   rS   r  r  r  r  r  r   r   r   r	   rn   r  rM  r  r   r   r   r   r  r    sa    
)1 " " ( (r   r  c                 ,    [        U 5      n[        X1US9$ )a  Convert a Monotype font layout file to an OpenType layout object

A font object must be passed, but this may be a "dummy" font; it is only
used for sorting glyph sets when making coverage tables and to hold the
OpenType layout table while it is being built.

Args:
        f: A file object.
        font (TTFont): A font object.
        tableTag (string): If provided, asserts that the file contains data for the
                given OpenType table.

Returns:
        An object representing the table. (e.g. ``table_G_S_U_B_``)
rT  )r  r  )r  r   rT  r~   s       r   buildr    s      aLEeH55r   c                    SSK nSSKJn  SSKJn  U c  UR
                  SS n U" 5         SSKnUR                  S[        R                  S9nUR                  SS	S
SSS9  UR                  SSSSSS9  UR                  SS
[        SSS9  UR                  U 5      n Uc9  U R                  (       a!  [        R                  " U R                  5      nOU" 5       nU R                    H  n["        R%                  SU5        ['        USSS9 n[)        XqU R*                  S9nSSS5        WR-                  U5      n	UR/                  5       n
U
R1                  X5        SSKJn  UR*                  nUR7                  UR8                  5      nUR;                  U5        UR=                  5         U
R?                  X5        URA                  U5        UR=                  5         M     g! , (       d  f       N= f)zConvert a FontDame OTL file to TTX XML

Writes XML output to stdout.

Args:
        args: Command line arguments (``--font``, ``--table``, input files).
r   N)configLogger)MockFontr   zfonttools mtiLib)descriptionz--fontz-fFILEr   zDInput TTF files (used for glyph classes and sorting coverage tables))metavardesthelpz--tablez-tTABLErT  z7Table to fill (sniffed from input file if not provided)inputs+zInput FontDame .txt files)r  rX   nargsr  zProcessing %srtzutf-8)encodingr  )	xmlWriter)!sys	fontToolsr  fontTools.misc.testToolsr  argvargparseArgumentParsermain__doc__add_argumentrf  
parse_argsr   r   r(   r  rV   rW   openr  rT  compile	__class__	decompilefontTools.miscr  	XMLWriterstdoutbegintagnewlinetoXMLendtag)argsr   r  r  r  r  rk  r  rg  blob
decompiledr  r  writers                 r   r  r  -  s    &1|xx| N $$LL % F
 S   F   &s#<W   T"D|99<<		*D:D[[		/1%!TG,!DMM:E -}}T"__&
T( 	-nn$$SZZ0&c% ,,s   G
G(	__main__r/   )NN)br  r   fontTools.ttLib.tables._c_m_a_pr   fontTools.ttLib.tablesr   rl   fontTools.ttLib.tables.otBaser   r   fontTools.otlLibr   r   
contextlibr	   fontTools.ttLibr
    fontTools.feaLib.lookupDebugInfor   r   operatorr   rd  logging	Exceptionr   r   r   r"   	getLoggerrV   r-   r2   r9   r<   rJ   r  rL   r   r   r   r   r   r   r   r   r  r  ro  r  r%  r,  r4  r>  rg  objectri  rv  ry  r~  r  r  r  rs   r  r  r  r   r  r  r   r   r  r  r(  r.  r1  r4  r7  r;  rY  rl  rp  rs  rw  r}  r  r  r  r  r  r  r  r  r  r   r  r   r   r   r   <module>r     s2    8 1 L + % $ X  	 	) 		[ 		1 		0 	 *+%

$ $d $,9xBB1343I]@" 99 K "05p8 8"z z : AAE@=
K7F K7\ )+  &([[ 0 &([[  &([[ -1:QhJHOM42j@F..B
H-B28` `F6(GT zHHTV r   