§
    Î©jSÐ  ã            
       óF  — d Z ddlZddlZddlZddlmZmZ ddlmZm	Z	  e
ej        d¦  «        rej                             d¬¦  «         ej                             dej                             ej                             ej                             e¦  «        d¦  «        ¦  «        ¦  «         dd	lmZ dd
lmZ d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&d„ Z'd„ Z(d„ Z)d„ Z*d„ Z+d „ Z,d!„ Z-d"„ Z.d#„ Z/d$„ Z0e1d%k    �r e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e¦   «           e ¦   «           e!¦   «           e"¦   «           e#¦   «           e$¦   «           e%¦   «           e&¦   «           e'¦   «           e(¦   «           e)¦   «           e*¦   «           e+¦   «           e,¦   «           e-¦   «           e.¦   «           e/¦   «           e0¦   «           e2d&¦  «         dS dS )'uV  
Unit Test cho Optical Health Globe Sensor (OpticalHPSensor)
Kiá»ƒm tra tÃ­nh toÃ¡n ROI theo tá»‰ lá»‡ phÃ¢n giáº£i mÃ n hÃ¬nh, logic phÃ¢n tÃ­ch mÃ u Ä‘á»�,
ká»¹ thuáº­t Multi-slit sampling loáº¡i trá»« text sá»‘ mÃ¡u, giáº£i phÃ³ng an toÃ n GDI handles,
tá»‘c Ä‘á»™ thá»±c thi < 2ms vÃ  tÃ­ch há»£p vá»›i CoreController / ControlCenterApp.
é    N)Ú	MagicMockÚpatch)ÚImageÚ	ImageDrawÚreconfigurezutf-8)Úencodingú..)ÚCoreController©ÚOpticalHPSensorc                  óÞ   — t          ¦   «         } | j        dk    sJ ‚t          d¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚dS )	u9   Kiá»ƒm tra giÃ¡ trá»‹ khá»Ÿi táº¡o cá»§a OpticalHPSensor.r   é½   ©Úexpected_max_hpçš™™™™™¹?çÍÌÌÌÌÌì?é   ç        N)r   r   Útop_margin_ratioÚbottom_margin_ratioÚslit_offsetÚ
last_ratio)Úsensor_defaultÚsensors     ú4C:\Projects\AutoPOE2\tests\test_optical_hp_sensor.pyÚ"test_optical_sensor_initializationr      s›   € å$Ñ&Ô&€NØÔ)¨QÒ.Ð.Ð.Ð.å¨SÐ1Ñ1Ô1€FØÔ! SÒ(Ð(Ð(Ð(ØÔ" dÒ*Ð*Ð*Ð*ØÔ%¨Ò-Ð-Ð-Ð-ØÔ Ò#Ð#Ð#Ð#ØÔ Ò#Ð#Ð#Ð#Ð#Ð#ó    c                  ór  — t          j        ddd¦  «        du sJ ‚t          j        ddd¦  «        du sJ ‚t          j        ddd¦  «        du sJ ‚t          j        d	d	d	¦  «        du sJ ‚t          j        dd
d¦  «        du sJ ‚t          j        ddd¦  «        du sJ ‚t          j        ddd¦  «        du sJ ‚dS )uq   Kiá»ƒm tra Ä‘iá»�u kiá»‡n nháº­n diá»‡n pixel mÃ u Ä‘á»� cá»§a cháº¥t lá»�ng mÃ¡u: R > 110, R > 1.5*G, R > 1.5*B.éÜ   é   Téx   éF   éd   é   Féÿ   éÈ   é2   é   N)r   Úis_red_pixel© r   r   Útest_is_red_pixelr+   %   sê   € õ Ô'¨¨R°Ñ4Ô4¸Ð<Ð<Ð<Ð<åÔ'¨¨R°Ñ4Ô4¸Ð<Ð<Ð<Ð<åÔ'¨¨R°Ñ4Ô4¸Ð=Ð=Ð=Ð=åÔ'¨¨S°#Ñ6Ô6¸%Ð?Ð?Ð?Ð?åÔ'¨¨S°"Ñ5Ô5¸Ð>Ð>Ð>Ð>åÔ'¨¨C°Ñ5Ô5¸Ð>Ð>Ð>Ð>åÔ'¨¨B°Ñ3Ô3°uÐ<Ð<Ð<Ð<Ð<Ð<r   c                  óè  — t          ¦   «         } t          dd¬¦  «        5  |                      d¦  «        \  }}}}|dk    sJ ‚|dk    sJ ‚|dk    sJ ‚|dk    sJ ‚	 ddd¦  «         n# 1 swxY w Y   t          dd	¬¦  «        5  |                      d¦  «        \  }}}}d
}|t          d|z  ¦  «        k    sJ ‚|t          d|z  ¦  «        k    sJ ‚|t          d|z  ¦  «        k    sJ ‚|dt          d|z  ¦  «        z
  k    sJ ‚	 ddd¦  «         n# 1 swxY w Y   t          dd¬¦  «        5  |                      d¦  «        \  }}}}|dk    sJ ‚|dk    sJ ‚|dk    sJ ‚|dk    sJ ‚	 ddd¦  «         n# 1 swxY w Y   t          dt	          d¦  «        ¬¦  «        5  |                      d¦  «        \  }}}}|dk    sJ ‚|dk    sJ ‚|dk    sJ ‚|dk    sJ ‚	 ddd¦  «         dS # 1 swxY w Y   dS )ug   Kiá»ƒm tra tÃ­nh toÃ¡n tá»�a Ä‘á»™ vÃ  kÃ­ch thÆ°á»›c ROI theo tá»‰ lá»‡ mÃ n hÃ¬nh (1080p, 1440p, 4K).zwin32gui.GetClientRect)r   r   i€  i8  ©Úreturn_valueé90  é–   r   éŽ  N)r   r   é 
  é   gUUUUUUõ?r3   éª   )r   r   i   ip  i,  r    i  ÚFailed©Úside_effect)r   r   Úget_globe_roiÚintÚ	Exception)r   ÚrxÚryÚrwÚrhÚ
scale_1440s         r   Útest_get_globe_roi_scalingr@   7   so  € åÑÔ€Fõ 
Ð'Ð6HÐ	IÑ	IÔ	Ið  ð  Ø×-Ò-¨eÑ4Ô4‰ˆˆB��BØ�SŠyˆyˆyˆyØ�SŠyˆyˆyˆyØ�RŠxˆxˆxˆxØ�ZÒÐÐÐÐð ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  õ 
Ð'Ð6HÐ	IÑ	IÔ	Ið 2ð 2Ø×-Ò-¨eÑ4Ô4‰ˆˆB��BØ"ˆ
Ø•S˜˜zÑ)Ñ*Ô*Ò*Ð*Ð*Ð*Ø•S˜˜zÑ)Ñ*Ô*Ò*Ð*Ð*Ð*Ø•S˜˜j™Ñ)Ô)Ò)Ð)Ð)Ð)Ø�T�C  jÑ 0Ñ1Ô1Ñ1Ò1Ð1Ð1Ð1Ð1ð2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2õ 
Ð'Ð6HÐ	IÑ	IÔ	Ið  ð  Ø×-Ò-¨eÑ4Ô4‰ˆˆB��BØ�SŠyˆyˆyˆyØ�SŠyˆyˆyˆyØ�RŠxˆxˆxˆxØ�ZÒÐÐÐÐð ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  õ 
Ð'µY¸xÑ5HÔ5HÐ	IÑ	IÔ	Ið ð Ø×-Ò-¨eÑ4Ô4‰ˆˆB��BØ�SŠyˆyˆyˆyØ�SŠyˆyˆyˆyØ�RŠxˆxˆxˆxØ�SŠyˆyˆyˆyˆyðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð sH    ;A(Á(A,Á/A,ÂB DÄDÄDÄ-;E5Å5E9Å<E9Æ;G'Ç'G+Ç.G+c                  óÖ  — t          d¬¦  «        } d\  }}t          |dz  ¦  «        }t          |dz  ¦  «        }||z
  dz   }t          j        d||fd¦  «        }t	          j        |¦  «        }|                     d	|||gd
¬¦  «         |                      |d¬¦  «        \  }}	}
|
dk    sJ ‚|dk    sJ ‚|	dk    sJ ‚t          j        d||fd¦  «        }|                      |d¬¦  «        \  }}	}
|
dk    sJ ‚|d	k    sJ ‚|	dk    sJ ‚t          j        d||fd¦  «        }t	          j        |¦  «        }|t          t          |dz  ¦  «        ¦  «        z
  dz   }|                     d	|||gd
¬¦  «         |                      |d¬¦  «        \  }}}t          |dz
  ¦  «        dk    sJ ‚t          |dz
  ¦  «        dk    sJ ‚t          j        d||fd¦  «        }t	          j        |¦  «        }|                     d	|||gd
¬¦  «         |                     g d¢d¬¦  «         |                      |d¬¦  «        \  }}}t          ||z
  ¦  «        dk    sJ ‚t          ||z
  ¦  «        dk    sJ ‚dS )uâ   
    Táº¡o áº£nh mÃ´ phá»�ng quáº£ cáº§u mÃ¡u á»Ÿ cÃ¡c má»©c 100%, 50%, 0% vÃ  trÆ°á»�ng há»£p chá»¯ sá»‘ mÃ¡u tráº¯ng '1234/1234'
    Ä‘Ã¨ lÃªn tÃ¢m quáº£ cáº§u Ä‘á»ƒ chá»©ng minh Multi-slit sampling khÃ´ng bá»‹ nhiá»…u.
    iÐ  r   ©r0   r0   r   r   é   ÚRGB)r   r   r$   r   )éÒ   r    r    )Úfillg      ð?r   ç      à?g{®Gáz”?éè  é(   )éD   éZ   éR   én   )r%   r%   r%   N)
r   r9   r   Únewr   ÚDrawÚ	rectangleÚanalyze_pil_imageÚroundÚabs)r   ÚwÚhÚy_startÚy_endÚ
total_spanÚimg_100Údraw_100ÚcurÚmhpÚratioÚimg_0Úimg_50_cleanÚdraw_50Úy_midÚ	cur_cleanÚ_Úratio_cleanÚimg_50_textÚ	draw_textÚcur_textÚ
ratio_texts                         r   Ú+test_multi_slit_sampling_and_text_rejectionri   ]   sÌ  € õ
 ¨TÐ2Ñ2Ô2€FØ�D€A€qÝ�!�d‘(‰mŒm€GÝ��D‘‰MŒM€EØ˜‘ 1Ñ$€Jõ Œi˜  1˜v |Ñ4Ô4€GÝŒ~˜gÑ&Ô&€HØ×Ò˜˜7 A uÐ-°MÐÑBÔBÐBØ×.Ò.¨wÈÐ.ÑMÔM�O€CˆˆeØ�CŠ<ˆ<ˆ<ˆ<Ø�$Š;ˆ;ˆ;ˆ;Ø�$Š;ˆ;ˆ;ˆ;õ ŒI�e˜a ˜V \Ñ2Ô2€EØ×.Ò.¨uÀdÐ.ÑKÔK�O€CˆˆeØ�CŠ<ˆ<ˆ<ˆ<Ø�!Š8ˆ8ˆ8ˆ8Ø�$Š;ˆ;ˆ;ˆ;õ ”9˜U Q¨ F¨LÑ9Ô9€LÝŒn˜\Ñ*Ô*€GØ•C�˜j¨4Ñ/Ñ0Ô0Ñ1Ô1Ñ1°AÑ5€EØ×Ò�q˜%  EÐ*°ÐÑ?Ô?Ð?Ø &× 8Ò 8¸ÐW[Ð 8Ñ \Ô \Ñ€Iˆq�+Ýˆ{˜TÑ!Ñ"Ô" dÒ*Ð*Ð*Ð*Ýˆy˜4ÑÑ Ô  BÒ&Ð&Ð&Ð&õ ”)˜E A q 6¨<Ñ8Ô8€KÝ”˜{Ñ+Ô+€IØ×Ò˜˜E 1 eÐ,°=ÐÑAÔAÐAà×ÒÐ)Ð)Ð)°ÐÑ@Ô@Ð@à$×6Ò6°{ÐTXÐ6ÑYÔYÑ€Hˆa�åˆz˜KÑ'Ñ(Ô(¨DÒ0Ð0Ð0Ð0Ýˆx˜)Ñ#Ñ$Ô$¨Ò*Ð*Ð*Ð*Ð*Ð*r   c                  ó  — t          d¬¦  «        } d\  }}t          g d¢||z  z  ¦  «        }|                      |||¦  «         g }t          d¦  «        D ]X}t	          j        ¦   «         }|                      |||¦  «         |                     t	          j        ¦   «         |z
  dz  ¦  «         ŒYt          |¦  «        t          |¦  «        z  }t          |¦  «        }t          d|d›d	|d›d
