
    Mj                       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
 ddlmZ  e
e      j                         j                  d   Zedz  d	z  Zed
z  Zedz  Zedz  Zedz  Zedz  Zedz  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 d+dZ!d,dZ"d-dZ#d.dZ$d*dZ%d/d0dZ&d1d2dZ'd3d Z(d4d!Z)e*d"k(  r e)        yy)5aH  Summarize web-runtime traces for the field HUD/menu open path.

The captures in captures/runtime are produced by the browser compatibility
runtime, not by static disassembly.  This report deliberately keeps the two
evidence classes separate:

* static anchors from earlier EXE analysis, especially menu descriptor/region
  initializers,
* observed runtime events from jsonl traces.

The main question for the first capture is narrow: when X is pressed on the
field, does runtime execution reach the selected-root / top-HUD-menu VM stream
neighborhood that static analysis identified?
    )annotationsN)Counter)Path)Any   capturesruntimeoutwebz"runtime_trace_hud_open_review.jsonz"runtime_trace_hud_open_review.htmlz!menu_descriptor_stack_review.jsonz'hud_input_consumer_boundary_review.jsonc                    | dS d| dS )N-0x08x values    ,tools/build_runtime_trace_hud_open_review.pyhxr   '   s    -35r%%55    c                V    t        j                  | dd      S t        |       d      S )N T)quote)htmlescapestrr   s    r   hr   +   s%    ;;U]r$GGE
$GGr   c                    t        | t              r| S t        | t              r| j                  d      sy 	 t        | d      S # t        $ r Y y w xY w)Nr      )
isinstanceintr   
startswith
ValueErrorr   s    r   parse_hex_intr#   /   sN    %eS!)9)9$)?5"~ s   A 	AAc                P    t        |       }|t        |      S t        | xs d      S )Nr   )r#   r   r   )r   numbers     r   hex_keyr&   :   s)    5!F+2f:AU[b1AAr   c                p    | j                         si S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)paths    r   	read_jsonr0   ?   s*    ;;=	::dnngn677r   c                   | si S 	 t         j                  |       }dt        |      i}|rd|d   d|d<   t        |      dk\  r&t	        t        j                  d|d      d         |d<   t        |      d	k\  r&t	        t        j                  d|d      d         |d
<   t        |      dk\  r&t	        t        j                  d|d	      d         |d<   |S # t        $ r ddicY S w xY w)NrawByteCountr   r   02x
opcodeByte   <Iword0Hex   	dword1Hex   	dword2Hex)bytesfromhexr"   lenr   structunpack_from)raw_hexrawdecodeds      r   
decode_rawrD   E   s    	#mmG$  .s3x8G
"$SVCL 1
3x1} !3!3D#q!A!!DE

3x1}!&"4"4T3"B1"EF
3x2~!&"4"4T3"B1"EFN  #""#s   C C$#C$c                    | sy	 t         j                  |       }dD ]#  }	 |j                  |      j	                         c S  y# t        $ r Y yw xY w# t
        $ r Y Aw xY w)Nr   )cp949zeuc-kr)r<   r=   r"   decoderstripUnicodeDecodeError)rA   rB   r*   s      r   decode_text_bytesrJ   X   su    mmG$ ( 	::h'..00
   
 " 		s"   A A	AA	AAc                f   | si S i }t        j                  d|       }t        j                  d|       }t        j                  d|       }t        j                  d|       }t        j                  d|       }t        j                  d|       }|r"|j                  d      j                         |d<   |r|j                  d      |d	<   |r|j                  d      |d
<   |r(|j                  d       d|j                  d       |d<   |r|j                  d      |d<   |r|j                  d      |d<   |S )Nzcaller=(0x[0-9a-fA-F]+)zsrcRect=([0-9,\-]+)zdstRect=([0-9,\-]+)z at ([0-9\-]+),([0-9\-]+)zsrcColorKey=([^ ]+)zappliedColorKey=([^ ]+)r   callersrcRectdstRect,   dstPointsrcColorKeyappliedColorKey)researchgrouplower)detailparsedrL   src_rectdst_rectatsrc_keyapplied_keys           r   parse_draw_detailr_   g   s   	FYY16:Fyy/8Hyy/8H	/	8Bii.7G))6?K!<<?002x$NN1-y$NN1-y	 "}Abhhqk];z 'a 0}$/$5$5a$8 !Mr   c                 T   t        t              } t        t              }i d'd(fd}| j                  d      xs i } ||j                  d      ddt	        t                      ||j                  d      ddt	        t                     | j                  d	      xs i } ||j                  d
      ddt	        t                      ||j                  d      ddt	        t                     |j                  d      xs i } ||j                  d      ddt	        t                      ||j                  d      ddt	        t                      ||j                  d      ddt	        t                     | j                  d      xs g D ]  }|j                  d      xs i } ||j                  d      d|j                  d       dt	        t              |j                  d      |j                  d      |j                  d      |j                  d      xs g d        |j                  d       xs i }t        |t              r|j                         }	nVt        |      D 
