§
    §éUg\H  ã                   ó¶   — d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
  G d	„ d
e¦  «        Z G d„ de¦  «        Zd„ Z G d„ dej        ¦  «        Zdd„ZdS )ztThis module contains the _EstimatorPrettyPrinter class used in
BaseEstimator.__repr__ for pretty-printing estimatorsé    N)ÚOrderedDicté   )Ú
get_config)ÚBaseEstimatoré   )Úis_scalar_nanc                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚKeyValTuplez@Dummy class for correctly rendering key-value tuples from dicts.c                 óD   •— t          ¦   «                              ¦   «         S ©N)ÚsuperÚ__repr__)ÚselfÚ	__class__s    €úT/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/sklearn/utils/_pprint.pyr   zKeyValTuple.__repr__N   s   ø€ å‰wŒw×ÒÑ!Ô!Ð!ó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__classcell__©r   s   @r   r
   r
   K   s>   ø€ € € € € ØJÐJð"ð "ð "ð "ð "ð "ð "ð "ð "r   r
   c                   ó   — e Zd ZdZdS )ÚKeyValTupleParamzEDummy class for correctly rendering key-value tuples from parameters.N)r   r   r   r   © r   r   r   r   S   s   € € € € € ØOÐOà€Dr   r   c                 ó   ‡‡— |                       d¬¦  «        }t          | j        d| j        ¦  «        }t          j        |¦  «        j        Šd„ ‰                     ¦   «         D ¦   «         Šˆfd„Šˆfd„|                     ¦   «         D ¦   «         S )zgReturn dict (param_name: value) of parameters that were given to
    estimator with non-default values.F©ÚdeepÚdeprecated_originalc                 ó$   — i | ]\  }}||j         “ŒS r   )Údefault)Ú.0ÚnameÚparams      r   ú
