
    #mJj(                        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Zg d	Zdd
ZefddZddZefddZddZedk(  r e        yy)zEBuild a compact movement review summary from candidate browser smoke.    )annotationsN)Path)Any   outz%candidate_movement_browser_smoke.json)statusbaseurltracemovementStepSoundmovementBumpwallSlideFacingpartyTrailAnimationfieldPoisonfieldPoisonPartialContinuefieldPoisonCureContinuefieldPoisonEffectContinuefieldParalysisCureContinuefieldParalysisMovementfieldParalysisPartialContinuechecksumc                p    | j                         r%t        j                  | j                  d            S i S )Nutf-8encoding)existsjsonloads	read_text)paths    ,tools/summarize_movement_candidate_review.py	load_jsonr"   $   s)    ;?;;=4::dnngn67PbP    c           	        | dz  }|t         z  }t        |      }t        D ci c]  }||v s||j                  |       }}d|j                  d      xs i j                  d      xs i i|d<   dt          |d<   t	        t        j                  |dd      j                  d	            }d
dddt          d|j                         r|j                         j                  nd||dS c c}w )Nr   r   	snapshotszout/
sourceFileF),:)ensure_ascii
separatorsr   z(hwanse-movement-candidate-review-summaryz,tools/summarize_movement_candidate_review.pyreadyzCompact browser movement review contract. It keeps movement smoke strings and the walk trace snapshot used by web/movement_review.html and web/map_occlusion.html; raw movement smoke remains a build/audit/verifier input until those consumers are replaced.r   )kindsourcer   r&   boundarysourceSizeBytescompactSizeBytesmovement)SOURCE_FILEr"   TOP_LEVEL_FIELDSgetlenr   dumpsencoder   statst_size)rootout_dirr    payloadfieldr1   compact_sizes          r!   build_summaryr?   (   s    UlG[ DoG7G\e5T[K[w{{5))\H\'++k*0b55g>D"H[  $K=1H\tzz(:V]]^efgL:@[M*j 37++-499;..Q(  ]s
   	C'C'c                   | d   }dj                  d |j                         D              }|j                  di       j                  di       }dj                  d |j                  dg       D              }dt        j                  | d	          d
t        j                  | d          dt        | d         ddt        | d         dd| d| dS )Nr1   
c           	   3     K   | ]G  \  }}|d k7  r=dt        j                  |       dt        j                  t        |            dd  d I yw)r%   z<tr><td><code></code></td><td>Ni  
</td></tr>)htmlescapestr).0keyvalues      r!   	<genexpr>zhtml_page.<locals>.<genexpr>D   s^      
 C+	[[%& '{{3u:&u-. /	s   AAr%   r   c              3    K   | ]  }d t        j                  t        |j                  dd                   dt        j                  t        |j                  dd                   dt        j                  t        |j                  dd                   dt        j                  t        |j                  dd                   d		  y
w)z<tr><td>label-z</td><td><code>selectorHexrC   sourceMatchesSelectorz	</td><td>projectionMatchesDrawrD   N)rE   rF   rG   r4   )rH   samples     r!   rK   zhtml_page.<locals>.<genexpr>M   s       	{{3vzz'3789: ;[[VZZs%C!DEF G{{3vzz*A3GHIJ K{{3vzz*A3GHIJ K		s   C	Csamplesa-  <!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <title>Movement Candidate Review Summary</title>
  <style>
    body { margin: 24px; color: #202124; font-family: system-ui, sans-serif; line-height: 1.5; }
    table { width: 100%; border-collapse: collapse; margin: 14px 0 28px; }
    th, td { border: 1px solid #d7dce2; padding: 6px 8px; text-align: left; vertical-align: top; }
    th { background: #f4f6f8; }
    code { background: #f4f6f8; padding: 1px 4px; }
  </style>
</head>
<body>
  <h1>Movement Candidate Review Summary</h1>
  <p>r.   z</p>
  <p><code>r&   z	</code>: r/   r'   z bytes raw, r0   zt bytes compact.</p>
  <h2>Fields</h2>
  <table>
    <thead><tr><th>field</th><th>value</th></tr></thead>
    <tbody>z</tbody>
  </table>
  <h2 id="trace">Trace Samples</h2>
  <table>
    <thead><tr><th>label</th><th>selector</th><th>source rect</th><th>projection</th></tr></thead>
    <tbody>z$</tbody>
  </table>
</body>
</html>
)joinitemsr4   rE   rF   int)summaryr1   rowsr   
trace_rowss        r!   	html_pagerZ   B   s   z"H99 
 #..* D LLb)--gr:E  ii	2. J kk'*%&' (KK-./yWEV=W9XYZ8[[ghkls  uG  mH  iI  JK  hL L 6 
 < 3 r#   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  t	        |       d	       y )NT)parentsexist_okz&movement_candidate_review_summary.jsonF   )r)   indentrA   r   r   z&movement_candidate_review_summary.html)mkdir
write_textr   r6   rZ   )rW   r;   s     r!   write_outputsrb   v   se    MM$M.77CC

7q9D@ D  77CCIgDVahCir#   c                     t        j                         } | j                  dt        t               | j                         }|j                  j                         }t        t        |      |dz         y )Nz--root)typedefaultr   )
argparseArgumentParseradd_argumentr   ROOT
parse_argsr:   resolverb   r?   )parserargsr:   s      r!   mainrn      sX    $$&F
tT:D99D-%te|4r#   __main__)r    r   returndict[str, Any])r:   r   rp   rq   )rW   rq   rp   rG   )rW   rq   r;   r   rp   None)rp   rr   )__doc__
__future__r   rf   rE   r   pathlibr   typingr   __file__rk   r\   ri   OUTr2   r3   r"   r?   rZ   rb   rn   __name__ r#   r!   <module>r{      s    K "      H~''*
Ul5 (Q  $ 41h <? j5 zF r#   