
    Ngj                       d dl mZ d dlmZmZmZmZ d dlmZ d dl	m
Z
mZmZ d dlmZ 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mZ d dlmZmZ d dlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8 d dl9m:Z: d dl;Z;d dl<Z<d dl=m>Z> d dl?Z?d dl@Z@d dlAZA e?jB        eC          ZDddZE	 ddZF G d deG          ZHdS )    )sstruct)Tagtostr
binary2numsafeEval)FeatureLibError)LookupDebugInfoLOOKUP_DEBUG_INFO_KEYLOOKUP_DEBUG_ENV_VAR)Parser)FeatureFile)VariableScalar)builder)
maxCtxFont)newTablegetTableModule)otBaseotTables)AlternateSubstBuilderChainContextPosBuilderChainContextSubstBuilderLigatureSubstBuilderMultipleSubstBuilderCursivePosBuilderMarkBasePosBuilderMarkLigPosBuilderMarkMarkPosBuilderReverseChainSingleSubstBuilderSingleSubstBuilderClassPairPosSubtableBuilderPairPosBuilderSinglePosBuilderChainContextualRule)OpenTypeLibError)OnlineVarStoreBuilder)buildVarDevTable)addFeatureVariationsRaw)normalizeValuepiecewiseLinearMap)defaultdictN)StringIOFc                 T    t          | |          }|                    ||           dS )a  Add features from a file to a font. Note that this replaces any features
    currently present.

    Args:
        font (feaLib.ttLib.TTFont): The font object.
        featurefile: Either a path or file object (in which case we
            parse it into an AST), or a pre-parsed AST instance.
        tables: If passed, restrict the set of affected tables to those in the
            list.
        debug: Whether to add source debugging information to the font in the
            ``Debg`` table

    tablesdebugN)Builderbuild)fontfeaturefiler.   r/   r   s        T/var/www/html/ai-engine/env/lib/python3.11/site-packages/fontTools/feaLib/builder.pyaddOpenTypeFeaturesr5   2   s/     dK((GMMuM-----    c                 v    t          t          |                    }|r||_        t          | |||           dS )ae  Add features from a string to a font. Note that this replaces any
    features currently present.

    Args:
        font (feaLib.ttLib.TTFont): The font object.
        features: A string containing feature code.
        filename: The directory containing ``filename`` is used as the root of
            relative ``include()`` paths; if ``None`` is provided, the current
            directory is assumed.
        tables: If passed, restrict the set of affected tables to those in the
            list.
        debug: Whether to add source debugging information to the font in the
            ``Debg`` table

    r-   N)r+   r   namer5   )r2   featuresfilenamer.   r/   r3   s         r4   addOpenTypeFeaturesFromStringr;   D   sD    & 5??++K $#k&FFFFFFr6   c                   X   e Zd Z ed dD                       Zd ZdZdZd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Z d! Z!d" Z"d# Z#d$ Z$d% Z%d& Z&d' Z'd( Z(d) Z)d* Z*d+ Z+d, Z,d- Z-d. Z.d/ Z/d0 Z0d1 Z1d2 Z2d3 Z3d4 Z4d5 Z5d6 Z6d7 Z7d8 Z8d9 Z9	 d[d:Z:d; Z;d< Z<d= Z=d> Z>d? Z?d@ Z@dA ZAdB ZBdC ZCdD ZDdE ZEdF ZFdG ZGdH ZHdI ZIdJ ZJdK ZKdL ZLdM ZMdN ZNdO ZOdP ZPdQ ZQdR ZRdS ZSdT ZTdU ZUdV ZVdW ZWdX eXjY        D             ZZdY Z[dS )\r0   c              #   4   K   | ]}t          |          V  d S N)r   ).0tags     r4   	<genexpr>zBuilder.<genexpr>^   s<           	C           r6   )
BASEGDEFGPOSGSUBOS/2headhhear8   vheaSTATc                    || _         t          |t                    r|d c| _        | _        nd |c| _        | _        |                                | _        d | _        d|v r5|d         j        | _        t          d | j        D                       | _        t                      | _        d | _        d| _        d | _        t                      | _        d| _        i | _        d | _        d | _        d | _        g | _        i i d| _        i | _        i | _        i | _        g | _        d | _        i | _        t                      | _        i | _        t                      | _        i | _         i | _!        tE          tF                    | _$        d | _%        d | _&        g | _'        d | _(        d | _)        i | _*        i | _+        i | _,        i | _-        i | _.        i | _/        i | _0        i | _1        i | _2        i | _3        i | _4        i | _5        i | _6        d S )Nfvarc                     g | ]	}|j         
S  )axisTag)r?   axs     r4   
<listcomp>z$Builder.__init__.<locals>.<listcomp>{   s    000000r6   r   F)rE   rD   )7r2   
isinstancer   	parseTreefilegetReverseGlyphMapglyphMapvarstorebuilderaxesr%   setdefault_language_systems_script_lookupflag_lookupflag_markFilterSet_language_systemsseen_non_DFLT_script_named_lookups_cur_lookup_cur_lookup_name_cur_feature_name_lookups_lookup_locations	features_required_features_feature_variations_aalt_features_aalt_location_aalt_alternates_featureNames_featureNames_ids_cv_parameters_cv_parameters_ids_cv_num_named_params_r*   listcv_characters_size_parameters_fontRevision_names_base_horiz_axis_base_vert_axis_attachPoints_ligCaretCoords_ligCaretPoints_glyphClassDefs_markAttach_markAttachClassID_markFilterSets_os2_hhea_vhea_stat_conditionsets_model_cache)selfr2   r3   s      r4   __init__zBuilder.__init__n   s   	 k;// 	:(3T%DNDII(,k%DNDI//11#T>>V)DI#800di000$ $D  *-&)-& #%*"  $!%)+R 8 8"$#%  " " UU!#!ee"$$&!)$// $! $#!!!"$!	


  r6   NFc                      j         1t           j         j                                                   _          j                                         | j        }nPt          |          }| j        z
  }|r5d                    t          |                    }t          d| d          d|v r                                  d|v r                                  d|v r                                  d|v r                                  d|v r                                  d	|v r                                  d
|v r                                  dD ]}||vr                     |          } j        r                     ||           |j        j        dk    s |j        j        dk    s|j        j        dk    r!t7          |          x} j        |<   ||_        | j        v r j        |= t=           fddD                       r-d	 j        v r$t?           j                   j        d	         _         d|v r2 !                                }|r| j        d<   nd j        v r j        d= d|v r2 "                                }	|	r|	 j        d<   nd j        v r j        d= |s$tF          j$        %                    tL                    r '                                 d S d S )Nz, z9The following tables were requested but are unsupported: .rE   rG   rH   rI   r8   rF   rJ   rD   rE   r   c              3   *   K   | ]}|j         v V  d S r>   )r2   )r?   r@   r   s     r4   rA   z Builder.build.<locals>.<genexpr>   s*      <<Csdi<<<<<<r6   rC   rB   )(rS   r   rT   rV   parser1   supportedTables	frozensetjoinsortedNotImplementedErrorbuild_feature_aalt_
build_head
build_hhea
build_vhea
build_name
build_OS_2
build_STAT	makeTablerh   makeFeatureVariations
ScriptListScriptCountFeatureListFeatureCount
LookupListLookupCountr   r2   tableanyr   usMaxContext	buildGDEF	buildBASEosenvirongetr   	buildDebg)
r   r.   r/   unsupportedunsupported_stringr@   r   	fontTablegdefbases
   `         r4   r1   zBuilder.build   sI   >!#DIt}==CCEEDNT""">)FFv&&F 4#77K %)YYvk/B/B%C%C")-)- - -   V$$&&&VOOVOOVOOVOOVOOVOO# 	# 	#C&  NN3''E' 7**5#666 ,q00$1A55#/!33-5c]]:	DIcN"'		!!IcN<<<<+;<<<<< 	C49ATAT-7	-B-BDIf*V>>##D &$(	&!!49$$If%V>>##D &$(	&!!49$$If% 	BJNN#788 	NN	 	r6   c                      || j         |          }| j        |_        | j        |_        | j                            |           |S r>   )r2   r\   
lookupflagr]   markFilterSetrd   append)r   locationbuilder_classresults       r4   get_chained_lookup_zBuilder.get_chained_lookup_   sF    ty(33 ,#=V$$$r6   c                     | j         D ]8\  }}|||f}| j                            |g                               |           9d S r>   )r^   rf   
setdefaultr   )r   lookupfeature_namescriptlangkeys         r4   add_lookup_to_feature_zBuilder.add_lookup_to_feature_   sW     1 	> 	>LFD4.CN%%c2..55f====	> 	>r6   c                    | j         rIt          | j                   |k    r1| j         j        | j        k    r| j         j        | j        k    r| j         S | j        r| j         rt          d|           || j        |          | _         | j        | j         _        | j        | j         _        | j	        
                    | j                    | j        r| j         | j        | j        <   | j        r |                     | j         | j                   | j         S )NzOWithin a named lookup block, all rules must be of the same lookup type and flag)ra   typer   r\   r   r]   rb   r   r2   rd   r   r`   rc   r   )r   r   r   s      r4   get_lookup_zBuilder.get_lookup_  s"   	$T%&&-77 +t/??? .$2PPP##  	T%5 	!0  
 )=H==&*&6#)-)G&T-...  	J9=9ID 56! 	R ''(8$:PQQQr6   c           	      R   | j         s	| j        sd S d | j                                        D             }| j         dgz   D ]\  }fd| j                                        D             }|s!dk    rt	          j        |dd           M|D ]\  }}}}|D ]}t          |t                    s|g}|D ]e}|                                                                D ]<\  }	}
