
    IjA                       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mZ ddl	m
Z
 ej                  j                  d e ee      j                         j                                ddlmZ ddlmZ  ee      j                         j*                  d   Zed	z  Zd
ZdZdZdZdZddZddZddZddZ ddZ!	 	 d 	 	 	 	 	 	 	 d!dZ"d"dZ#d#dZ$d#dZ%d$d%dZ&d&dZ'e(dk(  r e'        yy)'zVExplain unreadable nearest producers before source/predecessor opcode 0x08 activators.    )annotationsN)Path)Any)read_sections)section_name_for_va   outmap1_01amap2_02dz0:0z1:0z2:0c                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     R/home/exedev/hwanse/tools/summarize_save_selector_opcode08_unreadable_producers.py	load_jsonr      s*    ;;=::dnngn677    c                     | sy t        | d      S )N   )int)values    r   	parse_hexr   "   s    ub>r   c                6    t        |      }|y t        | |      S N)r   r   )sections	value_hexr   s      r   hex_sectionr"   (   s!    i E}x//r   c                    i }| j                  d      xs g D ]L  }|j                  d      }|j                  d      xs g D ]!  }|s|j                  d      s||||d   f<   # N |S )NcontextScansselectorrowsvaHexget)selected_pointer_opcode_pathsr&   scanr%   rows        r   	row_indexr-   /   sy    D-11.AGR 588J'88F#)r 	5CCGGG,14hG-.	55
 Kr   c                   |j                  d      }|j                  d      }|dk(  r|j                  d      }|j                  d      }t        | |      }||j                  d      ||t        | |      |j                  d      |j                  d      t        | |j                  d            |||t        | |      |j                  d	      xs i |d
ddS dddS |dk(  rw||j                  d      ||t        | |      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      xs i dddS ||j                  d      ||t        | |      dddS )N	opcodeHexvalueHex0x07selectedSlotHexselectedValueHexr'   indexoperandTableHexselectedValueClassz?opcode 0x07 selected slot is outside mapped executable sectionszGopcode 0x07 selected value is unreadable in the static executable imageF)r%   producerVaHexproducerOpcodeHexproducerValueHexproducerValueSectionr4   r5   operandTableSectionr2   selectedSlotSectionr3   selectedValueSectionr6   unreadableReasonstaticCurrentPointerEvidence0x09modemodeHexstoredPointerSourcestoredPointerHexstoredPointerClasszPopcode 0x09 row uses an unsupported mode, so no static stored pointer is decoded)r%   r7   r8   r9   r:   rA   rB   rC   rD   rE   r>   r?   zunsupported producer opcode)r%   r7   r8   r9   r:   r>   r?   )r)   r"   )r    r%   producer_rowopcoder!   selected_slotselected_valueselected_slot_sections           r   explain_producerrK   9   s   k*F  ,I$(():;%))*<= +Hm D )--g6!' )$/)$D!%%g.+//0AB#.x9I9IJ[9\#],#8 .$/.$I"."2"23G"H"NB )0 R -2'
 	
" Z,1'
 	
*  )--g6!' )$/)$D $$V,#''	2#/#3#34I#J , 0 01C D"."2"23G"H"NB r,1
 	
 %))'2#% +Hi @9(- r   c                   |xs t        t        dz  i       }|xs t        t        dz  i       }t        |       }t        |      }g }i }|j	                  d      xs g D ]+  }|j	                  d      }|t
        t        hvr$|j	                  d      xs g D ]  }	|	j	                  d      dk7  r|	j	                  d      }
|j	                  ||
fi       }t        |||      }||	j	                  d	      |	j	                  d
      |	j	                  d      |d}|j                  |       ||
xs df}|j                  |i |d|	j	                  d	      |	j	                  d	      d      }|dxx   dz  cc<   |	j	                  d	      |d<    . t        |j                         d       }|D cg c]+  }|j	                  d      xs i j	                  d      dk(  r|- }}|D cg c]+  }|j	                  d      xs i j	                  d      dk(  r|- }}|D cg c](  }|j	                  d      xs i j	                  d      |* }}|D cg c]+  }|j	                  d      xs i j	                  d      dk(  r|- }}|D cg c](  }|j	                  d      xs i j	                  d      r|* }}d}i dt        dt        d t
        d!t        d"t        d#t        |      d$t        |      d%t        |      d&t        |      d't        |      d(t        |      d)t        |      d*d+d,d-d.|d|d/g d0d1|iS c c}w c c}w c c}w c c}w c c}w )2N.save_selector_opcode08_activation_windows.json0save_selector_selected_pointer_opcode_paths.jsoncontextWindowsr%   activationsnearestProducerBucket
