
    |;3h@d                        d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZ  G d de	      Z
 G d dej                        ZdddZdd	Zed
k(  rd dlZd Z eed      Z ee       yy)    )annotationsN)Callablec                  0     e Zd ZdZ	 	 d	 	 	 d fdZ xZS )TranspilerErrorzIException raised when transpilation fails or encounters ambiguous syntax.c           	         |xs g | _         |rt        | 	  |       y t        | j                         }| d|dk7  rdnd d}| j                   D ]  \  }}}|d| d| d| d	z  } t        | 	  |       y )
Nz issue   s z	 found:

z* Line : z
>> 
)issuessuper__init__len)selfr   messageissue_countissues_textline_nocode	__class__s          Q/var/www/html/audio-gradio/venv/lib/python3.12/site-packages/groovy/transpiler.pyr   zTranspilerError.__init__   s    
 lGW%dkk*K-v[A-=c2%FkR  +/++ K&$	G9E$rJJKG[)    )NN)r   z!list[tuple[int, str, str]] | Noner   z
str | None)__name__
__module____qualname____doc__r   __classcell__r   s   @r   r   r      s*    S 59"*1* * *r   r   c                  r    e Zd Zd Zd-dZ fdZd Zd.dZd/dZd0dZ	d1dZ
d2d	Zd3d
Zd4dZd5dZd6dZd7dZd8dZd9dZd:dZd;dZd<dZd=dZd>dZd?dZd@dZdAdZdBdZdCdZdDdZdDdZdEdZdEdZ dFdZ!dGd Z"dHd!Z#dId"Z$dJd#Z%dKd$Z&dLd%Z'dMd&Z(dNd'Z)dOd(Z*dPd)Z+dQd*Z,dRd+Z-dSd,Z. xZ/S )TPythonToJSVisitorc                    g | _         d| _        t               | _        g | _        g | _        i | _        | j                  | j                  d| _	        y )Nr   )ranger   )
js_linesindent_levelsetdeclared_varsr   source_lines	var_typestransform_rangetransform_lenbuiltin_transformsr   s    r   r   zPythonToJSVisitor.__init__!   sO     U24')13 ))%%#
r   c                    t        |d      rK|j                  }| j                  |dz
     j                         }| j                  j                  |||f       yy)z3Add a transpilation issue with source code context.linenor   N)hasattrr/   r(   stripr   append)r   noder   r   	line_texts        r   	add_issuezPythonToJSVisitor.add_issue/   sP    4"kkG))'A+6<<>IKK)<= #r   c                    	 t         |   |      S # t        $ r;}|j                  r%| j                  j	                  |j                         Y d }~yd }~ww xY w)Nr
   )r   visitr   r   extend)r   r3   er   s      r   r7   zPythonToJSVisitor.visit6   sG    	7=&& 	xx""188,	s    	A1AAc                T    | j                  |dt        |      j                          y)NzUnsupported syntax: r
   )r5   typer   r   r3   s     r   generic_visitzPythonToJSVisitor.generic_visit>   s&    t3DJ4G4G3HIJr   c                     d| j                   z  S )Nz    )r%   r-   s    r   indentzPythonToJSVisitor.indentB   s    ))))r   c           	        g }|j                   j                   D ]  }|j                  |j                         |j                  s+t	        |j                  t
        j                        sP|j                  j                  }t               j                  |t        t        |d             }||| j                  |j                  <    d|j                   ddj                  |       ddz   }| j                  j                  |       | xj                   dz  c_        |j"                  D ]  }| j%                  |        | xj                   dz  c_        | j                  j                  d       y )Nz	function (, ) {r   })argsr2   arg
annotation
isinstanceastNameidglobalsgetgetattrbuiltinsr)   namejoinr$   r%   bodyr7   )r   r3   paramsrG   	type_nametype_objheaderstmts           r   visit_FunctionDefz#PythonToJSVisitor.visit_FunctionDefF   s   99>> 	7CMM#''"~~*S^^SXX"FNN--	"9==GHiQU4VW'.6DNN377+	7 TYYKq6):(;2>DV$QII 	DJJt	QS!r   c                Z    | j                  |j                        }| d|j                   S )N.)r7   valueattr)r   r3   r\   s      r   visit_Attributez!PythonToJSVisitor.visit_Attribute[   s)    

