§
    ™zÈjnz  ã                   óh  — d 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Zddl	Z
ddlZddlmZ  ee¦  «                             ¦   «         j        j        Zej                             d eedz  ¦  «        ¦  «         ddlmZmZmZmZmZ ddlZ ej        d¬¦  «        d	„ ¦   «         Z	 	 	 	 	 	 	 d&dedededededede dedefd„Z! G d„ d¦  «        Z" G d„ d¦  «        Z# G d„ d¦  «        Z$ G d „ d!¦  «        Z% G d"„ d#¦  «        Z&e'd$k    r$ed%gZ( ej)         ej*        e(¦  «        ¦  «         dS dS )'uÅ  
=============================================================================
THáº¬P NGÅ¨ NIÃŠN (THE FIFTEEN SPRINGS) - CRITIC QUALITY GATE TEST SUITE
=============================================================================
Authoritative Test Suite for Milestone M1: 2-Tier Quality Gate & Classifier.
Tests:
1. VideoCriticVerdict & Sub-models Pydantic Schema Validation:
   - ShotEvaluation, SceneEvaluation, VideoCriticVerdict fields and constraints.
   - Threshold synchronization: approved == (overall_score >= 0.8) and actions.
   - Serialization & JSON roundtrip validation.
2. evaluate_shot_gate (Táº§ng 1 - Shot Gate):
   - Valid input evaluation (score >= 0.8, approved == True, suggested_action == 'APPROVE').
   - Defect detection: missing file, corrupted stream, black frames, frozen frames.
   - Character cross-contamination detection (ThÃºy Kiá»�u in Kim Trá»�ng shot).
3. evaluate_scene_gate (Táº§ng 2 - Scene Gate):
   - Smooth junction between sequential shots.
   - Color continuity and trigger_color_match when color delta exceeds threshold.
   - Pacing & static freeze detection (trigger_trim_static).
   - Missing/invalid input resilience.
4. Shot Take Classification & resolve_start_frame:
   - shot_num == 1 -> CINEMATIC_CUT (independent Start Frame, NEVER prev_tail).
   - Changing character_anchor -> CINEMATIC_CUT.
   - Identical character_anchor -> CONTINUOUS_TAKE (loads prev_tail).
   - resolve_start_frame_v2 returns (frame_path, take_type).
5. Character Invariant Safeguard:
   - Resolving Kim Trá»�ng shots NEVER returns ThÃºy Kiá»�u image paths under any condition,
     even with corrupted/adversarial prompt data.
=============================================================================
é    N)ÚPath)ÚValidationErrorÚ05_Production_Pipeline)ÚVideoCriticVerdictÚShotEvaluationÚSceneEvaluationÚevaluate_shot_gateÚevaluate_scene_gateÚsession©Úscopec              #   ó‚   K  — |                       d¦  «        }|V — t          j        t          |¦  «        d¬¦  «         dS )uC   Táº¡o thÆ° má»¥c táº¡m thá»�i Ä‘á»ƒ sinh cÃ¡c video thá»­ nghiá»‡m.Úcritic_test_mediaT)Úignore_errorsN)ÚmktempÚshutilÚrmtreeÚstr)Útmp_path_factoryÚtemp_dirs     ú/C:\Projects\KieuStory\tests\test_critic_gate.pyÚmedia_sandboxr   ;   sF   è è € ð  ×&Ò&Ð':Ñ;Ô;€HØ
€N€N€Nå
„M•#�h‘-”-¨tÐ4Ñ4Ô4Ð4Ð4Ð4ó    é0   é   é   éÐ  Úgradient©éd   é–   éÈ   Úoutput_pathÚ
num_framesÚfpsÚwidthÚheightÚmodeÚ
base_colorÚstart_frame_idxÚreturnc                 ót  — t          j        dŽ }t          j        t          | ¦  «        ||||f¦  «        }		 t	          |¦  «        D �]Â}
||
z   }|dk    r%t          j        ||dft
          j        ¬¦  «        }�nz|dk    r&t          j        ||df|t
          j        ¬¦  «        }�nN|dk    r&t          j        ||df|t
          j        ¬¦  «        }�n"|dk    rìt          j        ||dft
          j        ¬¦  «        }|\  }}}t          t          j
        |dz  ¦  «        d	z  ¦  «        }t          j        ||z   d
d¦  «        |dd…dd…d
f<   t          j        ||z   d
d¦  «        |dd…dd…df<   t          j        ||z   d
d¦  «        |dd…dd…df<   t          d|dz  dz  z   ¦  «        }t          j        ||dfddd¦  «         n0t
          j                             d
d||dft
          j        ¬¦  «        }|	                     |¦  «         �ŒÄ	 |	                     ¦   «          n# |	                     ¦   «          w xY w| S )uI   Sinh video MP4 há»£p lá»‡ vá»›i cÃ¡c Ä‘áº·c tÃ­nh thá»‹ giÃ¡c cá»¥ thá»ƒ.Úmp4vÚblacké   )ÚdtypeÚfrozenÚsolidr   g      8@é   r   éÿ   Né   é   r    r"   é(   )r4   r4   r4   éÿÿÿÿ)Úcv2ÚVideoWriter_fourccÚVideoWriterr   ÚrangeÚnpÚzerosÚuint8ÚfullÚintÚsinÚclipÚcircleÚrandomÚrandintÚwriteÚrelease)r#   r$   r%   r&   r'   r(   r)   r*   ÚfourccÚoutÚiÚ	frame_idxÚframeÚbÚgÚrÚoffsetÚcircle_xs                     r   Ú_create_synthetic_videorS   D   sI  € õ Ô# VÐ,€FÝ