<dictcomp>z#_changed_params.<locals>.<dictcomp>`   s    € ÐNÐNÐN©;¨4°�4˜œÐNÐNÐNr   c                 ó6  •— | ‰vrdS ‰|          t           j        k    rdS t          |t          ¦  «        r|j        ‰|          j        k    rdS t          |¦  «        t          ‰|          ¦  «        k    r&t          ‰|          ¦  «        rt          |¦  «        sdS dS )NTF)ÚinspectÚ_emptyÚ
isinstancer   r   Úreprr   )ÚkÚvÚinit_paramss     €r   Úhas_changedz$_changed_params.<locals>.has_changedb   s    ø€ Ø�KÐÐØ�4Ø�qŒ>�Wœ^Ò+Ð+Ø�4å�a�Ñ'Ô'ð 	¨A¬K¸;Àq¼>Ô;SÒ,SÐ,SØ�4å�‰7Œ7•d˜; qœ>Ñ*Ô*Ò*Ð*Ý˜+ aœ.Ñ)Ô)ð +Ý.;¸AÑ.>Ô.>ð +ð �4Øˆur   c                 ó4   •— i | ]\  }} ‰||¦  «        ¯||“ŒS r   r   )r"   r+   r,   r.   s      €r   r%   z#_changed_params.<locals>.<dictcomp>q   s0   ø€ ÐAÐAÐA‘T�Q˜¨{¨{¸1¸aÑ/@Ô/@ÐAˆAˆqÐAÐAÐAr   )Ú
get_paramsÚgetattrÚ__init__r'   Ú	signatureÚ
parametersÚitems)Ú	estimatorÚparamsÚ	init_funcr.   r-   s      @@r   Ú_changed_paramsr9   Y   s¤   øø€ ð ×!Ò! uÐ!Ñ-Ô-€FÝ˜	Ô*Ð,AÀ9ÔCUÑVÔV€IÝÔ# IÑ.Ô.Ô9€KØNÐN¸+×:KÒ:KÑ:MÔ:MÐNÑNÔN€Kðð ð ð ð ð BÐAÐAÐA˜VŸ\š\™^œ^ÐAÑAÔAÐAr   c                   óÄ   ‡ — e Zd ZdZ	 	 	 	 dddddœˆ fd„Zd	„ Zd
„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zej        j                             ¦   «         Zeeej        <   eeej        <   ˆ xZS )Ú_EstimatorPrettyPrintera
  Pretty Printer class for estimator objects.

    This extends the pprint.PrettyPrinter class, because:
    - we need estimators to be printed with their parameters, e.g.
      Estimator(param1=value1, ...) which is not supported by default.
    - the 'compact' parameter of PrettyPrinter is ignored for dicts, which
      may lead to very long representations that we want to avoid.

    Quick overview of pprint.PrettyPrinter (see also
    https://stackoverflow.com/questions/49565047/pprint-with-hex-numbers):

    - the entry point is the _format() method which calls format() (overridden
      here)
    - format() directly calls _safe_repr() for a first try at rendering the
      object
    - _safe_repr formats the whole object recursively, only calling itself,
      not caring about line length or anything
    - back to _format(), if the output string is too long, _format() then calls
      the appropriate _pprint_TYPE() method (e.g. _pprint_list()) depending on
      the type of the object. This where the line length and the compact
      parameters are taken into account.
    - those _pprint_TYPE() methods will internally use the format() method for
      rendering the nested objects of an object (e.g. the elements of a list)

    In the end, everything has to be implemented twice: in _safe_repr and in
    the custom _pprint_TYPE methods. Unfortunately PrettyPrinter is really not
    straightforward to extend (especially when we want a compact output), so
    the code is a bit convoluted.

    This class overrides:
    - format() to support the changed_only parameter
    - _safe_repr to support printing of estimators (for when they fit on a
      single line)
    - _format_dict_items so that dict are correctly 'compacted'
    - _format_items so that ellipsis is used on long lists and tuples

    When estimators cannot be printed on a single line, the builtin _format()
    will call _pprint_estimator() because it was registered to do so (see
    _dispatch[BaseEstimator.__repr__] = _pprint_estimator).

    both _format_dict_items() and _pprint_estimator() use the
    _format_params_or_dict_items() method that will format parameters and
    key-value pairs respecting the compact parameter. This method needs another
    subroutine _pprint_key_val_tuple() used when a parameter or a key-value
    pair is too long to fit on a single line. This subroutine is called in
    _format() and is registered as well in the _dispatch dict (just like
    _pprint_estimator). We had to create the two classes KeyValTuple and
    KeyValTupleParam for this.
    r   éP   NFT)ÚcompactÚindent_at_nameÚn_max_elements_to_showc                ó¾   •— t          ¦   «                              |||||¬¦  «         || _        | j        rd| _        t	          ¦   «         d         | _        || _        d S )N)r=   r   Úprint_changed_only)r   r2   Ú_indent_at_nameÚ_indent_per_levelr   Ú_changed_onlyr?   )	r   ÚindentÚwidthÚdepthÚstreamr=   r>   r?   r   s	           €r   r2   z _EstimatorPrettyPrinter.__init__§   se   ø€ õ 	‰Œ×Ò˜ ¨¨v¸wÐÑGÔGÐGØ-ˆÔØÔð 	'Ø%&ˆDÔ"Ý'™\œ\Ð*>Ô?ˆÔð '=ˆÔ#Ð#Ð#r   c                 ó4   — t          ||||| j        ¬¦  «        S )N©Úchanged_only)Ú
_safe_reprrD   )r   ÚobjectÚcontextÚ	maxlevelsÚlevels        r   Úformatz_EstimatorPrettyPrinter.format¼   s'   € ÝØ�G˜Y¨¸DÔ<Nð
ñ 
ô 
ð 	
r   c                 óâ  — |                      |j        j        dz   ¦  «         | j        r|t	          |j        j        ¦  «        z  }| j        rt          |¦  «        }n|                     d¬¦  «        }t          d„ t          | 
                    ¦   «         ¦  «        D ¦   «         ¦  «        }|                      | 
                    ¦   «         |||dz   ||¦  «         |                      d¦  «         d S )Nú(Fr   c              3   ó$   K  — | ]\  }}||fV — Œd S r   r   )r"   r#   Úvals      r   ú	<genexpr>z<_EstimatorPrettyPrinter._pprint_estimator.<locals>.<genexpr>Ë   s*   è è € ÐSÐS©[¨d°C˜d C˜[ÐSÐSÐSÐSÐSÐSr   r   ú))Úwriter   r   rB   ÚlenrD   r9   r0   r   Úsortedr5   Ú_format_params)r   rM   rH   rE   Ú	allowancerN   rP   r7   s           r   Ú_pprint_estimatorz)_EstimatorPrettyPrinter._pprint_estimatorÁ   sé   € Ø�Š�VÔ%Ô.°Ñ4Ñ5Ô5Ð5ØÔð 	5Ø•c˜&Ô*Ô3Ñ4Ô4Ñ4ˆFàÔð 	3Ý$ VÑ,Ô,ˆFˆFà×&Ò&¨EÐ&Ñ2Ô2ˆFåÐSÐS½FÀ6Ç<Â<Á>Ä>Ñ<RÔ<RÐSÑSÔSÑSÔSˆà×ÒØ�LŠL‰NŒN˜F F¨I¸©M¸7ÀEñ	
