§
    ?ÖÀjÒQ  ã                  ó´   — d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
mZ ddlmZmZmZmZmZmZ ddlmZmZ  G d„ d¦  «        Z	 dd d„Z	 d!d"d„Zd#d„ZdS )$z›
FreeExile Procedural Map & Anti-Bot Dynamic Obstacle Generation Engine.
Implements scalable organic layouts, isolated Boss Arena, and anti-bot obstacles.
é    )ÚannotationsN)ÚListÚTupleÚDictÚOptionalÚSet)ÚTileTypeÚObstacleTypeÚTileCellÚObstacleInstanceÚMapRoomÚMapGridData)Úget_biome_definitionÚMapBiomeDefinitionc                  ó0  — e Zd ZU dZ	 dQdRd„Ze	 	 	 	 dSdTd„¦   «         ZdUdVd„ZdWd„ZdXd!„Z	dYd&„Z
dZd(„Z	 d[d\d.„Zd]d/„Zd^d0„ZdZd1„Zd_d3„Zd`d9„Z	 dadbd>„ZdcdD„ZdddF„Zi ZdGedH<   ededI„¦   «         ZedfdJ„¦   «         ZedgdhdO„¦   «         Ze	 d[didP„¦   «         ZdS )jÚProceduralMapEnginez@High-performance procedural dungeon & anti-bot maze synthesizer.é0   é   NÚwidthÚintÚheightÚmin_room_sizeÚ	max_roomsúOptional[int]c                óˆ   — || _         || _        || _        |�|n"t          dt	          ||z  dz  ¦  «        ¦  «        | _        d S )Né   i  )r   r   r   Úmaxr   r   )Úselfr   r   r   r   s        ú;C:\Projects\FreeExile\server\world\procedural_map_engine.pyÚ__init__zProceduralMapEngine.__init__   sK   € ð ˆŒ
ØˆŒØ*ˆÔØ&/Ð&;˜˜ÅÀQÍÈUÐU[É^Ð_bÑLbÑHcÔHcÑAdÔAdˆŒˆˆó    é   ÚlevelÚact_idúOptional[str]Úmap_tierÚzone_idÚreturnc                óh   — ddl m}  |||||¬¦  «        } | |j        |j        d|j        ¬¦  «        S )Nr   )Úcalculate_map_scale_profile)r#   r$   r&   r'   r   )r   r   r   r   )Ú#server.world.map_progression_scalerr*   Ú
grid_widthÚgrid_heightr   )Úclsr#   r$   r&   r'   r*   Úprofiles          r   Úfor_progressionz#ProceduralMapEngine.for_progression!   s`   € ð 	TÐSÐSÐSÐSÐSØ-Ð-°EÀ&ÐS[ÐelÐmÑmÔmˆØˆsØÔ$ØÔ&ØØÔ'ð	
ñ 
ô 
ð 	
r!   ÚBLEACHED_BONE_CANYONÚseedÚbiome_idÚstrr   c                ó`  ‡ ‡‡— t          j        |¦  «        }t          |¦  «        }ˆ fd„t          ‰ j        ¦  «        D ¦   «         }‰                      |¦  «        }|d         Št          |dd …         ˆfd„¬¦  «        Šˆfd„|D ¦   «         }‰                      ‰|¦  «        }‰                      ||¦  «         ‰  	                    ||¦  «         ‰  
                    |||¦  «         ‰                      |||¦  «        }	‰                      ||||¦  «        }
‰                      ||¦  «         ‰                      ||||	||¦  «        }t          |j        |j        |j        |j        |j        dd|	|j        ¬	¦	  «	        }t-          ‰ j        ‰ j        ||||||gz   ‰j        |j        |
||	d
¬¦  «        S )Nc                óR   •‡— g | ]"Šˆfd „t          ‰j        ¦  «        D ¦   «         ‘Œ#S )c           	     óL   •— g | ] }t          |‰t          j        d d¬¦  «        ‘Œ!S )FT)ÚxÚyÚ	tile_typeÚwalkableÚblocks_vision)r   r	   ÚWALL)Ú.0r8   r9   s     €r   ú
<listcomp>z?ProceduralMapEngine.generate_map.<locals>.<listcomp>.<listcomp>7   s0   ø€ ÐxÐxÐxÐab�X˜˜Q­(¬-À%ÐW[Ð\Ñ\Ô\ÐxÐxÐxr!   )Úranger   )r>   r9   r   s    @€r   r?   z4ProceduralMapEngine.generate_map.<locals>.<listcomp>6   sL   øø€ ð 
ð 
ð 
àð yÐxÐxÐxÕfkÐlpÔlvÑfwÔfwÐxÑxÔxð
ð 
ð 
r!   r   r"   c                ó’   •— t          j        | j        d         ‰j        d         z
  | j        d         ‰j        d         z
  ¦  «        S ©Nr   r"   ©ÚmathÚhypotÚcenter)ÚrÚ
spawn_rooms    €r   ú<lambda>z2ProceduralMapEngine.generate_map.<locals>.<lambda>?   s<   ø€ �$œ* Q¤X¨a¤[°:Ô3DÀQÔ3GÑ%GÈÌÐRSÌÐWaÔWhÐijÔWkÑIkÑlÔl€ r!   ©Úkeyc                ó4   •— g | ]}|j         ‰j         k    ¯|‘ŒS © )Úroom_id)r>   rG   Ú	boss_cands     €r   r?   z4ProceduralMapEngine.generate_map.<locals>.<listcomp>A   s(   ø€ ÐKÐKÐK˜a¨A¬I¸Ô9JÒ,JÐ,J˜Ð,JÐ,JÐ,Jr!   ÚbossT)	rN   r8   r9   ÚwÚhÚ	room_typeÚis_boss_roomÚboss_gate_posÚboss_altar_posF)r   r   r2   ÚbiomeÚtilesÚ	obstaclesÚroomsÚspawn_pointÚ
boss_pointÚdead_end_pointsÚ	boss_roomÚ	boss_gateÚboss_gate_breached)ÚrandomÚRandomr   r@   r   Ú_generate_roomsr   Ú_build_grand_boss_roomÚ_carve_roomsÚ_carve_boss_room_interiorÚ_connect_normal_roomsÚ_connect_and_gate_boss_roomÚ_carve_dead_endsÚ_embellish_boss_arenaÚ_inject_anti_bot_obstaclesr   rN   r8   r9   rQ   rR   rF   r   r   )r   r2   r3   ÚrngrW   rX   rZ   Únormal_roomsr^   Úboss_gate_coordÚ	dead_endsrY   rO   rH   s   `           @@r   Úgenerate_mapz ProceduralMapEngine.generate_map2   s  øøø€ ÝŒm˜DÑ!Ô!ˆÝ$ XÑ.Ô.ˆð
ð 
ð 
ð 
å˜4œ;Ñ'Ô'ð
ñ 
ô 
ˆð
 ×$Ò$ SÑ)Ô)ˆØ˜1”Xˆ
