Ë
    éÓ^j… ã                   ó´  — d Z ddlZddlZddlmZmZmZ ddlmZ ddl	m
Z
mZmZmZmZmZmZmZmZ ddlZddlmZ ddlmc mZ ddlmZmZ ddlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( dd	l)m*Z* dd
l+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z: ddgZ; ejx                  e=«      Z>e G d„ d«      «       Z?de?de?fd„Z@	 	 dHdej‚                  deeBeBf   deCdeCdeej‚                  eeBeBf   f   f
d„ZDdej‚                  fd„ZE G d„ d«      ZFde?de
fd „ZGe/ G d!„ d"ej�                  «      «       ZIe.dddej”                  fd#ej‚                  d$eBd%eCd&eeB   d'ej–                  deej‚                     fd(„«       ZLe.	 	 	 	 dIdej‚                  d#eej‚                     d)eMd$eBd*eCdej‚                  fd+„«       ZN G d,„ dej�                  «      ZOd-„ ZPdJd.eMd/eQd0eCde
fd1„ZRd2eeMef   d3eOdeeMef   fd4„ZSdKd5eMdeeMef   fd6„ZT e5 eTd7¬8«       eTd7¬8«       eTd7¬8«       eT«        eT«        eT«        eTd7d¬9«       eTd7d¬9«      d:œ«      ZUdLd;eMd<eCdeOfd=„ZV	 dLd;eMd<eCdeOfd>„ZW	 dLd;eMd<eCdeOfd?„ZXe4dLd<eCdeOfd@„«       ZYe4dLd<eCdeOfdA„«       ZZe4dLd<eCdeOfdB„«       Z[e4dLd<eCdeOfdC„«       Z\e4dLd<eCdeOfdD„«       Z]e4dLd<eCdeOfdE„«       Z^e4dLd<eCdeOfdF„«       Z_e4dLd<eCdeOfdG„«       Z`y)Maœ   NaFlex Vision Transformer

An improved version of the Vision Transformer with:
1. Encapsulated embedding and position encoding in a single module
2. Support for linear patch embedding on pre-patchified inputs
3. Support for NaFlex variable aspect, variable resolution
4. Support for FlexiViT variable patch size
5. Support for NaViT fractional/factorized position embedding

Based on ideas from:
- Original Vision Transformer: https://arxiv.org/abs/2010.11929
- FlexiViT: https://arxiv.org/abs/2212.08013
- NaViT: https://arxiv.org/abs/2307.06304
- NaFlex (SigLip-2): https://arxiv.org/abs/2502.14786

Hacked together by / Copyright 2025, Ross Wightman, Hugging Face
é    N)Ú	dataclassÚfieldsÚreplace)Úpartial)	ÚCallableÚDictÚListÚOptionalÚSetÚTupleÚTypeÚUnionÚAny©ÚIMAGENET_INCEPTION_MEANÚIMAGENET_INCEPTION_STD)ÚAttentionPoolLatentÚMlpÚ	LayerNormÚPatchDropoutWithIndicesÚPatchEmbedInterpolatorÚ_assertÚ	to_2tupleÚget_act_layerÚget_norm_layerÚapply_keep_indices_nlcÚdisable_compilerÚcalculate_drop_path_ratesé   )Úbuild_model_with_cfg)Úfeature_take_indices)Úregister_notrace_functionÚregister_notrace_module)Ú
checkpointÚnamed_apply)Úregister_modelÚgenerate_default_cfgs)ÚEvaBlock)ÚBlockÚglobal_pool_nlcÚNaFlexVitCfgÚ	NaFlexVitc                   óœ  — e Zd ZU dZdZeeeeef   f   ed<   dZ	eed<   dZ
eed<   dZeed<   d	Zeed
<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZee   ed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   d Z eeeef      ed!<   d"Z!eed#<   dZ"eed$<   dZ#eed%<   d&Z$eed'<   d(Z%eed)<   dZ&eeeef      ed*<   dZ'eed+<   d,Z(eed-<   dZ)eed.<   dZ*eeeeef      ed/<   dZ+eed0<   dZ,eed1<   dZ-eed2<   dZ.eed3<   dZ/ee   ed4<   d5Z0eed6<   dZ1eed7<   dZ2ee   ed8<   dZ3ee   ed9<   d&Z4eed:<   dZ5eed;<   d<Z6eed=<   dZ7ee   ed><   dZ8ee   ed?<   dZ9ee   ed@<   dZ:ee   edA<   dZ;ee   edB<   dZ<ee   edC<   dZ=ee   edD<   dEZ>eedF<   dZ?eedG<   dZ@eedH<   dZAeedI<   dZBeedJ<   y)Kr+   zôConfiguration for FlexVit model.

    This dataclass contains the bulk of model configuration parameters,
    with core parameters (img_size, in_chans, num_classes, etc.) remaining
    as direct constructor arguments for API compatibility.
    é   Ú
patch_sizeé   Ú	embed_dimé   ÚdepthÚ	num_headsg      @Ú	mlp_ratioFÚscale_mlp_normTÚqkv_biasÚqk_normÚ	proj_biasç        Úattn_drop_rateÚscale_attn_inner_normNÚinit_valuesÚ	drop_rateÚpos_drop_rateÚpatch_drop_rateÚproj_drop_rateÚdrop_path_rateÚclass_tokenr   Ú
reg_tokensÚlearnedÚ	pos_embed)r.   r.   Úpos_embed_grid_sizeÚbicubicÚpos_embed_interp_modeÚpos_embed_ar_preservingÚpos_embed_use_grid_sampleÚ Ú	rope_typeç     ˆÃ@Úrope_temperatureÚrope_ref_feat_shapeÚrope_grid_offsetÚijÚrope_grid_indexingÚrope_rotate_halfÚrope_mrope_sectionÚdynamic_img_padÚpatchify_channels_lastÚpre_normÚ
final_normÚfc_normÚmapÚglobal_poolÚpool_include_prefixÚattn_pool_num_headsÚattn_pool_mlp_ratioÚweight_initÚfix_initÚlinearÚembed_proj_typeÚinput_norm_layerÚembed_norm_layerÚ
norm_layerÚ	act_layerÚblock_fnÚ	mlp_layerÚ
attn_layerÚstandardÚ	attn_typeÚ
attn_gatedÚ
swiglu_mlpÚ	qkv_fusedÚenable_patch_interpolator)CÚ__name__Ú
__module__Ú__qualname__Ú__doc__r/   r   Úintr   Ú__annotations__r1   r3   r4   r5   Úfloatr6   Úboolr7   r8   r9   r;   r<   r=   r
   r>   r?   r@   rA   rB   rC   rD   rF   ÚstrrG   rI   rJ   rK   rM   rO   rP   rQ   rS   rT   rU   rV   rW   rX   rY   rZ   r\   r]   r^   r_   r`   ra   rc   rd   re   rf   rg   rh   ri   rj   rl   rm   rn   ro   rp   © ó    ú`/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/naflexvit.pyr+   r+   :   sÂ  … ñð /1€J��c˜5  c ™?Ð*Ñ+Ó0Ø€IˆsÓØ€Eˆ3ƒOØ€IˆsÓØ€IˆuÓØ €N�DÓ ð €HˆdÓØ€GˆTÓØ€IˆtÓØ€N�EÓØ"'Ð˜4Ó'ð $(€K�˜%‘Ó'Ø€IˆuÓØ€M�5ÓØ €O�UÓ Ø€N�EÓØ€N�EÓð €K�ÓØ€J�Óð €IˆsÓØ5=Ð˜ %¨¨S¨¡/Ñ2Ó=Ø!*Ð˜3Ó*Ø$)Ð˜TÓ)Ø&+Ð˜tÓ+ð €IˆsÓØ%Ð�eÓ%Ø59Ð˜ %¨¨S¨¡/Ñ2Ó9Ø Ð�eÓ Ø"Ð˜Ó"Ø"Ð�dÓ"Ø9=Ð˜  s¨C° }Ñ!5Ñ6Ó=ð "€O�TÓ!Ø#'Ð˜DÓ'ð €HˆdÓØ€J�ÓØ"€GˆX�d‰^Ó"ð €K�ÓØ %Ð˜Ó%Ø)-Ð˜ #™Ó-Ø+/Ð˜ %™Ó/ð €K�ÓØ€HˆdÓð $€O�SÓ#Ø&*Ð�h˜s‘mÓ*Ø&*Ð�h˜s‘mÓ*ð !%€J�˜‘Ó$Ø#€Iˆx˜‰}Ó#Ø"€Hˆh�s‰mÓ"Ø#€Iˆx˜‰}Ó#Ø $€J�˜‘Ó$ð  €IˆsÓØ€J�ÓØ€J�ÓØ€IˆtÓð ',Ð˜tÔ+r{   ÚcfgÚreturnc                 óÄ   — t        | j                  j                  «       «      }|j                  «       D ��ci c]  \  }}||v sŒ||“Œ }}}|rt	        | fi |¤Ž} | S c c}}w )zIOverlay kwargs onto config, replacing config values with provided kwargs.)ÚsetÚ__dataclass_fields__ÚkeysÚitemsr   )r}   ÚkwargsÚconfig_fieldsÚkÚvÚconfig_kwargss         r|   Ú_overlay_kwargsr‰   –   sb   € ô ˜×0Ñ0×5Ñ5Ó7Ó8€MØ&,§l¡l£n×K™d˜a ¸¸]Ò8J�Q˜‘TÐK€MÑKáÜ�cÑ+˜]Ñ+ˆà€Jùó Ls   ·AÁATÚxr/   ÚpadÚchannels_lastc                 óÚ  — | j                   \  }}}}|\  }}	|rQ||z  dk7  s||	z  dk7  rA|||z  z
  |z  }
|	||	z  z
  |	z  }t        j                  | d|d|
f«      } | j                   \  }}}}||z  ||	z  }}|r+| j                  ||||||	«      j	                  dddddd«      }n*| j                  ||||||	«      j	                  dddddd«      }|j                  |||z  ||	z  |z  «      }|||ffS )uÏ  Patchify a batch of images.

    Args:
        x: Input tensor of shape ``[B, C, H, W]``.
        patch_size: Patch dimensions ``(patch_h, patch_w)``.
        pad: Whether to pad images to be divisible by patch size.
        channels_last: Per-patch flat layout. ``True`` (default) yields ``P-P-C``
            flat (channel index varies fastest); ``False`` yields ``C-P-P`` flat
            (channel index varies slowest â€” HF / Gemma4 native layout).

    Returns:
        Tuple of ``(patches, grid_size)`` where ``patches`` has shape ``[B, N, P*P*C]``
        and ``grid_size`` is ``(num_patches_h, num_patches_w)``. Grid order within
        ``N`` is row-major over ``(y, x)`` regardless of ``channels_last``.
    r   é   é   é   é   r   )ÚshapeÚFr‹   ÚviewÚpermuteÚreshape)rŠ   r/   r‹   rŒ   ÚBÚCÚHÚWÚphÚpwÚpad_hÚpad_wÚ_ÚnhÚnwÚpatchess                   r|   Úbatch_patchifyr£   ¢   s"  € ð* —‘�J€A€qˆ!ˆQØ�F€Bˆñ ��B‘˜!’˜q 2™v¨š{Ø�a˜"‘f‘ Ñ"ˆØ�a˜"‘f‘ Ñ"ˆÜ�E‰E�!�a˜  5Ð)Ó*ˆØ—W‘W‰
ˆˆ1ˆa�à�"‰W�a˜2‘gˆ€Bñ Ø—&‘&˜˜A˜r 2 r¨2Ó.×6Ñ6°q¸!¸QÀÀ1ÀaÓH‰à—&‘&˜˜A˜r 2 r¨2Ó.×6Ñ6°q¸!¸QÀÀ1ÀaÓHˆà�o‰o˜a  b¡¨"¨r©'°A©+Ó6€Gà�R˜�HÐÐr{   Ú_coordc           	      ó(  — | d d …d d …df   j                  d¬«      dz   }| d d …d d …df   j                  d¬«      dz   }t        ||«      D ��cg c]7  \  }}t        |j                  «       «      t        |j                  «       «      f‘Œ9 c}}S c c}}w )Nr   r   ©Údim)ÚamaxÚzipru   Úitem)r¤   Úmax_yÚmax_xÚhÚws        r|   Úcalculate_naflex_grid_sizesr¯   Ï   s~   € à’1’a˜�7‰O× Ñ  QÐ Ó'¨!Ñ+€EØ’1’a˜�7‰O× Ñ  QÐ Ó'¨!Ñ+€EÜ7:¸5À%Ó7H×I©t¨q°!ŒS�—‘“‹]œC §¡£›MÒ*ÓIÐIùÓIs   Á<Bc                   ó˜   — e Zd ZdZdeeeef   ee   f   deeeef      dededej                  dej                  fd„Zd	„ Zed
„ «       Zy)ÚNaFlexRopeIteratorzXIterator for generating batched ROPE embeddings for mixed mode with multiple grid sizes.Úsize_to_indicesÚunique_sizesÚ
batch_sizeÚseq_lenÚdeviceÚdtypec                 óX  — || _         || _        || _        || _        || _        || _        || _        |j                  | _        |j                  | _        d|j                  z  |j                  z  | _
        d| _        i | _        |D ]#  }|j                  |¬«      }	|	| j                  |<   Œ% y )NrŽ   r   ©r’   )Úroper²   r³   r´   rµ   r·   r¶   r3   r4   r§   Úhead_dimÚ
_depth_idxÚ_embeddings_per_sizeÚ	get_embed)
ÚselfÚrope_moduler²   r³   r´   rµ   r¶   r·   Ú	grid_sizeÚ
rope_embeds
             r|   Ú__init__zNaFlexRopeIterator.__init__Ù   s¯   € ð  ˆŒ	Ø.ˆÔØ(ˆÔØ$ˆŒØˆŒØˆŒ
ØˆŒØ ×&Ñ&ˆŒ
Ø$×.Ñ.ˆŒØ˜KŸO™OÑ+¨{×/DÑ/DÑDˆŒØˆŒð %'ˆÔ!Ø%ò 	>ˆIà$×.Ñ.°YÐ.Ó?ˆJØ3=ˆD×%Ñ% iÒ0ñ	>r{   c                 ó   — d| _         | S )Nr   )r¼   ©r¿   s    r|   Ú__iter__zNaFlexRopeIterator.__iter__ö   s   € ØˆŒØˆr{   c           	      óì  — | j                   | j                  k\  rt        ‚t        j                  | j
                  | j                  | j                  | j                  | j                  | j                  ¬«      }| j                  D ]Y  }|\  }}||z  }| j                  |   }| j                  |   | j                      }|D ]  }|d d …d |…d d …f   ||d d …d |…d d …f<   Œ Œ[ | xj                   dz  c_         |S )N©r·   r¶   r   )r¼   r3   ÚStopIterationÚtorchÚzerosr´   r4   rµ   r»   r·   r¶   r³   r²   r½   )	r¿   Úbatch_embedrÁ   r­   r®   Ú
actual_lenÚbatch_indicesÚembedÚbis	            r|   Ú__next__zNaFlexRopeIterator.__next__ú   sô   € à�?‰?˜dŸj™jÒ(ÜÐô —k‘kØ�O‰O˜TŸ^™^¨T¯\©\¸4¿=¹=Ø—*‘* T§[¡[ô
ˆð ×*Ñ*ò 
	NˆIØ‰DˆAˆqØ˜Q™ˆJØ ×0Ñ0°Ñ;ˆMð ×-Ñ-¨iÑ8¸¿¹ÑIˆEð $ò N�Ø5:º1¸k¸z¸kÊ1Ð;LÑ5M�˜B¢ ; J ;²Ð1Ò2ñNð
	Nð 	�Š˜1Ñ�ØÐr{   N)rq   rr   rs   rt   r   r   ru   r	   rÊ   r¶   r·   rÃ   rÆ   r   rÑ   rz   r{   r|   r±   r±   Ö   sŠ   „ Ùbð>ð ˜e C¨ H™o¨t°C©yÐ8Ñ9ð>ð ˜5  c ™?Ñ+ð	>ð
 ð>ð ð>ð —‘ð>ð �{‰{ó>ò:ð ñó ñr{   r±   c                 ó®  — | j                   dv xs* | j                  dvxs | j                  xs | j                  }|r£| j                   }|dk(  r| j                  dvrd}| j                  rdnd| j
                  z   }t        t        || j                  | j                  | j                  | j                  || j                  xs | j                  dk(  | j                  ¬«	      S | j                  xs t        }i }| j                  s| j                  r| j                  |d	<   | j                  |d
<   | j                  r| j                  |d<   |rt        |fi |¤Ž}|S )z¸Get appropriate block function based on configuration.

    Returns a partially applied block constructor with EVA-specific
    or conflicting parameters pre-configured if needed.
    )Úevarº   )rL   Únonerk   rº   r   r   Úmrope)rl   rn   Ú	scale_mlpÚscale_attn_innerro   Únum_prefix_tokensÚrotate_halfÚ
gated_attnr6   Úscale_attn_normrj   )rl   rM   rn   rm   rC   rD   r   r(   r6   r<   ro   rT   rh   r)   rj   )r}   Úuse_eva_featuresrl   rØ   rh   Úblock_kwargss         r|   Úget_block_fnrÞ     sE  € ð 	�‰˜Ð(ò 	Ø�‰˜\Ð)ò	à�‰ò	ð 	�‰ð	 ñ à—M‘Mˆ	Ø˜
Ò" s§}¡}¸LÑ'HØˆIà"%§/¢/™Q°q¸C¿N¹NÑJÐÜÜØØ—~‘~Ø×(Ñ(Ø ×6Ñ6Ø—m‘mØ/Ø×,Ñ,ÒH°·±ÀÑ0HØ—~‘~ô

ð 
	
ð —<‘<Ò(¤5ˆØˆØ×Ò ×!:Ò!:à-0×-?Ñ-?ˆLÐ)Ñ*Ø.1×.GÑ.GˆLÐ*Ñ+Ø�>Š>Ø),¯©ˆL˜Ñ&ÙÜ˜xÑ8¨<Ñ8ˆHØˆr{   c            +       óÄ  ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d*deeeeef   f   dededee   de	de	d	ed
e	deeeeeef   f      dedeeeef      dede	de	dee
ej                        dee	ee
ej                        f   dee
ej                        dede	de	ddf*ˆ fd„Zd+d„Zdeeef   fd„Zd,de	deeeeef   f   fd„Zdeeef   deeef   fd„Zedej.                  d ej.                  ddfd!„«       Zedej.                  d ej.                  ddfd"„«       Zdej.                  d#ee   ddfd$„Zedej.                  d ej.                  ddfd%„«       Zedej.                  d ej.                  ddfd&„«       Zdej.                  d#ee   ddfd'„Z	 	 d-dej.                  d eej.                     d(eej.                     deej.                  eeeef      f   fd)„Zˆ xZ S ).ÚNaFlexEmbedsaõ  NaFlex Embedding module for Vision Transformers.

    This module encapsulates the complete embedding process for Vision Transformers,
    supporting both standard and NaFlex (NaViT + FlexiViT) functionality:

    1. Patch embedding (via Conv2d or Linear)
    2. Class and register token preparation
    3. Position embedding addition with interpolation support
    4. Pre-normalization (if requested)
    5. Dropout application

    NaFlex capabilities include:
    - Variable aspect ratio and resolution via patch coordinates
    - Patch type indicators for handling padding tokens in attention
    - Flexible position embedding interpolation for arbitrary grid sizes
    - Support for factorized position embeddings

    The patch embedding can be one of two types:
    - Conv2d-based (default): For standard image inputs [B, C, H, W]
    - Linear-based: For pre-patchified inputs [B, N, P*P*C]

    Args:
        patch_size: Size of patches for patch embedding
        in_chans: Number of input image channels
        embed_dim: Dimensionality of patch embedding
        proj_type: Type of embedding projection layer ('conv' or 'linear')
        input_norm_layer: Normalization layer applied to input (linear mode only)
        proj_norm_layer: Normalization layer applied after projection
        pos_embed: Type of position embedding ('learned', 'factorized', 'none')
        pos_drop_rate: Dropout rate for position embeddings
        class_token: Whether to include a class token
        reg_tokens: Number of register tokens to include
        bias: Whether to use bias in projection layers
        dynamic_img_pad: Whether to enable dynamic padding for variable resolution
        pos_embed_grid_size: Grid size for position embedding initialization
        pos_embed_interp_mode: Interpolation mode for position embedding resizing
        pos_embed_ar_preserving: Whether to preserve aspect ratio during position embedding interpolation
        default_img_size: Default image size for position embedding grid calculation
    Nr/   Úin_chansr1   Ú	proj_typer9   rC   rD   rV   Údefault_img_sizerF   rG   rI   rJ   rK   rd   Úproj_norm_layerrf   r?   rp   rŒ   r~   c                 ó°  •— ||dœ}t         ‰| �  «        || _        || _        || _        || _        || _        t        |«      | _        || _	        || _
        || _        || _        || _        |rdnd| _        | xj                  |z  c_        |r+t        j                   t#        j$                  dd|fi |¤Ž«      nd| _        |r+t        j                   t#        j$                  d||fi |¤Ž«      nd| _        d| _        d| _        |�|| _        nV|	�Tt        |	«      | _        t/        t1        | j*                  | j                  «      D ��cg c]
  \  }}||z  ‘Œ c}}«      | _        |dk(  ry| j                  d   | j                  d   z  |z  }|du r	|€J d«       ‚|du r|n|xs d}|r ||«      nd| _        t        j4                  ||fd|i|¤Ž| _        d	| _        d| _        n9|rJ ‚d| _        t        j<                  ||f|||d
œ|¤Ž| _        d| _        d	| _        | j                  r!t?        | j                  |||d|¬«      | _         nd| _         |du r	|€J d«       ‚|du r|n|xs d}|r ||«      nt        jB                  «       | _"        |
dv r| j,                  €tG        d«      ‚d| _$        d| _%        d| _&        |
r|
dk(  rd| _'        nß|
dk(  r…| j,                  €J ‚| j,                  \  }}d| _'        t        j                   t#        j$                  d||fi |¤Ž«      | _%        t        j                   t#        j$                  d||fi |¤Ž«      | _&        nU| j,                  €J ‚| j,                  \  }}t        j                   t#        j$                  d|||fi |¤Ž«      | _$        d| _'        t        jP                  |¬«      | _)        | jU                  «        yc c}}w )aÀ  Initialize NaFlexEmbeds module.

        Args:
            patch_size: Size of patches for patch embedding.
            in_chans: Number of input image channels.
            embed_dim: Dimensionality of patch embedding.
            proj_type: Type of embedding projection layer ('conv' or 'linear').
            proj_bias: Whether to use bias in projection layers.
            class_token: Whether to include a class token.
            reg_tokens: Number of register tokens to include.
            dynamic_img_pad: Whether to enable dynamic padding for variable resolution.
            default_img_size: Default image size for position embedding grid calculation.
            pos_embed: Type of position embedding ('learned', 'factorized', 'none').
            pos_embed_grid_size: Grid size for position embedding initialization.
            pos_embed_interp_mode: Interpolation mode for position embedding resizing.
            pos_embed_ar_preserving: Whether to preserve aspect ratio during interpolation.
            input_norm_layer: Normalization layer applied to input (linear mode only).
            proj_norm_layer: Normalization layer applied after projection.
            norm_layer: Default normalization layer.
            pos_drop_rate: Dropout rate for position embeddings.
            enable_patch_interpolator: Enable dynamic patch size support.
            channels_last: Per-patch flat layout: True=(ph,pw,C) [NaFlex default], False=(C,ph,pw).
        ©r¶   r·   r   r   Nrb   Tz5`norm_layer` must be given when input_norm_layer=TrueÚbiasF)Úkernel_sizeÚstriderç   )Úbase_patch_sizerá   r1   ÚinterpolationÚ	antialiasrŒ   z4`norm_layer` must be given when proj_norm_layer=True)Ú
factorizedrE   zgCannot initialize position embeddings without grid_size.Please provide img_size or pos_embed_grid_size.rÔ   rí   rE   )Úp)+ÚsuperrÃ   Úhas_class_tokenÚnum_reg_tokensrI   rJ   rK   r   r/   rá   r1   rV   rp   rŒ   rØ   ÚnnÚ	ParameterrÊ   ÚemptyÚ	cls_tokenÚ	reg_tokenrã   rG   Útupler©   Ú
norm_inputÚLinearÚprojÚflattenÚ	is_linearÚConv2dr   Úpatch_interpolatorÚIdentityÚnormÚ
ValueErrorrF   Úpos_embed_yÚpos_embed_xÚpos_embed_typeÚDropoutÚpos_dropÚreset_parameters)r¿   r/   rá   r1   râ   r9   rC   rD   rV   rã   rF   rG   rI   rJ   rK   rd   rä   rf   r?   rp   rŒ   r¶   r·   ÚddÚsrî   Ú	patch_dimr­   r®   Ú	__class__s                                €r|   rÃ   zNaFlexEmbeds.__init__o  s  ø€ ð` ¨Ñ/ˆÜ‰ÑÔØ*ˆÔØ(ˆÔØ%:ˆÔ"Ø'>ˆÔ$Ø)BˆÔ&Ü# JÓ/ˆŒØ ˆŒØ"ˆŒØ.ˆÔØ)BˆÔ&Ø*ˆÔñ '2¡°qˆÔØ×Ò *Ñ,Õñ NYœŸ™¤e§k¡k°!°Q¸	Ñ&HÀRÑ&HÔIÐ^bˆŒÙV`œŸ™¤e§k¡k°!°ZÀÑ&QÈbÑ&QÔRÐfjˆŒð <@ˆÔØ>BˆÔ ØÐ*à':ˆDÕ$ØÐ)ä$-Ð.>Ó$?ˆDÔ!Ü',ÄÀT×EZÑEZÐ\`×\kÑ\kÓAl×-m¹¸¸A¨a°1«fÓ-mÓ'nˆDÔ$ð ˜Ò ð Ÿ™¨Ñ*¨T¯_©_¸QÑ-?Ñ?À(ÑJˆIØ(¨DÑ0°ZÐ5Gð HØGóHÐHà-=ÀÑ-E™zÐL\ÒLdÐ`dÐÙ=MÑ.¨yÔ9ÐSWˆDŒOÜŸ	™	 )¨YÑM¸YÐMÈ"ÑMˆDŒIØ ˆDŒLØ!ˆD�Nñ (Ð'Ð'Ø"ˆDŒOÜŸ	™	ØØðð 'Ø!Øñð ñˆDŒIð  ˆDŒLØ"ˆDŒNð ×)Ò)Ü&<Ø $§¡Ø!Ø#Ø3ØØ+ô'ˆDÕ#ð '+ˆDÔ#ð $ tÑ+°
Ð0Bð 	CØBó	CÐCà(7¸4Ñ(?™*ÀoÒF]ÐY]ˆÙ2A‘O IÔ.ÄrÇ{Á{Ã}ˆŒ	ð Ð1Ñ1°d×6NÑ6NÐ6VÜðBóCð Cð 26ˆŒØ37ˆÔØ37ˆÔÙ˜I¨Ò/Ø"(ˆDÕØ˜,Ò&Ø×+Ñ+Ð7Ð7Ð7Ø×+Ñ+‰DˆAˆqØ".ˆDÔÜ!Ÿ|™|¬E¯K©K¸¸1¸iÑ,NÈ2Ñ,NÓOˆDÔÜ!Ÿ|™|¬E¯K©K¸¸1¸iÑ,NÈ2Ñ,NÓOˆDÕà×+Ñ+Ð7Ð7Ð7Ø×+Ñ+‰DˆAˆqÜŸ\™\¬%¯+©+°a¸¸A¸yÑ*OÈBÑ*OÓPˆDŒNØ"+ˆDÔô Ÿ
™
 ]Ô3ˆŒð 	×ÑÕùóU .ns   ÅO
c                 ó,  — | j                   �+t        j                  j                  | j                   d¬«       | j                  �+t        j                  j                  | j                  d¬«       | j
                  �+t        j                  j                  | j
                  d¬«       | j                  �+t        j                  j                  | j                  d¬«       | j                  �,t        j                  j                  | j                  d¬«       y y )Ng�íµ ÷Æ°>)Ústdg{®Gáz”?)rõ   rò   ÚinitÚnormal_rö   rF   r  r  rÅ   s    r|   r  zNaFlexEmbeds.reset_parameters
  s¹   € Ø�>‰>Ð%Ü�G‰G�O‰O˜DŸN™N°ˆOÔ5Ø�>‰>Ð%Ü�G‰G�O‰O˜DŸN™N°ˆOÔ5Ø�>‰>Ð%Ü�G‰G�O‰O˜DŸN™N°ˆOÔ4Ø×ÑÐ'Ü�G‰G�O‰O˜D×,Ñ,°#ˆOÔ6Ø×ÑÐ'Ü�G‰G�O‰O˜D×,Ñ,°#ˆOÕ6ð (r{   c                 óD   — t        | j                  | j                  ¬«      S )zãGet feature information for feature extraction.

        Args:
            location: Feature extraction location identifier

        Returns:
            Dictionary containing feature channel count and reduction factor
        )Únum_chsÚ	reduction)Údictr1   r/   )r¿   Úlocations     r|   Úfeature_infozNaFlexEmbeds.feature_info  s   € ô ˜DŸN™N°d·o±oÔFÐFr{   Ú	as_scalarc                 óH   — |rt        | j                  «      S | j                  S )zìGet the feature reduction ratio (stride) of the patch embedding.

        Args:
            as_scalar: Whether to return the maximum dimension as a scalar

        Returns:
            Feature reduction ratio as scalar or tuple
        )Úmaxr/   )r¿   r  s     r|   Ú
feat_ratiozNaFlexEmbeds.feat_ratio!  s    € ñ Ü�t—‘Ó'Ð'à—?‘?Ð"r{   Úimg_sizec                 ó  — | j                   rPt        j                  |d   | j                  d   z  «      t        j                  |d   | j                  d   z  «      fS |d   | j                  d   z  |d   | j                  d   z  fS )a  Calculate grid (feature) size for given image size.

        Takes into account dynamic padding when enabled.

        Args:
            img_size: Input image size as (height, width)

        Returns:
            Grid size as (grid_height, grid_width)
        r   r   )rV   ÚmathÚceilr/   )r¿   r  s     r|   Údynamic_feat_sizezNaFlexEmbeds.dynamic_feat_size/  sƒ   € ð ×ÒÜ—9‘9˜X a™[¨4¯?©?¸1Ñ+=Ñ=Ó>ÄÇ	Á	È(ÐSTÉ+ÐX\×XgÑXgÐhiÑXjÑJjÓ@kÐkÐkà˜A‘; $§/¡/°!Ñ"4Ñ4°h¸q±kÀTÇ_Á_ÐUVÑEWÑ6WÐWÐWr{   rŠ   Úpatch_coordc           
      óz  ‡ ‡‡‡‡— t        |«      }‰ j                  j                  dd \  ŠŠ‰ j                  j                  dddd«      j	                  «       Šˆˆˆˆ ˆfd„}i }t        |«      D ]&  \  }}|j                  |g «      j                  |«       Œ( |j                  «       D ]‘  \  }} ||«      }	t        ‰j                  d   |	j                  d   «      }
‰dd…d|
…f   j                  dt        j                  |‰j                  ¬«      |	dd…d|
…f   j                  t        |«      dd«      «       Œ“ y)	a_  Apply learned position embeddings to NaFlex batch in-place.

        Interpolates learned 2D position embeddings for each sample in the batch
        based on their individual grid sizes.

        Args:
            x: Input tensor to add position embeddings to [B, N, C]
            patch_coord: Patch coordinates [B, N, 2] with (y, x) values
        r   r�   r   rŽ   c                 ó’  •— | d   ‰k(  r)| d   ‰k(  r!‰j                   j                  d‰‰z  d«      }nz‰j                  rt        t	        | «      «      n| }t        j                  ‰|‰j                  dd¬«      dd…dd…d| d   …d| d   …f   j                  d«      j                  dd«      }|j                  ‰j                  ¬	«      S )
a  
            Return a flattened positional-embedding grid at an arbitrary spatial resolution.

            Converts the learned 2-D table stored in NCHW format (pos_embed_nchw) into
            a (1, H*W, C) sequence that matches the requested size.
            r   r   éÿÿÿÿFT©ÚsizeÚmodeÚalign_cornersrì   NrŽ   ©r·   )rF   r–   rJ   r   r  r“   ÚinterpolaterI   rû   Ú	transposeÚtor·   )r$  Úpos_embed_flatÚ_interp_sizeÚorig_hÚorig_wÚpos_embed_nchwr¿   rŠ   s      €€€€€r|   Ú	_interp2dz?NaFlexEmbeds._apply_learned_naflex_pos_embed.<locals>._interp2dS  sÉ   ø€ ð �Q‘˜6Ò!¨¨Q©°6Ò(9Ø!%§¡×!7Ñ!7¸¸6ÀF¹?ÈBÓ!O‘à7;×7SÒ7Sœy¬¨T«Ô3ÐY]�Ü!"§¡Ø"Ø%Ø×3Ñ3Ø"'Ø"ô"ò ’Q˜˜˜a™˜ ( 4¨¡7 (Ð*ñ",÷ -4©G°A«J·y±yÀÀA³ð ð "×$Ñ$¨1¯7©7Ð$Ó3Ð3r{   N©r¶   r"  )r¯   rF   r’   r•   rw   Ú	enumerateÚ
setdefaultÚappendrƒ   ÚminÚ
index_add_rÊ   Ú	as_tensorr¶   ÚexpandÚlen)r¿   rŠ   r  Únaflex_grid_sizesr0  r²   rÐ   r†   rÎ   r+  rµ   r-  r.  r/  s   ``         @@@r|   Ú_apply_learned_naflex_pos_embedz,NaFlexEmbeds._apply_learned_naflex_pos_embed?  s.  ü€ ô  8¸ÓDÐØŸ™×-Ñ-¨a°Ð2‰ˆ�ØŸ™×/Ñ/°°1°a¸Ó;×AÑAÓCˆ÷	4ð 	4ð* =?ˆÜÐ0Ó1ò 	9‰EˆB�à×&Ñ& q¨"Ó-×4Ñ4°RÕ8ð	9ð !0× 5Ñ 5Ó 7ò 		ÑˆAˆ}ñ ' q›\ˆNÜ˜!Ÿ'™' !™* n×&:Ñ&:¸1Ñ&=Ó>ˆGØŠa��'�ˆk‰N×%Ñ%ØÜ—‘ °a·h±hÔ?Øšq ( 7 (˜{Ñ+×2Ñ2´3°}Ó3EÀrÈ2ÓNõñ		r{   c                 ó²  — |j                   }|j                  \  }}}|j                  d¬«      j                  dz   }| j                  r.|j                  d¬«      }|j                  «       }	|	x}
}|	|z  x}}n-|j                  d¬«      \  }
}|
|dd…df   z  }||dd…df   z  }t        j                  |dd|t        j                  ¬«      }||dd…ddf<   ||dd…ddf<   |dz
  |dd…ddf<   |dz
  |dd…ddf<   t        j                  ||||
|fd¬	«      }t        j                  | j                  j                  dddd«      j                  |d
d
d
«      j                  «       || j                   dd¬«      j#                  |j$                  ¬«      }t        j&                  ||t        j(                  ¬«      j+                  d«      }|||dd…|d   |d   f   z  }y)a–  Apply learned position embeddings to NaFlex batch using grid_sample.

        Uses F.grid_sample for efficient interpolation of learned 2D position embeddings
        based on patch coordinates. Based on proposal by https://github.com/stas-sl

        Args:
            x: Input tensor to add position embeddings to [B, N, C]
            patch_coord: Patch coordinates [B, N, 2] with (y, x) values
        r   r¦   r   NrŽ   r�   ræ   F©r&  r"  Úborder©r%  r&  Úpadding_moder'  ©.r   ©.r   )r¶   r’   r  ÚvaluesrJ   r¨   rÊ   rË   Úfloat32r“   Úaffine_gridÚgrid_samplerF   r•   r8  rw   rI   r*  r·   ÚarangeÚlongÚ	unsqueeze)r¿   rŠ   r  r¶   r—   ÚNr˜   ÚshapesÚL_iÚL_globalÚgrid_size_yÚgrid_size_xÚscale_xÚscale_yÚthetaÚgridrF   rÐ   s                     r|   Ú+_apply_learned_naflex_pos_embed_grid_samplez8NaFlexEmbeds._apply_learned_naflex_pos_embed_grid_samplex  sÒ  € ð —‘ˆØ—'‘'‰ˆˆ1ˆaØ—‘ Q�Ó'×.Ñ.°Ñ2ˆà×'Ò'Ø—+‘+ !�+Ó$ˆCØ—x‘x“zˆHØ(0Ð0ˆK˜+Ø (¨3¡Ð.ˆG‘gà'-§{¡{°q {Ó'9Ñ$ˆK˜Ø! Fª1¨a¨4¡LÑ0ˆGØ! Fª1¨a¨4¡LÑ0ˆGä—‘˜A˜q !¨F¼%¿-¹-ÔHˆØ ˆŠa��Aˆg‰Ø ˆŠa��Aˆg‰Ø  1™ˆŠa��Aˆg‰Ø  1™ˆŠa��Aˆg‰ä�}‰}˜U Q¨¨;¸Ð$DÐTYÔZˆÜ—M‘MØ�N‰N×"Ñ" 1 a¨¨AÓ.×5Ñ5°a¸¸RÀÓD×JÑJÓLØØ×+Ñ+ØØ!ô
÷ ‰"�1—7‘7ˆ"Ó
ð 	ô �\‰\˜! F´%·*±*Ô=×GÑGÈÓJˆØ	ˆY�rš1˜k¨&Ñ1°;¸vÑ3FÐFÑGÑG‰r{   rÁ   c                 ó8  — | j                   j                  dd \  }}|d   |k(  r)|d   |k(  r!| j                   j                  d||z  d«      }n | j                  rt	        |«      }||f}n|}t        j                  | j                   j                  dddd«      j                  «       || j                  dd¬«      d	d	…d	d	…d	|d   …d	|d   …f   j                  d«      j                  dd«      }|j                  |j                  ¬
«      }|j                  |«       y	)a0  Apply learned position embeddings to standard 2D batch in-place.

        Interpolates learned 2D position embeddings to match the specified grid size.

        Args:
            x: Input tensor to add position embeddings to [B, H*W, C]
            grid_size: Target grid size as [height, width]
        r   r�   r   r"  rŽ   FTr#  Nr'  )rF   r’   r–   rJ   r  r“   r(  r•   rw   rI   rû   r)  r*  r·   Úadd_)r¿   rŠ   rÁ   r-  r.  r+  ÚLr,  s           r|   Ú_apply_learned_pos_embedz%NaFlexEmbeds._apply_learned_pos_embed§  s  € ð Ÿ™×-Ñ-¨a°Ð2‰ˆ�Ø�Q‰<˜6Ò! i°¡l°fÒ&<à!Ÿ^™^×3Ñ3°A°vÀ±ÈÓK‰Nð ×+Ò+Ü˜	“N�Ø  !˜t‘à(�ÜŸ]™]Ø—‘×&Ñ& q¨!¨Q°Ó2×8Ñ8Ó:Ø!Ø×/Ñ/Ø#Øôò ’�M�Y˜q‘\�M = I¨a¡L =Ð0ñ2÷ 3:±'¸!³*¿Y¹YÀqÈ!»_ð ð (×*Ñ*°·±Ð*Ó9ˆà	�‰ˆ~Õr{   c           
      óð  ‡— t        |«      }t        |«      ‰j                  d«      k(  sJ ‚| j                  j                  d   | j
                  j                  d   }}i }t        |«      D ]&  \  }}|j                  |g «      j                  |«       Œ( dt        j                  dt        dt        dt        j                  fˆfd„}	|j                  «       D �]  \  }}
|\  }}| j                  rt        ||«      x}}n||}} |	| j                  ||«      dd…d|…f   } |	| j
                  ||«      dd…d|…f   }|j                  d	«      |j                  d«      z   }|j!                  dd	«      }t#        ‰j                  d   |j                  d   «      }‰dd…d|…f   j%                  dt        j&                  |
‰j(                  ¬
«      |dd…d|…f   j+                  t        |
«      dd«      «       �Œ  y)ac  Apply factorized position embeddings to NaFlex batch in-place.

        Uses separate Y and X position embedding tables that are interpolated
        and combined for each sample's grid size.

        Args:
            x: Input tensor to add position embeddings to [B, N, C]
            patch_coord: Patch coordinates [B, N, 2] with (y, x) values
        r   r   ÚtableÚ
new_lengthÚorig_lengthr~   c                 ó  •— ||k(  r| j                  ‰j                  ¬«      S t        j                  | j	                  ddd«      j                  «       |dd¬«      j	                  ddd«      j                  ‰j                  ¬«      S )z˜
            Resample a 1-D positional-embedding table to specified length
            and return it in (1, L, C) layout, dtype matching x.
            r'  r   rŽ   r   rb   F©r$  r%  r&  ©r*  r·   r“   r(  r•   rw   ©rZ  r[  r\  rŠ   s      €r|   Ú	_interp1dzBNaFlexEmbeds._apply_factorized_naflex_pos_embed.<locals>._interp1då  st   ø€ ð
 ˜[Ò(Ø—x‘x a§g¡g�xÓ.Ð.Ü—=‘=Ø—‘˜a  AÓ&×,Ñ,Ó.ØØØ#ô	÷
 ‰g�a˜˜AÓŸr™r¨¯©˜rÓ0ð1r{   NrŽ   r1  r"  )r¯   r9  r$  r  r’   r  r2  r3  r4  rÊ   ÚTensorru   rƒ   rJ   r  rI  rû   r5  r6  r7  r¶   r8  )r¿   rŠ   r  r:  r-  r.  r²   rÐ   r†   ra  rÎ   Útarget_hÚtarget_wÚlen_yÚlen_xÚpe_yÚpe_xÚposrµ   s    `                 r|   Ú"_apply_factorized_naflex_pos_embedz/NaFlexEmbeds._apply_factorized_naflex_pos_embedÊ  së  ø€ ô  8¸ÓDÐÜÐ$Ó%¨¯©°«Ò2Ð2Ð2ð ×)Ñ)×/Ñ/°Ñ2°D×4DÑ4D×4JÑ4JÈ1Ñ4M�ˆð =?ˆÜÐ0Ó1ò 	9‰EˆB�Ø×&Ñ& q¨"Ó-×4Ñ4°RÕ8ð	9ð	1œUŸ\™\ð 	1´sð 	1Ìð 	1ÔQV×Q]ÑQ]õ 	1ð !0× 5Ñ 5Ó 7ó 	ÑˆAˆ}Ø!"ÑˆH�hØ×+Ò+Ü # H¨hÓ 7Ð7�™à'¨�u�á˜T×-Ñ-¨u°fÓ=ºaÀÀ(À¸lÑKˆDÙ˜T×-Ñ-¨u°fÓ=ºaÀÀ(À¸lÑKˆDð —.‘. Ó# d§n¡n°QÓ&7Ñ7ˆCØ—+‘+˜a Ó#ˆCä˜!Ÿ'™' !™* c§i¡i°¡lÓ3ˆGØŠa��'�ˆk‰N×%Ñ%ØÜ—‘ °a·h±hÔ?Ø’A�x˜�x�KÑ ×'Ñ'¬¨MÓ(:¸BÀÓCöñ	r{   c                 óÆ  ‡‡‡— ‰j                   }‰j                  \  Š}Š|j                  d¬«      dz   }| j                  r.|j                  d¬«      }|j                  «       }|x}}	||z  x}
}n,|j                  d«      \  }}	|	|dd…df   z  }
||dd…df   z  }dt        j
                  dt        j
                  dt        j
                  dt        j
                  fˆˆˆfd	„} || j                  |
