§
    N
ÂjƒD  ã                   óž  — U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZ	d dl
Z	d dlmZ d dlmZ d dlmZ  ej        e¦  «        ZdZeeeef         ed<   dZdZd	Zd
ZdZdZ ej        dej        ¦  «        Z  ej        dej        ¦  «        Z!dedz  defd„Z"dedz  de#dz  fd„Z$dde#dz  defd„Z%dedz  defd„Z& G d„ d¦  «        Z'dS )é    N)ÚAny)Úsync_playwright)Úget_settings)zopenrouter/gemini-2.5-flashz openrouter/gemini-2.5-flash-litezopenrouter/gemini-3.8-flashÚCAPTCHA_READER_MODELSé   é   é   g      4@z¡Transcribe ONLY the 4 to 6 uppercase alphanumeric characters seen in this captcha image. Output ONLY the raw characters (no spaces, no punctuation, no markdown).é   z=<path\b[^>]*\bfill\s*=\s*["']none["'][^>]*?(?:/>|>\s*</path>)z<path\b[^>]*>ÚsvgÚreturnc                 ó@   — | sdS t                                d| ¦  «        S )ud   XoÃ¡ cÃ¡c Ä‘Æ°á»�ng nhiá»…u (path fill="none") khá»�i SVG captcha, giá»¯ nguyÃªn cÃ¡c path kÃ½ tá»±.Ú )Ú_NOISE_PATH_REÚsub)r   s    úRC:\Projects\DSCons\app\modules\invoices\infrastructure\adapters\gdt\gdt_captcha.pyÚclean_captcha_svgr   0   s%   € àð ØˆrÝ×Ò˜b #Ñ&Ô&Ð&ó    c                 ó²   — t          | ¦  «        }|sdS t          t                               |¦  «        ¦  «        }t          |cxk    rt
          k    rn n|ndS )u%  Suy ra sá»‘ kÃ½ tá»± captcha = sá»‘ path tÃ´ Ä‘áº·c sau khi loáº¡i nhiá»…u.

    Tráº£ None náº¿u káº¿t quáº£ náº±m ngoÃ i khoáº£ng há»£p lá»‡ [CAPTCHA_MIN_LEN, CAPTCHA_MAX_LEN]
    (SVG láº¡ / Ä‘á»•i Ä‘á»‹nh dáº¡ng) Ä‘á»ƒ luá»“ng gá»�i quay vá»� kiá»ƒm tra Ä‘á»™ dÃ i má»�m 4-6 nhÆ° cÅ©.
    N)r   ÚlenÚ_PATH_TAG_REÚfindallÚCAPTCHA_MIN_LENÚCAPTCHA_MAX_LEN)r   ÚcleanedÚns      r   Úcount_captcha_glyphsr   7   sd   € õ   Ñ$Ô$€GØð ØˆtÝ�L× Ò  Ñ)Ô)Ñ*Ô*€AÝ 1Ð7Ð7Ò7Ð7­Ò7Ð7Ð7Ð7Ð7ˆ1ˆ1¸TÐAr   Úexpected_lenc                 ó&   — | st           S d| › d| › d�S )uk   Prompt OCR; khi biáº¿t trÆ°á»›c Ä‘á»™ dÃ i thÃ¬ nÃ³i rÃµ Ä‘á»ƒ model khÃ´ng Ä‘á»�c thiáº¿u/thá»«a kÃ½ tá»±.z$This captcha image contains exactly z3 uppercase alphanumeric characters. Transcribe all zh characters from left to right. Output ONLY the raw characters (no spaces, no punctuation, no markdown).)ÚCAPTCHA_PROMPT©r   s    r   Úbuild_captcha_promptr!   D   s>   € àð ÝÐð	S¨|ð 	Sð 	SØ&ð	Sð 	Sð 	Sðr   Úraw_textc                 ó  ‡— | sdS |                       ¦   «         }d|v rkt          |                     d¦  «        ¦  «        dk    r|                     d¦  «        d         n|                     dd¦  «        }|                      ¦   «         }d|v rD|                     d¦  «        s/|                     d¦  «        }|d                               ¦   «         }d„ |                     ¦   «         D ¦   «         }|r|d         }t          j        d	d|¦  «                             ¦   «         }d
