o
    h                    @   s  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
 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T d dlT d dlmZmZ d dlmZ d dlZd dlZd dlZd dlZd dlm Z m!Z! d dl"m#Z# d dl$m%Z% dZ&de& d Z'e(dZ)dddZ*e%e*e)e)_+ee(ddZ,dd Z-dd Z.eej/dd Z0eej/d d! Z1eej/d"d# Z2eej/d$d% Z3eej4d&d Z0eej4d'd( Z5eej4dd+d#Z2eej4d,d% Z3eej6d-d. Z7eej6d/d0 Z8eej9d1d. Z7eej9d2d0 Z8eej:d3d. Z7eej:d4d0 Z8eej;d5d. Z7eej;d6d0 Z8eej<d7d. Z7eej<d8d0 Z8eej=d9d: Z>eej?d;d< Z@eejAd=d0 Z8eejAd>d? ZBeejCd@d0 Z8eejCdAd? ZBeejDdBd0 Z8eejEdCd< Z@eejDdDd? ZBeejFdEd0 Z8eejFdFd? ZBeejGdGd0 Z8eejGdHd? ZBeejHdId0 Z8eejHdJd? ZBeej6ej9ej:ej;ej<ejAejCejDejFejGejHdKdL ZIeej6ej9ej:ej;ej<ejAejCejDejFejGejHdMdN ZJeej6ej9ej:ej;ej<ejKejLejMejN	dOd? ZBeej6ej:ej<dPdQ ZOeej9ej;ejKejLdRdQ ZOeejKejLejMejNdSdT ZPeejKejLdUd. Z7eejKejMejLejNdVd0 Z8eejKejLejMejNdWdL ZIeejKejLejMejNdXdN ZJeejQdYd. Z7eejQdZdQ ZOeejQejRd[d0 Z8eejQejRd\d? ZBeejQejRd]dL ZIeejQejRd^dN ZJeejSdd_d.Z7eejSd`d0 Z8eejSdad? ZBeejSdbdL ZIeejSdcdN ZJeejSdddQ ZOeejTded0 Z8eejTdfd? ZBeejTdgdL ZIeejTdhdi ZUeejTdjdk ZVeejWdldL ZIeejXdmdL ZIeejXdndN ZJeejXdodp ZYeejZdqdL ZIeej[drdL ZIeej[dsdN ZJeejZdtdp ZYeej[dudp ZYeej\ej]dvdp ZYeej\ej]dwdx Z^eej_ddydpZYeej_dzdx Z^eej`d{dp ZYeej`d|dx Z^eead}d~d0 Z8eeaddd0 Z8eeaddd0 Z8eeaddd. Z7eeadeaddd0 Z8eeadeaddd ZbeeadeadddL ZIeeadeadddi ZUeeadeadd ddZceeadeaddd Zdeeadeaddd Zeeeadeaddd Zfeeadeaddd Zgeeadeaddd Zheeadeaddd? ZBeeaddd0 Z8dd Zieeaddd? ZBeeaddd Zgeeaddd0 Z8eeaddd0 Z8eeaddd0 Z8eeaddd0 Z8eeaddd0 Z8eeaddd. Z7eeaddd0 Z8eeaddd0 Z8eeaddd Zgeeaddd0 Z8dd Zjeeaddd0 Z8eeaddd0 Z8eeaddd0 Z8eeaddd0 Z8eeaddd Zgeeaddd0 Z8eeaddd0 Z8dd Zkeeaddd. Z7eeaddd0 Z8eeadġdd? ZBeejldd. Z7eejmdd. Z7eeadȡdd0 Z8eeadȡdd. Z7eeadȡdd? ZBeead̡dd. Z7eejndd0 Z8eejodd0 Z8eejpdd0 Z8eejqdd0 Z8eejmdd0 Z8eead̡dd0 Z8eerdԡjsddք Zteeadԡdd. Z7eeadԡdd Zgeeadԡdd0 Z8eeadԡdd? ZBeeadۡdd. Z7eeadۡdd Zgeeadۡdd0 Z8eeadߡdd Zgeeaddd Zgeeaddd? ZBeeaddd? ZBG dd deuZvG dd deuZwe,ddddZxe,ddd Zydd Zzdd Z{dd Z|dd Z}e,ddddZ~g dZdS (      )config)otRound)ttLib)otTables)USE_HARFBUZZ_REPACKER)
maxCtxFont)NullPen)Timer)makeOutputFileName)_add_method
_uniq_sort)*)varStoremultiVarStore)NameRecordVisitorN)Counterdefaultdict)reduce)
MethodTypez3pyftsubset font-file [glyph...] [--option=value]...a  pyftsubset -- OpenType font subsetter and optimizer

pyftsubset is an OpenType font subsetter and optimizer, based on fontTools.
It accepts any TT- or CFF-flavored OpenType (.otf or .ttf) or WOFF (.woff)
font file. The subsetted glyph set is based on the specified glyphs
or characters, and specified OpenType layout features.

The tool also performs some size-reducing optimizations, aimed for using
subset fonts as webfonts.  Individual optimizations can be enabled or
disabled, and are enabled by default when they are safe.

Usage: a9  

At least one glyph or one of --gids, --gids-file, --glyphs, --glyphs-file,
--text, --text-file, --unicodes, or --unicodes-file, must be specified.

Args:

font-file
  The input font file.
glyph
  Specify one or more glyph identifiers to include in the subset. Must be
  PS glyph names, or the special string '*' to keep the entire glyph set.

Initial glyph set specification
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

These options populate the initial glyph set. Same option can appear
multiple times, and the results are accummulated.

--gids=<NNN>[,<NNN>...]
  Specify comma/whitespace-separated list of glyph IDs or ranges as decimal
  numbers.  For example, --gids=10-12,14 adds glyphs with numbers 10, 11,
  12, and 14.

--gids-file=<path>
  Like --gids but reads from a file. Anything after a '#' on any line is
  ignored as comments.

--glyphs=<glyphname>[,<glyphname>...]
  Specify comma/whitespace-separated PS glyph names to add to the subset.
  Note that only PS glyph names are accepted, not gidNNN, U+XXXX, etc
  that are accepted on the command line.  The special string '*' will keep
  the entire glyph set.

--glyphs-file=<path>
  Like --glyphs but reads from a file. Anything after a '#' on any line
  is ignored as comments.

--text=<text>
  Specify characters to include in the subset, as UTF-8 string.

--text-file=<path>
  Like --text but reads from a file. Newline character are not added to
  the subset.

--unicodes=<XXXX>[,<XXXX>...]
  Specify comma/whitespace-separated list of Unicode codepoints or
  ranges as hex numbers, optionally prefixed with 'U+', 'u', etc.
  For example, --unicodes=41-5a,61-7a adds ASCII letters, so does
  the more verbose --unicodes=U+0041-005A,U+0061-007A.
  The special strings '*' will choose all Unicode characters mapped
  by the font.

--unicodes-file=<path>
  Like --unicodes, but reads from a file. Anything after a '#' on any
  line in the file is ignored as comments.

--ignore-missing-glyphs
  Do not fail if some requested glyphs or gids are not available in
  the font.

--no-ignore-missing-glyphs
  Stop and fail if some requested glyphs or gids are not available
  in the font. [default]

--ignore-missing-unicodes [default]
  Do not fail if some requested Unicode characters (including those
  indirectly specified using --text or --text-file) are not available
  in the font.

--no-ignore-missing-unicodes
  Stop and fail if some requested Unicode characters are not available
  in the font.
  Note the default discrepancy between ignoring missing glyphs versus
  unicodes.  This is for historical reasons and in the future
  --no-ignore-missing-unicodes might become default.

Other options
^^^^^^^^^^^^^

For the other options listed below, to see the current value of the option,
pass a value of '?' to it, with or without a '='. In some environments,
you might need to escape the question mark, like this: '--glyph-names\?'.

Examples::

    $ pyftsubset --glyph-names?
    Current setting for 'glyph-names' is: False
    $ pyftsubset --name-IDs=?
    Current setting for 'name-IDs' is: [0, 1, 2, 3, 4, 5, 6]
    $ pyftsubset --hinting? --no-hinting --hinting?
    Current setting for 'hinting' is: True
    Current setting for 'hinting' is: False

Output options
^^^^^^^^^^^^^^

--output-file=<path>
  The output font file. If not specified, the subsetted font
  will be saved in as font-file.subset.

--flavor=<type>
  Specify flavor of output font file. May be 'woff' or 'woff2'.
  Note that WOFF2 requires the Brotli Python extension, available
  at https://github.com/google/brotli

--with-zopfli
  Use the Google Zopfli algorithm to compress WOFF. The output is 3-8 %
  smaller than pure zlib, but the compression speed is much slower.
  The Zopfli Python bindings are available at:
  https://pypi.python.org/pypi/zopfli