cg c]@  \  }
}t        |t              s|j                  d!      xs |j                  d      xs |
|fB }	}
}|	D ]S  \  }}t        |t              s ||j                  d"      xs |j                  d#      d$| d%t	        t                     U ||j                  d      xs i d&S c c}}
w ))Nlabelc                `    t        |       }|j                  d      sy ||||d|xs i |<   y )Nr   )
addressHexra   kindsource)r&   r!   )addrra   rd   re   extrakeyanchorss         r   addz load_static_anchors.<locals>.add   s@    dm~~d#	

 {
r   summarytopMenuParentContextScriptVaHexztop menu parent context scriptzstatic-menu-anchortopMenuObjectSequenceVaHexztop menu object sequencetopMenuObjectSequenceintermediateRecordVaHexztop menu intermediate recordintermediateScriptPointerVaHexz$top menu intermediate script pointerparentContextdynamicSelectVaHexztop menu parent dynamic selectdynamicCallVaHexztop menu parent dynamic calldynamicSelectedScriptVaHexz-intro/title selected script, not field openerzstatic-context-negative!exactTopContextRegionInitializersregioninitializerVaHexz&exact top context region initializer #regionIndexstatic-region-initializerrectTexttemplateIndexpointerRefsHex)rx   rz   r{   r|   keyFunctionsnamevaHexrc   zHUD input function zstatic-function)ri   menuSummaryhudInputSummaryN)rf   r   ra   r   rd   r   re   r   rg   dict[str, Any] | NonereturnNone)	r0   STATIC_MENU_DESCRIPTORSTATIC_HUD_INPUTgetr   r   dictitems	enumerate)menuhudrj   rk   top_sequenceparentrowrv   key_functionskey_iterindexr~   ri   s               @r   load_static_anchorsr      s>   +,D
$
%C)+G

 hhy!'RG568XZnps  uK  qL  M013MOcehi  fA  B8834:L235SUikn  pF  lG  H9:<bdxz}  U  {V  Wo.4"F

'(*JL`bef|b}~

%&(FH\^abx^yz

/02ac|  B  CY  Z  [xx;<B 
"(bGG&'4SWW]5K4LM'&'"ww}5"JJz2!'O!<"%''*:";"Ar		

 GGN+1rM-& &&(ZcdqZr  MJESV  wA  BE  GK  wLSWWV_A(8AE3G  M  M C	cc4  9CGGL$9=PQUPV;WYjlo  qA  mB  CC
 779-3  Ms   +L$,L$c                ,    t        |       }||v r||   S y r   )r&   )addressri   rh   s      r   match_anchorr      s     
'
C
g~s|r   c                    t        |       }|yd|cxk  rdk  ry d|cxk  rdk  ry d|cxk  rd	k  ry
 d|cxk  rdk  ry yy)Nr   i M i M top-menu-sequence-neighborhoodi M i M z)top-region-child-initializer-neighborhoodi G i G $top-menu-parent/context-neighborhoodi +D i+D z"descriptor-root-table-neighborhood)r#   )r   r   s     r   nearby_region_familyr      sk    '"E}U(j(/ )U(j(: )U(j(5 )U(j(3 )r   c                    g }t        | j                  d      j                         d      D ]A  \  }}|j                         st	        j
                  |      }||d<   |j                  |       C |S )Nr(   r)   r   _line)r   r.   
splitlinesstripr,   r-   append)jsonleventsline_nolineevents        r   load_trace_eventsr      sl    F"5??G?#D#O#O#QSTU zz|

4  ge Mr   c                  . t        |       }t        |      }|d   }t        d |D              }t        d |D              }t        d |D              }t        d |D              }	t        d |D              }
t        d |D              }|D cg c]3  }t        |j	                  d      t
              s#|j	                  d      5 }}g }|D ]O  }|j	                  d	      d
