
    Ij                       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ZdZdZdZdZdZ eez
  Z!dZ"dZ#dZ$dZ%dZ&dddddZ'dg dddg ddd g d!dgZ(e)jU                  d"      d#d$fe)jU                  d%      d#d&fe)jU                  d'      d#d(fe)jU                  d)      d*d$fe)jU                  d+      d*d&fe)jU                  d,      d*d(ffZ+d-Z,d.efd/efd0effZ-dMd1Z.dNd2Z/dOd3Z0dPd4Z1dQd5Z2dRd6Z3dSd7Z4dTd8Z5dUdVd9Z6e"f	 	 	 	 	 	 	 	 	 	 	 dWd:Z7dXd;Z8dSd<Z9dYd=Z:dZd>Z;d[d?Z<d[d@Z=d\dAZ>d]dBZ?d^dCZ@d_dDZAd`dEZBdadFZCdbdcdGZDdddHZEdddIZFedfdedJZGdfdKZHeIdLk(  r eH        yy)gzNDocument save-selector dispatch-table anchoring for the current route blocker.    )annotationsN)Path)Any)offset_to_varead_sectionsva_to_offset   outmap1_01amap2_02di8D i D iG i#@ i!#@ iL#@    )      	   )            )?   r   &   ,   H   r   8      c   P   r   ))zroute-dispatch-stopi(T    )zwrapper-child-pointeri*T r   )zdirect-leaf-entry-0i)T r   )zdirect-leaf-entry-1i)T    )zpredecessor-root-entry-stopiG    )zpredecessor-fill-fragment-stopiDH r   z=runtime dispatch proof for the 0x00440720 save-selector slicezLruntime bridge from route descriptor boundaries into the save-selector slicezKdynamic register-base dispatch candidate using the save-selector table basezCroute-relevant table-base switch proof for descriptor-boundary rows)$save-selector-slice-runtime-dispatch"descriptor-boundary-runtime-bridge*dynamic-save-selector-table-base-candidate&route-relevant-slice-table-base-switchHwanse2.exe)z-0x0040234c generic indexed dispatch immediatez!0x00440538 general dispatch tablez'0x00440720 save-selector dispatch slicez&0x0047f1d8 event-object dispatch table)pathfieldsz$out/save_selector_stream_traces.json)sourcetargettrace	opcodeHexhandlerVaHexz-out/save_selector_dispatch_table_context.json)relativeOpcodeRowsrouteRelevantDispatchRowsdynamicIndexedDispatchRowsdynamicScopeTableCallbackRows)dynamicSaveSelectorTableBaseCandidateRowsff1485calleaxff148decxff1495edxff2485jmpff248dff2495)r3   r5   r7   ebxespebpesiedigeneral-objectsave-selectorevent-objectc                    | y d| dS )N0x08x )values    7tools/summarize_save_selector_dispatch_table_context.pyhex32rJ   j   s    }c{    c                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)r%   fallbacks     rI   	load_jsonrU   p   s*    ;;=::dnngn677rK   c                r    | D ]2  }t        |d         }|t        |d         z   }||cxk  r	|k  s.|c S  4 y )Nrawraw_size)int)sectionsoffsetsectionstartends        rI   section_for_offsetr_   v   sO     GEN#c'*-..F S N !
 rK   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   <Ir   )r   lenstructunpack_from)exerZ   var[   s       rI   dword_atrh      s?    (B'F~!c#h.dC033rK   c                    |y | D ]?  }t        |d         }|t        |d         z   }||cxk  r|k  s.n 1t        |d         c S  y )Nrg   rX   name)rY   str)rZ   rg   r\   r]   r^   s        rI   section_name_for_varl      s\    	z (GDM"c'*-..Bwv''	(
 rK   c                    t        j                  d|      }g }d}	 | j                  ||      }|dk  r	 |S |dz   }t        ||      }|s/t	        ||      }|>|j                  |d   t        |      d|dd       c)Nrb   r   r	   rj   rE   06x)r\   refVaHexfileOffsetHex)rd   packfindr_   r   appendrJ   )	rf   rZ   rH   needlerefssearchhitr\   ref_vas	            rI   find_dword_refsry      s    [[u%FDF
hhvv&7 K q$Xs3h,>vf!#c^
 	 rK   c                Z   t        d |D              }t        |d         }| ||t        |d         z    }g }t        dt        dt	        |      dz
              D ]  }t
        D ]  \  }}}	|||t	        |      z    |k7  r||z   t	        |      z   }
t        j                  d| |
      d   }t        |d         |z   }|j                  t        |      ||	t        |      t        |      |
t	        |      z
  t        | ||
t	        |      z
  dt        fd	t        fd
t        fg      d         |S )Nc              3  2   K   | ]  }|d    dk(  s|  ywrj   .textNrG   .0r\   s     rI   	<genexpr>z*find_indexed_dispatches.<locals>.<genexpr>        NG76?g3MN   rW   rX   r   r   rb   rg   general-tablesave-selector-tablesave-selector-slice-delta)instructionVaHexkindindexRegistertableBaseHex	tableRole	rawOffsetnearbyTableBaseArithmeticRefs)nextrY   rangemaxrc   INDEXED_PATTERNSrd   re   rs   rJ   
table_rolenearby_dword_immediatesGENERAL_HANDLER_TABLESAVE_SELECTOR_HANDLER_TABLE SAVE_SELECTOR_SLICE_OFFSET_BYTES)rf   rZ   text	raw_startrW   rowsindexpatternr   register
imm_offsetbaserg   s                rI   find_indexed_dispatchesr      sN   NxNNDDK I
iSj)9%::
;CDq#aSA./ '7 	#GT85W-.'9"U*S\9J%%dC<Q?DT$Z5(BKK$)"I!) %d'-'#g,61HW-(*?@.0KL46VW		2 	2 KrK   c                n    |dk(  r| |   }|dz  r|dz
  S |S |dk(  rt        j                  d| |      d   S y)Nr	         ra   z<ir   )rd   re   )rf   r[   sizerH   s       rI   signed_dispr      sK    qyF %uu}7%7qy!!$V4Q77rK   c                   t        d |D              }t        t        |d         ||z
        }t        t        |d         t        |d         z   |dz         }g }t        D ]w  \  }}	t        j                  d|	      }
|}	 | j                  |
||      }|dk  r8t        ||      }|-|j                  |t        |	      t        |      ||z
  dd       |d	z   }Z |j                  d
        |S )Nc              3  2   K   | ]  }|d    dk(  s|  ywr|   rG   r~   s     rI   r   z*nearby_table_immediates.<locals>.<genexpr>   r   r   rW   rX   r   rb   r   +#x)r   
tableVaHexro   relativeToInstructionHexr	   c                    | d   | d   fS )Nro   r   rG   rows    rI   <lambda>z)nearby_table_immediates.<locals>.<lambda>   s    s:K0@A rK   key)r   r   rY   minDISPATCH_TABLESrd   rq   rr   r   rs   rJ   sort)rf   rZ   
raw_offsetwindowr   r]   r^   r   roletable_vart   cursorrw   rx   s                 rI   nearby_table_immediatesr      s   NxNNDDK *v"56E
c$u+T*%5!66
R
HCD) hT8,((663/CQw!(C0F!!%"'/ %f363CC2H	  1WF   	IIAIBKrK   c                   t        d |D              }t        t        |d         ||z
        }t        t        |d         t        |d         z   |dz         }g }|D ]w  \  }	}