ÝØ�!�"�"ŒIØlÐlÐlÐlð
ñ 
ô 
ˆ	ð LÐKÐKÐK 5ÐKÑKÔKˆØ×/Ò/°	¸<ÑHÔHˆ	à×Ò˜% Ñ.Ô.Ð.Ø×&Ò& u¨iÑ8Ô8Ð8Ø×"Ò" 5¨,¸	ÑBÔBÐBØ×:Ò:¸5À,ÐPYÑZÔZˆØ×)Ò)¨%°¸sÀIÑNÔNˆ	Ø×"Ò" 5¨)Ñ4Ô4Ð4Ø×3Ò3°E¸<ÈÐTcÐehÐjoÑpÔpˆ	åØÔ%ØŒkØŒkØŒkØŒkØØØ)Ø$Ô+ð

ñ 

ô 

ˆ	õ Ø”*Ø”;ØØØØØ ) Ñ,Ø"Ô)Ø Ô'Ø%ØØ%Ø$ð
ñ 
ô 
ð 	
r!   rl   úrandom.RandomúList[MapRoom]c                óB  ‡
— g }t          | j        t          d| j        dz  ¦  «        ¦  «        }d}| j        dk    rdnd}t          |¦  «        | j        k     rþ|| j        |z  k     rð|dz  }|                     ||dz   ¦  «        |                     ||dz   ¦  «        }}|                     d	| j        |z
  dz
  ¦  «        |                     d	| j        |z
  dz
  ¦  «        }	}t          t          |¦  «        ||	||¬
¦  «        Š
t          ˆ
fd„|D ¦   «         ¦  «        s| 
                    ‰
¦  «         t          |¦  «        | j        k     r|| j        |z  k     °ðt          |¦  «        d	k     r6t          ddddd¦  «        t          d| j        dz
  | j        dz
  dd¦  «        g}|S )Né   é   r   é   é-   é   r"   é   é   )rN   r8   r9   rQ   rR   c              3  óF   •K  — | ]}‰                      |d ¬¦  «        V — ŒdS )rz   ©ÚpaddingN©Ú
intersects)r>   rG   Únew_rooms     €r   ú	<genexpr>z6ProceduralMapEngine._generate_rooms.<locals>.<genexpr>r   s6   øè è € ÐHÐH¸Q�x×*Ò*¨1°aÐ*Ñ8Ô8ÐHÐHÐHÐHÐHÐHr!   r   é
   )Úminr   r   r   r   ÚlenÚrandintr   r   ÚanyÚappend)r   rl   rZ   Úeff_minÚattemptsÚ
multiplierrQ   rR   r8   r9   r€   s             @r   rc   z#ProceduralMapEngine._generate_roomsh   s§  ø€ Ø!ˆÝ�dÔ(­#¨a°´¸q±Ñ*AÔ*AÑBÔBˆØˆØœ>¨RÒ/Ð/�R�R°Rˆ
Ý�%‰jŒj˜4œ>Ò)Ð)¨h¸¼È*Ñ9TÒ.TÐ.TØ˜‰MˆHØ—;’;˜w¨°!©Ñ4Ô4°c·k²kÀ'È7ÐUVÉ;Ñ6WÔ6WˆqˆAØ—;’;˜q $¤*¨q¡.°1Ñ"4Ñ5Ô5°s·{²{À1ÀdÄkÐTUÁoÐXYÑFYÑ7ZÔ7ZˆqˆAÝ¥s¨5¡z¤z°Q¸!¸qÀAÐFÑFÔFˆHÝÐHÐHÐHÐHÀ%ÐHÑHÔHÑHÔHð 'Ø—’˜XÑ&Ô&Ð&õ �%‰jŒj˜4œ>Ò)Ð)¨h¸¼È*Ñ9TÒ.TÐ.Tõ ˆu‰:Œ:˜Š>ˆ>Ý˜Q  1 a¨Ñ+Ô+­W°Q¸¼
ÀR¹ÈÌÐWYÑIYÐ[\Ð^_Ñ-`Ô-`ÐaˆEØˆr!   Úcandr   rm   c           	     óœ  ‡	— t          | j        t          d| j        dz  ¦  «        ¦  «        }t          | j        dz
  t          |j        |dz   ¦  «        ¦  «        }t          | j        dz
  |¦  «        t          | j        dz
  |¦  «        }}t          dt          | j        |z
  dz
  |j        ¦  «        ¦  «        }t          dt          | j        |z
  dz
  |j        ¦  «        ¦  «        }t          |j	        ||||dd¬¦  «        Š	t          ˆ	fd„|D ¦   «         ¦  «        r/t          |j	        |j        |j        |j        |j        dd¬¦  «        S ‰	S )	Nrt   ru   r   rz   rP   T)rS   rT   c              3  óF   •K  — | ]}‰                      |d ¬¦  «        V — ŒdS )r"   r|   Nr~   )r>   rG   Úcand_brs     €r   r�   z=ProceduralMapEngine._build_grand_boss_room.<locals>.<genexpr>   s6   øè è € ÐFÐF°Aˆw×!Ò! !¨QÐ!Ñ/Ô/ÐFÐFÐFÐFÐFÐFr!   )rƒ   r   r   r   rQ   r   r8   r9   r   rN   r†   rR   )