t          |¦  «        cxk    rdk    rn n|S h d£Št          j	        d| ¦  «        }ˆfd„|D ¦   «         }|rd„ |D ¦   «         }|r|d         S |d         S |S )u  LÃ m sáº¡ch chuá»—i kÃ½ tá»± nháº­n diá»‡n tá»« Vision AI vá»� Ä‘Ãºng chuáº©n mÃ£ Captcha Cá»•ng Thuáº¿ (4-8 kÃ½ tá»± in hoa).
    Há»— trá»£ xá»­ lÃ½ má»�i dáº¡ng pháº£n há»“i tá»« LLM: chuá»—i tráº§n, khá»‘i code markdown, cÃ¢u giáº£i thÃ­ch há»™i thoáº¡i.
    r   z```r   éþÿÿÿú:Úhttpéÿÿÿÿc                 ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S © )Ústrip)Ú.0Úlns     r   ú
<listcomp>z&clean_captcha_text.<locals>.<listcomp>e   s-   € ÐEÐEÐE˜B¸"¿(º(¹*¼*ÐEˆR�XŠX‰ZŒZÐEÐEÐEr   z[^A-Za-z0-9]r
   é   >"   ÚCODEÚHEREÚONLYÚREADÚSEENÚTEXTÚTHATÚTHISÚABOVEÚBELOWÚENTERÚFOUNDÚIMAGEÚINPUTÚSHOWNÚSOLVEÚVALIDÚVALUEÚLETTERÚNUMBERÚOUTPUTÚPLEASEÚRESULTÚSOLVEDÚCAPTCHAÚINVALIDÚLETTERSÚNUMBERSÚ	CHARACTERÚ	FOLLOWINGÚ
CHARACTERSÚ
TRANSCRIBEÚTRANSCRIBEDÚVERIFICATIONz\b[A-Za-z0-9]{3,8}\bc                 ód   •— g | ],}|                      ¦   «         ‰v¯|                      ¦   «         ‘Œ-S r)   )Úupper)r+   ÚtÚnoise_wordss     €r   r-   z&clean_captcha_text.<locals>.<listcomp>x   s:   ø€ ð ð ð Ø Q§W¢W¡Y¤Y°kÐ%AÐ%Aˆ�Š‰	Œ	Ð%AÐ%AÐ%Ar   c                 óv   — g | ]6}t          d „ |D ¦   «         ¦  «        ¯t          d„ |D ¦   «         ¦  «        ¯4|‘Œ7S )c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S ©N)Úisdigit©r+   Úchs     r   ú	<genexpr>z0clean_captcha_text.<locals>.<listcomp>.<genexpr>|   s+   è è € Ð>XÐ>XÐPR¸r¿zºz¹|¼|Ð>XÐ>XÐ>XÐ>XÐ>XÐ>Xr   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S rW   )ÚisalpharY   s     r   r[   z0clean_captcha_text.<locals>.<listcomp>.<genexpr>|   s0   è è € Ð`zÐ`zÐrtÐac×akÒakÑamÔamÐ`zÐ`zÐ`zÐ`zÐ`zÐ`zr   )Úany)r+   Úcs     r   r-   z&clean_captcha_text.<locals>.<listcomp>|   sS   € Ð{Ð{Ð{ !½3Ð>XÐ>XÐVWÐ>XÑ>XÔ>XÑ;XÔ;XÐ{Õ]`Ð`zÐ`zÐxyÐ`zÑ`zÔ`zÑ]zÔ]zÐ{˜AÐ{Ð{Ð{r   )
r*   r   ÚsplitÚreplaceÚ
startswithÚ
splitlinesÚrer   rR   r   )	r"   r   ÚpartsÚlinesÚalphanumericÚtokensÚvalid_candidatesÚmixed_candidatesrT   s	           @r   Úclean_captcha_textrk   O   sß  ø€ ð ð Øˆrà�nŠnÑÔ€GØ�ÐÐõ �7—=’= Ñ'Ô'Ñ(Ô(¨1Ò,Ð,ð �MŠM˜%Ñ Ô  Ô$Ð$à—’ ¨Ñ+Ô+ð 	ð
 —-’-‘/”/ˆà
ˆg€~€~˜g×0Ò0°Ñ8Ô8€~à—’˜cÑ"Ô"ˆØ˜”)—/’/Ñ#Ô#ˆð FÐE '×"4Ò"4Ñ"6Ô"6ÐEÑEÔE€EØð Ø˜”)ˆõ ”6˜/¨2¨wÑ7Ô7×=Ò=Ñ?Ô?€LØ�C�ÑÔÐ"Ð"Ò"Ð" Ò"Ð"Ð"Ð"Ð"ØÐðð ð €Kõ ŒZÐ/°Ñ:Ô:€Fðð ð ð Ø!ðñ ô Ðð ð $Ø{Ð{Ð'7Ð{Ñ{Ô{ÐØð 	(Ø# BÔ'Ð'Ø Ô#Ð#àÐr   c                   ó\  — e Zd ZdZdedefd„Z	 ddedededz  deedz  edz  f         fd	„Z		 ddededz  deedz  edz  f         fd
„Z
	 ddededeedz  edz  f         fd„Z	 ddedededeedz  edz  f         fd„Z	 ddeeef         dz  deeef         fd„Zdeeef         fd„ZdS )ÚInvoiceGdtCaptchaMixinz>Mixin for multi-tier GDT captcha resolution via AI Vision OCR.Úsvg_contentr   c                 óz  ‡— t          ‰¦  «        p‰Š	 ddl}|                     d‰                     d¦  «        ¦  «        }|d                              |                     t          t          ¦  «        d¬¦  «        }|                     d¦  «        }|rt          |¦  «        dk    r|S n4# t          $ r'}t                               d	|› �¦  «         Y d}~nd}~ww xY wˆfd
„}	 d}	 t          j        ¦   «         }n# t          $ r Y nw xY w|rw|                     ¦   «         rct           j                             d¬¦  «        5 }	|	                     |¦  «                             d¬¦  «        cddd¦  «         S # 1 swxY w Y   dS  |¦   «         S # t          $ r#}
t                               d|
› �¦  «         ‚ d}
~
ww xY w)u¦  Render mÃ£ Captcha SVG thÃ nh áº£nh PNG cho Vision AI báº±ng PyMuPDF C++ (fallback Playwright).

        Tiá»�n xá»­ lÃ½ (sá»± cá»‘ 04/10/2026): loáº¡i cÃ¡c Ä‘Æ°á»�ng nhiá»…u fill="none" vÃ  phÃ³ng to
        CAPTCHA_RENDER_SCALE láº§n trÃªn ná»�n tráº¯ng Ä‘áº·c -> cÃ¡c model Ä‘á»�c thá»‘ng nháº¥t hÆ¡n háº³n
        (A/B 6 captcha tháº­t: Ä‘á»“ng thuáº­n tuyá»‡t Ä‘á»‘i 3/3 model tÄƒng tá»« 3/6 lÃªn 5/6 áº£nh).
        r   Nr   úutf-8F)ÚmatrixÚalphaÚpngé2   z+PyMuPDF SVG render fallback to Playwright: c                  óÎ  •— t          ¦   «                              ¦   «         } 	 | j                             d¬¦  «        }	 |                     dddœt
          ¬¦  «        }|                     d‰› d�¦  «         |                     d	¬
¦  «        |                     ¦   «          |  	                    ¦   «          S # |                     ¦   «          w xY w# |  	                    ¦   «          w xY w)NT)ÚheadlesséÈ   é(   )ÚwidthÚheight)ÚviewportÚdevice_scale_factorz9<html><body style='margin:0;padding:0;background:white;'>z</body></html>rs   )Útype)
r   ÚstartÚchromiumÚlaunchÚnew_pageÚCAPTCHA_RENDER_SCALEÚset_contentÚ
screenshotÚcloseÚstop)ÚpÚbrowserÚpagern   s      €r   Ú
_do_renderz=InvoiceGdtCaptchaMixin._render_svg_to_png.<locals>._do_renderŸ   sä   ø€ ÝÑ!Ô!×'Ò'Ñ)Ô)ˆAðØœ*×+Ò+°TÐ+Ñ:Ô:�ð
$Ø"×+Ò+Ø+.¸"Ð!=Ð!=Ý,@ð ,ñ ô �Dð ×$Ò$ØoÐT_ÐoÐoÐoñô ð ð  Ÿ?š?°˜?Ñ6Ô6à—M’M‘O”O�Oà—’‘”��øð —M’M‘O”O�O�Oøøøøà—’‘”��øøøs#   £C ¿AB5 ÂC Â5CÃC ÃC$é   )Úmax_workersé   ©ÚtimeoutzPlaywright render error: )r   ÚpymupdfÚopenÚencodeÚ
get_pixmapÚMatrixr‚   Útobytesr   Ú	ExceptionÚloggerÚwarningÚasyncioÚget_running_loopÚRuntimeErrorÚ
is_runningÚ
concurrentÚfuturesÚThreadPoolExecutorÚsubmitÚresultÚerror)Úselfrn   r�   ÚdocÚpixÚ	png_bytesÚpy_errrŠ   ÚloopÚpoolÚes    `         r   Ú_render_svg_to_pngz)InvoiceGdtCaptchaMixin._render_svg_to_png‡   sf  ø€ õ (¨Ñ4Ô4ÐC¸ˆð	SØˆNˆNˆNØ—,’,˜u k×&8Ò&8¸Ñ&AÔ&AÑBÔBˆCØ�a”&×#Ò#Ø—~’~Õ&:Õ<PÑQÔQØð $ñ ô ˆCð Ÿš EÑ*Ô*ˆIØð !�S ™^œ^¨bÒ0Ð0Ø Ð øøÝð 	Sð 	Sð 	SÝ�NŠNÐQÈÐQÐQÑRÔRÐRÐRÐRÐRÐRÐRøøøøð	Søøøð	ð 	ð 	ð 	ð 	ð$	ØˆDðÝÔ/Ñ1Ô1��øÝð ð ð Ø�ðøøøð ð $˜ŸšÑ)Ô)ð $ÝÔ'×:Ò:ÀqÐ:ÑIÔIð FÈTØŸ;š; zÑ2Ô2×9Ò9À"Ð9ÑEÔEðFð Fð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Føøøð Fð Fð Fð Fð Fð Fð "�z‘|”|Ð#øÝð 	ð 	ð 	Ý�LŠLÐ8°QÐ8Ð8Ñ9Ô9Ð9Øøøøøð	øøøs~   ”BB) Â)
CÂ3CÃCÃ#F Ã&C: Ã9F Ã:
DÄF ÄDÄ9F Å )E6Å)F Å6E:Å:F Å=E:Å>F Æ	F Æ
F:ÆF5Æ5F:NÚdata_uriÚcanonical_model_idr   c           	      óH  — ddl m} ddlm}  |t	          |¦  «        ||dd¬¦  «        }	  |¦   «                              |t          ¬¦  «        }n4# t          $ r'}t           	                    d||¦  «         Y d	}~d
S d	}~ww xY wt          |j        ¦  «        }	|rt          |	¦  «        |k    n&t          t          |	¦  «        cxk    o
t          k    nc }
|
sEt           	                    d|j        |	|pt          › dt          › �|j        pdd	d…         ¦  «         d
S |	|j        fS )us  Má»™t lÆ°á»£t Ä‘á»�c captcha báº±ng 1 model qua Enterprise AI Gateway.

        Tráº£ vá»� (chuá»—i Ä‘Ã£ lÃ m sáº¡ch, model_used thá»±c táº¿) hoáº·c (None, None) náº¿u lá»—i / sai Ä‘á»‹nh dáº¡ng.
        `model_used` lÃ  model THá»°C Sá»° tráº£ lá»�i (cÃ³ thá»ƒ khÃ¡c model yÃªu cáº§u náº¿u gateway fallback),
        dÃ¹ng Ä‘á»ƒ Ä‘áº£m báº£o cÃ¡c phiáº¿u Ä‘á»“ng thuáº­n Ä‘áº¿n tá»« cÃ¡c model khÃ¡c nhau.
        `expected_len` (sá»‘ kÃ½ tá»± suy ra tá»« SVG): náº¿u cÃ³, loáº¡i má»�i báº£n Ä‘á»�c khÃ¡c Ä‘á»™ dÃ i nÃ y
        (vd. flash-lite Ä‘á»�c thiáº¿u 'KXM51' cho áº£nh 6 kÃ½ tá»± trong sá»± cá»‘ 04/10/2026).
        r   )ÚAiVisionRequest)Úget_ai_gatewayg        rt   )Úpromptr¬   r­   ÚtemperatureÚ
