ó
    ˆŽ¡j	 ã                   óF  • S r SSKrSSKJr  SSKJr  SSKrSSKJr  SSKJ	r
  SSKJr  SS	KJrJr  SS
KJr  SSKJr  SSKJr  SSKJrJr  SSKJrJr  SSKJr  SSKJrJ r J!r!J"r"  SSK#J$r$  SSK%J&r&  SSK'J(r(  \"RR                  " \*5      r+\!\ " S S\5      5       5       r, " S S5      r-\!\ " S S\5      5       5       r.\!\ " S S\5      5       5       r/ " S S\R`                  5      r1 " S S \R`                  5      r2 " S! S"\R`                  5      r3 " S# S$\R`                  5      r4 " S% S&\R`                  5      r5 " S' S(\R`                  5      r6S) r7SPS* jr8 " S+ S,\R`                  5      r9S-\Rt                  S.\;S/\Rt                  4S0 jr< SQS1\R`                  S2\Rt                  S3\Rt                  S4\Rt                  S5\Rt                  S-  S6\=S7\=S8\\    4S9 jjr> " S: S;\R`                  5      r? " S< S=\5      r@ " S> S?\R`                  5      rA " S@ SA\R`                  5      rB " SB SC\R`                  5      rC " SD SE\R`                  5      rD " SF SG\R`                  5      rE " SH SI\R`                  5      rF\! " SJ SK\5      5       rG\!" SLSM9 " SN SO\G5      5       rHSOSK/rIg)RzPyTorch Mimi model.é    N)ÚCallable)Ú	dataclass)Únné   )Úinitialization)ÚACT2FN)ÚCacheÚDynamicCache)Ú!create_sliding_window_causal_mask)ÚGradientCheckpointingLayer)ÚBaseModelOutputWithPast)ÚROPE_INIT_FUNCTIONSÚdynamic_rope_update)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)ÚModelOutputÚTransformersKwargsÚauto_docstringÚlogging)Údeprecate_kwarg)Úmaybe_autocasté   )Ú
MimiConfigc                   ó’   • \ rS rSr% SrSr\R                  S-  \S'   Sr	\R                  S-  \S'   Sr\S-  \S'   Sr\S-  \S'   Srg)	Ú
MimiOutputé)   a  
audio_codes (`torch.LongTensor`  of shape `(batch_size, num_quantizers, codes_length)`, *optional*):
    Discrete code embeddings computed using `model.encode`.
audio_values (`torch.FloatTensor` of shape `(batch_size, sequence_length)`, *optional*):
    Decoded audio values, obtained using the decoder part of Mimi.
encoder_past_key_values (`Cache`, *optional*):
    Pre-computed hidden-states (key and values in the self-attention blocks) that can be used to speed up sequential decoding of the encoder transformer.
    This typically consists in the `past_key_values` returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`.

    The model will output the same cache format that is fed as input.

    If `past_key_values` are used, the user can optionally input only the last `audio_values` or `audio_codes (those that don't
    have their past key value states given to this model).
decoder_past_key_values (`Cache`, *optional*):
    Pre-computed hidden-states (key and values in the self-attention blocks) that can be used to speed up sequential decoding of the decoder transformer.
    This typically consists in the `past_key_values` returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`.

    The model will output the same cache format that is fed as input.

    If `past_key_values` are used, the user can optionally input only the last `audio_values` or `audio_codes (those that don't
    have their past key value states given to this model).