�¦  «         |dk     sJ d|d›d�¦   «         ‚dS )u_   Kiá»ƒm tra thá»�i gian thá»±c thi cá»§a thuáº­t toÃ¡n phÃ¢n tÃ­ch pixel: báº¯t buá»™c < 2.0 ms.rH   r   rB   )r!   rI   rE   r   r$   g     @�@z#  -> Optical Sensor Benchmark: avg=z.3fzms, min=Úmsg       @zAnalysis took z"ms, which exceeds the 2.0ms limit!N)r   ÚbytesÚanalyze_pixelsÚrangeÚtimeÚperf_counterÚappendÚsumÚlenÚminÚprint)	r   rT   rU   Ú	raw_bytesÚtimesrc   Út0Úavg_timeÚmin_times	            r   Útest_performance_under_2msr{   Ž   s+  € å¨TÐ2Ñ2Ô2€Fà�D€A€qÝÐ'Ð'Ð'¨1¨q©5Ñ1Ñ2Ô2€Ið ×Ò˜!˜Q 	Ñ*Ô*Ð*ð €EÝ�2‰YŒYð :ð :ˆÝÔÑ Ô ˆØ×Ò˜a  IÑ.Ô.Ð.Ø�Š•dÔ'Ñ)Ô)¨BÑ.°&Ñ8Ñ9Ô9Ð9Ð9å�5‰zŒz�C ™JœJÑ&€HÝ�5‰zŒz€HÝ	Ð
V°Ð
VÐ
VÐ
VÀhÐ
VÐ
VÐ
VÐ
VÑWÔWÐWØ�cŠ>ˆ>ˆ>Ð\¨HÐ\Ð\Ð\Ð\‰>Œ>ˆ>ˆ>ˆ>r   c            	      ó  — t          ¦   «         } t          ¦   «         }t          ¦   «         }d}t          ¦   «         }t          ¦   «         }t          ¦   «         }d|j        _        ||j        _        ||j        _        ||j        _        ||j        _        t          d¦  «        |j	        _
        t          d|¦  «        5  t          d|¦  «        5  |                      dddd	d	¬
¦  «        }|�J ‚|j                             d¦  «         |j                             ¦   «          |j                             ¦   «          |j                             d|¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uÕ   
    Kiá»ƒm tra báº£o Ä‘áº£m an toÃ n tÃ i nguyÃªn GDI:
    Táº¥t cáº£ cÃ¡c handle DeleteObject, DeleteDC, ReleaseDC báº¯t buá»™c pháº£i Ä‘Æ°á»£c gá»�i
    ngay cáº£ khi quÃ¡ trÃ¬nh BitBlt xáº£y ra Exception.
    i4  ixV  zGDI BitBlt Failure Simulationz-src.assistant_tool.optical_hp_sensor.win32guiz,src.assistant_tool.optical_hp_sensor.win32uii'  r   r1   r0   )Úhwndr;   r<   r=   r>   N)r   r   Ú	GetHandler.   ÚGetDCÚCreateDCFromHandleÚCreateCompatibleDCÚCreateBitmapÚRuntimeErrorÚBitBltr7   r   Úcapture_roi_bytesÚDeleteObjectÚassert_called_once_withÚDeleteDCÚassert_called_onceÚ	ReleaseDC)r   Úmock_win32guiÚmock_win32uiÚmock_hwnd_dcÚmock_mfc_dcÚmock_save_dcÚmock_bitmapÚress           r   Útest_gdi_handles_cleanup_safetyr’   ¥   s  € õ ÑÔ€Få‘K”K€MÝ‘;”;€Là€LÝ‘+”+€KÝ‘;”;€LÝ‘+”+€KØ)/€KÔÔ&à'3€MÔÔ$Ø3>€LÔ#Ô0Ø2>€KÔ"Ô/Ø-8€LÔÔ*õ '3Ð3RÑ&SÔ&S€LÔÔ#å	Ð>ÀÑ	NÔ	Nð 	Lð 	LÝ	Ð=¸|Ñ	LÔ	Lð	Lð 	Là×&Ò&¨D°R¸CÀCÈCÐ&ÑPÔPˆØˆ{ˆ{ˆ{ð 	Ô"×:Ò:¸6ÑBÔBÐBØÔ×0Ò0Ñ2Ô2Ð2ØÔ×/Ò/Ñ1Ô1Ð1ØÔ×7Ò7¸¸lÑKÔKÐKð	Lð 	Lð 	Lñ 	Lô 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Løøøð 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Lñ 	Lô 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Løøøð 	Lð 	Lð 	Lð 	Lð 	Lð 	Ls7   Â<E7ÃBEÅE7ÅE#	Å#E7Å&E#	Å'E7Å7E;Å>E;c                  ól  — t          ¦   «         } |                      ddi¦  «        }d|v sJ ‚|                     d¦  «        }||dz            dk    sJ ‚|                      ddi¦  «        }d|v sJ ‚|                     d¦  «        }||dz            dk    sJ ‚|                      d	d	d
dœ¦  «        }d|vsJ ‚dS )uk   
    Kiá»ƒm tra truyá»�n cá»� --max-hp <N> trong CoreController vá»›i cáº£ max_hp vÃ  expected_max_hp.
    r   iÜ  ú--max-hprC   Ú1500Úmax_hpi˜  Ú2200r   F)r–   r   Úoptical_inject_max_hpN)r
   Ú	build_cmdÚindex)ÚccÚcmd1Úidx1Úcmd2Úidx2Úcmd3s         r   Ú)test_core_controller_and_gui_max_hp_flagsr¡   Ê   së   € õ 
Ñ	Ô	€Bð �<Š<Ð*¨DÐ1Ñ2Ô2€DØ˜ÐÐÐÐØ�:Š:�jÑ!Ô!€DØ��q‘Œ>˜VÒ#Ð#Ð#Ð#ð �<Š<˜ 4Ð(Ñ)Ô)€DØ˜ÐÐÐÐØ�:Š:�jÑ!Ô!€DØ��q‘Œ>˜VÒ#Ð#Ð#Ð#ð �<Š< 1¸ÐUZÐ[Ð[Ñ\Ô\€DØ˜TÐ!Ð!Ð!Ð!Ð!Ð!r   c                  óP  — ddl m}  t          j        | d¦  «        5  t          j        | dddi¬¦  «        5   | ¦   «         }	 |                     ¦   «          t          |d¦  «        sJ ‚|j        €J ‚t          |d
¦  «        sJ ‚t          |d¦  «        sJ ‚|j        |j        k    sJ ‚|j         	                    dd¦  «         |j         
                    dd¦  «         |                     ¦   «         }|                     d¦  «        dk    sJ ‚|                     d¦  «        dk    sJ ‚t          |d¦  «        sJ ‚|j                             d¦  «        }d|v sJ ‚ddlm}m}  |d |dddd¬¦  «        ¬¦  «        }|                     |¦  «         |                     ¦   «          |j                             d¦  «        }d|v sd|v sJ ‚|                     ¦   «          n# |                     ¦   «          w xY w	 d	d	d	¦  «         n# 1 swxY w Y   d	d	d	¦  «         d	S # 1 swxY w Y   d	S )uG   Kiá»ƒm tra tÃ­ch há»£p OpticalHPSensor vÃ  badge vÃ o ControlCenterApp.r   ©ÚControlCenterAppÚ_save_user_settingsÚ_load_user_settingsr   ÚAutor-   Úoptical_sensorNÚentry_expected_max_hpÚentry_max_hpÚendÚ1850i:  r–   Úlbl_hp_sensor_badgeÚtextz
HP Sensor:©ÚCoreTelemetrySnapshotÚPlayerTelemetryTr0   é´   r#   ©Ú
current_hpr–   Úcurrent_manaÚmax_mana©Ú	is_onlineÚplayerú
MEMORY RPMõ   Lá»†CH)Ú!src.assistant_tool.control_centerr¤   r   ÚobjectÚupdateÚhasattrr¨   r©   rª   ÚdeleteÚinsertÚ_collect_configÚgetr­   ÚcgetÚ"src.assistant_tool.core_shm_bridger°   r±   Ú_on_telemetry_snapshotÚ
on_closing)r¤   ÚappÚcfgÚ
badge_textr°   r±   ÚsnapÚbadges           r   Ú2test_control_center_optical_sensor_gui_integrationrÍ   á   s  € àBÐBÐBÐBÐBÐBå	ŒÐ&Ð(=Ñ	>Ô	>ð &ð &Ý	ŒÐ&Ð(=ÐM^Ð`fÐLgÐ	hÑ	hÔ	hð&ð &àÐÑ Ô ˆð#	Ø�JŠJ‰LŒLˆLõ ˜3Ð 0Ñ1Ô1Ð1Ð1Ð1ØÔ%Ð1Ð1Ð1õ ˜3Ð 7Ñ8Ô8Ð8Ð8Ð8Ý˜3 Ñ/Ô/Ð/Ð/Ð/ØÔ,°Ô0@Ò@Ð@Ð@Ð@àÔ%×,Ò,¨Q°Ñ6Ô6Ð6ØÔ%×,Ò,¨Q°Ñ7Ô7Ð7à×%Ò%Ñ'Ô'ˆCØ—7’7Ð,Ñ-Ô-°Ò5Ð5Ð5Ð5Ø—7’7˜8Ñ$Ô$¨Ò,Ð,Ð,Ð,õ ˜3Ð 5Ñ6Ô6Ð6Ð6Ð6ØÔ0×5Ò5°fÑ=Ô=ˆJØ :Ð-Ð-Ð-Ð-ð bÐaÐaÐaÐaÐaÐaÐaØ(Ð(ØØ&�°#¸cÐPSÐ^aÐbÑbÔbðñ ô ˆDð ×&Ò& tÑ,Ô,Ð,Ø�JŠJ‰LŒLˆLØÔ+×0Ò0°Ñ8Ô8ˆEØ 5Ð(Ð(¨H¸Ð,=Ð,=Ð,=Ð=à�NŠNÑÔÐÐøˆC�NŠNÑÔÐÐøøøÐðM&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð &ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &ð &ð &sM   œH¶HÁFGÇHÇG3Ç3HÇ7HÈH	ÈHÈ
H	ÈHÈHÈ"Hc                  ó¼  — ddl m}   | ¦   «         }|€|�J ‚t          d¬¦  «        }|j        dk    sJ ‚|j        dk    sJ ‚t          dgdz  ¦  «        }t          j        |¦  «        d	u sJ ‚t          j        d¦  «        d	u sJ ‚t          dgdz  ¦  «        }d
|d<   d
|d<   t          j        t          |¦  «        ¦  «        du sJ ‚t          g d¢dz  ¦  «        }t          j	        |dd¬¦  «        5  t          j	        |dd¬¦  «        5  t          j	        |d|¬¦  «        5  t          j	        |d|¬¦  «        5 }| 
                    dd¬¦  «        \  }}}	|                     ddddd¦  «         |dk    sJ ‚|dk    sJ ‚	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )u¹   
    Kiá»ƒm tra gáº¯n Desktop tÆ°Æ¡ng tÃ¡c vÃ  cÆ¡ cháº¿ fallback PrintWindow vá»›i PW_RENDERFULLCONTENT
    khi BitBlt tráº£ vá»� áº£nh Ä‘en hoáº·c khi á»©ng dá»¥ng cháº¡y ngáº§m.
    r   )Úattach_to_default_desktopNéë  r   é   rC   i�_ Tr&   é@   r#   F)r!   r    r   r   iäW  Úfind_poe2_windowr/   r-   r8   )r   r1   r0   r0   r…   Úcapture_roi_printwindow)r}   r   r   r1   r0   )Ú$src.assistant_tool.optical_hp_sensorrÏ   r   ÚPW_RENDERFULLCONTENTÚPW_CLIENTONLYrl   Úis_all_blackÚ	bytearrayr   r½   Úread_hpr‡   )
rÏ   Údeskr   Ú	black_bufÚnon_black_bufÚmock_pw_bytesÚmock_pwr[   r\   r]   s
             r   Ú0test_desktop_attachment_and_printwindow_fallbackrà     s=  € ð
 OÐNÐNÐNÐNÐNð %Ð$Ñ&Ô&€DØÐ˜t˜|˜|Ð+å¨SÐ1Ñ1Ô1€FØÔ&¨!Ò+Ð+Ð+Ð+ØÔ 1Ò$Ð$Ð$Ð$õ �q�c˜]Ñ+Ñ,Ô,€IÝÔ'¨	Ñ2Ô2°dÐ:Ð:Ð:Ð:ÝÔ'¨Ñ-Ô-°Ð5Ð5Ð5Ð5Ý˜q˜c ]Ñ3Ñ4Ô4€MØ€M�"ÑØ€M�#ÑÝÔ'­¨mÑ(<Ô(<Ñ=Ô=ÀÐFÐFÐFÐFõ Ð+Ð+Ð+¨yÑ9Ñ:Ô:€MÝ	Œ�fÐ0¸uÐ	EÑ	EÔ	Eð ð Ý	Œ�f˜oÐ<OÐ	PÑ	PÔ	Pðð å	Œ�fÐ1À	Ð	JÑ	JÔ	Jðð õ 
Œ�fÐ7ÀmÐ	TÑ	TÔ	Tðð Y`Ø Ÿ.š.¨eÀS˜.ÑIÔI‰ˆˆS�%Ø×'Ò'¨¨r°3¸¸SÑAÔAÐAØ�cŠzˆzˆzˆzØ�QŠwˆwˆwˆwˆwðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   Ã1GÄ	F9Ä!F"Ä9AF	Å?F"ÆFÆF"ÆFÆF"ÆF9Æ"F&Æ&F9Æ)F&Æ*F9Æ-GÆ9F=	Æ=GÇ F=	ÇGÇGÇGc                  óÎ  — ddl m}  ddlm}m} t          j        | d¦  «        5  t          j        | dddi¬¦  «        5   | ¦   «         }	 |                     ¦   «          |                     ¦   «         }| 	                    d¦  «        dk    sJ ‚| 	                    d	¦  «        dk    sJ ‚ |d
 |dddd¬¦  «        ¬¦  «        }| 
                    |¦  «         |                     ¦   «          |j                             d¦  «        }|j                             d¦  «        }d|v sJ ‚d|vsJ ‚d|v sd|v sJ ‚d|v sd|v sJ ‚ |d
 |dddd¬¦  «        ¬¦  «        }| 
                    |¦  «         |                     ¦   «          |j                             d¦  «        }	|j                             d¦  «        }
