§
    uq¬jâ+  ã                  ó†  — d Z ddlmZ ddlmZmZ ddlmZ ddlZddlZddl	m
Z
mZmZmZmZmZ ddlZ	 ddlmZ n# e$ r dZY nw xY wddlmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# dd	l$m%Z% dd
l&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0 e G d„ d¦  «        ¦   «         Z1e G d„ d¦  «        ¦   «         Z2 G d„ d¦  «        Z3dS )uÎ  AutoPOE2 - Zero-Day UI Baseline & Layout Verification Pipeline (Doc 48 / SSoT).
======================================================================================
Pipeline tháº©m Ä‘á»‹nh thá»‹ giÃ¡c tá»± Ä‘á»™ng ngay sau khi game cáº­p nháº­t báº£n vÃ¡ má»›i (Patch):
1. Chá»¥p áº£nh mÃ n hÃ¬nh Baseline má»›i (Zero-Day Capture) khi nhÃ¢n váº­t Ä‘á»©ng trong Hideout/Atlas.
2. Kiá»ƒm tra layout cÃ¡c thÃ nh pháº§n giao diá»‡n ngÆ°á»�i dÃ¹ng trá»�ng yáº¿u:
   - Map Device dialog & Atlas tree banner.
   - NÃºt TRAVERSE & cÆ¡ cháº¿ phÃ²ng vá»‡ khÃ¡ng bug chá»¯ 'ENTER' (x <= 0.55 * w).
   - Biá»ƒu tÆ°á»£ng Player Avatar hÃ¬nh trÃ²n vÃ ng trÃªn cÃ¢y Atlas (find_player_avatar_on_atlas).
   - Khay Waystone & á»• cáº¯m Socket (Waystone Tray 12 Ã´ & Socket).
   - LÆ°á»›i hÃ nh trang nhÃ¢n váº­t (Inventory 60 Ã´: 12 cá»™t x 5 hÃ ng).
   - Thanh Stash Tabs vÃ  báº£ng Chá»£ Faustus Currency Exchange.