Œ/�#˜kÑ*Ô*¨F°C¸%À¸Ñ
IÔ
I€CðÝ�zÑ"Ô"ð 	ñ 	ˆAØ'¨!Ñ+ˆIØ�wŠˆÝœ &¨%°Ð!3½2¼8ÐDÑDÔD�‘Ø˜Ò!Ð!åœ ¨°Ð 2°JÅbÄhÐOÑOÔO�‘Ø˜’�Ýœ ¨°Ð 2°JÅbÄhÐOÑOÔO�‘Ø˜Ò#Ð#åœ &¨%°Ð!3½2¼8ÐDÑDÔD�Ø$‘��1�aÝ�RœV I°Ñ$4Ñ5Ô5¸Ñ9Ñ:Ô:�Ý!#¤¨¨V©°Q¸Ñ!<Ô!<��a�a�a˜˜˜˜A�g‘Ý!#¤¨¨V©°Q¸Ñ!<Ô!<��a�a�a˜˜˜˜A�g‘Ý!#¤¨¨V©°Q¸Ñ!<Ô!<��a�a�a˜˜˜˜A�g‘å˜s i°#¡o¸Ñ%:Ñ:Ñ;Ô;�Ý”
˜5 8¨S /°2°ÈÑKÔKÐKÐKåœ	×)Ò)¨!¨S°6¸5À!Ð2DÍBÌHÐ)ÑUÔU�à�IŠI�eÑÔÐÑð/	ð2 	�Š‰Œˆˆøˆ�Š‰ŒˆˆøøøØÐs   ¶GH ÈH5c                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestVideoCriticVerdictSchemac                 óÂ   — t          ddg ddd¬¦  «        }t          dd|dd¬¦  «        }|j        du sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        j        du sJ ‚d	S )
uI   Kiá»ƒm tra schema VideoCriticVerdict vá»›i Ä‘iá»ƒm Ä‘áº¡t chuáº©n >= 0.8.Tgffffffî?Fgq=
×£pí?)Úcharacter_matchÚcharacter_confidenceÚvisual_defectsÚsquint_or_extra_limbsÚaudio_guard_okÚscoreÚAPPROVEu2   CÃº mÃ¡y Ä‘áº¡t chuáº©n Ä‘iá»‡n áº£nh hoÃ n háº£o.©Úoverall_scoreÚapprovedÚ	shot_evalÚsuggested_actionÚcritique_notesN)r   r   r`   r_   rb   ra   rW   ©Úselfra   Úverdicts      r   Ú"test_schema_valid_approved_verdictz?TestVideoCriticVerdictSchema.test_schema_valid_approved_verdictt   s¨   € å"Ø Ø!%ØØ"'ØØð
ñ 
ô 
ˆ	õ %ØØØØ&ØOð
ñ 
ô 
ˆð Ô 4Ð'Ð'Ð'Ð'ØÔ$¨Ò,Ð,Ð,Ð,ØÔ'¨9Ò4Ð4Ð4Ð4ØÔ Ô0°DÐ8Ð8Ð8Ð8Ð8Ð8r   c                 ó†   — t          dddgd¬¦  «        }t          dd|dd¬	¦  «        }|j        du sJ ‚|j        dk    sJ ‚d
S )u>   Ä�iá»ƒm dÆ°á»›i 0.8 báº¯t buá»™c pháº£i cÃ³ approved == False.Tgffffffæ?z
Micro-blurg      è?)rW   rX   rY   r\   FÚRETAKE_SHOTu#   Ä�iá»ƒm khÃ´ng Ä‘áº¡t ngÆ°á»¡ng 0.8r^   N)r   r   r`   r_   rd   s      r   Ú*test_schema_rejected_score_below_thresholdzGTestVideoCriticVerdictSchema.test_schema_rejected_score_below_thresholdŠ   sy   € å"Ø Ø!%Ø(˜>Øð	
ñ 
ô 
ˆ	õ %ØØØØ*Ø@ð
ñ 
ô 
ˆð Ô 5Ð(Ð(Ð(Ð(ØÔ$¨Ò,Ð,Ð,Ð,Ð,Ð,r   c                 óv   — t          dd¬¦  «        }|j        du sJ ‚t          dd¬¦  «        }|j        du sJ ‚dS )u+   Kiá»ƒm tra chÃ­nh xÃ¡c ngÆ°á»¡ng biÃªn 0.8.çš™™™™™é?r]   )r_   rb   TgÅ °rh‘é?FN©r   r`   )re   Úv_80Úv_799s      r   Útest_schema_score_boundary_80z:TestVideoCriticVerdictSchema.test_schema_score_boundary_80œ   sR   € å!°ÀyÐQÑQÔQˆØŒ} Ð$Ð$Ð$Ð$å"°ÈÐSÑSÔSˆØŒ~ Ð&Ð&Ð&Ð&Ð&Ð&r   c                 ó@   — t          ddd¬¦  «        }|j        du sJ ‚dS )u\   Náº¿u suggested_action lÃ  RETAKE_SHOT thÃ¬ approved luÃ´n lÃ  False ká»ƒ cáº£ score >= 0.8.gÍÌÌÌÌÌì?ri   u>   NhÃ¢n váº­t sai lá»‡ch nghiÃªm trá»�ng yÃªu cáº§u render láº¡i)r_   rb   rc   FNrm   ©re   rf   s     r   Ú,test_schema_retake_action_overrides_approvalzITestVideoCriticVerdictSchema.test_schema_retake_action_overrides_approval¤   s;   € å$ØØ*Ø[ð
ñ 
ô 
ˆð
 Ô 5Ð(Ð(Ð(Ð(Ð(Ð(r   c                 ó”  — t          j        t          ¦  «        5  t          dd¬¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          ¦  «        5  t          dd¬¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          ¦  «        5  t	          dd¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )uS   Kiá»ƒm tra rÃ ng buá»™c miá»�n giÃ¡ trá»‹ cá»§a ShotEvaluation vÃ  SceneEvaluation.g      ø?ç      à?)rX   r\   Ngš™™™™™¹¿g       @)Újunction_smoothnessr\   )ÚpytestÚraisesr   r   r   ©re   s    r   Ú test_schema_submodel_constraintsz=TestVideoCriticVerdictSchema.test_schema_submodel_constraints­   s³  € åŒ]�?Ñ+Ô+ð 	@ð 	@Ý°¸3Ð?Ñ?Ô?Ð?ð	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@õ Œ]�?Ñ+Ô+ð 	Að 	AÝ°¸4Ð@Ñ@Ô@Ð@ð	Að 	Að 	Añ 	Aô 	Að 	Að 	Að 	Að 	Að 	Að 	Aøøøð 	Að 	Að 	Að 	Aõ Œ]�?Ñ+Ô+ð 	@ð 	@Ý°¸3Ð?Ñ?Ô?Ð?ð	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@ð 	@ð 	@s0   š8¸<¿<ÁA:Á:A>ÂA>ÂB=Â=CÃCc                 ó  — t          ddt          dd¬¦  «        dd¬¦  «        }|                     ¦   «         }t          j        |¦  «        }|j        |j        k    sJ ‚|j        |j        k    sJ ‚|j        j        |j        j        k    sJ ‚dS )u?   Kiá»ƒm tra kháº£ nÄƒng serialize/deserialize JSON trá»�n váº¹n.g)\�Âõ(ì?T)rW   r\   r]   zJSON serialization checkr^   N)r   r   Úmodel_dump_jsonÚmodel_validate_jsonr_   r`   ra   r\   )re   ÚoriginalÚjson_strÚrestoreds       r   Útest_schema_json_roundtripz7TestVideoCriticVerdictSchema.test_schema_json_roundtrip¸   s¦   € å%ØØÝ$°TÀÐFÑFÔFØ&Ø5ð
