Ë
    £eh   ã                   óÄ  — d Z dj                  d«      Ze edd«      D � cg c]
  }  e| «      ‘Œ c} z  Ze ed«      gz  Zdj                  «       j                  d«      Zedj                  «       j                  d«      z  ZdZ G d	„ d
e«      Z	g ddfd„Z
g ddfd„Zg ddfd„Zedk(  r4ddlZddlZ ej                    ej"                  «       j$                  «       yyc c} w )a  
This module implements the algorithm for converting between a "user name" -
something that a user can choose arbitrarily inside a font editor - and a file
name suitable for use in a wide range of operating systems and filesystems.

The `UFO 3 specification <http://unifiedfontobject.org/versions/ufo3/conventions/>`_
provides an example of an algorithm for such conversion, which avoids illegal
characters, reserved file names, ambiguity between upper- and lower-case
characters, and clashes with existing files.

This code was originally copied from
`ufoLib <https://github.com/unified-font-object/ufoLib/blob/8747da7/Lib/ufoLib/filenames.py>`_
by Tal Leming and is copyright (c) 2005-2016, The RoboFab Developers:

-	Erik van Blokland
-	Tal Leming
-	Just van Rossum
z\" * + / : < > ? [ \ ] | \0ú é   é    é   z!CON PRN AUX CLOCK$ NUL A:-Z: COM1zLPT1 LPT2 LPT3 COM2 COM3 COM4éÿ   c                   ó   — e Zd Zy)ÚNameTranslationErrorN)Ú__name__Ú
__module__Ú__qualname__© ó    úV/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/fontTools/misc/filenames.pyr   r      s   „ Ør   r   Ú c                 óD  — t        | t        «      st        d«      ‚t        |«      }t        |«      }|s| d   dk(  rd| dd z   } g }| D ]6  }|t        v rd}n||j                  «       k7  r|dz  }|j                  |«       Œ8 dj                  |«      } t        |z
  |z
  }| d| } g }	| j                  d«      D ].  }
|
j                  «       t        v rd|
z   }
|	j                  |
«       Œ0 dj                  |	«      } || z   |z   }|j                  «       |v rt        | |||«      }|S )aŒ  Converts from a user name to a file name.

    Takes care to avoid illegal characters, reserved file names, ambiguity between
    upper- and lower-case characters, and clashes with existing files.

    Args:
            userName (str): The input file name.
            existing: A case-insensitive list of all existing file names.
            prefix: Prefix to be prepended to the file name.
            suffix: Suffix to be appended to the file name.

    Returns:
            A suitable filename.

    Raises:
            NameTranslationError: If no suitable name could be generated.

    Examples::

            >>> userNameToFileName("a") == "a"
            True
            >>> userNameToFileName("A") == "A_"
            True
            >>> userNameToFileName("AE") == "A_E_"
            True
            >>> userNameToFileName("Ae") == "A_e"
            True
            >>> userNameToFileName("ae") == "ae"
            True
            >>> userNameToFileName("aE") == "aE_"
            True
            >>> userNameToFileName("a.alt") == "a.alt"
            True
            >>> userNameToFileName("A.alt") == "A_.alt"
            True
            >>> userNameToFileName("A.Alt") == "A_.A_lt"
            True
            >>> userNameToFileName("A.aLt") == "A_.aL_t"
            True
            >>> userNameToFileName(u"A.alT") == "A_.alT_"
            True
            >>> userNameToFileName("T_H") == "T__H_"
            True
            >>> userNameToFileName("T_h") == "T__h"
            True
            >>> userNameToFileName("t_h") == "t_h"
            True
            >>> userNameToFileName("F_F_I") == "F__F__I_"
            True
            >>> userNameToFileName("f_f_i") == "f_f_i"
            True
            >>> userNameToFileName("Aacute_V.swash") == "A_acute_V_.swash"
            True
            >>> userNameToFileName(".notdef") == "_notdef"
            True
            >>> userNameToFileName("con") == "_con"
            True
            >>> userNameToFileName("CON") == "C_O_N_"
            True
            >>> userNameToFileName("con.alt") == "_con.alt"
            True
            >>> userNameToFileName("alt.con") == "alt._con"
            True
    z(The value for userName must be a string.é    ú.Ú_r   Nr   )Ú
isinstanceÚstrÚ
ValueErrorÚlenÚillegalCharactersÚlowerÚappendÚjoinÚmaxFileNameLengthÚsplitÚreservedFileNamesÚhandleClash1)ÚuserNameÚexistingÚprefixÚsuffixÚprefixLengthÚsuffixLengthÚfilteredUserNameÚ	characterÚsliceLengthÚpartsÚpartÚfullNames               r   ÚuserNameToFileNamer,       sF  € ôD �h¤Ô$ÜÐCÓDÐDä�v“;€LÜ�v“;€Lñ �h˜q‘k SÒ(Ø˜ ! "˜Ñ%ˆàÐØò +ˆ	àÔ)Ñ)Ø‰Ià˜)Ÿ/™/Ó+Ò+Ø˜ÑˆIØ×Ñ 	Õ*ð+ð �w‰wÐ'Ó(€Hä# lÑ2°\ÑA€KØ˜˜Ð%€Hà€EØ—‘˜sÓ#ò ˆØ�:‰:‹<Ô,Ñ,Ø˜‘:ˆDØ�‰�TÕðð �x‰x˜‹€Hà˜Ñ  6Ñ)€HØ‡~�~Ó˜8Ñ#Ü ¨(°F¸FÓCˆà€Or   c                 óf  — t        |«      }t        |«      }|t        | «      z   |z   dz   t        kD  r"|t        | «      z   |z   dz   }t        |z
  }| d| } d}d}	|€H| t        |	«      j                  d«      z   }
