§
    ²[6g—8  ã                   ó–   — d dl Z d dlmZmZ d dlmZ d dlmZ  ej        d¦  «        Z	d„ Z
de j        dz  d	fd
„Z G d„ de¦  «        ZdS )é    N)Ú
exceptionsÚoptional_imports)Úutils)Ú
graph_objsÚnumpyc                 ó¶  — t           du rt          d¦  «        ‚t          t          | ¦  «        dz
  ¦  «        D ]@}| |dz            | |         z
  | d         | d         z
  z
  dk    rt	          j        d¦  «        ‚ŒAt          t          |¦  «        dz
  ¦  «        D ]@}||dz            ||         z
  |d         |d         z
  z
  dk    rt	          j        d¦  «        ‚ŒAdS )	as  
    Streamline-specific validations

    Specifically, this checks that x and y are both evenly spaced,
    and that the package numpy is available.

    See FigureFactory.create_streamline() for params

    :raises: (ImportError) If numpy is not available.
    :raises: (PlotlyError) If x is not evenly spaced.
    :raises: (PlotlyError) If y is not evenly spaced.
    Fz.FigureFactory.create_streamline requires numpyé   r   g-Cëâ6?z.x must be a 1 dimensional, evenly spaced arrayz.y must be a 1 dimensional, evenly spaced arrayN)ÚnpÚImportErrorÚrangeÚlenr   ÚPlotlyError)ÚxÚyÚindexs      ú`/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/plotly/figure_factory/_streamline.pyÚvalidate_streamliner   
   s   € õ 
ˆU€{€{ÝÐJÑKÔKÐKÝ•s˜1‘v”v ‘zÑ"Ô"ð ð ˆØˆu�q‰yŒ\˜A˜eœHÑ$¨¨1¬°°!´©Ñ5¸Ò?Ð?ÝÔ(ØCñô ð ð @õ •s˜1‘v”v ‘zÑ"Ô"ð ð ˆØˆu�q‰yŒ\˜A˜eœHÑ$¨¨1¬°°!´©Ñ5¸Ò?Ð?ÝÔ(ØCñô ð ð @ðð ó    r	   é	   g
×£p=
·?c           	      óÜ  — t          j        | |¦  «         t          j        ||¦  «         t          | |¦  «         t          j        ||¬¦  «         t	          | ||||||¦  «                             ¦   «         \  }}	t	          | ||||||¦  «                             ¦   «         \  }
}t          j        d||
z   |	|z   ddœ|¤Ž}|g}t          j	        d¬¦  «        }t          j
        ||¬¦  «        S )aa	  
    Returns data for a streamline plot.

    :param (list|ndarray) x: 1 dimensional, evenly spaced list or array
    :param (list|ndarray) y: 1 dimensional, evenly spaced list or array
    :param (ndarray) u: 2 dimensional array
    :param (ndarray) v: 2 dimensional array
    :param (float|int) density: controls the density of streamlines in
        plot. This is multiplied by 30 to scale similiarly to other
        available streamline functions such as matplotlib.
        Default = 1
    :param (angle in radians) angle: angle of arrowhead. Default = pi/9
    :param (float in [0,1]) arrow_scale: value to scale length of arrowhead
        Default = .09
    :param kwargs: kwargs passed through plotly.graph_objs.Scatter
        for more information on valid kwargs call
        help(plotly.graph_objs.Scatter)

    :rtype (dict): returns a representation of streamline figure.

    Example 1: Plot simple streamline and increase arrow size

    >>> from plotly.figure_factory import create_streamline
    >>> import plotly.graph_objects as go
    >>> import numpy as np
    >>> import math

    >>> # Add data
    >>> x = np.linspace(-3, 3, 100)
    >>> y = np.linspace(-3, 3, 100)
    >>> Y, X = np.meshgrid(x, y)
    >>> u = -1 - X**2 + Y
    >>> v = 1 + X - Y**2
    >>> u = u.T  # Transpose
    >>> v = v.T  # Transpose

    >>> # Create streamline
    >>> fig = create_streamline(x, y, u, v, arrow_scale=.1)
    >>> fig.show()

    Example 2: from nbviewer.ipython.org/github/barbagroup/AeroPython

    >>> from plotly.figure_factory import create_streamline
    >>> import numpy as np
    >>> import math

    >>> # Add data
    >>> N = 50
    >>> x_start, x_end = -2.0, 2.0
    >>> y_start, y_end = -1.0, 1.0
    >>> x = np.linspace(x_start, x_end, N)
    >>> y = np.linspace(y_start, y_end, N)
    >>> X, Y = np.meshgrid(x, y)
    >>> ss = 5.0
    >>> x_s, y_s = -1.0, 0.0

    >>> # Compute the velocity field on the mesh grid
    >>> u_s = ss/(2*np.pi) * (X-x_s)/((X-x_s)**2 + (Y-y_s)**2)
    >>> v_s = ss/(2*np.pi) * (Y-y_s)/((X-x_s)**2 + (Y-y_s)**2)

    >>> # Create streamline
    >>> fig = create_streamline(x, y, u_s, v_s, density=2, name='streamline')

    >>> # Add source point
    >>> point = go.Scatter(x=[x_s], y=[y_s], mode='markers',
    ...                    marker_size=14, name='source point')

    >>> fig.add_trace(point) # doctest: +SKIP
    >>> fig.show()
    )ÚdensityÚarrow_scaleÚlines)r   r   ÚmodeÚclosest)Ú	hovermode)ÚdataÚlayout© )r   Úvalidate_equal_lengthr   Úvalidate_positive_scalarsÚ_StreamlineÚsum_streamlinesÚget_streamline_arrowsr   ÚScatterÚLayoutÚFigure)r   r   ÚuÚvr   Úangler   ÚkwargsÚstreamline_xÚstreamline_yÚarrow_xÚarrow_yÚ
streamliner   r   s                  r   Úcreate_streamliner1   %   s  € õR 
Ô  1Ñ%Ô%Ð%Ý	Ô  1Ñ%Ô%Ð%Ý˜˜1ÑÔÐÝ	Ô#¨GÀÐMÑMÔMÐMå!,Ø	ˆ1ˆa��G˜U Kñ"ô "ç‚oÑÔñ €L�,õ #Ø	ˆ1ˆa��G˜U Kñô çÒÑÔñ €GˆWõ Ô#ð Ø
˜Ñ
  L°7Ñ$:Àðð ØLRðð €Jð ˆ<€DÝÔ¨Ð3Ñ3Ô3€FåÔ $¨vÐ6Ñ6Ô6Ð6r   c                   óB   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )r"   zB
    Refer to FigureFactory.create_streamline() for docstring
    c                 óL  — t                                |¦  «        | _        t                                |¦  «        | _        t                                |¦  «        | _        t                                |¦  «        | _        || _        || _        t          d|z  ¦  «        | _	        | j        d         | j        d         z
  | _
        | j        d         | j        d         z
  | _        | j        | _        | j        | _        t                                | j	        | j	        f¦  «        | _        t!          | j        ¦  «        t#          | j	        dz
  ¦  «        z  | _        t!          | j        ¦  «        t#          | j	        dz
  ¦  «        z  | _        g | _        | j        | j        d         | j        d         z
  z  | _        | j        | j        d         | j        d         z
  z  | _        t                                | j        dz  | j        dz  z   ¦  «        | _        | xj        t!          | j        ¦  «        z  c_        | xj        t!          | j        ¦  «        z  c_        g | _        g | _        |                      ¦   «          |                      ¦   «         \  }	}
|                      ¦   «         \  }}d S )Né   r	   r   éÿÿÿÿé   )r
   Úarrayr   r   r(   r)   r*   r   Úintr   Údelta_xÚdelta_yÚval_xÚval_yÚzerosÚblankr   ÚfloatÚ	spacing_xÚ	spacing_yÚtrajectoriesÚsqrtÚspeedÚst_xÚst_yÚget_streamlinesr#   r$   )Úselfr   r   r(   r)   r   r*   r   r+   r,   r-   Úarrows_xÚarrows_ys                r   Ú__init__z_Streamline.__init__‰   sü  € Ý—’˜!‘”ˆŒÝ—’˜!‘”ˆŒÝ—’˜!‘”ˆŒÝ—’˜!‘”ˆŒØˆŒ
Ø&ˆÔÝ˜2 ™<Ñ(Ô(ˆŒØ”v˜a”y 4¤6¨!¤9Ñ,ˆŒØ”v˜a”y 4¤6¨!¤9Ñ,ˆŒØ”VˆŒ
Ø”VˆŒ
õ —X’X˜tœ|¨T¬\Ð:Ñ;Ô;ˆŒ
Ý˜TœV™œ¥u¨T¬\¸AÑ-=Ñ'>Ô'>Ñ>ˆŒÝ˜TœV™œ¥u¨T¬\¸AÑ-=Ñ'>Ô'>Ñ>ˆŒØˆÔð ”˜4œ6 "œ:¨¬¨q¬	Ñ1Ñ2ˆŒØ”˜4œ6 "œ:¨¬¨q¬	Ñ1Ñ2ˆŒÝ—W’W˜TœV Q™Y¨¬°©Ñ2Ñ3Ô3ˆŒ
ð 	ˆŒ•#�d”f‘+”+ÑˆŒØˆŒ•#�d”f‘+”+ÑˆŒØˆŒ	ØˆŒ	Ø×ÒÑÔÐØ%)×%9Ò%9Ñ%;Ô%;Ñ"ˆ�lØ!×7Ò7Ñ9Ô9Ñˆ�(�(�(r   c                 ój   — t          || j        z  dz   ¦  «        t          || j        z  dz   ¦  «        fS )zQ
        Set up positions for trajectories to be used with rk4 function.
        ç      à?)r8   r@   rA   )rH   ÚxiÚyis      r   Ú	blank_posz_Streamline.blank_posª   s7   € õ �R˜$œ.Ñ(¨CÑ/Ñ0Ô0µ#°r¸D¼NÑ7JÈcÑ6QÑ2RÔ2RÐSÐSr   c                 ó8  — t          |t          j        ¦  «        r?|                     t          ¦  «        | _        |                     t          ¦  «        | _        n(t	          |¦  «        | _        t	          |¦  «        | _        || j        | j        f         }|| j        | j        dz   f         }|| j        dz   | j        f         }|| j        dz   | j        dz   f         }|| j        z
  }|| j        z
  }	|d|z
  z  ||z  z   }
|d|z
  z  ||z  z   }|
d|	z
  z  ||	z  z   S )zK
        Set up for RK4 function, based on Bokeh's streamline code
        r	   )	Ú
isinstancer
   ÚndarrayÚastyper8   r   r   r;   r<   )rH   ÚarN   rO   Úa00Úa01Úa10Úa11ÚxtÚytÚa0Úa1s               r   Úvalue_atz_Streamline.value_at°   s  € õ �b�"œ*Ñ%Ô%ð 	!Ø—Y’Y�s‘^”^ˆDŒFØ—Y’Y�s‘^”^ˆDŒFˆFå˜R™œˆDŒJÝ˜R™œˆDŒJØ�”
˜DœJÐ&Ô'ˆØ�”
˜DœJ¨™NÐ*Ô+ˆØ�”
˜Q‘ ¤
Ð*Ô+ˆØ�”
˜Q‘ ¤
¨Q¡Ð.Ô/ˆØ�$”*‰_ˆØ�$”*‰_ˆØ�A˜‘F‰^˜c B™hÑ&ˆØ�A˜‘F‰^˜c B™hÑ&ˆØ�Q˜‘V‰}˜r B™wÑ&Ð&r   c                 ó¶  ‡ ‡‡‡— ˆ fd„}ˆ fd„}ˆ fd„Šg Šg Šˆˆ ˆˆfd„} ||||¦  «        \  }}} ||||¦  «        \  }	}
}||	z   }|
ddd…         |dd…         z   }|ddd…         |dd…         z   }t          |¦  «        dk     rdS |dk    r)‰                      ||¦  «        \  }}d‰ j        ||f<   ||fS t          ‰‰¦  «        D ]\  }}d	‰ j        ||f<   ŒdS )
zç
        RK4 forward and back trajectories from the initial conditions.

        Adapted from Bokeh's streamline -uses Runge-Kutta method to fill
        x and y trajectories then checks length of traj (s in units of axes)
        c                 óÆ   •— d‰                      ‰j        | |¦  «        z  }‰                      ‰j        | |¦  «        }‰                      ‰j        | |¦  «        }||z  ||z  fS ©Ng      ð?©r^   rD   r(   r)   ©rN   rO   Údt_dsÚuiÚvirH   s        €r   Úfz$_Streamline.rk4_integrate.<locals>.fÌ   s`   ø€ Ø˜$Ÿ-š-¨¬
