
    UHjC                    &   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	  ee
      j                         j                  d   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efddZddZedk(  r e        yy)zKSummarize confirmed-route blockers and the evidence needed to unblock them.    )annotationsN)Path	urlencode   outc                    dt        |        S )Nz../web/game.html?r   )paramss    5/home/exedev/hwanse/tools/summarize_route_blockers.pyweb_hrefr      s    y0122    c                b    | D ](  t        fd|j                         D              s&c S  i S )Nc              3  L   K   | ]  \  }}j                  |      |k(    y wNget).0keyvaluerows      r   	<genexpr>zfirst_match.<locals>.<genexpr>   s"     Feswws|u$Fs   !$)allitems)rowsfieldsr   s     @r   first_matchr      s2     Fv||~FFJ Ir   c                j    t        |      }| D cg c]  }|j                  d      |v s| c}S c c}w )NleafPointerHexsetr   )	leaf_rowsleaf_pointerswantedr   s       r   leaf_rows_forr$      s1    F$LC0@(AV(KCLLLs   00c                    t        |      }| D cg c]*  }|j                  d      |v s|j                  d      |v r|, c}S c c}w )Nr   streamVaHexr   )
trace_rowsr"   r#   r   s       r   trace_rows_forr(       sP    F 77#$.#''-2HF2R 	  s   /Ac           
        | j                  d      xs g D ]  }|j                  d      xs g D ]  }||j                  d      xs g v s||j                  d      xs g v s3|j                  d      |j                  d      |j                  d      |j                  d      |j                  d      xs g |j                  d      xs g d	c c S   i S )
NprogressRowspreviousCandidates
sharedMapsintroducedMaps	fromLabellabelgroupslot)r.   r/   r0   r1   r,   r-   r   )scene_selector_progresssourcetargetr   previouss        r   selector_progress_hintr6   )   s    &**>:@b 
 45; 		H(,,|4:;8<<XhKiKomo@p!)k!: WWW- WWW-GGFO"*,,|"<"B&.ll3C&D&J 		
 Ir   c                6   g }| j                  d      xs g D ]c  }	|	j                  d      }
|	j                  d      xs d gD ]5  }|rt        ||
|      ni }|rt        ||
|      ni }|rt        ||
|      ni }|j                  d      xs g }t        ||      }t        ||      }|j                  d      xs g }i d|
d|d	|	j                  d	d
      d|	j                  d      dddt	        |	j                  d	            dt	        |xr |j                  d             d|j                  d      xs ddg dg d|j                  d      xs g d|d|j                  d      xs g d|D cg c]$  }|j                  d      r|j                  d      & c}d|D cg c]E  }|j                  d      |j                  d      |j                  d      |j                  d      dG c}d|j                  d      xs g d |j                  d       xs g i d!|j                  d!      xs i d"|j                  d"      xs i d#|j                  d#      d$|j                  d$      d%|j                  d      xs g d&|j                  d'      d(|j                  d)      d*|j                  d+      d,|D cg c]a  }|j                  d      |j                  d-      |j                  d.      xs g |j                  d/      xs g |j                  d0      xs g d1c c}d2|D cg c]p  }|j                  d3      |j                  d      t        |j                  d4      xs g D ch c]$  }|j                  d5      r|j                  d5      & c}      d6r c}}d7|j                  d8      xs i d9|rt        ||