3. Xuáº¥t bÃ¡o cÃ¡o cháº©n Ä‘oÃ¡n (Diagnostic Report) cáº£nh bÃ¡o sai lá»‡ch layout hoáº·c Ä‘á»•i texture.

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 1: Python 3.11 Cold Path Tier 2.
- Rule 4: Module hÃ³a Ä‘á»™c láº­p, file tráº§n < 500 dÃ²ng.
- Rule 5: 100% artifact tháº­t tá»« captures/.
- Rule 16: Google Docstrings chuáº©n má»±c.
é    )Úannotations)Ú	dataclassÚfield)ÚdatetimeN)ÚAnyÚDictÚListÚOptionalÚTupleÚUnion)ÚImage)ÚCoordinateScalerÚ
ResolutionÚ	RES_1080PÚ	RES_1440PÚRES_4KÚRES_WINDOWED_DEFAULTÚget_faustus_element_posÚget_inventory_slot_posÚget_stash_slot_posÚget_traverse_button_bboxÚget_traverse_button_posÚget_waystone_socket_posÚget_waystone_tray_slot_posÚresolve_resolution)Úcapture_window_bitblt)Úfind_traverse_button_dual_passÚis_atlas_ui_open_robust)Úfind_button_by_textÚfind_player_avatar_on_atlasÚfind_reachable_green_nodeÚis_atlas_ui_openÚis_inventory_open)Úfind_poe2_windowc                  óN   — e Zd ZU dZded<   ded<   ded<   dZded	<   d
Zded<   dS )ÚComponentStatusu0   Tráº¡ng thÃ¡i kiá»ƒm tra má»™t thÃ nh pháº§n UI.ÚstrÚnameÚboolÚis_validÚdetailsNzOptional[Tuple[int, int]]Úcoordinatesç      ð?ÚfloatÚ
confidence)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r,   r/   © ó    úCC:\Projects\AutoPOE2\src\assistant_tool\vision_zero_day_verifier.pyr&   r&   C   sU   € € € € € € à:Ð:Ø€I€I�IØ€N€N�NØ€L€L�LØ-1€KÐ1Ð1Ð1Ñ1Ø€JÐÐÐÑÐÐr6   r&   c                  ó    — e Zd ZU dZded<   ded<   ded<    ee¬¦  «        Zd	ed
<    ee¬¦  «        Z	ded<    ee¬¦  «        Z
ded<   dd„ZdS )ÚZeroDayReportu2   BÃ¡o cÃ¡o tá»•ng há»£p kiá»ƒm chuáº©n Zero-Day UI.r'   Ú	timestampzTuple[int, int]Ú
resolutionr)   Úis_patch_ready)Údefault_factoryzDict[str, ComponentStatus]Ú
componentsz	List[str]ÚwarningsÚerrorsÚreturnúDict[str, Any]c                óˆ   — | j         | j        | j        d„ | j                             ¦   «         D ¦   «         | j        | j        dœS )Nc           	     óX   — i | ]'\  }}||j         |j        |j        |j        |j        d œ“Œ(S )©r(   r*   r+   r,   r/   rE   )Ú.0ÚkÚvs      r7   ú
<dictcomp>z)ZeroDayReport.to_dict.<locals>.<dictcomp>\   sQ   € ð 	ð 	ð 	ñ �A�qð ØœFØ !¤
Ø œyØ#$¤=Ø"#¤,ðð ð	ð 	ð 	r6   ©r:   r;   r<   r>   r?   r@   )r:   r;   r<   r>   Úitemsr?   r@   )Úselfs    r7   Úto_dictzZeroDayReport.to_dictW   sY   € àœØœ/Ø"Ô1ð	ð 	ð !œO×1Ò1Ñ3Ô3ð	ñ 	ô 	ð œØ”kð
ð 
ð 	
r6   N)rA   rB   )r0   r1   r2   r3   r4   r   Údictr>   Úlistr?   r@   rM   r5   r6   r7   r9   r9   M   s«   € € € € € € à<Ð<Ø€N€N�NØÐÐÑØÐÐÑØ-2¨UÀ4Ð-HÑ-HÔ-H€JÐHÐHÐHÑHØ˜%°Ð5Ñ5Ô5€HÐ5Ð5Ð5Ñ5Ø˜¨dÐ3Ñ3Ô3€FÐ3Ð3Ð3Ñ3ð
ð 
ð 
ð 
ð 
ð 
r6   r9   c                  ó8   — e Zd ZdZefdd„Zddd„Zdd„Zdd„ZdS )ÚZeroDayUiVerifieru_   Bá»™ kiá»ƒm chuáº©n thá»‹ giÃ¡c vÃ  xÃ¡c nháº­n cáº¥u trÃºc UI Zero-Day sau cáº­p nháº­t patch.Útarget_resolutionú"Union[Resolution, Tuple[int, int]]rA   ÚNonec                ó.   — t          |¦  «        | _        d S ©N)r   r;   )rL   rR   s     r7   Ú__init__zZeroDayUiVerifier.__init__n   s   € Ý,Ð->Ñ?Ô?ˆŒˆˆr6   NÚhwndúOptional[int]ú!Tuple[Optional[Image.Image], str]c                óX   — |€t          ¦   «         }|sdS t          |¦  «        }|€dS |dfS )uM   Chá»¥p áº£nh mÃ n hÃ¬nh trá»±c tiáº¿p tá»« cá»­a sá»• game POE2 Ä‘ang cháº¡y.N)Nu-   KhÃ´ng tÃ¬m tháº¥y cá»­a sá»• Path of Exile 2)Nu)   Lá»—i capture BitBlt tá»« cá»­a sá»• gameu   Chá»¥p áº£nh thÃ nh cÃ´ng)r$   r   )rL   rX   Úimgs      r7   Úcapture_live_baselinez'ZeroDayUiVerifier.capture_live_baselineq   sE   € àˆ<Ý#Ñ%Ô%ˆDØð 	IØHÐHå# DÑ)Ô)ˆØˆ;ØDÐDàÐ/Ð/Ð/r6   Ú	img_inputú#Union[str, Image.Image, np.ndarray]r9   c                óp	  — d}t          |t          ¦  «        rNt          j                             |¦  «        r.t
          �'t          j        |¦  «                             d¦  «        }nt          |t          j	        ¦  «        r/t
          �(t          j
        |¦  «                             d¦  «        }n6t
          �/t          |t
          j        ¦  «        r|                     d¦  «        }t          j        ¦   «                              d¦  «        }|€,t          || j        j        | j        j        fddg¬¦  «        }|S |j        \  }}t'          ||¦  «        }i }g }	g }
