
    eJ                        d dl Z d dlZd dlZd dlm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 d dlmZ d dlmZ d d	lmZmZmZmZmZ d
 Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*dS )    N)StringIO)CustomJS)Row)config)embed_state)Str)Param)CheckboxFloatSlider	IntSliderSelect
StaticTextc                 ~   t          g d          }t          |dg          j        }t          ||          }t	          j        d          5  |                    | |          }d d d            n# 1 swxY w Y   t          |||            t          | j	                  dk    sJ |j
        d         }t          |                    d	t          i                    }t          |          d
k    sJ |\  }}	|j        |         d         |j        d         u r||	fn|	|f\  }}	|j        dk    sJ |	j        dk    sJ d S )NABCoptionsdisabled)
parametersTembed   idtype   r   targeta  
    var value = source['active'];
    value = value;
    value = value;
    try {
      var property = target.properties['disabled'];
      if (property !== undefined) { property.validate(value); }
    } catch(err) {
      console.log('WARNING: Could not set disabled on target, raised error: ' + err);
      return;
    }
    try {
      target['disabled'] = value;
    } catch(err) {
      console.log(err)
    }
    a  
    var value = source['disabled'];
    value = value;
    value = value;
    try {
      var property = target.properties['active'];
      if (property !== undefined) { property.validate(value); }
    } catch(err) {
      console.log('WARNING: Could not set active on target, raised error: ' + err);
      return;
    }
    try {
      target['active'] = value;
    } catch(err) {
      console.log(err)
    }
    )r   r	   layoutr   r   setget_rootr   lenrootsreflistselectr   _modelsargscode)
documentcommr&   paramspanelmodelr$   cbscb1cb2s
             9lib/python3.11/site-packages/panel/tests/io/test_embed.pytest_embed_param_jslinkr3      s   OOO,,,F6zl333:FE	$			 / /x../ / / / / / / / / / / / / / /uh'''x~!####
)D/C
u||VX.//
0
0Cs88q====HC#^C03sx7IIISzzPSUXzHC8     $ 8       s   A22A69A6c                    t          g d          }t                      }d }|                    |d|i           t          ||          }t	          j        d          5  |                    | |          }d d d            n# 1 swxY w Y   t          |||            | j        \  }}t          |j	                  h dk    sJ |j	        
                                D ]\  }	}
t          j        |
d	                   }d
|v sJ |d
         }t          |          dk    sJ |d         }|d         dk    sJ |d         dk    sJ |d         |j        d         j        k    sJ |d         d|	z  k    sJ d S )Nr   r   c                     |j         | _        d S Nnewobjectr   events     r2   linkz(test_embed_select_str_link.<locals>.linkK       	    value	callbacksTr   >   r   r   r   contenteventsr   r   kindModelChangedattrtextr.   r8   &lt;pre&gt;%s&lt;/pre&gt;r   r   r<   r   r   r    r!   r   r#   stateitemsjsonloadsr"   childrenr$   r*   r+   r&   stringr<   r-   r.   _rJ   kvrB   rC   r;   s                 r2   test_embed_select_str_linkrT   H   s   OOO,,,FUUF" " "
KK7D/K222E	$			 / /x../ / / / / / / / / / / / / / /uh'''~HAuu{....!!## 	? 	?1*Qy\**7"""""6{{aq	V}....V}&&&&W~!2!66666U|:Q>>>>>>	? 	?   "BB	B	c                    t                      }t                      }d }|                    |d|i           t          ||          }t	          j        d          5  |                    | |          }d d d            n# 1 swxY w Y   t          ||| |g di           | j        \  }}t          |j	                  h dk    sJ d	d
dd}	|j	        
                                D ]\  }
}t          j        |d                   }d|v sJ |d         }t          |          dk    sJ |\  }}|d         dk    sJ |d         dk    sJ |d         |j        d         j        d         j        k    sJ |d         d|	|
         z  k    sJ |d         dk    sJ |d         dk    sJ |d         |j        d         j        k    sJ |d         d|	|
         z  k    sJ d S )Nc                     |j         | _        d S r6   r7   r:   s     r2   r<   z5test_embed_float_slider_explicit_values.<locals>.linkc   r=   r>   r?   r@   Tr   )皙?ffffff?r   states   r   r   r   rX   rY   r   )r   r   r   rB   rC   r   rD   rE   rF   rG   r.   r   r8   z	<b>%s</b>rH   r   r   r<   r   r   r    r!   r   r#   rJ   rK   rL   rM   r"   rN   r$   )r*   r+   r&   rP   r<   r-   r.   rQ   rJ   r[   rR   rS   rB   rC   event1event2s                   r2   'test_embed_float_slider_explicit_valuesr`   `   sw   ]]FUUF" " "
