
    ~Od                       d Z ddlZddlZddlZddlZddlZddlZddlZddlZ	 ddl	Z	n# e
$ r dZ	Y nw xY wddlmZ ddlT ddlmZ ej        adadadadadad	ad	adadadag ad	ad	adai ad	a da!da"da#tF          g ia$d	a%g a&d
a'g a(da)d
a*g a+g a,g a-d Z.ddZ/de_0        i Z1dD ]	Z2ddie1e2<   
dD ]	Z2ddie1e2<   
i Z3i Z4dD ]Z5e5dz   e3e5<   e5e4e5dz   <   d Z6d Z7d Z8d Z9d Z: ej;        dej<                  j=        Z> ej;        dej<                  j?        Z@ ej;        dej<                  j?        ZA ej;        dej<                  j?        ZB ej;        dej<                  j=        ZCd ZDd  ZEeFdfd!ZGd"ZHd#ZI ej;        eHd	eIeId$fz  ej<                  d%fZJ ej;        eHd	eId&z   eId&z   d$fz  ej<                  ZK ej;        eHd'z  ej<                  d(fZL ej;        eHd)z  ej<                  d(fZMd*ZN ej;        eHd	eNeNd$fz  ej<                  d(fZOeNd+z   d,z   ZP ej;        eHd	ePePd$fz  ej<                  d(fZQd-ZR ej;        eHd	eReRd$fz  ej<                  d.fZSd/ZT ej;        eHd0eTeTd1fz  ej<                  d2fZUd3ZV ej;        eHd	eVeVd$fz  ej<                  d4fZW ej;        eHd5z  ej<                  d6fZX ej;        eHd7z  ej<                  d8fZY ej;        eHd9z  ej<                  d:fZZ ej;        eHd;z  ej<                  d<fZ[ ej;        eHd=z  ej<                  d>fZ\ ej;        eHd?z  ej<                  d@fZ] ej;        eHdAz  ej<                  dBfZ^ ej;        eHdCz  ej<                  dDfZ_ ej;        eHdEz  ej<                  dFfZ` ej;        eHdGz  ej<                  dHfZa ej;        eHdIz  ej<                  dJfZb ej;        eHdKz  ej<                  dLfZc ej;        eHdMz  ej<                  dNfZd ej;        eHdOz  ej<                  dPfZe ej;        eHdQz  ej<                  dRfZf ej;        eHdSz  ej<                  dTfZg ej;        eHdUz  ej<                  dVfZh ej;        eHdWz  ej<                  dXfZi ej;        eHdYz  ej<        ejj        z            dZfZk ej;        d[ejj                  d\fZld] Zmd^ Zn ej;        d_ej<                  Zodd`Zpda ZqddcZrdd ZsddeZt ej;        dfej<                  Zu ej;        dgej<                  Zv ej;        dhej<                  Zw ej;        diej<                  Zx ej;        djej<                  Zy ej;        dk          Zz ej;        dl          Z{ ej;        dmej<                  Z|dn Z}do Z~dp Zdq Zdr Zds Z ej;        dtej<                  Z ej;        duej<                  Z ej;        dvej<                  Z ej;        dwej<                  Z ej;        dxej<                  Zdy Zdz Zd{ Zd| Zdd}Zdd~ZddZddZd Zd ZddZddZddZd Zd ZddZd ZddZ ej;        dej<                  Zd Z ej;        dej<                  Zd Zd Zd Zd Zd ZddZi fdZd Z ej;        d          j=        Zd Zd Z ej;        dej<                  Zg fdZd Z ej;        dej<                  Z ej;        dej<                  Z ej;        dej<                  Z ej;        dej<                  Z ej;        dej<                  Zd Zi fdZddZddZddZd ZddZg ad Zd Zd Zg dfdZd Ztn                              e           edk    rg Zg ZdZdZdZdZej        dd         D ]1Zed	k    r
ed         dk    rdZedk    rdada$edk    rdada/edk    rt"          r e/dd           dadaMedk    rdaVedk    rda_edk    rdadajedk    rdadadawedk    rdZedk    rdZČedk    rdZÌed         dk    r ed eeƦ          z             erdZeaerdZeaerV	  eeƦ                                           e                    eƦ           # e$ rZ ede̛d           Y dZ[̐dZ[ww xY we                    eƦ           3t"          st.          rt0          s e/dd            ee          Zt,          rf e/d et,                    z  d            eeͦ          Z et,          dĦ          5 Ze                    eΦ           ddd           n# 1 swxY w Y   er eFeͦ           dS dS dS )a*  
crackfortran --- read fortran (77,90) code and extract declaration information.

Copyright 1999-2004 Pearu Peterson all rights reserved,
Pearu Peterson <pearu@ioc.ee>
Permission to use, modify, and distribute this software is given under the
terms of the NumPy License.

NO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.
$Date: 2005/09/27 07:13:49 $
Pearu Peterson


Usage of crackfortran:
======================
Command line keys: -quiet,-verbose,-fix,-f77,-f90,-show,-h <pyffilename>
                   -m <module name for f77 routines>,--ignore-contains
Functions: crackfortran, crack2fortran
The following Fortran statements/constructions are supported
(or will be if needed):
   block data,byte,call,character,common,complex,contains,data,
   dimension,double complex,double precision,end,external,function,
   implicit,integer,intent,interface,intrinsic,
   logical,module,optional,parameter,private,public,
   program,real,(sequence?),subroutine,type,use,virtual,
   include,pythonmodule
Note: 'virtual' is mapped to 'dimension'.
Note: 'implicit integer (z) static (z)' is 'implicit static (z)' (this is minor bug).
Note: code after 'contains' will be ignored until its scope ends.
Note: 'common' statement is extended: dimensions are moved to variable definitions
Note: f2py directive: <commentchar>f2py<line> is read as <line>
Note: pythonmodule is introduced to represent Python module

Usage:
  `postlist=crackfortran(files)`
  `postlist` contains declaration information read from the list of files `files`.
  `crack2fortran(postlist)` returns a fortran code to be saved to pyf-file

  `postlist` has the following structure:
 *** it is a list of dictionaries containing `blocks':
     B = {'block','body','vars','parent_block'[,'name','prefix','args','result',
          'implicit','externals','interfaced','common','sortvars',
          'commonvars','note']}
     B['block'] = 'interface' | 'function' | 'subroutine' | 'module' |
                  'program' | 'block data' | 'type' | 'pythonmodule' |
                  'abstract interface'
     B['body'] --- list containing `subblocks' with the same structure as `blocks'
     B['parent_block'] --- dictionary of a parent block:
                             C['body'][<index>]['parent_block'] is C
     B['vars'] --- dictionary of variable definitions
     B['sortvars'] --- dictionary of variable definitions sorted by dependence (independent first)
     B['name'] --- name of the block (not if B['block']=='interface')
     B['prefix'] --- prefix string (only if B['block']=='function')
     B['args'] --- list of argument names if B['block']== 'function' | 'subroutine'
     B['result'] --- name of the return value (only if B['block']=='function')
     B['implicit'] --- dictionary {'a':<variable definition>,'b':...} | None
     B['externals'] --- list of variables being external
     B['interfaced'] --- list of variables being external and defined
     B['common'] --- dictionary of common blocks (list of objects)
     B['commonvars'] --- list of variables used in common blocks (dimensions are moved to variable definitions)
     B['from'] --- string showing the 'parents' of the current block
     B['use'] --- dictionary of modules used in current block:
         {<modulename>:{['only':<0|1>],['map':{<local_name1>:<use_name1>,...}]}}
     B['note'] --- list of LaTeX comments on the block
     B['f2pyenhancements'] --- optional dictionary
          {'threadsafe':'','fortranname':<name>,
           'callstatement':<C-expr>|<multi-line block>,
           'callprotoargument':<C-expr-list>,
           'usercode':<multi-line block>|<list of multi-line blocks>,
           'pymethoddef:<multi-line block>'
           }
     B['entry'] --- dictionary {entryname:argslist,..}
     B['varnames'] --- list of variable names given in the order of reading the
                       Fortran code, useful for derived types.
     B['saved_interface'] --- a string of scanned routine signature, defines explicit interface
 *** Variable definition is a dictionary
     D = B['vars'][<variable name>] =
     {'typespec'[,'attrspec','kindselector','charselector','=','typename']}
     D['typespec'] = 'byte' | 'character' | 'complex' | 'double complex' |
                     'double precision' | 'integer' | 'logical' | 'real' | 'type'
     D['attrspec'] --- list of attributes (e.g. 'dimension(<arrayspec>)',
                       'external','intent(in|out|inout|hide|c|callback|cache|aligned4|aligned8|aligned16)',
                       'optional','required', etc)
     K = D['kindselector'] = {['*','kind']} (only if D['typespec'] =
                         'complex' | 'integer' | 'logical' | 'real' )
     C = D['charselector'] = {['*','len','kind','f2py_len']}
                             (only if D['typespec']=='character')
     D['='] --- initialization expression string
     D['typename'] --- name of the type if D['typespec']=='type'
     D['dimension'] --- list of dimension bounds
     D['intent'] --- list of intent specifications
     D['depend'] --- list of variable names on which current variable depends on
     D['check'] --- list of C-expressions; if C-expr returns zero, exception is raised
     D['note'] --- list of LaTeX comments on the variable
 *** Meaning of kind/char selectors (few examples):
     D['typespec>']*K['*']
     D['typespec'](kind=K['kind'])
     character*C['*']
     character(len=C['len'],kind=C['kind'], f2py_len=C['f2py_len'])
     (see also fortran type declaration statement formats below)

Fortran 90 type declaration statement format (F77 is subset of F90)
====================================================================
(Main source: IBM XL Fortran 5.1 Language Reference Manual)
type declaration = <typespec> [[<attrspec>]::] <entitydecl>
<typespec> = byte                          |
             character[<charselector>]     |
             complex[<kindselector>]       |
             double complex                |
             double precision              |
             integer[<kindselector>]       |
             logical[<kindselector>]       |
             real[<kindselector>]          |
             type(<typename>)
<charselector> = * <charlen>               |
             ([len=]<len>[,[kind=]<kind>]) |
             (kind=<kind>[,len=<len>])
<kindselector> = * <intlen>                |
             ([kind=]<kind>)
<attrspec> = comma separated list of attributes.
             Only the following attributes are used in
             building up the interface:
                external
                (parameter --- affects '=' key)
                optional
                intent
             Other attributes are ignored.
<intentspec> = in | out | inout
<arrayspec> = comma separated list of dimension bounds.
<entitydecl> = <name> [[*<charlen>][(<arrayspec>)] | [(<arrayspec>)]*<charlen>]
                      [/<init_expr>/ | =<init_expr>] [,<entitydecl>]

In addition, the following attributes are used: check,depend,note

TODO:
    * Apply 'parameter' attribute (e.g. 'integer parameter :: i=2' 'real x(i)'
                                   -> 'real x(2)')
    The above may be solved by creating appropriate preprocessor program, for example.

    N   )__version__)*)symbolicfix     c                  |    da dadadadadadadadada	g a
dat          g iadadadag ai adadadag ag ag ag ad ad S )Nr   r   r   r   r	   r
   )	strictf77sourcecodeformquietverbosetabcharpyffilenamef77modulenameskipemptyendsignorecontainsdolowercasedebuggroupcounter	grouplistneededmoduleexpectbeginskipblocksuntilusermodulesf90modulevarsgotnextfilefilepositiontextcurrentfilenameskipfunctions	skipfuncs	onlyfuncsinclude_pathsprevious_context     7lib/python3.11/site-packages/numpy/f2py/crackfortran.pyreset_global_f2py_varsr)      s     INEGGKMMNKELr"ILKOKMKOMIIMr'   c                     t           sd S t          sG|r$t          j                            t
                     t          j                            |            d S d S N)r   r   sysstdoutwriter   )lineflags     r(   outmessr1      s^        	/J-...
 r'   2   zabcdefghopqrstuvwxyz$_typespecrealijklmninteger)3intdoublefloatcharshortlongvoidcasewhilereturnsignedunsignediffortypedefsizeofunionstructstaticregisternewbreakdogotoswitchcontinueelseinlineexterndeleteconstautolenrankshapeindexslensize_imaxminflenfshapestringcomplex_doublefloat_doublestdinstderrr-   typedefault_bnc                 t    | t           v r.t          d| dt           |          d           t           |          S | S )Nzrmbadname1: Replacing "" with "".
)badnameserrmessnames    r(   
rmbadname1rq     sF    xx~~~' 	( 	( 	(~Kr'   c                     d | D             S )Nc                 ,    g | ]}t          |          S r&   )rq   .0_ms     r(   
<listcomp>zrmbadname.<locals>.<listcomp>  s    +++rJrNN+++r'   r&   namess    r(   	rmbadnamerz     s    ++U++++r'   c                 t    | t           v r.t          d| dt           |          d           t           |          S | S )Nzundo_rmbadname1: Replacing "rk   rl   )invbadnamesrn   ro   s    r(   undo_rmbadname1r}     sJ    {44T***, 	- 	- 	-4  Kr'   c                     d | D             S )Nc                 ,    g | ]}t          |          S r&   )r}   rt   s     r(   rw   z"undo_rmbadname.<locals>.<listcomp>!  s     000BOB000r'   r&   rx   s    r(   undo_rmbadnamer      s    00%0000r'   c                     |                      d          }|dk    rdS d| |d          v rdS d| |d          v rdS | |dz   d          S )N.r
   r	   \/r   )rfind)rp   is     r(   getextensionr   $  s_    

3ABwwrtABBxr
d122hrA<r'   z.*\.(for|ftn|f77|f)\Zz-\*-\s*fortran\s*-\*-z-\*-\s*f90\s*-\*-z-\*-\s*fix\s*-\*-z[^c*]\s*[^\s\d\t]c                 `   t           ,t          j        |                                           j        }nt	          dt
          j                            |                     }t          | d          5 }|	                    |          }|
                    t          j                  rd}n^|
                    t          j        t          j        f          rd}n0|
                    t          j        t          j        f          rd}nd}ddd           n# 1 swxY w Y   t          | ||          S )	aN  Ensures that filename is opened with correct encoding parameter.

    This function uses charset_normalizer package, when available, for
    determining the encoding of the file to be opened. When charset_normalizer
    is not available, the function detects only UTF encodings, otherwise, ASCII
    encoding is used as fallback.
    N    rbz	UTF-8-SIGzUTF-32zUTF-16ascii)encoding)charset_normalizer	from_pathbestr   r_   ospathgetsizeopenread
startswithcodecsBOM_UTF8BOM_UTF32_LEBOM_UTF32_BEBOM_LEBOM_BE)filenamemoder   nbytesfhandleraws         r(   openhookr   5  sB    %%/99>>@@I R2233(D!! 
	#W,,v&&C~~fo.. #&!4f6I JKK ## >?? ## #
	# 
	# 
	# 
	# 
	# 
	# 
	# 
	# 
	# 
	# 
	# 
	# 
	# 
	# 
	# $2222s   1BDDDc                    d}t          | d          5 }|                                }d}t          |          rd}nt          |          rd}d}|dk    rw|ru|d         dk    rM|                                r9|dz  }|d         dk    rt          |dd                   s|d	d
         dk    rd}n|                                }|dk    r|uddd           n# 1 swxY w Y   |S )z(Check if file is in free format Fortran.r   r   r   !	N   r
   &)r   readline_has_f_header_has_f90_headerstrip_free_f90_start)fileresultfr/   ns        r(   is_free_formatr   T  s<    F	$		  zz|| 	AAT"" 	AF!eeeAw#~~$**,,~QGtOORaR(A(AOd2b5kUXFXFXF::<<D !eee                              Ms   B9CCCc           
         |s8t           t          t          t          t          t
          t          t          t          f	}| g k    rdS t          }d}d}d}t          j
        dt          j                  }t          j
        d          }	t          j
        d          }