°B¸Ñ;Ô;Ñ;ˆEØ—’˜tœv r¨2Ñ.Ô.ˆBØ—’˜tœv r¨2Ñ.Ô.ˆBØ˜‘:˜r E™zÐ)Ð)r   c                 óÊ   •— d‰                      ‰j        | |¦  «        z  }‰                      ‰j        | |¦  «        }‰                      ‰j        | |¦  «        }| |z  | |z  fS ra   rb   rc   s        €r   Úgz$_Streamline.rk4_integrate.<locals>.gÒ   sd   ø€ Ø˜$Ÿ-š-¨¬
°B¸Ñ;Ô;Ñ;ˆEØ—’˜tœv r¨2Ñ.Ô.ˆBØ—’˜tœv r¨2Ñ.Ô.ˆBØ�3˜‘;   e¡Ð+Ð+r   c                 ó˜   •— d| cxk    ot          ‰j        ¦  «        dz
  k     nc o$d|cxk    ot          ‰j        ¦  «        dz
  k     nc S )Nr   r	   )r   r   r   )rN   rO   rH   s     €r   ú<lambda>z+_Streamline.rk4_integrate.<locals>.<lambda>Ø   s]   ø€   RÐ 9Ð 9Ò 9Ð 9­#¨d¬f©+¬+¸©/Ò 9Ð 9Ð 9Ð 9Ð W¸aÀ2Ð>WÐ>WÒ>WÐ>WÍÈDÌFÉÌÐVWÉÒ>WÐ>WÐ>WÐ>W€ r   c                 ó^  •— d}d}| }|}‰                      ||¦  «        \  }}g }	g }
 ‰||¦  «        �rv|	                     |¦  «         |
                     |¦  «         	  |||¦  «        \  }} ||d|z  |z  z   |d|z  |z  z   ¦  «        \  }} ||d|z  |z  z   |d|z  |z  z   ¦  «        \  }} ||||z  z   |||z  z   ¦  «        \  }}n# t          $ r Y nÒw xY w|||d|z  z   d|z  z   |z   z  dz  z  }|||d|z  z   d|z  z   |z   z  dz  z  } ‰||¦  «        sn�||z  }‰                      ||¦  «        \  }}||k    s||k    rO‰j        ||f         dk    r;d‰j        ||f<   ‰                     |¦  «         ‰                     |¦  «         |}|}nn|dk    rn ‰||¦  «        �°v||	|
