Ë
    ¡ëi6“  ã                   ó¶  — 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­ 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jF                  Z#ejH                  Z$ejJ                  Z%djM                  «       Z'djM                  «       Z(djM                  «       Z)djM                  «       Z*djM                  «       Z+ejX                  fd„Z-ejX                  fd„Z.ddejX                  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«        yy))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                 óT   — t        «       }t        | |fd|i|¤Ž |j                  «       S )z>Returns a SVG as a string in memory, without touching the diskÚshowBoundary)r   Ú
drawToFileÚgetvalue)Údr   ÚkwdsÚss       ú\/var/www/html/chat/reports/venv/lib/python3.12/site-packages/reportlab/graphics/renderSVG.pyÚdrawToStringr    '   s)   € ä‹
€AÜˆq�!Ñ6 ,Ð6°Ò6Ø�:‰:‹<Ðó    c                 ó    — t        | «      } t        | j                  | j                  ffi |¤Ž}t	        | |dd|¬«       |j                  |«       y )Nr   ©r   )r
   Ú	SVGCanvasÚwidthÚheightÚdrawÚsave)r   Úfnr   r   Úcs        r   r   r   -   sC   € Ü˜AÓ€AÜ�1—7‘7˜AŸH™HÐ%Ñ-¨Ñ-€AÜˆˆAˆq�! ,Õ/Ø‡F�Fˆ2…Jr!   c                 óV   — t        «       }|j                  t        | «      ||||¬«       y)zAs it says.r#   N)Ú_SVGRendererr'   r
   )ÚdrawingÚcanvasÚxÚyr   Úrs         r   r'   r'   3   s%   € ä‹€AØ‡F�FÔ˜wÓ'¨°°AÀL€FÕQr!   c                 óx   — g }t        dt        | «      d«      D ]  }|j                  | |   | |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   sH   € ð 	€AÜ�1”S˜“V˜QÓò !ˆØ	�‰�!�A‘$˜˜!˜A™#™�Õ ð!ð €Hr!   c                 óæ   — | j                  |«      }|j                  «       D ]L  \  }}t        |«      }|s|j                  ||«       Œ&|j	                  |«      }|j                  ||xs |«       ŒN |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   ÚtransformNoderJ   E   sv   € ð( ×Ñ Ó'€GØ!Ÿ™Ó)ò <‰ˆ�Ü�T“ˆÙØ× Ñ  ¨%Õ0à×'Ñ'¨Ó.ˆGØ× Ñ  ¨'Ò*:°UÕ;ð<ð €Nr!   c                   ó®   — 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y)Ú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-lec                 óÌ   — t         j                  | «       t        j                  |«      j                  x| _        }|rd|v sd|v r| j                  | j                  |   «       y y )NÚ16Ú32)ÚlistÚ__init__ÚcodecsÚlookupÚnameÚencodingÚwriteÚBOMS)ÚselfrU   Úboms      r   rQ   zEncodedWriter.__init__r   sT   € Ü�‰�dÔÜ#)§=¡=°Ó#:×#?Ñ#?Ð?ˆŒ˜Ù�4˜8Ñ# t¨xÑ'7Ø�J‰J�t—y‘y Ñ*Õ+ð (8r!   c                 ó  — t        |«      r	 |j                  d«      }n"t        |«      st        dt        |«      z  «      ‚| j                  |«       y #  t        j                  «       \  }}}t	        |«      }~~t        d|›d|›�«      ‚xY w)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   Úasciir6   )rX   ÚuÚetÚevÚtbs        r   rV   zEncodedWriter.writex   s‚   € Ü�1Œ:ðXØ—X‘X˜gÓ&‘ô ˜1”ÜÐ^ÔafÐghÓaiÑiÓjÐjØ�‰�A�øðXÜ Ÿ\™\›^‘
��B˜Ü˜“W�Ø˜Ý ÒQRÑSUÐ!VÓWÐWús   �A Á8Bc                 ó2   — dj                  | «      }| d d …= |S )NÚ ©Újoin)rX   r1   s     r   r   zEncodedWriter.getvalue…   s   € Ø�G‰G�D‹MˆØ’ˆGØˆr!   N)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rR   Ú	BOM_UTF32ÚBOM_UTF32_BEÚBOM_UTF32_LEÚ	BOM_UTF16ÚBOM_UTF16_BEÚBOM_UTF16_LErW   rQ   rV   r   © r!   r   rL   rL   d   sU   „ ñð ×!Ñ!Ø×'Ñ'Ø×'Ñ'Ø×!Ñ!Ø×'Ñ'Ø×'Ñ'ñ
€Dó,òór!   rL   Únonzeroznon-zeroÚevenoddzeven-oddc                  ó2   — dj                  d„ | D «       «      S )Nú c              3   ób   K  — | ]'  }d |z  j                  d«      j                  d«      –— Œ) y­w)z%fÚ0ú.N)Úrstrip)Ú.0Úas     r   ú	<genexpr>zpy_fp_str.<locals>.<genexpr>”   s*   è ø€ ÒF¸A�d˜Q‘h×&Ñ& sÓ+×2Ñ2°3×7ÑFùs   ‚-/rg   )Úargss    r   Ú	py_fp_strr€   “   s   € Ø�8‰8ÑFÀÔFÓGÐGr!   c                   óV  — e Zd Zd/d„Zd0d„Zd1d„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d2d„Zd2d„Zd3d„Z	 	 d4d„Z	 	 d5d„Zd„ Zd6d„Zd„ Zd0d„Zd0d„Zd7d„Zd8d„Zd9d „Z d1d!„Z!d"„ Z" e#d¬#«      fd$„Z$d%„ Z%d&„ Z&d'„ Z'd(„ Z(d)„ Z)d*„ Z*d+„ Z+d,„ Z,d-„ Z-d.„ Z.y):r$   r   c                 óœ	  ‡ — |‰ _         t        j                  |«      j                  ‰ _        |‰ _        |j                  dd«      }|j                  di «      ‰ _        |j                  dd«      ‰ _        |j                  dd«      }t        ‰ _
        |x\  ‰ _        ‰ _        ‰ _        g ‰ _        i ‰ _        d‰ _        dx‰ _        x‰ _        x‰ _        x‰ _        x‰ _        x‰ _        ‰ _        |j                  dd«      rt0        ‰ _        nt2        ‰ _        ˆ fd	„‰ _        t7        d
«      }|j9                  ddd«      }	|j;                  dd|	«      ‰ _        ‰ j<                  j>                  ‰ _         tC        tE        |d   «      tE        ‰ j                  «      dd‰ j                  ‰ j                  fz  dd¬«      }
tF        ‰ j                     |
d<   d|
d<   |
jI                  |j                  di «      «       |
jK                  «       D ]!  \  }}‰ j@                  jM                  ||«       Œ# ‰ j<                  jO                  d«      }‰ j<                  jQ                  d«      }|jS                  |«       ‰ j@                  jS                  |«       ‰ j<                  jO                  d«      }‰ j<                  jQ                  d«      }|jS                  |«       ‰ j@                  jS                  |«       ‰ jU                  tV        d   tV        d   «       ‰ jY                  tV        d   «       ‰ j[                  d«       ‰ j]                  d«       ‰ j_                  d«       |s€ta        ‰ j<                  d d!¬"«      }ta        ‰ j<                  d#dd‰ j                  ‰ j                  ¬$«      }|jS                  |«       ‰ j@                  jS                  |«       tC        d%¬&«      }n%tC        d‰ j                  ‰ j                  fz  ¬'«      }ta        ‰ j<                  d(fd)d*‰ j                  z  d+œ|¤Ž‰ _1        |rita        ‰ j<                  d(|d,¬+«      ‰ _2        ‰ jd                  jS                  ‰ jb                  «       ‰ j@                  jS                  ‰ jd                  «       n%‰ j@                  jS                  ‰ jb                  «       ‰ jb                  ‰ _3        y)-aØ  
        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
        ÚuseClipFÚ	fontHacksÚextraXmlDeclrf   ÚscaleGroupIdNÚ
