
    EVf+                     H   d Z ddlmZ ddlZddlm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ZddlZddl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@                  jC                  d       G d dejD                               Z# ejD                  d       Z$ G d dejJ                        Z% G d dejL                        Z' G d dejP                  jR                        Z*d Z+ejX                   G d de             Z-y# e$ rZ ed      edZ[ww xY w)z7Displays Agg images in the browser, with interactivity.    )contextmanagerN)BytesIO)Pathz$The WebAgg backend requires Tornado.)_Backend)Gcf   )backend_webagg_core)TimerAsyncioTimerTornadoz3.7c                       e Zd Zd Zy)ServerThreadc                 p    t         j                  j                  j                         j	                          y NtornadoioloopIOLoopinstancestartselfs    k/var/www/html/software/conda/envs/catlas/lib/python3.12/site-packages/matplotlib/backends/backend_webagg.pyrunzServerThread.run*   s!    &&(..0    N)__name__
__module____qualname__r    r   r   r   r   (   s    1r   r   c                  n    t         j                  j                  j                         j	                         S r   r   r   r   r   <lambda>r    /   s"    7>>((11399; r   )targetc                   :    e Zd Zej                  Zeddd       Zy)FigureManagerWebAggN)blockc                Z   t         j                          dj                  t         j                  t         j                  t         j
                        }t        j                  d   r$dd l}|j                  |      st        d|        nt        d|        t         j                          y )Nzhttp://{address}:{port}{prefix})addressportprefixzwebagg.open_in_browserr   zTo view figure, visit )WebAggApplication
initializeformatr&   r'   
url_prefixmplrcParams
webbrowseropenprintr   )clsr$   urlr/   s       r   pyplot_showzFigureManagerWebAgg.pyplot_show5   s    $$&/66%--"''$// 7 1
 <<01??3'.se45*3%01!r   )r   r   r   coreNavigationToolbar2WebAgg_toolbar2_classclassmethodr4   r   r   r   r#   r#   2   s"    33O"& " "r   r#   c                       e Zd ZeZy)FigureCanvasWebAggN)r   r   r   r#   manager_classr   r   r   r:   r:   H   s    'Mr   r:   c                       e Zd ZdZdZ G d dej                  j                        Z G d dej                  j                        Z	 G d dej                  j                        Z
 G d d	ej                  j                        Z G d
 dej                  j                        Z G d dej                  j                        Zd fd	Zedd       Zed        Z xZS )r)   Fc                       e Zd Zd Zy)WebAggApplication.FavIconc                     | j                  dd       | j                  t        t        j                         d      j                                y )NContent-Typez	image/pngzimages/matplotlib.png)
set_headerwriter   r-   get_data_path
read_bytesr   s    r   getzWebAggApplication.FavIcon.getQ   s9    OONK8JJtC--/355?Z\Cr   Nr   r   r   rE   r   r   r   FavIconr>   P   s    	Cr   rG   c                   *     e Zd Zdd fd
Zd Z xZS )"WebAggApplication.SingleFigurePage r,   c                6    || _         t        |   ||fi | y r   r,   super__init__r   applicationrequestr,   kwargs	__class__s        r   rO   z+WebAggApplication.SingleFigurePage.__init__W       (DOG['<V<r   c                    t        |      }t        j                  |      }d| j                  j                   | j
                   d}| j                  d| j
                  ||t        j                  j                  |j                         y )Nws:///zsingle_figure.html)r(   ws_urifig_id	toolitemscanvas)intr   get_fig_managerrR   hostr,   renderr5   r6   r[   r\   )r   fignummanagerrY   s       r   rE   z&WebAggApplication.SingleFigurePage.get[   st    [F))&1GT\\..//@BFKK$77AA~~  'r   r   r   r   rO   rE   __classcell__rT   s   @r   SingleFigurePagerI   V   s    ?A 	=	'r   rf   c                   *     e Zd Zdd fd