d|	v sJ ‚d|	v sJ ‚d|
v sJ ‚|j                             dd¦  «         |j                             dd¦  «         |                     ¦   «          |                     ¦   «         }| 	                    d¦  «        dk    sJ ‚| 	                    d	¦  «        dk    sJ ‚ |d
 |dddd¬¦  «        ¬¦  «        }| 
                    |¦  «         |                     ¦   «          |j                             d¦  «        }|j                             d¦  «        }d|v sJ ‚d|v sd|v sJ ‚d|v sd|v sJ ‚ |d
 |dddd¬¦  «        ¬¦  «        }| 
                    |¦  «         |                     ¦   «          |j                             d¦  «        }|j                             d¦  «        }d|v sJ ‚d|vsJ ‚d|v sd|v sJ ‚t%          ¦   «         }|                     dd i¦  «        }d!|vsJ ‚|                     dd d"œ¦  «        }d!|vsJ ‚|                     ddi¦  «        }d!|v sJ ‚|                     d!¦  «        }||d#z            dk    sJ ‚	 |                     ¦   «          n# |                     ¦   «          w xY w	 d$d$d$¦  «         n# 1 swxY w Y   d$d$d$¦  «         d$S # 1 swxY w Y   d$S )%u  
    Kiá»ƒm tra xá»­ lÃ½ cÃ¡c trÆ°á»�ng há»£p sá»‘ rÃ¡c tá»« Shared Memory (2/250, 125/0, 2/256):
    - Máº·c Ä‘á»‹nh Auto-Detect: Zero User Input, max_hp Ä‘Æ°á»£c game cáº­p nháº­t tá»± Ä‘á»™ng.
      Chá»‰ khi max_hp <= 0 má»›i Ä‘Ã¡nh dáº¥u UNVERIFIED. Khi max_hp > 0 thÃ¬ VERIFIED (AUTO-DETECTED).
    - Khi ngÆ°á»�i dÃ¹ng chá»§ Ä‘á»™ng gÃµ sá»‘ ghi Ä‘Ã¨ (Manual Override): Náº¿u max_hp != expected_max_hp -> UNVERIFIED.
    - CoreController khÃ´ng truyá»�n --max-hp á»Ÿ cháº¿ Ä‘á»™ Auto, chá»‰ truyá»�n khi cÃ³ Manual Override > 0.
    r   r£   r¯   r¥   r¦   r   r§   r-   r–   TéÂ  rÐ   r#   r³   r·   r®   z	450 / 491Ú
UNVERIFIEDzAUTO-DETECTEDr»   rº   é}   r'   z125 / 0r«   Ú491rÑ   éú   z2 / 250ÚVERIFIEDr˜   Fr”   ©r   r˜   rC   N)r¼   r¤   rÅ   r°   r±   r   r½   r¾   rÂ   rÃ   rÆ   Úlbl_hprÄ   r­   rª   rÀ   rÁ   Ú_on_expected_hp_changedr
   r™   rš   rÇ   )r¤   r°   r±   rÈ   Úcfg_defaultÚsnap_auto_validÚhp_text_autoÚbadge_text_autoÚsnap_garbage_zeroÚhp_text_zeroÚbadge_text_zeroÚ