use_fp_strc                  óB   •—  ‰j                   | Ž j                  dd«      S )Nrw   ú,)r   Úreplace)r   rX   s    €r   ú<lambda>z$SVGCanvas.__init__.<locals>.<lambda>¶   s   ø€  [ T§[¡[°$Ð%7×%?Ñ%?ÀÀCÓ%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ÚstrokeColorr3   r   ÚclipPathÚclip)ÚidÚrect)r/   r0   r%   r&   zclip-path: url(#clip))Ústyle)rš   ÚgÚgroupzscale(1,-1) translate(0,-%d))r›   Ú	transformz
scale(1,1))4ÚverboserR   rS   rT   rU   rY   Úpopr„   r…   r   Ú	_fillModer%   r&   ÚsizeÚcoder�   ÚpathÚ_strokeColorÚ
_fillColorÚ
_lineWidthÚ_fontÚ	_fontSizeÚ_lineCapÚ	_lineJoinr   r€   Úcfp_strr   ÚcreateDocumentTypeÚcreateDocumentrA   ÚdocumentElementr�   Údictr>   Ú_fillRuleMapÚupdater=   r?   r<   ÚcreateTextNodeÚappendChildÚsetFontr   ÚsetStrokeColorÚ
setLineCapÚsetLineJoinÚsetLineWidthrJ   Ú	groupTreeÚ	scaleTreeÚ	currGroup)rX   r¤   rU   r¡   rY   r   rƒ   r†   ÚimplementationÚdoctyper“   ÚkÚvr”   Útextr•   r™   ÚclipRectÚgtkws   `                  r   rQ   zSVGCanvas.__init__˜   sø  ø€ ð ˆŒÜŸ™ hÓ/×4Ñ4ˆŒØˆŒØ—(‘(˜9 UÓ+ˆØŸ™ +¨bÓ1ˆŒØ ŸH™H ^°BÓ7ˆÔØ—x‘x ¨rÓ2ˆÜ&ˆŒà.2Ð2ÑˆŒ
�D”K $¤)àˆŒ	ØˆŒ
ØˆŒ	ð "ð	"ˆÔð 	"˜DœOð 	"¨d¬oð 	"ØŒJð	"Øœð	"Ø*.¬-ØŒNØ�8‰8�L Ô'Ü ˆD�Kä#ˆDŒKÛHˆŒä-¨iÓ8ˆð !×3Ñ3°EØ+ØLóNˆð "×0Ñ0°°e¸GÓDˆŒØ—8‘8×+Ñ+ˆŒÜÜ  Q¡›LÜ˜tŸ{™{Ó+Ø(7Ø'¨4¯:©:°t·{±{Ð*CÑCð 7Ø!ô
ˆô !-¨T¯^©^Ñ <ˆ�ÑØ"@ˆ�ÑØ�‰˜Ÿ™ ¨BÓ/Ô0Ø—>‘>Ó#ò 	'‰CˆAˆaØ�H‰H×!Ñ! ! AÕ&ð	'ð —‘×&Ñ& wÓ/ˆØ�x‰x×&Ñ& uÓ-ˆØ×Ñ˜$ÔØ�‰×Ñ˜UÔ#à�x‰x×%Ñ% fÓ-ˆØ�x‰x×&Ñ& uÓ-ˆØ×Ñ˜ÔØ�‰×Ñ˜TÔ"à�‰”^ JÑ/´À
Ñ1KÔLØ×ÑœN¨=Ñ9Ô:Ø�‰˜ÔØ×Ñ˜ÔØ×Ñ˜!Ôáä$ T§X¡X¨z¸fÔEˆHÜ$ T§X¡X¨v¸¸aØ—j‘j¨¯©ô6ˆHà× Ñ  Ô*Ø�H‰H× Ñ  Ô*ÜÐ5Ô6‰Dä˜[¨D¯J©J°t·{±{Ð+CÑCÔDˆDä& t§x¡x°ð ØØ4°t·{±{ÑBñð ñˆŒñ Ü*¨4¯8©8°S¸\ÐUaÔbˆDŒNØ�N‰N×&Ñ& t§~¡~Ô6Ø�H‰H× Ñ  §¡Õ0à�H‰H× Ñ  §¡Ô0ØŸ™ˆ�r!   Nc                 ó˜  — t        | j                  | j                  ¬«      }| j                  j	                  |dd| j                  ¬«       t        |d«      r|}nt        |d| j                  ¬«      }|j                  «       }| j                  }|r|j                  dd|z   «      }|j                  |«       ||ur|j                  «        y y )	N)rY   ú	ú
)Ú	addindentÚnewlrU   rV   Úw)rU   z?>)rL   rU   rY   rA   ÚwritexmlÚhasattrÚopenr   r…   rŠ   rV   Úclose)rX   r)   ÚwriterÚfr�   Úexds         r   r(   zSVGCanvas.save  s¤   € Ü˜tŸ}™}°·±Ô:ˆØ�‰×Ñ˜&¨4°TÀ4Ç=Á=ÐÔQä�2�gÔØ‰Aä�R˜ d§m¡mÔ4ˆAà�o‰oÓˆØ×ÑˆÙØ—+‘+˜d 4¨¡8Ó,ˆCØ	�‰�ŒØ�B‰;Ø�G‰G�Ið r!   c                 ó\   — |xs | j                   }|xs | 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   )rX   r   Úfontr—   s       r   ÚNOTUSED_stringWidthzSVGCanvas.NOTUSED_stringWidth  s/   € ð
 Ò!�t—z‘zˆØÒ-˜tŸ~™~ˆä˜1˜d HÓ-Ð-r!   rf   c                 ó°  — | j                   j                  «       }|j                  |«       t        |j	                  «       «      }|r|D �cg c]	  }||v sŒ|‘Œ }}|r7|j                  «       }|D �cg c]  }||vsŒ|dz   t        ||   «      z   ‘Œ }}n!|D �cg c]  }|dz   t        ||   «      z   ‘Œ }}dj                  |«      dz   S c c}w c c}w c c}w )Nz: z; ú;)r�   Úcopyr´   rP   ÚkeysÚsplitr>   rh   )rX   ÚincludeÚexcluder   r�   rÙ   rÁ   r=   s           r   Ú_formatStylezSVGCanvas._formatStyle   sÉ   € Ø—
‘
—‘Ó!ˆØ�‰�TÔÜ�E—J‘J“LÓ!ˆÙØ#Ö4˜! q¨G¢|’AÐ4ˆDÐ4ÙØ—m‘m“oˆGØ37ÖL¨a¸1ÀGÒ;K�Q�t‘VœC  a¡›MÓ)ÐLˆEÑLà37Ö8¨a�Q�t‘VœC  a¡›MÓ)Ð8ˆEÐ8Ø�y‰y˜Ó #Ñ%Ð%ùò 5ùò Mùâ8s   Á	C	ÁC	Á1	CÁ;CÂCc                 ó   — |S )zKI don't think this was ever needed; seems to have been copied from renderPSrs   )rX   r   s     r   Ú_escapezSVGCanvas._escape-  s   € àˆr!   c                  ó   — y)zXCalculate the path for an arc inscribed in rectangle defined
        by (x1,y1),(x2,y2).N)Úabs)rX   Úx1Úy1Úx2Úy2ÚstartAngÚextentÚxScaleÚyScaler/   r0   ÚcodelineÚarcÚdatas                 r   Ú_genArcCodezSVGCanvas._genArcCode1  s   € ð 	r!   c                 óô   — i }|rt         |   |d<   t        | j                  d| j                  | j	                  |«      ¬«      }|r| j                  ||«      }| j                  j                  |«       d| _        y )Nr’   r¦   ©r   r�   rf   )r³   rJ   rA   r¦   rÝ   Ú	_add_linkr¾   r¶   )rX   r¥   rš   Ú	link_infoÚstylesÚfillModeÚxtrar¦   s           r   Ú_fillAndStrokezSVGCanvas._fillAndStrokeG  sm   € ØˆÙÜ ,¨XÑ 6ˆD�ÑÜ˜TŸX™X vØ�i‰i˜t×0Ñ0°Ó8ôˆñ Ø—>‘> $¨	Ó2ˆDØ�‰×"Ñ" 4Ô(Øˆ�	r!   c                 ób   — ddddœ}| j                   |k7  r|| _         ||   | j                  d<   y y )NÚbuttÚroundÚsquare©r   r   r3   ústroke-linecap)r¬   r�   ©rX   rÂ   Úvalss      r   r¹   zSVGCanvas.setLineCapU  s9   € Ø˜G xÑ0ˆØ�=‰=˜AÒØˆDŒMØ+/°©7ˆD�J‰JÐ'Ò(ð r!   c                 ób   — ddddœ}| j                   |k7  r|| _         ||   | j                  d<   y y )NÚmiterrø   Úbevelrú   rû   )r­   r�   rü   s      r   rº   zSVGCanvas.setLineJoin[  s9   € Ø˜W¨Ñ0ˆØ�>‰>˜QÒØˆDŒNØ+/°©7ˆD�J‰JÐ'Ò(ð r!   c                 ó†  — t        |t        t        f«      r/dj                  t	        t
        ||g«      «      | j                  d<   yt        |t        t        f«      rft        |«      dkD  rW|dk\  sJ d«       ‚dj                  t	        t
        |«      «      | j                  d<   |dkD  rt        |«      | j                  d<   yyyy)z7Two notations. Pass two numbers, or an array and phase.ú, zstroke-dasharrayr   zphase is a length in user spacezstroke-dashoffsetN)
Ú
isinstanceÚfloatÚintrh   Úmapr>   r�   ÚtuplerP   r5   )rX   ÚarrayÚphases      r   ÚsetDashzSVGCanvas.setDasha  s¤   € ô �eœU¤3˜KÔ(Ø-1¯Y©Y´s¼3À%ÈÀÓ7QÓ-RˆD�J‰JÐ)Ò*Ü˜œu¤T˜lÔ+´°E³
¸Q²Ø˜A’:Ð@Ð@Ó@�:Ø-1¯Y©Y´s¼3À³Ó-GˆD�J‰JÐ)Ñ*Ø�QŠwÜ25°e³*�—
‘
Ð.Ò/ð ð 1?Ð+r!   c                 ó@  — || _         |d k(  rd| j                  d<   y |j                  |j                  |j                  }}}d|dz  |dz  |dz  fz  | j                  d<   |j
                  }|dk7  rd|z  | j                  d<   y d| j                  v r| j                  d= y y )NÚnoneÚstrokeúrgb(%d%%,%d%%,%d%%)éd   r   ú%szstroke-opacity)r§   r�   ÚredÚgreenÚblueÚnormalizedAlpha©rX   Úcolorr1   rž   ÚbÚalphas         r   r¸   zSVGCanvas.setStrokeColorl  s¡   € Ø!ˆÔØ�DŠ=Ø#)ˆD�J‰J�xÒ à—i‘i §¡¨e¯j©j�!ˆqˆAØ#8¸A¸c¹EÀ1ÀSÁ5È!ÈCÉ%Ð;PÑ#PˆD�J‰J�xÑ Ø×)Ñ)ˆEØ�aŠxØ/3°e©|�—
‘
Ð+Ò,Ø! T§Z¡ZÑ/Ø—J‘JÐ/Ñ0ð 0r!   c                 ó@  — || _         |d k(  rd| j                  d<   y |j                  |j                  |j                  }}}d|dz  |dz  |dz  fz  | j                  d<   |j
                  }|dk7  rd|z  | j                  d<   y d| j                  v r| j                  d= y y )Nr  Úfillr  r  r   r  zfill-opacity)r¨   r�   r  r  r  r  r  s         r   ÚsetFillColorzSVGCanvas.setFillColory  sž   € ØˆŒØ�DŠ=Ø!'ˆD�J‰J�vÒà—i‘i §¡¨e¯j©j�!ˆqˆAØ!6¸!¸C¹%ÀÀ3ÁÈÈ#ÉÐ9NÑ!NˆD�J‰J�vÑØ×)Ñ)ˆEØ�aŠxØ-1°E©\�—
‘
˜>Ò*Ø 4§:¡:Ñ-Ø—J‘J˜~Ñ.ð .r!   c                 ó>   — || _         t        |   | j                  d<   y )Nr’   )r£   r³   r�   )rX   rÂ   s     r   ÚsetFillModezSVGCanvas.setFillMode†  s   € ØˆŒÜ".¨q¡/ˆ�
‰
�;Òr!   c                 óP   — || j                   k7  r|| _         || j                  d<   y y )Nzstroke-width)r©   r�   )rX   r%   s     r   r»   zSVGCanvas.setLineWidthŠ  s(   € Ø�D—O‘OÒ#Ø#ˆDŒOØ).ˆD�J‰J�~Ò&ð $r!   c                 óÚ  — | j                   |k7  s| j                  |k7  rÍ|| _         || _        | j                  }t        D ]
  }||v sŒ||= Œ || j                  v r| j                  |   ni }t        |t        «      r2|j                  t        |j                  j                  «       «      «       |r+|j                  «       D ]  \  }}d|z   }|t        v sŒ|||<   Œ d|vr||d<   d|z  |d<   y y )Nzfont-zfont-familyz%spxz	font-size)rª   r«   r�   ÚTEXT_STYLESr„   r  r   r´   Úiterr“   r=   )rX   rÔ   r—   r�   rÁ   r“   rÂ   r}   s           r   r·   zSVGCanvas.setFont�  sñ   € Ø�:‰:˜Ò §¡°8Ò!;ØˆDŒJØ%ˆDŒNØ—J‘JˆEÜ ò !�Ø˜’:Ø˜a™ð!ð 04°t·~±~Ñ/E�t—~‘~ dÒ+È2ˆHÜ˜$œxÔ(Ø—‘¤ T§]¡]×%8Ñ%8Ó%:Ó ;Ô<ÙØ#Ÿ>™>Ó+ò %‘C�A�aØ ™	�AØœKÒ'Ø#$˜˜ašð%ð  EÑ)Ø'+��mÑ$Ø!'¨(Ñ!2ˆE�+Òð# "<r!   c                 óz   — t        |t        «      sJ ‚t        | j                  dfi |¤Ž}|j	                  |«       |S )Nr}   )r  r²   rJ   rA   r¶   )rX   Ú
dom_objectrñ   Úlinks       r   rð   zSVGCanvas._add_link£  s:   € Ü˜)¤TÔ*Ð*Ð*Ü˜TŸX™X sÑ8¨iÑ8ˆØ×Ñ˜Ô$Øˆr!   c           
      óX  — | j                   rt        d«       t        ||«      }	t        ||«      }
i }t        | j                  df|	|
t        ||«      |	z
  t        ||«      |
z
  | j                  t        «      dœ|¤Ž}|r| j                  ||«      }| j                  j                  |«       y)z)Draw a rectangle between x1,y1 and x2,y2.z+++ SVGCanvas.rectrœ   )r/   r0   r%   r&   r�   N)r¡   ÚprintÚminrJ   rA   ÚmaxrÝ   ÚAREA_STYLESrð   r¾   r¶   )rX   râ   rã   rä   rå   ÚrxÚryrñ   Ú	_svgAttrsr/   r0   r   rœ   s                r   rœ   zSVGCanvas.rectª  sŸ   € ð �<Š<œÐ3Ô4ä��2‹JˆÜ��2‹JˆØˆÜ˜TŸX™X vð >Ø�1œC  2›J q™L´°R¸³¸A±Ø×#Ñ#¤KÓ0ñ>à3<ñ>ˆñ Ø—>‘> $¨	Ó2ˆDà�‰×"Ñ" 4Õ(r!   c                 óÒ   — t        | j                  df||||z
  ||z
  ||| j                  t        «      dœ|¤Ž}	|r| j	                  |	|«      }	| j
                  j                  |	«       y)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œ   )r/   r0   r%   r&   r*  r+  r�   N©rJ   rA   rÝ   r)  rð   r¾   r¶   )
rX   râ   rã   rä   rå   r*  r+  rñ   r,  rœ   s
             r   Ú	roundRectzSVGCanvas.roundRect»  sm   € ô ˜TŸX™X vð ?Ø�B˜b ™e¨B¨r©E°b¸RØ×#Ñ#¤KÓ0ñ?à4=ñ?ˆñ Ø—>‘> $¨	Ó2ˆDà�‰×"Ñ" 4Õ(r!   c           	      ó  — |dk(  ry t        |«      }| j                  rt        d«       |dk(  xs |dk(  xs |dk(  xs |dk(  }	|dk(  xs |dk(  xs |dk(  xs |dk(  }
| j                  d k7  r|	s| j                  d k7  �r‡|
�rƒ|d	vr}t        || j                  | j                  «      }|d
k(  r||z  }nQ|dk(  r	||dz  z  }nC|dk(  r'|t        |||| j                  | j                  «      z  }nt        dt        |«      z   «      ‚| j                  |«      }| j                  t        «      }|dk7  r|d| j                  |||«      z  z   }|	r|| j                  t        «      z  }n|dz  }|
r|| j                  t         «      z  }n|dz  }t#        | j$                  df|||dd|z  z  dœ|¤Ž}| j$                  j'                  |«      }|j)                  |«       |r| j+                  ||«      }| j,                  j)                  |«       y y y )Né   z+++ SVGCanvas.drawStringr   r3   é   é   r   é   )ÚstartÚ	inheritedÚleftÚ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))r/   r0   r�   r    )r   r¡   r&  r¨   r§   r   rª   r«   ÚnumericXShiftr_   r>   rß   rÝ   r   r   ÚEXTRA_FILL_STYLESÚEXTRA_STROKE_STYLESrJ   rA   rµ   r¶   rð   r¾   )rX   r   r/   r0   Úanglerñ   Útext_anchorÚtextRenderModer,  ÚneedFillÚ
needStrokeÚtextLenÚstrÃ   Úcontents                  r   Ú
drawStringzSVGCanvas.drawStringË  s(  € Ø˜1Ò˜fÜ�Q‹KˆØ�<Š<œÐ9Ô:Ø! 1Ñ$Òc¨¸Ñ(9Òc¸^ÈQÑ=NÒcÐR`ÐbcÑRcˆØ# QÑ&Òe¨.¸!Ñ*;Òe¸~ÈqÑ?PÒeÐTbÐdeÑTeˆ
à�O‰O˜TÒ!¡h°D×4EÑ4EÀtÓ4KÒPZØÐ"@Ñ@Ü% a¨¯
©
°4·>±>ÓB�Ø Ò%Ø˜‘L‘AØ  (Ò*Ø˜ ™‘O‘AØ  )Ò+Øœ {°1°W¸T¿Z¹ZÈÏÉÓWÑW‘Aä$Ð%AÄCÈÓDTÑ%TÓUÐUØ—‘˜Q“ˆAØ×"Ñ"¤;Ó/ˆBØ˜ŠzØ˜¨$¯+©+°e¸QÀÓ*BÑBÑBˆrÙØ�d×'Ñ'Ô(9Ó:Ñ:‘à�mÑ#�ÙØ�d×'Ñ'Ô(;Ó<Ñ<‘à�oÑ%�ô ! §¡¨6ð Ø�q Ø7¸1¸Q¹3Ñ?ñð ñˆDð
 —h‘h×-Ñ-¨aÓ0ˆGØ×Ñ˜WÔ%áØ—~‘~ d¨IÓ6�à�N‰N×&Ñ& tÕ,ðI Q[Ð4Kr!   c                 óf   — | j                   rt        d«        | j                  |||f||||dœ|¤Ž y )Nz+++ SVGCanvas.drawCentredString©r?  rñ   r@  rA  ©r¡   r&  rG  )	rX   r   r/   r0   r?  r@  rñ   rA  r,  s	            r   ÚdrawCentredStringzSVGCanvas.drawCentredStringø  s;   € à�<Š<œÐ@ÔAØˆ�‰˜˜!˜Að 	< E°YÈKØ-ñ	<Ø1:ó	<r!   c                 óf   — | j                   rt        d«        | j                  |||f||||dœ|¤Ž y )Nz+++ SVGCanvas.drawRightStringrI  rJ  )	rX   rÃ   r/   r0   r?  r@  rñ   rA  r,  s	            r   ÚdrawRightStringzSVGCanvas.drawRightStringþ  s;   € à�<Š<œÐ>Ô?Øˆ�‰˜˜Q˜qð 	< u¸	È{Ø-ñ	<Ø1:ó	<r!   c                 ó:   — | j                   j                  |«      }y)zAdd a comment.N)rA   ÚcreateComment)rX   rì   Úcomments      r   rP  zSVGCanvas.comment  s   € ð —(‘(×(Ñ(¨Ó.‰r!   c                 ó@  — t        «       }|j                  |d«       t        t        j                  |j                  «       «      «      }| j                  j                  t        | j                  d||||d|z   d| j                  ddddd|d|z  z   «      z  ¬	«      «       y )
NÚpngÚimagezdata:image/png;base64,ú
matrix(%s)r   r   éÿÿÿÿr3   )r/   r0   r%   r&   Úhrefr    )r   r(   r   Úbase64Ú	b64encoder   r¾   r¶   rJ   rA   r®   )rX   rS  r/   r0   r%   r&   ÚembedÚbufs           r   Ú	drawImagezSVGCanvas.drawImage
  sˆ   € Ü‹iˆØ�
‰
�3�uÔÜ”v×'Ñ'¨¯©«Ó7Ó8ˆØ�‰×"Ñ"Ü˜dŸh™h wØ˜! %¨vØ1°#Ñ5Ø*¨T¯\©\¸!¸A¸aÀÀ1ÀVÈAÈaÉCÁZÓ-PÑPôõ	r!   c                 ó  — | j                   d k7  rp	 t        | j                  dd| j                  ||«      ›d| j                  ||«      ›d�| j                  t        «      ¬«      }| j
                  j                  |«       y y )Nr¦   úM ú L z Zrï   )r§   rJ   rA   rÝ   ÚLINE_STYLESr¾   r¶   r®   )rX   râ   rã   rä   rå   Úliner¦   s          r   r`  zSVGCanvas.line  sl   € Ø×Ñ Ò$Øô
 ! §¡©6Ø#'§<¡<°°2Õ#6°t·|±|ÀBÀrÕ7JÐKØ×'Ñ'¬Ó4ô6ˆDð �N‰N×&Ñ& tÕ,ð %r!   c                 óð   — t        | j                  d||z   dz  ||z   dz  ||z
  dz  ||z
  dz  | j                  t        «      ¬«      }|r| j	                  ||«      }| j
                  j                  |«       y)z{Draw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2.

        These should have x1<x2 and y1<y2.
        Úellipser:  )ÚcxÚcyr*  r+  r�   Nr.  )rX   râ   rã   rä   rå   rñ   rb  s          r   rb  zSVGCanvas.ellipse"  st   € ô
   §¡¨)Ø�2‘�s‰{  2¡ s™{°°2±°s©{ÀÀ2ÁÀs¹{Ø×#Ñ#¤KÓ0ô2ˆñ Ø—n‘n W¨iÓ8ˆGà�‰×"Ñ" 7Õ+r!   c           
      ó¾   — t        | j                  d|||| j                  t        «      ¬«      }|r| j	                  ||«      }| j
                  j                  |«       y )NÚcircle)rc  rd  r1   r�   r.  )rX   ÚxcÚycr1   rñ   rf  s         r   rf  zSVGCanvas.circle0  sP   € Ü˜tŸx™x¨Ø�b˜AØ×#Ñ#¤KÓ0ô2ˆñ Ø—^‘^ F¨IÓ6ˆFà�‰×"Ñ" 6Õ*r!   c
                  ó   — 	 y ©N)r   r¨   r¥   r6   r§   )rX   râ   rã   rä   rå   Úx3Úy3Úx4Úy4Úclosedrê   rì   s               r   Ú	drawCurvezSVGCanvas.drawCurve:  s   € ØØr!   c                 ó  — ||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  «       n) |d |||«       ||
|«      d|dk\  d |||«      fz  «       |r |d |||	«      z  «       t        | j                  d	d
j                  |j                  «      | j                  «       ¬«      }| j                  j                  |«       y)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.
        r:  é´   r]  r^  zA %s %d %d %d %sr   zM %s A %s %d %d %d %s ZzL %s Zr¦   rw   rï   N)ÚcosÚpiÚsinr®   r6   rJ   rA   rh   Ú__self__rÝ   r¾   r¶   )rX   râ   rã   rä   rå   ræ   rç   Ú
fromcenterrc  rd  r*  r+  ÚmxÚmyÚaxÚayr®   r   r¦   s                      r   ÚdrawArczSVGCanvas.drawArcG  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‰IˆÙÚ™W R¨�_©g°b¸"¬oÐ>Ô?áÙÐ Ù�r˜2‹  6¨3¡;°±7¸2¸r³?ÐCñDõ Eñ Ð'Ù�r˜2‹¡¨¨B£°°F¸C±KÀÁGÈBÐPRÃOÐTñUô Vñ Ùˆh™  R›Ñ(Ô)ä˜TŸX™X vØ�h‰h�q—z‘zÓ"¨$×*;Ñ*;Ó*=ô?ˆà�‰×"Ñ" 4Õ(r!   c                 óv  — t        |«      dk\  sJ d«       ‚| j                  d k7  s| j                  d k7  r�dj                  |D �cg c]
  }t	        |Ž ‘Œ c}«      }t        | j                  d|| j                  t        «      ¬«      }|r| j                  ||«      }| j                  j                  |«       y y c c}w )Nr3   z"Polygon must have 2 or more pointsr  Úpolygon©Úpointsr�   )r5   r§   r¨   rh   r   rJ   rA   rÝ   r)  rð   r¾   r¶   )rX   r€  ro  rñ   ÚpÚptsÚpolylines          r   r~  zSVGCanvas.polygoni  s¢   € Ü�6‹{˜aÒÐEÐ!EÓEÐà×Ñ˜dÒ" d§o¡o°tÒ&;Ø—)‘)°Ö8¨AœV QšZÒ8Ó9ˆCÜ$ T§X¡X¨yØ $×"3Ñ"3´KÓ"@ôBˆHñ ØŸ>™>¨(°IÓ>�à�N‰N×&Ñ& xÕ0ð '<ùÚ8s   ÁB6c                  ó   — y rj  )r§   r¥   r6   r   )rX   ÚlineListr  r%   rê   r`  s         r   ÚlineszSVGCanvas.linesx  s   € àr!   c           	      ó4  — t        |«      dk\  sJ d«       ‚| j                  d k7  rodj                  |D �cg c]
  }t        |Ž ‘Œ c}«      }t	        | j
                  d|| j                  t        d ¬«      ¬«      }| j                  j                  |«       y y c c}w )Nr   z#Polyline must have 1 or more pointsr  rƒ  )r  r  )