4::&$))%%r   c                    |j                   dn| j                  |j                         }| j                  j                  | j	                          d| d       y )Nr
   return ;)r\   r7   r$   r2   r?   )r   r3   ret_vals      r   visit_ReturnzPythonToJSVisitor.visit_Returna   sD    

*"

4::0FggYa@Ar   c                    | j                  |j                        }| j                  j                  | j	                          | d       y )Nra   )r7   r\   r$   r2   r?   )r   r3   exprs      r   
visit_ExprzPythonToJSVisitor.visit_Exprf   s7    zz$**%tfA67r   c                   t        |j                        dk7  rt        d      |j                  d   }| j                  |      }| j                  |j                        }t        |t        j                        r|j                  | j                  vr| j                  j                  |j                         | j                  |j                        }||| j                  |j                  <   | j                  j                  | j                          d| d| d       y | j                  j                  | j                          | d| d       y )Nr   z2Multiple assignment targets are not supported yet.r   zlet z = ra   )r   targetsr   r7   r\   rI   rJ   rK   rL   r'   addget_expr_typer)   r$   r2   r?   )r   r3   target_nodetargetr\   	expr_types         r   visit_AssignzPythonToJSVisitor.visit_Assignk   s   t||!!"VWWll1oK(

4::& {CHH-d&8&88"";>>2**4::6I$1:{~~.MM  DKKM?$vhc%!JKMM  DKKM?6(#eWA!FGr   c                  |D cg c]  }| j                  |       c}t        d D              r | j                  |d| d       t               t	              dkD  r`t        fdD              sKD cg c]  }|j                   }}| j                  |ddj                  |       d| d	       t               y
y
c c}w c c}w )z|
        Check if an operation is type-safe.
        Raises TranspilerError if types are ambiguous or incompatible.
        c              3  $   K   | ]  }|d u  
 y wN ).0ts     r   	<genexpr>z6PythonToJSVisitor.check_type_safety.<locals>.<genexpr>   s     (QqDy(s   z0Ambiguous operation: Cannot determine types for z=. Operation behavior may differ in JavaScript based on types.r   c              3  .   K   | ]  }|d    k(    yw)r   Nrr   )rs   rt   typess     r   ru   z6PythonToJSVisitor.check_type_safety.<locals>.<genexpr>   s     %Ca58m%Cs   z"Ambiguous operation: Mixed types (rB   z) in z$. Behavior may differ in JavaScript.N)rj   anyr5   r   r   allr   rR   )r   r3   contextexprsre   rt   
type_namesrw   s          @r   check_type_safetyz#PythonToJSVisitor.check_type_safety   s    
 7<<d##D)< (%((NNB7) LN N
 "## u:>#%CU%C"C.34!**4J4NN4TYYz5J4K5QXPY Z5 5
 "## #D> = 5s   C9Cc                "   | j                  |j                        }| j                  |j                        }| j                  |j                        }| j	                  ||j                  |j                  d| d| d| d       d| d| d| dS )N' rz   rA   ))r7   leftrightopr}   )r   r3   r   r   r   s        r   visit_BinOpzPythonToJSVisitor.visit_BinOp   s    zz$))$

4::&ZZ $))TZZ1TF!B4qq1I 	 	
 4&"QugQ''r   c                     y)N+rr   r<   s     r   	visit_AddzPythonToJSVisitor.visit_Add       r   c                     y)N-rr   r<   s     r   	visit_SubzPythonToJSVisitor.visit_Sub   r   r   c                     y)N*rr   r<   s     r   
visit_MultzPythonToJSVisitor.visit_Mult   r   r   c                     y)N/rr   r<   s     r   	visit_DivzPythonToJSVisitor.visit_Div   r   r   c                T   t        |j                        dk7  st        |j                        dk7  rt        d      |j                  d   }| j	                  |j
                        }| j	                  |j                  d         }t        |t        j                        r| d| dS t        |t        j                        r	d| d| dS | j                  ||j
                  |j                  d   d| d| j	                  |       d| 	       | j	                  |      }d