ñ 
ô 
ˆð ×+Ò+Ñ-Ô-ˆÝ%Ô9¸(ÑCÔCˆØÔ%¨Ô)?Ò?Ð?Ð?Ð?ØÔ  HÔ$5Ò5Ð5Ð5Ð5ØÔ!Ô'¨8Ô+=Ô+CÒCÐCÐCÐCÐCÐCr   N)	Ú__name__Ú
__module__Ú__qualname__rg   rj   rp   rs   rz   r�   © r   r   rU   rU   s   sv   € € € € € ð9ð 9ð 9ð,-ð -ð -ð$'ð 'ð 'ð)ð )ð )ð	@ð 	@ð 	@ðDð Dð Dð Dð Dr   rU   c                   ó>   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	S )
ÚTestEvaluateShotGatec                 ó2  — |dz  }t          |ddd¬¦  «         t          dt          |¦  «        ddd	¬
¦  «        }|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚|j        €J ‚|j        j        du sJ ‚t          |j        j	        ¦  «        dk    sJ ‚dS )uS   Tháº©m Ä‘á»‹nh video há»£p lá»‡, khÃ´ng dá»‹ táº­t: káº¿t quáº£ >= 0.8 vÃ  APPROVE.zvalid_shot_10s.mp4éx   r   )r‰   é    r"   ©r$   r(   r)   Úep01_scene02_shot04Ú	vuong_ongu0   Trung cáº­n VÆ°Æ¡ng Ã”ng 55 tuá»•i Ä‘Ä©nh Ä‘áº¡cÚ	heuristic)Úshot_idÚ
video_pathÚexpected_characterÚpromptÚforce_enginerl   Tr]   Nr   )
rS   r	   r   r_   r`   rb   ra   rW   ÚlenrY   )re   r   Úvid_pathrf   s       r   Ú#test_evaluate_shot_gate_valid_videoz8TestEvaluateShotGate.test_evaluate_shot_gate_valid_videoÍ   s×   € à Ð#7Ñ7ˆÝ °S¸zÐVeÐfÑfÔfÐfå$Ø)Ý˜8‘}”}Ø*ØEØ$ð
ñ 
ô 
ˆð Ô$¨Ò+Ð+Ð+Ð+ØÔ 4Ð'Ð'Ð'Ð'ØÔ'¨9Ò4Ð4Ð4Ð4ØÔ Ð,Ð,Ð,ØÔ Ô0°DÐ8Ð8Ð8Ð8Ý�7Ô$Ô3Ñ4Ô4¸Ò9Ð9Ð9Ð9Ð9Ð9r   c                 ó¢   — t          dddd¬¦  «        }|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚d	|j        j        d
         v sJ ‚dS )uD   File khÃ´ng tá»“n táº¡i pháº£i tráº£ vá»� score 0.0 vÃ  RETAKE_SHOT.Úep01_scene02_shot99znonexistent_fake_video.mp4r�   rŽ   )r�   r�   r‘   r“   ç        Fri   zdoes not existr   N)r	   r_   r`   rb   ra   rY   rr   s     r   Ú$test_evaluate_shot_gate_missing_filez9TestEvaluateShotGate.test_evaluate_shot_gate_missing_fileà   s‚   € å$Ø)Ø3Ø*Ø$ð	