cfg_manualÚsnap_garbage_250Úhp_text_250Úbadge_text_250Úsnap_verifiedÚ
hp_text_okÚbadge_text_okr›   Úcmd_autoÚcmd_auto_explicitÚcmd_overrideÚidxs                          r   Ú3test_control_center_shm_unverified_mismatch_warningrý   2  s:  € ð CÐBÐBÐBÐBÐBØYÐYÐYÐYÐYÐYÐYÐYå	ŒÐ&Ð(=Ñ	>Ô	>ð Zð ZÝ	ŒÐ&Ð(=ÐM^Ð`fÐLgÐ	hÑ	hÔ	hðZð ZàÐÑ Ô ˆðW	Ø�JŠJ‰LŒLˆLð ×-Ò-Ñ/Ô/ˆKØ—?’?Ð#4Ñ5Ô5¸Ò:Ð:Ð:Ð:Ø—?’? 8Ñ,Ô,°Ò1Ð1Ð1Ð1ð 4Ð3ØØ&�°#¸cÐPSÐ^aÐbÑbÔbðñ ô ˆOð ×&Ò& Ñ7Ô7Ð7Ø�JŠJ‰LŒLˆLàœ:Ÿ?š?¨6Ñ2Ô2ˆLØ!Ô5×:Ò:¸6ÑBÔBˆOØ ,Ð.Ð.Ð.Ð.Ø |Ð3Ð3Ð3Ð3Ø" oÐ5Ð5¸À_Ð9TÐ9TÐ9TÐTØ ?Ð2Ð2°hÀ/Ð6QÐ6QÐ6QÐQð !6Ð 5ØØ&�°#¸aÈbÐ[^Ð_Ñ_Ô_ð!ñ !ô !Ðð ×&Ò&Ð'8Ñ9Ô9Ð9Ø�JŠJ‰LŒLˆLàœ:Ÿ?š?¨6Ñ2Ô2ˆLØ!Ô5×:Ò:¸6ÑBÔBˆOØ Ð,Ð,Ð,Ð,Ø <Ð/Ð/Ð/Ð/Ø ?Ð2Ð2Ð2Ð2ð Ô×#Ò# A uÑ-Ô-Ð-ØÔ×#Ò# A uÑ-Ô-Ð-Ø×'Ò'Ñ)Ô)Ð)à×,Ò,Ñ.Ô.ˆJØ—>’>Ð"3Ñ4Ô4¸Ò;Ð;Ð;Ð;Ø—>’> (Ñ+Ô+¨sÒ2Ð2Ð2Ð2ð  5Ð4ØØ&�°!¸CÈbÐ[^Ð_Ñ_Ô_ð ñ  ô  Ðð ×&Ò&Ð'7Ñ8Ô8Ð8Ø�JŠJ‰LŒLˆLàœ*Ÿ/š/¨&Ñ1Ô1ˆKØ Ô4×9Ò9¸&ÑAÔAˆNØ Ð+Ð+Ð+Ð+Ø ;Ð.Ð.°(¸kÐ2IÐ2IÐ2IÐIØ >Ð1Ð1°XÀÐ5OÐ5OÐ5OÐOð 2Ð1ØØ&�°#¸cÐPSÐ^aÐbÑbÔbðñ ô ˆMð ×&Ò& }Ñ5Ô5Ð5Ø�JŠJ‰LŒLˆLàœŸš¨Ñ0Ô0ˆJØÔ3×8Ò8¸Ñ@Ô@ˆMØ *Ð,Ð,Ð,Ð,Ø zÐ1Ð1Ð1Ð1Ø Ð.Ð.°(¸mÐ2KÐ2KÐ2KÐKõ  Ñ!Ô!ˆBØ—|’|Ð%<¸eÐ$DÑEÔEˆHØ XÐ-Ð-Ð-Ð-à "§¢ÀÐbgÐ-hÐ-hÑ iÔ iÐØÐ%6Ð6Ð6Ð6Ð6àŸ<š<Ð):¸CÐ(@ÑAÔAˆLØ Ð-Ð-Ð-Ð-Ø×$Ò$ ZÑ0Ô0ˆCØ  a¡Ô(¨EÒ1Ð1Ð1Ð1Ð1à�NŠNÑÔÐÐøˆC�NŠNÑÔÐÐøøøÐðuZð Zð Zñ Zô Zð Zð Zð Zð Zð Zð Zøøøð Zð Zð Zð Zð Zð Zð Zñ Zô Zð Zð Zð Zð Zð Zð Zð Zøøøð Zð Zð Zð Zð Zð ZsM   ¤Q¾QÁ
N<PÐQÐP2Ð2QÐ6QÑQ	ÑQÑ	Q	Ñ
QÑQÑ!Qc                  óà  — t          ¦   «         } d}t          j        |¦  «        \  }}}|dk    sJ ‚|dk    sJ ‚|dk    sJ ‚|                      |¬¦  «        }|j        du sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        d	k    sJ ‚|j        d
k    sJ ‚|j        dk    sJ ‚|j	        dk    sJ ‚t          |j        dz
  ¦  «        dk     sJ ‚t          j        d¦  «        \  }}d|cxk    rdk    sn J ‚d|cxk    rdk    sn J ‚t          j        ddd
¦  «        du sJ ‚t          j        d
dd¦  «        du sJ ‚t          j        ddd¦  «        du sJ ‚t          j        d
dd¦  «        du sJ ‚dS )u£   
    Kiá»ƒm tra nháº­n diá»‡n text Life: 495/503, Shield: 105/200, Mana: 344/344
    vÃ  hÃ m Æ°á»›c tÃ­nh sinh tá»“n theo cáº¥p Ä‘á»™ nhÃ¢n váº­t trong POE2.
    z+Life: 495/503
Shield: 105/200
Mana: 344/344)éï  é÷  )éi   r&   )éX  r  ©Ú	mock_textTrÿ   r   r  r&   r  çÚLŸ±µ}ï?gü©ñÒMbP?é   i�  iX  ræ   râ   r$   rI   r    Fr   N)r   Úparse_vitals_textÚdetect_vitals_from_screenÚis_detectedr´   r–   Úcurrent_shieldÚ
max_shieldrµ   r¶   rS   Úhp_ratioÚestimate_vitals_from_levelÚis_blue_pixelÚis_text_pixel)r   Úraw_textÚhpÚesÚmanaÚvitalsÚest_hpÚest_manas           r   Ú/test_optical_vitals_text_parsing_and_estimationr  š  s  € õ
 ÑÔ€Fð ?€HÝ"Ô4°XÑ>Ô>�L€BˆˆDà�ÒÐÐÐØ�ÒÐÐÐØ�:ÒÐÐÐð ×-Ò-¸Ð-ÑAÔA€FØÔ Ð%Ð%Ð%Ð%ØÔ Ò#Ð#Ð#Ð#ØŒ=˜CÒÐÐÐØÔ  CÒ'Ð'Ð'Ð'ØÔ Ò#Ð#Ð#Ð#ØÔ #Ò%Ð%Ð%Ð%ØŒ?˜cÒ!Ð!Ð!Ð!ÝˆvŒ +Ñ.Ñ/Ô/°%Ò7Ð7Ð7Ð7õ 'ÔAÀ"ÑEÔEÑ€FˆHØ�&ÐÐÒÐ˜CÒÐÐÐÐÐØ�(Ð!Ð!Ò!Ð!˜cÒ!Ð!Ð!Ð!Ð!Ð!õ Ô(¨¨R°Ñ5Ô5¸Ð=Ð=Ð=Ð=ÝÔ(¨¨b°"Ñ5Ô5¸Ð>Ð>Ð>Ð>õ Ô(¨¨c°3Ñ7Ô7¸4Ð?Ð?Ð?Ð?ÝÔ(¨¨b°"Ñ5Ô5¸Ð>Ð>Ð>Ð>Ð>Ð>r   c                  ó  — t          ¦   «         } |                      ddddd¬¦  «        \  }}|du sJ ‚d|v rd|v sJ ‚|                      ddd	d
d¬¦  «        \  }}|du sJ ‚d|v sJ ‚|                      ddddd¬¦  «        \  }}|du sJ ‚dS )u  
    TÃ�I HIá»†N VÃ€ KHáº®C PHá»¤C Lá»–I THá»°C Táº¾ TRÃŠN MÃ€N HÃŒNH Cá»¦A USER:
    C++ Core báº¯t nháº§m Ã´ nhá»› rÃ¡c 778/778 trong khi mÃ n hÃ¬nh lÃ  495/503.
    HÃ m check_memory_discrepancy pháº£i phÃ¡t hiá»‡n chÃ­nh xÃ¡c sá»± lá»‡ch láº¡c nÃ y!
    é
  rÿ   r   r  )Ú
memory_curÚ
memory_maxÚoptical_curÚoptical_maxÚoptical_ratioTÚ778Ú503ræ   r   rG   u   Lá»‡ch tá»‰ lá»‡FN)r   Úcheck_memory_discrepancy)r   Úhas_errÚmsgÚhas_err2Úmsg2Úhas_err3rc   s          r   Ú(test_check_memory_discrepancy_778_vs_503r'  Â  sþ   € õ ÑÔ€Fð ×2Ò2ØØØØØ!ð 3ñ ô �L€GˆSð �dˆ?ˆ?ˆ?ˆ?Ø�Cˆ<ˆ<˜E S˜L˜L˜LÐ(ð ×4Ò4ØØØØØð 5ñ ô �N€Hˆdð �tÐÐÐÐØ Ð%Ð%Ð%Ð%ð ×1Ò1ØØØØØ!ð 2ñ ô �K€Hˆað �uÐÐÐÐÐÐr   c                  óL  — t          ¦   «         } |                      ddddœ¦  «        }d|v sJ ‚|                     d¦  «        }||dz            dk    sJ ‚d|v sJ ‚|                     d¦  «        }||dz            d	k    sJ ‚d
dlm}  |ddddd¬¦  «        }t          d¦  «        5 }t          ¦   «         }||j        _        ||_        |                      dddœ¦  «        }d|v sJ ‚|                     d¦  «        }	||	dz            dk    sJ ‚	 ddd¦  «         dS # 1 swxY w Y   dS )u±   
    Kiá»ƒm tra CoreController: khi á»Ÿ cháº¿ Ä‘á»™ Auto, tá»± Ä‘á»™ng truyá»�n --max-hp 503
    khi nháº­n Ä‘Æ°á»£c detected_max_hp tá»« cáº¥u hÃ¬nh hoáº·c Optical Sensor.
    r§   r   r  )r   Údetected_max_hpÚdetected_max_manar”   rC   r   ú
--max-manaÚ344r   ©ÚOpticalVitalsrÿ   T)r´   r–   rµ   r¶   r	  ú2src.assistant_tool.core_controller.OpticalHPSensorrè   N)	r
   r™   rš   rÕ   r.  r   r   r  r.   )
r›   Úcmd_auto_detectedrü   Úidx_mr.  Úmock_vitalsÚmock_sensor_clsÚ	mock_instÚcmd_live_detectrŸ   s
             r   Ú1test_core_controller_auto_detect_max_hp_injectionr6  ë  sÐ  € õ
 
Ñ	Ô	€Bð ŸšØ!ØØ ð&ð &ñ ô Ðð
 Ð*Ð*Ð*Ð*Ð*Ø
×
!Ò
! *Ñ
-Ô
-€CØ˜S 1™WÔ%¨Ò.Ð.Ð.Ð.àÐ,Ð,Ð,Ð,Ð,Ø×#Ò# LÑ1Ô1€EØ˜U Q™YÔ'¨5Ò0Ð0Ð0Ð0ð CÐBÐBÐBÐBÐBØ�-¨3°sÈÐWZÐhlÐmÑmÔm€KÝ	ÐCÑ	DÔ	Dð 2ÈÝ‘K”Kˆ	Ø;Fˆ	Ô+Ô8Ø'0ˆÔ$àŸ,š,¸6Ð\`Ð'aÐ'aÑbÔbˆØ˜_Ð,Ð,Ð,Ð,Ø×$Ò$ ZÑ0Ô0ˆØ˜t a™xÔ(¨EÒ1Ð1Ð1Ð1Ð1ð2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2ð 2ð 2s   Â%A&DÄDÄ Dc                  ó|  — ddl m}  ddlm}m} ddlm} t          j        | d¦  «        5  t          j        | dddi¬	¦  «        5   | ¦   «         }	 | 	                    ¦   «          t          |d
¦  «        sJ ‚d|j                             d¦  «        v sJ ‚ |dddddd¬¦  «        }t          j        |j        d|¬	¦  «        5  t          ¦   «         }||_        |                     ¦   «          |j                             ¦   «         dk    sJ ‚|j                             ddd¦  «         ddd¦  «         n# 1 swxY w Y   ||j        _         |d |dddd¬¦  «        ¬¦  «        }|                     |¦  «         | 	                    ¦   «          |j                             d¦  «        }|j                             d¦  «        }	d|v sd|v sJ ‚d|	v sd|	v sJ ‚d|	v sd|v sJ ‚|                     ¦   «          n# |                     ¦   «          w xY w	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )u.  
    Kiá»ƒm tra ControlCenterApp:
    1. CÃ³ nÃºt báº¥m 'âš¡ QuÃ©t Vitals'.
    2. Click quÃ©t Vitals cáº­p nháº­t Ã´ entry_max_hp thÃ nh 503 vÃ  gá»�i send_recalibrate_vitals.
    3. Khi RAM gá»­i sá»‘ rÃ¡c 778/778 trong khi optical vitals lÃ  503 -> hiá»ƒn thá»‹ cáº£nh bÃ¡o 'Lá»†CH Bá»˜ NHá»š'.
    r   r£   r¯   r-  r¥   r¦   r   r§   r-   Úbtn_auto_detect_vitalsu   QuÃ©t Vitalsr®   rÿ   r   r  TÚocr)r´   r–   rµ   r¶   r	  Údetection_methodr  r   Nr  r#   r³   r·   r»   rã   r  )r¼   r¤   rÅ   r°   r±   rÕ   r.  r   r½   r¾   r¿   r8  rÄ   r¨   r   Úcore_bridgeÚ_on_auto_detect_vitals_clickedrª   rÃ   Úsend_recalibrate_vitalsr‡   Úlast_detected_vitalsrÆ   ré   r­   rÇ   )
r¤   r°   r±   r.  rÈ   r2  Úmock_bridgeÚsnap_garbage_778Úhp_textrÊ   s
             r   Ú9test_control_center_quick_calibrate_and_discrepancy_alertrB    s¥  € ð CÐBÐBÐBÐBÐBØYÐYÐYÐYÐYÐYÐYÐYØBÐBÐBÐBÐBÐBå	ŒÐ&Ð(=Ñ	>Ô	>ð $ð $Ý	ŒÐ&Ð(=ÐM^Ð`fÐLgÐ	hÑ	hÔ	hð$ð $àÐÑ Ô ˆð!	Ø�JŠJ‰LŒLˆLõ ˜3Ð 8Ñ9Ô9Ð9Ð9Ð9Ø! SÔ%?×%DÒ%DÀVÑ%LÔ%LÐLÐLÐLÐLð (˜-°3¸sÐQTÐ_bÐptð  HMð  Nñ  Nô  NˆKÝ”˜cÔ0Ð2MÐ\gÐhÑhÔhð Yð Yå'™kœk�Ø"-�”à×2Ò2Ñ4Ô4Ð4ØÔ'×+Ò+Ñ-Ô-°Ò6Ð6Ð6Ð6ØÔ3×KÒKÈCÐQTÐVWÑXÔXÐXðYð Yð Yñ Yô Yð Yð Yð Yð Yð Yð Yøøøð Yð Yð Yð Yð 7BˆCÔÔ3Ø4Ð4ØØ&�°#¸cÐPSÐ^aÐbÑbÔbð ñ  ô  Ðð ×&Ò&Ð'7Ñ8Ô8Ð8Ø�JŠJ‰LŒLˆLà”j—o’o fÑ-Ô-ˆGØÔ0×5Ò5°fÑ=Ô=ˆJØ˜wÐ&Ð&¨,¸'Ð*AÐ*AÐ*AÐAØ˜zÐ)Ð)¨\¸ZÐ-GÐ-GÐ-GÐGØ˜JÐ&Ð&¨%°7Ð*:Ð*:Ð*:Ð:à�NŠNÑÔÐÐøˆC�NŠNÑÔÐÐøøøÐðI$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð $ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð $ð $st   ªH1ÁHÁA1G3ÃA%D2Ä&G3Ä2D6Ä6G3Ä9D6Ä:B$G3ÇHÇ3H	È	HÈH1ÈH	ÈH1È H	È!H1È1H5È8H5c            
      óÌ  — ddl m} m} ddlm} ddlm} ddlm} ddl	m
} ddlm}  |¦   «         } |d¦  «        } ||¬	¦  «        }	t          ¦   «         }
 ||||	|
¬
¦  «        }	 |                     ¦   «          t          |d¦  «        sJ ‚ |dddddd¬¦  «        }t!          j        |j        d|¬¦  «        5  |                     ¦   «          |
j                             ddd¦  «         d|j                             d¦  «        v sJ ‚	 ddd¦  «         n# 1 swxY w Y   ||j        _         | d |ddddd¬¦  «        ¬¦  «        }|                     |¦  «         |                     ¦   «          |j                             d¦  «        }|j                             d¦  «        }d|v sJ ‚d|v sJ ‚d|v sJ ‚	 |                     ¦   «          dS # |                     ¦   «          w xY w)uÑ   
    Kiá»ƒm tra OverlayHUD:
    1. Khi click vÃ o thanh mÃ¡u / nhÃ£n HP gá»�i _on_vitals_quick_set().
    2. Cáº£nh bÃ¡o hiá»ƒn thá»‹ rÃµ rÃ ng trÃªn HUD khi RAM (778) lá»‡ch mÃ n hÃ¬nh thá»±c táº¿ (503).
    r   r¯   ©ÚGoldTracker©Ú
