a
    Dfؐ                     @  s  d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZ ddlZddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZ ddl m!Z!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z' ddl(m)Z) ddl*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2 e	r:ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 G dd de+Z9G dd de+Z:dd Z;dd Z<d d! Z=d"d# Z>e'j?@e> e'j?@e= d$d% ZAeeA dS )&zw
HoloViews integration for Panel including a Pane to render HoloViews

objects and their widgets and support for Links
    )annotationsN)defaultdict)partial)TYPE_CHECKINGAnyClassVarMappingOptionalTupleType)Range1dSpacer)Theme)Version)register_reference_transform)bind   )stateunlocked)ColumnHSpacerRow	WidgetBox)
LayoutableViewable)Player   )PaneBaseRerenderErrorpanel)Bokeh
Matplotlib)Plotly)Document)Model)Commc                      s  e Zd ZU dZejdg dddZejdddZej	d	d	d
gddZ
ejdddZejdddZejdeefdddZejdg dddZejeeegdeddZejdddgddZeji ddZdZded< eddfeddfeddfed dfed!dfed"dfed#dfed$dfed!dfed#dfed"dfed$dfd%ZeeedZ d&ed'< ddddddddddd(
Z!d)ed*< g d+Z"d,Z#dl fd-d.	Z$d/d0d1 fd2d3Z%ej&d4ddd5d6d7 Z'e(d8d9 Z)ej&d:d;dd<d=d> Z*ej&d?dd<d@dA Z+ej&dBdd<dCdD Z,ej&dEdFdd<dGdH Z-dIdJ Z.dKdL Z/dMdN Z0dOdP Z1 fdQdRZ2dmdSdTdTdUdVdWdXdYZ3dZd[ Z4d\d] Z5dnd^d0d_ fd`daZ6e7dbdcdddedfZ8dodgdhZ9e:j9je9_e7dpdjdkZ;  Z<S )q	HoloViewsal  
    `HoloViews` panes render any `HoloViews` object using the
    currently selected backend ('bokeh' (default), 'matplotlib' or 'plotly').

    To be able to use the `plotly` backend you must add `plotly` to
    `pn.extension`.

    Reference: https://panel.holoviz.org/reference/panes/HoloViews.html

    :Example:

    >>> HoloViews(some_holoviews_object)
    N)bokeh