fS )Ng{®Gáz„?r   rM   r6   g      @r	   )rP   ÚappendÚ
IndexErrorr>   )Úx0Úy0rg   ÚdsÚstotalrN   rO   ÚxbÚybÚxf_trajÚyf_trajÚk1xÚk1yÚk2xÚk2yÚk3xÚk3yÚk4xÚk4yÚnew_xbÚnew_ybÚcheckrH   Ú
xb_changesÚ
yb_changess                        €€€€r   Úrk4z&_Streamline.rk4_integrate.<locals>.rk4Ü   sQ  ø€ ØˆBØˆFØˆBØˆBØ—^’^ B¨Ñ+Ô+‰FˆB�ØˆGØˆGØ�%˜˜B‘-”-ñ Ø—’˜rÑ"Ô"Ð"Ø—’˜rÑ"Ô"Ð"ðØ ˜q  R™yœy‘H�C˜Ø ˜q  c¨B¡h°¡nÑ!4°b¸3À¹8Àc¹>Ñ6IÑJÔJ‘H�C˜Ø ˜q  c¨B¡h°¡nÑ!4°b¸3À¹8Àc¹>Ñ6IÑJÔJ‘H�C˜Ø ˜q  b¨3¡h¡°°R¸#±X±Ñ>Ô>‘H�C˜˜øÝ!ð ð ð Ø�Eðøøøà�b˜C ! c¡'™M¨A°©GÑ3°cÑ9Ñ:¸SÑ@Ñ@�Ø�b˜C ! c¡'™M¨A°©GÑ3°cÑ9Ñ:¸SÑ@Ñ@�Ø�u˜R ‘}”}ð ØØ˜"‘�Ø!%§¢°°BÑ!7Ô!7‘�˜Ø˜R’<�< 6¨R¢< <Ø”z &¨& .Ô1°QÒ6Ð6Ø56˜œ
 6¨6 >Ñ2Ø"×)Ò)¨&Ñ1Ô1Ð1Ø"×)Ò)¨&Ñ1Ô1Ð1Ø#˜Ø#˜˜àØ˜A’:�:Øð5 �%˜˜B‘-”-ñ ð6 ˜7 GÐ+Ð+s   ÁA,C Ã
