§
    üq¦j{E  ã                  ó€   — 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mZ ddl	m
Z
mZmZ ddlZdd
„Z G d„ d¦  «        ZdS )uä  
Poe2VisualTool Game Path Resolver
Tá»± Ä‘á»™ng Ä‘á»‹nh vá»‹ vÃ  quáº£n lÃ½ Ä‘Æ°á»�ng dáº«n thá»±c thi cá»§a Path of Exile 2 (PathOfExile.exe / PathOfExileSteam.exe).
CÆ¡ cháº¿ phÃ¢n giáº£i 4 táº§ng (4-Tier Resolution Architecture):
  - Táº§ng 1: Ä�á»�c tiáº¿n trÃ¬nh PathOfExile.exe Ä‘ang cháº¡y qua Win32 API / psutil.
  - Táº§ng 2: Ä�á»�c tá»‡p cáº¥u hÃ¬nh config.toml (má»¥c [game] executable_path).
  - Táº§ng 3: QuÃ©t Registry Windows & Steam library (steamapps/libraryfolders.vdf) trÃªn má»�i á»• Ä‘Ä©a (C, D, E, F, G...).
  - Táº§ng 4: Há»™p thoáº¡i GUI tÆ°Æ¡ng tÃ¡c prompt_user_for_exe() qua tkinter.filedialog.
LÆ°u cache tá»± Ä‘á»™ng vÃ o config.toml khi tÃ¬m tháº¥y Ä‘Æ°á»�ng dáº«n há»£p lá»‡.
Bá»‘i cáº£nh: 13/09/2026 (Rule 2)
é    )ÚannotationsN)ÚPath)ÚListÚOptionalÚTupleÚvdf_contentÚstrÚreturnú	List[str]c                ó  — g }| s|S t          j        dt           j        ¦  «        }|                     | ¦  «        D ]F}|                     d¦  «                             dd¦  «        }|r||vr|                     |¦  «         ŒG|S )u¨   
    PhÃ¢n tÃ­ch cÃº phÃ¡p tá»‡p Valve Data Format (libraryfolders.vdf)
    Ä‘á»ƒ trÃ­ch xuáº¥t danh sÃ¡ch táº¥t cáº£ cÃ¡c thÆ° má»¥c thÆ° viá»‡n Steam trÃªn mÃ¡y.
    z"path"\s+"([^"]+)"é   ú\\ú\)ÚreÚcompileÚ
IGNORECASEÚfinditerÚgroupÚreplaceÚappend)r   ÚpathsÚpatternÚmatchÚraw_paths        ú>C:\Projects\Poe2VisualTool\src\assistant\game_path_resolver.pyÚparse_vdf_library_foldersr      s’   € ð
 €EØð Øˆõ ŒjÐ.µ´Ñ>Ô>€GØ×!Ò! +Ñ.Ô.ð #ð #ˆØ—;’;˜q‘>”>×)Ò)¨&°$Ñ7Ô7ˆØð 	#˜¨Ð-Ð-Ø�LŠL˜Ñ"Ô"Ð"øØ€Ló    c                  óž   — e Zd ZU dZdZded<   dZded<   d#d$d