ô 	
ð 	
ð 	�Š�SÑÔÐÐÐr   c           	      ó:   — |                       ||||||d¬¦  «        S )NT©Úis_dict©Ú_format_params_or_dict_items©r   r5   rH   rE   r\   rN   rP   s          r   Ú_format_dict_itemsz*_EstimatorPrettyPrinter._format_dict_itemsÒ   s.   € Ø×0Ò0Ø�6˜6 9¨g°uÀdð 1ñ 
ô 
ð 	
r   c           	      ó:   — |                       ||||||d¬¦  «        S )NFr_   ra   rc   s          r   r[   z&_EstimatorPrettyPrinter._format_params×   s.   € Ø×0Ò0Ø�6˜6 9¨g°uÀeð 1ñ 
ô 
ð 	
r   c                 ó6  — |j         }|| j        z  }dd|z  z   }	d}
| j        |z
  dz   x}}t          |¦  «        }	 t	          |¦  «        }n# t
          $ r Y dS w xY wd}d}|�s6|| j        k    r |d¦  «         dS |dz  }|}	 t	          |¦  «        }n# t
          $ r d	}||z  }||z  }Y nw xY w| j        rš|\  }}|                      |||¦  «        }|                      |||¦  «        }|s| 	                    d
¦  «        }|rdnd}||z   |z   }t          |¦  «        dz   }||k     r|}|
r|	}
||k    r||z  } ||
¦  «         d}
 ||¦  «         Œð ||
¦  «         |	}
|rt          nt          }|                       ||¦  «        |||r|nd||¦  «         |�¯4dS dS )a-  Format dict items or parameters respecting the compact=True
        parameter. For some reason, the builtin rendering of dict items doesn't
        respect compact=True and will use one line per key-value if all cannot
        fit in a single line.
        Dict items will be rendered as <'key': value> while params will be
        rendered as <key=value>. The implementation is mostly copy/pasting from
        the builtin _format_items().
        This also adds ellipsis if the number of items is greater than
        self.n_max_elements_to_show.
        ú,
