Ë
    �Ìj½`  ã                  óô  — U 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Zddl	m
Z
 ddlmZ ddlmZ ddlmZ  e
d«      Zd	Zd
ZdZ ej*                  dej,                  «      Zd\  ZZZdZh d£Z ej*                  dej,                  «      Z ej*                  dej,                  «      Z ej*                  dej,                  «      Zg d¢g d¢g d¢g d¢dœZ d_d„Z!d`d„Z"h d£Z#dZ$de$z   de$z   ddde$z   d d!d"d#d$d%œ
Z% ej*                  d&ej,                  «      Z&dad'„Z'dbd(„Z( ej*                  d)ej,                  «      Z)d*d+d+d,d-d-d.d/d0d1œ	Z*i d2d*“d3d*“d4d*“d5d*“d6d+“d7d+“d8d+“d9d+“d:d,“d;d,“d<d,“d=d-“d>d-“d?d-“d@d-“dAd-“dBd-“d/d/d.d.dCœ¥Z+dDg dE¢dFg dG¢dHg dI¢dJg dK¢dLg dM¢e)jX                  g dN¢iZ-g dO¢Z. e/dPja                  «       «      Z1dcdQ„Z2dddRœZ3dSe4dT<   efdddU„Z5dedV„Z6dfdgdW„Z7dhdX„Z8didY„Z9djdZ„Z:dkd[„Z;d\Z<d]efdld^„Z=y)man  The Forge Asset Library in OhMyGames builds (operator GO 7 Oct 2026 ~14:47 CET: "go for P0 and P1").

A custom 3D game whose words name things the library holds (a lighthouse, crates, barrels, benches, lamp posts, rocks,
trees, wall modules, sofas...) gets those models picked from the library, copied INTO the game (public/library/, pinned
by release hash in assets.lock.json) with a small loader (src/lib/library/) and the builder contract. People stay with
the Cast, boats with the water kit; room-stage games keep their room kit. Vehicles: the realistic Astra road vehicles
(cars, motorbikes, bicycles, buses; one "Paint" material, six paints each, 10 Oct 2026) come as street scenery and
traffic; the Garage still gives a vehicle game its drivable vehicles, and its own (garage-kit) models never come here.

The library is the gex44 host tree /srv/forge-assets (repo/index.json + blobs/<sha>.glb), bind-mounted read-only into
the Factory. Publishing new models there needs no Factory rebuild. Missing mount, no matching words or a broken index
= no library, the build goes on as before (a bonus, never a reason to fail a build).
é    )ÚannotationsN)ÚPath)ÚAny)Ú
_card_text)Ú	_data_urlz/srv/forge-assets)ÚbuildingÚpartÚpropÚvehicle)zpart.character)zvehicle.car.zvehicle.two-wheel.úvehicle.service.buszvehicle.service.school-buszvehicle.military-land.zvehicle.rotor.zvehicle.military-air.zÈ\b(medieval|fantasy|ancient|castles?|knights?|vikings?|wild west|western|pirates?|prehistoric|stone age|dinosaurs?|roman|samurai|dungeons?|elves|dragons?|wizards?|space ?ships?|galaxy|planets?|mars)\b)é   i z é   é   >   ÚnetÚpodÚbookÚjeepÚraceÚrailÚropeÚsemiÚsignÚtankÚwellÚcoupeÚdroneÚframeÚgoodsÚslopeÚstandÚstepsÚtableÚtruckÚestateÚloaderÚmoduleÚmuscleÚsportsÚclassicÚfighterÚ	artilleryz‘\b(ww ?(2|ii)|world war (2|ii|two)|second world war|194[0-5]|normandy|d-?day|blitzkrieg|stalingrad|wehrmacht|nazis?|allies vs axis|axis powers)\bz€\b(ww ?(1|i)|world war (1|i|one)|first world war|great war|191[4-8]|trench warfare|trenches|the somme|verdun|ypres|landships?)\bz=\b(cold war|warsaw pact|iron curtain|berlin wall|fulda gap)\b)ÚmodernÚcoldwarÚww2Úww1)r-   r,   r.   r/   )r.   r/   r-   r,   )r/   r.   r-   r,   c                ó¨   — t         j                  | xs d«      rdS t        j                  | xs d«      rdS t        j                  | xs d«      rdS dS )NÚ r.   r/   r-   r,   )ÚWW2ÚsearchÚWW1ÚCOLD_WAR)Útexts    úH/home/claude-agent/forge-build/forge-assets/omg/factory/games_library.pyÚera_ofr8   ;   s\   € Ü—J‘J˜tšz rÔ*ˆ5ð  L¼¿¹ÀDÂJÈBÔ9O°ð  LÔbj×bqÑbqÐrvÒr|Ðz|Ôb}ÐU^ð  Lð  DLð  Ló    c                óö   — | j                  d«      xs g D �cg c]  }|j                  d«      sŒ|dd  ‘Œ }}t        |   }|r|d   |v r|j                  |d   «      S |dk(  rdS |j                  d«      S c c}w )NÚtagsúera-r   r   r,   )ÚgetÚ
startswithÚ	ERA_ORDERÚindex)ÚaÚeraÚtr;   Úorders        r7   Ú	_era_rankrE   ?   s   € ØŸE™E &›MÒ/¨RÖI�a°A·L±LÀÕ4HˆAˆaˆbŠEÐI€DÐIÜ�c‰N€EÙ#'¨D°©G°uÑ,<ˆ5�;‰;�t˜A‘wÓÐsÈÈxÊÀ1ÐsÐ]b×]hÑ]hÐiqÓ]rÐsùò Js
   ˜A6¯A6>   ÚhaÚisÚivÚchiÚwarÚwwiÚcharÚcoldÚlandÚmarkr   ÚtypeÚwwiiÚblackÚheavyÚlightÚstyler   ÚinfantryÚmilitaryzDnormandy|d-?day|western front|ardennes|bulge|el alamein|north africaz+german\w*|wehrmacht|panzers?|eastern front|zamericans?|us army|yanks?|z:soviets?|red army|russians?|stalingrad|kursk|eastern frontz	russians?zbritish|brits?|england|english|Úfrenchzjapanese|imperial armyzisrael\w*|idfÚchinesezkorean?)
