
    eiX                       d Z ddlmZ g dZddlmZ ddlmZ ddlm	Z	 erddlm
Z
mZ d	 Zd
 ZddZddZd Z	 d	 	 	 	 	 	 	 ddZ	 ddd	 	 	 	 	 	 	 	 	 ddZddZ G d de      Zd ZddZedk(  r`ddlZddlZ eej8                        dkD  r ej:                   e               ej:                   ej<                         j>                         yy)z%Variation fonts interpolation models.    )annotations)normalizeValuenormalizeLocationsupportScalarpiecewiseLinearMapVariationModel)TYPE_CHECKING)noRound   )VariationModelError)MappingSequencec                2    | D cg c]  }||	 c}S c c}w N )lstls     Y/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/fontTools/varLib/models.pynonNoner      s    ,!amA,,,s   c                &    t        d | D              S )Nc              3  $   K   | ]  }|d u  
 y wr   r   .0r   s     r   	<genexpr>zallNone.<locals>.<genexpr>   s     &QqDy&   all)r   s    r   allNoner      s    &#&&&    Nc                n     t         fd|D              S         t        fd|D              S )Nc              3  (   K   | ]	  }|k(    y wr   r   )r   itemrefs     r   r   zallEqualTo.<locals>.<genexpr>    s     /43$;/s   c              3  4   K   | ]  } |      k(    y wr   r   )r   r"   mappedmappers     r   r   zallEqualTo.<locals>.<genexpr>#   s     6$v%6   r   )r#   r   r&   r%   s   ` `@r   
allEqualTor(      s3    ~/3///C[F6#666r   c                p    | syt        |       }	 t        |      }t        |||      S # t        $ r Y yw xY w)NT)r&   )iternextStopIterationr(   )r   r&   itfirsts       r   allEqualr/   &   sD    	cBR eR//  s   ) 	55c                    t        |       t        |      k(  sJ t        ||       D cg c]
  \  }}|s	| c}}S c c}}w r   lenzip)truthr   r   ts       r   subListr6   1   s8    u:S!!!c5//$!QQA///s   
<<Fc           
     @   |\  }}}||cxk  r|k  sn t        d|dd|dd|d      |st        t        | |      |      } | |k(  s||k(  ry| |k  r||k7  s
| |kD  r||k(  r| |z
  ||z
  z  S | |kD  r||k7  s| |k  r||k(  sJ d|  d| d| d| d	       | |z
  ||z
  z  S )zNormalizes value based on a min/default/max triple.

    >>> normalizeValue(400, (100, 400, 900))
    0.0
    >>> normalizeValue(100, (100, 400, 900))
    -1.0
    >>> normalizeValue(650, (100, 400, 900))
    0.5
    z8Invalid axis values, must be minimum, default, maximum: z3.3fz,         zOoops... v=z
, triple=())
ValueErrormaxmin)vtripleextrapolatelowerdefaultuppers         r   r   r   6   s     #E7EW%%FTl"WTN"U4L:
 	
 Auu%G|u~	G(a'kew>NG%00G 0KEW,	C:eWBwir%B	C 
 G00r   )validatec               `   |rkt        | j                               t        |j                               k  s8J t        | j                               t        |j                               z
         i }|j                         D ]+  \  }}| j                  ||d         }t	        |||      ||<   - |S )a  Normalizes location based on axis min/default/max values from axes.

    >>> axes = {"wght": (100, 400, 900)}
    >>> normalizeLocation({"wght": 400}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": 100}, axes)
    {'wght': -1.0}
    >>> normalizeLocation({"wght": 900}, axes)
    {'wght': 1.0}
    >>> normalizeLocation({"wght": 650}, axes)
    {'wght': 0.5}
    >>> normalizeLocation({"wght": 1000}, axes)
    {'wght': 1.0}
    >>> normalizeLocation({"wght": 0}, axes)
    {'wght': -1.0}
    >>> axes = {"wght": (0, 0, 1000)}
    >>> normalizeLocation({"wght": 0}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": -1}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": 1000}, axes)
    {'wght': 1.0}
    >>> normalizeLocation({"wght": 500}, axes)
    {'wght': 0.5}
    >>> normalizeLocation({"wght": 1001}, axes)
    {'wght': 1.0}
    >>> axes = {"wght": (0, 1000, 1000)}
    >>> normalizeLocation({"wght": 0}, axes)
    {'wght': -1.0}
    >>> normalizeLocation({"wght": -1}, axes)
    {'wght': -1.0}
    >>> normalizeLocation({"wght": 500}, axes)
    {'wght': -0.5}
    >>> normalizeLocation({"wght": 1000}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": 1001}, axes)
    {'wght': 0.0}
    r   )r?   )setkeysitemsgetr   )locationaxesr?   rC   outtagr>   r=   s           r   r   r   W   s    Z 8==?#s499;'77 	