t          j
        d          }|r |dd           d	\  }}d
gd t          d          D             z   }dat          j        | t                    }	 	 |                                }nO# t"          $ rB}t%          d|                                 d|                                 d| d          d}~ww xY w|sn|                                rda|                                ada |}dadat,          j                            t                    d         }t3          t                    r!t5          |          st7          |          sdan%t9          t                    rt7          |          sdat          rt:          ant<          at?          dtA          t                    dt          t          rdpdd           |!                                "                    dd
          }|dk    s|d         dvrn|dd         }|dk    t          sYtG          |d          \  }}|d
z  }|dd         $                                dk    r!tG          |d z   |dd         z   d          \  }}|%                                dk    rt          dk    rnd}?t          dk    r|d         d!v r2|dd         $                                d"k    rd#|dd         z   }n(d}t          rtM          |          d$k    r
|dd$         }|d         |vrt%          d%tA          |          z            |rt          r2tM          |          dk    r|d         d
k    s||d&d         z   }d}d}nt          s|	'                    |          }|r|(                    d'          }|r0||
'                    |          (                    d'          z   }d}d}n*d#|dd         z   }|r|$                                }n|}|}|}|du}nTd#|dd         z   }|r|$                                }n|}|}|}n(t          dk    r|sw|d(k    rq|'                    |          r\|d)z   }	 |                                }|stS          d*           n||z   }|'                    |          rnB|*                                }|	'                    |          }|r|(                    d'          }|r0||
'                    |          (                    d'          z   }d}d}n|r|$                                }n|}|}|}|du}n$tW          d+tA          t                    z            d,|,                                dz
  t          |fz  a|'                    |          }|r|(                    d-          }t,          j        -                    |          rt]          ||d.           nt,          j        /                    t                    gt`          z   }d}|D ]W}t,          j        1                    ||          }t,          j        -                    |          rd}t]          ||d.            nX|s@t?          d/tA          |          d0t,          j2        1                    |          d1           n ||           |}S|r|$                                }n|}|}d,|,                                dz
  t          |fz  a|'                    |          }|r|(                    d-          }t,          j        -                    |          rt]          ||d.           nt,          j        /                    t                    gt`          z   }d}|D ]W}t,          j        1                    ||          }t,          j        -                    |          rd}t]          ||d.            nX|s@t?          d/tA          |          d0t,          j2        1                    |          d1           n ||           da|3                                 |r |dd           dS |\	  a aaaaaaaadS )2z
    Read fortran codes from files and
     1) Get rid of comments, line continuations, and empty lines; lower cases.
     2) Call dowithline(line) on every line.
     3) Recursively call itself when statement "include '<filename>'" is met.
    NFr	   z*\s*include\s*(\'|")(?P<name>[^\'"]*)(\'|")z(?P<line>.*)&\s*\Zz(\s*&|)(?P<line>.*)z.*?'''r
   )r	   r	    c                 ,    g | ]}t          |          S r&   )strrt   s     r(   rw   z#readfortrancode.<locals>.<listcomp>  s    777r3r77777r'   
   )r   Tzreadfortrancode: reading #z failed with
zu.
It is likely that installing charset_normalizer package will help f2py determine the input file encoding correctly.r   r   r   freez	Reading file z	 (format:z,strict)
    z
r   r   z!f2pyr   )r   cr   Cr   f2pyz     H   zxreadfortrancode: Found non-(space,digit) char in the first column.
	Are you sure that this code is in fix form?
	line=%s   r/   .pyf
z.Unexpected end of file when reading multiline
z6Flag sourcecodeform must be either 'fix' or 'free': %szLine #%d in %s:"%s"
	rp   )
dowithlineistopz-readfortrancode: could not find include file z in . Ignoring.
)4r   r   r    r   r   beginpatternr   r   r   recompileIrange	fileinput	FileInputr   r   UnicodeDecodeError	Exceptionr   linenoisfirstliner   r   splitext	is_f_filer   _has_fix_headerr   beginpattern77beginpattern90r1   repr
expandtabsreplacesplit_by_unquotedlowerr   rW   matchgrouprn   rstrip
ValueError
filelinenoisfilereadfortrancodedirnamer$   joinpathsepclose)ffiler   r   saveglobalslocaldolowercasecont	finallinellincludelinecont1cont2
mline_markl1spacedigitsfinlmsgextrl_origfinalliner   lcmfninclude_dirs	foundfileinc_dirfn1s                                r(   r   r   l  s	     6!#3_nV_%+6{{" DI	B*5rt= =KJ,--EJ-..EI&&J 
2rFB%77U2YY7777K

eh
7
7
7Ca	AA! 	 	 	CLLNN  SZZ\\  !$    	  	?? 	7!!llnnOKBI"N'""?33A6C)) ((++(/>q/A/A(		00 (9K9K (!' .--GO,,,,nn .Y4"446 7 7 7 LLNN""63//r''uH$$#2#A r''  	D'3//GQHA"1"v||~~(((Wr!""v)=sCC17799??''
  U""t000QqS6<<>>V++!ABB%AA D q66B;;#2#AaDK'' !GIMa!Q R R R  !I !CFFQJJqts{{!ABB%Z	 "  AA ,GGFOO %++a.."6"6v">">>$&	(* $aeO+ +(*

II(*I(*TMDD  !ABB%A' '$&HHJJ		$&	$&MBBv%% C6MMj.>.>q.A.AMHB MO O OBA!''++  HHJJAA $GGFOO 
%++a....v666	 "# # "

II "I "TMDDH4P^K_K__a a a4NNq /287 7m,, 	"Bw~~b!! BzCCCCC GOOO44 68E F	+  G',,w33Cw~~c** $%	'
!LLLL ! BGR"*//,"?"?"?"?A B B B Jy!!!CaD  HHJJ			M01or43 3-((A WWV__7>>" 	>B:Q?????GOOO<<=MLI'  gll7B//7>>#&&  !I#CJaHHHHE  >HHHHbjool;;;;= > > > 	
9IIKKK D
2q 9D	6%	%+++s   :D 
E=EEzN\s*(?P<before>%s(?=\s*(\b(%s)\b)))\s*(?P<this>(\b(%s)\b))\s*(?P<after>%s)\s*\Zzqcharacter|logical|integer|real|complex|double\s*(precision\s*(complex|)|complex)|type(?=\s*\([\w\s,=(*)]*\))|byte.*rg   z|static|automatic|undefined)z([a-z]+[\w\s(=*+-/)]*?|)functionr  r  begin)z	[a-z\s]*?
subroutiner  r  zprogram|block\s*dataz@|module(?!\s*procedure)|python\s*module|(abstract|)\s*interface|ztype(?!\s*\()z\end|endprogram|endblockdata|endmodule|endpythonmodule|endinterface|endsubroutine|endfunctionendzJend\s*(if|do|where|select|while|forall|associate|block|critical|enum|team)z[\w]*?z[\w\s]*endifzmodule\s*proceduremoduleprocedure)r	   implicitr  r  r  )r	   dimension|virtualr	  r  	dimension)r	   externalr  r  r  )r	   optionalr  r  r  )r	   requiredr  r  r  )r	   publicr  r  r  )r	   privater  r  r  )r	   	intrinsicr  r  r  )r	   intent|depend|note|checkr  z\s*\(.*?\).*intent)r	   	parameterr  z\s*\(.*r  )r	   datar  r  r  )r	   callr  r  r  )r	   entryr  r  r  )r	   callfunr  r  r  )r	   commonr  r  r  )r	   user  r  r  )r	   containsr  r	   r  )r	   formatr  r  r  )r	   Kthreadsafe|fortranname|callstatement|callprotoargument|usercode|pymethoddefr  r  f2pyenhancementsz2\s*(?P<before>''')(?P<this>.*?)(?P<after>''')\s*\Z	multilinec           
         t          d          t          |          z  r
J d            t          j        d                    d                    t          j        |                    d                    t          j        |                    dd                    }|                    |           }|r$|                                }|d	         |d
         fS | dfS )z
    Splits the line into (line[:i], line[i:]),
    where i is the index of first occurrence of one of the characters
    not within quotes, or len(line) if no such index exists
    z"'zcannot split by unquoted quoteszR\A(?P<before>({single_quoted}|{double_quoted}|{not_quoted})*)(?P<after>{char}.*)\Zz[^"'{}]z[{}]z('([^'\\]|(\\.))*')z("([^"\\]|(\\.))*"))
not_quotedr:   single_quoteddouble_quotedbeforeafterr	   )setr   r   r  escaper   	groupdict)r/   
charactersr   r   ds        r(   r   r     s     E

S__,PP/PPPP

	!!'!((:)>)>??ry445500	 "( "2 "2	3 	3A 	
A )KKMM(QwZ((":r'   c                     g }t          |                               d          D ]2}dD ]}|                    |d          }|                    |           3d                    |          S )N@,@z(),r   ,)markoutercommasplitr   appendr   )argslinear   r   s       r(   _simplifyargsr2    sq    
AH%%++E22   	" 	"A		!S!!AA	88A;;r'   z"\s*(?P<result>\b[a-z]+\w*\b)\s*=.*c                 n   t          | d          \  }}|rt          d                             |           st          d                             |           sq|dk    sJ t	          |                      t          | d          \  } }|r-t          | |           t          |dd         d          \  } }|-t          | |           dS |dk     rwdat          diat          i iat          g ia	g t          t                   d<   i t          t                   d<   dt          t                   d<   dt          t                   d	<   d
a
d
adS |dk    rd}t          rt          t          k    rd}t          |k    rt          dt	          t                    dt	          t                    d           t          d           t          t          dz
                               t          t                              t          t                   t          t          dz
           d
         d<   t          t          = t          dz
  at          |k    t          rt          t          k    rt          t          dz
                               t          t                              t          t                   t          t          dz
           d
         d<   t          t          = t          dz
  at          t          dz
                               t          t                              t          t                   t          t          dz
           d
         d<   t          t          = t          dz
  ad
a
dS | dk    rdS d}t          t           t"          t$          t&          t(          t*          t,          t.          t0          t2          t4          t6          t8          t:          t<          t>          t@          tB          tD          tF          tH          tJ          t          t          tL          fD ]&}|d                             |           }|r n|dz   }'|stN          }	dt          cxk    rt          k    rn ndS dt          t                   v rat          t                   d         D ]G}
|
tP          v rtP          |
         }
dt          t                   v r|
t          t                   d         v rHtS          j        d|
z  tU          |           tR          j+                  }|r|	                    |,                    d                    }t[          |,                    d                    }|r d|
d|d|,                    d          d} n	d|
d|d} t\          d                             |           }|s"t          dt	          |           z              dS t_          |d|             dS It`          dk    s7t`          dk    rEtb          2                                3                    d          rda4t          dt          z             dS |d         dk    rdt          cxk    rt          k     rn nt          dz
  at          t          k    rdS t          dk    rtk          dt          z            t8          d                             |           }|r|,                    d           t          t                   k    sZtk          d!t	          |,                    d                     d"t	          t          t                             d#tl                    t          t          k    rd
at          t          dz
                               t          t                              t          t                   t          t          dz
           d
         d<   t          t          = t          dz
  atn          sda8dS dS |d         d$k    rCdt          cxk    rt          k    rn nt          dz   adS da9t_          ||d         |            da8dS |d         d%k    rdS |d         d&k    rt_          ||d         |            dS |d         d'k    r.tt          rdS dt          cxk    rt          k    rn ndS t          adS dt          cxk    rt          k    rn ndS t_          ||d         |            dS )(z
    reset=-1  --- initialize
    reset=0   --- crack the line
    reset=1   --- final check if mismatch of blocks occurred

    Cracked data is saved in grouplist[0].
    ;r   r   Nr	   bodyvarsblockrp   r
      zcrackline: groupcounter=z groupname=r   zYcrackline: Mismatch of blocks encountered. Trying to fix it by assuming "end" statement.
	externals
interfacedz5(?P<before>[^"]*)\b%s\b\s*@\(@(?P<args>[^@]*)@\)@.*\Zr#  argszcallfun (z
) result (r   )z8crackline: could not resolve function call for line=%s.
r  r   z"crackline:%d: No pattern for line
r  z>crackline: groupcounter(=%s) is nonpositive. Check the blocks.thiszcrackline: End group z* does not match with previous Begin group z
	r  r  r  r  );r   f2pyenhancementspatternr   multilinepatternr   	crackliner   	groupname