ÚgermanyÚusaÚussrÚrussiaÚukÚfranceÚjapanÚisraelÚchinazsouth-koreaz]\b(pacific|iwo jima|guadalcanal|okinawa|burma|philippines|japan\w*|imperial army|manchuria)\bc                ó„  ‡‡— | j                  d«      xs g }|D �cg c]O  }|j                  d«      rŒ|t        vsŒt        |«      dkD  s"t        |«      dk(  sŒ;t	        d„ |D «       «      sŒN|‘ŒQ }}t	        ˆfd„|D «       «      ryt	        ˆfd„|D «       «      ryd	|v rt
        j                  ‰xs d
«      sdS dS c c}w )zt0 = the words name this model, 1 = its nation is in the story, 2 = neither, 3 = a Japanese model outside the Pacificr;   r<   r   c              3  ó<   K  — | ]  }|j                  «       –— Œ y ­w©N)Úisdigit©Ú.0Úcs     r7   ú	<genexpr>z_named.<locals>.<genexpr>T   s3   è ø€ ò  yQð  JKÐyz÷  zCñ  zC÷  zEñ  yQùs   ‚c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wre   © )rh   rC   Úwordss     €r7   rj   z_named.<locals>.<genexpr>U   s   øè ø€ Ò
#˜!ˆ1�Œ:Ñ
#ùó   ƒr   c              3  óš   •K  — | ]B  }|t         v xr4 t        j                  d t         |   › d�‰xs dt        j                  «      –— ŒD y­w)z\b(z)\br1   N)ÚNATIONÚrer3   ÚI)rh   rC   r6   s     €r7   rj   z_named.<locals>.<genexpr>W   s@   øè ø€ Ò
\ÐRSˆ1”ˆ;ÒMœ2Ÿ9™9¨¬F°1©I¨;°cÐ%:¸DºJÀBÌÏÉÓMÓMÑ
\ùs   ƒAAé   r`   r1   é   )r=   r>   ÚGENERIC_TAGSÚlenÚanyÚPACIFICr3   )rA   rm   r6   r;   rC   Úowns    ``   r7   Ú_namedrz   Q   sÉ   ù€ à�5‰5�‹=Ò˜B€DØö  T� !§,¡,¨vÕ"6¸1ÄLÒ;PÔVYÐZ[ÓV\Ð_`ÒV`ÔehÐijÓekÐopÓepÔuxñ  yQð  OPô  yQõ  vQŠ1ð  T€Cð  TÜ
Ó
#˜sÔ
#Ô#ØÜ
Ó
\ÐW[Ô
\Ô\ØØ˜4‘¬¯©°t²z¸rÔ(Bˆ1ÐIÈÐIùò Ts   œB=³B=¼B=ÁB=Á,B=c                ób   — | d   | j                  d«      r| j                  d«      xs dz   S dz   S )zWbytes the game downloads for this asset: a destructible tank brings its damage file tooÚbytesÚ
damage_glbÚdamage_bytesr   ©r=   )rA   s    r7   Ú_weightr€   \   s3   € àˆW‰:°q·u±u¸\Ô7J˜Ÿ™˜~Ó.Ò3°!ÑRÐRÐPQÑRÐRr9   zÆ\b(war|warzone|army|armies|military|battlefields?|front ?lines?|soldiers?|troops|commandos?|invasion|ww ?(2|ii)|world war|military base|army base|air ?base|air ?strikes?|platoon|squad of soldiers)\búvehicle.military-land.tankúvehicle.military-land.jeepúvehicle.military-land.truckúvehicle.military-air.fighterúvehicle.rotor.helicopterúvehicle.rotor.attack-helicopterzvehicle.military-air.bomber)	r   r   Úhumveer#   r*   ÚjetÚ
helicopterÚgunshipÚbomberzbattle tankztanks rollingz	army tankz
heavy tankz	army jeepzmilitary jeepr‡   Úhummerztroop truckz
army truckzmilitary truckzfighter jetzjet fighterzfighter jetszfighter planeÚwarplaneÚdogfight)zcombat helicopterrŠ   ztroop helicopterzarmy helicopterzn\b(harbou?rs?|port|quays?|docks?|fishing village|fishing town|seaside|wharf|pier|marina|fishermen|fisherman)\b)zprop.harbour.anchorzprop.harbour.buoyzprop.harbour.mooringzprop.harbour.lobster-potzprop.harbour.fish-boxzprop.harbour.netzprop.harbour.ropezpart.wall.quay-wallzpart.floor.deckzpart.stair.stepszbuilding.landmark.lighthousezbuilding.civic.marketzprop.container.barrelzprop.container.crateúprop.street.lampúprop.street.benchz3\b(village|hamlet|town square|old town|cottages?)\b)
zpart.wall.modulezpart.wall.cornerzpart.roof.slopezpart.roof.gable-endzpart.roof.chimneyzbuilding.medieval.chapelr�   r�   zprop.farm.fencezprop.farm.cartzH\b(furniture store|flat-?pack|ikea|home store|showroom|furniture shop)\b)
zprop.furniture.sofazprop.furniture.armchairzprop.furniture.bedzprop.furniture.shelfzprop.furniture.tablezprop.furniture.lampzprop.retail.cartzprop.retail.rackzprop.retail.checkoutzprop.decor.plantz9\b(ruins?|ancient temple|lost city|forest|woods|jungle)\b)zbuilding.ruin.columnzbuilding.ruin.archzprop.nature.rockzprop.nature.treez‹\b(city|cities|downtown|traffic|parking|car parks?|bus stops?|bus stations?|suburbs?|avenues?|boulevards?|highways?|rush hour|commuters?)\b)zvehicle.car.hatchbackzvehicle.car.sedanzvehicle.car.suvr   zvehicle.two-wheel.bicyclezvehicle.two-wheel.scooterzvehicle.two-wheel.motorcycle)r‚   rƒ   r�   r…   r†   r„   )zbuilding.landmarkzbuilding.medievalzbuilding.dwellingzbuilding.fortzbuilding.civiczbuilding.ruinzprop.streetzprop.harbourz	prop.farmzprop.containerzprop.naturez	prop.campz	part.wallz	part.roofzpart.openingz
part.stairz
part.floorzpart.structurezprop.furniturezprop.retailz
prop.decorz
prop.sportzvehicle.carzvehicle.servicezvehicle.two-wheelz_a an and the of with for to in on at by from my our some big small little old new one two threec                ó¤  — g }t        j                  d| xs dj                  «       «      D ]¢  }|r|t        v rŒt	        |«      dkD  rA|j                  d«      r0|j                  d«      s|d d j                  d«      r|d d n|d d }n5t	        |«      dkD  r'|j                  d	«      r|j                  d
«      s|d d }|j                  |«       Œ¤ |S )Nz
[^a-z0-9]+r1   rt   ÚesÚseséþÿÿÿ)ÚchÚshÚxéÿÿÿÿÚsÚss)rq   ÚsplitÚlowerÚSTOPrv   ÚendswithÚappend)r6   ÚoutrC   s      r7   Útokensr¡   �   s½   € Ø
€CÜ�X‰X�m d¢j¨b×%7Ñ%7Ó%9Ó:ò ˆÙ�Aœ‘IØÜˆq‹6�AŠ:˜!Ÿ*™* TÔ*°1·:±:¸eÔ3DØ˜C˜R˜&Ÿ/™/Ð*;Ô<��#�2‘À!ÀCÀRÀ&‰AÜ�‹V�aŠZ˜AŸJ™J sœO°A·J±J¸tÔ4DØ�#�2�ˆAØ�
‰
�1�ðð €Jr9   )ÚmtimeÚdatazdict[str, Any]Ú_INDEXc                ó  — | dz  dz  }	 |j                  «       j                  }t        d   |k7  r4t        j                  |j                  «       «      |ct        d<   t        d<   t        d   S # t        t        f$ r Y yw xY w)zWindex.json, cached until its file changes (a library publish needs no Factory restart).Úrepoz
index.jsonr¢   r£   N)ÚstatÚst_mtimer¤   ÚjsonÚloadsÚ	read_textÚOSErrorÚ
ValueError)ÚrootÚpÚms      r7   Ú
load_indexr±       sv   € àˆv‰˜Ñ$€AðØ�F‰F‹H×ÑˆÜ�'‰?˜aÒÜ.2¯j©j¸¿¹»Ó.GÈÐ+ŒF�6‰NœF 7™OÜ�f‰~ÐøÜ”ZÐ ò Ùðús   ŠA"A- Á-A?Á>A?c                óŽ   — t        | dd «      }t        | dd «      dk(  xr' t        | dd «      dk(  xr |d uxr t        |dd «      dv S )NÚworldÚlaneÚcustomÚstageÚnoneÚview)ÚfirstÚthirdÚtop)Úgetattr)Úcardr³   s     r7   Úlibrary_fitsr¾   ¬   se   € Ü�D˜' 4Ó(€EÜ�D˜& $Ó'¨8Ñ3ò J¼ÀÀgÈtÓ8TÐX^Ñ8^ò JÐchÐptÐctò JÜ˜˜v tÓ,Ð0IÐIðKr9   c                ó^  — | d   j                  d«      d   }|j                  d«      r,|r)|j                  t        «      r| j                  d«      dk(  ry|j                  d«      d   t        v xr> |j                  t
        «       xr& | j                  d	«      xr | j                  d
«      dv S )NÚidú/r   úvehicle.ÚkitÚgarageFú.Úgame_useÚstatus)ÚapprovedÚlegacy)r›   r>   ÚVEHICLE_GROUPSr=   ÚKINDSÚSKIP_GROUPS)rA   r,   Úclss      r7   Ú_usablerÎ   ²   sž   € Ø
ˆD‰'�-‰-˜Ó
˜QÑ
€CØ
‡~�~�jÔ!©6¸¿¹ÌÔ9WÐ[\×[`Ñ[`ÐafÓ[gÐksÒ[sØØ�I‰I�c‹N˜1Ñ¤Ð&ò :¨s¯~©~¼kÓ/JÐ+Jò :ÈqÏuÉuÐU_ÓO`ò :Ø—‘�h“Ð#9Ð9ð;r9   c           	     ó¾	  ‡‡ ‡!‡"‡#‡$‡%‡&— dt        j                  dd‰j                  «       «      z   dz   }t        t	        ‰«      «      Š&t
        j                  ‰xs d«       }t        ‰«      Š!‰!dv }| d   D �cg c]A  }t        ||«      sŒ|r.|d   j                  d«      rd‰!› �|j                  d	«      xs g vs|‘ŒC }}i Š |D ]8  }‰ j                  |d   j                  d
