
    P/Ph8                        d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlmZ d dlZd dlmZmZ d dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	l m!Z! d d
lm"Z" d dl#m$Z$m%Z%  ej&        e'          Z(d Z) e
j*        d          Z+d Z,d Z-d Z.d Z/ G d d          Z0d Z1d Z2ddddZ3d Z4d Z5 G d de          Z6 G d de          Z7eZ8d Z9ej:         G d! d"e                      Z;dS )#    N)BytesIO)Image)cbookfont_manager)_BackendFigureCanvasBaseFigureManagerBaseRendererBase)MixedModeRenderer)rgb2hex)UTC)Path)_path)Affine2DAffine2DBasec                     |                      dd          } |                      dd          } |                      dd          } | S )N&&amp;<&lt;>&gt;replacess    _/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/matplotlib/backends/backend_svg.py_escape_cdatar   E   s@    			#wA			#vA			#vAH    z-(?=-)c                 V    t          |           } t                              d|           S )Nz- )r   _escape_xml_commentsubr   s    r   _escape_commentr#   O   s%    aA""4+++r   c                     |                      dd          } |                      dd          } |                      dd          } |                      dd          } |                      d	d
          } | S )Nr   r   'z&apos;"z&quot;r   r   r   r   r   r   s    r   _escape_attribr'   T   sf    			#wA			#x  A			#x  A			#vA			#vAHr   c                     d| vrdt          |           z   dz   n-d| vrdt          |           z   dz   ndt          |           z   dz   S )Nr&   r%   )r   r'   r   s    r   _quote_escape_attribr)   ]   s\    ,/qLLC-"""S((,/qLLC-"""S((.###c)+r   c                 V    | d                     d                               d          S )z
    Create a short string representation of a float, which is %f
    formatting with trailing zeros and the decimal point removed.
    f0.)rstrip)xs    r   _short_float_fmtr0   c   s(    
 88??3&&s+++r   c                   V    e Zd ZdZd ZddZi fdZd Zd Zdd	Z	d
 Z
di fdZd ZdS )	XMLWriterzM
    Parameters
    ----------
    file : writable text file-like object
    c                     |j         | _        t          |d          r|j        | _        d| _        g | _        g | _        d| _        d S )Nflushr   z@                                                                )write_XMLWriter__writehasattrr4   _XMLWriter__open_XMLWriter__tags_XMLWriter__data_XMLWriter__indentation)selffiles     r   __init__zXMLWriter.__init__r   sI    z4!! 	$DJ%r   Tc                    | j         r4|r|                     d           n|                     d           d| _         | j        rEd                    | j                  }|                     t	          |                     g | _        d S d S )N>
r   r    )r8   r6   r:   joinr   )r<   indentdatas      r   __flushzXMLWriter.__flush{   s    ; 	 "U####S!!!DK; 	774;''DLLt,,---DKKK	 	r   c                    |                                   t          |          }g | _        | j                            |           |                     | j        dt          | j                  dz
                      |                     d|            i ||                                D ]@\  }}|r9t          |          }t          |          }|                     d| d|            Ad| _
        t          | j                  dz
  S )a&  
        Open a new element.  Attributes can be given as keyword
        arguments, or as a string/string dictionary. The method returns
        an opaque identifier that can be passed to the :meth:`close`
        method, to close all open elements up to and including this one.

        Parameters
        ----------
        tag
            Element tag.
        attrib
            Attribute dictionary.  Alternatively, attributes can be given as
            keyword arguments.

        Returns
        -------
        An element identifier.
        N   r    =)_XMLWriter__flushr   r:   r9   appendr6   r;   lenitemsr)   r8   )r<   tagattribextrakvs         r   startzXMLWriter.start   s   & 	C  3T'(=T[)9)9A)=(=>???YYY'v''--// 	* 	*DAq *!!$$(++[[[Q[[)))4;!##r   c                     |                                   |                     | j        dt          | j                                      |                     dt          |           d           dS )z
        Add a comment to the output stream.

        Parameters
        ----------
        comment : str
            Comment text.
        Nz<!-- z -->
)rJ   r6   r;   rL   r9   r#   )r<   comments     r   rU   zXMLWriter.comment   sg     	T'(9T[)9)9(9:;;;=_W55===>>>>>r   c                 :    | j                             |           dS )z
        Add character data to the output stream.

        Parameters
        ----------
        text : str
            Character data.
        N)r:   rK   )r<   texts     r   rD   zXMLWriter.data   s      	4     r   Nc                    |rO| j         sJ d| d            t          |          | j         d         k    sJ d| j         d          d|             n| j         s
J d            | j                                         }| j        r|                     |           n%| j        rd| _        |                     d           d	S |r4|                     | j        d	t          | j                                       |                     d
| d           d	S )a<  
        Close the current element (opened by the most recent call to
        :meth:`start`).

        Parameters
        ----------
        tag
            Element tag.  If given, the tag must match the start tag.  If
            omitted, the current element is closed.
        indent : bool, default: True
        zunbalanced end()zexpected end(z), got zunbalanced end()r   z/>
Nz</r@   )	r9   r   popr:   rJ   r8   r6   r;   rL   )r<   rN   rC   s      r   endzXMLWriter.end   s5     	3;88 8# 8 8 8888 %%R888=B==== 9888 ;22 2222koo; 	LL    [ 	DKLL   F 	@LL+,=S-=-=,=>???]#]]]#####r   c                     t          | j                  |k    r.|                                  t          | j                  |k    ,dS dS )z
        Close open elements, up to (and including) the element identified
        by the given identifier.

        Parameters
        ----------
        id
            Element identifier, as returned by the :meth:`start` method.
        N)rL   r9   r\   )r<   ids     r   closezXMLWriter.close   sI     $+##HHJJJ $+######r   c                 ~     | j         ||fi | |r|                     |           |                     d           dS )z
        Add an entire element.  This is the same as calling :meth:`start`,
        :meth:`data`, and :meth:`end` in sequence. The *text* argument can be
        omitted.
        F)rC   N)rS   rD   r\   )r<   rN   rW   rO   rP   s        r   elementzXMLWriter.element   sQ     	
