Ë
    oj	9  ã                   ó  — d Z ddlZddlmZ ddlmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZ ddlmZmZ ddlmZ  G d„ dej>                  «      Z  G d„ dej>                  «      Z!y)z+
Test cases for L{twisted.logger._legacy}.
é    N)Útime)ÚListÚcast)Úimplementer)ÚBrokenMethodImplementation)ÚverifyObject)ÚcontextÚlog)ÚFailure)Úunittesté   )ÚformatEvent)ÚILogObserverÚLogEvent)ÚLegacyLogObserverWrapperÚpublishToNewObserver)ÚLogLevelc                   óà   — e Zd ZdZdd„Zdd„Zdedefd„Zdedefd„Zdd	„Z	dd
„Z
dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdedefd„Zdd„Zdd„Zdd„Zdd„Zy)ÚLegacyLogObserverWrapperTestsz0
    Tests for L{LegacyLogObserverWrapper}.
    ÚreturnNc                 óÀ   — t        t        j                  d„ «      }t        |«      }	 t	        t        |«       y# t
        $ r}| j                  |«       Y d}~yd}~ww xY w)zD
        L{LegacyLogObserverWrapper} is an L{ILogObserver}.
        c                  ó   — y ©N© )Úes    úA/usr/lib/python3/dist-packages/twisted/logger/test/test_legacy.pyú<lambda>z>LegacyLogObserverWrapperTests.test_interface.<locals>.<lambda>"   s   � ó    N)r   Ú	legacyLogr   r   r   r   Úfail)ÚselfÚlegacyObserverÚobserverr   s       r   Útest_interfacez,LegacyLogObserverWrapperTests.test_interface   sL   € ô œi×4Ñ4±nÓEˆÜ+¨NÓ;ˆð	Üœ xÕ0øÜ)ò 	Ø�I‰I�a�L‰Lûð	ús   ¨9 ¹	AÁAÁAc                 ó¦   — t        t        j                  «       G d„ d«      «       }t         |«       «      }| j	                  t        |«      d«       y)zJ
        L{LegacyLogObserverWrapper} returns the expected string.
        c                   ó<   — e Zd Zdefd„Zdej                  ddfd„Zy)ú?LegacyLogObserverWrapperTests.test_repr.<locals>.LegacyObserverr   c                  ó   — y)Nz<Legacy Observer>r   ©r!   s    r   Ú__repr__zHLegacyLogObserverWrapperTests.test_repr.<locals>.LegacyObserver.__repr__0   s   € Ø*r   Ú	eventDictNc                  ó   — y r   r   )r!   r+   s     r   Ú__call__zHLegacyLogObserverWrapperTests.test_repr.<locals>.LegacyObserver.__call__3   s   € Ør   )Ú__name__Ú
__module__Ú__qualname__Ústrr*   r   Ú	EventDictr-   r   r   r   ÚLegacyObserverr'   .   s'   „ ð+ #ó +ð¨)×*=Ñ*=ð À$ô r   r3   z+LegacyLogObserverWrapper(<Legacy Observer>)N)r   r   r   r   ÚassertEqualÚrepr)r!   r3   r#   s      r   Ú	test_reprz'LegacyLogObserverWrapperTests.test_repr)   sJ   € ô
 
”Y×+Ñ+Ó	,÷	ð 	ó 
-ð	ô ,©NÓ,<Ó=ˆà×Ñœ˜h›Ð)VÕWr   Úeventc                 ó¨   ‡— g Št        t        j                  ˆfd„«      }t        |«      } ||«       | j	                  t        ‰«      d«       ‰d   S )zÒ
        Send an event to a wrapped legacy observer and capture the event as
        seen by that observer.

        @param event: an event

        @return: the event as observed by the legacy wrapper
        c                 ó&   •— ‰j                  | «      S r   )Úappend)r   Úeventss    €r   r   z7LegacyLogObserverWrapperTests.observe.<locals>.<lambda>E   s   ø€ ÀÇÁÈaÓ@P€ r   é   r   )r   r   r   r   r4   Úlen)r!   r7   r"   r#   r;   s       @r   Úobservez%LegacyLogObserverWrapperTests.observe:   sL   ø€ ð "$ˆäœi×4Ñ4Ó6PÓQˆÜ+¨NÓ;ˆÙ�ŒØ×Ñœ˜V› aÔ(à�a‰yÐr   c                 ó&  — |j                  dt        «       «       |j                  dd«       |j                  dt        j                  «       | j	                  t        |«      «      }|j                  «       D ]  \  }}| j                  ||«       Œ |S )zÉ
        Send an event to a wrapped legacy observer and verify that its data is
        preserved.

        @param event: an event

        @return: the event as observed by the legacy wrapper
        Úlog_timeÚ