CÃCNr5   r	   gš™™™™™É?r   )r   rP   r>   Úzip)rH   ro   rp   rg   ri   r„   Úsfru   rv   ÚsbÚxb_trajÚyb_trajrr   Úx_trajÚy_trajÚinitxbÚinitybrs   rt   r�   r‚   rƒ   s   `                  @@@r   Úrk4_integratez_Streamline.rk4_integrateÄ   sr  øøøø€ ð	*ð 	*ð 	*ð 	*ð 	*ð	,ð 	,ð 	,ð 	,ð 	,ð YÐXÐXÐXˆØˆ
Øˆ
ð#	,ð #	,ð #	,ð #	,ð #	,ð #	,ð #	,ð #	,ðJ  #˜s 2 r¨1™~œ~ÑˆˆG�WØ"˜s 2 r¨1™~œ~ÑˆˆG�WØ�b‘ˆØ˜˜˜2˜” ¨¨¨¤Ñ,ˆØ˜˜˜2˜” ¨¨¨¤Ñ,ˆåˆv‰;Œ;˜Š?ˆ?Ø�4Ø�CŠ<ˆ<Ø!Ÿ^š^¨B°Ñ3Ô3‰NˆF�FØ)*ˆDŒJ�v˜v�~Ñ&Ø˜6�>Ð!å˜j¨*Ñ5Ô5ð 'ð '‘��BØ%&�”
˜2˜r˜6Ñ"Ð"Ø�4r   c                 ó   — |dk     s|| j         k    s|dk     s|| j         k    rdS | j        ||f         dk    rD|                      || j        z  || j        z  ¦  «        }|�| j                             |¦  «         dS dS dS )z÷
        Integrate trajectories

        :param (int) xb: results of passing xi through self.blank_pos
        :param (int) xy: results of passing yi through self.blank_pos

        Calculate each trajectory based on rk4 integrate method.
        r   N)r   r>   rŽ   r@   rA   rB   rm   )rH   rs   rt   Úts       r   Útrajz_Streamline.traj  sš   € ð �Š6ˆ6�R˜4œ<Ò'Ð'¨2°ª6¨6°R¸4¼<Ò5GÐ5GØˆFØŒ:�b˜"�fÔ Ò"Ð"Ø×"Ò" 2¨¬Ñ#6¸¸T¼^Ñ8KÑLÔLˆAØˆ}ØÔ!×(Ò(¨Ñ+Ô+Ð+Ð+Ð+ð #Ð"àˆ}r   c                 óž  ‡ — t          ‰ j        dz  ¦  «        D ]™}t          ‰ j        d|z  z
  ¦  «        D ]|}‰                      ||z   |¦  «         ‰                      ||z   ‰ j        dz
  |z
  ¦  «         ‰                      |||z   ¦  «         ‰                      ‰ j        dz
  |z
  ||z   ¦  «         Œ}Œšˆ fd„‰ j        D ¦   «         ‰ _        ˆ fd„‰ j        D ¦   «         ‰ _        t          t          ‰ j        ¦  «        ¦  «        D ]S}‰ j        |                              ¦   «         ‰ j        |<   ‰ j        |                              t          j
        ¦  «         ŒTt          t          ‰ j        ¦  «        ¦  «        D ]S}‰ j        |                              ¦   «         ‰ j        |<   ‰ j        |                              t          j
        ¦  «         ŒTdS )z=
        Get streamlines by building trajectory set.
        r6   r	   c                 ó|   •— g | ]8}t                                |d          ¦  «        ‰j        z  ‰j        d          z   ‘Œ9S )r   )r
   r7   r9   r   ©Ú.0r�   rH   s     €r   ú
<listcomp>z/_Streamline.get_streamlines.<locals>.<listcomp>.  óF   ø€ ð 
ð 
ð 
Ø:;�B�HŠH�Q�q”T‰NŒN˜Tœ\Ñ)¨D¬F°1¬IÑ5ð
ð 
ð 
r   c                 ó|   •— g | ]8}t                                |d          ¦  «        ‰j        z  ‰j        d         z   ‘Œ9S )r	   r   )r
   r7   r:   r   r”   s     €r   r–   z/_Streamline.get_streamlines.<locals>.<listcomp>1  r—   r   N)r   r   r‘   rB   rE   rF   r   Útolistrm   r
   Únan)rH   ÚindentrN   r   s   `   r   rG   z_Streamline.get_streamlines#  sì  ø€ õ ˜DœL¨AÑ-Ñ.Ô.ð 	Bð 	BˆFÝ˜DœL¨1¨v©:Ñ5Ñ6Ô6ð Bð B�Ø—	’	˜"˜v™+ vÑ.Ô.Ð.Ø—	’	˜"˜v™+ t¤|°aÑ'7¸&Ñ'@ÑAÔAÐAØ—	’	˜& " v¡+Ñ.Ô.Ð.Ø—	’	˜$œ,¨Ñ*¨VÑ3°R¸&±[ÑAÔAÐAÐAð	Bð