|	¬
«      } || j                  ||¬
«      }t	        j                  ‰|t        j                  ¬«      j                  d«      }‰||dd…d|d   f   ||dd…d|d   f   z   z  Šy)a¥  Apply factorized position embeddings to NaFlex batch using grid_sample.

        Uses F.grid_sample for efficient interpolation of separate Y and X position
        embedding tables based on patch coordinates. Based on proposal by https://github.com/stas-sl

        Args:
            x: Input tensor to add position embeddings to [B, N, C]
            patch_coord: Patch coordinates [B, N, 2] with (y, x) values
        r   r¦   r   NrZ  ÚscaleÚ
out_lengthr~   c                 ó²  •— | j                  ddd«      j                  d«      j                  ‰ddd«      j                  «       }t	        j
                  ‰dd‰j                  ¬«      }||d d …ddf<   |dz
  |d d …ddf<   d|d d …ddf<   t        j                  |‰‰d|fd¬«      }t        j                  ||d	dd
¬«      }|j                  ‰j                  «      S )Nr   rŽ   r   r"  r�   r1  Fr=  Úbilinearr>  r?  )r•   rI  r8  rw   rÊ   rË   r¶   r“   rE  rF  r*  r·   )	rZ  rl  rm  ÚperR  rS  r—   r˜   rŠ   s	         €€€r|   ra  zNNaFlexEmbeds._apply_factorized_naflex_pos_embed_grid_sample.<locals>._interp1d'  sÇ   ø€ Ø—‘˜q ! QÓ'×1Ñ1°!Ó4×;Ñ;¸A¸rÀ2ÀrÓJ×PÑPÓRˆBÜ—K‘K  1 a°·±Ô9ˆEØ"ˆE’!�Q˜�'‰NØ" Q™YˆE’!�Q˜�'‰NØˆE’!�Q˜�'‰NÜ—=‘= ¨¨A¨q°*Ð(=ÈUÔSˆDÜ—‘˜r 4¨jÈÐ\dÔeˆBØ—5‘5˜Ÿ™“>Ð!r{   )rl  rm  ræ   rB  rA  )r¶   r’   r¨   rJ   rÊ   rb  r  r  rG  rH  rI  )r¿   rŠ   r  r¶   rŸ   rK  rL  rM  rN  rO  rP  rQ  ra  rh  rg  rÐ   r—   r˜   s    `              @@r|   Ú._apply_factorized_naflex_pos_embed_grid_samplez;NaFlexEmbeds._apply_factorized_naflex_pos_embed_grid_sample  s]  ú€ ð —‘ˆØ—'‘'‰ˆˆ1ˆaØ×!Ñ! aÐ!Ó(¨1Ñ,ˆà×'Ò'à—+‘+ !�+Ó$ˆCØ—x‘x“zˆHØ(0Ð0ˆK˜+Ø (¨3¡Ð.ˆG‘gð (.§{¡{°1£~Ñ$ˆK˜Ø! Fª1¨a¨4¡LÑ0ˆGØ! Fª1¨a¨4¡LÑ0ˆGð	"œUŸ\™\ð 	"´%·,±,ð 	"ÌEÏLÉLð 	"Ô]b×]iÑ]i÷ 	"ñ ˜×)Ñ)°À[ÔQˆÙ˜×)Ñ)°À[ÔQˆä�\‰\˜! F´%·*±*Ô=×GÑGÈÓJˆØ	ˆT�"’a˜˜K¨Ñ/Ð/Ñ0°4¸ºA¸qÀ+ÈfÑBUÐ8UÑ3VÑVÑV‰r{   c                 ó  ‡— | j                   j                  d   | j                  j                  d   }}|\  }}| j                  rt	        ||«      x}}n||}}dt
        j                  dt        dt        dt
        j                  fˆfd„}	 |	| j                   ||«      dd…d|…f   }
 |	| j                  ||«      dd…d|…f   }|
