§
    £”jÎ”  ã                   ó¾  — 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mZ ddl	m
Z
 ddlmZ ddlmZ ddlmZmZmZ ddlmZmZmZ dd	lT dd
lmZ ddlmZmZmZ ddlmZmZ ddlm Z  ddl!m"Z" ej#        Z#ej$        Z$ej%        Z%d &                    ¦   «         Z'd &                    ¦   «         Z(d &                    ¦   «         Z)d &                    ¦   «         Z*d &                    ¦   «         Z+ej,        fd„Z-ej,        fd„Z.ddej,        fd„Z/d„ Z0d(d„Z1 G d„ de2¦  «        Z3edddddedddddiZ4d „ Z5 G d!„ d"¦  «        Z6 G d#„ d$e¦  «        Z7d)d&„Z8e9d'k    r e8¦   «          dS dS )*a  An experimental SVG renderer for the ReportLab graphics framework.

This will create SVG code from the ReportLab Graphics API (RLG).
To read existing SVG code and convert it into ReportLab graphics
objects download the svglib module here:

  http://python.net/~gherman/#svglib
é    N)ÚBytesIOÚStringIO)ÚstringWidth©Úfp_str)ÚasNative)ÚgetStateDeltaÚRendererÚrenderScaledDrawing)ÚSTATE_DEFAULTSÚPathÚUserNode)Ú*)Ú	rl_config)ÚRLStringÚ	isUnicodeÚisBytes)ÚFILL_EVEN_ODDÚFILL_NON_ZEROé   )Ú	_getImage)ÚgetDOMImplementationzsstroke-width stroke-linecap stroke stroke-opacity fill fill-opacity stroke-dasharray stroke-dashoffset fill-rule idzWstroke-width stroke-linecap stroke stroke-opacity stroke-dasharray stroke-dashoffset idz<font-family font-weight font-style font-variant font-size idzTstroke-width stroke-linecap stroke stroke-opacity stroke-dasharray stroke-dashoffsetzfill fill-opacityc                 óf   — t          ¦   «         }t          | |fd|i|¤Ž |                     ¦   «         S )z>Returns a SVG as a string in memory, without touching the diskÚshowBoundary)r   Ú
drawToFileÚgetvalue)Údr   ÚkwdsÚss       úk/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/reportlab/graphics/renderSVG.pyÚdrawToStringr!   '   s6   € å‰
Œ
€AÝˆq�!Ð6Ð6 ,Ð6°Ð6Ð6Ð6Ø�:Š:‰<Œ<Ðó    c                 ó¨   — t          | ¦  «        } t          | j        | j        ffi |¤Ž}t	          | |dd|¬¦  «         |                     |¦  «         d S )Nr   ©r   )r   Ú	SVGCanvasÚwidthÚheightÚdrawÚsave)r   Úfnr   r   Úcs        r    r   r   -   sY   € Ý˜AÑÔ€AÝ�1”7˜AœHÐ%Ð-Ð-¨Ð-Ð-€AÝˆˆAˆq�! ,Ð/Ñ/Ô/Ð/Ø‡F‚Fˆ2�J„J€J€J€Jr"   c                 óp   — t          ¦   «         }|                     t          | ¦  «        ||||¬¦  «         dS )zAs it says.r$   N)Ú_SVGRendererr(   r   )ÚdrawingÚcanvasÚxÚyr   Úrs         r    r(   r(   3   s6   € å‰Œ€AØ‡F‚FÕ˜wÑ'Ô'¨°°AÀL€FÑQÔQÐQÐQÐQr"   c                 ó˜   — g }t          dt          | ¦  «        d¦  «        D ](}|                     | |         | |dz            f¦  «         Œ)|S )zo
    given a list of coordinates [x0, y0, x1, y1....]
    produce a list of points [(x0,y0), (y1,y0),....]
    r   é   r   )ÚrangeÚlenÚappend)ÚLÚPÚis      r    Ú_pointsFromListr;   9   sT   € ð 	€AÝ�1•S˜‘V”V˜QÑÔð !ð !ˆØ	�Š�!�A”$˜˜!˜A™#œ�Ñ Ô Ð Ð à€Hr"   c                 ó  — |                       |¦  «        }|                     ¦   «         D ]Z\  }}t          |¦  «        }|s|                     ||¦  «         Œ-|                     |¦  «        }|                     ||p|¦  «         Œ[|S )aŸ  Transform a DOM node into new node and copy selected attributes.

    Creates a new DOM node with tag name 'newTag' for document 'doc'
    and copies selected attributes from an existing 'node' as provided
    in 'attrDict'. The source 'node' can be None. Attribute values will
    be converted to strings.

    E.g.

        n = transformNode(doc, "node1", x="0", y="1")
        -> DOM node for <node1 x="0" y="1"/>

        n = transformNode(doc, "node1", x=0, y=1+1)
        -> DOM node for <node1 x="0" y="2"/>

        n = transformNode(doc, "node1", node0, x="x0", y="x0", zoo=bar())
        -> DOM node for <node1 x="[node0.x0]" y="[node0.y0]" zoo="[bar()]"/>
    )ÚcreateElementÚitemsÚstrÚsetAttributeÚgetAttribute)	ÚdocÚnewTagÚnodeÚattrDictÚnewNodeÚnewAttrÚattrÚsattrÚattrVals	            r    ÚtransformNoderK   E   s–   € ð( ×Ò Ñ'Ô'€GØ!ŸšÑ)Ô)ð <ð <‰ˆ�Ý�T‘”ˆØð 	<Ø× Ò  ¨%Ñ0Ô0Ð0Ð0à×'Ò'¨Ñ.Ô.ˆGØ× Ò  ¨'Ð*:°UÑ;Ô;Ð;Ð;à€Nr"   c                   ót   — e Zd ZdZej        ej        ej        ej        ej	        ej
        dœZdd„Zd„ Zd„ ZdS )	ÚEncodedWriterz�
    EncodedWriter(encoding) assumes .write will be called with
    either unicode or utf8 encoded bytes. it will accumulate
    unicode
    )zutf-32z	utf-32-bez	utf-32-lezutf-16z	utf-16-bez	utf-16-leFc                 óÒ   — t                                | ¦  «         t          j        |¦  «        j        x| _        }|rd|v sd|v r"|                      | j        |         ¦  «         d S d S )NÚ16Ú32)ÚlistÚ__init__ÚcodecsÚlookupÚnameÚencodingÚwriteÚBOMS)ÚselfrV   Úboms      r    rR   zEncodedWriter.__init__r   sp   € Ý�Š�dÑÔÐÝ#)¤=°Ñ#:Ô#:Ô#?Ð?ˆŒ˜Øð 	,�4˜8Ð#Ð# t¨xÐ'7Ð'7Ø�JŠJ�t”y Ô*Ñ+Ô+Ð+Ð+Ð+ð (8Ð'7r"   c                 ó\  — t          |¦  «        rY	 |                     d¦  «        }np#  t          j        ¦   «         \  }}}t	          |¦  «        }~~t          d|›d|›�¦  «        ‚xY wt          |¦  «        st          dt          |¦  «        z  ¦  «        ‚|                      |¦  «         d S )Núutf-8zString z not encoded as 'utf-8'
error=z?EncodedWriter.write(%s) argument should be 'utf-8' bytes or str)	r   ÚdecodeÚsysÚexc_infor?   Ú
ValueErrorr   Úasciir7   )rY   ÚuÚetÚevÚtbs        r    rW   zEncodedWriter.writex   sµ   € Ý�1‰:Œ:ð 		kðXØ—X’X˜gÑ&Ô&��øðXÝ œ\™^œ^‘
��B˜Ý˜‘W”W�Ø˜Ý �jÐQRÐQRÐQRÐSUÐSUÐ!VÑWÔWÐWøøøÝ˜1‘”ð 	kÝÐ^ÕafÐghÑaiÔaiÑiÑjÔjÐjØ�Š�A‰Œˆˆˆs	   ‘' §?A&c                 ó:   — d                      | ¦  «        }| d d …= |S )NÚ ©Újoin)rY   r2   s     r    r   zEncodedWriter.getvalue…   s!   € Ø�GŠG�D‰MŒMˆØ���ˆGØˆr"   N)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rS   Ú	BOM_UTF32ÚBOM_UTF32_BEÚBOM_UTF32_LEÚ	BOM_UTF16ÚBOM_UTF16_BEÚBOM_UTF16_LErX   rR   rW   r   © r"   r    rM   rM   d   s‚   € € € € € ðð ð Ô!ØÔ'ØÔ'ØÔ!ØÔ'ØÔ'ð
ð 
€Dð,ð ,ð ,ð ,ðð ð ðð ð ð ð r"   rM   Únonzeroznon-zeroÚevenoddzeven-oddc                  ó@   — d                      d„ | D ¦   «         ¦  «        S )Nú c              3   ól   K  — | ]/}d |z                        d¦  «                              d¦  «        V — Œ0dS )z%fÚ0ú.N)Úrstrip)Ú.0Úas     r    ú	<genexpr>zpy_fp_str.<locals>.<genexpr>”   sB   è è € ÐFÐF¸A�d˜Q‘h×&Ò& sÑ+Ô+×2Ò2°3Ñ7Ô7ÐFÐFÐFÐFÐFÐFr"   rh   )Úargss    r    Ú	py_fp_strr�   “   s#   € Ø�8Š8ÐFÐFÀÐFÑFÔFÑGÔGÐGr"   c                   ó^  — e Zd Zd8d„Zd9d„Zd:d„Zg d	fd
„Zd„ Zd„ Zdde	dfd„Z
d„ Zd„ Zg dfd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd;d„Zd;d„Zd<d„Z	 	 d=d„Z	 	 d>d„Zd „ Zd?d"„Zd#„ Zd9d$„Zd9d%„Zd@d&„ZdAd(„ZdBd)„Z d:d*„Z!d+„ Z" e#d	¬,¦  «        fd-„Z$d.„ Z%d/„ Z&d0„ Z'd1„ Z(d2„ Z)d3„ Z*d4„ Z+d5„ Z,d6„ Z-d7„ Z.dS )Cr%   ©é,  r„   r\   r   Fc                 óŒ
  ‡ ‡— |‰ _         t          j        |¦  «        j        ‰ _        |‰ _        |                     dd¦  «        }|                     di ¦  «        ‰ _        |                     dd¦  «        Št          ‰t          ¦  «        rˆfd„‰ _
        n/t          ‰¦  «        r‰‰ _
        nt          dt          ›d�¦  «        ‚|                     d	d