| d| d| dS )Nr   z%Only single comparisons are supportedr   z
.includes(r   !zcomparison r   r   rA   )r   opscomparatorsr   r7   r   rI   rJ   InNotInr}   )r   r3   r   r   r   op_strs         r   visit_ComparezPythonToJSVisitor.visit_Compare   s"   txx=AT%5%5!6!!;!"IJJXXa[zz$))$

4++A./b#&&!WJtfA..CII&ugZvQ// ""		  #%dV1TZZ^,<AeWE	 #  ZZ^FtfAfXQugQ//r   c                     y)N>rr   r<   s     r   visit_GtzPythonToJSVisitor.visit_Gt   r   r   c                     y)N<rr   r<   s     r   visit_LtzPythonToJSVisitor.visit_Lt   r   r   c                     y)Nz>=rr   r<   s     r   	visit_GtEzPythonToJSVisitor.visit_GtE       r   c                     y)Nz<=rr   r<   s     r   	visit_LtEzPythonToJSVisitor.visit_LtE   r   r   c                     y)Nz===rr   r<   s     r   visit_EqzPythonToJSVisitor.visit_Eq       r   c                     y)Nz!==rr   r<   s     r   visit_NotEqzPythonToJSVisitor.visit_NotEq   r   r   c                     y)Ninrr   r<   s     r   visit_InzPythonToJSVisitor.visit_In   r   r   c                     y)Nznot inrr   r<   s     r   visit_NotInzPythonToJSVisitor.visit_NotIn   s    r   c                   | j                  |j                        }| j                  j                  | j	                          d| ddz          | xj
                  dz  c_        |j                  D ]  }| j                  |        | xj
                  dz  c_        | j                  j                  | j	                          dz          |}|j                  rct        |j                        dk(  rJt        |j                  d   t        j                        r"|j                  d   }| j                  |j                        }| j                  j                  | j	                          d| ddz          | xj
                  dz  c_        |j                  D ]  }| j                  |        | xj
                  dz  c_        | j                  j                  | j	                          dz          |j                  rAt        |j                        dk(  r)t        |j                  d   t        j                        r"|j                  r| j                  j                  | j	                          ddz          | xj
                  dz  c_        |j                  D ]  }| j                  |        | xj
                  dz  c_        | j                  j                  | j	                          dz          y y )	Nzif (rC   rD   r   rE   r   z	else if (zelse )r7   testr$   r2   r?   r%   rS   orelser   rI   rJ   If)r   r3   r   rX   currents        r   visit_IfzPythonToJSVisitor.visit_If   sA   zz$))$d4&;cABQII 	DJJt	Q#56 NNGNN#q(7>>!,cff5nnQ'G::gll+DMM  DKKM?)D6!Ds!JK" !

4 !"MM  DKKM?c!9: NNGNN#q(7>>!,cff5 >>MM  DKKM?%!83!>?" !

4 !"MM  DKKM?c!9: r   c                b   |j                   D cg c]  }| j                  |       }}|j                   D ]  }| j                  ||d        t        |      dk(  r	d|d    dS t        |      dk(  rd|d    d|d    d	|d    d
S t        |      dk(  rt	        d      t	        d      c c}w )zHTransform Python's range() to an equivalent JavaScript array expression.zrange() argumentr   r   zArray.from({length: r   z}, (_, i) => i)   z - z}, (_, i) => i + r      z/range() with step argument is not supported yetz'Invalid number of arguments for range())rF   r7   r}   r   r   )r   r3   rG   rF   s       r   r*   z!PythonToJSVisitor.transform_range  s    +/995C