ñ 
ô 
ˆð Ô$¨Ò+Ð+Ð+Ð+ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8Ø 7Ô#4Ô#CÀAÔ#FÐFÐFÐFÐFÐFÐFr   c                 óÂ   — |dz  }|                      d¦  «         t          dt          |¦  «        d¬¦  «        }|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚d	S )
uT   File rá»—ng hoáº·c bá»‹ há»�ng khÃ´ng Ä‘á»�c Ä‘Æ°á»£c pháº£i tráº£ vá»� RETAKE_SHOT.zcorrupted_shot.mp4s   THIS_IS_NOT_A_VALID_MP4_HEADERÚep01_scene02_shot05rŽ   ©r�   r�   r“   r™   Fri   N)Úwrite_bytesr	   r   r_   r`   rb   )re   r   Úcorrupt_pathrf   s       r   Ú$test_evaluate_shot_gate_corrupt_filez9TestEvaluateShotGate.test_evaluate_shot_gate_corrupt_fileí   s‹   € à$Ð';Ñ;ˆØ× Ò Ð!BÑCÔCÐCå$Ø)Ý˜<Ñ(Ô(Ø$ð
ñ 
ô 
ˆð
 Ô$¨Ò+Ð+Ð+Ð+ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8Ð8Ð8r   c                 ó  — |dz  }t          |dd¬¦  «         t          dt          |¦  «        d¬¦  «        }|j        dk     sJ ‚|j        d	u sJ ‚t          d
„ |j        j        D ¦   «         ¦  «        sJ ‚|j        dk    sJ ‚dS )uW   Video toÃ n mÃ u Ä‘en (black frames) pháº£i bá»‹ pháº¡t Ä‘iá»ƒm vÃ  phÃ¡t hiá»‡n lá»—i.zdefect_black.mp4r   r.   )r$   r(   Úep01_scene02_shot06rŽ   r�   rl   Fc              3   ó   K  — | ]}d |v V — Œ	dS )zBlack frameNr…   ©Ú.0Úds     r   ú	<genexpr>zRTestEvaluateShotGate.test_evaluate_shot_gate_black_frame_defect.<locals>.<genexpr>  s'   è è € ÐPÐP¨!�= AÐ%ÐPÐPÐPÐPÐPÐPr   ri   N)	rS   r	   r   r_   r`   Úanyra   rY   rb   )re   r   Ú
black_pathrf   s       r   Ú*test_evaluate_shot_gate_black_frame_defectz?TestEvaluateShotGate.test_evaluate_shot_gate_black_frame_defectû   s²   € à"Ð%7Ñ7ˆ
Ý 
°rÀÐHÑHÔHÐHå$Ø)Ý˜:‘”Ø$ð
ñ 
ô 
ˆð
 Ô$ sÒ*Ð*Ð*Ð*ØÔ 5Ð(Ð(Ð(Ð(ÝÐPÐP¨wÔ/@Ô/OÐPÑPÔPÑPÔPÐPÐPÐPØÔ'¨=Ò8Ð8Ð8Ð8Ð8Ð8r   c                 ó  — |dz  }t          |ddd¬¦  «         t          dt          |¦  «        d¬¦  «        }t          d	„ |j        j        D ¦   «         ¦  «        sJ ‚|j        d
k    sJ ‚|j        du sJ ‚|j        dk    sJ ‚dS )ub   Video bá»‹ Ä‘Æ¡ cá»©ng (frozen frames, khÃ´ng cÃ³ chuyá»ƒn Ä‘á»™ng vi mÃ´) pháº£i bá»‹ ghi nháº­n.zdefect_frozen.mp4r   r1   ©r    r    r    r‹   Úep01_scene02_shot07rŽ   r�   c              3   ó   K  — | ]}d |v V — Œ	dS )ÚFrozenNr…   r¤   s     r   r§   zSTestEvaluateShotGate.test_evaluate_shot_gate_frozen_video_defect.<locals>.<genexpr>  s&   è è € ÐKÐK Q�8˜q�=ÐKÐKÐKÐKÐKÐKr   çÍÌÌÌÌÌä?Fri   N)	rS   r	   r   r¨   ra   rY   r_   r`   rb   ©re   r   Úfrozen_pathrf   s       r   Ú+test_evaluate_shot_gate_frozen_video_defectz@TestEvaluateShotGate.test_evaluate_shot_gate_frozen_video_defect
  s·   € à#Ð&9Ñ9ˆÝ ¸ÀÐVeÐfÑfÔfÐfå$Ø)Ý˜;Ñ'Ô'Ø$ð
ñ 
ô 
ˆõ
 ÐKÐK¨'Ô*;Ô*JÐKÑKÔKÑKÔKÐKÐKÐKØÔ$¨Ò,Ð,Ð,Ð,ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8Ð8Ð8r   c                 ó¾   — |dz  }t          |ddd¬¦  «         t          dt          |¦  «        d¬¦  «        }|j        d	k    sJ ‚|j        d
u sJ ‚|j        dk    sJ ‚dS )uU   Video bá»‹ Ä‘Æ¡ cá»©ng pháº£i bá»‹ tá»« chá»‘i vá»›i Ä‘iá»ƒm <= 0.65 vÃ  RETAKE_SHOT.zdefect_frozen_reject.mp4r   r1   r¬   r‹   r­   rŽ   ©r“   r°   Fri   N)rS   r	   r   r_   r`   rb   r±   s       r   Ú-test_evaluate_shot_gate_frozen_video_rejectedzBTestEvaluateShotGate.test_evaluate_shot_gate_frozen_video_rejected  s…   € à#Ð&@Ñ@ˆÝ ¸ÀÐVeÐfÑfÔfÐfÝ$Ð%:½CÀÑ<LÔ<LÐ[fÐgÑgÔgˆØÔ$¨Ò,Ð,Ð,Ð,ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8Ð8Ð8r   c                 ó"  — t           dz  }t          j        t          |¦  «        ¦  «        }|€J ‚|dz  }t          j        dŽ }t          j        t          |¦  «        |d|j        d         |j        d         f¦  «        }t          d¦  «        D ]}|                     |¦  «         Œ| 	                    ¦   «          t          d	t          |¦  «        d
d¬¦  «        }|j        dk    sJ ‚|j        j        du sJ ‚|j        du sJ ‚|j        dk    sJ ‚dS )ut   Video ThÃºy Kiá»�u tháº©m Ä‘á»‹nh cho VÆ°Æ¡ng Ã”ng pháº£i bá»‹ phÃ¡t hiá»‡n cross-contamination vÃ  Ä‘iá»ƒm <= 0.50.úH04_Assets/characters/01_Main_Protagonists/thuy_kieu_maiden_16yo_720p.pngNzcontam_kieu_vo.mp4r-   r   r5   r   r   Úshot_vor�   rŽ   ©r‘   r“   ru   Fri   ©ÚPROJECT_ROOTr9   Úimreadr   r:   r;   Úshaper<   rG   rH   r	   r_   ra   rW   r`   rb   ©	re   r   Útk_portraitÚimgÚcontam_pathrI   rJ   Ú_rf   s	            r   Ú9test_evaluate_shot_gate_character_contamination_vuong_ongzNTestEvaluateShotGate.test_evaluate_shot_gate_character_contamination_vuong_ong"  ó   € å"Ð%oÑoˆÝŒj�˜[Ñ)Ô)Ñ*Ô*ˆØˆˆˆØ#Ð&:Ñ:ˆÝÔ'¨Ð0ˆÝŒo�c +Ñ.Ô.°¸¸S¼YÀq¼\È3Ì9ÐUVÌ<Ð<XÑYÔYˆÝ�r‘”ð 	ð 	ˆAØ�IŠI�c‰NŒNˆNˆNØ�Š‰ŒˆÝ$ Yµ°KÑ0@Ô0@ÐU`ÐozÐ{Ñ{Ô{ˆØÔ$¨Ò,Ð,Ð,Ð,ØÔ Ô0°EÐ9Ð9Ð9Ð9ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8Ð8Ð8r   c                 ó"  — t           dz  }t          j        t          |¦  «        ¦  «        }|€J ‚|dz  }t          j        dŽ }t          j        t          |¦  «        |d|j        d         |j        d         f¦  «        }t          d¦  «        D ]}|                     |¦  «         Œ| 	                    ¦   «          t          d	t          |¦  «        d
d¬¦  «        }|j        dk    sJ ‚|j        j        du sJ ‚|j        du sJ ‚|j        dk    sJ ‚dS )us   Video ThÃºy Kiá»�u tháº©m Ä‘á»‹nh cho Kim Trá»�ng pháº£i bá»‹ phÃ¡t hiá»‡n cross-contamination vÃ  Ä‘iá»ƒm <= 0.50.r¸   Nzcontam_kieu_kt.mp4r-   r   r5   r   r   Úshot_ktÚ	kim_trongrŽ   rº   ru   Fri   r»   r¿   s	            r   Ú9test_evaluate_shot_gate_character_contamination_kim_trongzNTestEvaluateShotGate.test_evaluate_shot_gate_character_contamination_kim_trong3  rÅ   r   N)r‚   rƒ   r„   r–   rš   r    rª   r³   r¶   rÄ   rÉ   r…   r   r   r‡   r‡   Ì   s�   € € € € € ð:ð :ð :ð&Gð Gð Gð9ð 9ð 9ð9ð 9ð 9ð9ð 9ð 9ð9ð 9ð 9ð9ð 9ð 9ð"9ð 9ð 9ð 9ð 9r   r‡   c                   ó,   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestEvaluateSceneGatec                 óB  — |dz  }|dz  }t          |dddd¬¦  «         t          |dddd¬¦  «         t          dt          |¦  «        t          |¦  «        gd	¬
¦  «        }|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚|j        €J ‚|j        j        du sJ ‚dS )uV   ToÃ n cáº£nh cÃ³ mÃ u sáº¯c vÃ  Ä‘iá»ƒm tiáº¿p biÃªn mÆ°á»£t mÃ  pháº£i Ä‘áº¡t >= 0.8.zscene_shot_01.mp4zscene_shot_02.mp4r   r   )r‰   r!   é´   r   )r$   r(   r)   r*   Úep01_scene02rŽ   ©Úscene_idÚshot_video_pathsr“   rl   Tr]   NF)rS   r
   r   r_   r`   rb   Ú
scene_evalÚtrigger_color_match©re   r   Ús1Ús2rf   s        r   Ú$test_evaluate_scene_gate_smooth_flowz:TestEvaluateSceneGate.test_evaluate_scene_gate_smooth_flowJ  sä   € àÐ0Ñ0ˆØÐ0Ñ0ˆÝ ¨r¸
ÈÐpqÐrÑrÔrÐrÝ ¨r¸
ÈÐprÐsÑsÔsÐså%Ø#Ý! "™gœg¥s¨2¡w¤wÐ/Ø$ð
ñ 
ô 
ˆð
 Ô$¨Ò+Ð+Ð+Ð+ØÔ 4Ð'Ð'Ð'Ð'ØÔ'¨9Ò4Ð4Ð4Ð4ØÔ!Ð-Ð-Ð-ØÔ!Ô5¸Ð>Ð>Ð>Ð>Ð>Ð>r   c                 ó  — |dz  }|dz  }t          |ddd¬¦  «         t          |ddd¬¦  «         t          dt          |¦  «        t          |¦  «        gd	¬
¦  «        }|j        €J ‚|j        j        du sJ ‚|j        dk    sJ ‚dS )uo   Ä�á»™ chÃªnh mÃ u Ä‘á»™t ngá»™t giá»¯a cÃ¡c shot pháº£i kÃ­ch hoáº¡t trigger_color_match vÃ  APPLY_COLOR_MATCH.zscene_color_green.mp4zscene_color_red.mp4r   r2   )é
   éÜ   é   r‹   )r"   rÛ   rÙ   rÎ   rŽ   rÏ   NTÚAPPLY_COLOR_MATCH)rS   r
   r   rÒ   rÓ   rb   rÔ   s        r   Ú9test_evaluate_scene_gate_color_shift_triggers_color_matchzOTestEvaluateSceneGate.test_evaluate_scene_gate_color_shift_triggers_color_match\  s·   € àÐ4Ñ4ˆØÐ2Ñ2ˆå ¨r¸ÈMÐZÑZÔZÐZå ¨r¸ÈMÐZÑZÔZÐZå%Ø#Ý! "™gœg¥s¨2¡w¤wÐ/Ø$ð
ñ 
ô 
ˆð
 Ô!Ð-Ð-Ð-ØÔ!Ô5¸Ð=Ð=Ð=Ð=ØÔ'Ð+>Ò>Ð>Ð>Ð>Ð>Ð>r   c                 ót   — t          dg d¬¦  «        }|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚dS )u@   Danh sÃ¡ch rá»—ng pháº£i tráº£ vá»� RETAKE_SHOT vá»›i score 0.0.rÎ   rŽ   rÏ   r™   Fri   N©r
   r_   r`   rb   rr   s     r   Ú$test_evaluate_scene_gate_empty_inputz:TestEvaluateSceneGate.test_evaluate_scene_gate_empty_inputn  sc   € å%Ø#ØØ$ð
