Ë
    Ü_ËiSt  ã            
      ó¼  — U d 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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 ddlmZ ddl m!Z! ddl"m#Z#  G d„ de«      Z$ e$ e%d«      Ž Z&e&jN                  e&jP                  fZ)de*d<   eee   gee   f   Z+ G d„ d«      Z,e!jZ                  e&jP                  e!j\                  e&j^                  e!j`                  e&jb                  e!jd                  e&jb                  e!jf                  e&jb                  iZ4	 	 	 	 	 	 dd„Z5	 	 	 	 	 	 dd„Z6	 	 	 	 	 	 	 	 	 	 	 	 dd„Z7	 	 	 	 	 	 	 	 dd„Z8	 	 	 	 	 	 	 	 d d„Z9d!d„Z:y)"zŒRepresent a deployment of MongoDB servers.

.. seealso:: This module is compatible with both the synchronous and asynchronous PyMongo APIs.
é    )Úannotations)Úsample)ÚAnyÚCallableÚListÚMappingÚMutableMappingÚ
NamedTupleÚOptionalÚcast©ÚMinKey)ÚObjectId)Úcommon)ÚConfigurationErrorÚPyMongoError)ÚPrimaryÚReadPreferenceÚ_AggWritePrefÚ_ServerMode)ÚServerDescription)Ú	Selection)ÚSERVER_TYPE)Ú_Addressc                  óJ   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   y)	Ú_TopologyTypeÚintÚSingleÚReplicaSetNoPrimaryÚReplicaSetWithPrimaryÚShardedÚUnknownÚLoadBalancedN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú_/var/www/pod-logistic/pod-api/venv/lib/python3.12/site-packages/pymongo/topology_description.pyr   r   -   s#   … ØƒKØÓØÓØƒLØƒLØÔr)   r   é   ztuple[int, int]ÚSRV_POLLING_TOPOLOGIESc                  ó¶  — e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zdd„Zdd„Zd d„Zd!d„Z	e
d"d„«       Ze
d#d	„«       Ze
d$d
„«       Ze
d%d„«       Ze
d&d„«       Ze
d%d„«       Ze
d'd„«       Ze
d(d„«       Ze
d'd„«       Ze
d'd„«       Ze
d%d„«       Ze
d"d„«       Ze
d"d„«       Zd)d„Z	 d*	 	 	 d+d„Z	 	 	 d,	 	 	 	 	 	 	 	 	 d-d„Zej8                  fd.d„Zd(d„Zd#d„Zy)/ÚTopologyDescriptionc                óž  — || _         || _        || _        || _        || _        t        | j                  j                  «       «      | _        || _        d| _	        | j                   t        j                  k7  r| j                  «        | j                  }|sd| _        yt        d„ |D «       «      rd| _        yt!        d„ |D «       «      | _        y)aÛ  Representation of a deployment of MongoDB servers.

        :param topology_type: initial type
        :param server_descriptions: dict of (address, ServerDescription) for
            all seeds
        :param replica_set_name: replica set name or None
        :param max_set_version: greatest setVersion seen from a primary, or None
        :param max_election_id: greatest electionId seen from a primary, or None
        :param topology_settings: a TopologySettings
        Nc              3  ó8   K  — | ]  }|j                   d u –— Œ y ­w©N©Úlogical_session_timeout_minutes©Ú.0Úss     r*   ú	<genexpr>z/TopologyDescription.__init__.<locals>.<genexpr>l   s   è ø€ ÒU¸q�×2Ñ2°dÔ:ÑUùó   ‚c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr1   r2   r4   s     r*   r7   z/TopologyDescription.__init__.<locals>.<genexpr>o   s   è ø€ ò +Ø67�×1Õ1ñ+ùó   ‚)Ú_topology_typeÚ_replica_set_nameÚ_server_descriptionsÚ_max_set_versionÚ_max_election_idÚlistÚvaluesÚ_candidate_serversÚ_topology_settingsÚ_incompatible_errÚTOPOLOGY_TYPEr#   Ú_init_incompatible_errÚreadable_serversÚ_ls_timeout_minutesÚanyÚmin)ÚselfÚtopology_typeÚserver_descriptionsÚreplica_set_nameÚmax_set_versionÚmax_election_idÚtopology_settingsrG   s           r*   Ú__init__zTopologyDescription.__init__@   sÆ   € ð& ,ˆÔØ!1ˆÔØ$7ˆÔ!Ø /ˆÔØ /ˆÔÜ"& t×'@Ñ'@×'GÑ'GÓ'IÓ"JˆÔð #4ˆÔð "&ˆÔØ×Ñ¤-×"<Ñ"<Ò<Ø×'Ñ'Ô)ð  ×0Ñ0ÐÙØ'+ˆDÕ$ÜÑUÐDTÔUÔUØ'+ˆDÕ$ä'*ñ +Ø;Kô+ó (ˆDÕ$r)   c                óN  — | j                   j                  «       D �]  }|j                  sŒ|j                  duxr |j                  t        j
                  kD  }|j                  duxr |j                  t        j                  k  }|rEd|j                  d   |j                  d   xs d|j                  t        j
                  fz  | _	        Œ²|sŒµd|j                  d   |j                  d   xs d|j                  t        j                  t        j                  fz  | _	         y y)z>Internal compatibility check for non-load balanced topologies.Nz]Server at %s:%d requires wire version %d, but this version of PyMongo only supports up to %d.r   é   zgServer at %s:%d reports wire version %d, but this version of PyMongo requires at least %d (MongoDB %s).)r=   rA   Úis_server_type_knownÚmin_wire_versionr   ÚMAX_SUPPORTED_WIRE_VERSIONÚmax_wire_versionÚMIN_SUPPORTED_WIRE_VERSIONÚaddressrD   ÚMIN_SUPPORTED_SERVER_VERSION)rK   r6   Úserver_too_newÚserver_too_olds       r*   rF   z*TopologyDescription._init_incompatible_errs   s1  € à×*Ñ*×1Ñ1Ó3ó +	ˆAØ×)Ò)Øð ×"Ñ"¨$Ð.ò KØ×&Ñ&¬×)JÑ)JÑJð ð ×"Ñ"¨$Ð.ò KØ×&Ñ&¬×)JÑ)JÑJð ñ ðAð Ÿ	™	 !™ØŸ	™	 !™Ò)¨Ø×*Ñ*Ü×9Ñ9ð	ñð Õ&ò  ðLð Ÿ	™	 !™ØŸ	™	 !™Ò)¨Ø×*Ñ*Ü×9Ñ9Ü×;Ñ;ðñð Ô&ñ ñW+	r)   c                óF   — | j                   rt        | j                   «      ‚y)z®Raise ConfigurationError if any server is incompatible.

        A server is incompatible if its wire protocol version range does not
        overlap with PyMongo's.
        N)rD   r   ©rK   s    r*   Úcheck_compatiblez$TopologyDescription.check_compatible¢   s#   € ð ×!Ò!Ü$ T×%;Ñ%;Ó<Ð<ð "r)   c                ó   — || j                   v S r1   )r=   )rK   rZ   s     r*   Ú