t	        j
                  d|
      }|}	 | j                  |||      }|dk  r8t        ||      }|-|j                  |	t        |
      t        |      ||z
  dd       |d	z   }Z |j                  d
        |S )Nc              3  2   K   | ]  }|d    dk(  s|  ywr|   rG   r~   s     rI   r   z*nearby_dword_immediates.<locals>.<genexpr>   r   r   rW   rX   r   rb   r   r   )r   valueHexro   r   r	   c                    | d   | d   fS )Nro   r   rG   r   s    rI   r   z)nearby_dword_immediates.<locals>.<lambda>  s    s:F< rK   r   )r   r   rY   r   rd   rq   rr   r   rs   rJ   r   )rf   rZ   r   valuesr   r   r]   r^   r   r   rH   rt   r   rw   rx   s                  rI   r   r      s	    NxNNDDK *v"56E
c$u+T*%5!66
R
HCD eT5)((663/CQw!(C0F!  %e %f363CC2H	  1WF   	II<I=KrK   c                   t        d |D              }t        |d         }|t        |d         z   }| t        ||dz
        | }| |t        ||dz          }d|v }	d|v xs d|v }
d	|v xs d
|v }d|v xs d|v }|	xr- |
xr) |j	                  d      dk(  xr |j	                  d      dv }|r|rd}d}nd}|rdnd}d}nd}d}d }|j	                  dd      dkD  xr |dk(  }|||||	|
|dS )Nc              3  2   K   | ]  }|d    dk(  s|  ywr|   rG   r~   s     rI   r   z+dynamic_dispatch_context.<locals>.<genexpr>  r   r   rW   rX   r   @   s   s   4vs   vs   d5    s   d%    s   &s   scalera   displacement>   ra   r   %seh-registration-scope-table-callbackzSnearby fs:0 SEH registration plus state==-1 sentinel and index*3 triplet table walkseh-scope-table-callbackz[state==-1 sentinel and index*3 triplet table walk; helper calls the SEH registration walkerz1state==-1 sentinel and index*3 triplet table walk   z%unclassified-dynamic-indexed-dispatchz+no local SEH scope-table pattern identified%nearbySaveSelectorTableImmediateCountr   )contextClassificationcontextReasonscopeTableStrideByteshasSehRegistrationPatternhasSentinelMinusOneStateCheckhasTripletIndexScalePattern!candidateForSaveSelectorTableBase)r   rY   r   r   get)rf   rZ   r   r   r   
text_starttext_endbeforeafterhas_sentinel_statehas_triplet_indexhas_seh_registrationcalls_unwind_helperis_scope_table_callbackclassificationreasonscope_stride	candidates                     rI   dynamic_dispatch_contextr   
  s   NxNNDT%[!JCZ 011HZc!12:>F
3xb9:E(F2'61N_5N'61 	5*f4  2V;_?VZ_?_ 	.	.GGG!	. GGN#v-	  DN% 
 8N '. I	  @>7;a? 	FEE 
 "0!-%9);'8-6 rK   c                n   t        d |D              }t        |d         }|t        |d         z   }g }t        ||dz
        D ]n  }| |   dk7  r| |dz      }|dz	  dz  }|d	vr"|dz  d
k7  r+|dz	  dz  }	|	dk(  r9| |dz      }
|
dz	  dz  }|
dz	  dz  }|
dz  }|d
k(  r\|dk7  rb|	dk(  xr |dk(  }|rq|	dk(  rdn|	dk(  rd
nd}|dz   |z   |kD  rt        | |dz   |      }t	        ||      }|t        | ||      }t        |      |dk(  rdndt        |   t        |   d|z  |dk(  ||d| ||dz   |z    j                         ||t        | ||dt        fdt        fdt        fg      t        d |D              t        |      d}|j                  t!        | |||             |j#                  |       q |S )zHFind indirect call/jmp rows with a register table base and scaled index.c              3  2   K   | ]  }|d    dk(  s|  ywr|   rG   r~   s     rI   r   z2find_dynamic_indexed_dispatches.<locals>.<genexpr>B  r   r   rW   rX         r	      r   >   r   ra   ra      r      r2   r9   r   r   r   r   c              3  J   K   | ]  }|j                  d       dk(  sd  yw)r   rB   r	   Nr   r   r   s     rI   r   z2find_dynamic_indexed_dispatches.<locals>.<genexpr>{  s%      9sww{';'N9   ##)r   r   baseRegisterr   r   isDwordScaledIndexr   displacementHexencodingHexr   nearbyTableImmediateRefsr   r   &nearbyKnownDispatchTableImmediateCount)r   rY   r   r   r   r   rJ   REG32hexr   r   r   r   sumrc   updater   rs   )rf   rZ   r   r   raw_endr   r[   modrmregmodsib
scale_bitsr   r   no_base_disp32	disp_sizer   instruction_vanearbyr   s                       rI   find_dynamic_indexed_dispatchesr   @  sN   NxNNDDK I#d:.//GD	7Q;/ ;v;$FQJzT!fDLQzT!!8&1*oQh$&
T!TzA:?/daiAC1Hq!	A:	!G+"3
I>%h7!(h? %n 5!QhFE!$K"5\*_",/(".s!3vvzI'=>BBD(.-D$&;<*,GH02RS		. 69 9#9 6 7:&k3
6 	

+C63GHCw;x KrK   c                @    | t         k(  ry| t        k(  ry| t        k(  ryy)NrA   rB   rC   other)r   r   EVENT_OBJECT_HANDLER_TABLE)r   s    rI   r   r     s)    $$**))rK   c                    i }| D ]8  }t        |j                  d      xs d      }|j                  |d      dz   ||<   : |S )Nr   unclassifiedr   r	   )rk   r   )r   countsr   r   s       rI   &dynamic_dispatch_classification_countsr    sO    F -#''12DnEjja(1,s- MrK   c                   | D cg c]  }t        |j                  d      xs d      j                  d      r|j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d	      |j                  d      |j                  d
      |j                  d      |j                  d      |j                  d      |j                  d      d c}S c c}w )Nr    zseh-r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   )rk   r   