groupcacher   r   r   r   r1   r/  dimensionpatternexternalpatternintentpatternoptionalpatternrequiredpatternparameterpatterndatapatternpublicpatternprivatepatternintrinsicpatternendifpattern
endpatternformatpatternr   functionpatternsubroutinepatternimplicitpatterntypespatterncommonpatterncallpattern
usepatterncontainspatternentrypatternmoduleprocedurepatterncrackline_re_1r|   r   markouterparenr   r   r2  callfunpatternanalyzeliner   r    r   endswithr%   r   r   r   r   r   r   )r/   resetr   has_semicolonsemicolon_lineflr0   patr   re_1rp   m1m2r1  s                 r(   rA  rA    sQ    )s33A} 
5a8>>tDD 
/288>>
 zzz4;;zzz0s;;n 	NdE"""#4^ABB5G#M#M D.  	N 	$qyy!2&	"B'
!2&	+-
< (+-
< (,.
< )+-
< (qyy 	\\99BRG,''''i: ; ; ;ln n nlQ&'..z,/GHHH6?6MIlQ&'+F3,''!+L R  		\\99lQ&'..z,/GHHH6?6MIlQ&'+F3,''!+LlQ&'..z,/GHHH6?6MIlQ&'+F3,''!+LLrzzD /=/ +}n jo/@}Z' &   FLL 	Eax K%////</////F*\222"<0=  ;&&&t,D:l#;;;
S_H`amHn@n@nXLtSUcdhUiUikmkoq q BHHX$6$677B%bhhv&6&677A < < DD!!!RXXh%7%7%7%7 9< 4844;&q)//55A WZ^_cZdZddf f f9d333FF Q;;7a<<O,A,A,C,C,L,LV,T,T<#9\JKKK	Q5....,.....'!+L,..1 0+- . . . !_""D** 	&))Y|-DDD)!"((6"2"23333T)L:Q5R5R5R5R--/   
 l** O,"#**:l+CDDD2;L2I	,"#B'/l##a' 	KKK	 		Q7		////</////'!+LFAs1vt$$$	Q7			Q$	$	$As1vt$$$$$	Q:		 	F////</////F&////</////FAs1vt$$$$$r'   c                     d}d}| D ]6}|dk    r|dz   }|dk    r|dz   }n|dk    r|dz
  }|dk    r|dz   }1||z   }7|S )Nr	   r   r<  r   @(@r=  @)@r&   )r/   r   r   r   s       r(   r\  r\  _  s    
A	A  88AAAvvI  #XXAAAvvIEHr'   r,  c                 b   d}d}t          | |dz             \  }}||z  }|rq|d         |k    r|dk    r|d|z   dz   z  }n.||d         z  }|d         dk    r|dz  }n|d         dk    r|dz  }t          |dd          |dz             \  }}||z  }|q|rJ t          || |f                      |S )Nr	   r   z()@r<  r   r=  )r   r   )r/   commar   r   r#  r$  s         r(   r-  r-  q  s    
A	A%dEDL99MFEKA
 
!HAFFus""AAqMAQx3QqSQ)%)UT\BB	V  
 $$$4|$$$$$Hr'   c                 Z    |                      dd                               dd          }|S )Nri  r<  rj  r=  )r   )r/   r   s     r(   unmarkouterparenro    s*    UC  ((44AHr'   c                    | si } |s| S | |u r| S t          |                                          D ]}|dk    r|s|| vr||         | |<   |dk    r||         D ]}t          | ||          } =|dk    rt          | ||         |          } [|dk    rt	          | ||         |          } y|dv r|s|| vr||         | |<   |dk    r|dv rt          d|z             t          d	t          |          z             | S )
Nr3   attrspeckindselectorcharselector)=typenamenote)r  checkr
  r  r  dependz"appenddecl: "%s" not implemented.
z-appenddecl: Unknown variable definition key: )listkeyssetattrspecsetkindselectorsetcharselectorrn   r   r   )decldecl2forcekr   s        r(   
appenddeclr    so     u}}%**,, $ $
?? #(Q*__1X 3 3"4E223.  "4q599DD.  "4q599DD### #(Q&[[ ) ) )9A=>>>>KFF# $ $ $Kr'   zD\s*(?P<this>(@\(@.*?@\)@|\*[\d*]+|\*\s*@\(@.*?@\)@|))(?P<after>.*)\Zz[(?:,(?P<attributes>[\w(),]+))?(::)?(?P<name>\b[a-z$_][\w$]*\b)(?:\((?P<params>[\w,]*)\))?\Zz\s*(?P<name>\b[\w$]+\b)\s*(@\(@\s*(?P<args>[\w\s,]*)\s*@\)@|)\s*((result(\s*@\(@\s*(?P<result>\b[\w$]+\b)\s*@\)@|))|(bind\s*@\(@\s*(?P<bind>.*)\s*@\)@))*\s*\ZzF\s*(?P<scheme>(operator|assignment))@\(@\s*(?P<name>[^)]+)\s*@\)@\s*\Zz9\s*(?P<name>\b[\w$]+\b)\s*@\(@\s*(?P<args>.*)\s*@\)@\s*\Zz4([-+]?(?:\d+(?:\.\d*)?|\d*\.\d+))[dD]((?:[-+]?\d+)?)zA([-+]?((?:\d+(?:\.\d*)?|\d*\.\d+))[eE]((?:[-+]?\d+)?)|(\d+\.\d*))zintent\s*\(.*?\bcallback\bc                 r    |                      dg           D ]}t                              |          r dS  dS )Nrq  r   r   )get_intentcallbackpatternr   )vdeclr1  s     r(   _is_intent_callbackr    sF    YYz2&&  !''** 	11	1r'   c                 x   d                     |                                           } t                              |           }t	          | |           |rc|                    d          }|rd |                    d          D             ng }|                    d          ||                    d          fS d g d fS )Nr	   
attributesc                 6    g | ]}|                                 S r&   )r   )ru   r1  s     r(   rw   z*_resolvetypedefpattern.<locals>.<listcomp>  s     555q555r'   r,  rp   params)r   r.  typedefpatternr   printr   )r/   rf  attrss      r(   _resolvetypedefpatternr    s    774::<<  D			d	#	#B	$OOO	 ;&&9>F55EKK$4$45555Bxx(:(:::T>r'   c                 >   t          |           } t                              |           }|rR|                    d          |                    d          |                    d          |                    d          fS t                              |           }|r7|                    d          dz   |                    d          z   dz   }|g d d fS t
                              |           }|r,|                    d          |                    d          d d fS d g d d fS )Nrp   r;  r   bindschemer<  r=  )r\  nameargspatternr   r   operatorpatterncallnameargspattern)r/   rf  rp   s      r(   _resolvenameargspatternr    s   $D			t	$	$B	 Xxx&!1!1288H3E3ErxxPVGWGWWW			t	$	$B	 $xx!!C'"((6*:*::S@Rt##		"	"4	(	(B	 >xx&!1!14==T4r'   c                 dB   |                      d          }|dk    rd at          r
|dvrt          st          dk     rt
          j                            t                    	                    d          d         }t          d|z             dat          dz   adt          t          <   i t          t          <   g t          t          <   g t          t                   d	<   i t          t                   d
<   dt          t                   d<   |t          t                   d<   dt          t                   d<   da|dv 
r|                                }t!          j        d|t           j                  rd}nEt!          j        d|t           j                  rd}n"t!          j        d|t           j                  rd}|dk    rTt'          |                      d                    \  }}}t)          |          t          t                   d
         |<   g }d }	n't+          |                      d                    \  }}}	}||dk    rd}nd}|dvrt          d           ||t          fa|r:t-          d t/          |          	                    d          D                       }ng }d|v r,d|v r|                    d           d|v t          d           d}
d}|d v rd}d!t          t                   vrd S |t          t                   d!         vrd S t          t                   D ]}|d         |k    r d S |t          t                   d"         v rd S d#d$d |         }t2          r(t4          d%k    rt          dk    rt          d&z   ad}
|d'vrd}t          dz   ai t          t          <   g t          t          <   |
rt6          dk    r%t          d(t9          t2                    z  d           d)t          t          <   dt          t                   d<   t2          t          t                   d<   dt          t                   d<   g t          t                   d	<   g t          t                   d*<   g t          t                   d"<   i t          t                   d
<   t          dz   ai t          t          <   g t          t          <   |r$t6          dk    rt          d+t          z  d           d,t          t          <   d,t          t                   d<   d-t          t                   d<   t          t          dz
           d         d.t          t          dz
           d         t          t                   d<   g t          t                   d	<   g t          t                   d*<   g t          t                   d"<   i t          t                   d
<   t          dz   ai t          t          <   g t          t          <   |t          t          <   |t          t                   d<   |sd/|                    d0d1          z   }|                      d2          t          t                   d3<   t=          |          t          t                   d<   |	t          t                   d4<   t          dk    rt          t          t                   d<   nt2          rDt          d5k    r9t          t          dz
           d         d.t          t          t                   d<   nLt          t          dz
           d         d.t          t          dz
           d         t          t                   d<   t?          t          t                                                              D ]-}t          t                   |         st          t                   |= .|t          t                   d!<   g t          t                   d	<   g t          t                   d*<   g t          t                   d"<   i t          t                   d
<   i t          t                   d6<   |dk    rg t          t                   d7<   |d v r|t          t          d&z
           d*         vr.t          t          d&z
           d*         !                    |           tE          j#        t          t          d&z
           d
                   t          t                   d
<   	 t          t                   d
         |         t          t                   d
         |         d8         $                    d9          = n# tJ          $ r Y nw xY w|d:v r?	 tM          t          t                   d
         |         t          t          d&z
           d
         d                   t          t                   d
         |<   n# tJ          $ r Y nw xY w|d;k    r|	r|	t          t                   d
         v rg||	k    satM          t          t                   d
         |         t          t                   d
         |	                   t          t                   d
         |<   	 t          t          d&z
           d"         !                    |           n# tJ          $ r Y nw xY w|d$k    rtN          d                             |                      d2          d0z   |z             }|rMtQ          |                     d          |                     d                    \  }}}}tS          ||||           |d v rt          t          dz
           !                    t          t                              t          t                   t          t          dz
           d%         d	<   t          t          = t          dz
  at          t          dz
           !                    t          t                              t          t                   t          t          dz
           d%         d	<   t          t          = t          dz
  ad S d S |d6k    rt+          |                      d                    \  }}}	}|~|r:t-          d< t/          |          	                    d          D                       }ng }|	J t9          |	                      |t          t                   d6         |<   d6|t          fad S d S |dk    rJtQ          ||                      d                    \  }}}}tS          ||||          }|d=|t          fad S d S |d>v rt          t                   d
         }|                      d          *                                }|+                    d?          }|dk     r|d@k    rtY          |          +                    dA          d&z
  }|d |dz            d?z   ||dz   d          z   }|+                    d?          }||d          d?k    rrd!t          t                   v r^t          dB|                      d          |d |         dC           |dD-                    t          t                   d!                   z   }|dk     rd}d}n)|d |         *                                }||d&z   d          }t/          |          	                    d          }t]          |          dk    r5|d         }t          dEdD-                    |dd                    z             d }dF t/          |          	                    d          D             D ]}t^                              |          }|sL|dGv rd}ngta          | 1                                           t          dH|dIt9          |          dJ           kt=          |                     d                    }|dGv r$|dKk    s|dLk    r||                     d          z  }||vri ||<   |dMk    r||                     d          z   }|d@k    r|                      d          |z   }td                              |          r|t          t                   d!         vrt          dk    rdNt          t          d&z
           d         vrt          dO           |t          t                   d         k    rWt          dP|dQt          t                   d         dR           t          t                   d!         !                    |           n%tg          dS|z             ntg          dT|z             |dUv r|}d8||         v r"||         d8         !                    |           n|g||         d8<   |d9k    rt          t                   d         dk    rt          dV           p|t          t                   d!         vrd*t          t                   vrg t          t                   d*<   t          t                   d*         !                    |           |}|t          t                   d
<   |d=|t          fad S d S |dWk    rGdX |                      d          	                    dD          D             t          t                   dY<   d S |dZk    r<t          t                   d
         }|                      d          *                                dd%         }d }t/          |          	                    d          D ]}	 d[ |	                    d\          D             \  }}n&# tJ          $ r t          d]|d^|d_           Y Iw xY wti          |          }t=          |          }||vri ||<   d\||         v r7||         d\         |k    s%t          d`|da||         d\         db|dc           tk          ||          }|rB|6                    dd          dek    rt?          |          }tn          8                    |          D ]} t?          || 9                                | :                                                                                             dfdg                    || 9                                | :                                <   d-                    |          }n]|6                    dd          dhk    rD|dd                                                              dfdg                              dDdi          }	 tw          |i |          }n;# tx          tz          t|          f$ r!} tg          dj|dk| dC           Y d } ~ Pd } ~ ww xY wt9          |          ||         d\<   d8||         v r"||         d8         !                    dZ           ndZg||         d8<   |}|t          t                   d
<   |d=|t          fad S d S |dlk    r |                      d          *                                                                dmk    rd t          t                   dl<   d S |                      d          rdlt          t                   v rt          t                   dl         }!ni }!|!t          dn           i }!t/          |                      d                    	                    d          D ]$}i }"t!          j        do|t           j                  }|st          dp|z             :t~                              |                     d                    }#|#st          dq|z             |tQ          |#                     d          |#                     d                    \  }}}}t          ||          \  }$}%}&||"dd<   |$|"dr<   |%|"ds<   |&|"dt<   t?          |"                                           D ]}|"|         s|"|= t/          |                     d                    	                    d          D ]}'du|'v rF	 dv |'	                    du          D             \  }(})n8# tJ          $ r t          dw|'z             Y Hw xY w|'*                                x}(})t]          |(          t]          |)          cxk    rdk    sn t          dx|'z             t          t          |(          t          |)          dz             D ]}*|"|!t          |*          <   &|!t          t                   dl<   d S d S |dyk    rKg }d}+d},d}-d}.d}/|                      d          D ]}0|/s|0dzk    r|. }.|0d{k    r|.r|-dz   }-|0d|k    r|/dz   }/n|0d}k    r|/dz
  }/|-dk    r|+|0z   }+>|-dk    r|,|0z   },J|-d&k    rb|+*                                }+|+D                    dD          r|+dd          *                                }+|!                    |+|,g           |0}+d},d}-|-d&k    r\|+*                                }+|+D                    dD          r|+dd          *                                }+|!                    |+|,g           i }1d
t          t                   v rt          t                   d
         }1d }|D ]}2d~ |2D             }2|2d         d         dDk    r|2d         dd          |2d<   |2d         d         d|k    rt          d|2d         z             _d}d}3t]          |2d                   }4t-          d t/          |2d                   	                    d          D                       D ]}|d         d|k    rt          d|z             "d}.||4k     rH|.s|2d         |         dDk    s4|2d         |         dzk    r|. }.|dz   }||4k     r|."|2d         |         dDk    4|dz   }||1vri |1|<   d\|1|         v rY|1|         d\         |2d         |3|dz
           k    s6t          d|da|1|         d\         d|2d         |3|dz
           d_           |2d         |3|dz
           |1|         d\<   |}3|}|1t          t                   d
<   |d=|t          fad S d S |dk    r|                      d          *                                }|d         d{k    sd|z   }g }5d}-d}6d}7|D ]\}0|0d{k    r|-dz   }-|-d5k    r8|6*                                }6|6sd}6|5!                    |6|7g           |-d&z
  }-d}6d}7|-d&z  r|6|0z   }6W|7|0z   }7]|6*                                }6|6sd}6|5!                    |6|7g           i }8dt          t                   v rt          t                   d         }8|5D ]o}0|0d         |8vrg |8|0d         <   d t/          |0d                   	                    d          D             D ]%}|r!|8|0d                  !                    |           &p|8t          t                   d<   d|6t          fad S |dk    r t!          j        d|                      d          t           j                  }|r|1                                }9dt          t                   vri t          t                   d<   |                     d          }i t          t                   d         |<   d}:d|9v r"|9d         d|9v r
|9d         d}:|:t          t                   d         |         d<   d |9d         	                    dD          D             }i };|D ]}2d\|2v rt!          j        d|2t           j                  }#|#rP|#                     d          *                                |;|#                     d          *                                <   n%t          dt9          |2          z             n|2|;|2<   |;t          t                   d         |         d<   d S d S ta          | 1                                           t          d           d S |dv rdt          t                   vri t          t                   d<   t          t                   d         }<|                      d          dk    r[d|<v rWt          |<d         t                    r|<d         g|<d<   |<d         !                    |                      d                     d S |                      d          |<|                      d          <   d S |dk    rdt          t6          rt          d           d S t          }=t          t          |=         t          d d&         |                      d                     d S t6          dk    r2ta          | 1                                           t          d           d S d S )Nr>  r  )r  r  r  rg   r   r   r   zBanalyzeline: no group yet. Creating program group with name "%s".
programr5  r6  r7  rp   fromskyfrom)r  r  r  zblock\s*data
block datazpython\s*modulepython modulezabstract\s*interfaceabstract interfacerg   r$  )rq  _BLOCK_DATA_r	   )	interfacer  r  z2analyzeline: No name/args pattern found for line.
c                 6    g | ]}|                                 S r&   r   ru   xs     r(   rw   zanalyzeline.<locals>.<listcomp>  s6     J J J"#  ggii J J Jr'   r+  z<analyzeline: argument list is malformed (missing argument).
)r  r  r;  r:  r  r  r
   r8  r  r  z&analyzeline: Creating module block %s
moduler9  zDanalyzeline: Creating additional interface block (groupcounter=%s).
r  unknown_interface:unknown_r   r   r#  prefixr      r  varnamesrq  r  r  r  r  c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zanalyzeline.<locals>.<listcomp>  s6     "N "N "N&' #$'')) "N "N "Nr'   variable)r
  r  r  r  r  r  r  r  ::r  rj  z"All arguments will have attribute r   r,  zXanalyzeline: cannot handle multiple attributes without type specification. Ignoring %r.
c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zanalyzeline.<locals>.<listcomp>  s     EEE!''))EEEr'   r  r  z&analyzeline: no name pattern found in z statement for z. Skipping.
operator
assignmentr
  __user__z8analyzeline: missing __user__ module (could be nothing)
z(analyzeline: appending intent(callback)  to z arguments
z,analyzeline: intent(callback) %s is ignored
z=analyzeline: intent(callback) %s is already in argument list
)r  r  r  r  r  r  z(analyzeline: ignoring program arguments
r  c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zanalyzeline.<locals>.<listcomp>  s     <<<1QWWYY<<<r'   implementedbyr  c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zanalyzeline.<locals>.<listcomp>  s     ???Qqwwyy???r'   rt  zAanalyzeline: could not extract name,expr in parameter statement "" of ""
z1analyzeline: Overwriting the value of parameter "" ("z	") with "rl   r3   r4   r)  ecomplexz+1j*(z analyzeline: Failed to evaluate z. Ignoring: r  nonez<analyzeline: Overwriting earlier "implicit none" statement.
z9\s*(?P<this>.*?)\s*(\(\s*(?P<after>[a-z-, ]+)\s*\)\s*|)\ZzDanalyzeline: could not extract info of implicit statement part "%s"
zManalyzeline: could not extract types pattern of implicit statement part "%s"
rr  rs  ru  -c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zanalyzeline.<locals>.<listcomp>S  s     )J)J)J!'')))J)J)Jr'   zZanalyzeline: expected "<char>-<char>" instead of "%s" in range list of implicit statement
z^analyzeline: expected "<char>-<char>" instead of "%s" in range list of implicit statement (2)
r  'r   r<  r=  c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zanalyzeline.<locals>.<listcomp>  s     &&&q&&&r'   z>analyzeline: implied-DO list "%s" is not supported. Skipping.
c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zanalyzeline.<locals>.<listcomp>  s     UUUa		UUUr'   z*analyzeline: changing init expression of "") to "r  z//_BLNK_c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zanalyzeline.<locals>.<listcomp>  s     KKKAaggiiKKKr'   r  zR\A\s*(?P<name>\b\w+\b)\s*((,(\s*\bonly\b\s*:|(?P<notonly>))\s*(?P<list>.*))|)\s*\Zry  notonlyonlyc                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zanalyzeline.<locals>.<listcomp>  s     ???Aaggii???r'   z7\A\s*(?P<local>\b\w+\b)\s*=\s*>\s*(?P<use>\b\w+\b)\s*\Zlocalz0analyzeline: Not local=>use pattern found in %s
mapz0analyzeline: Could not crack the use statement.
)r  r  usercodez-analyzeline: No context for multiline block.
z+analyzeline: No code implemented for line.
)Hr   r%   r   r   r   r   r   basenamer    r.  r1   r   rB  rC  r   r   r   r   r   r  dictr  rz   r-  remover   r   r   r   r   rq   ry  rz  r/  copydeepcopyrZ   r   r  rT  cracktypespec0
updatevarsr   findr\  r   rW   namepatternr  r'  r  rn   get_parametersdetermineexprtyper  real16patternfinditerstartr  evalSyntaxError	NameError	TypeErrortypespattern4implicitcracktypespecr   ordchrr   
isinstancer   appendmultiline)>r   r>   r/   r7  newnamerp   r  r   r;  r   
needmoduleneedinterfaceitr  tr3   selectorattredeclr  	last_namer   r   plchr  rf  apinitexprr  ttvr   implr~  rg  
kindselect
charselectru  r   begcendcodlilr   fcinpr   r6  r   jllenclbnol	commonkeymmisonlyr   r)  gcs>                                                                 r(   r^  r^    s"   
 GGFOOE{ t#GGG H!-!1!1'""?3399#>>qAQT[[	] 	] 	]#a'"+	,#%
< "$	,+-
< (+-
< (,5
< )+2
< (+4
< (+++8OUBD11 	) EEX(%66 	)#EEX-ubd;; 	)(EF??3AGGG4D4DEEND%59U5K5K5KJ|$V,T2DFF$;AGGG<L<L$M$M!D$<$$%MMMMNNN!46 	 J J'5d';';'A'A%'H'HJ J J K KDD D::**B **OQ Q Q 
&&&MZ555:l3F;;;-  f:%%FF &z,/===)jAA$GE 	"\R//LA4E4E'!+LJ??? !#a'#%
< "$	, 	){{A]++,-.0 0 0&.Il#0?J|$W-/<J|$V,/1J|$V,/1J|$V,46J|$[157J|$\2/1J|$V,'!+L')J|$&(Il# 	){{_ "#$& & &&1Il#0;J|$W-/BJ|$V,<!+,V444jPQAQ6RSY6Z6Z0\J|$V,/1J|$V,46J|$[157J|$\2/1J|$V,'!+L')J|$&(Il#"'	,,1
< ) 	8c3 7 77D-.WWX->->
< *+5d+;+;
< (-3
< *1/>J|$V,, `!2!2|a/0888//4K
<(00 |a/0888*\TUEU:VW]:^:^4`
<(0j.335566 	0 	0Al+A. 0|,Q/+/
< (+-
< (02
< -13
< .+-
< (,.
< )F??35J|$Z0&&&:lQ&67DDD<!+,[9@@FFF/3}<!+,V406 06J|$V,|,V4T:|,V4T::FLLZXXZ Z   ...9C|,V4T:J|VWGW<XY_<`ac<d:f :f
<(066   y   nf
<(@(HHH6>>AK&|4V<TBJ|D\]cDdekDlBn Bn
<08><!+,\:AA$GGGG   JQ%%aggh&7&7#&=&DEEA <2@GGFOOQWWW%5%537 37/(D%8XtU;;;&&&lQ&'..z,/GHHH6?6MIlQ&'+F3,''!+LlQ&'..z,/GHHH6?6MIlQ&'+F3,''!+LLL '& 
#:1777;K;K#L#L dFD   "N "N+9$+?+?+E+Ee+L+L"N "N "N O O >>4<<>>>6:J|$W-d3 '|<  
*81777##+% +%'(D%x4??	  *I|D ! 	n	n	n<(0WWW##%%GGDMMq55TX%%r""''..2AFQUFd"RAZ/BA!""v~~&J|,D"D"D"RaR&&&2 3 3 3#((:l#;F#CDDDq55ABBBQBBAEFFBB%%e,,r77Q;;ABoABB  " # # #	EE^B%7%7%=%=e%D%DEEE 5	 5	A""1%%B 	1000AA!++--(((Gd1gggg' ( ( (rxx//00,,,Z1#4#4RXXg&&&~~a{""BHHW---xWWV__r))//33 =
< 8 @@@'!++)L1<L1Mf1UUU '$_!a !a !a  !J|$<V$DDD '@A:lC[\bCcCcCc)e !f !f !f *< 8 @ G G J J J# OST UW W W W   !69:!< = = =]]]U1X%%a$++B////(*ta$z!!l+G4	AAGHHHJ|4V<<<j&>>><>J|,[9<(5<<Q???II+0
< (  *I|D ! 	"	"	"<< 0 0 6 6s ; ;<<< 	< 111			<(0WWW##%%ad+	##))%00 $	 $	A??!''#,,???88   hihihikmkmkmnp p p $E**F1A~~aeAha(A(AAAuQx}}}hhh0 1 1 1!(F33A 	.55$$..hB*33H== S S04$QWWYYquuww%67==??GGSQQ1S 1S17799QUUWW,--!wwr{{HHUU:&&)33'|1133;;CEEW-- 2v..I6   #88SSS* + + + !GGE!HSMU1X%%a$++K8888(3}a$II+0
< (  *I|D ! 			777!!##))++v5537J|$Z000WWW 1	8Z555!,/
;|SU U U#AGGG$4$455;;EBB ', ',XPRSUWUY[ [ _cdeg g g*00&1A1ABB hlmnp p p2@HHV$$bhhw&7&739 39/(D%3@h4( 4(0
J#+Z '1^$'1^$#+Z diikk** $ $A7 $ G'(9(9::@@GG , ,Aaxx%)J)JQWWS\\)J)J)JJD$$( % % %# }  AB  !BC C C$H%
 '(ggii/tt99D		6666Q6666}  AB  BC C C "3t99c$ii!m<< , ,'+SVV,,  48J|$Z000c1	8 1	8d 
!! 	 	A 88B888AACxxAgcAgAvv!Va!VaXXZZ==%% (ABBB		2r(###66B}}S!! $V\\^^IIr2hZ---l+F3D	  	  	A&&A&&&AtAw#~~tABBx!tAw#~~UXYZ[X\\^ ^ ^AAqt99DUU>!A$3G3G3M3Me3T3TUUUVV  Q43;;Y\]]_ _ _
 4xxbx!Q3tAw#~~!#VAA 4xxbx!Q3 ED== DG$q'>>$q'#,!A$qQw-*G*GG473<<<1aAg8 9 9 9 tAa!eG}Q		+, ,0
< (  *I|D ! 			www%%''Aw#~~$;D 	 	ACxxEAvvXXZZ "!B		2r(###E1u !V!VXXZZ 	B
		2r(	z,///"<0:I 	. 	.At9$$"$	!A$KK!)=)=)C)CE)J)JKKK . . .adO**1---. .7
< *$b,7	Xacdcjcjkrcscsuwuy{ { 	IBJ|44424
<(/88F##D46J|$U+D1F||6
 6??r)}'<F@F
<(/5f=??F)9)9#)>)>??? F FAaxxXVXY[][_a a _<>HH %=' ='',uww rxx00668899 $ SVZ[\V]V] ]_ _ _ _ !"1CEJ|,U3D9%@@F F !++--   GHHHHH	%	%	%Z%===;=J|$%78|$%78776??j((Z1__!J--- 0!":*jM  !1!122222!"!1!1Aaggfoo			# JHIIIF
2(!,	) 	) 	) 	) 	) Q;;!++--   BCCCCC ;s   3Ad 
ddA$f 
ff.i 
iiK "AK#K# ALLALSASSATS0ATTAT^?"A_"_"A`` A`c                 p    d| vri | d<   | d         }||vrg ||<   ||                              |           d S )Nf2pymultilinesr/  )r   context_namemlr)  s       r(   r  r    sT    u$$"$A1,lO2
Fr'   c                    d }d }t          j        d| t           j                  rd} nIt          j        d| t           j                  rd} n&|                                                                 } t
                              t          |                    }|st          d           d S |                                }t          |
                                          D ]}t          ||                   ||<   | dv r|d         }|d         }|                    d	          }|d
k    r)|d |                                         }||dz   d          }| |||fS )Nzdouble\s*complexdouble complexzdouble\s*precisionzdouble precisionz>cracktypespec0: no kind/char_selector pattern found for line.
)r  r6   logicalr4   	characterrg   r>  r$  r  r   r8  )r   r   r   r   r   selectpatternr\  r1   r'  ry  rz  ro  r  )r3   r   r  r  rf  r)  r  r   s           r(   r  r    sS   HD	x#Xrt44 ,#	'24	8	8 ,%>>##))++			^B//	0	0B M	O 	O 	O
A!&&((^^ & &!%%!QQQV9wZ
AAvv"1"v||~~AZXtR''r'   z)\s*(?P<name>\b\w+\b)\s*(?P<after>.*)\s*\ZzB\s*(\(\s*(kind\s*=)?\s*(?P<kind>.*)\s*\)|\*\s*(?P<kind2>.*?))\s*\Zz2\s*(\((?P<lenkind>.*)\)|\*\s*(?P<charlen>.*))\s*\Zz\s*(kind\s*=\s*(?P<kind>.*?)\s*(@,@\s*len\s*=\s*(?P<len>.*)|)|(len\s*=\s*|)(?P<len2>.*?)\s*(@,@\s*(kind\s*=\s*|)(?P<kind2>.*)|(f2py_len\s*=\s*(?P<f2py_len>.*))|))\s*\Zz\s*(@\(@\s*(?!/)\s*(?P<array>.*?)\s*@\)@\s*\*\s*(?P<len>.*?)|(\*\s*(?P<len2>.*?)|)\s*(@\(@\s*(?!/)\s*(?P<array2>.*?)\s*@\)@|))\s*(=\s*(?P<init>.*?)|(@\(@|)/\s*(?P<init2>.*?)\s*/(@\)@|)|)\s*\Zc                 (   |                                  } t          |           dk    r| S | d         }t          dt          |           dz
            D ]4}| |         dk    r| |dz            dv s| |dz
           dv r)|| |         z   }5|| d         z   }|S )Nr   r   r   z()[]{}=+-/* r
   )r   rW   r   )exprexpr2r   s      r(   removespacesr  ?  s    ::<<D
4yyA~~GE1c$ii!m$$    GsNN1q5k^++a!e..QDHELr'   c                     d}d}d}d}| D ];}|dk    r|dv r||z  }|}|s|dv r|}||k    r| }n|dk    r|r|dz  }4||z  }|}<|S )	a(  
    The function replace all spaces in the input variable line which are 
    surrounded with quotation marks, with the triplet "@_@".

    For instance, for the input "a 'b c'" the function returns "a 'b@_@c'"

    Parameters
    ----------
    line : str

    Returns
    -------
    str

    r	   FNr   )r   r  ")r  r  r   @_@r&   )r/   fragmentinsidecurrent_quoteescapedr   s         r(   markinnerspacesr  N  s      HFMG  d??q$555MHG 	!{**MZFF#XX&XHAOr'   c                    d }t          | |          \  }}}|rd t          |                              d          D             }g }t          j        d          }	|D ]r}
|
s|	                    |
          }|rA|                    d                                          }||
t          |          d          z   }
|	                    |
           s|}d t          |                              d          D             }g }|D ]x}d t          t          t          |                    d                              d	          D             D ]-}|r)|	                    |                    d
d                     .y|D ]}t                              |          }|s t          dt          |          z             ?t!          |                    d                    }i }|t"          t$                   d         v r^t"          t$                   d         |                                         }d|v}|r| |d<   n-| r+| |d         k    st          d|d|d         d| d           d|vrt'          j        |          |d<   n|rt)          |                                          D ]v}||d         v rG||         |d         |         k    s/t          d|d|d|d         |         d||         d	           St'          j        ||                   |d         |<   wd|vr!|r|r||d<   nt-          d|d|d           n|rt)          |                                          D ]v}||d         v rG||         |d         |         k    s/t          d|d|d|d         |         d||         d	           St'          j        ||                   |d         |<   wd|vr||d<   n-|r+|d         |k    st          d|d|d         d|d           d|vrt'          j        |          |d<   n|r*|D ]'}
|
|d         vr|d         	                    |
           (nat'          j        |           |d<   t'          j        |          |d<   t'          j        |          |d<   ||d<   t'          j        |          |d<   d|                    d          pg v rn|t"          t$                   d         v rTd t"          t$                   vrg t"          t$                   d <   t"          t$                   d          	                    |           |                    d!          rt0                              t3          |                    d!                              }|r|                                }d"D ]!}||d#z            ||d#z            ||<   ||d#z   = "t)          |                                          D ]&}||         t7          ||                   ||<   #||= 'd$|v rh| d%v r&d|vs|d         si |d<   |d$         |d         d&<   |d$= n>| d'k    r8d|vs|d         si |d<   d$|d         v r	|d         d$= |d$         |d         d&<   |d$= d(|v rGd)|v r8|d)         |d(         k    s&t          d*|d|d)         d|d(         d           n|d(         |d)<   d$|v r^d+|v rZ|d$         d,k    r|d+         |d$<   |d+= n?|d+         d-z   |d$         z   |d+<   |d$= t-          d.| d|d/| d|d0|d+         d1           d+|v r|d2|d+         z  }d|vs|d         s|g|d<   n|d         	                    |           |d         D ]:}|d d3         d4k    r*||k    r$|d         d5= t-          d|d6|d7|d            n;n(t          d8||                    d!          z   z             t)          |                                          D ]}||         s||= |t"          t$                   d         |<   d9t"          t$                   v r+t"          t$                   d9         	                    |           |}|S ):Nc                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zupdatevars.<locals>.<listcomp>y  s     MMM!AGGIIMMMr'   r+  z(?P<start>[a-zA-Z]+)r  c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zupdatevars.<locals>.<listcomp>  s     	E	E	E!''))	E	E	Er'   c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zupdatevars.<locals>.<listcomp>  s     ooo17799ooor'   r   rm  z@ @r  z;updatevars: no name pattern found for entity=%s. Skipping.
rp   r6  r3   z+updatevars: attempt to change the type of "r  r  z". Ignoring.
rr  z0updatevars: attempt to change the kindselector "r  rs  zupdatevars:z*: attempt to change empty charselector to r   z0updatevars: attempt to change the charselector "ru  z/updatevars: attempt to change the typename of "rq  r  r;  r9  r$  )rW   arrayinit2rW   r  r6   r  r4   r   r  r#  rt  z6updatevars: attempt to change the init expression of "r"  r	   r,  zupdatevars: "z" is mapped to "r<  z)"
dimension(%s)	   r
  r
   z: attempt to change r  z?updatevars: could not crack entity declaration "%s". Ignoring.
r  )r  r-  r.  r   r   r   r   r   rW   r/  r  r  r   r  r1   r   rq   rC  r   r  ry  rz  rn   r  lenarraypatternr\  r'  ro  )r3   r  rq  
entitydeclr  r  r  ru  r   r   r1  r   selel1r  e1enamer  not_has_typespecr  rf  d1lkdmdm1s                             r(   r  r  s  s,
    I'4Xx'H'H$J
H MM~h'?'?'E'Ee'L'LMMMJ.// 	 	A 

A #GGG$$**,,#a&&''
NHHQKKKK	E	E^J77==eDD	E	E	EB
C 3 3oon\/RSBTBT5U5U]`&a&a&a&g&ghm&n&nooo 	3 	3B 3

2::eS11222	3  ~ ~a   	NRVWXRYRYZ\ \ \1776??++J|,V444|,V4U;@@BBE)6 9$,j!! 98uZ/@#@#@EE5,,,hhh8 9 9 9U**(,	*(=(=n%% Ljoo//00 L LAE.111:a=ER`LabcLd;d;dAAuuueN&;A&>&>&>
1!O P P P P 489Z]3K3Kn-a00U**z*# 3,6E.))G$uujjj2 3 3 3 3 Ljoo//00 L LAE.111:a=ER`LabcLd;d;dAAuuueN&;A&>&>&>
1!O P P P P 489Z]3K3Kn-a00&&$,j!! 95#4#@#@EE5,,,hhh8 9 9 9&&$(Ih$7$7j!! 4! 4 4Aj 111j)00333 $	( 3 3E*$(Ij$9$9E.!$(Ij$9$9E.! (E* $	( 3 3E*%))J//52661
<@XY_@`;`;`*\":::8:
<(5|$[188;;;777 <	/ &&~aggg6F6F'G'GHHB :/\\^^2 ) )B"s(|/!#BH2rCxLbggii " "A!u( 0A 7 71qEEB;;#LLL*%77~AV746E.157Yn-c2uII![00*%77~AV746E.1 E.$999 %n 5e <57Yn-c2uIR<<e||U3Z2f:-E-E!EE5:::r&zzz!; < < < < &(Zc
B;;7b==%yB$&wK5	wKK&(kC&7"U)&C7uI$HHaaa555"W+++!G H H H b==(2g;6B!..uZ7H.-/Dj))j)00444#(#4 & &C"2A2w+55#))$)*$5b$9 '+055###rrr); !< !< !< % ZAGGG,,,. / / /ejjll## 	 	A8 !H27
< (/L111|$Z077>>>		r'   c                 r   d }d }d }|r| dv rt                               |          }|s!t          dt          |          z             d S |                                }|d         |d<   |d= t          |                                          D ]}||         s||= t          |                                          D ]\  }}t          |          ||<   n| dk    rVt                              |          }|s!t          dt          |          z             d S |                                }|d         |d<   |d= |d         rt                              t          |d                             }|                                }d	D ],}||d
z            r||d
z            ||<   ||         ||<   ||d
z   = -|d         |d         |d<   |d= t          |                                          D ]}||         s||= t          |                                          D ]\  }}t          |          ||<   n| dk    r[t          j        d|t          j                  }|r|                    d          }nBt          dt          | |z             z             nt          dt          |          z             |||fS )Nr%  z4cracktypespec: no kindselector pattern found for %s
kind2r   r  z4cracktypespec: no charselector pattern found for %s
charlenlenkind)rW   kindr$  f2py_lenrg   z\s*\(\s*(?P<name>\w+)\s*\)rp   z'cracktypespec: no typename found in %s
z'cracktypespec: no selector used for %s
)rr  r   r1   r   r'  ry  rz  itemsrq   rs  lenkindpatternr-  r   r   r   )	r3   r  r  r  ru  r  r   r7  r1  s	            r(   r  r    s;   JJH 3&@@@%++H55J KtT\~~^` ` `#--//J(1JsO7#*//++,, & &!!} &"1Z--//00 . .1 *1
1.$$%++H55J KtT\~~^` ` `#--//J(3JsO9%)$ A(..":i#899; ;!++--) * *BrCx( 8&-b3h&7%,R[JrNS)):&2-4Z-@Jz*9%*//++,, & &!!} &"1Z--//00 . .1 *1
1.x =xNNH 5#>>&11Bh1224 5 5 5 5 >(^^% & & &z8++r'   c                    | si } |s| S d| vr|g| d<   | S |r| d                              |           || d         v r| S |dk    r&d| d         vr| d                              |           n|dk    r&d| d         vr| d                              |           ns|dk    r&d| d         vr| d                              |           nG|dk    r&d| d         vr| d                              |           n| d                              |           | S )Nrq  rI   	automaticr  r  r	  )r~  r  r  s      r(   r{  r{  I  sb      6Z &Z%%%tJxKtJ/???Z%%%%			j1A!A!AZ%%%%			D,,,##D)))			4
+++##D)))Z%%%Kr'   c                     | si } |s| S d| vr|| d<   | S t          |                                          D ]}|s
|| d         vr||         | d         |<    | S )Nrr  ry  rz  r~  selr  r  s       r(   r|  r|  d  s      T!!"^#((** - - 	-AT.111&)!fD #Kr'   c                     | si } |s| S d| vr|| d<   | S t          |                                          D ]}|s
|| d         vr||         | d         |<    | S )Nrs  r?  r@  s       r(   r}  r}  r  s      T!!"^#((** - - 	-AT.111&)!fD #Kr'   unknownc                     d| v r| d         S |S )Nrp   r&   )r7  rC  s     r(   getblocknamerE    s    V}Nr'   c                 R    d| d         d| d         da d S # t          $ r Y d S w xY w)NzIn: r  r  rp   r   )r   r   )r7  s    r(   setmesstextrG    sJ    ,1&MMM5===I   s    
&&c                 z    i }d| v rt          | d                   }d| v r|                    | d                    |S )Nparent_blockr  )get_usedictupdate)r7  usedicts     r(   rJ  rJ    sH    GeN344~~uU|$$$Nr'   c           
      6   |i }t          |           }|s|S t          |                                          D ]\  }}|                                }|t          vr*t          d|d|                     d          d           Lt          |         }t          |          }|sk|rt          d|z             t          |                                          D ]>\  }}||v r0t          dt          |          dt          |          d           |||<   ?|S )Nzget_useparameters: no module z info used by rp   r   z,get_useparameters: mapping for %s not impl.
z(get_useparameters: overriding parameter z with value from module )
rJ  ry  r:  r   r   r1   r  r  rn   r   )	r7  	param_maprL  usenamemappingmvarsr  r  r  s	            r(   get_useparametersrR    sV    	%  G  11  --//-''GWWeii////1 2 2 2g&&& 	 	QCwOPPP(( 	 	DAqI~~59!WWWWd7mmmmM N N NIaLL		 r'   c                    t           s| S t          | t                    rfd| D             }|S t          |            t	          d| d         dd           t          |           _d| v r[| d         }t          |                                          D ]1}||         }d|v r#|d         }d|v r|d         }|v r|         |d<   2fd	| d
         D             }	|	| d
<   | S )Nc                 :    g | ]}t          |d z             S r   )tabrN  
postcrack2)ru   grN  rV  s     r(   rw   zpostcrack2.<locals>.<listcomp>  s<        !tyAAA   r'   Block: rp   r   r   r6  rr  r8  c                 :    g | ]}t          |d z             S rU  rW  )ru   brN  rV  s     r(   rw   zpostcrack2.<locals>.<listcomp>  s<     ( ( ( 1#*	BBB ( ( (r'   r5  )r   r  ry  rG  r1   rR  rz  )
r7  rV  rN  retr6  r   varr8  valnew_bodys
    ``       r(   rX  rX    sW     %       
sssE&MMM2A666%e,,	5V}diikk"" 	6 	6Aq'C$$>*T>>v,Ci'''0~V( ( ( ( (v( ( (HE&MLr'   c                    t          | t                    rjg }g }| D ]^}t          |           t          ||dz             }d|v r d|d         v r|                    |           I|                    |           _||z   S t          |            t          | t
                    s#d| vrt          dt          |           z             d| v r(| d         dk    st          |d| d         d	d
           t          |           } t          |           } t          |           | d<   t          | d                   | d<   d| v r| d         r| d         }t          | ||          | d<   g }d| v rF| d         }t          |                                          D ]}d|v r|                    |           ni }d}	d| v r| d         }	d| v r| d         rg }
d| v r| d         }
t          j        | d                   }|	r|	dz   }nd}||v r d}d||fz  |v r|dz   }d||fz  |v d||fz  }dg i |	dz   d}| d         D ]}||
v rg }d}| d         D ]}|dz   }|d         dk    rld}|d         D ]6}|dz   }d|v r+|d         |k    rt          j        |          }|d         |=  n7|r)|d         s	| d         |= |
|
                    |          =  n|d                             |           ||v r&t#          ||                   s||         |d         |<   |d         s|d         r3|
| d<   d|gi || d         d}i ||<   t$                              |           |r|| d<   | S )zi
    TODO:
          function return values
          determine expression types if in argument list
    r   rV  rp   r  r7  z0postcrack: Expected block dictionary instead of r  rZ  r   r   r6  sortvarsr;  r5  r  r	   r9  r:  __user__routinesunknown__user__routinesr   z%s_%ir  _user_interface)r7  r5  r6  rp   r
   r  )r7  r5  r6  rp   r:  )r  ry  rG  	postcrackr/  r  r   r   r1   analyzeargsanalyzecommonanalyzevarssortvarnamesanalyzebodyrz  r  rZ   
isexternalr   )r7  r;  rV  greturetrY  userisdefineduseblockr  rp   r:  rQ  mnamer   r  r  edefr  r\  bbmblocks                        r(   rg  rg    st    %  	 	ANNN!t,,,A{{zQvY66AAd{eT"" $we';';JE

# $ $ 	$uV}0CCC333f6:::E%  E&&E&M$U6]33E*5=V}t555E&MM~~<hmmoo&& 	( 	(AQ$$Q'''	( DV}ek 2
5  |,J	%-(( 	.--EE-EM!!AUAJ&-77E UAJ&-77uaj(E)20A)AC C	{# 	4 	4AJv " "AAAz[00"#F) & &B !AA%||6
a'+y}}$%fIaL % "#$V9 5$)&M!$4 *:+;+;A+>+> ?!E&!((....::jq&:&::+08If%a(V 	'	& 1 	'",E,.9$&U;EWY YF HUOv&&&  eLr'   c                 P   g }g }t          |                                           D ]E}d| |         v r$| |         d         r|                    |           0|                    |           Ft          |          }d}|r|d         }d}|dd          D ]}|| |         d         v rd} n|rH|dd          |gz   }|dz   }||k    r.t	          dd                    |          z   dz              ||z   }n3n0|                    |           |dd          }t          |          }d}||S )Nrx  r   r   zTsortvarnames: failed to compute dependencies because of cyclic dependencies between , r   )ry  rz  r/  rW   rn   r   )r6  indepdepr  r   r   rc  ws           r(   rk  rk  9  s|   E
C$))++  tAw478#4JJqMMMMLLOOOOCA	A
 FQRR 	 	ADGH%%% &  	abb'QC-CAA1uu ;))C..)+/0 1 1 1   LLOOOabb'CCAA)  * Lr'   c           	      B   t          |           s| S g }t          | d                                                   D ]}g }| d         |         D ]}t          j        d|t          j                  }|rWg }|                    d          r?d t          |                    d                                        d          D             }t          |                    d          
                                          }|| d         v rwd| d         |         v r>| d         |         d                             d	d
                    |          z             n[d	d
                    |          z  g| d         |         d<   n2|r%dd	d
                    |          z  gi| d         |<   ni | d         |<   ||vr|                    |           n|}t          d|d|d           |                    |           || d         |<   d| vr|| d<   n| d         |z   | d<   | S )Nr  z2\A\s*\b(?P<name>.*?)\b\s*(\((?P<dims>.*?)\)|)\s*\Zdimsc                 6    g | ]}|                                 S r&   r  r  s     r(   rw   z!analyzecommon.<locals>.<listcomp>g  s6     S S S ! GGII S S Sr'   r+  rp   r6  rq  r&  r,  z:analyzecommon: failed to extract "<name>[(<dims>)]" from "z" in common /z/.

commonvars)	hascommonry  rz  r   r   r   r   r-  r.  rq   r   r/  r   rn   )r7  r~  r  comvarsr  r   r|  r   s           r(   ri  ri  [  s   U J%/&&(()) % %x# 	 	AEq"$P PA p776?? SS S%3AGGFOO%D%D%J%J5%Q%QS S SDqwwv446677f%%!U6]1%555fa(4;;+sxx~~>@ @ @ @ ,sxx~~>8@fa(44  .&CHHTNN)K(L,Nfa(( ,.fa(J&&%%a(((ijijijlmlmlmnp p pNN1$h5  (l#L1J>lLr'   c                 n   t          |            g }| d         D ]}| |d<   |d         dv rR||d         |vr|d         }|d         t          v r7t          r|d         t          vrNt          |dd	          |d
<   n|}t	          |||dz             }|d         dv r"|d         s|                    d          sd|vr|d                             dd          dk    rt                              |           |d         dk    r|d         t          |d         <   |                    |           |S )Nr5  rI  r7  r  rp   r;  z
      Tas_interfacesaved_interfacer   rb  r  r  r  r   r	   pythonmoduler  r6  )
rG  r"   r#   crack2fortrangenrg  r  r   r   r/  r   )r7  r;  rV  r5  r\  as_s         r(   rl  rl    s}    D6]  !.W:333AfIT$9$9iyI%% QvYi77#3>$6 $6 $6A   Ca#*---W:<<<y =!"!7!7 =!**W:c2&&.88q!!!!zX%%+,V9ai(KKNNNNKr'   c                    t          |            t          }i }d| v r| d         3d }t          dk    r%t          dt	          | d                   z             nvt          | d                                                   D ]N}| d         |                             d          dvr| d         |         ||<   7| d         |         d         ||<   O||fS )Nr  r   z6buildimplicitrules: no implicit rules for routine %s.
rp   r3   )rI   r=  )rG  defaultimplicitrulesr   r1   r   ry  rz  r  )r7  implicitrules	attrrulesr  s       r(   buildimplicitrulesr    s    (MIU$ M{{MPTUZ[aUbPcPcce e e %
+002233 D D$Q'++J77?VVV',Z'8';M!$$#(#4Q#7
#CIaLL)##r'   c                     t          | ||          }t          |          t          t          fv r|S t	          d|z            )z2 Like `eval` but returns only integers and floats zr=%r)r  rg   r7   r9   r   )r  rY  r   r   s       r(   myevalr    s=    Q1AAww3,
Vq\
"
""r'   z\A\b\w+\b\Zc                    	 t          t          | i i                     }d|dfS # t          $ r Y nw xY wt                              |           rdd| fS t          |           }|D ]b}t          |          |k    rt          j        d|z   dz   |           r3t          j        d|z   dz   t          j	                  }|                    |           }|r	 |                    |           }|rG|
                    d          d	dd
|
                    d          }|                    |          }|Gt          |i i           }	|                    |           }|rG|
                    d          d	dd
|
                    d          }|                    |          }|Gt          |i i           |	z
  }
|                    |           }|rG|
                    d          d	dd
|
                    d          }|                    |          }|Gt          |i i           }|                    |           }|rG|
                    d          d	dd
|
                    d          }|                    |          }|Gt          |i i           }|
dz  |	z   |k    r|
dz  |	z   |k    r|
|	|fc S n# t          $ r Y nw xY w nddS )a  
    Obtain ``a`` and ``b`` when ``e == "a*x+b"``, where ``x`` is a symbol in
    xset.

    >>> getlincoef('2*x + 1', {'x'})
    (2, 1, 'x')
    >>> getlincoef('3*x + x*2 + 2 + 1', {'x'})
    (5, 3, 'x')
    >>> getlincoef('0', {'x'})
    (0, 0, None)
    >>> getlincoef('0*x', {'x'})
    (0, 0, 'x')
    >>> getlincoef('x*x', {'x'})
    (None, None, None)

    This can be tricked by sufficiently complex expressions

    >>> getlincoef('(x - 0.5)*(x - 1.5)*(x - 1)*x + 2*x + 3', {'x'})
    (2.0, 3.0, 'x')
    r   Nr   z\w\s*\([^)]*\b\b(?P<before>.*?)\b\b(?P<after>.*)r#  r<  r=  r$  g      ?g      ?)NNN)r7   r  r   getlincoef_re_1r   rW   r   searchr   r   r   )r  xsetr   len_er  re  r   rf  eer\  r1  c2s               r(   
getlincoefr    s?   *q"b!!""!Tz   Q !QwFFE ' 'q66E>>9&*U2A66 	z.25GGNNJJqMM 	ZZ]] (****AAArxx/@/@/@BBBB  ( 2r2&&ZZ]] (****AAArxx/@/@/@BBBB  ( 2r2&&*ZZ]] (****CCC'1B1B1BDBBB  ( 2r2&&ZZ]] (****CCC'1B1B1BDBBB  ( BB''GaK1$$S1):):a7NNN   E?	@ s   "% 
22GJ55
KKz\b[a-z][\w$]*\bc                 
   | |v r||                               dg           }d||          v rat          ||                    sLt                              ||          d                   D ]%}||vr||v r|| k    r|                    |           &|d d          D ]E}|                     |g           pt          |||          D ]}||vr|                    |           Fn!t          dt          |           z             g }||| <   |S )Nrx  rt  z,_get_depend_dict: no dependence info for %s
)r  isstringword_patternfindallr/  _get_depend_dictr1   r   )rp   r6  depswordswordrz  s         r(   r  r  	  s1   t||T
x,,$t*Xd4j%9%9$,,T$Z_== ' ' u$$$$,,LL&&&!!!H 	$ 	$DXXdB'' :'dD99$ $E>>LLOOO$	$ 	?4::NOOODJLr'   c                 x    t          |                                           }i }|D ]}t          || |           |S r+   )ry  rz  r  )r6  ry   depend_dictr   s       r(   _calc_depend_dictr  '	  sF    EK / /D+....r'   c                 ~    t                     g }t                                                    D ]"}|         s|                    |           |= #rWt                                                    D ]3\  }}fd|D             }|s|                    |           |= .||<   4W fd|D             S )z
    c                     g | ]}|v |	S r&   r&   )ru   r   r  s     r(   rw   z$get_sorted_names.<locals>.<listcomp>:	  s#    :::Qk)9)9q)9)9)9r'   c                     g | ]}|v |	S r&   r&   )ru   rp   r6  s     r(   rw   z$get_sorted_names.<locals>.<listcomp>@	  s    333TddllDlllr'   )r  ry  rz  r/  r:  )r6  ry   rp   lstnew_lstr  s   `    @r(   get_sorted_namesr  /	  s    $D))KE[%%''(( " "4  	"LLD!
 ,k//1122 	, 	,ID#::::#:::G ,T"""%%$+D!!  , 4333U3333r'   c                     | d         dv r