LogWatcher©ÚMarketAdvisorr-  ©Ú
OverlayHUDú	dummy.txt©Úgold_tracker©rN  Úlog_watcherÚmarket_advisorr;  Ú_on_vitals_quick_setrÿ   r   r  r  T)r´   r–   rµ   r¶   r  r	  r  r-   r   r®   Nr  g      Y@)r´   r–   rµ   r¶   Úhp_percentager·   r»   )rÅ   r°   r±   Úsrc.assistant_tool.gold_trackerrE  Úsrc.assistant_tool.log_watcherrG  Ú!src.assistant_tool.market_advisorrI  rÕ   r.  Úsrc.assistant_tool.overlay_guirK  r   r¾   r¿   r   r½   r¨   rR  r=  r‡   Úcore_status_badgerÄ   r>  Ú_on_telemetry_updateÚhp_labelÚdestroy)r°   r±   rE  rG  rI  r.  rK  ÚgtÚlwÚmar?  Úhudr2  Úsnap_778Úhp_label_textÚstatus_texts                   r   Ú8test_overlay_hud_click_calibrate_and_discrepancy_warningrc  @  sÈ  € ð ZÐYÐYÐYÐYÐYÐYÐYØ;Ð;Ð;Ð;Ð;Ð;Ø9Ð9Ð9Ð9Ð9Ð9Ø?Ð?Ð?Ð?Ð?Ð?ØBÐBÐBÐBÐBÐBØ9Ð9Ð9Ð9Ð9Ð9à	ˆ‰Œ€BØ	ˆ�KÑ	 Ô	 €BØ	ˆ BÐ	'Ñ	'Ô	'€BÝ‘+”+€Kà
ˆ* "°"ÀRÐU`Ð
aÑ
aÔ
a€CðØ�
Š
‰Œˆõ �sÐ2Ñ3Ô3Ð3Ð3Ð3à#�m¨s¸3ÈSÐ[^Ðitð  CGð  Hñ  Hô  HˆÝŒ\˜#Ô,Ð.IÐXcÐdÑdÔdð 	?ð 	?Ø×$Ò$Ñ&Ô&Ð&ØÔ/×GÒGÈÈSÐRSÑTÔTÐTØ˜CÔ1×6Ò6°vÑ>Ô>Ð>Ð>Ð>Ð>Ð>ð	?ð 	?ð 	?ñ 	?ô 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?øøøð 	?ð 	?ð 	?ð 	?ð 3>ˆÔÔ/Ø(Ð(ØØ"�?¨c¸#ÈCÐZ]ÐmrÐsÑsÔsð
ñ 
ô 
ˆð 	× Ò  Ñ*Ô*Ð*Ø�
Š
‰Œˆàœ×)Ò)¨&Ñ1Ô1ˆØÔ+×0Ò0°Ñ8Ô8ˆØ˜=Ð(Ð(Ð(Ð(Ø˜Ð%Ð%Ð%Ð%Ø˜;Ð&Ð&Ð&Ð&Ð&à�Š‰Œˆˆˆøˆ�Š‰Œˆˆøøøs3   Á&AG Â9ADÄ	G ÄDÄG ÄDÄBG ÇG#c                  óŽ  — ddl m}   | ¦   «         }t          d¦  «        }ddl}|                     d|ddddddd¦	  «	         ||_        |                     d	d
¦  «        }|du sJ ‚|                     d|d¦  «        d         }|dk    sJ ‚|                     d|d¦  «        \  }}}}	|dk    sJ ‚|dk    sJ ‚|dk    sJ ‚|	dk    sJ ‚dS )uK   Kiá»ƒm tra CoreShmBridge.send_recalibrate_vitals Ä‘áº©y opCode 98 vÃ o SHM.r   )ÚCoreShmBridgei  @ Nz<QIIQQQl   OTªÉz i  rC   r   r  Tz<Qé   z<QIffi  0 iã  éb   g     p@g     €u@)rÅ   re  rÙ   ÚstructÚ	pack_intoÚ_shmr=  Úunpack_from)
re  ÚbridgeÚmock_shmrh  ÚokÚcmd_seqÚcmd_idÚop_codeÚtarget_xÚtarget_ys
             r   Ú'test_shm_bridge_send_recalibrate_vitalsrt  q  s  € à@Ð@Ð@Ð@Ð@Ð@àˆ]‰_Œ_€Få˜Ñ)Ô)€HØ€M€M€Mà
×Ò�Y ¨!Ð-?ÀÈQÐPQÐSTÐVWÑXÔXÐXØ€F„Kà	×	'Ò	'¨¨SÑ	1Ô	1€BØ�ˆ:ˆ:ˆ:ˆ:ð × Ò   x°Ñ4Ô4°QÔ7€GØ�aŠ<ˆ<ˆ<ˆ<ð +1×*<Ò*<¸WÀhÐPXÑ*YÔ*YÑ'€FˆG�X˜xØ�SŠ=ˆ=ˆ=ˆ=Ø�bŠ=ˆ=ˆ=ˆ=Ø�uÒÐÐÐØ�uÒÐÐÐÐÐr   c                  ó¨  ‡— ddl m}   | j        ddd¦  «        }t          d¦  «        Šˆfd„}t	          d|¬	¦  «        5  t          j        |¦  «        }|€J ‚|j        du sJ ‚|j        dk    sJ ‚|j	        dk    sJ ‚|j
        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚	 d
d
d
¦  «         n# 1 swxY w Y   ˆfd„}t	          d|¬	¦  «        5  t          j        |¦  «        }|€J ‚|j        du sJ ‚|j        dk    sJ ‚|j	        dk    sJ ‚|j
        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚	 d
d
d
¦  «         d
S # 1 swxY w Y   d
S )uI  
    Kiá»ƒm tra _detect_via_winocr:
    1. VÃ¹ng crop chuáº©n má»›i: Left (0, 0.65*h, 0.26*w, 0.88*h), Right (0.74*w, 0.66*h, w, 0.88*h).
    2. Nháº­n diá»‡n ngá»¯ nghÄ©a khi Life 1/1, Shield 2,843/2,843, Ward 826/826, Rage 45/50.
    3. CI Invariant: current_hp = 1, max_hp = 1.
    4. Fallback khi khÃ´ng cÃ³ nhÃ£n chá»¯.
    r   ©r   rD   ©r2   r3   ©r   r   r   ç      „@c              “   ó‚   •K  — t          ¦   «         }| j        d         ‰t          d¦  «        fv rd|_        nd|_        |S )Nr   çÍÌÌÌÌÌ„@z+Life: 1/1
Shield: 2,843/2,843
Ward: 826/826z+Spirit: 100/100
Mana: 350 / 350
Rage: 45/50©r   Úsizer9   r®   ©ÚcropÚlangr‘   Úexpected_w_ls      €r   Úfake_recognizezJtest_optical_sensor_winocr_semantic_regex_and_crop.<locals>.fake_recognize™  sC   øè è € Ý‰kŒkˆØŒ9�QŒ<˜L­#¨kÑ*:Ô*:Ð;Ð;Ð;ØFˆCŒHˆHàFˆCŒHØˆ
r   úwinocr.recognize_pilr6   NTrC   é  é:  é^  r#   é-   r'   c              “   óh   •K  — t          ¦   «         }| j        d         ‰k    rd|_        nd|_        |S )Nr   z510 / 510
80 / 80z340 / 340
50 / 50)r   r}  r®   r~  s      €r   Úfake_recognize_fallbackzStest_optical_sensor_winocr_semantic_regex_and_crop.<locals>.fake_recognize_fallback³  s6   øè è € Ý‰kŒkˆØŒ9�QŒ<˜<Ò'Ð'Ø+ˆCŒHˆHà+ˆCŒHØˆ
r   iþ  éP   iT  )ÚPILr   rN   r9   r   r   Ú_detect_via_winocrr	  r´   r–   r
  r  Úcurrent_wardÚmax_wardrµ   r¶   Úcurrent_spiritÚ
max_spiritÚcurrent_rageÚmax_rage)r   Útest_imgr‚  r  r‰  Ú	vitals_fbr�  s         @r   Ú2test_optical_sensor_winocr_semantic_regex_and_cropr•  �  sC  ø€ ð ÐÐÐÐÐØˆuŒy˜ ¨iÑ8Ô8€HÝ�{Ñ#Ô#€Lðð ð ð ð õ 
Ð%°>Ð	BÑ	BÔ	Bð %ð %Ý Ô3°HÑ=Ô=ˆØÐ!Ð!Ð!ØÔ! TÐ)Ð)Ð)Ð)ØÔ  AÒ%Ð%Ð%Ð%ØŒ} Ò!Ð!Ð!Ð!ØÔ$¨Ò,Ð,Ð,Ð,ØÔ  DÒ(Ð(Ð(Ð(ØÔ" cÒ)Ð)Ð)Ð)ØŒ #Ò%Ð%Ð%Ð%ØÔ" cÒ)Ð)Ð)Ð)ØŒ #Ò%Ð%Ð%Ð%ØÔ$¨Ò+Ð+Ð+Ð+ØÔ  CÒ'Ð'Ð'Ð'ØÔ" bÒ(Ð(Ð(Ð(ØŒ "Ò$Ð$Ð$Ð$Ð$ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð$ð ð ð ð õ 
Ð%Ð3JÐ	KÑ	KÔ	Kð *ð *Ý#Ô6°xÑ@Ô@ˆ	ØÐ$Ð$Ð$ØÔ$¨Ð,Ð,Ð,Ð,ØÔ# sÒ*Ð*Ð*Ð*ØÔ 3Ò&Ð&Ð&Ð&ØÔ'¨2Ò-Ð-Ð-Ð-ØÔ# rÒ)Ð)Ð)Ð)ØÔ%¨Ò,Ð,Ð,Ð,ØÔ! SÒ(Ð(Ð(Ð(ØÔ'¨2Ò-Ð-Ð-Ð-ØÔ# rÒ)Ð)Ð)Ð)Ð)ð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *ð *ð *s%   ¿C DÄDÄDÄ-BGÇGÇGc            	      ó  — t          ¦   «         } ddlm}  |ddddddd¬	¦  «        }t          d
¦  «        5 }t	          ¦   «         }||j        _        ||_        |                      ddi¦  «        }d|v sJ ‚|                     d¦  «        }||dz            dk    sJ ‚d|v sJ ‚|                     d¦  «        }||dz            dk    sJ ‚d|v sJ ‚|                     d¦  «        }||dz            dk    sJ ‚	 ddd¦  «         dS # 1 swxY w Y   dS )uË   
    Kiá»ƒm tra CoreController:
    Khi max_hp == 0 (Auto), optical_inject_max_hp máº·c Ä‘á»‹nh True:
    Tá»± Ä‘á»™ng truyá»�n --max-hp, --max-mana, --max-es tá»« káº¿t quáº£ quÃ©t OpticalHPSensor.
    r   r-  rÿ   r   r!   r&   r  T©r´   r–   r
  r  rµ   r¶   r	  r/  r   r§   r”   rC   r   r+  r,  ú--max-esÚ200N)	r
   rÕ   r.  r   r   r  r.   r™   rš   )	r›   r.  r2  r3  r4  ÚcmdÚidx_hpÚidx_mpÚidx_ess	            r   Ú6test_core_controller_auto_detect_optical_es_mana_flagsrž  É  s§  € õ 
Ñ	Ô	€BØBÐBÐBÐBÐBÐBØ�-ØØØØØØØðñ ô €Kõ 
ÐCÑ	DÔ	Dð (ÈÝ‘K”Kˆ	Ø;Fˆ	Ô+Ô8Ø'0ˆÔ$ð �lŠlÐ-¨vÐ6Ñ7Ô7ˆØ˜SÐ Ð Ð Ð Ø—’˜:Ñ&Ô&ˆØ�6˜A‘:Œ %Ò'Ð'Ð'Ð'à˜sÐ"Ð"Ð"Ð"Ø—’˜<Ñ(Ô(ˆØ�6˜A‘:Œ %Ò'Ð'Ð'Ð'à˜SÐ Ð Ð Ð Ø—’˜:Ñ&Ô&ˆØ�6˜A‘:Œ %Ò'Ð'Ð'Ð'Ð'ð#(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (ð (s   ¶B=DÄDÄDc                  ó   — ddl m}  ddlm} ddlm} ddlm} ddlm	} ddl
m} t          j        | d¦  «        5  t          j        | d	d
di¬¦  «        5   | ¦   «         }	 |                     ¦   «           |¦   «         }t          j        |j        d|¬¦  «        5  ||j        _        |                     ¦   «         }|d         dk    sJ ‚d|v sJ ‚|d         du sJ ‚	 ddd¦  «         n# 1 swxY w Y    |dddddddd¬¦  «        }	t          j        |j        d|	¬¦  «        5  t%          ¦   «         }
|
|_        |                     ¦   «          |
j                             ddd¦  «         ddd¦  «         n# 1 swxY w Y    |¦   «         } |d¦  «        } ||¬¦  «        }t%          ¦   «         } |||||¬¦  «        }	 t          j        |j        d|	¬¦  «        5  |                     ¦   «          |j                             ddd¦  «         d|j                             d¦  «        v sJ ‚	 ddd¦  «         n# 1 swxY w Y   |                     ¦   «          n# |                     ¦   «          w xY w	 |                     ¦   «          n# |                     ¦   «          w xY w	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uH  
    Kiá»ƒm tra ControlCenterApp:
    1. _collect_config(): khÃ´ng cÃ²n sá»‘ cá»©ng 189, cÃ³ detected_max_es, optical_inject_max_hp lÃ  True.
    2. _on_auto_detect_vitals_clicked(): truyá»�n target_es sang send_recalibrate_vitals.
    3. overlay_gui._on_vitals_quick_set(): truyá»�n target_es sang send_recalibrate_vitals.
    r   r£   rD  rF  rH  r-  rJ  r¥   r¦   r   r§   r-   r  r¶   Údetected_max_esr˜   TNrÿ   r   r#   r0   r  Úwinocr_screen©r´   r–   r
  r  rµ   r¶   r	  r:  rL  rM  rO  z150 ESr®   )r¼   r¤   rT  rE  rU  rG  rV  rI  rÕ   r.  rW  rK  r   r½   r¾   r¨   r>  rÂ   r   r;  r<  r=  r‡   rR  rX  rÄ   r[  rÇ   )r¤   rE  rG  rI  r.  rK  rÈ   Úempty_vitalsrÉ   r2  r?  r\  r]  r^  Úmock_bridge_overlayr_  s                   r   Ú<test_control_center_collect_config_and_target_es_calibrationr¥  î  sÈ  € ð CÐBÐBÐBÐBÐBØ;Ð;Ð;Ð;Ð;Ð;Ø9Ð9Ð9Ð9Ð9Ð9Ø?Ð?Ð?Ð?Ð?Ð?ØBÐBÐBÐBÐBÐBØ9Ð9Ð9Ð9Ð9Ð9å	ŒÐ&Ð(=Ñ	>Ô	>ð -ð -Ý	ŒÐ&Ð(=ÐM^Ð`fÐLgÐ	hÑ	hÔ	hð-ð -àÐÑ Ô ˆð*	Ø�JŠJ‰LŒLˆLà(˜=™?œ?ˆLÝ”˜cÔ0Ð2MÐ\hÐiÑiÔið <ð <Ø:F�Ô"Ô7Ø×)Ò)Ñ+Ô+�Ø˜:”¨!Ò+Ð+Ð+Ð+Ø(¨CÐ/Ð/Ð/Ð/ØÐ2Ô3°tÐ;Ð;Ð;Ð;Ð;ð<ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <ð (˜-ØØØ"ØØ ØØ Ø!0ð	ñ 	ô 	ˆKõ ”˜cÔ0Ð2MÐ\gÐhÑhÔhð [ð [Ý'™kœk�Ø"-�”Ø×2Ò2Ñ4Ô4Ð4ØÔ3×KÒKÈCÐQTÐVYÑZÔZÐZð	[ð [ð [ñ [ô [ð [ð [ð [ð [ð [ð [øøøð [ð [ð [ð [ð �‘”ˆBØ�˜KÑ(Ô(ˆBØ�¨BÐ/Ñ/Ô/ˆBÝ"+¡+¤+ÐØ�*¨"¸"ÈRÐ]pÐqÑqÔqˆCðÝ”\ #Ô"4Ð6QÐ`kÐlÑlÔlð Jð JØ×,Ò,Ñ.Ô.Ð.Ø'Ô?×WÒWÐX[Ð]`ÐbeÑfÔfÐfØ# sÔ'<×'AÒ'AÀ&Ñ'IÔ'IÐIÐIÐIÐIÐIðJð Jð Jñ Jô Jð Jð Jð Jð Jð Jð Jøøøð Jð Jð Jð Jð
 —’‘”��ø�—’‘”��øøø�à�NŠNÑÔÐÐøˆC�NŠNÑÔÐÐøøøÐð[-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -sÕ   ºKÁJ+Á :JÂAC(ÃJÃ(C,Ã,JÃ/C,Ã02JÄ"AE4Å(JÅ4E8Å8JÅ;E8Å<AJÆ>IÇAH6È*IÈ6H:È:IÈ=H:È>IÉJÉI,É,JÉ0J+ÊJÊJ+ÊKÊ+J/	Ê/KÊ2J/	Ê3KËKË
Kc                  ó(  — ddl m}   | j        ddd¦  «        }d„ }t          d|¬¦  «        5  t	          j        |¦  «        }|€J ‚|j        d
u sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j	        dk    sJ ‚|j
        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚t	          ¦   «         }|                     |¬¦  «        }|€J ‚|j        dk    sJ ‚|j	        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚t!          ¦   «         }t          j        |d|¬¦  «        5  t          d|¬¦  «        5  |                     ddi¦  «        }d                     |¦  «        }d|v sJ ‚d|v sJ ‚||                     d¦  «        dz            dk    sJ ‚d|v sJ ‚||                     d¦  «        dz            dk    sJ ‚||                     d¦  «        dz            d k    sJ ‚||                     d!¦  «        dz            d"k    sJ ‚|                     ddi¦  «        }	dd                     |	¦  «        v sJ ‚	 d	d	d	¦  «         n# 1 swxY w Y   d	d	d	¦  «         n# 1 swxY w Y   d	d	d	¦  «         d	S # 1 swxY w Y   d	S )#uî  
    Kiá»ƒm tra nháº­n diá»‡n Vitals nhÃ¢n váº­t Level 41 tá»« thá»±c táº¿:
    - áº¢nh giáº£ láº­p vá»›i text 'Life 781/781 Shield 204/317' bÃªn trÃ¡i vÃ  'Mana Spirit 373/373 91/418' bÃªn pháº£i.
    - Kháº³ng Ä‘á»‹nh _detect_via_winocr() vÃ  detect_vitals_from_screen() nháº­n diá»‡n chÃ­nh xÃ¡c:
      max_hp = 781, max_shield = 317, max_mana = 373, max_spirit = 418.
    - Kiá»ƒm tra core_controller truyá»�n cá»� --primary-skill rmb --ranged --max-hp 781 --max-mana 373 --max-es 317.
    r   rv  rD   rw  rx  c              “   óš   K  — t          ¦   «         }| j        d         t          d¦  «        t          d¦  «        fv rd|_        nd|_        |S )Nr   ry  r{  zLife 781/781 Shield 204/317úMana Spirit 373/373 91/418r|  )r  r€  r‘   s      r   Úfake_recognize_lv41zXtest_level_41_vitals_winocr_detection_and_ranged_core_flags.<locals>.fake_recognize_lv418  sJ   è è € Ý‰kŒkˆàŒ9�QŒ<�C Ñ,Ô,­c°+Ñ.>Ô.>Ð?Ð?Ð?Ø4ˆCŒHˆHà3ˆCŒHØˆ
r   rƒ  r6   NTé  é=  éÌ   éu  i¢  é[   ©Úimgr  r-   r/  r   r§   ú zE--primary-skill rmb --ranged --max-hp 781 --max-mana 373 --max-es 317z--primary-skillrC   Úrmbz--rangedr”   Ú781r+  Ú373r˜  Ú317)r‹  r   rN   r   r   rŒ  r	  r–   r´   r  r
  r¶   rµ   r�  r�  r  r
   r½   r™   Újoinrš   Úbuild_command)
r   r“  r©  Úvitals_winocrr   Úvitals_screenr›   rš  Úcmd_strÚ	cmd_aliass
             r   Ú;test_level_41_vitals_winocr_detection_and_ranged_core_flagsr¼  -  sV  € ð ÐÐÐÐÐØˆuŒy˜ ¨iÑ8Ô8€Hðð ð õ 
Ð%Ð3FÐ	GÑ	GÔ	Gð *rð *rå'Ô:¸8ÑDÔDˆØÐ(Ð(Ð(ØÔ(¨DÐ0Ð0Ð0Ð0ØÔ# sÒ*Ð*Ð*Ð*ØÔ'¨3Ò.Ð.Ð.Ð.ØÔ'¨3Ò.Ð.Ð.Ð.ØÔ+¨sÒ2Ð2Ð2Ð2ØÔ%¨Ò,Ð,Ð,Ð,ØÔ)¨SÒ0Ð0Ð0Ð0ØÔ'¨3Ò.Ð.Ð.Ð.ØÔ+¨rÒ1Ð1Ð1Ð1õ !Ñ"Ô"ˆØ×8Ò8¸XÐ8ÑFÔFˆØÐ(Ð(Ð(ØÔ# sÒ*Ð*Ð*Ð*ØÔ'¨3Ò.Ð.Ð.Ð.ØÔ%¨Ò,Ð,Ð,Ð,ØÔ'¨3Ò.Ð.Ð.Ð.õ ÑÔˆÝŒ\˜&Ð"=ÈMÐZÑZÔZð 	rð 	rÝÐGÐV\Ð]Ñ]Ô]ð	rð 	rà—,’,Ð 1°6Ð:Ñ;Ô;ˆCØ—h’h˜s‘m”mˆGØZÐ^eÐeÐeÐeÐeð %¨Ð+Ð+Ð+Ð+Ø�s—y’yÐ!2Ñ3Ô3°aÑ7Ô8¸EÒAÐAÐAÐAØ Ð$Ð$Ð$Ð$Ø�s—y’y Ñ,Ô,¨qÑ0Ô1°UÒ:Ð:Ð:Ð:Ø�s—y’y Ñ.Ô.°Ñ2Ô3°uÒ<Ð<Ð<Ð<Ø�s—y’y Ñ,Ô,¨qÑ0Ô1°UÒ:Ð:Ð:Ð:ð ×(Ò(Ð*;¸VÐ)DÑEÔEˆIØZÐ^a×^fÒ^fÐgpÑ^qÔ^qÐqÐqÐqÐqÐqð!	rð 	rð 	rñ 	rô 	rð 	rð 	rð 	rð 	rð 	rð 	røøøð 	rð 	rð 	rð 	rð 	rð 	rð 	rñ 	rô 	rð 	rð 	rð 	rð 	rð 	rð 	røøøð 	rð 	rð 	rð 	rð5*rð *rð *rñ *rô *rð *rð *rð *rð *rð *rð *rð *røøøð *rð *rð *rð *rð *rð *rs[   ­DJÄ:I/ÅC?IÉI/ÉIÉI/ÉIÉ I/É#JÉ/I3	É3JÉ6I3	É7JÊJÊJc                  óJ  ‡— ddl m}   | j        ddd¦  «        }dŠˆfd„}t          d|¬	¦  «        5  t	          j        |¦  «        }|€J ‚|j        du sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j	        dk    sJ ‚|j
        dk    sJ ‚	 d
d
d
¦  «         d
S # 1 swxY w Y   d
S )uï   
    Kiá»ƒm tra chuá»—i OCR thá»±c táº¿ khi cÃ³ chat box vÃ  kÃ½ tá»± mÃ©o:
    'i 3#FreezySni c plantsactu .11, 793/793 shjeIdAt3ji/3j7'
    Kháº³ng Ä‘á»‹nh nháº­n diá»‡n chÃ­nh xÃ¡c: max_hp = 793, current_hp = 793, max_shield = 317.
    r   rv  rD   rw  rx  z7i 3#FreezySni c plantsactu .11, 793/793 shjeIdAt3ji/3j7c              “   óœ   •K  — t          ¦   «         }| j        d         t          d¦  «        t          d¦  «        fv r‰|_        nd|_        |S )Nr   ry  r{  r¨  r|  )r  r€  r‘   Úreal_ocr_snippets      €r   r‚  zBtest_distorted_chat_ocr_vitals_recognition.<locals>.fake_recognizey  sK   øè è € Ý‰kŒkˆàŒ9�QŒ<�C Ñ,Ô,­c°+Ñ.>Ô.>Ð?Ð?Ð?Ø'ˆCŒHˆHà3ˆCŒHØˆ
r   rƒ  r6   NTé  r«  é7  )r‹  r   rN   r   r   rŒ  r	  r–   r´   r  r
  )r   r“  r‚  r  r¿  s       @r   Ú*test_distorted_chat_ocr_vitals_recognitionrÂ  n  sG  ø€ ð ÐÐÐÐÐØˆuŒy˜ ¨iÑ8Ô8€HàPÐðð ð ð ð õ 
Ð%°>Ð	BÑ	BÔ	Bð ,ð ,Ý Ô3°HÑ=Ô=ˆØÐ!Ð!Ð!ØÔ! TÐ)Ð)Ð)Ð)ØŒ} Ò#Ð#Ð#Ð#ØÔ  CÒ'Ð'Ð'Ð'ØÔ  CÒ'Ð'Ð'Ð'ØÔ$¨Ò+Ð+Ð+Ð+Ð+ð,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð ,ð ,s   ²ABÂBÂBc                  óÜ  — ddl m}  ddlm}m} ddlm} |                      dd¦  «        du sJ ‚|                      dd¦  «        du sJ ‚|                      dd¦  «        d	u sJ ‚|                      d
d¦  «        d	u sJ ‚|                      dd¦  «        d	u sJ ‚|                      dd¦  «        d	u sJ ‚|                      dd¦  «        d	u sJ ‚|                      dd¦  «        d	u sJ ‚t          j	        | d¦  «        5  t          j	        | dddi¬¦  «        5   | ¦   «         }	 t          ¦   «         }d|j        _         |d |dddddd¬¦  «        ¬¦  «        |_        ||_         |dddddddd¬¦  «        }t          j	        |j        d|¬¦  «        5  d|_        |                     ¦   «          |j                             ddd¦  «         |j                             ¦   «         dk    sJ ‚	 d d d ¦  «         n# 1 swxY w Y   |                     ¦   «           |ddddddd¬!¦  «        }t          j	        |j        d|¬¦  «        5  d|_        |                     ¦   «          |j                             ¦   «          d d d ¦  «         n# 1 swxY w Y   |                     ¦   «          n# |                     ¦   «          w xY w	 d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )"uY  
    Kiá»ƒm tra tÃ­nh há»£p lÃ½ cá»§a Vitals vÃ  gá»­i lá»‡nh recalibrate khi max_hp thay Ä‘á»•i há»£p lá»‡ (781 -> 793):
    1. is_valid_vitals tá»« chá»‘i < 50, > 30000, current > max, vÃ  láº·p báº¥t thÆ°á»�ng 7793/778/779.
    2. Khi phÃ¡t hiá»‡n max_hp thay Ä‘á»•i há»£p lá»‡ (781 -> 793), gá»­i send_recalibrate_vitals(793, mana, es).
    r   r£   r¯   r-  rÀ  Trª  é1   Fi¸ˆ  rH   i   iq  r  i  r¥   r¦   r   r§   r-   r­  r¬  r«  ©r´   r–   rµ   r¶   Ú
current_esÚmax_esr·   rÁ  r¡  r¢  r  r   Ú793Nr—  )r¼   r¤   rÅ   r°   r±   rÕ   r.  Úis_valid_vitalsr   r½   r   Úis_connectedr.   Úlast_snapshotr;  r¨   Ú_last_optical_crosscheckÚ_periodic_taskr=  r‡   rª   rÃ   Ú
reset_mockÚassert_not_calledrÇ   )r¤   r°   r±   r.  rÈ   r?  Ú
new_vitalsÚgarbage_vitalss           r   Ú;test_control_center_vitals_validation_and_valid_recalibraterÒ  Œ  sÃ  € ð CÐBÐBÐBÐBÐBØYÐYÐYÐYÐYÐYÐYÐYØBÐBÐBÐBÐBÐBð ×+Ò+¨C°Ñ5Ô5¸Ð=Ð=Ð=Ð=Ø×+Ò+¨C°Ñ5Ô5¸Ð=Ð=Ð=Ð=Ø×+Ò+¨B°Ñ3Ô3°uÐ<Ð<Ð<Ð<Ø×+Ò+¨E°4Ñ8Ô8¸EÐAÐAÐAÐAØ×+Ò+¨C°Ñ5Ô5¸Ð>Ð>Ð>Ð>Ø×+Ò+¨D°$Ñ7Ô7¸5Ð@Ð@Ð@Ð@Ø×+Ò+¨C°Ñ5Ô5¸Ð>Ð>Ð>Ð>Ø×+Ò+¨C°Ñ5Ô5¸Ð>Ð>Ð>Ð>õ 
ŒÐ&Ð(=Ñ	>Ô	>ð -ð -Ý	ŒÐ&Ð(=ÐM^Ð`fÐLgÐ	hÑ	hÔ	hð-ð -àÐÑ Ô ˆð*	Ý#™+œ+ˆKØ48ˆKÔ$Ô1Ø(=Ð(=ØØ&�°#¸cÐPSÐ^aÐnqÐz}Ð~Ñ~Ô~ð)ñ )ô )ˆKÔ%ð *ˆCŒOð '˜ØØØ"ØØ ØØ Ø!0ð	ñ 	ô 	ˆJõ ”˜cÔ0Ð2MÐ\fÐgÑgÔgð 7ð 7Ø/2�Ô,Ø×"Ò"Ñ$Ô$Ð$ØÔ3×KÒKÈCÐQTÐVYÑZÔZÐZØÔ'×+Ò+Ñ-Ô-°Ò6Ð6Ð6Ð6Ð6ð	7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7ð ×"Ò"Ñ$Ô$Ð$Ø*˜]ØØØ"ØØ ØØ ðñ ô ˆNõ ”˜cÔ0Ð2MÐ\jÐkÑkÔkð Hð HØ/2�Ô,Ø×"Ò"Ñ$Ô$Ð$ØÔ3×EÒEÑGÔGÐGðHð Hð Hñ Hô Hð Hð Hð Hð Hð Hð Høøøð Hð Hð Hð Hð
 �NŠNÑÔÐÐøˆC�NŠNÑÔÐÐøøøÐð[-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -s™   Ã:K!ÄK	Ä A1J#ÆAG5Ç)J#Ç5G9Ç9J#Ç<G9Ç=AJ#É5JÉ7J#ÊJÊJ#Ê
JÊJ#ÊK	Ê#J9Ê9K	Ê=K!Ë	K	ËK!ËK	ËK!Ë!K%Ë(K%c                  ó  — ddl m} m}  | ¦   «         }|j        du sJ ‚ |ddd¬¦  «        }t	          j        |d|¬	¦  «        5  |                     d
¬¦  «         |j        du sJ ‚|j        �|j                             ¦   «         sJ ‚t          j
        d¦  «         |j        j        du sJ ‚|j        j        dk    sJ ‚|                     d¬¦  «         |j        du sJ ‚|j        �J ‚	 ddd¦  «         dS # 1 swxY w Y   dS )ud   Kiá»ƒm tra luá»“ng quÃ©t ngáº§m báº¥t Ä‘á»“ng bá»™ (Background OCR / Slit Sensor worker thread 2Hz).r   )r   r.  Frÿ   r   T)r´   r–   r	  r  r-   gš™™™™™©?)ÚintervalNg¸…ëQ¸¾?rG   )Útimeout)rÕ   r   r.  Ú_bg_runningr   r½   Ústart_background_workerÚ
_bg_threadÚis_alivero   Úsleepr>  r	  r–   Ústop_background_worker)r   r.  r   r2  s       r   Ú%test_optical_sensor_background_workerrÜ  Ñ  s˜  € àSÐSÐSÐSÐSÐSÐSÐSàˆ_ÑÔ€FØÔ Ð&Ð&Ð&Ð&à�-¨3°sÈÐMÑMÔM€KÝ	Œ�fÐ9ÈÐ	TÑ	TÔ	Tð )ð )Ø×&Ò&°Ð&Ñ5Ô5Ð5ØÔ! TÐ)Ð)Ð)Ð)ØÔ Ð,°Ô1B×1KÒ1KÑ1MÔ1MÐ,Ð,ÐMõ 	Œ
�4ÑÔÐØÔ*Ô6¸$Ð>Ð>Ð>Ð>ØÔ*Ô1°SÒ8Ð8Ð8Ð8à×%Ò%¨cÐ%Ñ2Ô2Ð2ØÔ! UÐ*Ð*Ð*Ð*ØÔ Ð(Ð(Ð(Ð(ð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð )ð )s   ÁB$C5Ã5C9Ã<C9c                  ó¶  — ddl m}   | ¦   «         }|                     d¬¦  «        }|j        du sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j	        dk    sJ ‚|                     d	¬¦  «        }|j        du sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j	        dk    sJ ‚|                     d
¬¦  «        }|j        du sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j
        dk    sJ ‚|j        dk    sJ ‚|                     d¬¦  «        }|j        du sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j	        dk    sJ ‚|j
        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|                     d¬¦  «        }|j        du sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j	        dk    sJ ‚|j
        dk    s	|j
        �J ‚|                     d¬¦  «        }|j        du sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j
        dk    sJ ‚|j        dk    sJ ‚dS )ut  
    Kiá»ƒm tra nháº­n diá»‡n Vitals cá»§a nhÃ¢n váº­t build Chaos Inoculation (CI) vÃ  sá»‘ cÃ³ dáº¥u pháº©y hÃ ng nghÃ¬n:
    - 'Shield Ward 2,402/2,402 826/826' -> HP=1/1, Shield=2402/2402, Ward=826/826.
    - 'Life Shield Ward 2,402/2,402 826/826' -> HP=1/1, Shield=2402/2402, Ward=826/826.
    - 'Life: 1,250/1,250 | Mana: 820/820' -> HP=1250/1250, Mana=820/820.
    r   r   zShield Ward 2,402/2,402 826/826r  TrC   éb	  r…  z$Life Shield Ward 2,402/2,402 826/826z!Life: 1,250/1,250 | Mana: 820/820iâ  é4  zULife: 1/1