3((%((( 	IIdOOOr   c                     dS )zFlush the output stream.N r<   s    r   r4   zXMLWriter.flush   s    r   )TNT)__name__
__module____qualname____doc__r>   rJ   rS   rU   rD   r\   r_   ra   r4   rc   r   r   r2   r2   k   s         & & &    !# $ $ $ $B? ? ?	! 	! 	!$ $ $ $:   !%R 	 	 	 	    r   r2   c           
         g }| D ]\  }}|dk    r|dk    s|dk    s|dk    r|dk    s|dk    r|dk    r0|dk    r)t          |t                    r|                                }|                    d	                    |d
                    d |D                                            d
                    |          S )Nscale)rG   )rG   rG   	translate)r   r   rotate)r   matrixz{}({})rH   c              3   4   K   | ]}t          |          V  d S Nr0   ).0r/   s     r   	<genexpr>z&_generate_transform.<locals>.<genexpr>  s+      >>1+A..>>>>>>r   )
isinstancer   	to_valuesrK   formatrB   )transform_listpartstypevalues       r   _generate_transformr{      s    E% A AeGOO$%6//;&&5F??8##8
5, ? ?OO%%EX__#((>>>>>>>@ @ 	A 	A 	A 	A88E??r   c                 d    d                     d |                                 D                       S )Nz; c              3   *   K   | ]\  }}| d | V  dS )z: Nrc   rr   rQ   rR   s      r   rs   z _generate_css.<locals>.<genexpr>
  s0      <<TQ[[Q[[<<<<<<r   )rB   rM   rO   s    r   _generate_cssr   	  s+    99<<V\\^^<<<<<<r   squarebuttround)
projectingr   r   c                 v    t          | t                    s#t          d| dt          |            d          d S )NInvalid type for z metadata. Expected str, not r-   )rt   str	TypeErrorry   )infokeys     r   _check_is_strr     sY    dC   * )C ) )::) ) ) * * 	** *r   c           	          t          j        |           r?| D ]:}t          |t                    s#t	          d| dt          |           d          ;d S t	          d| dt          |            d          )Nr   z) metadata. Expected iterable of str, not r-   z0 metadata. Expected str or iterable of str, not )npiterablert   r   r   ry   )infosr   r   s      r   _check_is_iterable_of_strr     s    	{5 @ 	G 	GDdC(( G !FC !F !F8<T

!F !F !F G G GG	G 	G
  ?C ? ?04U? ? ? @ @ 	@r   c                        e Zd Zd&dd fdZd Zd Zd Zd Zd	 Zd
 Z	d Z
d Zd Zd Zd Zd Zd'dZd Zd Z	 	 d(dZd'dZ	 d'dZ fdZd Zd Zd Zd Zd'dZd Zd Zd'dZd'd Zd)d"Z d# Z!d$ Z"d% Z# xZ$S )*RendererSVGNH   )metadatac                   || _         || _        t          |          | _        || _        |(t          |dd          }t          |t                    sd}|| _        i | _	        t          j                    | _        i | _        i | _        i | _        d| _        i | _        d| _        d| _        t)                                                       t-                      | _        t1          |          }t1          |          }|                    t4                     | j                            d| d| dd| d| d	d
t8          j        d         ddi          | _        |                     |           |                                   d S )NnamerA   r   Fsvgptz0 0 rH   zhttp://www.w3.org/2000/svgz1.1zsvg.idzxmlns:xlinkzhttp://www.w3.org/1999/xlink)widthheightviewBoxxmlnsversionr^   rO   )!r   r   r2   writer	image_dpigetattrrt   r   basename_groupd	itertoolscount_image_counter_clip_path_ids_clipd_markers_path_collection_id_hatchd_has_gouraud_n_gradientssuperr>   dict
_glyph_mapr0   r5   	svgPrologrS   mplrcParams	_start_id_write_metadata_write_default_style)
r<   r   r   	svgwriterr   r   r   
str_height	str_width	__class__s
            r   r>   zRendererSVG.__init__"  s   
	**"y&"55Hh,,  'o// #$ !&&%f--
$U++		"""**""" $$$3933z33.|H%!#AB + D D 	X&&&!!#####r   c                 f    || j         vrt          | j                   | j         |<   | j         |         S )a  
        Returns a stable and unique identifier for the *clippath* argument
        object within the current rendering context.

        This allows plots that include custom clip paths to produce identical
        SVG output on each render, provided that the :rc:`svg.hashsalt` config
        setting and the ``SOURCE_DATE_EPOCH`` build-time environment variable
        are set to fixed values.
        )r   rL   )r<   clippaths     r   _get_clippath_idzRendererSVG._get_clippath_idJ  s8     4...,/0C,D,DD)"8,,r   c                     |                                   |                                  | j                            | j                   | j                                         d S rp   )_write_clips_write_hatchesr   r_   r   r4   rd   s    r   finalizezRendererSVG.finalizeX  sX    $.)))r   c                 	   |i }dddt           j         dd|}| j        d|v r/|d         }t          |d                               d|           |                    d	d           }|Ct          |t                    r|g}nt          |t          j        t          j	        f          r|
                                g}nt          j        |          rg }|D ]}t          |t                    r|                    |           -t          |t          j        t          j	        f          r(|                    |
                                           {t          d
t          |           d          n t          dt          |           d          d                    |          |d	<   nd	|vrt#          j        d          }|rmt          j                            t)          |          t          j        j                  }|                    t0                    
                                |d	<   n3t          j                                        
                                |d	<   d }fd}|                    dd           }|$ ||          }                    dd|i           dD ]a}	|                    |	d           }