ú Ú r   NFr   ú, ...Tú'ú: ú=r   ú, )rX   rC   Ú_widthÚiterÚnextÚStopIterationr?   Ú_compactÚ_reprÚstriprY   r
   r   Ú_format)r   rM   rH   rE   r\   rN   rP   r`   rX   ÚdelimnlÚdelimrF   Ú	max_widthÚitÚnext_entÚlastÚn_itemsÚentr+   r,   ÚkreprÚvreprÚmiddleÚrepÚwÚclass_s                             r   rb   z4_EstimatorPrettyPrinter._format_params_or_dict_itemsÜ   sQ  € ð ”ˆØ�$Ô(Ñ(ˆØ˜# ™,Ñ&ˆØˆØ œK¨&Ñ0°1Ñ4Ð4ˆ�	Ý�&‰\Œ\ˆð	Ý˜B‘x”xˆHˆHøÝð 	ð 	ð 	ØˆFˆFð	øøøàˆØˆØñ $	Ø˜$Ô5Ò5Ð5Ø��g‘”�Ø�Ø�q‰LˆGØˆCð#Ý ™8œ8��øÝ ð #ð #ð #Ø�Ø˜YÑ&�	Ø˜Ñ"���ð#øøøð Œ}ð Ø‘��1ØŸ
š
 1 g¨uÑ5Ô5�ØŸ
š
 1 g¨uÑ5Ô5�Øð -Ø!ŸKšK¨Ñ,Ô,�EØ!(Ð1˜˜¨c�Ø˜f‘n uÑ,�Ý˜‘H”H˜q‘L�Ø˜1’9�9Ø%�EØð (Ø '˜Ø˜A’:�:Ø˜Q‘J�EØ�E˜%‘L”L�LØ �EØ�E˜#‘J”J�JØØˆE�%‰LŒLˆLØˆEØ$+ÐA•[�[Õ1AˆFØ�LŠLØ��s‘”˜V V¸$Ð-E¨Y¨YÀAÀwÐPUñô ð ðE ñ $	ð $	ð $	ð $	ð $	s#   »A Á
AÁAÂB ÂB,Â+B,c                 óÀ  — |j         }|| j        z  }| j        dk    r || j        dz
  dz  ¦  «         dd|z  z   }d}	| j        |z
  dz   x}
}t          |¦  «        }	 t	          |¦  «        }n# t
          $ r Y dS w xY wd}d}|sÛ|| j        k    r |d¦  «         dS |dz  }|}	 t	          |¦  «        }n# t
          $ r d	}||z  }|
|z  }
Y nw xY w| j        rY|                      |||¦  «        }t          |¦  «        d
z   }|
|k     r|}
|	r|}	|
|k    r|
|z  }
 ||	¦  «         d}	 ||¦  «         Œ® ||	¦  «         |}	|  
                    ||||r|nd||¦  «         |¯ÙdS dS )zÏFormat the items of an iterable (list, tuple...). Same as the
        built-in _format_items, with support for ellipsis if the number of
        elements is greater than self.n_max_elements_to_show.
        r   rh   rg   ri   NFr   rj   Tr   rn   )rX   rC   ro   rp   rq   rr   r?   rs   rt   rY   rv   )r   r5   rH   rE   r\   rN   rP   rX   rw   rx   rF   ry   rz   r{   r|   r}   r~   r‚   rƒ   s                      r   Ú_format_itemsz%_EstimatorPrettyPrinter._format_items  s  € ð
 ”ˆØ�$Ô(Ñ(ˆØÔ! AÒ%Ð%ØˆE�4Ô)¨AÑ-°Ñ4Ñ5Ô5Ð5Ø˜# ™,Ñ&ˆØˆØ œK¨&Ñ0°1Ñ4Ð4ˆ�	Ý�%‰[Œ[ˆð	Ý˜B‘x”xˆHˆHøÝð 	ð 	ð 	ØˆFˆFð	øøøàˆØˆØð 	XØ˜$Ô5Ò5Ð5Ø��g‘”�Ø�Ø�q‰LˆGØˆCð#Ý ™8œ8��øÝ ð #ð #ð #Ø�Ø˜YÑ&�	Ø˜Ñ"���ð#øøøð Œ}ð Ø—j’j  g¨uÑ5Ô5�Ý˜‘H”H˜q‘L�Ø˜1’9�9Ø%�EØð (Ø '˜Ø˜A’:�:Ø˜Q‘J�EØ�E˜%‘L”L�LØ �EØ�E˜#‘J”J�JØØˆE�%‰LŒLˆLØˆEØ�LŠL˜˜f f¸4Ð.F¨i¨iÀQÈÐQVÑWÔWÐWð7 ð 	Xð 	Xð 	Xð 	Xð 	Xs$   ÁA, Á,
A:Á9A:Â#B3 Â3CÃCc                 ód  — |\  }}|                       |||¦  «        }	t          |t          ¦  «        r|	                     d¦  «        }	d}
nd}
|                     |	¦  «         |                     |
¦  «         |                      |||t          |	¦  «        z   t          |
¦  «        z   |||¦  «         dS )z=Pretty printing for key-value tuples from dict or parameters.rk   rm   rl   N)rt   r)   r   ru   rX   rv   rY   )r   rM   rH   rE   r\   rN   rP   r+   r,   r‚   r�   s              r   Ú_pprint_key_val_tuplez-_EstimatorPrettyPrinter._pprint_key_val_tupleK  sµ   € à‰ˆˆ1Ø�jŠj˜˜G UÑ+Ô+ˆÝ�fÕ.Ñ/Ô/ð 	Ø—)’)˜C‘.”.ˆCØˆFˆFàˆFØ�Š�SÑÔÐØ�Š�VÑÔÐØ�ŠØˆv�v¥ C¡¤Ñ(­3¨v©;¬;Ñ6¸	À7ÈEñ	
ô 	
ð 	
ð 	
ð 	
r   )r   r<   NN)r   r   r   r   r2   rQ   r]   rd   r[   rb   r†   rˆ   ÚpprintÚPrettyPrinterÚ	_dispatchÚcopyr   r   r
   r   r   s   @r   r;   r;   t   s  ø€ € € € € ð0ð 0ðh ØØØð=ð ØØ#ð=ð =ð =ð =ð =ð =ð =ð*
ð 
ð 
ð
ð ð ð"
ð 
ð 
ð

ð 
ð 
ð
=ð =ð =ð~.Xð .Xð .Xð`
ð 
ð 
ð& Ô$Ô.×3Ò3Ñ5Ô5€IØ(9€IˆmÔ$Ñ%Ø&;€IˆkÔ"Ñ#Ð#Ð#Ð#Ð#r   r;   Fc                 óÎ  — t          | ¦  «        }|t          j        v rt          | ¦  «        ddfS t	          |dd¦  «        }t          |t          ¦  «        �r |t          j        u rò| sdS t          | ¦  «        }|r||k    rdd||v fS ||v rt          j	        | ¦  «        ddfS d||<   d}d}	g }
|
j
        }|dz  }t          }t          |                      ¦   «         t          j        ¬¦  «        }|D ]I\  }} ||||||¬	¦  «        \  }}} ||||||¬	¦  «        \  }}} ||›d