has_serverzTopologyDescription.has_server«   s   € Ø˜$×3Ñ3Ð3Ð3r)   c                óT   — | j                   |   j                  «       }t        | |«      S )z;A copy of this description, with one server marked Unknown.)r=   Ú
to_unknownÚupdated_topology_description)rK   rZ   Ú
unknown_sds      r*   Úreset_serverz TopologyDescription.reset_server®   s(   € à×.Ñ.¨wÑ7×BÑBÓDˆ
Ü+¨D°*Ó=Ð=r)   c                ó6  — | j                   t        j                  k(  rt        j                  }n| j                   }| j                  D �ci c]  }|t        |«      “Œ }}t        ||| j                  | j                  | j                  | j                  «      S c c}w )z<A copy of this description, with all servers marked Unknown.)r;   rE   r    r   r=   r   r.   r<   r>   r?   rC   )rK   rL   rZ   Úsdss       r*   ÚresetzTopologyDescription.reset³   s‘   € à×Ñ¤-×"EÑ"EÒEÜ)×=Ñ=‰Mà ×/Ñ/ˆMð CG×B[ÑB[Ö\°wˆwÔ)¨'Ó2Ñ2Ð\ˆÐ\ä"ØØØ×"Ñ"Ø×!Ñ!Ø×!Ñ!Ø×#Ñ#ó
ð 	
ùò ]s   Á	Bc                ó6   — | j                   j                  «       S )z[dict of (address,
        :class:`~pymongo.server_description.ServerDescription`).
        )r=   Úcopyr_   s    r*   rM   z'TopologyDescription.server_descriptionsÆ   s   € ð ×(Ñ(×-Ñ-Ó/Ð/r)   c                ó   — | j                   S )zThe type of this topology.)r;   r_   s    r*   rL   z!TopologyDescription.topology_typeÌ   s   € ð ×"Ñ"Ð"r)   c                ó<   — t         j                  | j                     S )zUThe topology type as a human readable string.

        .. versionadded:: 3.4
        )rE   Ú_fieldsr;   r_   s    r*   Útopology_type_namez&TopologyDescription.topology_type_nameÑ   s   € ô ×$Ñ$ T×%8Ñ%8Ñ9Ð9r)   c                ó   — | j                   S )zThe replica set name.)r<   r_   s    r*   rN   z$TopologyDescription.replica_set_nameÙ   s   € ð ×%Ñ%Ð%r)   c                ó   — | j                   S )z1Greatest setVersion seen from a primary, or None.)r>   r_   s    r*   rO   z#TopologyDescription.max_set_versionÞ   ó   € ð ×$Ñ$Ð$r)   c                ó   — | j                   S )z1Greatest electionId seen from a primary, or None.)r?   r_   s    r*   rP   z#TopologyDescription.max_election_idã   rs   r)   c                ó   — | j                   S )z)Minimum logical session timeout, or None.)rH   r_   s    r*   r3   z3TopologyDescription.logical_session_timeout_minutesè   s   € ð ×'Ñ'Ð'r)   c                óv   — | j                   j                  «       D �cg c]  }|j                  sŒ|‘Œ c}S c c}w )z)List of Servers of types besides Unknown.)r=   rA   rU   ©rK   r6   s     r*   Úknown_serversz!TopologyDescription.known_serversí   s/   € ð  ×4Ñ4×;Ñ;Ó=ÖX�aÀ×AWÓAW’ÒXÐXùÒXó   �6¯6c                óV   — t        d„ | j                  j                  «       D «       «      S )z7Whether there are any Servers of types besides Unknown.c              3  ó:   K  — | ]  }|j                   sŒ|–— Œ y ­wr1   )rU   r4   s     r*   r7   z8TopologyDescription.has_known_servers.<locals>.<genexpr>õ   s   è ø€ Ò[˜ÀA×DZÓDZ”1Ñ[ùs   ‚”)rI   r=   rA   r_   s    r*   Úhas_known_serversz%TopologyDescription.has_known_serversò   s$   € ô Ñ[˜d×7Ñ7×>Ñ>Ó@Ô[Ó[Ð[r)   c                óv   — | j                   j                  «       D �cg c]  }|j                  sŒ|‘Œ c}S c c}w )zList of readable Servers.)r=   rA   Úis_readablerw   s     r*   rG   z$TopologyDescription.readable_servers÷   s-   € ð  ×4Ñ4×;Ñ;Ó=ÖO�aÀÇÃ’ÒOÐOùÒOry   c                ó   — | j                   S )z0List of Servers excluding deprioritized servers.)rB   r_   s    r*   Úcandidate_serversz%TopologyDescription.candidate_serversü   s   € ð ×&Ñ&Ð&r)   c                óX   — | j                   }|rt        d„ | j                   D «       «      S y)z3Minimum of all servers' max wire versions, or None.c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr1   )rX   r4   s     r*   r7   z:TopologyDescription.common_wire_version.<locals>.<genexpr>  s   è ø€ ÒF¨a�q×)Õ)ÑFùr:   N)rx   rJ   ©rK   Úserverss     r*   Úcommon_wire_versionz'TopologyDescription.common_wire_version  s,   € ð ×$Ñ$ˆÙÜÑF°4×3EÑ3EÔFÓFÐFàr)   c                ó.   — | j                   j                  S r1   )rC   Úheartbeat_frequencyr_   s    r*   r‡   z'TopologyDescription.heartbeat_frequency
  s   € à×&Ñ&×:Ñ:Ð:r)   c                ó.   — | j                   j                  S r1   )rC   Ú_srv_max_hostsr_   s    r*   Úsrv_max_hostsz!TopologyDescription.srv_max_hosts  s   € à×&Ñ&×5Ñ5Ð5r)   c                ó˜  — |sg S g }|j                   D ]S  }|j                  €*d|j                  › d| › d|j                   › �}t        |«      ‚|j	                  |j                  «       ŒU t        |«      }| j                  j                  dz  }|j                   D �cg c]$  }t        t        |j                  «      |z
  |k  r|‘Œ& c}S c c}w )Nzround_trip_time for server z is unexpectedly None: z, servers: g     @�@)