„Zd%d„Zd&d„Z	d&d„Z
d&d„Zd&d„Zd&d„Zd&d„Zd'd„Zd(d„Zd#d&d„Zd)d„Zd*d+d"„ZdS ),ÚGamePathResolveru[   
    Bá»™ phÃ¢n giáº£i Ä‘Æ°á»�ng dáº«n game Path of Exile 2 theo 4 táº§ng linh hoáº¡t.
    )zPathOfExile.exezPathOfExileSteam.exezPathOfExile_x64.exezPathOfExile_x64Steam.exezPathOfExileKG.exezPathOfExile_x64KG.exezTuple[str, ...]ÚALLOWED_EXE_NAMES)z-SteamLibrary\steamapps\common\Path of Exile 2z&Steam\steamapps\common\Path of Exile 2z:Program Files (x86)\Steam\steamapps\common\Path of Exile 2z4Program Files\Steam\steamapps\common\Path of Exile 2zGames\Path of Exile 2z3Games\SteamLibrary\steamapps\common\Path of Exile 2z1Program Files\Grinding Gear Games\Path of Exile 2z7Program Files (x86)\Grinding Gear Games\Path of Exile 2z#Grinding Gear Games\Path of Exile 2z+SteamLibrary\steamapps\common\Path of Exilez$Steam\steamapps\common\Path of Exilez8Program Files (x86)\Steam\steamapps\common\Path of ExilezGames\Path of Exilez!Grinding Gear Games\Path of ExileÚCOMMON_SUBPATHSNÚconfig_pathúOptional[Path | str]c                óÐ   — |�(t          |¦  «                             ¦   «         | _        d S t          t          ¦  «                             ¦   «         j        d         }|dz  | _        d S )Né   zconfig.toml)r   Úresolver"   Ú__file__Úparents)Úselfr"   Úroots      r   Ú__init__zGamePathResolver.__init__K   s^   € ØÐ"Ý# KÑ0Ô0×8Ò8Ñ:Ô:ˆDÔÐÐõ �‘>”>×)Ò)Ñ+Ô+Ô3°AÔ6ˆDØ# mÑ3ˆDÔÐÐr   Úpathú
Path | strr
   Úboolc                óR  — 	 t          |¦  «                             ¦   «         }|                     ¦   «         sdS |j                             ¦   «         }d„ | j        D ¦   «         }||v rdS |                     d¦  «        r|                     d¦  «        rdS n# t          $ r Y dS w xY wdS )u]   Kiá»ƒm tra Ä‘Æ°á»�ng dáº«n tá»‡p cÃ³ tá»“n táº¡i vÃ  Ä‘Ãºng tÃªn file thá»±c thi POE2 khÃ´ng.Fc                ó6   — g | ]}|                      ¦   «         ‘ŒS © ©Úlower©Ú.0Úexes     r   ú