35599 	IC""35G"H	It9>*47)3CDDY!^*47)3tAwi?QRVWXRYQZZ[\\Y!^!"STT!"KLL 6s   B,c                    t        |j                        dk7  rt        d      | j                  |j                  d         }| j	                  |j                  d         }|t
        u rd| dS | dS )zFTransform Python's len() to the equivalent JavaScript property access.r   z len() takes exactly one argumentr   zObject.keys(z).lengthz.length)r   rF   r   r7   rj   dict)r   r3   arg_codert   s       r   r+   zPythonToJSVisitor.transform_len  sq    tyy>Q!"DEE::diil+tyy|,9!(844 Zw''r   c                   i }|j                   D ]  }t        |j                  t        j                        r&|j                  j                  d||j
                  <   M| j                  |j                        }	 t        j                  |      ||j
                  <    d|d<   t        j                  |      S # t        $ r |||j
                  <   Y w xY w)z=Handle Gradio component calls and return JSON representation.Nupdate__type__)keywordsrI   r\   rJ   ConstantrG   r7   literal_eval	Exceptionjsondumps)r   r3   kwargskwr\   s        r    _handle_gradio_component_updatesz2PythonToJSVisitor._handle_gradio_component_updates!  s    -- 
	'B"((CLL1bhhnn6L "&rvvJJrxx(E'!$!1!1%!8rvv
	' &zzz&!!  '!&rvv's   8"B66CCc                   	 dd l }d}t        |j                  t        j
                        r4|j                  j                  | j                  v r) | j                  |j                  j                     |      S |r	 |j                  j                  dk(  r| j                  |      S t        |j                  j                  d       }|r1t        ||j                  j                        r| j                  |      S |j                  D ].  }| j                  ||d|j                  j                   d       0 | j!                  |d|j                  j                   d	       y
t        |j                  t        j"                        r|r	 t        |j                  j$                  t        j
                        r|j                  j$                  j                  dv r~|j                  j&                  dk(  r| j                  |      S t        |j                  j&                  d       }|r1t        ||j                  j                        r| j                  |      S | j)                  |j                        }|j                  D cg c]  }| j)                  |       }}t        |j                  t        j"                        r]| j                  |j                  |j                  j$                  d|        |j                  D ]  }| j                  ||d|         | ddj+                  |       dS # t        $ r d}Y 7w xY w# t        $ r Y Vw xY w# t        $ r Y 	w xY wc c}w )Nr   TFr   zargument in z() callr   zUnsupported function "z()"r
   >   grgradiozobject in method call zargument in method call rA   rB   r   )r   ImportErrorrI   funcrJ   rK   rL   r,   r   rO   
issubclassblocksBlockr   rF   r}   r5   	Attributer\   r]   r7   rR   )r   r3   r   
has_gradiocomponent_classrG   r   rF   s           r   
visit_CallzPythonToJSVisitor.visit_Call2  s   	J
 dii*yy||t666<t..tyy||<TBB yy||x/#DDTJJ&-fdiillD&IO&:')<)<,  $DDTJJ yy &&TYY\\N'&J '  NN4#9$)),,s!KL dii/Jdiioosxx8TYY__=O=O T >
 yy~~1#DDTJJ&-fdiinnd&KO&:')<)<,  $DDTJJ
 zz$))$+/995C

355dii/""		499??6LTF4S #  yy &&(@&G ' 
 q4)++  	J	( ! 6  
 6sJ   L1 ;)M %AM A9M AM ?M#1M ?M 	MM	M M c                    |j                   S rq   )rL   r<   s     r   