KK7D/K222E	$			 / /x../ / / / / / / / / / / / / / /uh/FGGGG~HAuu{yyy((((##F+##%% H HA*Qy\**7"""""6{{af~////f~''''g%."3"<Q"?"CCCCCe}fQi 77777f~////f~''''g%."3"77777e} ;fQi GGGGGGH H   BBBc                    t          ddd          }t                      }d }|                    |d|i           t          ||          }t	          j        d	          5  |                    | |          }d d d            n# 1 swxY w Y   t          |||            | j        \  }}t          |j	                  h d
k    sJ |j
        d         j
        d         j        dk    sJ d S )Nr   g@g@)startendr?   c                     |j         | _        d S r6   r7   r:   s     r2   r<   z3test_embed_float_slider_default_value.<locals>.link   r=   r>   r?   r@   Tr   r\   r   )r   r   r<   r   r   r    r!   r   r#   rJ   rN   r?   )	r*   r+   sliderrP   r<   r-   r.   r   rJ   s	            r2   %test_embed_float_slider_default_valuerg   }   s7   qc555FUUF" " "
KK7D/K222E	$			 / /x../ / / / / / / / / / / / / / /uh'''NMFEu{yyy((((?1&q)/1444444rU   c                    t          g d          }t                      }d }|                    |d|i           t          ||          }t	          j        d          5  |                    | |          }d d d            n# 1 swxY w Y   t          ||| |dd	gi
           | j        \  }}t          |j	                  dd	hk    sJ |j	        
                                D ]\  }	}
t          j        |
d                   }d|v sJ |d         }t          |          dk    sJ |d         }|d         dk    sJ |d         dk    sJ |d         |j        d         j        k    sJ |d         d|	z  k    sJ d S )Nr   r   c                     |j         | _        d S r6   r7   r:   s     r2   r<   z/test_embed_select_explicit_values.<locals>.link   r=   r>   r?   r@   Tr   r   r   rZ   rB   rC   r   r   rD   rE   rF   rG   r.   r8   rH   rI   rO   s                 r2   !test_embed_select_explicit_valuesrj      s   OOO,,,FUUF" " "
KK7D/K222E	$			 / /x../ / / / / / / / / / / / / / /uhc
/CDDDD~HAuu{Sz))))!!## 	? 	?1*Qy\**7"""""6{{aq	V}....V}&&&&W~!2!66666U|:Q>>>>>>	? 	?rU   c           	         t          g d          }t                      }d }|                    |d|i           t          ||          }t	          j        d          5  |                    | |          }d d d            n# 1 swxY w Y   t          j        t                    5  t          ||| |dd	gi
           d d d            d S # 1 swxY w Y   d S )Nr   r   c                     |j         | _        d S r6   r7   r:   s     r2   r<   z=test_embed_select_str_explicit_values_not_found.<locals>.link   r=   r>   r?   r@   Tr   r   DrZ   )r   r   r<   r   r   r    r!   pytestraises
ValueErrorr   r*   r+   r&   rP   r<   r-   r.   s          r2   /test_embed_select_str_explicit_values_not_foundrr      sz   OOO,,,FUUF" " "
KK7D/K222E	$			 / /x../ / / / / / / / / / / / / / /	z	"	" I IE5(FS#J3GHHHHI I I I I I I I I I I I I I I I I Is$   "BB	B	)CCCc           	         t                      }t                      }d }|                    |d|i           t          ||          }t	          j        d          5  |                    | |          }d d d            n# 1 swxY w Y   t          j        t                    5  t          ||| |g di           d d d            d S # 1 swxY w Y   d S )Nc                     |j         | _        d S r6   r7   r:   s     r2   r<   zCtest_embed_float_slider_explicit_values_out_of_bounds.<locals>.link   r=   r>   r?   r@   Tr   )rX   rY   r   rZ   )r   r   r<   r   r   r    r!   rn   ro   rp   r   rq   s          r2   5test_embed_float_slider_explicit_values_out_of_boundsru      so   ]]FUUF" " "
KK7D/K222E	$			 / /x../ / / / / / / / / / / / / / /	z	"	" L LE5(FMMM3JKKKKL L L L L L L L L L L L L L L L L Ls$   BBB%C

CCc                    t          g d          }t                      }|                    |d           t                      }|                    |d           t          |||          }t	          j        d          5  |                    | |          }d d d            n# 1 swxY w Y   t          |||            | j        \  }}t          |j	                  h dk    sJ |j	        
                                D ]\  }	}
t          j        |
d	                   }d
|v sJ |d
         }t          |          dk    sJ |d         }|d         dk    sJ |d         dk    sJ |d         |j        d         j        k    sJ |d         d|	z  k    sJ |d         }|d         dk    sJ |d         dk    sJ |d         |j        d         j        k    sJ |d         d|	z  k    sJ d S )Nr   r   r9   r?   )r9   Tr   >   r   r   r   rB   rC   r   r   rD   rE   rF   rG   r.   r   r8   rH   rI   )r*   r+   r&   string1string2r-   r.   rQ   rJ   rR   rS   rB   rC   r;   s                 r2   $test_embed_select_str_link_two_stepsrz      si   OOO,,,FeeG
KKxK(((eeGLLL***))E	$			 / /x../ / / / / / / / / / / / / / /uh'''~HAuu{....!!## ? ?1*Qy\**7"""""6{{aq	V}....V}&&&&W~!2!66666U|:Q>>>>>q	V}....V}&&&&W~!2!66666U|:Q>>>>>>? ?s   B&&B*-B*c                 &   t          g d          }t                      }|                    |d           |j                            t
          d           t          ||          }t          j        d          5  |	                    | |          }d d d            n# 1 swxY w Y   t          |||            | j        \  }}t          |j                  h dk    sJ |j                                        D ]\  }}	t          j        |	d                   }
d	|
v sJ |
d	         }t!          |          d
k    sJ |d         }|d         dk    sJ |d         dk    sJ |d         |j        d
         j        k    sJ |d         d|z  k    sJ d S )Nr   r   r9   rw   Tr   >   r   r   r   rB   rC   r   r   rD   rE   rF   rG   r.   r8   rH   )r   r   r<   paramwatchprintr   r   r    r!   r   r#   rJ   rK   rL   rM   r"   rN   r$   )r*   r+   r&   rP   r-   r.   rQ   rJ   rR   rS   rB   rC   r;   s                r2   /test_embed_select_str_link_with_secondary_watchr      s   OOO,,,FUUF