<listcomp>z5GamePathResolver.is_valid_poe_exe.<locals>.<listcomp>Z   s    € ÐKÐKÐK¨S˜SŸYšY™[œ[ÐKÐKÐKr   TÚpathofexilez.exe)	r   r&   Úis_fileÚnamer3   r    Ú
startswithÚendswithÚ	Exception)r)   r,   ÚpÚ
name_lowerÚallowed_lowers        r   Úis_valid_poe_exez!GamePathResolver.is_valid_poe_exeS   sÀ   € ð	Ý�T‘
”
×"Ò"Ñ$Ô$ˆAØ—9’9‘;”;ð Ø�uØœŸš™œˆJØKÐK°DÔ4JÐKÑKÔKˆMØ˜]Ð*Ð*Ø�tØ×$Ò$ ]Ñ3Ô3ð ¸
×8KÒ8KÈFÑ8SÔ8Sð Ø�tøøÝð 	ð 	ð 	Ø�5�5ð	øøøàˆus   ‚5B ¹.B Á)*B Â
B$Â#B$úOptional[str]c                ó  — d„ | j         D ¦   «         }t          j        g d¢¦  «        D ]á}	 |j                             d¦  «        }|r‹|                     ¦   «         |v ru|j                             d¦  «        p|                     ¦   «         }|rE|                      |¦  «        r0t          t          |¦  «         
                    ¦   «         ¦  «        c S Œ«# t          j        t          j        t          j        f$ r Y ŒÓt          $ r Y ŒÞw xY wdS )u·   
        Táº§ng 1: QuÃ©t danh sÃ¡ch tiáº¿n trÃ¬nh Ä‘ang hoáº¡t Ä‘á»™ng trÃªn há»‡ thá»‘ng.
        Ä�á»™ trá»… < 5ms, Æ°u tiÃªn cao nháº¥t khi ngÆ°á»�i chÆ¡i Ä‘ang má»Ÿ game.
        c                ó6   — g | ]}|                      ¦   «         ‘ŒS r1   r2   r4   s     r   r7   zAGamePathResolver.resolve_from_running_process.<locals>.<listcomp>h   s    € ÐGÐGÐG¨˜Ÿš™œÐGÐGÐGr   )r:   r6   Úpidr:   r6   N)r    ÚpsutilÚprocess_iterÚinfoÚgetr3   r6   rA   r	   r   r&   ÚNoSuchProcessÚAccessDeniedÚZombieProcessr=   )r)   r@   Úprocr:   Úexe_paths        r   Úresolve_from_running_processz-GamePathResolver.resolve_from_running_processc   s  € ð
 HÐG°Ô0FÐGÑGÔGˆÝÔ'Ð(>Ð(>Ð(>Ñ?Ô?ð 
	ð 
	ˆDð	Ø”y—}’} VÑ,Ô,�Øð =˜DŸJšJ™LœL¨MÐ9Ð9Ø#œyŸ}š}¨UÑ3Ô3ÐA°t·x²x±z´z�HØð = D×$9Ò$9¸(Ñ$CÔ$Cð =Ý"¥4¨¡>¤>×#9Ò#9Ñ#;Ô#;Ñ<Ô<Ð<Ð<Ð<øøÝÔ(­&Ô*=½vÔ?SÐTð ð ð Ø�Ýð ð ð Ø�ðøøøàˆts   «B$CÃ&DÃ;	DÄDc                óž  — | j                              ¦   «         sdS 	 | j                              dd¬¦  «        }t          j        d|¦  «        }|rl|                     d¦  «                             ¦   «         }|rC|                      |¦  «        r.t          t          |¦  «         
                    ¦   «         ¦  «        S n# t          $ r Y nw xY wdS )u`   
        Táº§ng 2: Ä�á»�c tá»‡p cáº¥u hÃ¬nh config.toml (má»¥c [game] executable_path).
        Núutf-8Úignore©ÚencodingÚerrorszK(?:executable_path|client_exe|game_path|exe_path)\s*=\s*["\']([^"\']+)["\']r   )r"   r9   Ú	read_textr   Úsearchr   ÚstriprA   r	   r   r&   r=   )r)   ÚcontentÚmÚconfigured_paths       r   Úresolve_from_configz$GamePathResolver.resolve_from_configv   sÞ   € ð Ô×'Ò'Ñ)Ô)ð 	Ø�4ð		ØÔ&×0Ò0¸'È(Ð0ÑSÔSˆGå”	ÐhÐjqÑrÔrˆAØð @Ø"#§'¢'¨!¡*¤*×"2Ò"2Ñ"4Ô"4�Ø"ð @ t×'<Ò'<¸_Ñ'MÔ'Mð @Ý�t OÑ4Ô4×<Ò<Ñ>Ô>Ñ?Ô?Ð?øøÝð 	ð 	ð 	ØˆDð	øøøàˆts   �BB= Â=
C
Ã	C
c                ó–   — |                       ¦   «         }|r|S |                      ¦   «         }|r|S |                      ¦   «         }|r|S dS )ul   
        Táº§ng 3: QuÃ©t Registry Windows, thÆ° viá»‡n Steam libraryfolders.vdf vÃ  cÃ¡c á»• Ä‘Ä©a.
        N)Ú_scan_windows_registryÚ_scan_steam_vdfÚ_scan_all_drives)r)   Úreg_pathÚ
steam_pathÚ
drive_paths       r   Úresolve_from_system_and_steamz.GamePathResolver.resolve_from_system_and_steam‰   si   € ð
 ×.Ò.Ñ0Ô0ˆØð 	ØˆOð ×)Ò)Ñ+Ô+ˆ