r5   r§   rh   r   rJ   rA   rÝ   r)  r¾   r¶   )rX   r€  r�  r‚  rƒ  s        r   ÚpolyLinezSVGCanvas.polyLine�  s‡   € Ü�6‹{˜aÒÐFÐ!FÓFÐà×Ñ Ò$Ø—)‘)°Ö8¨AœV QšZÒ8Ó9ˆCÜ$ T§X¡X¨zØ $×"3Ñ"3´KÀTÐ"3Ó"JôLˆHà�N‰N×&Ñ& xÕ0ð	 %ùÚ8s   ´B)r    c                 óØ   — | j                   rt        d«       | j                  }t        | j                  dfi |¤Ž}|j                  |«       || _        | j                   rt        d«       |S )Nz+++ begin SVGCanvas.startGrouprž   z+++ end SVGCanvas.startGroup)r¡   r&  r¾   rJ   rA   r¶   )rX   rD   r¾   rŸ   s       r   Ú
startGroupzSVGCanvas.startGroup‹  sY   € Ø�<Š<œÐ?Ô@Ø—N‘Nˆ	Ü˜dŸh™h¨Ñ8¨xÑ8ˆØ×Ñ˜eÔ$ØˆŒØ�<Š<œÐ=Ô>ØÐr!   c                 óp   — | j                   rt        d«       || _        | j                   rt        d«       y y )Nz+++ begin SVGCanvas.endGroupz+++ end SVGCanvas.endGroup)r¡   r&  r¾   )rX   r¾   s     r   ÚendGroupzSVGCanvas.endGroup”  s)   € Ø�<Š<œÐ=Ô>Ø"ˆŒØ�<Š<œÐ;Õ<ˆ<r!   c           	      ó   — | j                   rt        d||||||«       | j                  j                  d«      }||||||fdk7  r;d| j	                  ||||||«      z  }| j                  j                  d|›d|›�«       y y )Nz!!! begin SVGCanvas.transformr    )r   r   r   r   r   r   rT  rw   )r¡   r&  r¾   r@   r®   r?   )	rX   r}   r  r*   r   ÚerÑ   ÚtrÚts	            r   r    zSVGCanvas.transform™  s‚   € Ø�<Š<œÐ>ÀÀ1ÀaÈÈAÈqÔQØ�^‰^×(Ñ(¨Ó5ˆØˆq�!�Q˜˜1ÐÐ!3Ò3Ø˜tŸ|™|¨A¨a°°!°A°aÓ8Ñ8ˆAØ�N‰N×'Ñ'¨ÂÁAÐ5FÕGð 4r!   c           
      ó®   — ||fdk7  rN| j                   j                  d| j                   j                  d«      ›dd| j                  ||«      z  ›�«       y y )N)r   r   r    rw   ztranslate(%s))r¾   r?   r@   r®   ©rX   r/   r0   s      r   Ú	translatezSVGCanvas.translate   sP   € Øˆaˆ5�EŠ>Ø�N‰N×'Ñ'¨Ø—>‘>×.Ñ.¨{Õ;Ø# d§l¡l°1°QÓ&7Ò7ð69õ :ð r!   c           
      ó´   — ||fdk7  rQ| j                   j                  d| j                  d   j                  d«      ›dd| j	                  ||«      z  ›�«       y y )N)r   r   r    rU  rw   z	scale(%s))r¾   r?   Úgroupsr@   r®   )rX   ÚsxÚsys      r   ÚscalezSVGCanvas.scale¦  sU   € Øˆrˆ7�eÒØ�N‰N×'Ñ'¨Ø—{‘{ 2‘×3Ñ3°KÕ@Ø# d§l¡l°2°rÓ&:Ò:ð6<õ =ð r!   c                 óR   — | j                   d| j                  ||«      z  z   | _         y )NzM %s ©r¦   r   r’  s      r   ÚmoveTozSVGCanvas.moveTo­  ó"   € Ø—I‘I ¨$¯+©+°a¸Ó*;Ñ ;Ñ;ˆ�	r!   c                 óR   — | j                   d| j                  ||«      z  z   | _         y )NzL %s rš  r’  s      r   ÚlineTozSVGCanvas.lineTo°  rœ  r!   c           
      óZ   — | j                   d| j                  ||||||«      z  z   | _         y )NzC %s rš  )rX   râ   rã   rä   rå   rk  rl  s          r   ÚcurveTozSVGCanvas.curveTo³  s*   € Ø—I‘I ¨$¯+©+°b¸"¸bÀ"ÀbÈ"Ó*MÑ MÑMˆ�	r!   c                 ó,   — | j                   dz   | _         y )NzZ )r¦   ©rX   s    r   Ú	closePathzSVGCanvas.closePath¶  s   € Ø—I‘I Ñ$ˆ�	r!   c                  ó   — y rj  rs   r¢  s    r   Ú	saveStatezSVGCanvas.saveState¹  ó   € Ør!   c                  ó   — y rj  rs   r¢  s    r   ÚrestoreStatezSVGCanvas.restoreState¼  r¦  r!   ))é,  r©  r[   r   Frj  )NN)é   rª  N)r   Nr7  r   )r   r9  Nr   )r   r8  Nr   )T)r   )r   ih  r   )r   N)/ri   rj   rk   rQ   r(   rÕ   rÝ   rß   rí   r)  rõ   r¹   rº   r
  r¸   r  r  r»   r·   rð   rœ   r/  rG  rK  rM  rP  r[  r`  rb  rf  rp  r|  r~  r†  rˆ  r²   rŠ  rŒ  r    r“  r˜  r›  rž  r   r£  r¥  r¨  rs   r!   r   r$   r$   —   s  „ ój(óXó$.ð $&¨ró &òòð, )*°TÀÐVZó 
ò3ò3ð  aó 	=ò1ò/ò2ò/ò
3ò(ó)ó")ó +-ðZ ?GØ+,ó<ð ?DØ+,ó<ò/ó
ò
-ó,ó+ó)ó )óD1óPò1ñ "&°Ô!3ó ò=ò
Hò:ò=ò<ò<ò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y)r,   z%This draws onto an SVG document.
    c                 ó   — d| _         y )Nr   )r¡   r¢  s    r   rQ   z_SVGRenderer.__init__Ã  s	   € Øˆ�r!   c                 ó   — | j                   rt        d|z  «       | j                  j                  d|z  «       | j                  j                  j                  «       }t        |t        «      r|j                  s	 t        |«      }| j                  j                  |«       | j                  |i «       | j                  |«       | j                  j                  «       }t        |t        «      r|j                  s	 | j                  j                  d|z  «       |j                  «       D ]8  \  }}|| j                   v sŒt#        | j                  | j                   |   |«       Œ: || j                  _        | j                   rt        d|z  «       yy)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¡   r&  Ú_canvasrP  r�   rØ   r  r   Ú
isClipPathr   Ú_trackerÚpushÚapplyStateChangesÚdrawNodeDispatcherr¢   r=   Ú	_restoresÚsetattr)rX   rC   r�   ÚdeltasÚrDeltasrÁ   rÂ   s          r   ÚdrawNodez_SVGRenderer.drawNodeÆ  s8  € ð �<Š<œÐDÀtÑKÔLà�‰×Ñ˜_¨TÑ1Ô2Ø—‘×"Ñ"×'Ñ'Ó)ˆÜ˜4¤Ô&¨4¯?ª?Øô ˜tÓ$ˆØ�‰×Ñ˜6Ô"Ø×Ñ˜v rÔ*ð 	×Ñ Ô%à—-‘-×#Ñ#Ó%ˆÜ˜4¤Ô&¨4¯?ª?ØØ�‰×Ñ˜]¨4Ñ/Ô0ð —M‘M“Oò 	:‰DˆAˆqØ�D—N‘NÒ"Ü˜Ÿ™ T§^¡^°AÑ%6°qÕ9ð	:ð #ˆ�‰Ôà�<Š<œÐBÀTÑIÕJˆ<r!   r§   r©   r¬   r­   r¨   rª   r«   )r˜   ÚstrokeWidthÚstrokeLineCapÚstrokeLineJoinÚ	fillColorr–   r—   c                 óX   — t        |dd«      xs d}t        |dd«      xs d}|r||ddœS y )NÚhrefURLrf   Ú	hrefTitleÚ_top)z
xlink:hrefzxlink:titleÚtarget)Úgetattr)rX   ÚobjÚurlr”   s       r   Ú_get_link_info_dictz _SVGRenderer._get_link_info_dictê  sA   € ô �c˜9 bÓ)Ò/¨RˆÜ˜˜[¨"Ó-Ò3°ˆÙð "%°EÀFÑKÐKð$ r!   c                 óæ  — | j                   rt        d«       | j                  j                  «       }| j                  j                  «       d   \  }}}}}}|j                  «       D ]6  }	t        |	t        «      r|	j                  «       }
n|	}
| j                  |
«       Œ8 | j                  j                  ||||||«       | j                  j                  |«       | j                   rt        d«       y y )Nz ### begin _SVGRenderer.drawGroupr    z### end _SVGRenderer.drawGroup)r¡   r&  r®  rŠ  r°  ÚgetStateÚgetContentsr  r   ÚprovideNoder¸  r    rŒ  )rX   rŸ   r¾   r}   r  r*   r   rŽ  rÑ   Ú	childNodeÚnode2s              r   Ú	drawGroupz_SVGRenderer.drawGroup	  sÉ   € Ø�<Š<œÐAÔBà—L‘L×+Ñ+Ó-ˆ	ØŸ=™=×1Ñ1Ó3°KÑ@Ñˆˆ1ˆa��A�qØ×*Ñ*Ó,ò 	!ˆIÜ˜)¤XÔ.Ø!×-Ñ-Ó/‘à!�Ø�M‰M˜%Õ ð	!ð 	�‰×Ñ˜q ! Q¨¨1¨aÔ0Ø�‰×Ñ˜iÔ(à�<Š<œÐ?Õ@ˆ<r!   c                 óB  — | j                  |«      }t        |di «      }|j                  |j                  cxk(  rdk(  rhn ne | j                  j
                  |j                  |j                  |j                  |j                  z   |j                  |j                  z   fd|i|¤Ž y  | j                  j                  |j                  |j                  |j                  |j                  z   |j                  |j                  z   |j                  |j                  fd|i|¤Ž y )Nr,  r   rñ   )rÅ  rÂ  r*  r+  r®  rœ   r/   r0   r%   r&   r/  )rX   rœ   rñ   r“   s       r   ÚdrawRectz_SVGRenderer.drawRect  së   € Ø×,Ñ,¨TÓ2ˆ	Ü˜4 ¨BÓ/ˆØ�7‰7�d—g‘gÔ" Õ"àˆD�L‰L×ÑØ—F‘F˜DŸF™FØ—F‘F˜4Ÿ:™:Ñ% t§v¡v¨d¯k©kÑ'9ñ\àENð\àRZó\ð #ˆD�L‰L×"Ñ"Ø—F‘F˜DŸF™FØ—F‘F˜4Ÿ:™:Ñ% t§v¡v¨d¯k©kÑ'9Ø—G‘G˜TŸW™Wñ5ð (ð	5ð ,4ó	5r!   c           
      ó   — | j                   j                  «       }|d   |j                  |j                  |j                  f\  }}}} | j
                  j                  |||f| j                  |«      |t        |dd«      dœt        |di «      ¤Ž y )NÚ
textAnchorrA  r   )rñ   r@  rA  r,  )	r°  rÇ  r/   r0   rÃ   r®  rG  rÅ  rÂ  )rX   Ú	stringObjÚSr@  r/   r0   rÃ   s          r   rG  z_SVGRenderer.drawString*  sˆ   € Ø�M‰M×"Ñ"Ó$ˆØ"# L¡/°9·;±;À	ÇÁÈYÏ^É^Ð"[Ñˆ�Q˜˜4Øˆ�‰×Ñ  Q qð 	9°4×3KÑ3KÈIÓ3VØ'¼À	ÐJZÐ[\Ó8]ñ	9ä˜i¨°BÓ7ó	9r!   c                 ó¾   — | j                   j                  rG| j                   j                  |j                  |j                  |j
                  |j                  «       y y rj  )r®  r§   r`  râ   rã   rä   rå   )rX   r`  s     r   ÚdrawLinez_SVGRenderer.drawLine1  s<   € Ø�<‰<×$Ò$Ø�L‰L×Ñ˜dŸg™g t§w¡w°·±¸¿¹ÕAð %r!   c                 óœ   — | j                   j                  |j                  |j                  |j                  | j                  |«      ¬«       y ©N)rñ   )r®  rf  rc  rd  r1   rÅ  )rX   rf  s     r   Ú
drawCirclez_SVGRenderer.drawCircle5  s5   € Ø�‰×Ñ˜VŸY™Y¨¯	©	°6·8±8Àt×G_ÑG_Ð`fÓGgÐÕhr!   c           	      ó  — |j                  «       \  }}}|dk(  s|€¨|dk(  s|€¡|j                  s•|j                  |j                  |j                  |j
                  |j                  f\  }}}}}	|j                  xs |j                  }||z
  ||z
  }}