max_tokensrŽ   u3   [GDT_CAPTCHA] Model %s lá»—i khi Ä‘á»�c captcha: %sN©NNua   [GDT_CAPTCHA] Model %s tráº£ vá»� chuá»—i sai Ä‘á»‹nh dáº¡ng: '%s' (cáº§n %s kÃ½ tá»±, raw: '%s')ú-r   é<   )Úapp.core.ai.domain.modelsr¯   Ú"app.core.ai.infrastructure.gatewayr°   r!   Úanalyze_vision_syncÚCAPTCHA_READ_TIMEOUT_SECONDSr–   r—   r˜   rk   Úcontentr   r   r   Ú
model_used)r£   r¬   r­   r   r¯   r°   ÚreqÚresprª   r   Ú	length_oks              r   Ú_read_captcha_oncez)InvoiceGdtCaptchaMixin._read_captcha_onceÁ   s€  € ð 	>Ð=Ð=Ð=Ð=Ð=ØEÐEÐEÐEÐEÐEàˆoÝ'¨Ñ5Ô5ØØ1ØØð
ñ 
ô 
ˆð	Ø!�>Ñ#Ô#×7Ò7¸ÕEaÐ7ÑbÔbˆDˆDøÝð 	ð 	ð 	Ý�NŠNÐPÐRdÐfgÑhÔhÐhØ�:�:�:�:�:øøøøð	øøøõ % T¤\Ñ2Ô2ˆð ðD�C�‰LŒL˜LÒ(Ð(å ¥C¨¡L¤LÐCÐCÒCÐCµOÒCÐCÐCÐCð 	ð
 ð 	Ý�NŠNØsØ”ØØÐF¥?Ð FÐ Fµ_Ð FÐ FØ”Ð#  S b SÔ)ñô ð ð �:Ø˜œÐ'Ð's   «$A Á