j                  d«      |j                  d«      z   }|j                  dd«      }‰j                  |«       y)	a]  Apply factorized position embeddings to standard 2D batch in-place.

        Uses separate Y and X position embedding tables that are interpolated
        and combined for the specified grid size.

        Args:
            x: Input tensor to add position embeddings to [B, H*W, C]
            grid_size: Target grid size as [height, width]
        r   rZ  r[  r\  r~   c                 ó  •— ||k(  r| j                  ‰j                  ¬«      S t        j                  | j	                  ddd«      j                  «       |dd¬«      j	                  ddd«      j                  ‰j                  ¬«      S )Nr'  r   rŽ   r   rb   Fr^  r_  r`  s      €r|   ra  z;NaFlexEmbeds._apply_factorized_pos_embed.<locals>._interp1dN  sr   ø€ Ø˜[Ò(Ø—x‘x a§g¡g�xÓ.Ð.Ü—=‘=Ø—‘˜a  AÓ&×,Ñ,Ó.ØØØ#ô	÷
 ‰g�a˜˜AÓŸr™r¨¯©˜rÓ0ð1r{   NrŽ   )r  r’   r  rJ   r  rÊ   rb  ru   rI  rû   rV  )r¿   rŠ   rÁ   r-  r.  rc  rd  re  rf  ra  rg  rh  rF   r+  s    `            r|   Ú_apply_factorized_pos_embedz(NaFlexEmbeds._apply_factorized_pos_embed8  s	  ø€ ð ×)Ñ)×/Ñ/°Ñ2°D×4DÑ4D×4JÑ4JÈ1Ñ4M�ˆØ&Ñˆ�(à×'Ò'Ü ¨(Ó3Ð3ˆE‘Eà# X�5ˆEð	1œUŸ\™\ð 	1´sð 	1Ìð 	1ÔQV×Q]ÑQ]õ 	1ñ ˜×)Ñ)¨5°&Ó9º!¸Y¸h¸Y¸,ÑGˆÙ˜×)Ñ)¨5°&Ó9º!¸Y¸h¸Y¸,ÑGˆð —N‘N 1Ó%¨¯©°qÓ(9Ñ9ˆ	Ø"×*Ñ*¨1¨aÓ0ˆà	�‰ˆ~Õr{   Úpatch_validc                 óÈ  — d}|j                   d   }| j                  �r]|€Jt        |j                  dk(  d«       t	        || j
                  | j                  | j                  ¬«      \  }}n*t        |j                  dk(  xs |j                  dk(  d«       | j                  rš|j                  dk(  r‹t        | j                  du d	«       t        | j                  r|j                   d
d n|j                   dd «      }| j                  || j                  j                  | j                  j                  |d¬«      }�nC|j                  d
«      }| j                  �| j                  |«      }| j                  |«      }�nt        |j                  dk(  d«       | j                  r�|j                   dd \  }}| j
                  d   || j
                  d   z  z
  | j
                  d   z  }	| j
                  d   || j
                  d   z  z
  | j
                  d   z  }
t!        j"                  |d|
d|	f«      }| j                  |«      }|j                   dd }| j                  r!|j                  d
«      j%                  dd
«      }| j'                  |«      }| j(                  dk(  rJ|�| j+                  ||¬«       nŒ| j,                  r| j/                  ||¬«       nl| j1                  ||¬«       nX| j(                  dk(  rI|�| j3                  ||¬«       n3| j,                  r| j5                  ||¬«       n| j7                  ||¬«       g }| j8                  �,|j;                  | j8                  j=                  |dd«      «       | j>                  �,|j;                  | j>                  j=                  |dd«      «       |rtA        jB                  ||gz   d¬«      }| jE                  |«      }||fS )a×  Forward pass for patch embedding with position encoding.

        Args:
            x: Input tensor. Supported formats:
                - [B, C, H, W] for conv mode
                - [B, N, P*P*C] for pre-patchified linear mode (normal)
                - [B, N, Ph, Pw, C] for pre-patchified linear mode (variable patch size)
            patch_coord: Optional patch coordinates [B, N, 2] for NaFlex mode.
            patch_valid: Optional validity mask for patches [B, N] for NaFlex mode.

        Returns:
            Tuple of (embedded_tensor, grid_size) where:
                - embedded_tensor: [B, num_prefix_tokens + N, embed_dim]
                - grid_size: (H, W) tuple for standard mode, None for NaFlex mode
        Nr   r�   z-Expecting 2D image input with input ndim == 4)r‹   rŒ   r‘   r�   z/Expecting patchified input with ndim == 3 or 5.z,input norm not supported with patch resizingrŽ   T)r/   rü   zConvolutional input must be 4Déþÿÿÿr   rE   )rÁ   )r  rí   r"  r¦   )#r’   rü   r   Úndimr£   r/   rV   rŒ   rp   rø   r÷   rþ   rú   Úweightrç   rû   r“   r‹   r)  r   r  rX  rK   rT  r;  rt  rq  rj  rõ   r4  r8  rö   rÊ   Úcatr  )r¿   rŠ   r  ru  rÁ   r—   Úpatch_hwr™   rš   r�   rž   Úto_cats               r|   ÚforwardzNaFlexEmbeds.forwardb  sr  € ð* 04ˆ	Ø�G‰G�A‰JˆØ�>‹>àÐ"ä˜Ÿ™ !™Ð%TÔUÜ-Ø�t—‘¨D×,@Ñ,@ÐPT×PbÑPbô d‘�‘9ô
 ˜Ÿ™ !™Ò2 q§v¡v°¡{Ð4eÔfð ×-Ò-°!·&±&¸A²+Ü˜Ÿ™¨4Ð/Ð1_Ô`ô !°×1CÒ1C §¡¨¨1¡ÈÏÉÐQRÐSTÈÓV�à×+Ñ+ØØ—I‘I×$Ñ$Ø—I‘I—N‘NØ'Ø"ð ,ó ’ð —I‘I˜a“L�Ø—?‘?Ð.ØŸ™¨Ó*�AØ—I‘I˜a“L’ä�A—F‘F˜a‘KÐ!AÔBØ×#Ò#Ø—w‘w˜r˜s�|‘��1ØŸ™¨Ñ+¨a°$·/±/À!Ñ2DÑ.DÑDÈÏÉÐXYÑHZÑZ�ØŸ™¨Ñ+¨a°$·/±/À!Ñ2DÑ.DÑDÈÏÉÐXYÑHZÑZ�Ü—E‘E˜!˜a ¨¨5Ð1Ó2�à—	‘	˜!“ˆAàŸ™  ˜ˆIØ�|Š|Ø—I‘I˜a“L×*Ñ*¨1¨aÓ0�ð �I‰I�a‹Lˆà×Ñ )Ò+ØÐ$à×-Ñ-¨a¸9Ð-ÕEð ×1Ò1Ø×DÑDÀQÐT_ÐDÕ`à×8Ñ8¸ÈÐ8ÕTØ× Ñ  LÒ0ØÐ$à×0Ñ0°¸iÐ0ÕHð ×1Ò1Ø×GÑGÈÐWbÐGÕcà×;Ñ;¸AÈ;Ð;ÔWð ˆØ�>‰>Ð%Ø�M‰M˜$Ÿ.™.×/Ñ/°°2°rÓ:Ô;Ø�>‰>Ð%Ø�M‰M˜$Ÿ.™.×/Ñ/°°2°rÓ:Ô;áÜ—	‘	˜& A 3™,¨AÔ.ˆAð �M‰M˜!Óˆà�)ˆ|Ðr{   )r.   r�   r0   NTTr   FNrE   )é   r~  rH   FFNNNr:   FTNN©r~   N©T©NN)!rq   rr   rs   rt   r   ru   r   r
   ry   rx   r   rò   ÚModulerw   rÃ   r  r   r   r  r  r  r   rÊ   rb  r;  rT  r	   rX  rj  rq  rt  r}  Ú__classcell__©r  s   @r|   rà   rà   E  sµ  ø„ ñ&ðT 79ØØ Ø'+Ø"Ø $ØØ$)ØFJØ&Ø=EØ)2Ø,1Ø.3Ø:>ØFJØ48Ø#%Ø.3Ø"&ØØñ/Y à˜c 5¨¨c¨¡?Ð2Ñ3ðY ð ðY ð ð	Y ð
   ‘}ðY ð ðY ð ðY ð ðY ð "ðY ð ' u¨S°%¸¸S¸±/Ð-AÑ'BÑCðY ð ðY ð "*¨%°°S°©/Ñ!:ðY ð $'ðY ð &*ðY ð (,ðY ð  ' t¨B¯I©I¡Ñ7ð!Y ð" # 4¨°$°r·y±y±/Ñ)BÐ#BÑCð#Y ð$ !  b§i¡i¡Ñ1ð%Y ð& !ð'Y ð( (,ð)Y ð*  ð+Y ð0 