¦  «        ‰ _        |                     dd
¦  «        }t          ‰ _        |x\  ‰ _        ‰ _        ‰ _        g ‰ _        i ‰ _        d
‰ _        dx‰ _        x‰ _        x‰ _        x‰ _        x‰ _        x‰ _        ‰ _        |                     dd¦  «        rt:          ‰ _        nt<          ‰ _        ˆ fd„‰ _        tA          d¦  «        }| !                    ddd¦  «        }	| "                    dd|	¦  «        ‰ _#        ‰ j#        j$        ‰ _%        tM          t          |d         ¦  «        t          ‰ j        ¦  «        dd‰ j        ‰ j        fz  dd¬¦  «        }
tN          ‰ j                 |
d<   d|
d<   |
 (                    |                     di ¦  «        ¦  «         |
 )                    ¦   «         D ] \  }}‰ j%         *                    ||¦  «         Œ!‰ j#         +                    d¦  «        }‰ j#         ,                    d¦  «        }| -                    |¦  «         ‰ j%         -                    |¦  «         ‰ j#         +                    d¦  «        }‰ j#         ,                    d¦  «        }| -                    |¦  «         ‰ j%         -                    |¦  «         ‰  .                    t^          d          t^          d!         ¦  «         ‰  0                    t^          d"         ¦  «         ‰  1                    d#¦  «         ‰  2                    d¦  «         ‰  3                    d$¦  «         |s{ti          ‰ j#        d%d&¬'¦  «        }ti          ‰ j#        d(dd‰ j        ‰ j        ¬)¦  «        }| -                    |¦  «         ‰ j%         -                    |¦  «         tM          d*¬+¦  «        }ntM          d‰ j        ‰ j        fz  ¬,¦  «        }ti          ‰ j#        d-fd.d/‰ j        z  d0œ|¤Ž‰ _5        |r\ti          ‰ j#        d-|d1¬0¦  «        ‰ _6        ‰ j6         -                    ‰ j5        ¦  «         ‰ j%         -                    ‰ j6        ¦  «         n‰ j%         -                    ‰ j5        ¦  «         ‰ j5        ‰ _7        dS )2a4  
        verbose = 0 >0 means do verbose stuff
        useClip = False True means don't use a clipPath definition put the global clip into the clip property
                        to get around an issue with safari
        extraXmlDecl = ''   use to add extra xml declarations
        scaleGroupId = ''   id of an extra group to add around the drawing to allow easy scaling
        svgAttrs = {}       dictionary of attributes to be applied to the svg tag itself
        fontSizer = 'px'    a string unit or acallable that returns a string fontSize value
        ÚuseClipFÚ	fontHacksÚ	fontSizerÚpxc                 ó   •— d‰› �| z  S )Nú%srt   )ÚvÚfzs    €r    ú<lambda>z$SVGCanvas.__init__.<locals>.<lambda>©   s   ø€  y¨B y y°1¡}€ r"   z
fontSizer=zB should be a str unit eg px/pt or a callable that returns a stringÚextraXmlDeclrg   ÚscaleGroupIdNÚ
use_fp_strc                  ó@   •—  ‰j         | Ž                      dd¦  «        S )Nrx   ú,)r   Úreplace)r€   rY   s    €r    rŽ   z$SVGCanvas.__init__.<locals>.<lambda>¾   s    ø€  [ T¤[°$Ð%7×%?Ò%?ÀÀCÑ%HÔ%H€ r"   ÚminidomÚsvgz-//W3C//DTD SVG 1.0//ENz8http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtdr   zxMinYMin meetz	0 0 %d %dzhttp://www.w3.org/2000/svgz1.0)r&   r'   ÚpreserveAspectRatioÚviewBoxÚxmlnsÚversionú	fill-rulezhttp://www.w3.org/1999/xlinkzxmlns:xlinkÚsvgAttrsÚtitlez...ÚdescÚfontNameÚfontSizeÚstrokeColorr4   r   ÚclipPathÚclip)ÚidÚrect)r0   r1   r&   r'   zclip-path: url(#clip))Ústyle)r£   ÚgÚgroupzscale(1,-1) translate(0,-%d))r¤   Ú	transformz
scale(1,1))8ÚverboserS   rT   rU   rV   rZ   Úpopr‡   Ú
isinstancer?   rˆ   Úcallabler`   r�   r   Ú	_fillModer&   r'   ÚsizeÚcoder¦   ÚpathÚ_strokeColorÚ
_fillColorÚ
_lineWidthÚ_fontÚ	_fontSizeÚ_lineCapÚ	_lineJoinr   r�   Úcfp_strr   ÚcreateDocumentTypeÚcreateDocumentrB   ÚdocumentElementr–   ÚdictÚ_fillRuleMapÚupdater>   r@   r=   ÚcreateTextNodeÚappendChildÚsetFontr   ÚsetStrokeColorÚ
setLineCapÚsetLineJoinÚsetLineWidthrK   Ú	groupTreeÚ	scaleTreeÚ	currGroup)rY   r¯   rV   rª   rZ   r   r†   r�   ÚimplementationÚdoctyperœ   ÚkrŒ   r�   Útextrž   r¢   ÚclipRectÚgtkwr�   s   `                  @r    rR   zSVGCanvas.__init__˜   s  øø€ ð ˆŒÝœ hÑ/Ô/Ô4ˆŒØˆŒØ—(’(˜9 UÑ+Ô+ˆØŸš +¨bÑ1Ô1ˆŒØ�XŠX�k $Ñ'Ô'ˆÝ�b�ÑÔð 	pØ4Ð4Ð4Ð4ˆDŒNˆNÝ�b‰\Œ\ð 	pØˆDŒNˆNåÐn¥	ÐnÐnÐnÑoÔoÐoØ ŸHšH ^°BÑ7Ô7ˆÔØ—x’x ¨rÑ2Ô2ˆÝ&ˆŒà.2Ð2ÑˆŒ
�D”K $¤)àˆŒ	ØˆŒ
ØˆŒ	ð "ð	"ˆÔð 	"˜DœOð 	"¨d¬oð 	"ØŒJð	"Øœð	"Ø*.¬-ØŒNØ�8Š8�L Ñ'Ô'ð 	$Ý ˆDŒKˆKå#ˆDŒKØHÐHÐHÐHˆŒå-¨iÑ8Ô8ˆð !×3Ò3°EØ+ØLñNô Nˆð "×0Ò0°°e¸GÑDÔDˆŒØ”8Ô+ˆŒÝÝ  Q¤™LœLÝ˜tœ{Ñ+Ô+Ø(7Ø'¨4¬:°t´{Ð*CÑCð 7Ø!ð
ñ 
ô 
ˆõ !-¨T¬^Ô <ˆ�ÑØ"@ˆ�ÑØ�Š˜Ÿš ¨BÑ/Ô/Ñ0Ô0Ð0Ø—>’>Ñ#Ô#ð 	'ð 	'‰CˆAˆaØŒH×!Ò! ! AÑ&Ô&Ð&Ð&à”×&Ò& wÑ/Ô/ˆØŒx×&Ò& uÑ-Ô-ˆØ×Ò˜$ÑÔÐØŒ×Ò˜UÑ#Ô#Ð#àŒx×%Ò% fÑ-Ô-ˆØŒx×&Ò& uÑ-Ô-ˆØ×Ò˜ÑÔÐØŒ×Ò˜TÑ"Ô"Ð"à�Š•^ JÔ/µÀ
Ô1KÑLÔLÐLØ×Ò�N¨=Ô9Ñ:Ô:Ð:Ø�Š˜ÑÔÐØ×Ò˜ÑÔÐØ×Ò˜!ÑÔÐàð 		Eå$ T¤X¨z¸fÐEÑEÔEˆHÝ$ T¤X¨v¸¸aØ”j¨¬ð6ñ 6ô 6ˆHà× Ò  Ñ*Ô*Ð*ØŒH× Ò  Ñ*Ô*Ð*ÝÐ5Ð6Ñ6Ô6ˆDˆDå˜[¨D¬J°t´{Ð+CÑCÐDÑDÔDˆDå& t¤x°ð ØØ4°t´{ÑBðð ð ðð ˆŒð ð 	1Ý*¨4¬8°S¸\ÐUaÐbÑbÔbˆDŒNØŒN×&Ò& t¤~Ñ6Ô6Ð6ØŒH× Ò  ¤Ñ0Ô0Ð0Ð0àŒH× Ò  ¤Ñ0Ô0Ð0ØœˆŒˆˆr"   Nc                 ó   — t          | j        | j        ¬¦  «        }| j                             |dd| j        ¬¦  «         t          |d¦  «        r|}nt          |d| j        ¬¦  «        }|                     ¦   «         }| j        }|r| 	                    dd|z   ¦  «        }| 
                    |¦  «         ||ur|                     ¦   «          d S d S )	N)rZ   ú	ú
)Ú	addindentÚnewlrV   rW   Úw)rV   z?>)rM   rV   rZ   rB   ÚwritexmlÚhasattrÚopenr   r�   r”   rW   Úclose)rY   r*   ÚwriterÚfr–   Úexds         r    r)   zSVGCanvas.save  sÎ   € Ý˜tœ}°´Ð:Ñ:Ô:ˆØŒ×Ò˜&¨4°TÀ4Ä=ÐÑQÔQÐQå�2�gÑÔð 	5ØˆAˆAå�R˜ d¤mÐ4Ñ4Ô4ˆAà�oŠoÑÔˆØÔˆØð 	-Ø—+’+˜d 4¨¡8Ñ,Ô,ˆCØ	�Š�‰ŒˆØ�Bˆ;ˆ;Ø�GŠG‰IŒIˆIˆIˆIð ˆ;r"   c                 óH   — |p| j         }|p| j        }t          |||¦  «        S )zuReturn the logical width of the string if it were drawn
        in the current font (defaults to self.font).
        )rµ   r¶   r   )rY   r   Úfontr    s       r    ÚNOTUSED_stringWidthzSVGCanvas.NOTUSED_stringWidth  s.   € ð
 Ð!�t”zˆØÐ-˜tœ~ˆå˜1˜d HÑ-Ô-Ð-r"   rg   c                 ó^  ‡‡‡— | j                              ¦   «         Š‰                     |¦  «         t          ‰                     ¦   «         ¦  «        }‰rˆfd„|D ¦   «         }‰r$‰                     ¦   «         Šˆˆfd„|D ¦   «         }nˆfd„|D ¦   «         }d                     |¦  «        dz   S )Nc                 ó   •— g | ]}|‰v ¯|‘Œ	S rt   rt   )r}   rÌ   Úincludes     €r    ú