r   r‹   rm   rˆ   Útarget_sizeÚbwÚbhÚbxÚbyrŽ   s
            @r   rd   z*ProceduralMapEngine._build_grand_boss_roomx   s3  ø€ Ý�dÔ(­#¨a°´¸q±Ñ*AÔ*AÑBÔBˆÝ˜$œ* q™.­#¨d¬f°gÀ±kÑ*BÔ*BÑCÔCˆÝ�T”Z !‘^ [Ñ1Ô1µ3°t´{ÀQ±ÈÑ3TÔ3TˆBˆÝ�•C˜œ
 R™¨!Ñ+¨T¬VÑ4Ô4Ñ5Ô5ˆÝ�•C˜œ bÑ(¨1Ñ,¨d¬fÑ5Ô5Ñ6Ô6ˆÝ˜$œ,¨¨B°°BÀ&ÐW[Ð\Ñ\Ô\ˆÝÐFÐFÐFÐF¸ÐFÑFÔFÑFÔFð 	nÝ˜4œ<¨¬°´¸¼ÀÄÐSYÐhlÐmÑmÔmÐmØˆr!   rX   úList[List[TileCell]]rZ   ÚNonec                ó   — |D ]z}t          |j        |j        |j        z   ¦  «        D ]U}t          |j        |j        |j        z   ¦  «        D ]0}||         |         }t
          j        ddc|_        |_        |_	        Œ1ŒVŒ{d S )NTF©
r@   r9   rR   r8   rQ   r	   ÚFLOORr:   r;   r<   )r   rX   rZ   rG   ÚryÚrxÚcs          r   re   z ProceduralMapEngine._carve_roomsƒ   s�   € Øð 	[ð 	[ˆAÝ˜AœC ¤ q¤s¡Ñ+Ô+ð [ð [�Ý ¤ Q¤S¨1¬3¡YÑ/Ô/ð [ð [�BØ˜bœ	 "œ�AÝ?G¼~ÈtÐUZÐ<�A”K ¤¨Q¬_¨_ð[ð[ð	[ð 	[r!   r^   c                ó  — t          |j        dz   |j        |j        z   dz
  ¦  «        D ][}t          |j        dz   |j        |j        z   dz
  ¦  «        D ]0}||         |         }t
          j        ddc|_        |_        |_	        Œ1Œ\d S )Nr"   TFr—   )r   rX   r^   r™   rš   r›   s         r   rf   z-ProceduralMapEngine._carve_boss_room_interiorŠ   sš   € Ý˜	œ a™¨¬°y´{Ñ)BÀQÑ)FÑGÔGð 	Wð 	WˆBÝ˜IœK¨!™O¨Y¬[¸9¼;Ñ-FÈÑ-JÑKÔKð Wð W�Ø˜"”I˜b”M�Ý;C¼>È4ÐQVÐ8�”˜QœZ¨¬¨ðWð	Wð 	Wr!   ÚstartúTuple[int, int]ÚendÚforbidden_roomúOptional[MapRoom]c                ó   — d|fg}|d i}|di}d}|�rt          j        |¦  «        \  }	}
|
|k    rd}nò|
\  }}dD ]ç\  }}||z   ||z   }}d|cxk    r| j        dz
  k     rÃn Œ'd|cxk    r| j        dz
  k     r«n Œ?|r|                     ||¦  «        rŒX||
         ||         |         j        rdndz   }||f|vs||||f         k     r[||||f<   t          |d         |z
  ¦  «        t          |d         |z
  ¦  «        z   }t          j        |||z   ||ff¦  «         |
|||f<   Œè|�°|�r$|}|��!t          j	        ddc||d                  |d                  _
        ||d                  |d                  _        ||d                  |d                  _        d	D ]§\  }}|d         |z   |d         |z   }}d|cxk    r| j        dz
  k     rwn Œ3d|cxk    r| j        dz
  k     r_n ŒK|r|                     ||¦  «        sDt          j	        ddc||         |         _
        ||         |         _        ||         |         _        Œ¨||         }|�­d S d S d S )
Nç        FT©©r   r"   ©r   éÿÿÿÿ©r"   r   ©r§   r   r"   ç      ð?g      @r   )r¨   r¥   )ÚheapqÚheappopr   r   Úcontainsr;   ÚabsÚheappushr	   r˜   r:   r<   )r   rX   r�   rŸ   r    ÚfrontierÚ	came_fromÚcost_so_farÚreachedÚ_ÚcurrentÚcxÚcyÚdxÚdyÚnxÚnyÚnew_costrR   ÚcurrÚwxÚwys                         r   Ú_carve_corridor_pathz(ProceduralMapEngine._carve_corridor_path�   s'  € ð ˜%�L�>ˆØ˜D�Mˆ	Ø˜c�lˆØˆàñ 	6Ýœ xÑ0Ô0‰JˆAˆwØ˜#Š~ˆ~Ø�ØØ‰FˆB�Ø<ð 
6ð 
6‘��BØ˜b™ " r¡'�B�Ø˜Ð+Ð+Ò+Ð+˜TœZ¨!™^Ò+Ð+Ð+Ð+Ð+°°RÐ0IÐ0IÒ0IÐ0I¸$¼+È¹/Ò0IÐ0IÐ0IÐ0IÐ0IØ%ð !¨.×*AÒ*AÀ"ÀbÑ*IÔ*Ið !Ø Ø*¨7Ô3¸eÀB¼iÈ¼mÔ>TÐ7]°s°sÐZ]Ñ^�HØ˜B�x {Ð2Ð2°hÀÈbÐRTÈXÔAVÒ6VÐ6VØ08˜ R¨ HÑ-Ý  A¤¨¡Ñ,Ô,­s°3°q´6¸B±;Ñ/?Ô/?Ñ?˜Ýœ x°(¸Q±,ÀÀRÀÐ1IÑJÔJÐJØ.5˜	 2 r (Ñ+øð! ñ 	6ð$ ñ 		'ØˆDØÑ"õ ~Fô  ~Lð  NRð  TYÐz��d˜1”g”˜t AœwÔ'Ô1°5¸¸a¼´>À$ÀqÄ'Ô3JÔ3SÐUZÐ[_Ð`aÔ[bÔUcÐdhÐijÔdkÔUlÔUzØ.ð Gð G‘F�B˜Ø! !œW r™\¨4°¬7°R©<˜�BØ˜BÐ/Ð/Ò/Ð/ ¤¨a¡Ò/Ð/Ð/Ð/Ð/°A¸Ð4MÐ4MÒ4MÐ4M¸d¼kÈA¹oÒ4MÐ4MÐ4MÐ4MÐ4MØ .ð G°>×3JÒ3JÈ2ÈrÑ3RÔ3Rð GÝksÔkyÐ{ð  BGÐh˜E "œI bœMÔ3°U¸2´Y¸r´]Ô5KÈUÐSUÌYÐWYÌ]ÔMhøØ  ”�ð Ñ"Ð"Ð"ð		'ð 		'à"Ð"r!   c                ó  ‡— |d         gŠt          |dd …         ¦  «        }|r@t          |ˆfd„¬¦  «        }‰                     |¦  «         |                     |¦  «         |°@t	          t          ‰¦  «        dz
  ¦  «        D ]4}|                      |‰|         j        ‰|dz            j        |¬¦  «         Œ5t          ‰¦  «        dk    rA|                      |‰d         j        ‰t          ‰¦  «        dz           j        |¬¦  «         d S d S )Nr   r"   c                óª   •— t          j        | j        d         ‰d         j        d         z
  | j        d         ‰d         j        d         z
  ¦  «        S )Nr   r§   r"   rC   )rG   Úchains    €r   rI   z;ProceduralMapEngine._connect_normal_rooms.<locals>.<lambda>»   sJ   ø€ ­t¬z¸!¼(À1¼+ÈÈbÌ	ÔHXÐYZÔH[Ñ:[Ð]^Ô]eÐfgÔ]hÐkpÐqsÔktÔk{Ð|}Ôk~Ñ]~Ñ/Ô/€ r!   rJ   ©r    rt   rz   )Úsetrƒ   r‡   Úremover@   r„   rÀ   rF   )r   rX   rm   r^   Ú	unvisitedÚnxtÚirÃ   s          @r   rg   z)ProceduralMapEngine._connect_normal_roomsµ   s.  ø€ ð ˜a”Ð!ˆÝ˜ Q R RÔ(Ñ)Ô)ˆ	Øð 	"Ý�iÐ%Ð%Ð%Ð%ð  Añ  Aô  AˆCØ�LŠL˜ÑÔÐØ×Ò˜SÑ!Ô!Ð!ð ð 	"õ
 •s˜5‘z”z A‘~Ñ&Ô&ð 	mð 	mˆAØ×%Ò% e¨U°1¬X¬_¸eÀAÈÁE¼lÔ>QÐbkÐ%ÑlÔlÐlÐlÝˆu‰:Œ:˜Š?ˆ?Ø×%Ò% e¨U°1¬X¬_¸eÅCÈÁJÄJÐRSÁOÔ>TÔ>[ÐluÐ%ÑvÔvÐvÐvÐvð ˆ?r!   c                óZ  ‡— t          |ˆfd„¬¦  «        }|j        d         |j        d         ‰j        d         ‰j        d         f\  }}}}t          ||z
  ¦  «        t          ||z
  ¦  «        k    rX||k     r‰j        n‰j        ‰j        z   dz
  |}
}	||k     rt          d|	dz
  ¦  «        nt          | j        dz
  |	dz   ¦  «        |