X]]_9MPSIIKQ
 :
 	
7 Czz| FVLLfQi(!!VECF Jr   c                6   |r|t        d      d}|j                         D ]  \  }\  }}}	|r/|dk(  r||kD  s||	kD  r|dk  r|	dkD  r(| j                  |d      }
n|| v sJ | |   }
|
|k(  rL|rv||   \  }}|
|k  r2||k  r-||k  r||	k  r||
|	z
  ||	z
  z  z  }y||k  rF||
|z
  ||z
  z  z  }||
k  r2||	k  r-||k  r||k  r||
|z
  ||z
  z  z  }||k  r||
|	z
  ||	z
  z  z  }|
|k  s|	|
k  rd} |S |
|k  r||
|z
  ||z
  z  z  }||
|	z
  ||	z
  z  z  } |S )a  Returns the scalar multiplier at location, for a master
    with support.  If ot is True, then a peak value of zero
    for support of an axis means "axis does not participate".  That
    is how OpenType Variation Font technology works.

    If extrapolate is True, axisRanges must be a dict that maps axis
    names to (axisMin, axisMax) tuples.

      >>> supportScalar({}, {})
      1.0
      >>> supportScalar({'wght':.2}, {})
      1.0
      >>> supportScalar({'wght':.2}, {'wght':(0,2,3)})
      0.1
      >>> supportScalar({'wght':2.5}, {'wght':(0,2,4)})
      0.75
      >>> supportScalar({'wght':2.5, 'wdth':0}, {'wght':(0,2,4), 'wdth':(-1,0,+1)})
      0.75
      >>> supportScalar({'wght':2.5, 'wdth':.5}, {'wght':(0,2,4), 'wdth':(-1,0,+1)}, ot=False)
      0.375
      >>> supportScalar({'wght':2.5, 'wdth':0}, {'wght':(0,2,4), 'wdth':(-1,0,+1)})
      0.75
      >>> supportScalar({'wght':2.5, 'wdth':.5}, {'wght':(0,2,4), 'wdth':(-1,0,+1)})
      0.75
      >>> supportScalar({'wght':3}, {'wght':(0,1,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      -1.0
      >>> supportScalar({'wght':-1}, {'wght':(0,1,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      -1.0
      >>> supportScalar({'wght':3}, {'wght':(0,2,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      1.5
      >>> supportScalar({'wght':-1}, {'wght':(0,2,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      -0.5
    z2axisRanges must be passed when extrapolate is Trueg      ?r8   )	TypeErrorrG   rH   )rI   supportotr?   
axisRangesscalaraxisr@   peakrB   r=   axisMinaxisMaxs                r   r   r      s   D z)LMMF&-mmo (3""udEs{t|te|s{us{T3'A8###A9)$/GW7{u/7?te|q5yTE\::Ft^q5yTE\::F1E!1d?ut|q5yTE\::FG^q5yTE\::F:!F M	 t8q5yTE\22Fq5yTE\22FQ(3R Mr   c                      e Zd ZdZ	 ddddZd Zed        Zeg fd       Zd Z	d	 Z
d
 Zd ZeddZeddZd Zd Zed        Zed        Zd ZeddZeddZy)r   a5  Locations must have the base master at the origin (ie. 0).

    If axis-ranges are not provided, values are assumed to be normalized to
    the range [-1, 1].

    If the extrapolate argument is set to True, then values are extrapolated
    outside the axis range.

      >>> from pprint import pprint
      >>> axisRanges = {'wght': (-180, +180), 'wdth': (-1, +1)}
      >>> locations = [       {'wght':100},       {'wght':-100},       {'wght':-180},       {'wdth':+.3},       {'wght':+120,'wdth':.3},       {'wght':+120,'wdth':.2},       {},       {'wght':+180,'wdth':.3},       {'wght':+180},       ]
      >>> model = VariationModel(locations, axisOrder=['wght'], axisRanges=axisRanges)
      >>> pprint(model.locations)
      [{},
       {'wght': -100},
       {'wght': -180},
       {'wght': 100},
       {'wght': 180},
       {'wdth': 0.3},
       {'wdth': 0.3, 'wght': 180},
       {'wdth': 0.3, 'wght': 120},
       {'wdth': 0.2, 'wght': 120}]
      >>> pprint(model.deltaWeights)
      [{},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0, 4: 1.0, 5: 1.0},
       {0: 1.0, 3: 0.75, 4: 0.25, 5: 1.0, 6: 0.6666666666666666},
       {0: 1.0,
        3: 0.75,
        4: 0.25,
        5: 0.6666666666666667,
        6: 0.4444444444444445,
        7: 0.6666666666666667}]
    N)rQ   c               >   t        t        d |D                    t        |      k7  rt        d      || _        ||ng | _        || _        |J|r| j                  |      }n6|D ch c]  }|j                         D ]  }|  }}}|D ci c]  }|d }}|| _        |D 	cg c],  }|j                         D 	ci c]  \  }}	|	dk7  s||	 c}	}. }}}}	| j                  || j                        }