--harfbuzz-repacker
  By default, we serialize GPOS/GSUB using the HarfBuzz Repacker when
  uharfbuzz can be imported and is successful, otherwise fall back to
  the pure-python serializer. Set the option to force using the HarfBuzz
  Repacker (raises an error if uharfbuzz can't be found or fails).

--no-harfbuzz-repacker
  Always use the pure-python serializer even if uharfbuzz is available.

Glyph set expansion
^^^^^^^^^^^^^^^^^^^

These options control how additional glyphs are added to the subset.

--retain-gids
  Retain glyph indices; just empty glyphs not needed in-place.

--notdef-glyph
  Add the '.notdef' glyph to the subset (ie, keep it). [default]

--no-notdef-glyph
  Drop the '.notdef' glyph unless specified in the glyph set. This
  saves a few bytes, but is not possible for Postscript-flavored
  fonts, as those require '.notdef'. For TrueType-flavored fonts,
  this works fine as long as no unsupported glyphs are requested
  from the font.

--notdef-outline
  Keep the outline of '.notdef' glyph. The '.notdef' glyph outline is
  used when glyphs not supported by the font are to be shown. It is not
  needed otherwise.

--no-notdef-outline
  When including a '.notdef' glyph, remove its outline. This saves
  a few bytes. [default]

--recommended-glyphs
  Add glyphs 0, 1, 2, and 3 to the subset, as recommended for
  TrueType-flavored fonts: '.notdef', 'NULL' or '.null', 'CR', 'space'.
  Some legacy software might require this, but no modern system does.

--no-recommended-glyphs
  Do not add glyphs 0, 1, 2, and 3 to the subset, unless specified in
  glyph set. [default]

--no-layout-closure
  Do not expand glyph set to add glyphs produced by OpenType layout
  features.  Instead, OpenType layout features will be subset to only
  rules that are relevant to the otherwise-specified glyph set.

--layout-features[+|-]=<feature>[,<feature>...]
  Specify (=), add to (+=) or exclude from (-=) the comma-separated
  set of OpenType layout feature tags that will be preserved.
  Glyph variants used by the preserved features are added to the
  specified subset glyph set. By default, 'calt', 'ccmp', 'clig', 'curs',
  'dnom', 'frac', 'kern', 'liga', 'locl', 'mark', 'mkmk', 'numr', 'rclt',
  'rlig', 'rvrn', and all features required for script shaping are
  preserved. To see the full list, try '--layout-features=?'.
  Use '*' to keep all features.
  Multiple --layout-features options can be provided if necessary.
  Examples:

    --layout-features+=onum,pnum,ss01
        * Keep the default set of features and 'onum', 'pnum', 'ss01'.
    --layout-features-='mark','mkmk'
        * Keep the default set of features but drop 'mark' and 'mkmk'.
    --layout-features='kern'
        * Only keep the 'kern' feature, drop all others.
    --layout-features=''
        * Drop all features.
    --layout-features='*'
        * Keep all features.
    --layout-features+=aalt --layout-features-=vrt2
        * Keep default set of features plus 'aalt', but drop 'vrt2'.

--layout-scripts[+|-]=<script>[,<script>...]
  Specify (=), add to (+=) or exclude from (-=) the comma-separated
  set of OpenType layout script tags that will be preserved. LangSys tags
  can be appended to script tag, separated by '.', for example:
  'arab.dflt,arab.URD,latn.TRK'. By default all scripts are retained ('*').

Hinting options
^^^^^^^^^^^^^^^

--hinting
  Keep hinting [default]

--no-hinting
  Drop glyph-specific hinting and font-wide hinting tables, as well
  as remove hinting-related bits and pieces from other tables (eg. GPOS).
  See --hinting-tables for list of tables that are dropped by default.
  Instructions and hints are stripped from 'glyf' and 'CFF ' tables
  respectively. This produces (sometimes up to 30%) smaller fonts that
  are suitable for extremely high-resolution systems, like high-end
  mobile devices and retina displays.

Optimization options
^^^^^^^^^^^^^^^^^^^^

--desubroutinize
  Remove CFF use of subroutinizes.  Subroutinization is a way to make CFF
  fonts smaller.  For small subsets however, desubroutinizing might make
  the font smaller.  It has even been reported that desubroutinized CFF
  fonts compress better (produce smaller output) WOFF and WOFF2 fonts.
  Also see note under --no-hinting.

--no-desubroutinize [default]
  Leave CFF subroutinizes as is, only throw away unused subroutinizes.

Font table options
^^^^^^^^^^^^^^^^^^

--drop-tables[+|-]=<table>[,<table>...]
  Specify (=), add to (+=) or exclude from (-=) the comma-separated
  set of tables that will be be dropped.
  By default, the following tables are dropped:
  'BASE', 'JSTF', 'DSIG', 'EBDT', 'EBLC', 'EBSC', 'PCLT', 'LTSH'
  and Graphite tables: 'Feat', 'Glat', 'Gloc', 'Silf', 'Sill'.
  The tool will attempt to subset the remaining tables.

  Examples:

  --drop-tables-=BASE
      * Drop the default set of tables but keep 'BASE'.

  --drop-tables+=GSUB
      * Drop the default set of tables and 'GSUB'.

  --drop-tables=DSIG
      * Only drop the 'DSIG' table, keep all others.

  --drop-tables=
      * Keep all tables.

--no-subset-tables+=<table>[,<table>...]
  Add to the set of tables that will not be subsetted.
  By default, the following tables are included in this list, as
  they do not need subsetting (ignore the fact that 'loca' is listed
  here): 'gasp', 'head', 'hhea', 'maxp', 'vhea', 'OS/2', 'loca', 'name',
  'cvt ', 'fpgm', 'prep', 'VMDX', 'DSIG', 'CPAL', 'MVAR', 'cvar', 'STAT'.
  By default, tables that the tool does not know how to subset and are not
  specified here will be dropped from the font, unless --passthrough-tables
  option is passed.

  Example:

   --no-subset-tables+=FFTM
      * Keep 'FFTM' table in the font by preventing subsetting.

--passthrough-tables
  Do not drop tables that the tool does not know how to subset.

--no-passthrough-tables
  Tables that the tool does not know how to subset and are not specified
  in --no-subset-tables will be dropped from the font. [default]

--hinting-tables[-]=<table>[,<table>...]
  Specify (=), add to (+=) or exclude from (-=) the list of font-wide
  hinting tables that will be dropped if --no-hinting is specified.

  Examples:

  --hinting-tables-=VDMX
      * Drop font-wide hinting tables except 'VDMX'.
  --hinting-tables=
      * Keep all font-wide hinting tables (but strip hints from glyphs).

--legacy-kern
  Keep TrueType 'kern' table even when OpenType 'GPOS' is available.

--no-legacy-kern
  Drop TrueType 'kern' table if OpenType 'GPOS' is available. [default]

Font naming options
^^^^^^^^^^^^^^^^^^^

These options control what is retained in the 'name' table. For numerical
codes, see: http://www.microsoft.com/typography/otspec/name.htm

--name-IDs[+|-]=<nameID>[,<nameID>...]
  Specify (=), add to (+=) or exclude from (-=) the set of 'name' table
  entry nameIDs that will be preserved. By default, only nameIDs between 0
  and 6 are preserved, the rest are dropped. Use '*' to keep all entries.

  Examples:

  --name-IDs+=7,8,9
      * Also keep Trademark, Manufacturer and Designer name entries.
  --name-IDs=
      * Drop all 'name' table entries.
  --name-IDs=*
      * keep all 'name' table entries

--name-legacy
  Keep legacy (non-Unicode) 'name' table entries (0.x, 1.x etc.).
  XXX Note: This might be needed for some fonts that have no Unicode name
  entires for English. See: https://github.com/fonttools/fonttools/issues/146

--no-name-legacy
  Drop legacy (non-Unicode) 'name' table entries [default]

--name-languages[+|-]=<langID>[,<langID>]
  Specify (=), add to (+=) or exclude from (-=) the set of 'name' table
  langIDs that will be preserved. By default only records with langID
  0x0409 (English) are preserved. Use '*' to keep all langIDs.

--obfuscate-names
  Make the font unusable as a system font by replacing name IDs 1, 2, 3, 4,
  and 6 with dummy strings (it is still fully functional as webfont).

Glyph naming and encoding options
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

--glyph-names
  Keep PS glyph names in TT-flavored fonts. In general glyph names are
  not needed for correct use of the font. However, some PDF generators
  and PDF viewers might rely on glyph names to extract Unicode text
  from PDF documents.
--no-glyph-names
  Drop PS glyph names in TT-flavored fonts, by using 'post' table
  version 3.0. [default]
--legacy-cmap
  Keep the legacy 'cmap' subtables (0.x, 1.x, 4.x etc.).
--no-legacy-cmap
  Drop the legacy 'cmap' subtables. [default]
--symbol-cmap
  Keep the 3.0 symbol 'cmap'.
--no-symbol-cmap
  Drop the 3.0 symbol 'cmap'. [default]

Other font-specific options
^^^^^^^^^^^^^^^^^^^^^^^^^^^

--recalc-bounds
    Recalculate font bounding boxes.
--no-recalc-bounds
    Keep original font bounding boxes. This is faster and still safe
    for all practical purposes. [default]
--recalc-timestamp
    Set font 'modified' timestamp to current time.
--no-recalc-timestamp
    Do not modify font 'modified' timestamp. [default]
--canonical-order
    Order tables as recommended in the OpenType standard. This is not
    required by the standard, nor by any known implementation.
--no-canonical-order
    Keep original order of font tables. This is faster. [default]
--prune-unicode-ranges
    Update the 'OS/2 ulUnicodeRange*' bits after subsetting. The Unicode
    ranges defined in the OpenType specification v1.7 are intersected with
    the Unicode codepoints specified in the font's Unicode 'cmap' subtables:
    when no overlap is found, the bit will be switched off. However, it will
    *not* be switched on if an intersection is found.  [default]
--no-prune-unicode-ranges
    Don't change the 'OS/2 ulUnicodeRange*' bits.
--prune-codepage-ranges
    Update the 'OS/2 ulCodePageRange*' bits after subsetting.  [default]
--no-prune-codepage-ranges
    Don't change the 'OS/2 ulCodePageRange*' bits.
--recalc-average-width
    Update the 'OS/2 xAvgCharWidth' field after subsetting.
--no-recalc-average-width
    Don't change the 'OS/2 xAvgCharWidth' field. [default]
--recalc-max-context
    Update the 'OS/2 usMaxContext' field after subsetting.
--no-recalc-max-context
    Don't change the 'OS/2 usMaxContext' field. [default]
--font-number=<number>
    Select font number for TrueType Collection (.ttc/.otc), starting from 0.
--pretty-svg
    When subsetting SVG table, use lxml pretty_print=True option to indent
    the XML output (only recommended for debugging purposes).

Application options
^^^^^^^^^^^^^^^^^^^

--verbose
    Display verbose information of the subsetting process.
--timing
    Display detailed timing information of the subsetting process.
--xml
    Display the TTX XML representation of subsetted font.

Example
^^^^^^^

Produce a subset containing the characters ' !"#$%' without performing
size-reducing optimizations::

  $ pyftsubset font.ttf --unicodes="U+0020-0025" \
    --layout-features=* --glyph-names --symbol-cmap --legacy-cmap \
    --notdef-glyph --notdef-outline --recommended-glyphs \
    --name-IDs=* --name-legacy --name-languages=*
zfontTools.subsetc                    sB   |  dt| |r|  |  dt fdd|D  d S d S )NzGlyph names: %szGlyph IDs:   %sc                 3       | ]} | V  qd S N .0greverseGlyphMapr   m/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/fontTools/subset/__init__.py	<genexpr>      z_log_glyphs.<locals>.<genexpr>)infosortedgetReverseGlyphMap)selfglyphsfontr   r   r   _log_glyphs  s
   "r&   zfontTools.subset.timer)loggerc                    s    fdd|D S )Nc                       i | ]}| | qS r   r   r   dr   r   
<dictcomp>      z _dict_subset.<locals>.<dictcomp>r   )r*   r$   r   r)   r   _dict_subset     r-   c                    s   t   fdd|D S )Nc                       g | ]
}| k r| qS r   r   r   icountlr   r   
<listcomp>      z _list_subset.<locals>.<listcomp>len)r4   indicesr   r2   r   _list_subset  s   r:   c                        fddt | jD S )z3Returns ascending list of matching coverage values.c                    s   g | ]
\}}| v r|qS r   r   r   r1   r   r$   r   r   r5     r6   intersect.<locals>.<listcomp>)	enumerater$   r#   r$   r   r=   r   	intersect     rA   c                    s   t  fdd| jD S )z#Returns set of intersecting glyphs.c                 3   s    | ]	}| v r|V  qd S r   r   r   r=   r   r   r         z#intersect_glyphs.<locals>.<genexpr>)setr$   r@   r   r=   r   intersect_glyphs  rB   rE   c                    s$   |   } fdd| jD | _|S )z4Returns ascending list of remaining coverage values.c                       g | ]}| v r|qS r   r   r   r=   r   r   r5         zsubset.<locals>.<listcomp>rA   r$   )r#   r$   r9   r   r=   r   subset  s   
rI   c                    s    fdd|D  _ dS )zRemaps coverage.c                       g | ]} j | qS r   r=   r0   r#   r   r   r5     r,   zremap.<locals>.<listcomp>Nr=   )r#   coverage_mapr   rK   r   remap  rB   rM   c                    s<   t tfdd D rdgng  fddj D  S )z0Returns ascending list of matching class values.c                 3       | ]}| j vV  qd S r   	classDefsr   rK   r   r   r         zintersect.<locals>.<genexpr>r   c                       g | ]
\}}| v r|qS r   r   r   r   vr=   r   r   r5     r6   r>   )r   anyrP   itemsr@   r   r$   r#   r   rA     s
   c                    s<   dkrt fdd D S t  fddj D S )z%Returns set of glyphs matching class.r   c                 3   s    | ]
}| j vr|V  qd S r   rO   r   rK   r   r   r         z"intersect_class.<locals>.<genexpr>c                 3   s(    | ]\}}|kr| v r|V  qd S r   r   rS   )r$   klassr   r   r        & )rD   rP   rV   )r#   r$   rY   r   )r$   rY   r#   r   intersect_class  s   r[   FTc                    sb    fddj  D _ t|rtfdd D rdgng tj   }|r/| |S )z,Returns ascending list of remaining classes.c                       i | ]\}}| v r||qS r   r   rS   r=   r   r   r+         zsubset.<locals>.<dictcomp>c                 3   rN   r   rO   r   rK   r   r   r     rQ   zsubset.<locals>.<genexpr>r   )rP   rV   r   rU   listvaluesrM   )r#   r$   rM   	useClass0r9   r   rW   r   rI     s   
c                    s    fdd| j  D | _ dS )zRemaps classes.c                    s   i | ]
\}}|  |qS r   indexrS   	class_mapr   r   r+   "  r6   zremap.<locals>.<dictcomp>N)rP   rV   )r#   rd   r   rc   r   rM     s   c                    s$   |j  fdd| j D  d S )Nc                 3        | ]\}}| v r|V  qd S r   r   rS   
cur_glyphsr   r   r   '      !closure_glyphs.<locals>.<genexpr>)r$   updatemappingrV   r#   srg   r   rf   r   closure_glyphs%     $rn   c                    $    fdd| j  D | _ t| j S )Nc                    s*   i | ]\}}| j v r| j v r||qS r   r=   rS   rm   r   r   r+   ,  s    $!subset_glyphs.<locals>.<dictcomp>rk   rV   boolr#   rm   r   rq   r   subset_glyphs*  s   

rv   c                 C   s,   | j  D ]\}}||v r|j| qd S r   )rk   rV   r$   rj   )r#   rm   rg   glyphsubstr   r   r   rn   2  s
   c                    rp   )Nc                    s6   i | ]\}}| j v rt fd d|D r||qS )c                 3       | ]}| j v V  qd S r   r=   )r   subrq   r   r   r   >  rQ   +subset_glyphs.<locals>.<dictcomp>.<genexpr>)r$   allrS   rq   r   r   r+   ;  s
     rr   rs   ru   r   rq   r   rv   9     