rM   Úround_trip_timerZ   r   ÚappendrJ   rC   Úlocal_threshold_msr   Úfloat)rK   Ú	selectionÚround_trip_timesÚserverÚconfig_err_msgÚfastestÚ	thresholdr6   s           r*   Ú_apply_local_thresholdz*TopologyDescription._apply_local_threshold  sñ   € ÙØˆIØ(*ÐØ×3Ñ3ò 	<ˆFØ×%Ñ%Ð-Ø#>¸v¿~¹~Ð>NÐNeÐfjÐekÐkvð  xA÷  xUñ  xUð  wVð  "W�Ü(¨Ó8Ð8Ø×#Ñ# F×$:Ñ$:Õ;ð		<ô Ð&Ó'ˆØ×+Ñ+×>Ñ>ÀÑGˆ	ð ×2Ñ2ö
àÜ”U˜A×-Ñ-Ó.°Ñ8¸YÒFò ò
ð 	
ùò 
s   Â)CNc                óê   — |s| j                   | _        y|D �ch c]  }|j                  ’Œ }}| j                   D �cg c]  }|j                  |vr|‘Œ }}|xs | j                   | _        yc c}w c c}w )zBFilter out deprioritized servers from a list of server candidates.N)rx   rB   rZ   )rK   Údeprioritized_serversÚsdÚdeprioritized_addressesr’   Úfiltereds         r*   Ú_filter_serversz#TopologyDescription._filter_servers$  s   € ñ %Ø&*×&8Ñ&8ˆDÕ#à<QÖ&R°b r§z£zÐ&RÐ#Ð&Rð #×0Ñ0öàØ—>‘>Ð)@Ñ@ò ðˆHð ð
 '/Ò&D°$×2DÑ2DˆDÕ#ùò 'Sùòs
   ™A+¼A0c                ó–  — t        |dd«      r8| j                  }|r*||j                  k  rt        d||j                  |fz  «      ‚t	        |t
        «      r|j                  | «       | j                  t        j                  k(  rg S | j                  t        j                  t        j                  fv r| j                  S |r2| j                  «       j                  |«      }|r|j                  r|gS g S | j!                  |«       | j                  t        j"                  k(  r‰t%        |«      t&        u rx| j(                  D ]0  }|j*                  t,        j.                  k(  sŒ!|g}|r ||«      }|c S  |r5|D ]0  }|j*                  t,        j.                  k(  sŒ!|g}|r ||«      }|c S  g S t1        j2                  | «      }	| j                  t        j4                  k7  r: ||	«      }	|	s0|r.| j!                  d«       t1        j2                  | «      }	 ||	«      }	|�#|	r!|	j7                   ||	j                  «      «      }	| j9                  |	«      S )aœ  List of servers matching the provided selector(s).

        :param selector: a callable that takes a Selection as input and returns
            a Selection as output. For example, an instance of a read
            preference from :mod:`~pymongo.read_preferences`.
        :param address: A server address to select.
        :param custom_selector: A callable that augments server
            selection rules. Accepts a list of
            :class:`~pymongo.server_description.ServerDescription` objects and
            return a list of server descriptions that should be considered
            suitable for the desired operation.

        .. versionadded:: 3.4
        rV   r   zF%s requires min wire version %d, but topology's min wire version is %dN)Úgetattrr…   rV   r   Ú