|
G ||          }t          |
|	                               d|	                                 |
           bdD ]}	|                    |	d           }|t          |t                    r|g}t9          ||	            ||          }                    d|	                                            |D ]C}                    d                               d|                               d           D                    d|	                                            |                    dd           }|t          |t                    r|g}t9          |d            ||          }                    d                               d           |D ]}                    d|                               d                               d           |                    |           |r%tA          dd                    |          z             d S ) Nzimage/svg+xmlz&http://purl.org/dc/dcmitype/StillImagezMatplotlib vz, https://matplotlib.org/)FormatTypeCreatorTitletitle)rW   DatezQInvalid type for Date metadata. Expected iterable of str, date, or datetime, not r-   z[Invalid type for Date metadata. Expected str, date, datetime, or iterable of the same, not /SOURCE_DATE_EPOCH)tzinfoc                     | | S                      d          }                      ddddd                                d           | S )	Nr   zrdf:RDFz http://purl.org/dc/elements/1.1/zhttp://creativecommons.org/ns#z+http://www.w3.org/1999/02/22-rdf-syntax-ns#)zxmlns:dczxmlns:ccz	xmlns:rdfr   zcc:Work)rS   )midr   s    r   ensure_metadataz4RendererSVG._write_metadata.<locals>.ensure_metadata  sd    
,,z**CLL><J, ,L   
 LL###Jr   r   zdc:typezrdf:resourcer   )	r   Coverager   Descriptionr   
IdentifierLanguageRelationSourcezdc:)r   Contributor	PublisherRightszcc:Agentzdc:titleKeywordsz
dc:subjectzrdf:Bagzrdf:liz.Unknown metadata key(s) passed to SVG writer: ,)!r   __version__r   r   ra   getrt   r   datetimedate	isoformatr   r   rK   r   ry   rB   osgetenvfromtimestampinttimezoneutcr   r   todayr[   lowerr   rS   r\   r_   
ValueError)r<   r   r   r   datesdr   r   urir   r   agentsagentkeywordskeywordr   s                  @r   r   zRendererSVG._write_metadata^  si    H%<IsIII	
 

 
 hW%E%)))NN7N/// ||FD))$$$ CD8#4hm"DEE C))*T"" C 	/ 	/A!!S)) /Q#A(98='IJJ /Q[[]]3333'.#'77. . ./ / /	/   !B48JJ!B !B !B C C C  #xxHV8## 9011D I(66s4yy(BSBWXX#'<<s<#;#;#E#E#G#G  #+#4#:#:#<#<#F#F#H#H 
	 
	 
	 
	 
	 ll64((?!/#&&CNN9nc-BNCCCD 	? 	?C<<T**D%oc**dC(((2SYY[[22>>> E 	, 	,C\\#t,,F~&#&& " %fc222!/#&&CLL,syy{{,,--- ' 'Z(((z666

:&&&&JJ*SYY[[**++++ <<
D11(C(( &$:%h
;;;!/#&&CLL&&&LL#### 7 7xg6666JJy!!!JJ|$$$?LL 	1M XXh//0 1 1 1	1 	1r   c                     | j         }t          ddd          }|                    d           |                    ddd|z             |                    d           d S )	Nr   r   )stroke-linejoinstroke-linecapdefsstyleztext/cssz*{%s})ry   rW   )r   r   rS   ra   r\   )r<   r   default_styles      r   r   z RendererSVG._write_default_style  sq    %&$'& '& ' ' 	VwZg6MNNN

6r   c                    t           j        d         }| t          t          j                              }t          j                    }|                    |                    d                     |                    t          |                              d                     | |	                                d d          S )Nzsvg.hashsaltutf8
   )
r   r   r   uuiduuid4hashlibsha256updateencode	hexdigest)r<   ry   contentsaltms        r   _make_idzRendererSVG._make_id  s    |N+<tz||$$DN	V$$%%%	W$$V,,---,crc*,,,r   c                 ~    |t                                          dd                              d| j                  z   S )NrG   rZ   r   )r   rk   rl   r   )r<   	transforms     r   _make_flip_transformz RendererSVG._make_flip_transform  s3    8::++Ar22<<QLLLLr   c                 ~   |t          |          }|                                }|t          |          }|                                }|                                |||f}| j                            |          }|9|                     d|          }|                                |||f|f| j        |<   n|\  }}|S )z,
        Create a new hatch pattern
        Nh)tupleget_hatch_colorget_hatch_linewidth	get_hatchr   r   r  get_hatch_path)r<   gcrgbFaceedgelwdictkeyoid_s           r   
_get_hatchzRendererSVG._get_hatch  s     GnnG!!##;;D##%%<<>>7D"5lw'';--W--C&(&7&7&9&97D"%Ms$SDL!!FAs
r   c                    t          | j                  sd S d}| j        }|                    d           | j                                        D ]|\  \  }}}}}|                    d|dddt          |          t          |                     |                     |t                                          |                              dd          	                    d	|          d
          }|d}	nt          |          }	|                    dddt          |dz             t          |dz             |	           t          |          t          |          t          |          ddd}
|d         dk     rt          |d                   |
d<   |                    d|t          |
                     |                    d           ~|                    d           d S )Nr   r   patternuserSpaceOnUser,   )r^   patternUnitsr/   yr   r         ?      r   FsimplifynonerectrG   )r/   r  r   r   fillr   miter)r  strokestroke-widthr   r      stroke-opacitypath)r   r   )rL   r   r   rS   valuesr   _convert_pathr   rk   rl   r   ra   r   r\   )r<   