c                    s$   |j j fdd| j D   d S )Nc                 3   re   r   r   r   r   vlistrf   r   r   r   E  rh   ri   )r$   rj   
alternatesrV   rl   r   rf   r   rn   C  ro   c                    rp   )Nc                    sD   i | ]\}}| j v rt fd d|D r| fdd|D qS )c                 3   ry   r   r=   r   rT   rq   r   r   r   M  rQ   r{   c                       g | ]	}| j v r|qS r   r=   r   rq   r   r   r5   K      ,subset_glyphs.<locals>.<dictcomp>.<listcomp>)r$   rU   r~   rq   r   r   r+   J  s
     rr   )r   rV   rt   ru   r   rq   r   rv   H  r}   c                    s&   j j fdd| j D   d S )Nc                 3   s.    | ]\}}| v rfd d|D V  qdS )c                    s*   g | ]}t  fd d|jD r|jqS )c                 3   ry   r   r=   r   crq   r   r   r   V  rQ   z6closure_glyphs.<locals>.<genexpr>.<listcomp>.<genexpr>)r|   	ComponentLigGlyphr   seqrq   r   r   r5   V  s   * z,closure_glyphs.<locals>.<genexpr>.<listcomp>Nr   r   r   seqsrg   rm   r   r   r   U  s    ri   )r$   rj   	ligaturesrV   rl   r   r   r   rn   R  s
   c                    sT    fdd| j  D | _  fdd| j  D | _ dd | j  D | _ t| j S )Nc                        i | ]\}}| j v r||qS r   r=   rS   rq   r   r   r+   _       rr   c                    s$   i | ]\}}| fd d|D qS )c                    s4   g | ]}|j  jv rt fd d|jD r|qS )c                 3   ry   r   r=   r   rq   r   r   r   d  rQ   z6subset_glyphs.<locals>.<dictcomp>.<listcomp>.<genexpr>)r   r$   r|   r   r   rq   r   r   r5   a  s
    $r   r   r   rq   r   r   r+   `  s    c                 S      i | ]	\}}|r||qS r   r   rS   r   r   r   r+   h  r   )r   rV   rt   ru   r   rq   r   rv   ]  s   

c                    sh   j dkr-j|}|rt fddjj D sd S  jfdd|D  d S J dj  )N   c                 3       | ]	}|  jV  qd S r   rH   r   rq   r   r   r   p  
    

ri   c                 3   s    | ]} j | V  qd S r   )
Substituter0   rK   r   r   r   u  rQ   r   unknown format: %s)FormatCoveragerA   r|   LookAheadCoverageBacktrackCoverager$   rj   )r#   rm   rg   r9   r   )rm   r#   r   rn   l  s   

c                    s   | j dkrF| j j}t| j|| _ fddt| jD }t| j|| _| j| t| j| _	t
| j	oDt fdd| j| j D S J d| j  )Nr   c                       g | ]\}}| j v r|qS r   r=   )r   r1   rz   rq   r   r   r5     r]   !subset_glyphs.<locals>.<listcomp>c                 3   r   r   rI   r$   r   rq   r   r   r     r    subset_glyphs.<locals>.<genexpr>r   r   )r   r   rI   r$   r:   r   r?   rM   r8   
GlyphCountrt   r|   r   r   r#   rm   r9   r   rq   r   rv   z  s   

c                 C   s
   | j dv S )Nr         )DeltaFormatrK   r   r   r   
is_hinting  s   
r   c                 C   s4   dD ]}t | |d }|d ur| rt| | qd S )N)
XPlaDevice
YPlaDevice
XAdvDevice
YAdvDevice)getattrr   delattrr#   namerT   r   r   r   prune_hints  s   
r   c                    s|   | j dkrt| j|jS | j dkr7| j|j}| jt  fdd|D | _t| j| _t| jS J d| j  )Nr   r   c                    r/   r   r   r0   r3   r_   r   r   r5     r6   r   r   r   )r   r8   r   rI   r$   Value
ValueCountrt   r   r   r   r   rv     s   


c                    s    j d u r jdksJ dS  jdkr"|js j    j   _n9 jdkr[d  j v r@ jdks3J tdd  j D s?J n|jsM j D ]}|  qFttj	dd  j D d _ jdkr~t fd	d j D r~d _ jdkry j d nd  _  `
dS )
Nr   Tr   r   c                 s   s    | ]}|d u V  qd S r   r   r   r   r   r   r     r   z$prune_post_subset.<locals>.<genexpr>c                 S   s   g | ]}|  qS r   )getEffectiveFormatr   r   r   r   r5         %prune_post_subset.<locals>.<listcomp>c                 3   s    | ]
}| j d  kV  qdS r   N)r   r   rK   r   r   r     rX   )r   ValueFormatr   hintingr   r   r|   r   int__or__r   )r#   r%   optionsrT   r   rK   r   prune_post_subset  s,   






"r   c                    s|  j dkrWjj}jtfdd|D _jD ]}fdd|jD |_t|j|_q!dd tjD }j	| t
j|_tj_tjS j dkrfddjjjjjdd	D }fd
djjjdddD }fdd|D _jD ]  fdd|D  _qt|_t|_tjojdkojjS J dj  )Nr   c                    r/   r   r   r0   )r3   pairsr   r   r5     r6   r   c                       g | ]
}|j  jv r|qS r   )SecondGlyphr$   r   rrq   r   r   r5     s    c                 S      g | ]	\}}|j r|qS r   )PairValueCount)r   r1   pr   r   r   r5     r   r   c                       g | ]	}| j k r|qS r   )Class1Countr   rK   r   r   r5     s
    
TrM   c                    r   r   )Class2Countr   rK   r   r   r5     s
    
F)rM   r`   c                    rJ   r   )Class1Recordr0   rK   r   r   r5     r,   c                    rJ   r   )Class2Recordr0   r   r   r   r5     r,   r   r   )r   r   rI   r$   PairSetr8   PairValueRecordr   r?   rM   r:   PairSetCountrt   	ClassDef1intersection	ClassDef2r   r   r   r   )r#   rm   r9   r   
class1_map
class2_mapr   )r   r3   r   rm   r#   r   rv     sH   









c                 C   s   |j sGddd| j \}}d | _| _t| |D ].}t||D ]&}|jr3|j  |  j|j O  _|jrE|j  |  j|j O  _qqt	| j| jB S )N)r   r   )r   r   r   r   r   )
r   r   ValueFormat1ValueFormat2r   Value1r   r   Value2rt   )r#   r%   r   attr1attr2rowr   r   r   r   r     s$   

c                    s`   | j dkr)| j|j}| jt  fdd|D | _t| j| _t| jS J d| j  )Nr   c                    r/   r   r   r0   r3   recordsr   r   r5     r6   r   r   r   )r   r   rI   r$   EntryExitRecordr8   EntryExitCountrt   r   r   r   r   rv     s   

c                 C   sz   | j dkr
d| _ d S | j dkr7dD ]}t| |d }|d ur'| r't| |d  q| jd u r9| jd u r;d| _ d S d S d S d S )Nr   r   r   )XDeviceTableYDeviceTable)r   r   r   setattrr   r   r   r   r   r   r     s   



c                 C   s6   |j s| jD ]}|jr|j  |jr|j  qdS NT)r   r   EntryAnchorr   
ExitAnchor)r#   r%   r   recr   r   r   r   (  s   


c                 C   s   | j dkrn| j|j}t| jj|| j_t| jj| j_| j	|j}t| j
j|| j
_t| j
j| j
_tdd | jjD }t|| _| jjD ]	}||j|_qI| j
jD ]	}t|j||_qWt| jol| jjol| j
jS J d| j  )Nr   c                 s       | ]}|j V  qd S r   Classr   r   r   r   r   A      r   r   r   )r   MarkCoveragerI   r$   r:   	MarkArray
MarkRecordr8   	MarkCountBaseCoverage	BaseArray
BaseRecord	BaseCountr   
ClassCountrb   r   
BaseAnchorrt   )r#   rm   mark_indicesbase_indicesclass_indicesmbr   r   r   rv   3  *   

c                 C   sN   |j s%| jjD ]
}|jr|j  q| jjD ]}|jD ]}|r#|  qqdS r   )r   r   r   
MarkAnchorr   r   r   r   )r#   r%   r   r   r   ar   r   r   r   N     

c                 C   s   | j dkry| j|j}t| jj|| j_t| jj| j_| j	|j}t| j
j|| j
_t| j
j| j
_tdd | jjD }t|| _| jjD ]	}||j|_qI| j
jD ]}|d u r^qW|jD ]	}t|j||_qaqWt| jow| jjow| j
jS J d| j  )Nr   c                 s   r   r   r   r   r   r   r   r   i  r   r   r   r   )r   r   rI   r$   r:   r   r   r8   r   LigatureCoverageLigatureArrayLigatureAttachLigatureCountr   r   rb   r   ComponentRecordLigatureAnchorrt   )r#   rm   r   ligature_indicesr   r   r4   r   r   r   r   rv   [  s8   


c                 C   sd   |j s0| jjD ]
}|jr|j  q| jjD ]}|d u rq|jD ]}|jD ]}|r-|  q%q qdS r   )	r   r   r   r   r   r   r   r  r  )r#   r%   r   r   r4   r   r   r   r   r   r   {  s    


c                 C   s   | j dkrn| j|j}t| jj|| j_t| jj| j_| j	|j}t| j
j|| j
_t| j
j| j
_tdd | jjD }t|| _| jjD ]	}||j|_qI| j
jD ]	}t|j||_qWt| jol| jjol| j
jS J d| j  )Nr   c                 s   r   r   r   r   r   r   r   r     r   r   r   r   )r   Mark1CoveragerI   r$   r:   
Mark1Arrayr   r8   r   Mark2Coverage
Mark2ArrayMark2Recordr   r   rb   r   Mark2Anchorrt   )r#   rm   mark1_indicesmark2_indicesr   r   r   r   r   r   rv     r   c                 C   sN   |j s%| jjD ]
}|jr|j  q| jjD ]}|jD ]}|r#|  qqdS r   )r   r  r   r   r   r  r  r	  )r#   r%   r   r   r   r   r   r   r     r   c                 C   s   d S r   r   r#   lookup_indicesr   r   r   subset_lookups     r  c                 C   s   g S r   r   rK   r   r   r   collect_lookups  r  r  c                 C      dS r   r   r#   r%   r   r   r   r   r     s   c                 C   r  )NFr   rK   r   r   r   may_have_non_1to1  s   r  c                 C   r  r   r   rK   r   r   r   r    s   c                 C   sj   G dd dt }| jdvrd S t| jdsi | j_| j| jjvr.|| j| j}|| jj| j< | jj| j S )Nc                   @   s   e Zd Zdd ZdS )z0__subset_classify_context.<locals>.ContextHelperc                 S   s  |j drd}d}nd}d}|j drd}d}d}nd}d}d}|| }|| _|| _|| _|| _|| _|| _|d	 | _	|dkrfd
d }	dd }
dd }dd }d }d }dd }dd }dd }dd }nX|dkrdd }	dd }
dd }dd }dd }dd }dd }dd }d d }d!d }n+|dkrd"d }	d#d }
d }d }d }d }d$d }d%d }d&d }d'd }nJ d(| |r|
| _
|| _|| _|| _|| _n|	| _
|| _|| _|| _|| _|dkr|d) | _|d* | _|d+ | _|d, | _d-d | _d S |dkr9|d. | _|d/ | _|d0 | _|d1 | _d2d | _|r!d3nd4| _|r)dnd| _|r4d5| _d S d6| _d S |dkrH|rCd7nd8| _d S d S )9NSubstSubPosChainr   r    r   LookupRecordc                 S      | j S r   r   r   r   r   r   <lambda>      zK__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.<lambda>c                 S   r  r   r  r  r   r   r   r    r  c                 S   r  )Nr   r   r  r   r   r   r        c                 S   r  )N)NNNr   r  r   r   r   r    r  c                 S      | j fS r   )Inputr  r   r   r   r        c                 S      | j | j| jfS r   	Backtrackr!  	LookAheadr  r   r   r   r        c                 S      |\| _ dd |D \| _d S )Nc                 s       | ]	}t |d  V  qdS r   Nr7   r   xr   r   r   r   #  rC   a__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>)r!  r   r   r*   r   r   r   SetRuleData!     zN__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.SetRuleDatac                 S   F   |\| _ | _| _t|d t|d d t|d | _| _| _d S Nr   r   r   r%  r!  r&  r8   BacktrackGlyphCountInputGlyphCountLookAheadGlyphCountr.  r   r   r   ChainSetRuleData%     $zS__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.ChainSetRuleDatar   c                 S   r  r   r  r  r   r   r   r  .  r  c                 S   r  r   r  r  r   r   r   r  /  r  c                 S   r   r   ClassDefr  r   r   r   r  0  r"  c                 S   r#  r   BacktrackClassDefInputClassDefLookAheadClassDefr  r   r   r   r  1  s   c                 S   s   |\| _ d S r   r9  r.  r   r   r   SetContextData7  s   zQ__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.SetContextDatac                 S   s   |\| _ | _| _d S r   r;  r.  r   r   r   SetChainContextData:  s   zV__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.SetChainContextDatac                 S   r   r   r   r  r   r   r   r  =  r"  c                 S   r#  r   r$  r  r   r   r   r  >  r'  c                 S   r(  )Nc                 s   r)  r*  r7   r+  r   r   r   r   B  rC   r-  )r   r   r.  r   r   r   r/  @  r0  c                 S   r1  r2  r3  r.  r   r   r   r7  D  r8  c                 S   
   | j d S Nr   r  r  r   r   r   r  M     
 c                 S   rA  rB  )InputCoverager  r   r   r   r  N  rC  c                 S   r  r   r  r  r   r   r   r  S  r  c                 S   s   | j | j | j S r   )r   rD  r   r  r   r   r   r  T  r.   c                 S   r(  )Nc                 s       | ]}t |V  qd S r   r7   r+  r   r   r   r   Z  r   r-  )r   r   r.  r   r   r   r/  X  r0  c                 S   s.   |\| _ | _| _dd |D \| _| _| _d S )Nc                 s   rE  r   r7   r+  r   r   r   r   b  r   zf__subset_classify_context.<locals>.ContextHelper.__init__.<locals>.ChainSetRuleData.<locals>.<genexpr>)r   rD  r   r4  r5  r6  r.  r   r   r   r7  \  s   r   Rule	RuleCountRuleSetRuleSetCountc                 S   s   || v r|gS g S r   r   r$   r   r   r   r   r   r  y  s    	ClassRuleClassRuleCountClassSetClassSetCountc                 S   s&   |r| | |S |dkrt| S t S rB  )r[   rD   rJ  r   r   r   r    s   r=  r:  r!  r   rD  r   )__name__endswith