| dd         } t                               |           rdS t                              |           rdS d| z   dz   S )	Nr   '"r   r
         zkind(r=  )r  r   real8pattern)rb   s    r(   
_kind_funcr  C	  sd    ayE"6"" q			F	#	# qVc!!r'   c                 f    d| z  }|dk    rdS |dk    rdS |dk    rdS |dk    rd	S |dd
z  k    rdS dS )Nr      r   i   r8  l        r  l            r        r
   r&   )r   r   s     r(   _selected_int_kind_funcr  N	  sZ    
aAF{{qG||qG||qG||qAH}}r2r'   c                     | dk     rdS | dk     rdS t          j                                                    }|                    d          r	| dk    rdS n| dk     rdS | dk    rdS d	S )
N   r  r  r  )aarch64powerppcriscvs390xsparc      r   r
   )platformmachiner   r   )pr   radixr  s       r(   _selected_real_kind_funcr  ^	  s     	1uuq2vvq  &&((GPQQ 772  r662"WW22r'   c           
      j	   t          j         |          }t          j         |          }dt          fdt          fdt          ffD ]\  }}||vr|||<   g }t	          |           D ]1}d| |         v r%d| |         d         v r|                    |           2t          j        dt          j                  }t          j        dt          j                  }	t          j        dt          j                  }