unreadablenearestProducerVaHexactivationVaHexactivationValueHexdistanceBytes)r%   rT   rU   rV   producer r   )activationCountfirstActivationVaHexlastActivationVaHexrY   r   r[   c                h    | j                  d      xs dt        | j                  d            xs dfS )Nr%   rX   r7   r   )r)   r   )r,   s    r   <lambda>zbuild_summary.<locals>.<lambda>   s-    ,2Icggo>V4W4\[\] r   )keyrW   r8   r1   r@   r<   rC   zunsupported-moder?   a  The unreadable source/predecessor opcode 0x08 producer windows do not hide a static current-selector producer. Opcode 0x07 cases point their selected slots at unmapped scalar/table-like addresses, and opcode 0x09 cases use unsupported modes instead of a decoded next-stream/current pointer store. This keeps opcode 0x08 promotion blocked until a runtime selected-pointer trace or captured selector 2:0 save appears.sourcetargetsourceSelectorpredecessorSelectorcurrentSelector,sourceOrPredecessorUnreadableActivationCountuniqueUnreadableProducerCount!opcode07UnreadableActivationCount!opcode09UnreadableActivationCount+opcode07UnmappedSelectedSlotActivationCount&opcode09UnsupportedModeActivationCount!staticCurrentPointerEvidenceCount'opcode08UnreadableProducerPromotesRouteFpromotionStatusblockedproducerRowsremainingProofs)z2capture opcode 0x08 selected-pointer runtime statez)capture a real selector 2:0 gameplay savez3find a strict map1_01a source coordinate or hotspot
conclusion)r   OUTr   r-   r)   SOURCE_SELECTORPREDECESSOR_SELECTORrK   append
setdefaultsortedvaluesSOURCETARGETCURRENT_SELECTORlen)exeactivation_windowsr*   r    indexed_rowsrP   producer_groupscontextr%   
activationproducer_varF   explanationr,   r^   groupproducer_rowsopcode07_activationsopcode09_activations"opcode07_unmapped_slot_activations opcode09_unsupported_activationscurrent_static_hitsrp   s                          r   build_summaryr   o   sN   
 ,ty?o9oqs/t$A %Y@@
F! S!H:;LK35O%))*:;Ar M;;z*O-ABB!++m4: 	MJ~~56,F$..)?@K'++X{,CRHL*8X|LK$#->>2C#D&0nn5I&J!+!@'C s#[.B/C#..s 55#$(27H(I'1~~6G'H	5 E #$)$+5>>:K+LE'(-	M	M6  ]M
 #GGJ%2**+>?6I 	 
 #GGJ%2**+>?6I 	 
 ,*GGJ%2**+@AI 	*& *
 ,(GGJ%2**+@AEWW 	($ (
 #GGJ%2**+IJ 	 
	 && 	/ 	3	
 	+ 	7K8H 	(]); 	,S1E-F 	,S1E-F 	6s;]7^ 	1#6V2W 	,S1D-E 	25 	9 	  	{!" 	 
#, 	j- 7*(s   -0M#0M-M0M-Mc                
   | j                  d      }|dk(  r*d| j                  d       d| j                  d      xs d S |dk(  r*d	| j                  d
       d| j                  d      xs d S | j                  d      xs dS )Nr8   r1   z	op7 slot=r2   z slotSection=r<   -r@   z	op9 mode=rB   z valueSection=r:   r>   r(   )r,   rG   s     r   producer_briefr      s    WW()F 123 477#89@SAC	
 	*+ ,GG$:;BsCE	
 77%&-#-r   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ddg}| d   D ]  }|j                  d|j                  d        d!|j                  d"       d#|j                  d$       d%|j                  d&       d!|j                  d'       d#t        |       d%|j                  d(       d!|j                  d)       d*        |j                  g d+       | d,   D ]  }|j                  d-      xs i }|j                  d|j                  d        d!|j                  d.       d!|j                  d"       d!|j                  d&       d#|j                  d/       d0|j                  d1       d2        |j                  g d3       |j                  d4 | d5   D               |j                  d       d6j	                  |      S )7Nz0# Save Selector Opcode 0x08 Unreadable ProducersrX   z	- route: r_   z -> r`   z-- source/predecessor unreadable activations: rd   z- unique unreadable producers: re   z&- opcode 0x07 unreadable activations: rf   z2- opcode 0x07 unmapped selected-slot activations: rh   z&- opcode 0x09 unreadable activations: rg   z,- opcode 0x09 unsupported-mode activations: ri   z#- static current-pointer evidence: rj   z/- opcode08 unreadable producer promotes route: rk   z- promotion status: `rl   `rp   z## Unique ProducerszS| selector | producer | activations | opcode | value | explanation | first | last |z2| --- | --- | ---: | --- | --- | --- | --- | --- |rn   z| `r%   z` | `r7   z` | rY   z | `r8   r9   rZ   r[   z` |)rX   z## Activation RowsrX   zA| selector | activation | producer | opcode | distance | reason |z&| --- | --- | --- | --- | ---: | --- |rP   rW   rT   rV   z | r>   z |)rX   z## Remaining ProofsrX   c              3  &   K   | ]	  }d |   yw)z- N .0items     r   	<genexpr>zmarkdown.<locals>.<genexpr>
  s     D2dVDs   ro   
)rt   r)   r   extendjoin)summarylinesr,   rW   s       r   markdownr      s   :

