
    Ih                       d Z ddlm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 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 ddlmZ ddlmZ ddlmZmZm Z  ddl!m"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.Z. e ed             ed      k\  Z/	 ddl.m1Z1  ed      Z2e2jf                  e2jh                  cZ5Z4dZ6dZ7dZ8g dZ9 edd       Z:d! Z;d" Z< G d# d$e=      Z>e
d%        Z?d& Z@ G d' d(      ZA G d) d*eAe.j                        ZC G d+ d,eAe.j                  j                        ZF G d- d.e.j                  j                        ZH G d/ d0e-j                        ZI G d1 d2      ZJ G d3 d4e-j                        ZK G d5 d6e-j                        ZLe1r  G d7 d8e1j                  e.j                        ZO G d9 d:eK      ZP G d; d<eL      ZQy# e0$ r dZ.dZ/Y Dw xY w# e0$ r dZ1Y Kw xY w)=a  Redis transport module for Kombu.

Features
========
* Type: Virtual
* Supports Direct: Yes
* Supports Topic: Yes
* Supports Fanout: Yes
* Supports Priority: Yes
* Supports TTL: No

Connection String
=================
Connection string has the following format:

.. code-block::

    redis://[USER:PASSWORD@]REDIS_ADDRESS[:PORT][/VIRTUALHOST]
    rediss://[USER:PASSWORD@]REDIS_ADDRESS[:PORT][/VIRTUALHOST]

To use sentinel for dynamic Redis discovery,
the connection string has following format:

.. code-block::

    sentinel://[USER:PASSWORD@]SENTINEL_ADDRESS[:PORT]

Transport Options
=================
* ``sep``
* ``ack_emulation``: (bool) If set to True transport will
  simulate Acknowledge of AMQP protocol.
* ``unacked_key``
* ``unacked_index_key``
* ``unacked_mutex_key``
* ``unacked_mutex_expire``
* ``visibility_timeout``
* ``unacked_restore_limit``
* ``fanout_prefix``
* ``fanout_patterns``
* ``global_keyprefix``: (str) The global key prefix to be prepended to all keys
  used by Kombu
* ``socket_timeout``
* ``socket_connect_timeout``
* ``socket_keepalive``
* ``socket_keepalive_options``
* ``queue_order_strategy``
* ``max_connections``
* ``health_check_interval``
* ``retry_on_timeout``
* ``priority_steps``
    )annotationsN)bisect)
namedtuple)contextmanager)version)Empty)time)Version)promise)InconsistencyErrorVersionMismatch)
get_logger)register_after_fork)bytes_to_str)ERRREADpoll)accepts_argument)dumpsloads)cached_property)cycle_by_name)
_parse_url   )virtualredisz5.3.0)sentinelzkombu.transport.redisi     )r         	   error_classes_t)connection_errorschannel_errorsc                    ddl m}  t        | d      r| j                  }n| j                  }t        t        j                  j                  t        t        j                  t        t        | j                  | j                  | j                   | j"                  fz   t        j                  j$                  || j&                  | j(                  fz         S )z$Return tuple of redis error classes.r   
exceptionsInvalidData)r   r'   hasattrr(   	DataErrorr"   r   	Transportr#   r   socketerrorIOErrorOSErrorConnectionErrorBusyLoadingErrorAuthenticationErrorTimeoutErrorr$   InvalidResponseResponseError)r'   r*   s     N/var/www/html/planif/env/lib/python3.12/site-packages/kombu/transport/redis.pyget_redis_error_classesr7   }   s      z=)**	((					,	,LL&&''**##0% 
% 
			)	)&&$$-& 
&     c                 &    ddl m}  | j                  S )z1Return the redis ConnectionError exception class.r   r&   )r   r'   r0   r&   s    r6   get_redis_ConnectionErrorr:      s     %%%r8   c                      e Zd ZdZy)	MutexHeldz)Raised when another party holds the lock.N__name__
__module____qualname____doc__ r8   r6   r<   r<      s    3r8   r<   c              #  f  K   | j                  ||      }d}	 |j                  d      }|rd n
t               	 |r	 |j                          yy# t        j
                  j                  $ r Y yw xY w# |r5	 |j                          w # t        j
                  j                  $ r Y w w xY ww xY ww)zTAcquire redis lock in non blocking way.

    Raise MutexHeld if not successful.
    timeoutF)blockingN)lockacquirer<   releaser   r'   LockNotOwnedError)clientnameexpirerG   lock_acquireds        r6   MutexrO      s      ;;tV;,DMe4+    ##55  ##55  sc   B1#A5 B1 A B1A2/B11A22B15B.9B
	B.
B*'B.)B**B..B1c                $    | j                          y N)_after_fork)channels    r6   _after_fork_cleanup_channelrT      s    r8   c                  h     e Zd ZdZg dZddddddddddddd	Zd
 Z fdZ fdZddZ	 xZ
S )GlobalKeyPrefixMixina  Mixin to provide common logic for global key prefixing.

    Overriding all the methods used by Kombu with the same key prefixing logic
    would be cumbersome and inefficient. Hence, we override the command
    execution logic that is called by all commands.
    )HDELHGETHLENHSETLLENLPUSHPUBLISHRPUSHRPOPSADDSREMSETSMEMBERSZADDZREMZREVRANGEBYSCOREr   N)
args_startargs_end   r   )DELBRPOPEVALSHAWATCHc                   t        |      }|j                  d      }|| j                  v r| j                  t	        |d         z   |d<   nv|| j
                  v rh| j
                  |   d   }| j
                  |   d   }|dkD  r|d | ng }g }|||d  }|||| D cg c]  }| j                  t	        |      z    c}z   |z   }|g|S c c}w )Nr   rg   rh   )listpopPREFIXED_SIMPLE_COMMANDSglobal_keyprefixstrPREFIXED_COMPLEX_COMMANDS)selfargscommandrg   rh   pre_args	post_argsargs           r6   _prefix_argsz!GlobalKeyPrefixMixin._prefix_args   s    Dz((1+d333++c$q'l:DG66677@NJ55g>zJH,6NtKZ(HI# O	
84 %%C0  D
 $s   Cc                z    t        |   ||fi |}|dk(  r#|r!|\  }}|t        | j                        d }||fS |S )zParse a response from the Redis server.

        Method wraps ``redis.parse_response()`` to remove prefixes of keys
        returned by redis command.
        rl   Nsuperparse_responselenrs   )rv   
connectioncommand_nameoptionsretkeyvalue	__class__s          r6   r   z#GlobalKeyPrefixMixin.parse_response   sU     g$ZII7"sJCc$//012C:
r8   c                @    t        |   | j                  |      i |S rQ   r   execute_commandr|   rv   rw   kwargsr   s      r6   r   z$GlobalKeyPrefixMixin.execute_command  #    w&(9(9$(?J6JJr8   c                ^    t        | j                  | j                  ||| j                        S )Nrs   )PrefixedRedisPipelineconnection_poolresponse_callbacksrs   )rv   transaction
shard_hints      r6   pipelinezGlobalKeyPrefixMixin.pipeline  s0    $  ##!22
 	
r8   )TN)r>   r?   r@   rA   rr   ru   r|   r   r   r   __classcell__r   s   @r6   rV   rV      sO     (  T2 !r2"#3 !t4	! .K
r8   rV   c                      e Zd ZdZd Zd Zy)PrefixedStrictRedisz@Returns a ``StrictRedis`` client that prefixes the keys it uses.c                x    |j                  dd      | _        t        j                  j                  | g|i | y Nrs    )rq   rs   r   Redis__init__rv   rw   r   s      r6   r   zPrefixedStrictRedis.__init__  s2     &