matplotlibplotlyzu
        The HoloViews backend used to render the plot (if None defaults
        to the currently selected renderer).)defaultobjectsdocFz$
        Whether to center the plot.)r*   r,   Zpngsvgz4
        The format to render Matplotlib plots with.Tz`
        Whether to link the axes of bokeh plots inside this pane
        across a panel layout.zk
        Explicit renderer instance to use for rendering the HoloViews
        plot. Overrides the backend.z4
        Bokeh theme to apply to the HoloViews plot.)r*   class_Z
allow_Noner,   	right_top)leftbottomrighttoptop_left	top_rightbottom_leftbottom_rightleft_topleft_bottomr/   right_bottomz~
        The layout of the plot and the widgets. The value refers to the
        position of the widgets relative to the plot.z5
        The layout object to display the widgets in.)r+   constantr*   r,   
individualscrubberzb)
        Whether to generate individual widgets for each dimension or
        on global scrubber.zw
        A mapping from dimension name to a widget instance which will
        be used to override the default widgets.皙?ClassVar[float | bool | None]priority)startcenter)endrB   )rB   rA   )rB   rC   rA   )rC   rA   )rA   rC   rC   )r0   r2   r3   r1   r4   r5   r6   r7   r8   r9   r/   r:   z&ClassVar[Mapping[str, Type[PaneBase]]]_panes)
backendrB   linked_axesrendererthemewidgetswidget_layoutwidget_locationwidget_typeformatz"ClassVar[Mapping[str, str | None]]_rename)objectrE   rM   )css_classesmarginnamesizing_modewidthheight	max_widthZ
max_heightc                   s   d _ d  _d  _d  _t j|fi |    _g  _i  _	d _
 fdd| D  _ j j j} j|       d _ d S )NFc                   s.   g | ]&\}}|t jv r| j| jkr|qS  )r   paramr*   .0pvselfrW   a/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/panel/pane/holoviews.py
<listcomp>   s   z&HoloViews.__init__.<locals>.<listcomp>T)_initialized_height_responsive_width_responsive_restore_plotsuper__init__rJ   
widget_box_widget_container_plots_syncing_propsitems
_overridesrX   watch_update_widgets_rerender_params_internal_callbacksappend_update_responsive)r^   rO   paramswatcher	__class__r]   r_   rf      s"    

zHoloViews.__init__zparam.parameterized.EventNone)eventsreturnc                   s<    j r
d S  jdd |D   t j fdd|D   d S )Nc                 s  s   | ]}|j tjv r|V  qd S N)rR   r   rX   rZ   erW   rW   r_   	<genexpr>       z*HoloViews._param_change.<locals>.<genexpr>c                 3  s$   | ]}|j  jd g v r|V  qdS )rP   N)rR   rl   r{   r]   rW   r_   r}      r~   )Z_object_changing_track_overridesre   _param_changer^   rx   ru   r]   r_   r      s    zHoloViews._param_changerE   )rm   Zon_initc                 C  s@   ddl m}m} | jr<| j|jvr<|j| j }td|  d S )Nr   )Store	extensionzholoviews.plotting.)	holoviewsr   r   rE   	renderersZ	_backends
__import__)r^   r   r   extrW   rW   r_   _load_backend   s    zHoloViews._load_backendc                 C  s2   | j r| jrd}n| j rd}n| jr*d}nd }|S )Nstretch_bothstretch_widthZstretch_height)rc   rb   )r^   smoderW   rW   r_   _layout_sizing_mode   s    zHoloViews._layout_sizing_moderB   rK   )rm   c                 C  s@  | j }| jo| j }| j| \}}}|| j_| j| _| j}|sF|rFdn|}t| js|rht	 | t	 g}n| g}|| j
d d < || j
_d S |r| j| fn| | jf}	d|i}
|s| j|u rt|	}n||	i |
g}nT|tu rt	 ||	i |
t	 g}n2|dr| jt	 | t	 g}nt	 | t	 | jg}|| j
d d < || j
_d S )Nr   rS   r0   )rK   rB   rc   _alignmentsrg   alignrh   r   lenr   layoutrS   default_layoutlistr   
startswith)r^   locrB   r   r   Zwidget_firstr   layout_smode
componentsrk   kwargsrW   rW   r_   _update_layout   s6    


zHoloViews._update_layoutrH   c                 G  s6   | j d u rd S | j D ]\}}|jr| j |j_ qd S rz   )rH   _modelsvaluesdocument)r^   rx   model_rW   rW   r_   _update_theme   s
    
zHoloViews._update_themerO   c                 C  s0  ddl m}m} ddlm} | j}t||rd|jv rT|joB|j	 }|joP|j
 }nHd|jv r|j}|rd|v pvd|v }d|v pd|v }qd	 }}nd	 }}|| _|| _d S t||r|jn|}|d u s|jsd S | jp|j}| jp|j| }	|jjd
|dj}
|	|}|dkr$d	 | _| _n|dkrp|
dd }|
dd }|
dd }|o\| | _|oj| | _nd|jv r|
d}|rd|v pd|v | _d|v pd|v | _nd	| _d	| _nh|
dd }|
dd }|
dd }|
dd }|
dd }|o| o| | _|o(| o(| | _d S )Nr   )HoloMapr   Plot
responsiverS   _widthZ_bothZ_heightFplot)rE   r(   r)   rT   rU   frame_widthframe_height)r   r   r   Zholoviews.plottingr   rO   
isinstancerX   r   rT   rU   rS   rc   rb   lastr   rE   current_backendrG   optsgetr   Zplotting_class)r^   r   r   r   objZwresponsiveZhresponsivemoderE   rG   r   Zplot_clsr   rT   rU   r   r   rW   rW   r_   rr      s\    







zHoloViews._update_responsiverL   rI   c                 G  s   | j d u rg g  }}n(t| jdd}| | j | j| j|\}}|| _t| jD ],}|j	| j
jv rN|j	j| | j| qN|D ] }|j| jd}| j| q|| j
d d < |r| j
| jvs|s| j
| jv s| js|   d S )NZ
_directionverticalvalue)rO   getattrrJ   widgets_from_dimensionsrI   rL   _valuesr   rp   instrg   r+   rX   Zunwatchremoverm   _widget_callbackrq   rh   ra   r   )r^   rx   rI   r   	directioncbwidgetrt   rW   rW   r_   rn     s.    

zHoloViews._update_widgetsc                   sz  ddl m}m} | jj}|s d S | jdkrL|dd | j D |d j n^t	dd |D  |j
rdd |D d	d |jD } fd
d|D  |t	 |j|j |jdkrF|jst|jrt  |  W d    n1 s0    Y  |jrDd|jjvrD|  n*|jjr:|jt|j  n
|  n0|  t|jdrn|j||_n|j|_d S )Nr   )cross_indexwrap_tuple_streamsr=   c                 S  s   g | ]}|qS rW   rW   rZ   r\   rW   rW   r_   r`   9  r~   z*HoloViews._update_plot.<locals>.<listcomp>c                 s  s   | ]}|j V  qd S rz   )r   rZ   wrW   rW   r_   r}   ;  r~   z)HoloViews._update_plot.<locals>.<genexpr>c                 S  s   g | ]
}|j qS rW   rR   r   rW   rW   r_   r`   =  r~   c                 S  s   g | ]
}|j qS rW   )pprint_labelrZ   ZkdimrW   rW   r_   r`   >  r~   c                   s&   g | ]}|v r  | nd qS rz   )indexr   keyZwidget_dimsrW   r_   r`   ?  s   r'   Zembeddedget_plot_state)holoviews.core.utilr   r   rg   r+   rL   r   r   r   tupledynamicZ
dimensionsZstreamsrE   commr   Z
_unblockedr   r   updateroottagspushZsession_contextZadd_next_tick_callbackr   hasattrrG   r   rO   )r^   r   paner   r   rI   Z
dim_labelsrW   r   r_   _update_plot2  s6    
"(


zHoloViews._update_plotc                 C  s(   | j  D ]\}\}}| || q
d S rz   )ri   rk   r   )r^   eventr   r   r   rW   rW   r_   r   V  s    zHoloViews._widget_callbackc                 G  s`   | j r
d S t| j}|D ]<}|j|v rH| j|j j|jkrH||j q||j q|| _d S rz   )	rj   r   rl   rR   rX   r*   newr   rq   )r^   rx   Z	overridesr|   rW   rW   r_   r   Z  s    
zHoloViews._track_overridesc                   s   |j }|jj}|dkr*|j|j|jd}nF|dkr@d d d d}n0|dkrp|di dr`d}nd }|d d d}d_zrj	fd	d
|
 D  |dkrW d_d S |j    fdd
jD }|r|j j	f i | W d_nd_0 d S )Nr'   )rS   rT   rU   r(   r)   configr   r   Tc                   s    i | ]\}}| j vr||qS rW   )rl   )rZ   kr\   r]   rW   r_   
<dictcomp>  r~   z/HoloViews._sync_sizing_mode.<locals>.<dictcomp>Fc                   s    i | ]}| v r|t |qS rW   r   )rZ   oZ
plot_propsr^   rW   r_   r     s   )r   rG   rE   rS   rT   rU   r   rj   rX   r   rk   
propertiesrl   )r^   r   r   rE   rs   rS   propsrW   r   r_   _sync_sizing_modee  sD    	
zHoloViews._sync_sizing_modec                   s2   | j r&tt| j  \}}||S t |S rz   )ri   nextiterr   _process_param_changere   )r^   rs   r   r   ru   rW   r_   r     s    
zHoloViews._process_param_changer#   Optional[Model]Optional[Comm]r$   r,   r   parentr   ry   c                 C  s  ddl m} |d u r | ||S |jd }| jd u rLt }||f| j|< |S | jd urd| j}d | _n"t| j|rx| j}n| 	|||}| |_
|jj}	|j|}
| | | jdvo| j }| jo|o| j }|r|   d| _|   || _t| jdn| jd u r|   | j}| jo$| j }| j| \}}}| j}|sL|rLdn|}|| j_t| jr|s| j|ur|| jd _n&|tu rt| jdkr|| jd	 _d
d | j  ! D }| jr| j"ds| j"dr|d= | jr| j"ds| j"dr|d= | j#|	|
fi |}| $|| |%||||}|| j&v rn| j&| \}}d |_'|(  ||f| j&|< ||f| j|< |S )Nr   r   id)fixedNT)r   r      r   c                 S  s(   i | ] \}}|t jv r|d kr||qS r   )r   rX   rY   rW   rW   r_   r     s   z(HoloViews._get_model.<locals>.<dictcomp>rT   ZbothrU   ))holoviews.plotting.plotr   get_rootrefrO   	_BkSpacerr   rd   r   _renderr   rG   rE   r   r   rS   rT   rB   rc   rr   r   r   r   rb   rK   r   r   r   rg   r   r   rX   r   rk   endswith	_get_paner   
_get_modelri   r   cleanup)r^   r,   r   r   r   r   r   r   r   rE   r   r   Zforce_widthr   rB   r   r   r   r   r   Z
child_paneold_plotold_panerW   rW   r_   r     sn    



$$zHoloViews._get_modelc                 K  sV   | j |t}t|trFt|tr4d|d< | j|d< t|trFd|d< ||fi |S )NTZtightrM   FZautodispatch)	rD   r   r   r   type
issubclassr!   rM   r    )r^   rE   r   r   Z	pane_typerW   rW   r_   r     s    



zHoloViews._get_panec                 C  sP  dd l }ddl m}m} | jr,| j}|j}n4|jsJ| jp:d}	||	 |	|_| jpT|j}|j| }|d u rldnd}
|dkri }| jd ur| j|d< n:|jr|jjdi ikr|j|d< n| jjj	r| jjj	|d< |
|j
kr|
|d< |r|jf i |}d	| ji}|dkstt|jtd
kr<||d< ||d< |r<||d< |j| jfi |S )Nr   )r   rG   r'   serverr*   rH   attrsr   rQ   z1.13.0r,   r   r   )r   r   rG   rE   r   r   rH   _jsonZ_designZbokeh_themer   instancerQ   r   str__version__Zget_plotrO   )r^   r,   r   r   Zhvr   Zload_rendererrG   rE   Zloaded_backendr   rs   r   rW   rW   r_   r     s>    





"zHoloViews._renderModel | Noner   ry   c                   sF   |r6| j |jd d\}}|r(|  |r6|| t | dS )zr
        Traverses HoloViews object to find and clean up any streams
        connected to existing plots.
        r   NNN)ri   popr   r   _cleanupre   )r^   r   r   r   ru   rW   r_   r     s    
zHoloViews._cleanupr   float | bool | None)r   ry   c                 C  s4   dt jvrdS ddlm} ddlm} t|||fS )Nr   Fr   )Dimensionedr   )sysmodulesZholoviews.core.dimensionr   r   r   r   )clsr   r   r   rW   rW   r_   applies   s
    
zHoloViews.appliesc                 K  sN   |r|rt dn|s"|s"t d|d u r.i }ddlm} || |||||dS )Nz^Either supply a set of properties to link as keywords or a set of JS code callbacks, not both.zFDeclare parameters to link or a set of callbacks, neither was defined.r   Link)r   codeargsbidirectional)
ValueErrorlinksr  )r^   targetr  r  r  r	  r  rW   rW   r_   jslink(  s    
zHoloViews.jslinkr   c           )   	     s  ddl m}m} ddlm} ddlm} ddlm m	m
}	 ddlm}
m} ddlm} dd	lm}m}m}m}m}m} |d u ri }t||
r|j}nt||r|j}t||r|jrd
dd |jD }d}||j|d||\}}||\}}||dgkr|dgks(|s0t|dkr0g i fS d}|r>i ntt|t| i }g }fdd|D }t |D ]R\}d d i   }}}|dkr|dkr|dkr|t|d krd}n,|dkrd}n|t|d krd}nd}|dd} ni } j!p"d }!|!d ur(t#|	|!}!|!|j$< |dkrX|!sJt%d|t|!9 }nj$|v r|j$ }t||r|j&j'f i |  |j$sj(|_$|)| qrnPt|tr|"d|}t|}n.t|t*rt+||r|}nt%d|f |'|  |!rt, fd d|!D rht|!dkrht-|!}!fd!d|!D }"tt|"|!}#|pd|}nt#|!}#|px|}j.d u r|!d nj.}$j/}%tt|%|#|$d"fi |}|f i |}nj0d#krj0\}&}'|&|'krqrj.d u r|&nj.}$|d ur
nbt,d$d |&|'|$fD r@|}j1d u r8dnj1}(n,t|$ rR|}n|}j1d u rfd%nj1}(tt|(j(j0d j0d |$d&fi |}|f i |}|d urrd'|j&j$_2|)| qr|dkrt3|d(d)g}||fS )*Nr   )	Dimension
DynamicMap)SkipRendering)unique_dimkeys)datetime_types	isnumericunique_iterator)GenericCompositePlotr   )get_dynamic_moder   )DatetimeInputDiscreteSliderFloatSlider	IntSliderSelectWidgetz, c                 s  s   | ]}d | V  qdS )z%rNrW   )rZ   dimrW   rW   r_   r}   R  r~   z4HoloViews.widgets_from_dimensions.<locals>.<genexpr>zDynamicMap cannot be displayed without explicit indexing as {dims} dimension(s) are unbounded. 
Set dimensions bounds with the DynamicMap redim.range or redim.values methods.)dimsZFrame)r   r   c                   s.   g | ]&}  |d us&|js&|jdkr|qS )Nr   )r   r   range)rZ   d)r   rW   r_   r`   c  s   z5HoloViews.widgets_from_dimensions.<locals>.<listcomp>r<   r   )   r  r  r  )r  r     r  )r   r  r  r  )r   r  r   r     )rQ   rT   r=   zAScrubber widget may only be used if all dimensions define values.r   ziExplicit widget definitions expected to be a widget instance or type, %s dimension widget declared as %s.c                 3  s    | ]}|pt | V  qd S rz   )r   r   )r  r  rW   r_   r}     r~   c                   s   g | ]}t  |qS rW   )r   Zpprint_valuer   )r  rW   r_   r`     r~   )rR   optionsr   r   c                 s  s   | ]}t |tV  qd S rz   )r   intr   rW   rW   r_   r}     r~   g?)steprR   rA   rC   r   Ti&  )lengthrT   )4Zholoviews.corer  r  holoviews.core.optionsr  Zholoviews.core.traversalr  r   r  r  r  r   r  r   Zholoviews.plotting.utilr  rI   r  r  r  r  r  r  r   r   ZhmapZ	unboundedjoinrM   r   dictzip	enumerater   r   r   rR   r  rX   r   labelrq   r   r   allsortedr*   r   r  r$  r;   r   ))r  rO   Zwidget_typesZwidgets_typer   r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  msgr   ZboundedkeysZnframesZ
dim_valuesrI   irL   r   Zwidget_kwargsrQ   r   valslabelsr"  r*   Zwidget_namerA   rC   r$  rW   )r  r  r  r   r_   r   9  s     










(







z!HoloViews.widgets_from_dimensions)N)NNN)N)NNF)Nr<   r   )=__name__
__module____qualname____doc__rX   ZObjectSelectorrE   BooleanrB   ZSelectorrM   rF   	ParameterrG   ZClassSelectorr   r   rH   rK   r   r   r   rJ   rL   DictrI   r@   __annotations__r   r    r!   r"   rD   rN   ro   Z_skip_layoutablerf   r   dependsr   propertyr   r   r   rr   rn   r   r   r   r   r   r   r   r   r   classmethodr  r  r   r   __classcell__rW   rW   ru   r_   r&   (   s   




%

5
$(  E
&

r&   c                      s   e Zd ZU ejddddZdZded< dZded	< d" fd
d	Z	e
dddddZeddd Zdd Zd#ddddddddZd$ddd fd d!Z  ZS )%InteractiveNFzT
        The object being wrapped, which will be converted to a
        Bokeh model.)r*   Z
allow_refsr,   r?   r@   )rO   zClassVar[Tuple[str, ...]]_ignored_refsc                   s6   t  j|fi | |   | j| jttj d S rz   )re   rf   r   rX   rm   _update_layout_propertiesr   r   )r^   rO   rs   ru   rW   r_   rf     s    zInteractive.__init__r   r   )rO   ry   c                 C  s,   dt jvrdS ddlm} t||r(dS dS )Nhvplot.interactiveFr   r?  r>   )r   r   hvplot.interactiver?  r   )r  rO   r?  rW   rW   r_   r    s    
zInteractive.appliesrO   c                   sF    j d u rd  _n0 j   _ jjjf i  fddtjD  d S )Nc                   s    i | ]}|d kr|t  |qS r   r   rZ   r[   r]   rW   r_   r     s   z.Interactive._update_layout.<locals>.<dictcomp>)rO   _layout_panelr   rX   r   r   r]   rW   r]   r_   r     s    
zInteractive._update_layoutc                 G  s0   | j d u rd S | j jjf i dd |D  d S )Nc                 S  s   i | ]}|j |jqS rW   )rR   r   r{   rW   rW   r_   r     r~   z9Interactive._update_layout_properties.<locals>.<dictcomp>)rF  rX   r   r   rW   rW   r_   rA    s    
z%Interactive._update_layout_propertiesr#   r   r   r$   r   c                   sh   |d u r  ||S  jd u r>tf i  fddtjD }n j||||}||f j|jd < |S )Nc                   s    i | ]}|d kr|t  |qS r   r   rE  r]   rW   r_   r     s   z*Interactive._get_model.<locals>.<dictcomp>r   )r   rF  r   r   rX   r   r   r   )r^   r,   r   r   r   r   rW   r]   r_   r     s    
zInteractive._get_modelr   rw   r   c                   s&   | j d ur| j | t | d S rz   )rF  r   re   )r^   r   ru   rW   r_   r     s    
zInteractive._cleanup)N)NNN)N)r3  r4  r5  rX   r8  rO   r@   r:  r@  rf   r=  r  r;  r   rA  r   r   r>  rW   rW   ru   r_   r?    s   

	  r?  c                 C  sD   ddl m}m}m} t| |s"dS | jjdkoBt| |oBt| | S )zj
    Checks whether plotting instance is a HoloViews ElementPlot rendered
    with the bokeh backend.
    r   )GenericElementPlotGenericOverlayPlotr   Fr'   )r   rG  rH  r   r   rG   rE   )r   rG  rH  r   rW   rW   r_   is_bokeh_element_plot  s    

rI  c           	      C  s   t t}| jd }|D ]f}| jd |jv r|j|d\}}|du rFq|dd tg}|D ]}|jD ]}|| 	| qfq\q|S )z4
    mapping panel elements to its bokeh models
    r   r   Nc                 S  s   | S rz   rW   xrW   rW   r_   <lambda>  r~   z*generate_panel_bokeh_map.<locals>.<lambda>)
r   r   r   r   ri   r   traverserI  Zlink_sourcesrq   )	
root_modelZpanel_viewsZ
map_hve_bkr   r   r   ZsubpaneZbk_plotsZhv_elemrW   rW   r_   generate_panel_bokeh_map  s    

rO  c                   s  |  t}fdd|D }t|dks,dS z@zddlm  W n ty\   ddlm  Y n0 ddlm} W n ty   Y dS 0 dd |D } fd	d|D }d
d |D }g }|D ]r\\}	}
|
D ]`j	du r|
|	df qȇ fdd|D }dd |D }|r|
|	|d d f qqt|| j }g }|D ]X\}}|jd t }|du sBtddr|du rqB|
||| qB| j| |S )zd
    Traverses the supplied Viewable searching for Links between any
    HoloViews based panes.
    c                   s4   g | ],}|j  D ]\}}t|d d u r|qqS )r   N)ri   r   r   )rZ   viewr   r   )rN  rW   r_   r`     s   zfind_links.<locals>.<listcomp>r   Nr   LinkCallbackr  c                 S  s,   g | ]$}| d d tgD ]}||fqqS )c                 S  s   | S rz   rW   rJ  rW   rW   r_   rL  )  r~   z'find_links.<locals>.<listcomp>.<lambda>)rM  rI  )rZ   	root_plotr   rW   rW   r_   r`   (  s   c                   s   g | ]\}}  ||fqS rW   Z	find_link)rZ   r   rS  rQ  rW   r_   r`   +  s   c                 S  s   g | ]}|d  dur|qS )r   NrW   rE  rW   rW   r_   r`   .  r~   c                   s$   g | ]\}}|ur  |qS rW   rT  )rZ   r   Z