Øð 	ØÐð ×*Ò*Ñ,Ô,ˆ
Øð 	ØÐàˆtr   c           	     óœ  — t           j        dk    rdS 	 ddl}|j        dddgf|j        dddgf|j        dddgf|j        d	ddgfg}|D ]Ù\  }}}	 |                     ||¦  «        5 }|D ]�}	 |                     ||¦  «        \  }}	|rbt           j                             |¦  «        rC|  	                    t          |¦  «        ¦  «        }
|
rt          |
¦  «        c cddd¦  «         c S Œ�# t          $ r Y Œ�w xY w	 ddd¦  «         n# 1 swxY w Y   ŒÊ# t          $ r Y ŒÖw xY wd
dg}|D �]‘}	 |                     |j        |¦  «        5 }|                     |¦  «        \  }}	}	t          |¦  «        D �]}	 |                     ||¦  «        }|                     ||¦  «        5 }|                     |d¦  «        \  }}	dt          |¦  «        v r›	 |                     |d¦  «        \  }}	|rnt           j                             |¦  «        rO|  	                    t          |¦  «        ¦  «        }
|
r+t          |
¦  «        cddd¦  «         c cddd¦  «         c S n# t          $ r Y nw xY wddd¦  «         n# 1 swxY w Y   �Œ# t          $ r Y �Œw xY w	 ddd¦  «         n# 1 swxY w Y   �Œ‚# t          $ r Y �Œ�w xY wn# t          $ r Y nw xY wdS )uF   QuÃ©t Registry Windows tÃ¬m Ä‘Æ°á»�ng dáº«n cÃ i Ä‘áº·t Path of Exile.ÚntNr   z*Software\GrindingGearGames\Path of Exile 2ÚInstallFolderr   z(Software\GrindingGearGames\Path of Exilez*SOFTWARE\GrindingGearGames\Path of Exile 2z6SOFTWARE\WOW6432Node\GrindingGearGames\Path of Exile 2z3SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstallz?SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\UninstallÚDisplayNameúPath of ExileÚInstallLocation)Úosr:   ÚwinregÚHKEY_CURRENT_USERÚHKEY_LOCAL_MACHINEÚOpenKeyÚQueryValueExr,   ÚisdirÚ_find_exe_in_dirr   r	   r=   ÚQueryInfoKeyÚrangeÚEnumKey)r)   rl   Úregistry_targetsÚroot_keyÚsub_keyÚ	val_namesÚkeyÚval_nameÚfolderÚ_ÚfoundÚuninstall_keysÚu_subÚnum_subkeysÚiÚsubkey_nameÚapp_keyÚdisplay_nameÚlocs                      r   r^   z'GamePathResolver._scan_windows_registryž   sÐ  € åŒ7�dŠ?ˆ?Ø�4ð6	ØˆMˆMˆMð Ô)Ð+XÐ[jÐlrÐZsÐtØÔ)Ð+VÐYhÐjpÐXqÐrØÔ*Ð,YÐ\kÐmsÐ[tÐuØÔ*Ð,eÐhwÐyð  hAð  Bð	 Ðð 1Að ð Ñ,�˜' 9ðØŸš¨°'Ñ:Ô:ð 	%¸cØ(1ð %ð %˜Hð%Ø,2×,?Ò,?ÀÀXÑ,NÔ,N¡	 ¨Ø#)ð !:­b¬g¯mªm¸FÑ.CÔ.Cð !:Ø,0×,AÒ,AÅ$ÀvÁ,Ä,Ñ,OÔ,O EØ',ð %:Ý/2°5©z¬zÐ(9Ð(9ð	%ð 	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%øøõ $-ð %ð %ð %Ø $ ð%øøøð%ð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%øøõ !ð ð ð Ø�Dðøøøð
 GØRðˆNð (ð ñ �ðØŸš¨Ô(AÀ5ÑIÔIð %ÈSØ,2×,?Ò,?ÀÑ,DÔ,DÑ)˜ Q¨Ý!& {Ñ!3Ô!3ð %ñ %˜Að%Ø.4¯nªn¸SÀ!Ñ.DÔ.D Ø%+§^¢^°C¸Ñ%EÔ%Eð 
!1ÈØ6<×6IÒ6IÈ'ÐS`Ñ6aÔ6a¡O L°!Ø'6½#¸lÑ:KÔ:KÐ'KÐ'Kð)1Ø5;×5HÒ5HÈÐRcÑ5dÔ5d©F¨C°Ø/2ð -Fµr´w·}²}ÀSÑ7IÔ7Ið -FØ8<×8MÒ8MÍdÐSVÉiÌiÑ8XÔ8X°Ø38ð 1FÝ;>¸u¹:¼:ð
!1ð 
!1ð 
!1ð 
!1ñ 
!1ô 
!1ð 
!1ð 
!1ð 
!1ð%ð %ð %ð %ñ %ô %ð %ð %ð %ð %øøõ 09ð )1ð )1ð )1Ø,0¨Dð)1øøøð
!1ð 
!1ð 
!1ñ 
!1ô 
!1ð 
!1ð 
!1ð 
!1ð 
!1ð 
!1ð 
!1øøøð 
!1ð 
!1ð 
!1ð 
!1ùøõ $-ð %ð %ð %Ø $¡ð%øøøð%ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ùøõ$ !ð ð ð Ø‘Dðøøøð)øõ, ð 	ð 	ð 	ØˆDð	øøøð ˆts]  ”:J< ÁDÁ%DÁ+A,C)ÃDÃDÃ%J< Ã(DÃ)
C6	Ã3DÃ5C6	Ã6DÃ:DÄD
	Ä