BÁA<Á<Bc           	      ó°  — i }g }t           D �]
}|                      |||¦  «        \  }}|r|s|                     |› d�¦  «         Œ:|                     |› d|› �¦  «         |                     |t	          ¦   «         ¦  «        }|                     |¦  «         t          |¦  «        t          k    rgt           	                    d|t          |¦  «        d                     |¦  «        ¦  «         |dd                     t          |¦  «        ¦  «        › d�fc S �Œdd                     |¦  «        › d	�| _        t                               d
| j        ¦  «         dS )u•  Giáº£i mÃ£ captcha báº±ng cÆ¡ cháº¿ Ä�á»’NG THUáº¬N Ä�A MODEL (Multi-model Consensus).

        Bá»‘i cáº£nh (sá»± cá»‘ 03/10/2026): 1 model Ä‘á»�c nháº§m 1 kÃ½ tá»± ('MD3F8C') -> Cá»•ng Thuáº¿ tá»« chá»‘i,
        tá»‘n 1 lÆ°á»£t Ä‘Äƒng nháº­p vÃ  kÃ­ch hoáº¡t cooldown 3 giá»�. Hai láº§n nhÆ° váº­y liÃªn tiáº¿p sáº½ ngáº¯t máº¡ch
        toÃ n bá»™ lá»‹ch Ä‘á»“ng bá»™.

        Quy táº¯c:
          1. Láº§n lÆ°á»£t há»�i cÃ¡c model trong CAPTCHA_READER_MODELS (khÃ¡c kiáº¿n trÃºc -> lá»—i Ä‘á»™c láº­p).
             KhÃ´ng gá»�i láº·p cÃ¹ng 1 model vÃ¬ temperature=0 sáº½ láº·p láº¡i Ä‘Ãºng káº¿t quáº£ sai.
          2. Cháº¥p nháº­n ngay khi cÃ³ >= CAPTCHA_MIN_AGREEING_MODELS model KHÃ�C NHAU (theo
             model_used thá»±c táº¿) tráº£ vá»� cÃ¹ng 1 chuá»—i. ThÆ°á»�ng chá»‰ tá»‘n 2 lÆ°á»£t gá»�i.
          3. KhÃ´ng Ä‘á»“ng thuáº­n -> tráº£ (None, None): luá»“ng gá»�i sáº½ Ä‘á»•i áº£nh captcha má»›i, KHÃ”NG gá»­i
             mÃ£ chÆ°a cháº¯c cháº¯n lÃªn Cá»•ng Thuáº¿.
          4. `expected_len` (tá»« count_captcha_glyphs) Ä‘Æ°á»£c truyá»�n cho tá»«ng model: báº£n Ä‘á»�c sai Ä‘á»™
             dÃ i bá»‹ loáº¡i, khÃ´ng Ä‘Æ°á»£c tÃ­nh phiáº¿u.
        u   =<lá»—i>ú=uL   [GDT_CAPTCHA] Ä�á»“ng thuáº­n captcha [%s] tá»« %s (cÃ¡c lÆ°á»£t Ä‘á»�c: %s)z, zAI Gateway consensus [z + ú]u@   CÃ¡c model AI khÃ´ng thá»‘ng nháº¥t káº¿t quáº£ Ä‘á»�c captcha (uP   ). Ä�á»•i áº£nh má»›i thay vÃ¬ gá»­i mÃ£ chÆ°a cháº¯c cháº¯n lÃªn Cá»•ng Thuáº¿.z[GDT_CAPTCHA] %sr´   )r   rÀ   ÚappendÚ