startswithTypTyper  ChainTypInputIdxDataLenr  r   ContextDatar?  RuleDatar/  rF  rG  rH  rI  	Intersectr:  ClassDefIndexr!  )r#   rY   r   rR  rS  r  rU  rV  rT  r   ChainCoveragerW  ChainContextDatar?  r@  rX  ChainRuleDatar/  r7  r   r   r   __init__  s   



	










z9__subset_classify_context.<locals>.ContextHelper.__init__N)rO  
__module____qualname__r^  r   r   r   r   ContextHelper  s    ra  r   _subset__ContextHelpers)objectr   hasattr	__class__rb  )r#   ra  helperr   r   r   __subset_classify_context  s    
rg  c                    s  |     | |}|sg S  | |}| jdkr | }t|  j}t|  j}|D ]}||ks:|| s;q0t||  j	D ]p}|sHqCt
 fddt| |D s[qCt }	t| jD ]N}
|
siqd|
j}||	v rsd }n|dkrt | j| g}n
t|j|d  g}jjj|
j }|	| | r|	t|t|jd  |j|d qdqCq0d S | jdkrpt|  j}||} | }t|  j}t|  j}|D ]}||ks|| sqt||  j	D ]~}|sqt
 fddt| |D sqt }	t| jD ][}
|
sq|
j}||	v r"d }n|dkr0t|||}nt|jt| j|d  }jjj|
j }|	| | rc|	t|tt| jd  |j|d qqqd S | jdkrt
fd	d | D sg S | }t| j}t }	t| jD ]L}
|
sq|
j}||	v rd }n|dkrt|}n
t|| j}jjj|
j }|	| | r|	t|t|d  |j|d qd S J d
| j )Nr   c                 3   .    | ]\ }t  fd d|D V  qdS )c                 3        | ]}  j|V  qd S r   rY  r$   r   kr   cdrm   r   r   r     rh   +closure_glyphs.<locals>.<genexpr>.<genexpr>Nr|   r   klistr   rm   rn  r   r     
    
ri   r   r   rf   c                 3   rh  )c                 3   ri  r   rj  rk  rm  r   r   r     rh   ro  Nrp  rq  rs  rt  r   r     ru  r   c                 3   $    | ]}|d uo|  jV  qd S r   rH   r+  rq   r   r   r        " r   )rg  r   rA   rE   r   rW  r   rH  rI  rF  r|   ziprX  rD   r  SequenceIndex	frozensetr$   r!  table
LookupListLookupLookupListIndexaddr  rj   ranger8   rn   r:  r[   )r#   rm   rg   r9   rW  rssrssCountr1   r   chaosllseqi
pos_glyphslookupr:  input_coveragesr   rs  r   rn     s   










 #




c                    s  |    | jdkrx| jjt|  jt|  jfddD D ]%}|s-q(t| j} fdd|D }t	| j| t	| j
t| q( fddtD | j tt	|  j t	|  jt tS | jdkr9| jjsdS  | }fdd|D  j t|  jt|  jfd	dD t|  j| jjfd
dtD D ];}|sqt| j} fdd|D }t	| j| t	| j
t| |D ]} |dd t |D  qqɇ fddD r%d d u r%d= r%d d u st	|  j t	|  jt tS | jdkrMtfdd | D S J d| j )Nr   c                       g | ]
}|k r | qS r   r   r0   r  r  r   r   r5     r6   r   c                    s0   g | ]}|rt fd d |D r|qS )c                 3   s&    | ]}t  fd d|D V  qdS )c                 3   ry   r   r=   r   rq   r   r   r     rQ   5subset_glyphs.<locals>.<listcomp>.<genexpr>.<genexpr>Nrp  )r   glistrq   r   r   r     s   $ +subset_glyphs.<locals>.<listcomp>.<genexpr>)r|   rX  r   rs  r   r   r5     s    c                    s$   g | ]\}}|rt | jr|qS r   r   rF  )r   r1   rsr   r   r   r5         $ r   Fc                    s$   g | ]}|r|j  jd dndqS )Tr   Nr   r+  rq   r   r   r5   *  s    c                    r  r   r   r0   r  r   r   r5   2  r6   c                        g | ]\}}| v r|nd qS r   r   )r   r1   r  )r9   r   r   r5   6  r   c              	      s2   g | ]}|rt d d t |D r|qS )c                 3   s*    | ]\ }t  fd d|D V  qdS )c                 3   s    | ]}| v V  qd S r   r   rk  	klass_mapr   r   r   A  r   r  Nrp  rq  r   r  r   r   @  s
    
r  )r|   rx  rX  r   )r   
klass_mapsr   r   r5   <  s    c                    s"   g | ]\ } fd d|D qS )c                       g | ]}  |qS r   ra   rk  r  r   r   r5   M  r,   z,subset_glyphs.<locals>.<listcomp>.<listcomp>r   rq  r   r  r   r5   L  s    c                    s$   g | ]}|rt | jr|nd qS r   r  )r   r  r   r   r   r5   S  r  r   c                 3   rv  r   r   r+  rq   r   r   r   `  rw  r   r   r   )rg  r   r   rI   r$   r   rH  rI  rF  r   rG  r8   r?   rM   r:   rt   rW  rZ  r:  rA   r/  rx  rX  r|   )r#   rm   r  ssrW  r   r   )r   r9   r  r  r  rm   r   rv     s|   




	
c              	      s   |   }| jdv rHt| |jD ]6}|sqt||jD ]*}|sqt||j fddt||jD  t||jD ]}|s<q7 |j|_q7qqd S | jdkrtt| |j fddt| |jD  t| |jD ]}|sjqe |j|_qed S J d| j )Nr   c                       g | ]}|r|j  v r|qS r   r~  r   r  r  r   r   r5   x      
"subset_lookups.<locals>.<listcomp>r   c                    r  r   r  r  r  r   r   r5     r  r   r   )	rg  r   r   rH  rF  r   r  rb   r~  )r#   r  r   r  r   r  r   r  r   r  e  sH   


	


	c                    sZ   |    | jdv r fddt|  jD S | jdkr&dd t|  jD S J d| j )Nr   c                    sB   g | ]}|rt | jD ]}|rt | jD ]}|r|jqqqS r   )r   rF  r  r~  )r   r  r   r  r   r   r   r5     s     


z#collect_lookups.<locals>.<listcomp>r   c                 S   s   g | ]}|r|j qS r   r  r  r   r   r   r5     r,   r   r   )rg  r   r   rH  r  rK   r   r   r   r    s   



	c                 C   s*   | j dkr| j|| d S J d| j  Nr   r   r   )r   ExtSubTablern   rl   r   r   r   rn     s   
c                 C   "   | j dkr
| j S J d| j  r  )r   r  r  rK   r   r   r   r       

c                 C   $   | j dkr| j|S J d| j  r  )r   r  rv   ru   r   r   r   rv        
c                 C   s&   | j dkr| j||S J d| j  r  )r   r  r   r  r   r   r   r     s   
c                 C   r  r  )r   r  r  r  r   r   r   r    r  c                 C   r  r  )r   r  r  rK   r   r   r   r    r  c                 C   s   |d u r	t |j}t| }|j}||d\}}|t|jkr-t|jt f \}}||< ||r4d S || | j	D ]}|sAq<|
|| q<d S )Nr   )rz  r$   id_doneLookupsgetr8   rD   issubsetrj   SubTablern   )r#   rm   rg   keydoneLookupsr3   coveredstr   r   r   rn     s   



c                    sr    fdd| j D | _ t| j | _t| dr4| jd ur4| j jvr,d | _|  jdM  _n j| j| _t| jS )Nc                    s   g | ]}|r|  r|qS r   rv   r   r  rq   r   r   r5     r]   r   MarkFilteringSeti)	r  r8   SubTableCountrd  r  used_mark_sets
LookupFlagrb   rt   ru   r   rq   r   rv     s   
c                 C   *   d}| j D ]}|s
q|||rd}q|S NFT)r  r   )r#   r%   r   retr  r   r   r   r        
c                 C   s   | j D ]}|| qd S r   )r  r  )r#   r  rm   r   r   r   r  
  s   
c                 C   s   t dd | jD g S )Nc                 s       | ]	}|r|  V  qd S r   )r  r  r   r   r   r     rC   "collect_lookups.<locals>.<genexpr>)sumr  rK   r   r   r   r    s   c                 C   s   t dd | jD S )Nc                 s   r  r   )r  r  r   r   r   r     rC   z$may_have_non_1to1.<locals>.<genexpr>)rU   r  rK   r   r   r   r    s   c                    r;   )z(Returns the indices of nonempty lookups.c                    s"   g | ]\}}|r|  r|qS r   r  r   r1   r4   rq   r   r   r5        " r   )r?   r}  ru   r   rq   r   rv     rB   c                 C   r  r  )r}  r   )r#   r%   r   r  r4   r   r   r   r      r  c                    sB        fdd|D  _t j _ jD ]}|| qd S )Nc                    s    g | ]}| j k r j| qS r   )LookupCountr}  r0   rK   r   r   r5   .  r   r  )ensureDecompiledr}  r8   r  r  )r#   r  r4   r   rK   r   r  +  s   
c                    s&   |     fddt| jD | _dS )+Sets lookups not in lookup_indices to None.c                    r  r   r   r  r  r   r   r5   8      z"neuter_lookups.<locals>.<listcomp>N)r  r?   r}  r  r   r  r   neuter_lookups4  s   
r  c                    s^   t    }	 tfdd|D g } fdd|D }|s#t  S t |} | |}q)zBReturns sorted index of all lookups reachable from lookup_indices.Tc                 3   s(    | ]}| j k r j|  V  qd S r   )r  r}  r  r0   rK   r   r   r   D  rZ   z"closure_lookups.<locals>.<genexpr>c                    s"   g | ]}| vr|j k r|qS r   )r  r   r4   r  r#   r   r   r5   G  s
    z#closure_lookups.<locals>.<listcomp>)r   r  extend)r#   r  recurserecurse_lookupsr   r  r   closure_lookups=  s    
r  c                    sL    fdd| j D | _  fdd| j D | _ t| j | _| jp%t| jtjS )z2 "Returns True if feature is non-empty afterwards.c                    rF   r   r   r  r  r   r   r5   V  rG   r  c                    r  r   ra   r  r  r   r   r5   X  r,   )r~  r8   r  
isinstanceFeatureParamsr   FeatureParamsSizer  r   r  r   r  S  s   c                    r;   ))Returns the indices of nonempty features.c                    s*   g | ]\}}|j  s|jd kr|qS )pref)Featurer  
FeatureTagr   r1   fr  r   r   r5   i  s    