+=r BT3D3F3r8   c                F    t        | j                  fd| j                  i|S )Nrs   )PrefixedRedisPubSubr   rs   )rv   r   s     r6   pubsubzPrefixedStrictRedis.pubsub  s0    "  
!22
 
 	
r8   N)r>   r?   r@   rA   r   r   rB   r8   r6   r   r     s    J4
r8   r   c                      e Zd ZdZd Zy)r   a   Custom Redis pipeline that takes global_keyprefix into consideration.

    As the ``PrefixedStrictRedis`` client uses the `global_keyprefix` to prefix
    the keys it uses, the pipeline called by the client must be able to prefix
    the keys as well.
    c                    |j                  dd      | _        t        j                  j                  j
                  | g|i | y r   )rq   rs   r   rK   Pipeliner   r   s      r6   r   zPrefixedRedisPipeline.__init__&  s8     &

+=r B&&t=d=f=r8   N)r>   r?   r@   rA   r   rB   r8   r6   r   r     s    >r8   r   c                  @     e Zd ZdZdZ fdZd Z fdZ fdZ xZ	S )r   zCRedis pubsub client that takes global_keyprefix into consideration.)	SUBSCRIBEUNSUBSCRIBE
PSUBSCRIBEPUNSUBSCRIBEc                R    |j                  dd      | _        t        |   |i | y r   )rq   rs   r   r   r   s      r6   r   zPrefixedRedisPubSub.__init__5  s)     &

+=r B$)&)r8   c                    t        |      }|j                  d      }|| j                  v r%|D cg c]  }| j                  t	        |      z    }}|g|S c c}w Nr   )rp   rq   PUBSUB_COMMANDSrs   rt   )rv   rw   rx   r{   s       r6   r|   z PrefixedRedisPubSub._prefix_args9  si    Dz((1+d***   %%C0D 
 $s   Ac                    t        |   |i |}||S |^}}}|g|D cg c]  }|t        | j                        d  c}|S c c}w )zParse a response from the Redis server.

        Method wraps ``PubSub.parse_response()`` to remove prefixes of keys
        returned by redis command.
        Nr~   )	rv   rw   r   r   message_typechannelsmessagerS   r   s	           r6   r   z"PrefixedRedisPubSub.parse_responseE  sq     g$d5f5;J ,/(x
BJKwgc$//012K
 
 	
Ks   Ac                @    t        |   | j                  |      i |S rQ   r   r   s      r6   r   z#PrefixedRedisPubSub.execute_command[  r   r8   )
r>   r?   r@   rA   r   r   r|   r   r   r   r   s   @r6   r   r   +  s(    MO*
 
,K Kr8   r   c                       e Zd ZdZdZ fdZ fdZddZ fdZd fd	Z	e
dd       Zdd	Zdd
ZddZed        Zed        Zed        Zed        Zed        Z xZS )QoSzRedis Ack Emulation.Tc                2    t        |   |i | d| _        y r   )r   r   _vrestore_countr   s      r6   r   zQoS.__init__d  s    $)&) r8   c           
        |j                   }|d   |d   }}t        j                  d   dk\  r|t               ig}nt               |g}| j	                         5 } |j
                  | j                  g| j                  | j                  |t        |j                  ||g            j                          t        | 5  ||       d d d        y # 1 sw Y   y xY w)Nexchangerouting_keyr   r   )delivery_infor   VERSIONr	   pipe_or_acquirezaddunacked_index_keyhsetunacked_keyr   _rawexecuter   append)	rv   r   delivery_tagdeliveryEXRK	zadd_argspiper   s	           r6   r   z
QoS.appendh  s    ((*%x'>B==q &/0I.I!!# 	2tDIId,,9y9d&&W\\2r235GN7L1	2 	2 	2s   A-CCc                    | j                   j                  |      5 }| j                  D ]  }| j                  ||        	 d d d        | j                  j	                          y # 1 sw Y   $xY w)NrK   )rS   conn_or_acquire
_deliveredrestore_by_tagclear)rv   rK   tags      r6   restore_unackedzQoS.restore_unackedy  sc    \\))&1 	8V 8##C#78	8 		8 	8s   %A%%A.c                b    | j                  |      j                          t        |   |       y rQ   )_remove_from_indicesr   r   ack)rv   r   r   s     r6   r   zQoS.ack  s&    !!,/779L!r8   c                    |r| j                  |d       n| j                  |      j                          t        |   |       y NT)leftmost)r   r   r   r   r   )rv   r   requeuer   s      r6   rejectz
QoS.reject  s<    t<%%l3;;=L!r8   c              #     K   |r| y | j                   j                  |      5 }|j                          d d d        y # 1 sw Y   y xY wwrQ   )rS   r   r   )rv   r   rK   s      r6   r   zQoS.pipe_or_acquire  sC     J--f5 (oo''( ( (s   #AA	AA
Ac                    | j                  |      5 }|j                  | j                  |      j                  | j                  |      cd d d        S # 1 sw Y   y xY wrQ   )r   zremr   hdelr   )rv   r   r   s      r6   r   zQoS._remove_from_indices  sM    !!$' 	=499T33\BT--|<	= 	= 	=s   6AAc           
        | xj                   dz  c_         | j                   dz
  |z  ry | j                  j                         5 }t               | j                  z
  }	 t        || j                  | j                        5  |j                  | j                  |d|xr ||d      }|xs g D ]  \  }}| j                  ||        	 d d d        d d d        y # 1 sw Y   xY w# t        $ r Y  w xY w# 1 sw Y   y xY w)Nr   r   T)startnum