HATCH_SIZEr   r%  facer!  r  r  	path_datar  hatch_styles              r   r   zRendererSVG._write_hatches  s   4<   	F
V-1\-@-@-B-B #	" #	")$T4cLL-C
OO:  ( ( ( **

z""55d#3#3IIa4L4L	 +    I
 |t}}NNC
1$5$5:a<((	     $FOO%foo$'GG&,'. K ay1}}03F1I,-NN#K00    
 JJy!!!!

6r   c                    i }|                                 }|                                Yd|                     ||           d|d<   |9t          |          dk    r&|d         dk    r|st	          |d                   |d<   nn|d	|d<   nft          |dd                   d
k    rt          |          |d<   t          |          dk    r&|d         dk    r|st	          |d                   |d<   |r<|                                dk    r$t	          |                                          |d<   |                                \  }}|Ad	                    d |D                       |d<   t	          t          |                    |d<   |                                }|r|                                }t          |          |d<   |s$|d         dk    rt	          |d                   |d<   |dk    rt	          |          |d<   |                                dk    r|                                |d<   |                                dk    r"t          |                                         |d<   |S )z=Generate a style string from the GraphicsContext and rgbFace.Nurl(#rY   r     r#  r  fill-opacityr  )r   r   r   opacityr   c              3   4   K   | ]}t          |          V  d S rp   rq   )rr   vals     r   rs   z.RendererSVG._get_style_dict.<locals>.<genexpr>G  s<       26 26*- %%26 26 26 26 26 26r   zstroke-dasharrayzstroke-dashoffsetr!  r$  r"  r   r   r   r   )get_forced_alphar
  r  rL   r0   r  r   	get_alpha
get_dashesrB   floatget_linewidthget_rgbget_joinstyleget_capstyle_capstyle_d)	r<   r  r  rO   forced_alphaoffsetseq	linewidthrgbs	            r   _get_style_dictzRendererSVG._get_style_dict-  s   **,,<<>>%DT__R%A%ADDDF6N#G(9(9gajC>O>O( ?P)9'!*)E)E~&!'v!%%22%,W%5%5F6NLLA%%'!**;*; , +<-=gaj-I-IF>* 	ABLLNNc11 0 @ @F9mmoo?), 26 261426 26 26 *6 *6F%&*:5==*I*IF&'$$&&	 
	J**,,C&s||F8 DCFcMM+;CF+C+C'(C)9))D)D~&!!W,,,.,<,<,>,>()  F**+6r7H7H+I'(r   c                 H    t          |                     ||                    S rp   )r   rA  )r<   r  r  s      r   
_get_stylezRendererSVG._get_styleZ  s     T11"g>>???r   c                    |                                 }|                                \  }}|:|                     |          }|                     |          t	          |          f}n$| |j        \  }}}}	| j        ||	z   z
  }||||	f}ni S | j                            |          }
|
4| 	                    d|          }|||f|f| j        |<   n||f| j        |<   n|
\  }}dd| diS )Npz	clip-pathr-  rY   )
get_clip_rectangleget_clip_pathr  r   r   boundsr   r   r   r  )r<   r  cliprectr   clippath_transr  r/   r  wr  clipr  r  s                r   _get_clip_attrszRendererSVG._get_clip_attrs]  s   ((**#%#3#3#5#5 .!66~FFN,,X66N8K8KLGG!!JAq!QQqS!A!QlGGI{w''<--W--C#)1>(BC'HG$$(/~G$$FAs^S^^^,,r   c           
      d   t          | j                  sd S | j        }|                    d           | j                                        D ]\  }}|                    d|           t          |          dk    r5|\  }}|                     ||d          }|                    d|           nU|\  }}}	}
|                    d	t          |          t          |          t          |	          t          |
          
           |                    d           |                    d           d S )Nr   clipPathr^      Fr  r%  r   r  r/   r  r   r   )	rL   r   r   rS   r&  r'  ra   r0   r\   )r<   r   rL  r  r   rJ  r*  r/   r  rK  r  s              r   r   zRendererSVG._write_clipst  sB   4; 	FV++-- 	# 	#ID#LLL,,,4yyA~~+/(. ..nu / > >	v3333!