||
z   |z   }|j	                  «       |vr|}n|	dz  }	|	dk\  rn|€ŒH|€t        |||«      }|S )aO  
    existing should be a case-insensitive list
    of all existing file names.

    >>> prefix = ("0" * 5) + "."
    >>> suffix = "." + ("0" * 10)
    >>> existing = ["a" * 5]

    >>> e = list(existing)
    >>> handleClash1(userName="A" * 5, existing=e,
    ...		prefix=prefix, suffix=suffix) == (
    ... 	'00000.AAAAA000000000000001.0000000000')
    True

    >>> e = list(existing)
    >>> e.append(prefix + "aaaaa" + "1".zfill(15) + suffix)
    >>> handleClash1(userName="A" * 5, existing=e,
    ...		prefix=prefix, suffix=suffix) == (
    ... 	'00000.AAAAA000000000000002.0000000000')
    True

    >>> e = list(existing)
    >>> e.append(prefix + "AAAAA" + "2".zfill(15) + suffix)
    >>> handleClash1(userName="A" * 5, existing=e,
    ...		prefix=prefix, suffix=suffix) == (
    ... 	'00000.AAAAA000000000000001.0000000000')
    True
    é   Nr   l   ÿŒIú5 )r   r   r   Úzfillr   ÚhandleClash2)r    r!   r"   r#   r$   r%   Úlr(   Ú	finalNameÚcounterÚnamer+   s               r   r   r   ˆ   sæ   € ô> �v“;€LÜ�v“;€LØ”c˜(“mÑ# lÑ2°RÑ7Ô:KÒKØœ3˜x›=Ñ(¨<Ñ7¸"Ñ<ˆÜ'¨!Ñ+ˆØ˜L˜[Ð)ˆØ€Ià€GØ
Ð
Øœ#˜g›,×,Ñ,¨RÓ0Ñ0ˆØ˜D‘= 6Ñ)ˆØ�>‰>Ó 8Ñ+Ø ˆIØà�q‰LˆGØ�oÒ%Øð Ñ
ð ÐÜ  ¨6°6Ó:ˆ	àÐr   c                 óì   — t         t        |«      z
  t        |«      z
  }t        d|z  «      }d}d}|€4|t        |«      z   |z   }|j	                  «       | vr|}n|dz  }||k\  rn|€Œ4|€t        d«      ‚|S )aÄ  
    existing should be a case-insensitive list
    of all existing file names.

    >>> prefix = ("0" * 5) + "."
    >>> suffix = "." + ("0" * 10)
    >>> existing = [prefix + str(i) + suffix for i in range(100)]

    >>> e = list(existing)
    >>> handleClash2(existing=e, prefix=prefix, suffix=suffix) == (
    ... 	'00000.100.0000000000')
    True

    >>> e = list(existing)
    >>> e.remove(prefix + "1" + suffix)
    >>> handleClash2(existing=e, prefix=prefix, suffix=suffix) == (
    ... 	'00000.1.0000000000')
    True

    >>> e = list(existing)
    >>> e.remove(prefix + "2" + suffix)
    >>> handleClash2(existing=e, prefix=prefix, suffix=suffix) == (
    ... 	'00000.2.0000000000')
    True
    Ú9Nr   zNo unique name could be found.)r   r   Úintr   r   r   )r!   r"   r#   Ú	maxLengthÚmaxValuer2   r3   r+   s           r   r0   r0   Á   s™   € ô6 "¤C¨£KÑ/´#°f³+Ñ=€IÜ�3˜‘?Ó#€Hà€IØ€GØ
Ð
ØœC ›LÑ(¨6Ñ1ˆØ�>‰>Ó 8Ñ+Ø ˆIØà�q‰LˆGØ�hÒØð Ñ
ð ÐÜ"Ð#CÓDÐDàÐr   Ú__main__r   N)Ú__doc__r   r   ÚrangeÚchrr   r   r   Ú	Exceptionr   r,   r   r0   r	   ÚdoctestÚsysÚexitÚtestmodÚfailed)Úis   0r   ú<module>rE      s   ðñð& 3×8Ñ8¸Ó=Ð Ø ¡e¨A¨r£lÖ3 ‘c˜!•fÒ3Ñ 3Ð Ø ‘c˜$“i�[Ñ  Ð Ø7×=Ñ=Ó?×EÑEÀcÓJÐ Ø Ð4×:Ñ:Ó<×BÑBÀ3ÓGÑ GÐ ØÐ ô	˜9ô 	ð +-°RÀó eðP %'¨r¸"ó 6ðr  R°ó -ð` ˆzÒÛÛà€C‡H�Hˆ_ˆW�_‰_Ó×%Ñ%Õ&ð	 ùòy 4s    C