withscores)r   rS   r   r	   visibility_timeoutrO   unacked_mutex_keyunacked_mutex_expirezrevrangebyscorer   r   r<   )	rv   r   r   intervalrK   ceilvisibler   scores	            r6   restore_visiblezQoS.restore_visible  s   !  1$0\\))+ 	v6D333D	64#9#9446 9$55..a!me 6 GG '.m 9
U++C899	 	9 9  	 	sC   C0!C!=ACC!C	C!!	C-*C0,C--C00C9c                      fd} j                   j                  |      5 }|j                  | j                         d d d        y # 1 sw Y   y xY w)Nc                    | j                  j                        }| j                          j                  |        |r8t	        t        |            \  }}}j                  j                  ||||        y y rQ   )hgetr   multir   r   r   rS   _do_restore_message)r   pMr   r   r   rv   r   s        r6   restore_transactionz/QoS.restore_by_tag.<locals>.restore_transaction  sh    		$**C0AJJL%%c40!,q/2	2r00BD(K r8   )rS   r   r   r   )rv   r   rK   r   r   s   `` ` r6   r   zQoS.restore_by_tag  sO    	L \\))&1 	FV2D4D4DE	F 	F 	Fs   AAc                .    | j                   j                  S rQ   )rS   r   rv   s    r6   r   zQoS.unacked_key  s    ||'''r8   c                .    | j                   j                  S rQ   )rS   r   r   s    r6   r   zQoS.unacked_index_key      ||---r8   c                .    | j                   j                  S rQ   )rS   r   r   s    r6   r   zQoS.unacked_mutex_key  r   r8   c                .    | j                   j                  S rQ   )rS   r   r   s    r6   r   zQoS.unacked_mutex_expire  s    ||000r8   c                .    | j                   j                  S rQ   )rS   r   r   s    r6   r   zQoS.visibility_timeout  s    ||...r8   rQ   FNN)r   
   r   )NF)r>   r?   r@   rA   restore_at_shutdownr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s   @r6   r   r   _  s    !2" "" ( (=
"F ( ( . . . . 1 1 / /r8   r   c                      e Zd ZdZeez  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 Zd Zd Zd Zd Zd ZddZed        Zy)MultiChannelPollerz%Async I/O poller for Redis transport.FNc                z    t               | _        i | _        i | _        t	               | _        t               | _        y rQ   )set	_channels_fd_to_chan_chan_to_sockr   poller
after_readr   s    r6   r   zMultiChannelPoller.__init__  s-    f%r8   c                @   | j                   j                         D ]  }	 | j                  j                  |         | j                  j                          | j                  j                          | j                   j                          y # t        t
        f$ r Y w xY wrQ   )	r  valuesr  
unregisterKeyError
ValueErrorr  r   r  )rv   fds     r6   closezMultiChannelPoller.close  s    $$++- 	B&&r*	
 	   "	 j) s   BBBc                :    | j                   j                  |       y rQ   )r  addrv   rS   s     r6   r  zMultiChannelPoller.add  s    7#r8   c                :    | j                   j                  |       y rQ   )r  discardr  s     r6   r  zMultiChannelPoller.discard  s    w'r8   c                z    	 | j                   j                  |j                         y # t        t        f$ r Y y w xY wrQ   )r  r  _sockAttributeError	TypeErrorrv   r   s     r6   _on_connection_disconnectz,MultiChannelPoller._on_connection_disconnect  s6    	KK"":#3#34	* 		s   %( ::c                   |||f| j                   v r| j                  |||       |j                  j                  |j                  j	                          |j                  j                  }||f| j
                  |j                         <   || j                   |||f<   | j                  j                  || j                         y rQ   )
r  _unregisterr   r  connectr  filenor  register
eventflags)rv   rS   rK   typesocks        r6   	_registerzMultiChannelPoller._register  s    VT"d&8&88Wfd3""*%%'  &&+2D/'6:GVT23T4??3r8   c                Z    | j                   j                  | j                  |||f          y rQ   )r  r  r  )rv   rS   rK   r!  s       r6   r  zMultiChannelPoller._unregister  s&    t117FD2IJKr8   c                    t        |dd       Ft        r |j                  j                         |_        n |j                  j                  d      |_        |j                  j
                  d uxr |||f| j                  v S )Nr   _)getattr"_REDIS_GET_CONNECTION_WITHOUT_ARGSr   get_connectionr   r  r  )rv   rS   rK   cmds       r6   _client_registeredz%MultiChannelPoller._client_registered  sw    6<.61$*$:$:$I$I$K!$*$:$:$I$I#$N!!!''t3 =&#&$*<*<<	>r8   c                    ||j                   df}| j                  ||j                   d      sd|_         | j                  |  |j                  s|j	                          yy)zEnable BRPOP mode for channel.rl   FN)rK   r+  _in_pollr#  _brpop_start)rv   rS   idents      r6   _register_BRPOPz"MultiChannelPoller._register_BRPOP  sX    0&&wH$GDNNE"  "  r8   c                    | j                  ||j                  d      s$d|_        | j                  ||j                  d       |j                  s|j	                          yy)zEnable LISTEN mode for channel.LISTENFN)r+  	subclient
_in_listenr#  
_subscriber  s     r6   _register_LISTENz#MultiChannelPoller._register_LISTEN  sR    &&w0A0A8L!&GNN7G$5$5x@!!  "r8   c                    | j                   D ]W  }|j                  r+|j                  j                         r| j	                  |       |j
                  sG| j                  |       Y y rQ   )r  active_queuesqoscan_consumer0  active_fanout_queuesr6  r  s     r6   on_poll_startz MultiChannelPoller.on_poll_start  sS    ~~ 	/G$$;;**,((1++%%g.	/r8   c                    || _         | j                  D ])  }|j                  j                  |j                        c S  y N)r   )r  r  r9  r   unacked_restore_limit)rv   r  rS   s      r6   on_poll_initzMultiChannelPoller.on_poll_init&  sA    ~~ 	G;;..11 /  	r8   c                    | j                   D ]6  }|j                  s|j                  j                  |j                        c S  y r>  )r  r8  r9  r   r?  r  s     r6   maybe_restore_messagesz)MultiChannelPoller.maybe_restore_messages-  sC    ~~ 	G$${{2255 3  	r8   c                    | j                   D ]G  }|j                  j                  d      }|!t        t	        |dd             s8|j                          I y )Nr3  check_health)r  __dict__getcallabler'  rD  )rv   rS   rK   s      r6   maybe_check_subclient_healthz/MultiChannelPoller.maybe_check_subclient_health5  sN    ~~ 	&G%%))+6F! !FG##%	&r8   c                    | j                   |   \  }}|j                  j                         r |j                  |           y y rQ   )r  r9  r:  handlers)rv   r  chanr!  s       r6   on_readablezMultiChannelPoller.on_readable=  s<    %%f-