setdefaultÚsetÚaddr   ÚCAPTCHA_MIN_AGREEING_MODELSr—   ÚinfoÚsortedÚjoinÚ_last_captcha_errorr˜   )	r£   r¬   r   ÚvotesÚreadingsÚmodel_idÚvaluer¼   Úvoterss	            r   Ú_solve_with_ai_gatewayz-InvoiceGdtCaptchaMixin._solve_with_ai_gatewayí   s}  € ð& &(ˆØ ˆå-ð 	Uñ 	UˆHØ $× 7Ò 7¸À(ÈLÑ YÔ YÑˆE�:Øð  
ð Ø—’ 8Ð 5Ð 5Ð 5Ñ6Ô6Ð6Øà�OŠO˜zÐ3Ð3¨EÐ3Ð3Ñ4Ô4Ð4Ø×%Ò% e­S©U¬UÑ3Ô3ˆFØ�JŠJ�zÑ"Ô"Ð"å�6‰{Œ{Õ9Ò9Ð9Ý—’ØbØÝ˜6‘N”NØ—I’I˜hÑ'Ô'ñ	ô ð ð ÐT°u·z²zÅ&ÈÁ.Ä.Ñ7QÔ7QÐTÐTÐTÐTÐTÐTÐTñ :ð]ÈtÏyÊyÐYaÑObÔObð ]ð ]ð ]ð 	Ô õ 	�ŠÐ)¨4Ô+CÑDÔDÐDØˆzr   r   Úapi_keyc                 ó   — dS ©zSBackward compatibility hook for test mocks. In production, delegates to AI Gateway.r´   r)   )r£   r¬   rÓ   s      r   Ú_solve_with_openrouterz-InvoiceGdtCaptchaMixin._solve_with_openrouter  ó	   € ð ˆzr   Úbase_urlc                 ó   — dS rÕ   r)   )r£   r¬   rÓ   rØ   s       r   Ú_solve_with_gemini_directz0InvoiceGdtCaptchaMixin._solve_with_gemini_direct#  r×   r   Úextra_configc                 ó  — t          j        ¦   «         }d|_        t           j        |_        d}d}t          d|dz   ¦  «        D �]´}t          j                             dddi¬¦  «        }	 t          j         	                    |d	|¬
¦  «        5 }t          j        |                     ¦   «                              d¦  «        ¦  «        }|                     dd¦  «        }	|                     dd¦  «        }
ddd¦  «         n# 1 swxY w Y   nU# t          $ rH}d|› �}t                                d|› d|› d|› �¦  «         ||k     rY d}~�Œt%          |¦  «        ‚d}~ww xY w|	r|
s<d}t                                d|› d|› d|› �¦  «         ||k     r�ŒMt%          |¦  «        ‚	 |                      |
¦  «        }nM# t          $ r@}t                                d|› �¦  «         ||k     rY d}~�Œ¦t%          d|› �¦  «        ‚d}~ww xY wt+          j        |¦  «                             d¦  «        }d|› �}|                      |d¦  «        \  }}|s|                      |dd¦  «        \  }}|s'|                      |t5          |
¦  «        ¬¦  «        \  }}|r/t                                d|› d|› d|› d|	› d|› �
¦  «         |	|fc S t9          | dd¦  «        pd}|}t                                d|› d|› d|› d �¦  «         �Œ¶t%          d!|› d"|› d#�¦  «        ‚)$u�   Táº£i mÃ£ Captcha SVG tá»« Cá»•ng Thuáº¿ vÃ  giáº£i mÃ£ tá»± Ä‘á»™ng báº±ng Enterprise AI Gateway vá»›i cÆ¡ cháº¿ thá»­ láº¡i tá»‘i Ä‘a 3 láº§n.Fr
   u   KhÃ´ng thá»ƒ giáº£i mÃ£ Captchar‹   z+https://hoadondientu.gdt.gov.vn/api/captchaz