<listcomp>z*SVGCanvas._formatStyle.<locals>.<listcomp>-  s   ø€ Ð4Ð4Ð4˜! q¨G | |�A | | |r"   c                 óN   •— g | ]!}|‰v¯|d z   t          ‰|         ¦  «        z   ‘Œ"S ©z: ©r?   )r}   rÌ   Úexcluder¦   s     €€r    rã   z*SVGCanvas._formatStyle.<locals>.<listcomp>0  s6   ø€ ÐLÐLÐL¨a¸1ÀGÐ;KÐ;K�Q�t‘V�C  a¤™MœMÑ)Ð;KÐ;KÐ;Kr"   c                 óF   •— g | ]}|d z   t          ‰|         ¦  «        z   ‘ŒS rå   ræ   )r}   rÌ   r¦   s     €r    rã   z*SVGCanvas._formatStyle.<locals>.<listcomp>2  s,   ø€ Ð8Ð8Ð8¨a�Q�t‘V�C  a¤™MœMÑ)Ð8Ð8Ð8r"   z; ú;)r¦   Úcopyr¿   rQ   ÚkeysÚsplitri   )rY   râ   rç   r   rë   r>   r¦   s    ``   @r    Ú_formatStylezSVGCanvas._formatStyle(  sÁ   øøø€ Ø”
—’Ñ!Ô!ˆØ�Š�TÑÔÐÝ�E—J’J‘L”LÑ!Ô!ˆØð 	5Ø4Ð4Ð4Ð4˜tÐ4Ñ4Ô4ˆDØð 	9Ø—m’m‘o”oˆGØLÐLÐLÐLÐL°4ÐLÑLÔLˆEˆEà8Ð8Ð8Ð8°4Ð8Ñ8Ô8ˆEØ�yŠy˜ÑÔ #Ñ%Ð%r"   c                 ó   — |S )zKI don't think this was ever needed; seems to have been copied from renderPSrt   )rY   r   s     r    Ú_escapezSVGCanvas._escape5  s   € àˆr"   c                 ó   — dS )zXCalculate the path for an arc inscribed in rectangle defined
        by (x1,y1),(x2,y2).N)Úabs)rY   Úx1Úy1Úx2Úy2ÚstartAngÚextentÚxScaleÚyScaler0   r1   ÚcodelineÚarcÚdatas                 r    Ú_genArcCodezSVGCanvas._genArcCode9  s	   € ð 	ˆr"   c                 ó   — i }|rt           |         |d<   t          | j        d| j        |                      |¦  «        ¬¦  «        }|r|                      ||¦  «        }| j                             |¦  «         d| _        d S )Nr›   r±   ©r   r¦   rg   )r¾   rK   rB   r±   rí   Ú	_add_linkrÉ   rÁ   )rY   r°   r£   Ú	link_infoÚstylesÚfillModeÚxtrar±   s           r    Ú_fillAndStrokezSVGCanvas._fillAndStrokeO  s‹   € ØˆØð 	7Ý ,¨XÔ 6ˆD�ÑÝ˜TœX vØŒi˜t×0Ò0°Ñ8Ô8ðñ ô ˆð ð 	3Ø—>’> $¨	Ñ2Ô2ˆDØŒ×"Ò" 4Ñ(Ô(Ð(ØˆŒ	ˆ	ˆ	r"   c                 óZ   — ddddœ}| j         |k    r|| _         ||         | j        d<   d S d S )NÚbuttÚroundÚsquare©r   r   r4   ústroke-linecap)r·   r¦   ©rY   rŒ   Úvalss      r    rÄ   zSVGCanvas.setLineCap]  sD   € Ø˜G xÐ0Ð0ˆØŒ=˜AÒÐØˆDŒMØ+/°¬7ˆDŒJÐ'Ñ(Ð(Ð(ð Ðr"   c                 óZ   — ddddœ}| j         |k    r|| _         ||         | j        d<   d S d S )NÚmiterr  Úbevelr
  r  )r¸   r¦   r  s      r    rÅ   zSVGCanvas.setLineJoinc  sD   € Ø˜W¨Ð0Ð0ˆØŒ>˜QÒÐØˆDŒNØ+/°¬7ˆDŒJÐ'Ñ(Ð(Ð(ð Ðr"   c                 óÊ  — t          |t          t          f¦  «        r4d                     t	          t
          ||g¦  «        ¦  «        | j        d<   dS t          |t          t          f¦  «        rrt          |¦  «        dk    ra|dk    s
J d¦   «         ‚d                     t	          t
          |¦  «        ¦  «        | j        d<   |dk    rt          |¦  «        | j        d<   dS dS dS dS )z7Two notations. Pass two numbers, or an array and phase.ú, zstroke-dasharrayr   zphase is a length in user spacezstroke-dashoffsetN)
r¬   ÚfloatÚintri   Úmapr?   r¦   ÚtuplerQ   r6   )rY   ÚarrayÚphases      r    ÚsetDashzSVGCanvas.setDashi  s×   € õ �e�U¥3˜KÑ(Ô(ð 	=Ø-1¯YªYµs½3À%ÈÀÑ7QÔ7QÑ-RÔ-RˆDŒJÐ)Ñ*Ð*Ð*Ý˜�u¥T˜lÑ+Ô+ð 	=µ°E±
´
¸Q²°Ø˜A’:�:�:Ð@‘:”:�:Ø-1¯YªYµs½3À±´Ñ-GÔ-GˆDŒJÐ)Ñ*Ø�QŠwˆwÝ25°e±*´*�”
Ð.Ñ/Ð/Ð/ð		=ð 	=°°ð ˆwr"   c                 óò   — || _         |d k    rd| j        d<   d S |j        |j        |j        }}}d|dz  |dz  |dz  fz  | j        d<   |j        }|dk    rd|z  | j        d<   d S d| j        v r
| j        d= d S d S )NÚnoneÚstrokeúrgb(%d%%,%d%%,%d%%)éd   r   r‹   zstroke-opacity)r²   r¦   ÚredÚgreenÚblueÚnormalizedAlpha©rY   Úcolorr2   r§   ÚbÚalphas         r    rÃ   zSVGCanvas.setStrokeColort  sª   € Ø!ˆÔØ�DŠ=ˆ=Ø#)ˆDŒJ�xÑ Ð Ð à”i ¤¨e¬j�!ˆqˆAØ#8¸A¸c¹EÀ1ÀSÁ5È!ÈCÉ%Ð;PÑ#PˆDŒJ�xÑ ØÔ)ˆEØ�aŠxˆxØ/3°e©|�”
Ð+Ñ,Ð,Ð,Ø! T¤ZÐ/Ð/Ø”JÐ/Ð0Ð0Ð0ð 0Ð/r"   c                 óò   — || _         |d k    rd| j        d<   d S |j        |j        |j        }}}d|dz  |dz  |dz  fz  | j        d<   |j        }|dk    rd|z  | j        d<   d S d| j        v r
| j        d= d S d S )Nr  Úfillr  r  r   r‹   zfill-opacity)r³   r¦   r  r   r!  r"  r#  s         r    ÚsetFillColorzSVGCanvas.setFillColor�  s§   € ØˆŒØ�DŠ=ˆ=Ø!'ˆDŒJ�vÑÐÐà”i ¤¨e¬j�!ˆqˆAØ!6¸!¸C¹%ÀÀ3ÁÈÈ#ÉÐ9NÑ!NˆDŒJ�vÑØÔ)ˆEØ�aŠxˆxØ-1°E©\�”
˜>Ñ*Ð*Ð*Ø 4¤:Ð-Ð-Ø”J˜~Ð.Ð.Ð.ð .Ð-r"   c                 ó>   — || _         t          |         | j        d<   d S )Nr›   )r®   r¾   r¦   )rY   rŒ   s     r    ÚsetFillModezSVGCanvas.setFillModeŽ  s   € ØˆŒÝ".¨q¤/ˆŒ
�;ÑÐÐr"   c                 óB   — || j         k    r|| _         || j        d<   d S d S )Nzstroke-width)r´   r¦   )rY   r&   s     r    rÆ   zSVGCanvas.setLineWidth’  s0   € Ø�D”OÒ#Ð#Ø#ˆDŒOØ).ˆDŒJ�~Ñ&Ð&Ð&ð $Ð#r"   c                 óî  — | j         |k    s| j        |k    rÞ|| _         || _        | j        }t          D ]	}||v r||= Œ
|| j        v r| j        |         ni }t          |t          ¦  «        r9|                     t          |j	         
                    ¦   «         ¦  «        ¦  «         |r-| 
                    ¦   «         D ]\  }}d|z   }|t          v r|||<   Œd|vr||d<   |                      |¦  «        |d<   d S d S )Nzfont-zfont-familyz	font-size)rµ   r¶   r¦   ÚTEXT_STYLESr‡   r¬   r   r¿   Úiterrœ   r>   rˆ   )rY   rÞ   r    r¦   rÌ   rœ   rŒ   r~   s           r    rÂ   zSVGCanvas.setFont—  s#  € ØŒ:˜ÒÐ ¤°8Ò!;Ð!;ØˆDŒJØ%ˆDŒNØ”JˆEÝ ð !ð !�Ø˜�:�:Ø˜a˜øØ/3°t´~Ð/EÐ/E�t”~ dÔ+Ð+È2ˆHÝ˜$�xÑ(Ô(ð =Ø—’¥ T¤]×%8Ò%8Ñ%:Ô%:Ñ ;Ô ;Ñ<Ô<Ð<Øð %Ø#Ÿ>š>Ñ+Ô+ð %ð %‘C�A�aØ ™	�AØ�KÐ'Ð'Ø#$˜˜a™øØ EÐ)Ð)Ø'+��mÑ$Ø!%§¢°Ñ!9Ô!9ˆE�+ÑÐÐð# "<Ð!;r"   c                 ó„   — t          |t          ¦  «        sJ ‚t          | j        dfi |¤Ž}|                     |¦  «         |S )Nr~   )r¬   r½   rK   rB   rÁ   )rY   Ú