t        ||
      | _        |D cg c]  }| j                  j                  |       c}| _        | j                  D cg c]  }|j                  |       c}| _        | j!                          i | _        y c c}}w c c}w c c}	}w c c}	}}w c c}w c c}w )Nc              3  `   K   | ]&  }t        t        |j                                      ( y wr   )tuplesortedrG   r   s     r   r   z*VariationModel.__init__.<locals>.<genexpr>  s      ?5	*+?s   ,.zLocations must be unique.)r   r8   )	axisOrder)key)r2   rE   r   origLocationsr]   r?   computeAxisRangesrF   rQ   rG   getMasterLocationsSortKeyFuncr[   	locationsindexmappingreverseMapping_computeMasterSupports
_subModels)selfrb   r]   r?   rQ   locrS   allAxeskr=   keyFuncr   s               r   __init__zVariationModel.__init__  s{    s?Y??@C	NR%&ABB&&/&;&!33I>
+4LCL4L4LL8?@dGm@
@$KTUUCsyy{?tq!a3had?U	U44 5 
  	w7 :CCA,,Q/C;?>>Jayq1J##% M@ @U DJs6   'E=
F%F=FFF"FFFc                    d|vr| |fS t        d |D              }| j                  j                  |      }|9t        t	        || j
                        | j                        }|| j                  |<   |t	        ||      fS )zReturn a sub-model and the items that are not None.

        The sub-model is necessary for working with the subset
        of items when some are None.

        The sub-model is cached.Nc              3  $   K   | ]  }|d u 
 y wr   r   r   r=   s     r   r   z-VariationModel.getSubModel.<locals>.<genexpr>9  s     1aATM1r   )rZ   rg   rH   r   r6   r_   r]   )rh   rG   r^   subModels       r   getSubModelzVariationModel.getSubModel0  s}     u;1511??&&s+%gc43E3E&FWH#+DOOC e,,,r   c                   i }| D ch c]  }|j                         D ]  }|  }}}| D ]M  }|D ]F  }|j                  |d      }|j                  |||f      \  }}t        ||      t        ||      f||<   H O |S c c}}w )Nr   )rF   rH   r<   r;   )rb   rQ   ri   rS   rj   valuerU   rV   s           r   r`   z VariationModel.computeAxisRanges@  s    