õ1Y óv
7ð	G¨¨S°#¨X©ó 	Gñ# Dð #°E¸#¸uÀSÈ#ÀX¹Ð:NÑ4Oó #ðX¨%°°S°©/ð X¸eÀCÈÀH¹oó Xð  ð6à�|‰|ð6ð Ÿ™ð6ð 
ò	6ó ð6ðp ð,Hà�|‰|ð,Hð Ÿ™ð,Hð 
ò	,Hó ð,Hð\!à�|‰|ð!ð ˜C‘yð!ð 
ó	!ðF ð;à�|‰|ð;ð Ÿ™ð;ð 
ò	;ó ð;ðz ð-Wà�|‰|ð-Wð Ÿ™ð-Wð 
ò	-Wó ð-Wð^(à�|‰|ð(ð ˜C‘yð(ð 
ó	(ðZ 37Ø26ñ	jà�|‰|ðjð " %§,¡,Ñ/ðjð " %§,¡,Ñ/ð	jð
 
ˆu�|‰|˜X e¨C°¨H¡oÑ6Ð6Ñ	7÷jr{   rà   ru  rØ   Ú	symmetricÚq_lenr·   c                 ó   — | €y| j                  «       } | j                  \  }}|}|dkD  rA| j                  ||ft        j                   ¬«      }t        j                  || gd¬«      } ||z  }|r5| j                  d«      | j                  d«      z  }	|	j                  d«      }	n%|xs |}| dd…dddd…f   j                  |d||«      }	t        j                  |	|¬«      }
|
j                  |	 t        j                  |«      j                  «       |
S )a3  Creates an attention mask from patch validity information.

    Supports two modes controlled by `symmetric`:
    1. `symmetric=True` (default): Creates a symmetric mask of shape
       [B, 1, seq_len, seq_len]. An attention pair (i, j) is allowed only if
       both token i and token j are valid. Suitable for standard self-attention.
    2. `symmetric=False`: Creates a potentially non-square mask of shape
       [B, 1, q_len, kv_len]. An attention pair (q, k) is allowed only if
       the key/value token k is valid. Query token validity is not checked
       in the mask itself. Useful for cross-attention or specific self-attention
       implementations `q_len` can be specified.

    Used for NaFlex mode to handle variable token counts and padding tokens.

    Args:
        patch_valid: Tensor of shape [B, N] with True for valid patches, False for padding.
        num_prefix_tokens: Number of prefix tokens (class token, register tokens)
            to prepend, which are always considered valid.
        symmetric: If True, create a symmetric mask.
            If False, create an expanded mask based only on key/value validity.
        q_len: Query sequence length override. Only used when `symmetric` is False.
            Defaults to the key/value sequence length (`kv_len`) if None.
        dtype: Dtype of the output attention mask (e.g., torch.float32).

    Returns:
        Attention mask tensor. Additive mask (-inf for masked, 0 for unmasked).
        Shape is [B, 1, seq_len, seq_len] if symmetric=True,
        or [B, 1, q_len, kv_len] if symmetric=False.
    Nr   r'  r   r¦   r"  )rx   r’   Únew_onesrÊ   rz  rI  r8  Ú
zeros_likeÚmasked_fill_Úfinfor5  )ru  rØ   r…  r†  r·   r—   rJ  Úkv_lenÚprefix_validÚ	mask_boolÚ
mask_floats              r|   Úcreate_attention_maskr�  Ï  s  € ðJ ÐØà×"Ñ"Ó$€KØ×Ñ�D€A€qØ€Fð ˜1Òà"×+Ñ+¨QÐ0AÐ,BÌ%Ï*É*Ð+ÓUˆä—i‘i ¨{Ð ;ÀÔCˆØÐ#Ñ#ˆáà×)Ñ)¨"Ó-°×0EÑ0EÀaÓ0HÑHˆ	Ø×'Ñ'¨Ó*‰	ð ’˜ˆØ¢ 4¨ªqÐ 0Ñ1×8Ñ8¸¸A¸uÀfÓMˆ	ô ×!Ñ! )°5Ô9€Jà×Ñ˜Y˜J¬¯©°EÓ(:×(>Ñ(>Ô?àÐr{   Ú	pool_typeÚreduce_include_prefixc                 óž  — |�|dvrt        | |||¬«      } | S |dkD  rF|r9|j                  | j                  d   |«      }t        j                  ||gd¬«      }n| dd…|d…f   } |j                  | j                  «      }|dk(  rN| |j                  d«      z  j                  d¬«      }|j                  dd	¬
«      j                  d¬«      }||z  }	|	S |dk(  r£| |j                  d«      z  j                  d¬«      }|j                  dd	¬
«      j                  d¬«      }||z  }
| j                  «       }t        j                  |j                  «      j                  || <   |j                  d¬«      }d|
|z   z  S |dk(  rO| j                  «       }t        j                  |j                  «      j                  || <   |j                  d¬«      S J ‚)aP  Global pooling with NaFlex support for masked tokens.

    Applies global pooling while respecting patch validity masks to exclude
    padding tokens from pooling operations.

    Args:
        x: Input tensor with shape [B, N, C]
        patch_valid: Optional validity mask for patches [B, N-num_prefix_tokens]
        pool_type: Type of pooling ('token', 'avg', 'avgmax', 'max')
        num_prefix_tokens: Number of prefix tokens (class/register)
        reduce_include_prefix: Whether to include prefix tokens in pooling reduction

    Returns:
        Pooled tensor with shape [B, C]
    N)ÚavgÚavgmaxr  ©r‘  rØ   r’  r   r   r¦   r”  r"  T)r§   Úkeepdim)r5  r•  g      à?r  )r*   rˆ  r’   rÊ   rz  r*  r·   rI  ÚsumÚclampÚcloner‹  r5  r¨   )rŠ   ru  r‘  rØ   r’  r�  Úpatch_valid_floatÚmasked_sumsÚvalid_countsÚpooledÚ