DÄD
	ÄDÄJ< Ä
DÄJ< ÄDÄJ< Ä,J*Å,JÅ4,I?Æ +I2	ÇA,IÈ8I?ÉJÉJ*ÉJ< ÉI2	É
I#É I2	É"I#É#I2	É&I?É2I6É6I?É9I6É:I?É=JÉ?
J	Ê	JÊJ	ÊJÊJ*ÊJ!	Ê!J*Ê$J!	Ê%J*Ê(J< Ê*
J8Ê4J< Ê7J8Ê8J< Ê<
K	ËK	c                óŒ  — g }t           j        dk    r¥	 ddl}|                     |j        d¦  «        5 }|                     |d¦  «        \  }}|rAt           j                             |¦  «        r"|                     t          |¦  «        ¦  «         ddd¦  «         n# 1 swxY w Y   n# t          $ r Y nw xY w|                      ¦   «         D ]†}t          |¦  «        dz  dz  }|                     ¦   «         r||vr|                     |¦  «         t          |¦  «        dz  dz  }|                     ¦   «         r||vr|                     |¦  «         Œ‡|D ]î}	|	d	z  d
z  }
|
                     ¦   «         rÐ	 |
                     dd¬¦  «        }t          |¦  «        }t!          |	¦  «        |vr#|                     dt!          |	¦  «        ¦  «         |D ]a}t          |¦  «        }dD ]M}|d	z  dz  |z  }|                     ¦   «         r,|                      |¦  «        }|rt!          |¦  «        c c c S ŒNŒbŒÞ# t          $ r Y Œêw xY wŒïdS )u9   QuÃ©t Ä‘Æ°á»�ng dáº«n Steam vÃ  tá»‡p libraryfolders.vdf.rf   r   NzSoftware\Valve\SteamÚ	SteamPathzProgram Files (x86)ÚSteamzProgram FilesÚ	steamappszlibraryfolders.vdfrQ   rR   rS   )zPath of Exile 2ri   Úcommon)rk   r:   rl   ro   rm   rp   r,   rq   r   r   r=   Úget_available_drivesÚis_dirr9   rV   r   r	   Úinsertrr   )r)   Ú