|      ni d:|
rt        |
d;d;d<      nd=d>|rt        |d;d;d<      nd=d?|
r|rt        |
d@dA      nd=dB|
r|rt        |
dCdA      nd=dDd=}|d   rQ|d   d
   j                  dEdF      }t        |      dGk(  r+t        dH |D              rt        |d
   |dF   d;d;dI      |dD<   |d	   d
k(  r|d   j                  dJ       |d   r|d   j                  dK       |j                  d&      dLu r(|j                  d(      d
k(  r|d   j                  dM       t        dN |D              r|d   j                  dO       |d   dPk(  r|d   j                  dQ       |d#   dRu r|d   j                  dS       |d   s|d   j                  dT       |j                  |       8 f |S c c}w c c}w c c}w c c}w c c}}w )UNconfirmedRouteBlockersmapsaveSelectorFrontierTargets)r3   r4   leafPointersbranchStepsr3   r4   eventTransitionRecordsr   reasonstatusblockedstrictEventCoordinateselectorOnlydirectEventTransitionpromotionRiskunknownmissingEvidencenonPromotingEvidence	selectors
scenePairsbranchConditions	conditionbranchTargetsr   fallthroughVaHexbranchTargetHexbranchTargetKind)r   rM   rN   rO   sourceRecordTilesetstargetRecordTilesetssourceAcceptedRendertargetAcceptedRendersourceTilesetMatchtargetTilesetMatchxrefScenePairs$xrefCurrentRootRefIsSelectorRowEntry currentRootRefIsSelectorRowEntry"xrefCurrentRootNonMetadataRefCountcurrentRootNonMetadataRefCountxrefRoutePromotionStatusroutePromotionStatusleafSummariesnestedPointerHex	linkedCnsfieldRecordsnestedFieldRecords)r   r^   r_   r`   ra   
traceStopsr&   trace
stopReason)r&   r   stopReasonssaveLoaderFrontierExamplefrontierExampleselectorProgressHint
sourceOpen1)r9   eventsoverview 
targetOpen	trialOpenrouteAssist)r9   trialTransitionsselectorTrialOpensaveSelectorLinksselectorOpen:r      c              3  <   K   | ]  }|j                           y wr   )isdigit)r   parts     r   r   zbuild_rows.<locals>.<genexpr>   s     /V4/Vs   )	saveGroupsaveSlotrk   rl   zstrict source coordinateztile hotspot confirmationTzselected-root execution refc              3     K   | ]a  }t        |j                  d       xs d      j                  d      xr. t        |j                  d       xs d      j                  d        c yw)rO   rm   zcns:zcns:mapN)strr   
startswith)r   steps     r   r   zbuild_rows.<locals>.<genexpr>   sj        DHH/06B7BB6J VDHH%78>B?JJ9UUVs   A'A)zscene-list/resource gate onlyhighzbranch-state outcomeFzsource scene/render mismatchzcandidate target)r   r   r$   r(   boolsortedr6   r   splitlenr   appendany)playable_progresssave_selector_frontiersave_selector_xrefssave_selector_leaf_streamssave_selector_stream_tracessave_selector_frontier_branchessave_loader_tracer2   r   blockerr3   r4   frontierxrefbranchr"   leavestracesbranch_stepsr   leafrc   r   
group_slots                           r   
build_rowsr   8   s    D$(()ABHb iU#kk"?@JTF g	F\b{#9&QWXhjHU[;26&QacDci[!@X^_oqF$LL8>BM"#=}MF#$?OF!::m4:LC&C&C )'++6NPQ*RC '++h/	C
 )C (gkk:R.S)TC X%[hllCZ6[2[ \C  O!<!I	C "2C 'C X\\+6<"C C hll<8>BC # ,%xx, HH[)%C&   !-"  +/((3C*D,0HH5G,H+/884E+F,0HH5G,H	"'C8 '

3I(J(Pb9C: '

3I(J(Pb;C< '

3I(J(Pb=C> '

3I(J(Pb?C@ %fjj1E&FACB %fjj1E&FCCD !$((<"8">BECF 7Ac8dGCH 5dhh?_6`ICJ +DHH5K,LKCL   !'	"  +/((3C*D,0HH5G,H%)XXk%:%@b(,(@(FB.2hh7K.L.RPR	"MC`  "(  (-yy'?*/))4D*E'-(-		'(:(@b/ $#xx5 !HH\2/ (aCx ,->-B-BCT-U-[Y[yCz 'kq(>?VX^`f(gwy{C| [ahvRU'VWgi}C~ [ahvRU'VWgiC@ ]chnXf-&XYtvACB $kqv|XfRe.f%g  CECCD ECCH ; -a066sA>
z?a'C/V:/V,V*2%/]$.qM"%$'	4 +C' +,1%&--.HI>"%&--.IJww=>$F377SwKx|}K}%&--.KL  ) 
 *+223RS?#v-%&--.DE'(E1%&--.LMx=%&--.@AKKOg	iT Ke%
"&	"/	s-   9)V*A
VA&V4AV5)VVVc                *   g d}| D ]  }dj                  |j                  d      xs g       xs d}d|j                  d       d|j                  d       d	d
j                  |j                  d      xs g       xs d dd
j                  |j                  d      xs i j                  d      xs g       xs d }d|d    dg}|j                  d      r|j                  d|d    d       |j                  d      r|j                  d|d    d       |j                  d      r|j                  d|d    d       |j                  d      r|j                  d|d    d       |j                  d|j                  d      xs d d|j                  d      xs d d|j                  d       d|j                  d        ddj                  |j                  d!      xs g       xs d ddj                  |j                  d"      xs g       xs d ddj                  |j                  d#      xs g       xs d d$dj                  |j                  d%      xs g       xs d& d| d| ddj                  |       d'        | s|j                  d(       |j                  g d)       | D ]K  }|j                  d*|j                  d       d+|j                  d      xs d d&d,|j                  d-d.       d/|j                  d0       d1dj                  |j                  d"      xs g       xs d d2t	        j
                  |j                  d3      xs g d45       d6t	        j
                  |j                  d7      xs i d45       d8|j                  d9       d:|j                  d;       d<|j                  d=       d>t	        j
                  |j                  d?      xs g d45       d&g
       N d@j                  |      S )AN)z# Confirmed Route Blockersrm   znBlockers on the normal confirmed route. These rows explain why a candidate is not promoted to normal gameplay.rm   z| source | candidate target | status | missing evidence | non-promoting evidence | selectors | branch gates | render mismatch | open |z7| --- | --- | --- | --- | --- | --- | --- | --- | --- |, rJ   -source rT   	, target rU   z	; record ,rP   z -> accepted rR   tilesetsz	[source](ri   )rn   z	[target](ro   z	[assist](rr   z[selector trial](rt   z[selector](z| r3   z | r4   r?    / rD   rF   rG   rH    r;   rm   z |z| - | - | - | - | - | - | - |)rm   z## Evidence Notesrm   z### z -> z- event records: r=   r   z- selector only: rB   z- non-promoting evidence: z- branch targets: rL   F)ensure_asciiz- selector progress hint: rh   z- xref current root: rowEntry=rW   z, nonMetadataRefs=rY   z	, status=r[   z- trace stops: rb   
)joinr   r   extendjsondumps)r   linesr   gatesmismatch
open_linkss         r   markdownr      s6   E  
		#''"45;<Ccgg234IcggFZ>[=\ ]hhsww'=>D"ELM N#''*@"A"GR!L!LZ!X!^\^_fcfgi 	
 "#l"3!4A67
77< 	#l*;)<A>?77;	#k*:);1=>77&' 1#6I2J1K1MN77>"C,?+@BC")c*#cggh.?.F3-Gs377S[K\J]]`adahahixay`zz}yy!239r:AcB#yy!78>B?F3Gsyy-34;<AdiiP^H_Hece>f>ljl=mmpgS
#ejj&<%=R	A	
!
. 45	LL  
  3778$%T#''(*;*Bs)CD(@! DEF 789(377;Q3R3XVX)Y)`]`(ab CGGO,D,JY^!_ `a(CGG<R4S4YWYhm)n(op,SWW5[-\,] ^"ww'KLM Ngg89:< djj)>)D"SXYZ[
 	 99Ur   c                <	   g }| D ]V  }dt        j                  |d          dg}|j                  d      r+|j                  dt        j                  |d          d       |j                  d      r+|j                  dt        j                  |d          d       |j                  d      r+|j                  dt        j                  |d          d	       |j                  d
      r+|j                  dt        j                  |d
          d       d|j                  d       d|j                  d       dt        j                  dj	                  |j                  d      xs g       xs d       dt        j                  dj	                  |j                  d      xs i j                  d      xs g       xs d       d	}t        j                  t        j                  |j                  d      xs g |j                  d      xs i |j                  d      |j                  d      |j                  d      d|j                  d      xs g dd d!"            }|j                  d#t        j                  |j                  d$      xs d       d%t        j                  |j                  d&      xs d       d%t        j                  |j                  d'      xs d       d(t        j                  |j                  d)      xs d       d%t        j                  d*j	                  |j                  d+      xs g       xs d       d%t        j                  d*j	                  |j                  d,      xs g       xs d       d%t        j                  d*j	                  |j                  d-      xs g       xs d       d.t        j                  d*j	                  |j                  d/      xs g       xs d       d0t        j                  d*j	                  |j                  d1      xs g       xs d       d%| d%d2j	                  |       d3| d4       Y d5j	                  d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJj	                  |      xs dK dLdMdNdJg      S )ONz	<a href="ri   z">source</a>rn   z">target</a>ro   z">assist</a>rr   z">selector trial</a>rt   z">selector</a>r   rT   r   rU   z<br>record <code>r   rP   r   z</code><br>accepted <code>rR   r   z</code>rL   rh   rW   rY   r[   )rowEntrynonMetadataRefsr?   rb   )rL   rh   xrefCurrentRootrb   Frv   r   indentz<tr><td>r3   z	</td><td>r4   r?   r   rD   r   rF   rG   rH   z