d88!DMM$! "r8   c                    |t         z  r| j                  |      | fS |t        z  r$| j                  |   \  }}|j	                  |       y y rQ   )r   rL  r   r  _poll_error)rv   r  eventrK  r!  s        r6   handle_eventzMultiChannelPoller.handle_eventB  sM    4<##F+T11S[))&1JD$T" r8   c                   d| _         	 | j                  D ]W  }|j                  r+|j                  j	                         r| j                  |       |j                  sG| j                  |       Y | j                  j                  |      }|rc|D ]^  \  }}| j                  ||      }|s d| _         | j                  r0	 | j                  j                         } |        | j                  r/y y  | j                          t               # t        $ r Y y w xY w# d| _         | j                  r@	 | j                  j                         } |        n# t        $ r Y w w xY w| j                  r?w w xY w)NTF)_in_protected_readr  r8  r9  r:  r0  r;  r6  r  r   rP  r  rq   r  rB  r   )	rv   callbackrE   rS   eventsr  rO  r   funs	            r6   rF  zMultiChannelPoller.getI  sR   "&	>> 3(({{..0,,W5//))'23 [[%%g.F%+ MFE++FE:C ',D#////--/C E // '')'M   	 ',D#////--/C E    //s[   AD AD )D >D	 .D 		DDE--EE-	EE-EE-+E-c                    | j                   S rQ   )r  r   s    r6   fdszMultiChannelPoller.fdsg  s    r8   rQ   )r>   r?   r@   rA   r   r   r   rR  r  r   r  r  r  r  r#  r  r+  r0  r6  r<  r@  rB  rH  rL  rP  rF  propertyrW  rB   r8   r6   r  r    s    /J  J
 #$(4L>#!/&"
#<    r8   r  c                      e Zd ZdZeZdZdZdZdZdZ	dZ
dZdZdZi ZdZdZd	Zd
ZdZdZdZeZdZdZdZdZdZdZeZdZ dZ!dZ"dZ#dZ$dZ%e&jN                  jP                  dz   Z(e)re)jT                  ndZ+e)re)jX                  ndZ- fdZ.d Z/d Z0d Z1	 dAdZ2dA fd	Z3d Z4 fdZ5d Z6 fdZ7d Z8d Z9d Z:d Z;d Z<d  Z=d! Z>dBd"Z?d# Z@d$ ZAd% ZBd& ZCd' ZDd( ZEd) ZFd* ZGdAd+ZHd, ZId- ZJd. ZKd/ ZLd0 ZM fd1ZNd2 ZOd3 ZP	 	 dCd4ZQdAd5ZRdAd6ZSdAd7ZTd8 ZUeVdDd9       ZWeXd:        ZYeXd;        ZZe[d<        Z\e[d=        Z]d> Z^d? Z_eXd@        Z` xZaS )EChannelzRedis Channel.NFTz_kombu.binding.%sz/{db}.zunackedunacked_indexunacked_mutexi,  i  r   r   round_robin)sepack_emulationr   r   r   r   r   r?  fanout_prefixfanout_patternsrs   socket_timeoutsocket_connect_timeoutsocket_keepalivesocket_keepalive_optionsqueue_order_strategymax_connectionshealth_check_intervalretry_on_timeoutpriority_stepsc                8   t        |   |i | | j                  st        j                  | _        d| _         t        | j                               | _        | j                         | _
        | j                         | _        t               | _        t               | _        i | _        | j"                  | j$                  d| _        | j(                  r,t+        | j(                  t,              r| j(                  | _        nd| _        	 | j0                  j3                          | j8                  j:                  j=                  |        d| _        | j8                  j>                  | _        t@        tA        | tB               y y # t4        $ r | j7                           w xY w)NF)rl   r2  r   T)"r   r   r`  r   r   _registeredr   rg  _queue_cycle_get_clientClient_get_response_errorr5   r  r;  auto_delete_queues_fanout_to_queue_brpop_read_receiverJ  ra  
isinstancert   keyprefix_fanoutrK   ping	Exception_disconnect_poolsr   cycler  r#   r   rT   r   s      r6   r   zChannel.__init__  sN   $)&)!!{{DH DM$*C*CDF&&(!557$'E!"%% ""&"2"2dmmL$,,c2(,(:(:% %'D!	KK
 	!!$' "&!B!B*&AB +  	""$	s   E> >Fc                $    | j                          y rQ   )rz  r   s    r6   rR   zChannel._after_fork  s     r8   c                    | j                   }| j                  }d x| _        | _         ||j                          ||j                          y y rQ   )_pool_async_pool
disconnect)rv   pool
async_pools      r6   rz  zChannel._disconnect_pools  sL    zz%%
(,,4:OO!!!# "r8   c                    | j                   |u rd | _         | j                  |u rd | _        | j                  r=| j                  j                  r&| j                  j                  j	                  |       y y y rQ   )r-  r4  r   r{  r  r  s     r6   r  z!Channel._on_connection_disconnect  sZ    ==J& DM??j("DO??t44OO!!;;JG  5?r8   c                N   	 	 d|d   d<   d|d   d   d<   | j                  ||      D ]O  }| j                  |d      } |r|j                  n|j                  | j                  ||      t        |             Q y # t         $ r Y pw xY w# t        $ r t        d|d	       Y y w xY w)
NTheadersredelivered
propertiesr   FreversezCould not restore message: %rexc_info)	r  _lookup_get_message_prioritylpushrpush
_q_for_prir   ry  crit)rv   payloadr   r   r   r   queuepris           r6   r   zChannel._do_restore_message  s    	J48	"=1HL%o6}E h< 00%0H7xTZZOOE3/w    	J0'DI	Js/   A; A$B
 ;	BB
 BB
 
B$#B$c                      j                   st         	  |      S |j                   fd} j	                         5 }|j                  | j                         d d d        y # 1 sw Y   y xY w)Nc                    | j                  j                        }| j                          | j                  j                         |r.t	        t        |            \  }}}j                  ||||        y y rQ   )r   r   r   r   r   r   r   )r   Pr   r   r   r   rv   r   s        r6   r   z-Channel._restore.<locals>.restore_transaction,  sh    		$**C0AJJLIId&&,!,q/2	2r((BD(C r8   )r`  r   _restorer   r   r   r   )rv   r   r   r   rK   r   r   s   ` `  @r6   r  zChannel._restore'  sm    !!7#G,,""	D !!# 	Fv2D4D4DE	F 	F 	Fs   A))A2c                (    | j                  |d      S r   )r  )rv   r   s     r6   _restore_at_beginningzChannel._restore_at_beginning7  s    }}Wt}44r8   c                    || j                   v r<| j                   |   \  }}| j                  j                  |       || j                  |<   t	        |   |g|i |}| j                          |S rQ   )_fanout_queuesr;  r  rs  r   basic_consume_update_queue_cycle)rv   r  rw   r   r   r&  r   r   s          r6   r  zChannel.basic_consume:  su    D'''--e4KHa%%))%0.3D!!(+g#E;D;F; 	  "
r8   c                    | j                   }|ra|j                  j                  r:|j                  j                  j	                  t        | j                  |f            S | j                  |      S y rQ   )r   r{  rR  r  r  r   _basic_cancel)rv   consumer_tagr   s      r6   basic_cancelzChannel.basic_cancelN  sh    
 __