r  )r?   FeatureRecordr  r   r  r   r  b  s   
c                    s   t  fdd|D g S )Nc                 3   s(    | ]}| j k r j| jjV  qd S r   )FeatureCountr  r  r~  r0   rK   r   r   r   s  s    
r  )r  r#   feature_indicesr   rK   r   r  p  s   
c                 C   s,   |    t| j|| _t| j| _t| jS r   )r  r:   r  r8   r  rt   r  r   r   r   subset_features|  s   
r  c                    s    fdd| j D S )r  c                    s   g | ]}|j  r|jqS r   )r  r  FeatureIndexr   r  r   r   r5     s    
r  )SubstitutionRecordr  r   r  r   r    s   
c                       t  fdd| jD g S )r  c                 3   s    | ]	}|j  V  qd S r   )FeatureTableSubstitutionr  r   r  r  r   r   r     r   z!subset_lookups.<locals>.<genexpr>r  FeatureVariationRecordr  r   r  r   r    s   
c                    r  )Nc                 3   s0    | ]}|j jD ]}|j v r|jjV  qqd S r   )r  r  r  r  r~  )r   vrr   r  r   r   r     s    
r  r  r  r   r  r   r    s   
c                    sN   |     fdd| jD | _| jD ]	} |j|_qt| j| _t| jS )Nc                       g | ]	}|j  v r|qS r   )r  r   r  r   r   r5         #subset_features.<locals>.<listcomp>)r  r  rb   r  r8   SubstitutionCountrt   r#   r  r   r   r  r   r    s   


c                 C   sh   |    | jD ]}|j| q| jr)| jd jjs)| j  | jr)| jd jjrt| j| _t| jS )Nr  )	r  r  r  r  r  popr8   FeatureVariationCountrt   r  r   r   r   r    s(   


c                    sl   | j  v r | j | _ nd| _  fdd| jD | _ fdd| jD | _t| j| _t| jp4| j dkS )N  c                    rF   r   r   r  r  r   r   r5     rG   r  c                    s   g | ]}| v r  |qS r   ra   r  r  r   r   r5         )ReqFeatureIndexrb   r  r8   r  rt   r  r   r  r   r    s   

c                 C   s,   | j d d  }| jdkr|| j t|S Nr  )r  r  appendr   r  r   r   r   collect_features  s   
r  c                    sN   | j r| j  s|sd | _  fdd| jD | _t| j| _t| jp%| j S )Nc                    s   g | ]
}|j  r|qS r   )LangSysr  r  r  r   r   r5     s
    r  )DefaultLangSysr  LangSysRecordr8   LangSysCountrt   )r#   r  keepEmptyDefaultLangSysr   r  r   r    s   

c                 C   s4   dd | j D }| jr|| j  tt|g S )Nc                 S   s   g | ]}|j  qS r   )r  r  r  r   r   r   r5     r,   z$collect_features.<locals>.<listcomp>)r  r  r  r  r   r  r  r   r   r   r    s   c                    s.    fdd| j D | _ t| j | _t| jS )Nc                    s(   g | ]}|j  |jd ksr|qS )DFLT)Scriptr  	ScriptTagr   rm   r  retain_emptyr   r   r5     s    r  )ScriptRecordr8   ScriptCountrt   )r#   r  r  r   r  r   r    s
   
c                 C   s   t tdd | jD g S )Nc                 s   s    | ]}|j  V  qd S r   )r  r  r  r   r   r   r     rQ   z#collect_features.<locals>.<genexpr>)r   r  r  rK   r   r   r   r    s   EBLCc                    sV   | j D ]}|jD ]} fdd|jD |_qdd |jD |_qdd | j D | _ dS )Nc                    r   r   r=   r   nrq   r   r   r5     r   r   c                 S      g | ]}|j r|qS r   )namesr0   r   r   r   r5     r,   c                 S   r  r   )indexSubTablesr  r   r   r   r5     r,   T)strikesr  r  )r#   rm   strikeindexSubTabler   rq   r   rv     s   

EBDTc                    s(    fdd| j D }dd |D | _ dS )Nc                    s    g | ]  fd dj D qS )c                    s   i | ]}| v r| | qS r   r   r   r  r   r   r+     r]   z,subset_glyphs.<locals>.<listcomp>.<dictcomp>r=   )r   rq   r  r   r5     r  r   c                 S   s   g | ]}|r|qS r   r   )r   r  r   r   r   r5     r   T)
strikeData)r#   rm   r  r   rq   r   rv     s
   
sbixc                    s*   | j  D ]  fdd|jD  _qdS )Nc                    "   i | ]}| j v r| j | qS r   r=   r   r  r   r   r+   !  r  rr   T)r  r_   r$   ru   r   r  r   rv     s   GSUBc                 C   s   | j |_ | j jr| j j }ng }| j jr| j j|}ng }t| j dd r/|| j j|7 }t|}| j jrhi |_		 t
|j}|D ]}|| j jjkrLqB| j jj| sTqB| j jj| | qB||jkrenq;|`	|` d S )NFeatureVariations)r{  
ScriptListr  FeatureListr  r   r  r   r|  r  rz  r$   r  r}  rn   )r#   rm   r  r  orig_glyphsr1   r   r   r   rn   &  s2   


GPOSc                 C   s2   |j |_| jjr| jj|}ng }| | dS r   )glyphs_gsubedr$   r{  r|  rv   r  )r#   rm   r  r   r   r   rv   D  s   
c                 C   s   | j tdkS )Nr  )re  r   getTableClassrK   r   r   r   retain_empty_scriptsO  s   r  c                 C   s   | j jr| j j| | j jr| j j|}ng }t| j ddr)|| j j|7 }t|}| j jr8| j j| t| j ddrF| j j| | j jrV| j j|| 	  dS dS )zZRetains specified lookups, then removes empty features, language
    systems, and scripts.r  N)
r{  r|  r  r	  r   r  r   r  r  r  )r#   r  r  r   r   r   r  V  s"   c                 C   s   | j jr| j j| dS dS )r  N)r{  r|  r  r  r   r   r   r  m  s   c                 C   s   | j jr| j j }ng }| j jr| j j|}ng }t| j ddr+|| j j|7 }t|}| j jr;| j j	|}ng }|rF| 
| dS | | dS )z/Remove (default) or neuter unreferenced lookupsr  N)r{  r  r  r	  r  r   r  r   r|  r  r  r  )r#   rM   r  r  r   r   r   prune_lookupst  s   r  c                    sx   | j jr( fddt| j jjD }| j j| t| j dd r'| j j| ng }| j jr:| j j||   d S d S )Nc                    s   g | ]\}}|j  v r|qS r   )r  r  feature_tagsr   r   r5     s
    
z'subset_feature_tags.<locals>.<listcomp>r  )	r{  r	  r?   r  r  r   r  r  r  )r#   r  r  r   r  r   subset_feature_tags  s   
r  c                    s  i  t  |D ]&}d|v r|dn|df\}}|d  |t  |d q| jjrfdd| jjjD | jj_t| jjj| jj_	| jjjD ]1j
 v rd j
 vr fddjjD j_tjjj_d j
 vrd j_qPd S d S )	N.r      c                    r  r   )r  r  )script_tagsr   r   r5     r  z&subset_script_tags.<locals>.<listcomp>z*   c                    s    g | ]}|j  j v r|qS r   )
LangSysTagr  r  )langsysrecordr   r   r5     s
    dflt)rD   splitr  ljust
setdefaultr{  r  r  r8   r  r  r  r  r  r  )r#   tagstag
script_taglang_tagr   )r  r  r  r   subset_script_tags  s,   

r!  c                 C   sp   | j jr| j j }ng }| j jr| j j| t| j ddr&| j j| | j jr6| j j||   dS dS )zRemove unreferenced featuresr  N)r{  r  r  r	  r  r   r  r  r  r   r   r   prune_features  s   r"  c                 C   s<   d|j vr| |j  d|jvr| |j | jdd dS )Nr   Fr   T)layout_scriptsr!  layout_featuresr  r  r  r   r   r   prune_pre_subset  s   

r%  c                 C   s   | j }|jr	|jsd S |jj}|jjD ]^}|jj}|sq|jjd d  D ]L}|j}t	|j
t	|j
kr4q$|jdk|jdkkr?q$|jdkrO||j ||j krOq$tt	|j
D ]}||j
|  ||j
|  krh nqV|jj| q$qd S r  )r{  r  r	  r  r  r  r  r  r  r8   r  r  r  remove)r#   r{  featuresrm   r*   lrr4   r1   r   r   r   remove_redundant_langsys  s2   
r)  c                 C   s   | j }|   |jr|j|| |jsd |_|jr"|   |   t|dr?|jr4|jr1|jj	s4d |_|js?|j
dkr?d|_
dS )Nr  i     T)r{  r  r|  r   r	  r)  r"  rd  r  r  Versionr#   r%   r   r{  r   r   r   r     s&   
GDEFc                    s*  |j | jjr!jj}tjj|j_tjjj_j	r3fddj	j
 D j	_
jrEfddjj
 D j_
jrgjj}jj  fdd|D j_tjjj_tdrjrj}|jD ]	}|r~| qudd t|jD |_dd |jD |_d	S )
Nc                    r\   r   r   rS   r=   r   r   r+   /  r  rr   c                    r\   r   r   rS   r=   r   r   r+   3  r  c                    s    g | ]}| k rj j| qS r   )
AttachListAttachPointr0   )r   r{  r   r   r5   9      r   MarkGlyphSetsDefc                 S   r   r   r=   r   r1   r   r   r   r   r5   C  r   c                 S   r  r   r=   r   r   r   r   r5   D  r,   T)r  r{  LigCaretListr   rI   r:   r   r8   LigGlyphCountMarkAttachClassDefrP   rV   GlyphClassDefr.  r   r/  rd  r1  r?   r  )r#   rm   r9   markGlyphSetscoverager   )r   r$   r{  r   rv   &  s<   








c                 C   s   d| vrd S | d }|j }t|dsd S |j}t }|| d| v r+| d j | ||}|| d| v rC| d j | d S d S )Nr-  VarStorer  )r{  rd  r9  rD   collect_device_varidxessubset_varidxesremap_device_varidxes)r%   gdefr{  storeusedVarIdxes
varidx_mapr   r   r   
_pruneGDEFI  s    



rA  c                 C   s   | j }|jr|jjsd |_|jr|jjsd |_|jr!|jjs!d |_|jr+|jjs+d |_t|drBt	| |j
jdkrB|jdkrBd|_t|drN|jrN|jjsYd |_|jdkrYd|_t|jpu|jpu|jpu|jpu|jdkom|jpu|jdkou|j
S )Nr9  r   i  i  r1  r*  )r{  r3  r4  r5  rP   r6  r.  r   rd  rA  r9  VarDataCountr+  r1  r   rt   r,  r   r   r   r   c  sF   


kernc                 C   s   dd | j D | _ t| j S )Nc                 S   s   g | ]	}t |d r|qS 	kernTable)rd  r   tr   r   r   r5     r   $prune_pre_subset.<locals>.<listcomp>)
kernTablesrt   r  r   r   r   r%    s   
c                    sH   |j  | jD ]} fdd|j D |_qdd | jD | _t| jS )Nc                    s.   i | ]\\}}}| v r| v r||f|qS r   r   )r   r   r   rT   r=   r   r   r+     s
    
rr   c                 S   r  r   rD  rF  r   r   r   r5     r,   r   )r  rI  rE  rV   rt   )r#   rm   rG  r   r=   r   rv     s   



vmtxc                 C   s0   t | j|j| _|jD ]}d| j|< qt| jS )Nr   r   )r-   metricsr$   glyphs_emptiedrt   r#   rm   r   r   r   r   rv     s   

hmtxc                 C   s*   t | j|j| _|jD ]}d| j|< qdS )NrK  T)r-   rL  r$   rM  rN  r   r   r   rv     s   
hdmxc                    sJ    fdd| j  D | _ | j D ]} jD ]	}d| j | |< qqt| j S )Nc                    s   i | ]\}}|t | jqS r   )r-   r$   )r   szr4   rq   r   r   r+     r]   rr   r   )rP  rV   rM  rt   )r#   rm   rQ  r   r   rq   r   rv     s   