<br><code>r;   z</code></td><td>rJ   r   z</td><td><pre>z</pre></td></tr>r   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z)  <title>Confirmed Route Blockers</title>z	  <style>z^    body { margin: 24px; background: #101010; color: #eee; font: 14px system-ui, sans-serif; }z5    table { border-collapse: collapse; width: 100%; }zM    th, td { border: 1px solid #333; padding: 6px 8px; vertical-align: top; }z9    th { background: #1d1d1d; position: sticky; top: 0; }z2    a { color: #9bd4ff; } code { color: #f5d76e; }z]    pre { margin: 0; max-width: 420px; white-space: pre-wrap; font-size: 12px; color: #bbb; }z
  </style>z</head>z<body>z#  <h1>Confirmed Route Blockers</h1>zw  <p>Blockers on the normal confirmed route. These rows explain why a candidate is not promoted to normal gameplay.</p>z  <table><thead><tr><th>source</th><th>candidate target</th><th>status</th><th>missing evidence</th><th>non-promoting evidence</th><th>selectors</th><th>branch gates</th><th>render mismatch</th><th>open</th><th>details</th></tr></thead>z	  <tbody>rm   z+<tr><td colspan="10">No blockers.</td></tr>z</tbody></table>z</body>z</html>)htmlescaper   r   r   r   r   )r   bodyr   linksr   detailss         r   	html_pager      s   D &
T[[\):;<LIJ77< LL9T[[\1B%C$DLQR77;LL9T[[[1A%B$C<PQ77&'LL9T[[5H1I%J$KK_`a77>"LL9T[[^1D%E$FnUVcgg234IcggFZ>[=\ ] KK9O1P1VTV(W(^[^_` a"kk#((CGG<R4S4YWY3^3^_i3j3pnp*q*xuxyz  {BC 	
 ++djj WW_5;$'GG,B$C$IrGG$JK#&77+O#P''"<= 
 '',/52	*
 a	) 	* 	;;swwx07C89 :;;swwx07C89 :;;swwx07C89T[[Q`IaIheh=i<j k;;tyy1B)C)IrJQcRS T;;tyy1G)H)NBOVSVWX Y;;tyy)=)CDKLMZX\XcXcdhdmdmnqnunu  wE  oF  oL  JL  eM  eT  QT  YU  XV V;;tyy1C)D)JKRsST U* 88E?# $y !	
3&
N 99"P3h?WC<g- 	B 	w
BGGDMT%TUUef
/  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_okconfirmed_route_blockers.jsonFrv   r   r   utf-8encoding)mkdir
write_textr   r   )r   out_dirs     r   write_outputsr   -  sC    MM$M...::

4eA6= ; r   c                    t        j                  t              } | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  d	t        t
        d
z         | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  dt        t
               | j                         }t        t        j                  |j                  j                  d            t        j                  |j                  j                  d            t        j                  |j                  j                  d            t        j                  |j                  j                  d            t        j                  |j                  j                  d            t        j                  |j                   j                  d            t        j                  |j"                  j                  d            t        j                  |j$                  j                  d                  }t'        ||j(                         t+        dt-        |       d|j(                  dz          y )N)descriptionz--playable-progresszplayable_progress.json)typedefaultz
--frontierzsave_selector_frontier.jsonz--xrefszsave_selector_xrefs.jsonz--leaf-streamszsave_selector_leaf_streams.jsonz--stream-tracesz save_selector_stream_traces.jsonz--frontier-branchesz$save_selector_frontier_branches.jsonz--save-loader-tracezsave_loader_trace.jsonz--scene-selector-progresszscene_selector_progress.jsonz	--out-dirr   r   zwrote z route blocker rows -> r   )argparseArgumentParser__doc__add_argumentr   OUT
parse_argsr   r   loadsr   	read_textr   xrefsleaf_streamsstream_tracesfrontier_branchesr   r2   r   r   printr   )parserargsr   s      r   mainr   5  sN   $$9F
-D#H`B`a
4?\9\]
	c<V6VW
(tSCd=de
)cDf>fg
-D#HnBno
-D#H`B`a
3$NlHlm
$<D

4))33W3EF

4==**G*<=

4::'''9:

4$$...@A

4%%///AB

4))33W3EF

4))33W3EF

4//9979KL	D $%	F3t9+4T\\Dc5c4d
efr   __main__)r
   zdict[str, str]returnr}   )r   
list[dict]r   dict)r!   r   r"   	list[str]r   r   )r'   r   r"   r   r   r   )r2   r   r3   r}   r4   r}   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r   r   r   )r   r   r   r}   )r   r   r   r   r   None)r   r   )r   
__future__r   r   r   r   pathlibr   urllib.parser   __file__resolver   ROOTr   r   r   r$   r(   r6   r   r   r   r   r   __name__ r   r   <module>r      s    Q "     " H~''*
Ul3M
uu&u $u !+	u
 ",u &0u u "u up6rAH 58 g4 zF r   