ð 
ð 
ð 
Ø?CÔ?Pð
ñ 
ô 
ˆŒ	ð
ð 
ð 
ð 
Ø?CÔ?Pð
ñ 
ô 
ˆŒ	õ �3˜tœy™>œ>Ñ*Ô*ð 	,ð 	,ˆEØ#œy¨Ô/×6Ò6Ñ8Ô8ˆDŒI�eÑØŒI�eÔ×#Ò#¥B¤FÑ+Ô+Ð+Ð+å�3˜tœy™>œ>Ñ*Ô*ð 	,ð 	,ˆEØ#œy¨Ô/×6Ò6Ñ8Ô8ˆDŒI�eÑØŒI�eÔ×#Ò#¥B¤FÑ+Ô+Ð+Ð+ð	,ð 	,r   c                 ó 
  — t                                t          | j        ¦  «        ¦  «        }t                                t          | j        ¦  «        ¦  «        }t                                t          | j        ¦  «        ¦  «        }t                                t          | j        ¦  «        ¦  «        }t          t          | j        ¦  «        ¦  «        D �]}| j        |         t          t          | j        |         ¦  «        dz  ¦  «                 ||<   | j        |         t          t          | j        |         ¦  «        dz  ¦  «        dz
           ||<   | j        |         t          t          | j        |         ¦  «        dz  ¦  «                 ||<   | j        |         t          t          | j        |         ¦  «        dz  ¦  «        dz
           ||<   �Œ||z
  }||z
  }t                                ¦   «         }t                                dd¬¦  «         t            	                    ||z  ¦  «        }	t          j        di |¤Ž |	| j
        z   }