ankrc                    sD   | j j  jdksJ d j  fdd|jD  _t jdkS )Nr   zunknown 'ankr' format %sc                    r  r   )Anchorsr   rw   r{  r   r   r+         rr   )r{  AnchorPointsr   r$   rS  r8   ru   r   rU  r   rv     s   
bslnc                 C   s(   | j j}|jdv r|j|j d S d S )N)r   r   )r{  Baseliner   r$   r  StandardGlyph)r#   rm   r{  r   r   r   rn     s   
c                    s   | j jjdv rJfdd|jD }t|dkr4t| dd \ } _ fdd|	 D }t|dkr?|_
dS dddj _`
dS )	N)r   r   c                       i | ]}| j | jqS r   )BaselineValuesr  DefaultBaselinerT  rU  r   r   r+     s    rr   r   r   c                       i | ]\}}| kr||qS r   r   )r   rw   r   
mostCommonr   r   r+     r]   r   T)r{  rY  r   r$   r8   r   r_   most_commonr]  rV   r\  )r#   rm   	baselines_cntr   )r`  r{  r   rv     s   

lcarc                    sD   | j j  jdv r fdd|jD  _t jdkS J d j )N)r   r   c                    r  r   )CaretsrT  rU  r   r   r+     rV  rr   r   Fzunknown 'lcar' format %s)r{  LigatureCaretsr   r$   re  r8   ru   r   rU  r   rv     s   

gvarc                 C   s    |j r|jsg | j|jd < dS Nr   T)notdef_glyphnotdef_outline
variations
glyphOrderr  r   r   r   r%    s   c                 C   s&   t | j|j| _t| j| _t| jS r   )r-   rk  r$   r8   
glyphCountrt   ru   r   r   r   rv     s   
c                    sV    fdd|j  D } |j | j  }| j D ]\}}|| jkr$|nd||< q|S )Nc                    s   i | ]	\}}| | qS r   r   )r   rl  rT   r@  r   r   r+     r   z$_remap_index_map.<locals>.<dictcomp>r   )rk   rV   last_retained_glyphreverseEmptiedGlyphMaplast_retained_order)rm   r@  	table_mapmap_last_idxr   r1   r   rn  r   _remap_index_map  s
   ru  HVARc                 C   s  | j }t }t }d}|jr"t|jj|j|j_||jj  n||j  |	 }|j
j}|jrHt|jj|j|j_||jj  |jr^t|jj|j|j_||jj  |jj|||d}|jrst|||j|j_|jrt|||j|j_|jrt|||j|j_dS NF)retainFirstMapadvIdxesT)r{  rD   AdvWidthMapr-   rk   r$   rj   r_   reverseOrigGlyphMapcopyr   retain_gidsLsbMapRsbMapr9  r;  ru  r#   rm   r{  used	advIdxes_retainAdvMapr@  r   r   r   rv     s4   VVARc                 C   s^  | j }t }t }d}|jr"t|jj|j|j_||jj  n||j  |	 }|j
j}|jrHt|jj|j|j_||jj  |jr^t|jj|j|j_||jj  |jrtt|jj|j|j_||jj  |jj|||d}|jrt|||j|j_|jrt|||j|j_|jrt|||j|j_|jrt|||j|j_dS rw  )r{  rD   AdvHeightMapr-   rk   r$   rj   r_   r{  r|  r   r}  TsbMapBsbMapVOrgMapr9  r;  ru  r  r   r   r   rv   #	  s>   VORGc                    s*    fdd| j  D | _ t| j | _dS )Nc                    r   r   r=   rS   rq   r   r   r+   P	  r0  rr   T)VOriginRecordsrV   r8   numVertOriginYMetricsru   r   rq   r   rv   N	  s
   
opbdc                    sr   | j j  jdkr fdd|jD  _t jdkS  jdkr2 fdd|jD  _t jdkS J d j )Nr   c                    r  r   )OpticalBoundsDeltasrT  rU  r   r   r+   [	  
    

rr   r   c                    r  r   )OpticalBoundsPointsrT  rU  r   r   r+   b	  r  Fzunknown 'opbd' format %s)r{  OpticalBoundsr   r$   r  r8   r  ru   r   rU  r   rv   W	  s   



postc                 C   s   |j sd| _dS )N      @T)glyph_names
formatTyper  r   r   r   r%  l	  s   c                 C   s
   g | _ dS r   )
extraNamesru   r   r   r   rv   s	  s   propc                    s   | j jjdkrjdkS jdkrOfdd|jD _tj dd \ } _ fddj	 D _t
jdkrM`d_jdkS dS J dj )	Nr   r   c                    r[  r   )
Propertiesr  DefaultPropertiesr   )r  r   r   r+   	  s    rr   c                    r^  r   r   )r   r   r  r_  r   r   r+   	  r  TFzunknown 'prop' format %s)r{  GlyphPropertiesr   r  r$   r  r   r_   ra  rV   r8   )r#   rm   rc  r   )r`  r  r   rv   y	  s$   





c                    s"   t    fdd}| ||  S )Nc                    s*   | j tjjtjjhv r | j d S d S r   )r   r   PaintFormat
PaintGlyphPaintColrGlyphr  Glyph)paintresultr   r   callback	  s   z$_paint_glyph_names.<locals>.callback)rD   traverse)r  colrr  r   r  r   _paint_glyph_names	  s   r  COLRc                 C   s   | j dkr| | j| _dd | jjjD | _|j}|r]t }|D ]*}| j	|g D ]}|
|j q*| j dkrK| j	|}|d urK|t|| j q!||j8 }|j| |}|sd S d S )Nr   c                 S   s   i | ]}|j |jqS r   )	BaseGlyphPaint)r   r   r   r   r   r+   	  s    "closure_glyphs.<locals>.<dictcomp>)version_decompileColorLayersV0r{  ColorLayersBaseGlyphListBaseGlyphPaintRecordColorLayersV1r$   rD   r  r  r   rj   r  )r#   rm   	decomposelayersr   layerr  r   r   r   rn   	  s(   


c                    s   ddl m} ddlm}m} j_fddjD _jdkr't	jS |j
jj
j|fddD \j
_j
_`j
jd ur\j
jj  fdd D j
j_jj
jjsmd_`
t	S |j
fddD  `d	S )
Nr   )unbuildColrV1)buildColrV1populateCOLRv0c                    r  r   )r  r   rK   r   r   r+   	  rV  rr   c                        i | ]}|j v r| | qS r   r=   r   )colorGlyphsV1rm   r   r   r+   	  r   c                    r  r   r=   r   )clipsrm   r   r   r+   	  r   c                    s    i | ]}|d d  | D qS )c                 S   s   g | ]}|j |jfqS r   )r   colorID)r   r  r   r   r   r5   	  rG   r   r   r   )layersV0r   r   r+   	  r   T)fontTools.colorLib.unbuilderr  fontTools.colorLib.builderr  r  glyphs_colredr$   r  r  rt   r{  	LayerListr  r  ClipListr  r  )r#   rm   r  r  r  r   )r  r  r  rm   r#   r   rv   	  s6   




CPALc                    s  d|v rdS | d}|sdS tt  fdd}|jdkr4|j D ]}|D ]
} |j | q'q#n$|jj	rH|jj	j
D ]
} |j | q=|jjjD ]
}|j|j| qMt  dh | jD ]}fd	d
t|D |d d < t|tksJ qdttD ] \}	}
 |
 D ]}t|dr|	|_qt|dr|	|_qt|qt| jd | _| jdkrg }t| jD ]\}}|v r|| q|| _t| jS )NzSVG Tr  Fc                    sN   t | dr | j |  d S t | dr#| jjD ]} |j | qd S d S )NPaletteIndex	ColorLine)rd  r  r  r  	ColorStop)r  stop)colors_by_indexr   r   collect_colors_by_index 
  s   

z2prune_post_subset.<locals>.collect_colors_by_indexr   r  c                    rR   r   r   r2  )retained_palette_indicesr   r   r5   
  r6   r   r  r  r   )r  r   r^   r  r  r_   r  r  r{  LayerRecordArrayLayerRecordr  r  r  r  r  rD   keyspalettesr?   r8   r!   rd  AssertionErrornumPaletteEntriespaletteEntryLabelsrt   )r#   r%   r   r  r  r  r  r  palette	new_index	old_indexkept_labelsr1   labelr   )r  r  r   r   	  sN   







c                 C   sB   t  }| jD ]}||j q| jr| jjD ]}||j q|S r   )rD   MathGlyphVariantRecordr  VariantGlyphGlyphAssemblyPartRecordsrw   )r#   r$   variantsrT   r   r   r   r   rn   -
  s   
c                 C   s   t |j}t }| jr!| j|}|D ]}|| j| | q| jr:| j|}|D ]}|| j	| | q,|j| d S r   )
rz  r$   rD   VertGlyphCoveragerA   rj   VertGlyphConstructionrn   HorizGlyphCoverageHorizGlyphConstruction)r#   rm   r$   r  r9   r1   r   r   r   rn   8
  s   
VARCc                 C   s4   | j j|j}t| j jj|| j j_t| j jjS r   )r{  r   rI   r$   r:   VarCompositeGlyphsVarCompositeGlyphrt   r   r   r   r   rv   J
  s
   

c                 C   s   | j jd u rd S dd t| j jjD }| j jj}|j}t }t|}|r]|}t }|D ],}||v r3q,||}	|	d u r=q,||	 }
|
jD ]}|j	}|
| ||vrW|
| qDq,|s%d S d S )Nc                 S      i | ]\}}||qS r   r   )r   r1   	glyphNamer   r   r   r+   X
  r,   r  )r{  r  r?   r   r$   r  rD   r  
componentsr  r  )r#   rm   glyphMapglyphRecordsr$   r  newoldNewr  idxrw   compr   r   r   r   rn   S
  s2   




c                 C   sz  | j }|j}|d urt }|| ||}|| |jj}|d urkt }|jj	D ]}	|	j
D ]}
|
jd ur=||
j q0q+t|}t|||j_dd t|D }|jj	D ]}	|	j
D ]}
|
jd uri||
j |
_q\qW|j}|d ur|j}t }|jj	D ]}	|	j
D ]}
|
jd ur||
j qq|t|}t|||_dd t|D }|jj	D ]}	|	j
D ]}
|
jd ur||
j |
_qqdS )Nc                 S   r  r   r   r   r  oldr   r   r   r+   
  r,   z%prune_post_subset.<locals>.<dictcomp>c                 S   r  r   r   r  r   r   r   r+   
  r,   T)r{  MultiVarStorerD   collect_varidxesr;  remap_varidxesAxisIndicesListItemr  r  r  axisIndicesIndexr  r!   r:   r?   ConditionListConditionTableconditionIndex)r#   r%   r   r{  r>  r?  r@  axisIndicesListusedIndicesrw   r  rk   conditionListconditionTablesr   r   r   r   o
  sZ   










MATHc                 C   s   | j jr| j j| d S d S r   )r{  MathVariantsrn   ru   r   r   r   rn   
  s   c                 C   2   | j |j}t| j|| _t| j| _t| jS r   )r   rI   r$   r:   ItalicsCorrectionr8   ItalicsCorrectionCountrt   r   r   r   r   rv   
     
c                 C   r  r   )TopAccentCoveragerI   r$   r:   TopAccentAttachmentr8   TopAccentAttachmentCountrt   r   r   r   r   rv   
  r  c                 C   r  r   )MathKernCoveragerI   r$   r:   MathKernInfoRecordsr8   MathKernCountrt   r   r   r   r   rv   
  r  c                 C   sN   | j r	| j | | jr| j| | jr| j| | jr%| j|j dS r   )MathItalicsCorrectionInforv   MathTopAccentAttachmentMathKernInfoExtendedShapeCoveragerI   r$   ru   r   r   r   rv   
  s   c                 C   s`   | j r| j |j}t| j|| _t| j| _| jr.| j|j}t| j|| _t| j| _	dS r   )
r  rI   r$   r:   r  r8   VertGlyphCountr  r  HorizGlyphCountr   r   r   r   rv   
  s   c                 C   s8   |j |_| jjr| jj| | jjr| jj| dS r   )glyphs_mathedr$   r{  MathGlyphInforv   r  ru   r   r   r   rv   
  s   glyfc                 C   s  | j rtd| j d d d dkrd S t| j  }| _ d}d}|r|| d> ||d  B }||d  d> ||d  B }|| }|d? ||d < |d@ ||d < |d	7 }t|}|d@ ra|d	7 }n|d7 }|d@ rn|d7 }n|d
@ rw|d	7 }n|d@ r|d7 }|d@ }|s"d S d S )Nz>hr   r   
   r      r      r  @          )datastructunpack	bytearrayr   )r#   
glyphidmapr  r1   moreflagsglyphIDr   r   r   remapComponentsFast
  s0   $


r  c                 C   sr   | j }|j }|r7t }|D ]}||vrq|| }|| D ]}|| qq||j 8 }|j | |}|sd S d S r   )r$   rD   getComponentNamesr  rj   )r#   rm   glyphSetr  r  r   glr   r   r   r   rn   
  s   