«      d   g «      j                  |«       Œ: g Š%ddj                  t	        ‰«      «      z   dz   }t        i | j                  di «      ¥t         ¥j#                  «       d„ ¬«      D ]`  \  }}	dj                  t	        |«      «      }
d|› d�|v s|
sŒ+d|
› d�|v sŒ4‰%‰ D �cg c]  }||	k(  s|j                  |	dz   «      sŒ|‘Œ  c}z  Š%Œb g }i }| d   j#                  «       D ]æ  \  }}|t$        vrŒ|d   j#                  «       D ]Â  \  }}|d   D ]µ  }	|› d|› d|	› �}|j                  t&        «      s|dk(  r|j                  t(        «      sŒ=t	        |	j+                  dd«      «      }|	t,        v s|sŒct/        |«      dkD  rd|	j+                  dd«      z   dz   |v n|d   ‰&v }|sŒ•|j                  |	g «      j                  |«       Œ· ŒÄ Œè |j#                  «       D ]K  \  }}|j1                  ˆ fd„¬«       t3        ˆ%fd„|D «       «      rŒ0|d   }|‰ v r‰%n|j                  |«       ŒM |rMt4        j                  ‰xs d«      r4‰%t6        j#                  «       D ��cg c]  \  }}|‰&v sŒ|‰ v sŒ|‘Œ c}}z  Š%t        ‰%«      }t8        j#                  «       D ]C  \  }}t        j                  |‰t         j:                  «      sŒ,‰%|D �cg c]	  }|‰ v sŒ|‘Œ c}z  Š%ŒE t=        t>        jA                  ‰%«      «      }ˆ!ˆˆ&fd„}g dcŠ#Š$ˆ#ˆ$fd„}|D ]=  }	t        ‰ |	   |¬«      }|d|	j                  d«      rdntB         D ]  } ||«      rŒ Œ= Œ? g d¢Š"t        |ˆ"fd„¬«      D ]=  }	|	j                  d«      sŒ|	|v sŒt        ‰ |	   |¬«      dtD         D ]
  } ||«       Œ Œ? ‰#t=        t>        jA                  d„ ‰%D «       «      «      t        t        |«      «      fS c c}w c c}w c c}}w c c}w )zj(assets, matched classes, gaps) for the game's words. Deterministic: same words + same index = same picks.ú z[^a-z0-9 -]+r1   )r/   r.   ÚassetsrÀ   )zvehicle.militaryzvehicle.rotorr<   r;   rÁ   r   Úaliasesc                ó    — t        | d   «       S )Nr   )rv   )Úkvs    r7   ú<lambda>zpick.<locals>.<lambda>È   s   € ÔhkÐlnÐopÑlqÓhrÐgr€ r9   )ÚkeyrÅ   ÚtreeÚgroupsÚclassesr   ú-rs   c                ó˜   •— | ‰v| j                  dd«      d   t        v r)t        j                  | j                  dd«      d   «      fS dfS )NrÅ   rs   r   éc   )ÚrsplitÚGROUP_ORDERr@   )ÚfÚby_classs    €r7   rÕ   zpick.<locals>.<lambda>ß   sg   ø€  !¨8Ð"3Ð_`×_gÑ_gÐhkÐmnÓ_oÐpqÑ_rô  wBñ  `B´[×5FÑ5FÀqÇxÁxÐPSÐUVÓGWÐXYÑGZÓ5[ð  "K€ ð  HJð  "K€ r9   c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wre   rl   )rh   rß   Úwanteds     €r7   rj   zpick.<locals>.<genexpr>à   s   øè ø€ Ò*˜qˆq�FŒ{Ñ*ùrn   c                óv   •— | d   dk7  t        | ‰‰«      dkD  t        | ‰«      t        | ‰‰«      t        | «      fS )NrÇ   rÈ   r   )rz   rE   r€   )rA   rB   r6   rm   s    €€€r7   rÕ   zpick.<locals>.<lambda>ë   sQ   ø€ �a˜‘k ZÑ/´¸¸5À$Ó1GÈ!Ñ1KÌYÐWXÐZ]ÓM^Ô`fÐghÐjoÐquÓ`vÔxð  ABó  yCð  D€ r9   c                ó”   •— t        ‰«      t        k\  s‰t        | «      z   t        kD  ry‰j	                  | «       ‰t        | «      z  Šy)NFT)rv   Ú