|	                    |	g           
                    fd|
D                        =fd |                                D             }d	 |                                D             }|s|sd S d
 | j                                        D             | _        | j        }g | _        |                     | j        d           |r"|                     |t                    }||_        |r"|                     |t"                    }||_        |                                  | j        
                    |           d S )Nc                 4    i | ]\  }}|t          |          S rN   )rq   )r?   gas      r4   
<dictcomp>z/Builder.build_feature_aalt_.<locals>.<dictcomp>$  s$    KKKTQaaKKKr6   )Naaltc                 6    g | ]\  \  }}}}|k    ||||fS rN   rN   )r?   r   r   featurelookupsr8   s        r4   rQ   z/Builder.build_feature_aalt_.<locals>.<listcomp>&  s>       4+VT7Wd?? w0"??r6   r   z
: Feature z has not been definedc              3   $   K   | ]
}|v|V  d S r>   rN   )r?   r   alts_for_glyphs     r4   rA   z.Builder.build_feature_aalt_.<locals>.<genexpr>6  s6       2 2&'1N3J3J3J3J3J3J2 2r6   c                 L    i | ]!\  }}t          |          d k    ||d         "S )   r   lenr?   glyphrepls      r4   r   z/Builder.build_feature_aalt_.<locals>.<dictcomp>9  s5     
 
 
*udCIIQRNNE47NNNr6   c                 @    i | ]\  }}t          |          d k    ||S )r   r   r   s      r4   r   z/Builder.build_feature_aalt_.<locals>.<dictcomp><  s*    TTTc$iiRSmmmmmr6   c                 4    i | ]\  \  }}}}|d k    |||f|S )r   rN   )r?   r   r   r   r   s        r4   r   z/Builder.build_feature_aalt_.<locals>.<dictcomp>?  sA     
 
 
0'w&   T7#W   r6   )ri   rk   itemsrf   warningswarnrR   rq   getAlternateGlyphsr   extendrd   start_featurerj   r   r   mappingr   
alternatesend_feature)r   r   r   r   r   r   r   
lookuplistr   r   altssinglemultiold_lookupssingle_lookupmulti_lookupr   r8   s                   @@r4   r   zBuilder.build_feature_aalt_  s   " 	4+@ 	F
 LKT-B-H-H-J-JKKK
"1^4DD 	 	NHd   8<8L8L8N8N  G  tv~~xxxQUQUQUVWWW29 	 	.gw")  J%j$77 2&0\
",  +1+D+D+F+F+L+L+N+N  KE4-7-B-B5"-M-MN*11 2 2 2 2+/2 2 2    	
 
.8.>.>.@.@
 
 
 UT
0@0@0B0BTTT 	e 	F
 
48N4H4H4J4J
 
 

 m4.777 	+ ,,X7IJJM$*M! 	,++H6KLLL&+L#[)))))r6   c                     | j         sd S | j                            d          }|sIt          d          x}| j        d<   |                    d| j                   d|_        dx|_        |_        | j         |_        d S )NrG   s6                                                         g      ?l   e )	rt   r2   r   r   	decompiletableVersioncreatedmodifiedfontRevisionr   r   s     r4   r   zBuilder.build_headP  s    ! 	F	f%% 	8(0(8(88EDIf%OOJ	222!$E-77EMEN!/r6   c                    | j         sd S | j                            d          }|s;t          d          x}| j        d<   |                    d| j                   d|_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d| j         v r| j         d         |_	        d S d S )NrH   $                                          caretoffsetascender	descenderlinegap)
r   r2   r   r   r   r   caretOffsetascentdescentlineGapr   s     r4   r   zBuilder.build_hhea[  s    z 	F	f%% 	,(0(8(88EDIf%OOJ	222!+EDJ&& $
= 9E##:j1EL$*$$ J{3EM
"" Jy1EMMM #"r6   c                 l   | j         sd S | j                            d          }|s;t          d          x}| j        d<   |                    d| j                   d|_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d S d S )NrI   r   i  verttypoascenderverttypodescenderverttypolinegap)	r   r2   r   r   r   r   r   r   r   r   s     r4   r   zBuilder.build_vheal  s    z 	F	f%% 	,(0(8(88EDIf%OOJ	222!+E++:&89EL$*,, J':;EM
** J'89EMMM +*r6   c                 ^    d |j         D             }t          dd          D ]
}||vr|c S d S )Nc                     g | ]	}|j         
S rN   )nameID)r?   r8   s     r4   rQ   z,Builder.get_user_name_id.<locals>.<listcomp>}  s    77744;777r6      i  )namesrange)r   r   nameIDsuser_name_ids       r4   get_user_name_idzBuilder.get_user_name_id{  sV    775;777!#u-- 	$ 	$L7**#### +	$ 	$r6   c                 T   d }|dk    rYt          j                    }| j        \  |_        |_        |_        |_        || j        v r| j        |         |_        nOd|_        nF|| j	        v rA| j        sn4|| j        v sJ t          j
                    }d|_        | j        |         |_        n|| j        v rt          j                    }d|_        | j                            |dfd          |_        | j                            |dfd          |_        | j                            |dfd          |_        | j                            |d          |_        | j                            |dfd          |_        t1          | j        |                   |_        | j        |         |_        |S )Nsizer   FeatUILabelNameIDFeatUITooltipTextNameIDSampleTextNameIDParamUILabelNameID_0)r   FeatureParamsSizers   
DesignSizeSubfamilyID
RangeStartRangeEndrm   SubfamilyNameIDrl   FeatureParamsStylisticSetVersionUINameIDrn   FeatureParamsCharacterVariantsFormatro   r   r  r  r  rp   NumNamedParametersFirstParamUILabelNameIDr   rr   	CharCount	Character)r   r@   paramss      r4   buildFeatureParamszBuilder.buildFeatureParams  s   &==/11F %!"!d,,,)-)?)D&&)*&&D&&&) >d44444!;==!""&"8"=D'''<>>FFM'+'>'B'B)*A( (F$ .2-D-H-H/0!. .F* '+&=&A&A()1' 'F# )-(A(E(Ec1(M(MF%-1-D-H-H,-q. .F*  #4#6s#;<<F#237Fr6   c                    | j         sd S | j                            d          }|s t          d          x}| j        d<   g |_        | j         D ]}|\  }}}}}t          |t                    s|}|| j        v rC|| j        vr,| 	                    |          | j        |<   | j        |         J | j        |         }nQ|d         | j
        v rB|| j        vr,| 	                    |          | j        |<   | j        |         J | j        |         }|                    |||||           |j                                         d S )Nr8   r   )ru   r2   r   r   r   rR   intrl   rm   r  rn   ro   setNamesort)	r   r   r8   r   