masked_avgÚmasked_xÚ
masked_maxs                r|   Úglobal_pool_naflexr¢    sã  € ð. Ð˜iÐ/GÑGäØØØ/Ø"7ô	
ˆð ˆð ˜1ÒÙ ð '×/Ñ/°·±¸±
Ð<MÓNˆLÜŸ)™) \°;Ð$?ÀQÔG‰Kð ’!Ð&Ñ'Ð'Ñ(ˆAà#Ÿ™ q§w¡wÓ/ÐØ�EÒàÐ,×6Ñ6°rÓ:Ñ:×?Ñ?ÀAÐ?ÓFˆØ(×,Ñ,°¸DÐ,ÓA×GÑGÈAÐGÓNˆØ˜|Ñ+ˆØˆØ	�hÒ	àÐ,×6Ñ6°rÓ:Ñ:×?Ñ?ÀAÐ?ÓFˆØ(×,Ñ,°¸DÐ,ÓA×GÑGÈAÐGÓNˆØ  <Ñ/ˆ
ð —7‘7“9ˆÜ!&§¡¨X¯^©^Ó!<×!@Ñ!@ˆ�+�ÑØ—]‘] q�]Ó)ˆ
ð �j :Ñ-Ñ.Ð.Ø	�eÒ	à—7‘7“9ˆÜ!&§¡¨X¯^©^Ó!<×!@Ñ!@ˆ�+�ÑØ�}‰} ˆ}Ó#Ð#àˆur{   c                   óš  ‡ — e Zd ZdZ	 	 	 	 	 	 d.dee   dededeeeeeef   f      ddf
ˆ fd„Z	d/d	„Z
d0d
ededdfd„Zej                  j!                  «       d1dededdfd„«       Zej                  j                   defd„«       Zej                  j                   deeef   fd„«       Zej                  j                   d2dedefd„«       Zej                  j                   d3deddfd„«       Zej                  j                   dej2                  fd„«       Zedej8                  dej8                  deej8                  eej8                     ef   fd„«       Zd4dedee   ddfd„Z deeej8                  f   fd„Z!	 	 	 	 	 	 	 	 	 	 d5deej8                  eeej8                  f   f   deeeee   f      deded ed!ed"ed#edeej8                     d$eej8                     d%eej8                     deeej8                     eej8                  eej8                     f   eeef   f   fd&„Z"	 	 	 d6d'ej8                  deej8                     d$eej8                     d%eej8                     deej8                  eeej8                  f   f   f
d(„Z#	 	 d7dej8                  d)ee   d$eej8                     dej8                  fd*„Z$	 	 d8d'ej8                  d+ed$eej8                     dej8                  fd,„Z%	 	 	 d6deej8                  eeej8                  f   f   deej8                     d$eej8                     d%eej8                     dej8                  f
d-„Z&ˆ xZ'S )9r,   az  NaFlexVit: Vision Transformer with NaFlex support for flexible input handling.

    A flexible implementation of Vision Transformer that supports:
    - Standard image classification with various pooling strategies
    - NaFlex functionality for variable aspect ratios and resolutions
    - Linear patch embedding for pre-patchified inputs
    - Multiple position embedding strategies (learned, factorized, rope)
    - Comprehensive attention masking for efficient batch processing
    - Encapsulated embedding and position encoding in FlexEmbeds module
    - Compatible with standard ViT checkpoints through checkpoint filtering
    Nr}   rá   Únum_classesr  r~   c                 óH  •— t         ‰| �  «        ||dœ}|xs
 t        «       }|rt        |fi |¤Ž}|j                  dv sJ ‚|j
                  s|j                  dk7  sJ ‚|j                  dv sJ ‚t        |j                  «      xs t        }	t        |j                  «      }
t        |j                  «      xs t        j                  }t        |«      }|j                   xs t"        }|| _        || _        |j                  | _        |j(                  x| _        x| _        | _        |j
                  rdnd| _        | xj.                  |j0                  z  c_        |j0                  | _        |j
                  | _        |j6                  | _        d| _        t;        d2i d|j<                  “d	|“d
|j(                  “d|j>                  “d|j@                   “d|j
                  “d|j0                  “d|“d|jB                  “d|j                  “d|jD                  “d|jF                  “d|jH                  “d|jJ                  “d|
“d|jL                  “dtO        |dd«      “dtO        |dd«      “|¤Ž| _(        |j@                  r |	|j(                  fi |¤Žnt        jR                  «       | _*        d| _+        d| _,        |jZ                  �rÍ|jZ                  dk7  �r½ddl.m/}m0}m1}m2} |jZ                  dk(  rO ||j(                  f|jf                  |jh                  |jj                  d|jl                  d œ|¤Ž| _+        d| _,        �nS|jZ                  d!k(  r\ ||j(                  |jh                  z  f|jj                  dd|jn                  |jp                  |jl                  d"œ|¤Ž| _+        d| _,        nè|jZ                  d#k(  rP ||j(                  |jh                  z  f|jj                  d|jl                  |jr                  d$œ|¤Ž| _+        d| _,        n‰|jZ                  d%k(  rb|jt                  €J d&«       ‚ ||j(                  |jh                  z  f|jt                  |jj                  |jl                  d'œ|¤Ž| _+        d| _,        ntw        d(|jZ                  › �«      ‚|jx                  dkD  r't{        |jx                  | j.                  ¬)«      | _>        nd| _>        t        |j€                  |jf                  «      }t        j‚                  t…        |jf                  «      D �cg c]v  } |d2|j(                  |jh                  |j†                  |jˆ                  |jŠ                  |jŒ                  |jŽ                  |j�                  |j’                  ||   |	|||d*œ|¤Ž‘Œx c}Ž | _J        | jP                  j—                  d¬+«      }t…        |jf                  «      D �cg c]  }t™        d,|› �|j(                  |¬-«      ‘Œ c}| _M        |jœ                  r|jž                  s |	|j(                  fi |¤Žnt        jR                  «       | _P        |j                  d.k(  rQt£        | j(                  f|j¤                  xs |jh                  |j¦                  xs |j†                  |	|d/œ|¤Ž| _T        nd| _T        |jž                  }|€|j                  d0k(  }|jœ                  r|r |	|j(                  fi |¤Žnt        jR                  «       | _O        t        jª                  |j¬                  «      | _W        |dkD  r!t        j°                  | j(                  |fi |¤Žnt        jR                  «       | _Y        |j´                  | _[        |j¸                  | _\        | j»                  |j´                  d¬1«       yc c}w c c}w )3a�  Initialize NaFlexVit model.

        Args:
            cfg: Model configuration. If None, uses default NaFlexVitCfg.
            in_chans: Number of input image channels.
            num_classes: Number of classification classes.
            img_size: Input image size (for backwards compatibility with classic vit).
            **kwargs: Additional config parameters to override cfg values.
        ræ   ©rL   r”  r•  r  Útokenr[   r§  )rL   rÔ   rE   rí   r   r   Fr/   rá   r1   râ   r9   rC   rD   rã   rV   rF   rG   rI   rJ   rK   rä   r?   rp   rŒ   rW   TNrÔ   )ÚRotaryEmbeddingCatÚRotaryEmbeddingDinoV3ÚRotaryEmbeddingMixedÚRotaryEmbeddingMRopeÚmixed)r3   r4   ÚtemperatureÚ
feat_shapeÚgrid_indexingÚaxial)r­  Ú	in_pixelsr®  Úref_feat_shapeÚgrid_offsetr¯  Údinov3)r­  r®  r¯  rÙ   rÕ   z1rope_type='mrope' requires cfg.rope_mrope_section)Úmrope_sectionr­  r¯  zUnknown rope_type: )rØ   )r§   r4   r5   r7   r8   r9   r=   Ú	proj_dropÚ	attn_dropÚ	drop_pathrf   rg   ri   r3   )r  zblocks.)Úmoduler  r  r[   )r4   r5   rf   rg   r”  ©Úneeds_resetrz   )^rï   rÃ   r+   r‰   r\   rC   rF   r   rf   r   re   r   rg   rò   ÚGELUrÞ   ri   r   r¤  rá   r1   Únum_featuresÚhead_hidden_sizerØ   rD   rñ   rð   r]   Úgrad_checkpointingrà   r/   rc   rX   rV   rG   rI   rJ   rK   r?   ÚgetattrÚembedsrÿ   Únorm_prerº   Úrope_is_mixedrM   Útimm.layers.pos_embed_sincosr¨  r©  rª  r«  r3   r4   rO   rS   rP   rQ   rT   rU   r  r@   r   Ú
patch_dropr   rB   Ú
SequentialÚranger5   r7   r8   r9   r=   rA   r;   Úblocksr  r  r  rY   rZ   r   r   r^   r_   Ú	attn_poolr  r>   Ú	head_droprù   Úheadr`   Úweight_init_modera   Úinit_weights)r¿   r}   rá   r¤  r  r¶   r·   r„   r  rf   re   rg   rh   ri   r¨  r©  rª  r«  ÚdprÚiÚpatch_reductionrZ   r  s                         €r|   rÃ   zNaFlexVit.__init__j  s  ø€ ô& 	‰ÑÔØ¨Ñ/ˆð Ò#”\“^ˆÙÜ! #Ñ0¨Ñ0ˆCð �‰Ð"NÑNÐNÐNØ�Š #§/¡/°WÒ"<Ð<Ð<Ø�}‰}Ð EÑEÐEÐEô $ C§N¡NÓ3Ò@´yˆ
Ü)¨#×*>Ñ*>Ó?ÐÜ! #§-¡-Ó0Ò;´B·G±Gˆ	Ü Ó$ˆØ—M‘MÒ(¤Sˆ	ð 'ˆÔØ ˆŒØŸ?™?ˆÔØEHÇ]Á]ÐRˆÔÐR˜DÔ1°D´NØ&)§o¢o¡¸1ˆÔØ×Ò #§.¡.Ñ0ÕØ!Ÿn™nˆÔØ"Ÿ™ˆÔØ#&×#:Ñ#:ˆÔ Ø"'ˆÔô #ò 
Ø—~’~ð
áð
ð —m’mð
ð ×)Ò)ð	
ð
 Ÿ,™,Ñ&ð
ð Ÿšð
ð —~’~ð
ñ &ð
ð  ×/Ò/ð
ð —m’mð
ð !$× 7Ò 7ð
ð #&×";Ò";ð
ð %(×$?Ò$?ð
ð '*×&CÒ&Cð
ñ -ð
ð  ×+Ò+ð!
ô" '.¨cÐ3NÐPUÔ&Vð#
ô$ " #Ð'?ÀÔFØñ'
ˆŒð* <?¿<º<™
 3§=¡=Ñ7°BÒ7ÌRÏ[É[Ë]ˆŒð *.ˆŒ	Ø"ˆÔØ�=‹=˜SŸ]™]¨fÓ4÷ó ð �}‰} Ò'Ù0Ø—M‘MðàŸ)™)Ø!Ÿm™mØ #× 4Ñ 4Ø#Ø"%×"8Ñ"8ñð ñ�”	ð &*�Ö"Ø—‘ 'Ò)Ù.Ø—M‘M S§]¡]Ñ2ð	à #× 4Ñ 4Ø#Ø#Ø#&×#:Ñ#:Ø #× 4Ñ 4Ø"%×"8Ñ"8ñ	ð ñ	�”	ð &+�Õ"Ø—‘ (Ò*Ù1Ø—M‘M S§]¡]Ñ2ðà #× 4Ñ 4Ø#Ø"%×"8Ñ"8Ø #× 4Ñ 4ñð ñ�”	ð &+�Õ"Ø—‘ 'Ò)Ø×-Ñ-Ð9ÐnÐ;nÓnÐ9Ù0Ø—M‘M S§]¡]Ñ2ðà"%×"8Ñ"8Ø #× 4Ñ 4Ø"%×"8Ñ"8ñ	ð
 ñ�”	ð &+�Õ"ä Ð#6°s·}±}°oÐ!FÓGÐGð ×Ñ Ò"Ü5Ø×#Ñ#Ø"&×"8Ñ"8ôˆD�Oð
 #ˆDŒOô (¨×(:Ñ(:¸C¿I¹IÓFˆä—m‘mô$ ˜3Ÿ9™9Ó%ö%&
ð$ ñ# ð Ø—M‘MØŸ-™-ØŸ-™-ØŸ™ØŸ™ØŸ-™-ØŸO™OØ×,Ñ,Ø×,Ñ,Ø˜a™&Ø%Ø#Ø#Øñð óò&
ð ˆŒð, Ÿ+™+×0Ñ0¸4Ð0Ó@ˆô ˜3Ÿ9™9Ó%ö
àô ˜' ! ˜¨s¯}©}ÈÖXò
ˆÔð
 8;·~²~ÈcÏkÊk‘J˜sŸ}™}Ñ3°Ò3Ô_a×_jÑ_jÓ_lˆŒ	ð �?‰?˜eÒ#Ü0Ø—‘ðà×1Ñ1ÒB°S·]±]Ø×1Ñ1ÒB°S·]±]Ø%Ø#ñð ñˆD�Nð "ˆDŒNð —+‘+ˆØˆ?Ø—o‘o¨Ñ.ˆGØ:=¿.º.ÉW‘z #§-¡-Ñ6°2Ò6ÔZ\×ZeÑZeÓZgˆŒÜŸ™ C§M¡MÓ2ˆŒØDOÐRSÂO”B—I‘I˜dŸn™n¨kÑ@¸RÒ@ÔY[×YdÑYdÓYfˆŒ	à #§¡ˆÔØŸ™ˆŒà×Ñ˜#Ÿ/™/°uÐÕ=ùòm&
ùò.
s   ÔA;^×"^c                 ó   — dt         j                  dt        ddfd„}t        | j                  «      D ]Ê  \  }}t        |d«      r* ||j                  j                  j                  |dz   «       t        |d«      r* ||j                  j                  j                  |dz   «       t        |d	«      r  ||j                  j                  |dz   «       t        |d
«      sŒ« ||j                  j                  |dz   «       ŒÌ y)z8Apply initialization weight fix with layer-wise scaling.ÚparamÚ	_layer_idr~   Nc                 ó¤   — t        j                  «       5  | j                  t        j                  d|z  «      «       d d d «       y # 1 sw Y   y xY w)Ng       @)rÊ   Úno_gradÚdiv_r  Úsqrt)rÒ  rÓ  s     r|   Úrescalez*NaFlexVit.fix_init_weight.<locals>.rescale1  s9   € Ü—‘“ñ 7Ø—
‘
œ4Ÿ9™9 S¨9¡_Ó5Ô6÷7÷ 7ñ 7ús   •(AÁAÚattnr   ÚmlpÚattn_out_projÚmlp_out_proj)rÊ   rb  ru   r2  rÈ  ÚhasattrrÙ  rú   ry  rÚ  Úfc2rÛ  rÜ  )r¿   rØ  Úlayer_idÚlayers       r|   Úfix_init_weightzNaFlexVit.fix_init_weight/  sÔ   € ð	7œ5Ÿ<™<ð 	7´Cð 	7¸Dó 	7ô  )¨¯©Ó5ò 	A‰OˆH�eÜ�u˜fÔ%Ù˜Ÿ
™
Ÿ™×.Ñ.°¸1±Ô=Ü�u˜eÔ$Ù˜Ÿ	™	Ÿ™×,Ñ,¨h¸©lÔ;Ü�u˜oÔ.Ù˜×+Ñ+×2Ñ2°H¸q±LÔAÜ�u˜nÕ-Ù˜×*Ñ*×1Ñ1°8¸a±<Õ@ñ	Ar{   r%  r»  c                 óæ   — |xs | j                   }|dv sJ ‚d|v r t        j                  | j                  «       nd}t	        t        |||¬«      | «       | j                  r| j                  «        yy)af  Initialize model weights according to specified scheme.

        Args:
            mode: Initialization mode ('jax', 'jax_nlhb', 'moco', or '')
            needs_reset: If True, call reset_parameters() on modules (default for after to_empty()).
                If False, skip reset_parameters() (for __init__ where modules already self-initialized).
        )ÚjaxÚjax_nlhbÚmocorL   Únlhbr:   rº  N)rÌ  r  Úlogr¤  r%   Úget_init_weights_vitra   rá  )r¿   r%  r»  Ú	head_biass       r|   rÍ  zNaFlexVit.init_weights@  so   € ð Ò,�t×,Ñ,ˆØÐ6Ñ6Ð6Ð6Ø39¸T±>”T—X‘X˜d×.Ñ.Ó/Ñ/Àrˆ	äÔ(¨¨yÀkÔRÐTXÔYà�=Š=Ø× Ñ Õ"ð r{   Úcheckpoint_pathÚprefixc                 óB   ‡‡— ddl mŠ ddlmŠ dˆˆfd„	} || ||«       y )Nr   )Ú_load_weights)Ú_torch_loadc                 óê  •—  ‰|dd¬«      }t        |t        «      r	d|v r|d   }t        |j                  «       «      D ]©  }|j	                  d«      r|j                  |«      |d|z   <   Œ,|j	                  d«      r|j                  |«      |d|z   <   ŒU|j	                  d«      r|j                  |«      |d|z   <   Œ~|j	                  d	«      sŒ�|j                  |«      |d|d
d z   <   Œ«  ‰| ||«      S )z8Adapter function to handle the different model structureÚcpuT)Úmap_locationÚweights_onlyÚ
state_dictrõ   úembeds.rö   rF   Úpatch_embedr2   N)Ú
isinstancer  Úlistr‚   Ú
startswithÚpop)Úmodelrê  rë  ró  r†   Ú_orig_load_weightsrî  s        €€r|   Ú_load_weights_adapterz8NaFlexVit.load_pretrained.<locals>._load_weights_adapterW  sð   ø€ á$ _À5ÐW[Ô\ˆJÜ˜*¤dÔ+°À
Ñ0JØ'¨Ñ5�
ô ˜*Ÿ/™/Ó+Ó,ò G�Ø—<‘< Ô,Ø0:·±¸qÓ0A�J˜y¨1™}Ò-Ø—\‘\ +Ô.Ø0:·±¸qÓ0A�J˜y¨1™}Ò-Ø—\‘\ +Ô.Ø0:·±¸qÓ0A�J˜y¨1™}Ò-Ø—\‘\ -Õ0Ø5?·^±^ÀAÓ5F�J˜y¨1¨R¨S¨6Ñ1Ò2ðGñ & e¨Z¸Ó@Ð@r{   ©rL   )Úvision_transformerrí  Ú_helpersrî  )r¿   rê  rë  rü  rû  rî  s       @@r|   Úload_pretrainedzNaFlexVit.load_pretrainedQ  s    ù€ õ 	LÝ)ö	Añ& 	˜d O°VÕ<r{   c                 ó¤   — h d£}| j                   r?t        | j                   d«      r)|j                  | j                   j                  «       «       |S )zŸGet set of parameter names that should not have weight decay applied.

        Returns:
            Set of parameter names to skip during weight decay
        >   úembeds.cls_tokenúembeds.pos_embedúembeds.reg_tokenÚno_weight_decay)rº   rÝ  Úupdater  )r¿   Ú	skip_lists     r|   r  zNaFlexVit.no_weight_decayl  s@   € ò Qˆ	Ø�9Š9œ §¡Ð,=Ô>Ø×Ñ˜TŸY™Y×6Ñ6Ó8Ô9ØÐr{   c                 ó.   — | j                   j                  S )zHReturn the 2-tuple patch size. For NaFlex dataloader / transform wiring.)rÁ  r/   rÅ   s    r|   Úget_patch_sizezNaFlexVit.get_patch_sizex  s   € ð �{‰{×%Ñ%Ð%r{   Úcoarsec                 ó    — t        dddg¬«      S )zßGet parameter group matcher for optimizer parameter grouping.

        Args:
            coarse: Whether to use coarse-grained grouping

        Returns:
            Dictionary mapping group names to regex patterns
        z^embeds)z^blocks\.(\d+)N)z^norm)iŸ† )ÚstemrÈ  )r  )r¿   r
  s     r|   Úgroup_matcherzNaFlexVit.group_matcher}  s   € ô ØØ-Ð/CÐDô
ð 	
r{   Úenablec                 óÌ   — || _         t        | j                  d«      rGt        | j                  j                  d«      r&| j                  j                  j	                  |«       yyy)z”Enable or disable gradient checkpointing for memory efficiency.

        Args:
            enable: Whether to enable gradient checkpointing
        rõ  Úset_grad_checkpointingN)r¿  rÝ  rÁ  rõ  r  )r¿   r  s     r|   r  z NaFlexVit.set_grad_checkpointingŒ  sO   € ð #)ˆÔÜ�4—;‘; Ô.´7¸4¿;¹;×;RÑ;RÐTlÔ3mØ�K‰K×#Ñ#×:Ñ:¸6ÕBð 4nÐ.r{   c                 ó   — | j                   S )zeGet the classification head module.

        Returns:
            Classification head module
        )rË  rÅ   s    r|   Úget_classifierzNaFlexVit.get_classifier—  s   € ð �y‰yÐr{   rŠ   r  c           	      ó€  — t        |«      }i }g }t        |«      D ]3  \  }}||vrg ||<   |j                  |«       ||   j                  |«       Œ5 |j                  \  }}	}
|	| j                  z
  }| j
                  r/t        | j                  |||||j                  |j                  «      S t        j                  ||| j                  j                  dz  |j                  |j                  ¬«      }t        | j                  d«      r]| j                  j                  |«      }t        |||j!                  «       «      D ]#  \  }}}|\  }}||z  }|D ]  }|d| ||d|…f<   Œ Œ% nJ|j#                  «       D ]7  \  }}| j                  j%                  |¬«      }|\  }}||z  }|d| ||d|…f<   Œ9 |j'                  d«      }|S )aí  Generate ROPE position embeddings for NaFlex batch with variable grid sizes.

        Args:
            x: Input tensor [B, N, C]
            patch_coord: Patch coordinates [B, N, 2] with (y, x) values

        Returns:
            ROPE embeddings:
            - Axial mode: Tensor of shape [B, 1, N, dim*2]
            - Mixed mode: List of tensors, each of shape [B, num_heads, N, dim], one per depth layer
            - Mixed mode with iterator: Iterator yielding tensors per depth
        rŽ   rÈ   Úget_batch_embedsNr¹   r   )r¯   r2  r4  r’   rØ   rÃ  r±   rº   r·   r¶   rÊ   rË   r§   rÝ  r  r©   rC  rƒ   r¾   rI  )r¿   rŠ   r  r:  r²   r³   rÐ   rÁ   r—   rJ  r˜   rµ   Úrope_embedsÚunique_embedsrÏ   rÎ   r­   r®   rÍ   rÂ   s                       r|   Ú_generate_rope_naflexzNaFlexVit._generate_rope_naflex   só  € ô& 8¸ÓDÐð ˆØˆÜ&Ð'8Ó9ò 	2‰MˆB�	Ø Ñ/Ø-/� 	Ñ*Ø×#Ñ# IÔ.Ø˜IÑ&×-Ñ-¨bÕ1ð		2ð —'‘'‰ˆˆ1ˆaØ�d×,Ñ,Ñ,ˆà×Òä%Ø—	‘	ØØØØØ—‘Ø—‘óð ô —k‘k ! W¨d¯i©i¯m©m¸aÑ.?ÀqÇwÁwÐWX×W_ÑW_Ô`ˆä�4—9‘9Ð0Ô1à ŸI™I×6Ñ6°|ÓDˆMÜ36°|À]ÐTc×TjÑTjÓTlÓ3mò FÑ/�	˜5 -Ø ‘��1Ø ™U�
Ø'ò F�BØ38¸¸*Ð3E�K  K Z K Ò0ñFñFð "1×!6Ñ!6Ó!8ò G‘�	˜2Ø!ŸY™Y×0Ñ0°yÐ0ÓA�
Ø ‘��1Ø ™U�
Ø/9¸+¸:Ð/F�˜B   ˜OÒ,ð	Gð "×+Ñ+¨AÓ.ˆàÐr{   r\   c                 ó  — || _         |�=|dv sJ ‚|dk(  r| j                  €J d«       ‚|dk7  r| j                  �d| _        || _        |dkD  r&t        j                  | j
                  |«      | _        yt        j                  «       | _        y)zÞReset the classification head with new number of classes and pooling.

        Args:
            num_classes: Number of classes for new classification head
            global_pool: Optional new global pooling type
        Nr¦  r[   z=Cannot currently add attention pooling in reset_classifier().r   )r¤  rÉ  r\   rò   rù   r1   rÿ   rË  )r¿   r¤  r\   s      r|   Úreset_classifierzNaFlexVit.reset_classifierå  s‰   € ð 'ˆÔØÐ"ØÐ"NÑNÐNÐNØ˜eÒ#¨¯©Ð(>Ø]Ð]Ó]�uØ Ò%¨$¯.©.Ð*DØ!%�”Ø*ˆDÔØ>IÈAºo”B—I‘I˜dŸn™n¨kÓ:ˆ�	ÔSU×S^ÑS^ÓS`ˆ�	r{   c                 ó(  — |du}| j                  |||¬«      \  }}d}| j                  �;|�| j                  ||«      }n&|�| j                  j                  |¬«      }nJ d«       ‚d}| j                  rd| j
                  �X| j                  |«      \  }}|�|j                  d|«      }|�.| j                  s"t        ||||¬«      }|s|j                  d«      }|€"t        || j                  |j                  ¬«      }| j                  |«      }|||||dœS )	zR Forward pass through patch / abs pos / rope pos embeds and patch dropout
        N)r  ru  r¹   z4Expected one of patch_coord or grid_size to be validr   ©Úpos_embed_has_batch)rØ   r·   )r¢   ru  r  Ú	attn_maskÚkeep_indices)rÁ  rº   r  r¾   ÚtrainingrÅ  ÚgatherrÃ  r   rI  r�  rØ   r·   rÂ  )	r¿   rŠ   r  ru  r  Únaflex_moderÁ   r  r  s	            r|   Ú_forward_embedszNaFlexVit._forward_embedsö  sD  € ð "¨Ð-ˆð —{‘{ØØ#Ø#ð #ó 
‰ˆˆ9ð ˆØ�9‰9Ð ØÐ&à"×8Ñ8¸¸KÓH‘ØÐ&à"Ÿi™i×1Ñ1¸	Ð1ÓB‘àTÐTÓT�uð 04ˆØ�=Š=˜TŸ_™_Ð8Ø"Ÿo™o¨aÓ0‰OˆAˆ|àÐ&Ø)×0Ñ0°°LÓA�ØÐ&¨t×/AÒ/Aô 5°Q¸À\ÐgrÔs�Ù"à"-×"7Ñ"7¸Ó":�Kð ÐÜ-ØØ"&×"8Ñ"8Ø—g‘gôˆIð �M‰M˜!ÓˆàØ&Ø&Ø"Ø(ñ
ð 	
r{   ÚindicesÚreturn_prefix_tokensr   Ú
stop_earlyÚ
output_fmtÚintermediates_onlyÚoutput_dictru  r  c           
      ó  — |dv sJ d«       ‚|dk(  }g }t        t        | j                  «      |«      \  }}t        |t        «      rd|rt        d«      ‚|d   }	|j                  d|
«      }
|j                  d|«      }|d   }d	x}}|sW| j                  rK| j                  �?t        d
«      ‚|}|j                  dd	 \  }}| j                  j                  ||f«      \  }}| j                  ||	|
|¬«      }|d   }|j                  dd	«      }|j                  dd	«      }|j                  dd	«      }|j                  d|
«      }
t        j                  j                  «       s|s| j                  }n| j                  d	|dz    }| j                   xr t        j                  j                  «        }| j"                  r¬|�ªt%        t'        | j                  |«      «      D ]‡  \  }\  }}| j                  r-| j                  �!|�t)        ||||j                  dd«      ¬«      }|rt+        ||||¬«      }n ||||¬«      }||v sŒd|j-                  |r| j/                  |«      n|«       Œ‰ nwt%        |«      D ]i  \  }}|�|rt+        ||||¬«      }n' ||||¬«      }n|rt+        |||¬«      }n
 |||¬«      }||v sŒF|j-                  |r| j/                  |«      n|«       Œk | j0                  rE|D �cg c]  }|d	d	…d| j0                  …f   ‘Œ }}|D �cg c]  }|d	d	…| j0                  d	…f   ‘Œ }}nd	}|rN|D �cg c]C  }|j3                  |j                  d   ||d«      j5                  dddd«      j7                  «       ‘ŒE }}|r1i }||d<   |�|r||d<   |
�|
|d<   |s| j/                  |«      } | |d<   |S t        j                  j                  «       s|r|�t9        t'        ||«      «      }|r|S | j/                  |«      }||fS c c}w c c}w c c}w )a¨   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            return_prefix_tokens: Return both prefix and spatial intermediate tokens
            norm: Apply norm layer to all intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
            output_dict: Return outputs as a dictionary with 'image_features' and 'image_intermediates' keys
            patch_coord: Optional patch coordinates [B, N, 2] for NaFlex mode
            patch_valid: Optional patch type indicators (1=patch, 0=padding) for NaFlex
            attn_mask: Optional attention mask for masked attention
        Returns:
            A tuple with (final_features, intermediates), a list of intermediate features, or a dictionary containing
            'image_features' and 'image_intermediates' (and optionally 'image_intermediates_prefix').

        NaFlex (dict / pre-patchified) inputs: NLC output only (per-sample grids are variable, a single
        spatial reshape is undefined); with ``output_dict=True`` the result also carries 'patch_valid'
        aligned with the spatial intermediates so consumers can mask padding or scatter via patch_coord.
        )ÚNCHWÚNLCz)Output format must be one of NCHW or NLC.r*  z“output_fmt="NCHW" is not supported for NaFlex (dict) inputs, use "NLC". Per-sample grids vary; reconstruct spatial maps downstream via patch_coord.r  ru  r  r¢   NztNaFlex forward_intermediates with active patch dropout requires output_dict=True to return the gathered patch_valid.rw  ©r  ru  r  r  r  r   r!  Fr  ©rº   r  ©r  r   r"  r�   rŽ   Úimage_intermediatesÚimage_intermediates_prefixÚimage_features)r!   r9  rÈ  rö  r  r  Úgetr  rÅ  r’   rÁ  r  r"  rÊ   ÚjitÚis_scriptingr¿  rÃ  r2  r©   r   r$   r4  r   rØ   r–   r•   Ú