22!''2266D..@  %%l33 r8   c                v   	 | j                   |   }	 | j                  j                  |       | j	                  |       	 | j
                  |   \  }}| j                  j                  |       t        | %  |      }| j                          |S # t        $ r Y y w xY w# t        $ r Y iw xY w# t        $ r Y Jw xY wrQ   )_tag_to_queuer  r;  remove_unsubscribe_fromr  rs  rq   r   r  r  )rv   r  r  r   r&  r   r   s         r6   r  zChannel._basic_cancel[  s    	&&|4E	*%%,,U3 ""5)	--e4KHa!!%%h/ g"<0  "
  		  		  		s4   B B  -B, 	BB	B)(B),	B87B8c                    |r+| j                   rdj                  | j                  |d|g      S dj                  | j                  |g      S )Nr   /)rb  joinrw  )rv   r   r   s      r6   _get_publish_topiczChannel._get_publish_topico  sE    4//77D118S+NOOww--x899r8   c                J    | j                   |   \  }}| j                  ||      S rQ   )r  r  )rv   r  r   r   s       r6   _get_subscribe_topiczChannel._get_subscribe_topict  s*     $ 3 3E :+&&x==r8   c                    | j                   D cg c]  }| j                  |       }}|sy | j                  }|j                  j                  |j                  j                          |j                  | _        |j                  |       y c c}w rQ   )r;  r  r3  r   r  r  r4  
psubscribe)rv   r  keyscs       r6   r5  zChannel._subscribex  s{    !668 ))%0 8 8NN<<%LL  ",,	T8s   Bc                    | j                  |      }| j                  }|j                  r*|j                  j                  r|j	                  |g       y y y rQ   )r  r3  r   r  unsubscribe)rv   r  topicr  s       r6   r  zChannel._unsubscribe_from  sC    ))%0NN<<ALL..MM5'" /<r8   c                    t        |d         dk(  r|d   dk(  rd|_        y t        |d         dk(  r|d   |d   |d   |d   f\  }}}}n|d   d |d   |d   f\  }}}}||||dS )	Nr   r  rj   Fpmessager   r   )r!  patternrS   data)r   
subscribed)rv   rK   rr!  r  rS   r  s          r6   _handle_messagezChannel._handle_message  s    !.1Q419 %F!++,Q41qtQqT+A(D'7D+,Q4qtQqT+A(D'7D	
 	
r8   c                v   | j                   }g }	 |j                  | j                  |             |j                  e|j                  j                  d      rI|j                  | j                  |             |j                  |j                  j                  d      rIt        |      S # t        $ r Y w xY w)Nr   rD   )r3  r   _receive_oner   r   can_readany)rv   r  r   s      r6   ru  zChannel._receive  s    NN	JJt((+, ll&1<<+@+@+@+KJJt((+, ll&1<<+@+@+@+K3x	  		s    B, ,	B87B8c                l   d }	 |j                         }t        |t        t
        f      r| j                  ||      }t        |d         j                  d      rt        |d         }|d   rt|d   dk(  r|j                  d      \  }}}	 t        t        |d               }|j!                  dd
      d   }| j"                  j%                  || j&                  |          yy y y # | j                  $ r	 d | _         w xY w# t        t        f$ r& t        d|t        |      d d	 d
       t               w xY w)Nr!  r   rS   r  r   r  .z&Cannot process event on channel %r: %si   r   r  T)r   r#   r4  rv  rp   tupler  r   endswith	partitionr   r  r  warningreprr   splitr   _deliverrs  )rv   r  responser  rS   r&  r   r   s           r6   r  zChannel._receive_one  sK   	'')H hu.**1h7GGFO,55i@&wy'9:6?qzS((/(9(9#(>1g&"'WV_(E"F
  '}}S!4Q7HOO,,!6!6x!@B # A / %% 	"DO	 &z2 & H 'gu)=K#g&s   C# 