platformID	platEncIDlangIDstringr@   s	            r4   r   zBuilder.build_name  su   { 	F	f%% 	(0(8(88EDIf%EKK 	I 	ID<@9FJ	66 fc** :$,,,$"8886:6K6KE6R6R.s3#5c:FFF!3C8FFVt222$"9997;7L7LU7S7S/4#6s;GGG!4S9FMM&&*iHHHHr6   c                 h   | j         sd S | j                            d          }|s]t          d          x}| j        d<   dt	          j        t          d          j                  z  }|                    || j                   d}d| j         v r| j         d         |_	        d| j         v rrt          d          
                                }| j         d         \
  |_        |_        |_        |_        |_        |_        |_        |_        |_        |_        ||_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d	| j         v r| j         d	         |_        d
| j         v r| j         d
         |_        d| j         v r%t7          d| j         d         z   dz             |_        d| j         v r| j         d         |_        d| j         v r| j         d         |_        d| j         v r |                    | j         d                    d| j         v r1|                      | j         d                   }|\  |_!        |_"        d}d| j         v r| j         d         |_#        d}d| j         v r| j         d         |_$        d}d| j         v r| j         d         |_%        d}d| j         v r| j         d         |_&        d}d }tO          ||j(                  |_(        |dk    r ||d           |dk    r ||d           |dk    r ||d           d S d S )NrF       r   fstypepanosetypoascendertypodescendertypolinegap	winascent
windescentvendorz'''weightclass
widthclassunicoderangecodepageranger   xheight   	capheightloweropsize   upperopsizec                 R    |D ]#}t          | |          st          | |d           $d S Nr   )hasattrsetattr)r   attrsattrs      r4   	checkattrz%Builder.build_OS_2.<locals>.checkattr  s@     , ,ud++ ,E4+++, ,r6   )ulCodePageRange1ulCodePageRange2)sxHeight
sCapHeightusDefaultCharusBreakCharr   )usLowerOpticalPointSizeusUpperOpticalPointSize))r   r2   r   r   r   calcsizer   OS2_format_0r   fsTypePanosebFamilyTypebSerifStylebWeightbProportion	bContrastbStrokeVariation	bArmStylebLetterFormbMidlinebXHeightr&  sTypoAscendersTypoDescendersTypoLineGapusWinAscentusWinDescentr   	achVendIDusWeightClassusWidthClasssetUnicodeRangesbuild_codepages_r>  r?  r@  rA  rD  rE  maxversion)r   r   datar_  r&  pagesr=  s          r4   r   zBuilder.build_OS_2  sz   y 	F	f%% 	-(0(8(88EDIf%7+N6,B,B,OPPPDOOD$),,,ty  9X.ELty  #F++2244F 	(#""" ' "!ELTY&&"&)N";Edi''#'9_#=E DI%%!%=!9E$)## $	+ 6E49$$!%<!8Ety  &uty/B'BU'JKKEODI%%"&)M":E49$$!%<!8ETY&&""49^#<===di''))$)O*DEEE=B:E"E$:G	!!!Yy1ENG$)###y5EGDI%%,0Im,DE)GDI%%,0Im,DE)G	, 	, 	,
 GU]33a<<IeEFFFa<<I	 	 	 a<<IeSTTTTT <r6   c                     dD ]}|| j         v rt          | d|          t          |t                    r|| j         d<   d S t          |t                    r|| j         d<   d S t          |          )N)ElidedFallbackNameElidedFallbackNameIDz is already set.rd  rc  )r   r   rR   r  rq   AssertionError)r   valuer   tokens       r4   setElidedFallbackNamezBuilder.setElidedFallbackName  s     D 	 	E
""%...   #
 eS!! 	(16DJ-...t$$ 	(/4DJ+,,, '''r6   c                 H   d| j         vr
g | j         d<   |j        d | j         d         D             v rt          d|j         d|          |j        d | j         d         D             v rt          d|j         d|          | j         d                             |           d S )N
DesignAxesc              3   $   K   | ]}|j         V  d S r>   )r@   r?   rs     r4   rA   z(Builder.addDesignAxis.<locals>.<genexpr>.  s$      FFaeFFFFFFr6   z$DesignAxis already defined for tag "z".c              3   $   K   | ]}|j         V  d S r>   )	axisOrderrl  s     r4   rA   z(Builder.addDesignAxis.<locals>.<genexpr>3  s$      #R#RAAK#R#R#R#R#R#Rr6   z+DesignAxis already defined for axis number r   )r   r@   r   ro  r   )r   
designAxisr   s      r4   addDesignAxiszBuilder.addDesignAxis+  s    tz))')DJ|$>FFTZ-EFFFFF!Iz~III   #R#RL9Q#R#R#RRR!Uj>RUUU   	
< ''
33333r6   c                 \   d| j         vr
g | j         d<   | j         d         D ]j}d |j        D             d |j        D             k    rDd |j        D             d |j        D             k    r |j        |j        k    rt	          d|          k| j         d                             |           d S )NAxisValueRecordsc                 6    h | ]}|                                 S rN   asFear?   ns     r4   	<setcomp>z-Builder.addAxisValueRecord.<locals>.<setcomp>@  s     222q222r6   c                 6    h | ]}|                                 S rN   ru  rw  s     r4   ry  z-Builder.addAxisValueRecord.<locals>.<setcomp>A  s     ===!AGGII===r6   c                 6    h | ]}|                                 S rN   ru  rw  s     r4   ry  z-Builder.addAxisValueRecord.<locals>.<setcomp>B  s     :::1QWWYY:::r6   c                 6    h | ]}|                                 S rN   ru  rw  s     r4   ry  z-Builder.addAxisValueRecord.<locals>.<setcomp>C  s     AAA!AGGIIAAAr6   z8An AxisValueRecord with these values is already defined.)r   r   	locationsflagsr   r   )r   axisValueRecordr   record_s       r4   addAxisValueRecordzBuilder.addAxisValueRecord:  s    TZ//-/DJ)*z"45 	 	G22GM222=='<===> >::(9:::AA'@AAAB BM_%:::%N   	
%&--o>>>>>r6   c                     | j         sd S | j                             d          }|st          dd           | j                             d          }i g }|D ]}g |j        <   |X|D ]T}i }|j        dk    r
|j        |d<   t          |j                  dk    r|j        d         }|j        }t          |          dk    r#|                    |d         |j	        d           t          |          dk    r*|                    |d         |d         |j	        d	           t          |          d
k    r%|\  }	}
}|                    |	|
||j	        d           |j                 
                    |           |                    d |j        D             |j	        d           |
                    |           Vfd|D             }| j                            d          }|s t          d          x}| j        d<   g |_	        d| j         v r9| j         d         }|                    |          }|st          d| dd           nd| j         v r| j         d         }t          j        | j        |||           d S )Nrj  zDesignAxes not definedrs  r   r~  r   )rf  r8   r2  )rf  linkedValuer8      )nominalValuerangeMinValuerangeMaxValuer8   c                 4    i | ]}|j         |j        d          S )r   )r@   values)r?   is     r4   r   z&Builder.build_STAT.<locals>.<dictcomp>x  s"    (S(S(S(S(S(Sr6   )r   r8   c                 R    g | ]#}|j         |j        |j        |j                 d $S ))orderingr@   r8   r  )ro  r@   r   )r?   r   
axisValuess     r4   rQ   z&Builder.build_STAT.<locals>.<listcomp>~  sK     
 
 
  Ku$QU+	 
 
 
r6   r8   rd  zElidedFallbackNameID z; points to a nameID that does not exist in the "name" tablerc  )r}  elidedFallbackName)r   r   r   r@   r~  r   r}  r  updater   r   r2   r   getDebugNameotlbuildStatTable)r   rX   axisValueRecordsformat4_locationsr@   avr
valuesDictr   r  nominalminValmaxVal
designAxes	nameTabler   r8   r  s                   @r4   r   zBuilder.build_STATL  s-   z 	Fz~~l++ 	B!":DAAA:>>*<==
 	% 	%C"$Jsw'' #9 #9
9q==*-)Jw's}%%**"}Q/H%_F6{{a''"))F1Isy*Q*QRRR6{{a''")))//5ay(+	    6{{a''28/"))071717(+		    x|,33J????%%(S(SS](S(S(S$'I    &,,Z8888
 
 
 
 
 
 

 IMM&))	 	!,4V,<,<<I	&) IO!TZ//Z 67F))&11D %#F # # # 	   "TZ//Z 45FI'%		
 	
 	
 	
 	
 	