1a&q))&q))*1--+A..  0 0 0 JJz""""

6r   c                     |r| j                             d|           d S | j                            |d          dz   | j        |<   | j                             d| d| j        |         d           d S )NgrP  r   rG   r  r   )r   rS   r   r   )r<   r   gids      r   
open_groupzRendererSVG.open_group  s     	BKcc*****"l..q!44q8DLOKc&@&@T\!_&@&@&@AAAAAr   c                 :    | j                             d           d S )NrU  )r   r\   )r<   r   s     r   close_groupzRendererSVG.close_group  s    r   c                 (    t           j        d          S )Nzimage.composite_image)r   r   rd   s    r   option_image_nocompositez$RendererSVG.option_image_nocomposite  s    < 7888r   c           
          |rdd| j         | j        f}nd }t          j        |||||dg dd                              d          S )N           )   M   L   Q   C   zFascii)r   r   r   convert_to_stringdecode)r<   r%  r  rL  r  sketchs         r   r'  zRendererSVG._convert_path  s\     	dj$+6DDD&)T8VQ***E3 3396'??	Cr   c           	      2   |                      |          }|d u o|                                d u }|j        o|}|                     |||||                                          }|                                /| j                            dd|                                i            | j        j        dd|i| 	                    |          d| 
                    ||          i |                                | j                            d           d S d S )N)rL  r  rg  a
xlink:hrefr%  r   r   )r%  )r  r  should_simplifyr'  get_sketch_paramsget_urlr   rS   ra   rM  rC  r\   )	r<   r  r%  r  r  trans_and_fliprL  r  r*  s	            r   	draw_pathzRendererSVG.draw_path  s;   229==4?B$5$5$7$74$?'0D&&.th'')) ' + +	 ::<<#KcL"**,,#?@@@ 	@ 	@i 	@43G3G3K3K 	@ 	@"&//"g">">	@ 	@ 	@ 	@::<<#KOOC      $#r   c                 $   t          |j                  sd S | j        }|                     ||t	                                          dd          z   d          }|                     ||          }	|t          |	          f}
| j        	                    |
          }t          d |	
                                D                       }	|c|                     d|
          }|                    d           |                    d|||		           |                    d           || j        |
<    |j        di |                     |           |                                /| j                            dd|                                i           |                     |          }dd| i}dd| j        dz  | j        dz  f}|                    ||d          D ]u\  }}t          |          ra|dd          \  }}t+          |          |d<   t+          |          |d<   |                     ||          |d<   |                    d|           v|                                | j                            d           |                    d
           d S )Nr  r  Fr  c                 D    i | ]\  }}|                     d           ||S )r!  )
startswithr~   s      r   
<dictcomp>z,RendererSVG.draw_markers.<locals>.<dictcomp>  s>     9 9 91!"h!7!79q! 9 9 9r   r   r   r%  )r^   r   r   rU  ri  rj  #r   r   )rL  r  r/   r  r   user   rU  )rL   verticesr   r'  r   rk   rA  r   r   r   rM   r  rS   ra   r\   rM  rm  r  r   r   iter_segmentsr0   rC  )r<   r  marker_pathmarker_transr%  transr  r   r*  r   r  r  rn  rO   rL  rx  coder/   r  s                      r   draw_markerszRendererSVG.draw_markers  s    4=!! 	F&&8::++C666 '  	 $$R11mE223m(( 9 9 9 9 9 : : ;--W--CLL   NN6cYeNDDDJJv%(DM'"55D0044555::<<#KcL"**,,#?@@@22599	C		*1djmT[^4"00TE 1 ; ; 	5 	5NHd8}} 5}1.q11s.q11s"&//"g">">wuV444::<<#KOOC   

3r   c                 T   t          |          dk    rt          |d         j                  nd}|                     |||||          }|d|z  z   dz   |dz   |z  k     }|s-t                                          |||||||||	|
|||          S | j        }g }|                    d           t          |                     |||                    D ]\  }\  }}t          |
                                                              dd          }|                     ||d	          }d
                    | j        ||                     d|                    }|                    d||           |                    |           |                    d           |                     |||||||	|
|||          D ]\  }}}}}|                                }||                    dd|i           |                     |          }|r |j        di | d| t-          |          t-          | j        |z
            |                     ||          d}|                    d|           |r|                    d           ||                    d           | xj        dz  c_        d S )Nr   	   r#     r   r  r  Fr  zC{:x}_{:x}_{}rA   r%  )r^   r   ri  rj  r   rU  rt  )rj  r/   r  r   rv  rG   rw  )rL   rx  _iter_collection_uses_per_pathr   draw_path_collectionr   rS   	enumerate_iter_collection_raw_pathsr   
get_matrixrk   r'  rv   r   r  ra   rK   r\   _iter_collectionrm  rM  r0   r   rC  )!r<   r  master_transformpathsall_transformsoffsetsoffset_trans
facecolors
edgecolors
linewidths
linestylesantialiasedsurlsoffset_positionlen_pathuses_per_pathshould_do_optimizationr   
path_codesir%  r  r   r  xoyopath_idgc0r  url
clip_attrsrO   r   s!                                   r   r  z RendererSVG.draw_path_collection  s    .1ZZ!^^3uQx()));;>7J
D D q=((1,1/MM 	% 	!77//$e^z:Jd	! ! ! 
V$-d.M.M %/9 /9 %: %: 	# 	# A i !5!5!7!788>>sDIII""4U"CCA!(((!T]]2q-A-AC CCNN6cQN///c""""

6-1-B-BJJ
JdO.5 .5 	  	 )BGS' ++--CS,)<===--c22J 0//J///+'mm%b))%dkB&677g66	 F NN5N000  

3

3  A%    r   c                 2   t          j        |d          }|d         dk    rd S | j        }|                    d           t	          d          D ]r}||         \  }}||dz   dz           \  }}	||dz   dz           \  }
}||         }||
k    r|}|}n@|	|k    r|}|	}n5|	|z
  ||
z
  z  }|	||z  z
  }d|z   }|||z  z
  }| |z   ||z
  z  }||z  |z   }|                    d	d
| j        dd|ddt          |          t          |          t          |          t          |                     |                    ddt          t          |          t          |d                   d                     |                    ddt          t          |          dd                     |
                    d	           t|
                    d           dt          |           dt          |           dt          |           dt          |	           dt          |
           dt          |           d}|                    d|t          |          ddd           |                    ddddd d!           |                    d|d"| j        dd#dd$           |                    d|d"| j        dd%d&dd'           |                    d|d"| j        dd(d&dd'           |
                    d           | xj        dz  c_        d S ))Nr   )axisrZ   r   r#  rG   rQ  r  linearGradientGRr/   r  r   r  )r^   gradientUnitsx1y1x2y2stop1)z
stop-colorzstop-opacity)r=  r   r,   zM r   z L rH   z Zr%  
crispEdges)r   r  r/  shape-renderingr   rU  r  zurl(#colorMat))r!  r"  r  filterzurl(#GRz_0))r   r  r  z_1)zurl(#colorAdd))r   r  r  r  z_2))r   averager   rS   ranger   r0   ra   r   r   r\   )r<   transformed_pointscolors	avg_colorr   r  r  r  r  r  x3y3
rgba_colorxbybm1b1m2b2dpaths                       r   _draw_gouraud_trianglez"RendererSVG._draw_gouraud_triangle  s`    JvA...	R=AFVq &	) &	)A'*FB'Q!4FB'Q!4FBJRxxr2g"r'*27^Rx[27^cBh27+"Wr\LL 3)333a333.#B'',<R,@,@#B'',<R,@,@  B B B NN#"))"4"4$4Z^$D$D%F %F G G  H H H NN#7:3F3F47%9 %9 : :  ; ; ; JJ'((((

6E&r** E E-=b-A-A E E'++E E.>r.B.BE E%b))E E,<R,@,@E E E 	#I..$''35 5 	 	6 	6 	6 	"((++7"24 4 	 	5 	5 	5 	>d&7>>>>'35 5 	 	6 	6 	6 	>d&7>>>>.'35 5 	 	6 	6 	6 	>d&7>>>>.'35 5 	 	6 	6 	6 	

3Qr   c                    | j         } |j        di |                     |           |                                }|                     |          }| j        sd| _        |                    dd           |                    dddid	d
dd           |                    d           |                    dd           |                    dddid           |                    d           t          ||          D ].\  }}| 	                    |
                    |          |           /|                    d           d S )NrU  Tr  colorAddrP  feCompositeinSourceGraphicBackgroundImage