k7  rt        |j	                  d            }t        |j	                  d      |      }t        |j	                  d      |      xs t        |j	                  d      |      }t        |j	                  d            }d}|rd}n	|rd}n|rd}|j                  |j	                  d      |j	                  d      |j	                  d      |j	                  d      |j	                  d      t        |j	                  d            |j	                  d      |j	                  d      |||||d       R g }|D ]u  }|j	                  d	      dk7  rd }d }t        |j	                  d      t              r9	 t        t        j                  dt        j!                  |d               d         }t        |j	                  d      t              r9	 t        t        j                  dt        j!                  |d               d         }|j                  |j	                  d      |j	                  d      |j	                  d      |j	                  d      |j	                  d      |j	                  d      |j	                  d      |j	                  d      ||t        ||      t        |      d       x g }|D ]s  }|j	                  d	      d k7  rt        |j	                  d!            }t        |j	                  d"            }|j                  i d|j	                  d      d#|j	                  d      d|j	                  d      d|j	                  d      d|j	                  d      d$|j	                  d%      xs i j	                  d&      d'|j	                  d%      xs i j	                  d(      d)|d*|d+|j	                  d,      d-|j	                  d.      d/t        |      d0t        |      d1t        ||      d2t        ||      d%|j	                  d%      xs i        v g }|D ]  }|j	                  d	      d3k7  r|j	                  d%      xs i }|j	                  d4      xs d5}|j                  i d|j	                  d      d#|j	                  d      d|j	                  d      d|j	                  d      d6|j	                  d6      d7|j	                  d7      d8|j	                  d8      d9|j	                  d9      d:|j	                  d:      d;|j	                  d;      d<|j	                  d<      d=|j	                  d=      d>|j	                  d>      d?|j	                  d?      d@|j	                  d@      dA|j	                  dA      d4|t%        |      |dB        g }g }|D ]  }|j	                  d	      dCvri d|j	                  d      d#|j	                  d      d|j	                  d      d|j	                  d      dD|j	                  dD      d;|j	                  d;      d=|j	                  d=      d?|j	                  d?      dE|j	                  dE      dF|j	                  dF      dG|j	                  dG      dH|j	                  dH      dI|j	                  dI      dJ|j	                  dJ      dK|j	                  dK      dL|j	                  dL      dM|j	                  dM      |j	                  dN      |j	                  d%      xs i dO}|j	                  d	      dPk(  r|j                  |       |j                  |        g } |D ]  }|j	                  d	      dQk7  rt'        |j	                  d            }!| j                  |j	                  d      |j	                  d      |j	                  d      |j	                  d      |j	                  d:      |j	                  dR      |j	                  dS      |!|j	                  d      |j	                  dT      |j	                  dU      |j	                  dV      |j	                  dW      |j	                  d%      xs i dX        g }"|D ]  }|j	                  d	      dYk7  r|"j                  |j	                  d      |j	                  d      |j	                  d      |j	                  d      |j	                  dZ      |j	                  d[      |j	                  d\      |j	                  d      |j	                  d      d]	        |D cg c]R  }|j	                  d^      xs i j	                  d_      d`k(  s'|j	                  da      xs i j	                  d_      d`k(  r|T }#}|j	                  dbd      dkD  }$t)        dc |D              }%t+        |#      }&|D cg c]  }|j	                  d	      dYk(  s| }'}|'D cg c]2  }ddt        |j	                  d[      xs d5      j-                         vr|4 }(}|j	                  d d      |j	                  d3d      |j	                  dQd      |j	                  ded      |j	                  dYd      df})|$r|&r|%rdg}*n|$r|%r|)d    r|)d3   rdh}*n|$r|&s|%rdi}*ndj}*g }+|'s|+j                  dk       n|(s|+j                  dl       |)d    s|+j                  dm       |)d3   s|+j                  dn       |)dQ   s|+j                  do       |j	                  dp      xs d|j	                  dq      xs dz
  drk  r|+j                  ds       | D cg c])  }|j	                  dt      s|j	                  dt      xs d5+ },}g du}-|-D ..cg c]  .t)        .fdv|,D              s. }/}.i dw|j	                  dx      dyt        | j/                  t0                    dzt        |j/                  t0                    d{|d|t3        |      d}t5        |      d~t5        |      dt5        |      dt5        |	j7                  d            dt5        |
