
    UHj4                       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	 ddl
mZ ej                  j                  d e e	e      j!                         j"                               ddlmZmZmZ  e	e      j!                         j,                  d   Zedz  Zd	Zd
ZddddZdddddddddddddddgZd(dZ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fd0d%Z&d1d&Z'e(d'k(  r e'        yy)2z<Summarize stream operands for object+0x61 consumer handlers.    )annotationsN)Path)Any)find_cns_stringsread_sectionsva_to_offset   outmap1_01amap2_02dzfrontier leaf pointerzfrontier readerz#frontier reader false branch target)i*T i+T ioS zcollision/action mask testi@ i@ z?object action/collision tests; not a save-selector leaf chooser)name
rangeStartrangeEndrouteImpactzobject spawn/flag managementi@ i@ z#may branch through dword [stream+4]zstatus sync helperi(@ i	@ zruntime object synchronizationc                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     M/home/exedev/hwanse/tools/summarize_save_selector_object61_stream_operands.py	load_jsonr   3   s*    ;;=::dnngn677    c                <    t        | t              sy t        | d      S )N   )
isinstancestrintvalues    r   	parse_hexr%   9   s    eS!ub>r   c                    d| dS )N0x08x r#   s    r   hex32r*   ?   s    c{r   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   z<Ir   )r   lenstructunpack_from)exesectionsvaoffsets       r   dword_atr4   C   s?    (B'F~!c#h.dC033r   c                H    t         D ]  }|d   | cxk  r|d   k  s|c S   y )Nr   r   )OBJECT61_GROUPS)
handler_vagroups     r   group_for_handlerr9   J   s8      *Aj0AAL B r   c                    | dddS | t         v rdt         |    dS | |v rd||    dS t        ||       dddS | dk  rd	d
dS dddS )Nmissing-)kindmeaningfrontier-targetz
cns-stringzexecutable-pointerzVA in executable imagei  zsmall-scalarzsmall scalar or scene idscalarznon-pointer scalar)FRONTIER_VALUESr   )r$   r1   stringss      r   classify_operandrC   Q   sy    }!c22)oe6LMM$@@He$0,9QRR&3MNN)=>>r   c                   t        |       }t        | |      }g }g }|j                  d      xs g D ]  }t        |j                  d            }|!t	        |      }|s/|j                  |j                  d      |j                  d      |d   t        |j                  d      xs i j                  d            |j                  dd      d	       |j                  d
      xs g D ]  }	|	j                  d      t        k7  s|	j                  d      t        k7  r5t        |	j                  d            }
|
Rt        | ||
      }t        | ||