KKhK'''
Luh'''E	$			 / /x../ / / / / / / / / / / / / / /uh'''~HAuu{....!!## 	? 	?1*Qy\**7"""""6{{aq	V}....V}&&&&W~!2!66666U|:Q>>>>>>	? 	?s   =B  B$'B$c                    t          g d          }t                      }|                    |d           t          ||          }t	          j        d          5  |                    | |          }d d d            n# 1 swxY w Y   t          |||            t          | j	                  dk    sJ || j	        d         u sJ |j
        d	         }t          |                    d
t          i                    }t          |          dk    sJ |\  }}	|j        |         d         |j        d         u r||	fn|	|f\  }}	|j        dk    sJ |	j        dk    sJ d S )Nr   r   r9   rw   Tr   r   r   r   r   r   source  
    var value = source['value'];
    value = value;
    value = JSON.stringify(value).replace(/,/g, ", ").replace(/:/g, ": ");
    try {
      var property = target.properties['text'];
      if (property !== undefined) { property.validate(value); }
    } catch(err) {
      console.log('WARNING: Could not set text on target, raised error: ' + err);
      return;
    }
    try {
      target['text'] = value;
    } catch(err) {
      console.log(err)
    }
      
    var value = source['text'];
    value = value;
    value = value;
    try {
      var property = target.properties['value'];
      if (property !== undefined) { property.validate(value); }
    } catch(err) {
      console.log('WARNING: Could not set value on target, raised error: ' + err);
      return;
    }
    try {
      target['value'] = value;
    } catch(err) {
      console.log(err)
    }
    )r   r   r<   r   r   r    r!   r   r"   r#   r$   r%   r&   r   r'   r(   r)   )
r*   r+   r&   rP   r-   r.   r$   r/   r0   r1   s
             r2   test_embed_select_str_jslinkr      s   OOO,,,FUUF
KKhK'''E	$			 / /x../ / / / / / / / / / / / / / /uh'''x~!####HN1%%%%%
)D/C
u||VX.//
0
0Cs88q====HC#^C03sx7IIISzzPSUXzHC8     $ 8       s   B  BBc                    t                      }t                      }d }|                    |d|i           t          ||          }t	          j        d          5  |                    | |          }d d d            n# 1 swxY w Y   t          |||            | j        \  }}t          |j	                  ddhk    sJ |j	        
                                D ]\  }	}
t          j        |
d                   }d|v sJ |d         }t          |          d	k    sJ |d
         }|d         dk    sJ |d         dk    sJ |d         |j        d	         j        k    sJ |d         d|	 dk    sJ d S )Nc                     |j         | _        d S r6   r7   r:   s     r2   r<   z*test_embed_checkbox_str_link.<locals>.link*  r=   r>   r?   r@   Tr   FrB   rC   r   r   rD   rE   rF   rG   r.   r8   z&lt;pre&gt;z&lt;/pre&gt;)r
   r   r<   r   r   r    r!   r   r#   rJ   rK   rL   rM   r"   rN   r$   )r*   r+   checkboxrP   r<   r-   r.   rQ   rJ   rR   rS   rB   rC   r;   s                 r2   test_embed_checkbox_str_linkr   '  s   zzHUUF" " "MM&WdOM444&!!E	$			 / /x../ / / / / / / / / / / / / / /uh'''~HAuu{t},,,,!!## 	= 	=1*Qy\**7"""""6{{aq	V}....V}&&&&W~!2!66666U|<Q<<<<<<<<	= 	=ra   c                    t                      }t                      }|                    |d           t          ||          }t	          j        d          5  |                    | |          }d d d            n# 1 swxY w Y   t          |||            t          | j	                  dk    sJ || j	        d         u sJ |j
        d         }t          |                    dt          i                    }t          |          d	k    sJ |\  }}	|j        |         d         |j        d
         u r||	fn|	|f\  }}	|j        dk    sJ |	j        dk    sJ d S )Nr9   rw   Tr   r   r   r   r   r   r   a  
    var value = source['active'];
    value = value;
    value = JSON.stringify(value).replace(/,/g, ", ").replace(/:/g, ": ");
    try {
      var property = target.properties['text'];
      if (property !== undefined) { property.validate(value); }
    } catch(err) {
      console.log('WARNING: Could not set text on target, raised error: ' + err);
      return;
    }
    try {
      target['text'] = value;
    } catch(err) {
      console.log(err)
    }
    a  
    var value = source['text'];
    value = value;
    value = value;
    try {
      var property = target.properties['active'];
      if (property !== undefined) { property.validate(value); }
    } catch(err) {
      console.log('WARNING: Could not set active on target, raised error: ' + err);
      return;
    }
    try {
      target['active'] = value;
    } catch(err) {
      console.log(err)
    }
    )r
   r   r<   r   r   r    r!   r   r"   r#   r$   r%   r&   r   r'   r(   r)   )