||z   ||z   }}|	|z
  }| j                  j                  |
|||||d¬«       y |j                  «       }t        |t        «      r| j                  |«       y | j                  |«       y )Nr   r   )rw  )Ú
_xtraRadiiÚannularÚcenterxÚcenteryÚradiusÚstartangledegreesÚendangledegreesÚyradiusr®  r|  Ú	asPolygonr  r   ÚdrawPathÚdrawPolygon)rX   Úwedgerà  Úradius1Úyradius1rÛ  rÜ  rÝ  rÞ  rß  râ   rã   rä   rå   rç   r8   s                   r   Ú	drawWedgez_SVGRenderer.drawWedge8  s   € Ø%*×%5Ñ%5Ó%7Ñ"ˆ�˜(Ø�QŠJ˜'˜/°¸!²¸xÐ?OÐY^×YfÒYfà�]‰]˜EŸM™M¨5¯<©<¸×9PÑ9PÐRW×RgÑRgÐgñ IˆG�W˜fÐ&7¸à—m‘mÒ3 u§|¡|ˆGØ ™¨°©�ˆRØ ™¨°©�ˆRØ$Ð'8Ñ8ˆFØ�L‰L× Ñ   R¨¨RÐ1BÀFÐWXÐ ÕYà—‘Ó!ˆAÜ˜!œDÔ!Ø—‘˜aÕ à× Ñ  Õ#r!   c                 óŽ   — | j                   j                  r/| j                   j                  t        |j                  «      «       y y rj  )r®  r§   rˆ  r:   r€  ©rX   r�  s     r   ÚdrawPolyLinez_SVGRenderer.drawPolyLineI  s/   € Ø�<‰<×$Ò$Ø�L‰L×!Ñ!¤/°!·(±(Ó";Õ<ð %r!   c           	      ó*  — |j                   |j                  z
  }|j                   |j                  z   }|j                  |j                  z
  }|j                  |j                  z   }| j                  j                  ||||| j                  |«      ¬«       y rÖ  )rc  r*  rd  r+  r®  rb  rÅ  )rX   rb  râ   rä   rã   rå   s         r   ÚdrawEllipsez_SVGRenderer.drawEllipseM  sr   € à�Z‰Z˜'Ÿ*™*Ñ$ˆØ�Z‰Z˜'Ÿ*™*Ñ$ˆØ�Z‰Z˜'Ÿ*™*Ñ$ˆØ�Z‰Z˜'Ÿ*™*Ñ$ˆØ�‰×Ñ˜R  2 b°D×4LÑ4LÈWÓ4UÐÕVr!   c                 ó„   — | j                   j                  t        |j                  «      d| j	                  |«      ¬«       y )Nr   )ro  rñ   )r®  r~  r:   r€  rÅ  ré  s     r   rã  z_SVGRenderer.drawPolygonU  s0   € Ø�‰×Ñœ_¨Q¯X©XÓ6¸qÈD×LdÑLdÐefÓLgÐÕhr!   c                 óÌ  ‡‡	‡