j7                  d            dt5        |j7                  d            d|rt9        |      nd |rt;        |      nd t3        t=        |            dd|*d|$|%t3        |#      t3        |'      t3        |(      t3        |      |)t3        |      t3        |      t3        |      t3        |       t3        |      dd|/|,t3        |/      dk\  dd|#d|||||| |"||+dS c c}w # t"        $ r d }Y w xY w# t"        $ r d }Y rw xY wc c}w c c}w c c}w c c}w c c}.w )Nri   c              3  >   K   | ]  }|j                  d         yw)r   Nr   .0r   s     r   	<genexpr>z"summarize_trace.<locals>.<genexpr>   s     <EUYYw'<s   c              3  h   K   | ]*  }|j                  d       dk(  s|j                  d       , yw)r   zfunction-enterfunctionNr   r   s     r   r   z"summarize_trace.<locals>.<genexpr>   s*     l%UYYwEW[kEk		*-l   22c              3  h   K   | ]*  }|j                  d       dk(  s|j                  d       , yw)r   vm-opopcodeNr   r   s     r   r   z"summarize_trace.<locals>.<genexpr>   *     _e7ASW^A^eii)_r   c              3  b   K   | ]'  }|j                  d       s|j                  d        ) yw)pcNr   r   s     r   r   z"summarize_trace.<locals>.<genexpr>   s"     Ie4%))D/Is   //c              3  h   K   | ]*  }|j                  d       dk(  s|j                  d       , yw)r   r   streamNr   r   s     r   r   z"summarize_trace.<locals>.<genexpr>   r   r   c              3  h   K   | ]*  }|j                  d       dk(  s|j                  d       , yw)r   r   objectNr   r   s     r   r   z"summarize_trace.<locals>.<genexpr>   r   r   framer   r   rB   r   r9   r;   	unmatchedzexact-static-anchor-hitzoperand-static-anchor-hitznear-static-neighborhoodseqr   r   r   r   )r   r   r   r   r   r   r   rB   rC   streamAnchoroperandAnchorfamilystatuszobject-stream-changeoldr6   r   newfield)r   r   r   r   r   r   oldRawnewRawoldValueHexnewValueHex	newAnchor	newFamilyvm-op-transitionprevious_streamnext_streamr   previousObjectstateprevious_object
nextObjectnext_objectpreviousStream
nextStreampreviousOpcodeprevious_opcode
nextOpcodenext_opcodepreviousFamily
nextFamilypreviousAnchor
nextAnchordraw-surfacerX   r   dllr~   resultre   destinationsourceLabeldestinationLabelsourceResourceNamedestinationResourceNamesourceSurfaceSizedestinationSurfaceSizeflags)rY   r   >   resource-surface-labelsurface-snapshotsurfaceHandleresourceNameresourceTypearchiveOffset
imageWidthimageHeightcolorKey	pixelHashpaletteHash
byteLengthnotes)r   r   r   	text-drawrecttextxyfontcolor)r   r   r   r   r   r   r   decodedTextrB   r   r   r   r   r   	mem-writer   symbolwidth)	r   r   r   r   r   r   r   r   r   r   rd   ry   r   selectedRootExecutorc              3  B   K   | ]  }|j                  d       dv   yw)r   >   r   r   Nr   )r   r   s     r   r   z"summarize_trace.<locals>.<genexpr>  s&       L|)-ww  Ls   inputtext-api)r   r   r   r  r   z@runtime-confirms-x-opens-status-hud-selected-root-region-streamszBruntime-confirms-status-hud-transition-and-directdraw-surface-copyzBruntime-partially-confirms-x-enters-status-hud-stream-neighborhoodzruntime-capture-insufficientzkno mem-write events captured; this would matter for menu navigation, not for the HUD-open consumer boundaryz~mem-write capture only contains input-edge writes; cursor/page/depth variables are out of scope for this no-navigation captureznno vm-op-transition events captured; opcode after-state/next-stream chain is still inferred from entry sampleszlno draw-surface events captured; DirectDraw surface/template consumption is not runtime-proven in this tracezmno text-draw events captured; TextOutA coordinates/font/color/text bytes are not runtime-proven in this trace	end_framestart_frame   z[short capture window; good for opener boundary but not enough for full draw/state lifecycler   )u	   아타호u   무기u	   방어구u   레벨u   체력u   기력u   경험u	   공격력u	   방어력u	   기술력u	   순발력u   선제u	   기본기u   정권c              3  &   K   | ]  }|v  
 y wr   r   )r   r   markers     r   r   z"summarize_trace.<locals>.<genexpr>  s     Lv`dVW[^Lvs   traceIdtrace_idmanifestPath	jsonlPathmanifest
eventCounteventCountsfunctionCountsopcodeCountspcCountsTop   streamCountsTop   objectCountsTop
frameRange)startenduniqueclassificationruntimeSignals)selectedRootExecutorSeentopMenuNeighborhoodSeen!exactTopRegionInitializerHitCountmemWriteCountnonInputMemWriteCountobjectStreamChangeCountexpectedRuntimeEventCountsdrawSurfaceCountsurfaceSnapshotCountresourceSurfaceLabelCounttextDrawCountvmTransitionCounthudStatusTextEvidencer8   )matchedMarkersdecodedTextsstatusWindowConfirmedexactRegionHitsvmRows)vmTransitionsdrawSurfaceRowssurfaceSnapshotRowsresourceSurfaceLabelRowstextDrawRows	memWritesobjectStreamChangeslimitations)r0   r   r   r   r   r    rD   r   r   r   r&   r   r   r?   unpackr<   r=   	Exceptionr_   rJ   anyboolrW   relative_toROOTr>   r   most_commonminmaxset)0manifest_path
jsonl_pathstaticr  r   ri   counts	functionsopcodespcsstreamsobjectsr   framesvm_rowsrC   stream_anchoroperand_anchorr   r   changes	old_value	new_valuetransitionsr   r   draw_surface_rowsr   rX   surface_snapshot_rowsresource_surface_label_rowsr   text_draw_rowsdecoded_textmem_write_rowsexact_region_hitsselected_root_seentop_menu_seentop_region_seen
mem_writesnon_input_mem_writesexpected_runtime_eventsr  r5  decoded_textshud_status_markersr  matched_status_markerss0                                                 ` r   summarize_tracera     sC   'Hz*FYG<V<<Fl6llI_v__G
IvI
IC_v__G_v__G.4\U
599WCUWZ8[eii \F\$&G 
99W(UYYu-.$UYYx%8'B%gkk+&>H{LY`YdYdepYqszL{%eii&9:.F0F/Fyy'		'*7+iio))H-!%))H"56))H-yy'" -!/  	

@ G 
99W!77		eii&,!v}}T5==u3NOPQRS	 eii&,!v}}T5==u3NOPQRS	 	yy'		'*7+iio))H-7+))E*))E*(())W=1)<	

@ K 
99W!33!%)),=">?eii67uyy'		'* 7+ eiio	
 %))H- !599W#5#;"@"@AR"S uyy17R<<]K !/ k !%)),="> eii6 !"6"G 2;? !,"H l;@  7+1r!	