|›�¦  «         |o|o|}|s|rd}	ŒJ||= dd                     |
¦  «        z  ||	fS t          |t           ¦  «        r|t           j        u s#t          |t"          ¦  «        rç|t"          j        u rÙt          |t           ¦  «        r| sdS d}nt%          | ¦  «        dk    rd}n| sdS d}t          | ¦  «        }|r||k    r
|dz  d||v fS ||v rt          j	        | ¦  «        ddfS d||<   d}d}	g }
|
j
        }|dz  }| D ]-}t          |||||¬	¦  «        \  }}} ||¦  «         |sd}|rd}	Œ.||= |d                     |
¦  «        z  ||	fS t          |t&          ¦  «        �r1t          | ¦  «        }|r||k    rdd||v fS ||v rt          j	        | ¦  «        ddfS d||<   d}d}	|rt)          | ¦  «        }n|                      d¬¦  «        }g }
|
j
        }|dz  }t          }t          |                     ¦   «         t          j        ¬¦  «        }|D ]\\  }} ||||||¬	¦  «        \  }}} ||||||¬	¦  «        \  }}} ||                     d¦  «        ›d|›�¦  «         |o|o|}|s|rd}	Œ]||= |j        ›dd                     |
¦  «        ›d�||	fS t          | ¦  «        }||o|                     d¦  «         dfS )zMSame as the builtin _safe_repr, with added support for Estimator
    objects.TFr   N)z{}TFz{...}r   )ÚkeyrJ   rl   z{%s}rn   )z[]TFz[%s]z(%s,))z()TFz(%s)z...r   rk   rm   rS   rW   ú<)Útyper‰   Ú_builtin_scalarsr*   r1   Ú