dom_objectr  Úlinks       r    r   zSVGCanvas._add_link«  sJ   € Ý˜)¥TÑ*Ô*Ð*Ð*Ð*Ý˜TœX sÐ8Ð8¨iÐ8Ð8ˆØ×Ò˜Ñ$Ô$Ð$Øˆr"   é   c           
      ó€  — | j         rt          d¦  «         t          ||¦  «        }	t          ||¦  «        }
i }t          | j        df|	|
t          ||¦  «        |	z
  t          ||¦  «        |
z
  |                      t          ¦  «        dœ|¤Ž}|r|                      ||¦  «        }| j	         
                    |¦  «         dS )z)Draw a rectangle between x1,y1 and x2,y2.z+++ SVGCanvas.rectr¥   )r0   r1   r&   r'   r¦   N)rª   ÚprintÚminrK   rB   Úmaxrí   ÚAREA_STYLESr   rÉ   rÁ   )rY   rò   ró   rô   rõ   ÚrxÚryr  Ú	_svgAttrsr0   r1   r   r¥   s                r    r¥   zSVGCanvas.rect²  sË   € ð Œ<Ð4�Ð3Ñ4Ô4Ð4å��2‰JŒJˆÝ��2‰JŒJˆØˆÝ˜TœX vð >Ø�1�C  2™JœJ q™Lµ°R¸±´¸A±Ø×#Ò#¥KÑ0Ô0ð>ð >à3<ð>ð >ˆð ð 	3Ø—>’> $¨	Ñ2Ô2ˆDàŒ×"Ò" 4Ñ(Ô(Ð(Ð(Ð(r"   c                 óÜ   — t          | j        df||||z
  ||z
  |||                      t          ¦  «        dœ|¤Ž}	|r|                      |	|¦  «        }	| j                             |	¦  «         dS )z·Draw a rounded rectangle between x1,y1 and x2,y2.

        Corners inset as ellipses with x-radius rx and y-radius ry.
        These should have x1<x2, y1<y2, rx>0, and ry>0.
        r¥   )r0   r1   r&   r'   r9  r:  r¦   N©rK   rB   rí   r8  r   rÉ   rÁ   )
rY   rò   ró   rô   rõ   r9  r:  r  r;  r¥   s
             r    Ú	roundRectzSVGCanvas.roundRectÃ  sŠ   € õ ˜TœX vð ?Ø�B˜b ™e¨B¨r©E°b¸RØ×#Ò#¥KÑ0Ô0ð?ð ?à4=ð?ð ?ˆð ð 	3Ø—>’> $¨	Ñ2Ô2ˆDàŒ×"Ò" 4Ñ(Ô(Ð(Ð(Ð(r"   Úleftc           	      ó6  — |dk    rd S t          |¦  «        }| j        rt          d¦  «         |dk    p|dk    p|dk    p|dk    }	|dk    p|dk    p|dk    p|dk    }