r*   r+   r   rP   r-   r.   r$   r/   r0   r1   s
             r2   test_embed_checkbox_str_jslinkr   ?  s   zzHUUFMM&M)))&!!E	$			 / /x../ / / / / / / / / / / / / / /uh'''x~!####HN1%%%%%
)D/C
u||VX.//
0
0Cs88q====HC%-c215(9KKKSzzRUWZQ[HC8     $ 8       s   A<<B B c                    t          dd          }t                      }d }|                    |d|i           t          ||          }t	          j        d          5  |                    | |          }d d d            n# 1 swxY w Y   t          |||            | j        \  }}t          |j	                  h d	k    sJ g d
}	|j	        
                                D ]\  }
}t          j        |d                   }d|v sJ |d         }t          |          dk    sJ |\  }}|d         dk    sJ |d         dk    sJ |d         |j        d         j        d         j        k    sJ |d         d|	|
         z  k    sJ |d         dk    sJ |d         dk    sJ |d         |j        d         j        k    sJ |d         d|	|
         z  k    sJ d S )Nr   
   rc   rd   c                     |j         | _        d S r6   r7   r:   s     r2   r<   z(test_embed_slider_str_link.<locals>.linkw  r=   r>   r?   r@   Tr   r\   )r      r   rB   rC   r   rD   rE   rF   rG   r.   r8   z	<b>%d</b>r   z&lt;pre&gt;%.1f&lt;/pre&gt;r]   )r*   r+   rf   rP   r<   r-   r.   rQ   rJ   valuesrR   rS   rB   rC   r^   r_   s                   r2   test_embed_slider_str_linkr   t  sl   qb)))FUUF" " "
KK7D/K222E	$			 / /x../ / / / / / / / / / / / / / /uh'''~HAuu{yyy((((ZZF!!## J J1*Qy\**7"""""6{{af~////f~''''g%."3"<Q"?"CCCCCe}fQi 77777f~////f~''''g%."3"77777e} =q	 IIIIIIJ Js   !BBBc                    t          dd          }t                      }|                    |d           t          ||          }t	          j        d          5  |                    | |          }d d d            n# 1 swxY w Y   t          |||            t          | j	                  dk    sJ || j	        d         u sJ |j
        d	         }t          |                    d
t          i                    }t          |          dk    sJ |\  }}	|j        |         d         |j        d         u r||	fn|	|f\  }}	|j        dk    sJ |	j        dk    sJ d S )Nr   r   r   r9   rw   Tr   r   r   r   r   r   r   r   )r   r   r<   r   r   r    r!   r   r"   r#   r$   r%   r&   r   r'   r(   r)   )
r*   r+   rf   rP   r-   r.   r$   r/   r0   r1   s
             r2   test_embed_slider_str_jslinkr     s   qb)))FUUF