User-AgentzMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 DSConsERP/2.4.0)Úheadersé
   )r�   Úcontextrp   Úkeyr   r»   Nu@   KhÃ´ng thá»ƒ láº¥y mÃ£ Captcha tá»« Cá»•ng Tá»•ng Cá»¥c Thuáº¿: u   [GDT_CAPTCHA] Láº§n ú/z: uU   KhÃ´ng thá»ƒ láº¥y mÃ£ Captcha tá»« Cá»•ng Tá»•ng Cá»¥c Thuáº¿ (pháº£n há»“i rá»—ng).u#   Lá»—i render SVG Captcha sang PNG: u)   Lá»—i render SVG Captcha sang áº£nh PNG: zdata:image/png;base64,r    u   Solved GDT Captcha (láº§n z): [z] for key [z] via rÌ   u   Lá»—i káº¿t ná»‘i AI Gatewayu     giáº£i mÃ£ chÆ°a thÃ nh cÃ´ng (u+   ). Ä�ang thá»­ láº¡i vá»›i Captcha má»›i...uL   KhÃ´ng thá»ƒ giáº£i mÃ£ Captcha Cá»•ng Thuáº¿ qua Enterprise AI Gateway sau u    láº§n thá»­ (uD   ). Vui lÃ²ng kiá»ƒm tra láº¡i cáº¥u hÃ¬nh Gemini/OpenRouter API Key.)ÚsslÚcreate_default_contextÚcheck_hostnameÚ	CERT_NONEÚverify_modeÚrangeÚurllibÚrequestÚRequestÚurlopenÚjsonÚloadsÚreadÚdecodeÚgetr–   r—   r˜   Ú