c                 C   s.   |j r|js| | jd  }|j  d|_dS )Nr       T)ri  rj  rl  __dict__clearr  )r#   r%   r   r   r   r   r   r%    s
   
c                    s   t | j j| _ jjs3 fddt| jD }dd t|D }| j D ]}t|dr2|| q&t	
dj} jD ]}| | j|< d| j| _q< fdd| jD | _d	S )
Nc                    r   r   r=   r<   rq   r   r   r5     r]   r   c                 S   r  r   r   )r   r  or   r   r   r+     r,   rr   r  r  r  c                    s$   g | ]}| j v s| jv r|qS r   )r$   rM  r   rq   r   r   r5   &  s    T)r-   r$   r   r}  r?   rl  r_   rd  r  r   getTableModuler  rM  r  )r#   rm   r9   glyphmaprT   r  r   r   rq   r   rv     s    



c                 C   s(   |j  }| j D ]}|j|d q	dS )N)remove_hintingT)r   r$   r_   trim)r#   r%   r   r$  rT   r   r   r   r   -  s   cmapc                    s   dd | j D }|D ]H}|jdkr:|j D ]"\} |jvr qfdd D }d |v r2|d  j| qq
|j j	 
 }j fdd|D  q
j _|D ]	}j|j q[d S )Nc                 S      g | ]}|  r|qS r   	isUnicoderF  r   r   r   r5   7  rG   z"closure_glyphs.<locals>.<listcomp>   c                    s   h | ]\}}| j v r|qS r   unicodes_requestedr   ur   rq   r   r   	<setcomp>?  r]   z!closure_glyphs.<locals>.<setcomp>c                 3   r   r   r   r   r.  )r&  r   r   r   F  r   ri   )tablesformatuvsDictrV   r,  r&  r$   rj   r&  r   r  r|  unicodes_missingdifference_update)r#   rm   r1  r{  varSelectorr$   r   r   )r&  rm   r   rn   5  s$   


c                 C   sR   |j sdd | jD | _|jsdd | jD | _dd | jD | _t| j| _dS )Nc                 S   s    g | ]}|  s| r|qS r   )r)  isSymbolrF  r   r   r   r5   R  r   rH  c                 S   s   g | ]}|  s|qS r   )r7  rF  r   r   r   r5   T  rG   c                 S   s   g | ]	}|j d kr|qS )r   )r2  rF  r   r   r   r5   W  r   T)legacy_cmapr1  symbol_cmapr8   numSubTablesr  r   r   r   r%  N  s   c                    s  d  _ g }i }i }| jD ]s}|jdkr|jdkr|||j< |jdkr,|jdkr,|||j< |jdkrJ fdd|j D |_dd |j D |_q| rr fdd|j	 D |_	|jd	krq|j	rqt
|j	 d
k rq|| q fdd|j	 D |_	q|D ]=}|jdkr|jdkr|j|v r||j j	|j	kr|j	  q|jdkr|jdkr|j|v r||j j	|j	kr|j	  qdd | jD | _t| j| _dS )Nr   r   r   r*  c                    s.   i | ]\}}| j v r| fd d|D qS )c                    s,   g | ]\}}| j v s| jv r||fqS r   glyphs_requestedr,  r-  rq   r   r   r5   o  s
    r   r+  r   rT   r4   rq   r   r   r+   n  s    
rr   c                 S   r   r   r   r=  r   r   r   r+   w  r   c                    s*   i | ]\}}| j v s| jv r||qS r   r;  r-  rq   r   r   r+   y  s
       r*  c                    s    i | ]\}}| j v r||qS r   )r<  r-  rq   r   r   r+     r   r  r  c                 S   s(   g | ]}|j d kr|jrn|jr|qS )r*  )r2  r&  r3  rF  r   r   r   r5     s   ( r   T)r$   r1  
platformID	platEncIDlanguager2  r3  rV   r)  r&  maxr  r  r   r8   r:  )r#   rm   tables_format12_bmptable_plat0_enc3table_plat3_enc1rG  r   rq   r   rv   \  sJ   




	
"







DSIGc                 C   s   d| _ g | _dS rh  )	usNumSigssignatureRecordsr  r   r   r   r%    s   maxpc                 C   s>   |j s| jdkrd| _d| _d| _d| _d| _d| _d| _dS )Nr*  r   r   T)	r   tableVersionmaxZonesmaxTwilightPoints
maxStoragemaxFunctionDefsmaxInstructionDefsmaxStackElementsmaxSizeOfInstructionsr  r   r   r   r%    s   
r   c                    s  t  }|| tj|jB  djv r dd | jD O   fdd| jD | _js6dd | jD | _djvrFfdd| jD | _jrg }| jD ]:}|j	dv rb|
 r^d	d
nd	|_n!|j	dv rt|
 rpdd
nd|_n|j	dkr}d|_n|j	dv rqN|| qN|| _dS )Nr   c                 S   s   h | ]
}|j d k r|j qS )   nameIDr  r   r   r   r/    r6   z$prune_post_subset.<locals>.<setcomp>c                    r  r   rS  r  )nameIDsr   r   r5     r   r   c                 S   r'  r   r(  r  r   r   r   r5     rG   c                    r   r   )langIDname_languagesr  r   r   r   r5     r6   )r   r  z.	utf_16_be)r      r   r  )         T)r   visitrD   name_IDsseenr  name_legacyrW  obfuscate_namesrT  r)  encodestringr  )r#   r%   r   visitornamerecsr  r   )rU  r   r   r     s0   







headc                 C   r  r   r   r  r   r   r   r     s   c                   @   s   e Zd ZG dd deZG dd deZg dZeg d7 Zg dZg dZg d	g d
g dg dddgddgdgdgg dg dg dg dg dg ddZ	e
eee	 g Zdd Zdd Zg fddZd S )!Optionsc                   @      e Zd ZdS )zOptions.OptionErrorNrO  r_  r`  r   r   r   r   OptionError      rl  c                   @   rj  )zOptions.UnknownOptionErrorNrk  r   r   r   r   UnknownOptionError  rm  rn  )BASEJSTFrF  r  r  EBSCPCLTLTSH)FeatGlatGlocSilfSill)avarfvargasprh  hhearI  vheaOS/2locar   cvtfpgmprepVDMXrF  r  MVARcvarSTAT)r  r  r  r  rP  r  )rvrnccmpligaloclmarkmkmkrlig)fracnumrdnom)caltcligcursrC  rclt)valtvertvkrnvpalvrt2ltraltrmrtlartlmrandjalt)HarfHARFBuzzBUZZ)chwsvchwhaltvhal)
initmedifinaisolmed2fin2fin3cswhmsetstch)ljmovjmotjmo)abvsblwsabvmblwm)nuktakhnrphfrkrfr  blwfhalfabvfpstfcfarvatucjctr  presr  r  pstshalndistr  r  )common	fractions
horizontalverticalltrrtlr  justifyprivateeast_asian_spacingarabichangultibetanindicc                 K   s0  | j d d  | _| jd d  | _d| _| jd d  | _d| _d| _| j	d d  | _
dg| _d| _d| _d| _d| _d| _d| _g d| _d| _dg| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d| _d | _ d | _!d| _"d| _#t$j%| _&d| _'d| _(d| _)d| _*d| _+d| _,| j-di | d S )NFTr   )r   r   r   r   r     rZ  i	  r  r   )._drop_tables_defaultdrop_tables_no_subset_tables_defaultno_subset_tablespassthrough_tables_hinting_tables_defaulthinting_tableslegacy_kernlayout_closure_layout_features_defaultr$  r#  ignore_missing_glyphsignore_missing_unicodesr   r  r8  r9  r`  rb  rW  rc  r}  ri  rj  recommended_glyphsrecalc_boundsrecalc_timestampprune_unicode_rangesprune_codepage_rangesrecalc_average_widthrecalc_max_contextcanonical_orderflavorwith_zopflidesubroutinizer   defaultharfbuzz_repackerverbosetimingxmlfont_number
pretty_svglazyrD   )r#   kwargsr   r   r   r^  J  sP   
	zOptions.__init__c                 K   s:   |  D ]\}}t| |s| d| t| || qd S )NUnknown option '%s')rV   rd  rn  r   )r#   r  rl  rT   r   r   r   rD   }  s
   
zOptions.setc                 C   s@  g }g }|D ]}|}| ds|| q|dd  }|d}d}|dkrN| dr<|dd  }	|	dkr9d }
nd}
n|}	d	}
|	d
rM|	d d }	d
}
n |d | }	|	d dv rf|	d d }|	d d }	||d d  }
|	}|	dd}	t| |	s|d	u s||v r|| q| d| t| |	}|
d
krtd||f  qt	|t
rt
|
}
nit	|trt|
}
n_t	|trt|
}
nUt	|trt	|
t
r| d| |
dd }|dgkrg }dd |D }|dkr|}
n&|dkr|}
|
| n|dkr|}
|D ]}||
v r|
| qnJ t| |	|
 q|| S )Nz--r   =r  zno-r   zcanonical-orderFT?z-+r   -_r  zCurrent setting for '%s' is: %sz5Option '%s' requires values to be specified using '=', r  c                 S   s.   g | ]}t |r|d  dv rt|d n|qS )r   
0123456789)r8   r   r+  r   r   r   r5     s   . z&Options.parse_opts.<locals>.<listcomp>z+=z-=)rQ  r  findrP  replacerd  rn  r   printr  rt   r   strr^   rl  r  r  r&  r   )r#   argvignore_unknownposargspassthru_optionsr   orig_ar1   oprl  rT   okovvvr,  r   r   r   
parse_opts  s   



















zOptions.parse_optsN)rO  r_  r`  	Exceptionrl  rn  r  r  r  _layout_features_groupsr   r  iterr_   r  r^  rD   r  r   r   r   r   ri    s8    
33ri  c                   @   s   e Zd ZG dd deZG dd deZG dd deZddd	Zg g g d
fddZdd Z	dd Z
dd Zdd Zdd Zdd ZdS )	Subsetterc                   @   rj  )zSubsetter.SubsettingErrorNrk  r   r   r   r   SubsettingError  rm  r  c                   @   rj  )z&Subsetter.MissingGlyphsSubsettingErrorNrk  r   r   r   r   MissingGlyphsSubsettingError  rm  r  c                   @   rj  )z(Subsetter.MissingUnicodesSubsettingErrorNrk  r   r   r   r   MissingUnicodesSubsettingError  rm  r  Nc                 C   s,   |st  }|| _t | _t | _t | _d S r   )ri  r   rD   r,  glyph_names_requestedglyph_ids_requested)r#   r   r   r   r   r^    s   zSubsetter.__init__r  c                 C   st   | j | t|tr|d}|d}t|d }td| |D ]}| j 	| q#| j
| | j| d S )Nutf_8z	utf-32-ber  z>%dL)r,  rj   r  bytesdecoderd  r8   r  r  r  r  r  )r#   r$   gidsunicodestext
text_utf32ncharsr.  r   r   r   populate  s   


zSubsetter.populatec              	   C   s  |  |D ]}| | jjv s'| | jjv r| jjr'|dkr1| jjs1d|v r1td| ||= qt	
|}t|drtd|  || }W d    n1 sPw   Y  td|  ||| j}W d    n1 smw   Y  |s~td| ||= qtd| qd S )	NrC  r  z
%s droppedr%  z	load '%s'
prune '%s'%s pruned to empty; dropped	%s pruned)_sort_tablesstripr   r  r  r   r  logr    r   r  rd  timerr%  r#   r%   r  clazzr{  retainr   r   r   _prune_pre_subset  s0   


zSubsetter._prune_pre_subsetc              	      s  t   }   _t  _jj jfddjD  t  _jj| jfddjD  jrVt	
dj jjsVjj _t  _d v rtd  d  j| W d    n1 sw   Y  tj_jrdd jD }t	
d	| jjs|~jjrd
 v rj d t	
d njd t	
d jjrd
 v rttdt  D ]}j | qt	
d d v r5td7 t	
dtj t	jj d  d  j| t	
dtj t	jj d W d    n	1 s0w   Y  tj_jj rd v rtd7 t	
dtj t	jj d  d  j| t	
dtj t	jj d W d    n	1 sw   Y  tj_!dD ]_}| v rtd| 9 t	
d|tj t	jj d  |  j| t	
d|tj t	jj d W d    n	1 sw   Y  t"d|#  dtj qd  v r:td!7 t	
d"tj t	jj d  d   j| t	
d#tj t	jj d W d    n	1 s5w   Y  tj_$d
 v rtd$7 t	
d%tj t	jj d  d
  j| t	
d&tj t	jj d W d    n	1 sw   Y  tj_$d' v rtd(7 t	
d)tj t	jj d  d'  j| t	
d*tj t	jj d W d    n	1 sw   Y  tj_%tj_& ' fd+d,j&D _(t)j(* _+  j+ _,t _-jj.rfd-d.|j& D _-fd/d,j-D _/jj.s4fd0dD n
 fd1dD _0fd2d,ttD _1t	
d3tj& `d S )4Nc                 3   s$    | ]}|t  k r | V  qd S r   r7   r0   glyph_orderr   r   r     s    z,Subsetter._closure_glyphs.<locals>.<genexpr>c                 3   s     | ]}|t  kr|V  qd S r   r7   r0   r)  r   r   r     s    zMissing requested glyphs: %sr&  zclose glyph list over 'cmap'c                 S   s   g | ]}d | qS )zU+%04Xr   r0  r   r   r   r5   (  r   z-Subsetter._closure_glyphs.<locals>.<listcomp>z)Missing glyphs for requested Unicodes: %sr  r   zAdded gid0 to subsetz.notdefzAdded .notdef to subsetr  z!Added first four glyphs to subsetr  zclose glyph list over 'MATH'z0Closing glyph list over 'MATH': %d glyphs before)r%   z.Closed glyph list over 'MATH': %d glyphs afterr  zclose glyph list over 'GSUB'z0Closing glyph list over 'GSUB': %d glyphs beforez.Closed glyph list over 'GSUB': %d glyphs after)r  rX  zclose glyph list over '%s'z.Closing glyph list over '%s': %d glyphs beforez,Closed glyph list over '%s': %d glyphs afterglyphs_edr  zclose glyph list over 'VARC'z0Closing glyph list over 'VARC': %d glyphs beforez.Closed glyph list over 'VARC': %d glyphs afterzclose glyph list over 'glyf'z0Closing glyph list over 'glyf': %d glyphs beforez.Closed glyph list over 'glyf': %d glyphs afterzCFF zclose glyph list over 'CFF 'z0Closing glyph list over 'CFF ': %d glyphs beforez.Closed glyph list over 'CFF ': %d glyphs afterc                    r(   r   r   r   orderr   r   r+     r,   z-Subsetter._closure_glyphs.<locals>.<dictcomp>c                    s   h | ]} | j kr|qS r   )rq  r   )r.  r#   r   r   r/    s
    z,Subsetter._closure_glyphs.<locals>.<setcomp>c                    r(   r   r   r   r-  r   r   r+     r,   c                    r   r   )glyphs_retainedr   rK   r   r   r5     r   c                    s    g | ]}  |jkr|qS r   )