issubclassÚdictr   ÚidÚ
_recursionÚappendrL   rZ   r5   Ú_safe_tupleÚjoinÚlistÚtuplerY   r   r9   r0   ru   r   Ú
startswith)rM   rN   rO   rP   rK   ÚtypÚrÚobjidÚreadableÚ	recursiveÚ
componentsr–   Úsafereprr5   r+   r,   r   Ú	kreadableÚkrecurr€   Ú	vreadableÚvrecurrQ   ÚoÚoreprÚ	oreadableÚorecurr7   r‚   s                                r   rL   rL   c  sW  € õ ˆv‰,Œ,€Cà
�fÔ%Ð%Ð%Ý�F‰|Œ|˜T 5Ð(Ð(å��Z Ñ&Ô&€AÝ�#•tÑÔñ C ¥d¤mÐ!3Ð!3Øð 	%Ø$Ð$Ý�6‘
”
ˆØð 	4˜ )Ò+Ð+Ø˜E 5¨GÐ#3Ð3Ð3Ø�GÐÐÝÔ$ VÑ,Ô,¨e°TÐ9Ð9Øˆ�‰ØˆØˆ	Øˆ
ØÔ"ˆØ�‰
ˆÝˆÝ�v—|’|‘~”~­6Ô+=Ð>Ñ>Ô>ˆØð 
	!ð 
	!‰DˆAˆqØ'/ xØ�7˜I u¸<ð(ñ (ô (Ñ$ˆE�9˜fð (0 xØ�7˜I u¸<ð(ñ (ô (Ñ$ˆE�9˜fð ˆF˜u˜u˜u e eÐ,Ñ-Ô-Ð-ØÐ; IÐ;°)ˆHØð !˜ð !Ø �	øØ�EˆNØ˜Ÿ	š	 *Ñ-Ô-Ñ-¨x¸ÐBÐBå�3�ÑÔð "C !¥t¤}Ð"4Ð"4Ý�3�ÑÔð #5Ø#$­¬Ð#6Ð#6å�c�4Ñ Ô ð 		Øð )Ø(Ð(ØˆFˆFÝ�‰[Œ[˜AÒÐØˆFˆFàð )Ø(Ð(ØˆFÝ�6‘
”
ˆØð 	;˜ )Ò+Ð+Ø˜E‘> 5¨%°7Ð*:Ð:Ð:Ø�GÐÐÝÔ$ VÑ,Ô,¨e°TÐ9Ð9Øˆ�‰ØˆØˆ	Øˆ
ØÔ"ˆØ�‰
ˆØð 	!ð 	!ˆAÝ'1Ø�7˜I u¸<ð(ñ (ô (Ñ$ˆE�9˜fð ˆF�5‰MŒMˆMØð !Ø �Øð !Ø �	øØ�EˆNØ˜Ÿ	š	 *Ñ-Ô-Ñ-¨x¸ÐBÐBå�#•}Ñ%Ô%ñ WÝ�6‘
”
ˆØð 	4˜ )Ò+Ð+Ø˜E 5¨GÐ#3Ð3Ð3Ø�GÐÐÝÔ$ VÑ,Ô,¨e°TÐ9Ð9Øˆ�‰ØˆØˆ	Øð 	3Ý$ VÑ,Ô,ˆFˆFà×&Ò&¨EÐ&Ñ2Ô2ˆFØˆ
ØÔ"ˆØ�‰
ˆÝˆÝ�v—|’|‘~”~­6Ô+=Ð>Ñ>Ô>ˆØð 
	!ð 
	!‰DˆAˆqØ'/ xØ�7˜I u¸<ð(ñ (ô (Ñ$ˆE�9˜fð (0 xØ�7˜I u¸<ð(ñ (ô (Ñ$ˆE�9˜fð ˆF˜eŸkšk¨#Ñ.Ô.Ð.Ð.°°Ð6Ñ7Ô7Ð7ØÐ; IÐ;°)ˆHØð !˜ð !Ø �	øØ�EˆNØœL˜L˜L¨$¯)ª)°JÑ*?Ô*?Ð*?Ð*?Ð@À(ÈIÐVÐVå
ˆv‰,Œ,€CØ�Ð0˜SŸ^š^¨CÑ0Ô0Ð0°5Ð8Ð8r   )F)r   r'   r‰   Úcollectionsr   Ú_configr   Úbaser   Ú_missingr   rš   r
   r   r9   rŠ   r;   rL   r   r   r   ú<module>r¯      s,  ðð9ð 9ðB €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #à  Ð  Ð  Ð  Ð  Ð  Ø  Ð  Ð  Ð  Ð  Ð  Ø #Ð #Ð #Ð #Ð #Ð #ð"ð "ð "ð "ð "�%ñ "ô "ð "ð	ð 	ð 	ð 	ð 	�{ñ 	ô 	ð 	ðBð Bð Bð6l<ð l<ð l<ð l<ð l<˜fÔ2ñ l<ô l<ð l<ð^l9ð l9ð l9ð l9ð l9ð l9r   