startswithr   r   s     rI   !dynamic_scope_table_callback_rowsr    s       sww./526AA&I !$(: ;GGFOGGN3 WW_5WWW%"ww'89%(WW-D%E WW_5%(WW-D%E149\1]58WW=d5e69gg>f6g	
  s   C7C?c                   | D cg c]  }|j                  d      du r|j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d	      |j                  d
      |j                  d      xs g |j                  d      |j                  d      d c}S c c}w )Nr   Tr   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r  s     rI   /dynamic_save_selector_table_base_candidate_rowsr	    s      77674? !$(: ;GGFOGGN3 WW_5WWW%"ww'89%(WW-D%E WW_5(+0J(K(Qr58WW=d5e149\1]	
  s   CCc                   g }| D ]W  }|j                  d      }t        |t              s&|j                  d      xs g }t        d |D              }t        d |D              }t        d |D              }|j                  d      dvxr |dkD  xs |dkD  xr |dkD  }|dkD  rd	}	n|dkD  r|dkD  rd
}	n|dkD  rd}	n
|dkD  rd}	nd}	|j	                  |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      ||||||	d       Z |S )Nr   r   c              3  J   K   | ]  }|j                  d       dk(  sd  yw)r   r   r	   Nr   r   refs     rI   r   z;save_selector_table_base_arithmetic_rows.<locals>.<genexpr>  s     _#CGGFO<^A_r   c              3  J   K   | ]  }|j                  d       dk(  sd  yw)r   r   r	   Nr   r  s     rI   r   z;save_selector_table_base_arithmetic_rows.<locals>.<genexpr>  s      bsLa9abr   c              3  J   K   | ]  }|j                  d       dk(  sd  yw)r   r   r	   Nr   r  s     rI   r   z;save_selector_table_base_arithmetic_rows.<locals>.<genexpr>  s      ocSn@nor   r   >   r   r   r   z2direct-save-selector-table-immediate-near-dispatchz1general-table-plus-save-slice-delta-near-dispatchzgeneric-table-immediate-onlyzslice-delta-without-table-basez#no-table-base-arithmetic-immediatesr   r   r   r   r   r   r   )r   r   r   r   r   r   r   r    nearbyGeneralTableImmediateCountr   &nearbySaveSelectorSliceDeltaImm32Countr   +candidateForSaveSelectorTableBaseArithmeticr   )r   
isinstancerY   r   rs   )
dispatch_rowsr   r   r   arithmetic_refsgeneral_count
save_countslice_delta_countr   r   s
             rI   (save_selector_table_base_arithmetic_rowsr    s   D (WW[)
*c*''"ABHb___bobb
o_ooGG+, 5  R aPMA$5$O:Ka:O 	 >QNQ#4q#8PNQ;N"=NBN #(: ;GGFOGGN3 WW_5WWW%GGN3-%(WW-D%E0=5?6G-<;D,
 	3(R KrK   c                `    dj                  d | j                  d      xs g D              xs dS )N, c              3  f   K   | ])  }|j                  d        d|j                  d        + yw)r   @ro   Nr   r  s     rI   r   z#nearby_refs_text.<locals>.<genexpr>  s7       77;
 #''*"5!67s   /1r   -)joinr   r   s    rI   nearby_refs_textr     s9    99 7756<"   
rK   c                    t        | ||      }|D cg c]"  }|j                  d      t        |      k(  s!|$ }}t        |      t        |      t	        d |D              t        |      |d d |dS c c}w )Nr   c              3  J   K   | ]  }|j                  d       dk(  sd  yw)r\   r}   r	   Nr   r   s     rI   r   z$table_ref_summary.<locals>.<genexpr>  s       Tscggi6HG6S Tr       )r   directDwordRefCounttextDwordRefCountindexedDispatchCountru   indexedDispatches)ry   r   rJ   rc   r   )rf   rZ   table
dispatchesru   r   indexeds          rI   table_ref_summaryr+    sv    3%0D(TsCGGN,CuU|,SsTGTEl"4y  Td TT #GSb	$  Us
   "A2A2c                   t         |dz  z   }t        | ||      }t        |dz  z   }t        | ||      }|t        z
  dz  }t        |dz  z   }t        | ||      }	d|cxk  xr dk  nc }
i d|dd|ddt        |      d	t        |      d
t	        ||      dt        |      dt        |      dt	        ||      d|dd|dd|
rd|dnd d|
dt        |      dt        |	      d|	|k(  d|
xr |	|k(  d|t
        k(  S )Nra   r   r   relativeOpcoderelativeOpcodeHexrE   02xsaveEntryVaHexsaveHandlerVaHexsaveHandlerSectiongeneralRawEntryVaHexgeneralRawHandlerVaHexgeneralRawHandlerSectiongeneralAbsoluteOpcodegeneralAbsoluteOpcodeHexgeneralAbsoluteDispatchByteHexgeneralAbsoluteByteReachablegeneralAbsoluteEntryVaHexgeneralAbsoluteHandlerVaHex!generalAbsoluteMatchesSaveHandler.generalAbsoluteHandlerReachableViaByteDispatchsaveHandlerIsDefault)r   rh   r   rJ   rl   DEFAULT_HANDLER)rf   rZ   opcode
save_entrysave_handlergeneral_raw_entrygeneral_raw_handlerabsolute_indexgeneral_absolute_entrygeneral_absolute_handlergeneral_absolute_byte_reachables              rI   
opcode_rowrI    s   ,vz9JC:6L-
:"32CD #88Q>N2^a5GG'X7MN&'>&AT&A#&r&. 	%
+ 	E,/	
 	1(LI 	&7 8 	!%(;"< 	#$7BU$V 	  	#b(<$= 	))Hb$%d 	'(G 	$U+A%B  	&u-E'F!" 	,-E-U#$ 	9+X0HL0X'* 	 ?+ rK   c                   t        | ||      }|j                  |t        |      |d|d|j                  d      dk(  |j                  d      dk(  |j                  d      t        t              k(  |j                  d      dk(  |j                  d      |j                  d      k7  |j                  d	      t        |j                  d
             d       |S )NrE   r/  r2  z.datar}   r4  r5  r1  r=  r9  )r   	siteVaHexlowByteOpcodelowByteOpcodeHexsliceHandlerIsDataDescriptorsliceHandlerIsCoderawGeneralHandlerIsDefaultrawGeneralHandlerIsCoderawGeneralDiffersFromSlice+sliceHandlerReachableViaGenericByteDispatch)sliceHandlerRequiresSaveSelectorTableBase)rI  r   rJ   r   r?  bool)rf   rZ   r   site_var@  r   s         rI   route_relevant_dispatch_rowrW  $  s    
S(F
+CJJ7^ -(+0D(E(P!gg&:;wF&)gg.F&G5Q`Ka&a#&77+E#F'#Q&)gg.F&G377SeKf&f7:ww<8
 :>GG23:
 6
 " JrK   c                   t               }g }| D ]  }|j                  d      t        k7  s|j                  d      t        k7  r4|j                  d      xs g D ]h  }|j                  d      }|!|j                  d      }|rt	        |d      nd }|||v r>|j                  |       |j                  t	        |             j  |S )Nr'   r(   r)   r@  r*   r   )setr   SOURCETARGETrY   addrs   )stream_tracesseenopcodesr)   steprH   
opcode_hexs          rI   route_trace_opcodesrb  :  s    5DG '99X&(EIIh,?6,IIIg&," 	'DHHX&E}!XXk2
/9J+t}HHUONN3u:&	'' NrK   c                   t        |       }||nt        t        dz  g       }t        | |      }t	        | |      }t        | |t        |      }t        | |t        |      }t        | |t        |      }t        t        z
  dz  }t        |      D 	cg c]  }	|	t        t              v r|	 c}	xs t        t              }
