
    UHj                       d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ej                  j                  d e e	e      j                         j                               ddlmZ  e	e      j                         j$                  d   Zedz  ZdZd	Zd
dddZddZddZddZddZddZddZddZedk(  r e        yy)zKSummarize the object+0x61 consumer group that can branch the active stream.    )annotationsN)Path)read_sections   outi@ i@ zfrontier leaf pointerzfrontier readerzreader false branch target)i*T i+T ioS c                    d| dS )N0x08x )values    K/home/exedev/hwanse/tools/summarize_save_selector_object61_stream_branch.pyhex32r      s    c{    c                b   t        |       }t        d |D              }| |d   |d   |d   z    }i }|D ]y  }t        j                  d|      }g }|j	                  |      }	|	dk\  r;|j                  t        |d   |	z                |j	                  ||	dz         }	|	dk\  r;||t        |      <   { |S )Nc              3  2   K   | ]  }|d    dk(  s|  yw)namez.textNr   ).0sections     r   	<genexpr>ztext_refs.<locals>.<genexpr>"   s     NG76?g3MNs   rawraw_sizez<Ir   var   )r   nextstructpackfindappendr   )
exevaluessectionstextdatarefsr   needlehitsposs
             r   	text_refsr'       s    S!HNxNNDtE{4;j)99:D!#D "T5)iiQhKKd4j3./0))FC!G,C Qh "U5\" Kr   c                l   t        | t              }t        d |j                         D              }ddddddddd	d
ddddddg}d}dt	        t
               dt	        t               t        j                         D cg c]   \  }}t	        |      ||t	        |         d" c}}||d|dS c c}}w )Nc              3  2   K   | ]  }t        |        y w)N)len)r   itemss     r   r   z build_summary.<locals>.<genexpr>2   s     A%3u:As   
0x0040d66ezQif local flag remains set, context+0x40 = dword [stream+4]; otherwise stream += 8z-generic branch through active handler operand)vaHexeffectrouteImpact
0x0040d6f9zUno free object slot path sets global 0x0059e334=1 and context+0x40 = dword [stream+4]zJobject allocation failure branch, not a save-selector leaf table reference
0x0040dd86zVlinked object action path sets global 0x0059e334=2 and context+0x40 = dword [stream+4]zEobject action/status branch, still through the current stream operand
0x0040ddf2z+non-trigger path advances context+0x40 by 8zfixed local advancea  The object+0x61 consumer group can replace the active VM stream with dword [stream+4], but no direct .text reference links this group to the current save-selector leaf 0x00542ae8, reader 0x00542b0c, or false branch target 0x0053f46f. It is a generic object/action branch mechanism. It should not be used to promote map1_01a->map2_02d without a concrete active stream operand that points at the frontier leaf.zcobject+0x61 consumer group 0x0040d5da..0x0040dded that may write context+0x40 from dword [stream+4]z..)valueHexmeaningtextRefsblocked)scopegroupRangeHexfrontierRefsdirectFrontierRefCountstreamEffectspromotionStatus
conclusion)r'   FRONTIER_VALUESsumr   r   GROUP_START	GROUP_ENDr+   )r   r#   direct_ref_countstream_effectsr=   r   r4   s          r   build_summaryrD   0   s    S/*DA4;;=AA "iJ	
 "mg	
 "nb	
 "C0	
!N.	h  w!+./r%	2B1CD #2"7"7"9
 w	 "%L" u.
 #3'$  
s   %B0
c                   ddd| d    ddd| d    dd	| d
    d| d    d| d    dddddg}| d   D ]B  }dj                  d |d   D              xs d}|j                  d|d    d|d    d| d       D |j                  g d       | d   D ]&  }|j                  d|d    d|d     d|d!    d       ( |j                  d       d"j                  |      S )#Nz)# Save Selector object+0x61 Stream Branch zScope: r7   .z- group range: `r8   `z- direct frontier refs: r:   z- promotion status: r<   z- conclusion: r=   z## Frontier Refsz| value | meaning | text refs || --- | --- | --- |r9   , c              3  (   K   | ]
  }d | d   yw)rH   Nr   )r   refs     r   r   zmarkdown.<locals>.<genexpr>r   s     ?1SE?s   r5   -z| `r3   z` | r4   z | z |)rF   z## Stream EffectsrF   z| va | effect | route impact |rI   r;   r-   r.   r/   
)joinr   extend)summarylinesrowr#   s       r   markdownrT   a   sG   3