|	| j
        z
  }t                                |
¦  «        | j        z  }t                                |
¦  «        | j        z  }t                                |¦  «        | j        z  }t                                |¦  «        | j        z  }t                                t          |¦  «        ¦  «        }t                                t          |¦  «        ¦  «        }t                                t          |¦  «        ¦  «        }t                                t          |¦  «        ¦  «        }t          t          |¦  «        ¦  «        D ]¯}||         dk    rQ||         ||         z
  ||<   ||         ||         z
  ||<   ||         ||         z
  ||<   ||         ||         z
  ||<   Œ_||         ||         z   ||<   ||         ||         z   ||<   ||         ||         z   ||<   ||         ||         z   ||<   Œ°t                                t          |¦  «        ¦  «        }t           j        |dd…<   t                                ||||g¦  «        }|                     d¦  «        }|                     ¦   «         }t                                ||||g¦  «        }|                     d¦  «        }|                     ¦   «         }||fS )	a_  
        Makes an arrow for each streamline.

        Gets angle of streamline at 1/3 mark and creates arrow coordinates
        based off of user defined angle and arrow_scale.

        :param (array) st_x: x-values for all streamlines
        :param (array) st_y: y-values for all streamlines
        :param (angle in radians) angle: angle of arrowhead. Default = pi/9
        :param (float in [0,1]) arrow_scale: value to scale length of arrowhead
            Default = .09
        :rtype (list, list) arrows_x: x-values to create arrowhead and
            arrows_y: y-values to create arrowhead
        é   r	   Úignore)ÚdivideÚinvalidr   NÚFr   )r
   Úemptyr   rE   rF   r   r8   ÚgeterrÚseterrÚarctanr*   Úcosr   Úsinrš   r7   Úflattenr™   )rH   Úarrow_end_xÚarrow_end_yÚarrow_start_xÚarrow_start_yr   Údif_xÚdif_yÚorig_errÚstreamline_angÚang1Úang2Úseg1_xÚseg1_yÚseg2_xÚseg2_yÚpoint1_xÚpoint1_yÚpoint2_xÚpoint2_yÚspacerI   rJ   s                          r   r$   z!_Streamline.get_streamline_arrows=  s/  € õ —h’h¥ D¤I¡¤Ñ0Ô0ˆÝ—h’h¥ D¤I¡¤Ñ0Ô0ˆÝŸš¥# d¤i¡.¤.Ñ2Ô2ˆÝŸš¥# d¤i¡.¤.Ñ2Ô2ˆÝ�3˜tœy™>œ>Ñ*Ô*ð 	ñ 	ˆEØ!%¤¨5Ô!1µ#µc¸$¼)ÀEÔ:JÑ6KÔ6KÈaÑ6OÑ2PÔ2PÔ!QˆK˜ÑØ#'¤9¨UÔ#3Ý•S˜œ 5Ô)Ñ*Ô*¨QÑ.Ñ/Ô/°1Ñ4ô$ˆM˜%Ñ ð "&¤¨5Ô!1µ#µc¸$¼)ÀEÔ:JÑ6KÔ6KÈaÑ6OÑ2PÔ2PÔ!QˆK˜ÑØ#'¤9¨UÔ#3Ý•S˜œ 5Ô)Ñ*Ô*¨QÑ.Ñ/Ô/°1Ñ4ô$ˆM˜%Ñ Ñ ð ˜mÑ+ˆØ˜mÑ+ˆå—9’9‘;”;ˆÝ