| j        d k    r|	s| j        d k    �r |
�rŸ|d	vr|t          || j        | j        ¦  «        }|d
k    r||z  }nU|dk    r	||dz  z  }nF|dk    r!|t          |||| j        | j        ¦  «        z  }nt          dt          |¦  «        z   ¦  «        ‚|                      |¦  «        }|                      t          ¦  «        }|dk    r|d|                      |||¦  «        z  z   }|	r||                      t          ¦  «        z  }n|dz  }|
r||                      t           ¦  «        z  }n|dz  }t#          | j        df|||dd|z  z  dœ|¤Ž}| j                             |¦  «        }|                     |¦  «         |r|                      ||¦  «        }| j                             |¦  «         d S d S d S )Né   z+++ SVGCanvas.drawStringr   r4   é   é   r   é   )ÚstartÚ	inheritedr?  ÚendÚmiddleç       @Únumericzbad value for text_anchor z rotate(%s);z fill:none;z stroke:none;rÍ   ztranslate(0,%d) scale(1,-1))r0   r1   r¦   r©   )r   rª   r5  r³   r²   r   rµ   r¶   ÚnumericXShiftr`   r?   rï   rí   r.  r   ÚEXTRA_FILL_STYLESÚEXTRA_STROKE_STYLESrK   rB   rÀ   rÁ   r   rÉ   )rY   r   r0   r1   Úangler  Útext_anchorÚtextRenderModer;  ÚneedFillÚ
needStrokeÚtextLenÚstrÍ   Úcontents                  r    Ú
drawStringzSVGCanvas.drawStringÓ  s—  € Ø˜1ÒÐ˜f˜fÝ�Q‰KŒKˆØŒ<Ð:�Ð9Ñ:Ô:Ð:Ø! 1Ò$Ðc¨¸Ò(9Ðc¸^ÈQÒ=NÐcÐR`ÐbcÒRcˆØ# QÒ&Ðe¨.¸!Ò*;Ðe¸~ÈqÒ?PÐeÐTbÐdeÒTeˆ
àŒO˜TÒ!Ð! hÐ!°DÔ4EÀtÒ4KÑ4KÐPZÑ4KØÐ"@Ð@Ð@Ý% a¨¬
°4´>ÑBÔB�Ø Ò%Ð%Ø˜‘L�A�AØ  (Ò*Ð*Ø˜ ™‘O�A�AØ  )Ò+Ð+Ø� {°1°W¸T¼ZÈÌÑWÔWÑW�A�Aå$Ð%AÅCÈÑDTÔDTÑ%TÑUÔUÐUØ—’˜Q‘”ˆAØ×"Ò"¥;Ñ/Ô/ˆBØ˜ŠzˆzØ˜¨$¯+ª+°e¸QÀÑ*BÔ*BÑBÑBˆrØð $Ø�d×'Ò'Õ(9Ñ:Ô:Ñ:��à�mÑ#�Øð &Ø�d×'Ò'Õ(;Ñ<Ô<Ñ<��à�oÑ%�õ ! ¤¨6ð Ø�q Ø7¸1¸Q¹3Ñ?ðð ð ðð ˆDð
 ”h×-Ò-¨aÑ0Ô0ˆGØ×Ò˜WÑ%Ô%Ð%àð 7Ø—~’~ d¨IÑ6Ô6�àŒN×&Ò& tÑ,Ô,Ð,Ð,Ð,ðI 5LÐ4KÐ4KÐ4Kr"   rH  c                 ó\   — | j         rt          d¦  «          | j        |||f||||dœ|¤Ž d S )Nz+++ SVGCanvas.drawCentredString©rN  r  rO  rP  ©rª   r5  rV  )	rY   r   r0   r1   rN  rO  r  rP  r;  s	            r    ÚdrawCentredStringzSVGCanvas.drawCentredString   sY   € àŒ<ÐA�Ð@ÑAÔAÐAØˆŒ˜˜!˜Að 	< E°YÈKØ-ð	<ð 	<Ø1:ð	<ð 	<ð 	<ð 	<ð 	<r"   rG  c                 ó\   — | j         rt          d¦  «          | j        |||f||||dœ|¤Ž d S )Nz+++ SVGCanvas.drawRightStringrX  rY  )	rY   rÍ   r0   r1   rN  rO  r  rP  r;  s	            r    ÚdrawRightStringzSVGCanvas.drawRightString  sY   € àŒ<Ð?�Ð>Ñ?Ô?Ð?ØˆŒ˜˜Q˜qð 	< u¸	È{Ø-ð	<ð 	<Ø1:ð	<ð 	<ð 	<ð 	<ð 	<r"   c                 ó:   — | j                              |¦  «        }dS )zAdd a comment.N)rB   ÚcreateComment)rY   rü   Úcomments      r    r_  zSVGCanvas.comment  s   € ð ”(×(Ò(¨Ñ.Ô.ˆˆˆr"   Tc                 ód  — t          ¦   «         }|                     |d¦  «         t          t          j        |                     ¦   «         ¦  «        ¦  «        }| j                             t          | j	        d||||d|z   d|  
                    ddddd|d|z  z   ¦  «        z  ¬	¦  «        ¦  «         d S )
NÚpngÚimagezdata:image/png;base64,ú
matrix(%s)r   r   éÿÿÿÿr4   )r0   r1   r&   r'   Úhrefr©   )r   r)   r   Úbase64Ú	b64encoder   rÉ   rÁ   rK   rB   r¹   )rY   rb  r0   r1   r&   r'   ÚembedÚbufs           r    Ú	drawImagezSVGCanvas.drawImage  s²   € Ý‰iŒiˆØ�
Š
�3�uÑÔÐÝ•vÔ'¨¯ª©¬Ñ7Ô7Ñ8Ô8ˆØŒ×"Ò"Ý˜dœh wØ˜! %¨vØ1°#Ñ5Ø*¨T¯\ª\¸!¸A¸aÀÀ1ÀVÈAÈaÉCÁZÑ-PÔ-PÑPðñ ô ñ	ô 	ð 	ð 	ð 	r"   c                 ó  — | j         d k    r|	 t          | j        dd|                      ||¦  «        ›d|                      ||¦  «        ›d�|                      t          ¦  «        ¬¦  «        }| j                             |¦  «         d S d S )	Nr   Úline)r0   r1   rô   rõ   r¦   r±   úM ú L z Zrÿ   )r²   rK   rB   rí   ÚLINE_STYLESrÉ   rÁ   r¹   )rY   rò   ró   rô   rõ   rl  r±   s          r    rl  zSVGCanvas.line  sš   € ØÔ Ò$Ð$ð1õ
 ! ¤¨6¨6Ø#'§<¢<°°2Ñ#6Ô#6Ð#6Ð#6°t·|²|ÀBÀrÑ7JÔ7JÐ7JÐ7JÐKØ×'Ò'­Ñ4Ô4ð6ñ 6ô 6ˆDð ŒN×&Ò& tÑ,Ô,Ð,Ð,Ð,ð %Ð$r"   c                 ó   — t          | j        d||z   dz  ||z   dz  ||z
  dz  ||z
  dz  |                      t          ¦  «        ¬¦  «        }|r|                      ||¦  «        }| j                             |¦  «         dS )z{Draw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2.

        These should have x1<x2 and y1<y2.
        ÚellipserI  )ÚcxÚcyr9  r:  r¦   Nr=  )rY   rò   ró   rô   rõ   r  rq  s          r    rq  zSVGCanvas.ellipse*  s‘   € õ
   ¤¨)Ø�2‘�s‰{  2¡ s™{°°2±°s©{ÀÀ2ÁÀs¹{Ø×#Ò#¥KÑ0Ô0ð2ñ 2ô 2ˆð ð 	9Ø—n’n W¨iÑ8Ô8ˆGàŒ×"Ò" 7Ñ+Ô+Ð+Ð+Ð+r"   c           
      óÎ   — t          | j        d||||                      t          ¦  «        ¬¦  «        }|r|                      ||¦  «        }| j                             |¦  «         d S )NÚcircle)rr  rs  r2   r¦   r=  )rY   ÚxcÚycr2   r  ru  s         r    ru  zSVGCanvas.circle8  sm   € Ý˜tœx¨Ø�b˜AØ×#Ò#¥KÑ0Ô0ð2ñ 2ô 2ˆð ð 	7Ø—^’^ F¨IÑ6Ô6ˆFàŒ×"Ò" 6Ñ*Ô*Ð*Ð*Ð*r"   c
                 ó   — 	 d S ©N)r   r³   r°   r7   r²   )rY   rò   ró   rô   rõ   Úx3Úy3Úx4Úy4Úclosedrú   rü   s               r    Ú	drawCurvezSVGCanvas.drawCurveB  s
   € ØØˆr"   éh  c                 óp  — ||z   dz  ||z   dz  }	}||z
  dz  ||z
  dz  }}
|
t          |t          z  dz  ¦  «        z  |z   }|t          |t          z  dz  ¦  «        z  |	z   }|
t          ||z   t          z  dz  ¦  «        z  |z   }|t          ||z   t          z  dz  ¦  «        z  |	z   }| j        }g j        }|r% |d |||	¦  «        ›d |||¦  «        ›�¦  «         |r, |d ||
|¦  «        d|dk    d |||¦  «        fz  ¦  «         n6 |d |||¦  «         ||
|¦  «        d|dk    d |||¦  «        fz  ¦  «         |r |d |||	¦  «        z  ¦  «         t          | j        d	d
                     |j        ¦  «        |  	                    ¦   «         ¬¦  «        }| j
                             |¦  «         dS )a  Draw a partial ellipse inscribed within the rectangle x1,y1,x2,y2.

        Starting at startAng degrees and covering extent degrees. Angles
        start with 0 to the right (+x) and increase counter-clockwise.
        These should have x1<x2 and y1<y2.
        rI  é´   rm  rn  zA %s %d %d %d %sr   zM %s A %s %d %d %d %s ZzL %s Zr±   rx   rÿ   N)ÚcosÚpiÚsinr¹   r7   rK   rB   ri   Ú__self__rí   rÉ   rÁ   )rY   rò   ró   rô   rõ   rö   r÷   Ú
fromcenterrr  rs  r9  r:  ÚmxÚmyÚaxÚayr¹   r   r±   s                      r    ÚdrawArczSVGCanvas.drawArcO  s.  € ð �R‘%˜‘˜r "™u c™kˆBˆØ�R‘%˜‘˜r "™u c™kˆBˆØ•#�h�r‘k #‘oÑ&Ô&Ñ&¨Ñ+ˆØ•#�h�r‘k #‘oÑ&Ô&Ñ&¨Ñ+ˆØ•#�x ‘­Ñ*¨3Ñ.Ñ/Ô/Ñ/°"Ñ4ˆØ•#�x ‘­Ñ*¨3Ñ.Ñ/Ô/Ñ/°"Ñ4ˆà”,ˆØŒIˆØð 	@ØˆAˆA˜W˜W R¨™_œ_˜_˜_¨g¨g°b¸"©o¬o¨oÐ>Ñ?Ô?Ð?àð 	VØˆAÐ Øˆw�r˜2‰Œ  6¨3¢;°°7°7¸2¸r±?´?ÐCñDñ Eô Eð Eð Eð ˆAÐ'Øˆw�r˜2‰Œ  ¨¨B¡¤°°F¸C²KÀÀGÀGÈBÐPRÁOÄOÐTñUñ Vô Vð Vð ð 	*ØˆAˆh˜˜  R™œÑ(Ñ)Ô)Ð)å˜TœX vØ�hŠh�q”zÑ"Ô"¨$×*;Ò*;Ñ*=Ô*=ð?ñ ?ô ?ˆàŒ×"Ò" 4Ñ(Ô(Ð(Ð(Ð(r"   c                 ór  — t          |¦  «        dk    s
J d¦   «         ‚| j        d k    s| j        d k    rƒd                     d„ |D ¦   «         ¦  «        }t	          | j        d||                      t          ¦  «        ¬¦  «        }|r|                      ||¦  «        }| j	         
                    |¦  «         d S d S )Nr4   z"Polygon must have 2 or more pointsr  c                 ó    — g | ]}t          |Ž ‘ŒS rt   r   ©r}   Úps     r    rã   z%SVGCanvas.polygon.<locals>.<listcomp>u  ó   € Ð8Ð8Ð8¨A�V Q˜ZÐ8Ð8Ð8r"   Úpolygon©Úpointsr¦   )r6   r²   r³   ri   rK   rB   rí   r8  r   rÉ   rÁ   )rY   r”  r~  r  ÚptsÚpolylines         r    r’  zSVGCanvas.polygonq  sÍ   € Ý�6‰{Œ{˜aÒÐÐÐ!EÑÔÐàÔ˜dÒ"Ð" d¤o°tÒ&;Ð&;Ø—)’)Ð8Ð8°Ð8Ñ8Ô8Ñ9Ô9ˆCÝ$ T¤X¨yØ $×"3Ò"3µKÑ"@Ô"@ðBñ Bô BˆHð ð ?ØŸ>š>¨(°IÑ>Ô>�àŒN×&Ò& xÑ0Ô0Ð0Ð0Ð0ð '<Ð&;r"   c                 ó   — d S ry  )r²   r°   r7   r   )rY   ÚlineListr$  r&   rú   rl  s         r    ÚlineszSVGCanvas.lines€  s   € àˆr"   c           	      ó0  — t          |¦  «        dk    s
J d¦   «         ‚| j        d k    rmd                     d„ |D ¦   «         ¦  «        }t          | j        d||                      t          d ¬¦  «        ¬¦  «        }| j                             |¦  «         d S d S )Nr   z#Polyline must have 1 or more pointsr  c                 ó    — g | ]}t          |Ž ‘ŒS rt   r   r�  s     r    rã   z&SVGCanvas.polyLine.<locals>.<listcomp>�  r‘  r"   r–  )r(  r“  )	r6   r²   ri   rK   rB   rí   r8  rÉ   rÁ   )rY   r”  r•  r–  s       r    ÚpolyLinezSVGCanvas.polyLine‰  s©   € Ý�6‰{Œ{˜aÒÐÐÐ!FÑÔÐàÔ Ò$Ð$Ø—)’)Ð8Ð8°Ð8Ñ8Ô8Ñ9Ô9ˆCÝ$ T¤X¨zØ $×"3Ò"3µKÀTÐ"3Ñ"JÔ"JðLñ Lô LˆHàŒN×&Ò& xÑ0Ô0Ð0Ð0Ð0ð	 %Ð$r"   )r©   c                 óÊ   — | j         rt          d¦  «         | j        }t          | j        dfi |¤Ž}|                     |¦  «         || _        | j         rt          d¦  «         |S )Nz+++ begin SVGCanvas.startGroupr§   z+++ end SVGCanvas.startGroup)rª   r5  rÉ   rK   rB   rÁ   )rY   rE   rÉ   r¨   s       r    Ú
startGroupzSVGCanvas.startGroup“  so   € ØŒ<Ð@�Ð?Ñ@Ô@Ð@Ø”Nˆ	Ý˜dœh¨Ð8Ð8¨xÐ8Ð8ˆØ×Ò˜eÑ$Ô$Ð$ØˆŒØŒ<Ð>�Ð=Ñ>Ô>Ð>ØÐr"   c                 óp   — | j         rt          d¦  «         || _        | j         rt          d¦  «         d S d S )Nz+++ begin SVGCanvas.endGroupz+++ end SVGCanvas.endGroup)rª   r5  rÉ   )rY   rÉ   s     r    ÚendGroupzSVGCanvas.endGroupœ  sA   € ØŒ<Ð>�Ð=Ñ>Ô>Ð>Ø"ˆŒØŒ<Ð<�Ð;Ñ<Ô<Ð<Ð<Ð<Ð<Ð<r"   c           	      ó  — | j         rt          d||||||¦  «         | j                             d¦  «        }||||||fdk    r?d|                      ||||||¦  «        z  }| j                             d|›d|›�¦  «         d S d S )Nz!!! begin SVGCanvas.transformr©   )r   r   r   r   r   r   rc  rx   )rª   r5  rÉ   rA   r¹   r@   )	rY   r~   r%  r+   r   ÚerÛ   ÚtrÚts	            r    r©   zSVGCanvas.transform¡  s£   € ØŒ<ÐQ�Ð>ÀÀ1ÀaÈÈAÈqÑQÔQÐQØŒ^×(Ò(¨Ñ5Ô5ˆØˆq�!�Q˜˜1ÐÐ!3Ò3Ð3Ø˜tŸ|š|¨A¨a°°!°A°aÑ8Ô8Ñ8ˆAØŒN×'Ò'¨ÀÀÀÀAÀAÐ5FÑGÔGÐGÐGÐGð 4Ð3r"   c           
      ó¸   — ||fdk    rQ| j                              d| j                              d¦  «        ›dd|                      ||¦  «        z  ›�¦  «         d S d S )N)r   r   r©   rx   ztranslate(%s))rÉ   r@   rA   r¹   ©rY   r0   r1   s      r    Ú	translatezSVGCanvas.translate¨  ss   € Øˆaˆ5�EŠ>ˆ>ØŒN×'Ò'¨Ø”>×.Ò.¨{Ñ;Ô;Ð;Ð;Ø# d§l¢l°1°QÑ&7Ô&7Ñ7Ð7ð69ñ :ô :ð :ð :ð :ð ˆ>r"   c           
      óÄ   — ||fdk    rW| j                              d| j        d                              d¦  «        ›dd|                      ||¦  «        z  ›�¦  «         d S d S )N)r   r   r©   rd  rx   z	scale(%s))rÉ   r@   ÚgroupsrA   r¹   )rY   ÚsxÚsys      r    ÚscalezSVGCanvas.scale®  sz   € Øˆrˆ7�eÒÐØŒN×'Ò'¨Ø”{ 2”×3Ò3°KÑ@Ô@Ð@Ð@Ø# d§l¢l°2°rÑ&:Ô&:Ñ:Ð:ð6<ñ =ô =ð =ð =ð =ð Ðr"   c                 óR   — | j         d|                      ||¦  «        z  z   | _         d S )NzM %s ©r±   r   r¦  s      r    ÚmoveTozSVGCanvas.moveToµ  ó'   € Ø”I ¨$¯+ª+°a¸Ñ*;Ô*;Ñ ;Ñ;ˆŒ	ˆ	ˆ	r"   c                 óR   — | j         d|                      ||¦  «        z  z   | _         d S )NzL %s r®  r¦  s      r    ÚlineTozSVGCanvas.lineTo¸  r°  r"   c           
      óZ   — | j         d|                      ||||||¦  «        z  z   | _         d S )NzC %s r®  )rY   rò   ró   rô   rõ   rz  r{  s          r    ÚcurveTozSVGCanvas.curveTo»  s/   € Ø”I ¨$¯+ª+°b¸"¸bÀ"ÀbÈ"Ñ*MÔ*MÑ MÑMˆŒ	ˆ	ˆ	r"   c                 ó$   — | j         dz   | _         d S )NzZ )r±   ©rY   s    r    Ú	closePathzSVGCanvas.closePath¾  s   € Ø”I Ñ$ˆŒ	ˆ	ˆ	r"   c                 ó   — d S ry  rt   r¶  s    r    Ú	saveStatezSVGCanvas.saveStateÁ  ó   € Øˆr"   c                 ó   — d S ry  rt   r¶  s    r    ÚrestoreStatezSVGCanvas.restoreStateÄ  rº  r"   )rƒ   r\   r   Fry  )NN)r3  r3  N)r   Nr?  r   )r   rH  Nr   )r   rG  Nr   )T)r   )r   r€  r   )r   N)/rj   rk   rl   rR   r)   rß   rí   rï   rý   r8  r  rÄ   rÅ   r  rÃ   r)  r+  rÆ   rÂ   r   r¥   r>  rV  rZ  r\  r_  rj  rl  rq  ru  r  rŒ  r’  r™  rœ  r½   rž  r   r©   r§  r¬  r¯  r²  r´  r·  r¹  r¼  rt   r"   r    r%   r%   —   s8  € € € € € ðr(ð r(ð r(ð r(ðhð ð ð ð$.ð .ð .ð .ð $&¨rð &ð &ð &ð &ðð ð ðð ð ð, )*°TÀÐVZð 
ð 
ð 
ð 
ð3ð 3ð 3ð3ð 3ð 3ð  að 	=ð 	=ð 	=ð 	=ð1ð 1ð 1ð/ð /ð /ð2ð 2ð 2ð/ð /ð /ð
:ð :ð :ð(ð ð ð)ð )ð )ð )ð")ð )ð )ð )ð +-ð +-ð +-ð +-ðZ ?GØ+,ð<ð <ð <ð <ð ?DØ+,ð<ð <ð <ð <ð/ð /ð /ð
ð 
ð 
ð 
ð
-ð 
-ð 
-ð,ð ,ð ,ð ,ð+ð +ð +ð +ð)ð )ð )ð )ð )ð  )ð  )ð  )ðD1ð 1ð 1ð 1ðPð Pð Pð Pð1ð 1ð 1ð "& °Ð!3Ñ!3Ô!3ð ð ð ð ð=ð =ð =ð
Hð Hð Hð:ð :ð :ð=ð =ð =ð<ð <ð <ð<ð <ð <ðNð Nð Nð%ð %ð %ðð ð ðð ð ð ð r"   r%   c                   ó„   — e Zd ZdZd„ Zd„ Zdddddd	d
dœZd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zefd„Zd„ Zd„ ZdS )r-   z%This draws onto an SVG document.
    c                 ó   — d| _         d S )Nr   )rª   r¶  s    r    rR   z_SVGRenderer.__init__Ë  s   € ØˆŒˆˆr"   c                 ó  — | j         rt          d|z  ¦  «         | j                             d|z  ¦  «         | j        j                             ¦   «         }t          |t          ¦  «        r|j        s	 t          |¦  «        }| j
                             |¦  «         |                      |i ¦  «         |                      |¦  «         | j
                             ¦   «         }t          |t          ¦  «        r|j        s	 | j                             d|z  ¦  «         |                     ¦   «         D ]/\  }}|| j        v r!t#          | j        | j        |         |¦  «         Œ0|| j        _        | j         rt          d|z  ¦  «         dS dS )zGThis is the recursive method called for each node in the tree.
        z#### begin _SVGRenderer.drawNode(%r)zbegin node %rzend node %rz!### end _SVGRenderer.drawNode(%r)N)rª   r5  Ú_canvasr_  r¦   rê   r¬   r   Ú
isClipPathr	   Ú_trackerÚpushÚapplyStateChangesÚdrawNodeDispatcherr«   r>   Ú	_restoresÚsetattr)rY   rD   r¦   ÚdeltasÚrDeltasrÌ   rŒ   s          r    ÚdrawNodez_SVGRenderer.drawNodeÎ  s‚  € ð Œ<ÐL�ÐDÀtÑKÑLÔLÐLàŒ×Ò˜_¨TÑ1Ñ2Ô2Ð2Ø”Ô"×'Ò'Ñ)Ô)ˆÝ˜4¥Ñ&Ô&ð 	¨4¬?ð 	Øõ ˜tÑ$Ô$ˆØŒ×Ò˜6Ñ"Ô"Ð"Ø×Ò˜v rÑ*Ô*Ð*ð 	×Ò Ñ%Ô%Ð%à”-×#Ò#Ñ%Ô%ˆÝ˜4¥Ñ&Ô&ð 	¨4¬?ð 	ØØŒ×Ò˜]¨4Ñ/Ñ0Ô0Ð0ð —M’M‘O”Oð 	:ð 	:‰DˆAˆqØ�D”NÐ"Ð"Ý˜œ T¤^°AÔ%6°qÑ9Ô9Ð9øØ"ˆŒÔàŒ<ÐJ�ÐBÀTÑIÑJÔJÐJÐJÐJÐJÐJr"   r²   r´   r·   r¸   r³   rµ   r¶   )r¡   ÚstrokeWidthÚstrokeLineCapÚstrokeLineJoinÚ	fillColorrŸ   r    c                 ób   — t          |dd¦  «        pd}t          |dd¦  «        pd}|r||ddœS d S )NÚhrefURLrg   Ú	hrefTitleÚ_top)z
xlink:hrefzxlink:titleÚtarget)Úgetattr)rY   ÚobjÚurlr�   s       r    Ú_get_link_info_dictz _SVGRenderer._get_link_info_dictò  sQ   € õ �c˜9 bÑ)Ô)Ð/¨RˆÝ˜˜[¨"Ñ-Ô-Ð3°ˆØð 	ð "%°EÀFÐKÐKÐKð$ �4r"   c                 ó  — | j         rt          d¦  «         | j                             ¦   «         }| j                             ¦   «         d         \  }}}}}}|                     ¦   «         D ]C}	t          |	t          ¦  «        r|	 	                    ¦   «         }
n|	}
|  
                    |
¦  «         ŒD| j                             ||||||¦  «         | j                             |¦  «         | j         rt          d¦  «         d S d S )Nz ### begin _SVGRenderer.drawGroupr©   z### end _SVGRenderer.drawGroup)rª   r5  rÀ  rž  rÂ  ÚgetStateÚgetContentsr¬   r   ÚprovideNoderÊ  r©   r   )rY   r¨   rÉ   r~   r%  r+   r   r¢  rÛ   Ú	childNodeÚnode2s              r    Ú	drawGroupz_SVGRenderer.drawGroup  s  € ØŒ<ÐB�ÐAÑBÔBÐBà”L×+Ò+Ñ-Ô-ˆ	Øœ=×1Ò1Ñ3Ô3°KÔ@Ñˆˆ1ˆa��A�qØ×*Ò*Ñ,Ô,ð 	!ð 	!ˆIÝ˜)¥XÑ.Ô.ð "Ø!×-Ò-Ñ/Ô/��à!�Ø�MŠM˜%Ñ Ô Ð Ð ØŒ×Ò˜q ! Q¨¨1¨aÑ0Ô0Ð0ØŒ×Ò˜iÑ(Ô(Ð(àŒ<Ð@�Ð?Ñ@Ô@Ð@Ð@Ð@Ð@Ð@r"   c                 ó’  — |                       |¦  «        }t          |di ¦  «        }|j        |j        cxk    rdk    rAn n> | j        j        |j        |j        |j        |j        z   |j        |j	        z   fd|i|¤Ž d S  | j        j
        |j        |j        |j        |j        z   |j        |j	        z   |j        |j        fd|i|¤Ž d S )Nr;  r   r  )r×  rÔ  r9  r:  rÀ  r¥   r0   r1   r&   r'   r>  )rY   r¥   r  rœ   s       r    ÚdrawRectz_SVGRenderer.drawRect!  s  € Ø×,Ò,¨TÑ2Ô2ˆ	Ý˜4 ¨BÑ/Ô/ˆØŒ7�d”gÐ"Ð"Ò"Ð" Ò"Ð"Ð"Ð"Ð"àˆDŒLÔØ”F˜DœFØ”F˜4œ:Ñ% t¤v¨d¬kÑ'9ð\ð \àENð\àRZð\ð \ð \ð \ð \ð #ˆDŒLÔ"Ø”F˜DœFØ”F˜4œ:Ñ% t¤v¨d¬kÑ'9Ø”G˜TœWð5ð 5ð (ð	5ð ,4ð	5ð 5ð 5ð 5ð 5r"   c           
      ó  — | j                              ¦   «         }|d         |j        |j        |j        f\  }}}} | j        j        |||f|                      |¦  «        |t          |dd¦  «        dœt          |di ¦  «        ¤Ž d S )NÚ
textAnchorrP  r   )r  rO  rP  r;  )	rÂ  rÙ  r0   r1   rÍ   rÀ  rV  r×  rÔ  )rY   Ú	stringObjÚSrO  r0   r1   rÍ   s          r    rV  z_SVGRenderer.drawString2  s    € ØŒM×"Ò"Ñ$Ô$ˆØ"# L¤/°9´;À	ÄÈYÌ^Ð"[Ñˆ�Q˜˜4ØˆŒÔ  Q qð 	9°4×3KÒ3KÈIÑ3VÔ3VØ'½À	ÐJZÐ[\Ñ8]Ô8]ð	9ð 	9å˜i¨°BÑ7Ô7ð	9ð 	9ð 	9ð 	9ð 	9r"   c                 ó„   — | j         j        r3| j                              |j        |j        |j        |j        ¦  «         d S d S ry  )rÀ  r²   rl  rò   ró   rô   rõ   )rY   rl  s     r    ÚdrawLinez_SVGRenderer.drawLine9  sF   € ØŒ<Ô$ð 	BØŒL×Ò˜dœg t¤w°´¸¼ÑAÔAÐAÐAÐAð	Bð 	Br"   c                 ó†   — | j                              |j        |j        |j        |                      |¦  «        ¬¦  «         d S ©N)r  )rÀ  ru  rr  rs  r2   r×  )rY   ru  s     r    Ú
drawCirclez_SVGRenderer.drawCircle=  s<   € ØŒ×Ò˜VœY¨¬	°6´8Àt×G_ÒG_Ð`fÑGgÔGgÐÑhÔhÐhÐhÐhr"   c           	      óî  — |                      ¦   «         \  }}}|dk    s|€|dk    s|€w|j        sp|j        |j        |j        |j        |j        f\  }}}}}	|j        p|j        }||z
  ||z
  }}