f}nW|||k     r‰j        n‰j        ‰j        z   dz
  }
}	|	||k     rt          d|
dz
  ¦  «        nt          | j	        dz
  |
dz   ¦  «        f}|  
                    |||f|‰¬¦  «         t          ‰j        ‰j        ‰j        z   ¦  «        D ]½}t          j        x|‰j                 |         _        |‰j        ‰j        z   dz
           |         _        dx|‰j                 |         _        |‰j        ‰j        z   dz
           |         _        dx|‰j                 |         _        |‰j        ‰j        z   dz
           |         _        Œ¾t          ‰j        ‰j        ‰j        z   ¦  «        D ]½}t          j        x||         ‰j                 _        ||         ‰j        ‰j        z   dz
           _        dx||         ‰j                 _        ||         ‰j        ‰j        z   dz
           _        dx||         ‰j                 _        ||         ‰j        ‰j        z   dz
           _        Œ¾t          j        dc||d                  |d                  _        ||d                  |d                  _        d||d                  |d                  _        t          j        ddc||
         |	         _        ||
         |	         _        ||
         |	         _        |	|
fS )	Nc                ó’   •— t          j        | j        d         ‰j        d         z
  | j        d         ‰j        d         z
  ¦  «        S rB   rC   )rG   r^   s    €r   rI   zAProceduralMapEngine._connect_and_gate_boss_room.<locals>.<lambda>Ç   sV   ø€ µT´ZÀÄÈÄÈiÔN^Ð_`ÔNaÑ@aÐcdÔckÐlmÔcnÐqzô  rBð  CDô  rEñ  dEñ  6Fô  6F€ r!   rJ   r   r"   rz   rÄ   FT)rƒ   rF   r®   r8   rQ   r   r   r9   rR   r   rÀ   r@   r	   r=   r:   r;   r<   r˜   Ú	BOSS_GATE)r   rX   rm   r^   Ú
entry_roomÚecxÚecyÚbcxÚbcyÚgxÚgyÚapproachr8   r9   s      `          r   rh   z/ProceduralMapEngine._connect_and_gate_boss_roomÄ   s—  ø€ õ ˜ð  ,Fð  ,Fð  ,Fð  ,Fð  Gñ  Gô  Gˆ
Ø'Ô.¨qÔ1°:Ô3DÀQÔ3GÈÔIYÐZ[ÔI\Ð^gÔ^nÐopÔ^qÐqÑˆˆS�#�såˆs�S‰y‰>Œ>�S  s¡™^œ^Ò+Ð+Ø%(¨3¢Y Y�i”k�k°I´KÀ)Ä+Ñ4MÐPQÑ4QÐTW�ˆBØ*-°ª)¨)�˜A˜r A™v™œ˜½¸T¼ZÈ!¹^ÈRÐRSÉVÑ9TÔ9TÐVXÐYˆHˆHà¨#°ª)¨)˜9œ;˜;¸¼ÀyÄ{Ñ9RÐUVÑ9V�ˆBØ¨c°Cªi¨i�C  2¨¡6™NœN˜N½SÀÄÈqÁÐRTÐWXÑRXÑ=YÔ=YÐZˆHà×!Ò! %¨#¨s¨°XÈiÐ!ÑXÔXÐXõ �y”{ I¤K°)´+Ñ$=Ñ>Ô>ð 	oð 	oˆAÝbjÔboÐoˆE�)”+Ô˜qÔ!Ô+¨e°I´KÀ)Ä+Ñ4MÐPQÑ4QÔ.RÐSTÔ.UÔ._Ø`eÐeˆE�)”+Ô˜qÔ!Ô*¨U°9´;ÀÄÑ3LÈqÑ3PÔ-QÐRSÔ-TÔ-]ØjnÐnˆE�)”+Ô˜qÔ!Ô/°%¸	¼ÀiÄkÑ8QÐTUÑ8UÔ2VÐWXÔ2YÔ2gÐ2gÝ�y”{ I¤K°)´+Ñ$=Ñ>Ô>ð 	oð 	oˆAÝbjÔboÐoˆE�!ŒH�Y”[Ô!Ô+¨e°A¬h°y´{ÀYÄ[Ñ7PÐSTÑ7TÔ.UÔ._Ø`eÐeˆE�!ŒH�Y”[Ô!Ô*¨U°1¬X°i´kÀIÄKÑ6OÐRSÑ6SÔ-TÔ-]ØjnÐnˆE�!ŒH�Y”[Ô!Ô/°%¸´(¸9¼;ÈÌÑ;TÐWXÑ;XÔ2YÔ2gÐ2gå^fÔ^lÐnrÐ[ˆˆh�qŒkÔ˜8 Aœ;Ô'Ô1°5¸À!¼Ô3EÀhÈqÄkÔ3RÔ3[Ø8=ˆˆh�qŒkÔ˜8 Aœ;Ô'Ô5ÝW_ÔWiÐkoÐquÐTˆˆbŒ	�"ŒÔ  r¤¨2¤Ô!7¸¸r¼À2¼Ô9TØ�Bˆxˆr!   c           	     ó  — |j         \  }}t          |j        dz   |j        |j        z   dz
  ¦  «        D ]Ð}t          |j        dz   |j        |j        z   dz
  ¦  «        D ]¥}||k    r8||k    r2t          j        dc||         |         _        ||         |         _	        Œ@t          t          ||z
  ¦  «        t          ||z
  ¦  «        ¦  «        dk    r1t          j        dc||         |         _        ||         |         _	        Œ¦ŒÑd S )Nr"   T)rF   r@   r9   rR   r8   rQ   r	   Ú