ValueErrorr«   r¢   Úbase64Ú	b64encoderÖ   rÚ   rÒ   r   rÉ   Úgetattr)r£   rÛ   ÚctxÚmax_attemptsÚlast_failure_reasonÚattemptr½   ÚrÚdataÚckeyr   Úexcr¦   rª   Úpng_b64r¬   ÚcvalueÚprovider_usedÚ
err_details                      r   Ú_solve_gdt_captchaz)InvoiceGdtCaptchaMixin._solve_gdt_captcha)  sU  € õ Ô(Ñ*Ô*ˆØ"ˆÔÝœ-ˆŒàˆØ?Ðå˜Q ¨qÑ 0Ñ1Ô1ð :	ñ :	ˆGå”.×(Ò(Ø=à ð  #dðð )ñ ô ˆCð
6Ý”^×+Ò+¨C¸ÀSÐ+ÑIÔIð 2ÈQÝœ: a§f¢f¡h¤h§o¢o°gÑ&>Ô&>Ñ?Ô?�DØŸ8š8 E¨2Ñ.Ô.�DØŸ(š( 9¨bÑ1Ô1�Cð2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2øøõ ð 6ð 6ð 6Ø&nÐilÐ&nÐ&nÐ#Ý—’Ðe°gÐeÐeÀÐeÐeÐPcÐeÐeÑfÔfÐfØ˜\Ò)Ð)Ø�H�H�H‘HÝ Ð!4Ñ5Ô5Ð5øøøøð6øøøð ð 6˜sð 6Ø&}Ð#Ý—’Ðe°gÐeÐeÀÐeÐeÐPcÐeÐeÑfÔfÐfØ˜\Ò)Ð)ÙÝ Ð!4Ñ5Ô5Ð5ðRØ ×3Ò3°CÑ8Ô8�	�	øÝð Rð Rð RÝ—’ÐFÀ1ÐFÐFÑGÔGÐGØ˜\Ò)Ð)Ø�H�H�H‘HÝ Ð!PÈQÐ!PÐ!PÑQÔQÐQøøøøð	Røøøõ Ô& yÑ1Ô1×8Ò8¸ÑAÔAˆGØ9°Ð9Ð9ˆHð %)×$?Ò$?ÀÈ"Ñ$MÔ$MÑ!ˆF�MØð YØ(,×(FÒ(FÀxÐQSÐUWÑ(XÔ(XÑ%�˜Øð Ø(,×(CÒ(CØÕ+?ÀÑ+DÔ+Dð )Dñ )ô )Ñ%�˜ð ð $Ý—’Ø{°Ð{Ð{¸<Ð{Ð{ÈVÐ{Ð{Ð`dÐ{Ð{ÐlyÐ{Ð{ñô ð ð ˜V�|Ð#Ð#Ð#å  Ð'<¸dÑCÔCÐeÐGeˆJØ",ÐÝ�NŠNð W wð  Wð  W°ð  Wð  WÐ_ið  Wð  Wð  Wñô ð ñ õ ð QÐ[gð  Qð  Qð  xKð  Qð  Qð  Qñ
ô 
ð 	
sa   Á*"D
ÂA&C>Ã2D
Ã>D	ÄD
ÄD	ÄD
Ä

EÄ.EÅEÅEÆ F6Æ6
H Ç #G;Ç)G;Ç;H c                 ó*   — |                       ¦   «         S )u&   Wrapper giá»¯ tÆ°Æ¡ng thÃ­ch ngÆ°á»£c.)r  )r£   s    r   Ú"_solve_gdt_captcha_with_openrouterz9InvoiceGdtCaptchaMixin._solve_gdt_captcha_with_openroutert  s   € à×&Ò&Ñ(Ô(Ð(r   rW   )r   )r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚbytesr«   ÚintÚtuplerÀ   rÒ   rÖ   rÚ   Údictr   r  r  r)   r   r   rm   rm   „   sé  € € € € € ØHÐHð8¨cð 8°eð 8ð 8ð 8ð 8ðv RVð*(ð *(Øð*(Ø14ð*(ØDGÈ$ÁJð*(à	ˆs�T‰z˜3 ™:Ð%Ô	&ð*(ð *(ð *(ð *(ðZ 9=ð.ð .Øð.Ø+.°©:ð.à	ˆs�T‰z˜3 ™:Ð%Ô	&ð.ð .ð .ð .ðb -/ðð ØðØ&)ðà	ˆs�T‰z˜3 ™:Ð%Ô	&ðð ð ð ð ACðð ØðØ&)ðØ:=ðà	ˆs�T‰z˜3 ™:Ð%Ô	&ðð ð ð ð 59ðI
ð I
Ø   c œN¨TÑ1ðI
à	ˆs�CˆxŒðI
ð I
ð I
ð I
ðV)°E¸#¸s¸(´Oð )ð )ð )ð )ð )ð )r   rm   rW   )(r™   rò   Úconcurrent.futuresr�   rì   Úloggingrd   râ   Úurllib.errorrè   Úurllib.requestÚtypingr   Úplaywright.sync_apir   Úapp.core.settingsr   Ú	getLoggerr  r—   r   r  r  Ú__annotations__rÈ   r   r   rº   r   r‚   ÚcompileÚ
IGNORECASEr   r   r   r
  r   r!   rk   rm   r)   r   r   ú<module>r     s  ðØ €€€€Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø 	€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð à /Ð /Ð /Ð /Ð /Ð /à *Ð *Ð *Ð *Ð *Ð *à	ˆÔ	˜8Ñ	$Ô	$€ð
/Ð �u˜S # s˜]Ô+ð ð ñ ð
  Ð Ø€Ø€Ø#Ð ðOð ð
 Ð ð �”ØHØ„Mñô €ð ˆrŒzÐ*¨B¬MÑ:Ô:€ð'˜3 ™:ð '¨#ð 'ð 'ð 'ð 'ð
B˜c D™jð 
B¨S°4©Zð 
Bð 
Bð 
Bð 
Bðð  s¨T¡zð ¸Sð ð ð ð ð2  t¡ð 2°ð 2ð 2ð 2ð 2ðjr)ð r)ð r)ð r)ð r)ñ r)ô r)ð r)ð r)ð r)r   