visit_NamezPythonToJSVisitor.visit_Namey  s    wwr   c                F    |j                   yt        |j                         S )Nnull)r\   reprr<   s     r   visit_Constantz PythonToJSVisitor.visit_Constant}  s    ::DJJr   c                L   | j                  |j                        }| j                  |j                        }t        |j                  t        j
                        rt        |j                  j                  t        j                        rn|j                  j                  j                  dk(  rKt        |j                  t        j                        r't        | j                  |j                  j                  <   | j                  j                  | j                          d| d| ddz          | xj                  dz  c_        |j                  D ]  }| j                  |        | xj                  dz  c_        | j                  j                  | j                          dz          y )Nr#   z	for (let z of rC   rD   r   rE   )r7   rl   iterrI   rJ   Callr   rK   rL   intr)   r$   r2   r?   r%   rS   )r   r3   rl   	iter_exprrX   s        r   	visit_ForzPythonToJSVisitor.visit_For  s   DKK(JJtyy)	 tyy#((+499>>3884		!!W,$++sxx014t{{~~.ixtI;bQTWWXQII 	DJJt	Q#56r   c                   | j                  |j                        }| j                  j                  | j	                          d| ddz          | xj
                  dz  c_        |j                  D ]  }| j                  |        | xj
                  dz  c_        | j                  j                  | j	                          dz          y )Nzwhile (rC   rD   r   rE   )r7   r   r$   r2   r?   r%   rS   )r   r3   r   rX   s       r   visit_WhilezPythonToJSVisitor.visit_While  s    zz$))$gdV2>DEQII 	DJJt	Q#56r   c                    |j                   D cg c]  }| j                  |       }}ddj                  |       dS c c}w N[rB   ]eltsr7   rR   r   r3   eltelementss       r   
visit_ListzPythonToJSVisitor.visit_List  ?    /3yy9DJJsO99499X&'q)) :   >c                    |j                   D cg c]  }| j                  |       }}ddj                  |       dS c c}w r   r   r   s       r   visit_TuplezPythonToJSVisitor.visit_Tuple  r   r   c                z    t        |j                        dk7  r j                  |d       t               |j                  d   } j	                  |j
                        } j	                  |j                        } j	                  |j                        }|j                  rdj                   fd|j                  D              }| d| d| d}t        |j                  t        j                        r-|j                  j                  |j                  j                  k(  s|d	| d| dz  }|S | d	| d| d}|S )