4  
99W/		'"(b8$*  uyy'		'* 7+ eiio	
 uyy' 		&) %))H- %))H- uyy7 uyy7 #EII.@$A %eii0D&E *5995N+O $UYY/B%C )%))4L*M  7+!" &#$ ,F3'	

: "$ 499W%SS
599U#
EIIg&
 UYYw'
 %))D/	

 UYY7
 599]3
 !%)),@"A
  +>!?
 EIIn5
 EIIn5
 UYY7
 %))L1
 599]3
 		*-
 ;/
  599]3!
" %))L1#
$ YYw'YYw'-2'
* 99W!33!((-'..s374: N 
99W,(5)9:yy'		'*7+iio$yy7		&)		&)+yy'YYs^YYs^		&)7+7+1r	
	
. N 
99W,yy'		'*7+iio 99Y/))H-7+yy'yy'
	

& GGN#)r..v6:UUGGO$*//7;VV 	  #'=qAAE  L  DK  L  LM,-O%+QEuyy/A[/P%QJQ  #eii17R8>>@@ 	  #JJ'91=

>15ZZQ/JJz1-ZZQ/ o-[	2IJ\2]by  {I  cJ]	M]7K  I  	J!  \  	]"#56  L  	M">2  J  	K";/  K  	L[!&Q8<<+F+K!LPQQxy=KfcswwWdOeSWW]+1r1fMf  4FwLvhuLvIvfww/8<<
+/M55d;</ 	S//56/ 	H	/
 	c&k/ 	tF|/ 	$y// 	W/ 	tCOOB/0/ 	4 3 3B 78/ 	4 3 3B 78/ 	$*S["(3v;d#f+&
/" 	.#/$ 	(:'4145F1G _%()=%>'*7|*A #$5 6$'(=$>),-H)I 0!$[!1
%/@ 	 4)%()?%@A%E"
A/J 	,K/L 	'M/N %,4$?&#&"]/ /O ]X  ! 	!
  ! 	!j RH g" xsa   $x<2x<8y78y;Ay%
y*$y*.7y/y4)y4y9%y9yyy"!y"c            
     2   t               } g }t        t        j                  d            D ]  }|j	                  d      j	                  d      }|j                         s)|j                  |j                  j                  dd      z  }|j                         sm|j                  t        |||               t        |      t        d |D              t        d |D              t        | d         t        d |D              t        d	 |D              t        d
 |D              d}dddt        t        j                  t                    t        t         j                  t                    t        t"        j                  t                    d|| d   |g dd	S )Nz*.manifest.jsonr   z.jsonlz.manifest.jsonc              3  J   K   | ]  }|d    j                  d      sd  yw)r  runtime-confirmsr   N)r!   r   traces     r   r   zbuild_report.<locals>.<genexpr>-  s$     "sEBR<S<^<^_q<r1"s   ##c              3  0   K   | ]  }d |d   v sd  yw)	partiallyr  r   Nr   re  s     r   r   zbuild_report.<locals>.<genexpr>.  s      au+O_I`:` as   ri   c              3  J   K   | ]  }|d    j                  d      sd  yw)r  r'  r   Nr   re  s     r   r   zbuild_report.<locals>.<genexpr>0  s$     #n%UCS=T=X=XYl=mA#nrg  c              3  J   K   | ]  }|d    j                  d      sd  yw)r  r#  r   Nr   re  s     r   r   zbuild_report.<locals>.<genexpr>1  s$     $n5eDT>U>Y>YZl>mQ$nrg  c              3  J   K   | ]  }|d    j                  d      sd  yw)r  r&  r   Nr   re  s     r   r   zbuild_report.<locals>.<genexpr>2  s$     !h5AQ;R;V;VWf;g!!hrg  )
traceCountconfirmedTraceCountpartialTraceCountstaticAnchorCounttransitionTraceCountdrawSurfaceTraceCounttextDrawTraceCountr   z$hwanse-runtime-trace-hud-open-reviewz,tools/build_runtime_trace_hud_open_review.py)menuDescriptorStackhudInputConsumer)zno additional navigation capture is required for the HUD-open consumer question; current capture confirms opener VM path plus draw/text consumptionzoptional: add surface labels or resource ids for window.cns/status.cns/icon.cns/num.cns/face_01.cns if asset-level draw attribution is neededzonly if investigating menu navigation later, capture Up/Down/Left/Right, Enter, and Escape with cursor/depth/page/selected-actor watchpoints)	versionrd   re   capturesDirstaticSourcesrk   staticAnchorstracesnextCaptureRequirements)r   sortedCAPTURESglobwith_suffixr+   r   r~   replacer   ra  r>   sumr   r:  r;  r   r   )rB  rz  r  r   rk   s        r   build_reportr    sa    "FF8==):;< @$$R(44X>||~OOhmm&;&;<Lh&WWE||~ohv>?@ &k""s&"ss  a aa 	!23 ##n6#n n!$$nF$n!n!!h!hhG 6@8//56#&'='I'I$'O#P #$4$@$@$F G
 	*$
 r   c                8    dt        |       dt        |        dS )Nz<span class="badge z">z</span>r   )r   clss     r   badger  H  s     31T7)7;;r   c                    g }t        |j                               d | D ]&  \  }}|j                  dt        |       d| d       ( dt        |        ddj	                  |       dS )Nz<tr><td><code></code></td><td>