Zd Z xZS ) WebAggApplication.AllFiguresPagerJ   rK   c                6    || _         t        |   ||fi | y r   rM   rP   s        r   rO   z)WebAggApplication.AllFiguresPage.__init__i   rU   r   c           	      
   d| j                   j                   | j                   d}| j                  d| j                  |t	        t
        j                  j                               t        j                  j                         y )NrW   rX   zall_figures.html)r(   rY   figuresr[   )rR   r_   r,   r`   sortedr   figsitemsr5   r6   r[   )r   rY   s     r   rE   z$WebAggApplication.AllFiguresPage.getm   se    T\\..//@BFKK"sxx~~/077AA  Cr   rc   re   s   @r   AllFiguresPagerh   h   s    ?A 	=	Cr   ro   c                       e Zd Zd Zy)WebAggApplication.MplJsc                     | j                  dd       t        j                  j                         }| j	                  |       y )Nr@   zapplication/javascript)rA   r5   r#   get_javascriptrB   )r   
js_contents     r   rE   zWebAggApplication.MplJs.getw   s1    OON,DE11@@BJJJz"r   NrF   r   r   r   MplJsrq   v   s    	#r   ru   c                       e Zd Zd Zy)WebAggApplication.Downloadc                 D   t        |      }t        j                  |      }| j                  dt        j
                  j                  |d             t               }|j                  j                  j                  ||       | j                  |j                                y )Nr@   binary)r+   )r]   r   r^   rA   	mimetypes	types_maprE   r   r\   figuresavefigrB   getvalue)r   ra   fmtrb   buffs        r   rE   zWebAggApplication.Download.get   sv    [F))&1GOO	 3 3 7 7X FH9DNN!!))$s);JJt}}'r   NrF   r   r   r   Downloadrw   ~   s    	(r   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)WebAggApplication.WebSocketTc                     t        |      | _        t        j                  | j                        | _        | j                  j                  |        t        | d      r| j                  d       y y )Nset_nodelayT)r]   ra   r   r^   rb   add_web_sockethasattrr   )r   ra   s     r   r0   z WebAggApplication.WebSocket.open   sR    f+DK..t{{;DLLL''-t]+  & ,r   c                 :    | j                   j                  |        y r   )rb   remove_web_socketr   s    r   on_closez$WebAggApplication.WebSocket.on_close   s    LL**40r   c                     t        j                  |      }|d   dk(  r|d   | _        y t        j                  | j
                        }||j                  |       y y )Ntypesupports_binaryvalue)jsonloadsr   r   r^   ra   handle_json)r   messagerb   s      r   
on_messagez&WebAggApplication.WebSocket.on_message   s[    jj)G v"33'.w'7$--dkk: &''0 'r   c                 L    | j                  t        j                  |             y r   )write_messager   dumps)r   contents     r   	send_jsonz%WebAggApplication.WebSocket.send_json   s    tzz'23r   c                     | j                   r| j                  |d       y dj                  |j                  d      j	                  dd            }| j                  |       y )NT)ry   zdata:image/png;base64,{}base64
rJ   )r   r   r+   encodereplace)r   blobdata_uris      r   send_binaryz'WebAggApplication.WebSocket.send_binary   sU    ##""4"55<<KK)11$;=""8,r   N)	r   r   r   r   r0   r   r   r   r   r   r   r   	WebSocketr      s     	'	1	1	4	-r   r   c                 R   |r|d   dk(  r|d   dk7  sJ d       t         |   |dz   t        j                  j                  dt
        j                  j                         if|dz   t        j                  j                  dt        t        j                         d      if|d	z   | j                  f|d
z   | j                  d|if|dz   | j                  d|if|dz   | j                  f|dz   | j                  f|dz   | j                   fgt
        j                  j                                y )Nr   rX   z6url_prefix must start with a "/" and not end with one.z/_static/(.*)pathz/_images/(.*)imagesz/favicon.icoz	/([0-9]+)r,   z/?z
/js/mpl.jsz/([0-9]+)/wsz/([0-9]+)/download.([a-z0-9.]+))template_path)rN   rO   r   webStaticFileHandlerr5   r#   get_static_file_pathr   r-   rC   rG   rf   ro   ru   r   r   )r   r,   rT   s     r   rO   zWebAggApplication.__init__   sX   a=C'JrNc,A IHIA 	 ....$22GGIJL
 ....$s002H=>@
 o-t||< l*D,A,A
+- e#T%8%8
+- m+TZZ8 o-t~~> @@ ;@ 22GGIC 	 !	Kr   c                    | j                   ry  | |      }|| _        d }|t        j                  d   | _        n|| _        t        j                  d   | _         || j
                  t        j                  d         D ].  }	 |j                  || j                         || _         d| _         y  t        d      # t        $ r(}|j                  t        j                  k7  r Y d }~hd }~ww xY w)NrK   c              3      K   t        t        d|            D ]	  }| |z     t        |dz
        D ]#  }| t        j                  d|z  d|z        z    % yw)z
            Generate a list of n random ports near the given port.

            The first 5 ports will be sequential, and the remaining n-5 will be
            randomly selected in the range [port-2*n, port+2*n].
                  N)rangeminrandomrandint)r'   nis      r   random_portsz2WebAggApplication.initialize.<locals>.random_ports   s`      3q!9% Qh1q5\ ;V^^BFAE:::;s   AAzwebagg.addresszwebagg.portzwebagg.port_retrieszSThe webagg server could not be started because an available port could not be foundT)initializedr,   r-   r.   r&   r'   listenOSErrorerrno