t)          |¦  «        }t+          |¦  «        }|p|}t-          ddd	|rd
nd› d|› d|› d�|rdnd¬¦  «        |d<   t/          |dz  ¦  «        }t1          |¦  «        }t3          |d¦  «        }|p|}|�a|d         |k    }|s"|
                     d|d         › d|› d�¦  «         t-          d|d|d         › d|d         › d|› �||rdnd¬ ¦  «        |d!<   nCt7          |¦  «        }t-          d"|d         |k    d#|d         › d|d         › d�|d$¬ ¦  «        |d!<   t9          |d¬%¦  «        }|�+t-          d&dd'|d         › d|d         › d�|d¬ ¦  «        |d(<   n;t9          |d¬%¦  «        }t-          d)dd*|d         › d|d         › d�|d¬ ¦  «        |d(<   t;          |¦  «        }t=          dd|¬+¦  «        }t=          d,d-|¬+¦  «        }|d         |k    o|d         |k     o|d         |k     }t-          d.|d/|› d0|› d1|› �||rd2nd3¬ ¦  «        |d4<   |s|
                     d5|› d6|› �¦  «         t?          |¬+¦  «        }tA          d|¬+¦  «        }d|d         cxk     o|k     nc od|d         cxk     o|k     nc }t-          d7|d8|› d9|› �|d2¬ ¦  «        |d:<   tC          d;|¬+¦  «        }tE          dd|¬+¦  «        }t-          d<d|d         cxk     o|k     nc od|d         cxk     o|k     nc d=|› d>|› �|d?¬ ¦  «        |d@<   tG          |