�	Š	˜¨8ˆ	Ñ4Ô4Ð4ÝŸš 5¨5¡=Ñ1Ô1ˆÝ
Œ	ÐÐ�HÐÐÐà ¤Ñ,ˆØ ¤Ñ,ˆå—’˜‘” Ô 0Ñ0ˆÝ—’˜‘” Ô 0Ñ0ˆÝ—’˜‘” Ô 0Ñ0ˆÝ—’˜‘” Ô 0Ñ0ˆå—8’8�S ™ZœZÑ)Ô)ˆÝ—8’8�S ™ZœZÑ)Ô)ˆÝ—8’8�S ™ZœZÑ)Ô)ˆÝ—8’8�S ™ZœZÑ)Ô)ˆå�3˜u™:œ:Ñ&Ô&ð 
	Eð 
	EˆEØ�UŒ|˜qÒ Ð Ø"-¨eÔ"4°v¸e´}Ñ"D�˜‘Ø"-¨eÔ"4°v¸e´}Ñ"D�˜‘Ø"-¨eÔ"4°v¸e´}Ñ"D�˜‘Ø"-¨eÔ"4°v¸e´}Ñ"D�˜‘�à"-¨eÔ"4°v¸e´}Ñ"D�˜‘Ø"-¨eÔ"4°v¸e´}Ñ"D�˜‘Ø"-¨eÔ"4°v¸e´}Ñ"D�˜‘Ø"-¨eÔ"4°v¸e´}Ñ"D�˜‘�å—’�#˜h™-œ-Ñ)Ô)ˆÝ”6ˆˆaˆaˆa‰õ —8’8˜X {°H¸eÐDÑEÔEˆØ×#Ò# CÑ(Ô(ˆØ—?’?Ñ$Ô$ˆõ —8’8˜X {°H¸eÐDÑEÔEˆØ×#Ò# CÑ(Ô(ˆØ—?’?Ñ$Ô$ˆà˜Ð!Ð!r   c                 ó^   — t          | j        g ¦  «        }t          | j        g ¦  «        }||fS )a  
        Makes all streamlines readable as a single trace.

        :rtype (list, list): streamline_x: all x values for each streamline
            combined into single list and streamline_y: all y values for each
            streamline combined into single list
        )ÚsumrE   rF   )rH   r,   r-   s      r   r#   z_Streamline.sum_streamlinesŠ  s1   € õ ˜4œ9 bÑ)Ô)ˆÝ˜4œ9 bÑ)Ô)ˆØ˜\Ð)Ð)r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rK   rP   r^   rŽ   r‘   rG   r$   r#   r   r   r   r"   r"   „   s¢   € € € € € ðð ð:ð :ð :ðBTð Tð Tð'ð 'ð 'ð(Lð Lð Lð\,ð ,ð ,ð",ð ,ð ,ð4K"ð K"ð K"ðZ
*ð 
*ð 
*ð 
*ð 
*r   r"   )ÚmathÚplotlyr   r   Úplotly.figure_factoryr   Úplotly.graph_objsr   Ú
get_moduler
   r   Úpir1   Úobjectr"   r   r   r   ú<module>rÉ      sÒ   ðØ €€€à /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø (Ð (Ð (Ð (Ð (Ð (à ÐÔ  Ñ)Ô)€ðð ð ð8  ¤¨1¡¸$ð\7ð \7ð \7ð \7ð~P*ð P*ð P*ð P*ð P*�&ñ P*ô P*ð P*ð P*ð P*r   