|D ]}d	| |         v r{| |         d	         }t          | |                   r#|
                                }d
D ]} |j        | }|                    d|          }|	                    d|          }d}d| |         v r]d| |         d         v rMt          |          }|                    d| |         d         d         z   d          }t          |          |k     }|s|
                    |          s|                    d          }t          |          dk    r[d                    |d d                   
                                                    |d         
                                d          }t#          | |                   rt%          |          }t&                              |          D ]}t%          ||                                |                                         
                                                    dd                    ||                                |                                <   d                    |          }n(t/          | |                   rt1          d| d           t&                              |          rd}nt4                              |          rd}	 t7          |||          ||<   n?# t8          $ r2}|||<   t1          d|dt;          |          d           Y d }~nd }~ww xY wt=          | |                   r3t?          ||         t@                    rtC          ||                   ||<   |
                                }||k    r||         ||<   tE          | |                    t1          dt;          |          z             |S )Nr8  selected_int_kindselected_real_kindrq  r  z \bkind\s*\(\s*(?P<value>.*)\s*\)z-\bselected_int_kind\s*\(\s*(?P<value>.*)\s*\)z4\bselected_(int|real)_kind\s*\(\s*(?P<value>.*)\s*\)rt  ))z.false.False)z.true.Truez
kind("\1")zselected_int_kind(\1)Frr  r   r	   r   r
   r)  r  zAget_parameters[TODO]: implement evaluation of complex expression r   r  r  zget_parameters: got "z" on z2get_parameters:parameter %s does not have value?!
)#r  r  r  r  r  r/  r   r   r   	islogicalr   r   subrW   r   r.  r   isdoublery  r  r  r  r  	iscomplexr1   r  r  r  r   r   r  r  r7   r  r  )r6  global_paramsr  g_paramsrp   funcparam_namesr   kind_reselected_int_kind_reselected_kind_rer  replis_replaced
orig_v_lenv_r  r   r   nls                       r(   r  r  q	  s   Y}%%Fy''H
++-DE,.FGK " "
d x!HTNKd## " "a  [DGJ4G%G%Gq!!!j<bdCCG:8"$@ @z?G G IS IS$q'>>QAa!! )GGII ) )D
 "	4(AAM1--A$(()A1EEA  Ka((T!W^444!$QJ		#Q(?(G"GLLA #&a&&:"5K Q'--a00 QB2ww{{GGBssG,,2244<<RV\\^^RPP Q   	M!WW&//22 H HA,0!''))AEEGG+,2244<<S#FF-H -HBqwwyy())GGBKK47## M LFGL L L M M M
 ##A&& $$Q'' M Hf55q		 M M Mq	ccc47777KLLLLLLLLM Q   +Zq	3%?%? +q	NNq	BQww#AYr