r6   c                    i ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1fd2|D             }g }t          d          D ]X}|                    d3           t          |d4z  |dz   d4z            D ]'}||v r||xx         d5z  cc<   ||xx         d6z  cc<   (Yd7 |D             S )8Ni  r   i  r   i  r2  i  r  i     i  r5  i     i     i     ij     i     i     i     i     iQ     ie  0   ib  1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   )ia  i`  i_  i^  i]  i\  iY  iW  iT  i  i  i  iR  i  c                 (    g | ]}|v |         S rN   rN   )r?   p
pages2bitss     r4   rQ   z,Builder.build_codepages_.<locals>.<listcomp>  s"    @@@!Z
1r6        10c                 >    g | ]}t          |d d d                   S )N)r   )r?   r  s     r4   rQ   z,Builder.build_codepages_.<locals>.<listcomp>  s*    333
1TTrT7##333r6   )r   r   )r   ra  bitsr  jr  s        @r4   r]  zBuilder.build_codepages_  s    
! 
! 
 ! 
 !	 

 ! 
 ! 
 ! 
 ! 
 ! 
  
  
  
  
  
 " 
  ! 
" # 
$ ? 
  
  

B A@@@u@@@q 	$ 	$ALL1r6AER<00 $ $99!HHHOHHHH!HHHOHHHH	$
 43U3333r6   c                    | j         s	| j        sd S t          j                    }d|_        |                     | j                   |_        |                     | j                  |_        t          d          }||_	        |S )Nr   rB   )
rv   rw   r   rB   r  buildBASEAxis	HorizAxisVertAxisr   r   )r   r   r   s      r4   r   zBuilder.buildBASE  sw    $ 	T-A 	4}!++D,ABB**4+?@@&!!r6   c                    |sd S |\  }}t          j                    }t          j                    |_        ||j        _        t	          |          |j        _        t          j                    |_        g |j        _        t	          |          |j        _        t          |          D ]2}t          j                    }|d         |_
        t          j                    |_        d|j        _        t          j                    |j        _        |                    |d                   |j        j        _        g |j        j        _        t	          |d                   |j        j        _        |d         D ]G}t          j                    }d|_        ||_        |j        j        j                            |           H|j        j                            |           4|S )Nr   r   r2  )r   AxisBaseTagListBaselineTagr   BaseTagCountBaseScriptListBaseScriptRecordBaseScriptCountr   BaseScriptTag
BaseScriptBaseLangSysCount
BaseValuesindexDefaultIndex	BaseCoordBaseCoordCountr  
Coordinater   )r   axisbasesscriptsr   recordccoords           r4   r  zBuilder.buildBASEAxis  s    	Fw}#/11',$(+E

%&577/1,.1'll+Woo 	@ 	@F.00F#)!9F  ( 3 5 5F12F.+3+>+@+@F(8=F1I8N8NF(557F(2:=fQi..F(7AY E E *,, #$ !,6==eDDDD077????r6   c                 h   t          j                    }|                                 |_        t	          j        | j        | j                  |_        t	          j	        | j
        | j        | j                  |_        |                                 |_        |                                 |_        |j        rdnd|_        | j        r| j                                        }|red|_        ||_        |                                }|                    |           d| j        v r%| j        d         j                            |           | j                                         t7          |j        |j        |j        |j        |j        f          st9          |d          rt;          d          }||_        |S d S )Ni  r   i  rD   VarStorerC   )r   rC   buildGDEFGlyphClassDef_GlyphClassDefr  buildAttachListrx   rV   