GH%&d78+<*=>
7@n8o7pq
)'2Q*R)ST
09\1]0^_
<WEr=s<tu
09\1]0^_
6w?g7h6ij
-g6Y.Z-[\
9'Bk:l9mn
(9 :;1=


]<'E* ~& 
#''*%&eCGGO,D+ET#''RcJdIe f+,-U377;M3N2Otc"#40F(G'HcggVkNlMmmpr	

 
LL   }% 
77:&,"#''*%&eCGG4E,F+GuX\\ZiMjLk l012$sww7O6PPST\T`T`asTtSuuwy	

 
LL01	LLD1B)CDD	LL99Ur   c           !        dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              }dj                  d	d
dddddddddddd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/d0d1|d2d3d4|d2d5| d6d7g      S )8Nr   c              3    K   | ]M  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d                   d|j                  d       dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t	        |             dt        j                  t        |j                  d	                   dt        j                  t        |j                  d
                   d P yw)<tr><td><code>r%   </code></td><td><code>r7   </code></td><td>rY   z</td><td><code>r8   r9   rZ   r[   z</code></td></tr>N)htmlescapestrr)   r   r   r,   s     r   r   zhtml_page.<locals>.<genexpr>  s"      	[[SWWZ%8!9:; <[[SWW_%=!>?@ Aww()* +[[SWW-@%A!BCD E[[SWW-?%@!ABC D{{>#./0 1[[SWW-C%D!EFG H[[SWW-B%C!DEF G		s   EErn   c              3    K   | ]U  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d      xs i j                  d                   dt        j                  t        |j                  d      xs i j                  d                   dt        j                  t        |j                  d                   d	t        j                  t        |j                  d      xs i j                  d
                   d X yw)r   r%   r   rT   rW   r7   r8   r   rV   z	</td><td>r>   z