MAX_ASSETSr€   Ú	MAX_BYTESrŸ   )rA   r    Útotals    €€r7   Útakezpick.<locals>.takeî   s<   ø€ äˆs‹8”zÒ! U¬W°Q«ZÑ%7¼)Ò%CØØ�
‰
�1Œ�u¤¨£
Ñ*�u°4r9   NrÂ   )r�   r‚   rƒ   r†   c                óD   •— | ‰v r‰j                  | «      S t        ‰«      S re   )r@   rv   )ri   r¹   s    €r7   rÕ   zpick.<locals>.<lambda>ý   s   ø€ ¸QÀ%¹Z¨5¯;©;°q«>€ ÌSÐQVËZ€ r9   c              3  ó    K  — | ]  }|–— Œ y ­wre   rl   rg   s     r7   rj   zpick.<locals>.<genexpr>  s   è ø€ Ò"5¨¤1Ñ"5ùs   ‚)#rq   Úsubrœ   Úsetr¡   Ú
NOT_MODERNr3   r8   rÎ   r>   r=   Ú
setdefaultr›   rŸ   ÚjoinÚsortedÚMILITARY_PHRASESÚitemsrË   rÌ   rÊ   ÚreplaceÚ	AMBIGUOUSrv   Úsortrw   ÚWARÚ	WAR_WORDSÚTHEMESrr   ÚlistÚdictÚfromkeysÚ	PER_CLASSÚPER_VEHICLE_CLASS)'r@   r6   Úlowr,   ÚoldrA   ÚusableÚltokÚphraserÍ   Úptri   ÚgapsÚby_wordÚkindÚnodeÚgrpÚgÚfullÚpartsÚhitÚcls_wordÚfullsÚbestÚwÚnamedÚpatrÙ   rD   Úrankrè   Úcandsrà   rB   r¹   r    rç   râ   rm   s'    `                              @@@@@@@r7   Úpickr  º   só  ÿ€ à
”—‘�¨¨T¯Z©Z«\Ó:Ñ
:¸SÑ
@€CÜ”�t“Ó€EÜ×"Ñ" 4¢:¨2Ó.Ð.€FÜ
�‹,€CØ
�Ð
€CØ˜x™ö I�A¬G°A°vÕ,>Ù˜q ™w×1Ñ1Ð2WÔXÐ_cÐdgÐchÐ]iÐrs×rwÑrwÐx~Órò  sFð  DFñ  ^Gò ð I€Fð Ià&(€HØò AˆØ×Ñ˜A˜d™GŸM™M¨#Ó.¨qÑ1°2Ó6×=Ñ=¸aÕ@ðAà€FØ�—‘œ& ›,Ó'Ñ'¨#Ñ-€DÜÐN §¡¨9°bÓ!9ÐNÔ=MÐN×TÑTÓVÑ\rÔsò S‰ˆ�Ø�X‰X”f˜V“nÓ%ˆØˆvˆh�aˆ=˜CÑ¢B¨Q¨r¨d°!¨9¸Ò+<Ø (ÖR˜Q¨a°3ªh¸!¿,¹,ÀsÈSÁyÕ:Q’qÒRÑR‰FðSð €DØ$&€GØ˜F‘m×)Ñ)Ó+ò =‰
ˆˆdØ”uÑØØ˜8‘n×*Ñ*Ó,ò 
	=‰FˆC�Ø˜‘|ò 	=�Ø˜˜q   Q s eÐ,�Ø—?‘?¤;Ô/°D¸IÒ4EÈdÏoÉoÔ^lÔNmØÜ˜sŸ{™{¨3°Ó4Ó5�Øœ)Ñ#©5ØÜDGÈÃJÐQRÂN�s˜SŸ[™[¨¨cÓ2Ñ2°SÑ8¸SÑ@ÐX]Ð^_ÑX`ÐdiÐXi�ÚØ×&Ñ& s¨BÓ/×6Ñ6°tÕ<ñ	=ñ
	=ð=ð #Ÿ=™=›?ò <‰ˆ�%à�
‰
ó  Kˆ
ô  	LÜÓ* EÔ*Ô*ØØ�Q‰xˆØ˜8Ñ#‰¨×5Ñ5°dÕ;ð<ñ ”#—*‘*˜TšZ RÔ(Ø¤§¡Ó!2×S™˜˜A°a¸5²jÀQÈ(Â]’1ÓSÑSˆÜ�‹K€EÜŸ™›ò <‰ˆˆWÜ�9‰9�S˜$¤§¡Õ%Ø 'Ö;˜Q¨Q°(ª]’qÒ;Ñ;‰Fð<ô ”—‘˜vÓ&Ó'€Eõ D€DØ�Q€J€Cˆõ8ð ò ˆÜ�x ‘}¨$Ô/ˆØÐF˜SŸ^™^¨JÔ7™¼YÐGò 	ˆAÙ˜•7Ùñ	ðò K€EÜ�eÓ!WÔXò ˆØ�>‰>˜*Õ%¨#°ª,Ü˜H S™M¨tÔ4°QÔ7HÐIò �Ù�Q•ñðð ””T—]‘]Ñ"5¨fÔ"5Ó5Ó6¼¼sÀ4»yÓ8IÐIÐIùòAIùò Sùó4 Tùò <s6   Á8S
Â
4S
ÆSÆ-SÍ	SÍSÍSÎ5	SÎ?Sc                óŠ   — 	 t        j                  | dz  |d   z  j                  «       «      S # t        t        f$ r i cY S w xY w)Nr¦   r½   )r©   rª   r«   r¬   r­   )r®   rA   s     r7   Ú_cardr    sE   € ðÜ�z‰z˜4 &™=¨1¨V©9Ñ4×?Ñ?ÓAÓBÐBøÜ”ZÐ ò ØŠ	ðús   ‚+. ®AÁAc                ó@  — g dt        j                  dt        j                  «       «      g dœ}}t        j                  «       }t        j                  |d¬«      5 }|D �]?  }| dz  |d   › d�z  j                  «       }t        j                  |«      j                  «       |d   k7  rt        d	|d
   › �«      ‚t        j                  d|d   dd › d�«      }t        |«      |_        d|_        |j!                  |t        j                  |«      «       |j#                  d«      r±| dz  |d   › d�z  j                  «       }	t        j                  |	«      j                  «       |d   k7  rt        d|d
   › �«      ‚t        j                  d|d   dd › d�«      }t        |	«      |_        d|_        |j!                  |t        j                  |	«      «       t%        | |«      }
|
j#                  d«      xs i }|j'                  |d
   |d   |d
   j)                  d«      d   |d   d|d   dd › d�|d   |d   |d   |j#                  d«      xs i j+                  «       D ��ci c]  \  }}|dv sŒ||“Œ c}}|j#                  d«      xs i j#                  d«      xs g |