steam_dirsrl   rz   rb   r}   ÚdÚdefault_steamÚdefault_steam_64Ús_dirÚvdf_filerY   Úlibrary_pathsÚlibÚlib_pathÚcandidate_nameÚ
poe_folderr~   s                     r   r_   z GamePathResolver._scan_steam_vdfÝ   s  € à!#ˆ
õ Œ7�dŠ?ˆ?ðØ���Ø—^’^ FÔ$<Ð>UÑVÔVð <ÐZ]Ø$*×$7Ò$7¸¸[Ñ$IÔ$I‘M�J Ø!ð <¥b¤g§m¢m°JÑ&?Ô&?ð <Ø"×)Ò)­$¨zÑ*:Ô*:Ñ;Ô;Ð;ð<ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <øøõ ð ð ð Ø�ðøøøð ×*Ò*Ñ,Ô,ð 	4ð 	4ˆAÝ  ™GœGÐ&;Ñ;¸gÑEˆMØ×#Ò#Ñ%Ô%ð 1¨-¸zÐ*IÐ*IØ×!Ò! -Ñ0Ô0Ð0Ý# A™wœw¨Ñ8¸7ÑBÐØ×&Ò&Ñ(Ô(ð 4Ð-=ÀZÐ-OÐ-OØ×!Ò!Ð"2Ñ3Ô3Ð3øð  ð 	ð 	ˆEØ˜{Ñ*Ð-AÑAˆHØ×ÒÑ!Ô!ð ðØ&×0Ò0¸'È(Ð0ÑSÔS�GÝ$=¸gÑ$FÔ$F�Må˜5‘z”z¨Ð6Ð6Ø%×,Ò,¨Qµ°E±
´
Ñ;Ô;Ð;à,ð 6ð 6˜Ý#'¨¡9¤9˜Ø.Rð 6ð 6˜NØ)1°KÑ)?À(Ñ)JÈ^Ñ)[˜JØ)×0Ò0Ñ2Ô2ð 6Ø(,×(=Ò(=¸jÑ(IÔ(I Ø#(ð !6Ý+.¨u©:¬:Ð$5Ð$5Ð$5Ð$5Ð$5Ð$5Ð$5øð6ð6øõ !ð ð ð Ø�Dðøøøð!ð& ˆtsN   ”B( ³ABÂB( ÂB Â B( Â#B Â$B( Â(
B5Â4B5Å4B9H3È0H3È3
I È?I c                óð   — |                       ¦   «         }|D ]^}t          |¦  «        }| j        D ]E}||z  }|                     ¦   «         r*|                      |¦  «        }|rt          |¦  «        c c S ŒFŒ_dS )uK   QuÃ©t danh má»¥c thÆ° má»¥c cÃ i Ä‘áº·t phá»• biáº¿n trÃªn má»�i á»• Ä‘Ä©a.N)rŒ   r   r!   r�   rr   r	   )r)   ÚdrivesÚdriveÚ
drive_rootÚsubÚ
target_dirr~   s          r   r`   z!GamePathResolver._scan_all_drives  s�   € à×*Ò*Ñ,Ô,ˆØð 	*ð 	*ˆEÝ˜e™œˆJØÔ+ð *ð *�Ø'¨#Ñ-�
Ø×$Ò$Ñ&Ô&ð *Ø ×1Ò1°*Ñ=Ô=�EØð *Ý" 5™zœzÐ)Ð)Ð)Ð)Ð)øð*ð ˆtr   Ú	directoryr   úOptional[Path]c                óx   — | j         D ]1}||z  }|                     ¦   «         r|                     ¦   «         c S Œ2dS )u<   TÃ¬m file thá»±c thi POE2 há»£p lá»‡ trong má»™t thÆ° má»¥c.N)r    r9   r&   )r)   r    Úexe_namer>   s       r   rr   z!GamePathResolver._find_exe_in_dir  sL   € àÔ.ð 	#ð 	#ˆHØ˜HÑ$ˆAØ�yŠy‰{Œ{ð #Ø—y’y‘{”{Ð"Ð"Ð"ð#àˆtr   r   c                óZ  — g }t           j        dk    rI	 ddl}|                     ¦   «         }d„ |                     d¦  «        D ¦   «         }n# t
          $ r Y nw xY w|sHt          j        D ];}|› d�}t           j         	                    |¦  «        r| 
                    |¦  «         Œ<|sdg}|S )uF   Láº¥y danh sÃ¡ch cÃ¡c á»• Ä‘Ä©a hiá»‡n cÃ³ trÃªn há»‡ thá»‘ng Windows.rf   r   Nc                óf   — g | ].}|                      ¦   «         ¯|                      d ¦  «        d z   ‘Œ/S )r   )rX   )r5   r�   s     r   r7   z9GamePathResolver.get_available_drives.<locals>.<listcomp>)  s9   € Ð^Ð^Ð^°1ÐTU×T[ÒT[ÑT]ÔT]Ð^˜!Ÿ'š' $™-œ-¨$Ñ.Ð^Ð^Ð^r   ú z:\zC:\)rk   r:   Úwin32apiÚGetLogicalDriveStringsÚsplitr=   ÚstringÚascii_uppercaser,   Úexistsr   )r)   r›   r§   Ú
raw_drivesÚletterÚ
root_drives         r   rŒ   z%GamePathResolver.get_available_drives"  sÖ   € àˆÝŒ7�dŠ?ˆ?ðØ���Ø%×<Ò<Ñ>Ô>�
Ø^Ð^¸
×8HÒ8HÈÑ8PÔ8PÐ^Ñ^Ô^��øÝð ð ð Ø�ðøøøàð 	.å Ô0ð .ð .�Ø &˜^˜^˜^�
Ý”7—>’> *Ñ-Ô-ð .Ø—M’M *Ñ-Ô-Ð-øØð 	Ø�XˆFØˆs   ”7A Á
AÁAc                ó  — 	 ddl }ddl m} d}|}|€=	 |                     ¦   «         }|                     ¦   «          d}n# t          $ r Y dS w xY wd}ddg}|                     |||¬	¦  «        }|r&	 |                     ¦   «          n# t          $ r Y nw xY w|rZ|                      |¦  «        rEt          t          |¦  «         
                    ¦   «         ¦  «        }	|                      |	¦  «         |	S n# t          $ r Y nw xY wdS )
uÆ   
        Táº§ng 4: Há»™p thoáº¡i GUI tÆ°Æ¡ng tÃ¡c ngÆ°á»�i dÃ¹ng chá»�n file thá»±c thi.
        Sá»­ dá»¥ng tkinter.filedialog.askopenfilename() vá»›i tiÃªu Ä‘á»� tiáº¿ng Viá»‡t rÃµ rÃ ng.
        r   N)Ú
filedialogFTu;   Chá»�n tá»‡p PathOfExile.exe hoáº·c PathOfExileSteam.exe...)zPath of Exile ExecutablezPathOfExile*.exe;*.exe)z	All Filesz*.*)ÚparentÚtitleÚ	filetypes)Útkinterr±   ÚTkÚwithdrawr=   ÚaskopenfilenameÚdestroyrA   r	   r   r&   Úsave_game_path)
r)   r²   Útkr±   Úowns_tkÚroot_windowr³   r´   ÚchosenÚ	norm_paths
             r   Úprompt_user_for_exez$GamePathResolver.prompt_user_for_exe6  s~  € ð
%	Ø Ð Ð Ð Ø*Ð*Ð*Ð*Ð*Ð*àˆGØ ˆKØÐ"ð Ø"$§%¢%¡'¤'�KØ×(Ò(Ñ*Ô*Ð*Ø"�G�GøÝ ð  ð  ð  Ø˜4˜4ð øøøð RˆEàFØ$ðˆIð
  ×/Ò/Ø"ØØ#ð 0ñ ô ˆFð ð ðØ×'Ò'Ñ)Ô)Ð)Ð)øÝ ð ð ð Ø�Dðøøøð ð !˜$×/Ò/°Ñ7Ô7ð !Ý¥ V¡¤× 4Ò 4Ñ 6Ô 6Ñ7Ô7�	Ø×#Ò# IÑ.Ô.Ð.Ø Ð øøÝð 	ð 	ð 	ØˆDð	øøøàˆtsV   ‚C2 “*> ½C2 ¾
AÁC2 ÁAÁ#C2 Á0B ÂC2 Â
BÂC2 ÂBÂAC2 Ã2
C?Ã>C?ú
str | Pathc                ó‚  — t          |¦  «                             ¦   «         }|                      |¦  «        sdS t          |¦  «                             dd¦  «        }	 | j        j                             dd¬¦  «         | j                             ¦   «         ru| j         	                    dd¬¦  «        }d	|v rKt          j        d
|¦  «        rt          j        dd|› d�|¦  «        }n+|                     d	d|› d�¦  «        }nd|› d�|z   }nd|› d�}| j                             |d¬¦  «         dS # t          $ r Y dS w xY w)u”   
        LÆ°u Ä‘Æ°á»�ng dáº«n game há»£p lá»‡ vÃ o tá»‡p config.toml.
        Báº£o toÃ n cÃ¡c thiáº¿t láº­p khÃ¡c trong tá»‡p cáº¥u hÃ¬nh.
        Fr   r   T)r(   Úexist_okrQ   rR   rS   z[game]zexecutable_path\s*=z'executable_path\s*=\s*["\'][^"\']*["\']zexecutable_path = "ú"z[game]
executable_path = "z"

u^   # Poe2VisualTool Configuration
# Bá»‘i cáº£nh: 13/09/2026 (Rule 2)

[game]
executable_path = "z­"
launch_arguments = ""

[visual]
zoom_cap = 8.0
enable_zoom = true
disable_fog = true
auto_reveal = true
wheel_drive = true

[inspector]
enabled = true
dwell_time_ms = 180
)rT   )r   r&   rA   r	   r   r"   r²   Úmkdirr9   rV   r   rW   rž   Ú
write_textr=   )r)   r,   r>   Úescaped_pathrY   Únew_contents         r   rº   zGamePathResolver.save_game_pathc  s’  € õ
 �‰JŒJ×ÒÑ Ô ˆØ×$Ò$ QÑ'Ô'ð 	Ø�5å˜1‘v”v—~’~ d¨FÑ3Ô3ˆð'	ØÔÔ#×)Ò)°$ÀÐ)ÑFÔFÐFØÔ×'Ò'Ñ)Ô)ð  ØÔ*×4Ò4¸gÈhÐ4ÑWÔW�Ø˜wÐ&Ð&Ý”yÐ!7¸ÑAÔAð 
Ý&(¤fØFØA°,ÐAÐAÐAØ#ñ'ô '˜˜ð '.§o¢oØ$ØI¸,ÐIÐIÐIñ'ô '˜˜ð
 #TÀÐ"SÐ"SÐ"SÐV]Ñ"]�K�Kð,ð +7ð,ð ,ð ,ð ð" Ô×'Ò'¨¸gÐ'ÑFÔFÐFØ�4øÝð 	ð 	ð 	Ø�5�5ð	øøøs   ÁCD0 Ä0
D>Ä=D>FÚallow_promptc                óð   — |                       ¦   «         }|r|S |                      ¦   «         }|r|S |                      ¦   «         }|r|                      |¦  «         |S |r|                      |¬¦  «        S dS )uñ   
        Quy trÃ¬nh phÃ¢n giáº£i tá»± Ä‘á»™ng 4 táº§ng:
        1. Tiáº¿n trÃ¬nh Ä‘ang cháº¡y
        2. Cáº¥u hÃ¬nh config.toml
        3. QuÃ©t há»‡ thá»‘ng & Steam
        4. Há»�i ngÆ°á»�i dÃ¹ng qua GUI (náº¿u allow_prompt=True)
        )r²   N)rO   r\   rd   rº   rÀ   )r)   rÉ   r²   r,   s       r   r&   zGamePathResolver.resolve—  sœ   € ð ×0Ò0Ñ2Ô2ˆØð 	ØˆKð ×'Ò'Ñ)Ô)ˆØð 	ØˆKð ×1Ò1Ñ3Ô3ˆØð 	Ø×Ò Ñ%Ô%Ð%ØˆKð ð 	;Ø×+Ò+°6Ð+Ñ:Ô:Ð:àˆtr   )N)r"   r#   )r,   r-   r
   r.   )r
   rB   )r    r   r
   r¡   )r
   r   )r,   rÁ   r
   r.   )FN)rÉ   r.   r
   rB   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    Ú__annotations__r!   r+   rA   rO   r\   rd   r^   r_   r`   rr   rŒ   rÀ   rº   r&   r1   r   r   r   r   +   sn  € € € € € € ðð ð*Ðð ð ð ñ ð(€Oð ð ð ñ ð$4ð 4ð 4ð 4ð 4ðð ð ð ð ð ð ð ð&ð ð ð ð&ð ð ð ð*=ð =ð =ð =ð~.ð .ð .ð .ð`ð ð ð ðð ð ð ðð ð ð ð(+ð +ð +ð +ð +ðZ2ð 2ð 2ð 2ðhð ð ð ð ð ð r   r   )r   r	   r
   r   )rÎ   Ú
__future__r   rk   r   rª   ÚsysÚpathlibr   Útypingr   r   r   rF   r   r   r1   r   r   ú<module>rÔ      sÐ   ðð
ð 
ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à €€€ðð ð ð ð$Hð Hð Hð Hð Hñ Hô Hð Hð Hð Hr   