AttachListbuildLigCaretListry   rz   LigCaretListbuildGDEFMarkAttachClassDef_MarkAttachClassDefbuildGDEFMarkGlyphSetsDef_MarkGlyphSetsDefr  rW   finishr  optimizeremap_device_varidxesr2   r   r   clearr   r9  r   )r   r   store
varidx_mapr   s        r4   r   zBuilder.buildGDEF  s   }!99;;-d.@$-PP1 $"6
 
 #'"C"C"E"E $ ? ? A A%)%:Jzz
 
	%(//11E N) %"^^--
**:666TY&&If%+AA*MMM""$$$"!'%
 
 	 T:&&	 f%%FFLM4r6   c                    | j         r$d | j                                         D             }nzi }| j        D ])}|                    |                                           *| j        j                                        D ](}|j        D ]}|	                                D ]}d||<   )|rt          j                    }||_        |S d S )Nc                      i | ]\  }\  }}||S rN   rN   r?   r   r  _s       r4   r   z3Builder.buildGDEFGlyphClassDef_.<locals>.<dictcomp>  s"    LLLFQq!LLLr6   r  )r{   r   rd   r  inferGlyphClassesrS   markClassesr  definitionsglyphSetr   r  	classDefs)r   classesr   	markClassmarkClassDefr   r   s          r4   r  zBuilder.buildGDEFGlyphClassDef_  s     		+LLt/C/I/I/K/KLLLGGG- ; ;v7799::::!^7>>@@ + +	$-$9 + +L!-!6!6!8!8 + +)*++  	+--F&FM4r6   c                     d | j                                         D             }|sd S t          j                    }||_        |S )Nc                      i | ]\  }\  }}||S rN   rN   r  s       r4   r   z8Builder.buildGDEFMarkAttachClassDef_.<locals>.<dictcomp>-  s"    DDDia!QQDDDr6   )r|   r   r   r  r  )r   r  r   s      r4   r  z$Builder.buildGDEFMarkAttachClassDef_,  sL    DD4+;+A+A+C+CDDD	 	4,..$r6   c                     g }t          | j                                        d           D ]\  }}|                    |           t	          j        || j                  S )Nc                     | d         S )Nr   rN   )items    r4   <lambda>z4Builder.buildGDEFMarkGlyphSetsDef_.<locals>.<lambda>7  s
    47 r6   r   )r   r~   r   r   r  buildMarkGlyphSetsDefrV   )r   setsglyphsid_s       r4   r  z"Builder.buildGDEFMarkGlyphSetsDef_4  sm    ! &&((.B.B
 
 
 	  	 KFC KK(t}===r6   c                     d| j         vr)t          d          | j         d<   i | j         d         _        | j        | j         d         j        t          <   d S )NDebg)r2   r   r`  re   r
   r   s    r4   r   zBuilder.buildDebg<  sP    "" ( 0 0DIf%'DIf"8<8M	&4555r6   c                    |dv s
J |            | j         D ]	}d |_        
g }| j         D ]}|j        |k    rt          |          |_        t	          t          |j                  |                     |          d           | j        |         t          |j                  <   |	                    |           g }|D ]}	 |	                    |
                                           +# t          $ r(}t          t          |          |j                  |d }~wt          $ rM}| j        |         t          |j                           j        }t          t          |          |          |d }~ww xY w|S )Nr   )r   r8   r   )rd   lookup_indexr   r   r	   strr   get_lookup_name_re   r   r1   r$   r   	Exception)r   r@   r   r   	otLookupsler   s           r4   buildLookups_zBuilder.buildLookups_B  s   &&&&&&&m 	' 	'F"&Fm 		# 		#F|s"""%g,,FCRV_--**622D D DD!#&s6+>'?'?@
 NN6""""	 	? 	?A?  ++++# A A A%c!ffaj99q@ ? ? ?05c!.6I6IJS%c!ffh77Q>? s%   ?'C''
E.1#DE.!AE))E.c                 b
    t          t          |d                       }d|_        t          j                    |_        g |j        _        t          j                    |_        g |j        _        t          j                    |_        |                     |          |j        _	        i }i }i }d }t          | j                                        |          D ]/\  }}|\  }	}
}t          t                              d |D                                 }|dk    o|dk    }|                     ||          }t#          |          dk    r|s|sw|D ]v}	 | j        |         t'          |                                       |          | j        |         t'          |          <   S# t*          $ r t-          j        d	           Y sw xY w||f}|                    |          }|t#          |j        j                  }t          j                    }||_        t          j                    |_        |                     |          |j        _        t;          |          |j        _        t#          |          |j        _        |j        j                             |           |||<   |!                    |	i           !                    |
g                                |           | j"                            |	|
f          |k    r|||	|
f<   1t          |                                          D ]\  }	}t          j                    }|	|_#        t          j$                    |_$        d |j$        _%        g |j$        _&        t          |                                          D ]\  }
}t          j&                    }t          j'                    |_'        d |j'        _(        |                    |	|
f          d
|j'        _)        n|j'        _)        fd|D             |j'        _*        t#          |j'        j*                  |j'        _+        |
dk    r|j'        |j$        _%        |
|_,        |j$        j&                             |           t#          |j$        j&                  |j$        _-        |j        j                             |           t#          |j        j                  |j        _.        t#          |j        j                  |j        _+        t#          |j        j	                  |j        _        |S )Nr   c                 b    | d         d         | d         d         | d         d         | d         fS )Nr   r2  r   rN   )fs    r4   r   z#Builder.makeTable.<locals>.<lambda>m  s+    AaDGQqT!Wad1gqt#D r6   r  c              3   2   K   | ]}|j         	|j         V  d S r>   )r
  )r?   r  s     r4   rA   z$Builder.makeTable.<locals>.<genexpr>w  s4        '(q~7QAN7Q7Q7Q7Q r6   rD   r  r   )r   zWfeaLib.Builder subclass needs upgrading to stash debug information. See fonttools#2065.i  c                      g | ]
}|k    |S rN   rN   )r?   r  req_feature_indexs     r4   rQ   z%Builder.makeTable.<locals>.<listcomp>  s+     0 0 0!7H2H2HA2H2H2Hr6   dflt)/getattrr   r  r   ScriptRecordr   FeatureRecordr   r  Lookupr   rf   r   tupledictfromkeysany_feature_variationsr   re   r  _replaceKeyErrorr   r   r   
FeatureTagFeaturer  FeatureParamsrq   LookupListIndexr   r   r   rg   	ScriptTagScriptDefaultLangSysLangSysRecordLangSysLookupOrderReqFeatureIndexFeatureIndexr   
LangSysTagLangSysCountr   )r   r@   r   feature_indicesrequired_feature_indicesr  sortFeatureTagr   r   r   r   feature_taglookup_indicessize_featureforce_featureixfeature_keyfeature_indexfreclang_featuressreclangrecr  s                         @r4   r   zBuilder.makeTable\  s	   ,#t,,.."#.00(*%$022*,'#.00"&"4"4S"9"9 #%  ED"4>#7#7#9#9~NNN ,	I ,	ILC(+%FD+ #  ,3     N &=B[F-BL 77SIIM>""a''']'$ 	 	:>:OPS:TB;hsh++ )#.s2ww77     MG     '7K+//<<M$ #E$5$C D D-//"-'/11-1-D-D[-Q-Q*/3N/C/C,+.~+>+>(!/66t<<</<,vr**55dB??FF}UUU&**FD>::kII;H(&$8 &,GMMOO%<%< 	7 	7!FM(**D#DN"/++DK)-DK&(*DK%)/0C0C0E0E)F)F > >%o"022"*"2"4"4.2+$<$@$@&$$P$P!$,6<GO336GGO30 0 0 0.0 0 0, 037?3O/P/P,6>>18DK..)-G&K-44W===='*4;+D'E'EDK$)006666'*5+;+H'I'I$),U->-L)M)M&'*5+;+B'C'C$s   AF##GGc                    i }d}| j                                         D ]\  \  }}}}g ||<   |                                D ]g\  }}	| j        |         }
g }|	D ]3}|j        |k    r|j        J |                    |j                   d}4||                             |
|f           h|r1|                                D ]\  }}t          | j        |||           d S d S )NFT)rh   r   r   r   r
  r   r'   r2   )r   r   	table_tagfeature_varshas_any_variationsr  r4  
variationsconditionsetbuildersraw_conditionsetindicesbconditions_and_lookupss                 r4   r   zBuilder.makeFeatureVariations  sL   "/3/G/M/M/O/O 	N 	N+Q;(*L%*4*:*:*<*< 	N 	N&h#'#6|#D ! . .Aw)++ >555NN1>222)-&&[)002BG1LMMMM	N  	7C7I7I7K7K  33'Iu&<k   	 	 r6   c                     | j                                         D ]I\  \  }}}}||k    r|                                D ]$\  }}t          fd|D                       r  dS %JdS )Nc              3   .   K   | ]}|j         k    V  d S r>   )r   )r?   rH  r@  s     r4   rA   z1Builder.any_feature_variations.<locals>.<genexpr>  s*      >>qw)+>>>>>>r6   TF)rh   r   r   )r   r4  r@  r  r   rC  rD  rE  s     `     r4   r   zBuilder.any_feature_variations  s    +/+C+I+I+K+K 	  	 'OQ7Z+%%*4*:*:*<*<    &h>>>>X>>>>>  444   ur6   c                 d    d | j                                         D             }||v r||         S d S )Nc                     i | ]\  }}||	S rN   rN   )r?   kvs      r4   r   z,Builder.get_lookup_name_.<locals>.<dictcomp>  s    <<<1q!<<<r6   )r`   r   )r   r   revs      r4   r  zBuilder.get_lookup_name_  s<    << 3 9 9 ; ;<<<S==v;tr6   c                 Z   |dk    r|dk    r| j         rt          d|          |dk    r| j        rt          d|          nd| _        ||f| j         v r;t          d|                                d|                                d|          | j                             ||f           d S )	NDFLTr  z_If "languagesystem DFLT dflt" is present, it must be the first of the languagesystem statementszRlanguagesystems using the "DFLT" script tag must precede all other languagesystemsTz"languagesystem  z" has already been specified)rZ   r   r_   stripadd)r   r   r   languages       r4   add_language_systemzBuilder.add_language_system  s    VF 2 2t7U 2!=  
 V) %8   *.D&H!???!/<<>>>>8>>#3#3#3#35  
 	&**FH+=>>>>>r6   c                 X    | j         rt          | j                   S t          dh          S )N)rR  r  )rZ   r   r  s    r4   get_default_language_systems_z%Builder.get_default_language_systems_  s2     ) 	1T;<<<./000r6   c                     |                                  | _        d| _        d | _        || _        d| _        d | _        |dk    r	|| _        d S d S )NrR  r   r   )rY  r^   r[   ra   rc   r\   r]   rj   r   r   r8   s      r4   r   zBuilder.start_feature
  s[     $ B B D D!%)-&6>>"*D >r6   c                 ^    | j         J d | _         d | _        d | _        d| _        d | _        d S r8  )rc   r^   ra   r\   r]   r  s    r4   r   zBuilder.end_feature  s?    %111!% $)-&&&r6   c                     || j         v rt          d|z  |          | j        dk    rt          d|          || _        d | j         |<   d | _        | j        d| _        d | _        d S d S )Nz$Lookup "%s" has already been definedr   zpLookup blocks cannot be placed inside 'aalt' features; move it out, and then refer to it with a lookup statementr   )r`   r   rc   rb   ra   r\   r]   r[  s      r4   start_lookup_blockzBuilder.start_lookup_block  s    4&&&!6=x   !V++!L  
 !%$(D!!) D-1D*** *)r6   c                 b    | j         J d | _         d | _        | j        d| _        d | _        d S d S r8  )rb   ra   rc   r\   r]   r  s    r4   end_lookup_blockzBuilder.end_lookup_block.  sH    $000 $!) D-1D*** *)r6   c                     || j         v s