Shield: 2,843/2,843
Ward: 826/826
Mana: 350/350
Spirit: 100/100
Rage: 45/50r„  r†  r#   r‡  r'   z+Life: 1/1
Shield: 4,284/4,284
Ward: 241/241i¼  éñ   Nz9Life: 1/1
Shield: 4,284/4,284
Ward: 241/241
Mana: 897/897i�  )rÕ   r   r  r	  r´   r–   r
  r  r�  rŽ  rµ   r¶   r�  r�  r‘  r’  )r   r   Úv1Úv2Úv3Úv4Úv5Úv6s           r   Ú6test_ci_optical_vitals_parsing_and_thousand_separatorsrç  è  s,  € ð EÐDÐDÐDÐDÐDàˆ_ÑÔ€Fð 
×	)Ò	)Ð4UÐ	)Ñ	VÔ	V€BØŒ>˜TÐ!Ð!Ð!Ð!ØŒ=˜AÒÐÐÐØŒ9˜Š>ˆ>ˆ>ˆ>ØÔ Ò$Ð$Ð$Ð$ØŒ=˜DÒ Ð Ð Ð ØŒ?˜cÒ!Ð!Ð!Ð!ØŒ;˜#ÒÐÐÐð 
×	)Ò	)Ð4ZÐ	)Ñ	[Ô	[€BØŒ>˜TÐ!Ð!Ð!Ð!ØŒ=˜AÒÐÐÐØŒ9˜Š>ˆ>ˆ>ˆ>ØÔ Ò$Ð$Ð$Ð$ØŒ=˜DÒ Ð Ð Ð ØŒ?˜cÒ!Ð!Ð!Ð!ØŒ;˜#ÒÐÐÐð 
×	)Ò	)Ð4WÐ	)Ñ	XÔ	X€BØŒ>˜TÐ!Ð!Ð!Ð!ØŒ=˜DÒ Ð Ð Ð ØŒ9˜ÒÐÐÐØŒ?˜cÒ!Ð!Ð!Ð!ØŒ;˜#ÒÐÐÐð 
×	)Ò	)Ønð 
*ñ 
ô 
€Bð Œ>˜TÐ!Ð!Ð!Ð!ØŒ=˜AÒÐÐÐØŒ9˜Š>ˆ>ˆ>ˆ>ØÔ Ò$Ð$Ð$Ð$ØŒ=˜DÒ Ð Ð Ð ØŒ?˜cÒ!Ð!Ð!Ð!ØŒ;˜#ÒÐÐÐØŒ?˜cÒ!Ð!Ð!Ð!ØŒ;˜#ÒÐÐÐØÔ Ò#Ð#Ð#Ð#ØŒ=˜CÒÐÐÐØŒ?˜bÒ Ð Ð Ð ØŒ;˜"ÒÐÐÐð 
×	)Ò	)ØAð 
*ñ 
ô 
€Bð Œ>˜TÐ!Ð!Ð!Ð!ØŒ=˜AÒÐÐÐØŒ9˜Š>ˆ>ˆ>ˆ>ØÔ Ò$Ð$Ð$Ð$ØŒ=˜DÒ Ð Ð Ð ØŒ?˜cÒ!Ð!Ð!Ð!ØŒ;˜#ÒÐÐÐØŒ?˜aÒÐ 2¤?Ð#:Ð#:Ð:ð 
×	)Ò	)ØPð 
*ñ 
ô 
€Bð Œ>˜TÐ!Ð!Ð!Ð!ØÔ Ò$Ð$Ð$Ð$ØŒ?˜cÒ!Ð!Ð!Ð!ØŒ?˜cÒ!Ð!Ð!Ð!ØŒ;˜#ÒÐÐÐÐÐr   c                  óÐ  — ddl m}  ddlm}m} ddlm} t          j        | d¦  «        5  t          j        | dddi¬	¦  «        5   | ¦   «         }	 t          ¦   «         }d
|j
        _         |d
 |dddddd¬¦  «        ¬¦  «        |_        ||_        t          d