log_systemú-Ú	log_level)Ú
setdefaultr   r   Úinfor>   ÚdictÚitemsÚassertIn)r!   r7   ÚobservedÚkeyÚvalues        r   ÚforwardAndVerifyz.LegacyLogObserverWrapperTests.forwardAndVerifyL   s~   € ð 	×Ñ˜¤T£VÔ,Ø×Ñ˜ sÔ+Ø×Ñ˜¤h§m¡mÔ4ð —<‘<¤ U£Ó,ˆð  Ÿ+™+›-ò 	)‰JˆC�Ø�M‰M˜#˜xÕ(ð	)ð ˆr   c                 ó<   — | j                  t        dd¬«      «       y)ze
        Basic forwarding: event keys as observed by a legacy observer are the
        same.
        r<   r   ©ÚfooÚbarN)rL   rF   r)   s    r   Útest_forwardz*LegacyLogObserverWrapperTests.test_forwardc   s   € ð
 	×Ñœd q¨aÔ0Õ1r   c                 óx   — t        «       }| j                  t        |¬«      «      }| j                  |d   |«       y)zc
        The new-style C{"log_time"} key is copied to the old-style C{"time"}
        key.
        )r@   r   N©r   rL   rF   r4   ©r!   Ústampr7   s      r   Ú	test_timez'LegacyLogObserverWrapperTests.test_timej   s4   € ô
 “ˆØ×%Ñ%¤d°EÔ&:Ó;ˆØ×Ñ˜˜v™¨Õ.r   c                 ó€   — t        «       }| j                  t        |dz   |¬«      «      }| j                  |d   |«       y)zr
        The new-style C{"log_time"} key does not step on a pre-existing
        old-style C{"time"} key.
        r<   )r@   r   r   NrS   rT   s      r   Útest_timeAlreadySetz1LegacyLogObserverWrapperTests.test_timeAlreadySets   s:   € ô
 “ˆØ×%Ñ%¤d°E¸A±IÀEÔ&JÓKˆØ×Ñ˜˜v™¨Õ.r   c                 ód   — | j                  t        d¬«      «      }| j                  |d   d«       y)zg
        The new-style C{"log_system"} key is copied to the old-style
        C{"system"} key.
        rO   )rA   ÚsystemN©rL   rF   r4   ©r!   r7   s     r   Útest_systemz)LegacyLogObserverWrapperTests.test_system|   s-   € ð
 ×%Ñ%¤d°eÔ&<Ó=ˆØ×Ñ˜˜x™¨%Õ0r   c                 óf   — | j                  t        dd¬«      «      }| j                  |d   d«       y)zv
        The new-style C{"log_system"} key does not step on a pre-existing
        old-style C{"system"} key.
        rO   rP   )rA   rZ   rZ   Nr[   r\   s     r   Útest_systemAlreadySetz3LegacyLogObserverWrapperTests.test_systemAlreadySet„   s/   € ð
 ×%Ñ%¤d°eÀEÔ&JÓKˆØ×Ñ˜˜x™¨%Õ0r   c                 ó¨   — t        t        «       t        j                  ¬«      }| j	                  t        |«      «      }| j                  |d   d«       y)zy
        If the new-style C{"log_system"} key is absent, the old-style
        C{"system"} key is set to C{"-"}.
        )r@   rC   rZ   rB   N)rF   r   r   rE   r>   r4   )r!   r7   rI   s      r   Útest_noSystemz+LegacyLogObserverWrapperTests.test_noSystemŒ   s=   € ô œd›f´·±Ô>ˆØ—<‘<¤ U£Ó,ˆØ×Ñ˜ (Ñ+¨SÕ1r   c                 óT  — | j                  t        t        j                  d¬«      «       | j                  t        t        j                  d¬«      «       | j                  t        t        j
                  d¬«      «       | j                  t        t        j                  d¬«      «       y)zÁ
        If explicitly set, the C{isError} key will be preserved when forwarding
        from a new-style logging emitter to a legacy logging observer,
        regardless of log level.
        r<   )rC   ÚisErrorr   N)rL   rF   r   rE   ÚwarnÚerrorÚcriticalr)   s    r   Útest_levelNotChangez1LegacyLogObserverWrapperTests.test_levelNotChange–   sj   € ð 	×Ñœd¬X¯]©]ÀAÔFÔGØ×Ñœd¬X¯]©]ÀAÔFÔGØ×Ñœd¬X¯^©^ÀQÔGÔHØ×Ñœd¬X×->Ñ->ÈÔJÕKr   c                 óz   — | j                  t        t        j                  ¬«      «      }| j	                  d|«       y)a)  
        The new-style C{"log_level"} key is not translated to the old-style
        C{"logLevel"} key.

        Events are forwarded from the old module from to new module and are
        then seen by old-style observers.
        We don't want to add unexpected keys to old-style events.
        )rC   ÚlogLevelN)rL   rF   r   rE   ÚassertNotInr\   s     r   Útest_pythonLogLevelNotSetz7LegacyLogObserverWrapperTests.test_pythonLogLevelNotSet¡   s-   € ð ×%Ñ%¤d´X·]±]Ô&CÓDˆØ×Ñ˜ UÕ+r   c                 ód   — | j                  t        d¬«      «      }| j                  |d   d«       y)a  
        If a stdlib log level was provided as a string (eg. C{"WARNING"}) in
        the legacy "logLevel" key, it does not get converted to a number.
        The documentation suggested that numerical values should be used but
        this was not a requirement.
        ÚWARNING©ri   ri   Nr[   r\   s     r   Útest_stringPythonLogLevelz7LegacyLogObserverWrapperTests.test_stringPythonLogLevel­   s6   € ð ×%Ñ%ÜØ"ôó
ˆð
 	×Ñ˜˜zÑ*¨IÕ6r   c                 ó`   — | j                  t        «       «      }| j                  |d   d«       y)z–
        The old-style C{"message"} key is added, even if no new-style
        C{"log_format"} is given, as it is required, but may be empty.
        Úmessager   Nr[   r\   s     r   Útest_messagez*LegacyLogObserverWrapperTests.test_message»   s+   € ð
 ×%Ñ%¤d£fÓ-ˆØ×Ñ˜˜yÑ)¨2Õ.r   c                 ód   — | j                  t        d¬«      «      }| j                  |d   d«       y)zV
        The old-style C{"message"} key is not modified if it already exists.
        rN   )rq   rq   Nr[   r\   s     r   Útest_messageAlreadySetz4LegacyLogObserverWrapperTests.test_messageAlreadySetÃ   s.   € ð ×%Ñ%¤d°>Ô&BÓCˆØ×Ñ˜˜yÑ)¨>Õ:r   c                 ó†   — | j                  t        dd¬«      «      }| j                  t        j                  |«      d«       y)z—
        Formatting is translated such that text is rendered correctly, even
        though old-style logging doesn't use PEP 3101 formatting.
        zHello, {who}!Úworld)Ú
log_formatÚwhoúHello, world!N©rL   rF   r4   r   ÚtextFromEventDictr\   s     r   Útest_formatz)LegacyLogObserverWrapperTests.test_formatÊ   s6   € ð
 ×%Ñ%¤d°oÈ7Ô&SÓTˆØ×Ñœ×4Ñ4°UÓ;¸_ÕMr   c                 ó†   — | j                  t        dd¬«      «      }| j                  t        j                  |«      d«       y)zo
        Using the message key, which is special in old-style, works for
        new-style formatting.
        zHello, {message}!rv   )rw   rq   ry   Nrz   r\   s     r   Útest_formatMessagez0LegacyLogObserverWrapperTests.test_formatMessageÒ   s<   € ð
 ×%Ñ%ÜÐ/¸ÔAó
ˆð 	×Ñœ×4Ñ4°UÓ;¸_ÕMr   c                 ó†   — | j                  t        dd¬«      «      }| j                  t        j                  |«      d«       y)zd
        Formatting is not altered if the old-style C{"format"} key already
        exists.
        zHello!zHowdy!)rw   ÚformatNrz   r\   s     r   Útest_formatAlreadySetz3LegacyLogObserverWrapperTests.test_formatAlreadySetÜ   s6   € ð
 ×%Ñ%¤d°hÀxÔ&PÓQˆØ×Ñœ×4Ñ4°UÓ;¸XÕFr   Úvaluesc                 ód   — t        t        d«      «      }| j                  t        d|ddœ|¤Ž«      S )z¦
        Create a new-style event with a captured failure.

        @param values: Additional values to include in the event.

        @return: the new event
        znyargh!ú	oopsie...)Úlog_failurerw   r   )r   ÚRuntimeErrorrL   rF   )r!   r‚   Úfailures      r   ÚeventWithFailurez.LegacyLogObserverWrapperTests.eventWithFailureä   s8   € ô œ, yÓ1Ó2ˆØ×$Ñ$ÜÐG˜W°ÑGÀÑGó
ð 	
r   c                 ó¦   — | j                  «       }| j                  |d   |d   «       | j                  |d   «       | j                  |d   d«       y)z}
        Captured failures in the new style set the old-style C{"failure"},
        C{"isError"}, and C{"why"} keys.
        r‡   r…   rc   Úwhyr„   N)rˆ   ÚassertIsÚ
assertTruer4   r\   s     r   Útest_failurez*LegacyLogObserverWrapperTests.test_failureñ   sO   € ð
 ×%Ñ%Ó'ˆØ�‰�e˜IÑ&¨¨mÑ(<Ô=Ø�‰˜˜iÑ(Ô)Ø×Ñ˜˜u™ {Õ3r   c                 óz   — t        t        d«      «      }| j                  |¬«      }| j                  |d   |«       y)úv
        Captured failures in the new style do not step on a pre-existing
        old-style C{"failure"} key.
        zWeak salsa!)r‡   r‡   N)r   r†   rˆ   r‹   )r!   r‡   r7   s      r   Útest_failureAlreadySetz4LegacyLogObserverWrapperTests.test_failureAlreadySetû   s9   € ô
 œ, }Ó5Ó6ˆØ×%Ñ%¨gÐ%Ó6ˆØ�‰�e˜IÑ&¨Õ0r   c                 óR   — | j                  d¬«      }| j                  |d   d«       y)zv
        Captured failures in the new style do not step on a pre-existing
        old-style C{"isError"} key.
        r   ©rc   rc   N©rˆ   r4   r\   s     r   Útest_isErrorAlreadySetz4LegacyLogObserverWrapperTests.test_isErrorAlreadySet  s,   € ð
 ×%Ñ%¨aÐ%Ó0ˆØ×Ñ˜˜yÑ)¨1Õ-r   c                 óR   — | j                  d¬«      }| j                  |d   d«       y)r�   Úblah)rŠ   rŠ   Nr“   r\   s     r   Útest_whyAlreadySetz0LegacyLogObserverWrapperTests.test_whyAlreadySet  s+   € ð
 ×%Ñ%¨&Ð%Ó1ˆØ×Ñ˜˜u™ vÕ.r   ©r   N)r.   r/   r0   Ú__doc__r$   r6   r   r>   rL   rQ   rV   rX   r]   r_   ra   rg   rk   ro   rr   rt   r|   r~   r�   Úobjectrˆ   r�   r�   r”   r—   r   r   r   r   r      s©   „ ñó	óXð"˜Xð ¨(ó ð$ hð °8ó ó.2ó/ó/ó1ó1ó2ó	Ló
,ó7ó/ó;óNóNóGð
¨ð 
°Hó 
ó4ó1ó.ô/r   r   c                   ó�   — e Zd ZdZdd„Zdededej                  fd„Z	dd„Z
dd	„Zdd
„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zy)ÚPublishToNewObserverTestsz,
    Tests for L{publishToNewObserver}.
    r   Nc                 ód   — g | _         t        t        | j                   j                  «      | _        y r   )r;   r   r   r:   r#   r)   s    r   ÚsetUpzPublishToNewObserverTests.setUp  s!   € Ø&(ˆŒÜœ\¨4¯;©;×+=Ñ+=Ó>ˆ�r   rq   r‚   c                 óÈ   — t        j                  t        j                  «      xs i j	                  «       }|j                  |«       ||d<   t        «       |d<   d|vrd|d<   |S )a  
        Return a basic old-style event as would be created by L{legacyLog.msg}.

        @param message: a message event value in the legacy event format
        @param values: additional event values in the legacy event format

        @return: a legacy event
        rq   r   rc   r   )r	   Úgetr   ÚILogContextÚcopyÚupdater   )r!   rq   r‚   r7   s       r   ÚlegacyEventz%PublishToNewObserverTests.legacyEvent  s^   € ô —‘œY×2Ñ2Ó3Ò9°r×?Ñ?ÓAˆØ�‰�VÔØ"ˆˆiÑÜ›ˆˆf‰Ø˜EÑ!Ø ˆE�)ÑØˆr   c                 ó´   — t        | j                  | j                  «       t        j                  «       | j                  t        | j                  «      d«       y)z6
        The observer is called exactly once.
        r<   N)r   r#   r¤   r   r{   r4   r=   r;   r)   s    r   Útest_observedz'PublishToNewObserverTests.test_observed/  sA   € ô 	Ø�M‰M˜4×+Ñ+Ó-¬y×/JÑ/Jô	
ð 	×Ñœ˜TŸ[™[Ó)¨1Õ-r   c                 óÎ   — t        | j                  | j                  «       t        j                  «       | j                  | j                  d   d   | j                  d   d   «       y)zc
        The old-style C{"time"} key is copied to the new-style C{"log_time"}
        key.
        r   r@   r   N©r   r#   r¤   r   r{   r4   r;   r)   s    r   rV   z#PublishToNewObserverTests.test_time8  sR   € ô
 	Ø�M‰M˜4×+Ñ+Ó-¬y×/JÑ/Jô	
ð 	×Ñ˜Ÿ™ Q™¨
Ñ3°T·[±[À±^ÀFÑ5KÕLr   c                 óÖ   — dt         dt        fd„}| j                  dd«      } ||«      }t        | j                  ||«       | j                  t        | j                  d   «      |«       y)z—
        A published old-style event should format as text in the same way as
        the given C{textFromEventDict} callable would format it.
        r7   r   c                 óZ   — dj                  t        dj                  | d   «      «      «      S )NÚ ú rq   )ÚjoinÚreversed)r7   s    r   r{   zAPublishToNewObserverTests.test_message.<locals>.textFromEventDictH  s$   € Ø—7‘7œ8 C§H¡H¨U°9Ñ-=Ó$>Ó?Ó@Ð@r   zHello,zworld!r   N)r   r1   r¤   r   r#   r4   r   r;   )r!   r{   r7   Útexts       r   rr   z&PublishToNewObserverTests.test_messageB  sd   € ð	A¤Xð 	A´#ó 	Að × Ñ  ¨8Ó4ˆÙ  Ó'ˆä˜TŸ]™]¨EÐ3DÔEØ×Ñœ T§[¡[°¡^Ó4°dÕ;r   c                 óÊ   — t        | j                  | j                  «       t        j                  «       | j                  | j                  d   d   t        j                  «       y)zL
        Published event should have log level of L{LogLevel.info}.
        r   rC   N)	r   r#   r¤   r   r{   r4   r;   r   rE   r)   s    r   Útest_defaultLogLevelz.PublishToNewObserverTests.test_defaultLogLevelQ  sI   € ô 	Ø�M‰M˜4×+Ñ+Ó-¬y×/JÑ/Jô	
ð 	×Ñ˜Ÿ™ Q™¨Ñ4´h·m±mÕDr   c                 óÎ   — t        | j                  | j                  d¬«      t        j                  «       | j                  | j                  d   d   t        j                  «       y)z“
        If C{"isError"} is set to C{1} (true) on the legacy event, the
        C{"log_level"} key should get set to L{LogLevel.critical}.
        r<   r’   r   rC   N)	r   r#   r¤   r   r{   r4   r;   r   rf   r)   s    r   Útest_isErrorz&PublishToNewObserverTests.test_isErrorZ  sP   € ô
 	Ø�M‰M˜4×+Ñ+°AÐ+Ó6¼	×8SÑ8Sô	
ð 	×Ñ˜Ÿ™ Q™¨Ñ4´h×6GÑ6GÕHr   c                 óê   — t        | j                  | j                  t        j                  ¬«      t
        j                  «       | j                  | j                  d   d   t        j                  «       y)zæ
        If the old-style C{"logLevel"} key is set to a standard library logging
        level, using a predefined (L{int}) constant, the new-style
        C{"log_level"} key should get set to the corresponding log level.
        rn   r   rC   N)r   r#   r¤   Ú
py_loggingrm   r   r{   r4   r;   r   rd   r)   s    r   Útest_stdlibLogLevelz-PublishToNewObserverTests.test_stdlibLogLeveld  sV   € ô 	Ø�M‰MØ×Ñ¤j×&8Ñ&8ÐÓ9Ü×'Ñ'ô	
ð
 	×Ñ˜Ÿ™ Q™¨Ñ4´h·m±mÕDr   c                 óÎ   — t        | j                  | j                  d¬«      t        j                  «       | j                  | j                  d   d   t        j                  «       y)zÖ
        If the old-style C{"logLevel"} key is set to a standard library logging
        level, using a string value, the new-style C{"log_level"} key should
        get set to the corresponding log level.
        rm   rn   r   rC   N)	r   r#   r¤   r   r{   r4   r;   r   rd   r)   s    r   Útest_stdlibLogLevelWithStringz7PublishToNewObserverTests.test_stdlibLogLevelWithStringq  sP   € ô 	Ø�M‰MØ×Ñ iÐÓ0Ü×'Ñ'ô	
ð
 	×Ñ˜Ÿ™ Q™¨Ñ4´h·m±mÕDr   c                 ó¬   — t        | j                  | j                  d¬«      t        j                  «       | j                  d| j                  d   «       y)z½
        If the old-style C{"logLevel"} key is set to a standard library logging
        level, using an unknown value, the new-style C{"log_level"} key should
        not get set.
        zFoo!!!!!rn   rC   r   N)r   r#   r¤   r   r{   rj   r;   r)   s    r   Útest_stdlibLogLevelWithGarbagez8PublishToNewObserverTests.test_stdlibLogLevelWithGarbage~  sG   € ô 	Ø�M‰MØ×Ñ jÐÓ1Ü×'Ñ'ô	
ð
 	×Ñ˜ d§k¡k°!¡nÕ5r   c                 ó®   — t        | j                  | j                  «       t        j                  «       | j                  | j                  d   d   d«       y)z‹
        Published event should have a namespace of C{"log_legacy"} to indicate
        that it was forwarded from legacy logging.
        r   Úlog_namespaceÚ
log_legacyNr¨   r)   s    r   Útest_defaultNamespacez/PublishToNewObserverTests.test_defaultNamespace‹  sE   € ô
 	Ø�M‰M˜4×+Ñ+Ó-¬y×/JÑ/Jô	
ð 	×Ñ˜Ÿ™ Q™¨Ñ8¸,ÕGr   c                 óÎ   — t        | j                  | j                  «       t        j                  «       | j                  | j                  d   d   | j                  d   d   «       y)zg
        The old-style C{"system"} key is copied to the new-style
        C{"log_system"} key.
        r   rA   rZ   Nr¨   r)   s    r   r]   z%PublishToNewObserverTests.test_system•  sR   € ô
 	Ø�M‰M˜4×+Ñ+Ó-¬y×/JÑ/Jô	
ð 	×Ñ˜Ÿ™ Q™¨Ñ5°t·{±{À1±~ÀhÑ7OÕPr   r˜   )r.   r/   r0   r™   rž   r1   rš   r   r2   r¤   r¦   rV   rr   r±   r³   r¶   r¸   rº   r¾   r]   r   r   r   rœ   rœ     se   „ ñó?ð Cð °6ð ¸i×>QÑ>Qó ó".óMó<óEóIóEóEó6óHôQr   rœ   )"r™   Úloggingrµ   r   Útypingr   r   Úzope.interfacer   Úzope.interface.exceptionsr   Úzope.interface.verifyr   Útwisted.pythonr	   r
   r   Útwisted.python.failurer   Útwisted.trialr   Ú_formatr   Ú_interfacesr   r   Ú_legacyr   r   Ú_levelsr   ÚTestCaser   rœ   r   r   r   ú<module>rÍ      s^   ðñó Ý ß å &Ý @Ý .ç 4Ý *Ý "Ý !ß 0ß DÝ ôy/ H×$5Ñ$5ô y/ôxHQ × 1Ñ 1õ HQr   