contiguousr÷  )!r¿   rŠ   r#  r$  r   r%  r&  r'  r(  r  ru  r  r–   ÚintermediatesÚtake_indicesÚ	max_indexr¢   r™   rš   ÚheightÚwidthrÁ  r  r  rÈ  Údo_checkpointingrÏ  ÚblkrÂ   ÚyÚprefix_tokensÚresult_dictÚx_finals!                                    r|   Úforward_intermediateszNaFlexVit.forward_intermediates4  sd  € ðJ ˜_Ñ,ÐYÐ.YÓYÐ,Ø Ñ&ˆØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iÜ�aœÔñ Ü ðbócð cð ˜MÑ*ˆKØŸ%™% ¨{Ó;ˆKØŸ™˜k¨9Ó5ˆIØ˜	‘lˆGØˆLˆA�Ù 4§=¢=°T·_±_Ð5Pô !ðKóLð Lð ˆGØŸG™G B C˜L‰MˆF�EØ—;‘;×0Ñ0°&¸%°ÓA‰DˆAˆqð ×%Ñ%ØØ#Ø#Øð	 &ó 
ˆð �9ÑˆØ—j‘j °Ó5ˆØ—z‘z .°$Ó7ˆØ—J‘J˜{¨DÓ1ˆ	à—j‘j °Ó<ˆô �9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFà×2Ñ2ÒS¼5¿9¹9×;QÑ;QÓ;SÐ7SÐØ×Ò +Ð"9ä(1´#°d·k±kÀ;Ó2OÓ(Pò FÑ$�Ñ$�C˜à—=’= T§_¡_Ð%@À\ÐE]ä!7ØØ"Ø$Ø,2¯J©J°}ÀeÓ,Lô	"�Jñ $Ü" 3¨°
ÀiÔP‘Aá˜A J¸)ÔD�AØ˜Ò$à!×(Ñ(¹¨¯©°1¬À1ÕEñ!Fô$ $ FÓ+ò F‘��3àÐ*Ù'Ü& s¨A°KÈ9ÔU™á ¨¸yÔI™á'Ü& s¨A¸ÔC™á ¨YÔ7˜Ø˜Ò$à!×(Ñ(¹¨¯©°1¬À1ÕEðFð" ×!Ò!àERÖSÀ˜Qšq ! D×$:Ñ$:Ð":Ð:Ó;ÐSˆMÐSØDQÖR¸q˜Qšq $×"8Ñ"8Ñ"9Ð9Ó:ÐRˆMÑRà ˆMáð 'öàð —	‘	˜!Ÿ'™' !™* a¨¨BÓ/×7Ñ7¸¸1¸aÀÓC×NÑNÕPðˆMð ñ ØˆKà1>ˆKÐ-Ñ.ØÐ(Ñ-AØ<I�Ð8Ñ9ØÐ&ð .9�˜MÑ*ñ &ØŸ)™) A›,�Ø07�Ð,Ñ-àÐô �y‰y×%Ñ%Ô'Ñ,@À]ÐE^ä ¤ ]°MÓ!BÓCˆMáØ Ð à�I‰I�a‹Lˆà�-ÐÐùòS TùÚRùòs   Ë*P ÌPÌ3AP
r¢   c                 ó  — |du}| j                  ||||¬«      }|d   }|j                  dd«      }|j                  dd«      }	|j                  dd«      }| j                  xr t        j                  j                  «        }
| j                  rs|�qt        t        | j                  |«      «      D ]N  \  }\  }}| j                  r| j                  �|	�t        |||	|¬«      }|
rt        ||||¬«      }ŒD ||||¬«      }ŒP n]|�/| j                  D ]  }|
rt        ||||¬«      }Œ ||||¬«      }Œ! n,| j                  D ]  }|
rt        |||¬	«      }Œ |||¬	«      }Œ | j                  |«      }|r||j                  d
d«      dœS |S )z	
        Nr,  r¢   r  r  r  r  r-  r.  ru  )r¢   ru  )r"  r2  r¿  rÊ   r3  r4  rÃ  r2  r©   rÈ  r  rÅ  r   r$   r   )r¿   r¢   r  ru  r  r!  rÁ  rŠ   r  r  r;  rÏ  r<  rÂ   s                 r|   Úforward_featureszNaFlexVit.forward_featuresÝ  s»  € ð "¨Ð-ˆð ×%Ñ%ØØ#Ø#Øð	 &ó 
ˆð �9ÑˆØ—j‘j °Ó5ˆØ—z‘z .°$Ó7ˆØ—J‘J˜{¨DÓ1ˆ	ð  ×2Ñ2ÒS¼5¿9¹9×;QÑ;QÓ;SÐ7SÐØ×Ò +Ð"9ä(1´#°d·k±kÀ;Ó2OÓ(Pò EÑ$�Ñ$�C˜Ø—=’= T§_¡_Ð%@À\ÐE]ä!7ØØ"Ø$Ø,7ô	"�Jñ $Ü" 3¨°
ÀiÔP‘Aá˜A J¸)ÔD‘AñEð Ð$à—{‘{ò F�Ù#Ü" 3¨°ÀyÔQ‘Aá˜A K¸9ÔE‘Añ	Fð —{‘{ò 4�Ù#Ü" 3¨°YÔ?‘Aá˜A¨Ô3‘Að	4ð �I‰I�a‹LˆáàØ%Ÿz™z¨-¸Ó>ñð ð
 ˆr{   r‘  c                 óV  — | j                   �ht        || j                  r| j                  nddd|j                  ¬«      }| j                  s|d d …| j                  d …f   }| j                  ||¬«      }|S |€| j
                  n|}t        |||| j                  | j                  ¬«      }|S )Nr   Fr   )rØ   r…  r†  r·   r.  r–  )rÉ  r�  r]   rØ   r·   r\   r¢  )r¿   rŠ   r‘  ru  r  s        r|   Ú_poolzNaFlexVit._pool  s´   € ð �>‰>Ð%Ü-ØØ<@×<TÒ<T $×"8Ò"8ÐZ[ØØØ—g‘gôˆIð ×+Ò+Ø’a˜×/Ñ/Ñ0Ð0Ñ1�Ø—‘˜q¨I�Ó6ˆAØˆHà(1Ð(9�D×$Ò$¸yˆ	äØØØØ"×4Ñ4Ø"&×":Ñ":ô
ˆð ˆr{   Ú
pre_logitsc                 ó–   — | j                  ||¬«      }| j                  |«      }| j                  |«      }|r|S | j                  |«      S )N)ru  )rE  rZ   rÊ  rË  )r¿   r¢   rF  ru  rŠ   s        r|   Úforward_headzNaFlexVit.forward_head;  sF   € ð �J‰J�w¨KˆJÓ8ˆØ�L‰L˜‹OˆØ�N‰N˜1ÓˆÙˆqÐ0 D§I¡I¨a£LÐ0r{   c                 óˆ  — t        |t        «      }|xs |du}|r…|r<|d   }|j                  d|«      }|j                  d|«      }|j                  d|«      }n|}t        |dud«       t        |dud«       | j	                  ||||¬«      } | j
                  d	i |¤Ž}|S | j	                  |«      }| j                  |«      }|S )
a�  Forward pass with optional NaFlex support.

        Args:
            x: Input tensor. Supported formats:
                - [B, C, H, W] standard image input
                - [B, N, P*P*C] pre-patchified tensor (flattened patches)
                - [B, N, Ph, Pw, C] pre-patchified tensor (variable patch size)
                - Dict from NaFlex collator
            patch_coord: Optional patch coordinates [B, N, 2] for NaFlex mode.
            patch_valid: Optional patch validity indicators for NaFlex.
            attn_mask: Optional attn mask to override defaults generated from patch_valid

        Returns:
            Model output tensor.
        Nr¢   ru  r  r  z&patch_coord is required in naflex modez&patch_valid is required in naflex mode)r¢   ru  r  r  rz   )rö  r  r2  r   rC  rH  )	r¿   rŠ   r  ru  r  Úinput_is_dictr!  r¢   Úfeaturess	            r|   r}  zNaFlexVit.forwardF  sé   € ô, # 1¤dÓ+ˆØ#Ò> {¸$Ð'>ˆÙÙà˜I™,�ØŸe™e M°;Ó?�ØŸe™e M°;Ó?�ØŸE™E +¨yÓ9‘	à�Ü�K tÐ+Ð-UÔVÜ�K tÐ+Ð-UÔVà×,Ñ,ØØ'Ø'Ø#ð	 -ó ˆHð "�×!Ñ!Ñ- HÑ-ˆAð ˆð ×%Ñ% aÓ(ˆAØ×!Ñ! !Ó$ˆAØˆr{   )Nr�   éè  NNNr  )rL   Trý  ©Fr€  )N)
NFFFr*  FFNNN)NNNr�  )FN)(rq   rr   rs   rt   r
   r+   ru   r   r   rÃ   rá  ry   rx   rÍ  rÊ   r3  Úignorer   r   r  r	  r   r  r  rò   r‚  r  r   rb  r	   r   r  r  r"  rA  rC  rE  rH  r}  rƒ  r„  s   @r|   r,   r,   ]  sæ  ø„ ñ
ð +/ØØ#Ø>BØØñC>à˜,Ñ'ðC>ð ðC>ð ð	C>ð
 ˜u S¨%°°S°©/Ð%9Ñ:Ñ;ðC>ð 
õC>óJAñ"# ð #¸ð #Èó #ð" ‡Y�Y×ÑÓñ=¨sð =¸Cð =Èò =ó ð=ð4 ‡Y�Y×Ñð	 ò 	ó ð	ð ‡Y�Y×Ñð&  c¨3 h¡ò &ó ð&ð ‡Y�Y×Ññ
 Dð 
°Tò 
ó ð
ð ‡Y�Y×ÑñC¨Tð C¸Tò Có ðCð ‡Y�Y×Ñð §	¡	ò ó ðð ðBà�|‰|ðBð Ÿ™ðBð 
ˆu�|‰|˜T %§,¡,Ñ/°Ð4Ñ	5ò	Bó ðBñHa¨Cð a¸hÀs¹mð aÐW[ó að"<
ð 
ˆc�5—<‘<ÐÑ	 ó<
ðB 8<Ø).ØØ$Ø$Ø',Ø %Ø26Ø26Ø04ñg à�U—\‘\ 4¨¨U¯\©\Ð(9Ñ#:Ð:Ñ;ðg ð ˜e C¨¨c© NÑ3Ñ4ðg ð #'ð	g ð
 ðg ð ðg ð ðg ð !%ðg ð ðg ð " %§,¡,Ñ/ðg ð " %§,¡,Ñ/ðg ð   §¡Ñ-ðg ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÈDÐQTÐVYÐQYÉNÐZÑ	[óg ðX 37Ø26Ø04ñ>à—\‘\ð>ð " %§,¡,Ñ/ð>ð " %§,¡,Ñ/ð	>ð
   §¡Ñ-ð>ð 
ˆu�|‰|˜T # u§|¡|Ð"3Ñ4Ð4Ñ	5ó>ðF (,Ø26ñ	à�|‰|ðð   ‘}ðð " %§,¡,Ñ/ð	ð
 
�‰óðB  %Ø26ñ		1à—\‘\ð	1ð ð	1ð " %§,¡,Ñ/ð		1ð
 
�‰ó	1ð 37Ø26Ø04ñ0à�U—\‘\ 4¨¨U¯\©\Ð(9Ñ#:Ð:Ñ;ð0ð " %§,¡,Ñ/ð0ð " %§,¡,Ñ/ð	0ð
   §¡Ñ-ð0ð 
�‰÷0r{   c                 óº  — | d   }| d   }| d   }t        t        |«      «      D ]µ  }||   ||      }||d d …df   j                  «       dz   j                  «       }||d d …df   j                  «       dz   j                  «       }|j	                  ||ddd«      j                  ddd	dd«      }|j	                  d|dz  |dz  «      }dd
lm}  ||d|› d�d¬«       Œ· y )Nr  ru  r¢   r   r   r.   r�   r�   rŽ   )Ú
save_imageÚpatch_z.jpgT)Ú	normalize)rÇ  r9  r  rª   r–   r•   Útorchvision.utilsrP  )	rŠ   r  ru  r¢   rÏ  Úpatchr­   r®   rP  s	            r|   Ú_debug_dump_patchesrU  y  sò   € à�MÑ"€KØ�MÑ"€KØ�	‰l€GÜ”3�w“<Ó ò <ˆØ˜‘
˜; q™>Ñ*ˆØ˜šA˜q˜Ñ!×%Ñ%Ó'¨!Ñ+×1Ñ1Ó3ˆØ˜šA˜q˜Ñ!×%Ñ%Ó'¨!Ñ+×1Ñ1Ó3ˆØ—‘˜a  B¨¨AÓ.×6Ñ6°q¸!¸QÀÀ1ÓEˆØ—‘˜a  2¡ q¨¡tÓ,ˆÝ0Ù�5˜F 1 # TÐ*°dÖ;ñ<r{   r%  ré  r»  c                 óz   — ddl m}m}m}m} d| v rt        |||¬«      S d| v rt        ||¬«      S t        ||¬«      S )zFFunction imported from vision_transformer.py to maintain compatibilityr   )Úinit_weights_vit_jaxÚinit_weights_vit_mocoÚinit_weights_vit_timmÚinit_weights_reset_parametersrã  )ré  r»  rå  rº  )rþ  rW  rX  rY  rZ  r   )r%  ré  r»  rW  rX  rY  rZ  s          r|   rè  rè  ˆ  sH   € ÷ó ð ��}ÜÐ+°yÈkÔZÐZØ	�4‰ÜÐ,¸+ÔFÐFäÐ,¸+ÔFÐFr{   ró  rú  c                 óä  — i }| j                  «       D �]Y  \  }}|dk(  �ræt        |j                  d«      �rÈ|j                  dk(  �r¸d}d}d| v r| d   j                  d   }d| v r| d   j                  d   }||z   }|j                  d   }||z
  }	t        j                  |	«      }