#,DCD4D4DD 	LC La(#->>$#G #&ug#6E78K#K
4 L	L
  Es   A=c                   i | vrt        d      i }| D ]_  }t        |      dk7  rt        t        |            }||   }||vrdh||<   |||   vsJ d|d|d|       ||   j	                  |       a d } |||      }|S )NzBase master not found.r   r8   zValue "z" in axisPoints["z"] -->  c                      d  fd}|S )Nc                "    | dk  rdS | dkD  rdS dS )Nr   r\   r   r   )r=   s    r   signzJVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.sign]  s    Ur:a!e::r   c           	         t               } j                         D cg c]  \  }}|v r	||   v r| }}}D cg c]	  }| v s| }}|j                  t         j	                               D cg c]	  }|vs| c}       |t        |       t        fd|D              t        |      t         fd|D              t         fd|D              fS c c}}w c c}w c c}w )Nc              3  L   K   | ]  }|v rj                  |      nd   yw)i   N)rc   )r   rS   r]   s     r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>n  s.        261B	-Os   !$c              3  4   K   | ]  } |           y wr   r   )r   rS   ri   rx   s     r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>s  s      ,0SYr'   c              3  :   K   | ]  }t        |           y wr   )abs)r   rS   ri   s     r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>v  s      +/CIs   )r2   rG   extendr[   rF   rZ   )	ri   rankrS   rt   onPointAxesorderedAxesr]   
axisPointsrx   s	   `     r   r^   zIVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key`  s   3x (+yy{#ez)ez$7G.G  
 1:ITS[tII""&,SXXZ&8RdD	<QTR %% $/  +& 4?   3>  
 JRs   C	C"	C"5	C'?C'r   )r   r]   r^   rx   s   `` @r   getKeyz<VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey\  s    ;6 Jr   )r   r2   r+   r*   add)rb   r]   r   ri   rS   rt   r   rets           r   ra   z,VariationModel.getMasterLocationsSortKeyFuncK  s    Y%&>??
 
	(C3x1}S	?DIE:%$'5
4 Z--T;@$
ST-t  '
	(	B Z+
r   c                    |D cg c]  }||   	 }}|D cg c]  }| j                   |    c}| _         | j                   D cg c],  }|j                         D ci c]  \  }}|dk7  s|| c}}. }}}}|D 	cg c]  }	| j                  j                  |	       c}	| _        | j                  D 	cg c]  }	|j                  |	       c}	| _        i | _        |S c c}w c c}w c c}}w c c}}}w c c}	w c c}	w )Nr8   )r_   rG   rb   rc   rd   re   rg   )
rh   master_listrd   idxnew_listri   rk   r=   rb   r   s
             r   reorderMasterszVariationModel.reorderMasters  s     188K$88AHI#d005IBFBTBT
 
;>ciik6daQ#XQT6
	 
 :CCA,,Q/C;?>>Jayq1J 9I6
 DJs4   CC$C/C)+C)0C/>"C66C;)C/c                   g | _         | j                         }t        |      D ]4  \  }}t        |j	                               }|d | D ]  }t        |j	                               |k7  r d}|j                         D ],  \  }\  }}	}
||   d   |	k(  r|||   d   cxk  r|
k  r(n d} n |sdi }d}|j	                         D ][  }||   d   }||v sJ ||   \  }}}
||
}}||k  r|}||z
  ||z
  z  }n||k  r|}||z
  |
|z
  z  }nE||kD  ri }|}||k(  sT|||f||<   ] |j                         D ]
  \  }}|||<     | j                   j                  |       7 | j                          y )NTr   Fr\   )supports_locationsToRegions	enumeraterE   rF   rG   append_computeDeltaWeights)rh   regionsiregionlocAxesprev_regionrelevantrS   r@   rT   rB   bestAxes	bestRatiovallocVnewLowernewUpperratior>   s                      r   rf   z%VariationModel._computeMasterSupports  s   **,"7+ 2	)IAv&++-(G&r{ .*{'')*g528,,. .D.5$#D)!,4 ;t#4Q#7?%?#(   	',,. DD%d+A.C6>)>)/&E4).hHTz#&!$t =#&!$t = !y(#%$)		)*2D()C%D( %-NN$4 *LD&#)F4L*[.*^ MM  (e2	)f 	!!#r   c                    | j                   }| j                  }g }|D ]O  }i }|j                         D ]'  \  }}|dkD  rd|||   d   f||<   ||   d   |df||<   ) |j                  |       Q |S )Nr   r   )rb   rQ   rG   r   )rh   rb   rQ   r   ri   r   rS   r   s           r   r   z"VariationModel._locationsToRegions  s    NN	__
 	#CF!iik B