isinstancer   Úselection_hookrL   rE   r"   r   r#   rx   rM   ÚgetrU   rœ   r    Útyper   rB   Úserver_typer   Ú	RSPrimaryr   Úfrom_topology_descriptionr!   Úwith_server_descriptionsr–   )
rK   ÚselectorrZ   Úcustom_selectorr˜   Ú	common_wvÚdescriptionr™   ri   r�   s
             r*   Úapply_selectorz"TopologyDescription.apply_selector3  s3  € ô* �8Ð/°Ô3Ø×0Ñ0ˆIÙ˜Y¨×)BÑ)BÒBÜ(ð*Ø-5°x×7PÑ7PÐR[Ð,\ñ]óð ô
 �h¤Ô.Ø×#Ñ# DÔ)à×Ñ¤×!6Ñ!6Ò6ØˆIØ×Ñ¤M×$8Ñ$8¼-×:TÑ:TÐ#UÑUà×%Ñ%Ð%Ùà×2Ñ2Ó4×8Ñ8¸ÓAˆKÙ$/°K×4TÒ4T�K�=Ð\ÐZ\Ð\à×ÑÐ2Ô3à×Ñ¤×!DÑ!DÒDÌÈhËÔ[bÑIbØ×-Ñ-ò �Ø—>‘>¤[×%:Ñ%:Ó:Ø˜$�CÙ&Ù-¨cÓ2˜Ø’Jðñ %Ø/ò #�BØ—~‘~¬×)>Ñ)>Ó>Ø!˜d˜Ù*Ù"1°#Ó"6˜CØ"š