||z   ||z   }}|	|z
  }| j         	                    |
|||||d¬¦  «         d S | 
                    ¦   «         }t          |t          ¦  «        r|                      |¦  «         d S |                      |¦  «         d S )Nr   r   )r‡  )Ú
_xtraRadiiÚannularÚcenterxÚcenteryÚradiusÚstartangledegreesÚendangledegreesÚyradiusrÀ  rŒ  Ú	asPolygonr¬   r   ÚdrawPathÚdrawPolygon)rY   Úwedgerò  Úradius1Úyradius1rí  rî  rï  rð  rñ  rò   ró   rô   rõ   r÷   r9   s                   r    Ú	drawWedgez_SVGRenderer.drawWedge@  s$  € Ø%*×%5Ò%5Ñ%7Ô%7Ñ"ˆ�˜(Ø�QŠJˆJ˜'˜/°¸!²°¸xÐ?OÐY^ÔYfÐ?OàŒ]˜EœM¨5¬<¸Ô9PÐRWÔRgÐgñ IˆG�W˜fÐ&7¸à”mÐ3 u¤|ˆGØ ™¨°©�ˆRØ ™¨°©�ˆRØ$Ð'8Ñ8ˆFØŒL× Ò   R¨¨RÐ1BÀFÐWXÐ ÑYÔYÐYÐYÐYà—’Ñ!Ô!ˆAÝ˜!�DÑ!Ô!ð $Ø—’˜aÑ Ô Ð Ð Ð à× Ò  Ñ#Ô#Ð#Ð#Ð#r"   c                 óz   — | j         j        r.| j                              t          |j        ¦  «        ¦  «         d S d S ry  )rÀ  r²   rœ  r;   r”  ©rY   r�  s     r    ÚdrawPolyLinez_SVGRenderer.drawPolyLineQ  s?   € ØŒ<Ô$ð 	=ØŒL×!Ò!¥/°!´(Ñ";Ô";Ñ<Ô<Ð<Ð<Ð<ð	=ð 	=r"   c           	      óâ   — |j         |j        z
  }|j         |j        z   }|j        |j        z
  }|j        |j        z   }| j                             |||||                      |¦  «        ¬¦  «         d S rè  )rr  r9  rs  r:  rÀ  rq  r×  )rY   rq  rò   rô   ró   rõ   s         r    ÚdrawEllipsez_SVGRenderer.drawEllipseU  so   € àŒZ˜'œ*Ñ$ˆØŒZ˜'œ*Ñ$ˆØŒZ˜'œ*Ñ$ˆØŒZ˜'œ*Ñ$ˆØŒ×Ò˜R  2 b°D×4LÒ4LÈWÑ4UÔ4UÐÑVÔVÐVÐVÐVr"   c                 óŠ   — | j                              t          |j        ¦  «        d|                      |¦  «        ¬¦  «         d S )Nr   )r~  r  )rÀ  r’  r;   r”  r×  rû  s     r    rõ  z_SVGRenderer.drawPolygon]  s>   € ØŒ×Ò�_¨Q¬XÑ6Ô6¸qÈD×LdÒLdÐefÑLgÔLgÐÑhÔhÐhÐhÐhr"   c                 óØ  ‡‡	‡