$q'NNNEaQS S S SMs   :O
P(PPc                 .    | dv rdS t          | |          S )N)z(:)(*)r   r  )_eval_scalar)lengthr  s     r(   _eval_lengthr  	  s#    $$$u'''r'   z\d+_c                    t          |           r|                     d          d         } 	 t          | i |          }  t          | t                    rt
          nt          |           } ni# t          t          t          f$ r | cY S t          $ rB}t          d|d| dt          |                                          d           Y d }~nd }~ww xY w| S )Nr   r   r  z" in evaluating z (available names: r   )_is_kind_numberr.  r  r  r   r   r  r  r  r   rn   ry  rz  )valuer  r   s      r(   r  r  	  s   u $C  #	5UB''8E3//8S%@@{I.    5 5 533tFKKMM22224 	5 	5 	5 	5 	5 	5 	5 	55 Ls   =A* *C	C8CCc                 .)  @AB t          |            t          |           \  }}t          j        | d                   B| d         dk    r| d         Bvri B| d         <   d| d         v rBd= d| d         d         v rv| d         d         d         }t          B          t          d | d         D                       z  D ]2}d	D ]-}||v r't	          B                    |i           |          B|<   .3g }| d
         }|D ]0}	 B|          |                    |           !# t          $ r Y -w xY wt          B	                                          D ]}||vr|                    |           t          Bt          |                     }	i }
t          j        d          j        }t          B	                                          D ]} ||          }|rr||                                |                                         }	 |
|          G# t          $ r- t          j        d|z  t          j                  j        |
|<   Y }w xY w|D ] }|d         t          |	                                          v r%t	          B|         ||d                            B|<   dB|         vrdB|         v rdB|         d         v s|r|d                                         }t          ||         	                                          D ]m}|dk    r||         |         dk    r|B|         vr||         |         B|         |<   =|dk    r*||         |         D ]}t	          B|         |          B|<   nn3|| d
         v r)t'          dt)          |          d| d         d           dB|         v redB|         d         v rUB|         d         d         }	 t+          t-          |i |	                    }n# t.          $ r Y nw xY w|B|         d         d<   dB|         v redB|         d         v rUB|         d         d         }	 t+          t-          |i |	                    }n# t.          $ r Y nw xY w|B|         d         d<   i }dB|         v r_B|         d         }|                                 g B|         d<   d\  }}}}}|D ]}|d d         dk    r%|dd                                          dd         }n|d d         dk    r%|dd                                          dd         }n|d d         dk    r%|dd                                          dd         }n|d d          d!k    r%|d d                                          dd         }nL|d d"         d#k    r%|d"d                                          dd         }nt	          B|         |          B|<   |rdB|         vrg B|         d<   d$ t5          |                              d%          D             D ]I}|                    d&d          }|B|         d         vr!B|         d                             |           Jd }|rf|                    d'd(          }|                    d)d*          }d#B|         vr|gB|         d#<   n!B|         d#                             |           d }|dB|         vrg B|         d<   t;          d+ t5          |                              d%          D                       D ]3}|B|         d         vr!B|         d                             |           4d }|wd!B|         vrg B|         d!<   d, t5          |                              d%          D             D ]3}|B|         d!         vr!B|         d!                             |           4d }|rdB|         vrg B|         d<   t;          d- t5          |                              d%          D                       D ]}|d.k    rd.nd/}||	v rt+          |	|                   }|	D ]}t          j        d0|z   d1z   t          j                  }|                    |          }|rX|                    d2          t+          |	|                   z   |                    d3          z   }|                    |          }|X||k    r|g}n#t5          |d.                              d4          }t?          |          d5k    r	d/|v rd/g}d/}t?          |          dk    r|d         |k    r
d6|d         g}t?          |          d5k    r[tA          tB          j"        j#        |          \  }}||z
  dz   } | $                    tB          j%        j&        7          }i }!| d         D ]}tC          j'        |          }"| (                    |"          r	 | )                    |"          \  }}#||#fd8}$t          |*                                          }%|%+                    |#*                                           n:# tX          $ r-}&d }$t          | *                                          }%Y d }&~&nd }&~&ww xY wt          Bfd9|%D                       }'|$t          |'          f|!|<   |!||<   B|         d                             |           d!B|         vrKd