dz         }t        | ||
dz         }t        |||      }t        |||      }t        |||      }|j                  i d|j                  d      d|j                  d      d|d   d|	j                  d      d|	j                  d      d|	j                  d      d|	j                  d      d|t        |      nd d|d   d|d   dt        |
dz         d|t        |      nd d|d   d|d   dt        |
dz         d|t        |      nd d|d   |d   t        |j                  d      xs i j                  d            |	j                  d       |	j                  d!      d"u |d#   d$         |D cg c]  }|j                  d      s| }}|D cg c]@  }|j                  d      d%k(  s(|j                  d      d%k(  s|j                  d      d%k(  r|B }}|D cg c]  }|j                  d      d%k(  r| }}d&}d't        t        t        |      |t        |      t        |      t        |      t        |      |||d(|d)S c c}w c c}w c c}w )*NentrieshandlerVaHex	opcodeHexr   streamEffectcanJumpToDwordAtPlus4referenceCountr   )rG   rF   r8   rI   rJ   
referencessourcetarget	wordVaHexr,      r8   
streamKindstreamVaHex	wordIndexvalueHex	valueKindr=   valueMeaningr>   nextDwordVaHexnextDwordHexnextDwordKindnextDwordMeaningnextNextDwordVaHexnextNextDwordHexnextNextDwordKindcnspointerTr   )nextNextDwordMeaningrI   r]   r^   r   r?   a  Object+0x61 consumer handlers do appear in the map1_01a->map2_02d save-selector streams, but their stream operands do not point at the current frontier leaf, frontier reader, or false branch target. The only branch-capable object+0x61 row is opcode 0x2f at 0x00542e74; its dword [stream+4] is 0x00001618, a small scalar/scene-id value associated with map2_16j.cns, not a save-selector leaf pointer. This keeps the object+0x61 path blocked as route promotion evidence.zgobject+0x61 consumer handlers resolved through current map1_01a->map2_02d save-selector stream operandsblocked)scoperL   rM   objectHandlerOpcodeCountobjectHandlerOpcodesrouteOperandRowCountbranchCapableRowCountdirectFrontierOperandCountbranchFrontierOperandCountbranchCapableRowsdirectFrontierOperandRowsrowspromotionStatus
conclusion)r   r   getr%   r9   appendboolROUTE_SOURCEROUTE_TARGETr4   rC   r*   r-   )r0   script_handler_tabler1   rB   rj   object_handler_opcodesentryr7   r8   refword_var$   
next_valuenext_next_valuevalue_class
next_classnext_next_classrowbranch_rowsdirect_frontier_operand_rowsbranch_frontier_rowsrl   s                         r   build_summaryr   _   sY   S!HsH-GD%)))4: 1uyy89
!*-%%;/!IIn56]%)599^+D+J*O*OPg*h%i#ii(8!<'
 	 99\*0b #	Cwwx L0CGGH4E4U 45GS(G4E!#x1=J&sHgkBO*5(GDK)*hHJ.'ROKK UYY{3		. 9 v cggl3	
 sww}5 SWW[1 SWW[1 E,=E%L4 [0 I 6 !%!"4 Z5Kj 1QU  F!3 #Jy$9 %eGaK&8  #o>YE/$:_c!" $_V%<#$ )8	(B)-uyy/H/NB.S.STk.l)mwwu~779-5$]3- #	1f #'K3#''2I*J3KKK$77;#4477?#'8877&'+<< 	$  $ #77?#'88 	 
	O  {$'(>$? 6 #D	!$[!1&)*F&G&)*>&?(%A$  % L$s    N37N3AN8N=c                   ddd| d    ddd| d    d| d	    d
d| d    d| d    d| d    d| d    d| d    d| d    d| d    dddddg}| d   D ]2  }|j                  d|d    d|d     d!|d"    d#|d$    d#|d%    d&       4 |j                  g d'       | d(   D ]b  }|j                  d|d)    d|d    d|d     d|d*    d+|d,    d-|d.    d/|d0    d1|d2    d3|d4    d1|d5    d#|d6    d#|d"    d#|d7    d&       d | d(   s|j                  d8       |j                  d       d9j                  |      S ):Nz+# Save Selector object+0x61 Stream Operands zScope: ra   .z
- route: `rL   z -> rM   `z- object handler opcodes: rb   z- route operand rows: rd   z- branch-capable rows: re   z- direct frontier operands: rf   z- branch frontier operands: rg   z- promotion status: rk   z- conclusion: rl   z## Object Handler Opcodesz5| opcode | handler | group | jump [stream+4] | refs |z | --- | --- | --- | --- | ---: |rc   z| `rG   z` | `rF   z` | r8   z | rI   rJ   z |)r   z## Route Operand Rowsr   zV| word | opcode | handler | stream | value | next dword | next kind | group | impact |z7| --- | --- | --- | --- | --- | --- | --- | --- | --- |rj   rN   rP    rQ   [rR   z]` | `rS   z` rU   z | `rW   rY   rX   r   z%| - | - | - | - | - | - | - | - | - |
)rn   extendjoin)summarylinesr|   s      r   markdownr      sG   5

''"#1%

WX&'tGH,=+>a@
$W-G%H$IJ
 )?!@ AB
!'*A"B!CD
&w/K'L&MN
&w/K'L&MN
w'89:;
./0
#
?*#E& -. 
#k"#5^)<(=T#g,s*+,C4D0E/FbJ	


 
LL   v 
#k"#5[)9(:%N@S?T UL!"!C$6#7q[9I8J KJ 3~#6"7 8N#$Bs+='>&?s3CWBXX[7|nCM 232	7	

 6?<=	LL99Ur   c                   dj                  d | d   D              }dj                  d | d   D              }dj                  dddd	t        j                  | d
          dddt        j                  | d          dt        j                  | d          dd| d    dd| d    dd| d    dd| d    dd| d    ddt        j                  | d          ddd t        j                  | d!          d"d#d$|xs d%d&d'd(|xs d)d&g      S )*Nr   c              3    K   | ]y  }d t        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                d|d    d|d    d	 { y