inner_root)rR  linkrS  rW   r_   r`   6  s   c                 S  s   g | ]}|d ur|qS rz   rW   rE  rW   rW   r_   r`   8  r~   r'   Z_requires_targetF)selectr&   r   Zholoviews.plotting.bokeh.linksrR  	ExceptionZ"holoviews.plotting.bokeh.callbacksZholoviews.plotting.linksr  r
  rq   setZ_found_linksZ
_callbacksr   r   r   )	root_viewrN  Zhv_viewsZ
root_plotsr  plotsZ
potentialsZsource_linksfoundr   r	  Z	tgt_linksZ	new_found	callbacksZsrc_plotZtgt_plotr   rW   )rR  rU  rN  rS  r_   
find_links  sL    


r]  c                   sn  |  t}|sdS ddlm} ddlm}m} ddlm} |j	d }t
t}|D ]
}	||	jvrbqP|	j| d }
|	jrP|
jjdksPt|
dd	sqP|
j|gd
D ]}|jdu rq|d|jdjd}|jr|rq|j}|jjrtdd |jjd D }|| |||jd |jf |jjrtdd |jjd D }|| |||jd |jf qqP| D ] \}}|d \}}}}t |t!r|dd |D \}}|j"|j#kr|| }}||_"||_#|dd D ]\}}}}g }t$|t$|urq||jjv rR||jurRt%|dr8t||j&|jj& |_&||_||j'd< |d ||jjv r||jurt%|drt||j&|jj& |_&||_||j'd< |d |j(}|r|) }n|g}|D ]}|j*D ]}|j+ t%|dr |j,7  t- fdd|D sqd|v r*|j'd |j'd< d|v rD|j'd |j'd< |.  |j/|j0d qԐqʐqҐqfdS )zU
    Pre-processing hook to allow linking axes across HoloViews bokeh
    plots.
    Nr   )r   )	max_ranger  )ElementPlotr   r'   shared_axesF)specsZnormaxiswisec                 s  s$   | ]}t |trt|n|V  qd S rz   r   r   r   rZ   trW   rW   r_   r}   i  r~   zlink_axes.<locals>.<genexpr>c                 s  s$   | ]}t |trt|n|V  qd S rz   rc  rd  rW   rW   r_   r}   l  r~   c                 S  s.   g | ]&}t |d  tr|d  j|d  jfqS ))r   r   rA   rC   )rZ   axrW   rW   r_   r`   r  s   zlink_axes.<locals>.<listcomp>r   factorsx_rangey_rangeextra_modelsc                 3  s   | ]}| v V  qd S rz   rW   )rZ   cmodelsrW   r_   r}     r~   )Zplot_id)1rV  r&   r&  r   r   r^  r  Z holoviews.plotting.bokeh.elementr_  r   r   r   ri   rF   rG   rE   r   rM  current_frameZlookup_optionsr   r   r`  r   ri  r   r   rq   Zxaxisrj  Zyaxisrk   r   r   rA   rC   r   r   rh  Zhandlessubplotsr   r\  rn  rk  anyresetZ