arithmeticr  )rO   in2operatork2k3colorMatfeColorMatrixry   rn   z61 0 0 0 0 
0 1 0 0 0 
0 0 1 0 0 
1 1 1 1 0 
0 0 0 0 1 )rO   r&  rw  )r   rS   rM  frozenr  r   ra   r\   zipr  r  )	r<   r  triangles_arraycolors_arrayr  r   rn  pointsr  s	            r   draw_gouraud_trianglesz"RendererSVG.draw_gouraud_triangles  s   55D0044555$$&&	229==  	! $DLL     NNo.%%3        JJx   LL     NN)S  U U U JJx   !/<@@ 	R 	RNFF''(@(@(H(H&QQQQ

3r   c                     dS re   rc   rd   s    r   option_scale_imagezRendererSVG.option_scale_image      tr   c                     | j         dz  S )N      R@)r   rd   s    r   get_image_magnificationz#RendererSVG.get_image_magnification  s    ~$$r   c           
      z   |j         d d         \  }}|dk    s|dk    rd S |                     |          }|r | j        j        d i | |                                }	|	| j                            dd|	i           i }
|                                }t          j        d         rt                      }t          j
        |                              |d	           |p'|                     d
|                                          }dt          j        |                                                              d          z   |
d<   n| j        t%          d          | j         dt'          | j                   d}t*                              d|           t          j
        |                              |           |pd|                     d
|          z   }||
d<   ||
d<   |d|z  | j        z  }d|z  | j        z  }| j                            d
t3          ddd| ffg          t5          |          t5          | j        |z
  |z
             t5          |          t5          |          |
           n|                                }|dk    rt5          |          |
d<   t;                                          d|z  d|z            |z   t;                                          ||                              dd                              d| j                  z   }t3          d|                                 fg          |
d<   d|
d<   | j                            d
t5          |          t5          |          |
           |	| j        !                    d           |r| j        !                    d           d S d S )!NrQ  r   rU  ri  rj  r   zsvg.image_inlinepng)rv   imagezdata:image/png;base64,
rd  zLCannot save image data to filesystem when writing SVG to an in-memory bufferz.imagez.pngz$Writing image file for inclusion: %sIm_r^   r  )rk   )rG   rZ   rl   )r  r/   r  r   r   rO   r  r0  r  r]  rn   r  z5image-rendering:crisp-edges;image-rendering:pixelatedr   )r   r   rO   rw  )"shaperM  r   rS   rm  get_gidr   r   r   r   	fromarraysaver  getvaluebase64	b64encoderf  r   r   nextr   _logr   r   ra   r{   r0   r   r4  r   rk   rl   r  r\   )r<   r  r/   r  imr  r  rK  r  r  rO   r  buffilenamealphaflippeds                   r   
draw_imagezRendererSVG.draw_image  s    x|166Q!VVF))"--
 	1 DK00Z000jjll?Kc<*=>>>jjll<*+ 	,))COB$$S$777?w??C* 0077@@A <   }$  "F G G G-NNtD4G/H/HNNNHII<hGGGOB$$X...Aw!A!AAC#+F< tq4>)Aq4>)AK-&q1"g(>/@ A A"1%%"T[1_q%8#9::&q))2B12E2E       LLNNE||$4U$;$;y! 

  q#'22

1asD!!3,,-  #6GNN,,-.#0 #0F;, 7O K&q))2B12E2E     
 ?KOOC    	!KOOC     	! 	!r   c           	         | j         }|r|                    d           |                                D ]l\  }\  }}|                     |          }|                     t          |dz  |          d          }|                    d||t          dg                     m|                    d           | j	        
                    |           dS dS )	zn
        Emit definitions for not-yet-defined glyphs, and record them as having
        been defined.
        r   @   Fr  r%  )rk   )g      ?)r^   r   r  N)r   rS   rM   _adjust_char_idr'  r   ra   r{   r\   r   r   )r<   glyph_map_newr   char_idrx  codesr*  s          r   _update_glyph_map_defsz"RendererSVG._update_glyph_map_defs  s   
  	2LL   .;.A.A.C.C K K**(E..w77 ..B.. / @ @	w)13G2HII  K K K K JJvO""=11111	2 	2r   c                 .    |                     dd          S )Nz%20r  r   )r<   r  s     r   r  zRendererSVG._adjust_char_id  s    uc***r   c	           	      F   | j         }	|	                    |           | j        }
| j        }t	          |                                          }|                                }i }|dk    r||d<   |                                r|                                n|                                d         }|dk    rt          |          |d<   ||j
        z  }t          |          t          d||ffd| ffd|| ffg          d	}|	                    d
|           |s|                    |          }|                    |||
d          }|\  }}}|                     |           |D ]:\  }}}}|	                    dt          d||ffd|ffg          dd| i           ;n|dk    r|                    |||
d          }n|                    |||
d          }|\  }}}|                     |           |D ]O\  }}}}|                     |          }|	                    dt          d||ffd|ffg          dd| i           P|D ]C\  }}t+          ||          }|                     |d          }|	                    d|           D|	                    d
           d S )N#000000r  r#  rG   r0  rl   rm   rk   r   r  rU  r   T)	glyph_mapreturn_new_glyphs_onlyrv  rj  rt  )r  rO   TeXFr  r%  rR  )r   rU   r   
_text2pathr   r8  get_size_in_pointsr3  r4  r0   
FONT_SCALEr   r{   rS   	_get_fontget_glyphs_with_fontr  ra   get_glyphs_texget_glyphs_mathtextr  r   r'  r\   ) r<   r  r/   r  r   propangleismathmtextr   r  	text2pathcolorfontsizer   r  
font_scalerO   font_glyphs
glyph_infor  rectsglyph_id	xposition	ypositionrk   r  vertsr  r%  r*  s                                    r   _draw_text_as_pathzRendererSVG._draw_text_as_path  sg   qO	O	

%%**,,I!E&M"$"5"5"7"7LRZZ\\!_A::/66E)	 44
"5)),q!f%UF9%:
{34.6 7 7
 
 	S((( '	4&&t,,D44a9T 5 K KG/6,Ju''6669C ; ;5)Y1$y)&<= 5(+3   ).h..9  ; ; ; ;; #22!y 3 O O $77!y 8 O O/6,Ju''6668B : :4Iu..w771$y)&<= 5(+3   )-g--8  : : : : !& 4 4uE5)) ..te.DD	v3333

3r   c	           
        '( | j         }	t          |                                          }
i }i }|
dk    r|
|d<   |                                r|                                n|                                d         }|dk    rt          |          |d<   |si }|                                dk    r|                                |d<   |                                dk    r|                                |d<   t          j	        |
                                         }|d	k    r| |d