</td></tr>N)r   r   r   r)   r   s     r   r   zhtml_page.<locals>.<genexpr>  s"     
  	[[SWWZ%8!9:; <[[SWW->%?!@AB C[[cggj&9&?R%D%D_%U!VWX Y[[cggj&9&?R%D%DEX%Y!Z[\ ]{{3sww789: ;{{3
 3 9r>>?QRSTU V	
 s   EErP   rX   c              3  N   K   | ]  }d t        j                  |       d  yw)z<li>z</li>N)r   r   r   s     r   r   zhtml_page.<locals>.<genexpr>(  s#     \tDKK-.e4\s   #%ro   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z?  <title>Save Selector Opcode 0x08 Unreadable Producers</title>z	  <style>zg    :root { color-scheme: dark; font-family: system-ui, sans-serif; background: #101010; color: #eee; }z&    body { margin: 0; padding: 24px; }z[    table { width: 100%; border-collapse: collapse; margin: 12px 0 20px; font-size: 13px; }zi    th, td { border-bottom: 1px solid #303030; padding: 7px 8px; text-align: left; vertical-align: top; }z,    th { background: #181818; color: #ddd; }z    code { color: #d7f0ff; }z
  </style>z</head>z<body>z9  <h1>Save Selector Opcode 0x08 Unreadable Producers</h1>z  <p>route r_   z -&gt; r`   z,; source/predecessor unreadable activations rd   z; unique unreadable producers re   z"; static current-pointer evidence rj   z.; opcode08 unreadable producer promotes route rk   z.</p>z(  <p>opcode 0x07 unreadable activations rf   z1; opcode 0x07 unmapped selected-slot activations rh   z+; opcode 0x09 unsupported-mode activations ri   z  <p>rp   z</p>z  <h2>Unique Producers</h2>z  <table><thead><tr><th>selector</th><th>producer</th><th>activations</th><th>opcode</th><th>value</th><th>explanation</th><th>first</th><th>last</th></tr></thead><tbody>z  </tbody></table>z  <h2>Activation Rows</h2>z  <table><thead><tr><th>selector</th><th>activation</th><th>producer</th><th>opcode</th><th>distance</th><th>reason</th></tr></thead><tbody>z  <h2>Remaining Proofs</h2><ul>z</ul>z</body></html>)r   r   r   )r   r   activation_rowsproofss       r   	html_pager     s   II  >* M ii 
  =)
  
O WW\IZA[\\F99"PIq0es6&C
dkk'("345WT[[QYIZ=[<\  ]I  JQ  R@  JA  IB  B`  ah  iH  aI  `J  Jl  mt  uX  mY  lZ  ZH  IP  Qz  I{  H|  |A  	B
27;^3_2`  aR  SZ  [H  SI  RJ  Ju  v}  ~f  vg  uh  hm  	n
GL12348% 	u$ 	W
)&7=  r   c                    |j                  dd       |dz  j                  t        j                  | dd      d       |:|j                  j                  dd       |j                  t        |       d       y y )	NT)parentsexist_ok0save_selector_opcode08_unreadable_producers.jsonF),:)ensure_ascii
separatorsr   r   )mkdir
write_textr   dumpsparentr   )r   out_dirhtml_outs      r   write_outputsr   K  s{    MM$M.AAMM

7:F N  dT:Ig.A r   c                    t        j                         } | j                  dt        t        dz         | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  dt        t
               | j                  d	t        d d
       | j                         }t        |j                  j                         t        |j                  i       t        |j                  i             }t        ||j                  |j                         t!        d|j                  dz          y )Nz--exezHwanse2.exe)typedefaultz--activation-windowsrM   z--selected-pointerrN   z	--out-dirz
--html-outz!Optional HTML report output path.)r   r   helpz8wrote save selector opcode 0x08 unreadable producers -> r   )argparseArgumentParseradd_argumentr   ROOTrq   
parse_argsr   r|   
read_bytesr   r}   selected_pointerr   r   r   print)parserargsr   s      r   mainr   V  s   $$&F
dD=4HI
.T3IyCyz
,4GyAyz
$<
4DghD$))2.$'',G
 '4<<7	DT\\  UG  FG  EH  I  Jr   __main__)r   r   r   r   returnr   )r   
str | Noner   z
int | None)r    
list[dict]r!   r   r   r   )r*   dictr   zdict[tuple[str, str], dict])r    r   r%   r   rF   r   r   r   )NN)r|   bytesr}   dict | Noner*   r   r   r   )r,   r   r   r   )r   r   r   r   r   )r   r   r   r   r   zPath | Noner   None)r   r   ))__doc__
__future__r   r   r   r   syspathlibr   typingr   r   insertr   __file__resolver   probe_exe_scene_tablesr   summarize_script_handler_tabler   r   r   rq   rx   ry   rr   rs   rz   r   r   r"   r-   rK   r   r   r   r   r   r   __name__r   r   r   <module>r      s   \ "    
   3tH~--/667 8 0 > H~''*
Ul		  803p '+15_	_#_ $/_ 
	_D.,^9xBJ" zF r   