d!8$%tZ-=a-@#AF4L$.t$4Q$7q#AF4L	B
 NN6"	# r   c                    g | _         t        | j                        D ]V  \  }}i }t        | j                  d |       D ]  \  }}t	        ||      }|s|||<    | j                   j                  |       X y r   )deltaWeightsr   rb   r   r   r   )rh   r   ri   deltaWeightjrO   rR   s          r   r   z#VariationModel._computeDeltaWeights  s|    / 	2FAsK'bq(9: ,
7&sG4%+KN, $$[1	2r   roundc                  t        |      t        | j                        k(  s%J t        |      t        | j                        f       | j                  }g }t        | j                        D ]U  \  }}|||      }|j	                         D ]  \  }}	|	dk(  r	|||   z  }|||   |	z  z  }  |j                   ||             W |S )Nr   )r2   r   re   r   rG   r   )
rh   masterValuesr   rd   rK   r   weightsdeltar   weights
             r   	getDeltaszVariationModel.getDeltas  s    < C(9(9$:: 	
!!"=
 	
: %%#D$5$56 	%JAw ,E$]]_ -	6Q;SVOESVf_,E	-
 JJuU|$	% 
r   c               h    | j                  |      \  }}|j                  ||      |j                  fS )Nr   )rr   r   r   )rh   rG   r   models       r   getDeltasAndSupportsz#VariationModel.getDeltasAndSupports  s2    ''.uuE2ENNBBr   c           	         | j                   D cg c]%  }t        ||| j                  | j                        ' c}S c c}w )zReturn scalars for each delta, for the given location.
        If interpolating many master-values at the same location,
        this function allows speed up by fetching the scalars once
        and using them with interpolateFromMastersAndScalars().)r?   rQ   )r   r   r?   rQ   )rh   ri   rO   s      r   
getScalarszVariationModel.getScalars  sB      ==	
  W$*:*:t
 	
 
s   *<c                H   | j                  |      }t        t        t        | j                                    D ]0  \  }}|j                         D ]  \  }}||xx   ||   |z  z  cc<    2 t        t        |            D cg c]  }|| j                  |       }}|S c c}w )a  Return multipliers for each master, for the given location.
        If interpolating many master-values at the same location,
        this function allows speed up by fetching the scalars once
        and using them with interpolateFromValuesAndScalars().

        Note that the scalars used in interpolateFromMastersAndScalars(),
        are *not* the same as the ones returned here. They are the result
        of getScalars().)	r   reversedlistr   r   rG   ranger2   rd   )rh   targetLocationrK   r   r   r   r   s          r   getMasterScalarszVariationModel.getMasterScalars   s     oon-"4	$2C2C(D#EF 	*JAw$]]_ *	6A#a&6/)*	* .33s8_=s4<<?#==
 >s   Bc                    d}t        |       t        |      k(  sJ t        | |      D ]  \  }}|s	||z  }||}||z  } |S )aV  Interpolate from values and scalars coefficients.

        If the values are master-values, then the scalars should be
        fetched from getMasterScalars().

        If the values are deltas, then the scalars should be fetched
        from getScalars(); in which case this is the same as
        interpolateFromDeltasAndScalars().
        Nr1   )valuesscalarsr=   rt   rR   contributions         r   interpolateFromValuesAndScalarsz.VariationModel.interpolateFromValuesAndScalars  sc     6{c'l*** 1 	"ME6 6>Ly \!	" r   c                .    t         j                  | |      S )z>Interpolate from deltas and scalars fetched from getScalars().)r   r   )deltasr   s     r   interpolateFromDeltasAndScalarsz.VariationModel.interpolateFromDeltasAndScalars(  s     ==fgNNr   c                H    | j                  |      }| j                  ||      S )z)Interpolate from deltas, at location loc.)r   r   )rh   ri   r   r   s       r   interpolateFromDeltasz$VariationModel.interpolateFromDeltas-  s#    //#&33FGDDr   c               H    | j                  |      }| j                  ||      S )z0Interpolate from master-values, at location loc.)r   r   )rh   ri   r   r   r   s        r   interpolateFromMastersz%VariationModel.interpolateFromMasters2  s%    '',33L'JJr   c               L    | j                  ||      }| j                  ||      S )zInterpolate from master-values, and scalars fetched from
        getScalars(), which is useful when you want to interpolate
        multiple master-values with the same location.r   )r   r   )rh   r   r   r   r   s        r    interpolateFromMastersAndScalarsz/VariationModel.interpolateFromMastersAndScalars7  s)     E:33FGDDr   )NF)__name__