¦  «        dk    o*tI          dA„ | %                    ¦   «         D ¦   «         ¦  «        }t          |||f|||	|
¬B¦  «        S )CuZ   Thá»±c hiá»‡n kiá»ƒm tra toÃ n diá»‡n cáº¥u trÃºc cÃ¡c thÃ nh pháº§n UI trÃªn áº£nh frame.NÚRGBz%Y-%m-%d %H:%M:%SFu=   áº¢nh Ä‘áº§u vÃ o khÃ´ng há»£p lá»‡ hoáº·c khÃ´ng tá»“n táº¡i)r:   r;   r<   r@   zAtlas Map Device UITzState=ÚOPENÚSTANDBY_HIDEOUTz (Basic=z	, Robust=ú)r-   g333333ë?)r(   r*   r+   r/   Úatlas_uigš™™™™™á?ÚTRAVERSEr   u1   NÃºt TRAVERSE bá»‹ lá»‡ch sang vÃ¹ng tÃºi Ä‘á»“ (z > z)!z&TRAVERSE Button (Anti-Enter Protected)u   Tá»�a Ä‘á»™ (z, é   u   ) - KhÃ¡ng bug x<=gffffffî?g        rE   Útraverse_buttonz"TRAVERSE Button (Canonical Anchor)u   Tá»�a Ä‘á»™ chuáº©n hÃ³a (gš™™™™™é?)Úreturn_none_if_missingzPlayer Avatar On Atlasu.   PhÃ¡t hiá»‡n avatar táº¡i Ä‘á»‰nh Great Wall (Úplayer_avatarz,Player Avatar On Atlas (Calibrated Fallback)u*   Dá»± bÃ¡o tá»�a Ä‘á»™ Ä‘á»‰nh Great Wall ()Ú
target_resé   é   zInventory Grid 60 SlotszOpen=z, Slot[0,0]=z, Slot[11,4]=gÍÌÌÌÌÌì?gš™™™™™É?Úinventory_gridu    LÆ°á»›i Inventory lá»‡ch biÃªn: z -> zWaystone Tray & SocketzSocket=z, TraySlot0=Úwaystone_trayÚpanel_centerzFaustus Exchange & Stash TabszFaustusCenter=z, Stash[0,0]=g)\�Âõ(ì?Úfaustus_and_stashc              3  ó$   K  — | ]}|j         V — Œd S rV   )r*   )rF   Úcs     r7   ú	<genexpr>z4ZeroDayUiVerifier.verify_ui_frame.<locals>.<genexpr>   s$   è è € Ð1ZÐ1ZÀ°!´*Ð1ZÐ1ZÐ1ZÐ1ZÐ1ZÐ1Zr6   rJ   )&Ú
isinstancer'   ÚosÚpathÚexistsr   ÚopenÚconvertÚnpÚndarrayÚ	fromarrayr   ÚnowÚstrftimer9   r;   ÚwidthÚheightÚsizer   r"   r   r&   Úintr   r   Úappendr   r    r#   r   r   r   r   r   ÚlenÚallÚvalues) rL   r^   Úpil_imgÚnow_strÚreportÚwÚhÚresr>   r?   r@   Úatlas_open_basicÚatlas_open_robustÚis_openÚmax_traverse_xÚtraverse_posÚtext_btn_posÚ
active_posÚis_pos_safeÚcanonical_posÚ
avatar_posÚfallback_posÚinv_openÚc00Úc114Úinv_bounds_okÚ
socket_posÚ
tray_slot0Útray_okÚfaustus_centerÚstash_slot0r<   s                                    r7   Úverify_ui_framez!ZeroDayUiVerifier.verify_ui_frame~   s9  € ð
 *.ˆÝ�i¥Ñ%Ô%ð 	/ÝŒw�~Š~˜iÑ(Ô(ð ?­UÐ->Ýœ* YÑ/Ô/×7Ò7¸Ñ>Ô>�øÝ˜	¥2¤:Ñ.Ô.ð 	/µ5Ð3DÝ”o iÑ0Ô0×8Ò8¸Ñ?Ô?ˆGˆGÝÐ¥:¨i½¼Ñ#EÔ#EÐØ×'Ò'¨Ñ.Ô.ˆGå”,‘.”.×)Ò)Ð*=Ñ>Ô>ˆàˆ?Ý"Ø!Ø œOÔ1°4´?Ô3IÐJØ$ØWÐXð	ñ ô ˆFð ˆMàŒ|‰ˆˆ1Ý˜˜AÑÔˆØ13ˆ
Ø ˆØˆõ ,¨GÑ4Ô4ÐÝ3°GÑ<Ô<ÐØ"Ð7Ð&7ˆÝ!0Ø&ØØ~ wÐE˜V˜VÐ4EÐ~Ð~ÐO_Ð~Ð~Ðj{Ð~Ð~Ð~Ø%Ð/�s�s¨4ð	"
ñ "
ô "
ˆ
�:Ñõ ˜Q ™X™œˆÝ5°gÑ>Ô>ˆÝ*¨7°JÑ?Ô?ˆà!Ð1 \ˆ
ØÐ!Ø% aœ=¨NÒ:ˆKØð xØ—’ÐvÐR\Ð]^ÔR_ÐvÐvÐdrÐvÐvÐvÑwÔwÐwÝ,;Ø=Ø$Øj¨
°1¬ÐjÐj¸ÀA¼ÐjÐjÐZhÐjÐjØ&Ø#.Ð7˜4˜4°Cð-ñ -ô -ˆJÐ(Ñ)Ð)õ 4°CÑ8Ô8ˆMÝ,;Ø9Ø'¨Ô*¨nÒ<Ø\°]À1Ô5EÐ\Ð\ÈÐWXÔIYÐ\Ð\Ð\Ø)Øð-ñ -ô -ˆJÐ(Ñ)õ 1°ÐQUÐVÑVÔVˆ
ØÐ!Ý*9Ø-ØØjÈÐTUÌÐjÐjÐZdÐefÔZgÐjÐjÐjØ&Øð+ñ +ô +ˆJ�Ñ'Ð'õ 7°wÐW\Ð]Ñ]Ô]ˆLÝ*9ØCØØjÀ\ÐRSÄ_ÐjÐjÐXdÐefÔXgÐjÐjÐjØ(Øð+ñ +ô +ˆJ�Ñ'õ % WÑ-Ô-ˆå$ Q¨°cÐ:Ñ:Ô:ˆÝ% b¨!¸Ð<Ñ<Ô<ˆØ˜Qœ .Ò0ÐP°T¸!´W¸q²[ÐPÀTÈ!ÄWÈqÂ[ˆÝ'6Ø*Ø"ØJ˜HÐJÐJ°#ÐJÐJÀDÐJÐJØØ,Ð5�t�t°#ð(
ñ (
ô (
ˆ
Ð#Ñ$ð ð 	NØ�MŠMÐL¸SÐLÐLÀdÐLÐLÑMÔMÐMõ -¸Ð<Ñ<Ô<ˆ
Ý/°¸cÐBÑBÔBˆ
Ø�z !”}Ð(Ð(Ò(Ð( qÒ(Ð(Ð(Ð(ÐB¨Q°¸A´Ð-BÐ-BÒ-BÐ-BÀÒ-BÐ-BÐ-BÐ-BˆÝ&5Ø)ØØB˜jÐBÐB°jÐBÐBØ"Øð'
ñ '
ô '
ˆ
�?Ñ#õ 1°ÈCÐPÑPÔPˆÝ(¨¨A¸#Ð>Ñ>Ô>ˆÝ*9Ø0Ø˜.¨Ô+Ð/Ð/Ò/Ð/¨aÒ/Ð/Ð/Ð/ÐJ°A¸ÀA¼Ð4JÐ4JÒ4JÐ4JÈÒ4JÐ4JÐ4JÐ4JØO ^ÐOÐOÀ+ÐOÐOØ&Øð+
ñ +
ô +
ˆ
Ð&Ñ'õ ˜V™œ¨Ò)ÐZ­cÐ1ZÐ1ZÀj×FWÒFWÑFYÔFYÐ1ZÑ1ZÔ1ZÑ.ZÔ.ZˆåØØ˜1�vØ)Ø!ØØð
ñ 
ô 
ð 	
r6   rŠ   Úout_pathr'   c                óP  — t          j        t           j                             t           j                             |¦  «        ¦  «        d¬¦  «         t          |dd¬¦  «        5 }t          j        |                     ¦   «         |dd¬¦  «         d	d	d	¦  «         d	S # 1 swxY w Y   d	S )
uA   LÆ°u bÃ¡o cÃ¡o kiá»ƒm chuáº©n Zero-Day dÆ°á»›i dáº¡ng tá»‡p JSON.T)Úexist_okr‹   zutf-8)Úencodingé   F)ÚindentÚensure_asciiN)	rv   Úmakedirsrw   ÚdirnameÚabspathry   ÚjsonÚdumprM   )rL   rŠ   r£   Úfs       r7   Úsave_diagnostic_reportz(ZeroDayUiVerifier.save_diagnostic_report  sß   € å
Œ•B”G—O’O¥B¤G§O¢O°HÑ$=Ô$=Ñ>Ô>ÈÐNÑNÔNÐNÝ�(˜C¨'Ð2Ñ2Ô2ð 	I°aÝŒI�f—n’nÑ&Ô&¨°!À%ÐHÑHÔHÐHð	Ið 	Ið 	Iñ 	Iô 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Iøøøð 	Ið 	Ið 	Ið 	Ið 	Ið 	Is   Á#+BÂBÂ"B)rR   rS   rA   rT   rV   )rX   rY   rA   rZ   )r^   r_   rA   r9   )rŠ   r9   r£   r'   rA   rT   )	r0   r1   r2   r3   r   rW   r]   r¢   r°   r5   r6   r7   rQ   rQ   k   s‡   € € € € € ØiÐiàOXð @ð @ð @ð @ð @ð0ð 0ð 0ð 0ð 0ðK
ð K
ð K
ð K
ðZIð Ið Ið Ið Ið Ir6   rQ   )4r3   Ú
__future__r   Údataclassesr   r   r   r­   rv   Útypingr   r   r	   r
   r   r   Únumpyr{   ÚPILr   ÚImportErrorÚsrc.common.coordinate_transformr   r   r   r   r   r   r   r   r   r   r   r   r   r   Úsrc.common.screen_capturer   Úsrc.common.vision_filtersr   r   Úsrc.common.vision_ocrr   r    r!   r"   r#   Úsrc.common.win32_windowr$   r&   r9   rQ   r5   r6   r7   ú<module>r¼      s½  ððð ð( #Ð "Ð "Ð "Ð "Ð "à (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð Ø €€€Ø 	€	€	€	Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :à Ð Ð Ð ðØÐÐÐÐÐÐøØð ð ð Ø€E€E€Eðøøøðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð  <Ð ;Ð ;Ð ;Ð ;Ð ;ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð 5Ð 4Ð 4Ð 4Ð 4Ð 4ð ðð ð ð ð ñ ô ñ „ðð ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ „ð
ð:dIð dIð dIð dIð dIñ dIô dIð dIð dIð dIs   ´; »AÁA