BOSS_ALTARr:   r;   r   r®   ÚRUNIC_FLOOR)r   rX   r^   rÐ   rÑ   r™   rš   s          r   rj   z)ProceduralMapEngine._embellish_boss_arenaâ   s  € ØÔ#‰ˆˆSÝ˜	œ a™¨¬°y´{Ñ)BÀQÑ)FÑGÔGð 	að 	aˆBÝ˜IœK¨!™O¨Y¬[¸9¼;Ñ-FÈÑ-JÑKÔKð að a�Ø˜’9�9  s¢ ÝFNÔFYÐ[_ÐC�E˜"”I˜b”MÔ+¨U°2¬Y°r¬]Ô-CÐ-CÝ�˜R #™X™œ­¨B°©H©¬Ñ6Ô6¸!Ò;Ð;ÝFNÔFZÐ\`ÐC�E˜"”I˜b”MÔ+¨U°2¬Y°r¬]Ô-Cøð	að	að 	ar!   úList[Tuple[int, int]]c                ó  — g }|d d…         D ]û}|j         \  }}|                     g d¢¦  «        \  }	}
t          |                     dd¦  «        ¦  «        D ]š}||	z   ||
z   }}d|cxk    r| j        dz
  k     ryn Œ$d|cxk    r| j        dz
  k     ran Œ<|                     ||¦  «        sHt          j        ddc||         |         _	        ||         |         _
        ||         |         _        ||}}Œ›|                     ||f¦  «         Œü|S )Nry   )r¨   r©   r¥   r¦   rt   ru   rz   TF)rF   Úchoicer@   r…   r   r   r­   r	   r˜   r:   r;   r<   r‡   )r   rX   rZ   rl   r^   ro   rG   ÚexÚeyr¸   r¹   r´   rº   r»   s                 r   ri   z$ProceduralMapEngine._carve_dead_endsë   sE  € ð ,.ˆ	Ø�r˜�r”ð 	'ð 	'ˆAØ”X‰FˆB�Ø—Z’ZÐ BÐ BÐ BÑCÔC‰FˆB�Ý˜3Ÿ;š; q¨!Ñ,Ô,Ñ-Ô-ð $ð $�Ø˜b™ " r¡'�B�Ø˜Ð+Ð+Ò+Ð+˜TœZ¨!™^Ò+Ð+Ð+Ð+Ð+°°RÐ0IÐ0IÒ0IÐ0I¸$¼+È¹/Ò0IÐ0IÐ0IÐ0IÐ0IÐR[×RdÒRdÐegÐikÑRlÔRlÐ0IÝckÔcqÐswÐy~Ð`�E˜"”I˜b”MÔ+¨U°2¬Y°r¬]Ô-CÀUÈ2ÄYÈrÄ]ÔE`Ø ˜�BøØ×Ò˜b "˜XÑ&Ô&Ð&Ð&ØÐr!   rn   úOptional[Tuple[int, int]]rW   r   ú'Dict[Tuple[int, int], ObstacleInstance]c                ó¨  ‡ ‡‡‡‡‡— i Šd„ |D ¦   «         ŠdŠddˆˆfd„}ˆˆˆ ˆfd„t          d‰ j        dz
  ¦  «        D ¦   «         }|                     |¦  «         d}	|D ]ƒ\  }
}‰|         |
dz
           j         r‰|         |
dz            j         p-‰|dz
           |
         j         o‰|dz            |
         j         }|s|	s |t          j        |
|dd¬¦  «         d}	 nŒ„t          dt          t          |¦  «        |j	        z  ¦  «        ¦  «        }|d|…         D ]¹\  }
}|
|f‰v rŒ| 
                    |j        ¦  «        }|t          j        k    r2t          j        dc‰|         |
         _        ‰|         |
         _        Œh|t          j        k    r2t          j        dc‰|         |
         _        ‰|         |
         _        Œª |||
|d¬¦  «         Œº|r& |t          j        |d         |d         dd¬¦  «         ‰j        \  }}dD ]D\  }}||z   ||z   }}‰                     ||¦  «        r||f‰vr |t          j        ||d¬¦  «         ŒE‰S )Nc                ó   — h | ]	}|j         ’Œ
S rM   )rF   )r>   rG   s     r   ú	<setcomp>zAProceduralMapEngine._inject_anti_bot_obstacles.<locals>.<setcomp>  s   € Ð0Ð0Ð0 Q˜œÐ0Ð0Ð0r!   r   é–   FÚobs_tr
   Úoxr   ÚoyÚhpÚblk_vÚboolr(   r•   c                ó„   •— ‰dz  Št          d| j                             ¦   «         › d‰› �||| ||dd|¦	  «	        ‰||f<   d S )Nr"   Úobs_r´   FT)r   ÚnameÚlower)rã   rä   rå   ræ   rç   Úobs_id_counterrY   s        €€r   Úadd_obsz?ProceduralMapEngine._inject_anti_bot_obstacles.<locals>.add_obs  s`   ø€ à˜aÑˆNÝ"2Ø<�u”z×'Ò'Ñ)Ô)Ð<Ð<¨NÐ<Ð<¸bÀ"ÀeÈRÐQSÐUZÐ\`Ðbgñ#ô #ˆI�r˜2�hÑÐÐr!   c                ó¬   •— g | ]P}t          d ‰j        d z
  ¦  «        D ]5}‰|         |         j        r ||f‰v¯‰                     ||¦  «        °1||f‘Œ6ŒQS )rz   )r@   r   r;   r­   )r>   r9   r8   r^   Úroom_centersr   rX   s      €€€€r   r?   zBProceduralMapEngine._inject_anti_bot_obstacles.<locals>.<listcomp>  sŠ   ø€ ð 
ð 
ð 
àÝ˜1˜dœj¨1™nÑ-Ô-ð
ð 
ð Ø�QŒx˜Œ{Ô#ð	
ð *+¨A¨°lÐ(BÐ(BÈ9×K]ÒK]Ð^_ÐabÑKcÔKcÐ(Bð �ˆFð )CÐ(BÐ(BÐ(Br!   rz   r"   éP   T)ræ   rç   rv   g       @rx   )ræ   éÈ   ))éþÿÿÿró   )rz   ró   )ró   rz   )rz   rz   éx   )râ   F)rã   r
   rä   r   rå   r   ræ   r   rç   rè   r(   r•   )r@   r   Úshuffler;   r
   ÚBARRICADE_WOOD_BONErƒ   r   r„   Úobstacle_densityrÚ   Úobstacle_paletteÚMUD_QUAGMIREr	   ÚMUD_POOLr:   Úmovement_costÚCONCEALED_SPIKESÚ
SPIKE_TRAPÚhazard_damageÚBOSS_SEAL_BARRIERrF   r­   ÚBONE_BRAZIER)r   rX   rZ   r^   rn   rl   rW   rî   Ú	walkablesÚbarricade_placedr8   r9   Úis_chokeÚlimitÚobs_typerÐ   rÑ   r¸   r¹   r’   r“   rí   rY   rð   s   `` `                 @@@r   rk   z.ProceduralMapEngine._inject_anti_bot_obstaclesú   s	  øøøøøø€ ð >@ˆ	Ø0Ð0¨%Ð0Ñ0Ô0ˆØˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð
ð 
ð 
ð 
ð 
ð 
ð 
å˜1˜dœk¨A™oÑ.Ô.ð
ñ 
ô 
ˆ	ð 	�Š�IÑÔÐà ÐØð 	ð 	‰DˆAˆqØ! !œH Q¨¡UœOÔ4Ð4ÐU¸UÀ1¼XÀaÈ!Áe¼_Ô=UÐ9Uð Ø˜!˜a™%”L ”OÔ,Ð,ÐM°U¸1¸q¹5´\À!´_Ô5MÐ1Mð ð ð Ð/ð Ø��Ô8¸!¸QÀ2ÈTÐRÑRÔRÐRØ#'Ð Ø�ðõ
 �B��C 	™NœN¨UÔ-CÑCÑDÔDÑEÔEˆØ˜a ˜gÔ&ð 		0ð 		0‰DˆAˆqØ�1ˆv˜Ð"Ð"ØØ—z’z %Ô"8Ñ9Ô9ˆHØ�<Ô4Ò4Ð4ÝCKÔCTÐVYÐ@��a”˜”Ô% u¨Q¤x°¤{Ô'@Ð'@Ø�\Ô:Ò:Ð:ÝCKÔCVÐXZÐ@��a”˜”Ô% u¨Q¤x°¤{Ô'@Ð'@à�˜ ! Q¨3Ð/Ñ/Ô/Ð/Ð/àð 	pØˆG•LÔ2°OÀAÔ4FÈÐXYÔHZÐ_bÐjnÐoÑoÔoÐoàÔ#‰ˆˆSØ:ð 	Cð 	C‰FˆB�Ø˜2‘X˜s R™x�ˆBØ×!Ò! " bÑ)Ô)ð C¨r°2¨h¸iÐ.GÐ.GØ��Ô1°2°r¸cÐBÑBÔBÐBøàÐr!   Úx1Úy1Úx2Úy2c                óF  — |dz  }t          ||z
  ¦  «        t          ||z
  ¦  «        }	}||k     rdnd||k     rdnd}}