J |            d | _        | j         |         }||                     || j                   d S d S r>   )r`   ra   r   rc   )r   lookup_namer   s      r4   add_lookup_callzBuilder.add_lookup_call6  s`    d1111;111$[1''0FGGGGG r6   c                     || _         d S r>   )rt   )r   r   revisions      r4   set_font_revisionzBuilder.set_font_revision=  s    %r6   c           	         t          |          dk    sJ | j        dv rt          d| j        z  |          | j        t          d|          d | _        | j        || j        f}| j                            |d         d|d         f          }|dk    s|r|r|d d          | j        |<   n
g | j        |<   t          | j        |fg          | _        |r| j        |f}|| j	        v r`t          d|
                                d	| j        
                                d
| j	        |         
                                d|          | j        | j	        |<   d S d S )Nr  r   r  z7Language statements are not allowed within "feature %s"zCLanguage statements are not allowed within standalone lookup blocksr   r  r2  z	Language z	 (script z ) has already specified feature z as its required feature)r   rc   r   ra   r[   rf   r   r   r^   rg   rT  )r   r   rV  include_defaultrequiredr   r   s          r4   set_languagezBuilder.set_language@  s   8}}!!!!!%555!&(,(>?  
 !)!2  
  |Xt'=>.$$c!ffc!f%=>>/w")!!!*DN3"$DN3 )DL(+C*D E E 	B<*Cd---%o !((((**,,,,/4::<<<< 	 	 	 ,0+AD#C(((	B 	Br6   c                 "   t          |          }| j                            |          }||S t          | j                  dz   }|| j        |<   |D ]=}|| j        v r&| j        |         \  }}t          d|d||          ||f| j        |<   >|S )Nr   Glyph z3 already has been assigned a MarkAttachmentType at )r   r}   r   r   r|   r   )r   r   r  r  r   r  locs          r4   getMarkAttachClass_zBuilder.getMarkAttachClass_g  s    6""%))&11?J$)**Q.*-' 	6 	6E((()%03%o49EE33@  
 (+HoDU##
r6   c                     t          |          }| j                            |          }||S t          | j                  }|| j        |<   |S r>   )r   r~   r   r   )r   r   r  r  s       r4   getMarkFilterSet_zBuilder.getMarkFilterSet_y  sQ    6"""&&v..?J$&'''*V$
r6   c                     |dz  }|r|                      ||          }||dz  z  }|r#|                     ||          }|dz  }|| _        nd | _        || _        d S )N   r  r  )ro  rq  r]   r\   )r   r   rf  
markAttach
markFiltermarkAttachClassr   s          r4   set_lookup_flagzBuilder.set_lookup_flag  s~     	3"66xLLO_12E 	2 228ZHHMDLE-:D**-1D* r6   c                     | j         dv rt          d| j         z  |          | j         t          d|          | j        |dfhk    rd S d | _        || _        d| _        d | _        |                     |ddd           d S )	Nrh  z5Script statements are not allowed within "feature %s"zAScript statements are not allowed within standalone lookup blocksr  r   TF)ri  rj  )rc   r   r^   ra   r[   r\   r]   rk  )r   r   r   s      r4   
set_scriptzBuilder.set_script  s    !%555!&(,(>?  
 !)!V    ff%5$666F)-&(FD5QQQQQr6   c                      g }|D ];}|"|                      fd|D                        &|                     d           <|S )zHelper for building chain contextual substitutions

        Given a list of lookup names, finds the LookupBuilder for each name.
        If an input name is None, it gets mapped to a None LookupBuilder.
        Nc                 N    g | ]!}j                             |j                  "S rN   )r`   r   r8   )r?   r  r   s     r4   rQ   z1Builder.find_lookup_builders_.<locals>.<listcomp>  s,    IIIT(,,QV44IIIr6   )r   )r   r   lookup_buildersr   s   `   r4   find_lookup_builders_zBuilder.find_lookup_builders_  sr     ! 	- 	-J%&&IIIIjIII     &&t,,,,r6   c                     |D ]<}| j                             |t                                                    |           =d S r>   )rx   r   rY   r  )r   r   r  contourPointsr   s        r4   add_attach_pointszBuilder.add_attach_points  sM     	N 	NE))%77>>}MMMM	N 	Nr6   c                 t    | j         dk    rt          d|          | j                            ||f           d S )Nr   z9Feature references are only allowed inside "feature aalt")rc   r   ri   r   )r   r   featureNames      r4   add_feature_referencezBuilder.add_feature_reference  sK    !V++!KX   	""Hk#:;;;;;r6   c                 :    | j                             |           d S r>   )rl   rU  r   r@   s     r4   add_featureNamezBuilder.add_featureName  s    s#####r6   c                 :    | j                             |           d S r>   )rn   rU  r  s     r4   add_cv_parameterzBuilder.add_cv_parameter  s    $$$$$r6   c                 Z    || j         v r| j         |xx         dz  cc<   dS d| j         |<   dS )zbAdds new items to ``self.cv_num_named_params_``
        or increments the count of existing items.r   N)rp   r  s     r4   add_to_cv_num_named_paramsz"Builder.add_to_cv_num_named_params  sJ     $+++%c***a/*****-.D%c***r6   c                 F    | j         |                             |           d S r>   )rr   r   )r   	characterr@   s      r4   add_cv_characterzBuilder.add_cv_character  s$    C ''	22222r6   c                 2    |r||f| _         d S ||f| _        d S r>   )rw   rv   )r   r  r  verticals       r4   set_base_axiszBuilder.set_base_axis  s0     	5$)7#3D   %*G$4D!!!r6   c                     | j         dk    rt          d| j         z  |          ||||g| _        | j        D ]*\  }}||| j         f}| j                            |g            +d S )Nr  z9Parameters statements are not allowed within "feature %s")rc   r   rs   r^   rf   r   )	r   r   r  r  r  r  r   r   r   s	            r4   set_size_parameterszBuilder.set_size_parameters  s     !V++!&(,(>?  
 ",[*h O 1 	/ 	/LFD4!78CN%%c2....	/ 	/r6   c                 .   | j         dk    rP|                                D ]9\  }}| j                            |g           }||vr|                    |           :d S |s|s|r|                     ||||           d S |                     |t                    }	|                                D ]i\  }}||	j        v rQ||	j        |         k    rt          
                    d|||           n"t          d|d|	j        |         d|          ||	j        |<   jd S )Nr   zDRemoving duplicate single substitution from glyph "%s" to "%s" at %sz*Already defined rule for replacing glyph "z" by "")rc   r   rk   r   r   add_single_subst_chained_r   r   r   loginfor   )
r   r   prefixsuffixr   
forceChain
from_glyphto_glyphr   r   s
             r4   add_single_substzBuilder.add_single_subst  sf   !V++(/ * *$
H,77
BGG4''KK)))F 	V 	z 	**8VVWMMMF!!(,>??$+MMOO 	2 	2 JV^++v~j999HH."      */%::v~j'A'A'AC   
 *2FN:&&!	2 	2r6   c                 6   |s|s|r|                      |||||           d S |                     |t                    }||j        v rI||j        |         k    r%t                              d|||rd| nd           nt          d|z  |          ||j        |<   d S )Nz@Removing duplicate multiple substitution from glyph "%s" to %s%sz at r  z+Already defined substitution for glyph "%s")add_multi_subst_chained_r   r   r   r  r  r   )r   r   r  r   r  replacementsr  r   s           r4   add_multiple_substzBuilder.add_multiple_subst  s      	V 	z 	))(FE6<XXXF!!(,@AAFN""v~e444$ )19%8%%%r    &AEI8   !-ur6   c                    | j         dk    r>| j                            |g                               fd|D                        d S |s|rd|                     |t
                    }|                     |t                    }|j        	                    t          ||hg||g                     n|                     |t                    }||j        v rt          d|z  |          ||j        |<   d S )Nr   c              3   $   K   | ]
}|v|V  d S r>   rN   )r?   r   r   s     r4   rA   z.Builder.add_alternate_subst.<locals>.<genexpr>  s'      @@a!4------@@r6   z)Already defined alternates for glyph "%s")rc   rk   r   r   r   r   r   r   rulesr   r#   r   r   )	r   r   r  r   r  replacementchainr   r   s	           @r4   add_alternate_substzBuilder.add_alternate_subst  s   !V++(33E2>>DKK@@@@;@@@@@@F 	GV 	G$$X/GHHE--h8MNNFK26UG9fvhWWXXXX%%h0EFFFF%%%!;eCX   $/%   r6   c                    |s|s|rb|                      |t                    }|                     |t                    }|j                            t          ||||g                     n|                      |t                    }t          |          st          d|          t          j
        | D ]}	||j        |	<   d S Nz!Empty glyph class in substitution)r   r   r   r   r  r   r#   allr   	itertoolsproduct	ligatures)
r   r   r  r  r  r  r  r  r   r   s
             r4   add_ligature_substzBuilder.add_ligature_subst/  s      	FV 	Fz 	F$$X/GHHE--h8LMMFK2666F8TTUUUU%%h0DEEF6{{ 	Q!"ExPPP "F+ 	. 	.A"-FQ	. 	.r6   c           
      0   t          |          rt          |          rt          |          st          d|          |                     |t                    }|j                            t          ||||                     |                               d S Nz,Empty glyph class in contextual substitution)r  r   r   r   r  r   r#   r}  r   r   r  r  r  r   r   s          r4   add_chain_context_substzBuilder.add_chain_context_substE  s    6{{ 	#f++ 	S[[ 	!>   !!(,DEE(B(B7(K(K 	
 	
 	
 	
 	
r6   c           	         |rt          |          rt          |          st          d|          |                     |t                    }|                    |t
                    }||                     |t
                    }|j                            |           |j	        
                    t          |t          |                                          g||g                     d S r  )r  r   r   r   find_chainable_substr   r   r   r  r  r   r#   rq   keys)r   r   r  r  r   r  subs          r4   r  z!Builder.add_single_subst_chained_Q  s     	c&kk 	V 	!>  
   +CDD((2DEE;**85GHHC7###gllnn)=)=(>NN	
 	
 	
 	
 	
r6   c                 z   t          |          rt          |          st          d|          |                     |t                    }|                    ||it
                    }||                     |t
                    }||j        |<   |j        	                    t          ||hg||g                     d S r  )r  r   r   r   r  r   r   r   r  r   r#   )r   r   r  r   r  r  r  r  s           r4   r  z Builder.add_multi_subst_chained_a  s    6{{ 	#f++ 	!>     +CDD((%)>@TUU;**85IJJC)E.vy&3%PPQQQQQr6   c                     |st          d|          |                     |t                    }|j                            |||f           d S r  )r   r   r   r  r   )r   r   
old_prefix
old_suffixr   r   s         r4   add_reverse_chain_single_substz&Builder.add_reverse_chain_single_substo  sU     	Q!"ExPPP!!(,JKKZW=>>>>>r6   c                    |s|s|r|                      ||||           d S |                     |t                    }|D ]\  }}|st          d|          |                     ||d          }	|D ]O}
	 |                    ||
|	           # t          $ r(}t          t          |          |j                  |d }~ww xY wd S )N%Empty glyph class in positioning ruleFpairPosContext)	add_single_pos_chained_r   r"   r   makeOpenTypeValueRecordadd_posr$   r  r   )r   r   r  r  posr  r   r  rf  otValueRecordr   r  s               r4   add_single_poszBuilder.add_single_posx  s)    	IV 	Iz 	I((663GGGGG%%h0@AAF!$ I I )?   !% < <eE != ! ! $ I IEIxFFFF+ I I I-c!ffajAAqHIII Is   2B


B<#B77B<c                     |r|st          d|          |                     |t                    }|                     ||d          }|                     ||d          }|                    |||||           d S Nr  Tr  )r   r   r!   r  addClassPair)	r   r   glyphclass1value1glyphclass2value2r   v1v2s	            r4   add_class_pair_poszBuilder.add_class_pair_pos  s     	U+ 	U!"I8TTT!!(N;;))(F4)PP))(F4)PPHk2{BGGGGGr6   c                     |r|st          d|          |                     |t                    }|                     ||d          }|                     ||d          }|                    |||||           d S r  )r   r   r!   r  addGlyphPair)	r   r   glyph1r  glyph2r  r   r  r  s	            r4   add_specific_pair_poszBuilder.add_specific_pair_pos  s     	UV 	U!"I8TTT!!(N;;))(F4)PP))(F4)PPHfb&"=====r6   c           	          |st          d|          |                     |t                    }|                    |||                     ||          |                     ||                     d S Nr  )r   r   r   add_attachmentmakeOpenTypeAnchor)r   r   
glyphclassentryAnchor
exitAnchorr   s         r4   add_cursive_poszBuilder.add_cursive_pos  s     	U!"I8TTT!!(,=>>##Hk::##Hj99		
 	
 	
 	
 	
r6   c                    |                      |t                    }|                     |||           |st          d|          |D ]C\  }}|                     ||          }|D ]%}||j                            |i           |j        <   &Dd S r  )r   r   
add_marks_r   r  r  r   r8   )	r   r   r  marksr   
baseAnchorr  otBaseAnchorr   s	            r4   add_mark_base_poszBuilder.add_mark_base_pos  s    ""8-?@@'5111 	U!"I8TTT%* 	R 	R!J	228ZHHL R REQ((r229>BBR	R 	Rr6   c                 4   |                      |t                    }g }|st          d|          |D ]V}i }|                     |||           |D ]#\  }}	|                     ||          ||	j        <   $|                    |           W|D ]}
||j        |
<   d S r  )r   r   r   r  r  r8   r   r  )r   r   r  
componentsr   componentAnchorsr  anchors	ligAnchorr  r   s              r4   add_mark_lig_poszBuilder.add_mark_lig_pos  s    ""8->?? 	U!"I8TTT 	- 	-EGOOHgu555(- W W$	9*.*A*A(I*V*V	''##G,,,, 	8 	8E'7Ge$$	8 	8r6   c                    |                      |t                    }|                     |||           |st          d|          |D ]C\  }}|                     ||          }|D ]%}||j                            |i           |j        <   &Dd S r  )r   r   r  r   r  	baseMarksr   r8   )	r   r   r  r  r   r  r  r  baseMarks	            r4   add_mark_mark_poszBuilder.add_mark_mark_pos  s    ""8-?@@'5111 	U!"I8TTT%* 	! 	!!J	228ZHHL% ! ! ! !,,Xr::N !	! 	!r6   c           
      0   t          |          rt          |          rt          |          st          d|          |                     |t                    }|j                            t          ||||                     |                               d S )N0Empty glyph class in contextual positioning rule)r  r   r   r   r  r   r#   r}  r  s          r4   add_chain_context_poszBuilder.add_chain_context_pos  s    6{{ 	#f++ 	S[[ 	!BH   !!(,BCC(B(B7(K(K 	
 	
 	
 	
 	
r6   c                    |rt          |          rt          |          st          d|          |                     |t                    }g }|j        D ]\  }}}}|                    |           g }	|D ]\  }
}||	                    d            |                     ||d          }|                    ||
|          }|0| 	                    |t                    }|                    |           |
D ]}|                    |||           |	                    |           t          |          t          |	          k    sJ ||	f            |j                            t          |d |D             ||	                     d S )Nr  Fr  c                     g | ]\  }}|S rN   rN   )r?   r   rO  s      r4   rQ   z3Builder.add_single_pos_chained_.<locals>.<listcomp>  s    (;(;(;tq!(;(;(;r6   )r  r   r   r   r  r   r   r  find_chainable_single_posr   r"   r  r   r#   )r   r   r  r  r  r  targetsr  r   subsr  rf  otValuer  r   s                  r4   r  zBuilder.add_single_pos_chained_  s    	#f++ 	S[[ 	!BH     +ABB % 	$ 	$Aq!WNN7####  	 	MFE}D!!!22% 3  G 11'67KKC{..x9IJJs### 6 6HeW5555KK3xx3t99$$$sDk$$$(;(;s(;(;(;VTJJ	
 	
 	
 	
 	
r6   c                 j   |D ]\  }}|j         D ]}|j                                        D ]}||j        vr?|                     |t          j        |j                            }|j        |f|j        |<   J|j        |         d         }	|j        |	k    rt          d|d|	d|j        |          dS )z)Helper for add_mark_{base,liga,mark}_pos.r   rm  z cannot be in both @z and @N)
r  r  r  r  r  copydeepcopyanchorr8   r   )
r   r   lookupBuilderr  r  r  r  markotMarkAnchorexistingMarkClasss
             r4   r  zBuilder.add_marks_  s    ! 	 	LAy ) 5  (/88::  D=#666'+'>'>$dmL4G&H&H( ( 6?^\4R+D11,9,?,Ea,H)$>->>>"1/#'44):):):INN!L (# #  ?	 	r6   c                 :    | j                             |           d S r>   )ra   add_subtable_break)r   r   s     r4   r  zBuilder.add_subtable_break  s    ++H55555r6   c                     | j                             |d          \  }}|r||k    rt          d|d||          ||f| j         |<   d S )NNNrm  z& was assigned to a different class at )r{   r   r   )r   r   r   
glyphClassoldClassoldLocations         r4   setGlyphClass_zBuilder.setGlyphClass_  sr     $ 4 8 8 M M+ 	J..!/55++'  
 (28&<U###r6   c                     |D ]}|                      ||d           |D ]}|                      ||d           |D ]}|                      ||d           |D ]}|                      ||d           d S )Nr   r2  r  r  )r  )r   r   
baseGlyphsligatureGlyphs
markGlyphscomponentGlyphsr   s          r4   add_glyphClassDefzBuilder.add_glyphClassDef  s       	4 	4E%3333# 	4 	4E%3333 	4 	4E%3333$ 	4 	4E%3333	4 	4r6   c                 6    |D ]}|| j         vr
|| j         |<   d S r>   )rz   r   r   r  caretsr   s        r4   add_ligatureCaretByIndex_z!Builder.add_ligatureCaretByIndex_&  s7     	5 	5ED000.4$U+	5 	5r6   c                 r    t          |t                    s|S |                     ||          \  }}|||fS |S r>   )rR   r   makeVariablePos)r   r   caretdefaultdevices        r4   makeLigCaretzBuilder.makeLigCaret+  sH    %00 	L..x??V$$r6   c                 X      fd|D             }|D ]}| j         vr
| j         |<   d S )Nc                 <    g | ]}                     |          S rN   )r  )r?   r  r   r   s     r4   rQ   z3Builder.add_ligatureCaretByPos_.<locals>.<listcomp>4  s)    III$##He44IIIr6   )ry   r  s   ``   r4   add_ligatureCaretByPos_zBuilder.add_ligatureCaretByPos_3  sU    IIIII&III 	5 	5ED000.4$U+	5 	5r6   c                 D    | j                             |||||g           d S r>   )ru   r   )r   r   r   r  r   r!  r"  s          r4   add_name_recordzBuilder.add_name_record9  s)    FJ	66JKKKKKr6   c                     || j         |<   d S r>   )r   r   r   rf  s      r4   add_os2_fieldzBuilder.add_os2_field<  s    	#r6   c                     || j         |<   d S r>   )r   r  s      r4   add_hhea_fieldzBuilder.add_hhea_field?      
3r6   c                     || j         |<   d S r>   )r   r  s      r4   add_vhea_fieldzBuilder.add_vhea_fieldB  r   r6   c                 (   d| j         vrt          d|          d | j        D             fd|                                D             }d| j         v r2| j         d         j        fd|                                D             }|| j        |<   d S )NrL   z?Cannot add feature variations to a font without an 'fvar' tablec                 B    i | ]}|j         |j        |j        |j        fS rN   )rO   minValuedefaultValuemaxValue)r?   r  s     r4   r   z,Builder.add_conditionset.<locals>.<dictcomp>M  s:     
 
 
 L4=$*;T]K
 
 
r6   c           	      v    i | ]5\  }\  }}|t          ||                   t          ||                   f6S rN   )r(   )r?   r@   bottomtopaxisMaps       r4   r   z,Builder.add_conditionset.<locals>.<dictcomp>R  sZ     
 
 

 #]fc	 vws|44sGCL11
 
 
r6   avarc                 R    i | ]"\  }t          fd |D                       #S )c              3   P   K   | ] }v rt          |                   n|V  !d S r>   )r)   )r?   rO  r  r   s     r4   rA   z6Builder.add_conditionset.<locals>.<dictcomp>.<genexpr>`  sU         =AGOO&q'$-888QR     r6   )r  )r?   condition_ranger  r   s     @r4   r   z,Builder.add_conditionset.<locals>.<dictcomp>_  sg       
 *D/	 e     ,      r6   )r2   r   rX   r   segmentsr   )r   r   r   rf  r+  r   s       @@r4   add_conditionsetzBuilder.add_conditionsetE  s    ""!Q  
 
	
 
 


 
 
 

 ',kkmm
 
 
 TYi'0G   
 .3[[]]  E $)C   r6   c                    | j         st          d|          | j        |_        |j        s	|j        d fS |                    | j         | j        | j                            d                    \  }}d }||dk    rt          |          }||fS )Nz5Can't define a variable scalar in a non-variable fontr,  l    )