getGlyphIDrq  r   )r%   r#   r   r   r5     r0  c                    s   i | ]	} |  |qS r   r   r0   )new_glyph_orderr.  r   r   r+     s    zRetaining %d glyphs)2rD   getGlyphOrderorig_glyph_orderr<  rj   r  r  glyphs_missing
differencer#  r    r   r  r  r|  r$   r4  r$  rn   intersection_updaterz  glyphs_cmapedr  r  ri  r  getGlyphNamer  r  minr8   r	  r  r  r   lowerglyphs_glyfedglyphs_cffedr/  r"   r{  rB  r_   rq  ro  rM  r}  rp  r1  glyph_index_map)r#   r%   
realGlyphsmissingr1   r{  r   )r%   r*  r1  r.  r#   r   _closure_glyphs  s0  











"














zSubsetter._closure_glyphsc              	   C   s  g | _ | |D ]g}t|}| | jjv rtd| qt	|dr[t
d|  || }| j| _|| }| `W d    n1 sCw   Y  |sTtd| ||= qtd| q| jjrftd| qtd| ||= qt
d || j W d    d S 1 sw   Y  d S )	Nz%s subsetting not neededrv   zsubset '%s'z%s subsetted to empty; droppedz%s subsettedz'%s NOT subset; don't know how to subsetz0%s NOT subset; don't know how to subset; droppedzsubset GlyphOrder)r  r!  r   r  r"  r   r  r#  r    rd  r$  r/  r$   rv   r  warningsetGlyphOrderr1  r%  r   r   r   _subset_glyphs  s.   



"zSubsetter._subset_glyphsc              	   C   s  |  }d|v r|d |d |D ]}|dkrq|dkr| jjr?||  }|| j|dd}||kr?td|t	| | jj
rf|| jdkrf||  }|| j|dd}||krftd|t	| | jjr|| j}|| |}	||	krtd	||	 | jjrt|}
|
|| jkr|
|| _td
||
 t|}t|drtd|  || }||| j}W d    n1 sw   Y  |std| ||= qtd| qd S )Nr   
GlyphOrderr~  T)	pruneOnlyz%s Unicode ranges pruned: %sr   z%s CodePage ranges pruned: %sz%s xAvgCharWidth updated: %dz%s usMaxContext updated: %dr   r  r  r   )r  r&  r  r   r  getUnicodeRangesrecalcUnicodeRangesr#  r    r!   r  r  getCodePageRangesrecalcCodePageRangesr  xAvgCharWidthrecalcAvgCharWidthr  r   usMaxContextr   r  rd  r$  r   )r#   r%   	tableTagsr  old_unirangesnew_unirangesold_codepagesnew_codepagesold_avg_widthnew_avg_widthmax_contextr&  r{  r'  r   r   r   _prune_post_subset  s\   






zSubsetter._prune_post_subsetc                    s@   g d dd t  D  t|  fddd}dd |D S )	N)r-  r  r  rz  ry  rg  r   r  c                 S   s   i | ]	\}}||d  qS )r   r   )r   r1   rG  r   r   r   r+   	  r   z*Subsetter._sort_tables.<locals>.<dictcomp>c                    s     | dS rB  )r  )r  tagOrderr   r   r  
  s    z(Subsetter._sort_tables.<locals>.<lambda>)r  c                 S   s   g | ]}|d kr|qS )rD  r   rF  r   r   r   r5     rG   z*Subsetter._sort_tables.<locals>.<listcomp>)r?   r!   r  )r#   r%   r  r   rV  r   r!    s   zSubsetter._sort_tablesc                 C   s,   |  | | | | | | | d S r   )r(  r@  rC  rU  )r#   r%   r   r   r   rI     s   


zSubsetter.subsetr   )rO  r_  r`  r  r  r  r  r^  r  r(  r@  rC  rU  r!  rI   r   r   r   r   r    s    
	 /3r  z	load fontc           	      C   sZ   t j| ||j|j||jd}|r+t d}|j}|j|_|d }|jdkr(d|_||_|S )N)checkChecksumsrecalcBBoxesrecalcTimestampr  
fontNumberr  g       @r  )	r   TTFontr  r  r  r  decode_format_2_0decode_format_3_0r  )	fontFiler   rX  dontLoadGlyphNamesr  r%   r  savedr  r   r   r   	load_font  s"   

rb  zcompile and save fontc                 C   sJ   |j r|jdkrddlm} d|_|j| _|j| jt< | j||j	d d S )Nwoffr   )sfntT)reorderTables)
r  r  fontTools.ttLibrd  
USE_ZOPFLIr  cfgr   saver  )r%   outfiler   rd  r   r   r   	save_font4  s   rk  c                 C   s   dd l }|dd| } |dd| } g }|  D ]*}|d}t|dkr.|t|d q|\}}|tt|dt|dd  q|S )Nr   z0[xX]r  z[<+>,;&#\\xXuU\n	]r  r   r\  )rerz   r  r8   r  r   r  r  )rm   rl  r4   itemfieldsstartendr   r   r   parse_unicodes?  s   
"rq  c                 C   sl   g }|  dd D ])}|d}t|dkr!|t|d  q
|tt|d t|d d  q
|S )Nr  r  r  r   r   )r  r  r8   r  r   r  r  )rm   r4   rm  rn  r   r   r   
parse_gidsO  s   
&rr  c                 C   s   |  dd S )Nr  r  )r  r  rq   r   r   r   parse_glyphsZ  s   rs  c                   C   s"   t dttjd t dtjd d S )Nzusage:filez,Try pyftsubset --help for more information.
)r   	__usage__sysstderrr   r   r   r   usage^  s   ry  z%make one with everything (TOTAL TIME)c              
   C   sV  ddl m} ddlm} | du rtjdd } d| v r!tt dS t }z|j	| g dd} W n |j
yN } zt  td	|tjd
 W Y d}~dS d}~ww t| dk rZt  dS ||jratjntjd |jrqtjtj ndtj_| d }| dd } t|d}d}g }g }	g }
d}d}d}| D ]:}|dkrd}q|dr|dd }q|dr||dd 7 }q|drt|dd dd}|| dd7 }W d   n1 sw   Y  q|dr|dd dkrd}n|
t|dd  q|dr2t|dd }| D ]}|
t| dd  qW d   n	1 s,w   Y  q|d rD|	t!|dd  q|d!rxt|dd }| D ]}|	t!| dd  qWW d   n	1 srw   Y  q|d"r|d#d dkrd}n|t"|d#d  q|d$rt|dd }| D ]}|t"| dd  qW d   n	1 sw   Y  q|#| q|j$ o| }|j%}t&||||d%}|du r|j'durd&|j'(  nd}t)||dd'd(}td)@ |r||*  |r5|d* j+D ]}|, r3|
|j-.  |j/dkr3|
|j0.  qd|vs<J W d   n	1 sGw   Y  t12d+|  t12d,|
 t12d-| t12d.|	 |j3||	|
|d/ |4| t5||| |jrddl6}t12d0|j78||f  t12d1|j78||f  |j9r|:tj; |<  dS )2z%OpenType font subsetter and optimizerr   )splitext)configLoggerNr   z--help)	r  z	gids-filer$   zglyphs-filer  z	text-filer  zunicodes-filezoutput-file)r  zERROR:rt  r   )levelTrX  Fr  r   z--output-file=r*  z--text=   z--text-file=r>  zutf-8)encoding
z--unicodes=   z--unicodes-file=r\  #z--gids=z--gids-file=z	--glyphs=	   z--glyphs-file=)r`  r  r  z.subset)	extension	overWritesuffixzcompile glyph listr&  z
Text: '%s'zUnicodes: %sz
Glyphs: %szGids: %s)r$   r  r  r  zInput font:% 7d bytes: %szSubset font:% 7d bytes: %s)=os.pathrz  	fontToolsr{  rw  r  r   __doc__ri  r  rl  ry  rx  r8   r  loggingINFOWARNINGr  r$  r'   setLevelDEBUGdisabledr  rQ  openreadr  r  rq  	readlinesr  rr  rs  r  r  r  rb  r  r:  r
   r2  r1  r)  r&  r  r2  r3  r#  r    r  rI   rk  ospathgetsizer  saveXMLstdoutclose)argsrz  r{  r   efontfile	subsetterrj  r$   r  r  wildcard_glyphswildcard_unicodesr  r   r  liner`  r  r%   extrG  r  r   r   r   mainc  s   










r  )ri  r  rb  rk  rr  rs  rq  r  r   )FT)F)T)r   FT)r  r   fontTools.misc.roundToolsr   r   fontTools.ttLib.tablesr   fontTools.ttLib.tables.otBaser   fontTools.otlLib.maxContextCalcr   fontTools.pens.basePenr   fontTools.misc.loggingToolsr	   fontTools.misc.cliToolsr
   fontTools.subset.utilr   r   fontTools.subset.cfffontTools.subset.svgfontTools.varLibr   r   fontTools.ttLib.tables._n_a_m_er   rw  r  arrayr  collectionsr   r   	functoolsr   typesr   rv  r  	getLoggerr#  r&   r$   r$  r-   r:   r   rA   rE   rI   rM   r:  r[   SingleSubstrn   rv   MultipleSubstAlternateSubstLigatureSubstReverseChainSingleSubstDevicer   ValueRecordr   	SinglePosr   PairPos
CursivePosAnchorMarkBasePos
MarkLigPosMarkMarkPosr  r  ContextSubstChainContextSubst
ContextPosChainContextPosr  rg  ExtensionSubstExtensionPosr}  r|  r  r  r  r	  r  r  r  r  r  r  r  r  r  r  r  r  r!  r"  r%  r)  rA  ru  r  MathGlyphConstructionr  r  r  r  r
  r"  r  r  rc  ri  r  rb  rk  rq  rr  rs  ry  r  __all__r   r   r   r   <module>   s     
+











	

	









-
















 
o
Z
)























	
























.
"
"





	





%
*






3
<





,






	


	




B



 j  E

 