<   d ((fd''fd}t          |                                           d|d<   d                    t                               ||                              |d<   |                                dk    r|                                |d<   t!          i ||          |d<   |re|dk    s|                                dk    rF|                                }|                    |                                          \  }}| j        |z
  }t-          j        |          }t-          j        t-          j        |          t-          j        |          g          }t-          j        |||z
  ||z
  g          }|||d         z  z   }|||d         z  z   }dddd}||                                         |d<   t          |          |d<   t          |          |d<   t!          i ||          |d<   t;          d| ||ffg          |d<   nt;          d||ffd| ffg          |d<   |	                    d ||!           d S |	                    |           | j         j!        "                    |d"|          \  }}}}}|	#                    d#t!          i ||          t;          d||ffd| ffg          $           |	#                    d            i }|D ]\  }}} }!}"t          j$        |          }#i }|#j%        dk    r
|#j%        |d<   |#j&        dk    r
|#j&        |d<   |#j'        d	k    r|#j'         |d
<   t          |           d|d<   |#j(        |d<   |#j)        dk    r
|#j)        |d<   t!          i ||          }$| d%k    rd&} |*                    |$g           +                    |!|" | f           |,                                D ]c\  }$}%|%-                                 |%D ]G\  }}}&|	                    d't]          |&          t          |          t          |          |$(           Hd|	/                    d            |D ]Y\  }}}}|	                    d)t          |          t          | dz
            t          |          t          |          *           Z|	/                    d#           d S )+Nr  r  r#  rG   r0  normalz
font-stylezfont-varianti  zfont-weightc                     | dv rdn| S )N)sansz
sans serifz
sans-serifrc   )r   s    r   _normalize_sansz7RendererSVG._draw_text_as_text.<locals>._normalize_sanss  s    '+/E'E'E||4Or   c              3      K    |           } | t           j        v r/t           j                            |           D ]} |          V  | V  d S rp   )fmfont_family_aliasesFontManager_expand_aliases)fnr   r  s     r   _expand_family_entryz<RendererSVG._draw_text_as_text.<locals>._expand_family_entryv  sm      $_R((/// !# > >r B B 4 4-od333333 r   c                 D    fd|                                  D             S )Nc                 j    g | ]/} |          D ]!}|t           j        v r|nt          |          "0S rc   )r  r  repr)rr   entryr   r  s      r   
<listcomp>zQRendererSVG._draw_text_as_text.<locals>._get_all_quoted_names.<locals>.<listcomp>  si     A A A!$8$8$?$?A A  !%(> > >DJJ A A A Ar   )
get_family)r  r  s    r   _get_all_quoted_namesz=RendererSVG._draw_text_as_text.<locals>._get_all_quoted_names  s@    A A A A%)__%6%6A A A Ar   pxz	font-sizez, zfont-familyzfont-stretchr   r   anchorrS   r\   middle)leftrightcenterztext-anchorr/   r  rm   r  rl   rW   r   r   rU  r         tspan)r/   r  r   r  rS  )0r   r   r8  r3  r4  r0   	get_styleget_variantr  weight_dict
get_weightget_sizerB   r   fromkeysget_stretchr   get_rotation_modeget_transformr  get_unitless_positionr   r   deg2radarraysincosdotget_har{   ra   rU   r  mathtext_parserparserS   ttfFontPropertyr   variantweightr   stretch
setdefaultrK   rM   sortchrr\   ))r<   r  r/   r  r   r  r  r   r  r   r  
font_stylecolor_styler  rO   r?  r!  r  axay	angle_raddir_vertv_offsetha_mpl_to_svgr   r   descentglyphsr	  spansr  r  thetextnew_xnew_yr  r   charstr  r  s)                                          @@r   _draw_text_as_textzRendererSVG._draw_text_as_textU  s    