w)<tr><td><code>rG   </code></td><td><code>rF   z</code></td><td>r8   	</td><td>rI   rJ   
</td></tr>Nhtmlescaper!   .0r|   s     r   	<genexpr>zhtml_page.<locals>.<genexpr>   s      	 	[[S%5!678 9[[S%8!9:; <{{3s7|,-. /*+, -#$% &		s   A?Brc   c               3  b  K   | ]  }d t        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                d|d	    d
t        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                d  yw)r   rN   r   rG   rF   rP   r   rQ   r   rR   z]</code></td><td><code>rS   z</code><br>rU   z</td><td><code>rW   rY   r   rX   r8   r   r   Nr   r   s     r   r   zhtml_page.<locals>.<genexpr>   s      	[[S%5!678 9[[S%5!678 9[[S%8!9:; <[[S%6!7894;;s3}K]G^;_:``abefqbras t[[S_!567{4;;sSVWeSfOgChBi j[[S%8!9:;;t{{SVWZ[mWnSoGpFq r{{3s?3456 7{{3s7|,-. /{{3s=1234 5
	s   F-F/rj   z]<!doctype html><meta charset="utf-8"><title>Save Selector object+0x61 Stream Operands</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1280px;margin:24px auto}table{border-collapse:collapse;width:100%}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z2<h1>Save Selector object+0x61 Stream Operands</h1>z
<p>Scope: ra   z.</p>z<ul>z<li>route: <code>rL   z -&gt; rM   z</code></li>z<li>object handler opcodes: rb   z</li>z<li>route operand rows: rd   z<li>branch-capable rows: re   z<li>direct frontier operands: rf   z<li>branch frontier operands: rg   z<li>promotion status: rk   z</ul>z<p>rl   z</p>z<h2>Object Handler Opcodes</h2>zx<table><thead><tr><th>opcode</th><th>handler</th><th>group</th><th>jump [stream+4]</th><th>refs</th></tr></thead><tbody>z8<tr><td colspan="5">No object handler opcodes.</td></tr>z</tbody></table>z<h2>Route Operand Rows</h2>z<table><thead><tr><th>word</th><th>opcode</th><th>handler</th><th>stream</th><th>value</th><th>next dword</th><th>next kind</th><th>group</th><th>impact</th></tr></thead><tbody>z4<tr><td colspan="9">No route operand rows.</td></tr>)r   r   r   )r   opcode_rowsoperand_rowss      r   	html_pager      s   )) 	 12	 	K 99  6? L 99i 	y<
T[[!12359
DKK(9:;74;;wW_O`CaBbbno
&w/I'J&K5Q
"7+A#B"C5I
#G,C$D#EUK
(1M)N(OuU
(1M)N(OuU
 W5F-G!H IO
dkk',/016) 	CQQ% 	|NN-  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  t	        |       d	       y )NT)parentsexist_okz+save_selector_object61_stream_operands.jsonF   )ensure_asciiindentr   r   r   +save_selector_object61_stream_operands.html)mkdir
write_textr   dumpsr   )r   out_dirs     r   write_outputsr     sf    MM$M.<<HH

7q9D@ I  <<HHSZI[fmHnr   c                    t        j                         } | j                  dt        t        dz         | j                  dt        t
        dz         | j                  dt        t
               | j                         }t        |j                  j                         t        |j                  i             }t        ||j                         t        d|j                  dz          y )	Nz--exezHwanse2.exe)typedefaultz--script-handler-tablezscript_handler_table.jsonz	--out-dirz%wrote object+0x61 stream operands -> r   )argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsr   r0   
read_bytesr   rr   r   r   print)parserargsr   s      r   mainr   %  s    $$&F
dD=4HI
0tSKfEfg
$<D$++R0G '4<<(	1$,,An2n1o
pqr   __main__)r   r   r   r   returnr   )r$   z
str | Noner   
int | None)r$   r"   r   r!   )r0   bytesr1   
list[dict]r2   r"   r   r   )r7   r"   r   zdict | None)r$   r   r1   r   rB   zdict[int, str]r   dict)r0   r   rr   r   r   r   )r   r   r   r!   )r   r   r   r   r   None)r   r   ))__doc__
__future__r   r   r   r   r.   syspathlibr   typingr   r   insertr!   __file__resolveparentprobe_exe_scene_tablesr   r   r   r   r   r   rp   rq   rA   r6   r   r%   r*   r4   r9   rC   r   r   r   r   r   __name__r)   r   r   <module>r      s(   B "     
   3tH~--/667 8 P P H~''*
Ul'!5 - X	 / <	 % 7	,84?Yx+\0f 25 or zF r   