t        t        |
t        t              z   t        t              z               D 	cg c]  }	t!        | ||	       }}	|D cg c]  }|d   t        v s| }}|D cg c]  }|d   t        v s| }}t#        d |D              }t$        D 	cg c]  \  }}}	t'        | ||||	       }}}}	|D cg c]  }|j)                  d      du r|d    }}|D cg c]  }|j)                  d      du r|d    }}|D cg c]  }|j)                  d	      du r|d    }}|D cg c]-  }|j)                  d      du r|j)                  d	      du r|d   / }}|D cg c]-  }|j)                  d      du r|j)                  d
      du r|d   / }}|dk(  xrZ t+        |j)                  d            xr> |j)                  d      dk(  xr( |j)                  d      dk(  xr t#        d |D              }|j)                  dd      dkD  xs |j)                  dd      dkD  }t-        d |D              }t/        |      }t1        |      }t3        ||z         }|D cg c]  }|j)                  d      du r| }}t5        |      }t-        d |D              } | xr& |dk(  xr t+        |      xr t7        d |D              }!g }"|s|"j9                  d       |!r|"j9                  d       |dk(  r|s|"j9                  d       |r|s|"j9                  d       |"D #cg c]  }#t:        |#    }$}#|" }%i dt<        dt>        dtA        t              dtA        t              dtA        t              dtB        d tA        tB              d!tA        tD              tA        tF              tA        t              d"d#d$d%|d&d'|d(d)|d*|d+|d,|d-t5        |      d.|d/t5        |      i d0tI        |      d1t-        d2 |D              d3| d4|d5|D cg c]  }|j)                  d6       c}d7|d8t-        d9 |D              d:|d;|D cg c]  }|j)                  d6       c}d<|d=|dkD  xs t+        |      d>tJ        d?t5        |      d@|dAt5        |      dB|dCt+        |      i dD|
D 	cg c]  }	d'|	d(
 c}	dE|dFt5        |      dG|dHt5        |      dI|dJt5        |      dKt5        |      dL|dMt5        |      dN|dOt5        |      dP|dQt5        |      dR|dSt5        |      dT|||||%|!dU|%|"|$tL        t5        tL              dVdWg dXdYS c c}	w c c}	w c c}w c c}w c c}	}}w c c}w c c}w c c}w c c}w c c}w c c}w c c}#w c c}w c c}w c c}	w )ZN save_selector_stream_traces.jsonra   r-  c              3  B   K   | ]  }|j                  d       dv   yw)r1  >   
0x0040ad9b
0x0040adc9
0x0040ae0eNr   r   s     rI   r   z build_summary.<locals>.<genexpr>_  s(      6 	"#'QQ6   rN  Tr   rP  rT  rS  z   r'  r&  r   r$  c              3  B   K   | ]  }|j                  d       du   yw)r<  TNr   r   s     rI   r   z build_summary.<locals>.<genexpr>  s     ^;<D^ri  r%  c              3  B   K   | ]  }|j                  d       du   yw)r   TNr   r   s     rI   r   z build_summary.<locals>.<genexpr>  s)      B 	34<Bri  r  c              3  F   K   | ]  }|j                  d d      dkD    yw)r   r   Nr   r   s     rI   r   z build_summary.<locals>.<genexpr>  s)      : 	8!<q@:s   !c              3  B   K   | ]  }|j                  d       du   yw)rR  TNr   r   s     rI   r   z build_summary.<locals>.<genexpr>  s     f#45=fri  r    r!   r"   r#   r'   r(   generalHandlerTableHexsaveSelectorHandlerTableHexeventObjectHandlerTableHexsaveSelectorSliceOffsetBytessaveSelectorSliceOffsetBytesHexgenericDispatcheru8z#byte at context+0x40 stream pointer)
entryVaHexindexedCallVaHexr   
indexWidthindexSourcesaveSelectorSliceOffsetEntriessaveSelectorSliceOffsetHexrE   r/  generalTablesaveSelectorTableeventObjectTableindexedDispatchRowsindexedDispatchRowCountr.   dynamicIndexedDispatchRowCount*dynamicIndexedDispatchClassificationCounts"dynamicDwordScaledDispatchRowCountc              3  H   K   | ]  }|j                  d       du sd  yw)r   Tr	   Nr   r   s     rI   r   z build_summary.<locals>.<genexpr>  s'      2
sww7K/LPT/TA2
s   ""+dynamicKnownDispatchTableImmediateNearCountdynamicScopeTableCallbackCountdynamicScopeTableCallbackSitesr   r/   *dynamicSaveSelectorTableImmediateNearCountc              3  @   K   | ]  }|j                  d d        yw)r   r   Nr   r   s     rI   r   z build_summary.<locals>.<genexpr>  s     b?Cbs   *dynamicSaveSelectorTableBaseCandidateCount*dynamicSaveSelectorTableBaseCandidateSitesr0   6dynamicSaveSelectorTableBaseSwitchStaticCandidateFound.saveSelectorTableBaseArithmeticScanWindowBytes'saveSelectorTableBaseArithmeticRowCount#saveSelectorTableBaseArithmeticRows-saveSelectorTableBaseArithmeticCandidateCount,saveSelectorTableBaseArithmeticCandidateRows-saveSelectorTableBaseArithmeticCandidateFoundrouteTraceRelativeOpcodesr,   #selectedPointerRelativeHandlerCount'selectedPointerRelativeHandlersVerifiedbranchRelativeHandlerCountr-   routeRelevantDispatchRowCount%routeRelevantSliceDataDescriptorCount%routeRelevantSliceDataDescriptorRoles#routeRelevantRawGeneralDefaultCount#routeRelevantRawGeneralDefaultRoles.routeRelevantSliceRequiresTableBaseSwitchCount.routeRelevantSliceRequiresTableBaseSwitchRoles<routeRelevantSliceDataDescriptorRequiresTableBaseSwitchCount<routeRelevantSliceDataDescriptorRequiresTableBaseSwitchRoles9routeRelevantSliceDataDescriptorGenericByteReachableCount9routeRelevantSliceDataDescriptorGenericByteReachableRolesFblockeda  The current save-selector decoder is anchored to the 0x00440720 table slice, which starts 0x7a entries after the generic 0x00440538 dispatch table. The EXE contains one direct indexed dispatch immediate for the generic table at 0x0040234c and no direct indexed dispatch or dword reference to 0x00440720 itself. Relative save-selector opcodes still map consistently to the expected handlers through that slice, including byte-reachable selected-pointer handlers 0x07/0x08/0x09 and branch-state handlers 0x10..0x13, but this is static decoder anchoring only. Route-relevant low bytes that become data descriptors under the slice do not resolve the same way through the raw generic table, and the descriptor-stop rows require a save-selector table-base switch rather than the observed u8 generic indexed dispatcher. A .text scan finds only a small set of dynamic register-base indexed call sites; all three match an SEH scope-table callback pattern and none has a nearby immediate reference to 0x00440720. A separate table-base arithmetic scan covers direct absolute indexed dispatches plus those dynamic sites and finds no nearby general-table+0x1e8 or direct save-selector-table base candidate, so there is still no static table-base switch candidate for the save-selector slice. The descriptor boundary classification therefore depends on the static save-selector slice model until runtime proves that control is dispatching the current stream through that slice. It does not prove that selector root 2:0 executes on the normal route.)zCprove at runtime that the current 2:0 root is selected and executedz{prove the VM/control-flow mode or dynamic table-base switch that interprets the current stream through the 0x00440720 slicezxprove that route-relevant descriptor boundaries are reached through the save-selector slice, not just modeled staticallyzMkeep requiring a strict map1_01a source hotspot or equivalent runtime trigger)saveSelectorSliceAnchored0saveSelectorSliceDirectRuntimeDispatchProofFound%saveSelectorDispatchRuntimeProofFounddispatchTableProofFound1descriptorBoundaryDependsOnSaveSelectorSliceModel%selectedRootExecutionDispatchRefFound
proofFoundfailedDispatchTableGateIdsmissingEvidenceevidenceRefsevidenceRefCountpromotionStatus
conclusionremainingProofs)'r   rU   OUTr   r   r+  r   r   r   rb  rY  FRONTIER_OPCODESlistsortedSELECTED_POINTER_OPCODESBRANCH_OPCODESrI  allROUTE_RELEVANT_DISPATCH_SITESrW  r   rU  r   r  r	  r  rc   anyrs   /DISPATCH_TABLE_CONTEXT_MISSING_EVIDENCE_BY_GATErZ  r[  rJ   r   GENERIC_DISPATCHER_ENTRYGENERIC_DISPATCHER_INDEXED_CALLr  /SAVE_SELECTOR_TABLE_BASE_ARITHMETIC_SCAN_WINDOW$DISPATCH_TABLE_CONTEXT_EVIDENCE_REFS)&rf   r]  rZ   r)  dynamic_dispatchesgeneralsave_selectorevent_objectslice_offset_entriesr@  route_opcodesrelative_rowsr   selected_rowsbranch_rows+selected_pointer_relative_handlers_verifiedr   rV  route_relevant_dispatch_rows*route_relevant_slice_data_descriptor_roles(route_relevant_raw_general_default_roles5route_relevant_slice_requires_table_base_switch_rolesEroute_relevant_slice_data_descriptor_requires_table_base_switch_roles9route_relevant_slice_data_descriptor_byte_reachable_rolessave_selector_slice_anchored7save_selector_slice_direct_runtime_dispatch_proof_found7dynamic_save_selector_table_base_switch_candidate_countdynamic_scope_rowsdynamic_candidate_rowsarithmetic_rowsarithmetic_candidate_rows"dynamic_scope_table_callback_count/dynamic_known_table_base_switch_candidate_count8descriptor_boundary_depends_on_save_selector_slice_modelfailed_dispatch_table_gate_idsgate_idmissing_evidenceproof_founds&                                         rI   build_summaryr  L  s	   S!H%2%>MI00
EM )h7J8hGX/DjQG%c85PR\]M$S(4NPZ[L7:OOTUU0?S)** 	   
	  FLCP]`de}`~P~  BF  GU  BV  QV  MW  FX  Y6ZXv6  YM  Y$1gSS9I5JNf5fSgMg"/[337G3HN3Z3[K[25 6 6 3/ &C$ $!D'6 	$C4&I$  $ 027712d: 	F2. 2 0077/0D8 	F0, 0 0=77>?4G 	F=9 = 0M7712d:GG?@DH 	FMI M 0A7712d:GGABdJ 	FA= A 	$ 	_012	_45:	_ 349	_ ^P]^^ ! 	0!4q8 	90!4q8 < ?B B%B ?; ;;MNLM_`>''O
 #!77@ATI 	! !
 *--?)@&69 :%: 73
 DC 	gCqH	g;<	g fIeff	 = &("B&--.TU?&--.RS?1D)&--.Z[=I&--.VW 6 	8@  54K|&|&| 	!%(=">| 	&u-H'I	|
 	%e,F&G| 	'(H| 	*51Q+R| 	 89 %&E F 56@
| 	)*>|  	%+?*D&E!|" 	#|$ 	]%|& 	L'|( 	z)|* 	"3z?+|, 	%&8-|. 	)#.@*A/|0 	523EF3|6 	-c 2
+2
 /