initializer   )rY  rN  Zpanesr   r^  r  r_  r   Z	range_mapr   r   r[   rb  ZfigtagZaxesrg  ZaxisrA   rC   Zpaxr   changedrp  rZ  spcallbackrW   rm  r_   	link_axesH  s    







"









rw  c                   sB   dt jvr S ddlm} t |s( S t fddg jR  S )NrB  r   rC  c                    s      S rz   )eval)r   r   rW   r_   rL    r~   z/_hvplot_interactive_transform.<locals>.<lambda>)r   r   rD  r?  r   r   _params)r   r?  rW   ry  r_   _hvplot_interactive_transform  s    

r{  )Br6  
__future__r   r   collectionsr   	functoolsr   typingr   r   r   r   r	   r
   r   rX   Zbokeh.modelsr   r   r   Zbokeh.themes.themer   Zpackaging.versionr   Zparam.parameterizedr   Zparam.reactiver   ior   r   r   r   r   r   r   Zviewabler   r   rI   r   baser   r   r   r   r    r!   r)   r"   Zbokeh.documentr#   Zbokeh.modelr$   Zpyviz_commsr%   r&   r?  rI  rO  r]  rw  Z_preprocessing_hooksrq   r{  rW   rW   rW   r_   <module>   sJ   $     95Z