||	z
  ||}}}	 t          | |dz   ¦  «        D ]‘}t          | |dz   ¦  «        D ]z}||z   ||z   }}d|cxk    r| j        k     r\n Œ!d|cxk    r| j        k     rGn Œ6t          j        ddc||         |         _        ||         |         _        ||         |         _        Œ{Œ’||k    r||k    rd S d|z  }||	 k    r
||	z  }||
z  }||k     r
||z  }||z  }ŒÛ)Nrz   r"   r§   Tr   F)	r®   r@   r   r   r	   r˜   r:   r;   r<   )r   rX   r  r  r  r	  r   Úhalf_wr¸   r¹   ÚsxÚsyÚerrÚcurr_xÚcurr_yÚdy_offÚdx_offrº   r»   Úe2s                       r   Ú_carve_linezProceduralMapEngine._carve_line7  s›  € ð ˜!‘ˆÝ�R˜"‘W‘”�s 2¨¡7™|œ|ˆBˆØ˜B’w�w�!�! B¨r°Bªw¨w¨!¨!¸BˆBˆØ  2™g r¨2�VˆVˆð	Ý  ¨°!©Ñ4Ô4ð Cð C�Ý# V G¨V°a©ZÑ8Ô8ð Cð C�FØ# f™_¨f°v©o˜�BØ˜BÐ+Ð+Ò+Ð+ ¤Ò+Ð+Ð+Ð+Ð+°°RÐ0EÐ0EÒ0EÐ0E¸$¼+Ò0EÐ0EÐ0EÐ0EÐ0EÝgoÔguÐw{ð  ~CÐd˜˜bœ	 "œÔ/°°r´¸2´Ô1GÈÈrÌÐSUÌÔIdøðCð ˜Š|ˆ| ¨"¢ Ø�Ø�S‘ˆBØ�R�CŠxˆxØ�r‘	�Ø˜"‘�Ø�BŠwˆwØ�r‘	�Ø˜"‘�ð	r!   Úmap_datar8   r9   ÚdamageúTuple[bool, int]c                ó°  — |j                              ||f¦  «        }|r|j        rdS t          d|j        |z
  ¦  «        |_        |j        dk    rd\  |_        |_        |_        ||f|j        k    rd|_        n"t          j
        |j        |         |         _        d\  |j        |         |         _        |j        |         |         _        dS d|j        fS )N)Fr   r   ©TFFT©TF)Tr   F)rY   ÚgetÚis_destroyedr   ræ   Úblocks_movementr<   r_   r`   r	   r˜   rX   r:   r;   )r   r  r8   r9   r  Úobss         r   Údamage_obstaclez#ProceduralMapEngine.damage_obstacleN  sÖ   € ØÔ ×$Ò$ a¨ VÑ,Ô,ˆØð 	�cÔ&ð 	Ø�:Ý�Q˜œ ™Ñ(Ô(ˆŒØŒ6�QŠ;ˆ;ØGYÑDˆCÔ˜cÔ1°3Ô3DØ�1ˆv˜Ô+Ò+Ð+Ø.2�Ô+Ð+å19´�”˜qÔ! !Ô$Ô.ØP[ÑMˆHŒN˜1Ô˜aÔ Ô)¨8¬>¸!Ô+<¸QÔ+?Ô+MØ�9Ø�s”vˆÐr!   rè   c                ó  — |j         sdS |j         \  }}|j                             ||f¦  «        }|rd\  |_        |_        |_        d\  |j        |         |         _        |j        |         |         _        d|_        dS )NFr  r  T)	r_   rY   r  r  r  r<   rX   r;   r`   )r   r  rÒ   rÓ   r  s        r   Úbreach_boss_gatez$ProceduralMapEngine.breach_boss_gate]  s‹   € ØÔ!ð 	Ø�5ØÔ#‰ˆˆBØÔ ×$Ò$ b¨" XÑ.Ô.ˆØð 	ZØGYÑDˆCÔ˜cÔ1°3Ô3DØP[ÑMˆŒ�rÔ˜2ÔÔ'¨¬¸Ô);¸BÔ)?Ô)MØ&*ˆÔ#Øˆtr!   zDict[str, MapGridData]Ú_active_zone_mapsc                ó   — || j         |<   dS )zSSets or registers the active map grid for a zone (used in runtime & test fixtures).N)r"  )r.   r'   r  s      r   Úset_zone_mapz ProceduralMapEngine.set_zone_mapj  s   € ð *2ˆÔ˜gÑ&Ð&Ð&r!   c                ó8   — | j                              ¦   «          dS )zClears cached map grids.N)r"  Úclear)r.   s    r   Úclear_zone_mapsz#ProceduralMapEngine.clear_zone_mapso  s   € ð 	Ô×#Ò#Ñ%Ô%Ð%Ð%Ð%r!   r   ÚtxÚtyr	   c                ó’  — || j         v rG| j         |         }|                     ||¦  «        st          j        S |j        |         |         j        S 	 |                      ||¬¦  «        }|| j         |<   |                     ||¦  «        st          j        S |j        |         |         j        S # t          $ r t          j        cY S w xY w)zÖ
        Returns the TileType at tile coordinates (tx, ty) for a given zone.
        Queries active cached map or generates procedural map on demand.
        Out-of-bounds coordinates return TileType.WALL.
        )r2   )	r"  Úis_in_boundsr	   r=   rX   r:   Úgenerate_wilderness_mapÚ	Exceptionr˜   )r.   r'   r(  r)  r2   Úgrids         r   Úget_tile_typez!ProceduralMapEngine.get_tile_typet  sÚ   € ð �cÔ+Ð+Ð+ØÔ(¨Ô1ˆDØ×$Ò$ R¨Ñ,Ô,ð %Ý”}Ð$Ø”:˜b”> "Ô%Ô/Ð/ð	"Ø×.Ò.¨w¸TÐ.ÑBÔBˆDØ-1ˆCÔ! 'Ñ*Ø×$Ò$ R¨Ñ,Ô,ð %Ý”}Ð$Ø”:˜b”> "Ô%Ô/Ð/øÝð 	"ð 	"ð 	"Ý”>Ð!Ð!Ð!ð	"øøøs   ÁAB- ÂB- Â-CÃCc                ól   — ddl m} |                     |||¬¦  «        }|                     ||¬¦  «        S )zHFacade method delegating to WildernessMapGenerator for open-world zones.r   )ÚWildernessMapGenerator)r2   r3   )r2   r'   )Ú%server.world.wilderness_map_generatorr1  Úfor_zoneÚgenerate)r.   r'   r2   r3   r1  Ú	generators         r   r,  z+ProceduralMapEngine.generate_wilderness_map‰  sK   € ð
 	QÐPÐPÐPÐPÐPØ*×3Ò3°GÀ$ÐQYÐ3ÑZÔZˆ	Ø×!Ò! t°WÐ!Ñ=Ô=Ð=r!   )r   r   r   N)r   r   r   r   r   r   r   r   )r"   NNN)