t        j                  |«      }|
|k7  r|
j                  «       ro|j                  «       s_|	}|dd…d|…f   }|j                  «       r| dxx   |z  cc<   |dd…||…f   }|j                  «       r| dxx   |z  cc<   |dd…|d…f   }|
}t        |«      }||z  |k(  r"|j                  d|||j                  d   «      }nŒt        |j                  j                  d	«      rl|j                  j                  j                  \  }}||z  |k(  r"|j                  d|||j                  d   «      }nt        j                  d
|› d||z  › d�«       ||d<   �Œó|dk(  r||d<   �Œÿ|dk(  r||d<   �Œ|j                  d«      r9|dd }|dk(  r#|j!                  dddd«      j#                  d«      }d|z   }|||<   �ŒU|||<   �Œ\ |S )zZHandle state dict conversion from original ViT to the new version with combined embedding.rF   r�   r   rö   r   rõ   NrŽ   rÁ   z-Position embedding size mismatch: checkpoint=z, model=z?. Using default initialization and will resize in forward pass.r  r  r  zpatch_embed.r2   zproj.weightrô  )rƒ   rÝ  rÁ  rx  r’   r  r×  Ú
is_integerÚnumelru   r–   rõ  rÁ   Ú_loggerÚwarningrø  r•   rû   )ró  rú  Úout_dictr†   r‡   Únum_cls_tokenÚnum_reg_tokenrØ   Únum_patchesÚnum_patches_no_prefixÚgrid_size_no_prefixrÁ   Úcls_token_embÚreg_token_embr­   r®   ÚsuffixÚnew_keys                     r|   Úcheckpoint_filter_fnrj  ™  sÀ  € ð €HØ× Ñ Ó"ó A‰ˆˆ1à�Óä�u—|‘| [Õ1°a·f±fÀ³kØ !�Ø !�Ø *Ñ,Ø$.¨{Ñ$;×$AÑ$AÀ!Ñ$D�MØ *Ñ,Ø$.¨{Ñ$;×$AÑ$AÀ!Ñ$D�MØ$1°MÑ$AÐ!ð  Ÿg™g a™j�Ø(3Ð6GÑ(GÐ%Ü&*§i¡iÐ0EÓ&FÐ#Ü ŸI™I kÓ2�	Ø'¨9Ò4Ø0×;Ñ;Ô=Ài×FZÑFZÔF\ð #8�KØ$%¢a¨¨=¨Ð&8Ñ$9�MØ$×*Ñ*Ô,Ø" ;Ó/°=Ñ@Ó/Ø$%¢a¨°}Ð)DÐ&DÑ$E�MØ$×*Ñ*Ô,Ø" ;Ó/°=Ñ@Ó/Øš!Ð.Ñ/Ð/Ñ0�AØ 3�IÜ 	›N�	ð ˜yÑ(¨KÒ7àŸ	™	 ! Y°	¸1¿7¹7À1¹:ÓF‘Aô ˜uŸ|™|×7Ñ7¸ÔEØ$Ÿ|™|×7Ñ7×AÑA™˜˜1Ø˜q™5 KÒ/à !§	¡	¨!¨Q°°1·7±7¸1±:Ó >™Aô $ŸO™OØ"OÐP[È}Ð\dÐfgÐjkÑfkÐdmð n`ð !aôð ,-ˆHÐ'Ó(Ø�+ÒØ+,ˆHÐ'Ó(Ø�+ÒØ+,ˆHÐ'Ó(à�\‰\˜.Ô)Ø�r�s�VˆFØ˜Ò&Ø—I‘I˜a  A qÓ)×1Ñ1°!Ó4�Ø &Ñ(ˆGØ !ˆH�WÓàˆH�Q‹KðCAðF €Or{   Úurlc                 ó2   — | ddd ddt         t        ddddœ|¥S )	NrL  )r�   é€  rm  g      ð?rH   zembeds.projrË  z
apache-2.0)rk  r¤  Ú
input_sizeÚ	pool_sizeÚcrop_pctrë   Úmeanr  Ú
first_convÚ
classifierÚlicenser   )rk  r„   s     r|   Ú_cfgru  ä  s7   € àØØ#ØØØ"Ü'Ü%Ø#ØØñð ðð r{   ztimm/)Ú	hf_hub_id)rv  r¤  )z)naflexvit_base_patch16_gap.e300_s576_in1kz-naflexvit_base_patch16_par_gap.e300_s576_in1kz0naflexvit_base_patch16_parfac_gap.e300_s576_in1kz$naflexvit_base_patch16_map.untrainedz,naflexvit_so150m2_patch16_reg1_gap.untrainedz,naflexvit_so150m2_patch16_reg1_map.untrainedz&naflexvit_base_patch16_siglip.v2_webliz(naflexvit_so400m_patch16_siglip.v2_webliÚvariantÚ
pretrainedc           	      ó~  — |j                  dd«      }|j                  dt        «       «      }t        t        «      D �ch c]  }|j                  ’Œ }}t	        |«      D �ci c]  }||v sŒ||j                  |«      “Œ }}|rt        |fi |¤Ž}t        t        | |ft        |t        |d¬«      dœ|¤Ž}	|	S c c}w c c}w )NÚout_indicesr�   r}   Úgetter)rz  Úfeature_cls)Úpretrained_filter_fnr}   Úfeature_cfg)
rù  r+   r   Únamer÷  r‰   r    r,   rj  r  )
rw  rx  r„   rz  r}   ÚfÚcfg_field_namesr†   Úcfg_updatesrú  s
             r|   Ú_create_naflexvitrƒ    s¼   € Ø—*‘*˜]¨AÓ.€KØ
�*‰*�UœL›NÓ
+€CÜ'-¬lÓ';Ö< !�q—v“vÐ<€OÐ<ä-1°&«\ÖR¨¸QÀ/Ò=Q�1�f—j‘j “mÑ#ÐR€KÐRÙÜ˜cÑ1 [Ñ1ˆä Ü�7˜Jðä1ØÜ [¸hÔGñ	ð
 ñ€Eð €Lùò =ùâRs   ¾B5Á 	B:Á*B:c           	      ó4  — |j                  dd«       |j                  dd«       |j                  dd«      }|j                  dd«      }|€|dk(  rd}d|j                  d	d«      |||j                  d
d«      |j                  dd«      dœ|¥}t        | |fi |¤ŽS )aÜ  Create FlexVit model from classic VisionTransformer configuration.

    This function handles the parameter mapping and configuration logic needed
    to create FlexVit models that are compatible with classic VisionTransformer
    configurations and pretrained weights.

    Args:
        variant: Model variant name
        pretrained: Whether to load pretrained weights
        **kwargs: Classic VisionTransformer parameters

    Returns:
        FlexVit model instance
    Úno_embed_classNÚdynamic_img_sizer\   r§  rZ   r”  TrC   r6   FrÛ   )rG   rC   r\   rZ   r6   r<   ©rù  r2  rƒ  )rw  rx  r„   ÚgprZ   Úflex_kwargss         r|   Ú_create_naflexvit_from_classicrŠ     s°   € ð( ‡J�JÐ Ô&Ø
‡J�JÐ! 4Ô(ð 
�‰�M 7Ó	+€BØ�j‰j˜ DÓ)€GØ€˜2 š;Øˆð  $Ø—z‘z -°Ó6ØØØ Ÿ*™*Ð%5°uÓ=Ø!'§¡Ð,=¸uÓ!Eñð ð€Kô ˜W jÑ@°KÑ@Ð@r{   c           	      óÀ  — |j                  dd«       |j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd	«      }|j                  d
d«      }|j                  dd«      }|r|dk7  r|}	n|r|rdnd}	nd}	|j                  dd«      }
|j                  dd«      }|j                  dd«      }|j                  dd«      }|€|
dk(  }i dd“d|j                  dd«      “d|j                  d|j                  dd«      «      “d|
“d|“d|“d|“d|j                  dd«      rd nd“d|	“d|“d|“d
|“d!|j                  d!d«      “d"|j                  d#d«      “d$|j                  d$d%«      “d&|j                  d&d«      “d'|j                  d'd«      “|j                  d(d«      |j                  d)d«      d*œ¥|¥}t        | |fi |¤ŽS )+a¦  Create NaFlexVit model from EVA configuration.

    This function handles the parameter mapping and configuration logic needed
    to create NaFlexVit models that are compatible with EVA configurations
    and pretrained weights.

    Args:
        variant: Model variant name
        pretrained: Whether to load pretrained weights
        **kwargs: EVA model parameters

    Returns:
        NaFlexVit model instance
    r…  NÚuse_rot_pos_embFÚrope_mixed_moderO   rN   rQ   r:   rS   rR   rM   rÔ   r¬  r°  r\   r”  Úuse_pre_transformer_normÚuse_post_transformer_normTÚuse_fc_normrG   rC   rD   rñ   r   rX   rY   rZ   rF   Úuse_abs_pos_embrE   rT   rP   r²  rl   rÓ   rn   ro   rÖ   r×   )r6   r<   r‡  )rw  rx  r„   rŒ  r�  rO   rQ   rS   Úexplicit_rope_typerM   rˆ  rŽ  r�  r�  Únaflex_kwargss                  r|   Ú_create_naflexvit_from_evar”  K  su  € ð( ‡J�JÐ Ô&ð —j‘jÐ!2°EÓ:€OØ—j‘jÐ!2°EÓ:€OØ—z‘zÐ"4°fÓ=ÐØ—z‘zÐ"4°bÓ9ÐØŸ™Ð$8¸$Ó?ÐàŸ™ K°Ó6ÐÙÐ0°FÒ:Ø&‰	Ù	Ù.‘G°G‰	àˆ	ð 
�‰�M 5Ó	)€BØ%Ÿz™zÐ*DÀeÓLÐØ &§
¡
Ð+FÈÓ MÐØ—*‘*˜]¨DÓ1€KØÐØ˜E‘kˆðØ˜tðà�v—z‘z -°Ó6ðð 	�v—z‘zÐ"2°F·J±J¸|ÈQÓ4OÓPðð 	�rð	ð
 	Ð,ðð 	Ð/ðð 	�;ðð 	 &§*¡*Ð->ÀÔ"E‘YÈ6ðð 	�Yðð 	Ð,ðð 	Ð,ðð 	Ð0ðð 	˜FŸJ™JÐ'9¸5ÓAðð 	˜vŸz™zÐ*:¸DÓAðð 	�V—Z‘Z ¨UÓ3ðð  	�f—j‘j ¨uÓ5ð!ð" 	�V—Z‘Z ¨TÓ2ð#ð$ !Ÿ*™* [°%Ó8Ø!'§¡Ð,>ÀÓ!Fò'ð( ð)€Mô. ˜W jÑB°MÑBÐBr{   c           
      óH   — t        dddddddd¬«      }t        d
| |d	œ|¤Ž}|S )zCViT-Base with NaFlex functionality and global average pooling.
    r.   r0   r2   çñhãˆµøä>r”  r�   T)r/   r1   r3   r4   r=   r\   rD   rZ   ©rx  r}   )Únaflexvit_base_patch16_gap©r+   rƒ  ©rx  r„   r}   rú  s       r|   r˜  r˜  “  sC   € ô ØØØØØØØØô	€Cô ÐeÀzÐWZÑeÐ^dÑe€EØ€Lr{   c                 óJ   — t        ddddddddd¬«	      }t        d
| |d	œ|¤Ž}|S )z]ViT-Base with NaFlex functionality, aspect preserving pos embed, global average pooling.
    r.   r0   r2   r–  Tr”  r�   )	r/   r1   r3   r4   r=   rJ   r\   rD   rZ   r—  )Únaflexvit_base_patch16_par_gapr™  rš  s       r|   rœ  rœ  ¥  sF   € ô ØØØØØØ $ØØØô
€Cô ÐiÈ:Ð[^ÑiÐbhÑi€EØ€Lr{   c                 óL   — t        dddddddddd¬	«
      }t        d| |d
œ|¤Ž}|S )zjViT-Base with NaFlex functionality, aspect preserving & factorized pos embed, global average pooling.
    r.   r0   r2   r–  Trí   r”  r�   )
r/   r1   r3   r4   r=   rJ   rF   r\   rD   rZ   r—  )Ú!naflexvit_base_patch16_parfac_gapr™  rš  s       r|   rž  rž  ¸  sI   € ô ØØØØØØ $ØØØØô€Cô ÐlÈjÐ^aÑlÐekÑl€EØ€Lr{   c           	      óF   — t        ddddddd¬«      }t        d	| |dœ|¤Ž}|S )
zBViT-Base with NaFlex functionality and MAP attention pooling.
    r.   r0   r2   r–  r[   r   )r/   r1   r3   r4   r=   r\   rD   r—  )Únaflexvit_base_patch16_mapr™  rš  s       r|   r   r   Ì  s@   € ô ØØØØØØØô€Cô ÐeÀzÐWZÑeÐ^dÑe€EØ€Lr{   c                 óL   — t        ddddddddd	d
¬«
      }t        d| |dœ|¤Ž}|S )á/  ViT-SO150M2 with NaFlex functionality for variable aspect ratios and resolutions.

    This model supports:
    1. Variable aspect ratios and resolutions via patch coordinates
    2. Position embedding interpolation for arbitrary grid sizes
    3. Explicit patch coordinates and valid token masking
    r.   é@  é   é   çÅNìÄNì@r–  Fr   r”  T)
r/   r1   r3   r4   r5   r=   r7   rD   r\   rZ   r—  )Ú"naflexvit_so150m2_patch16_reg1_gapr™  rš  s       r|   r§  r§  Ý  sI   € ô ØØØØØØØØØØô€Cô ÐmÈzÐ_bÑmÐflÑm€EØ€Lr{   c                 óJ   — t        ddddddddd	¬
«	      }t        d| |dœ|¤Ž}|S )r¢  r.   r£  r¤  r¥  r¦  r–  Fr   r[   )	r/   r1   r3   r4   r5   r=   r7   rD   r\   r—  )Ú"naflexvit_so150m2_patch16_reg1_mapr™  rš  s       r|   r©  r©  ö  sF   € ô ØØØØØØØØØô
€Cô ÐmÈzÐ_bÑmÐflÑm€EØ€Lr{   c                 óD   — t        dddddd¬«      }t        d| |dœ|¤Ž}|S )	zGViT-Base with NaFlex functionality and SigLIP-style configuration.
    r.   r0   r2   Ú	gelu_tanhr[   )r/   r1   r3   r4   rg   r\   r—  )Únaflexvit_base_patch16_siglipr™  rš  s       r|   r¬  r¬  	  s=   € ô ØØØØØØô€Cô ÐhÈ*ÐZ]ÑhÐagÑh€EØ€Lr{   c           	      óF   — t        ddddddd¬«      }t        d	| |dœ|¤Ž}|S )
zUViT-SO400M with NaFlex functionality for variable aspect ratios and resolutions.
    r.   i€  é   gˆ…ZÓ¼ã@r«  r[   )r/   r1   r3   r4   r5   rg   r\   r—  )Únaflexvit_so400m_patch16_siglipr™  rš  s       r|   r¯  r¯  	  s@   € ô ØØØØØØØô€Cô ÐjÈJÐ\_ÑjÐciÑj€EØ€Lr{   )TT)Nr§  r   F)rã  r:   Trý  rM  )art   Úloggingr  Údataclassesr   r   r   Ú	functoolsr   Útypingr   r   r	   r
   r   r   r   r   r   rÊ   Útorch.nnrò   Útorch.nn.functionalÚ
functionalr“   Ú	timm.datar   r   Útimm.layersr   r   r   r   r   r   r   r   r   r   r   r   Ú_builderr    Ú	_featuresr!   Ú_features_fxr"   r#   Ú_manipulater$   r%   Ú	_registryr&   r'   rÓ   r(   rþ  r)   r*   Ú__all__Ú	getLoggerrq   r^  r+   r‰   rb  ru   rx   r£   r¯   r±   rÞ   r‚  rà   rD  r·   r�  ry   r¢  r,   rU  rw   rè  rj  ru  Údefault_cfgsrƒ  rŠ  r”  r˜  rœ  rž  r   r§  r©  r¬  r¯  rz   r{   r|   ú<module>rÁ     sÀ  ðñó$ Û ß 2Ñ 2Ý ß O× OÕ Oã Ý ß Ð ç E÷÷ ÷ ó õ +Ý +ß Lß 0ß <Ý ß 6à˜;Ð
'€ð ˆ'×
Ñ
˜HÓ
%€ð ÷X,ð X,ó ðX,ðv	˜ð 	°Ló 	ð Ø"ñ	*Ø�<‰<ð*à˜#˜s˜(‘Oð*ð ð*ð ð	*ð
 ˆ5�<‰<˜˜s C˜x™Ð(Ñ)ó*ðZJ¨¯©ó J÷=ñ =ð@,�lð , xó ,ð^ ôF
�2—9‘9ó F
ó ðF
ðR ð "#ØØ#Ø"Ÿ]™]ñAØ—\‘\ðAàðAð ðAð ˜‰}ð	Að
 �{‰{ðAð ˆe�l‰lÑòAó ðAðH ð /3Ø Ø!"Ø&+ñEØ�<‰<ðEà˜eŸl™lÑ+ðEð ðEð ð	Eð
  $ðEð ‡\�\òEó ðEôPY�—	‘	ô Yòx<ñG˜sð G°uð GÐQUð GÐaió Gð"H T¨#¨s¨(¡^ð H¸Ið HÈ$ÈsÐTWÈxÉ.ó HñVˆcð  T¨#¨s¨(¡^ó ñ" %Ù15Øô2ñ 6:Øô6ñ 9=Øô9ñ -1«FÙ48³FÙ48³Fñ /3ØØô/ñ 15ØØô1ñ%&ó €ñ0˜sð °ð È9ó ð* !ñ(AØð(Aàð(Að ó	(AðZ !ñECØðECàðECð ó	ECðP ñ¨4ð Àiò ó ðð" ñ¨tð È)ò ó ðð$ ñ°$ð ÈYò ó ðð& ñ¨4ð Àiò ó ðð  ñ°4ð Èiò ó ðð0 ñ°4ð Èiò ó ðð. ñ¨dð Èò ó ðð ñ°ð È9ò ó ñr{   