¬	¦  «        |j        _         |ddddddddd
d¬¦
  «
        }t          j        |j        d|¬	¦  «        5  d|_        |                     ¦   «          |j                             ddd¦  «         |j                             ¦   «         dk    sJ ‚d|j                             d¦  «        v sJ ‚d|j                             d¦  «        v sJ ‚	 ddd¦  «         n# 1 swxY w Y   |                     ¦   «          n# |                     ¦   «          w xY w	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uJ  
    Kiá»ƒm tra tá»± Ä‘á»™ng hiá»‡u chuáº©n CI (HP=1, max_shield > 0) vÃ  cáº­p nháº­t giao diá»‡n GUI:
    - Gá»­i opcode 98: send_recalibrate_vitals(1, optical_mana, optical_max_shield).
    - Ã” entry_max_hp hiá»ƒn thá»‹ 'CI'.
    - Badge vÃ  Label hiá»ƒn thá»‹ '[CI] Shield={optical_max_shield}, Ward={optical_max_ward}'.
    r   r£   r¯   r-  r¥   r¦   r   r§   r-   TrÅ  r·   rC   rÞ  r…  rß  r¡  )
r´   r–   r
  r  r�  rŽ  rµ   r¶   r	  r:  r  r   ÚCIz[CI] Shield=2402, Ward=826r®   N)r¼   r¤   rÅ   r°   r±   rÕ   r.  r   r½   r   rÊ  r.   rË  r;  Úcore_controllerÚ