ñ 
ô 
ˆð
 Ô$¨Ò+Ð+Ð+Ð+ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8Ð8Ð8r   c                 óx   — t          dddgd¬¦  «        }|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚d	S )
u]   Scene Gate pháº£i tá»« chá»‘i cÃ¡c file khÃ´ng tá»“n táº¡i vá»›i Ä‘iá»ƒm 0.0 vÃ  RETAKE_SHOT.Úsc_fakeznonexistent_1.mp4znonexistent_2.mp4rŽ   rµ   r™   Fri   Nrß   rr   s     r   Ú1test_evaluate_scene_gate_missing_or_corrupt_fileszGTestEvaluateSceneGate.test_evaluate_scene_gate_missing_or_corrupt_filesy  s`   € å% iÐ2EÐGZÐ1[ÐjuÐvÑvÔvˆØÔ$¨Ò+Ð+Ð+Ð+ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8Ð8Ð8r   c                 ó  — |dz  }|dz  }|                      d¦  «         |                      d¦  «         t          dt          |¦  «        t          |¦  «        gd¬¦  «        }|j        dk    sJ ‚|j        d	u sJ ‚|j        d
k    sJ ‚dS )u\   Scene Gate pháº£i tá»« chá»‘i file rá»—ng / garbage bytes vá»›i Ä‘iá»ƒm 0.0 vÃ  RETAKE_SHOT.zcorrupt_1.mp4zcorrupt_2.mp4s   NOT_A_VIDEOr   Ú
sc_corruptrŽ   rµ   r™   Fri   N)rž   r
   r   r_   r`   rb   )re   r   Úc1Úc2rf   s        r   Ú(test_evaluate_scene_gate_corrupted_filesz>TestEvaluateSceneGate.test_evaluate_scene_gate_corrupted_files€  s¢   € à˜_Ñ,ˆØ˜_Ñ,ˆØ
�Š�~Ñ&Ô&Ð&Ø
�Š�sÑÔÐÝ% lµS¸±W´W½cÀ"¹g¼gÐ4FÐU`ÐaÑaÔaˆØÔ$¨Ò+Ð+Ð+Ð+ØÔ 5Ð(Ð(Ð(Ð(ØÔ'¨=Ò8Ð8Ð8Ð8Ð8Ð8r   N)r‚   rƒ   r„   r×   rÝ   rà   rã   rè   r…   r   r   rË   rË   I  s_   € € € € € ð?ð ?ð ?ð$?ð ?ð ?ð$	9ð 	9ð 	9ð9ð 9ð 9ð	9ð 	9ð 	9ð 	9ð 	9r   rË   c                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestTakeClassifierAndStartFramec                 ó¢   — t          j        d¦  «        dk    sJ ‚t          j        d¦  «        dk    sJ ‚t          j        d¦  «        dk    sJ ‚dS )u7   Shot 01 luÃ´n lÃ  Cinematic Cut vÃ¬ má»Ÿ Ä‘áº§u cáº£nh.Úep01_scene01_shot01ÚCINEMATIC_CUTÚep01_scene02_shot01Úep01_scene07_shot01N©ÚpoÚclassify_shot_takery   s    r   Ú+test_classify_shot_take_scene_opener_is_cutzKTestTakeClassifierAndStartFrame.test_classify_shot_take_scene_opener_is_cut‘  s_   € åÔ$Ð%:Ñ;Ô;¸ÒNÐNÐNÐNÝÔ$Ð%:Ñ;Ô;¸ÒNÐNÐNÐNÝÔ$Ð%:Ñ;Ô;¸ÒNÐNÐNÐNÐNÐNr   c                 ó>   — t          j        d¦  «        }|dk    sJ ‚dS )uZ   Chuyá»ƒn vai (VÆ°Æ¡ng Ã”ng sang VÆ°Æ¡ng Quan) báº¯t buá»™c phÃ¢n loáº¡i lÃ  Cinematic Cut.Úep01_scene02_shot08rí   Nrð   ©re   Ú	take_types     r   Ú+test_classify_shot_take_actor_switch_is_cutzKTestTakeClassifierAndStartFrame.test_classify_shot_take_actor_switch_is_cut—  s,   € õ Ô)Ð*?Ñ@Ô@ˆ	Ø˜OÒ+Ð+Ð+Ð+Ð+Ð+r   c                 ó>   — t          j        d¦  «        }|dk    sJ ‚dS )uZ   CÃ¹ng nhÃ¢n váº­t (Kim Trá»�ng tÆ°Æ¡ng tÆ° á»Ÿ Scene 07) phÃ¢n loáº¡i lÃ  Continuous Take.Úep01_scene07_shot02ÚCONTINUOUS_TAKENrð   rö   s     r   Ú0test_classify_shot_take_same_actor_is_continuouszPTestTakeClassifierAndStartFrame.test_classify_shot_take_same_actor_is_continuous�  s-   € õ Ô)Ð*?Ñ@Ô@ˆ	ØÐ-Ò-Ð-Ð-Ð-Ð-Ð-r   c                 ó>   — t          j        d¦  «        }|dk    sJ ‚dS )uO   Cáº£nh váº­t / chÃ©n trÃ  ('none') báº¯t buá»™c phÃ¢n loáº¡i lÃ  Cinematic Cut.Úep01_scene01_shot05rí   Nrð   rö   s     r   Ú&test_classify_shot_take_scenery_is_cutzFTestTakeClassifierAndStartFrame.test_classify_shot_take_scenery_is_cut£  s*   € åÔ)Ð*?Ñ@Ô@ˆ	Ø˜OÒ+Ð+Ð+Ð+Ð+Ð+r   c                 ó€   — t          j        di ¦  «        }|r$d|vsJ ‚d|vsJ ‚d|                     ¦   «         v sJ ‚dS dS )uj   Cinematic Cut TUYá»†T Ä�á»�I KHÃ”NG tráº£ vá»� prev_tail ká»ƒ cáº£ khi thÆ° má»¥c keyframes cÃ³ frame cÅ©.rõ   r­   Úclean_frame_239Ú
vuong_quanN©rñ   Úresolve_start_frameÚlower)re   Úresolveds     r   Ú>test_resolve_start_frame_cinematic_cut_never_returns_prev_tailz^TestTakeClassifierAndStartFrame.test_resolve_start_frame_cinematic_cut_never_returns_prev_tail¨  sl   € åÔ)Ð*?ÀÑDÔDˆàð 	4Ø(°Ð8Ð8Ð8Ð8Ø$¨HÐ4Ð4Ð4Ð4à 8§>¢>Ñ#3Ô#3Ð3Ð3Ð3Ð3ð		4ð 	4ð 4Ð3r   c                 ó|   — t          j        d¦  «        \  }}|dk    sJ ‚|€J ‚d|                     ¦   «         v sJ ‚dS )u;   Giao diá»‡n v2 tráº£ vá»� tuple (resolved_path, take_type).rï   rí   NrÈ   )rñ   Úresolve_start_frame_v2r  )re   Ú
frame_pathr÷   s      r   Ú$test_resolve_start_frame_v2_contractzDTestTakeClassifierAndStartFrame.test_resolve_start_frame_v2_contract²  sX   € å "Ô 9Ð:OÑ PÔ PÑˆ
�IØ˜OÒ+Ð+Ð+Ð+ØÐ%Ð%Ð%Ø˜j×.Ò.Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0r   N)	r‚   rƒ   r„   ró   rø   rü   rÿ   r  r  r…   r   r   rê   rê   �  sq   € € € € € ðOð Oð Oð,ð ,ð ,ð.ð .ð .ð,ð ,ð ,ð
4ð 4ð 4ð1ð 1ð 1ð 1ð 1r   rê   c                   ót   — e Zd ZdZ ej        d¬¦  «        ed„ ¦   «         ¦   «         Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
S )Ú#TestBilateralAndCharacterSafeguardsu[   Kiá»ƒm thá»­ xÃ¡c thá»±c nhÃ¢n váº­t vá»›i dá»¯ liá»‡u thá»±c táº¿ tá»« po.get_all_shots().Úclassr   c                 ó(   — t          j        ¦   «         S )N)rñ   Úget_all_shots)Úclss    r   Ú	all_shotsz-TestBilateralAndCharacterSafeguards.all_shotsÁ  s   € õ ÔÑ!Ô!Ð!r   c                 ó°   — d}|                      |i ¦  «        }t          j        ||¦  «        }|€J ‚d|vsJ ‚d|vsJ ‚d|                     ¦   «         v sJ ‚dS )uq   Cinematic Cut vá»›i dá»¯ liá»‡u shot thá»±c táº¿ khÃ´ng Ä‘Æ°á»£c phÃ©p tráº£ vá»� tail frame cá»§a shot trÆ°á»›c.rõ   Nr­   r  r  ©Úgetrñ   r  r  ©re   r  ÚsidÚsdatar  s        r   Ú9test_cinematic_cut_with_live_shot_data_never_returns_tailz]TestBilateralAndCharacterSafeguards.test_cinematic_cut_with_live_shot_data_never_returns_tailÆ  s{   € à#ˆØ—’˜c 2Ñ&Ô&ˆÝÔ)¨#¨uÑ5Ô5ˆØÐ#Ð#Ð#Ø$¨HÐ4Ð4Ð4Ð4Ø ¨Ð0Ð0Ð0Ð0Ø˜xŸ~š~Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/r   c                 ó>  — g d¢}|D ]‡}|                      |i ¦  «        }t          j        ||¦  «        }|€J d|› d�¦   «         ‚d|                     ¦   «         v sJ |› d|› �¦   «         ‚d|                     ¦   «         vsJ |› d|› �¦   «         ‚Œˆg d	¢}|D ]‡}|                      |i ¦  «        }t          j        ||¦  «        }|€J d|› d�¦   «         ‚d|                     ¦   «         v sJ |› d
|› �¦   «         ‚d|                     ¦   «         vsJ |› d|› �¦   «         ‚ŒˆdS )um   Scene 10: Kiá»�u Ä‘á»™c táº¥u tá»³ bÃ  pháº£i ra ThÃºy Kiá»�u; Kim Trá»�ng tÆ°Æ¡ng tÆ° pháº£i ra Kim Trá»�ng.)Úep01_scene10_shot03Úep01_scene10_shot06Úep01_scene10_shot11Úep01_scene10_shot12NúShot õ%    pháº£i resolve Ä‘Æ°á»£c Start Frame!Ú	thuy_kieuu1    pháº£i ra chÃ¢n dung ThÃºy Kiá»�u, thá»±c táº¿: rÈ   u0    (Kiá»�u) khÃ´ng Ä‘Æ°á»£c phÃ©p ra Kim Trá»�ng: )Úep01_scene10_shot04Úep01_scene10_shot05Úep01_scene10_shot13u0    pháº£i ra chÃ¢n dung Kim Trá»�ng, thá»±c táº¿: u6    (Kim Trá»�ng) khÃ´ng Ä‘Æ°á»£c phÃ©p ra ThÃºy Kiá»�u: r  )re   r  Ú
kieu_shotsr  r  r  Ú	kim_shotss          r   Ú-test_scene10_live_shots_resolve_authenticallyzQTestBilateralAndCharacterSafeguards.test_scene10_live_shots_resolve_authenticallyÐ  sº  € ð
ð 
ð 
ˆ
ð ð 	{ð 	{ˆCØ—M’M # rÑ*Ô*ˆEÝÔ-¨c°5Ñ9Ô9ˆHØÐ'Ð'Ð)[°Ð)[Ð)[Ð)[Ñ'Ô'Ð'Ø (§.¢.Ñ"2Ô"2Ð2Ð2Ð2°sÐ4wÐ4wÐmuÐ4wÐ4wÑ2Ô2Ð2Ø h§n¢nÑ&6Ô&6Ð6Ð6Ð6¸3Ð8zÐ8zÐpxÐ8zÐ8zÑ6Ô6Ð6Ð6ð
ð 
ð 
ˆ	ð
 ð 	Að 	AˆCØ—M’M # rÑ*Ô*ˆEÝÔ-¨c°5Ñ9Ô9ˆHØÐ'Ð'Ð)[°Ð)[Ð)[Ð)[Ñ'Ô'Ð'Ø (§.¢.Ñ"2Ô"2Ð2Ð2Ð2°sÐ4vÐ4vÐltÐ4vÐ4vÑ2Ô2Ð2Ø h§n¢nÑ&6Ô&6Ð6Ð6Ð6¸3ð  9Að  9AÐv~ð  9Að  9AÑ6Ô6Ð6Ð6ð	Að 	Ar   c                 ó¸  — g d¢}|D ]®}|                      |i ¦  «        }t          j        ||¦  «        }|€J d|› d�¦   «         ‚d|                     ¦   «         v sJ |› d|› �¦   «         ‚d|                     ¦   «         vsJ d|› d	|› �¦   «         ‚d
|                     ¦   «         vsJ d|› d	|› �¦   «         ‚Œ¯|                      di ¦  «        }t          j        d|¦  «        }|€J ‚d
|                     ¦   «         v sJ ‚g d¢}|D ]V}|                      |i ¦  «        }t          j        ||¦  «        }	|	€J ‚d|	                     ¦   «         v sJ |› d|	› �¦   «         ‚ŒWdS )uX   Scene 06: CÃ¡c cÃº mÃ¡y Kim Trá»�ng, ThÃºy Kiá»�u vÃ  VÆ°Æ¡ng Quan resolve chuáº©n xÃ¡c.)Úep01_scene06_shot03Úep01_scene06_shot04Úep01_scene06_shot06Úep01_scene06_shot10Úep01_scene06_shot12Úep01_scene06_shot14Nr  r   rÈ   u     pháº£i ra Kim Trá»�ng, nháº­n: r!  u)   Leak ThÃºy Kiá»�u táº¡i Kim Trá»�ng shot ú: r  u)   Leak VÆ°Æ¡ng Quan táº¡i Kim Trá»�ng shot Úep01_scene06_shot07)Úep01_scene06_shot08Úep01_scene06_shot09Úep01_scene06_shot11u!    pháº£i ra ThÃºy Kiá»�u, nháº­n: r  )
re   r  r&  r  r  r  Ús7_dataÚs7_resr%  Úress
             r   Ú-test_scene06_live_shots_resolve_authenticallyzQTestBilateralAndCharacterSafeguards.test_scene06_live_shots_resolve_authenticallyí  sæ  € ð