KKhK'''E	$			 / /x../ / / / / / / / / / / / / / /uh'''x~!####HN1%%%%%
)D/C
u||VX.//
0
0Cs88q====HC#^C03sx7IIISzzPSUXzHC8     $ 8       s   A??BBc           	         t          dddd          }t                      |j                            fdd           t          dddd          }t                      |j                            fdd           t	          ||          }t          j        d	          5  |                    | |          }d d d            n# 1 swxY w Y   t          |||           }t          | j
                  d
k    sJ || j
        d         u sJ t          |                    dt          i                    }t          |          dk    sJ |j        d
         j        d         |j        d         j        d         }	}|j        d         j        d         j        d         }
|j        d         j        d         j        d         }t!          j        |j        d         d                   d         }|ddd|
iddddd|iddddd|iddddd|	iddgk    sJ t!          j        |j        d         d                   d         }|ddd|
iddddd|iddddd|iddddd|	iddgk    sJ t!          j        |j        d
         d                   d         }|ddd|
iddddd|iddddd|iddddd|	iddgk    sJ d S )Nr   r   r   )namerc   rd   r?   c                 0    t          d| j                  S Nr?   setattrr8   )r;   t1s    r2   <lambda>z+test_embed_merged_sliders.<locals>.<lambda>      Wei!@!@ r>   r?   c                 0    t          d| j                  S r   r   )r;   t2s    r2   r   z+test_embed_merged_sliders.<locals>.<lambda>  r   r>   Tr   r   r   r   r   r      rB   rC   rG   rE   zA: <b>1</b>)rF   rD   r.   r8   1zA: <b>5</b>5zA: <b>9</b>9)r   r   r|   r}   r   r   r    r!   r   r"   r#   r%   r&   r   rN   r$   rL   rM   rJ   )r*   r+   s1s2r-   r.   state_modelr/   ref1ref2ref3ref4state0state1state2r   r   s                  @@r2   test_embed_merged_slidersr     s   	1"A	6	6	6B	BHNN@@@@'JJJ	1"A	6	6	6B	BHNN@@@@'JJJBBE	$			 / /x../ / / / / / / / / / / / / / /eUH55Kx~!####HN1%%%%%
u||VX.//
0
0Cs88q===="&t,enQ.?.CD.I$D>!%a(,T2D>!%a(,T2DZ)!,Y788BF4,}^^4,sSS4,}^^4,sSS	     Z)!,Y788BF4,}]]4,sSS4,}]]4,sSS	     Z)!,Y788BF4,}]]4,sSS4,}]]4,sSS	      s   (CCCc                  J   t                      } t                      }d }|                     |d|i           t          | |          }t	                      }|                    |d           |                    d           |                                }d|v sJ d|v sJ d S )	Nc                     |j         | _        d S r6   r7   r:   s     r2   r<   z%test_save_embed_bytesio.<locals>.link  r=   r>   r?   r@   Tr   r   z,&amp;lt;pre&amp;gt;False&amp;lt;/pre&amp;gt;z+&amp;lt;pre&amp;gt;True&amp;lt;/pre&amp;gt;)r
   r   r<   r   r   saveseekread)r   rP   r<   r-   stringioutfs         r2   test_save_embed_bytesior     s    zzHUUF" " "MM&WdOM444&!!EzzH	JJxtJ$$$MM!