| v rF|| d
         v r;B|                             dg           }(g }) t[          t\          t^          t`                    B|                   }*tc          B|                   rte          B|         d                   D ]\  }+}|                    |          @@n|*r@3                                D ]\  }\  },}-@Afd:At                      }. A||.           ||(v sd;B|         v s
dB|         v rB|,||.vrd<}/ |,tC          j'        d=| d>|+ d?                    }0|0$                    tB          j%        j&        7          }0|0B|         d;<   |g|-z   B|         d<   d!B|         vrd=| d>|+ d@| gB|         d!<   n{dA}/dB|         vrg B|         d<   dBB|         d         vr!B|         d                             dB           |(                    |           |)                    d=| d>|+ d@|            B|                             dg           }1dC|1v sdD|1v s|1                    |/rdDndC           |1r|1B|         d<   @@3                                D ]\  }\  },}-B|                             dg           }'B|                             dg           D ]n}2|24                    d          rWd5                    |2                                          }2|'6                    |2dEd                             dF                     o|'r%t          t          |'                    B|         d<   ||'vr|(                    |           nto          B|                   rdB|         v rd/B|         d         v r4tq          B|         d         d/         |	          }3|3B|         d         d/<   nRdB|         d         v rBtq          B|         d         d         |	          }3B|         d         d= |3B|         d         d/<   |)r|)B|         d!<   |(r%t          t          |(                    B|         d<   d;B|         v rdB|         vrg B|         d<   dCB|         d         vr1dDB|         d         vr!B|         d                             dC           dB|         vrg B|         d<   t          |
3                                          D ]=\  }} |B|         d;                   r!B|         d                             |           >B|         d         s	B|         d= ts          B|                   r%tu          B|         d;         |	          B|         d;<   "t          B	                                          D ]}|| d         k    rd#B|         v rB|         d#         | d#<   | d         dk    rdG| v r/| dG         Bv r%tw          B|         B| dG                            B|<   dH| v rr| dH         }4|4                    dId          }5|4|5k     }6|5                    dJd          }4|4|5k     }7tx          d                             |4          }|rt{          |                    dK          |                    d3                    \  }8}9}}:t}          |8|9          \  };}<}=|8B|         d<   |;r;d|;v r,	 t-          |;d         i |	          |;d<   n# t.          $ r Y nw xY w|;B|         d<   |<r|<B|         d<   |=r|=B|         dL<   |6rt	          B|         dI          B|<   |7rt	          B|         dJ          B|<   t'          dMt)          | dH                   z             | d         dNvrdO| v r$t          j        | d
         | dO         z             }>nt          j        | d
                   }>t          B	                                          D ]@} t[          t~          t                    B|                   r|>                    |           AdP| v r|>6                    t          | dP         	                                                     t          | dP         	                                          D ],}| dP         |         D ]}||>vr|>                    |           -| d         dk    r;dG| v r|>                    | dG                    n|>                    | d                    | d         dQv r'| d         }?|?Bv rdB|?         v rB|?         d         | d<   | d         dRk    r4|>6                    t          B	                                                     t          B	                                          D ]	}||>vrB|= 
BS )SNr6  r7  r  rp   r	   rq  c              3   &   K   | ]}|d          V  dS )rp   Nr&   )ru   r\  s     r(   	<genexpr>zanalyzevars.<locals>.<genexpr>	  s&      $F$F1QvY$F$F$F$F$F$Fr'   r5  r  r;  z[A-Za-z][\w$]*z.*\b%s\br   r3   r  	undefinedz"analyzevars: typespec of variable z is not defined in routine z.
rs  rW   rr  r8  )NNNNNr'  r
  r   r
   r   r  rx  r   rw  r  rv  c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zanalyzevars.<locals>.<listcomp>I
  s     UUUAaggiiUUUr'   r+  r   z\n\nz

z\n r   c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zanalyzevars.<locals>.<listcomp>Z
  s     '_'_'_a		'_'_'_r'   c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zanalyzevars.<locals>.<listcomp>a
  s     TTTAaggiiTTTr'   c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   zanalyzevars.<locals>.<listcomp>g
  s     #X#X#X!AGGII#X#X#Xr'   r  r   r  r  r#  r$  z@:@r8  1)languagec                     | |z
  |z  S r+   r&   )r*  r1  r\  s      r(   solve_vzanalyzevars.<locals>.solve_v
  s    01A{(:r'   c              3   8   K   | ]}|j         v |j         V  d S r+   )r  )ru   r*  r6  s     r(   r  zanalyzevars.<locals>.<genexpr>
  s9       -7 -7/0'(v~~ %&F'5~~~-7 -7r'   c                                          | d g g          d         D ]'}||vr!|                    |            ||           (d S )Nr   )r  add)r  r  v1coeffs_and_depscompute_depss      r(   r  z!analyzevars.<locals>.compute_deps
  s`    *9*=*=a$*L*LQ*O !? !?B')~~(,(4R(>(>(>!? !?r'   rt  Fzshape(rw  r=  z) == Tinr  r  r  r,  r   r  pure	recursiver>  ru  z'analyzevars: prefix (%s) were not used
)r  r  r  r  r~  r  )r  r  rg   )ArG  r  r  r%  r{  r  r/  KeyErrorry  rz  r  rR  r   r   r   r  r  r   r   r1   r   r   r  r   reverser   r-  r.  r   rz   r   rW   r  r   ExprparsetostringLanguager   	as_symbolr  linear_solvesymbolsrK  RuntimeErrorl_orisintent_inisintent_inoutisintent_inplaceisarray	enumerater:  r   r   extendr  r  isscalarr  r  rT  r  r  isintent_callbackisintent_aux)Cr7  r  r  genr   r  svarsr;  r1  r  dep_matches
name_matchr  r   ln0r   dimension_exprsr  dimr  rx  rw  rv  r   tmpr)  starr  re  r  r0  d2dsizesolver_and_depsr*  r\  r  all_symbolsr   v_depsn_depsn_checks
n_is_inputr   solverr  all_depsis_requiredr#  v_attraar  prpr1ispureisrecr3   r  r  r  r  ru  
neededvarsrp   r  r  r6  sC                                                                   @@@r(   rj  rj  	  sI    1%88M99U6]##DW~##fT(A(A U6]	U6]Hvr***-#J/CYY$F$Ff$F$F$F!F!FF B B. B BACxx"-dhhq"ooq"A"AQB E=D  	GGLLOOOO 	 	 	D	$))++  D==LLOOOD"3E":":;;FK-..4J$))++ K KJqMM 	K!''))AEEGG#$AKA K K K!#K1,=rt!D!D!JAK		K  JB JBQ44	(())))!$q'9QqT?;;DGT!W$$a((Z47:;N-N-N  1A$**,,C!-"4"9"9";";<< B B
??}S/A!/D/S/S$DG++)6s);A)>DGAJJ*__%23%7%: B B*5d1gq*A*AQB %-''GQv0 1 1 1T!W$$Q///GN+E2DB//00AA    D12Q'.T!W$$a000GN+F3DB//00AA    D23Q'/a  7:&DLLNNN"$DGJ/K,C +! +!RaR5K''QRR5;;==!B$/CCrrUh&&ekkmmQrT2FFrrUh&&ekkmmQrT2FFrrUg%%qrrU[[]]AbD1EErrUf__abbEKKMM1R40DD)$q'155DG "tAw..,.Q)UU1G1G1M1Me1T1TUUU : :iiR00d1gh&777 GH-44S999!F  <<&99D<<55DT!W,,+/&QQ..t444D%tAw..,.Q)&'_'_>&;Q;Q;W;WX];^;^'_'_'_`` 8 8DGH$555 GH-44Q777!F$d1g--+-Q(TT1F1F1L1LU1S1STTT 7 7DGG$444 GG,33A666 E >3{$q'11')Q$"#X#X~c7J7J7P7PQV7W7W#X#X#XYY <3 <3A"#s((33DF{{q	NN# . .!z*>*BEW*WY[Y]^^ JJqMM . ! 1 1 #F1I!/121A1A!BA $

1A   .
 Dyy"V+As3399%@@2ww!||r		!U2ww!||1!2a5\2ww!||!$X]%8"!=!=B "R!!NNH4E4GNHH +-!&v K KA ( 21 5 5A$~~a00 K!G+0+=+=a+@+@DAq56! %; %; %; %; 36aiikk2B2BK$/$6$6qyy{{$C$C$C$C'3 !G !G !G /3G25emmoo2F2FKKKKKK!G *- -7 -7 -7 -74?-7 -7 -7 *7 *7 6=d6ll5J 2 .=*GK(//2222$q'!!foo!uV}:L:L
 !W[[2..FH0k>.0 004Q9 9JtAw W>%d1gk&:;; K1 K1DAq&5&9&9!&<&<O&.# := 2A1F1F1H1H 6= 6=-A~? ? ? ? ? ?
 (+uuH(LH555!"f$'47NN$,Q$7$7
 !)%1ax6G6G /4'-vh.@$6Q$6$6!$6$6$6/8 /8 (9 (9'+}}-5->-@ (5 (B (B/3Q 67C$JQ 1#*$q'#9#9 )B(A(Aa(A(Aa(A(A8CDGG$4 /3#+47#:#:8:DGH$5#'tAwx/@#@#@$(GH$5$<$<T$B$B$B &a 0 0 0 ($=Q$=$=!$=$=!$=$=!? !? !?%)!W[[R%@%@F$.&$8$8'1V';'; &2=$MJJ:!O !O !O% =6<Q
 3&21@1F1F1H1H 	1 	1-A~%)!W[[2%>%>F&*1gkk*b&A&A G G#%==#:#: !G)+)<)<B$*MM"QrT(..2E2E$F$F$F% F48V4E4EQ 1  &a 0 0 0WK1X $q'"" 
>!T!W,,d1gn555!-d1gn.Ec.J.4"6 "67=Q/44$q'."999!-d1gn.Ee.L.4"6 "6 GN3E:7=Q/4 ,#+Q  6$(V$5$5Q!$q'>>a((&(Q
#$q'*"555$q'*"555Q
#**:666tAw&&$&Q! !2!2!4!455 4 4DAqqa 4Q)00333Awx( *Q)Q   B+DGCL&AAQ$))++ &` &`fa   $QfW~++u$$xD)@)@(a$uX2GHHDGu$$xB**VR00C"$)mF["55B!#s]E$Q--b11A `:HGGFOOQWWW-=-=;? ;?7(D%;H$h<0 <08
J.6Q
+% A%33!)9=(26(:B:H :HJv$6$6'0 !) !) !)$(D!)6@DGN3% A6@DGN3# ;2:DGJ/! C&1$q'6&B&BDG  H&1$q';&G&GDGFeT\oI^I^^` ` `>VVV5  5=53F#FGGJJ5=11Jdiikk"" 	% 	%A4t%|44T!W== %!!!$$$ed5>#6#6#8#899:::%.--//00 - -w* - -A
**"))!,,,- >Z''5  !!%/2222!!%-000>777=Dt||DJ 6 6"&t*X"6h>V##d499;;//000diikk"" 	 	A
""GKsy   D  
D-,D-H4IIO22
O?>O?Q!!
Q.-Q.5A&i
j	&#j	j	GAGG
AG*G)AG*z\A[a-z]+[\w$]*\Zc                 (   | }t                               |            }|rt          |          \  }}t          | |d         |          }d}| D ]8}	|	                                }	|	t
          j        t
          j        z   vrd}	||	z   }9|d         dk    r|dz   }n|dz   }|} | |d         v s
| |d         v r| dz   } | |d         v | |d         v | |v rAd	}
| t          |
          z   |v r|
d	z   }
| t          |
          z   |v | t          |
          z   } |r||d         | <   ns| |d         vr-||d         v r|d         |         |d         | <   ni |d         | <   d
|v r8||d
         |d         z   v r%t          |d         |          d          |d         | <   | S )Nr6  e_r   r
   r  _er;  r   r   r9  r:  r  )
analyzeargs_re_1r   r  r  r   rb   ascii_lowercasedigitsr   r{  )r1  r7  r;  orig_a	a_is_exprr  r  atnar   r  s              r(   	expr2namer0  c  s   F$**1---I #5e#<#< yq%-?? 	 	A		A.>>>aBBb6S==cBBdB5=  Av$6$6CA 5=  Av$6$6Dyy#a&&jD  AA #a&&jD  AJ 	IfaE&M!!v&&#(=#8fa  #%fa %FeK.@5CV.V$V$V*5=+;ZHHE&M!Hr'   c                 H   t          |            t          |           \  }}d| vrg | d<   g }| d         D ](}t          || |          }|                    |           )|| d<   d| v rGt	          | d                                                   D ]\  }}|D ]}|| d         vri | d         |<    | d         D ]F}|d         |v r:d| vrg | d<   |d         | d         vr!| d                             |d                    Gd| v r!| d         | d         vri | d         | d         <   | S )Nr;  r  r6  r5  rp   r9  r   )rG  r  r0  r/  ry  r:  )r7  r  r   r;  r1  r  args1r\  s           r(   rh  rh    s   )%00M1UfD6]  a%%AE&M%U7^113344 	* 	*HAu * *E&M))')E&M!$* 6] 5 5V9%''%'k"yk 222k"))!F)4445U8_E&MAA)+feHo&Lr'   z\A\(.+?,.+?\)\Zz\A[+-]?\d+(_(?P<name>\w+)|)\Zz*\A[+-]?[\d.]+[-\d+de.]*(_(?P<name>\w+)|)\Zz
\A\(.*\)\Zz\A(?P<name>\w+)\s*\(.*?\)\s*\Zc                     t          | t                    rddiS t          | t                    rddiS t          | t                    rddiS t          | t                    r| S t          t          |                     )Nr3   r6   r4   r  )r  r7   r9   r  r  AssertionErrorr   )r   s    r(   _ensure_exprdictr5    s    !S 'I&&!U $F##!W 'I&&!T 
a
!
!!r'   c                    | |v rt          ||                    S |                                 } t                              |           rddiS t                              |           }|rNd|                                v r4|                    d          rt          dt          |           z             ddiS t                              |           }|rNd|                                v r4|                    d          rt          dt          |           z             ddiS dD ]V}d t          | |	                              d
|z   d
z             D             D ]}||v rt          ||                   c c S  Wi }t                              |           rt          | dd         ||          }nt                              |           }|ri|                    d          }t          |                    d          ||          }|rd|v r|d= |s%|d         |v rt          ||d                            S | d         dv rdddidS |st          dt          |           z             |S )Nr3   r  rp   z:determineexprtype: selected kind types not supported (%s)
r6   r4   )+r  r   r   c                 6    g | ]}|                                 S r&   r  r  s     r(   rw   z%determineexprtype.<locals>.<listcomp>  s     ZZZ!''))ZZZr'   r!  rl  r   r
   rq  r   r  r  r   )r3   rs  z>determineexprtype: could not determine expressions (%s) type.
)r5  r   determineexprtype_re_1r   determineexprtype_re_2r'  r   r1   r   determineexprtype_re_3r-  r.  determineexprtype_re_4r  determineexprtype_re_5)r  r6  rulesr   opr  r  rns           r(   r  r    s   t||T
+++::<<D##D)) 'I&&$$T**A 'Q[[]]""qwwv"MPTUYPZPZZ\ \ \I&&$$T**A $Q[[]]""qwwv"MPTUYPZPZZ\ \ \F##" 1 1ZZ^D%C%C%C%I%I#PR(UX.%Y%YZZZ 	1 	1ADyy'Q0000000 	1 	A##D)) :d1R4j$66"((.. 	:B!!''&//4??A "Z1__jM :a5E>>+E"Q%L999Aw%'#sDDD ^MQUVZQ[Q[\	^ 	^ 	^Hr'   r   Fc                 l   t          |            d}t          | t                    rO| D ]J}|r1|d         dv r'|d         t          v rt          r|d         t          vr5|t          |||          z   }K|S d}d}d}| d         }|dk    rdS g }	d| v r| d         }d| v rt| d         }
| d         D ]=}t          || |	          }t          |
|                   s|	                    |           >| d         d	k    s|	rd
d	                    |	          z  }d}d| v rIt          | d         
                                          D ]!}||t          z   |d| d         |         }"|                     dg           d d          }|d	k    rd|v r|                    d           |r'||t          z   dd	                    |          d|}d}d| v rt          | d         |t          z             }d}d| v rt          | d         |t          z             }|dk    rd}d}d| v r0d| d         z  }| d         |	vr|	                    | d                    t          | d         |t          z   |          }t!          | | d         |	|t          z   |          }
d}d| v r|sd| d         z  }d| v r\d}t          | d                                                   D ]-\  }}||t          z   d|dd	                    |          d}.||z   }|dk    r|dk    rd}|||d|||d||||
|||d |d|}|S )!Nr	   r7  r  rp   r  r  r;  r6  r  z(%s)r,  r  r   r  callbackintent(z) r  r  r  r   z result (%s)r5  r  z! in %sr  zentry r<  r=  r  r  zend )rG  r  ry  r"   r#   r  r0  r	  r/  r   rz  r   r  r  use2fortrancommon2fortranvars2fortranr:  )r7  rV  r  r]  rY  r  rp   r;  	blocktypeargslr6  r1  r  r  
intent_lstr  r  r   r5  messentry_stmtsr   s                         r(   r  r    sB    
C%  	L 	LA QwZ#===V9	)) 6)!;!;(ClKKKKCC
FDDgIIrEV}V}v 	  	 A!UE**A$T!W--  Q>Z''5'CHHUOO+DU""e./446677 	R 	RA  #--E:L4Ma4P4P R8R((+JJ:#;#;*%%% 8,,cGmmmHHZ0000$$8 C~~%,g66F5hw??"""F5%/1?%''LLx)))E&M3=|TTTDuV}eS7]O O ODD|5=(%w--//00 	I 	IDAq([#---CHHQKKKKIKKk!L  T^%;%;VVYYYddFFFDD:J:JCCQUQUW]W]_c_cehehehjsjsjsuyuy{CJr'   c           
          d}t          |                                           D ]P}|dk    r#||dd                    | |                   }+||d|dd                    | |                   }Q|S )Nr	   r  zcommon r,  zcommon /z/ )ry  rz  r   )r  rV  r]  r  s       r(   rE  rE  .  s    