C> #C;>5D3c           	        | j                   j                  t        | j                              }|sy | j                  D cg c]  }|D ]  }| j                  ||        c}}|xs dgz   }| j                  j                  | _        dg|}| j                  r| j                  j                  |      } | j                  j                  j                  |  y c c}}w )Nr   rl   )rn  consumer   r8  rk  r  rK   r   r-  rs   r|   send_command)rv   rE   queuesr  r  r  command_argss          r6   r.  zChannel._brpop_start  s    ""**3t/A/A+BC7;7J7J %#% s+ %+ %(/1~6..'$'  ;;33LAL+++\:%s    Cc                   	 	  | j                   j                  | j                   j                  dfi |}|r|\  }}t        |      j                  | j                  d      d   }| j                  j                  |       | j                  j                  t        t        |            |       	 d | _        yt               # | j                  $ r& | j                   j                  j	                           w xY w# d | _        w xY w)Nrl   r   r   T)rK   r   r   r#   r  r   rsplitr_  rn  rotater  r   r-  r   )rv   r   
dest__itemdestitems        r6   rt  zChannel._brpop_read  s    	!7T[[778N8N8?C:AC
 '
d#D)001=a@!!((.((|D/A)BDI !DM g ))  &&113	 !DMs#   2C  A8C8 6
C8  5C55C8 8	Dc                    |dk(  r| j                   j                          y | j                  j                  | j                  j                  |       y )Nr2  )r3  r   rK   r   )rv   r!  r   s      r6   rN  zChannel._poll_error  s8    8NN))+KK&&t{{'='=tDr8   c                    | j                         5 }| j                  D ]D  }|j                  | j                  ||            }|s't	        t        |            c cd d d        S  t               # 1 sw Y   y xY wrQ   )r   rk  rpopr  r   r   r   )rv   r  rK   r  r  s        r6   _getzChannel._get  st    !!# 	v** 5{{4??5##>? d!344		 	5 'M	 	s   3A/A/$A//A8c           	     V   | j                         5 }|j                         5 }| j                  D ]#  }|j                  | j	                  ||            }% |j                         }t        d |D              cd d d        cd d d        S # 1 sw Y   nxY w	 d d d        y # 1 sw Y   y xY w)Nc              3  T   K   | ]   }t        |t        j                        r| " y wrQ   )rv  numbersIntegral).0sizes     r6   	<genexpr>z Channel._size.<locals>.<genexpr>  s)      BD(w/?/?@   Bs   &()r   r   rk  llenr  r   sum)rv   r  rK   r   r  sizess         r6   _sizezChannel._size  s    !!# 	Bv" Bd.. BC99T__UC%@ADB BE B B	B B	B 	BB B B	B 	B 	Bs#   BAB	6	B	B	BB(c                P    | j                  |      }|r| | j                   | S |S rQ   )priorityr_  )rv   r  r  s      r6   r  zChannel._q_for_pri  s/    mmC WTXXJse,,r8   c                >    | j                   }|t        ||      dz
     S )Nr   )rk  r   )rv   nstepss      r6   r  zChannel.priority  s$    ##VE1%)**r8   c                    | j                  |d      }| j                         5 }|j                  | j                  ||      t	        |             ddd       y# 1 sw Y   yxY w)zDeliver message.Fr  N)r  r   r  r  r   )rv   r  r   r   r  rK   s         r6   _putzChannel._put  s[    ((%(@!!# 	FvLL4eGnE	F 	F 	Fs   ,AA"c                    | j                         5 }|j                  | j                  ||      t        |             ddd       y# 1 sw Y   yxY w)zDeliver fanout message.N)r   publishr  r   )rv   r   r   r   r   rK   s         r6   _put_fanoutzChannel._put_fanout	  sH    !!# 	vNN''+>g	 	 	s   ,AAc                @    |r| j                   j                  |       y y rQ   )rr  r  )rv   r  auto_deleter   s       r6   
_new_queuezChannel._new_queue  s    ##''. r8   c           
     \   | j                  |      j                  dk(  r!||j                  dd      f| j                  |<   | j	                         5 }|j                  | j                  |fz  | j                  j                  |xs d|xs d|xs dg             d d d        y # 1 sw Y   y xY w)Nfanout#*r   )	typeofr!  replacer  r   saddkeyprefix_queuer_  r  )rv   r   r   r  r  rK   s         r6   _queue_bindzChannel._queue_bind  s    ;;x %%1 +--c37*D& !!# 	6vKK,,{:{'8b'.}"',{'4 56	6 	6 	6s   A	B""B+c           
        | j                   j                  |       | j                  |j                  d            5 }|j	                  | j
                  |fz  | j                  j                  |xs d|xs d|xs dg             |j                         5 }| j                  D ]#  }	|j                  | j                  ||	            }% |j                          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NrK   r   r   )rr  r  r   rF  sremr  r_  r  r   rk  deleter  r   )
rv   r  r   r   r  rw   r   rK   r   r  s
             r6   _deletezChannel._delete!  s    ''.!!H)=!> 	&KK,,{:{'8b'.}"',{'4 56 " d.. DC;;tuc'BCDD	 	
 	 	s%   AC6AC*C6*C3	/C66C?c           	     D   | j                         5 }|j                         5 }| j                  D ]#  }|j                  | j	                  ||            }% t        |j                               cd d d        cd d d        S # 1 sw Y   nxY w	 d d d        y # 1 sw Y   y xY wrQ   )r   r   rk  existsr  r  r   )rv   r  r   rK   r   r  s         r6   
_has_queuezChannel._has_queue-  s    !!# 	+v" +d.. DC;;tuc'BCDD4<<>*+ +	+ 	++ + +	+ 	+ 	+s#   BAB -	B B		BBc           	     (   | j                   |z  }| j                         5 }|j                  |      }|sg cd d d        S |D cg c]/  }t        t	        |      j                  | j                              1 c}cd d d        S c c}w # 1 sw Y   y xY wrQ   )r  r   smembersr  r   r  r_  )rv   r   r   rK   r
  vals         r6   	get_tablezChannel.get_table4  s    ""X-!!# 	Pv__S)F 	P 	P IOOE,s+11$((;<O	P 	P P	P 	Ps"   BB4B7BBBc                v   | j                         5 }|j                         5 }| j                  D ]4  }| j                  ||      }|j	                  |      j                  |      }6 |j                         }t        |d d d         cd d d        cd d d        S # 1 sw Y   nxY w	 d d d        y # 1 sw Y   y xY w)Nrj   )r   r   rk  r  r  r  r   r  )rv   r  rK   r   r  priqr  s          r6   _purgezChannel._purge>  s    !!# 	'v" 'd.. 8C??5#6D99T?11$7D8 51:' '	' 	'' ' '	' 	' 	's#   B/A$B	B/B"	B//B8c                   d| _         | j                  r	 | j                          | j                  s| j
                  j                  j                  |        | j                  j                  d      }|3| j                  D ]$  }|| j                  v s| j                  ||       & | j                          | j                          t        | A          y # t        $ r Y w xY w)NTrK   r   )_closingr-  rt  r   closedr   r{  r  rE  rF  r  rr  queue_deleterz  _close_clientsr   r  )rv   rK   r  r   s      r6   r  zChannel.closeG  s    ==  " {{OO!!))$/ ]]&&x0F!!00 @E 7 77))%)?@ ""$!  s   C 	C"!C"c                    dD ]6  }	 | j                   |   }|j                  d c}|_        |j                          8 y # t        t        | j
                  f$ r Y Vw xY w)N)rK   r3  )rE  r   r  r  r  r5   )rv   attrrK   r   s       r6   r  zChannel._close_clients\  sf    ) 	Dt,060A0A4-