7|< 	67f=|> 	)*L?|@ 	)3E+
,/CGG&'+
A|F 	();G|H 	5bOabbK|N 	5CQ|T 	53I7
,/CGG&'7
U|Z 	45K[|\ 	ACaG /-.a|d 	9;g|j 	233Gk|l 	.m|n 	8=V9Wo|p 	78Qq|r 	8>W9Xs|t 	$m%TF6#,&7%Tu|v 	mw|x 	.s=/Ay|z 	23^{|| 	%c+&6}|~ 	$%A|@ 	(-I)JA|B 	05_1`C|D 	01[E|F 	.s3[/\G|H 	./WI|J 	9#A;
K|P 	9AS|V 	GQI
W|\ 	GQ_|b 	DSEF
c|h 	DEk|n &B<s1h#.=u16!&D+< DE$M$
m| |E Yg[
$2
0
=
MA4!>J+
7
  &Usf   X$2X)X.X.'X38X3X8<X?!YY	+2Y#2YYYY"
Y'
6Y,
c                   t        j                  | j                  d      xs i dd      }g ddd| d    d	| d
    dd| d    dd| d    dd| d    dd| j                  d      xs i j                  d       d| j                  d      xs i j                  d       d| j                  d      xs i j                  d       dd| d   d    d| d   d    d | d   d    d!| j                  d"       d#| dd$| j                  d%       d&d'j                  | j                  d(      xs g       xs d) dd*| j                  d+       d,| j                  d-       d.| j                  d/       d0| j                  d1       d2d'j                  | j                  d3      xs g       xs d) dd4| d5    d6| d7    d8| d9    d:| j                  d;       d<d'j                  | j                  d=      xs g       xs d) dd>t	        | j                  d?      xs g        d@| j                  dA       dB| dC    dD| j                  dE       dF| j                  dG       dH| dI    dJ| dK    dd| dL   ddMddNdO}dP| d   fdQ| d   fdR| dS   ffD ]2  \  }}|j                  dT|dU    dV| dW|d    dW|dX    dW|d    dY       4 |j                  g dZ       | d[   D ]J  }|j                  dT|d\    d]|d^    d]|d_    d]|d`    d]|da    dV|j                  db       dW|dc    dY       L |j                  g dd       | de   D ]  }|j                  df|dg    dh|di    d]|dj    d]|d_    dV|dk   xs d) dh|d`    dV|dl   xs d) dh|j                  da       dV|j                  db       dW|j                  dm       dW|dn    dW|do    dY        |j                  g dp       | j                  dq      xs g D ]  }t        |      }|j                  dT|j                  dr       dV|j                  ds       dh|j                  dt       d]|j                  du       dV|j                  dv       dh|j                  dw       dV|j                  dx       dW|j                  dy       dW| dY        |j                  g dz       | j                  d{      xs g D ]  }|j                  dT|j                  dr       dV|j                  ds       dh|j                  dt       d]|j                  du       d]|j                  dw       dV|j                  dx       dW|j                  d|       dW|j                  dy       dY        |j                  g d}       | j                  d~      r|j                  ddg       | j                  d~      xs g D ]  }|j                  dT|j                  dr       dV|j                  ds       dh|j                  dt       d]|j                  du       d]|j                  dw       dV|j                  dx       dWt        |       dY        n|j                  d       |j                  g d       | j                  d      xs g D ]  }|j                  dT|j                  dr       dV|j                  ds       dh|j                  d      xs |j                  dt      xs d) dV|j                  d       dW|j                  d       dW|j                  d       dW|j                  d       dW|j                  d       dY        |j                  g d       |j                  d | d   D               |j                  d       dj                  |      S )Nr  T,:	sort_keys