z
        Transform a Python list comprehension into a combination of filter and map calls.
        For example:
            [x * 2 for x in arr if x > 10]
        becomes:
            arr.filter(x => x > 10).map(x => x * 2)
        r   z7Only single generator list comprehensions are supportedr   z && c              3  @   K   | ]  }j                  |        y wrq   )r7   )rs   if_noder   s     r   ru   z3PythonToJSVisitor.visit_ListComp.<locals>.<genexpr>  s     $PWTZZ%8$Ps   z.filter(z => r   z.map()r   
generatorsr5   r   r7   r   rl   r   ifsrR   rI   rJ   rK   rL   )r   r3   geniter_js	target_jselt_js
conditionsresults   `       r   visit_ListCompz PythonToJSVisitor.visit_ListComp  s    t1$NNO "##ooa **SXX&JJszz*	DHH%77$P$PPJy4
|1EFtxx2txx{{cjjmm7SE)D::   yi[VHA>Fr   c                ~    | j                  |j                        }| j                  |j                        }| d| dS )Nr   r   )r7   r\   slice)r   r3   r\   slice_values       r   visit_Subscriptz!PythonToJSVisitor.visit_Subscript  s9    

4::&jj,+a((r   c           	     *   | j                  |j                        }| j                  |j                        j                         }| j                  |j                        }| j
                  j                  | j                          | d| d| d       y )Nr   z= ra   )r7   rl   r   r1   r\   r$   r2   r?   )r   r3   rl   r   r\   s        r   visit_AugAssignz!PythonToJSVisitor.visit_AugAssign  sp    DKK(ZZ &&(

4::&vhat2eWAFGr   c                    | j                  |j                        }|j                  D cg c]  }| j                  |       }}dd| dj                  |       dS c c}w )NrA   r   r   )r7   r   valuesrR   )r   r3   r   r\   r  s        r   visit_BoolOpzPythonToJSVisitor.visit_BoolOp  sZ    ZZ 15=$**U#==Qrd!9>>&)*!,, >s   Ac                     y)Nz&&rr   r<   s     r   	visit_AndzPythonToJSVisitor.visit_And  r   r   c                     y)Nz||rr   r<   s     r   visit_OrzPythonToJSVisitor.visit_Or  r   r   c                    g }t        |j                  |j                        D ]@  \  }}|	| j                  |      }| j                  |      }|j	                  | d|        B ddj                  |       dS )Nr   rD   rB   rE   )zipkeysr  r7   r2   rR   )r   r3   pairskeyr\   key_jsvalue_jss          r   
visit_DictzPythonToJSVisitor.visit_Dict  s~    dii5 	2JC{ZZ_Fzz%(HLLF82hZ01	2 DIIe$%R((r   c                   t        |t        j                        rt        |j                        S t        |t        j
                        r2|j                  | j                  v r| j                  |j                     S yt        |t        j                        r@| j                  |j                        }| j                  |j                        }||k(  r||S yt        |t        j                        ryt        |t        j                        rt        S t        |t        j                        rt         S t        |t        j"                        rt$        S y)z0Determine the type of an expression if possible.N)rI   rJ   r   r;   r\   rK   rL   r)   BinOprj   r   r   r   ListlistDictr   Tupletuple)r   r3   	left_type
right_types       r   rj   zPythonToJSVisitor.get_expr_type  s    dCLL)

##chh'ww$..(~~dgg..cii(**4995I++DJJ7JJ&9+@  chh'chh'Kchh'Kcii(Lr   )r3   ast.ASTr   strreturnNone)r  r  )r3   zast.FunctionDef)r3   zast.Attribute)r3   z
ast.Return)r3   zast.Expr)r3   z
ast.Assign)r3   r  r{   r  rz   r  r  r  )r3   z	ast.BinOp)r3   zast.Add)r3   zast.Sub)r3   zast.Mult)r3   zast.Div)r3   zast.Compare)r3   zast.Gt)r3   zast.Lt)r3   zast.GtE)r3   zast.LtE)r3   zast.Eq)r3   z	ast.NotEq)r3   zast.In)r3   z	ast.NotIn)r3   zast.If)r3   ast.Callr  r  )r3   r  )r3   zast.Name)r3   zast.Constant)r3   zast.For)r3   z	ast.While)r3   zast.List)r3   z	ast.Tuple)r3   zast.ListComp)r3   zast.Subscript)r3   zast.AugAssign)r3   z
ast.BoolOp)r3   zast.And)r3   zast.Or)r3   zast.Dict)r3   r  r  ztype | None)0r   r   r   r   r5   r7   r=   r?   rY   r^   rc   rf   rn   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   r   r   r  r  r  r	  r  rj   r   r   s   @r   r!   r!       s    
>*"*&B
8
H($4(00 ;FM(""D,N 7*7*
*
:)H-)r   r!   c                   |rSt        j                  |       }|j                  r2t        |j                  j	                               }t        d|       	 t        j                  |       }t        j                  |      }	 t        j                  |      }|r	 ddl}d}t        j                  |      D ]:  }	t!        |	t        j"                        s|	j$                  | j&                  k(  s8|	} n |rg }
t        j                  |      D ];  }	t!        |	t        j(                        s|	j*                  +|
j-                  |	       = |
st        d      |
D ]Y  }t/        |j*                        r|j0                  }|j3                         |d	z
     j5                         }t        d
| d|        d}t        j                  |      D ]0  }	t!        |	t        j"                  t        j6                  f      s.|	} n |t        d      t9               }|j3                         |_        t!        |t        j6                        r|j<                  j<                  D cg c]  }|j>                   }}|j@                  j-                  ddjC                  |       ddz          |xjD                  d	z  c_"        |j@                  j-                  |jG                          d|jI                  |jJ                         d       |xjD                  d	z  c_"        |j@                  j-                  d       n|jI                  |       |jL                  rt        |jL                        djC                  |j@                        S # t        $ r}t        d      |d}~ww xY w# t        $ r}t        d      |d}~ww xY w# t        $ r t        d      w xY wc c}w )a5  
    Transpiles a Python function to JavaScript and returns the JavaScript code as a string.

    Parameters:
        fn: The Python function to transpile.
        validate: If True, the function will be validated to ensure it takes no arguments & only returns gradio component property updates. This is used when Groovy is used inside Gradio and `gradio` must be installed to use this.

    Returns:
        The JavaScript code as a string.

    Raises:
        TranspilerError: If the function cannot be transpiled or if the transpiled function is not valid.
    z>Function must take no arguments for client-side use, but got: )r   z1Could not retrieve source code from the function.Nz Could not parse function source.r   z(Gradio must be installed for validation.zMFunction must return Gradio component updates, but no return statement found.r   zKFunction must only return Gradio component updates. Invalid return at line r   z>No function or lambda definition found in the provided source.z
function (rB   rC   rD   r`   ra   rE   )r   r   )'inspect	signature
parametersr  r  r   	getsourcetextwrapdedentr   rJ   parseSyntaxErrorr   r   walkrI   FunctionDefrQ   r   Returnr\   r2   _is_valid_gradio_returnr/   
splitlinesr1   Lambdar!   r(   rF   rG   r$   rR   r%   r?   r7   rS   r   )fnvalidatesigparam_namessourcer9   treer   	func_noder3   return_nodesreturn_noder   r4   visitorrG   rF   s                    r   	transpiler9    s    #>>s~~2245K!XYdXef ""2&(Qyy  	V 	HHTN 	D$0TYY"++5M 		
 L+ .dCJJ/DJJ4J ''-.  %k   , .{/@/@A)00G & 1 1 3GaK @ F F HI)"mnumvvx  zC  yD  !E 	 I dS__cjj9:I
 T
 	
  !G!,,.G)SZZ(#,>>#6#67C77*TYYt_,=R @3 FG!~~ inn(E'FaH	
 	!$i ~~W^^4499W%%&&M  G
	  Q&HIqPQ  	V!*TUU	VV 8sB   *N N N= O	N
NN	N:(N55N:=Oc                   t        | t        j                        rt        | j                  t        j                        rt        | j                  j
                  t        j                        r| j                  j
                  j                  dv rJ	 ddl}| j                  j                  dk(  ryt        || j                  j                  d      }|rPt        ||j                  j                        r0| j                  ry| j                  D ]  }|j                   dk(  s y yyt        | j                  t        j                        r	 ddl}| j                  j                  dk(  ryt        || j                  j                  d      }|rPt        ||j                  j                        r0| j                  ry| j                  D ]  }|j                   dk(  s y yyyt        | t        j&                  t        j(                  f      r)| j*                  syt-        d | j*                  D              S y# t"        t$        f$ r Y yw xY w# t"        t$        f$ r Y yw xY w)	z
    Check if a return value is a valid Gradio component or collection of components.

    Args:
        node: The AST node representing the return value

    Returns:
        bool: True if the return value is valid, False otherwise
    >   r   r   r   Nr   TFr\   c              3  2   K   | ]  }t        |        y wrq   )r,  )rs   r   s     r   ru   z*_is_valid_gradio_return.<locals>.<genexpr>  s     EC*3/Es   )rI   rJ   r   r   r   r\   rK   rL   r   r]   rO   r   r   r   rF   r   rG   r   AttributeErrorr  r  r   ry   )r3   r   r   r   s       r   r,  r,  j  s    $!dii/JIIOOSXX5
 yy!!%55!yy~~1#&-fdiinnd&KO&:')<)<,  99#("&-- -B!vv0',-  $ 		388,99<<8+")&$)),,"E"z/6==CVCV'Wyy$"mm )66W,#()     
D399chh/	0yyE499EEE7 $^4 $  0 sV   H0 0AH0  H0 H0 !H0 	I 'AI 7I I I 0IIII__main__c                 2    t        j                  ddd       S )Nr   T)selectedvisibleinfo)r   r   rr   r   r   filter_rows_by_termrB    s    yy!T==r   T)r0  )F)r/  r   r0  boolr  r  )r3   r  r  rC  )
__future__r   rJ   rP   r!  r   r%  collections.abcr   r   r   NodeVisitorr!   r9  r,  r   r   r   rB  js_codeprintrr   r   r   <module>rI     ss    " 
     $*i **e eP_'D;@ z> +d;G	'N r   