F-%%'		
 nd.@.@A s   3=AAc                    t        |t        j                        s2|r|dk(  rt        }n|j	                  d      r|dd  }	 t        |      }|S |S # t        $ r t        dj                  |            w xY w)Nr  r   z/Database is int between 0 and limit - 1, not {})rv  r  r  
DEFAULT_DB
startswithintr  format)rv   vhosts     r6   _prepare_virtual_hostzChannel._prepare_virtual_hostf  s    %!1!12ESL"!!#&ab	E
 u   ELL s    A $A3c                    |S rQ   rB   )rv   re  rf  paramss       r6   _filter_tcp_connparamszChannel._filter_tcp_connparamsu  s    r8   c                   | j                   j                  }|j                  xs d|j                  xs | j                   j                  |j
                  |j                  |j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  d}| j                  }t!        |d      rW|g}t!        |d      r|t#        |j$                        z  }|D ]  }t'        |j(                  d      s n |j+                  d       |j,                  r+	 |j/                  |j,                         | j0                  |d<   |d   }d|v rt5        |      \  }}	}	}
}}}|d	k(  ro | j6                  di |} |j.                  t8        j:                  d
|z   dfi | |j+                  dd        |j+                  dd        |j+                  dd        |
|d<   ||d<   |j+                  dd        |j+                  dd        | j=                  |j+                  dd             |d<   | |j?                  d      xs | j                  }|r G fdd|      }|}||d<   |S # t2        $ r Y 'w xY w)Nz	127.0.0.1)hostportvirtual_hostusernamepasswordrh  rc  rd  re  rf  ri  rj  r   	__bases__ri  connection_classr  z://r,   r  )r  pathrd  re  rf  r  r  r  r  dbc                  "     e Zd Z fdZ xZS )'Channel._connparams.<locals>.Connectionc                Z    t        |   |  j                  rj                  |        y y rQ   )r   r  rm  r  )rv   rw   r   rS   s     r6   r  z2Channel._connparams.<locals>.Connection.disconnect  s.    G&- **99$? +r8   )r>   r?   r@   r  r   )r   rS   s   @r6   
Connectionr#    s    @ @r8   r%  rB   ) r   rK   hostnamer  default_portr  useridr  rh  rc  rd  re  rf  ri  rj  r  r)   rp   r  r   r   rq   sslupdateconnection_class_sslr  r   r  r   UnixDomainSocketConnectionr  rF  )rv   asynchronousconninfo
connparams
conn_classclassesklassr  schemer&  r  r  r   queryconnection_clsr%  rS   s                   @r6   _connparamszChannel._connparamsy  s   ??))%%4MMAT__%A%A$11  ))#33"11&*&A&A $ 5 5(,(E(E%)%?%? $ 5 5

 **
 :z* "lGz;/4
 4 455  8#ENN4KL8 67<<!!(,,/151J1J