__module____qualname____doc__rm   rr   staticmethodr`   ra   r   rf   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s    /d 6;JN<-    ;= 2 2h6$p	2 07 " 4; C

"  , O OE
 BI K
 PW Er   r   c                6    |j                         }|s S  |v r|    S t        |      } |k  r ||   z   |z
  S t        |      } |kD  r ||   z   |z
  S t         fd|D              }t         fd|D              }||   }||   }|||z
   |z
  z  ||z
  z  z   S )Nc              3  .   K   | ]  }|k  s	|  y wr   r   r   rk   r=   s     r   r   z%piecewiseLinearMap.<locals>.<genexpr>L       %!q1uA%   
c              3  .   K   | ]  }|kD  s	|  y wr   r   r   s     r   r   z%piecewiseLinearMap.<locals>.<genexpr>M  r   r   )rF   r<   r;   )r=   rd   rF   rk   abvavbs   `       r   r   r   ?  s    <<>DDyqzD	A1u71:~!!D	A1u71:~!!%t%%A%t%%A	B	BbQU#q1u---r   c                `   ddl m} ddl}|j                  dt        j
                        }|j                  dddd	
       |j                  d      }|j                  dddt               |j                  ddddd       |j                  |       }  || j                         ddlm} | j                  rddlm}  |       }|j                  | j                         |j                   D cg c]  }|j"                   }	}t%        d        ||	       |j'                          t%        d       |j                   D cg c]  }|j"                   }	} ||	       nyt)        t+        d      t+        d      dz         D 
cg c]  }
t-        |
       }}
| j.                  D cg c]-  }t1        t3        |d |j5                  d       D                    / }	}t7        |	      }t%        d!        ||j.                         t%        d"        ||j8                         yc c}w c c}w c c}
w c c}w )#z*Normalize locations on a given designspacer   )configLoggerNzfonttools varLib.models)descriptionz
--loglevelLEVELINFOz Logging level (defaults to INFO))metavarrA   helpT)requiredz-dz--designspaceDESIGNSPACE)r   typez-lz--locationsLOCATION+zFMaster locations as comma-separate coordinates. One must be all zeros.)r   nargsr   )level)pprint)DesignSpaceDocumentzOriginal locations:zNormalized locations:AZr   c              3  2   K   | ]  }t        |        y wr   )floatrp   s     r   r   zmain.<locals>.<genexpr>  s     ;E!H;s   ,zSorted locations:z	Supports:)	fontToolsr   argparseArgumentParsermainr   add_argumentadd_mutually_exclusive_groupstr
parse_argsloglevelr   designspacefontTools.designspaceLibr   readsourcesrI   print	normalizer   ordchrrb   dictr3   splitr   r   )argsr   r   parsergroupr   r   docslocscrJ   r   s                r   r   r   S  s   &$$!LL % F /	   ///>E	t_m#N	U   T"Dt}}%@!#!!"$'KK0q

00#$t%&$'KK0q

00t %c#hC1 =>1A>>GK~~
BCDT;aggcl;<=
 
 4 E	

5??	+
5>># 1
 1 ?
s   .H?H! H&"2H+__main__r   )F)r=   r   r>   zSequence[float]r?   boolreturnr   )
rI   zMapping[str, float]rJ   z(Mapping[str, tuple[float, float, float]]r?   r  rC   r  r  zdict[str, float])TFN) r   
__future__r   __all__typingr	   fontTools.misc.roundToolsr
   errorsr   r   r   r   r   r(   r/   r6   r   r   r   objectr   r   r   r   doctestsysr2   argvexittestmodfailedr   r   r   <module>r     s   + " ! - ' (-'700 <A11%1481
1H 5
 5!5
25 5
 5 5pNb\EV \E~
.(5p z
388}qCHH_W__%%& r   