j#                  d«      xs g |
j#                  d«      xs i j#                  d«      |
j#                  d«      xs i j#                  d «      |d!   d"œ|
j#                  d#«      xs i j#                  d$«      r|
d#   |
j#                  d%«      xs i d&œni ¥|j#                  d«      rd'd|d   dd › d�ini ¥«       |d(   j'                  |d
   |d   |d   d)œ|j#                  d«      rd|d   ini ¥«       �ŒB t-        d*„ |D «       «      }t-        d+„ |D «       «      }|d,f|d-ffD ]£  \  }}|sŒ	t/        | d.z  d/z  d0z  |z  j1                  «       «      D ]s  }|j                  «       }t        j                  d1|› d|j2                  › �«      }t        |«      |_        d|_        |j!                  |t        j                  |«      «       Œu Œ¥ t5        j6                  |d2¬3«      j9                  «       }d4t        j                  |«      j                  «       z   |d5<   t5        j6                  ||d5   ||d6œd2¬3«      j9                  «       }d7|fd8|ffD ]V  \  }}t        j                  |«      }t        |«      |_        d|_        |j!                  |t        j                  |«      «       ŒX 	 ddd«       t        j                  «       }t        j                  |d¬«      5 }t/        | d.z  d/z  d9z  j1                  «       «      D ]0  }|j;                  «       sŒ|j=                  ||j2                  ¬:«       Œ2 	 ddd«       |j?                  «       |j?                  «       |fS c c}}w # 1 sw Y   ŒºxY w# 1 sw Y   Œ<xY w);zp(code tar.gz, files tar.gz, lock). Files: library/manifest.json, library/assets.lock.json, library/models/*.glb.zforge-assetsz%Y-%m-%dT%H:%M:%SZ)ÚlibraryÚbuiltrÑ   zw:gz)ÚfileobjÚmodeÚblobsÚglbz.glbzblob hash mismatch for rÀ   zlibrary/models/Né   r   r}   zdamage blob hash mismatch for ÚboundsÚnamerÁ   Úsummaryzmodels/ÚreleaseÚsizeÚscaleÚ	footprint)ÚminXÚmaxXÚminZÚmaxZÚcolliderr  ÚsocketsÚ	placementÚroleÚnotesÚtris)rÀ   r!  Úclassr"  Úfiler#  r$  r%  r&  r+  r,  r.  r/  r0  ÚpaintÚmaterialÚnodes)r3  r5  ÚdamagerÑ   )rÀ   r#  r  c              3  ó>   K  — | ]  }|j                  d «      –— Œ y­w)Úktx2Nr   ©rh   rA   s     r7   rj   zbuild_pack.<locals>.<genexpr>)  s   è ø€ Ò0 Q�1—5‘5˜—=Ñ0ùó   ‚c              3  óD   K  — | ]  }|j                  d «      dk(  –— Œ y­w)ÚcodecÚdracoNr   r9  s     r7   rj   zbuild_pack.<locals>.<genexpr>*  s   è ø€ Ò=°!�A—E‘E˜'“N gÕ-Ñ=ùs   ‚ Úbasisr=  r¦   ÚomgÚpubliczlibrary/rs   )Úindentzsha256:Úhash)rÑ   Úlockr8  r=  zlibrary/manifest.jsonzlibrary/assets.lock.jsonrÃ   )Úarcname) ÚtimeÚstrftimeÚgmtimeÚioÚBytesIOÚtarfileÚopenÚ