rW   r   rX   	does_varyr  add_to_variation_storer   r2   r   r&   )r   r   	varscalarr  r  r  s         r4   r  zBuilder.makeVariablePosi  s    # 	!G   	" 	+$d**"99 $"2DIMM&4I4I
 
 *!4!4%e,,Fr6   c                 >   |dS d}d\  }}|j         &t          j        t          |j                             }|j        &t          j        t          |j                            }dD ]}t          ||          }t          |t                    s(t          ||dz             t          d|          | 	                    ||          \  }}	t          |||           |	|dk    r|	}n|	}d}t          j        |j        |j        |j        ||          }
|rd	|
_        |
S )
zast.Anchor --> otTables.AnchorNFr  )xyDeviceTable4Can't define a device coordinate and variable scalarr7  Tr  )xDeviceTabler  buildDevicer  yDeviceTabler  rR   r   r   r  r:  buildAnchorr7  r8  contourpointr  )r   r   r  variabledeviceXdeviceYdimr5  r  r  	otlanchors              r4   r  zBuilder.makeOpenTypeAnchor}  sI   >4%*od6+>&?&?@@G*od6+>&?&?@@G 	  	 C,,Ii88 vs]233?%JH   #228YGGOGVFC)))!#::$GG$GOHfh 3Wg
 
	  	! Ir6   c                     i | ]D\  }}}}|                     d           |d                                         |dd         z   ||fES )Reservedr   r   N)
