+
    ¾å·j¦  ã            
       óÖ  € R t ^ RIt^ RIt^ RIt^ RIt]P
                  ! ]4      P                  4       P                  P                  t	RRR. RO3RRR. RO3RR	R
. RO3RRR. RO3RRR. R O3RRR. R!O3.t
]
 U UUu. uF  w    rV F  q"NK  	  K  	  uppp t]P                  ! R]P                  4      t]P                  ! R4      tRtR tR tR tR t]R8X  d
   ]! 4        R# R# u uppp i )"u©  Write the same top navigation into every demo page, marking the current one: a bar with
home, the current category and its demos, and a å…¨éƒ¨ç¤ºä¾‹ panel listing every demo.

Run from the repo root:  python3 scripts/gen_nav.py
CATEGORIES is the single list of demos by category; www/index.html groups its cards the same way.
Add a new demo to its category here, then add its card to the matching <section> on the home page.
NÚgraphicsu   ðŸŽ¨ å›¾å½¢æ¸²æŸ“u3   åˆ†å½¢ã€�å…‰æ …åŒ–ã€�å…‰çº¿è¿½è¸ªä¸Žç¨‹åº�åŒ–ç”Ÿæˆ�Ú
simulationu   âš›ï¸� ç‰©ç�†æ¨¡æ‹Ÿu*   ç²’å­�ã€�æµ�ä½“ã€�å¸ƒæ–™ä¸Žå…ƒèƒžè‡ªåŠ¨æœºÚ
algorithmsu   ðŸ§® ç®—æ³•ä¸Žæ€§èƒ½u-   æ•°æ�®å¤„ç�†ã€�æ�œç´¢ã€�å‡ ä½•ä¸Žæ€§èƒ½å¯¹æ¯”Úmediau   ðŸŽ¬ å¤šåª’ä½“u   å›¾åƒ�ã€�è§†é¢‘ä¸ŽéŸ³é¢‘å¤„ç�†Útoolsu   ðŸ› ï¸� å®žç”¨å·¥å…·u'   åœ¨æµ�è§ˆå™¨æœ¬åœ°å®Œæˆ�çš„å®žç”¨è®¡ç®—Úgamesu   ðŸŽ® æ¸¸æˆ�ä¸Ž AIu   å�¯ä»¥ä¸Šæ‰‹çŽ©çš„äº’åŠ¨æ¼”ç¤ºz)    <nav class="top-nav"[^>]*>.*?</nav>\nz<body(?: class="([^"]*)")?>z,    <script src="../nav.js" defer></script>
c           	      óZ   € W8X  d   R MRpV RV  RV R\         P                  ! V4       R2# )z aria-current="page"Ú z<a href="../z/"Ú>z</a>)ÚhtmlÚescape)ÚslugÚnameÚcurrentÚindentÚmarks   &&&& Ú'/work/data/stt/webtt/scripts/gen_nav.pyÚlinkr   =   s7   € Ø%)¤_Ñ!¸"€DØˆX�\ $  r¨$¨¨q´·²¸TÓ1BÐ0CÀ4ÐHÐHó    c                óà  a € \        V 3R l\         4       4      p\        \        4      S ,          pRRR\        P
                  ! V^,          P                  R^4      ^,          4       R2R\        P
                  ! V4       R2R.pY1^,           UUu. uF  w  rE\        WES R4      NK  	  upp,          pV. RO,          p\         Fx  w  rgrhVP                  R	4       VP                  R
\        P
                  ! V4       R24       Y8 UUu. uF  w  rE\        WES R4      NK  	  upp,          pVP                  R4       Kz  	  V. RO,          pRP                  V4      R,           # u uppi u uppi )u™   The bar shows home, the current category and its demos; å…¨éƒ¨ç¤ºä¾‹ opens a panel with