is_runningr¨   rÌ  rÍ  r=  r‡   rª   rÃ   ré   rÄ   r­   rÇ   )r¤   r°   r±   r.  rÈ   r?  Ú	ci_vitalss          r   Ú%test_ci_recalibration_and_gui_displayrí  :  s2  € ð CÐBÐBÐBÐBÐBØYÐYÐYÐYÐYÐYÐYÐYØBÐBÐBÐBÐBÐBå	ŒÐ&Ð(=Ñ	>Ô	>ð $ð $Ý	ŒÐ&Ð(=ÐM^Ð`fÐLgÐ	hÑ	hÔ	hð$ð $àÐÑ Ô ˆð!	Ý#™+œ+ˆKØ48ˆKÔ$Ô1Ø(=Ð(=ØØ&�°!¸AÈAÐXYÐfgÐpqÐrÑrÔrð)ñ )ô )ˆKÔ%ð *ˆCŒOÝ-6ÀDÐ-IÑ-IÔ-IˆCÔÔ*à%˜ØØØ#ØØ ØØ ØØ Ø!0ðñ ô ˆIõ ”˜cÔ0Ð2MÐ\eÐfÑfÔfð \ð \Ø/2�Ô,Ø×"Ò"Ñ$Ô$Ð$ð Ô3×KÒKÈAÈsÐTXÑYÔYÐYØÔ'×+Ò+Ñ-Ô-°Ò5Ð5Ð5Ð5Ø3°s´z·²ÀvÑ7NÔ7NÐNÐNÐNÐNØ3°sÔ7N×7SÒ7SÐTZÑ7[Ô7[Ð[Ð[Ð[Ð[Ð[ð\ð \ð \ñ \ô \ð \ð \ð \ð \ð \ð \øøøð \ð \ð \ð \ð �NŠNÑÔÐÐøˆC�NŠNÑÔÐÐøøøÐðI$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð $ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð $ð $ss   ªGÁGÁBFÃBE=Å1FÅ=FÆFÆFÆFÆGÆF3Æ3GÆ7GÇG	ÇGÇ
G	ÇGÇGÇ"Gc                  ó  — ddl } ddlm} ddlm} ddlm} ddlm}m	} | j
                             | j
                             | j
                             t          ¦  «        ddd	¦  «        ¦  «        }| j
                             |¦  «        sJ d
|› �¦   «         ‚ |j        |¦  «        }|j        dk    s
J d¦   «         ‚ |¦   «         }|                     |¬¦  «        }	|	€J ‚|	j        du sJ ‚|	j        dk    sJ ‚|	j        dk    sJ ‚|	j        dk    sJ ‚|	j        dk    sJ ‚|	j        dk    sJ ‚|	j        dk    sJ ‚|	j        dk    sJ ‚|	j        dk    sJ ‚|	j        dk    sJ ‚|	j        dk    sJ ‚|	j        dk    sJ ‚|	j        dk    sJ ‚|	j         dk    sJ ‚tC          j"        |d¦  «        5  tC          j"        |dddi¬¦  «        5   |¦   «         }
	 tG          ¦   «         }d|j$        _%         |d |dddddd¬¦  «        ¬¦  «        |_&        ||
_'        tG          d¬¦  «        |
j(        _)        tC          j"        |
j*        d|	¬¦  «        5  d|
_+        |
 ,                    ¦   «          |j-         .                    ddd¦  «         |
j/         0                    ¦   «         d k    sJ ‚d!|
j1         2                    d"¦  «        v sJ ‚d!|
j3         2                    d"¦  «        v sJ ‚d#|
j4         2                    d"¦  «        v sJ ‚d$|
j4         2                    d"¦  «        v sJ ‚	 ddd¦  «         n# 1 swxY w Y   |
 5                    ¦   «          n# |
 5                    ¦   «          w xY w	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )%u¡  
    Kiá»ƒm tra nháº­n diá»‡n Vitals tá»« áº£nh chá»¥p in-game tháº­t captures/after_restoring_2_0.png (16:9 standard 2560x1440):
    - Kháº³ng Ä‘á»‹nh nháº­n diá»‡n chÃ­nh xÃ¡c 100%: Life 1/1, Shield 5656/5656, Ward 240/240, Mana 876/876, Spirit 7/147, Rage 0/30.
    - Kháº³ng Ä‘á»‹nh tÃ­ch há»£p Control Center: Ã´ entry_max_hp hiá»ƒn thá»‹ 'CI', gá»­i IPC recalibrate (1, 876, 5656), badge hiá»ƒn thá»‹ [CI].
    r   Nrv  r   r£   r¯   r	   Úcaptureszafter_restoring_2_0.pngu'   KhÃ´ng tÃ¬m tháº¥y tá»‡p áº£nh tháº­t: rw  u9   áº¢nh khÃ´ng Ä‘Ãºng kÃ­ch thÆ°á»›c chuáº©n 16:9 2560x1440r¯  Tr¡  rC   i  éð   il  é   é“   r    r¥   r¦   r   r§   r-   rÅ  r·   r  r   ré  z[CI] Shield=5656, Ward=240r®   z	5656/5656z240/240)6Úosr‹  r   rÕ   r   r¼   r¤   rÅ   r°   r±   ÚpathÚabspathr¶  ÚdirnameÚ__file__ÚexistsÚopenr}  r  r	  r:  r´   r–   r
  r  r�  rŽ  rµ   r¶   r�  r�  r‘  r’  r   r½   r   rÊ  r.   rË  r;  rê  rë  r¨   rÌ  rÍ  r=  r‡   rª   rÃ   ré   rÄ   r­   Úlbl_vitals_es_wardrÇ   )ró  r   r   r¤   r°   r±   Úimg_pathr°  r   ÚvrÈ   r?  s               r   Ú9test_authentic_16_9_vitals_extraction_after_restoring_2_0rý  l  s  € ð €I€I€IØÐÐÐÐÐØDÐDÐDÐDÐDÐDØBÐBÐBÐBÐBÐBØYÐYÐYÐYÐYÐYÐYÐYàŒw�Š˜rœwŸ|š|¨B¬G¯OªO½HÑ,EÔ,EÀtÈZÐYrÑsÔsÑtÔt€HØŒ7�>Š>˜(Ñ#Ô#ÐYÐYÐ%YÈxÐ%YÐ%YÑYÔYÐ#à
ˆ%Œ*�XÑ
Ô
€CØŒ8�|Ò#Ð#Ð#Ð%`Ñ#Ô#Ð#àˆ_ÑÔ€FØ×(Ò(¨SÐ(Ñ1Ô1€Aàˆ=ˆ=ˆ=ØŒ=˜DÐ Ð Ð Ð ØÔ Ò0Ð0Ð0Ð0ØŒ<˜1ÒÐÐÐØŒ8�qŠ=ˆ=ˆ=ˆ=ØÔ˜tÒ#Ð#Ð#Ð#ØŒ<˜4ÒÐÐÐØŒ>˜SÒ Ð Ð Ð ØŒ:˜ÒÐÐÐØŒ>˜SÒ Ð Ð Ð ØŒ:˜ÒÐÐÐØÔ˜qÒ Ð Ð Ð ØŒ<˜3ÒÐÐÐØŒ>˜QÒÐÐÐØŒ:˜ÒÐÐÐõ 
ŒÐ&Ð(=Ñ	>Ô	>ð ð Ý	ŒÐ&Ð(=ÐM^Ð`fÐLgÐ	hÑ	hÔ	hðð àÐÑ Ô ˆð	Ý#™+œ+ˆKØ48ˆKÔ$Ô1Ø(=Ð(=ØØ&�°!¸AÈAÐXYÐfgÐpqÐrÑrÔrð)ñ )ô )ˆKÔ%ð *ˆCŒOÝ-6ÀDÐ-IÑ-IÔ-IˆCÔÔ*å”˜cÔ0Ð2MÐ\]Ð^Ñ^Ô^ð 	Hð 	HØ/2�Ô,Ø×"Ò"Ñ$Ô$Ð$àÔ3×KÒKÈAÈsÐTXÑYÔYÐYØÔ'×+Ò+Ñ-Ô-°Ò5Ð5Ð5Ð5Ø3°s´z·²ÀvÑ7NÔ7NÐNÐNÐNÐNØ3°sÔ7N×7SÒ7SÐTZÑ7[Ô7[Ð[Ð[Ð[Ð[Ø" cÔ&<×&AÒ&AÀ&Ñ&IÔ&IÐIÐIÐIÐIØ  CÔ$:×$?Ò$?ÀÑ$GÔ$GÐGÐGÐGÐGÐGð	Hð 	Hð 	Hñ 	Hô 	Hð 	Hð 	Hð 	Hð 	Hð 	Hð 	Høøøð 	Hð 	Hð 	Hð 	Hð �NŠNÑÔÐÐøˆC�NŠNÑÔÐÐøøøÐð1ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð st   Æ*NÇM*ÇA8MÉCL$ÌMÌ$L(Ì(MÌ+L(Ì,MÌ/M*ÍMÍM*ÍNÍ*M.	Í.NÍ1M.	Í2NÎNÎ	NÚ__main__uS   
âœ… Táº¤T Cáº¢ TEST OPTICAL HP SENSOR & BACKGROUND WORKER Ä�á»€U VÆ¯á»¢T QUA 100%!)3Ú__doc__ró  Úsysro   Úunittest.mockr   r   r‹  r   r   r¿   Ústdoutr   rô  rÁ   rõ  r¶  rö  r÷  Ú"src.assistant_tool.core_controllerr
   rÕ   r   r   r+   r@   ri   r{   r’   r¡   rÍ   rà   rý   r  r'  r6  rB  rc  rt  r•  rž  r¥  r¼  rÂ  rÒ  rÜ  rç  rí  rý  Ú__name__ru   r*   r   r   ú<module>r     sN  ððð ð 
€	€	€	Ø 
€
€
€
Ø €€€Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *à  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à
€7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ4Ñ#PÔ#PÑQÔQÑ RÔ RÐ Rà =Ð =Ð =Ð =Ð =Ð =Ø @Ð @Ð @Ð @Ð @Ð @ð
$ð 
$ð 
$ð=ð =ð =ð$#ð #ð #ðL.+ð .+ð .+ðb]ð ]ð ]ð."Lð "Lð "LðJ"ð "ð "ð.*ð *ð *ðZ!ð !ð !ðHeð eð eðP%?ð %?ð %?ðP&ð &ð &ðR 2ð  2ð  2ðF/ð /ð /ðd.ð .ð .ðbð ð ð89*ð 9*ð 9*ðx"(ð "(ð "(ðJ;ð ;ð ;ð~>rð >rð >rðB,ð ,ð ,ð<Bð Bð BðJ)ð )ð )ð.Oð Oð Oðd/ð /ð /ðd>ð >ð >ðB ˆzÒÑØ&Ð&Ñ(Ô(Ð(ØÐÑÔÐØÐÑ Ô Ð Ø/Ð/Ñ1Ô1Ð1ØÐÑ Ô Ð Ø#Ð#Ñ%Ô%Ð%Ø4Ð4Ñ6Ô6Ð6Ø-Ð-Ñ/Ô/Ð/Ø6Ð6Ñ8Ô8Ð8Ø7Ð7Ñ9Ô9Ð9Ø3Ð3Ñ5Ô5Ð5Ø,Ð,Ñ.Ô.Ð.Ø5Ð5Ñ7Ô7Ð7Ø=Ð=Ñ?Ô?Ð?Ø<Ð<Ñ>Ô>Ð>Ø+Ð+Ñ-Ô-Ð-Ø6Ð6Ñ8Ô8Ð8Ø:Ð:Ñ<Ô<Ð<Ø@Ð@ÑBÔBÐBØ?Ð?ÑAÔAÐAØ.Ð.Ñ0Ô0Ð0Ø?Ð?ÑAÔAÐAØ)Ð)Ñ+Ô+Ð+Ø:Ð:Ñ<Ô<Ð<Ø)Ð)Ñ+Ô+Ð+Ø=Ð=Ñ?Ô?Ð?Ø	€EÐ
`ÑaÔaÐaÐaÐað7 Ðr   