ð 
ð 
ˆ	ð ð 	wð 	wˆCØ—M’M # rÑ*Ô*ˆEÝÔ-¨c°5Ñ9Ô9ˆHØÐ'Ð'Ð)[°Ð)[Ð)[Ð)[Ñ'Ô'Ð'Ø (§.¢.Ñ"2Ô"2Ð2Ð2Ð2°sÐ4fÐ4fÐ\dÐ4fÐ4fÑ2Ô2Ð2Ø h§n¢nÑ&6Ô&6Ð6Ð6Ð6Ð8uÐdgÐ8uÐ8uÐksÐ8uÐ8uÑ6Ô6Ð6Ø x§~¢~Ñ'7Ô'7Ð7Ð7Ð7Ð9vÐehÐ9vÐ9vÐltÐ9vÐ9vÑ7Ô7Ð7Ð7ð —-’-Ð 5°rÑ:Ô:ˆÝÔ'Ð(=¸wÑGÔGˆØÐ!Ð!Ð!Ø˜vŸ|š|™~œ~Ð-Ð-Ð-Ð-ð [ÐZÐZˆ
Øð 	^ð 	^ˆCØ—M’M # rÑ*Ô*ˆEÝÔ(¨¨eÑ4Ô4ˆCØ�?�?�?Ø #§)¢)¡+¤+Ð-Ð-Ð-°#Ð/]Ð/]ÐX[Ð/]Ð/]Ñ-Ô-Ð-Ð-ð		^ð 	^r   c                 ó  — dD ]ˆ}|                      |i ¦  «        }t          j        ||¦  «        }|€J d|› d�¦   «         ‚d|                     ¦   «         v sJ |› d|› �¦   «         ‚d|                     ¦   «         vsJ d|› d	|› �¦   «         ‚Œ‰dS )
uk   Scene 05: CÃ¡c cÃº mÃ¡y VÆ°Æ¡ng Quan thuáº­t chuyá»‡n vÃ  can ngÄƒn khÃ´ng bá»‹ biáº¿n thÃ nh ThÃºy Kiá»�u.)Úep01_scene05_shot13Úep01_scene05_shot16Úep01_scene05_shot24Nr  r   r  u!    pháº£i ra VÆ°Æ¡ng Quan, nháº­n: r!  u*   Leak ThÃºy Kiá»�u táº¡i VÆ°Æ¡ng Quan shot r/  r  r  s        r   Ú8test_scene05_live_vuong_quan_shots_resolve_authenticallyz\TestBilateralAndCharacterSafeguards.test_scene05_live_vuong_quan_shots_resolve_authentically	  sÏ   € àXð 	wð 	wˆCØ—M’M # rÑ*Ô*ˆEÝÔ-¨c°5Ñ9Ô9ˆHØÐ'Ð'Ð)[°Ð)[Ð)[Ð)[Ñ'Ô'Ð'Ø 8§>¢>Ñ#3Ô#3Ð3Ð3Ð3¸Ð5hÐ5hÐ^fÐ5hÐ5hÑ3Ô3Ð3Ø h§n¢nÑ&6Ô&6Ð6Ð6Ð6Ð8vÐehÐ8vÐ8vÐltÐ8vÐ8vÑ6Ô6Ð6Ð6ð	wð 	wr   c                 ó€  — dddœ}t          j        d|¦  «        }|€J ‚d|                     ¦   «         v sJ ‚d|                     ¦   «         vsJ ‚dd	dœ}t          j        d
|¦  «        }|€J ‚d|                     ¦   «         v sJ ‚d|                     ¦   «         vsJ ‚dddœ}t          j        d|¦  «        }|€J ‚d|                     ¦   «         v sJ ‚d|                     ¦   «         vsJ ‚dddœ}t          j        d|¦  «        }|€J ‚d|                     ¦   «         v sJ ‚d|                     ¦   «         vsJ ‚ddddœ}	t          j        d|	¦  «        }
|
€J ‚d|
                     ¦   «         v sJ ‚d|
                     ¦   «         vsJ ‚ddddœ}t          j        d|¦  «        }|€J ‚d|                     ¦   «         v sJ ‚d|                     ¦   «         vsJ ‚ddddœ}t          j        d|¦  «        }|€J ‚d|                     ¦   «         v sJ ‚d|                     ¦   «         vsJ ‚ddddœ}t          j        d|¦  «        }|€J ‚d|                     ¦   «         v sJ ‚d|                     ¦   «         vsJ ‚t          j        di ¦  «        }|€J ‚d|                     ¦   «         v sJ ‚d|                     ¦   «         vsJ ‚dS )u„   Kiá»ƒm tra pháº£n á»©ng Ä‘á»‘i khÃ¡ng (Adversarial Robustness): GÃ¡n nháº§m asset Ä‘á»‘i nghá»‹ch pháº£i bá»‹ ghi Ä‘Ã¨ tá»± Ä‘á»™ng.r¸   u&   Kim Trá»�ng tÆ°Æ¡ng tÆ° dÆ°á»›i trÄƒng)Úcharacter_asset_refÚscene_titlerï   NrÈ   r!  zA04_Assets/characters/01_Main_Protagonists/kim_trong_18yo_720p.pngu8   Kiá»�u gáº£y Ä‘Ã n tá»³ bÃ  rÃ©o ráº¯t khÃºc tÆ°Æ¡ng tÆ°r  u"   Trung cáº­n VÆ°Æ¡ng Quan can ngÄƒnr;  r  u$   VÆ°Æ¡ng Ã”ng Ä‘Ä©nh Ä‘áº¡c gia phongrŒ   r�   u$   ThÃºy VÃ¢n trang trá»�ng Ä‘oan trangu!   ThÃºy VÃ¢n má»‰m cÆ°á»�i ung dung)r>  r?  Úmotion_promptrþ   Úthuy_van)Úreference_start_framer?  r@  u'   Kim Trá»�ng viáº¿t lá»�i thá»� nguyá»�nu)   Kim Trá»�ng cáº§m bÃºt lÃ´ng viáº¿t chá»¯Úep01_scene10_shot07Úep01_scene06_shot05Ú	tieu_dongÚ01_main_protagonistsr  )re   Úadv_ktÚres_ktÚadv_tkÚres_tkÚadv_vqÚres_vqÚadv_voÚres_voÚadv_tv_assetÚres_tv_assetÚ