-. &!D=<Ft<L9FAq(HdE!8T88F:F
!
!!(-(H(H$J#( 2+02 7>14894@%-Jz"%-Jz"NN64(NN64(55NN>402
4 NN-. "!! 	
 @^ @ (N)7
%&Q  s   7*I< <	J	J	c                v    |r| j                  | j                        S | j                  | j                        S )N)r   )rp  r  r  )rv   r-  s     r6   _create_clientzChannel._create_client  s/    ;;t;??{{499{55r8   c                    | j                  |      }| j                  j                  |d         | _        t        j                  di |S )Nr-  r!  r!  rB   )r6  rw  r  r   ConnectionPoolrv   r-  r  s      r6   	_get_poolzChannel._get_pool  sI    !!|!< $ 5 5 < <t < M##-f--r8   c                    t         j                  dk  rt        dj                  t                     | j                  r%t        j                  t        | j                        S t         j                  S )N)r   rj   r   zSRedis transport requires redis-py versions 3.2.0 or later. You have {0.__version__}r   )	r   r   r   r  rs   	functoolspartialr   r   r   s    r6   ro  zChannel._get_client  s_    ==9$!++16%=: :   $$#!%!6!6 
 {{r8   c              #  >   K   |r| y | j                          y wrQ   r8  rv   rK   s     r6   r   zChannel.conn_or_acquire  s     L%%''s   c                \    | j                   | j                         | _         | j                   S rQ   )r~  r>  r   s    r6   r  zChannel.pool  s$    ::)DJzzr8   c                `    | j                   | j                  d      | _         | j                   S )NTr:  )r  r>  r   s    r6   r  zChannel.async_pool  s-    ##~~4~@Dr8   c                &    | j                  d      S )z+Client used to publish messages, BRPOP etc.Tr:  rC  r   s    r6   rK   zChannel.client  s     """55r8   c                F    | j                  d      }|j                         S )z1Pub/Sub connection used to consume fanout queues.Tr:  )r8  r   rD  s     r6   r3  zChannel.subclient  s#     $$$$7}}r8   c                N    | j                   j                  | j                         y rQ   )rn  r*  r8  r   s    r6   r  zChannel._update_queue_cycle   s      !3!34r8   c                &    ddl m} |j                  S )Nr   r&   )r   r'   r5   )rv   r'   s     r6   rq  zChannel._get_response_error  s    $'''r8   c                \    | j                   D ch c]  }|| j                  vr| c}S c c}w )z<Set of queues being consumed from (excluding fanout queues).)_active_queuesr;  )rv   r  s     r6   r8  zChannel.active_queues  s7     $(#6#6 ;% 9 99  ; 	; ;s   )r   )r   r   rQ   )br>   r?   r@   rA   r   _client
_subclientr  supports_fanoutr  rw  r_  r-  r4  r  r`  r   r   r   r   r?  r   PRIORITY_STEPSrk  rc  rd  re  rf  rj  rh  DEFAULT_HEALTH_CHECK_INTERVALri  ra  rb  rs   rg  r  r~  r   rZ  from_transport_optionsr   r%  r  SSLConnectionr+  r   rR   rz  r  r   r  r  r  r  r  r  r  r5  r  r  ru  r  r.  rt  rN  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r6  r8  r>  ro  r   r   rX  r  r  r   rK   r3  r  rq  r8  r   r   s   @r6   rZ  rZ  l  s]   
CGJHO)O
CHJNMK'' #NN!#O9 M O
 4 )KE 	..		 0 ,1u''d275..T&CP!
$H ,1J"F 5(4(:
>	#
 	 2;!,EB+F/
6
+P'* 7;8<Ob6
.
 ( (  
    
 6 6  
5( ; ;r8   rZ  c                       e Zd ZdZeZdZeZdZdZ	e
j                  j                  j                  d eg d            Zer
 e       \  ZZ fdZd Zd	 Zd
 Z xZS )r+   zRedis Transport.Nr   T)directr  r  )r-  exchange_typec                d    t         t        d      t        |   |i | t	               | _        y )Nz)Missing redis library (pip install redis))r   ImportErrorr   r   r  r{  r   s      r6   r   zTransport.__init__   s2    =IJJ$)&) ()
r8   c                "    t         j                  S rQ   )r   __version__r   s    r6   driver_versionzTransport.driver_version(  s       r8   c                  	 | j                   j                  j                         j                  j                  | j
                  	fd}|_        	fdj                  j                         j                  dj                         |j                  j                  j                  dt              }j                  |j                         y )Nc                    | j                   rj                  | j                          j                  r	 j                  j                         y y # t        $ r Y y w xY wrQ   )r  r  rW  on_tickr  )r   r{  loopr<  s    r6   _on_disconnectz:Transport.register_with_event_loop.<locals>._on_disconnect2  sW    J,,- yyLL''6    s   A 	AAc                 b             j                   D  cg c]  }  | |        c}  y c c} w rQ   )rW  )r  
add_readerr{  cycle_poll_startrL  s    r6   r<  z9Transport.register_with_event_loop.<locals>.on_poll_start?  s'    7<yyAZK,AAs   ,r   ri  )r{  r@  r  r<  rb  rL  r  r^  r  call_repeatedlyrB  rK   transport_optionsrF  rQ  rH  )
rv   r   r_  r`  ri  rb  r{  rc  r<  rL  s
     `  @@@@@r6   register_with_event_loopz"Transport.register_with_event_loop+  s    

4;;' ..__
&&
	 +9'	B 	'R!=!=> * 1 1 C C G G#)!
 	!..	
r8   c                :    | j                   j                  |       y)z1Handle AIO event for one of our file descriptors.N)r{  rL  )rv   r  s     r6   rL  zTransport.on_readableM  s    

v&r8   )r>   r?   r@   rA   rZ  polling_intervalDEFAULT_PORTr'  driver_typedriver_namer   r+   
implementsextend	frozensetr   r7   r#   r$   r   r[  rf  rL  r   r   s   @r6   r+   r+     su    GLKK""--44 => 5 J
 ,C,E)>*! 
D'r8   r+   c                      e Zd ZdZy)SentinelManagedSSLConnectionzConnect to a Redis server using Sentinel + TLS.

        Use Sentinel to identify which Redis server is the current master
        to connect to and when connecting to the Master server, use an
        SSL Connection.
        Nr=   rB   r8   r6   rp  rp  S  s    	 	r8   rp  c                  j    e Zd ZdZej
                  dz   Zerej                  ndZere	ndZ
ddZddZy)SentinelChannela  Channel with explicit Redis Sentinel knowledge.

    Broker url is supposed to look like:

    .. code-block::

        sentinel://0.0.0.0:26379;sentinel://0.0.0.0:26380/...

    where each sentinel is separated by a `;`.

    Other arguments for the sentinel should come from the transport options
    (see `transport_options` of :class:`~kombu.connection.Connection`).

    You must provide at least one option in Transport options:
     * `master_name` - name of the redis group to poll

    Example:
    -------
    .. code-block:: python

        >>> import kombu
        >>> c = kombu.Connection(
             'sentinel://sentinel1:26379;sentinel://sentinel2:26379',
             transport_options={'master_name': 'mymaster'}
        )
        >>> c.connect()
    )master_namemin_other_sentinelssentinel_kwargsNc           	        | j                  |      }|j                         }|j                  dd        |j                  dd        g }| j                  j                  j
                  D ]^  }t        |      }|j                  dk(  s|j                  xs | j                  j                  }|j                  |j                  |f       ` |s|j                  |d   |d   f       t        j                  |ft        | dd      t        | dd       d|}t        | dd       }|t        d	      |j!                  |t"        j$                        j&                  S )
Nr  r  r   rt  r   ru  )rt  ru  rs  z1'master_name' transport option must be specified.)r6  copyrq   r   rK   altr   r3  r  r'  r   r&  r   Sentinelr'  r  
master_forr   r   r   )	rv   r-  r/  additional_params	sentinelsurlr  sentinel_instrs  s	            r6   _sentinel_managed_poolz&SentinelChannel._sentinel_managed_pool  sQ   %%l3
&OO-fd+fd+	??))-- 	7CS/CzzZ'xx?4??#?#?  #,,!56		7 j0*V2DEF ))! '.CQ G#D*;TB!  	! dM48C  ''KK
 /	r8   c                    | j                  |      }| j                  j                  |d         | _        | j                  |      S )Nr:  r!  r;  )r6  rw  r  r  r=  s      r6   r>  zSentinelChannel._get_pool  sF    !!|!< $ 5 5 < <t < M**<88r8   r   )r>   r?   r@   rA   rZ  rR  r   SentinelManagedConnectionr  rp  r+  r  r>  rB   r8   r6   rr  rr  `  sH    8 %;; ? 
 >Fx994;C7#J9r8   rr  c                      e Zd ZdZdZeZy)SentinelTransportzRedis Sentinel Transport.ig  N)r>   r?   r@   rA   r'  rr  rZ  rB   r8   r6   r  r    s    #LGr8   r  )RrA   
__future__r   r@  r  r,   r   collectionsr   
contextlibr   importlib.metadatar   r  r   r	   packaging.versionr
   viner   kombu.exceptionsr   r   	kombu.logr   kombu.utils.compatr   kombu.utils.encodingr   kombu.utils.eventior   r   r   kombu.utils.functionalr   kombu.utils.jsonr   r   kombu.utils.objectsr   kombu.utils.schedulingr   kombu.utils.urlr   r   r   r   r(  rX  r   loggercriticalr  r  ri  r  rQ  rP  r"   r7   r:   ry  r<   rO   rT   rV   r   r   rK   r   r   PubSubr   r   r  rZ  r+   r  rS  rp  rr  r  rB   r8   r6   <module>r     s  3j #     " % &   %  @   2 - / / 3 ) / 0 & .)01A)BggFV)V&

 
+	,g
 " . 1 (4&4	 4  ,P
 P
f
. 

>0%,,2G2G 
>1K%,,-- 1Khh/'++ h/V_  _ D_
;goo _
;DA'!! A'H 
..
M9g M9`	 w*  .E)-&.  Hs$   G# ,G3 #	G0/G03G>=G>