— ddl mŠ	 | j                  }|j                  |j                  |j
                  |j                  fŠ
|€t        ‰dt        «      }| j                  ‰«      }t        ‰dd«      }ˆ	ˆ
ˆfd„}|dk(  r' |«        |j                  g ‰j                  ||¬«       y |d	k(  r) |d
¬«       |j                  g ‰j                  ||¬«       y  |«       }|sQ|j                  }|j                  d «       	 d }|j                  g ‰j                  ||¬«       |j                  |«       y |j                  g ‰j                  ||¬«       y # |j                  |«       w xY w)Nr   )Ú_renderPathró   Ú	autocloserf   c                  ó   •—  ‰‰‰fi | ¤ŽS rj  rs   )r   rï  Ú	drawFuncsr¦   s    €€€r   ÚrPz!_SVGRenderer.drawPath.<locals>.rPa  s   ø€ Ù˜t YÑ7°$Ñ7Ð7r!   r�   )rš   rñ   ró   ÚpdfT)Ú
forceClose)Úreportlab.graphics.shapesrï  r®  r›  rž  r   r£  rÂ  r   rÅ  rõ   r¯  r¨   r  )rX   r¦   ró   r*   rñ   rð  ró  ÚisClosedÚofcrï  rò  s    `       @@r   râ  z_SVGRenderer.drawPathX  s6  ú€ å9Ø�L‰LˆØ—X‘X˜qŸx™x¨¯©°A·K±KÐ@ˆ	ØÐÜ˜t J¬}Ó=ˆHØ×,Ñ,¨TÓ2ˆ	Ü˜D ¨RÓ0ˆ	ö	8à�eÒÙŒDØ×Ñ˜R d§o¡oÀÐU]ÐÕ^Ø˜ÒÙ˜$ÕØ×Ñ˜R d§o¡oÀÐU]ÐÕ^á“tˆHÙØ—l‘l�Ø—‘˜tÔ$ð(Ø $�IØ×$Ñ$ R¨d¯o©oÈÐ]eÐ$Ôfà—N‘N 3Õ'à× Ñ  ¨$¯/©/ÀYÐYaÐ Õbøð —N‘N 3Õ'ús   Ã=!E ÅE#c                 óœ  — |j                   }t        |t        «      r<|rt        j                   j	                  |«      sy t        «       j                  |«      }nt        |d«      r|}ny |j                  \  }}|j                  |j                  }}|€|}|€|}| j                  j                  ||j                  |j                  ||d¬«       y )NÚconvertT)rY  )r¦   r  r>   ÚosÚisfiler   rÎ   rÍ   r¤   r%   r&   r®  r[  r/   r0   )rX   rS  r¦   ÚimÚsrcWÚsrcHÚdstWÚdstHs           r   r[  z_SVGRenderer.drawImagev  s¤   € Ø�z‰zˆÜ�dœ3ÔÙœRŸW™WŸ^™^¨DÔ1°FÜ“×!Ñ! $Ó'‰BÜ�T˜)Ô$Ø‰BàØ—W‘W‰
ˆˆdØ—[‘[ %§,¡,ˆdˆØˆ< ˜Øˆ< ˜Ø�‰×Ñ˜r 5§7¡7¨E¯G©G°T¸4ÀtÐÕLr!   c                 óÄ  — |j                  «       D �]Ì  \  }}|dk(  rŒ|dk(  r| j                  j                  |«       Œ.|dk(  r| j                  j                  |«       ŒO|dk(  r| j                  j	                  |«       Œp|dk(  r| j                  j                  |«       Œ‘|dk(  r…|rgt        |t        t        f«      r2t        |«      dk(  r$t        |d   t        t        f«      r|d	   }|d   }nd	}| j                  j                  ||«       Œÿ| j                  j                  «        �Œ|d
k(  r| j                  j                  |«       �Œ=|dv rj|j                  d| j                  j                  «      }|j                  d| j                  j                  «      }| j                  j                  ||«       �Œ«|dk(  s�Œ²| j                  j!                  |«       �ŒÏ y)z\This takes a set of states, and outputs the operators
        needed to set those propertiesr    r˜   r¹  rº  r»  ÚstrokeDashArrayr3   r   r   r¼  )r—   r–   r–   r—   ró   N)r=   r®  r¸   r»   r¹   rº   r  rP   r  r5   r
  r  Úgetrª   r«   r·   r  )rX   ÚdeltaÚnewStateÚkeyÚvaluer	  ÚfontnameÚfontsizes           r   r²  z_SVGRenderer.applyStateChanges…  sŒ  € ð  Ÿ+™+›-ó 	0‰JˆC�Ø�kÒ!Øà˜Ò%Ø—‘×+Ñ+¨EÕ2Ø˜Ò%Ø—‘×)Ñ)¨%Õ0Ø˜Ò'Ø—‘×'Ñ'¨Õ.ØÐ(Ò(Ø—‘×(Ñ(¨Õ/ØÐ)Ò)ÙÜ! %¬¬e¨Ô5¼#¸e»*Àaº-ÌJÐW\Ð]^ÑW_ÔafÔgkÐ`lÔLmØ % a¡˜Ø % a¡™à !˜Ø—L‘L×(Ñ(¨¨uÕ5à—L‘L×(Ñ(Ö*Ø˜Ò#Ø—‘×)Ñ)¨%Ö0ØÐ0Ñ0Ø Ÿ9™9 Z°·±×1CÑ1CÓD�Ø Ÿ9™9 Z°·±×1GÑ1GÓH�Ø—‘×$Ñ$ X¨xÖ8Ø˜
Ô"Ø—‘×(Ñ(¨Ö/ñ;	0r!   N)ri   rj   rk   rl   rQ   r¸  r´  rÅ  rÌ  rÎ  rG  rÔ  r×  rç  rê  rì  rã  r   râ  r[  r²  rs   r!   r   r,   r,   ¿  s|   „ ñòòKð@  .¸\ÐZdØ!,¸ÐQXØ&ñ(€Iòò>Aò 5ò"9òBòiò$ò"=òWòið '4ó cò<Mó!0r!   r,   c                 óØ  — t         j                  j                  | «      st        j                  | «       ddlm} g }t        |«      D ]>  }|dd dk(  sŒt        ||«      } |«       }t        |dd«      }|j                  ||f«       Œ@ d}|D ]9  \  }}t         j                  j                  | d|z  «      }	t        ||	«       |dz  }Œ; dd	lm}
  |
«       }t        |t         j                  j                  | d
«      «       ddlm} ddlm}  |«       } ||j"                  |j$                  «      }|j'                  |«       t        |t         j                  j                  | d«      «       y )Nr   )Ú
testshapesé
   Ú