C&++--   L L==%(S###sxxq	/B/B/BCCC*-#sssAAAsxxq	7J7J7JKCCJr'   c                 2   d}t          |                                           D ]}||d|d}| |         i k    r|r|d         dk    r
|d d         }1d| |         v r| |         d         rd|z  }d| |         v r| |         d         rtd}t          | |         d                                                   D ]D}|| |         d         |         k    r|||}d}%|||d	| |         d         |         }d}E|r|d         dk    r
|d d         }|S )
Nr	   zuse r,  r
   r  z%s only:r  r   z=>r?  )r  rV  r]  r   r   r  s         r(   rD  rD  8  sa   
C#((**  "sCCC+q6R<< s2w#~~#2#hSVAv$CCF??s1ve}?A#a&-,,..//  Aua(((&)c11aa0CAA*-#qq!!!SVE]15E5EFCAA 	3r7c>>crc(CJr'   c                     | d         }g }|D ]J}	 t                      d|z           } ||           r|                    |           ;# t          $ r Y Gw xY w|S )Nr  zisintent_%s)globalsr/  r  )r^  r  r]  r  r   s        r(   true_intent_listrP  P  s    
h-C
C # #	#		-&01A qvv #

6"""	  	 	 	D	
 Js   A
AAc           	      	   t          |            d}g }|D ]!}|| d         v r|                    |           "d| v r;| d         D ]2}||v r||vr|                    |            t          d|z             3d| v r|                    | d                    |s=t	          |                                          D ]}||vr|                    |           |D ]}d||         v rE||         d         D ]6}||v r0d||         v r&|||         d         v rt          d|d|d	           7d
| v r|| d
         v rt          ||                   r	||d|}||d|}t          ||                   r	||d|}||v rd||         vrd}	| d         D ]}
||
d         k    r|
d         dk    rd}	 n|	r||vr#t          |           t          d|z             || d         k    r#| d         dk    s| 
                    d          r6d||         vrRd||         v rd||         d         v r||v r	||d|}it          ||                    t          d|z             ||         d         }|dk    rd||         v r|d||         d         d}i }d||         v r||         d         }nd||         v r||         d         }d |v r'|d          d!v r|d"|d          d}nJ|d |d          }n<d#|v r&|d$|d#         }d%|v r|d&|d%         d}nd'|z  }nd%|v r|d(|d%         d}d)}d||         v rUd* ||         d         D             }|rd+|v rd,|v r|                    d,           |r|d-d.                    |          }d.}d/||         v r+||d0d.                    ||         d/                   d}d.}d1||         v r6t          ||                   }|r||d2d.                    |          d}d.}d3||         v r+||d4d.                    ||         d3                   d}d.}d||         v r+||d5d.                    ||         d                   d}d.}d6||         v r]||         d6         }||         d         d7v r4	 t          |          }d|j        d.|j        d}n# t"          $ r Y nw xY w|d8|d6|}n|d8|}|||}|S )9z&
    TODO:
    public sub
    ...
    r	   r6  r~  z7vars2fortran: Confused?!: "%s" is not defined in vars.
r  rx  z;vars2fortran: Warning: cross-dependence between variables "z" and "r  r9  zintent(callback) z	external z	optional r3   r   r5  rp   r7  r  r   z/vars2fortran: No definition for argument "%s".
r   rq  r  z-vars2fortran: No typespec for argument "%s".
rg   ru  r<  r=  rr  rs  r   )r   r  z*(rW   z(len=r8  z,kind=z%s)z(kind=r   c                     g | ]}|d v|	S ))r  r&   )ru   r   s     r(   rw   z vars2fortran.<locals>.<listcomp>  s,     . . .!,, ,,,r'   z
intent(in)zintent(out)rw  r,  r
  z
dimension(r  rC  rw  zcheck(zdepend(rt  )r  r  z :: )rG  r/  rn   r  ry  rz  r	  
isoptionalshowr1   r  r  r   rP  r  r4   imagr   )r7  r6  r;  rV  r  r]  noutr1  r)  r   r\  vardefr  r   r  r  r  s                    r(   rF  rF  ^  s    
CD  fKKNNNu|$ 	T 	TADyyD==KKNNNNQRRT T T TUE*%&&& diikk"" 	 	A}}A g, g,tAw!WX& n n99T!W!4!4d1gh>O9O9OGghghghjkjkjkln n n%A{);$;$; a)) @363QQ?'*sCCC3C$q'"" 8+.3QQ7DyyZtAw66D6]  &	>>ajJ&>&>DE D==JJJFJKKKfW~++uyy/B/B+
 T!W$$T!W$$tAwz7J)J)J99/2sCCC;CaMMMDqHIIIa$V
d1g 5 5!'a)<)<)<=FT!W$$Aw~.HHtAw&&Aw~.H(??}
**&,ffhsmmm<$*FFHSMM:  (.@X%%.4ffhv6F6F6FGFF"f-FF8##*0&&(62B2B2BCa  . .tAwz2 . . .D + 4 4$9N9N M*** %+VVSXXd^^^<$q'!!388DGK$89999;FAtAw"47++C G-3VQQQFAd1g(.388DGG<L3M3M3M3MNFAtAw388DGH$566668FA$q'>>QAAwz"&CCCQAA%&VVVQVVV4AA    D&,ffaaa3FF#)6611-F#ssFF+Js   "S
SSc                 |   t          dd           t          | t                     t          dd           g at	          t
          d                   }t          dd           t          D ]+}t          d|j         dd           t          ||          },t          dd           t          |          }t          |z   S )NzReading fortran codes...
r   zPost-processing...
z"Applying post-processing hooks...
z  r   zPost-processing (stage 2)...
)
r1   r   rA  r   rg  r   post_processing_hooks__name__traverserX  )filespostlisthooks      r(   crackfortranr_    s     (!,,,E9%%%"A&&&K1&&H11555% , ,&T]&&&***Hd++,a000(##H!!r'   c                 N    t          |           dz   }d}dt          z  }||z   |z   S )Nr   zE!    -*- f90 -*-
! Note: the context of this file is case sensitive.
z
! This file was auto-generated with f2py (version:%s).
! See:
! https://web.archive.org/web/20140822061353/http://cens.ioc.ee/projects/f2py2e
)r  f2py_version)r7  pyfheaderfooters       r(   crack2fortranre    s?     5
!
!D
(CF 	F
 C<&  r'   c                     t          | t                    o4t          |           dk    o!t          | d         t          t          f          S )Nr8  r   )r  tuplerW   r7   r   )objs    r(   _is_visit_pairri  	  s@    sE"" /CA/3q6C:..0r'   c                 8   t          |           r9| d         dk    r| S  || ||g|R i |}|t          |          sJ |S | }| \  }} nd| f}d}t          | t                    rLg }t          |           D ]9\  }	}
t	          |	|
f|g|R ||gz   |d|\  }}||                    |           :ndt          | t                    rMt                      }|                                 D ])\  }}
t	          ||
f|g|R ||gz   |d|\  }}||||<   *n| }||S ||fS )a  Traverse f2py data structure with the following visit function:

    def visit(item, parents, result, *args, **kwargs):
        """

        parents is a list of key-"f2py data structure" pairs from which
        items are taken from.

        result is a f2py data structure that is filled with the
        return value of the visit function.

        item is 2-tuple (index, value) if parents[-1][1] is a list
        item is 2-tuple (key, value) if parents[-1][1] is a dict

        The return value of visit must be None, or of the same kind as
        item, that is, if parents[-1] is a list, the return value must
        be 2-tuple (new_index, new_value), or if parents[-1] is a
        dict, the return value must be 2-tuple (new_key, new_value).

        If new_index or new_value is None, the return value of visit
        is ignored, that is, it will not be added to the result.

        If the return value is None, the content of obj will be
        traversed, otherwise not.
        """
    r   rI  N)parentsr   )ri  r  ry  r  r[  r/  r  r:  )rh  visitrk  r   r;  kwargs
new_resultparent
result_keyrZ   r  	new_indexnew_itemkeynew_key	new_values                   r(   r[  r[    s   8 c q6^##JU3A$AAA&AA
!!*-----
CC
#t 
%cNN 	, 	,LE5"*E5>5 #K;?#K #K3:fX3E28#K #KCI#K #KIx $!!(+++	, 
C		 	VV
))++ 	0 	0JC!)3, "J:>"J "J29VH2D17"J "JBH"J "JGY "&/
7#	0 
z!!r'   c                 b   |d         \  }}| \  }}d }	|dv r#|d         d         dk    sJ |d         d         }
n+|dk    r#|d	         d         dk    sJ |d	         d         }
nd
}
d
}|
8|}|
                                 D ] \  }}t          |          r |	||          }!nd|dk    r^|d	         d         d         }
|}|
                                 D ]3\  }}t          |          rt          j        d|z   dz   d|z   |          }4|'||k    rt	          d| d| d| d| d	d           ||fS d
S )a  Previously, Fortran character was incorrectly treated as
    character*1. This hook fixes the usage of the corresponding
    variables in `check`, `dimension`, `=`, and `callstatement`
    expressions.

    The usage of `char*` in `callprotoargument` expression can be left
    unchanged because C `character` is C typedef of `char`, although,
    new implementations should use `character*` in the corresponding
    expressions.

    See https://github.com/numpy/numpy/pull/19388 for more information.

    r
   c                 v    t          j        d| z   dz   | |          }t          j        d| z   dz   | |          }|S )Nz[*]\s*\br  z\b\s*[\[]\s*0\s*[\]])r   r  )varnamer  s     r(   	fix_usagez8character_backward_compatibility_hook.<locals>.fix_usagec  sF    {W,u4guEEuw)@@' 'r'   )r
  rw  r   r6  r   rt  r   Ncallstatementz
(?<![&])\br  r   zcharacter_bc_hook[r   z]: replaced `z` -> `z`
)r:  ischaracterr   r  r1   )itemrk  r   r;  rm  
parent_keyparent_valuers  r  ry  	vars_dictru  rx  vds                 r(   %character_backward_compatibility_hookr  Q  s     'r{JJC   +++r{1~''''BKN			r{1~''''BKN			I	$??,, 	: 	:KGR2 :%Igy99		: 
		BKN6*		$??,, 	O 	OKGR2 O F!G+e3S7]IO O	 
  > > >c > >"'> >/8> > >?@B B BY r'   __main__r  z-quietz-verboser8  z-fixz?Use option -f90 before -fix if Fortran 90 code is in fix form.
z-skipemptyendsz--ignore-containsz-f77z-f90r   z-hz-showz-mr  zUnknown option %s
z	OSError: a    Warning: You have specified module name for non Fortran 77 code that
  should not need one (expect if you are scanning F90 code for non
  module blocks but then you should use flag -skipemptyends and also
  be sure that the files do not contain programs without program
  statement).
z Writing fortran code to file %s
rz  )r   )r   )r,  )rC  r+   )r	   N)Nr	   )r	   )NN)r   r   )r   F)r	   F)__doc__r,   rb   r   r   r   r  r  r   r   ImportErrorr	   r   auxfuncsr   versionra  r   r   r   r   r   r   r   r   r   r   r   r   r    r   r   r   r   rC  r   r   rB  r$   r   r#   r%   r   r"   r!   r   r)   r1   	_MAXCACHEr  r   rm   r|   r   rq   rz   r}   r   r   r   r   r   r   r  r   r   r   r   r   r   rT  r   beforethisafterfortrantypesrT  r  rQ  rR  groupbegins77r   groupbegins90r   	groupendsrO  endifsrN  moduleproceduresrZ  rS  rD  rE  rG  rH  rK  rL  rM  rF  rI  rJ  rV  rY  r]  rU  rW  rX  rP  Sr?  r@  r   r2  r[  rA  r\  r-  ro  r  r  r  r  r  r  r  r  r  r  r  r  r^  r  r  r  rr  rs  r;  r(  r  r  r  r  r{  r|  r}  rE  rG  rJ  rR  rX  rg  rk  ri  rl  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rj  r)  r0  rh  r9  r:  r;  r<  r=  r5  r  r  rE  rD  rP  rF  rY  r_  re  ri  r[  r  r/  rZ  r\  funcsr   f2f3showblocklistargvr   rn   r   r   r   OSErrordetailr]  rb  r.   r&   r'   r(   <module>r     s  K KX 


      				 				            
          " 		


  
2			 	# # #L     	! 3 3A)62	 6 6A)95
 
 
A e)HQKKE	  , , ,  1 1 1   BJ/66<	
3RT::A"*12488?"*12488?"*12488>3 3 3>  0 '+! bD bD bD bDJ Drzr<t<<bdD DEKL"
?44lEb6bdh6j $jkmkoq q  "*_ 0? ?@BF FGNOBJ 24  457T; ;<CD  (r=->>F FGNOGH r=->>F FGNO7	RZr9i77? ?@EF

 rzy&&*==rtE EFMN ) #r+-=uEErtM M  "*88"$@ @AKL2:o 18 89;? ?@KL "*88"$@ @AKL"*88"$@ @AKL"*88"$@ @AKL
44bd< <=EF66> >?HI2:::BDB BCNO 
? .Q QRTRVX XYab2:@@"$H HITU bj00"$8 89?@bj00"$8 89?@rz22BD: :;BC66> >?HI
44bd< <=EFRZ..6 67<=
"*66> >?IJ
44bd< <=EF %"*_ 8M &M OQ  OS  VX  VZ  OZ[ [ ]oo 2:924A ABMN   (   A24HH\% \% \% \%~  $   &  
   > 
KRTS S%&(d, , "* f  hj  hlm m"**+-41 1 !bj@"$H H 
;= =rzHJ J $$A24HH          nD nD nDb  ( ( (4 bjErtLLrzI24Q Qrz924A A23549 9 "* G  IK  IMN N  " " "JW W Wt8, 8, 8,x   6                <   @] ] ] ]@  D( ( (V       F$ $ $&# # # # "*^RT22E E EP rz,bd33  ,  4 4 4(" " "      & (* [ [ [ [|( ( (
 "*W%%+   w w wr 2:12488    " " " "J  4 $$6== #$DbdKK #1249 9 #M2488 #$ErtLL 	" 	" 	" )+ ( ( ( (ZH H H HV      0  B B B BP  " " ""! ! !0 0 0 "$D ?" ?" ?" ?"D9  9  9 x   B C C C zEE	A	
B	
BMXabb\ 1 177qTS[[AA(]]EGG*__GEE&[[ [VXY[ [ [M"NN"""MM%%%NN&[[I"NN&[[I#NMM$YYBB'\\MM$YYBBqTS[[G)DDGG34444 	BKK 
	BMM 	2QQ 2 2 20F000111111112 LLOOOO  }   	 	 	 |E""H 3dd;6G6GGKKKmH%%T+s## 	qGGCLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 XS P s6   ) 33.2b!!c &b;;c e((e,/e,