--//C9S@@@@8C??????r>   c                 V   t                      }t                      }|                    |d           t          ||          }t          j                            t          |           d          }|                    |d           t          j        	                    |          sJ d S )Nr9   rw   	test.htmlTr   )
r
   r   r<   r   ospathjoinstrr   isfile)tmpdirr   rP   r-   filenames        r2   test_save_embedr     s    zzHUUFMM&M)))&!!Ew||CKK55H	JJxtJ$$$7>>(#######r>   c                    t                      }t                      }d }|                    |d|i           t          ||          }t          j                            t          |           d          }|                    |ddt          |                      t          j        	                    |          sJ t          j
        t          j                            t          |           d                    }|                    |           t          |          dk    sJ t          t          j
        t          j                            |d	         d
                              }t          |          dk    sJ t          |d          D ]\  }}	t          |          5 }
t!          j        |
          }d d d            n# 1 swxY w Y   d|v sJ d|d         v sJ t!          j        |d                   d         }t          |          dk    sJ |d	         }|d         dk    sJ |d         dk    sJ |d         d|	z  k    sJ d S )Nc                     |j         | _        d S r6   r7   r:   s     r2   r<   z"test_save_embed_json.<locals>.link  r=   r>   r?   r@   r   T)r   
embed_json	save_path*r   r   z*.jsonr   )FalseTruerB   rC   rD   rE   rF   rG   r8   rH   )r
   r   r<   r   r   r   r   r   r   r   globremover"   sortedzipopenrL   loadrM   )r   r   rP   r<   r-   r   paths
json_filesjfrS   frJ   rC   r;   s                 r2   test_save_embed_jsonr     sr   zzHUUF" " "MM&WdOM444&!!Ew||CKK55H	JJxtV  & & &7>>(#####Ibgll3v;;4455E	LLu::????	"',,uQx"B"BCCDDJz??aZ!233 
? 
?A"XX 	!IaLLE	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!E!!!!5+++++E),--h76{{aq	V}....V}&&&&U|:Q>>>>>>
? 
?s   $GG		G		c                    t          g dd          }t                      }|                    |d           |j                            t
          d           t          ||          }t          j        d          5  |	                    | |          }d d d            n# 1 swxY w Y   t          |||           J d S )Nr   T)r   r   r9   rw   r   )r   r   r<   r|   r}   r~   r   r   r    r!   r   )r*   r+   r&   rP   r-   r.   s         r2   test_embed_widget_disabledr   *  s    OOOd;;;FUUF
KKhK'''
Luh'''E	$			 / /x../ / / / / / / / / / / / / / /ueX..66666s   >B!!B%(B%)+r   rL   r   ior   rn   bokeh.modelsr   r-   r   panel.configr   panel.io.embedr   
panel.paner   panel.paramr	   panel.widgetsr
   r   r   r   r   r3   rT   r`   rg   rj   rr   ru   rz   r   r   r   r   r   r   r   r   r   r   r    r>   r2   <module>r      s(     				        ! ! ! ! ! !             & & & & & &                         
0 0 0f? ? ?0H H H:5 5 5? ? ?0
I 
I 
I
L 
L 
L? ? ?<? ? ?.2 2 2j= = =02 2 2jJ J J<2 2 2j* * *Z@ @ @$ $ $? ? ?:7 7 7 7 7r>   