r#   r   r$   r%   r&   r   r'   r%   r(   r   )r1   )r2   r   r3   r4   r(   r   )rl   rq   r(   rr   )r‹   r   rm   rr   r(   r   )rX   r”   rZ   rr   r(   r•   )rX   r”   r^   r   r(   r•   ©N)
rX   r”   r�   rž   rŸ   rž   r    r¡   r(   r•   )rX   r”   rm   rr   r^   r   r(   r•   )rX   r”   rm   rr   r^   r   r(   rž   )
rX   r”   rZ   rr   rl   rq   r^   r   r(   rØ   )rX   r”   rZ   rr   r^   r   rn   rÝ   rl   rq   rW   r   r(   rÞ   )r"   )rX   r”   r  r   r  r   r  r   r	  r   r   r   r(   r•   )
r  r   r8   r   r9   r   r  r   r(   r  )r  r   r(   rè   )r'   r4   r  r   r(   r•   )r(   r•   )r   )
r'   r4   r(  r   r)  r   r2   r   r(   r	   ©r'   r4   r2   r   r3   r%   r(   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    Úclassmethodr0   rp   rc   rd   re   rf   rÀ   rg   rh   rj   ri   rk   r  r  r!  r"  Ú__annotations__r$  r'  r/  r,  rM   r!   r   r   r      s[  € € € € € € ØJÐJð eiðeð eð eð eð eð ð Ø $Ø"&Ø!%ð
ð 
ð 
ð 
ñ „[ð
ð 4
ð 4
ð 4
ð 4
ð 4
ðlð ð ð ð 	ð 	ð 	ð 	ð[ð [ð [ð [ðWð Wð Wð Wð ~Bð#'ð #'ð #'ð #'ð #'ðJwð wð wð wðð ð ð ð<að að að aðð ð ð ð;ð ;ð ;ð ;ð| ]^ðð ð ð ð ð.ð ð ð ð	ð 	ð 	ð 	ð 13ÐÐ2Ð2Ð2Ñ2àð2ð 2ð 2ñ „[ð2ð ð&ð &ð &ñ „[ð&ð ð"ð "ð "ð "ñ „[ð"ð( à@Dð>ð >ð >ð >ñ „[ð>ð >ð >r!   r   r'   r4   r2   r   r3   r%   r(   r   c                ó:   — t                                | ||¦  «        S )zAFacade for generating open-world wilderness procedural map grids.)r   r,  )r'   r2   r3   s      r   r,  r,  “  s   € õ ×6Ò6°wÀÀhÑOÔOÐOr!   Tr  r�   rž   ÚtargetÚallow_sealed_boss_gaterè   ú"Tuple[bool, List[Tuple[int, int]]]c           
     ó&  — |                       |d         |d         ¦  «        r"|                       |d         |d         ¦  «        sdg fS d|fg}|d i}|di}|�r¶t          j        |¦  «        \  }}||k    r=g |}
}	|
�|	                     |
¦  «         ||
         }
|
­|	                     ¦   «          d|	fS |\  }}dD �]P\  }}||z   ||z   }}|                       ||¦  «        r&| j        |         |         j        t          j        k    rŒM| j	         
                    ||f¦  «        }|r_|j        sX|j        rQ|j        t          j        k    r|sŒ‘|j        t          j        t          j        t          j        t          j        fv rd}nŒÊ| j        |         |         j        }||         |z   }||f|vs||||f         k     rO||||f<   t          j        ||t+          j        |d         |z
  |d         |z
  ¦  «        z   ||ff¦  «         ||||f<   �ŒR|�°¶dg fS )Nr   r"   Fr£   Tr¤   g      @)r+  r«   r¬   r‡   ÚreverserX   r:   r	   r=   rY   r  r  r  Úobstacle_typer
   rÿ   rö   ÚDEBRIS_COLLAPSEÚBONE_CLUSTERrû   r¯   rD   rE   )r  r�   r?  r@  r°   r±   r²   r´   rµ   Úpathr½   r¶   r·   r¸   r¹   rº   r»   r  Ú	step_costr¼   s                       r   Úverify_path_connectivityrI  š  s�  € ð × Ò   q¤¨5°¬8Ñ4Ô4ð ¸H×<QÒ<QÐRXÐYZÔR[Ð]cÐdeÔ]fÑ<gÔ<gð Ø�rˆ{Ðà�e�ˆ~€HØ˜�€IØ˜#�,€Kà
ñ $.Ý”] 8Ñ,Ô,‰
ˆˆ7Ø�fÒÐØ˜V�$ˆDØÐ"Ø—’˜DÑ!Ô!Ð!Ø  ”�ð Ð"ð �LŠL‰NŒNˆNØ˜$�<Ðà‰ˆˆBØ8ð 	.ñ 	.‰FˆB�Ø˜"‘W˜b 2™g�ˆBØ×(Ò(¨¨RÑ0Ô0ð °H´NÀ2Ô4FÀrÔ4JÔ4TÕX`ÔXeÒ4eÐ4eØàÔ$×(Ò(¨"¨b¨Ñ2Ô2ˆCØð A˜3Ô+ð A°Ô0Cð AØÔ$­Ô(FÒFÐFÐOeÐFØØÔ$Ý Ô4Ý Ô2Ý Ô0Ý Ô-ð	)ð ð ð !$�I�Iàà$œN¨2Ô.¨rÔ2Ô@�	à" 7Ô+¨iÑ7ˆHØ�Bˆx˜{Ð*Ð*¨h¸ÀbÈ"ÀXÔ9NÒ.NÐ.NØ(0�˜R ˜HÑ%Ý”˜x¨(µT´ZÀÀqÄ	ÈBÁÐPVÐWXÔPYÐ\^ÑP^Ñ5_Ô5_Ñ*_ÐbdÐfhÐaiÐ)jÑkÔkÐkØ&-�	˜2˜r˜(Ñ#ùðI ñ $.ðL �2ˆ;Ðr!   rG  rØ   Úfloatc                ó¸   — t          j        |d         |d         z
  |d         |d         z
  ¦  «        }|dk    r t          t          | ¦  «        |z  d¦  «        ndS )Nr   r"   rz   rª   )rD   rE   Úroundr„   )rG  r�   r?  Ú	euclideans       r   Úcalculate_path_sinuosityrN  Í  sU   € Ý”
˜6 !œ9 u¨Q¤xÑ/°¸´¸UÀ1¼XÑ1EÑFÔF€IØ.7¸!ªm¨m�5•�T‘”˜YÑ&¨Ñ*Ô*Ð*ÀÐDr!   r6  r7  )T)
r  r   r�   rž   r?  rž   r@  rè   r(   rA  )rG  rØ   r�   rž   r?  rž   r(   rJ  )r;  Ú
__future__r   rD   ra   r«   Útypingr   r   r   r   r   Úserver.world.map_data_typesr	   r
   r   r   r   r   Úserver.world.map_biome_catalogr   r   r   r,  rI  rN  rM   r!   r   ú<module>rS     sl  ððð ð
 #Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€Ø €€€Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð TÐ SÐ SÐ SÐ SÐ SÐ SÐ Sðz>ð z>ð z>ð z>ð z>ñ z>ô z>ð z>ð| 8<ðPð Pð Pð Pð Pð lpð0ð 0ð 0ð 0ð 0ðfEð Eð Eð Eð Eð Er!   