— ddl mŠ	 | j        }|j        |j        |j        |j        fŠ
|€t          ‰dt          ¦  «        }|  	                    ‰¦  «        }t          ‰dd¦  «        }ˆ	ˆ
ˆfd„}|dk    r* |¦   «          | 
                    g ‰j        ||¬¦  «         d S |d	k    r, |d
¬¦  «         | 
                    g ‰j        ||¬¦  «         d S  |¦   «         }|sn|j        }|                     d ¦  «         	 d }| 
                    g ‰j        ||¬¦  «         |                     |¦  «         d S # |                     |¦  «         w xY w| 
                    g ‰j        ||¬¦  «         d S )Nr   )Ú_renderPathr  Ú	autocloserg   c                  ó   •—  ‰‰‰fi | ¤ŽS ry  rt   )r   r  Ú	drawFuncsr±   s    €€€r    ÚrPz!_SVGRenderer.drawPath.<locals>.rPi  s   ø€ Ø�;˜t YÐ7Ð7°$Ð7Ð7Ð7r"   r–   )r£   r  r  ÚpdfT)Ú
forceClose)Úreportlab.graphics.shapesr  rÀ  r¯  r²  r´  r·  rÔ  r   r×  r  rÁ  r³   r)  )rY   r±   r  r+   r  r  r  ÚisClosedÚofcr  r  s    `       @@r    rô  z_SVGRenderer.drawPath`  s¿  øøø€ à9Ð9Ð9Ð9Ð9Ð9ØŒLˆØ”X˜qœx¨¬°A´KÐ@ˆ	ØÐÝ˜t J­}Ñ=Ô=ˆHØ×,Ò,¨TÑ2Ô2ˆ	Ý˜D ¨RÑ0Ô0ˆ	ð	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8à�eÒÐØˆB‰DŒDˆDØ×Ò˜R d¤oÀÐU]ÐÑ^Ô^Ð^Ð^Ð^Ø˜ÒÐØˆB˜$ÐÑÔÐØ×Ò˜R d¤oÀÐU]ÐÑ^Ô^Ð^Ð^Ð^à�r‘t”tˆHØð 	cØ”l�Ø—’˜tÑ$Ô$Ð$ð(Ø $�IØ×$Ò$ R¨d¬oÈÐ]eÐ$ÑfÔfÐfà—N’N 3Ñ'Ô'Ð'Ð'Ð'ø�A—N’N 3Ñ'Ô'Ð'Ð'øøøà× Ò  ¨$¬/ÀYÐYaÐ ÑbÔbÐbÐbÐbs   Ã; D2 Ä2E	c                 ó†  — |j         }t          |t          ¦  «        rE|rt          j                              |¦  «        sd S t          ¦   «                              |¦  «        }nt          |d¦  «        r|}nd S |j        \  }}|j	        |j
        }}|€|}|€|}| j                             ||j        |j        ||d¬¦  «         d S )NÚconvertT)rh  )r±   r¬   r?   ÚosÚisfiler   rØ   r×   r¯   r&   r'   rÀ  rj  r0   r1   )rY   rb  r±   ÚimÚsrcWÚsrcHÚdstWÚdstHs           r    rj  z_SVGRenderer.drawImage~  sÆ   € ØŒzˆÝ�d�3ÑÔð 	ØÐ:�RœWŸ^š^¨DÑ1Ô1Ð:°F°FÝ‘”×!Ò! $Ñ'Ô'ˆBˆBÝ�T˜)Ñ$Ô$ð 	ØˆBˆBàˆFØ”W‰
