+
    UV-j?i  ã                   ó´  € R t ^ RIt^ RIHtHtHt ^ RIt^ RIH	t	 ^ RI
Ht ^ RIHt ^ RIHtHt ^ RIHt ^ RIHtHtHtHtHt ^ R	IHt ]P6                  ! ]4      tR
tRtRt Rt!Rt"Rt#Rt$Rt%Rt&R R lt'R R lt(R R lt)R R lt*R R lt+R R lt,R R  lt-R! R" lt. ! R# R$]4      t/ ! R% R&]4      t0^ RI1t1^ R'I2H3t3 ]Ph                  t5]6R( 4       t7]7]n4        R# ))zPImage processor for Molmo2 - MLX-native implementation without torch dependency.N)ÚListÚOptionalÚTuple)ÚImage)ÚAutoProcessor)ÚBatchFeature)ÚBaseImageProcessorÚget_size_dict)Úconvert_to_rgb)Ú
ImageInputÚPILImageResamplingÚmake_flat_list_of_imagesÚto_numpy_arrayÚvalid_images)ÚProcessorMixinz
<im_patch>z<im_low>z
<im_start>z<low_res_im_start>z<frame_start>z<im_end>z<frame_end>z<im_col>z	<|image|>c                óœ   € V ^8„  d   QhR\         P                  R\        \        ,          R\        \        ,          R\         P                  /# )é   ÚimageÚ
image_meanÚ	image_stdÚreturn)ÚnpÚndarrayr   Úfloat)Úformats   "Úq/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_vlm/models/molmo2/processing.pyÚ__annotate__r   #   s@   € ÷ 	ñ 	Ü�:‰:ð	ä”U•ð	ô ”E�{ð	ô ‡Z�Zñ		ó    c                ó  € V P                  \        P                  4      p V \        P                  ! V\        P                  R7      R,          ,          p V \        P                  ! V\        P                  R7      R,          ,          p V # )z"Normalize image with mean and std.©Údtype)NNºNNN)Úastyper   Úfloat32Úarray)r   r   r   s   &&&r   Únormalize_imager%   #   sW   € ð �L‰LœŸ™Ó$€EØ	ŒR�XŠX�j¬¯
©
Ô3°MÕBÕB€EØ	ŒR�XŠX�i¤r§z¡zÔ2°=ÕAÕA€EØ€Lr   c                ó†   € V ^8„  d   QhR\         P                  R\        \        ,          R\        R\         P                  /# )r   r   Údesired_output_sizeÚresampler   )r   r   r   Úintr   )r   s   "r   r   r   /   s<   € ÷  ñ  Ü�:‰:ð äœc�ð ô !ð ô ‡Z�Zñ	 r   c                óÀ  € V P                  4       R8:  d(   V ^ÿ,          P                  \        P                  4      pMV P                  \        P                  4      p\        P
                  ! V4      p\        P                  \        P                  P                  \        P                  \        P                  P                  \        P                  \        P                  P                  \        P                  \        P                  P                  \        P                  \        P                  P                  \        P                  \        P                  P                  /pVP                  V\        P                  P                  4      pVP                  V^,          V^ ,          3VR7      p\        P                   ! V\        P"                  R7      R,          pV# )z(Resize image using PIL instead of torch.ç      ð?)r(   r   g     ào@)Úmaxr"   r   Úuint8r   Ú	fromarrayr   ÚNEARESTÚ