EADDRINUSE
SystemExit)r2   r,   r'   r&   appr   es          r   r*   zWebAggApplication.initialize   s    ?? Z(#
	; ?,,'78CK!CK<<. !$.C!DF 	+D

4-
   	+ *+ +  77e... /s   B;;	C,C''C,c                     dd l }	 |j                          d _         j                  ry 	 t        j
                  j                  j                          fdt        fd       }d _        t        d       t        j                  j                           |       5  j                          d d d        y # t        $ r Y w xY w# 1 sw Y   y xY w)Nr   Tc                      j                          t        d       t        j                  j	                          d _        y )NzServer is stoppedF)stopr1   sysstdoutflushstarted)r2   r   s   r   shutdownz)WebAggApplication.start.<locals>.shutdown  s,    KKM%&JJCKr   c               3     K   t        j                   t         j                  fd      } 	 d  t        j                   t         j                  |        y # t        j                   t         j                  |        w xY ww)Nc                 &    j                        S r   )add_callback_from_signal)sigframer   r   s     r   r    z?WebAggApplication.start.<locals>.catch_sigint.<locals>.<lambda>%  s    6#B#B8#L r   )signalSIGINT)old_handlerr   r   s    r   catch_sigintz-WebAggApplication.start.<locals>.catch_sigint!  sL      --LNK:fmm[9fmm[9s   )A?A %A?&A<<A?z"Press Ctrl+C to stop WebAgg server)asyncioget_running_loopr   RuntimeErrorr   r   r   r   r   r1   r   r   r   r   )r2   r   r   r   r   s   `  @@r   r   zWebAggApplication.start  s    	$$& CK;;	 &&//1	  
	: 
	: 23

^ 	LLN	 	M  		L	 	s   B< "C<	CCC)rJ   )rJ   NN)r   r   r   r   r   r   r   RequestHandlerrG   rf   ro   ru   r   	websocketWebSocketHandlerr   rO   r8   r*   r   rd   re   s   @r   r)   r)   L   s    KGC'++,, C'7;;55 '$C33 C#** #(7;;-- (%-G%%66 %-N&KP + +Z + +r   r)   c                 J   dd l }t        j                          dd l}	 |j	                          | j                  }t        t        j                  j                         d      j                         }|j                  j!                  |      }|j#                  t        j$                  |t        j&                  j(                  | j*                  t        j,                        j/                  d      S # t
        $ r+ t        j                         st        j                          Y w xY w)Nr   zipython_inline_figure.html)r(   rZ   r[   r\   r'   zutf-8)tornado.templater)   r*   r   r   r   webagg_server_threadis_aliver   numberr   r5   r#   r   	read_texttemplateTemplategenerater,   r6   r[   r\   r'   decode)r|   r   r   ra   tplts         r   ipython_inline_displayr   4  s      ")  "
 ]]F
t''<<>+--6Y[ !!#&A:: ++//99}}##  %
 &,VG_5  )#,,. &&()s   C. .1D"!D"c                       e Zd ZeZeZy)_BackendWebAggN)r   r   r   r:   FigureCanvasr#   FigureManagerr   r   r   r   r   K  s    %L'Mr   r   ).__doc__
contextlibr   r   ior   r   rz   pathlibr   r   r   r   	threadingr   ImportErrorerrr   tornado.webtornado.iolooptornado.websocket
matplotlibr-   matplotlib.backend_basesr   matplotlib._pylab_helpersr   rJ   r	   r5   r
   r   _api
deprecatedThreadr   r   r#   FigureCanvasWebAggCorer:   r   Applicationr)   r   exportr   r   r   r   <module>r      s   = &       
  H     - ) )  U19## 1 1
 (y'';= "$22 ",(44 (e// eP5. 
(X ( (g	  H
=
>CGHs   D D!	DD!