ˆˆdØ”[ %¤,ˆdˆØˆ< ˜Øˆ< ˜ØŒ×Ò˜r 5¤7¨E¬G°T¸4ÀtÐÑLÔLÐLÐLÐLr"   c                 óâ  — |                      ¦   «         D �]Ø\  }}|dk    rŒ|dk    r| j                             |¦  «         Œ.|dk    r| j                             |¦  «         ŒO|dk    r| j                             |¦  «         Œp|dk    r| j                             |¦  «         Œ‘|dk    rž|r�t          |t          t          f¦  «        rFt          |¦  «        dk    r3t          |d         t          t          f¦  «        r|d	         }|d         }nd	}| j         
                    ||¦  «         �Œ| j         
                    ¦   «          �Œ5|d
k    r| j                             |¦  «         �ŒW|dv r]|                     d| j        j        ¦  «        }|                     d| j        j        ¦  «        }| j                             ||¦  «         �Œ¸|dk    r| j                             |¦  «         �ŒÚdS )z\This takes a set of states, and outputs the operators
        needed to set those propertiesr©   r¡   rË  rÌ  rÍ  ÚstrokeDashArrayr4   r   r   rÎ  )r    rŸ   rŸ   r    r  N)r>   rÀ  rÃ   rÆ   rÄ   rÅ   r¬   rQ   r  r6   r  r)  Úgetrµ   r¶   rÂ   r+  )rY   ÚdeltaÚnewStateÚkeyÚvaluer  ÚfontnameÚfontsizes           r    rÄ  z_SVGRenderer.applyStateChanges�  s  € ð  Ÿ+š+™-œ-ð 	0ñ 	0‰JˆC�Ø�kÒ!Ð!Øà˜Ò%Ð%Ø”×+Ò+¨EÑ2Ô2Ð2Ð2Ø˜Ò%Ð%Ø”×)Ò)¨%Ñ0Ô0Ð0Ð0Ø˜Ò'Ð'Ø”×'Ò'¨Ñ.Ô.Ð.Ð.ØÐ(Ò(Ð(Ø”×(Ò(¨Ñ/Ô/Ð/Ð/ØÐ)Ò)Ð)Øð +Ý! %­­e¨Ñ5Ô5ð "½#¸e¹*¼*Àaº-¸-ÍJÐW\Ð]^ÔW_ÕafÕgkÐ`lÑLmÔLm¸-Ø % a¤˜Ø % a¤˜˜à !˜Ø”L×(Ò(¨¨uÑ5Ô5Ð5Ñ5à”L×(Ò(Ñ*Ô*Ð*Ñ*Ø˜Ò#Ð#Ø”×)Ò)¨%Ñ0Ô0Ð0Ñ0ØÐ0Ð0Ð0Ø Ÿ9š9 Z°´Ô1CÑDÔD�Ø Ÿ9š9 Z°´Ô1GÑHÔH�Ø”×$Ò$ X¨xÑ8Ô8Ð8Ñ8Ø˜
Ò"Ð"Ø”×(Ò(¨Ñ/Ô/Ð/ùð;	0ð 	0r"   N)rj   rk   rl   rm   rR   rÊ  rÆ  r×  rÞ  rà  rV  ræ  ré  rù  rü  rþ  rõ  r   rô  rj  rÄ  rt   r"   r    r-   r-   Ç  sD  € € € € € ðð ðð ð ðKð Kð Kð@  .¸\ÐZdØ!,¸ÐQXØ&ð(ð (€Iðð ð ð>Að Að Að 5ð 5ð 5ð"9ð 9ð 9ðBð Bð Bðið ið ið$ð $ð $ð"=ð =ð =ðWð Wð Wðið ið ið '4ð cð cð cð cð<Mð Mð Mð!0ð !0ð !0ð !0ð !0r"   r-   úout-svgc                 ó  — t           j                             | ¦  «        st          j        | ¦  «         ddlm} g }t          |¦  «        D ]R}|dd…         dk    rBt          ||¦  «        } |¦   «         }t          |dd¦  «        }|                     ||f¦  «         ŒSd}|D ]=\  }}t           j         	                    | d|z  ¦  «        }	t          ||	¦  «         |dz  }Œ>dd	lm}
  |
¦   «         }t          |t           j         	                    | d
¦  «        ¦  «         ddlm} ddlm}  |¦   «         } ||j        |j        ¦  «        }|                     |¦  «         t          |t           j         	                    | d¦  «        ¦  «         d S )Nr   )Ú
testshapesé
   Ú
getDrawingrm   rg   zrenderSVG_%d.svgr   )ÚgetDrawing01ztest.svg)ÚRL_CorpLogo)ÚDrawingzcorplogo.svg)r  r±   ÚisdirÚmkdirÚreportlab.graphicsr  ÚdirrÔ  r7   ri   r   Úreportlab.graphics.testshapesr"  Úreportlab.lib.corpr#  r  r$  r&   r'   Úadd)ÚoutDirr  ÚdrawingsÚfuncnameÚfuncr.   Ú	docstringr:   r   Úfilenamer"  r#  r$  Úrls                 r    Útestr3  °  s°  € õ Œ7�=Š=˜Ñ Ô ð Ý
Œ�ÑÔÐà-Ð-Ð-Ð-Ð-Ð-Ø€Hå˜
‘O”Oð 2ð 2ˆØ�A�b�DŒ>˜\Ò)Ð)Ý˜: hÑ/Ô/ˆDØ�d‘f”fˆGÝ  Y¨rÑ2Ô2ˆIØ�OŠO˜W iÐ0Ñ1Ô1Ð1øà	€AØ"ð ð ‰ˆˆIÝ”7—<’< Ð'9¸AÑ'=Ñ>Ô>ˆÝ�1�hÑÔÐØ	ˆQ‰ˆˆà:Ð:Ð:Ð:Ð:Ð:Øˆ‰Œ€AÝˆq•"”'—,’,˜v jÑ1Ô1Ñ2Ô2Ð2à.Ð.Ð.Ð.Ð.Ð.Ø1Ð1Ð1Ð1Ð1Ð1à	ˆ‰Œ€BØˆ�”˜œÑ#Ô#€AØ‡E‚Eˆ"�I„I€IÝˆq•"”'—,’,˜v nÑ5Ô5Ñ6Ô6Ð6Ð6Ð6r"   Ú__main__ry  )r  ):rm   Úmathr^   r  rS   rf  Úior   r   Úreportlab.pdfbase.pdfmetricsr   Úreportlab.lib.rl_accelr   Úreportlab.lib.utilsr   Úreportlab.graphics.renderbaser	   r
   r   r  r   r   r   Ú	reportlabr   r   r   r   Úreportlab.pdfgen.canvasr   r   ÚrenderPMr   Úxml.domr   r…  rƒ  r„  rì   r8  ro  r.  rM  rL  r   r!   r   r(   r;   rK   rQ   rM   r¾   r�   r%   r-   r3  rj   rt   r"   r    ú<module>r?     sI  ðð	€ð %Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø )Ð )Ð )Ð )Ð )Ð )Ø (Ð (Ð (Ð (Ð (Ð (Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VØ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DØ 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø Ð Ð Ð Ð Ð à (Ð (Ð (Ð (Ð (Ð (ð „h€Ø
„h€Ø	„W€ð D÷  Jò  Jñ  Lô  L€Øg×mÒmÑoÔo€ØL×RÒRÑTÔT€Øl×rÒrÑtÔtÐ Ø'×-Ò-Ñ/Ô/Ð ð "+Ô!7ð ð ð ð ð $-Ô#9ð ð ð ð ð  °Ô1Gð Rð Rð Rð Rð
ð 
ð 
ðð ð ð ð>$ð $ð $ð $ð $�Dñ $ô $ð $ðN 	�yØ�IØ�9Ø�yØ�IØ�9ð
€ðHð Hð Hðnð nð nð nð nñ nô nð nð`g0ð g0ð g0ð g0ð g0�8ñ g0ô g0ð g0ðR 7ð  7ð  7ð  7ðD ˆZÒÐØ€D�F„F€F€F€Fð Ðr"   