read_bytesÚhashlibÚsha256Ú	hexdigestr­   ÚTarInforv   r$  r¢   Úaddfiler=   r  rŸ   r›   rò   rw   rð   Úiterdirr!  r©   ÚdumpsÚencodeÚis_fileÚaddÚgetvalue)r®   ÚpicksÚrowsrC  ÚfilesÚtfrA   ÚblobÚinfoÚdblobri   ÚbÚkÚvr8  r=  Úneedr!  rß   r£   Ú
lock_bytesÚmanÚcodes                          r7   Ú
build_packrf    s3  € à ¼$¿-¹-ÐH\Ô^b×^iÑ^iÓ^kÓ:lÐxzÑ{ˆ$€DÜ�J‰J‹L€EÜ	�‰˜e¨&Ô	1ð &/°RØó 	aˆAØ˜7‘N¨¨%© z°Ð%6Ñ6×BÑBÓDˆDÜ�~‰~˜dÓ#×-Ñ-Ó/°1°U±8Ò;Ü Ð#:¸1¸T¹7¸)Ð!DÓEÐEÜ—?‘? _°Q°u±X¸c¸r°]°OÀ4Ð#HÓIˆDÔWZÐ[_ÓW`È4Ì9ÐopÐbfÔblØ�J‰J�tœRŸZ™Z¨Ó-Ô.Ø�u‰u�\Ô"Ø ™¨Q¨|©_Ð,=¸TÐ*BÑB×NÑNÓP�Ü—>‘> %Ó(×2Ñ2Ó4¸¸,¹ÒGÜ$Ð'EÀaÈÁgÀYÐ%OÓPÐPÜ—‘¨¸¸<¹ÈÈ"Ð9MÐ8NÈdÐ'SÓT�ÔbeÐfkÓblÐVZÔV_Ð{|ÐnrÔnxØ—
‘
˜4¤§¡¨EÓ!2Ô3Ü�d˜A“ˆAØ—‘�h“Ò% 2ˆAØ�K‰K˜q ™w°°&±	ÀAÀdÁGÇMÁMÐRUÓDVÐWXÑDYÐfgÐhqÑfrØ#*¨1¨U©8°C°R¨=¨/¸Ð!>È1ÈYÉ<ÐabÐciÑajÐuvÐw~ÑuØ9:¿¹¸{Ó9KÒ9QÈr×8XÑ8XÓ8Z÷  'E±°°1Ð^_ð  dDò  _D q¨!¡tó  'EØ&'§e¡e¨JÓ&7Ò&=¸2×%BÑ%BÀ7Ó%KÒ%QÈrÐ^_×^cÑ^cÐdmÓ^nÒ^tÐrtØ"#§%¡%¨Ó"4Ò":¸×!?Ñ!?ÀÓ!GÐST×SXÑSXÐYdÓSeÒSkÐik×RpÑRpÐqxÓRyØ!" 6¡ñnð VW×UZÑUZÐ[bÓUcÒUiÐgi×TnÑTnÐoyÔTz a¨¡j¸1¿5¹5À»>Ò;OÈRÒPð  ACðnð QR×PUÑPUÐVbÔPc˜X¨°°<±ÀÀ"Ð1EÐ0FÀdÐ'KÑLÐikðnô oð �‰N×!Ñ!¨¨4©¸Q¸y¹\ÐRSÐTYÑRZñ  #`ð  CD÷  CHñ  CHð  IUô  CVÐ`lÐnoÐp|Ñn}Ñ_~ð  \^ð  #`ö  að/	aô2 Ñ0¨%Ô0Ó0ˆÜÑ=°uÔ=Ó=ˆØ  '˜?¨U°GÐ,<Ð=ò 	7‰JˆD�$ÚÜ ¨¡°Ñ!6¸Ñ!AÀDÑ!H× QÑ QÓ SÓTò 7�AØŸ<™<›>�D´'·/±/ÀHÈTÈFÐRSÐTU×TZÑTZÐS[ÐB\Ó2]¨4ÔknÐosÓktÐ_cÔ_hð  DEÐvzô  wAØ—J‘J˜t¤R§Z¡Z°Ó%5Õ6ñ7ð	7ô
 —Z‘Z ¨QÔ/×6Ñ6Ó8ˆ
Ø ¤7§>¡>°*Ó#=×#GÑ#GÓ#IÑIˆˆV‰Ü�j‰j D°$°v±,ÈÐW\Ñ]ÐfgÔh×oÑoÓqˆØ3°SÐ9Ð<VÐXbÐ;cÐdò 	/‰JˆD�$Ü—?‘? 4Ó(ˆD´c¸$³i¨$¬)ÈaÀÄØ�J‰J�tœRŸZ™Z¨Ó-Õ.ñ	/÷I&/ôN �:‰:‹<€DÜ	�‰˜d¨Ô	0ð *°BÜ˜ ™¨Ñ.°Ñ6×?Ñ?ÓAÓBò 	*ˆAØ�y‰y�{Ø—‘�q !§&¡&�Õ)ñ	*÷*ð �=‰=‹?˜EŸN™NÓ,¨dÐ2Ð2ùó7 'E÷#&/ð &/ú÷P*ð *ús?   ÁHXÉXÉ,XÉ1E#XÏE9XÖ6XÖ9XØXØXØXc                óÔ   — dj                  d„ |D «       «      }d| z   dz   |z   dz   t        t        |«      «      z   dz   | z   dz   |z   dz   |z   d	z   t        d
„ |D «       «      rdz   S dz   S )Nz; c              3  ót   K  — | ]0  }|d    › d|d   › d|d   d   d›d|d   d   d›d|d   d	   d›d
�
–— Œ2 y­w)rÀ   z (r!  z, r$  r  z.1fz x ÚlÚhz m)Nrl   r9  s     r7   rj   z#library_contract.<locals>.<genexpr>?  si   è ø€ ò  IÐ}~˜1˜T™7˜) 2 a¨¡i [°°1°V±9¸S±>À#Ð2FÀcÈ!ÈFÉ)ÐTWÉ.ÐY\ÐI]Ð]`ÐabÐciÑajÐknÑaoÐpsÐ`tÐtwÔxñ  Iùs   ‚68z6 SCENE MODELS COME FROM OUR ASSET LIBRARY. Attachment zl is the library loader (JavaScript ES module with TypeScript types, three.js, a gzipped tar) and attachment z holds zƒ models picked for this game with their cards (a gzipped tar). First run: `mkdir -p src/lib/library && tar -xzf .forge/attachments/z>/original.* -C src/lib/library && tar -xzf .forge/attachments/zU/original.* -C public`, then read `src/lib/library/LIBRARY.md` (laws L1-L8). Models: a¾  . Place each with `lib.place(id, { x, z, yaw, scene })` from `createLibrary(THREE, { renderer })` (`@/lib/library/index.mjs`, pass your WebGLRenderer), after `await lib.preload()`. They are true metres, origin on the ground, front +Z: never rescale them; lay the scene out from each card's size and footprint and use its colliders. Never draw one of these objects from boxes when the library has it. Do not edit src/lib/library or public/library.c              3  ó>   K  — | ]  }|j                  d «      –— Œ y­w)r}   Nr   r9  s     r7   rj   z#library_contract.<locals>.<genexpr>N  s   è ø€ Ò5¨!�!—%‘%˜×%Ñ5ùr:  a¾   Tanks whose manifest row has `damage` are DESTRUCTIBLE: for each placed tank `const d = await lib.damage(object)`, then show every hit ON the tank: `d.hit(side)` or `d.hit({ point })` (hit marks, dented then lost panels), `d.track('left' | 'right')` (thrown track: it stops), `d.gun()` (gun knocked out), `d.wreck({ turretOff: true })` when destroyed (burnt wreck, turret blown off; add fire and smoke), `d.repair()` on respawn (LIBRARY.md L11).r1   )rï   Ústrrv   rw   )Úcode_idÚfiles_idrX  Úlistings       r7   Úlibrary_contractrp  >  sã   € Ø�i‰iñ  Ið  CHô  Ió  I€Gà@À7ÑJð NJñ 	JØLTñ	UØW`ñ	aÜcfÔgjÐkpÓgqÓcrñ	sðvñ	ð !(ñ	(ð +kñ	kð nvñ	vð 	`ñ		`ð cjñ		jðmMñ		Mô Ñ5¨uÔ5Ô5ð	{ñ	?ðð <>ñ	?ðr9   zS The Art Direction names which library models (by id) dress each place of the game.r1   c                ó  — t        | «      syt        |«      }|syt        |t        | |«      «      \  }}}|sy	 t	        ||«      \  }}	}
d|dz   › �d|dz   › �}}t        d|«      dddd	œt        d|	«      d
t        |«      › d�dd	œg}t        |«      t        d„ |D «       «      t        d„ |D «       «      |
d   |dd |dd |j                  d«      |D �cg c]  }|d   ‘Œ	 c}dœ}|t        |||«      |fS # t
        t        f$ r Y yw xY wc c}w )zo(attachments, contract, meta) or None. first_index = attachments already in the brief (att1, att2... in order).NÚattrs   r   zapplication/gzipzlibrary-kit.tar.gzz+Asset library loader (JavaScript, three.js)z2code to extract into src/lib/library and use as is)ÚurlÚfilenameÚaltr.  zlibrary-models.tar.gzz  library models with cards (GLB)z.models to extract into public (public/library)c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wre   )r€   r9  s     r7   rj   z&library_attachments.<locals>.<genexpr>j  s   è ø€ Ò-H¸Q¬g°a¯jÑ-Hùs   ‚c              3  óD   K  — | ]  }|j                  d «      sŒd–— Œ y­w)r}   rs   Nr   r9  s     r7   rj   z&library_attachments.<locals>.<genexpr>j  s1   è ø€ ò  ^GÐdeÐrs×rwÑrwð  yEõ  sFÔ^_ñ  ^Gùs   ‚ ™ rB  é(   r  r#  )Úcountr|   ÚdestructiblerC  rÙ   r  r@   Úreleases)r¾   r±   r  r   rf  r¬   r­   r   rv   Úsumr=   rp  )r½   Úfirst_indexÚpromptr®   r@   rX  rÙ   r  re  rZ  rC  rm  rn  ÚattsrA   Úmetas                   r7   Úlibrary_attachmentsr�  U  sŠ  € ä˜ÔØÜ�tÓ€EÙØÜ ¤z°$¸Ó'?Ó@Ñ€Eˆ7�DÙØðÜ& t¨UÓ3Ñˆˆe�Tð ˜k¨A™oÐ.Ð/°3°{ÀQ±Ð6GÐ1HˆX€GäÐ,¨dÓ3ÐAUð  _LØEñ	GäÐ,¨eÓ4ÐBYÜ�u“:�,Ð>Ð?ÐIyñ	{ð€Dô ˜“Z¬#Ñ-HÀ%Ô-HÓ*HÔZ]ñ  ^GÐinô  ^Gó  [Gð  QUð  V\ñ  Q]ð  jqð  ruð  suð  jvØ˜˜"�I¨¯	©	°'Ó(:Ð_dÖHeÐZ[ÈÈ9ËÒHeñg€DàÔ! '¨8°UÓ;¸TÐAÐAøô ”ZÐ ò Ùðüò Ifs   ¹C4 ÃD	Ã4DÄD)r6   rl  Úreturnrl  )rA   rú   rB   rl  r‚  Úint)rA   rú   rm   rì   r6   rl  r‚  rƒ  )rA   rú   r‚  rƒ  )r6   rl  r‚  z	list[str])r®   r   r‚  zdict | None)r½   r   r‚  Úbool)T)rA   rú   r,   r„  r‚  r„  )r@   rú   r6   rl  r‚  z'tuple[list[dict], list[str], list[str]])r®   r   rA   rú   r‚  rú   )r®   r   rX  ú
list[dict]r‚  ztuple[bytes, bytes, dict])rm  rl  rn  rl  rX  r…  r‚  rl  )
r½   r   r}  rƒ  r~  rl  r®   r   r‚  z#tuple[list[dict], str, dict] | None)>Ú__doc__Ú
__future__r   rM  rH  r©   rq   rJ  rE  Úpathlibr   Útypingr   Ú"forge_corp.api.routes.games_garager   Ú forge_corp.api.routes.games_roomr   ÚLIBrË   rÌ   rÊ   Úcompilerr   rí   rå   ræ   rü   rý   rô   r2   r4   r5   r?   r8   rE   ru   ÚWESTrp   rx   rz   r€   rö   r÷   rñ   Úpatternrø   rÞ   rì   r›   r�   r¡   r¤   Ú__annotations__r±   r¾   rÎ   r  r  rf  rp  ÚLIBRARY_ART_LINEr�  rl   r9   r7   ú<module>r’     s’  ðòõ #ã Û 	Û Û 	Û Û Ý Ý å 9Ý 6á
ÐÓ€ð 	0€Ø!€ðW€ð ˆR�Z‰Zð |Ø}÷  ~Bñ  ~BóC€
à#3Ñ  €
ˆI�yØÐ òG€	ð
 €b‡j�jð 9Ø:<¿$¹$ó@€ð
 €b‡j�jð "Ø#%§4¡4ó)€àˆ2�:‰:ÐVÐXZ×X\ÑX\Ó]€Ú:ÒGjÚ7Ò@cñe€	óLótòA€àN€ØCÀdÑJÐSpÐswÑSwØOÐ[gØ2°TÑ9ÀYÐYrØ$¨zÈ*ñ
V€ð ˆ"�*‰*ÐuÐwy×w{Ñw{Ó
|€óJóSð €b‡j�jð kØln×lpÑlpór€à1Ð;WÐcØ3Ð@^ð  hFØ5ÐBcð  pMñN€	ðs�MÐ#?ð sÀÐRnð sÐp{ð  ~Zð sØ Ð">ðsØ@KÐMiðsØkzð  }YðsàÐ:ðsà<DÐFbðsàdqð  tQðsð !Ð"?ðsð BRÐSpðsð "Ð#Að	sð DQÐRpð	sð sAð  Cað	sð
 $Ð%Cðsð
 FPÐQoðsð
 r|ð  ~\ðsð *KÐWxØ(BÐWqòsÐ ð vò	2ð ;ò	sàOò	tà@Ú^ðò	Fð ‡K�Kò	Lð+
€ò0F€ñ Ðl×rÑrÓtÓu€ó
ð $(°Ñ6€ˆÓ 6ð  ô 	óKô;óGJóTó03ófð( iÐ ð DFÐTWõ Br9   