separatorsz&# Save Selector Dispatch Table Contextr  z
- route: `r'   z -> r(   `z- general handler table: `ro  z - save-selector handler table: `rp  z- save-selector slice offset: `r{  z	` entriesz- generic dispatcher: `rt  rv  z` indexed call `rw  z	` index `rx  z"- generic indexed dispatch count: r|  r&  z#- save-selector direct dword refs: r}  r$  z(- save-selector indexed dispatch count: z0- dynamic register-base indexed dispatch count: r  z%- dynamic dispatch classifications: `z*- dynamic SEH scope-table callback count: r  z+- dynamic SEH scope-table callback sites: `r  r  r  z9- dynamic save-selector table-base immediate candidates: r  z6- dynamic save-selector table-base static candidates: r  z<- save-selector table-base arithmetic scan rows/candidates: r  z / r  z5- dynamic save-selector table-base candidate sites: `r  z/- selected-pointer relative handlers verified: r  z - save-selector slice anchored: r  z5- save-selector direct runtime dispatch proof found: r  z- proof found: r  z - failed dispatch table gates: `r  z- missing evidence count: r  z- evidence refs: r  z<- descriptor boundary depends on save-selector slice model: r  z9- route-relevant slice rows requiring table-base switch: r  zI- route-relevant data descriptors byte-reachable via generic dispatcher: r  z.- selected-root execution dispatch ref found: r  z- promotion status: `r  r  z## Table Referencesz?| table | role | dword refs | .text refs | indexed dispatches |z"| --- | --- | ---: | ---: | ---: |r  rB   rC   r~  z| `r   z` | z | r%  z |)r  z## Relative Opcode Rowsr  zx| relative opcode | save entry | save handler | general raw handler | general absolute opcode | byte reachable | match |+| --- | --- | --- | --- | --- | --- | --- |r,   r.  z` | `r0  r1  r4  r7  r9  r<  )r  z### Route-Relevant Raw vs Slice Rowsr  z| role | site | low byte | slice handler | slice section | raw general handler | raw section | absolute opcode | byte reachable | requires table base | raw default | differs |zI| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |r-   z| r   z | `rK  rM  r2  r5  rT  rP  rR  )r  z ## Dynamic Indexed Dispatch Rowsr  zz| site | kind | base | index | scale | displacement | classification | save-selector candidate | nearby table immediates |z8| --- | --- | --- | --- | ---: | --- | --- | --- | --- |r.   r   r   r   r   r   r   r   r   )r  z(## Dynamic SEH Scope-Table Callback Rowsr  za| site | kind | base | index | displacement | classification | reason | save-selector candidate |z1| --- | --- | --- | --- | --- | --- | --- | --- |r/   r   )r  z2## Dynamic Save-Selector Table-Base Candidate Rowsr  r0   zX| site | kind | base | index | displacement | classification | nearby table immediates |r  z- none)r  z+## Save-Selector Table-Base Arithmetic Rowsr  z{| site | kind | table base | classification | general refs | save-selector refs | slice-delta refs | arithmetic candidate |z4| --- | --- | --- | --- | ---: | ---: | ---: | --- |r  r   r   r  r   r  r  )r  z## Remaining Proofsr  c              3  &   K   | ]	  }d |   yw)z- NrG   r   items     rI   r   zmarkdown.<locals>.<genexpr>  s     D2dVDs   r  
)rQ   dumpsr   r  rc   rs   extendr   )summarydynamic_class_countslinesr   r(  r   r   s          rI   markdownr  9  s
   ::@AGR
;0;
; WX&'tGH,=+>a@; %W-E%F$GqI	;
 +73P+Q*RRST; *'2N*O)PPYZ;017R<<\JK L%kk*=>D"IIJ\]^ _{{#67=2BB<PQQRT; -W^-DE[-\,]^; .g6I.JK`.a-bc; 37;N3OPf3g2hi;  ;7;;Gg;h:ij!;" 00D/EQG#;$ 5W[[Aa5b4cd%;& 6diiLl@m@sqs6t6{x{5||}~';* H{{GHIK+;2 E{{GHIK3;: K{{DEFc{{JKLN;;B @		'++  WC  KD  KJ  HJ  AK  AR  OR  @S  ST  	UC;D :'Bk:l9mnE;F +73N+O*PQG;H @Hz@{?|}I;J '++l345K;L +499W[[A]5^5dbd+e+lil*mmnoM;N %S5F)G)M2%N$OPO;P GKK(:;<=Q;R Gw  PC  HD  GE  	FS;V H{{KLMOW;^ X{{VWXZ_;d 9Ah9i8jke;f  (9 :;1=g;h 	i;j 	k;l 	m;n 	o;p 	q;r 	Js;t 	-u;Ez 
GN+,	'"567	!345 
e
 	%%&d4&E:O4P3QQT()*#e4J.K-LBP	

 
LL   +, 
#)*+55E1F0GuSQcMdLe f,-.eC8R4S3TTXww567s3?b;c:ddfh	

 
LL   23 	
VT#k"2!35=O9P8Q R&'(S1E-F-M#,N O,-.d37Q3R3YVY2Z [234Dww567swwBCDC/01S9U5V4WWY[	
	
 
LL   {{78>B 
!#&#'',-.d3776?2C D'(cggo.F-Gtwww SWW->%?$@ww./0ww:;<Cxr	K	

 
LL   {{:;Ar 
#'',-.d3776?2C D'(cggo.F-G H)*+48O0P/QQTww'(CGG4W,X+YY[]	

 
LL  
 {{>?f9
 	 ;;JKQr 	CLLcgg012$swwv6G HGGN+,E#''/2J1K LGG-./tCGG<S4T3UUX#C()-	 	X	LL   {{@AGR 	
#'',-.d3776?2C D'I377>+BIcJ$ww'()ww9:;3ww>?@ww?@AwwDEFbJ	
	
 
LL01	LLD1B)CDD	LL99UrK   c                ,
   dj                  d d| d   fd| d   fd| d   ffD              }dj                  d	 | d
   D              }dj                  d | d   D              }dj                  d | j                  d      xs g D              }dj                  d | j                  d      xs g D              }dj                  d | j                  d      xs g D              xs d}dj                  d | j                  d      xs g D              xs d}dj                  d | d   D              }dj                  g ddddt        j                  | d          dt        j                  | d           d!t        j                  | d"          d#t        j                  | d$          d%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(      xs i j                  d-                   d.dj                  g d/| d0    d1| d2    d3| j                  d4       d5t        j                  d6j                  | j                  d7      xs g       xs d8       d9t        | j                  d:      xs g        d;| j                  d<       d=| d>    d?| j                  d@       dA| j                  dB       dC| j                  dD       dEt        j                  t        j                  | j                  dF      xs i dGdHI             dJ| j                  dK       dLt        j                  d6j                  | j                  dM      xs g       xs d8       dN| j                  dO       dP| j                  dQ       dR| j                  dS       dT| j                  dU       dVt        j                  d6j                  | j                  dW      xs g       xs d8       dX| dY    dZt        j                  | d[          d.      d\t        j                  | d]          d^d_d`|dadbdc|daddde|dadfdg|dadhdi|dadjdk|dadldm|dadn| do      S )pNr  c              3     K   | ]K  \  }}d t        j                  |d          dt        j                  |       d|d    d|d    d|d    d M yw)	<tr><td><code>r   </code></td><td>	</td><td>r$  r%  r&  
</td></tr>Nhtmlescape)r   r   r(  s      rI   r   zhtml_page.<locals>.<genexpr>  s       D%	[[|!456 7{{4 ! "*+, -()* ++,- .	s   AAr  r|  rB   r}  rC   r~  c              3  \  K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |d   xs d       dt        j                  |d   xs d       dt        j                  |d          d|j                  d	       d
|d    d  yw)r  r.  </code></td><td><code>r0  r1  r  r4  r7  r  r9  r  r<  r  N)r  r  r   r   s     rI   r   zhtml_page.<locals>.<genexpr>  s       	[[%8!9:; <[[%5!678 9[[%7!8!?C@A B[[%=!>!E#FG H[[%?!@AB Cww567 8678 9	s   B*B,r,   c              3  h  K   | ])  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d   xs d       dt        j                  |d	   xs d       dt        j                  |d
   xs d       dt        j                  |d   xs d       dt        j                  t        |j                  d      xs d             d|j                  d       d|j                  d       d|d    d|d    d , yw)z<tr><td>r   </td><td><code>rK  r  rM  r1  r  r  r2  r4  r5  r7  r9  r  rT  rP  rR  r  Nr  r  rk   r   r   s     rI   r   zhtml_page.<locals>.<genexpr>  s_     $ 	{{3v;'( )[[[!123 4[[%7!89: ;[[%7!8!?C@A B{{334;<= >[[%=!>!E#FG H{{39:AcBC D[[SWW-G%H%OC!PQR Sww567 8wwBCD E/01 2/01 2	$s   D0D2r-   c              3  D  K   | ]  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d	                   dt        j                  t        |j                  d
                   dt        j                  t        |j                  d                   dt        j                  t	        |             d  yw)r  r   r  r   r  r   r  r   r   r   r   r  r   r  Nr  r  rk   r   r   r   s     rI   r   zhtml_page.<locals>.<genexpr>  sR      	[[SWW-?%@!ABC D{{3swwv/01 2[[SWW^%<!=>? @[[SWW_%=!>?@ A{{3swww/012 3[[SWW->%?!@AB C{{3sww'>?@AB C{{3sww'JKLMN O{{+C012 3
	s   FF r.   c              3    K   | ]x  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d	                   d
t        j                  t        |j                  d                   d
t        j                  t        |j                  d                   d { yw)r  r   r  r   r  r   r  r   r   r   r  r   r   r  Nr  r   s     rI   r   zhtml_page.<locals>.<genexpr>$  s8     # 	[[SWW-?%@!ABC D{{3swwv/01 2[[SWW^%<!=>? @[[SWW_%=!>?@ A[[SWW->%?!@AB C{{3sww'>?@AB C{{3sww789: ;{{3sww'JKLMN O		#s   E?Fr/   c              3    K   | ];  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d	                   d
t        j                  t	        |             d > yw)r  r   r  r   r  r   r  r   r   r   r  r  Nr   r   s     rI   r   zhtml_page.<locals>.<genexpr>1  s     ' 	[[SWW-?%@!ABC D{{3swwv/01 2[[SWW^%<!=>? @[[SWW_%=!>?@ A[[SWW->%?!@AB C{{3sww'>?@AB C{{+C012 3	's   EEr0   z"<tr><td colspan="7">none</td></tr>c              3  4  K   | ]  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d      xs |j                  d      xs d             dt        j                  t        |j                  d                   d	t        j                  t        |j                  d
                   d	t        j                  t        |j                  d                   d	t        j                  t        |j                  d                   d	t        j                  t        |j                  d                   d  yw)r  r   r  r   r  r   r   r  r   r  r  r   r  r  r  Nr  r   s     rI   r   zhtml_page.<locals>.<genexpr>=  sN       	[[SWW-?%@!ABC D{{3swwv/01 2[[SWW^%<%^@W%^[^!_`a b{{3sww'789:; <{{3sww'IJKLM N{{3sww'NOPQR S{{3sww'OPQRS T{{3sww'TUVWX Y		 s   FFr  z"<tr><td colspan="8">none</td></tr>r  c              3  N   K   | ]  }d t        j                  |       d  yw)z<li>z</li>Nr  r  s     rI   r   zhtml_page.<locals>.<genexpr>J  s#     \tDKK-.e4\s   #%r  zX<!doctype html><meta charset="utf-8"><title>Save Selector Dispatch Table Context</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1180px;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>z-<h1>Save Selector Dispatch Table Context</h1>z<p>Route <code>r'   z -&gt; r(   z</code>; general table <code>ro  z#</code>; save-selector table <code>rp  z</code>; slice offset <code>r{  z"</code>; generic dispatcher <code>rt  rv  z</code> indexed call <code>rw  z</code> uses <code>rx  z</code>.</p>z!<p>save-selector slice anchored: r  z5; save-selector direct runtime dispatch proof found: r  z; proof found: r  z; failed dispatch table gates: r  r  r  z; missing evidence count: r  z; evidence refs: r  z<; descriptor boundary depends on save-selector slice model: r  z); route-relevant table-base switch rows: r  z>; data descriptors byte-reachable through generic dispatcher: r  z!; dynamic indexed dispatch rows: r  z$; dynamic dispatch classifications: r  Tr  r  z*; dynamic SEH scope-table callback count: r  z*; dynamic SEH scope-table callback sites: r  z9; dynamic save-selector table-base immediate candidates: r  z6; dynamic save-selector table-base static candidates: r  z<; save-selector table-base arithmetic scan rows/candidates: r  /r  z4; dynamic save-selector table-base candidate sites: r  z.; selected-root execution dispatch ref found: r  z; promotion status: <code>r  z<p>r  z</p>z<h2>Table References</h2>z<table><thead><tr><th>table</th><th>role</th><th>dword refs</th><th>.text refs</th><th>indexed dispatches</th></tr></thead><tbody>z</tbody></table>z<h2>Relative Opcode Rows</h2>z<table><thead><tr><th>relative opcode</th><th>save entry</th><th>save handler</th><th>general raw handler</th><th>general absolute opcode</th><th>byte reachable</th><th>match</th></tr></thead><tbody>z)<h2>Route-Relevant Raw vs Slice Rows</h2>a  <table><thead><tr><th>role</th><th>site</th><th>low byte</th><th>slice handler</th><th>slice section</th><th>raw general handler</th><th>raw section</th><th>absolute opcode</th><th>byte reachable</th><th>requires table base</th><th>raw default</th><th>differs</th></tr></thead><tbody>z&<h2>Dynamic Indexed Dispatch Rows</h2>z<table><thead><tr><th>site</th><th>kind</th><th>base</th><th>index</th><th>scale</th><th>displacement</th><th>classification</th><th>save-selector candidate</th><th>nearby table immediates</th></tr></thead><tbody>z.<h2>Dynamic SEH Scope-Table Callback Rows</h2>z<table><thead><tr><th>site</th><th>kind</th><th>base</th><th>index</th><th>displacement</th><th>classification</th><th>reason</th><th>save-selector candidate</th></tr></thead><tbody>z8<h2>Dynamic Save-Selector Table-Base Candidate Rows</h2>z<table><thead><tr><th>site</th><th>kind</th><th>base</th><th>index</th><th>displacement</th><th>classification</th><th>nearby table immediates</th></tr></thead><tbody>z1<h2>Save-Selector Table-Base Arithmetic Rows</h2>z<table><thead><tr><th>site</th><th>kind</th><th>table base</th><th>classification</th><th>general refs</th><th>save-selector refs</th><th>slice-delta refs</th><th>arithmetic candidate</th></tr></thead><tbody>z<h2>Remaining Proofs</h2><ul>z</ul>)r  r   r  r  rk   rc   rQ   r  )	r  
table_rowsopcode_rowsroute_relevant_rowsdynamic_rowsr  r  r  proofss	            rI   	html_pager    s     /0g&9:;W%789
 J ))  /0 K )) $ 67$ " 99  ;;;<B L  # ;;>?E2#  "YY ' ;;JKQr'  0 
0  ii   ;;DEK   0 
0  WW\IZA[\\F99 $d$ 	y$ 	8$ $++gh&789WU]M^A_@``}  C  J  J  KR  Sk  Kl  m  ~n  nQ  RV  R]  R]  ^e  fC  ^D  RE  QF  Fb  cg  cn  cn  ov  wS  oT  cU  bV  Vx  y}  yD  yD  EH  JQ  JU  JU  Vi  Jj  Jp  np  Iu  Iu  vB  IC  ED  yE  xF  Fa  bf  bm  bm  nq  sz  s~  s~  R  sS  sY  WY  r^  r^  _q  rr  ns  bt  au  uH	  I	M	  I	T	  I	T	  U	X	  Z	a	  Z	e	  Z	e	  f	y	  Z	z	  Z	@
  ~	@
  Y	E
  Y	E
  F
R
  Y	S
  U	T
  I	U
  H	V
  V
b
  	c
	$
 	f  	f
+  	fG4O,P+Q  	f  RG  	f  HO  PB  HC  GD  	f  DS  	f  T[  T_  T_  `l  Tm  Sn  	f  nM  	f  NR  NY  NY  Z^  Zc  Zc  dk  do  do  pL  dM  dS  QS  ZT  Z[  X[  N\  M]  	f  ]w  	f  x{  |C  |G  |G  HY  |Z  |`  ^`  xa  wb  	f  bs  	f  t{  t  t  @R  tS  sT  	f  TP  	f  QX  YL	  QM	  PN	  	f  N	w	  	f  x		  x	C
  x	C
  D
t
  x	u
  w	v
  	f  v
t  	f  u|  u@  u@  A|  u}  t~  	f  ~_  	f  `g  `k  `k  lL  `M  _N  	f  Nr  	f  sw  s~  s~  C  I  I  JQ  JU  JU  VB  JC  JI  GI  UY  fp  q  sr  rs  	f  s]  	f  ^e  ^i  ^i  jJ  ^K  ]L  	f  Lv  	f  w{  wB  wB  CG  CL  CL  MT  MX  MX  Yy  Mz  M@  ~@  CA  CH  EH  wI  vJ  	f  JC  	f  DK  DO  DO  P|  D}  C~  	f  ~t  	f  u|  u@  u@  Am  un  to  	f  ok  	f  ls  lw  lw  xa  lb  kc  	f  cd  	f  el  ep  ep  q`  ea  db  	f  bV  	f  W[  Wb  Wb  cg  cl  cl  mt  mx  mx  ye  mf  ml  jl  cm  ct  qt  Wu  Vv  	f  vd  	f  el  mT  eU  dV  	f  Vp  	f  qu  q|  q|  }D  EV  }W  qX  pY  	f  Ye  	f$ dkk',/016$ 	$$ 	M$ 	$ 	$ 	($ 	R$ 	$ 	$ 	4$  	g!$" 	#$$ 	%$& 	1'$( 	`)$* 	+$, 	-$. 	9/$0 	A1$2 	3$4 	5$6 	C7$8 	r9$: 	;$< 	=$> 	<?$@ 	[A$B 	C$D 	E$F (xu5G$ $ $rK   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |:|j                  j                  dd       |j                  t        |       d	       y y )
NT)parentsexist_ok)save_selector_dispatch_table_context.jsonFr  )ensure_asciir  r  rM   rN   )mkdir
write_textrQ   r  parentr  )r  out_dirhtml_outs      rI   write_outputsr  r  s    MM$M.::FF

7:FM G  dT:Ig.A rK   c                 &   t        j                  t              } | 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                  g             }t        ||j                  |j                         t!        d|j                  dz          y )N)descriptionz--exer$   )typedefaultz--stream-tracesrd  z	--out-dirz
--html-outz!Optional HTML report output path.)r  r  helpz.wrote save-selector dispatch table context -> r  )argparseArgumentParser__doc__add_argumentr   ROOTr  
parse_argsr  rf   
read_bytesrU   r]  r  r  r  print)parserargsr  s      rI   mainr&  }  s    $$9F
dD=4HI
)cDf>fg
$<
4DghD$$$b)G '4<<7	:4<<Ju;u:v
wxrK   __main__)rH   
int | Nonereturn
str | None)r%   r   rT   r   r)  r   )rZ   
list[dict]r[   rY   r)  zdict | None)rf   bytesrZ   r+  rg   rY   r)  r(  )rZ   r+  rg   r(  r)  r*  )rf   r,  rZ   r+  rH   rY   r)  r+  )rf   r,  rZ   r+  r)  r+  )rf   r,  r[   rY   r   rY   r)  rY   )`   )
rf   r,  rZ   r+  r   rY   r   rY   r)  r+  )rf   r,  rZ   r+  r   rY   r   zlist[tuple[str, int]]r   rY   r)  r+  )
rf   r,  rZ   r+  r   rY   r   dictr)  r.  )r   rY   r)  rk   )r   r+  r)  zdict[str, int])r   r+  r)  r+  )r  r+  r)  r+  )r   r.  r)  rk   )
rf   r,  rZ   r+  r(  rY   r)  r+  r)  r.  )rf   r,  rZ   r+  r@  rY   r)  r.  )rf   r,  rZ   r+  r   rk   rV  rY   r@  rY   r)  r.  )r]  r+  r)  z	list[int])N)rf   r,  r]  zlist[dict] | Noner)  r.  )r  r.  r)  rk   )r  r.  r  r   r  zPath | Noner)  None)r)  r/  )Jr  
__future__r   r  r  rQ   rd   syspathlibr   typingr   r%   insertrk   __file__resolver  probe_exe_scene_tablesr   r   r   r  r   r  rZ  r[  r   r   r   r?  r  r  r   r  r  r  r  r  r  r  r,  fromhexr   r   r   rJ   rU   r_   rh   rl   ry   r   r   r   r   r   r   r   r  r  r	  r  r   r+  rI  rW  rb  r  r  r  r  r&  __name__rG   rK   rI   <module>r:     s   T "     
   3tH~--/667 8 L L H~''*
Ul		" ( ' % ", #>AV#V  25 /- )U !  	H 	W 	V 	N3 /  
 7
	 @
	)( $B ]]8fe,
]]8fe,
]]8fe,
]]8eU+
]]8eU+
]]8eU+  	A,-12/084.B< B	  "	
  >3lBJ*(+\
D,$jZnbEP 25d By zF rK   