''"#1%

7?34A6
"7+C#D"EF
w'89:;
./0

)E ~& Myy?s:??F3s3z?+4I/?s4&KLM 
LLgh' Ws3w<.S]O3s=?Q>RRTUVW	LL99Ur   c                T   dj                  d | d   D              }dj                  d | d   D              }dj                  dddd	t        j                  | d
          dd| d    dt        j                  | d          ddt        j                  | d          ddd|ddd|dg      S )NrN   c              3     K   | ]e  }d t        j                  |d          dt        j                  |d          dt        j                  dj                  |d         xs d       d g y	w)
<tr><td><code>r3   </code></td><td>r4   	</td><td>rJ   r5   rM   
</td></tr>N)htmlescaperO   r   rS   s     r   r   zhtml_page.<locals>.<genexpr>|   su       	[[Z12 3{{3y>*+ ,{{499S_5<=> ?	s   A+A-r9   c           
   3     K   | ]R  }d t        j                  |d          dt        j                  |d          dt        j                  |d          d T yw)rW   r-   rX   r.   rY   r/   rZ   N)r[   r\   r]   s     r   r   zhtml_page.<locals>.<genexpr>   sh       	[[W./ 0{{3x=)* +{{3}-./ 0	s   AAr;   z[<!doctype html><meta charset="utf-8"><title>Save Selector object+0x61 Stream Branch</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1100px;margin:24px auto}table{border-collapse:collapse}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z0<h1>Save Selector object+0x61 Stream Branch</h1>z
<p>Scope: r7   z.</p>z<p>direct frontier refs: r:   z; promotion status: r<   z</p>z<p>r=   z<h2>Frontier Refs</h2>zV<table><thead><tr><th>value</th><th>meaning</th><th>text refs</th></tr></thead><tbody>z</tbody></table>z<h2>Stream Effects</h2>zU<table><thead><tr><th>va</th><th>effect</th><th>route impact</th></tr></thead><tbody>)rO   r[   r\   )rQ   r#   effectss      r   	html_pager`   {   s    99  >* D ii  ?+ G 99g 	n:
T[[!12359
#G,D$E#FFZ[_[f[fgn  pA  hB  \C  [D  DH  	I
dkk',/016 `!_  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok)save_selector_object61_stream_branch.jsonF   )ensure_asciiindentrN   zutf-8)encoding)mkdir
write_textjsondumps)rQ   out_dirs     r   write_outputsrn      sD    MM$M.::FF

7q9D@ G r   c                 j   t        j                         } | j                  dt        t        dz         | j                  dt        t
               | j                         }t        |j                  j                               }t        ||j                         t        d|j                  dz          y )Nz--exezHwanse2.exe)typedefaultz	--out-dirz#wrote object+0x61 stream branch -> rd   )argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsrD   r   
read_bytesrn   rm   print)parserargsrQ   s      r   mainr|      s    $$&F
dD=4HI
$<DDHH//12G'4<<(	/?j0j/k
lmr   __main__)r   intreturnstr)r   bytesr   zdict[int, str]r   zdict[str, list[str]])r   r   r   dict)rQ   r   r   r   )rQ   r   rm   r   r   None)r   r   ) __doc__
__future__r   rr   r[   rk   r   syspathlibr   pathinsertr   __file__resolveparentprobe_exe_scene_tablesr   rb   ru   rv   r@   rA   r>   r   r'   rD   rT   r`   rn   r|   __name__r   r   r   <module>r      s    Q "     
  3tH~--/667 8 0 H~''*
Ul	'!, .b4 Fn zF r   