ResamplingÚBILINEARÚBICUBICÚLANCZOSÚBOXÚHAMMINGÚgetÚresizer$   r#   )	r   r'   r(   Úimage_uint8Ú	pil_imageÚresample_mapÚpil_resampleÚresizedÚ
resized_nps	   &&&      r   Úresize_image_pilr>   /   sJ  € ð ‡y�yƒ{�cÔØ˜s•{×*Ñ*¬2¯8©8Ó4‰à—l‘l¤2§8¡8Ó,ˆä—’ Ó,€Iô 	×"Ñ"¤E×$4Ñ$4×$<Ñ$<Ü×#Ñ#¤U×%5Ñ%5×%>Ñ%>Ü×"Ñ"¤E×$4Ñ$4×$<Ñ$<Ü×"Ñ"¤E×$4Ñ$4×$<Ñ$<Ü×Ñ¤× 0Ñ 0× 4Ñ 4Ü×"Ñ"¤E×$4Ñ$4×$<Ñ$<ð€Lð  ×#Ñ# H¬e×.>Ñ.>×.GÑ.GÓH€Lð ×ÑØ	˜QÕ	Ð!4°QÕ!7Ð8À<ð ó €Gô
 —’˜'¬¯©Ô4°uÕ<€JØÐr   c                óv   € V ^8„  d   QhR\         R\         R\         R\         R\        \         \         3,          /# )r   ÚhÚwÚ
patch_sizeÚmax_num_cropsr   )r)   r   )r   s   "r   r   r   R   s<   € ÷ (ñ (Ü
ð(Üð(Ü #ð(Ü47ð(ä
Œ3”ˆ8…_ñ(r   c                ó^  € . p\        ^V^,           4       F>  p\        ^V^,           4       F$  pWV,          V8:  g   K  VP                  WV34       K&  	  K@  	  VP                  R R7       \        P                  ! V\        P
                  R7      pWr,          p\        P                  ! W.\        P                  R7      p	\        P                  ! RR7      ;_uu_ 4        \        P                  ! VP                  \        P                  4      V	,          R
R7      p
RRR4       \        P                  ! X
^8  4      '       d   \        P                  ! V
4      pM1\        P                  ! V
R8  R	V
4      p
\        P                  ! V
4      p\        W{,          4      #   + '       g   i     Lˆ; i)zKDivide an image of size [w, h] into up to max_num_crops of size patch_size.c                 óB   € V ^ ,          V ^,          ,          V ^ ,          3# )é    © )Úxs   &r   Ú<lambda>Úselect_tiling.<locals>.<lambda>[   s   €   !¥ q¨¥t¥¨Q¨q­TÑ2r   )Úkeyr   Úignore)Údivide©ÚaxisNr+   g    eÍÍAéÿÿÿÿ)ÚrangeÚappendÚsortr   r$   Úint32r#   ÚerrstateÚminr"   ÚallÚargmaxÚwhereÚargminÚtuple)r@   rA   rB   rC   ÚtilingsÚiÚjÚcandidate_tilingsÚcandidate_resolutionsÚoriginal_sizeÚrequired_scaleÚixs   &&&&        r   Úselect_tilingrd   R   s.  € ð €GÜ�1�m aÕ'Ö(ˆÜ�q˜-¨!Õ+Ö,ˆAØ�u˜Ö%Ø—‘ ˜vÖ&ó -ñ )ð ‡L�LÑ2€LÔ3ÜŸš ´·±Ô9ÐØ-Õ:Ðä—H’H˜a˜V¬2¯:©:Ô6€Mä	�Š˜H×	%Ö	%ÜŸšØ!×(Ñ(¬¯©Ó4°}ÕDÈ2ô
ˆ÷ 
&ô
 
‡v‚vˆn˜qÑ ×!Ò!Ü�YŠY�~Ó&‰äŸš .°3Ñ"6¸¸^ÓLˆÜ�YŠY�~Ó&ˆäÐ"Õ&Ó'Ð'÷ 
&×	%ús   Ã=FÆF,	c                ó  € V ^8„  d   QhR\         P                  R\        \        ,          R\        R\        \
        ,          R\        \
        ,          R\        R\        \         P                  \         P                  3,          /# )r   r   Úbase_image_input_sizer(   r   r   Úimage_patch_sizer   )r   r   r   r)   r   r   r   )r   s   "r   r   r   o   sp   € ÷ ñ Ü�:‰:ðä¤�9ðô !ðô ”U•ð	ô
 ”E�{ðô ðô Œ2�:‰:”r—z‘zÐ!Õ"ñr   c                ó2  € \        WV4      p\        WcV4      p\        VP                  4      ^8X  d   \        P
                  ! V^ 4      pV^,          V,          pV^ ,          V,          p\        P                  ! Wx,          4      P                  W‡.4      p	Wi3# )z"Build a single resized image crop.)r>   r%   ÚlenÚshaper   Úexpand_dimsÚarangeÚreshape)
r   rf   r(   r   r   rg   r<   Úcrop_patch_wÚcrop_patch_hÚ
resize_idxs
   &&&&&&    r   Úbuild_resized_imagerq   o   sŠ   € ô ˜u¸XÓF€GÜ˜g°9Ó=€GÜ
ˆ7�=‰=Ó˜QÔÜ—.’. ¨!Ó,ˆØ(¨Õ+Ð/?Õ?€LØ(¨Õ+Ð/?Õ?€LÜ—’˜<Õ6Ó7×?Ñ?Ø	Ð$ó€Jð ÐÐr   c                ó:  € V ^8„  d   QhR\         P                  R\        R\        \        ,          R\        \        ,          R\        R\        \
        ,          R\        \
        ,          R\        R	\        \         P                  \         P                  3,          /	# )
r   r   Ú	max_cropsÚoverlap_marginsrf   r(   r   r   rg   r   ©r   r   r)   r   r   r   r   )r   s   "r   r   r   „   s“   € ÷ Y,ñ Y,Ü�:‰:ðY,äðY,ô œ#•YðY,ô  ¤�9ð	Y,ô
 !ðY,ô ”U•ðY,ô ”E�{ðY,ô ðY,ô Œ2�:‰:”r—z‘zÐ!Õ"ñY,r   c                ó  € V^ ,          pV^ ,          V^,          8X  g   Q hVw  ršWzV	,           ,          pV^ ,          V,          pWÊV	,           ,
          pW×,          pV^,          V,          pV^ ,          V,          pV P                   R,          w  pp\        VV,
          VV,
          VV4      p\        V V^ ,          V,          V,           V^,          V,          V,           .V4      p\        VWV4      pV^ ,          V^,          ,          p\        P
                  ! VWˆ^.VP                  R7      p\        P
                  ! VVV.\        P                  R7      p^ p\        V^ ,          4       Fÿ  pVV,          p\        V^,          4       FÜ  pVV,          pVVVV,           1VVV,           13,          VV&   \        P                  ! VV,          4      P                  VV4      pVVV,          V,          ,          pV^ 8w  d
   RVRV	1R3&   V^ 8w  d
   RVRRV	13&   VV^ ,          ^,
          8w  d   RVV
) R1R3&   VV^,          ^,
          8w  d   RVRV
) R13&   VVV&   V^,          pKÞ  	  EK  	  \        P
                  ! V^ ,          V,          V	,           V
,           V^,          V,          V	,           V
,           .\        P                  R7      p\        V^ ,          4       F   p\        V^,          4       F‡  pVV^,          ,          V,           pVV,          p VV,          p!\        P                  ! VV,          ^ 8¬  VV,          VV V V,           1V!V!V,           13,          4      VV V V,           1V!V!V,           13&   K‰  	  K¢  	  VVV3# )z*Decompose an image into overlapping crops.ºNr   Nr   Nr!   rP   )rj   rd   r>   r%   r   Úzerosr    rT   rQ   rl   rm   rY   )"r   rs   rt   rf   r(   r   r   rg   Ú	crop_sizeÚleft_marginÚright_marginÚtotal_margin_pixelsÚcrop_patchesÚcrop_window_patchesÚcrop_window_sizern   ro   Úoriginal_image_hÚoriginal_image_wÚtilingÚsrcÚn_cropsÚcrop_arrÚpatch_idx_arrÚon_cropr]   Úy0r^   Úx0Ú	patch_idxÚpatch_idx_fullÚcrop_idxÚy_startÚx_starts"   &&&&&&&&                          r   Úbuild_overlapping_cropsr�   „   s’  € ð & aÕ(€IØ  Õ#Ð'<¸QÕ'?Ô?Ð?Ð?à /Ñ€KØ*¸[Õ.HÕIÐØ(¨Õ+Ð/?Õ?€LØ&¸Õ*DÕEÐØ*Õ=ÐØ(¨Õ+Ð/?Õ?€LØ(¨Õ+Ð/?Õ?€LØ).¯©°R­Ñ&ÐÐ&äØÐ.Õ.ØÐ.Õ.ØØó	€Fô Øà�1�IÐ(Õ(Ð+>Õ>Ø�1�IÐ(Õ(Ð+>Õ>ð	
ð 	ó€Cô ˜#˜zÓ
5€Cà�Q�i˜& �)Õ#€GÜ�xŠx˜ )¸Ð:À#Ç)Á)ÔL€HÜ—H’H˜g |°\ÐBÌ"Ï(É(ÔS€Mà€GÜ�6˜!•9ÖˆØÐ!Õ!ˆÜ�v˜a•yÖ!ˆAØÐ%Õ%ˆBØ # B¨¨i­Ð$7¸¸bÀ9½nÐ9LÐ$LÕ MˆH�WÑÜŸ	š	 ,°Õ"=Ó>×FÑFØ˜lóˆIð ˜ <Õ/°,Õ>Õ>ˆIà�AŒvØ-/�	˜,˜;˜,¨˜/Ñ*Ø�AŒvØ-/�	˜!˜\˜k˜\˜/Ñ*Ø�F˜1•I •MÔ!Ø/1�	˜<˜-™.¨!Ð+Ñ,Ø�F˜1•I •MÔ!Ø/1�	˜!˜l˜]™^Ð+Ñ,Ø%.ˆM˜'Ñ"Ø�q�LŠGô# "ñ ô, —X’Xà�1�IÐ+Õ+¨kÕ9¸LÕHØ�1�IÐ+Õ+¨kÕ9¸LÕHð	
ô �h‰hô€Nô �6˜!•9ÖˆÜ�v˜a•yÖ!ˆAØ˜6 !�9•} qÕ(ˆHØÐ-Õ-ˆGØÐ-Õ-ˆGô —’Ø˜hÕ'¨1Ñ,Ø˜hÕ'ØØ˜g¨Õ4Ð4°gÀÈ,Õ@VÐ6VÐVõóð Ø˜' LÕ0Ð0°'¸GÀlÕ<RÐ2RÐRóó	 "ñ ð �^ VÐ+Ð+r   c                ód   € V ^8„  d   QhR\         P                  R\        R\         P                  /# )r   ÚcropsrB   r   ©r   r   r)   )r   s   "r   r   r   à   s)   € ÷ ñ ¤2§:¡:ð ¼3ð Ä2Ç:Á:ñ r   c                óè   € V P                   w  r#rEW1,          pWA,          pWg,          pW,          V,          p	V P                  W&WW4      p V P                  ^ ^^^^^4      p V P                  W(V	4      p V # )zConvert image crops to patches.)rj   rm   Ú	transpose)
r‘   rB   r„   r@   rA   ÚcÚn_patches_hÚn_patches_wÚ	n_patchesÚ	patch_dims
   &&        r   Úbatch_pixels_to_patchesrš   à   st   € à—{‘{Ñ€G�Ø•/€KØ•/€KØÕ)€IØÕ'¨!Õ+€Ið �M‰M˜'°
ÈÓW€EØ�O‰O˜A˜q ! Q¨¨1Ó-€EØ�M‰M˜'¨iÓ8€EØ€Lr   c                óp   € V ^8„  d   QhR\         P                  R\        R\        R\         P                  /# )r   Úidx_arrÚpool_hÚpool_wr   r’   )r   s   "r   r   r   ï   s8   € ÷ ñ Ü�Z‰Zðäðô ðô ‡Z�Zñ	r   c                óþ  € V P                   w  r4WV,           ^,
          V,          ,          V,
          pW$V,           ^,
          V,          ,          V,
          p\        P                  ! V V^,          V^,           ^,          .V^,          V^,           ^,          ..RRR7      p V P                   w  rxWq,          p	W‚,          p
V P                  W‘W¢4      p V P	                  ^ ^^^4      p V P                  WšW,          4      p V # )zRBuild pooling indices using centered padding (matches HuggingFace implementation).Úconstant)ÚmodeÚconstant_valuesrP   )rj   r   Úpadrm   r”   )rœ   r�   rž   r@   rA   Úh_padÚw_padÚpadded_hÚpadded_wÚout_hÚout_ws   &&&        r   Úarange_for_poolingrª   ï   så   € ð �=‰=�D€Aà˜6•z A•~¨&Õ0Õ1°AÕ5€EØ˜6•z A•~¨&Õ0Õ1°AÕ5€Eô �fŠfØØ
�1�*�u˜q•y QÕ&Ð	'¨%°1­*°u¸qµyÀQÕ6FÐ)GÐHØØô	€Gð !Ÿ™Ñ€HØÕ€EØÕ€Eð �o‰o˜e¨UÓ;€Gà×Ñ  1 a¨Ó+€Gà�o‰o˜e¨F­OÓ<€Gà€Nr   c                óœ  € V ^8„  d   QhR\         P                  R\        R\        \        ,          R\        \        ,          R\        R\        \
        ,          R\        \
        ,          R\        R	\        R
\        R\        \         P                  \         P                  \         P                  \        \        \        3,          3,          /# )r   r   rs   rt   rf   r(   r   r   rg   Úimage_pooling_wÚimage_pooling_hr   ru   )r   s   "r   r   r     s¹   € ÷ Rñ RÜ�:‰:ðRäðRô œ#•YðRô  ¤�9ð	Rô
 !ðRô ”U•ðRô ”E�{ðRô ðRô ðRô ðRô Œ2�:‰:”r—z‘z¤2§:¡:¬u´S¼#°X­Ð>Õ?ñRr   c
           
     ó¬  € V^,          V,          p
V^ ,          V,          p\        V VVVVVVV4      w  rÍp\        WÙV4      pVP                  R,          w  ppVP                  RW˜,          4      p\	        V VVVVV4      w  pp\
        P                  ! VV.^ R7      p\        VW˜4      pVP                  R,          w  ppVP                  RW˜,          4      p\
        P                  ! V^ 8¬  VWº,          ,           R4      p\
        P                  ! VV.^ R7      p\
        P                  ! VVVV..\
        P                  R7      pV\        VV4      VVV33# )a>  Convert image to patches with pooling information.

Returns crops and pooling indices in the order expected by the model:
- Crops: [low_res_crop, high_res_crops...] (low-res first)
- Pooling indices: [low_res_pooling, high_res_pooling] (low-res first)
- Image grid: [lo_h, lo_w, hi_h, hi_w] (low-res dimensions first)
rw   rN   r   rP   )r�   rª   rj   rm   rq   r   ÚconcatenaterY   r$   rT   rš   )r   rs   rt   rf   r(   r   r   rg   r¬   r­   rn   ro   r…   r†   r‚   Úpooling_idxr@   rA   Ú
resize_arrrp   Ú	all_cropsÚresize_pooling_idxÚ	resized_hÚ	resized_wÚ
image_grids   &&&&&&&&&&               r   Úimage_to_patches_and_gridsr·     s‡  € ð& )¨Õ+Ð/?Õ?€LØ(¨Õ+Ð/?Õ?€Lô '>ØØØØØØØØó	'Ñ#€H˜Vô % ]À_ÓU€KØ×Ñ˜RÕ �D€A€qØ×%Ñ% b¨/Õ*KÓL€Kô 1ØØØØØØóÑ€J�
ô —’ 
¨HÐ5¸AÔ>€Iô ,Ø�OóÐð .×3Ñ3°BÕ7Ñ€IˆyØ+×3Ñ3Ø
ˆOÕ-óÐô —(’(Ø�qÑØØ
Õ
%õ	&à
ó	€Kô —.’.Ð"4°kÐ!BÈÔK€Kô —’˜I y°!°QÐ7Ð8ÄÇÁÔI€Jð 	Ü 	Ð+;Ó<ØØ	
ˆAˆð	ð r   c            	       óŠ   a a€ ] tR tRt oRt. R
OtR]P                  RRR^R^R3	V3R lV 3R llltRV3R lR llt	R	t
VtV ;t# )ÚMolmo2ImageProcessorif  zC
MLX-native image processor for Molmo2 that doesn't require torch.
NTc                óÄ   <€ V ^8„  d   QhRS[ S[,          RS[RS[ S[S[,          ,          RS[ S[S[,          ,          RS[RS[RS[S[,          RS[R	S[S[,          R
R/
# )r   Úsizer(   r   r   Údo_convert_rgbrs   rt   rB   Úpooling_sizer   N)r   Údictr   r   r   Úboolr)   )r   Ú__classdict__s   "€r   r   Ú!Molmo2ImageProcessor.__annotate__r  s™   ø€ ÷ Qñ Qá‘t�nðQñ %ðQñ ™T¡%�[Õ)ð	Qñ
 ™D¡�KÕ(ðQñ ðQñ ðQñ ™c�ðQñ ðQñ ™3•iðQð 
ñQr   c
                ó  <€ \         SV `  ! R/ V
B  Ve   TMRRRR/p\        VRR7      pWn        W n        Ve   TM. ROV n        Ve   TM. ROV n        WPn        W`n        Ve   TM^^.V n	        W€n
        V	e	   W�n        R # ^^.V n        R # )NÚheightiz  ÚwidthT)Údefault_to_squarerG   )ç      à?rÆ   rÆ   )ÚsuperÚ__init__r	   r»   r(   r   r   r¼   rs   rt   rB   r½   )Úselfr»   r(   r   r   r¼   rs   rt   rB   r½   ÚkwargsÚ	__class__s   &&&&&&&&&&,€r   rÈ   ÚMolmo2ImageProcessor.__init__r  sš   ø€ ô 	‰ÒÑ"˜6Ò"ØÒ'‰t¨h¸¸WÀcÐ-JˆÜ˜T°TÔ:ˆØŒ	à ŒØ(2Ò(>™*ÂOˆŒØ&/Ò&;™ÂˆŒØ,Ôà"Œà.Ò:‰OÀÀAÀð 	Ôð %ŒØ,8Ò,D˜LÖÈ1ÈaÈ&ˆÖr   c                óB  <€ V ^8„  d   QhRS[ RS[S[,          RS[S[,          RS[S[S[,          ,          RS[S[S[,          ,          RS[S[,          RS[S[,          RS[S[S[,          ,          R	S[S[,          R
S[S[S[,          ,          RS[S[,          RS[	/# )r   Úimagesr»   r(   r   r   r¼   rs   rt   rB   r½   Úreturn_tensorsr   )
r   r   r¾   r   r   r   r¿   r)   Ústrr   )r   rÀ   s   "€r   r   rÁ   �  sÏ   ø€ ÷ ^>ñ ^>áð^>ñ ‘t�nð^>ñ Ñ-Õ.ð	^>ñ
 ™T¡%�[Õ)ð^>ñ ™D¡�KÕ(ð^>ñ !¡�ð^>ñ ™C•=ð^>ñ "¡$¡s¥)Õ,ð^>ñ ™S•Mð^>ñ ™t¡C�yÕ)ð^>ñ !¡�ð^>ñ 
ñ^>r   c                óö  € Ve   RV9  g   RV9  d   \        R4      hM/ V P                  CpVR,          VR,          .pT;'       g    V P                  pT;'       g    V P                  pT;'       g    V P                  pVe   TMV P
                  pT;'       g    V P                  pT;'       g    V P                  pT	;'       g    V P                  p	T
;'       g    V P                  p
V
w  rïVe   \        V4      pVe   \        V4      '       g   \        R4      hV'       d   V Uu. uF  p\        V4      NK  	  ppV Uu. uF  p\        V4      NK  	  pp/ pVEe   . p. p. p. p. pV F‚  p\        VVVVVVVV	VV4
      w  ppppVP                  V4       VP                  V4       VP                  V4       VP                  VP                   ^ ,          4       VP                  V4       K„  	  \"        P$                  ! V^ 4      p\"        P$                  ! V^ 4      p\"        P$                  ! V^ 4      p\"        P&                  ! V4      pVP)                  VVVVVR7       \+        VVR7      # u upi u upi )zPreprocess images for Molmo2.rÃ   rÄ   z,size must contain 'height' and 'width' keys.zuInvalid image type. Must be of type PIL.Image.Image, mx.array, numpy.ndarray, torch.Tensor, tf.Tensor or jax.ndarray.)Úpixel_valuesÚimage_token_poolingÚimage_gridsÚimage_num_cropsÚ_hi_pooled_dims©Útensor_type)Ú
ValueErrorr»   r(   r   r   r¼   rs   rt   rB   r½   r   r   r
   r   r·   rR   rj   r   r¯   r$   Úupdater   )rÉ   rÎ   r»   r(   r   r   r¼   rs   rt   rB   r½   rÏ   rÊ   rf   r­   r¬   r   ÚdataÚbatch_gridsÚbatch_cropsÚbatch_pooled_patches_idxÚbatch_num_cropsÚbatch_hi_pooled_dimsr¶   r‘   Ú
pooled_idxÚhi_pooled_dimsrÒ   rÓ   rÔ   rÕ   s   &&&&&&&&&&&&,                  r   Ú
preprocessÚMolmo2ImageProcessor.preprocess�  s}  € ð  ÒØ˜tÔ# w°dÔ':Ü Ð!OÓPÐPð (;ð !�d—i‘i�=ˆDà!% h¥°°gµÐ ?Ðà×,Ð,˜tŸ}™}ˆØ×2Ð2 4§?¡?ˆ
Ø×/Ð/ §¡ˆ	à,Ò8‰N¸d×>QÑ>Qð 	ð ×/Ð/ §¡ˆ	Ø)×AÐA¨T×-AÑ-AˆØ×2Ð2 4§?¡?ˆ
Ø#×8Ð8 t×'8Ñ'8ˆà+7Ñ(ˆàÒÜ-¨fÓ5ˆFàÒ¤l°6×&:Ò&:Üð:óð ÷
 Ù9?Ó@¹°”n UÖ+¹ˆFÐ@á5;Ó<±V¨E”. Ö'±VˆÐ<àˆØÓØˆKØˆKØ')Ð$Ø ˆOØ#%Ð ã�ä.ØØ!Ø'Ø-Ø Ø"Ø!Ø"Ø'Ø'óñ >�
˜E :¨~ð ×"Ñ" :Ô.Ø×"Ñ" 5Ô)Ø(×/Ñ/°
Ô;Ø×&Ñ& u§{¡{°1¥~Ô6Ø$×+Ñ+¨NÖ;ñ'  ô* Ÿ>š>¨+°qÓ9ˆLÜ"$§.¢.Ð1IÈ1Ó"MÐÜŸ.š.¨°aÓ8ˆKÜ Ÿhšh Ó7ˆOà�K‰KØ)Ø$7Ø'Ø /Ø 4ð ô ô ˜D¨nÔ=Ð=ùò] Aùâ<s   Ä*I1ÅI6)	r¼   r   r   rs   rt   rB   r½   r(   r»   )rÒ   rÓ   rÔ   rÕ   )
NNNNNNNNNN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úmodel_input_namesr   r1   rÈ   rã   Ú__static_attributes__Ú__classdictcell__Ú__classcell__©rË   rÀ   s   @@r   r¹   r¹   f  sS   ù‡ € ñòÐð  $Ø'9×'BÑ'BØ,0Ø+/Ø#ØØ%)ØØ"&÷Qõ Q÷<^>÷ ^>ò ^>r   r¹   c                   ó˜   a a€ ] tR tRt oRtRR.tRtRtRV3R lV 3R llltV3R	 lR
 lt	RR lt
RR ltR tR t]R 4       tRtVtV ;t# )ÚMolmo2Processoriñ  zC
Processor for Molmo2 that combines image processor and tokenizer.
Úimage_processorÚ	tokenizerr¹   ÚAutoTokenizerc                ó<   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[ /# )r   Úimage_use_col_tokensÚuse_single_crop_col_tokensÚuse_single_crop_start_token)r¿   r   )r   rÀ   s   "€r   r   ÚMolmo2Processor.__annotate__ú  s/   ø€ ÷ 4ñ 4ñ #ð	4ñ
 %-©T¥Nð4ñ &*ñ4r   c                ó€   <€ Vf   \        4       p\        SV `  ! W3/ VB  W0n        W@n        WPn        \        V n        R # ©N)r¹   rÇ   rÈ   rõ   rö   r÷   ÚIMAGE_PROMPTÚimage_placeholder_token)rÉ   rñ   rò   rõ   rö   r÷   rÊ   rË   s   &&&&&&,€r   rÈ   ÚMolmo2Processor.__init__ú  s?   ø€ ð Ò"Ü2Ó4ˆOÜ‰Ò˜Ñ>°vÒ>Ø$8Ô!Ø*DÔ'Ø+FÔ(Ü'3ˆÖ$r   c                ó:   <€ V ^8„  d   QhRS[ P                  RS[/# )r   r¶   r   )r   r   rÐ   )r   rÀ   s   "€r   r   rø     s   ø€ ÷ &#ñ &#©2¯:©:ð &#¹#ñ &#r   c                óâ  € Vw  r#rE\         .V,          pV P                  '       d   V\        .,           p\        .Wd,          ,           \        .,           p\         .V,          pV P
                  f   V P                  MV P
                  pV P                  '       d   \        M\        p	V'       d   V\        .,           pV	.Wb,          ,           \        .,           p
W§,           pRP                  V4      # )a#  Generate image token string from image grid.

Args:
    image_grid: Array of [resized_h, resized_w, height, width]
                = [lo_pooled_h, lo_pooled_w, hi_pooled_h, hi_pooled_w]
                (matches HuggingFace format)

Returns:
    String of image tokens to insert into prompt.
Ú )	ÚIMAGE_PATCH_TOKENrõ   ÚIM_COL_TOKENÚIM_START_TOKENÚIM_END_TOKENrö   r÷   ÚLOW_RES_IMAGE_START_TOKENÚjoin)rÉ   r¶   r´   rµ   rÃ   rÄ   Úper_rowÚhi_res_tokensrö   Úimage_start_tokenÚlo_res_tokensÚ
all_tokenss   &&          r   Úget_image_tokensÚ Molmo2Processor.get_image_tokens  sÞ   € ð /9Ñ+ˆ	˜fô %Ð%¨Õ-ˆØ×$×$Ð$Ø¤ Õ.ˆGÜ'Ð(¨7Õ+;Õ;¼|¸nÕLˆô %Ð%¨	Õ1ˆð ×.Ñ.Ò6ð ×%Ò%à×0Ñ0ð 	#ð ×/×/Ð/õ &äð 	÷
 &Ø¤ Õ.ˆGØ*Ð+¨gÕ.AÕAÄ\ÀNÕRˆð #Õ2ˆ
Ø�w‰w�zÓ"Ð"r   c                óð  € / pRp	VeH   V P                  VRR7      p
V
P                  R4      p	V
P                  RR4      pVP                  V
4       VEe   V	eâ   \	        V\
        4      '       d   V.pRpM\        V4      pRp^ p\        \        V4      4       F�  pW,          P                  V P                  4      p\        V4       FZ  pV\        V	4      8  g   K  V P                  W�,          4      pW,          P                  V P                  V^4      W&   V^,          pK\  	  K�  	  V'       d
   V^ ,          pV P                  ! V3RVRVR	VR
V/VB pVP                  V4       Ve   \        W†R7      pV# )z&Process text and images for the model.N)rÏ   rÔ   rÖ   TFÚpaddingÚ
truncationÚ
max_lengthrÏ   r×   )rñ   r6   ÚpoprÚ   Ú
isinstancerÐ   ÚlistrQ   ri   Úcountrü   r  Úreplacerò   r   )rÉ   ÚtextrÎ   r  r  r  rÏ   rÊ   ÚencodingrÔ   Úimage_inputsrâ   Ú
was_stringÚ	image_idxr]   Ú
num_imagesÚ_Úimage_tokensÚtext_inputss   &&&&&&&,           r   Ú__call__ÚMolmo2Processor.__call__3  s†  € ð ˆØˆàÒØ×/Ñ/°ÀtÐ/ÓLˆLØ&×*Ñ*¨=Ó9ˆKà)×-Ñ-Ð.?ÀÓFˆNØ�O‰O˜LÔ)àÓàÒ&Ü˜d¤C×(Ò(Ø ˜6�DØ!%‘Jä ›:�DØ!&�Jà�	Üœs 4›yÖ)�AØ!%¥§¡¨t×/KÑ/KÓ!L�JÜ" :Ö.˜Ø$¤s¨;Ó'7Ö7Ø+/×+@Ñ+@ÀÕAWÓ+X˜LØ&*¥g§o¡oØ $× <Ñ <¸lÈAó'˜D™Gð &¨�NšIó /ñ *÷ Ø �7�DàŸ.š.Øñàðð &ðð &ð	ð
  .ðð ñˆKð �O‰O˜KÔ(ð Ò%Ü# HÔIˆHàˆr   c                ó  € Vf   \        V RR4      pVf   \        V P                  RR4      pVf   Rp^ RIHp V! R.R7      pVP	                  V4      pVP
                  ! R	RVRV/VB p	V'       d   V P                  P                  V	4      # V	# )
z$Apply chat template to conversation.NÚchat_templatezö{% for message in messages %}{% if message['role'] == 'user' %}User: {{ message['content'] }}
{% elif message['role'] == 'assistant' %}Assistant: {{ message['content'] }}
{% endif %}{% endfor %}{% if add_generation_prompt %}Assistant: {% endif %})ÚEnvironmentzjinja2.ext.loopcontrols)Ú
extensionsÚmessagesÚadd_generation_promptrG   )Úgetattrrò   Újinja2r$  Úfrom_stringÚrenderÚencode)
rÉ   Úconversationr#  r'  ÚtokenizerÊ   r$  ÚenvÚtemplateÚrendereds
   &&&&&,    r   Úapply_chat_templateÚ#Molmo2Processor.apply_chat_templatep  s«   € ð Ò Ü# D¨/¸4Ó@ˆMØÒ Ü# D§N¡N°OÀTÓJˆMØÒ ðGð õ 	'ñ Ð&?Ð%@ÔAˆØ—?‘? =Ó1ˆØ—?’?ñ 
Ø!ð
à"7ð
ð ñ
ˆ÷ Ø—>‘>×(Ñ(¨Ó2Ð2Øˆr   c                ó:   € V P                   P                  ! V/ VB # rú   )rò   Úbatch_decode©rÉ   ÚargsrÊ   s   &*,r   r5  ÚMolmo2Processor.batch_decode™  s   € Ø�~‰~×*Ò*¨DÐ;°FÑ;Ð;r   c                ó:   € V P                   P                  ! V/ VB # rú   )rò   Údecoder6  s   &*,r   r:  ÚMolmo2Processor.decodeœ  s   € Ø�~‰~×$Ò$ dÐ5¨fÑ5Ð5r   c                óš  € ^ RI p^ RIHp ^ RIHp ^ RIHp VP                  RR4       V! V4      pVP                  4       ;'       d    VP                  4       pTP                  V'       d   \        V4      MTRVR7      p	/ p
 V'       d   VR,          pMV! V! VR4      4      pVP                  4       '       dN   \        VR	R
R7      ;_uu_ 4       pVP                  ! V4      pRRR4       R F  pVX9   g   K  WÞ,          W®&   K  	  \        R/ T
B p\!        T	RR4      pT ! TT	R7      #   + '       g   i     LN; i  \         d     LBi ; i)z%Load processor from pretrained model.N©ÚPath©Úhf_hub_download)ró   Útrust_remote_codeT)rA  Úlocal_files_onlyzpreprocessor_config.jsonÚrúutf-8©r  r#  )rñ   rò   )r»   rs   rt   rB   r½   r   r   r¼   rG   )ÚjsonÚpathlibr>  Úhuggingface_hubr@  Útransformersró   r  ÚexistsÚis_dirÚfrom_pretrainedrÐ   ÚopenÚloadÚ	Exceptionr¹   r(  )ÚclsÚpretrained_model_name_or_pathrÊ   rF  r>  r@  ró   Ú
model_pathÚis_localrò   Úimage_processor_configÚconfig_pathÚfÚconfigrK   rñ   r#  s   &&,              r   rL  ÚMolmo2Processor.from_pretrainedŸ  sH  € ó 	Ý å3Ý.à�
‰
Ð&¨Ô-áÐ7Ó8ˆ
Ø×$Ñ$Ó&×>Ð>¨:×+<Ñ+<Ó+>ˆð "×1Ñ1ß'ŒC�
ŒOÐ-JØ"Ø%ð 2ó 
ˆ	ð "$Ðð	ßØ(Ð+EÕE‘á"Ù#Ø5Ð7Qóó�ð
 ×!Ñ!×#Ò#Ü˜+ s°W×=Õ=ÀØ!ŸYšY q›\�F÷ >ó	�Cð ˜f–}Ø6<µkÐ.Ó3ñ	ô /ÑHÐ1GÑHˆô   	¨?¸DÓAˆáØ+Øô
ð 	
÷- >×=ûô ô 	Ùð	ús<   ÂD< Â.D< Â:D< ÃD)Ã#D< Ã9D< Ä)D9	Ä4D< Ä<E
Å	E
)rü   rõ   rö   r÷   )NNTNT)NNFNNN)NFF)rå   ræ   rç   rè   ré   Ú
attributesÚimage_processor_classÚtokenizer_classrÈ   r  r   r2  r5  r:  ÚclassmethodrL  rë   rì   rí   rî   s   @@r   rð   rð   ñ  se   ù‡ € ñð $ [Ð1€JØ2ÐØ%€O÷4õ 4÷"&#ð &#ôP;ôz'òR<ò6ð ñ9
ó ÷9
ð 9
r   rð   r=  c                ó*  € ^ RI Hp \        V4      pVP                  4       ;'       d    VP	                  4       pRp V'       d   VR,          pM\        V! VR4      4      p\        VRRR7      ;_uu_ 4       p\        P                  ! V4      p	RRR4       X	P                  RR	4      P                  4       p
V
R
8H  pV'       d   \        P                  ! V3/ VB # \        P                  ! W3/ VB #   + '       g   i     Lk; i  \         d     LVi ; i)zGPatched from_pretrained that returns Molmo2Processor for molmo2 models.r?  Fzconfig.jsonrC  rD  rE  NÚ
model_typer   Úmolmo2)rH  r@  r>  rJ  rK  rM  rF  rN  r6   ÚlowerrO  rð   rL  Ú/_original_auto_processor_from_pretrained_molmo2Ú__func__)rP  rQ  rÊ   r@  rR  rS  Ú	is_molmo2rU  rV  rW  r^  s   &&,        r   Ú._patched_auto_processor_from_pretrained_molmo2rd  ã  sþ   € õ
 0äÐ3Ó4€JØ× Ñ Ó"×:Ð: z×'8Ñ'8Ó':€Hð €IðßØ$ }Õ4‰KäÙÐ =¸}ÓMóˆKô �+˜s¨W×5Õ5¸Ü—Y’Y˜q“\ˆF÷ 6à—Z‘Z ¨bÓ1×7Ñ7Ó9ˆ
Ø (Ñ*ˆ	÷ Ü×.Ò.Ð/LÑWÐPVÑWÐWä:×CÒCØñØ.4ñð ÷ 6×5ûô ô Ùðús/   ½D Á2D Á7C1Â-D Ã1D	Ã<D ÄDÄD)8ré   ÚloggingÚtypingr   r   r   Únumpyr   ÚPILr   rI  r   Ú%transformers.feature_extraction_utilsr   Ú#transformers.image_processing_utilsr   r	   Útransformers.image_transformsr
   Útransformers.image_utilsr   r   r   r   r   Útransformers.processing_utilsr   Ú	getLoggerrå   Úloggerr  ÚIMAGE_LOW_RES_TOKENr  r  ÚFRAME_START_TOKENr  ÚFRAME_END_TOKENr  rû   r%   r>   rd   rq   r�   rš   rª   r·   r¹   rð   rF  rG  r>  rL  ra  r\  rd  rG   r   r   Ú<module>rs     sö   ðÙ Vã ß (Ñ (ã Ý Ý &Ý >ß QÝ 8÷õ õ 9à	×	Ò	˜8Ó	$€ð !Ð Ø Ð Ø€Ø0Ð Ø#Ð Ø€Ø€Ø€Ø€õ	õ õF(õ:õ*Y,õxõõDRôjH>Ð-ô H>ôVh
�nô h
óX Ý à2?×2OÑ2OÐ /ð ñó ððB !O€Ö r   