startswithlower)r?   r  r8   isDevices       r4   r   zBuilder.<dictcomp>  sb        AtXqz**Q$qrr("T8$4  r6   c                 :   |sdS i }| j                                         D ]\  }\  }}t          ||d          }|s|r%t          j        t          |                    ||<   Ct          |t                    rv|dd         dz   }	|	d                                         |	dd         z   }
t          ||
          rt          d|          | 
                    ||          \  ||<   }||||	<   |||<   |r|s|j        rddinddi}t          j        |          }|S )	z&ast.ValueRecord --> otBase.ValueRecordNr   r  Devicer   r:  YAdvanceXAdvance)_VALUEREC_ATTRSr   r  r  r<  r  rR   r   rH  r   r  r  
buildValue)r   r   rO  r  vrastNameotNamerI  valotDeviceNamefeaDeviceNamer  valRecs                r4   r  zBuilder.makeOpenTypeValueRecord  se    	4+/+?+E+E+G+G 	! 	!'G'fh!Wd++C  ! _T#YY776

C00 !%ac{X5 ,Q 5 5 7 7,qrr:J J1m,, )NPX   &*%9%9(C%H%H"6
F%'-B|$ 6

 	D" 	D$%JC*aZOB##r6   NF)F)\__name__
__module____qualname__r   r   r   r1   r   r   r   r   r   r   r   r  r  r   r   rh  rq  r  r   r]  r   r  r   r  r  r  r   r  r   r   r   r  rW  rY  r   r   r^  r`  rc  rf  rk  ro  rq  rw  ry  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"  r1  r  r  r   valueRecordFormatrN  r  rN   r6   r4   r0   r0   ]   s       i    
       O H H HT< < < <|  > > >
     61* 1* 1*f	0 	0 	02 2 2": : :$ $ $) ) )V  4RU RU RUh( ( ( 4 4 4? ? ?$S
 S
 S
j+4 +4 +4Z
 
 
  8" " "H  $  > > >N N N  4b b bH  .    ? ? ?2	1 	1 	1+ + +. . .2 2 2$2 2 2H H H& & &%B %B %BN  $  ! ! !R R R*   N N N< < <$ $ $% % %/ / /3 3 35 5 5/ / /"2 2 2> IN- - - -./ / /&. . .,

 

 


 
 
 R R R? ? ?I I I(H H H> > >	
 	
 	
R R R8 8 8
! 
! 
!

 

 


 
 
<  &6 6 6= = =
4 
4 
45 5 5
  5 5 5L L L            ") ") ")H  (     D $*$<  O    r6   r0   rW  )NNF)IfontTools.miscr   fontTools.misc.textToolsr   r   r   r   fontTools.feaLib.errorr    fontTools.feaLib.lookupDebugInfor	   r
   r   fontTools.feaLib.parserr   fontTools.feaLib.astr   fontTools.feaLib.variableScalarr   fontTools.otlLibr   r  fontTools.otlLib.maxContextCalcr   fontTools.ttLibr   r   fontTools.ttLib.tablesr   r   fontTools.otlLib.builderr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   fontTools.otlLib.errorr$   fontTools.varLib.varStorer%   fontTools.varLib.builderr&   fontTools.varLib.featureVarsr'   fontTools.varLib.modelsr(   r)   collectionsr*   r  r  ior+   loggingr   r   	getLoggerrX  r  r5   r;   objectr0   rN   r6   r4   <module>rr     s   " " " " " " E E E E E E E E E E E E 2 2 2 2 2 2         
 + * * * * * , , , , , , : : : : : : + + + + + + 6 6 6 6 6 6 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3                                 " 4 3 3 3 3 3 ; ; ; ; ; ; 5 5 5 5 5 5 @ @ @ @ @ @ F F F F F F F F # # # # # #              				 g!!. . . .& 7<G G G G2d d d d df d d d d dr6   