NÚaudio_codesÚaudio_valuesÚencoder_past_key_valuesÚdecoder_past_key_values© )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   ÚtorchÚ
LongTensorÚ__annotations__r   ÚFloatTensorr    r	   r!   Ú__static_attributes__r"   ó    Ú´C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\transformers/models/mimi/modeling_mimi.pyr   r   )   sQ   ‡ ñð. ,0€K�×!Ñ! DÑ(Ó/Ø-1€L�%×#Ñ# dÑ*Ó1Ø,0Ð˜U T™\Ó0Ø,0Ð˜U T™\Ö0r-   r   c            	       ó�   • \ rS rSrSrS\S\\   S\\   S\\   4S jrS\	R                  S	\4S
 jrS\	R                  S	\4S jrSrg)ÚMimiConv1dPaddingCacheéI   a{  
Padding cache for MimiConv1d causal convolutions in order to support streaming via cache padding.
See: https://huggingface.co/papers/2005.06720 & https://huggingface.co/papers/2204.07064

A padding cache is a list of cached partial hidden states for each convolution layer.
Hidden states are cached from the previous call to the MimiConv1d forward pass, given the padding size.
Ú
num_layersÚper_layer_paddingÚper_layer_padding_modeÚper_layer_in_channelsc                 óâ   • [        U5      [        U5      [        U5      1n[        U5      S:w  d  UR                  5       U:w  a  [        SU S35      eX l        X0l        X@l        S /U-  U l        g )Nr   zExpected `num_layers` (zU) values in `per_layer_padding`, `per_layer_padding_mode` and `per_layer_in_channels`)ÚlenÚpopÚ
ValueErrorr3   r4   r5   Úpadding_cache)Úselfr2   r3   r4   r5   Úfrom_args_num_layerss         r.   Ú__init__ÚMimiConv1dPaddingCache.__init__R   s†   € ô !$Ð$5Ó 6¼Ð<RÓ8SÔUXÐYnÓUoÐpÐäÐ#Ó$¨Ó)Ð-A×-EÑ-EÓ-GÈ:Ó-UÜØ)¨*¨ð  6Kð  Lóð ð "3ÔØ&<Ô#Ø%:Ô"à"˜V jÑ0ˆÕr-   Úhidden_statesÚ	layer_idxc                 óP  • UR                   S   UR                  UR                  pTnU R                  U   U R                  U   U R
                  U   p‡nUS:X  a  [        R                  " X8XeUS9n	U	$ US:X  a"  [        R                  " X8XeUS9USSS24   -  n	U	$ [        SU S	35      e)
a  
Initialize the cache for a specific layer.

Parameters:
    hidden_states (`torch.Tensor`):
        The hidden states to initialize the cache with.
    layer_idx (`int`):
        The index of the layer to initialize the cache for.
Returns:
    `torch.Tensor`, the initialized cache.
r   Úconstant)ÚdeviceÚdtypeÚ	replicate.Nr   zPadding mode z not supported)
ÚshaperD   rC   r3   r4   r5   r(   ÚzerosÚonesÚNotImplementedError)
r;   r?   r@   Ú
batch_sizerD   rC   ÚpaddingÚpadding_modeÚin_channelsÚcurrent_caches
             r.   Ú_cache_initÚ"MimiConv1dPaddingCache._cache_initg   sÓ   € ð %2×$7Ñ$7¸Ñ$:¸M×<OÑ<OÐQ^×QeÑQe˜6ˆ
à×"Ñ" 9Ñ-Ø×'Ñ'¨	Ñ2Ø×&Ñ& yÑ1ð  +ˆð ˜:Ó%Ü!ŸKšK¨
ÀÐ_dÑeˆMð Ðð ˜[Ó(ä—
’
˜:°GÐRWÑXÐ[hÐilÐnpÐopÐnpÐipÑ[qÑqð ð Ðô &¨°l°^À>Ð&RÓSÐSr-   c                 óî  • UR                   S   UR                  UR                  pTnU R                  U   U R                  U   pvU R
                  U   c  U R                  X5      nOU R
                  U   nUS:”  aV  [        SXaR                   S   -
  5      n	U	S:”  a%  [        R                  " USS2SS2U	* S24   U/SS9n
O&USS2SS2U* S24   n
O[        R                  " X7SXES9n
X R
                  U'   U$ )ad  
Updates the padding cache with the new padding states for the layer `layer_idx` and returns the current cache.

Parameters:
    hidden_states (`torch.Tensor`):
        The hidden states to be partially cached.
    layer_idx (`int`):
        The index of the layer to cache the states for.
Returns:
    `torch.Tensor` or `None`, the current padding cache.
r   Néÿÿÿÿ©Údim©rD   rC   )rF   rD   rC   r3   r5   r:   rO   Úmaxr(   ÚcatÚempty)r;   r?   r@   rJ   rD   rC   rK   rM   rN   Ú	shortfallÚpadding_statess              r.   ÚupdateÚMimiConv1dPaddingCache.update…   s   € ð %2×$7Ñ$7¸Ñ$:¸M×<OÑ<OÐQ^×QeÑQe˜6ˆ
Ø#×5Ñ5°iÑ@À$×B\ÑB\Ð]fÑBg�à×Ñ˜iÑ(Ñ0Ø ×,Ñ,¨]ÓF‰Mà ×.Ñ.¨yÑ9ˆMð �Q‹;Ü˜A˜w×)<Ñ)<¸RÑ)@Ñ@ÓAˆIØ˜1‹}Ü!&§¢¨Mº!ºQÀÀ
ÁÐ:KÑ,LÈmÐ+\ÐbdÑ!e‘à!.ªq²!°g°X±Y¨Ñ!?‘ä"Ÿ[š[¨À!È5Ñ`ˆNà(6×Ñ˜9Ñ%ØÐr-   )r:   r5   r3   r4   N)r#   r$   r%   r&   r'   ÚintÚlistÚstrr=   r(   ÚTensorrO   r[   r,   r"   r-   r.   r0   r0   I   sl   † ñð1àð1ð   ™9ð1ð !% S¡	ð	1ð
  $ C™yô1ð*¨¯©ð À#ô ð< E§L¡Lð ¸S÷ r-   r0   c                   ój   • \ rS rSr% SrSr\R                  S-  \S'   Sr	\
S-  \S'   Sr\S-  \S'   Srg)ÚMimiEncoderOutputé§   a¨  
audio_codes (`torch.LongTensor`  of shape `(batch_size, num_quantizers, codes_length)`, *optional*):
    Discrete code embeddings computed using `model.encode`.
encoder_past_key_values (`Cache`, *optional*):
    Pre-computed hidden-states (key and values in the self-attention blocks) that can be used to speed up sequential decoding of the encoder transformer.
    This typically consists in the `past_key_values` returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`.

    The model will output the same cache format that is fed as input.

    If `past_key_values` are used, the user can optionally input only the last `audio_values` or `audio_codes (those that don't
    have their past key value states given to this model).
padding_cache (`MimiConv1dPaddingCache`, *optional*):
    Padding cache for MimiConv1d causal convolutions in order to support streaming via cache padding.
Nr   r    r:   r"   )r#   r$   r%   r&   r'   r   r(   r)   r*   r    r	   r:   r0   r,   r"   r-   r.   rb   rb   §   s=   ‡ ñð ,0€K�×!Ñ! DÑ(Ó/Ø,0Ð˜U T™\Ó0Ø37€MÐ)¨DÑ0Ö7r-   rb   c                   óV   • \ rS rSr% SrSr\R                  S-  \S'   Sr	\
S-  \S'   Srg)ÚMimiDecoderOutputé¾   a  
audio_values (`torch.FloatTensor`  of shape `(batch_size, segment_length)`, *optional*):
    Decoded audio values, obtained using the decoder part of Mimi.
decoder_past_key_values (`Cache`, *optional*):
    Pre-computed hidden-states (key and values in the self-attention blocks) that can be used to speed up sequential decoding of the decoder transformer.
    This typically consists in the `past_key_values` returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`.

    The model will output the same cache format that is fed as input.

    If `past_key_values` are used, the user can optionally input only the last `audio_values` or `audio_codes (those that don't
    have their past key value states given to this model).
Nr   r!   r"   )r#   r$   r%   r&   r'   r   r(   r+   r*   r!   r	   r,   r"   r-   r.   re   re   ¾   s-   ‡ ñð .2€L�%×#Ñ# dÑ*Ó1Ø,0Ð˜U T™\Ö0r-   re   c                   ó@  ^ • \ rS rSrSr      SS\S\S\S\S\S	\S
\S-  S\S\S-  4U 4S jjjrS r	S r
S\R                  S\R                  4S jr\SS\R                  S\\\4   S\S\4S jj5       rS\R$                  S\R$                  4S jrSS jrSrU =r$ )Ú
MimiConv1déÒ   z;Conv1d with asymmetric or causal padding and normalization.NrM   Úout_channelsÚkernel_sizeÚstrideÚdilationÚgroupsÚpad_modeÚbiasr@   c           
      óJ  >• [         TU ]  5         UR                  U l        Uc  UR                  OUU l        X l        X l        US:”  a%  US:”  a  [        R                  SU SU SU S35        [        R                  " X#XEXgU	S9U l        U R                  R                  S   n[        R                  " U R                  R                  S   [        R                   S9nU R                  R"                  S   n[        R                  " US-
  U-  S-   [        R                   S9n[        R$                  " US	S
9U l        [        R$                  " US	S
9U l        [        R$                  " XE-
  S	S
9U l        U R&                  S-  U l        U R&                  U R(                  -
  U l        g )Nr   zNMimiConv1d has been initialized with stride > 1 and dilation > 1 (kernel_size=z stride=z, dilation=ú).)rm   rn   rp   r   ©rD   F©Ú
persistenté   )Úsuperr=   Úuse_causal_convÚcausalro   r@   rM   ÚloggerÚwarningr   ÚConv1dÚconvrk   r(   Útensorrl   Úint64rm   ÚBufferÚpadding_totalÚpadding_rightÚpadding_left)r;   ÚconfigrM   rj   rk   rl   rm   rn   ro   rp   r@   Ú	__class__s              €r.   r=   ÚMimiConv1d.__init__Õ   sj  ø€ ô 	‰ÑÔØ×,Ñ,ˆŒØ+3Ñ+;˜ŸšÀˆŒØ"ŒØ&Ôð �A‹:˜( Q›,Ü�N‰Nð!Ø!, ¨X°f°X¸[ÈÈ
ÐRTðVôô
 —I’IØ {ÀXÐcgñ
ˆŒ	ð —i‘i×+Ñ+¨AÑ.ˆÜ—’˜dŸi™i×.Ñ.¨qÑ1¼¿¹ÑEˆØ—9‘9×%Ñ% aÑ(ˆô —l’l K°!¡O°xÑ#?À!Ñ#CÌ5Ï;É;ÑWˆä—i’i °5Ñ9ˆŒÜŸ9š9 [¸UÑCˆÔÜŸYšY {Ñ';ÈÑNˆÔð "×/Ñ/°1Ñ4ˆÔØ ×.Ñ.°×1CÑ1CÑCˆÕr-   c                 óö   • [         R                  R                  n[        [         R                  R                  S5      (       a$  [         R                  R                  R                  nU" U R
                  5        g ©NÚweight_norm©r   Úutilsr‰   ÚhasattrÚparametrizationsr}   ©r;   r‰   s     r.   Úapply_weight_normÚMimiConv1d.apply_weight_norm  óI   € Ü—h‘h×*Ñ*ˆÜ”2—8‘8×,Ñ,¨m×<Ñ<ÜŸ(™(×3Ñ3×?Ñ?ˆKá�D—I‘IÕr-   c                 óV   • [         R                  R                  U R                  5        g ©N©r   r‹   Úremove_weight_normr}   ©r;   s    r.   r•   ÚMimiConv1d.remove_weight_norm	  ó   € Ü
�‰×#Ñ# D§I¡IÕ.r-   r?   Úreturnc                 ó:  • UR                   S   nX R                  -
  U R                  -   U R                  -  S-   n[        R
                  " U5      R                  [        R                  5      S-
  nX0R                  -  U R                  -   U R                  -
  nXB-
  $ )zSee `pad_for_conv1d`.rR   r   )rF   rk   r�   rl   r(   ÚceilÚtor   )r;   r?   ÚlengthÚn_framesÚideal_lengths        r.   Ú_get_extra_padding_for_conv1dÚ(MimiConv1d._get_extra_padding_for_conv1d  s‰   € ð
 ×$Ñ$ RÑ(ˆØ×-Ñ-Ñ-°×0BÑ0BÑBÀdÇkÁkÑQÐTUÑUˆÜ—:’:˜hÓ'×*Ñ*¬5¯;©;Ó7¸!Ñ;ˆØ§+¡+Ñ-°×0@Ñ0@Ñ@À4×CUÑCUÑUˆàÑ$Ð$r-   ÚpaddingsÚmodeÚvaluec                 ó`  • U R                   S   nUu  pVUS:w  a   [        R                  R                  XX#5      $ [	        XV5      nSnXG::  a)  Xt-
  S-   n[        R                  R                  U SU45      n [        R                  R                  XX#5      n	U	R                   S   U-
  n
U	SSU
24   $ )zºTiny wrapper around torch.nn.functional.pad, just to allow for reflect padding on small input.
If this is the case, we insert extra 0 padding to the right before the reflection happens.
rR   Úreflectr   r   .N)rF   r   Ú
functionalÚpadrV   )r?   r¢   r£   r¤   r�   rƒ   r‚   Úmax_padÚ	extra_padÚpaddedÚends              r.   Ú_pad1dÚMimiConv1d._pad1d  s³   € ð ×$Ñ$ RÑ(ˆØ&.Ñ#ˆØ�9ÓÜ—=‘=×$Ñ$ ]¸dÓJÐJä�lÓ2ˆØˆ	ØÓØÑ(¨1Ñ,ˆIÜŸM™M×-Ñ-¨m¸aÀ¸^ÓLˆMÜ—‘×"Ñ" =¸DÓHˆØ�l‰l˜2Ñ Ñ*ˆØ�c˜4˜C˜4�iÑ Ð r-   Úinput_lengthc                 ó�  • XR                   -
  U R                  -   U R                  -  S-   n[        R                  " U5      R                  [        R                  5      S-
  nX R                  -  U R                   -   U R                  -
  nX1-
  nU R                  (       a  U R                  nUnOU R                  nU R                  U-   nX-   U-   nUSU R                  R                  S   -  -   U R                  R                  S   U R                  R                   S   S-
  -  -
  S-
  U R                  R                  S   -  S-   nU$ )z4
Return the length of the output of the MimiConv1d.
r   rv   r   )rk   r�   rl   r(   r›   rœ   r   ry   rƒ   r‚   r}   rK   rm   )r;   r¯   rž   rŸ   Úextra_paddingrƒ   r‚   Úoutput_lengths           r.   Ú_get_output_lengthÚMimiConv1d._get_output_length-  s5  € ð
 !×#3Ñ#3Ñ3°d×6HÑ6HÑHÈDÏKÉKÑWÐZ[Ñ[ˆÜ—:’:˜hÓ'×*Ñ*¬5¯;©;Ó7¸!Ñ;ˆØ§+¡+Ñ-°×0@Ñ0@Ñ@À4×CUÑCUÑUˆØ$Ñ3ˆà�;�;Ø×-Ñ-ˆLØ)‰Mà×,Ñ,ˆLØ ×.Ñ.°Ñ>ˆMð $Ñ2°]ÑBˆð ˜1˜tŸy™y×0Ñ0°Ñ3Ñ3Ñ3°d·i±i×6HÑ6HÈÑ6KÈtÏyÉy×OdÑOdÐefÑOgÐjkÑOkÑ6lÑlÐopÑpØ�Y‰Y×Ñ˜aÑ ñ!à#$ñ%ˆð Ðr-   c                 óê  • U R                  U5      nU R                  (       d  Ub  [        S5      eU R                  (       a5  Ub2  UR                  XR                  5      n[
        R                  " XA/SS9nOkU R                  (       a'  U R                  XR                  U4U R                  S9nO3U R                  XR                  U R                  U-   4U R                  S9nU R                  U5      nU$ )Nz=`padding_cache` is not supported for non-causal convolutions.rv   rS   )r£   )r    ry   r9   r[   r@   r(   rW   r­   r�   ro   rƒ   r‚   r}   )r;   r?   r:   r±   Úlayer_padding_caches        r.   ÚforwardÚMimiConv1d.forwardG  sØ   € Ø×:Ñ:¸=ÓIˆà�{�{˜}Ñ8ÜÐ\Ó]Ð]à�;�;˜=Ñ4Ø"/×"6Ñ"6°}ÇnÁnÓ"UÐÜ!ŸIšIÐ':Ð&JÐPQÑR‰Mà�[�[à ŸK™K¨×8JÑ8JÈMÐ7ZÐae×anÑan˜KÐo‰Mð !ŸK™KØ× 1Ñ 1°4×3EÑ3EÈÑ3UÐVÐ]a×]jÑ]jð (ð ˆMð Ÿ	™	 -Ó0ˆØÐr-   )
ry   r}   rM   rk   r@   ro   rƒ   r‚   r�   rl   )r   r   r   NTN)Úzeroç        r“   )r#   r$   r%   r&   r'   r]   r_   Úboolr=   r�   r•   r(   r`   r    ÚstaticmethodÚtupleÚfloatr­   r)   r³   r·   r,   Ú__classcell__©r…   s   @r.   rh   rh   Ò   s!  ø† ÙEð ØØØ#ØØ $ñ+Dð ð+Dð ð	+Dð
 ð+Dð ð+Dð ð+Dð ð+Dð ˜‘*ð+Dð ð+Dð ˜‘:÷+Dð +DòZò/ð
%à—|‘|ð
%ð 
�‰ô
%ð ñ!˜eŸl™lð !°e¸CÀ¸H±oð !ÈSð !Ðbgô !ó ð!ð$¨u×/?Ñ/?ð ÀE×DTÑDTô ÷4ò r-   rh   c                   ó`   ^ • \ rS rSrSr   SS\S\S\S\S\4
U 4S jjjrS	 rS
 rS r	Sr
U =r$ )ÚMimiConvTranspose1di^  zDConvTranspose1d with asymmetric or causal padding and normalization.rM   rj   rk   rl   rn   c           	      ó  >• [         T	U ]  5         UR                  U l        UR                  U l        [
        R                  " X#XEXgS9U l        U R                  (       d  U R                  S:X  d  [        S5      eU R                  R                  S   nU R                  R                  S   nXE-
  nU R                  (       a(  [        R                  " X€R                  -  5      U l        O
US-  U l        X€R                  -
  U l        g )N)rn   rp   ç      ð?zB`trim_right_ratio` != 1.0 only makes sense for causal convolutionsr   rv   )rw   r=   rx   ry   Útrim_right_ratior   ÚConvTranspose1dr}   r9   rk   rl   Úmathr›   r‚   rƒ   )
r;   r„   rM   rj   rk   rl   rn   rp   r�   r…   s
            €r.   r=   ÚMimiConvTranspose1d.__init__a  s×   ø€ ô 	‰ÑÔØ×,Ñ,ˆŒØ &× 7Ñ 7ˆÔÜ×&Ò& {À+Ð^dÑpˆŒ	à——˜t×4Ñ4¸Ó;ÜÐaÓbÐbà—i‘i×+Ñ+¨AÑ.ˆØ—‘×!Ñ! !Ñ$ˆØ#Ñ,ˆð �;�;ô "&§¢¨=×;PÑ;PÑ+PÓ!QˆDÕð "/°!Ñ!3ˆDÔà)×,>Ñ,>Ñ>ˆÕr-   c                 óö   • [         R                  R                  n[        [         R                  R                  S5      (       a$  [         R                  R                  R                  nU" U R
                  5        g rˆ   rŠ   rŽ   s     r.   r�   Ú%MimiConvTranspose1d.apply_weight_norm…  r‘   r-   c                 óV   • [         R                  R                  U R                  5        g r“   r”   r–   s    r.   r•   Ú&MimiConvTranspose1d.remove_weight_normŒ  r˜   r-   c                 ó†   • U R                  U5      nUR                  S   U R                  -
  nUSU R                  U24   nU$ )NrR   .)r}   rF   r‚   rƒ   )r;   r?   r¬   s      r.   r·   ÚMimiConvTranspose1d.forward�  sM   € ØŸ	™	 -Ó0ˆð ×!Ñ! "Ñ%¨×(:Ñ(:Ñ:ˆØ% c¨4×+<Ñ+<¸sÐ+BÐ&BÑCˆØÐr-   )ry   r}   rƒ   r‚   rÅ   )r   r   T)r#   r$   r%   r&   r'   r]   r=   r�   r•   r·   r,   r¿   rÀ   s   @r.   rÂ   rÂ   ^  sb   ø† ÙNð ØØñ"?ð ð"?ð ð	"?ð
 ð"?ð ð"?ð ÷"?ð "?òHò/÷ð r-   rÂ   c                   óL   ^ • \ rS rSrSrS\S\S\\   4U 4S jjrS	S jr	Sr
U =r$ )
ÚMimiResnetBlocki˜  z3
Residual block from SEANet model as used by Mimi.
r„   rT   Ú	dilationsc           
      ó"  >• [         TU ]  5         UR                  S4n[        U5      [        U5      :w  a  [	        S5      eX!R
                  -  n/ n[        [        XC5      5       HP  u  nu  p‰US:X  a  UOUn
U[        U5      S-
  :X  a  UOUnU[        R                  " 5       /-  nU[        XX¸U	S9/-  nMR     [        R                  " U5      U l        UR                  (       a  [        XUSS9U l        g [        R                  " 5       U l        g )Nr   z7Number of kernel sizes should match number of dilationsr   )rm   )rk   )rw   r=   Úresidual_kernel_sizer7   r9   ÚcompressÚ	enumerateÚzipr   ÚELUrh   Ú
ModuleListÚblockÚuse_conv_shortcutÚshortcutÚIdentity)r;   r„   rT   rÑ   Úkernel_sizesÚhiddenrÙ   Úirk   rm   Úin_chsÚout_chsr…   s               €r.   r=   ÚMimiResnetBlock.__init__�  sï   ø€ Ü‰ÑÔØ×3Ñ3°QÐ7ˆÜˆ|Ó¤ I£Ó.ÜÐVÓWÐWàŸ™Ñ'ˆØˆÜ*3´C¸Ó4PÖ*QÑ&ˆAÑ&�Ø ›F‘S¨ˆFØ¤# lÓ"3°aÑ"7Ó7‘c¸VˆGØ”b—f’f“h�ZÑˆEØ”j °ÐPXÑYÐZÑZŠEñ	 +Rô
 —]’] 5Ó)ˆŒ
à×#×#Ü& v°CÀQÑGˆD�MäŸKšK›MˆD�Mr-   c                 ó  • UnU R                    H(  n[        U[        5      (       a  U" XS9nM   U" U5      nM*     [        U R                  [        5      (       a  U R                  X2S9nX1-   $ U R                  U5      nX1-   $ ©N©r:   )rÙ   Ú
isinstancerh   rÛ   )r;   r?   r:   ÚresidualÚlayers        r.   r·   ÚMimiResnetBlock.forward±  s}   € Ø ˆà—Z”ZˆEÜ˜%¤×,Ñ,Ù % mÑ Q’á % mÓ 4’ñ	  ô �d—m‘m¤Z×0Ñ0Ø—}‘} X�}ÐKˆHð Ñ'Ð'ð —}‘} XÓ.ˆHàÑ'Ð'r-   )rÙ   rÛ   r“   )r#   r$   r%   r&   r'   r   r]   r^   r=   r·   r,   r¿   rÀ   s   @r.   rÐ   rÐ   ˜  s0   ø† ñð*˜zð *°ð *ÀÀSÁ	÷ *÷((ò (r-   rÐ   c                   ó>   ^ • \ rS rSrSrS\4U 4S jjrSS jrSrU =r	$ )ÚMimiEncoderiÂ  zSEANet encoder as used by Mimi.r„   c           
      óÔ  >• [         TU ]  5         [        XR                  UR                  UR
                  5      /nSnS/n[        UR                  5       HÊ  nX1R                  -  n[        UR                  5       HO  nUR                  S[        U5       S3S[        U5       S3/5        U[        XUR                  U-  S/5      /-  nMQ     U[        R                  " 5       /-  nUR!                  S[        U5       35        U[        XUS-  US-  US9/-  nUS-  nMÌ     U[        R                  " 5       /-  nUR!                  S[        U5       35        U[        XUR                  -  UR"                  UR$                  5      /-  n[        R&                  " U5      U l        X@l        [-        U R*                  5       H#  u  p‰U R/                  U	5      n
[1        U
SU5        M%     g )	Nr   zlayers.0zlayers.z.block.1z.block.3rv   ©rk   rl   r@   )rw   r=   rh   Úaudio_channelsÚnum_filtersrk   ÚreversedÚupsampling_ratiosÚrangeÚnum_residual_layersÚextendr7   rÐ   Údilation_growth_rater   r×   ÚappendÚhidden_sizeÚlast_kernel_sizerØ   ÚlayersÚ_mimiconv1d_layer_namesrÕ   Úget_submoduleÚsetattr)r;   r„   ÚmodelÚscalingÚmimiconv1d_layer_namesÚratioÚcurrent_scaleÚjr@   Ú	layernameÚ
conv_layerr…   s              €r.   r=   ÚMimiEncoder.__init__Å  sÖ  ø€ Ü‰ÑÔÜ˜F×$9Ñ$9¸6×;MÑ;MÈv×OaÑOaÓbÐcˆØˆð #- Ðô ˜f×6Ñ6Ö7ˆEØ#×&8Ñ&8Ñ8ˆMä˜6×5Ñ5Ö6�Ø&×-Ñ-°¼¸U»¸ÀHÐ/MÐQXÔY\Ð]bÓYcÐXdÐdlÐOmÐ.nÔoØœ/¨&À&×B]ÑB]Ð_`ÑB`ÐbcÐAdÓeÐfÑf’ñ 7ð ”b—f’f“h�ZÑˆEØ"×)Ñ)¨G´C¸³J°<Ð*@ÔAØ”j ¸ÈÑ8IÐW\Ð_`ÑW`ÐinÑoÐpÑpˆEØ�q‰LŠGñ 8ð 	”"—&’&“(�ÑˆØ×%Ñ%¨´°E³
¨|Ð&<Ô=Ø”*˜V¨v×/AÑ/AÑ%AÀ6×CUÑCUÐW]×WnÑWnÓoÐpÑpˆä—m’m EÓ*ˆŒØ'=Ô$ô %.¨d×.JÑ.JÖ$KÑ ˆIØ×+Ñ+¨IÓ6ˆJÜ�J ¨YÖ7ò %Lr-   c                 ó‚   • U R                    H.  n[        U[        [        45      (       a  U" XS9nM&  U" U5      nM0     U$ rä   )rù   ræ   rh   rÐ   )r;   r?   r:   rè   s       r.   r·   ÚMimiEncoder.forwardæ  s>   € Ø—[”[ˆEÜ˜%¤*¬oÐ!>×?Ñ?Ù % mÑ Q’á % mÓ 4’ñ	 !ð
 Ðr-   )rú   rù   r“   ©
r#   r$   r%   r&   r'   r   r=   r·   r,   r¿   rÀ   s   @r.   rë   rë   Â  s   ø† Ù)ð8˜z÷ 8÷Bò r-   rë   c                   óN   ^ • \ rS rSrSrU 4S jrS\R                  4S jrSr	U =r
$ )ÚMimiLayerScaleiï  z¡Layer scale from [Touvron et al 2021] (https://huggingface.co/papers/2103.17239).
This rescales diagonally the residual outputs close to 0, with a learnt scale.
c                 ó²   >• [         TU ]  5         UR                  nUR                  n[        R
                  " [        R                  " U4USS95      U l        g )NT)Úrequires_grad)	rw   r=   r÷   Úlayer_scale_initial_scaler   Ú	Parameterr(   ÚfullÚscale)r;   r„   ÚchannelsÚinitial_scaler…   s       €r.   r=   ÚMimiLayerScale.__init__ô  sD   ø€ Ü‰ÑÔØ×%Ñ%ˆØ×8Ñ8ˆÜ—\’\¤%§*¢*¨h¨[¸-ÐW[Ñ"\Ó]ˆ�
r-   Úxc                 ó    • U R                   U-  $ r“   ©r  )r;   r  s     r.   r·   ÚMimiLayerScale.forwardú  s   € Ø�z‰z˜A‰~Ðr-   r  )r#   r$   r%   r&   r'   r=   r(   r`   r·   r,   r¿   rÀ   s   @r.   r
  r
  ï  s#   ø† ñõ^ð˜Ÿ™÷ ò r-   r
  c            	       óÒ   ^ • \ rS rSr\" SSS9SS\4U 4S jjj5       r\\" SSS9SS\S\\	R                  \4   4S jj5       5       r\	R                  " 5       \S	 5       5       rS
rU =r$ )ÚMimiRotaryEmbeddingiÿ  rC   z5.18)Úversionr„   c                 óÄ  >• [         TU ]  5         UR                  U l        UR                  U l        Xl        U R
                  R                  S   U l        U R                  nU R                  S:w  a  [        U R                     nU" U R
                  U5      u  o@l
        [        R                  " USS9U l        [        R                  " UR                  5       SS9U l        g )NÚ	rope_typeÚdefaultFrt   )rw   r=   Úmax_position_embeddingsÚmax_seq_len_cachedÚoriginal_max_seq_lenr„   Úrope_parametersr  Úcompute_default_rope_parametersr   Úattention_scalingr   r€   Úinv_freqÚcloneÚoriginal_inv_freq)r;   r„   rC   Úrope_init_fnr$  r…   s        €r.   r=   ÚMimiRotaryEmbedding.__init__   s¬   ø€ ä‰ÑÔØ"(×"@Ñ"@ˆÔØ$*×$BÑ$BˆÔ!àŒàŸ™×4Ñ4°[ÑAˆŒØ!%×!EÑ!EˆØ�>‰>˜YÓ&Ü.¨t¯~©~Ñ>ˆLÙ+7¸¿¹ÀVÓ+LÑ(ˆÔ(äŸ	š	 (°uÑ=ˆŒÜ!#§¢¨8¯>©>Ó+;ÈÑ!NˆÕr-   r™   c           	      ó   • U R                   S   n[        U SS5      =(       d    U R                  U R                  -  nSnSU[        R
                  " SUS[        R                  S9U-  -  -  nUR                  U5      U4$ )a~  
Computes the inverse frequencies according to the original RoPE implementation
Args:
    config ([`~transformers.PreTrainedConfig`]):
        The model configuration.
Returns:
    Tuple of (`torch.Tensor`, `float`), containing the inverse frequencies for the RoPE embeddings and the
    post-processing scaling factor applied to the computed cos/sin (unused in this type of RoPE).
Ú
rope_thetaÚhead_dimNrÄ   r   rv   rs   )r!  Úgetattrr÷   Únum_attention_headsr(   Úaranger¾   rœ   )r„   rC   ÚkwargsÚbaserT   Úattention_factorr$  s          r.   r"  Ú3MimiRotaryEmbedding.compute_default_rope_parameters  s{   € ð ×%Ñ% lÑ3ˆÜ�f˜j¨$Ó/×c°6×3EÑ3EÈ×IcÑIcÑ3cˆàÐà˜$¤5§<¢<°°3¸ÄÇÁÑ#MÐPSÑ#SÑTÑUˆØ�{‰{˜6Ó"Ð$4Ð4Ð4r-   c                 ó  • U R                   S S S 2S 4   R                  UR                  S   SS5      R                  [        R
                  UR                  S9nUS S 2S S S 24   R                  5       n[        UR                  R                  [        5      (       a0  UR                  R                  S:w  a  UR                  R                  OSn[        USS9   X4-  R                  SS	5      n[        R                  " Xf4SS
9nUR                  5       U R                  -  nUR                  5       U R                  -  n	S S S 5        WR                  UR                   S9W	R                  UR                   S94$ ! , (       d  f       N@= f)Nr   rR   r   rU   ÚmpsÚcpuF)Údevice_typeÚenabledrv   rS   rs   )r$  ÚexpandrF   rœ   r(   r¾   rC   ræ   Útyper_   r   Ú	transposerW   Úcosr#  ÚsinrD   )
r;   r  Úposition_idsÚinv_freq_expandedÚposition_ids_expandedr6  ÚfreqsÚembr;  r<  s
             r.   r·   ÚMimiRotaryEmbedding.forward%  s;  € ð �M‰M˜$¢ 4˜-Ñ(×/Ñ/°×0BÑ0BÀ1Ñ0EÀrÈ1ÓM×PÑPÔW\×WbÑWbÐkl×ksÑksÐPÐtð 	ð !-ªQ°²a¨ZÑ 8× >Ñ >Ó @Ðä'1°!·(±(·-±-Ä×'EÑ'EÈ!Ï(É(Ï-É-Ð[`ÓJ`�a—h‘h—m’mÐfkˆä¨¸UÓCØ&Ñ>×IÑIÈ!ÈQÓOˆEÜ—)’)˜U˜N°Ñ3ˆCØ—'‘'“)˜d×4Ñ4Ñ4ˆCØ—'‘'“)˜d×4Ñ4Ñ4ˆC÷	 Dð �v‰v˜AŸG™GˆvÐ$ c§f¡f°1·7±7 fÐ&;Ð;Ð;÷ DÕCús   ÃA%E7Å7
F)r#  r„   r$  r  r&  r   r  r“   )r#   r$   r%   r&   r   r   r=   r¼   r½   r(   r`   r¾   r"  Úno_gradr   r·   r,   r¿   rÀ   s   @r.   r  r  ÿ  sŒ   ø† Ù�X vÑ.ñO˜z÷ Oó /ðOð  Ù�X vÑ.ñ5°
ð 5ÐV[Ð\a×\hÑ\hÐjoÐ\oÑVpô 5ó /ó ð5ð$ ‡]‚]ƒ_Øñ<ó ó ö<r-   r  c                 ó–   • U SSU R                   S   S-  24   nU SU R                   S   S-  S24   n[        R                  " U* U4SS9$ )z*Rotates half the hidden dims of the input..NrR   rv   rS   )rF   r(   rW   )r  Úx1Úx2s      r.   Úrotate_halfrG  9  sZ   € à	
ˆ3Ð"�!—'‘'˜"‘+ Ñ"Ð"Ð"Ñ	#€BØ	
ˆ3�—‘˜‘˜qÑ Ñ"Ð"Ñ	#€BÜ�9Š9�r�c˜2�Y BÑ'Ð'r-   c                 ó˜   • UR                  U5      nUR                  U5      nX-  [        U 5      U-  -   nX-  [        U5      U-  -   nXV4$ )aI  Applies Rotary Position Embedding to the query and key tensors.

Args:
    q (`torch.Tensor`): The query tensor.
    k (`torch.Tensor`): The key tensor.
    cos (`torch.Tensor`): The cosine part of the rotary embedding.
    sin (`torch.Tensor`): The sine part of the rotary embedding.
    unsqueeze_dim (`int`, *optional*, defaults to 1):
        The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and
        sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note
        that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and
        k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes
        cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have
        the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2.
Returns:
    `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding.
)Ú	unsqueezerG  )ÚqÚkr;  r<  Úunsqueeze_dimÚq_embedÚk_embeds          r.   Úapply_rotary_pos_embrO  A  sS   € ð$ �-‰-˜Ó
&€CØ
�-‰-˜Ó
&€CØ‰wœ; q›>¨CÑ/Ñ0€GØ‰wœ; q›>¨CÑ/Ñ0€GØÐÐr-   c                   ób   ^ • \ rS rSrU 4S jrS\R                  S\R                  4S jrSrU =r	$ )ÚMimiMLPiZ  c                 ó  >• [         TU ]  5         Xl        [        UR                     U l        [        R                  " UR                  UR                  SS9U l
        [        R                  " UR                  UR                  SS9U l        g )NF©rp   )rw   r=   r„   r   Ú
hidden_actÚactivation_fnr   ÚLinearr÷   Úintermediate_sizeÚfc1Úfc2©r;   r„   r…   s     €r.   r=   ÚMimiMLP.__init__[  sh   ø€ Ü‰ÑÔØŒÜ# F×$5Ñ$5Ñ6ˆÔÜ—9’9˜V×/Ñ/°×1IÑ1IÐPUÑVˆŒÜ—9’9˜V×5Ñ5°v×7IÑ7IÐPUÑVˆ�r-   r?   r™   c                 ól   • U R                  U5      nU R                  U5      nU R                  U5      nU$ r“   )rX  rU  rY  )r;   r?   s     r.   r·   ÚMimiMLP.forwardc  s4   € ØŸ™ Ó/ˆØ×*Ñ*¨=Ó9ˆØŸ™ Ó/ˆØÐr-   )rU  r„   rX  rY  )
r#   r$   r%   r&   r=   r(   r`   r·   r,   r¿   rÀ   s   @r.   rQ  rQ  Z  s)   ø† õWð U§\¡\ð °e·l±l÷ ò r-   rQ  r?   Ún_repr™   c                 ó    • U R                   u  p#pEUS:X  a  U $ U SS2SS2SSS2SS24   R                  X#XU5      n U R                  X#U-  XE5      $ )zÈ
This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch,
num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim)
r   N)rF   r8  Úreshape)r?   r^  ÚbatchÚnum_key_value_headsÚslenr+  s         r.   Ú	repeat_kvrd  k  s_   € ð
 2?×1DÑ1DÑ.€E Ø�ƒzØÐØ!¢!¢Q¨ªa²Ð"2Ñ3×:Ñ:¸5ÐW\ÐdlÓm€MØ× Ñ  ¸eÑ(CÀTÓTÐTr-   ÚmoduleÚqueryÚkeyr¤   Úattention_maskrþ   Údropoutr/  c                 ó  • [        X R                  5      n[        X0R                  5      n	[        R                  " XR	                  SS5      5      U-  n
Ub  X¤-   n
[
        R                  R                  U
S[        R                  S9R                  UR                  5      n
[
        R                  R                  X¦U R                  S9n
[        R                  " X©5      nUR	                  SS5      R                  5       nXº4$ )Nrv   r   rR   )rT   rD   )ÚpÚtrainingr   )rd  Únum_key_value_groupsr(   Úmatmulr:  r   r§   ÚsoftmaxÚfloat32rœ   rD   ri  rl  Ú
contiguous)re  rf  rg  r¤   rh  rþ   ri  r/  Ú
key_statesÚvalue_statesÚattn_weightsÚattn_outputs               r.   Úeager_attention_forwardrv  x  sÒ   € ô ˜3× ;Ñ ;Ó<€JÜ˜U×$?Ñ$?Ó@€Lä—<’< ×';Ñ';¸A¸qÓ'AÓBÀWÑL€LØÑ!Ø#Ñ4ˆä—=‘=×(Ñ(¨¸2ÄUÇ]Á]Ð(ÐS×VÑVÐW\×WbÑWbÓc€LÜ—=‘=×(Ñ(¨È6Ï?É?Ð(Ð[€LÜ—,’,˜|Ó:€KØ×'Ñ'¨¨1Ó-×8Ñ8Ó:€KàÐ$Ð$r-   c                   ó  ^ • \ rS rSrSrSS\S\S-  4U 4S jjjr   SS\R                  S\R                  S-  S	\
S-  S
\\R                  \R                  4   S-  S\\R                  \R                  4   4
S jjrSrU =r$ )ÚMimiAttentioni‘  z=Multi-headed attention from 'Attention Is All You Need' paperNr„   r@   c                 óx  >• [         TU ]  5         Xl        X l        UR                  U l        UR
                  U l        UR                  U l        UR                  U l        UR                  U l	        U R                  U R                  -  U l
        UR                  U l        SU l        S[        R                  " UR                  5      -  U l        U R
                  U R                  -  S:w  a&  [!        SU R
                   SU R                   S35      e["        R$                  " U R
                  U R                  U R                  -  UR&                  S9U l        ["        R$                  " U R
                  U R                  U R                  -  UR&                  S9U l        ["        R$                  " U R
                  U R                  U R                  -  UR&                  S9U l        ["        R$                  " U R                  U R                  -  U R
                  UR&                  S9U l        UR0                  U l        g )NTr   r   z?hidden_size must be divisible by num_heads (got `hidden_size`: z and `num_heads`: rr   rS  )rw   r=   r„   r@   Úattention_dropoutr÷   r-  Ú	num_headsr+  rb  rm  r  Ú	is_causalrÇ   Úsqrtrþ   r9   r   rV  Úattention_biasÚq_projÚk_projÚv_projÚo_projÚsliding_window©r;   r„   r@   r…   s      €r.   r=   ÚMimiAttention.__init__”  s±  ø€ Ü‰ÑÔØŒØ"Œà!'×!9Ñ!9ˆÔØ!×-Ñ-ˆÔØ×3Ñ3ˆŒØŸ™ˆŒØ#)×#=Ñ#=ˆÔ Ø$(§N¡N°d×6NÑ6NÑ$NˆÔ!Ø'-×'EÑ'EˆÔ$ØˆŒØœ4Ÿ9š9 V§_¡_Ó5Ñ5ˆŒà×Ñ˜dŸn™nÑ,°Ó1ÜØQÐRV×RbÑRbÐQcØ$ T§^¡^Ð$4°Bð8óð ô
 —i’i × 0Ñ 0°$·.±.À4Ç=Á=Ñ2PÐW]×WlÑWlÑmˆŒÜ—i’i × 0Ñ 0°$×2JÑ2JÈTÏ]É]Ñ2ZÐag×avÑavÑwˆŒÜ—i’i × 0Ñ 0°$×2JÑ2JÈTÏ]É]Ñ2ZÐag×avÑavÑwˆŒÜ—i’i §¡°·±Ñ >À×@PÑ@PÐW]×WlÑWlÑmˆŒØ$×3Ñ3ˆÕr-   r?   rh  Úpast_key_valuesÚposition_embeddingsr™   c                 ó  • UR                   S S n/ UQSPU R                  P7nU R                  U5      R                  U5      R	                  SS5      nU R                  U5      R                  U5      R	                  SS5      n	U R                  U5      R                  U5      R	                  SS5      n
Uu  p¼[        X‰X¼5      u  p‰Ub  UR                  XšU R                  5      u  pš[        R                  " U R                  R                  [        5      nU" U UU	U
U4U R                  (       d  SOU R                   U R"                  U R$                  S.UD6u  pïUR&                  " / UQSP76 R)                  5       nU R+                  U5      nXï4$ )NrR   r   rv   rº   )ri  rþ   rƒ  )rF   r+  r  Úviewr:  r€  r�  rO  r[   r@   r   Úget_interfacer„   Ú_attn_implementationrv  rl  rz  rþ   rƒ  r`  rq  r‚  )r;   r?   rh  r†  r‡  r/  Úinput_shapeÚhidden_shapeÚquery_statesrr  rs  r;  r<  Úattention_interfaceru  rt  s                   r.   r·   ÚMimiAttention.forward¯  s‡  € ð $×)Ñ)¨#¨2Ð.ˆØ8˜Ð8 bÐ8¨$¯-©-Ñ8ˆà—{‘{ =Ó1×6Ñ6°|ÓD×NÑNÈqÐRSÓTˆØ—[‘[ Ó/×4Ñ4°\ÓB×LÑLÈQÐPQÓRˆ
Ø—{‘{ =Ó1×6Ñ6°|ÓD×NÑNÈqÐRSÓTˆà&‰ˆÜ#7¸ÐRUÓ#[Ñ ˆàÑ&Ø'6×'=Ñ'=¸jÐX\×XfÑXfÓ'gÑ$ˆJä(?×(MÒ(MØ�K‰K×,Ñ,Ô.Eó)
Ðñ %8ØØØØØð
%
ð  $Ÿ}Ÿ}‘C°$×2HÑ2HØ—L‘LØ×.Ñ.ñ
%
ð ñ
%
Ñ!ˆð "×)Ò)Ð;¨;Ð;¸Ò;×FÑFÓHˆØ—k‘k +Ó.ˆØÐ(Ð(r-   )rz  r„   r+  r÷   r|  r€  r@   r  r{  rm  rb  r‚  r  rþ   rƒ  r�  r“   ©NNN)r#   r$   r%   r&   r'   r   r]   r=   r(   r`   r	   r½   r·   r,   r¿   rÀ   s   @r.   rx  rx  ‘  s¡   ø† ÙGñ4˜zð 4°c¸D±j÷ 4ð 4ð< /3Ø(,ØHLñ')à—|‘|ð')ð Ÿ™ tÑ+ð')ð  ™ð	')ð
 # 5§<¡<°·±Ð#=Ñ>ÀÑEð')ð 
ˆu�|‰|˜UŸ\™\Ð)Ñ	*÷')ó ')r-   rx  c                   ó6  ^ • \ rS rSrS\S\4U 4S jjr     SS\R                  S\R                  S-  S\	S-  S	\
S-  S
\
S-  S\\R                  \R                  4   S-  S\\R                  \\R                  \R                  4   S-  4   4S jjrSrU =r$ )ÚMimiTransformerLayeriÙ  r„   r@   c                 óx  >• [         TU ]  5         UR                  U l        [        XS9U l        [        U5      U l        [        R                  " UR                  UR                  S9U l
        [        R                  " UR                  UR                  S9U l        [        U5      U l        [        U5      U l        g )N)r„   r@   )Úeps)rw   r=   r÷   rx  Ú	self_attnrQ  Úmlpr   Ú	LayerNormÚnorm_epsÚinput_layernormÚpost_attention_layernormr
  Úself_attn_layer_scaleÚmlp_layer_scaler„  s      €r.   r=   ÚMimiTransformerLayer.__init__Ú  s‡   ø€ Ü‰ÑÔØ!×-Ñ-ˆÔä&¨fÑJˆŒä˜6“?ˆŒÜ!Ÿ|š|¨F×,>Ñ,>ÀFÇOÁOÑTˆÔÜ(*¯ª°V×5GÑ5GÈVÏ_É_Ñ(]ˆÔ%Ü%3°FÓ%;ˆÔ"Ü-¨fÓ5ˆÕr-   Nr?   rh  r†  Úoutput_attentionsÚ	use_cacher‡  r™   c           
      ó  • UnU R                  U5      nU R                  " SUUUUUUS.UD6u  pX€R                  U5      -   nUnU R                  U5      nU R	                  U5      nX€R                  U5      -   nU4n
U(       a  X©4-  n
U
$ )N)r?   rh  r†  rŸ  r   r‡  r"   )rš  r–  rœ  r›  r—  r�  )r;   r?   rh  r†  rŸ  r   r‡  r/  rç   Úself_attn_weightsÚoutputss              r.   r·   ÚMimiTransformerLayer.forwardæ  sµ   € ð !ˆà×,Ñ,¨]Ó;ˆð ,0¯>ª>ð ,
Ø'Ø)Ø+Ø/ØØ 3ñ,
ð ñ,
Ñ(ˆð !×#=Ñ#=¸mÓ#LÑLˆð !ˆØ×5Ñ5°mÓDˆØŸ™ Ó/ˆØ ×#7Ñ#7¸Ó#FÑFˆà Ð"ˆæØÐ+Ñ+ˆGàˆr-   )r÷   rš  r—  r�  r›  r–  rœ  )NNFFN)r#   r$   r%   r&   r   r]   r=   r(   r`   r	   r»   r½   r+   r·   r,   r¿   rÀ   s   @r.   r“  r“  Ù  sÑ   ø† ð
6˜zð 
6°c÷ 
6ð /3Ø(,Ø).Ø!&ØHLñ%à—|‘|ð%ð Ÿ™ tÑ+ð%ð  ™ð	%ð
   $™;ð%ð ˜$‘;ð%ð # 5§<¡<°·±Ð#=Ñ>ÀÑEð%ð 
ˆu× Ñ  %¨×(9Ñ(9¸5×;LÑ;LÐ(LÑ"MÐPTÑ"TÐTÑ	U÷%ó %r-   r“  c                   óè   ^ • \ rS rSrSrS\4U 4S jjr        SS\R                  S-  S\R                  S-  S\R                  S-  S	\
S-  S
\S-  S\S-  S\S-  S\S-  S\\-  4S jjrSrU =r$ )ÚMimiTransformerModeli  z�
Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`MimiTransformerLayer`]

Args:
    config: MimiConfig
r„   c           	      óö   >• [         TU ]  5         [        R                  " [	        UR
                  5       Vs/ s H  n[        X5      PM     sn5      U l        [        U5      U l	        SU l
        Xl        g s  snf )NF)rw   r=   r   rØ   rò   Únum_hidden_layersr“  rù   r  Ú
rotary_embÚgradient_checkpointingr„   r„  s      €r.   r=   ÚMimiTransformerModel.__init__  sd   ø€ Ü‰ÑÔä—m’mÜFKÈF×LdÑLdÔFeÓfÒFe¸Ô! &Ö4ÑFeÑfó
ˆŒô .¨fÓ5ˆŒà&+ˆÔ#Ø�ùò gs   ·A6Nr?   rh  r=  r†  r   rŸ  Úoutput_hidden_statesÚreturn_dictr™   c	                 óª  • Ub  UOU R                   R                  nUb  UOU R                   R                  nUb  UOU R                   R                  nUb  UOU R                   R                  nU R
                  (       a/  U R                  (       a  U(       a  [        R                  S5        SnU(       a  Uc  [        U R                   S9nUcU  Ub  UR                  5       OSn
[        R                  " UR                  S   UR                  S9U
-   nUR                  S5      n[!        U R                   UUUUS9nU R#                  X5      nU(       a  S	OSnU(       a  S	OSnU R$                   H2  nU(       a  XÑ4-  nU" UUUUUUUS
9nUS   nU(       d  M)  UUS   4-  nM4     U(       a  XÑ4-  nU(       d  ['        S XXÞ4 5       5      $ [)        UUUUS9$ )aL
  
Args:
    hidden_states (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*):
        Embedded representation that will be contextualized by the model
    attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*):
        Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`:

        - 1 for tokens that are **not masked**,
        - 0 for tokens that are **masked**.

        [What are attention masks?](../glossary#attention-mask)

        Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
        [`PreTrainedTokenizer.__call__`] for details.

        If `past_key_values` is used, optionally only the last `decoder_input_ids` have to be input (see
        `past_key_values`).

        If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`]
        and modify to your needs. See diagram 1 in [the paper](https://huggingface.co/papers/1910.13461) for more
        information on the default strategy.

        - 1 indicates the head is **not masked**,
        - 0 indicates the head is **masked**.
    position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
        Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,
        config.n_positions - 1]`.

        [What are position IDs?](../glossary#position-ids)
    past_key_values (`Cache`, *optional*):
        It is a [`~cache_utils.Cache`] instance. For more details, see our [kv cache guide](https://huggingface.co/docs/transformers/en/kv_cache).

        If `past_key_values` are used, the user can optionally input only the last `input_ids` (those that don't
        have their past key value states given to this model) of shape `(batch_size, 1)` instead of all `input_ids`
        of shape `(batch_size, sequence_length)`.
    use_cache (`bool`, *optional*):
        If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see
        `past_key_values`).
    output_attentions (`bool`, *optional*):
        Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned
        tensors for more detail.
    output_hidden_states (`bool`, *optional*):
        Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for
        more detail.
    return_dict (`bool`, *optional*):
        Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
NzX`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`.F)r„   r   r   ©rC   )r„   Úinputs_embedsrh  r†  r=  r"   )rh  r=  r†  rŸ  r   r‡  c              3   ó.   #   • U  H  oc  M  Uv •  M     g 7fr“   r"   )Ú.0Úvs     r.   Ú	<genexpr>Ú/MimiTransformerModel.forward.<locals>.<genexpr>—  s   é € ð Ú^�a—‘Ò^ùs   ‚Œ	)Úlast_hidden_stater†  r?   Ú
attentions)r„   rŸ  r¬  r   r­  rª  rl  rz   Úwarning_oncer
   Úget_seq_lengthr(   r.  rF   rC   rI  r   r©  rù   r½   r   )r;   r?   rh  r=  r†  r   rŸ  r¬  r­  r/  Úpast_seen_tokensÚcausal_maskr‡  Úall_hidden_statesÚall_self_attnsÚdecoder_layerÚlayer_outputss                    r.   r·   ÚMimiTransformerModel.forward!  sî  € ðv 2CÑ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ñ$DÑ È$Ï+É+×JjÑJjð 	ð "+Ñ!6‘I¸D¿K¹K×<QÑ<Qˆ	à%0Ñ%<‘kÀ$Ç+Á+×BYÑBYˆà×&×&¨4¯=¯=¾YÜ×ÑØjôð ˆIæ˜Ñ0Ü*°$·+±+Ñ>ˆOàÑØCRÑC^˜×=Ñ=Ô?ÐdeÐÜ Ÿ<š<¨×(;Ñ(;¸AÑ(>À}×G[ÑG[Ñ\Ð_oÑoˆLØ'×1Ñ1°!Ó4ˆLä7Ø—;‘;Ø'Ø)Ø+Ø%ñ
ˆð #Ÿo™o¨mÓJÐö #7™B¸DÐÞ0™°dˆà!Ÿ[œ[ˆMÞ#Ø!Ð%5Ñ5Ð!á)ØØ*Ø)Ø /Ø"3Ø#Ø$7ñˆMð *¨!Ñ,ˆMç Ð Ø =°Ñ#3Ð"5Ñ5’ñ# )ö(  ØÐ!1Ñ1ÐæÜñ Ø)Ð<MÑ^óó ð ô 'Ø+Ø+Ø+Ø%ñ	
ð 	
r-   )r„   rª  rù   r©  )NNNNNNNN)r#   r$   r%   r&   r'   r   r=   r(   r)   r`   r	   r»   r½   r   r·   r,   r¿   rÀ   s   @r.   r¦  r¦    sÔ   ø† ñð	˜z÷ 	ð 26Ø.2Ø04Ø(,Ø!%Ø)-Ø,0Ø#'ñ
à×'Ñ'¨$Ñ.ð
ð Ÿ™ tÑ+ð
ð ×&Ñ&¨Ñ-ð	
ð
  ™ð
ð ˜$‘;ð
ð   $™;ð
ð # T™kð
ð ˜D‘[ð
ð 
Ð(Ñ	(÷
ó 
r-   r¦  c                   ó:   ^ • \ rS rSrSrS\4U 4S jjrS rSrU =r	$ )ÚMimiDecoderi£  zSEANet decoder as used by Mimi.r„   c           
      ó¬  >• [         TU ]  5         [        S[        UR                  5      -  5      n[        XR                  X!R                  -  UR                  5      /nUR                   Hƒ  nX!R                  -  nU[        R                  " 5       /-  nU[        XUS-  US-  US9/-  n[        UR                  5       H%  nU[        XS-  UR                  U-  S45      /-  nM'     US-  nM…     U[        R                  " 5       /-  nU[        XR                  UR                   UR"                  5      /-  n[        R$                  " U5      U l        g )Nrv   rí   r   )rw   r=   r]   r7   rñ   rh   r÷   rï   rk   r   r×   rÂ   rò   ró   rÐ   rõ   rî   rø   rØ   rù   )r;   r„   rþ   rý   r   r  r  r…   s          €r.   r=   ÚMimiDecoder.__init__¦  sC  ø€ Ü‰ÑÔÜ�aœ3˜v×7Ñ7Ó8Ñ8Ó9ˆÜ˜F×$6Ñ$6¸×BTÑBTÑ8TÐV\×VhÑVhÓiÐjˆð ×-Ô-ˆEØ#×&8Ñ&8Ñ8ˆMà”b—f’f“h�ZÑˆEØÜ# F¸=ÈAÑ;MÐ[`ÐcdÑ[dÐmrÑsðñ ˆEô ˜6×5Ñ5Ö6�Øœ/¨&À1Ñ2DÀv×GbÑGbÐdeÑGeÐghÐFiÓjÐkÑk’ñ 7à˜‰MŠGñ .ð 	”"—&’&“(�ÑˆØ”*˜V×%7Ñ%7¸×9NÑ9NÐPV×PgÑPgÓhÐiÑiˆÜ—m’m EÓ*ˆ�r-   c                 ó<   • U R                    H  nU" U5      nM     U$ r“   ©rù   )r;   r?   rè   s      r.   r·   ÚMimiDecoder.forward¾  s    € Ø—[”[ˆEÙ! -Ó0ŠMñ !àÐr-   rÆ  r  rÀ   s   @r.   rÂ  rÂ  £  s   ø† Ù)ð+˜z÷ +÷0ð r-   rÂ  c                   óz   ^ • \ rS rSrSrSS\S\4U 4S jjjr\S\	R                  4S j5       rS rS	 rS
 rSrU =r$ )ÚMimiEuclideanCodebookiÄ  z!Codebook with Euclidean distance.r„   Úepsilonc                 óÖ  >• [         TU ]  5         [        R                  " UR                  UR
                  5      nUR                  U l        [        R                  " [        R                  " S/[        R                  S95      U l
        [        R                  " [        R                  " UR                  5      5      U l        [        R                  " U5      U l        S U l        X l        g )NTrs   )rw   r=   r(   rG   Úcodebook_sizeÚcodebook_dimr   r€   r~   rp  ÚinitializedrH   Úcluster_usageÚ	embed_sumÚ_embedrÊ  )r;   r„   rÊ  Úembedr…   s       €r.   r=   ÚMimiEuclideanCodebook.__init__Ç  s–   ø€ Ü‰ÑÔÜ—’˜F×0Ñ0°&×2EÑ2EÓFˆà#×1Ñ1ˆÔäŸ9š9¤U§\¢\°4°&ÄÇÁÑ%NÓOˆÔÜŸYšY¤u§z¢z°&×2FÑ2FÓ'GÓHˆÔÜŸš 5Ó)ˆŒØˆŒØ�r-   r™   c                 ó¬   • U R                   c<  U R                  U R                  R                  U R                  S9S S 2S 4   -  U l         U R                   $ )N)Úmin)rÑ  rÐ  rÏ  ÚclamprÊ  r–   s    r.   rÒ  ÚMimiEuclideanCodebook.embedÓ  sJ   € à�;‰;ÑØŸ.™.¨4×+=Ñ+=×+CÑ+CÈÏÉÐ+CÐ+UÒVWÐY]ÐV]Ñ+^Ñ^ˆDŒKØ�{‰{Ðr-   c                 ó®   • [         R                  " US    R                  5       U R                  S    R                  5       SS9S   nUR	                  SS9nU$ )Nrv   )rk  r   rR   rS   )r(   Úcdistr¾   rÒ  Úargmin)r;   r?   ÚdistsÚ	embed_inds       r.   ÚquantizeÚMimiEuclideanCodebook.quantizeÙ  sS   € ô —’˜M¨$Ñ/×5Ñ5Ó7¸¿¹ÀDÑ9I×9OÑ9OÓ9QÐUVÑWÐXYÑZˆØ—L‘L R�LÐ(ˆ	ØÐr-   c                 ó�   • UR                   nUR                  SUS   45      nU R                  U5      nUR                  " US S 6 nU$ )NrR   )rF   r`  rÝ  r‰  )r;   r?   rF   rÜ  s       r.   ÚencodeÚMimiEuclideanCodebook.encodeá  sM   € Ø×#Ñ#ˆà%×-Ñ-¨r°5¸±9¨oÓ>ˆà—M‘M -Ó0ˆ	à—N’N E¨#¨2 JÐ/ˆ	ØÐr-   c                 óX   • [         R                  R                  XR                  5      nU$ r“   )r   r§   Ú	embeddingrÒ  ©r;   rÜ  rÝ  s      r.   ÚdecodeÚMimiEuclideanCodebook.decodeì  s   € Ü—=‘=×*Ñ*¨9·j±jÓAˆØˆr-   )rÑ  rÏ  rÌ  rÐ  rÊ  rÎ  )gñhãˆµøä>)r#   r$   r%   r&   r'   r   r¾   r=   Úpropertyr(   r`   rÒ  rÝ  rà  rå  r,   r¿   rÀ   s   @r.   rÉ  rÉ  Ä  sQ   ø† Ù+ñ
˜zð 
°E÷ 
ð 
ð ð�u—|‘|ó ó ðò
ò÷ð r-   rÉ  c                   ó@   ^ • \ rS rSrSrS\4U 4S jjrS rS rSr	U =r
$ )ÚMimiVectorQuantizationiò  zQ
Vector quantization implementation. Currently supports only euclidean distance.
r„   c                 óB   >• [         TU ]  5         [        U5      U l        g r“   )rw   r=   rÉ  ÚcodebookrZ  s     €r.   r=   ÚMimiVectorQuantization.__init__÷  s   ø€ Ü‰ÑÔÜ-¨fÓ5ˆ�r-   c                 ób   • UR                  SSS5      nU R                  R                  U5      nU$ ©Nr   rv   r   )Úpermuterë  rà  )r;   r?   Úembed_ins      r.   rà  ÚMimiVectorQuantization.encodeû  s/   € Ø%×-Ñ-¨a°°AÓ6ˆØ—=‘=×'Ñ'¨Ó6ˆØˆr-   c                 ób   • U R                   R                  U5      nUR                  SSS5      nU$ rî  )rë  rå  rï  rä  s      r.   rå  ÚMimiVectorQuantization.decode   s/   € Ø—=‘=×'Ñ'¨	Ó2ˆØ×#Ñ# A q¨!Ó,ˆØˆr-   )rë  )r#   r$   r%   r&   r'   r   r=   rà  rå  r,   r¿   rÀ   s   @r.   ré  ré  ò  s#   ø† ñð6˜z÷ 6ò÷
ð r-   ré  c                   óÄ   ^ • \ rS rSrSrSS\S\S-  4U 4S jjjrSS\R                  S\S-  S\R                  4S	 jjr
S
\R                  S\R                  4S jrSrU =r$ )ÚMimiResidualVectorQuantizeri  zResidual Vector Quantizer.Nr„   Únum_quantizersc                 ób  >• [         TU ]  5         UR                  U l        UR                  U l        Ub  UOUR                  U l        [
        R                  " [        U R                  5       Vs/ s H  n[        U5      PM     sn5      U l	        S U l
        S U l        UR                  UR                  :w  as  [        R
                  R                  UR                  UR                  SSS9U l
        [        R
                  R                  UR                  UR                  SSS9U l        g g s  snf )Nr   FrS  )rw   r=   rÌ  Ú
frame_raterö  r   rØ   rò   ré  rù   Ú
input_projÚoutput_projÚ$vector_quantization_hidden_dimensionr÷   r(   r|   )r;   r„   rö  Ú_r…   s       €r.   r=   Ú$MimiResidualVectorQuantizer.__init__	  s  ø€ Ü‰ÑÔØ#×1Ñ1ˆÔØ ×+Ñ+ˆŒØ0>Ñ0J™nÐPV×PeÑPeˆÔÜ—m’mÌUÐSW×SfÑSfÔMgÓ$hÒMgÈÔ%;¸FÖ%CÑMgÑ$hÓiˆŒàˆŒØˆÔØ×6Ñ6¸&×:LÑ:LÓLÜ#Ÿh™hŸo™oØ×"Ñ" F×$OÑ$OÐQRÐY^ð .ð ˆDŒOô  %Ÿx™xŸ™Ø×;Ñ;¸V×=OÑ=OÐQRÐY^ð  /ð  ˆDÕð	 Mùò	 %is   Á/D,Ú
embeddingsr™   c                 ó2  • U R                   b  U R                  U5      nUb  UOU R                  nUn/ nU R                  SU  H:  nUR                  U5      nUR	                  U5      nX7-
  nUR                  U5        M<     [        R                  " U5      nU$ )úÙ
Encode a given input tensor with the specified frame rate at the given number of quantizers / codebooks. The RVQ encode method sets
the appropriate number of quantizers to use and returns indices for each quantizer.
N)rù  rö  rù   rà  rå  rö   r(   Ústack)	r;   rþ  rö  rç   Úall_indicesrè   ÚindicesÚ	quantizedÚout_indicess	            r.   rà  Ú"MimiResidualVectorQuantizer.encode  s•   € ð
 �?‰?Ñ&ØŸ™¨Ó4ˆJà+9Ñ+E™È4×K^ÑK^ˆàˆØˆØ—[‘[  .Ó1ˆEØ—l‘l 8Ó,ˆGØŸ™ WÓ-ˆIØÑ+ˆHØ×Ñ˜wÖ'ñ	 2ô
 —k’k +Ó.ˆØÐr-   Úcodesc                 ó  • [         R                  " SSUR                  S9nUR                  SS5      n[	        U5       H)  u  p4U R
                  U   nUR                  U5      nX&-   nM+     U R                  b  U R                  U5      nU$ )zJDecode the given codes of shape [B, K, T] to the quantized representation.r"   rº   r¯  r   r   )r(   r  rC   r:  rÕ   rù   rå  rú  )r;   r  Úquantized_outrß   r  rè   r  s          r.   rå  Ú"MimiResidualVectorQuantizer.decode.  s€   € äŸ
š
 2 s°5·<±<Ñ@ˆØ—‘  1Ó%ˆÜ# EÖ*‰JˆAØ—K‘K ‘NˆEØŸ™ WÓ-ˆIØ)Ñ5ŠMñ +ð
 ×ÑÑ'Ø ×,Ñ,¨]Ó;ˆMØÐr-   )rÌ  rø  rù  rù   rö  rú  r“   )r#   r$   r%   r&   r'   r   r]   r=   r(   r`   rà  rå  r,   r¿   rÀ   s   @r.   rõ  rõ    sk   ø† Ù$ñ˜zð ¸3À¹:÷ ð ñ" §¡ð ¸sÀT¹zð ÐUZ×UaÑUaõ ð(˜EŸL™Lð ¨U¯\©\÷ ò r-   rõ  c                   ó¶   ^ • \ rS rSrSrS\4U 4S jjrSS\R                  S\	S-  S\R                  4S	 jjr
S
\R                  S\R                  4S jrSrU =r$ )Ú MimiSplitResidualVectorQuantizeri<  z Split Residual Vector Quantizer.r„   c                 óN  >• [         TU ]  5         UR                  U l        UR                  U l        UR                  U l        UR                  U l        UR                  UR                  -
  U l        [        XR                  5      U l	        [        XR                  5      U l
        g r“   )rw   r=   rÌ  rø  rö  Úmax_num_quantizersÚnum_semantic_quantizersÚnum_acoustic_quantizersrõ  Ú"semantic_residual_vector_quantizerÚ"acoustic_residual_vector_quantizerrZ  s     €r.   r=   Ú)MimiSplitResidualVectorQuantizer.__init__?  s„   ø€ Ü‰ÑÔØ#×1Ñ1ˆÔØ ×+Ñ+ˆŒØ"(×"7Ñ"7ˆÔà'-×'EÑ'EˆÔ$Ø'-×'<Ñ'<¸v×?]Ñ?]Ñ']ˆÔ$ä2MÈf×VrÑVrÓ2sˆÔ/Ü2MÈf×VrÑVrÓ2sˆÕ/r-   Nrþ  rö  r™   c                 ó   • Uc  U R                   OUnX R                   :”  a  [        SU R                    SU S35      eX R                  :  a  [        SU R                   SU S35      eU R                  R	                  U5      nX R                  :”  a<  U R
                  R	                  XU R                  -
  S9n[        R                  " X4/SS9nU$ )r   úcThe number of quantizers (i.e codebooks) asked should be lower than the total number of quantizers ú, but is currently Ú.zgThe number of quantizers (i.e codebooks) asked should be higher than the number of semantic quantizers )rö  r   rS   )r  r9   r  r  rà  r  r(   rW   )r;   rþ  rö  r  Úacoustic_codess        r.   rà  Ú'MimiSplitResidualVectorQuantizer.encodeK  s.  € ð 5CÑ4J˜×0Ò0ÐP^ˆà×3Ñ3Ó3ÜØuÐvz÷  wNñ  wNð  vOð  Obð  cqð  brð  rsð  tóð ð ×8Ñ8Ó8ÜØyÐz~÷  {Wñ  {Wð  zXð  Xkð  lzð  k{ð  {|ð  }óð ð
 ×7Ñ7×>Ñ>¸zÓJˆà×8Ñ8Ó8Ø!×DÑD×KÑKØ¸D×<XÑ<XÑ+Xð Lð ˆNô —I’I˜uÐ5¸1Ñ=ˆEàˆr-   r  c                 óü   • U R                   R                  USS2SU R                  24   5      nUR                  S   U R                  :”  a0  X R                  R                  USS2U R                  S24   5      -  nU$ )z7Decode the given codes to the quantized representation.Nr   )r  rå  r  rF   r  )r;   r  r	  s      r.   rå  Ú'MimiSplitResidualVectorQuantizer.decodeh  s}   € ð ×?Ñ?×FÑFÀuÊQÐPnÐRV×RnÑRnÐPnÐMnÑGoÓpˆð �;‰;�q‰>˜D×8Ñ8Ó8Ø×DÑD×KÑKÈEÒRSÐUY×UqÑUqÑUsÐRsÑLtÓuÑuˆMØÐr-   )r  rÌ  rø  r  r  r  r  r“   )r#   r$   r%   r&   r'   r   r=   r(   r`   r¾   rà  rå  r,   r¿   rÀ   s   @r.   r  r  <  s]   ø† Ù*ð
t˜z÷ 
tñ §¡ð ¸uÀt¹|ð ÐW\×WcÑWcõ ð:	˜EŸL™Lð 	¨U¯\©\÷ 	ò 	r-   r  c                   óŽ   ^ • \ rS rSr% \\S'   SrSrSrSr	SS/r
S	/rSrSrSrSrSr\R$                  " 5       U 4S
 j5       rSrU =r$ )ÚMimiPreTrainedModelit  r„   ÚmimiÚinput_valuesÚaudioTr  r“  r†  c                 óÀ  >• [         TU ]  U5        [        U[        R                  [        R
                  45      (       a�  [        R                  " UR                  5        UR                  b_  [        R                  " UR                  UR                  UR                  S   -  -  5      n[        R                  " UR                  U* US9  gg[        U[         5      (       a6  [        R"                  " UR$                  U R&                  R(                  5        g[        U[*        5      (       a¼  UR,                  R                  S   nUR,                  R.                  S   nUR,                  R0                  S   nUS-
  U-  S-   n[        R"                  " UR.                  U5        [        R"                  " UR                  U5        [        R"                  " UR2                  X4-
  5        g[        U[4        5      (       aa  [        R6                  " UR8                  5        [        R6                  " UR:                  5        [        R<                  " UR>                  5        gg)zInitialize the weightsNr   )ÚaÚbr   ) rw   Ú_init_weightsræ   r   r|   rÆ   ÚinitÚkaiming_normal_Úweightrp   rÇ   r}  rn   rM   rk   Úuniform_r
  Ú	constant_r  r„   r  rh   r}   rl   rm   r�   rÉ  Úones_rÎ  rÏ  Úzeros_rÐ  )r;   re  rK  rk   rl   rm   r…   s         €r.   r$  Ú!MimiPreTrainedModel._init_weights„  s   ø€ ô 	‰Ñ˜fÔ%Ü�fœrŸy™y¬"×*<Ñ*<Ð=×>Ñ>Ü× Ò  §¡Ô/Ø�{‰{Ñ&Ü—I’I˜fŸm™m¨v×/AÑ/AÀF×DVÑDVÐWXÑDYÑ/YÑZÓ[�Ü—’˜fŸk™k¨a¨R°1Ó5ð 'ô ˜¤×/Ñ/Ü�NŠN˜6Ÿ<™<¨¯©×)NÑ)NÕOÜ˜¤
×+Ñ+Ø Ÿ+™+×1Ñ1°!Ñ4ˆKØ—[‘[×'Ñ'¨Ñ*ˆFØ—{‘{×+Ñ+¨AÑ.ˆHØ&¨™?¨hÑ6¸Ñ:ˆKÜ�NŠN˜6Ÿ=™=¨&Ô1Ü�NŠN˜6×-Ñ-¨{Ô;Ü�NŠN˜6×/Ñ/°Ñ1EÕFÜ˜Ô 5×6Ñ6Ü�JŠJ�v×)Ñ)Ô*Ü�JŠJ�v×+Ñ+Ô,Ü�KŠK˜×(Ñ(Õ)ð 7r-   r"   )r#   r$   r%   r&   r   r*   Úbase_model_prefixÚmain_input_nameÚinput_modalitiesÚsupports_gradient_checkpointingÚ_no_split_modulesÚ_skip_keys_device_placementÚ_supports_flash_attnÚ_supports_sdpaÚ_supports_flex_attnÚ_supports_attention_backendÚ_can_compile_fullgraphr(   rC  r$  r,   r¿   rÀ   s   @r.   r  r  t  sj   ø‡ àÓØÐØ$€OØÐØ&*Ð#Ø;Ð=SÐTÐØ#4Ð"5ÐØÐØ€NØÐØ"&Ðà!Ðà
‡]‚]ƒ_ô*ó ö*r-   r  z,
    The Mimi neural audio codec model.
    )Úcustom_introc                   ó¾  ^ • \ rS rSrS\4U 4S jjr    SS\R                  S\S\S\	S-  S	\
S-  S
\S-  S\S-  S\\R                  \R                  S-  4   4S jjrS\R                  S\R                  4S jrSS\R                  S\4S jjr      SS\R                  S\R                  S-  S\S-  S\	S-  S	\
S-  S
\S-  S\S-  S\\R                  \R                  S-  4   \-  4S jjr  SS\R                  S\	S-  S\S-  S\R                  4S jjr   SS\R                  S\R                  S-  S\	S-  S\S-  S\\R                  \R                  4   \-  4
S jjr\      SS\R                  S\R                  S-  S\S-  S\R                  S-  S\	S-  S\	S-  S\S-  S\\R                  \R                  4   \-  4S jj5       rSrU =r$ ) Ú	MimiModeli�  r„   c                 ó�  >• [         TU ]  U5        Xl        [        U5      U l        [        U5      U l        S U l        S U l        UR                  UR                  :w  a¾  [        UUR                  UR                  S[        UR                  UR                  -  5      -  SSS[        U R                  R                  5      S9U l        [!        UUR                  UR                  S[        UR                  UR                  -  5      -  SSUR"                  S9U l        [        U5      U l        ['        U5      U l        [+        U5      U l        [        [.        R0                  " U R                  R2                  5      5      U l        SU R4                  -  U R                  R2                  :w  a  [7        S5      eU R9                  5         g )Nrv   FrE   )rk   rl   rp   ro   r@   )rk   rl   rp   rn   z'The codebook_size must be a power of 2.)rw   r=   r„   rë   Úencoderr¦  Úencoder_transformerÚ
downsampleÚupsamplerø  Úencodec_frame_raterh   r÷   r]   r7   rú   rÂ   Úupsample_groupsÚdecoder_transformerrÂ  Údecoderr  Ú	quantizerrÇ   Úlog2rÌ  Úbits_per_codebookr9   Ú	post_initrZ  s     €r.   r=   ÚMimiModel.__init__£  sv  ø€ Ü‰Ñ˜Ô ØŒä" 6Ó*ˆŒÜ#7¸Ó#?ˆÔ àˆŒØˆŒØ×Ñ × 9Ñ 9Ó9Ü(ØØ×"Ñ"Ø×"Ñ"Ø¤ F×$=Ñ$=À×@QÑ@QÑ$QÓ RÑRØØØ$Ü˜dŸl™l×BÑBÓCñ	ˆDŒOô 0ØØ×"Ñ"Ø×"Ñ"Ø¤ F×$=Ñ$=À×@QÑ@QÑ$QÓ RÑRØØØ×-Ñ-ñˆDŒMô $8¸Ó#?ˆÔ Ü" 6Ó*ˆŒä9¸&ÓAˆŒä!$¤T§Y¢Y¨t¯{©{×/HÑ/HÓ%IÓ!JˆÔØˆd×$Ñ$Ñ$¨¯©×(AÑ(AÓAÜÐFÓGÐGð 	�‰Õr-   Nr  rö  Úpadding_maskr†  r:   Úuse_streamingr­  r™   c                 óh  • U R                  XS9nU R                  UR                  SS5      UUUS9n	U(       a  U	R                  S5      nO[	        U	5      S:”  a  U	S   nU	S   R                  SS5      nU R                  X…S9nU R                  R                  X‚5      n
U
R                  SS5      n
X¤U4$ )zp
Encodes the given input using the underlying VQVAE. The padding mask is required to compute the correct scale.
rå   r   rv   )r†  r   r­  r†  r   )r<  r=  r:  Úgetr7   r>  rD  rà  )r;   r  rö  rI  r†  r:   rJ  r­  rþ  Úencoder_outputsr  s              r.   Ú_encode_frameÚMimiModel._encode_frameÎ  sÇ   € ð —\‘\ ,�\ÐLˆ
ð ×2Ñ2Ø× Ñ   AÓ&Ø+Ø#Ø#ð	 3ð 
ˆö Ø-×1Ñ1Ð2CÓD‰OÜ�Ó! AÓ%Ø-¨aÑ0ˆOØ$ QÑ'×1Ñ1°!°QÓ7ˆ
Ø—_‘_ Z�_ÐMˆ
à—‘×%Ñ% jÓAˆØ—‘  1Ó%ˆØ }Ð4Ð4r-   r¯   c                 óÎ   • UnU R                   R                   H-  nU R                   R                  U5      R                  U5      nM/     U R                  R                  U5      nU$ )z<
Return the number of frames of the encoded audio waveform.
)r<  rú   rû   r³   r>  )r;   r¯   r²   Ú
layer_names       r.   Úget_encoded_lengthÚMimiModel.get_encoded_lengthñ  s[   € ð %ˆð Ÿ,™,×>Ô>ˆJØ ŸL™L×6Ñ6°zÓB×UÑUÐVcÓdŠMñ ?ð Ÿ™×:Ñ:¸=ÓIˆàÐr-   Úpadding_sidec                 óV  • U R                  UR                  SS95      n[        R                  " UR	                  5       UR
                  S9R                  [        U5      S5      nXCR                  S5      :  nUR                  UR
                  5      nUS:X  a  U$ UR                  S/S9$ )zB
Get the mask for the audio codes from the original padding mask.
rR   rS   r¯  r   Úright)Údims)rR  Úsumr(   r.  rV   rC   r8  r7   rI  rœ   Úflip)r;   rI  rT  Úencoded_lengthsÚaudio_codes_masks        r.   Úget_audio_codes_maskÚMimiModel.get_audio_codes_mask   s¨   € ð ×1Ñ1°,×2BÑ2BÀrÐ2BÐ2JÓKˆä Ÿ<š<¨×(;Ñ(;Ó(=Ào×F\ÑF\Ñ]×dÑdÜ�Ó  "ó
Ðð ,×.GÑ.GÈÓ.JÑJÐØ+×.Ñ.¨|×/BÑ/BÓCÐà˜7Ó"Ø#Ð#à#×(Ñ(¨r¨dÐ(Ð3Ð3r-   r    c           
      ó  • Ub  UOU R                   R                  nUb  UOU R                   R                  nUc  U R                   R                  OUnX0R                   R                  :”  a&  [	        SU R                   R                   SU S35      eUR
                  u  p‰n
U	S:  d  U	S:”  a  [	        SU	 35      eUc$  [        R                  " U5      R                  5       nU(       Ga]  UGcY  / / / pÜnU R                  R                   HŸ  nUR                  U R                  R                  U5      R                  5        UR                  U R                  R                  U5      R                  5        UR                  U R                  R                  U5      R                  5        M¡     UR                  U R                   R                  5        UR                  U R                   R                  5        UR                  U R                   R                  5        [#        [%        U R                  R                  5      S-   UUUS9nU R'                  UUUR                  5       UUUUS9u  pônU(       d  UUU4$ [)        XôU5      $ )	a¥  
Encodes the input audio waveform into discrete codes.

Args:
    input_values (`torch.Tensor` of shape `(batch_size, channels, sequence_length)`):
        Float values of the input audio waveform.
    padding_mask (`torch.Tensor` of shape `(batch_size, channels, sequence_length)`):
        Indicates which inputs are to be ignored due to padding, where elements are either 1 for *not masked* or 0
        for *masked*.
    num_quantizers (`int`, *optional*):
        Number of quantizers (i.e codebooks) to use. By default, all quantizers are used.
    encoder_past_key_values (`Cache`, *optional*):
        Pre-computed hidden-states (key and values in the self-attention blocks) that can be used to speed up sequential decoding of the encoder transformer.
        This typically consists in the `past_key_values` returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`.

        The model will output the same cache format that is fed as input.

        If `past_key_values` are used, the user can optionally input only the last `audio_values` or `audio_codes (those that don't
        have their past key value states given to this model).
    return_dict (`bool`, *optional*):
        Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.

Returns:
    `codebook` of shape `[batch_size, num_codebooks, frames]`, the discrete encoded codes for the input audio waveform.
r  r  r  r   rv   z1Number of audio channels must be 1 or 2, but got )r2   r3   r4   r5   )r†  r:   rJ  r­  )r„   r­  rJ  rö  r9   rF   r(   Ú	ones_liker»   r<  rú   rö   rû   r�   ro   rM   r>  r0   r7   rN  rb   )r;   r  rI  rö  r    r:   rJ  r­  rü  r  r¯   r3   r4   r5   rQ  Úencoded_framess                   r.   rà  ÚMimiModel.encode  sp  € ðF &1Ñ%<‘kÀ$Ç+Á+×BYÑBYˆØ)6Ñ)B™ÈÏÉ×HaÑHaˆà7EÑ7M˜Ÿ™×3Ò3ÐSaˆàŸK™K×6Ñ6Ó6ÜØuÐvz÷  wBñ  wB÷  wQñ  wQð  vRð  Reð  ftð  euð  uvð  wóð ð %1×$6Ñ$6Ñ!ˆ�\à�a‹<˜8 a›<ÜÐPÐQYÐPZÐ[Ó\Ð\àÑÜ Ÿ?š?¨<Ó8×=Ñ=Ó?ˆLç˜]Ò2ØOQÐSUÐWYÐ7LÐØ"Ÿl™l×BÔB�
Ø!×(Ñ(¨¯©×)CÑ)CÀJÓ)O×)]Ñ)]Ô^Ø&×-Ñ-¨d¯l©l×.HÑ.HÈÓ.T×.]Ñ.]Ô^Ø%×,Ñ,¨T¯\©\×-GÑ-GÈ
Ó-S×-_Ñ-_Ö`ñ Cð ×$Ñ$ T§_¡_×%BÑ%BÔCØ"×)Ñ)¨$¯/©/×*BÑ*BÔCØ!×(Ñ(¨¯©×)DÑ)DÔEä2Ü˜tŸ|™|×CÑCÓDÀqÑHØ"3Ø'=Ø&;ñ	ˆMð BF×ASÑASØØØ×ÑÓØ3Ø'Ø'Ø#ð BTð B
Ñ>ˆ°ö àØ'Øðð ô ! È-ÓXÐXr-   r  c                 óF  • U R                   R                  U5      nU R                  U5      nU R                  UR	                  SS5      X#S9nU(       a  UR                  S5      nO[        U5      S:”  a  US   nUS   R	                  SS5      nU R                  U5      nXb4$ )Nr   rv   ©r†  r­  r†  r   )rD  rå  r?  rB  r:  rL  r7   rC  )r;   r  r†  r­  rþ  Údecoder_outputsr£  s          r.   Ú_decode_frameÚMimiModel._decode_framel  s¨   € ð —^‘^×*Ñ*¨5Ó1ˆ
à—]‘] :Ó.ˆ
Ø×2Ñ2Ø× Ñ   AÓ&¸ð 3ð 
ˆö Ø-×1Ñ1Ð2CÓD‰OÜ�Ó! AÓ%Ø-¨aÑ0ˆOØ$ QÑ'×1Ñ1°!°QÓ7ˆ
Ø—,‘,˜zÓ*ˆØÐ'Ð'r-   r   r!   c                 óú   • Ub  UOU R                   R                  nU R                  XUS9u  pSUb6  UR                  S   UR                  S   :  a  USSUR                  S   24   nU(       d  UU4$ [	        XS5      $ )a:  
Decodes the given frames into an output audio waveform.

Note that the output might be a bit bigger than the input. In that case, any extra steps at the end can be
trimmed.

Args:
    audio_codes (`torch.LongTensor`  of shape `(batch_size, num_quantizers, codes_length)`, *optional*):
        Discrete code embeddings computed using `model.encode`.
    padding_mask (`torch.Tensor` of shape `(batch_size, channels, sequence_length)`):
        Indicates which inputs are to be ignored due to padding, where elements are either 1 for *not masked* or 0
        for *masked*.
    decoder_past_key_values (`Cache`, *optional*):
        Pre-computed hidden-states (key and values in the self-attention blocks) that can be used to speed up sequential decoding of the decoder transformer.
        This typically consists in the `past_key_values` returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`.

        The model will output the same cache format that is fed as input.

        If `past_key_values` are used, the user can optionally input only the last `audio_values` or `audio_codes (those that don't
        have their past key value states given to this model).
    return_dict (`bool`, *optional*):
        Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.

Nrc  rR   .)r„   r­  re  rF   re   )r;   r   rI  r!   r­  r   s         r.   rå  ÚMimiModel.decode€  sž   € ð> &1Ñ%<‘kÀ$Ç+Á+×BYÑBYˆà04×0BÑ0BØÈkð 1Cð 1
Ñ-ˆð
 Ñ#¨×(:Ñ(:¸2Ñ(>À×ASÑASÐTVÑAWÓ(WØ'¨Ð-E¨|×/AÑ/AÀ"Ñ/EÐ-EÐ(EÑFˆLæàØ'ðð ô ! ÓGÐGr-   c                 óÄ  • Ub  UOU R                   R                  nUc$  [        R                  " U5      R	                  5       nUcC  U R                  XX5US9n	U	S   nU(       a  U	R                  S5      nO[        U	5      S:”  a  U	S   nU R                  XBXgS9n
U
S   nU(       a  U
R                  S5      nO[        U
5      S:”  a  U
S   nU(       d  XKXV4$ [        UUUUS9$ )a¢	  
input_values (`torch.FloatTensor` of shape `(batch_size, channels, sequence_length)`, *optional*):
    Raw audio input converted to Float.
padding_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*):
    Indicates which inputs are to be ignored due to padding, where elements are either 1 for *not masked* or 0
    for *masked*.
num_quantizers (`int`, *optional*):
    Number of quantizers (i.e codebooks) to use. By default, all quantizers are used.
audio_codes (`torch.LongTensor`  of shape `(batch_size, num_quantizers, codes_length)`, *optional*):
    Discrete code embeddings computed using `model.encode`.
encoder_past_key_values (`Cache`, *optional*):
    Pre-computed hidden-states (key and values in the self-attention blocks) that can be used to speed up sequential decoding of the encoder transformer.
    This typically consists in the `past_key_values` returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`.

    The model will output the same cache format that is fed as input.

    If `past_key_values` are used, the user can optionally input only the last `audio_values` or `audio_codes (those that don't
    have their past key value states given to this model).
decoder_past_key_values (`Cache`, *optional*):
    Pre-computed hidden-states (key and values in the self-attention blocks) that can be used to speed up sequential decoding of the decoder transformer.
    This typically consists in the `past_key_values` returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`.

    The model will output the same cache format that is fed as input.

    If `past_key_values` are used, the user can optionally input only the last `audio_values` or `audio_codes (those that don't
    have their past key value states given to this model).

Examples:

```python
>>> from datasets import load_dataset
>>> from transformers import AutoFeatureExtractor, MimiModel

>>> dataset = load_dataset("hf-internal-testing/ashraq-esc50-1-dog-example")
>>> audio_sample = dataset["train"]["audio"][0]["array"]

>>> model_id = "kyutai/mimi"
>>> model = MimiModel.from_pretrained(model_id)
>>> feature_extractor = AutoFeatureExtractor.from_pretrained(model_id)

>>> inputs = feature_extractor(raw_audio=audio_sample, return_tensors="pt")

>>> outputs = model(**inputs)
>>> audio_codes = outputs.audio_codes
>>> audio_values = outputs.audio_values
```)r­  r   r†  r   )r   r   r    r!   )
r„   r­  r(   r_  r»   rà  rL  r7   rå  r   )r;   r  rI  rö  r   r    r!   r­  r/  rM  rd  r   s               r.   r·   ÚMimiModel.forward°  s  € ðt &1Ñ%<‘kÀ$Ç+Á+×BYÑBYˆàÑÜ Ÿ?š?¨<Ó8×=Ñ=Ó?ˆLàÑØ"Ÿk™kØ¨NÐalð *ð ˆOð *¨!Ñ,ˆKÞØ*9×*=Ñ*=Ð>OÓ*PÑ'Ü�_Ó%¨Ó)Ø*9¸!Ñ*<Ð'àŸ+™+ kÐAX˜+ÐrˆØ& qÑ)ˆÞØ&5×&9Ñ&9Ð:KÓ&LÑ#Ü�Ó! AÓ%Ø&5°aÑ&8Ð#æØÐ/FÐ`Ð`äØ#Ø%Ø$;Ø$;ñ	
ð 	
r-   )	rF  r„   rC  rB  r>  r<  r=  rD  r?  )NNNN)rV  )NNNNNN)NNr‘  )r#   r$   r%   r&   r   r=   r(   r`   r]   r	   r0   r»   r½   rN  r)   rR  r_   r\  r¾   rb   rà  re  re   rå  r   r   r·   r,   r¿   rÀ   s   @r.   r:  r:  �  s  ø† ð)˜z÷ )ð` )-Ø7;Ø%)Ø#'ñ!5à—l‘lð!5ð ð!5ð ð	!5ð
  ™ð!5ð .°Ñ4ð!5ð ˜d‘{ð!5ð ˜D‘[ð!5ð 
ˆu�|‰|˜UŸ\™\¨DÑ0Ð0Ñ	1õ!5ðF¨u×/?Ñ/?ð ÀE×DTÑDTô ñ4°·±ð 4ÈSõ 4ð( -1Ø'+Ø04Ø7;Ø%)Ø#'ñYYà—l‘lðYYð —l‘l TÑ)ðYYð  ™ð	YYð
 "'¨¡ðYYð .°Ñ4ðYYð ˜d‘{ðYYð ˜D‘[ðYYð 
ˆu�|‰|˜UŸ\™\¨DÑ0Ð0Ñ	1Ð4EÑ	EõYYð| )-Ø#'ñ	(à�|‰|ð(ð  ™ð(ð ˜D‘[ð	(ð
 
�‰õ(ð. -1Ø04Ø#'ñ.Hà—\‘\ð.Hð —l‘l TÑ)ð.Hð "'¨¡ð	.Hð
 ˜D‘[ð.Hð 
ˆu�|‰|˜UŸ\™\Ð)Ñ	*Ð->Ñ	>õ.Hð` ð -1Ø%)Ø+/Ø04Ø04Ø#'ñW
à—l‘lðW
ð —l‘l TÑ)ðW
ð ˜d™
ð	W
ð
 —\‘\ DÑ(ðW
ð "'¨¡ðW
ð "'¨¡ðW
ð ˜D‘[ðW
ð 
ˆu�|‰|˜UŸ\™\Ð)Ñ	*¨ZÑ	7ôW
ó öW
r-   r:  )r   )rº   )Jr'   rÇ   Úcollections.abcr   Údataclassesr   r(   r   Ú r   r%  Úactivationsr   Úcache_utilsr	   r
   Úmasking_utilsr   Úmodeling_layersr   Úmodeling_outputsr   Úmodeling_rope_utilsr   r   Úmodeling_utilsr   r   Úprocessing_utilsr   r‹   r   r   r   r   Úutils.deprecationr   Úutils.genericr   Úconfiguration_mimir   Ú
get_loggerr#   rz   r   r0   rb   re   ÚModulerh   rÂ   rÐ   rë   r
  r  rG  rO  rQ  r`   r]   rd  r¾   rv  rx  r“  r¦  rÂ  rÉ  ré  rõ  r  r  r:  Ú__all__r"   r-   r.   Ú<module>r|     sÂ  ðñ ã Ý $Ý !ã Ý å &Ý !ß .Ý >Ý 9Ý 7ß Kß FÝ &ß MÓ MÝ 0Ý +Ý *ð 
×	Ò	˜HÓ	%€ð Ø
ô1�ó 1ó ó ð1÷<[ñ [ð| Ø
ô8˜ó 8ó ó ð8ð* Ø
ô1˜ó 1ó ó ð1ô$I�—‘ô IôX7˜"Ÿ)™)ô 7ôt'(�b—i‘iô '(ôT*�"—)‘)ô *ôZ�R—Y‘Yô ô 6<˜"Ÿ)™)ô 6<òt(ôô2ˆb�i‰iô ð"	U˜UŸ\™\ð 	U°#ð 	U¸%¿,¹,ô 	Uð( ñ%Ø�I‰Ið%à�<‰<ð%ð 
�‰ð%ð �<‰<ð	%ð
 —L‘L 4Ñ'ð%ð ð%ð ð%ð Ð'Ñ(õ%ô2E)�B—I‘Iô E)ôP2Ð5ô 2ôjR
˜2Ÿ9™9ô R
ôj�"—)‘)ô ôB*˜BŸI™Iô *ô\˜RŸY™Yô ô(3 "§)¡)ô 3ôl5 r§y¡yô 5ðp ô%*˜/ó %*ó ð%*ñP ðñô
f
Ð#ó f
óð
f
ðR Ð-Ð
.�r-   