</td></tr>z<section><h2>uE   </h2><table><thead><tr><th>값</th><th>count</th></tr></thead><tbody>r   z</tbody></table></section>)listr   r   r   join)titlerowslimitbodyrh   counts         r   render_count_tabler  L  s    D4::<(%0 P
UnQsVH,<UG:NOP1U8*$ijljqjqrvjwix  yS  T  Tr   c                   g }| d   D 
]  }|d   }dj                  t        d|d    |d   rdnd      t        d|d	    |d	   rdnd      t        d
|d    |d   rdnd      t        d|d    |d   sdnd      t        d|j                  dd       |j                  dd      rdnd      t        d|j                  dd       |j                  dd      rdnd      t        d|j                  dd       |j                  dd      rdnd      g      }g }|d   D ]  }|d   dk(  r|j                  d      xs |j                  d      xs i }|j                  d|d    d|d    dt	        |d           d!t	        |d"          d!t	        |d#          d$t	        |d          dt	        |j                  d%      xs |j                  d&             dt	        |j                  d'i       j                  d(             d)t	        |j                  d'i       j                  d*             d+        |s|j                  d,       g }|d-   D ]  }|j                  d.      xs i }|j                  d|d    d|d    dt	        |d/          d!t	        |d           d$t	        |d0          dt	        |d1          d!t	        |d2          d$t	        |j                  d%      xs |j                  d3      xs d       d4        |s|j                  d5       g }	|j                  d6      xs g D ]`  }|j                  d7      xs i }
|j                  d8      xs i }|j                  d9      s|j                  d:      s|
s|sU|	j                  d|d    d|d    dt	        |j                  d;             d<t	        |j                  d=             d!t	        |d>          d?t	        |j                  d@             dAt	        |dB          d?t	        |j                  dC             dDt	        |
j                  d%      xs |j                  d9      xs d       dt	        |j                  d%      xs |j                  d:      xs d       d4       c |	s|	j                  dE       g }|j                  dF      xs g d dG D ]L  }|j                  dH      xs i }|j                  d|d    d|d    dt	        |j                  d/             d$t	        |j                  dI             dt	        |j                  dJ             d<t	        |j                  dK             d!t	        |j                  dL             d$t	        |j                  dM      xs d       dt	        |j                  dN      xs |j                  dO      xs d       dt	        |j                  dP      xs d       dQt	        |j                  dR      xs d       d4       O |s|j                  dS       g }|j                  dT      xs g D ]!  }|j                  dU      xs i }|j                  d|d    d|d    dt	        |j                  d/             d!t	        |j                  dK             d$t	        |j                  dV      xs |j                  dW      xs d       dt	        |j                  dX      xs |j                  dY      xs d       dt	        |j                  dZ             d$t	        |j                  d[             dt	        |j                  d\             d4       $ |s|j                  d]       g }|j                  d^      xs g D ]  }|j                  d|d    d|d    dt	        |j                  d/             d!t	        |j                  d_             d$t	        |j                  d`             dt	        |j                  da             dt	        |j                  db             d!t	        |j                  dc             d+        |s|j                  dd       dj                  de |df   D              }|j                  dg      xs i }dj                  dh |j                  di      xs g D              }t        |j                  dj            }|j                  dj                  g dkt	        |j                  dl      xs |dm   j                  dn             dot	        |dp          d)t	        |dq          drt        |ds   |ds   j                  dt      rdnd       du| dvt	        |dw   dx          dyt	        |dw   dz          d{|d|    d}t        d~t        |      z   |rdnd       | ddj                  |       ddj                  |	       ddj                  |       ddj                  |       ddj                  |       ddj                  |       d| dt        d|d          dt        d|d          dt        d|d          dt        d|d   d       d             
 dj                  d | d   D              }dt        dt        | d   d         z          t        dt        | d   d         z   | d   d   rdnd       t        dt        | d   d         z          dt	        t        t        j                  t                           ddj                  |       d| dS )Nrz  r  r   zselectedRoot=r  okbadztopMenu=r  zregionHits=r  warnz
memWrites=r  ztransitions=r'  r   zdraws=r#  ztext=r&  r-  r   r   r   r   z<tr><td>r   z	</td><td>r   z</td><td><code>r   z</code></td><td><code>r   r   r  ra   r   rC   r9   z</code> / <code>r;   z</code></td></tr>u6   <tr><td colspan='8'>matched VM stream 없음</td></tr>r4  r   r   r   r   r   r   r  u9   <tr><td colspan='8'>object stream change 없음</td></tr>r.  r   r   r   r   r   z</code> -> <code>r   r   z	</code> (r   z)</td><td><code>r   r   z
)</td><td>u7   <tr><td colspan='7'>matched transition 없음</td></tr>r/  P   rY   r~   re   r   r   rM   rN   rQ   rR   z / rS   u1   <tr><td colspan='9'>draw-surface 없음</td></tr>r2  r   r   boundsr   r   rB   r   r   u.   <tr><td colspan='9'>text-draw 없음</td></tr>r3  r   r   r   r   r   u.   <tr><td colspan='8'>mem-write 없음</td></tr>c              3  :   K   | ]  }d t        |       d  ywz<li>z</li>Nr  r   items     r   r   zrender_html.<locals>.<genexpr>  s     UQtWIU3U   r5  r(  c              3  4   K   | ]  }t        |d         yw)r  N)r  )r   r  s     r   r   zrender_html.<locals>.<genexpr>  s     lfd 3ls   r)  r+  z7
            <section class="trace">
              <h2>r  r  r	  z+</h2>
              <p class="muted"><code>r
  r  z</code></p>
              <p>r  rd  z'</p>
              <div class="badges">z</div>
              <p>frame r  r  z..r  z	, events r  z</p>
              <p>zstatus-window-text=u   </p>
              <h3>정적 anchor와 맞은 VM rows</h3>
              <table><thead><tr><th>seq</th><th>frame</th><th>object</th><th>stream</th><th>op</th><th>판정</th><th>근거</th><th>operands</th></tr></thead><tbody>u   </tbody></table>
              <h3>VM transitions</h3>
              <table><thead><tr><th>seq</th><th>frame</th><th>object</th><th>previous</th><th>next</th><th>previous 근거</th><th>next 근거</th></tr></thead><tbody>u   </tbody></table>
              <h3>Object stream changes</h3>
              <table><thead><tr><th>seq</th><th>frame</th><th>pc</th><th>object</th><th>field</th><th>old</th><th>new</th><th>new 근거</th></tr></thead><tbody>z</tbody></table>
              <h3>Memory writes</h3>
              <table><thead><tr><th>seq</th><th>frame</th><th>pc</th><th>address</th><th>symbol</th><th>width</th><th>old</th><th>new</th></tr></thead><tbody>z</tbody></table>
              <h3>Draw surface calls</h3>
              <table><thead><tr><th>seq</th><th>frame</th><th>pc</th><th>name</th><th>surface</th><th>flags</th><th>src</th><th>dst</th><th>color key</th></tr></thead><tbody>z</tbody></table>
              <h3>Text draw calls</h3>
              <table><thead><tr><th>seq</th><th>frame</th><th>pc</th><th>surface</th><th>rect</th><th>decoded</th><th>raw</th><th>font</th><th>color</th></tr></thead><tbody>u2   </tbody></table>
              <h3>제한</h3><ul>z</ul>
              zevent countsr  z
              zfunction countsr  zopcode countsr  zstream countsr  r  z$
            </section>
            c              3  :   K   | ]  }d t        |       d  ywr  r  r  s     r   r   zrender_html.<locals>.<genexpr>  s     \$$qwiu-\r  r{  u9  <!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Runtime Trace HUD Open Review</title>
  <style>
    body { margin: 0; background: #f6f7f9; color: #20242b; font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }
    main { width: min(1280px, calc(100vw - 24px)); margin: 0 auto; padding: 22px 0 36px; }
    h1 { margin: 0 0 8px; font-size: 26px; }
    h2 { margin-top: 22px; font-size: 20px; }
    h3 { margin: 18px 0 8px; font-size: 15px; }
    p { margin: 6px 0; }
    .muted { color: #697385; }
    .trace, .summary { background: #fff; border: 1px solid #d8dee8; border-radius: 8px; padding: 14px; margin: 12px 0; overflow: auto; }
    table { border-collapse: collapse; width: 100%; font-size: 13px; margin: 8px 0 14px; }
    th, td { border: 1px solid #e1e6ef; padding: 6px 8px; text-align: left; vertical-align: top; }
    th { background: #f0f3f8; }
    code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; }
    .badge { display: inline-block; border: 1px solid #c9d1dc; border-radius: 999px; padding: 3px 8px; margin: 2px 4px 2px 0; background: #eef2f7; font-size: 12px; font-weight: 700; }
    .badge.ok { color: #116b3a; background: #eaf7ef; border-color: #bfe6cb; }
    .badge.warn { color: #8a5c00; background: #fff6dd; border-color: #ead18c; }
    .badge.bad { color: #9c1d1d; background: #fff0f0; border-color: #efc5c5; }
  </style>
</head>
<body>
<main>
  <h1>Runtime Trace HUD Open Review</h1>
  <section class="summary">
    <p>웹 런타임 캡처를 정적 EXE 분석 anchor와 대조한 리포트입니다. 현재 목적은 필드에서 X 입력 시 상태창/HUD opener와 draw/text 소비자가 실제로 실행되는지 확인하는 것입니다.</p>
    <p>ztraces rk   rm  z
confirmed rn  zstatic anchors rp  z</p>
    <p>JSON: <code>z</code></p>
  </section>
  uM   
  <section class="summary">
    <h2>다음 캡처 요구사항</h2>
    <ul>z+</ul>
  </section>
</main>
</body>
</html>
)r  r  r   r   r   r9  r!   r   r  JSON_OUTr:  r;  )reporttrace_sectionsrf  signalssignal_badgesrJ  r   anchorchange_rowstransition_rowsprev_anchornext_anchor	draw_rowsrY   	text_rowsr   mem_rowsr5  text_evidencemarker_badgesstatus_confirmed	next_reqss                         r   render_htmlr  S  s   N! L
()g.H&I%JKU\]wUxT  D  E)B!C DEwWpOqtw|}G,O$P#QR\c  eH  ]ITX  OU  V
7?#;"<=WUdMevkopW[[1Da%H$IJT[T_T_`suvTwD  ~D  Ew{{+=qABCW[[YkmnMoTu{|gkk/1=>?UdfgIhntu

 ? 	C8}+WW^,N0HNBFNN5zl)CL>3x=IYHZ [s8}-..DQs8}EUDV WX'(	!FJJw4G4\377S[K\2]1^ _swwy"599+FGHHXYZ[^[b[bclnp[q[u[u  wB  \C  ZD  YE E			 NNST./ 		CWW[)/RF5zl)CL>3t9 Ws8}-..>qW>O Ps=1233I!CP]L^J_I` aG,J0DJKL M			 Z[99_-3 	C''"239rK'',/52K()77<(""5zl)CL> :sww'789::KAcggVbNcLdKe fs#3456i#''JZB[@\?] ^s<012)Acggl>S<T;U V1TSWW=M5NTRTUV W1PSWW\5JPbQR S		( ""#\]	II/06B< 
	CWWX&,"F5zl)CL>377SW=IYHZ [)*/!CGGH<M:N9OO`abcfcjcjkxcyaz`{ |swww/01 2I.4"56i&**YBWBw[a[e[efp[qBwuw@x?y zM28b9:#a

K\@]@cac>d=e f
	 PQ	99^,2 		CGGG$*E5zl)CL>377SW=IYHZ [sww}5677G#''RX/Jv]b]f]fgo]pJvtvHwGx y/H3776?HbIJ Kswwu~.//?#''&/@R?SS\]^_b_f_fgn_o]p\q r			 MN99[)/R 	COO5zl)CL>377SW=IYHZ [swwy1233CAcgghFWDXCY Z)*+?1SWWU^;L:MMcdefifmfmnsftducv w	 OOLMggUm@TUU		"9:@bl-BSBSTdBeBkikll 1 12I JK   UYYy)NU:->-B-B:-NOPQ& '(n(=&>%? @P QRRWXcRdPeOfg ./?O9P9[9[\n9ou{|}	~#	
 $1/
2 %-g678 9; <=U<=PQV=W;X:Y Zc diiucvbwx -4D0EEO_teklm o|m|}g hj  ho  ho  pw  hx  gyyh ik  ip  ip  q@  iA  hBBb ce  cj  cj  kv  cw  bxx_ `b  `g  `g  hp  `q  _rro" pr  pw  pw  xA  pB  oC#"Cn#& oq  ov  ov  w@  oA  nB'&B"'( #.)(/)* ".%2FGH+*I+, ""3U;K5LMN-,O-. "/53HIJ/.K/0 "/59J3KRPQ10R1	
aL
\ \&AZ:[\\I< 	i#fY/=>>?@|VYZ`ajZk  mB  [C  WD  HD  NT  U^  N_  `u  Nv  FJ  |B  BC  AD  EJ  K\  _b  ci  js  ct  uH  cI  _J  KJ  EK  DL Lc(..t4567 877> 	 
 I) )r   c                    t         j                  d       t        j                  d       t               } t        j                  t        j                  | dd      dz   d       dj                  d	 t        |       j                         D              dz   }t        j                  |d       t        d