adv_tv_refÚ
res_tv_refÚadv_kt_compound_assetÚres_kt_compound_assetÚadv_kt_compound_refÚres_kt_compound_refÚres_tds                     r   Ú.test_adversarial_bilateral_safeguards_overridezRTestBilateralAndCharacterSafeguards.test_adversarial_bilateral_safeguards_override  sÑ  € ð $nØCð
ð 
ˆõ Ô'Ð(=¸vÑFÔFˆØÐ!Ð!Ð!Ø˜fŸlšl™nœnÐ,Ð,Ð,Ð,Ø &§,¢,¡.¤.Ð0Ð0Ð0Ð0ð $gØUð
ð 
ˆõ Ô'Ð(=¸vÑFÔFˆØÐ!Ð!Ð!Ø˜fŸlšl™nœnÐ,Ð,Ð,Ð,Ø &§,¢,¡.¤.Ð0Ð0Ð0Ð0ð $nØ?ð
ð 
ˆõ Ô'Ð(=¸vÑFÔFˆØÐ!Ð!Ð!Ø˜vŸ|š|™~œ~Ð-Ð-Ð-Ð-Ø &§,¢,¡.¤.Ð0Ð0Ð0Ð0ð $nØAð
ð 
ˆõ Ô'Ð(=¸vÑFÔFˆØÐ!Ð!Ð!Ø˜fŸlšl™nœnÐ,Ð,Ð,Ð,Ø &§,¢,¡.¤.Ð0Ð0Ð0Ð0ð $nØAØ@ð
ð 
ˆõ
 Ô-Ð.CÀ\ÑRÔRˆØÐ'Ð'Ð'Ø˜\×/Ò/Ñ1Ô1Ð1Ð1Ð1Ð1Ø ,×"4Ò"4Ñ"6Ô"6Ð6Ð6Ð6Ð6ð &pØAØ@ð