getDrawingrl   rf   zrenderSVG_%d.svgr   )ÚgetDrawing01ztest.svg)ÚRL_CorpLogo)ÚDrawingzcorplogo.svg)rû  r¦   ÚisdirÚmkdirÚreportlab.graphicsr  ÚdirrÂ  r6   rh   r   Úreportlab.graphics.testshapesr  Úreportlab.lib.corpr  rö  r  r%   r&   Úadd)ÚoutDirr  ÚdrawingsÚfuncnameÚfuncr-   Ú	docstringr9   r   Úfilenamer  r  r  Úrls                 r   Útestr   ¨  s,  € ô �7‰7�=‰=˜Ô Ü
�‰�Ôå-Ø€Hä˜
“Oò 2ˆØ�A�bˆ>˜\Ó)Ü˜: hÓ/ˆDÙ“fˆGÜ  Y¨rÓ2ˆIØ�O‰O˜W iÐ0Õ1ð2ð 	
€AØ"ò ‰ˆˆIÜ—7‘7—<‘< Ð'9¸AÑ'=Ó>ˆÜ�1�hÔØ	ˆQ‰‰ðõ
 ;Ù‹€AÜˆq”"—'‘'—,‘,˜v jÓ1Ô2å.Ý1á	‹€BÙ�—‘˜Ÿ™Ó#€AØ‡E�Eˆ"„IÜˆq”"—'‘'—,‘,˜v nÓ5Õ6r!   Ú__main__rj  )zout-svg):rl   Úmathr]   rû  rR   rW  Ú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   ru  rs  rt  rÚ   r)  r_  r   r>  r=  r   r    r   r'   r:   rJ   rP   rL   r³   r€   r$   r,   r   ri   rs   r!   r   ú<module>r,     sd  ðð	€÷ %× $Ó $ß  å 4Ý )Ý (ß VÑ Vß DÑ DÜ 'Ý ß <Ñ <ß @Ý å (ð ‡h�h€Ø
‡h�h€Ø	‡W�W€ð D÷  Jñ  Jó  L€Øg×mÑmÓo€ØL×RÑRÓT€Øl×rÑrÓtÐ Ø'×-Ñ-Ó/Ð ð "+×!7Ñ!7ó ð $-×#9Ñ#9ó ð  °×1GÑ1Gó Rò
óô>$�Dô $ðN 	�yØ�IØ�9Ø�yØ�IØ�9ð
€òH÷fñ fôPg0�8ô g0óR 7ðD ˆZÒÙ…Fð r!   