%%
I"'K"$"5"5"7"7LRZZ\\!_A::%5e%<%<K	" I	F ~~8+++/>>+;+;
<(!!X---1-=-=-?-?
>*^DOO$5$56F}}/5K
=)P P P
 
 
 
 
A A A A A *:$--//)J)J&N&N&NJ{#(,		33D99::) )J}% !!X---1-=-=-?-?
>*+,Iz,I[,IJJF7O ,%1**(?(?(A(AX(M(M
 "//11	",,U-H-H-J-JKKB[2%
 Ju--	8RVI%6%6y8I8I$JKK6(a"fB,@AA(Xa[00(Xa[00)05+3!5 !5,9%,,..,I
=).r22s.r22s"/0M:0M0M"N"Nw&9B/0;2 '3 '3{## ': 1a&)y);+ ', ',{# NN61VN44444 NN1 /55aTBB 2E67FE
 LL,-J
-Jk-JKK#6)Aq62&%	284 $5 $5     LL    E9? M M5h*400
;(**/4{J|,=H,,16J~.<3&&38<0AJ}--=h-G-G*K*K*K
;'/4z,=
=)=H,,16J~.%&C&C{&CDDb=="G  ++22EE673KLLLL % % %u

$ % %GAq!NNA*1--*1--# # % % % %% JJv',  #1eV&q))&r!t,,*511+F33      JJsOOOOOr   Fc	           
         |                      |          }	|	r | j        j        di |	 |                                /| j                            dd|                                i           t          j        d         dk    r|                     ||||||||           n|                     ||||||||           |                                | j                            d           |	r| j                            d           d S d S )NrU  ri  rj  zsvg.fonttyper%  rw  )	rM  r   rS   rm  r   r   r  rT  r\   )
r<   r  r/   r  r   r  r  r   r  r  s
             r   	draw_textzRendererSVG.draw_text  s    ))"--
 	1 DK00Z000::<<#KcL"**,,#?@@@<'611##B1aufeLLLL##B1aufeLLL::<<#KOOC    	!KOOC     	! 	!r   c                     dS re   rc   rd   s    r   flipyzRendererSVG.flipy	  r  r   c                     | j         | j        fS rp   )r   r   rd   s    r   get_canvas_width_heightz#RendererSVG.get_canvas_width_height  s    z4;&&r   c                 :    | j                             |||          S rp   )r  get_text_width_height_descent)r<   r   r  r   s       r   r\  z)RendererSVG.get_text_width_height_descent  s    <<QfMMMr   )Nr   rp   )NNNN)FN)%rf   rg   rh   r>   r   r   r   r   r  r  r  r   rA  rC  rM  r   rW  rY  r[  r'  ro  r~  r  r  r  r  r  r  r  r  r  rT  rV  rX  rZ  r\  __classcell__r   s   @r   r   r   !  s       &$!&$ &$ &$ &$ &$ &$ &$P- - -  y1 y1 y1v  - - -M M M  &* * *X+ + +Z@ @ @- - -.  .B B B B  9 9 9 GK!C C C C! ! ! !" GK) ) ) )V8& 8& 8& 8& 8&tf f fP  B  % % %L! L! L! L!\2 2 2&+ + +E E E EN[ [ [ [z! ! ! !.  ' ' 'N N N N N N Nr   r   c                   F     e Zd ZdddZdZddddZd Zd Z fd	Z xZ	S )
FigureCanvasSVGzScalable Vector Graphics)r   svgzr   N)bbox_inches_restorer   c                   t          j        |dd          5 }t          j        |          s t          j        d          |          }| j        j        }d| j        _        | j                                        \  }}|dz  |dz  }	}t          | j        |||t          ||	|||          |          }
| j        
                    |
           |
                                 ddd           dS # 1 swxY w Y   dS )a  
        Parameters
        ----------
        filename : str or path-like or file-like
            Output target; if a string, a file will be opened for writing.

        metadata : dict[str, Any], optional
            Metadata in the SVG file defined as key-value pairs of strings,
            datetimes, or lists of strings, e.g., ``{'Creator': 'My software',
            'Contributor': ['Me', 'My Friend'], 'Title': 'Awesome'}``.

            The standard keys and their value types are:

            * *str*: ``'Coverage'``, ``'Description'``, ``'Format'``,
              ``'Identifier'``, ``'Language'``, ``'Relation'``, ``'Source'``,
              ``'Title'``, and ``'Type'``.
            * *str* or *list of str*: ``'Contributor'``, ``'Creator'``,
              ``'Keywords'``, ``'Publisher'``, and ``'Rights'``.
            * *str*, *date*, *datetime*, or *tuple* of same: ``'Date'``. If a
              non-*str*, then it will be formatted as ISO 8601.

            Values have been predefined for ``'Creator'``, ``'Date'``,
            ``'Format'``, and ``'Type'``. They can be removed by setting them
            to `None`.

            Information is encoded as `Dublin Core Metadata`__.

            .. _DC: https://www.dublincore.org/specifications/dublin-core/

            __ DC_
        rK  zutf-8)encodingr   )r   r   )rb  N)r   open_file_cmfile_requires_unicodecodecs	getwriterfiguredpiget_size_inchesr   r   drawr   )r<   r  rb  r   fhrj  r   r   rK  r  renderers              r   	print_svgzFigureCanvasSVG.print_svg  sG   @ #@@@ 	 B.r22 3.V%g..r22+/C DKO K7799ME62:v{qA(UFCAq"hGGG$79 9 9H KX&&&	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 s   C
C//C36C3c                     t          j        |d          5 }t          j        d|          5 } | j        |fi |cd d d            cd d d            S # 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )NwbrK  )modefileobj)r   re  gzipGzipFilero  )r<   r  kwargsrm  
gzipwriters        r   
print_svgzzFigureCanvasSVG.print_svgzJ  s    400 	8Bmb111	85?!4>*7777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s3   A,AA,A	A,A	A,,A03A0c                     dS )Nr   rc   rd   s    r   get_default_filetypez$FigureCanvasSVG.get_default_filetypeO  s    ur   c                 v    | j                                          t                                                      S rp   )ri  draw_without_renderingr   rl  )r<   r   s    r   rl  zFigureCanvasSVG.drawR  s)    **,,,ww||~~r   )
rf   rg   rh   	filetypes	fixed_dpiro  rx  rz  rl  r]  r^  s   @r   r`  r`    s        235 5I I9= ,  ,  ,  ,  , \8 8 8
          r   r`  z<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
c                        e Zd Zej        ZeZdS )_BackendSVGN)rf   rg   rh   r   r   backend_versionr`  FigureCanvasrc   r   r   r  r  a  s        oO"LLLr   r  )<r  rg  r   rt  r   ior   r   loggingr   rer   numpyr   PILr   
matplotlibr   r   r   r  matplotlib.backend_basesr   r   r	   r
   !matplotlib.backends.backend_mixedr   matplotlib.colorsr   matplotlib.datesr   matplotlib.pathr   r   matplotlib.transformsr   r   	getLoggerrf   r  r   compiler!   r#   r'   r)   r0   r2   r{   r   r;  r   r   r   r`  FigureManagerSVGr   exportr  rc   r   r   <module>r     s                   				 				                0 0 0 0 0 0 0 0B B B B B B B B B B B B ? ? ? ? ? ? % % % % % %                               8 8 8 8 8 8 8 8 w""R   !bj++ , , ,
  + + +, , ,M M M M M M M M`  = = = &vHH* * *@ @ @rN rN rN rN rN, rN rN rNj> > > > >& > > >B % 	 
# # # # #( # # # # #r   