a P}Gd=d>„d>e?ƒZ@Gd?d@„d@e"ƒZAGdAdB„dBe"ƒZBGdCdD„dDeCƒZDGdEd'„d'e"ƒZEdS)Gz0Compiles nodes from the parser into Python code.éN)Úcontextmanager)Úupdate_wrapper)ÚStringIO)Úchain)Ú iskeyword)Úescape)ÚMarkupé)Únodes)ÚTemplateAssertionError)ÚSymbols)ÚVAR_LOAD_ALIAS)ÚVAR_LOAD_PARAMETER)ÚVAR_LOAD_RESOLVE)ÚVAR_LOAD_UNDEFINED)Ú EvalContext)Ú Optimizer)Ú_PassArg)Úconcat)Ú NodeVisitor)Ú EnvironmentÚF.)Úboundz==z!=ú>z>=ú.new_func)r ÚExprÚtÚAnyrÚcastr)r r0r.r-r/Ú optimizeconst+s þ r5r"r#)Úopr!cs"tdtjtddœ‡fdd„ ƒ}|S)Nr"©r$r%r&r!cs”|jjrNˆ|jjvrN| dˆ›d¡| |j|¡| d¡| |j|¡n8| d¡| |j|¡| dˆ›d¡| |j|¡| d¡dS)Nz environment.call_binop(context, ú, ú(ú ú))Ú environmentÚ sandboxedZintercepted_binopsÚwriter,ÚleftÚright©r$r%r&©r6r.r/Úvisitor<sÿ þ  z_make_binop..visitor)r5r ÚBinExprr#©r6rCr.rBr/Ú _make_binop;srFcs"tdtjtddœ‡fdd„ ƒ}|S)Nr"r7cs`|jjr6ˆ|jjvr6| dˆ›d¡| |j|¡n| dˆ¡| |j|¡| d¡dS)Nzenvironment.call_unop(context, r8r9r;)r<r=Zintercepted_unopsr>r,r%rArBr.r/rCTsÿ þz_make_unop..visitor)r5r Ú UnaryExprr#rEr.rBr/Ú _make_unopQs rHFTr)r%r<ÚnameÚfilenameÚstreamÚ defer_initÚ optimizedr!cCsHt|tjƒstdƒ‚| ||||||¡}| |¡|durD|j ¡SdS)z+Generate the python source for a node tree.z Can't compile non template nodesN)Ú isinstancer ÚTemplateÚ TypeErrorZcode_generator_classr,rKÚgetvalue)r%r<rIrJrKrLrMÚ generatorr.r.r/Úgeneratees  ÿ  rS©Úvaluer!cCs†|dus|tus|turdSt|ƒttttttt hvr:dSt|ƒt t t t hvr`tdd„|DƒƒSt|ƒtur‚tdd„| ¡DƒƒSdS)z)Does the node have a safe representation?NTcss|]}t|ƒVqdSr(©Ú has_safe_repr)Ú.0Úvr.r.r/Ú †óz has_safe_repr..css"|]\}}t|ƒot|ƒVqdSr(rV©rXÚkrYr.r.r/rZ‰r[F)ÚNotImplementedÚEllipsisÚtypeÚboolÚintÚfloatÚcomplexÚrangeÚstrrÚtupleÚlistÚsetÚ frozensetÚallÚdictÚitems©rUr.r.r/rW}s rW)r Únamesr!cCs:t|ƒ}z|D]}| |¡qWnty2Yn0|jS)z”Check if the names passed are accessed undeclared. The return value is a set of all the undeclared names from the sequence of names found. )ÚUndeclaredNameVisitorr,Ú VisitorExitÚ undeclared)r rorCr%r.r.r/Úfind_undeclaredŽs rsc@s*eZdZejejejfddœdd„ZdS)ÚMacroRefN©r%r!cCs||_d|_d|_d|_dS©NF)r%Úaccesses_callerÚaccesses_kwargsÚaccesses_varargs©r$r%r.r.r/Ú__init__žszMacroRef.__init__) Ú__name__Ú __module__Ú __qualname__r2ÚUnionr ÚMacroÚ CallBlockr{r.r.r.r/rtsrtc@sdeZdZdZdeejdejeddœdd„Zddœdd„Z de dd œd d „Z ddœd d„Z e Z dS)r#z&Holds compile time information for us.N)r*ÚparentÚlevelr!cCs~||_||_|dur4t|d|_d|_d|_d|_n(t|j|d|_|j|_|j|_|j|_d|_d|_d|_ d|_ d|_ dS)N©rƒF) r*r‚r ÚsymbolsÚrequire_output_checkÚbufferÚblockÚtoplevelÚ rootlevelÚ loop_frameÚ block_frameÚ soft_frame)r$r*r‚rƒr.r.r/r{¨s  zFrame.__init__©r!cCs*t |j¡}|j |j¡|j ¡|_|S)z!Create a copy of the current one.)ÚobjectÚ__new__Ú __class__Ú__dict__Úupdater…Úcopy©r$Úrvr.r.r/r”Ûs  z Frame.copyF)Úisolatedr!cCs&|rt|j|jjddSt|j|ƒS)zReturn an inner frame.r r„)r#r*r…rƒ)r$r—r.r.r/Úinnerâsz Frame.innercCs| ¡}d|_d|_|S)a&Return a soft frame. A soft frame may not be modified as standalone thing as it shares the resources with the frame it was created of, but it's not a rootlevel frame any longer. This is only used to implement if-statements and conditional expressions. FT)r”rŠrr•r.r.r/Úsoftèsz Frame.soft)NN)F)r|r}r~Ú__doc__rr2ÚOptionalrbr{r”rar˜r™Ú__copy__r.r.r.r/r#¥süû 3 c@seZdZdZdS)rqz?Exception used by the `UndeclaredNameVisitor` to signal a stop.N©r|r}r~ršr.r.r.r/rqøsrqc@sTeZdZdZddœdd„Zejddœdd„Zejddœd d „Z ej ddœd d „Z dS) ÚDependencyFinderVisitorz.A visitor that collects filter and test calls.NrŽcCstƒ|_tƒ|_dSr()riÚfiltersÚtests©r$r.r.r/r{ÿsz DependencyFinderVisitor.__init__rucCs| |¡|j |j¡dSr()Ú generic_visitrŸÚaddrIrzr.r.r/Ú visit_Filters z$DependencyFinderVisitor.visit_FiltercCs| |¡|j |j¡dSr()r¢r r£rIrzr.r.r/Ú visit_Tests z"DependencyFinderVisitor.visit_TestcCsdS)zStop visiting at blocks.Nr.rzr.r.r/Ú visit_Block sz#DependencyFinderVisitor.visit_Block) r|r}r~ršr{r ÚFilterr¤ÚTestr¥ÚBlockr¦r.r.r.r/ržüs ržc@sJeZdZdZejeddœdd„Zej ddœdd„Z ej ddœd d „Z dS) rpz¡A visitor that checks if a name is accessed without being declared. This is different from the frame visitor as it will not stop at closure frames. N)ror!cCst|ƒ|_tƒ|_dSr()rirorr)r$ror.r.r/r{s zUndeclaredNameVisitor.__init__rucCsJ|jdkr8|j|jvr8|j |j¡|j|jkrFtƒ‚n|j |j¡dS)NÚload)ÚctxrIrorrr£rqÚdiscardrzr.r.r/Ú visit_Names  z UndeclaredNameVisitor.visit_NamecCsdS)zStop visiting a blocks.Nr.rzr.r.r/r¦!sz!UndeclaredNameVisitor.visit_Block) r|r}r~ršr2ÚIterablerfr{r ÚNamer­r©r¦r.r.r.r/rpsrpc@seZdZdZdS)Ú CompilerExitz¼Raised if the compiler encountered a situation where it just doesn't make sense to further process the code. Any block that raises such an exception is not further processed. Nrr.r.r.r/r°%sr°c @sJeZdZUdëdejeejeejejeeddœdd„Ze edœd d „ƒZ ee d d œd d„Z edœdd„Z eddœdd„Zdìeeddœdd„Zddœdd„Zdíe ddœdd„Zdîeejejddœdd„Zeddœd d!„Zdïeeejejdd"œd#d$„Zejejedd%œd&d'„Zedd(œd)d*„Zdðeejeje dd,œd-d.„Zdñejeje dd/œd0d1„Zdòejejejej feejej!eej"fdd2œd3d4„Z#ejejdd5œd6d7„Z$eddœd8d9„Z%dóeedd:œd;d<„Z&dôeeed?œd@dA„Z'eedBœdCdD„Z(ejej)ej*feej+ee,fdEœdFdG„Z-e,eddHœdIdJ„Z.ejedKœdLdM„Z/eedœdNdO„Z0ddœdPdQ„Z1eddœdRdS„Z2ddœdTdU„Z3eddVœdWdX„Z4eddVœdYdZ„Z5ddœd[d\„Z6edœd]d^„Z7edœd_d`„Z8eedœdadb„Z9eedVœdcdd„Z:ddœdedf„Z;eddœdgdh„Zej?eddEœdkdl„Z@ejAeddEœdmdn„ZBejCeddEœdodp„ZDejejEejFfeddEœdqdr„ZGejEeddEœdsdt„ZHejFeddEœdudv„ZIejJeddEœdwdx„ZKejLeddEœdydz„ZMej)eddEœd{d|„ZNej*eddEœd}d~„ZOejPeddEœdd€„ZQejReddEœdd‚„ZSejTeddEœdƒd„„ZUGd…d†„d†ejVƒZWeXej"ej"d‡œdˆd‰„ƒZYdZZejeWe[dŠ<eWdœd‹dŒ„Z\ejej"edœdŽd„Z]ej^eeWedœd‘d’„Z_ej^eeWddœd“d”„Z`ej^eeWddœd•d–„ZaejbeddEœd—d˜„ZcejdeddEœd™dš„ZeejfeddEœd›dœ„ZgejheddEœddž„ZiejjeddEœdŸd „ZkejleddEœd¡d¢„ZmejneddEœd£d¤„Zoej+eddEœd¥d¦„ZpejqeddEœd§d¨„ZrejseddEœd©dª„Zteud«ƒZveud¬ƒZweud­ƒZxeud®ƒZyeud¯ƒZzeud°ƒZ{eud±ƒZ|eud²ƒZ}eud³ƒZ~ed«ƒZ€ed¬ƒZed´ƒZ‚eƒej„eddEœdµd¶„ƒZ…eƒej†eddEœd·d¸„ƒZ‡ejˆeddEœd¹dº„Z‰eƒejŠeddEœd»d¼„ƒZ‹eƒejŒeddEœd½d¾„ƒZejŽeddEœd¿dÀ„Zeejejej feeej‘ddÁœdÂdăZ’eƒejeddEœdÄdÅ„ƒZ“eƒej eddEœdÆdÇ„ƒZ”eƒej•eddEœdÈdÉ„ƒZ–eƒdöejeeddÊœdËdÌ„ƒZ—ej˜eddEœdÍd΄Z™ejšeddEœdÏdЄZ›ejœeddEœdÑdÒ„ZejžeddEœdÓdÔ„ZŸej eddEœdÕdÖ„Z¡ej¢eddEœd×dØ„Z£ej¤eddEœdÙdÚ„Z¥ej¦eddEœdÛdÜ„Z§ej¨eddEœdÝdÞ„Z©ejªeddEœdßdà„Z«ej¬eddEœdádâ„Z­ej®eddEœdãdä„Z¯ej°eddEœdådæ„Z±ej²eddEœdçdè„Z³ej´eddEœdédê„ZµdS)÷r"NFTr)r<rIrJrKrLrMr!cCs²|durtƒ}||_||_||_||_d|_||_d|_|rFt|ƒ|_i|_ i|_ d|_ d|_ d|_ i|_i|_g|_d|_d|_d|_d|_d|_d|_g|_g|_dg|_dS)NFrr TÚcontext)rr<rIrJrKZcreated_block_contextrLr)rÚimport_aliasesÚblocksÚextends_so_farÚhas_known_extendsÚ code_linenor rŸÚ debug_infoÚ_write_debug_infoÚ _new_linesÚ _last_lineÚ _first_writeÚ_last_identifierÚ _indentationÚ _assign_stackÚ_param_def_blockÚ_context_reference_stack)r$r<rIrJrKrLrMr.r.r/r{-s8  zCodeGenerator.__init__rŽcCs |jduSr()r)r¡r.r.r/rMvszCodeGenerator.optimizedz te.NoReturn)ÚmsgÚlinenor!cCst|||j|jƒ‚dS)z*Fail with a :exc:`TemplateAssertionError`.N)r rIrJ)r$rÁrÂr.r.r/Úfail|szCodeGenerator.failcCs|jd7_d|j›S)zGet a new unique identifier.r Zt_)r¼r¡r.r.r/Útemporary_identifier€sz"CodeGenerator.temporary_identifier)r&r!cCs | ¡|_| |j›d¡dS)z7Enable buffering for the frame from that point onwards.z = []N)rÄr‡Ú writeline©r$r&r.r.r/r‡…s zCodeGenerator.buffer)r&Úforce_unescapedr!cCs¤|sŒ|jjrl| d¡| ¡| d|j›d¡| ¡| d¡| ¡| d|j›d¡| ¡dS|jjrŒ| d|j›d¡dS| d|j›d¡dS)z(Return the buffer contents of the frame.zif context.eval_ctx.autoescape:zreturn Markup(concat(ú))úelse:zreturn concat(r;N)r*r+rÅÚindentr‡ÚoutdentÚ autoescape)r$r&rÇr.r.r/Úreturn_buffer_contentsŠs  z$CodeGenerator.return_buffer_contentscCs|jd7_dS)zIndent by one.r N©r½r¡r.r.r/rÊžszCodeGenerator.indentr )Ústepr!cCs|j|8_dS)zOutdent by step.NrÎ)r$rÏr.r.r/rË¢szCodeGenerator.outdent)r&r%r!cCs0|jdur| d|¡n| |j›d|¡dS)z%Yield or write into the frame buffer.Núyield ú.append()r‡rÅ)r$r&r%r.r.r/Ú start_write¦s zCodeGenerator.start_writecCs|jdur| d¡dS)z1End the writing process started by `start_write`.Nr;)r‡r>rÆr.r.r/Ú end_write­s zCodeGenerator.end_write)Úsr&r%r!cCs$| ||¡| |¡| |¡dS)z4Simple shortcut for start_write + write + end_write.N)rÒr>rÓ)r$rÔr&r%r.r.r/Ú simple_write²s  zCodeGenerator.simple_write)r r&r!cCs<z$| d¡|D]}| ||¡qWnty6Yn0dS)z•Visit a list of nodes as block in a frame. If the current frame is no buffer a dummy ``if 0: yield None`` is written automatically. ÚpassN)rÅr,r°)r$r r&r%r.r.r/Ú blockvisitºs   zCodeGenerator.blockvisit)Úxr!cCs€|jrp|jsR|j d|j¡|j|j7_|jdurR|j |j|jf¡d|_d|_|j d|j¡d|_|j |¡dS)z&Write a string into the output stream.Ú NFz r) r¹r»rKr>r¶r¸r·Úappendr½)r$rØr.r.r/r>Ås zCodeGenerator.writer)rØr%Úextrar!cCs| ||¡| |¡dS)z!Combination of newline and write.N)Únewliner>)r$rØr%rÛr.r.r/rÅÓs zCodeGenerator.writeline)r%rÛr!cCs:t|jd|ƒ|_|dur6|j|jkr6|j|_|j|_dS)z/Add one or more newlines before the next write.r N)Úmaxr¹rÂrºr¸)r$r%rÛr.r.r/rÜÚszCodeGenerator.newline)r%r&Ú extra_kwargsr!c Cs²tdd„tdd„|jDƒ|pdƒDƒƒ}|jD]}| d¡| ||¡q.|s |jD]}| d¡| ||¡qT|dur | ¡D]\}}| d|›d|›¡q€|jr¾| d¡| |j|¡|rŠ|jdurÚ| d ¡n | d ¡|jD].}| |j ›d ¡| |j |¡| d¡qê|durN| ¡D] \}}| |›d |›d¡q,|jdur~| d ¡| |j|¡| d ¡n | d¡n$|jdur®| d¡| |j|¡dS)a+Writes a function call to the stream for the current node. A leading comma is added automatically. The extra keyword arguments may not include python keywords otherwise a syntax error could occur. The extra keyword arguments should be given as python dict. css|]}tt t|¡ƒVqdSr()Úis_python_keywordr2r4rf)rXr]r.r.r/rZïsÿz*CodeGenerator.signature..css|] }|jVqdSr()Úkey©rXrØr.r.r/rZñr[r.r8Nú=z, *z , **dict({z, **{ú: z}, **r;ú}z, **) Úanyrr'Úargsr>r,rmZdyn_argsZ dyn_kwargsràrU) r$r%r&rÞZkwarg_workaroundÚargÚkwargràrUr.r.r/Ú signatureásFþ                 zCodeGenerator.signature)r r!c Cs tƒ}|D]}| |¡q |j|jdf|j|jdffD]Ð\}}}t|ƒD]¼}||vr`| ¡||<| d¡| ¡| ||›d|›d|›d¡| ¡| d¡| ¡| d¡| d ||›d ¡| ¡| d |d d …›d|›d¡| ¡| ¡qHq6d S)aæFind all filter and test names used in the template and assign them to variables in the compiled namespace. Checking that the names are registered with the environment is done when compiling the Filter and Test nodes. If the node is in an If or CondExpr node, the check is done at runtime instead. .. versionchanged:: 3.0 Filters and tests in If and CondExpr nodes are checked at runtime instead of compile time. rŸr útry:z = environment.ú[ú]zexcept KeyError:z @internalcodeúdef z (*unused):zraise TemplateRuntimeError("No Néÿÿÿÿú named z found.")) ržr,rŸr ÚsortedrÄrÅrÊrË)r$r rCr%Zid_maproZ dependencyrIr.r.r/Úpull_dependenciess6   ý      ÿÿzCodeGenerator.pull_dependenciesc Csªg}|jj ¡D]z\}\}}|tkr&q|tkrP| |›d| ¡›d|›d¡q|tkrn| |›d|›¡q|tkr‚|  |¡qt dƒ‚q|r¦| d  |¡›d¡dS)Nú = r9r;zunknown load instructionú = missing) r…ÚloadsrmrrrÅÚget_resolve_funcr rrÚÚNotImplementedErrorÚjoin)r$r&ÚundefsÚtargetÚactionZparamr.r.r/Ú enter_frameEs"  zCodeGenerator.enter_frame)r&Úwith_python_scoper!cCs>|s:g}|jjD]}| |¡q|r:| d |¡›d¡dS)Nròró)r…rôrÚrÅr÷)r$r&rürørùr.r.r/Ú leave_frameUs   zCodeGenerator.leave_frameúasync Ú)Ú async_valueÚ sync_valuer!cCs|jjr |S|Sr()r<Úis_async)r$rrr.r.r/Ú choose_async]szCodeGenerator.choose_async)rIr!cCs| ¡›d|›S)Nrí)r)r$rIr.r.r/Úfunc`szCodeGenerator.func)r%r&r!c Cs–| ¡}|j |¡t|ƒ}d}tƒ}g}t|jƒD]@\}}|jdkrJ|}|jdvr`| |j¡|  |j  |j¡¡q4t |j dƒ} d| vræ|durÎz|j |t|jƒWqàtyÊ| d|j¡Yqà0n|  |j d¡¡d|_d| vrd|vr|  |j d¡¡d|_d| vr>d|vr>|  |j d¡¡d|_d |_|j |¡| | d ¡›d d  |¡›d |¡| ¡| |¡| |¡| |¡t|jƒD]®\}}|j  |j¡} | d| ›d¡| ¡z|j |t|jƒ} Wn4ty | | ›d|j›d|j›d¡Yn0| | ›d¡| | |¡| | ¡|  ¡q¤| !¡| "|j |¡|j#|dd|j$|dd|  ¡||fS)z/Dump the function def of a macro or call block.NÚcaller)r'Úvarargs)rr'rzhWhen defining macros or call blocks the special "caller" argument must be omitted or be given a default.Tr'rFZmacror9r8ú):úif ú is missing:z = undefined("parameter z was not provided", name=r;rò)rÇ©rü)%r˜r…Ú analyze_nodertriÚ enumeraterærIr£rÚÚrefrsÚbodyÚdefaultsÚlenÚ IndexErrorrÃrÂÚdeclare_parameterrwrxryr†rÅrr÷rÊr‡rûÚpush_parameter_definitionsr,Úmark_parameter_storedrËÚpop_parameter_definitionsr×rÍrý) r$r%r&Ú macro_refZexplicit_callerZskip_special_paramsræÚidxrçrrr Údefaultr.r.r/Ú macro_bodycsv      ü  $   ÿÿ    zCodeGenerator.macro_body)rr&r!c Csrd dd„|jjDƒ¡}t|jddƒ}t|jjƒdkr>|d7}| d|›d |›d |j›d|j›d|j›d ¡dS) z.rINr ú,zMacro(environment, macro, z, (z), z, context.eval_ctx.autoescape)) r÷r%ræÚgetattrrr>rxryrw)r$rr&Z arg_tuplerIr.r.r/Ú macro_def¶sÿÿþÿzCodeGenerator.macro_defrucCs*d|j›}|jdur&|›d|j›}|S)z.Return a human readable position for the node.zline Nú in )rÂrI)r$r%r–r.r.r/ÚpositionÂs  zCodeGenerator.positioncCs*d dd„|j ¡ ¡Dƒ¡}d|›dS)Nr8css |]\}}|›d|›VqdS©rãNr.)rXrIrùr.r.r/rZÊsÿz3CodeGenerator.dump_local_context..ú{rä)r÷r…Z dump_storesrm)r$r&Zitems_kvr.r.r/Údump_local_contextÉs  þz CodeGenerator.dump_local_contextcCs6| d¡| d¡| d¡| d¡| d¡dS)z·Writes a common preamble that is used by root and block functions. Primarily this sets up common local helpers and enforces a generator through a dead branch. z$resolve = context.resolve_or_missingz!undefined = environment.undefinedzconcat = environment.concatzcond_expr_undefined = Undefinedzif 0: yield NoneN©rÅr¡r.r.r/Ú write_commonsÐs     zCodeGenerator.write_commonscCs|j |j ¡¡dS)aQPushes all parameter targets from the given frame into a local stack that permits tracking of yet to be assigned parameters. In particular this enables the optimization from `visit_Name` to skip undefined expressions for parameters in macros as macros can reference otherwise unbound parameters. N)r¿rÚr…Zdump_param_targetsrÆr.r.r/rÝsz(CodeGenerator.push_parameter_definitionscCs|j ¡dS)z+Pops the current parameter definitions set.N)r¿Úpopr¡r.r.r/ræsz'CodeGenerator.pop_parameter_definitions)rùr!cCs|jr|jd |¡dS)z€Marks a parameter in the current parameter definitions as stored. This will skip the enforced undefined checks. rîN)r¿r¬©r$rùr.r.r/rêsz#CodeGenerator.mark_parameter_storedcCs|j |¡dSr()rÀrÚr&r.r.r/Úpush_context_referenceñsz$CodeGenerator.push_context_referencecCs|j ¡dSr()rÀr%r¡r.r.r/Úpop_context_referenceôsz#CodeGenerator.pop_context_referencecCs |jdS)Nrî©rÀr¡r.r.r/Úget_context_ref÷szCodeGenerator.get_context_refcCs |jd}|dkrdS|›dS)Nrîr±Úresolvez.resolver)r&r.r.r/rõús zCodeGenerator.get_resolve_funccCs| ¡›d| |¡›dS)Nz .derived(r;)r*r"rÆr.r.r/Úderive_contextszCodeGenerator.derive_contextcCs|js dS||jdvS)z4Checks if a given target is an undeclared parameter.Frî)r¿r&r.r.r/Úparameter_is_undeclaredsz%CodeGenerator.parameter_is_undeclaredcCs|j tƒ¡dS)z+Pushes a new layer for assignment tracking.N)r¾rÚrir¡r.r.r/Úpush_assign_tracking sz"CodeGenerator.push_assign_trackingcCsˆ|j ¡}|js|js|jr |s$dSdd„|Dƒ}t|ƒdkr®tt|ƒƒ}|j  |¡}|jrv|  d|›d|›¡dS|jr–|  d|›d|›¡dS|  d|›d|›¡nx|jrÀ|  d ¡n|jrÒ|  d ¡n |  d ¡t |ƒD]6\}}|rú|  d ¡|j  |¡}|  |›d |›¡qä|  d¡|js„|js„|r„t|ƒdkrb|  d|d›d¡n"d   tt|ƒ¡}|  d|›d¡dS)zoPops the topmost level for assignment tracking and updates the context variables if necessary. NcSs g|]}|dd…dkr|‘qS)Nr Ú_r.rár.r.r/Ú r[z5CodeGenerator.pop_assign_tracking..r z _loop_vars[ú] = z _block_vars[ú context.vars[z_loop_vars.update({z_block_vars.update({úcontext.vars.update({r8rãú})úcontext.exported_vars.add(rr;zcontext.exported_vars.update((rÈ)r¾r%rŒr‹r‰rÚnextÚiterr…r rÅr r>r÷Úmapr)r$r&ÚvarsZ public_namesrIr rÚ names_strr.r.r/Úpop_assign_tracking sJ ÿþýü         z!CodeGenerator.pop_assign_trackingc Cs |dusJdƒ‚t|j|jƒ}ddlm}m}|jjrDt||ƒ}nt|ƒ}| dd  |¡¡|j rjdnd}|  t j ¡du}| t j¡D]4} | j|jvr²| d| j›d | j¡| |j| j<qŠ| t j¡D]v} | j|jvrÌ| j} | ¡|j| <} d | vr,|  d d¡\} }| d | ›d |›d | ›¡qÌ| d| ›d | ›¡qÌ| d|j›¡|j| d¡›d|›ddd| ¡| ¡t|ƒ}dt|jdƒvr¼|j d¡}| |›d¡|j  |¡d|_!|_"|oà|j# |_$|rô| d¡| %|¡| &|j¡| '|j|¡|j(|dd| )¡|r¢|j#sN| ¡| d¡| ¡|jjsl| d¡n$| d¡| ¡| d¡| )¡| )d|j# ¡|j *¡D]\}} | | d|¡›d|›d| d¡| ¡| ¡t|ƒ}d|_+t| jdƒ}d|vr*|j d¡}| |›d¡d |vr\|j d ¡}| |›d!|›d"|›d#¡|j  | ¡||_,| d$¡| %|¡| &| j¡| '| j|¡|j(|dd| )¡q¬d  d%d&„|jDƒ¡}|jd'|›d(ddd)  d*d&„|j-Dƒ¡}| d+|›¡dS),Nzno root frame allowedr )ÚexportedÚasync_exportedzfrom jinja2.runtime import r8rÿz, environment=environmentzblock z defined twiceÚ.zfrom z import z as zimport zname = Úrootz(context, missing=missingr)rÛr$r¡z = TemplateReference(context)Tzparent_template = Noner úif parent_template is not None:z4yield from parent_template.root_render_func(context)z=async for event in parent_template.root_render_func(context):z yield eventZblock_)r$ÚsuperrAz = context.super(z, block_r;z_block_vars = {}css|]}|›d|›VqdS)z: block_Nr.rár.r.r/rZ«r[z/CodeGenerator.visit_Template..z blocks = {räú&css |]\}}|›d|›VqdS)râNr.r\r.r.r/rZ­r[z debug_info = ).rr<rIZruntimer<r=rrðrÅr÷rLÚfindr ÚExtendsÚfind_allr©r³rÃrÂÚ ImportedNameÚ importnamer²rÄÚrsplitrrÊr$r#rsrr…rr r‰rŠrµr†rûrñr×rýrËrmrŒrˆr·)r$r%r&r*r<r=Zexported_namesZenvenvZ have_extendsrˆÚimport_ÚimpÚaliasÚmoduleÚobjr rIrŒrrZ blocks_kv_strZ debug_kv_strr.r.r/Úvisit_Template:s¨   ÿ         ÿ ý          zCodeGenerator.visit_TemplatecCsd}|jr8|jrdS|jdkr8| d¡| ¡|d7}|jrJ| |¡}n| ¡}|jr”| d|j ›d|¡| ¡| d|j ›d|¡|  ¡|j j sÄ|j durÄ| d |j ›d |›d |¡n@| | ¡›d |j ›d |›d |¡| ¡| d|¡|  ¡|  |¡dS)z.Call a block and register it for the template.rNúif parent_template is None:r zif len(context.blocks[z]) <= 1:z+raise TemplateRuntimeError("Required block z not found")zyield from context.blocks[z][0](r;zfor event in context.blocks[rÚevent)r‰rµr´rÅrÊÚscopedr,r*ÚrequiredrIrËr<rr‡rrÕ)r$r%r&rƒr±r.r.r/r¦°sF    þÿ ÿÿý zCodeGenerator.visit_BlockcCsÆ|js| d|j¡|jdkrV|js6| d¡| ¡| d¡|jrNtƒ‚n| ¡| d|¡|  |j |¡|  d|j ›d¡| d¡| ¡| d ¡| ¡|j r´d |_|jd 7_d S) zCalls the extender.z,cannot use extend from a non top-level scoperr@z5raise TemplateRuntimeError("extended multiple times")z+parent_template = environment.get_template(r8r;z9for name, parent_block in parent_template.blocks.items():z8context.blocks.setdefault(name, []).append(parent_block)Tr N)r‰rÃrÂr´rµrÅrÊr°rËr,Útemplater>rIrŠrAr.r.r/Ú visit_ExtendsÛs(      zCodeGenerator.visit_ExtendscCsp|jr| d¡| ¡d}t|jtjƒrVt|jjtƒr>d}qnt|jjt t fƒrnd}nt|jtj tj fƒrnd}| d|›d|¡|  |j|¡| d|j›d¡|jrè| ¡| d ¡| ¡| d ¡| ¡| d ¡| ¡d }|jr| | ¡›d | |¡›d¡n$|jjr,| d¡n| d¡d}|s\| ¡| d|¡| ¡|jrl| ¡dS)zHandles includes.rêZget_or_select_templateZ get_templateZselect_templateztemplate = environment.r9r8r;zexcept TemplateNotFound:rÖrÉFzUfor event in template.root_render_func(template.new_context(context.get_all(), True, z)):zGfor event in (await template._get_default_module_async())._body_stream:z6yield from template._get_default_module()._body_streamTrPN)Zignore_missingrÅrÊrNrSr ÚConstrUrfrgrhÚTupleÚListr,r>rIrËÚ with_contextrr"r<rrÕ)r$r%r&Ú func_nameZskip_event_yieldr.r.r/Ú visit_IncludesR     þÿ ÿ  zCodeGenerator.visit_IncludecCsˆ| | d¡›d¡| |j|¡| d|j›d¡|jrld| d¡›}| |›d| |¡›d¡n| d | d¡›d ¡dS) Núawait zenvironment.get_template(r8z).Z make_moduleZ_asyncz(context.get_all(), True, r;Z_get_default_modulez (context))r>rr,rSrIrXr")r$r%r&Zf_namer.r.r/Ú_import_common9sÿzCodeGenerator._import_commoncCsl| |j |j¡›d|¡|jr6| d|j›d¡| ||¡|jrh|j d¡sh| d|j›d¡dS)zVisit regular imports.ròr2r1r/úcontext.exported_vars.discard(r;N)rÅr…r rùr‰r>r\Ú startswithrAr.r.r/Ú visit_ImportHs  zCodeGenerator.visit_Importc sª| |¡| d¡| |ˆ¡g}g}|jD]Â}t|tƒrF|\}}n|}| ˆj |¡›d|›d¡| dˆj |¡›d¡|  ¡d|  |¡›d|›}| ˆj |¡›d|›d |›d ¡|  ¡ˆj r.|  |¡| d ¡s.|  |¡q.|rXt|ƒd kr.|d }| d|›dˆj |¡›¡n*d ‡fdd„|Dƒ¡}| d|›d¡|r¦t|ƒd kr„| d|d ›d ¡n"d tt|ƒ¡} | d| ›d¡dS)zVisit named imports.zincluded_template = z = getattr(included_template, z , missing)rr z9the template {included_template.__name__!r} (imported on z%) does not export the requested name z = undefined(fz, name=r;r/r rr2r1r8c3s$|]}|›dˆj |¡›VqdSr )r…r )rXrI©r&r.r/rZxsz1CodeGenerator.visit_FromImport..r3r4r]z)context.exported_vars.difference_update((rÈN)rÜr>r\rorNrgrÅr…r rÊrrËr‰rÚr^rr÷r8r) r$r%r&Z var_namesZdiscarded_namesrIrKÚmessageZnames_kvr:r.r`r/Úvisit_FromImportSsZ      ÿÿÿþÿÿ    ÿ ÿzCodeGenerator.visit_FromImportc Cs€| ¡}d|_| ¡}| ¡}|jpRdt|jdddƒvpRtdd„| tj¡Dƒƒ}d}|rh|j   d¡}|j j |dd |j rŽ|j j |d d |j r†| ¡}|j j |d d | | |¡›d |j ¡| ¡| |¡| | d d¡¡| |j|¡| d¡| | dd¡¡| d¡| ¡| d|j ¡| |j |¡| d¡| ¡| d¡| |j|¡| d¡|j|dd|jrÀ| | d¡›d|¡| ¡| |¡|j|_|rÖ| |›d¡| tj¡D],} | jdkrâ| jdkrâ| d| j¡qâ|j r0| ¡} | | ›d¡| | d d¡|¡| |j|¡|rx| d|›d| d¡›d¡n | d¡|j rš| |›d¡|jr®| d ¡nB|jj rÈ|sÈ| d!¡| |j!|¡|jj rð|sð| d"¡|j r| d"¡|jr| d#¡n| |r$d$nd¡| ¡| |¡| d%¡| "|j#|¡|j rl| | ›d&¡| ¡|j||joˆ|j d|j rÚ| d| ›d¡| ¡| |¡| "|j |¡| |¡| ¡|jr`| $|¡| ¡| %||¡| | d'¡›d(¡|jj r*| d!¡| |j!|¡|jj rL| d"¡| d)¡| &|¡|j'r||j'd* (|j j)¡dS)+NTÚloop)r)Zonly)rccss|] }|jVqdSr()rQ)rXrˆr.r.r/rZ’r[z*CodeGenerator.visit_For..r)Z for_branchÚelseÚtestz(fiter):z async for zfor rzauto_aiter(fiter)Zfiterú:rrÐér z%(reciter, loop_render_func, depth=0):róÚstorez8Can't assign to special loop variable in for-loop targetz = 1r8ZAsyncz LoopContext(r9Zreciterz auto_aiter(r;z&, undefined, loop_render_func, depth):z , undefined):z_loop_vars = {}z = 0r[zloop(z, loop)rî)*r˜r‹Ú recursiversZiter_child_nodesrårEr r©r…rr Úelse_rerÄrÅrrÊrûrr,rùr>rËrýr‡r¯r«rIrÃrÂr<rr7r×rrÍrÒrÓr¾Údifference_updateZstores) r$r%r&r‹Z test_frameZ else_frameZ extended_loopZloop_refZloop_filter_funcrIZiteration_indicatorr.r.r/Ú visit_For…sÒÿÿü       ÿ þ         ÿ          zCodeGenerator.visit_ForcCsÊ| ¡}| d|¡| |j|¡| d¡| ¡| |j|¡| ¡|j D]F}| d|¡| |j|¡| d¡| ¡| |j|¡| ¡qP|j rÆ| d¡| ¡| |j |¡| ¡dS)Nrrfzelif rÉ) r™rÅr,rer>rÊr×rrËÚelif_rj)r$r%r&Zif_framermr.r.r/Úvisit_Ifs&       zCodeGenerator.visit_IfcCs|| ||¡\}}| ¡|jrR|j d¡s>| d|j›d¡| d|j›d¡| |j |j¡›d¡|  ||¡dS)Nr/r5r;r2r1rò) rrÜr‰rIr^r>rÅr…r r)r$r%r&Z macro_framerr.r.r/Ú visit_Macro%s zCodeGenerator.visit_MacrocCsR| ||¡\}}| d¡| ||¡| ||¡|j|j|dd| |¡dS)Nz caller = T)Úforward_caller)rrÅrrÒÚ visit_CallÚcallrÓ)r$r%r&Z call_framerr.r.r/Úvisit_CallBlock/s    zCodeGenerator.visit_CallBlockcCsh| ¡}|j |¡| |¡| |¡| |j|¡| ||¡| |j |¡|  |¡|  |¡dSr() r˜r…r rûr‡r×rrÒr¤ÚfilterrÓrý)r$r%r&Z filter_framer.r.r/Úvisit_FilterBlock7s     zCodeGenerator.visit_FilterBlockcCs|| ¡}|j |¡| |¡t|j|jƒD]2\}}| ¡| ||¡|  d¡| ||¡q,|  |j |¡|  |¡dS©Nrò) r˜r…r rûÚzipÚtargetsÚvaluesrÜr,r>r×rrý)r$r%r&Z with_framerùÚexprr.r.r/Ú visit_WithBs    zCodeGenerator.visit_WithcCs| |¡| |j|¡dSr()rÜr,r%rAr.r.r/Úvisit_ExprStmtNs zCodeGenerator.visit_ExprStmtc@s4eZdZUejejdefed<ejeed<dS)zCodeGenerator._FinalizeInfo.ÚconstÚsrcN)r|r}r~r2r›ÚCallablerfÚ__annotations__r.r.r.r/Ú _FinalizeInfoRs rrTcCst|ƒS)z¼The default finalize function if the environment isn't configured with one. Or, if the environment has one, this is called on that function's output for constants. )rfrnr.r.r/Ú_default_finalizeVszCodeGenerator._default_finalizeÚ _finalizecsˆjdurˆjSˆj}‰d}ˆjjr®d}ˆjj‰tjdtjdtjdi t ˆ¡¡}d}|dur|t j t j dœ‡‡fdd„ }n2|›|›d }|dkr®t j t j dœ‡‡‡fd d„ }ˆ  ||¡ˆ_ˆjS) a‰Build the finalize function to be used on constants and at runtime. Cached so it's only created once for all output nodes. Returns a ``namedtuple`` with the following attributes: ``const`` A function to finalize constant data at compile time. ``src`` Source code to output around nodes to be evaluated at runtime. Nzenvironment.finalize(r±úcontext.eval_ctxr<rTcs ˆˆ|ƒƒSr(r.rn)rÚ env_finalizer.r/Úfinalize‚sz.CodeGenerator._make_finalize..finalizer8csˆˆˆj|ƒƒSr()r<rn©rr…r$r.r/r†Šs) rƒr‚r<r†rr±Ú eval_contextÚgetÚfrom_objr2r3r)r$r†r~Úpass_argr.r‡r/Ú_make_finalize`s*  ýûzCodeGenerator._make_finalize)Úgroupr!cCs tt|ƒƒS)z™Given a group of constant values converted from ``Output`` child nodes, produce a string to write to the template module source. )rr)r$rr.r.r/Ú_output_const_reprsz CodeGenerator._output_const_repr)r%r&r†r!cCs:| |j¡}|jjrt|ƒ}t|tjƒr0t|ƒS| |¡S)aCTry to optimize a child of an ``Output`` node by trying to convert it to constant, finalized data at compile time. If :exc:`Impossible` is raised, the node is not constant and will be evaluated at runtime. Any other exception will also be evaluated at runtime for easier debugging. ) Úas_constr*rÌrrNr Ú TemplateDatarfr})r$r%r&r†r}r.r.r/Ú_output_child_to_const—s  z$CodeGenerator._output_child_to_constcCsL|jjr| d¡n|jjr(| d¡n | d¡|jdurH| |j¡dS)zXOutput extra source code before visiting a child of an ``Output`` node. z1(escape if context.eval_ctx.autoescape else str)(zescape(zstr(N)r*r+r>rÌr~©r$r%r&r†r.r.r/Ú_output_child_pre¬s    zCodeGenerator._output_child_precCs"| d¡|jdur| d¡dS)zWOutput extra source code after visiting a child of an ``Output`` node. r;N)r>r~r’r.r.r/Ú_output_child_post¼s  z CodeGenerator._output_child_postc Csö|jr"|jrdS| d¡| ¡| ¡}g}|jD]†}z,|jsTt|tjƒsTt  ¡‚|  |||¡}Wn&tj t fyŠ|  |¡Yq4Yn0|r®t|dt ƒr®|d  |¡q4|  |g¡q4|jdurt|ƒdkrè| |j›d¡n| |j›d¡| ¡|D]ª}t|t ƒrL| |¡}|jdur<| d|¡n| |d¡nb|jdurf| d|¡n | |¡| |||¡| ||¡| |||¡|jdur| d¡q|jdurâ| ¡| t|ƒdkrÜdnd ¡|jrò| ¡dS) NrOrîr rÑz .extend((rÐrr;rÈ)r†rµrÅrÊrŒr r}rNrÚ Impossibler‘Ú ExceptionrÚrhr‡rrŽrÜr“r,r”r>rË) r$r%r&r†rÚchildr}ÚitemÚvalr.r.r/Ú visit_OutputÇsZ  ý ú            zCodeGenerator.visit_OutputcCsF| ¡| |¡| |j|¡| d¡| |j|¡| |¡dSrv)r.rÜr,rùr>r%r;rAr.r.r/Ú visit_Assigns   zCodeGenerator.visit_AssigncCs¶| ¡| ¡}d|_|j |¡| |¡| |¡| |j|¡|  |¡|  |j |¡|  d¡|j dur€| |j |¡n|  d|j›d¡|  d¡| |¡| |¡dS)NFz9 = (Markup if context.eval_ctx.autoescape else identity)(úconcat(r;)r.r˜r†r…r rûr‡r×rrÜr,rùr>rtr¤r;rý)r$r%r&rŒr.r.r/Úvisit_AssignBlocks         zCodeGenerator.visit_AssignBlockc Cs¨|jdkr4|js|js|jr4|jr4|jd |j¡|j |j¡}|jdkrš|j  |¡}|durv|dt krv|  |¡rš|  d|j›d|›d|›d¡dS|  |¡dS) Nrhrîrªrz(undefined(name=z) if z is missing else r;) r«r‰r‹rŒr¾r£rIr…r Z find_loadrr-r>)r$r%r&r rªr.r.r/r­6s. ÿÿÿ  ÿ þýÿzCodeGenerator.visit_NamecCsV|j |j¡}| d|›d¡| ¡| d¡| ¡| |›d|j›d¡dS)Nzif not isinstance(z , Namespace):zMraise TemplateRuntimeError("cannot assign attribute on non-namespace object")rërì)r…r rIrÅrÊrËÚattr)r$r%r&r r.r.r/Ú visit_NSRefOsÿzCodeGenerator.visit_NSRefcCs8| |j¡}t|tƒr&| t|ƒ¡n| t|ƒ¡dSr()rr*rNrcr>rfr)r$r%r&r™r.r.r/Ú visit_Const]s  zCodeGenerator.visit_ConstcCsHz| t| |j¡ƒ¡Wn(tjyB| d|j›d¡Yn0dS©Nz6(Markup if context.eval_ctx.autoescape else identity)(r;)r>rrr*r r•ÚdatarAr.r.r/Úvisit_TemplateDatads  ÿz CodeGenerator.visit_TemplateDatacCsV| d¡d}t|jƒD]"\}}|r.| d¡| ||¡q| |dkrLdnd¡dS)Nr9rîr8rz,)r;©r>r rmr,©r$r%r&rr˜r.r.r/Ú visit_Tuplels  zCodeGenerator.visit_TuplecCsF| d¡t|jƒD]"\}}|r*| d¡| ||¡q| d¡dS)Nrër8rìr¤r¥r.r.r/Ú visit_Listus   zCodeGenerator.visit_ListcCs`| d¡t|jƒD]<\}}|r*| d¡| |j|¡| d¡| |j|¡q| d¡dS)Nr!r8rãrä)r>r rmr,ràrUr¥r.r.r/Ú visit_Dict}s   zCodeGenerator.visit_Dictú+ú-Ú*ú/z//z**ú%ÚandÚorznot cCs`|jjrd}n|jjrd}nd}| |›d¡|jD]}| ||¡| d¡q6| d¡dS)Nz8(markup_join if context.eval_ctx.volatile else str_join)Z markup_joinZstr_joinz((r8rÈ)r*r+rÌr>r r,)r$r%r&rYrçr.r.r/Ú visit_Concat”s   zCodeGenerator.visit_ConcatcCs>| d¡| |j|¡|jD]}| ||¡q| d¡dS)Nr9r;)r>r,rzÚops)r$r%r&r6r.r.r/Ú visit_Compare¢s   zCodeGenerator.visit_ComparecCs*| dt|j›d¡| |j|¡dS)Nr:)r>Ú operatorsr6r,rzrAr.r.r/Ú visit_OperandªszCodeGenerator.visit_OperandcCsT|jjr| d¡| d¡| |j|¡| d|j›d¡|jjrP| d¡dS)Nú(await auto_await(zenvironment.getattr(r8r;rÈ)r<rr>r,r%ržrAr.r.r/Ú visit_Getattr®s  zCodeGenerator.visit_GetattrcCs¢t|jtjƒr@| |j|¡| d¡| |j|¡| d¡n^|jjrR| d¡| d¡| |j|¡| d¡| |j|¡| d¡|jjrž| d¡dS)Nrërìrµzenvironment.getitem(r8r;rÈ) rNrçr ÚSlicer,r%r>r<rrAr.r.r/Ú visit_Getitemºs      zCodeGenerator.visit_GetitemcCs`|jdur| |j|¡| d¡|jdur:| |j|¡|jdur\| d¡| |j|¡dS)Nrf)Ústartr,r>ÚstoprÏrAr.r.r/Ú visit_SliceÏs     zCodeGenerator.visit_Slice)r%r&Ú is_filterr!ccs|jjr| d¡|r@| |j|j›d¡|jj |j¡}n(| |j|j›d¡|jj |j¡}|dur |js |r~dnd}| d|›d|j›d|j ¡t j dt j d t jd i t   |¡¡}|durÚ| |›d ¡dV| ||¡| d ¡|jjr | d ¡dS)Nrµr9rtrezNo rïr>r±r„r<r8r;rÈ)r<rr>rŸrIr‰r rrÃrÂrr±rˆrŠré)r$r%r&r¼rÚ type_namer‹r.r.r/Ú_filter_test_commonÙs.  ýû   z!CodeGenerator._filter_test_commoncCs¤| ||d¡‚|jdur*| |j|¡nX|jjrP| d|j›d|j›d¡n2|jjrn| d|j›d¡n| d|j›d¡Wdƒn1s–0YdS)NTz(Markup(concat(z.)) if context.eval_ctx.autoescape else concat(rÈzMarkup(concat(rœr;)r¾r%r,r*r+r>r‡rÌrAr.r.r/r¤s  ÿÿzCodeGenerator.visit_FiltercCs@| ||d¡| |j|¡Wdƒn1s20YdSrv)r¾r,r%rAr.r.r/r¥szCodeGenerator.visit_Testcslˆ ¡‰ddœ‡‡‡fdd„ }ˆ d¡ˆ ˆjˆ¡ˆ d¡ˆ ˆjˆ¡ˆ d¡|ƒˆ d¡dS)NrŽcs8ˆjdurˆ ˆjˆ¡dSˆ dˆ ˆ¡›d¡dS)Nz1cond_expr_undefined("the inline if-expression on z6 evaluated to false and no else section was defined."))Zexpr2r,r>rr.©r&r%r$r.r/Ú write_expr2s ÿÿz1CodeGenerator.visit_CondExpr..write_expr2r9z if z else r;)r™r>r,Zexpr1re)r$r%r&rÀr.r¿r/Úvisit_CondExprs   zCodeGenerator.visit_CondExpr)r%r&rpr!cCsÐ|jjr| d¡|jjr&| d¡n | d¡| |j|¡|rJddind}|jr\ddini}|jrnddini}|rŠ|j|fi|¤Žn|s’|r¢t |fi|¤Ž}|  |||¡| d¡|jjrÌ| d¡dS) Nrµzenvironment.call(context, z context.call(rZ _loop_varsZ _block_varsr;rÈ) r<rr>r=r,r%r‹rŒr“rlré)r$r%r&rprÞZ loop_kwargsZ block_kwargsr.r.r/rq0s"    zCodeGenerator.visit_CallcCs"| |jd¡| |j|¡dS)Nrâ)r>ràr,rUrAr.r.r/Ú visit_KeywordGszCodeGenerator.visit_KeywordcCs&| d¡| |j|¡| d¡dS)NzMarkup(r;©r>r,rzrAr.r.r/Úvisit_MarkSafeMs zCodeGenerator.visit_MarkSafecCs&| d¡| |j|¡| d¡dSr¡rÃrAr.r.r/Úvisit_MarkSafeIfAutoescapeRs z(CodeGenerator.visit_MarkSafeIfAutoescapecCs| d|j¡dS)Nz environment.©r>rIrAr.r.r/Úvisit_EnvironmentAttributeYsz(CodeGenerator.visit_EnvironmentAttributecCs| d|j›d|j›¡dS)Nzenvironment.extensions[z].)r>Z identifierrIrAr.r.r/Úvisit_ExtensionAttribute^sz&CodeGenerator.visit_ExtensionAttributecCs| |j|j¡dSr()r>r²rGrAr.r.r/Úvisit_ImportedNamecsz CodeGenerator.visit_ImportedNamecCs| |j¡dSr(rÆrAr.r.r/Úvisit_InternalNamefsz CodeGenerator.visit_InternalNamecCs| d¡dS)Nr±)r>rAr.r.r/Úvisit_ContextReferenceisz$CodeGenerator.visit_ContextReferencecCs| | |¡¡dSr()r>r,rAr.r.r/Úvisit_DerivedContextReferencensz+CodeGenerator.visit_DerivedContextReferencecCs| d|¡dS)NÚcontinuer#rAr.r.r/Úvisit_ContinuesszCodeGenerator.visit_ContinuecCs| d|¡dS)NÚbreakr#rAr.r.r/Ú visit_BreakvszCodeGenerator.visit_BreakcCs:| ¡}|j |¡| |¡| |j|¡| |¡dSr()r˜r…r rûr×rrý)r$r%r&Ú scope_framer.r.r/Ú visit_Scopeys   zCodeGenerator.visit_ScopecCs| ¡}| |›d| |¡›¡| |›d¡| |j|¡| |¡|jdd}|j |¡|  |¡|  |j |¡|  |¡|  ¡dS)Nròz.vars = T)r—)rÄrÅr,r,r±r'r˜r…r rûr×rrýr()r$r%r&r«rÑr.r.r/Úvisit_OverlayScope€s     z CodeGenerator.visit_OverlayScopec Csr|jD]f}| d|j›d¡| |j|¡z|j |j¡}WntjyZd|j_ Yq0t |j|j|ƒqdS)Nzcontext.eval_ctx.ròT) ÚoptionsrÅràr,rUrr*r r•r+Úsetattr)r$r%r&Úkeywordr™r.r.r/Úvisit_EvalContextModifierŽs z'CodeGenerator.visit_EvalContextModifiercCsh| ¡}|j ¡}| |›d¡| ||¡|jD]}| ||¡q4|j |¡| d|›d¡dS)Nz = context.eval_ctx.save()zcontext.eval_ctx.revert(r;)rÄr*ZsaverÅr×rr,Zrevert)r$r%r&Z old_ctx_nameZ saved_ctxr—r.r.r/Úvisit_ScopedEvalContextModifier›s    z-CodeGenerator.visit_ScopedEvalContextModifier)NFT)F)r )N)N)Nr)Nr)N)F)rþrÿ)N)F)¶r|r}r~r2r›rfÚTextIOrar{ÚpropertyrMrbrÃrÄr#r‡rÍrÊrËr ÚNoderÒrÓrÕr®r×r>rÅrÜrZCallr§r¨ÚMappingr3rérñrûrýrrr€rrVrtrrrr"r$rrrr'r(r*rõr,r-r.r;rOrNr©r¦rDrTZIncluderZZImportZ FromImportr\r_rbZForrlZIfrnrorsZ FilterBlockruZWithr{ZExprStmtr|Ú NamedTuplerÚ staticmethodr‚rƒr€rŒrŽr1r‘r“r”ZOutputršZAssignr›Z AssignBlockrr¯r­ZNSRefrŸrUr rr£r¦rWr§ÚDictr¨rFZ visit_AddZ visit_SubZ visit_MulZ visit_DivZvisit_FloorDivZ visit_PowZ visit_ModZ visit_AndZvisit_OrrHZ visit_PosZ visit_NegZ visit_Notr5ZConcatr°ZComparer²ZOperandr´ZGetattrr¶ZGetitemr¸r·r»rÚIteratorr¾r¤r¥ZCondExprrÁrqZKeywordrÂZMarkSaferÄZMarkSafeIfAutoescaperÅZEnvironmentAttributerÇZExtensionAttributerÈrFrÉZ InternalNamerÊZContextReferencerËZDerivedContextReferencerÌZContinuerÎZBreakrÐZScoperÒZ OverlayScoperÓZEvalContextModifierr×ZScopedEvalContextModifierrØr.r.r.r/r",sl ù ø Iÿþ ÿþ  ÿþ  üû 9+ þ S   .ÿ þ v++4þ  2    0þ þ þ O     þ)ÿþþ þ þ þ þ þ þ)NFT)FršÚtypingr2Ú contextlibrÚ functoolsrÚiorÚ itertoolsrrÖrrßZ markupsaferrrÿr Ú exceptionsr Z idtrackingr r rrrrr)rZutilsrrrCrÚ TYPE_CHECKINGZtyping_extensionsÚter<rÚTypeVarrr3rr³r5rfrDrFrGrHrOr›rÙrarSrWr®rÛÚSetrsrtr#Ú RuntimeErrorrqržrpr–r°r"r.r.r.r/Ús|                    ø "þ ù ø þ S