ð 
ˆ
õ
 Ô+Ð,AÀ:ÑNÔNˆ
ØÐ%Ð%Ð%Ø˜Z×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ø *×"2Ò"2Ñ"4Ô"4Ð4Ð4Ð4Ð4ð
 $nØDØHð!
ð !
Ðõ
 !#Ô 6Ð7LÐNcÑ dÔ dÐØ$Ð0Ð0Ð0ØÐ3×9Ò9Ñ;Ô;Ð;Ð;Ð;Ð;ØÐ"7×"=Ò"=Ñ"?Ô"?Ð?Ð?Ð?Ð?ð &pØDØHð
ð 
Ðõ
 !Ô4Ð5JÐL_Ñ`Ô`ÐØ"Ð.Ð.Ð.ØÐ1×7Ò7Ñ9Ô9Ð9Ð9Ð9Ð9ØÐ"5×";Ò";Ñ"=Ô"=Ð=Ð=Ð=Ð=õ Ô'Ð(=¸rÑBÔBˆØÐ!Ð!Ð!Ø˜fŸlšl™nœnÐ,Ð,Ð,Ð,Ø%¨V¯\ª\©^¬^Ð;Ð;Ð;Ð;Ð;Ð;r   N)r‚   rƒ   r„   Ú__doc__rw   ÚfixtureÚclassmethodr  r  r'  r7  r<  rX  r…   r   r   r  r  ¾  s¦   € € € € € ØeÐeà€V„^˜'Ð"Ñ"Ô"Øð"ð "ñ „[ñ #Ô"ð"ð0ð 0ð 0ðAð Að Að:^ð ^ð ^ð8wð wð wð\<ð \<ð \<ð \<ð \<r   r  Ú__main__z-v)r   r   r   r   r   r   r   )+rY  ÚosÚsysÚjsonÚtempfiler   Úpathlibr   rw   Únumpyr=   r9   Úpydanticr   Ú__file__ÚresolveÚparentr¼   ÚpathÚinsertr   Úantigravity_critic_gater   r   r   r	   r
   Úproduction_orchestratorrñ   rZ  r   rA   ÚtuplerS   rU   r‡   rË   rê   r  r‚   Úpytest_argsÚexitÚmainr…   r   r   ú<module>ro     s  ððð ð< 
€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø $Ð $Ð $Ð $Ð $Ð $àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5€Ø „‡‚��3�3�|Ð&>Ñ>Ñ?Ô?Ñ @Ô @Ð @ðð ð ð ð ð ð ð ð ð ð ð ð ð ð %Ð $Ð $Ð $ð €„�iÐ Ñ Ô ð5ð 5ñ !Ô ð5ð ØØØØØ'Øð(ð (Øð(àð(ð 
ð(ð ð	(ð
 ð(ð ð(ð ð(ð ð(ð 
ð(ð (ð (ð (ð^RDð RDð RDð RDð RDñ RDô RDð RDðrv9ð v9ð v9ð v9ð v9ñ v9ô v9ð v9ðz@9ð @9ð @9ð @9ð @9ñ @9ô @9ð @9ðN'1ð '1ð '1ð '1ð '1ñ '1ô '1ð '1ð\p<ð p<ð p<ð p<ð p<ñ p<ô p<ð p<ðf ˆzÒÐØ˜TÐ"€KØ€C„Hˆ[ˆVŒ[˜Ñ%Ô%Ñ&Ô&Ð&Ð&Ð&ð Ðr   