ð#ð ˆIä×7Ñ7¸Ó=ˆ	à×Ñ¤×!6Ñ!6Ò6Ù  Ó+ˆIáÑ!6Ø×$Ñ$ TÔ*Ü%×?Ñ?ÀÓE�	Ù$ YÓ/�	ð Ð&©9Ø!×:Ñ:Ù 	× =Ñ =Ó>óˆIð ×*Ñ*¨9Ó5Ð5r)   c                ób   — t        j                  d|«       t        | j                  |«      «      S )a¾  Does this topology have any readable servers available matching the
        given read preference?

        :param read_preference: an instance of a read preference from
            :mod:`~pymongo.read_preferences`. Defaults to
            :attr:`~pymongo.read_preferences.ReadPreference.PRIMARY`.

        .. note:: When connected directly to a single server this method
          always returns ``True``.

        .. versionadded:: 3.4
        Úread_preference)r   Úvalidate_read_preferencerI   r«   )rK   r­   s     r*   Úhas_readable_serverz'TopologyDescription.has_readable_server‚  s+   € ô 	×'Ñ'Ð(9¸?ÔKÜ�4×&Ñ& Ó7Ó8Ð8r)   c                ó@   — | j                  t        j                  «      S )zÉDoes this topology have a writable server available?

        .. note:: When connected directly to a single server this method
          always returns ``True``.

        .. versionadded:: 3.4
        )r¯   r   ÚPRIMARYr_   s    r*   Úhas_writable_serverz'TopologyDescription.has_writable_server’  s   € ð ×'Ñ'¬×(>Ñ(>Ó?Ð?r)   c                óÚ   — t        | j                  j                  «       d„ ¬«      }dj                  | j                  j
                  | j                  j                  | j                  |«      S )Nc                ó   — | j                   S r1   )rZ   )r™   s    r*   ú<lambda>z.TopologyDescription.__repr__.<locals>.<lambda>ž  s
   € ÈBÏJÉJ€ r)   )Úkeyz-<{} id: {}, topology_type: {}, servers: {!r}>)	Úsortedr=   rA   ÚformatÚ	__class__r$   rC   Ú_topology_idrp   rƒ   s     r*   Ú__repr__zTopologyDescription.__repr__œ  sY   € ä˜×2Ñ2×9Ñ9Ó;ÑAVÔWˆØ>×EÑEØ�N‰N×#Ñ#Ø×#Ñ#×0Ñ0Ø×#Ñ#Øó	