every demo by category (a <details>, so it works without script).c              3   óÈ   <"  € T FW  p\         ;QJ d&    V3R  lV^,           4       F  '       g   K   RM	  RM! V3R  lV^,           4       4      '       g   KS  Vx € KY  	  R# 5i)c              3   ó2   <"  € T F  w  rVS8H  x € K  	  R # 5i©N© )Ú.0r   Ú_r   s   &  €r   Ú	<genexpr>Ú#render.<locals>.<genexpr>.<genexpr>E   s   øé € Ð0UÑPTÁWÀT°¸¶ÓPTùs   ƒTFN)Úany)r   Úcr   s   & €r   r   Úrender.<locals>.<genexpr>E   s>   øé € ÐV™z˜!¯S«SÔ0UÐPQÐRSÖPTÓ0U¯S¯SªSÔ0UÐPQÐRSÖPTÓ0U×-U—A’A›zùs   ƒA"“A"±"A"Á
A"u3       <nav class="top-nav" aria-label="ç¤ºä¾‹å¯¼èˆª">u5           <a class="nav-home" href="../">â†� é¦–é¡µ</a>z        <span class="nav-cat">Ú z</span>z        <span class="nav-here">z"        <div class="nav-siblings">z'                <div class="nav-group">z2                    <span class="nav-group-title">z                </div>Ú
z            )z        </div>z!        <details class="nav-all">u+               <summary>å…¨éƒ¨ç¤ºä¾‹</summary>z#            <div class="nav-panel">z                    )z            </div>z        </details>z
    </nav>)