t        j                  t                      t        d
t        j                  t                      y )NT)exist_okFrP   )ensure_asciiindent
r(   r)   c              3  <   K   | ]  }|j                           y wr   )rH   )r   r   s     r   r   zmain.<locals>.<genexpr>  s     UD$++-Us   zwrote )OUTmkdirWEBr  r  
write_textr,   dumpsr  r  r   HTML_OUTprintr:  r;  )r  	html_texts     r   mainr    s    IItIIItI^F

6aH4OZab		UK4G4R4R4TUUX\\I	G4	F8''-.
/0	F8''-.
/0r   __main__)r   
int | Noner   r   )r   r   r   r   )r   r   r   r  )r/   r   r   dict[str, Any])rA   
str | Noner   r  )rA   r  r   r   )rX   r  r   r  )r   r  )r   r   ri   zdict[str, dict[str, Any]]r   r   )r   r   r   r   )r   r   r   zlist[dict[str, Any]])r@  r   rA  r   rB  r  r   r  )r   )r   r   r  r   r   r   )r  )r  r   r  zdict[str, int]r  r    r   r   )r  r  r   r   )r   r   )+__doc__
__future__r   r   r,   rT   r?   collectionsr   pathlibr   typingr   __file__resolveparentsr;  r}  r  r  r  r  r   r   r   r   r#   r&   r0   rD   rJ   r_   r   r   r   r   ra  r  r  r  r  r  __name__r   r   r   <module>r     s	   #   	     H~''**y(
Ul
Ul5555BB BB 6HB
8&28v@F
&R<Tzz1 zF r   