ð 	
r)   )rL   r   rM   ú!dict[_Address, ServerDescription]rN   úOptional[str]rO   úOptional[int]rP   úOptional[ObjectId]rQ   r   ÚreturnÚNone)rÀ   rÁ   )rZ   r   rÀ   Úbool)rZ   r   rÀ   r.   )rÀ   r.   )rÀ   r¼   )rÀ   r   )rÀ   Ústr)rÀ   r½   )rÀ   r¾   )rÀ   r¿   )rÀ   úlist[ServerDescription])rÀ   rÂ   )r�   zOptional[Selection]rÀ   rÄ   r1   )r˜   ú!Optional[list[ServerDescription]]rÀ   rÁ   )NNN)
r§   r   rZ   zOptional[_Address]r¨   zOptional[_ServerSelector]r˜   rÅ   rÀ   rÄ   )r­   r   rÀ   rÂ   ) r$   r%   r&   rR   rF   r`   rb   rg   rj   rM   ÚpropertyrL   rp   rN   rO   rP   r3   rx   r|   rG   r€   r…   r‡   rŠ   r–   rœ   r«   r   r±   r¯   r²   r»   r(   r)   r*   r.   r.   ?   sþ  „ ð1àð1ð ?ð1ð (ð	1ð
 'ð1ð ,ð1ð ð1ð 
ó1óf-ó^=ó4ó>ó

ó&0ð ò#ó ð#ð ò:ó ð:ð ò&ó ð&ð ò%ó ð%ð ò%ó ð%ð ò(ó ð(ð òYó ðYð ò\ó ð\ð òPó ðPð ò'ó ð'ð òó ðð ò;ó ð;ð ò6ó ð6ó
ð& JNðEØ%FðEà	óEð$ '+Ø59ØCGðM6àðM6ð $ðM6ð 3ð	M6ð
  AðM6ð 
!óM6ð^ BP×AWÑAWô 9ó @ô
r)   r.   c                óÆ  — |j                   }| j                  }| j                  }| j                  }| j                  }|j
                  }| j                  «       }|||<   |t        j                  k(  rs|�I||j                  k7  r:t        dj                  ||j                  «      «      }	|j                  |	¬«      ||<   t        t        j                  ||||| j                  «      S |t        j                  k(  r’|t        j                   t        j"                  fv rEt%        | j                  j&                  «      dk(  rt        j                  }n=|j)                  |«       n+|t        j                  t        j*                  fvr	t,        |   }|t        j.                  k(  r6|t        j0                  t        j                  fv�rŠ|j)                  |«       �nw|t        j2                  k(  r |t        j                   t        j0                  fv r|j)                  |«       �n/|t        j4                  k(  rt7        |||||«      \  }}}}�n|t        j8                  t        j:                  t        j<                  fv rÕt?        |||«      \  }}nÄ|t        j@                  k(  r±|t        j                   t        j0                  fv r|j)                  |«       tC        |«      }nr|t        j4                  k(  rt7        |||||«      \  }}}}nJ|t        j8                  t        j:                  t        j<                  fv rtE        |||«      }ntC        |«      }t        |||||| j                  «      S )an  Return an updated copy of a TopologyDescription.

    :param topology_description: the current TopologyDescription
    :param server_description: a new ServerDescription that resulted from
        a hello call

    Called after attempting (successfully or not) to call hello on the
    server at server_description.address. Does not modify topology_description.
    zeclient is configured to connect to a replica set named '{}' but this node belongs to a set named '{}')ÚerrorrT   )#rZ   rL   rN   rO   rP   r£   rM   rE   r   r   r¸   rd   r.   rC   r"   r   Ú
StandaloneÚLoadBalancerÚlenÚseedsÚpopÚRSGhostÚ_SERVER_TYPE_TO_TOPOLOGY_TYPEr!   ÚMongosr   r¤   Ú_update_rs_from_primaryÚRSSecondaryÚ	RSArbiterÚRSOtherÚ!_update_rs_no_primary_from_memberr    Ú_check_has_primaryÚ#_update_rs_with_primary_from_member)
Útopology_descriptionÚserver_descriptionrZ   rL   Úset_namerO   rP   r£   ri   rÈ   s
             r*   re   re   ³  s  € ð !×(Ñ(€Gð )×6Ñ6€MØ#×4Ñ4€HØ*×:Ñ:€OØ*×:Ñ:€OØ$×0Ñ0€Kð ×
2Ñ
2Ó
4€Cð &€Cˆ�Làœ×,Ñ,Ò,àÐ HÐ0B×0SÑ0SÒ$SÜ&ðAßAGÁØÐ0×AÑAóBóˆEð .×8Ñ8¸uÐ8ÓEˆC�‰Lä"Ü× Ñ ØØØØØ ×3Ñ3ó
ð 	
ð œ×-Ñ-Ò-Øœ;×1Ñ1´;×3KÑ3KÐLÑLÜÐ'×:Ñ:×@Ñ@ÓAÀQÒFÜ -× 4Ñ 4‘ð —‘˜Õ Ø¤×!4Ñ!4´k×6IÑ6IÐ JÑJÜ9¸+ÑFˆMàœ×-Ñ-Ò-Øœ{×1Ñ1´;×3FÑ3FÐGÒGØ�G‰G�GÖà	œ-×;Ñ;Ò	;Øœ;×1Ñ1´;×3EÑ3EÐFÑFØ�G‰G�GÖàœK×1Ñ1Ò1ÜJaØ�XÐ1°?ÀOóKÑGˆ]˜H o²ð œ[×4Ñ4´k×6KÑ6KÌ[×M`ÑM`ÐaÑaÜ&GØ�XÐ1ó'Ñ#ˆM™8ð 
œ-×=Ñ=Ò	=Øœ;×1Ñ1´;×3EÑ3EÐFÑFØ�G‰G�GÔÜ.¨sÓ3‰MàœK×1Ñ1Ò1ÜJaØ�XÐ1°?ÀOóKÑGˆ]˜H o±ð œ[×4Ñ4´k×6KÑ6KÌ[×M`ÑM`ÐaÑaÜ?ÀÀXÐOaÓb‰Mô /¨sÓ3ˆMô ØØØØØØ×/Ñ/óð r)   c           	     ó°  — | j                   t        v sJ ‚| j                  «       }t        |j	                  «       «      t        |«      k(  r| S t        |j	                  «       «      D ]  }||vsŒ|j                  |«       Œ | j                  dk7  rmt        |«      t        |j	                  «       «      z
  }| j                  t        |«      z
  }|dkD  r)t        t        |«      t        |t        |«      «      «      }ng }|D ]  }||vsŒt        |«      ||<   Œ t        | j                   || j                  | j                  | j                   | j"                  «      S )zÞReturn an updated copy of a TopologyDescription.

    :param topology_description: the current TopologyDescription
    :param seedlist: a list of new seeds new ServerDescription that resulted from
        a hello call
    r   )rL   r,   rM   ÚsetÚkeysr@   rÍ   rŠ   rË   r   r·   rJ   r   r.   rN   rO   rP   rC   )rØ   Úseedlistri   rZ   Ú	new_hostsÚn_to_adds         r*   Ú)_updated_topology_description_srv_pollingrá     s=  € ð  ×-Ñ-Ô1GÑGÐGÐGà
×
2Ñ
2Ó
4€Cô ˆ3�8‰8‹:ƒœ#˜h›-Ò'Ø#Ð#ô ˜Ÿ™›
Ó#ò ˆØ˜(Ò"Ø�G‰G�GÕðð ×)Ñ)¨QÒ.Ü˜“M¤C¨¯©«
£OÑ3ˆ	Ø'×5Ñ5¼¸C»Ñ@ˆØ�aŠ<Üœf YÓ/´°X¼sÀ9»~Ó1NÓO‰HàˆHàò 6ˆØ˜#ÒÜ,¨WÓ5ˆC�ŠLð6ô Ø×*Ñ*ØØ×-Ñ-Ø×,Ñ,Ø×,Ñ,Ø×/Ñ/óð r)   c                óÚ  — |€|j                   }n9||j                   k7  r*| j                  |j                  «       t        | «      |||fS |j                  �|j                  dk  r›|j
                  |j                  f}||f}d|vrQd|vrA||k  r<|j                  t        d|› d|› �«      «      | |j                  <   t        | «      |||fS |j                  }|j
                  �·|�|j
                  |kD  r¦|j
                  }n™|j                  |j
                  f}||f}t        d„ |D «       «      }t        d„ |D «       «      }||k  r<|j                  t        d|› d|› �«      «      | |j                  <   t        | «      |||fS |j                  }|j
                  }| j                  «       D ]a  }	|	j                  t        j                  u sŒ |	j                  |j                  k7  sŒ:|	j                  t        d«      «      | |	j                  <    n |j                  D ]  }
|
| vsŒt        |
«      | |
<   Œ t!        | «      |j                  z
  D ]  }| j                  |«       Œ t        | «      |||fS )ag  Update topology description from a primary's hello response.

    Pass in a dict of ServerDescriptions, current replica set name, the
    ServerDescription we are processing, and the TopologyDescription's
    max_set_version and max_election_id if any.

    Returns (new topology type, new replica_set_name, new max_set_version,
    new max_election_id).
    Né   z<primary marked stale due to electionId/setVersion mismatch, z is stale compared to c              3  ó8   K  — | ]  }|€
t        «       n|–— Œ y ­wr1   r   ©r5   Úis     r*   r7   z*_update_rs_from_primary.<locals>.<genexpr>t  ó   è ø€ Ò![À1¨a¨i¤&¤(¸QÓ">Ñ![ùr8   c              3  ó8   K  — | ]  }|€
t        «       n|–— Œ y ­wr1   r   rå   s     r*   r7   z*_update_rs_from_primary.<locals>.<genexpr>u  rç   r8   z6primary marked stale due to discovery of newer primary)rN   rÍ   rZ   rÖ   rX   Úset_versionÚelection_idrd   r   ÚtuplerA   r£   r   r¤   Ú	all_hostsr   rÜ   )ri   rN   rÙ   rO   rP   Únew_election_tupleÚmax_election_tupleÚnew_election_safeÚmax_election_safer’   Únew_addressÚaddrs               r*   rÑ   rÑ   F  s×  € ð  ÐØ-×>Ñ>Ñà	Ð/×@Ñ@Ò	@ð 	�‰Ð"×*Ñ*Ô+Ü! #Ó&Ð(8¸/È?ÐZÐZà×*Ñ*Ð2Ð6H×6YÑ6YÐ\^Ò6^Ø%7×%CÑ%CÐEW×EcÑEcÐ$dÐØ%4°oÐ$FÐØÐ)Ñ)ØÐ-Ñ-Ð2DÐGYÒ2Yà2D×2OÑ2OÜ ØVÐWiÐVjð  kAð  BTð  AUð  Vóó3�Ð&×.Ñ.Ñ/ô
 *¨#Ó.Ð0@À/ÐSbÐbÐbØ0×<Ñ<ˆOà×)Ñ)Ð5ØÐ#Ð'9×'EÑ'EÈÒ'Wà0×<Ñ<‰Oà/×;Ñ;Ð=O×=[Ñ=[Ð[ÐØ,¨oÐ=ÐÜ!Ñ![ÐHZÔ![Ó[ÐÜ!Ñ![ÐHZÔ![Ó[ÐØÐ0Ò0à.@×.KÑ.KÜØRÐSeÐRfÐf|ð  ~Pð  }Qð  Róó/ˆCÐ"×*Ñ*Ñ+ô
 & cÓ*Ð,<¸oÈÐ^Ð^à0×<Ñ<ˆOØ0×<Ñ<ˆOð —*‘*“,ò ˆà×Ñ¤+×"7Ñ"7Ò7Ø—‘Ð"4×"<Ñ"<Ó<ð #)×"3Ñ"3ÜÐUÓVó#ˆC�—‘Ññ
 ðð *×3Ñ3ò >ˆØ˜cÒ!Ü0°Ó=ˆC�Òð>ô
 �C“Ð-×7Ñ7Ñ7ò ˆØ�‰��ðô
 ˜sÓ#Ð%5°ÈÐXÐXr)   c                ó
  — |€J ‚||j                   k7  r&| j                  |j                  «       t	        | «      S |j                  r4|j                  |j                  k7  r| j                  |j                  «       t	        | «      S )zØRS with known primary. Process a response from a non-primary.

    Pass in a dict of ServerDescriptions, current replica set name, and the
    ServerDescription we are processing.

    Returns new topology type.
    )rN   rÍ   rZ   ÚmerÖ   )ri   rN   rÙ   s      r*   r×   r×   ž  s   € ð Ð'Ð'Ð'àÐ-×>Ñ>Ò>Ø�‰Ð"×*Ñ*Ô+ô
 ˜cÓ"Ð"ð	 
×	Ò	Ð#5×#=Ñ#=ÐAS×AVÑAVÒ#VØ�‰Ð"×*Ñ*Ô+ô ˜cÓ"Ð"r)   c                ól  — t         j                  }|€|j                  }n.||j                  k7  r| j                  |j                  «       ||fS |j
                  D ]  }|| vsŒt        |«      | |<   Œ |j                  r4|j                  |j                  k7  r| j                  |j                  «       ||fS )zòRS without known primary. Update from a non-primary's response.

    Pass in a dict of ServerDescriptions, current replica set name, and the
    ServerDescription we are processing.

    Returns (new topology type, new replica_set_name).
    )rE   r   rN   rÍ   rZ   rì   r   rô   )ri   rN   rÙ   rL   rZ   s        r*   rÕ   rÕ   µ  s»   € ô "×5Ñ5€MØÐØ-×>Ñ>Ñà	Ð/×@Ñ@Ò	@Ø�‰Ð"×*Ñ*Ô+ØÐ.Ð.Ð.ð &×/Ñ/ò 6ˆØ˜#ÒÜ,¨WÓ5ˆC�ŠLð6ð ×ÒÐ!3×!;Ñ!;Ð?Q×?TÑ?TÒ!TØ�‰Ð"×*Ñ*Ô+àÐ*Ð*Ð*r)   c                óª   — | j                  «       D ]1  }|j                  t        j                  k(  sŒ!t        j
                  c S  t        j                  S )z—Current topology type is ReplicaSetWithPrimary. Is primary still known?

    Pass in a dict of ServerDescriptions.

    Returns new topology type.
    )rA   r£   r   r¤   rE   r    r   )ri   r6   s     r*   rÖ   rÖ   Õ  sE   € ð �Z‰Z‹\ò 1ˆØ�=‰=œK×1Ñ1Ó1Ü ×6Ñ6Ò6ð1ô ×0Ñ0Ð0r)   N)rØ   r.   rÙ   r   rÀ   r.   )rØ   r.   rÞ   zlist[tuple[str, Any]]rÀ   r.   )ri   ú+MutableMapping[_Address, ServerDescription]rN   r½   rÙ   r   rO   r¾   rP   r¿   rÀ   z<tuple[int, Optional[str], Optional[int], Optional[ObjectId]])ri   r÷   rN   r½   rÙ   r   rÀ   r   )ri   r÷   rN   r½   rÙ   r   rÀ   ztuple[int, Optional[str]])ri   z$Mapping[_Address, ServerDescription]rÀ   r   );Ú__doc__Ú
__future__r   Úrandomr   Útypingr   r   r   r   r	   r
   r   r   Úbson.min_keyr   Úbson.objectidr   Úpymongor   Úpymongo.errorsr   r   Úpymongo.read_preferencesr   r   r   r   Úpymongo.server_descriptionr   Úpymongo.server_selectorsr   Úpymongo.server_typer   Úpymongo.typingsr   r   ÚrangerE   r"   r!   r,   r'   Ú_ServerSelectorr.   rÐ   r¤   r    rÒ   r   rÓ   rÔ   rÏ   re   rá   rÑ   r×   rÕ   rÖ   r(   r)   r*   ú<module>r     sì  ðòõ #å ÷	÷ 	ó 	õ  Ý "Ý ß ;ß XÓ XÝ 8Ý .Ý +Ý $ô�Jô ñ ™u Q›xÐ(€ð ,9×+@Ñ+@À-×BWÑBWÐ*XÐ ˜Ó Xð ˜DÐ!2Ñ3Ð4°dÐ;LÑ6MÐMÑN€÷e
ñ e
ðV ×Ñ˜×-Ñ-Ø×Ñ˜=×>Ñ>Ø×Ñ˜]×>Ñ>Ø×Ñ˜=×<Ñ<Ø×Ñ˜×:Ñ:ð!Ð ðeØ-ðeØCTðeàóeðP(Ø-ð(Ø9Nð(àó(ðVUYØ	4ðUYà#ðUYð *ðUYð #ð	UYð
 (ðUYð BóUYðp#Ø	4ð#à#ð#ð *ð#ð 	ó	#ð.+Ø	4ð+à#ð+ð *ð+ð ó	+ô@1r)   