ÚnextÚ
CATEGORIESÚdictÚDEMOSr   r   Úsplitr   ÚappendÚjoin)	r   Úcategoryr   Úlinesr   Únr   ÚlabelÚdemoss	   f        r   Úrenderr/   B   sM  ø€ ô ÔV�zÓVÓV€HÜ”‹;�wÕ€DØBØDØ-¬d¯kªk¸(À1½+×:KÑ:KÈCÐQRÓ:SÐTUÕ:VÓ.WÐ-XÐX_Ð`Ø.¬t¯{ª{¸4Ó/@Ð.AÀÐIØ1ð	3€Eð
 
Àq¾kÔJ¹k±7°4Œd�4˜G XÖ.¹kÒJÕJ€EØ	ò 5õ 5€E÷ )Ñˆ�!Ø�‰Ð>Ô?Ø�‰ÐIÌ$Ï+Ê+ÐV[ÓJ\ÐI]Ð]dÐeÔfØÀ%ÔHÁ%±w°t”$�t ¨Ö2Á%ÒHÕHˆØ�‰Ð-Ö.ñ	 )ð
 
ÒGÕG€EØ�9‰9�UÓ˜dÕ"Ð"ùó Kùó Is   ÂE$Ä
E*
c                ó6   € R p\         P                  W^R7      # )zEGive <body> the has-nav class, which reserves room for the fixed bar.c                 ó¾   € V P                  ^4      ;'       g    RP                  4       pRV9   d   V P                  ^ 4      # RRP                  VR.,           4       R2# )é   r	   zhas-navz<body class="r!   z">)Úgroupr'   r)   )ÚmÚclassess   & r   ÚaddÚwith_nav_class.<locals>.add\   sX   € Ø—7‘7˜1“:×#Ð# ×*Ñ*Ó,ˆØ&¨'Ô1ˆq�w‰w�q‹zÐj¸ÀsÇxÁxÐPWÐ[dÐZeÕPeÓGfÐFgÐgiÐ7jÐjr   )Úcount)ÚBODY_REÚsub)Úpager6   s   & r   Úwith_nav_classr<   Z   s   € òkô �;‰;�s¨ˆ;Ó*Ð*r   c                  óÔ  a€ \          FÜ  w  op \        R ,          S,          R,          pVP                  RR7      p\        \        P                  V4      4      ^8w  d   \        P                  ! V R24       \        \        P                  V3R lV4      4      p\        V9  d   VP                  R\        R,           ^4      pVP                  VRR7       \        RS 24       KÞ  	  R# )	Úwwwz
index.htmlzutf-8)Úencodingz,: expected exactly one <nav class="top-nav">c                 ó   <€ \        S4      # r   )r/   )r   r   s   &€r   Ú<lambda>Úmain.<locals>.<lambda>h   s	   ø€ ´6¸$´<r   z</head>u   nav â†’ N)r&   ÚROOTÚ	read_textÚlenÚNAV_REÚfindallÚsysÚexitr<   r:   ÚSCRIPTÚreplaceÚ
write_textÚprint)r   r;   Útextr   s      @r   ÚmainrO   b   s²   ø€ ß‰ˆˆaÜ�e�|˜dÕ" \Õ1ˆØ�~‰~ wˆ~Ó/ˆÜŒv�~‰~˜dÓ#Ó$¨Ô)Ü�HŠH˜�vÐIÐJÔKÜœfŸj™jÔ)?ÀÓFÓGˆÜ˜ÔØ—<‘< 	¬6°IÕ+=¸qÓAˆDØ�‰˜ wˆÔ/Ü�˜˜ÐÖ ó r   Ú__main__))Ú
mandelbrotu   æ›¼å¾·å�šé›†å�ˆ)Ú
mandelbulbu   æ›¼å¾·å�šç�ƒ)Úterrainu   å™ªå£°åœ°å½¢)Ú
rasterizeru   è½¯ä»¶å…‰æ …åŒ–)Ú
pathtraceru   å…‰çº¿è¿½è¸ª)Úwfcu   æ³¢å‡½æ•°å��ç¼©))Ú	particlesu   ç²’å­�ç‰©ç�†)ÚwebgpuÚWebGPU)Úfluidu   æµ�ä½“æ¨¡æ‹Ÿ)zgame-of-lifeu   ç”Ÿå‘½æ¸¸æˆ�)Úclothu   å¸ƒæ–™æ¨¡æ‹Ÿ))z
data-tableu   æ•°æ�®è¡¨æ ¼)Úpathfindu   è¿·å®«å¯»è·¯)Ú	benchmarku   æ€§èƒ½å¯¹æ¯”)Úsimdu   SIMD åŠ é€Ÿ)Údelaunayu   ä¸‰è§’å‰–åˆ†)Úsudokuu   æ•°ç‹¬æ±‚è§£)zserver-computeu   æµ�è§ˆå™¨ vs æœ�åŠ¡ç«¯))zimage-filteru   å›¾åƒ�æ»¤é•œ)zvideo-filteru   è§†é¢‘æ»¤é•œ)Úspectrumu   éŸ³é¢‘é¢‘è°±)Úsynthu	   å�ˆæˆ�å™¨)zseam-carvingu   æ™ºèƒ½ç¼©æ”¾)ÚjpegÚJPEG))Úsha256u   æ–‡ä»¶å“ˆå¸Œ)Úqrcodeu	   äºŒç»´ç �)Úcompressu   æ•°æ�®åŽ‹ç¼©)ÚmarkdownÚMarkdown)Úmcpu   MCP è°ƒè¯•å�°))zfalling-sandu   è�½æ²™æ¸¸æˆ�)Úgomokuu   äº”å­�æ£‹ AI)Údigitsu   æ‰‹å†™è¯†åˆ«)Úchip8zCHIP-8)Ú__doc__r   ÚpathlibÚrerH   ÚPathÚ__file__ÚresolveÚparentrC   r$   r&   ÚcompileÚSrF   r9   rJ   r   r/   r<   rO   Ú__name__)r   r.   Úds   000r   Ú<module>ry      sC  ðñó Û Û 	Û 
à‡|‚|�HÓ×%Ñ%Ó'×.Ñ.×5Ñ5€ð Ð$Ð&[ò ^ð ð Ð(Ð*Vò Yð ð Ð)Ð+Zò ]ð ð ÐÐ @ò Cð ð Ð$Ð&Oò Rð ð Ð!Ð#Cò Fð ð?%€
ñL ",Õ;¡‰~ˆq�!�Q³U°Š±U‰¡Ó;€à	�ŠÐ@À"Ç$Á$Ó	G€Ø
�*Š*Ð3Ó
4€Ø	8€òIò
#ò0+ò
!ð ˆzÔÙ†Fñ ùôs 	<s   Á9C$