
    h                     v   d Z ddlZddlZddlZddlZddlmZmZmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZmZ ddlmZ 	 ddlmZ d	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Z'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3e*de+de,diZ4ddd d!Z5d"Z6 ed#$      Z7d% Z8d& Z9d' Z:d( Z; eg d)      Z< eg d*      Z=	 	 dtd+Z>d, Z? G d- d.e@      ZA G d/ d0e@      ZB G d1 d2eA      ZC G d3 d4eB      ZD G d5 d6eE      ZF ej                  d7      j                  ZId8ZJd9 ZKd: ZL ej                  d;      j                  ZMd< ZN ej                  d=      j                  ZOd> ZPd? ZQd@ ZRerej                  ZR	 dudAZTdB ZUdC ZVdD ZWerej                  ZW	 dudEZY ej                  dF      j                  ZZ ej                  dG      j                  Z[dH Z\dI Z]dJ Z^erej                  Z^	 dudKZ_dL Z`	 dvdMZa	 dwdNZberej                  Zb	 dvdOZd ej                  dP      j                  ZedQ ZfdR ZgdS Zherej                  ZhdudTZjdU ZkdV Zl	 dxdWZm	 dydXZndY Zo G dZ d[e@      Zpd\Zq G d] d^ep      Zrd_ Zsd` Zterej                  Zte*dae+dbe,dciZudd Zvde Zwerej                  Zwdf Zxdg Zyerej                  Zydh Zzdi Z{dj Z|erej                  Z|dk Z}erej                  Z}dl Z~dm Zdn Z G do dpe@      Z G dq dre@      Zej                  ej                  ej                  ej                  iZds Zy# e$ r d
ZY w xY w)zzTools for creating `messages
<http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol>`_ to be sent to
MongoDB.

.. note:: This module is for internal use and is generally not needed by
   application developers.
    N)CodecOptionsdecodeencode_dict_to_bson_make_c_string)DEFAULT_CODEC_OPTIONS)_inflate_bsonDEFAULT_RAW_BSON_OPTIONS)bStringIOSON)	_cmessageTF)ConfigurationErrorCursorNotFoundDocumentTooLargeExecutionTimeoutInvalidOperationNotMasterErrorOperationFailureProtocolError)DEFAULT_READ_CONCERN)ReadPreference)WriteConcernii   i?                   s            s           s       s   documents     s   updates     s   deletes     	documentsupdatesdeletes)insertupdatedeletez%s.%sreplace)unicode_decode_error_handlerc                  >    t        j                  t        t              S )z(Generate a pseudo random 32 bit integer.)randomrandint	MIN_INT32	MAX_INT32 r   R/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/pymongo/message.py_randintr0   Z   s    >>)Y//r   c                     |j                   }|j                  }|rB|t        j                  j                   k7  st	        |      dkD  rd| vrt        d| fg      } || d<   | S )z-Add $readPreference to spec when appropriate.r   $query$readPreference)modedocumentr   SECONDARY_PREFERREDlenr   )specread_preferencer4   r5   s       r/   _maybe_add_read_preferencer:   _   sg    D''H N66;;;MA44()*D"*Kr   c                 F    t        |       | j                  j                  dS )z<Convert an Exception into a failure document for publishing.)errmsgerrtype)str	__class____name__)	exceptions    r/   _convert_exceptionrB   q   s"    )n **335 5r   c                    |j                  dd      }d|d}|j                  d|j                  dd            }|rG|j                  d      r|d	dd
id|d<   n*d|j                  dd      |d}d|v r|d   |d<   |g|d<   |S | dk(  rt        |d         |d<   |S | dk(  rbd|v rd|d   dg|d<   |S |j                  d      du r=|dk(  r8|d   d   }|d   j                  d|d   j                  d            }d|dg|d<   |S )z6Convert a legacy write result to write command format.nr   r   )okrD   r<   err wtimeout@   T)r<   codeerrInfowriteConcernErrorrJ      )indexrJ   r<   rK   writeErrorsr$   r!   r%   upserted)rN   _idupdatedExistingFr"   urQ   q)getr7   )		operationcommandresultaffectedresr<   errorr%   rQ   s	            r/   _convert_write_resultr\   w   s^    zz#q!H
"CZZ&**UB"78F::j!28024>3E(GC#$
  #ZZ2%'E F"#))#4i "'CJHw{+,C J 
h	)*6*3EFGC
O J ZZ)*e3A Y'*F+//%)?@C)*378C
OJr   ))tailabler   )oplogReplayrM   )noCursorTimeout   )	awaitData    )allowPartialResults   ))r2   filter)z$orderbysort)z$hinthint)z$commentcomment)z$maxScanmaxScan)z
$maxTimeMS	maxTimeMS)z$maxmax)z$minmin)z
$returnKey	returnKey)z$showRecordIdshowRecordId)z$showDiskLocrn   )z	$snapshotsnapshotc                 z   t        d| fg      }d|v rr|j                  |j                         D cg c]  \  }}|t        v rt        |   |fn||f c}}       d|v r|j	                  d       d|v r|j	                  d       n||d<   |r||d<   |r||d<   |rt        |      |d<   |d	k  rd
|d<   |r||d<   |j                  r|	r|	j                  s|j                  |d<   |r||d<   |
|
|d<   |r=|j                  t        j                         D cg c]  \  }}||z  r|d
f c}}       |S c c}}w c c}}w )z!Generate a find command document.findr2   $explainr3   re   
projectionskiplimitr   TsingleBatch	batchSizereadConcern	collationallowDiskUse)
r   r%   items
_MODIFIERSpopabslevelin_transactionr5   _OPTIONS)collr8   rs   rt   ru   
batch_sizeoptionsread_concernry   sessionallow_disk_usecmdkeyvalopts                  r/   _gen_find_commandr      sg    ~
C4

$(JJL2 S /2Z.?Z_c*c3ZO 2 	3GGJ#GG%&H&LF5zG19!%C%K7w/E/E)22M$K!,N

$,NN$4& S} $K & 	' J=24&s   !D1
D7
c                 D    t        d| fd|fg      }|r||d<   |||d<   |S )z$Generate a getMore command document.getMore
collectionrw   rj   r   )	cursor_idr   r   max_await_time_msr   s        r/   _gen_get_more_commandr      sB    
	9%d#% &C%K$,KJr   c                   <    e Zd ZdZdZdZdZd Zd Zd Z	d Z
d	dZy)
_QueryzA query operation.)flagsdbr   ntoskipr8   fieldscodec_optionsr9   ru   r   namer   ry   r   clientr   _as_commandNc                     || _         || _        || _        || _        || _        || _        || _        || _        || _        |	| _	        |
| _
        || _        || _        || _        || _        d| _        d | _        y )Nrq   )r   r   r   r   r8   r   r   r9   r   ru   r   ry   r   r   r   r   r   )selfr   r   r   r   r8   r   r   r9   ru   r   r   ry   r   r   r   s                   r/   __init__z_Query.__init__   s     
		*.(
$",	r   c                 @    t         | j                  | j                  fz  S N_UJOINr   r   r   s    r/   	namespacez_Query.namespace	      $)),,,r   c                    d}|j                   dk\  r|sGd}nD| j                  j                  s.t        d| j                  j                  |j                   fz        |j                   dk  r%| j
                  t        d|j                   fz        |j                   dk  r%| j                  t        d|j                   fz        |j                  | j                  | j                         |S )NF   TzDread concern level of %s is not valid with a max wire version of %d.   zDSpecifying a collation is unsupported with a max wire version of %d.zESpecifying allowDiskUse is unsupported with a max wire version of %d.)
max_wire_versionr   ok_for_legacyr   r   ry   r   validate_sessionr   r   )r   	sock_infoexhaustuse_find_cmds       r/   use_commandz_Query.use_command  s    %%*#""00$1$$**--//0 0 %%)dnn.H$!$-$>$>#@AB B %%)d.A.A.M$!$-$>$>#@AB B 	""4;;=r   c                    | j                   | j                   S d| j                  v }t        | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                        }|rd| _        t        d|fg      }| j                  }|rl|j                  |d| j                          |sM|j"                  j$                  r7|j&                  +|j(                  s|j&                  |j+                  di       d<   |j-                  ||| j.                         | j.                  }|j0                  rH|j0                  j2                  s2|j0                  j5                  | j6                  |d| j8                        }|| j6                  f| _         | j                   S )z.Return a find command document for this query.rr   explainFrx   afterClusterTime)r   r8   r   r   r   r   ru   r   r   r   ry   r   r   r   r   	_apply_tor9   r   causal_consistencyoperation_timer   
setdefaultsend_cluster_timer   
_encrypter_bypass_auto_encryptionencryptr   r   )r   r   r   r   r   r   s         r/   
as_commandz_Query.as_command&  s    '###		)IItyy$++t||JJT5F5FNNDLL$*=*=? !DI	3'()C,,c5$*>*>? B B..:#22 +2*@*@ !2'&( 	##C$++>%%==##++eT%7%79C<r   c           
         |r| j                   dz  }n| j                   }| j                         }| j                  }|r}| j                  |      d   }|j                  rEt        d|| j                  | j                  |d| j                  |j                        \  }}}	}
|||	fS t        | j                  dfz  }d}nR| j                  dk(  xr dxs | j                  }| j                  r%|rt        | j                  |      }n| j                  }|j                  rt        || j                        }t!        ||| j"                  |||rd	n| j$                  | j                  |j                        S )
z6Get a query message, possibly setting the slaveOk bit.r   r   Fctx$cmdr   r   N)r   r   r8   r   op_msg_enabled_op_msgr   r9   r   compression_contextr   r   ru   rl   	is_mongosr:   queryr   r   )r   set_slave_okr   use_cmdr   nsr8   
request_idmsgsize_	ntoreturns               r/   get_messagez_Query.get_messageI  sM   JJNEJJE^^yy??9-a0D''+2tTWWd&:&: %););!55,7(
Cq "3,,477F++BI
 1,2EdooIzz #DJJ	 :I $

I-d.2.B.BDD UBi74''Y-J-JL 	Lr   F)r@   
__module____qualname____doc__	__slots__exhaust_mgrr   r   r   r   r   r   r.   r   r/   r   r      s4    GI KI ,-4! F&Lr   r   c                   8    e Zd ZdZdZdZd Zd Zd Zd Z	d
dZ
y	)_GetMorezA getmore operation.)r   r   r   r   r   r   r9   r   r   r   r   r   c                     || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        d | _
        y r   )r   r   r   r   r   r9   r   r   r   r   r   )r   r   r   r   r   r   r9   r   r   r   r   s              r/   r   z_GetMore.__init__{  sV     	""*.!2&r   c                 @    t         | j                  | j                  fz  S r   r   r   s    r/   r   z_GetMore.namespace  r   r   c                 v    |j                  | j                  | j                         |j                  dk\  xr | S )Nr   )r   r   r   r   )r   r   r   s      r/   r   z_GetMore.use_command  s2    ""4;;=))Q.>w;>r   c                 P   | j                   | j                   S t        | j                  | j                  | j                  | j
                        }| j                  r'| j                  j                  |d| j                         |j                  || j                  | j                         | j                  }|j                  rH|j                  j                  s2|j                  j                  | j                  |d| j                        }|| j                  f| _         | j                   S )z1Return a getMore command document for this query.F)r   r   r   r   r   r   r   r   r9   r   r   r   r   r   r   r   )r   r   r   r   s       r/   r   z_GetMore.as_command  s     '####DNNDII$(NN$($:$:< <<LL""3t/C/CD##Ct{{C%%==##++eT%7%79C<r   c           
         | j                         }|j                  }|r| j                  |      d   }|j                  r;t	        d|| j
                  ddd| j                  |j                        \  }}}	}
|||	fS t        | j
                  dfz  }t        d|dd|d| j                  |      S t        || j                  | j                  |      S )zGet a getmore message.r   NFr   r   r   )r   r   r   r   r   r   r   r   r   get_morer   r   )r   dummy0r   r   r   r   r8   r   r   r   r   s              r/   r   z_GetMore.get_message  s     ^^++??9-a0D''+2tTWWd5$"4"4!55,7(
Cq "3,,477F++BB2tT43E3E3OODNNDNNC@@r   Nr   )r@   r   r   r   r   r   r   r   r   r   r   r.   r   r/   r   r   r  s-    /I D -? ,Ar   r   c                   *     e Zd Z fdZd fd	Z xZS )_RawBatchQueryc                 .    t         t        |   ||       yNF)superr   r   )r   socket_infor   r?   s      r/   r   z_RawBatchQuery.use_command  s    nd/WEr   c                 .    t         t        |   ||d      S r   )r   r   r   r   r   r   r   r?   s       r/   r   z_RawBatchQuery.get_message  s    ^T6)U, 	,r   r   r@   r   r   r   r   __classcell__r?   s   @r/   r   r     s    , ,r   r   c                   &     e Zd Zd Zd fd	Z xZS )_RawBatchGetMorec                      yr   r.   )r   r   r   s      r/   r   z_RawBatchGetMore.use_command  s    r   c                 .    t         t        |   ||d      S r   )r   r   r   r   s       r/   r   z_RawBatchGetMore.get_message  s    %t8)U, 	,r   r   r   r   s   @r/   r   r     s    , ,r   r   c                   8    e Zd ZdZd Zed        Zd Zd Zd Z	y)_CursorAddresszEThe server address (host, port) of a cursor, with namespace property.c                 @    t         j                  | |      }||_        |S r   )tuple__new___CursorAddress__namespace)clsaddressr   r   s       r/   r   z_CursorAddress.__new__  s    }}S'*$r   c                     | j                   S )zThe namespace this cursor.)r   r   s    r/   r   z_CursorAddress.namespace  s     r   c                 >    | | j                   fz   j                         S r   )r   __hash__r   s    r/   r   z_CursorAddress.__hash__  s!     ((**4466r   c                     t        |t              r2t        |       t        |      k(  xr | j                  |j                  k(  S t        S r   )
isinstancer   r   r   NotImplementedr   others     r/   __eq__z_CursorAddress.__eq__  s<    e^,$K5</ :%//9;r   c                     | |k(   S r   r.   r   s     r/   __ne__z_CursorAddress.__ne__  s    5=  r   N)
r@   r   r   r   r   propertyr   r   r   r   r.   r   r/   r   r     s-    O
    7
!r   r   z<iiiiiiB   c           
          |j                  |      }t               }t        t        t	        |      z   |dd| t	        |      |j
                        }|||z   fS )zDTakes message data, compresses it, and adds an OP_COMPRESSED header.r   i  )compressr0   _pack_compression_header_COMPRESSION_HEADER_SIZEr7   compressor_id)rV   datar   
compressedr   headers         r/   	_compressr    s[    d#JJ% 3z?2	D	F v
***r   c           	          t        dg      }|j                  |       | j                  dd      }t        d|d   dz   dd|dt              S )z$Data to send to do a lastError.
    )getlasterrorr   .r   r   .$cmdr   N)r   r%   splitr   r   )r   argsr   splitnss       r/   __last_errorr    sT     "#
$CJJtooc1%GGAJ(!R,. .r   z<iiiic                 X    t               }t        dt        |      z   |d|       }|||z   fS )ztTakes message data and adds a message header based on the operation.

    Returns the resultant message string.
    r`   r   )r0   _pack_headerr7   )rV   r  ridmessages       r/   __pack_messager    s2    
 *C2D	>39=G$r   <ic                    t         }t        |      dk(  r5 ||d   ||      }dj                  dt        |       |g      t        |      fS |D cg c]  } ||||       }}|st	        d      dj                  t        |      t        |       dj                  |      g      t        t        t        |            fS c c}w )zGet an OP_INSERT messager   r   r   r    cannot do an empty bulk insert)r   r7   joinr   r   	_pack_intrk   map)collection_namedocs
check_keysr   optsr   encodeddocs           r/   _insertr%    s    F
4yA~a*d3xx?+  7|$ 	$
 9==vc:t,=G=?@@88%'  !S'!234 4 >s   B<c                 P    t        | ||||      \  }}t        d||      \  }}	||	|fS )z9Internal compressed unacknowledged insert message helper.  )r%  r  )
r  r   r!  continue_on_errorr"  r   	op_insertmax_bson_sizer  r   s
             r/   _insert_compressedr+  /  s?      'z+<d DI}y#.HC]""r   c                     t        | ||||      \  }}t        d|      \  }	}
|rt        | |      \  }	}}|	|
|z   |fS |	|
|fS )zInternal insert message helper.r'  )r%  r  r  )r  r   r!  safelast_error_argsr(  r"  r)  r*  r  r   gler   s                r/   _insert_uncompressedr0  8  sc      'z+<d DI}dI.HC"?ODS!C#I},,]""r   c           	      H    |rt        | |||||      S t        | ||||||      S )zGet an **insert** message.)r+  r0  )r  r   r!  r-  r.  r(  r"  r   s           r/   r$   r$   F  sC     !T:/@$M 	Mz4 /1BDJ Jr   c           
          d}|r|dz  }|r|dz  }t         } ||||      }	dj                  t        t        |       t	        |       ||d|      |	g      t        |	      fS )zGet an OP_UPDATE message.r   r   r   r   Fr   r  _ZERO_32r   r  r7   )
r  upsertmultir8   r$  r!  r"  r   r   encoded_updates
             r/   _updater8  P  sy    E

FCT2N88'%tUD! 
 n-. .r   c           	      T    t        | ||||||      \  }}	t        d||      \  }
}|
||	fS )z9Internal compressed unacknowledged update message helper.  )r8  r  )r  r5  r6  r8   r$  r!  r"  r   	op_updater*  r  r   s               r/   _update_compressedr<  a  sB      'c:t EI}y#.HC]""r   c	           	          t        | ||||||      \  }	}
t        d|	      \  }}|rt        | |      \  }}}|||z   |
fS |||
fS )zInternal update message helper.r:  )r8  r  r  )r  r5  r6  r8   r$  r-  r.  r!  r"  r;  r*  r  r   r/  r   s                  r/   _update_uncompressedr>  j  sf      'c:t EI}dI.HC"?ODS!C#I},,]""r   c
                 P    |	rt        | |||||||	      S t        | ||||||||	      S )zGet an **update** message.)r<  r>  )
r  r5  r6  r8   r$  r-  r.  r!  r"  r   s
             r/   r%   r%   x  sI     !VUD#z4N 	N #T?JN Nr   z<IBz<Bc                    t        |d|      }t        | d      }t        |      }d}	|r~t        d      }
t	        |      }|D cg c]  }t        |||       }}t        |      t        d |D              z   dz   }t        |      }||z  }t        d |D              }	|||
||g|z   }n||g}dj                  |      ||	fS c c}w )zGet a OP_MSG message.

    Note: this method handles multiple documents in a type one payload but
    it does not perform batch splitting and the total message size is
    only checked *after* generating the entire message.
    Fr   r   c              3   2   K   | ]  }t        |        y wr   r7   .0r$  s     r/   	<genexpr>z$_op_msg_no_header.<locals>.<genexpr>  s     !Cs#c(!C   r   c              3   2   K   | ]  }t        |        y wr   rB  rC  s     r/   rE  z$_op_msg_no_header.<locals>.<genexpr>  s     <3s8<rF  r   )	r   _pack_op_msg_flags_typer7   
_pack_byter   sumr  rk   r  )r   rW   
identifierr   r!  r"  r#  
flags_type
total_sizemax_doc_sizetype_onecstringr$  encoded_docsr   encoded_sizer  s                    r/   _op_msg_no_headerrS    s     GUD1G(2JWJLa= ,HLMc:t<MM7|c!Cl!CCCaG d
<|<<WhgF G$88D>:|33 Ns   B?c                 V    t        | |||||      \  }}}	t        d||      \  }
}|
|||	fS )zInternal OP_MSG message helper.  )rS  r  )r   rW   rK  r   r!  r"  r   r   rM  r*  r  s              r/   _op_msg_compressedrV    sC     &7w
D*d&<"C]sC(HCZ..r   c                 T    t        | |||||      \  }}}t        d|      \  }	}
|	|
||fS )z*Internal compressed OP_MSG message helper.rU  )rS  r  )r   rW   rK  r   r!  r"  r  rM  r*  r   
op_messages              r/   _op_msg_uncompressedrY    s@    &7w
D*d'<#D*m+D$7J
z:}<<r   c           	         ||d<   |?d|vr;|r*|j                   st        j                  j                  |d<   n|j                  |d<   t	        t        |            }	 t        j                  |      }	|j                  |	      }
	 |rt        | ||	|
|||      |	r|
||	<   S S t        | ||	|
||      |	r|
||	<   S S # t        $ r d}	d}
Y Cw xY w# |	r|
||	<   w w xY w)zGet a OP_MSG message.$dbNr3   rG   )r4   r   PRIMARY_PREFERREDr5   nextiter
_FIELD_MAPrU   r}   KeyErrorrV  rY  )r   rW   dbnamer9   slave_okr!  r"  r   r   rK  r   s              r/   r   r     s    GEN"'8'GO000099 %& *9)A)AG%&WD^^D)
{{:&	'%w
D*dCI "&GJ 	 $7Jj$@ "&GJ   
 "&GJ s$   &B6 C	 C	 6CC	
Cc                     t        |||      }|rt        |d|      }	nd}	t        t        |      t        |	            }
dj                  t	        |       t        |      t	        |      t	        |      ||	g      |
fS )zGet an OP_QUERY message.Fr   )r   rk   r7   r  r  r   )r   r  num_to_skipnum_to_returnr   field_selectorr"  r!  r#  efsr*  s              r/   _queryrh    s     E:t4GNE48Gc#h/M88''+-    r   c	           
      V    t        | |||||||      \  }	}
t        d|	|      \  }}|||
fS )z)Internal compressed query message helper.  )rh  r  )r   r  rd  re  r   rf  r"  r!  r   op_queryr*  r  r   s                r/   _query_compressedrl    sL     %Hm x-HC]""r   c           
      T    t        | |||||||      \  }}	t        d|      \  }
}|
||	fS )zInternal query message helper.rj  )rh  r  )r   r  rd  re  r   rf  r"  r!  rk  r*  r  r   s               r/   _query_uncompressedrn    sJ     %Hm dH-HC]""r   c	                 P    |rt        | ||||||||	      S t        | |||||||      S )zGet a **query** message.)rl  rn  )	r   r  rd  re  r   rf  r"  r!  r   s	            r/   r   r     sI      /;!.~!%z38 	8 w,e^T)+ +r   z<qc                 j    dj                  t        t        |       t        |      t	        |      g      S )zGet an OP_GET_MORE message.r   )r  r4  r   r  _pack_long_longr  re  r   s      r/   	_get_morers    s3    88'- 	"	$ % %r   c                 2    t        dt        | ||      |      S )z+Internal compressed getMore message helper.  )r  rs  r  re  r   r   s       r/   _get_more_compressedrw    s!    i	BCI Ir   c                 0    t        dt        | ||            S )z Internal getMore message helper.ru  )r  rs  rr  s      r/   _get_more_uncompressedry  %  s    i	BD Dr   c                 <    |rt        | |||      S t        | ||      S )zGet a **getMore** message.)rw  ry  rv  s       r/   r   r   -  s*    
#]Is< 	<!/=)LLr   c                     t        |d|      }dj                  t        t        |       t	        |      |g      t        |      fS )zGet an OP_DELETE message.Fr   r3  )r  r8   r"  r   r#  s        r/   _deleter|  5  sJ    D%.G88'%	  w<	   r   c                 N    t        | |||      \  }}t        d||      \  }}|||fS )z9Internal compressed unacknowledged delete message helper.  )r|  r  )	r  r8   r"  r   r   	op_deleter*  r  r   s	            r/   _delete_compressedr  ?  s6    &dEJI}y#.HC]""r   c                     t        | |||      \  }}t        d|      \  }}	|rt        | |      \  }}
}||	|
z   |fS ||	|fS )zInternal delete message helper.r~  )r|  r  r  )r  r8   r-  r.  r"  r   r  r*  r  r   r/  r   s               r/   _delete_uncompressedr  F  s\      'dEJI}dI.HC"?ODS!C#I},,]""r   c                 D    |rt        | ||||      S t        | |||||      S )zGet a **delete** message.

    `opts` is a CodecOptions. `flags` is a bit vector that may contain
    the SingleRemove flag or not:

    http://docs.mongodb.org/meta-driver/latest/legacy/mongodb-wire-protocol/#op-delete
    )r  r  )r  r8   r-  r.  r"  r   r   s          r/   r&   r&   Q  s6     !/4ucJJt_dEC Cr   c                     t        |       }t        j                  dd|z  z         j                  } |d|g|  }t	        d|      S )z#Get a **killCursors** message.
    z<iirT   r   i  )r7   structStructpackr  )
cursor_idsnum_cursorsr  op_kill_cursorss       r/   kill_cursorsr  `  sI     j/K==#"345::D1k7J7O$00r   c                       e Zd ZdZdZd Zd Zd Zd Ze	d        Z
e	d        Ze	d	        Ze	d
        Ze	d        Zd Zd Zd Zd Zd Zd Zy)_BulkWriteContextzCA wrapper around SocketInfo for use with write splitting functions.)db_namerW   r   op_idr   fieldpublish
start_time	listenersr   r  op_typecodecc	                    || _         || _        || _        || _        || _        |j
                  | _        t        t        |            | _	        t        | j                     | _        | j                  rt        j                  j                         nd | _        || _        |j                   rdnd| _        || _        || _        y )NTF)r  rW   r   r  r  enabled_for_commandsr  r]  r^  r   r_  r  datetimenowr  r   r   r  r  r  )	r   database_namerW   r   operation_idr  r   r  r  s	            r/   r   z_BulkWriteContext.__init__p  s    $"!
" 55g'			*
59\\(++//1t ) = =5
r   c           	          | j                   dz   }t        || j                  | j                  || j                  | j
                  |       \  }}}|st        d      |||fS )Nr  cannot do an empty bulk write)r  _do_bulk_write_commandr  rW   r!  r  r   )r   r   r   r   r   to_sends         r/   _batch_commandz _BulkWriteContext._batch_command  s_    LL7*	#9t||T\\4JJ$ 
C "#BCC3''r   c                     | j                  |      \  }}}| j                  |||      }|j                  || j                         ||fS r   )r  write_command_process_responser   )r   r   r   r   r   r  rX   s          r/   executez_BulkWriteContext.execute  sK    #'#6#6t#< 
C##JW=  6wr   c                 Z    | j                  |      \  }}}| j                  ||dd|       |S )Nr   F)r  legacy_write)r   r   r   r   r   r  s         r/   execute_unackz_BulkWriteContext.execute_unack  s6    #'#6#6t#< 
C 	*c1eW=r   c                 (    | j                   t        k(  S )z-Should we check keys for this operation type?)r  _INSERTr   s    r/   r!  z_BulkWriteContext.check_keys  s     ||w&&r   c                 .    | j                   j                  S )z#A proxy for SockInfo.max_bson_size.)r   r*  r   s    r/   r*  z_BulkWriteContext.max_bson_size  s     ~~+++r   c                 x    | j                   r| j                  j                  dz
  S | j                  j                  S )z&A proxy for SockInfo.max_message_size.r`   )r  r   max_message_sizer   s    r/   r  z"_BulkWriteContext.max_message_size  s0     ==>>22R77~~...r   c                 .    | j                   j                  S )z*A proxy for SockInfo.max_write_batch_size.)r   max_write_batch_sizer   s    r/   r  z&_BulkWriteContext.max_write_batch_size  s     ~~222r   c                     | j                   S )z:The maximum size of a BSON command before batch splitting.)r*  r   s    r/   max_split_sizez _BulkWriteContext.max_split_size  s     !!!r   c                 x    |r$t        d|| j                  j                        \  }}| j                  |||||      S )Nr'  )r  r   r   r  )r   r   r   rN  acknowledgedr   r  s          r/   legacy_bulk_insertz$_BulkWriteContext.legacy_bulk_insert  sB    'c4>>==?OJ  \<? 	?r   c                    | j                   r[t        j                  j                         | j                  z
  }| j	                  ||      }t        j                  j                         }	 | j
                  j                  ||||      }	| j                   rUt        j                  j                         z
  z   }|	t        | j                  |	      }
nddi}
| j                  ||
|       t        j                  j                         | _        |	S # t        $ r}| j                   rt        j                  j                         z
  z   }t        |t              r"t        | j                  |j                        }n(t        |t              r|j                  }nt        |      }| j!                  |||        d}~ww xY w# t        j                  j                         | _        w xY w)zKA proxy for SocketInfo.legacy_write that handles event publishing.
        NrE   r   )r  r  r  r  _startr   r  r\   r   _succeed	Exceptionr   r   detailsr   rB   _fail)r   r   r   rN  r  r   durationr   startrX   replyexcfailures                r/   r  z_BulkWriteContext.legacy_write  s    <<((,,.@H++j$/C%%))+E	6^^00C|=F||$--113e;xG%1$))S&IE "1IEj%: '//335DO  	||$--113e;xGc#343		35G^4!kkG05G

:w9	 '//335DOs&   )A?D 	F9BF44F99F< <%G!c                 0   | j                   r[t        j                  j                         | j                  z
  }| j	                  ||       t        j                  j                         }	 | j
                  j                  ||      }| j                   r7t        j                  j                         z
  z   }| j                  |||       t        j                  j                         | _        |S # t        $ rw}| j                   ret        j                  j                         z
  z   }t        |t        t        f      r|j                  }nt        |      }| j                  |||        d}~ww xY w# t        j                  j                         | _        w xY w)zLA proxy for SocketInfo.write_command that handles event publishing.
        N)r  r  r  r  r  r   r  r  r  r   r   r   r  rB   r  )	r   r   r   r   r  r  r  r  r  s	            r/   r  z_BulkWriteContext.write_command  s=    <<((,,.@HKK
D)%%))+E	6NN00SAE||$--113e;xGj%: '//335DO  	||$--113e;xGcN4D#EF!kkG05G

:w9	 '//335DOs&   )AC- -	E-6A2E((E--E0 0%Fc                     | j                   j                         }||| j                  <   | j                  j	                  || j
                  || j                  j                  | j                         |S )zPublish a CommandStartedEvent.)	rW   copyr  r  publish_command_startr  r   r   r  )r   r   r   r   s       r/   r  z_BulkWriteContext._start  sX    ll!DJJ,,..

	< 
r   c                     | j                   j                  ||| j                  || j                  j                  | j
                         y)z Publish a CommandSucceededEvent.N)r  publish_command_successr   r   r   r  )r   r   r  r  s       r/   r  z_BulkWriteContext._succeed  s4    ..eTYY..

	<r   c                     | j                   j                  ||| j                  || j                  j                  | j
                         y)zPublish a CommandFailedEvent.N)r  publish_command_failurer   r   r   r  )r   r   r  r  s       r/   r  z_BulkWriteContext._fail  s4    ..gtyy..

	<r   N)r@   r   r   r   r   r   r  r  r  r  r!  r*  r  r  r  r  r  r  r  r  r  r.   r   r/   r  r  i  s    M<I ( ' ' , , / / 3 3 " "? D2<<r   r  i    c                   2    e Zd ZdZd Zd Zd Zed        Zy)_EncryptedBulkWriteContextr.   c           	         | j                   dz   }t        || j                  | j                  || j                  | j
                  |       \  }}|st        d      |j                  dd      dz   }t        t        |      |d  t              }||fS )Nr  r  r   r   	   )r  _encode_batched_write_commandr  rW   r!  r  r   rN   r	   
memoryviewr
   )r   r   r   r   r  	cmd_startr   s          r/   r  z)_EncryptedBulkWriteContext._batch_command  s    LL7*	4t||T\\4JJW "#BCC IIgq)A-	JsOIJ746G|r   c                     | j                  |      \  }}| j                  j                  | j                  |t        | j
                  |      }||fS )N)r   r   r   )r  r   rW   r  _UNICODE_REPLACE_CODEC_OPTIONSr   )r   r   r   r   r  rX   s         r/   r  z"_EncryptedBulkWriteContext.execute&  sP    **40W''LL#-KLL ( 1 wr   c                     | j                  |      \  }}| j                  j                  | j                  |t	        d      | j
                  |       |S )Nr   )w)write_concernr   r   )r  r   rW   r  r   r   )r   r   r   r   r  s        r/   r  z(_EncryptedBulkWriteContext.execute_unack-  sM    **40WLL#\A->LL 	 	1 r   c                     t         S )z Reduce the batch splitting size.)_MAX_SPLIT_SIZE_ENCr   s    r/   r  z)_EncryptedBulkWriteContext.max_split_size4  s
     #"r   N)	r@   r   r   r   r  r  r  r  r  r.   r   r/   r  r    s*    I # #r   r  c                 H    | dk(  rt        d||fz        t        | d      )z-Internal helper for raising DocumentTooLarge.r$   zfBSON document too large (%d bytes) - the connected server supports BSON document sizes up to %d bytes.z command document too large)r   )rV   doc_sizemax_sizes      r/   _raise_document_too_larger  :  s>    H  ) -5h+? @ A 	A )MNNr   c           	      "     fd}|xs | }	d}
t               }|j                  t        j                  dt	        |                   |j                  t                      |j                         x}}d}g }t        }|j                  xr |xs |	 }|D ]  } ||||      }t        |      }||j                  kD  }||z  }||j                  k  r'|s%|j                  |       |j                  |       d}b|rF	 |rd|j                         }}n ||j                         |	      \  }}|j                  ||d|	||       |rt!        d||j                         ||z   }|j#                  |       |j%                          |j                  |       |g} |st'        d      |rd|j                         }}n ||j                         |      \  }}|j                  ||d|||       |
|
y# t        $ r}|r|}
n	|sY d}~ y Y d}~d}~ww xY w)	z*Insert `docs` using multiple batches.
    c                 X    t        d|       \  }}|rt              \  }}}||z  }||fS )z6Build the insert message with header and GLE.
        r'  )r  r  )insert_message	send_safer   final_messageerror_messager   r  r.  s         r/   _insert_messagez+_do_batched_insert.<locals>._insert_messageL  sE     %34$H!
M+78G,I(Jq]*M=((r   Nr  FTr   r$   r  )r   writer  r  intr   tellr   r  r7   r*  r  appendgetvaluer  r   r  seektruncater   )r  r   r!  r-  r.  r(  r"  r   r  r  
last_errorr  message_length	begin_lochas_docsr  r   r  r$  r#  encoded_length	too_larger  r   r  r   s   `   `                     r/   _do_batched_insertr  G  s!   
) ---IJ:DJJv{{4%6!789JJ~o./!%,NYHGF||7T%6Y 7H +j$/W#c&7&77	.(C000JJwNN3H#T]]_C.t}}	JHC&&aGX?  %.#*;*;= #^3		)

7%W+Z ?@@C
)$--/4@
C:sAtWhG  A $ 
$!$J  	
s   <AG--	H6H	H		Hs
   documents s   updates s   deletes c                    |j                   }|j                  }	|j                  }
|rdnd}|j                  |       |j                  d       |j                  t	        |d|             |j                  d       |j                         }|j                  d       	 |j                  t        |           | t        t        fv rd}g }d}|D ]  }t	        |||      }t        |      }|j                         |z   }|dk(  xr ||
kD  }| xr ||kD  }|s|r6t        t        j                               |    }t        |t        |      |       ||
kD  r n0|j                  |       |j!                  |       |dz  }||	k(  s n |j                         }|j#                  |       |j                  t%        ||z
               ||fS # t        $ r t        d      w xY w)	zCreate a batched OP_MSG write.r    s      r   F   Unknown commandr   r   )r*  r  r  r  r   r  _OP_MSG_MAPr`  r   _UPDATE_DELETEr7   listr_  keysr  r  r  r  )rV   rW   r   r!  ackr"  r   bufr*  r  r  r   size_locationr  idxr$  value
doc_lengthnew_message_sizedoc_too_largeunacked_doc_too_largewrite_oplengths                          r/   _batched_op_msg_implr    s    %%M33++#&,?EIIe IIgIImGUD12 IIgHHJMII!"2		+i() Wg&&
G
C c:t4Z
88:
2K'7:J'J &)!Ij=.H1JOO-.y9H%#e*m5 ..		%sq&&38 XXZFHH]IIi./0F?Q  20112s   G Gc           
      d    t               }t        | |||||||      \  }}	|j                         |fS )zOEncode the next batched insert, update, or delete operation
    as OP_MSG.
    )r   r  r  )
rV   rW   r   r!  r  r"  r   r  r  r   s
             r/   _encode_batched_op_msgr    s<    
 *C%7D*c4cCJGQ<<>7""r   c           	      |    t        | ||||||      \  }}t        d||j                  j                        \  }	}
|	|
|fS )z]Create the next batched insert, update, or delete operation
    with OP_MSG, compressed.
    rU  )r  r  r   r   )rV   rW   r   r!  r  r"  r   r  r  r   r   s              r/   _batched_op_msg_compressedr    sS    
 +7D*c4>MD'  ))+OJ sG##r   c           
      r   t               }|j                  t               |j                  d       t        | |||||||      \  }}	|j	                  d       t               }
|j                  t        |
             |j	                  d       |j                  t        |	             |
|j                         |fS )z"OP_MSG implementation entry point.s         r   r   )r   r  _ZERO_64r  r  r0   r  r  )rV   rW   r   r!  r  r"  r   r  r  r   r   s              r/   _batched_op_msgr    s     *C IIhII12*7D*c4cCOGV HHQKJIIi
#$HHQKIIi s||~w..r   c           	          | j                  dd      d   |d<   d|v rt        |d   j                  dd            }nd}|j                  j                  rt        |||||||      S t        |||||||      S )zRCreate the next batched insert, update, or delete operation
    using OP_MSG.
    r  r   r   r[  writeConcernr  T)r  boolrU   r   r   r  r  )r   rV   rW   r   r!  r"  r   r  s           r/   _do_batched_op_msgr    s    
 __S!,Q/GEN 7>*..sA67
}}(()wj#tSB 	B7D*c4> >r   c           	      |    t        | ||||||      \  }}t        d||j                  j                        \  }	}
|	|
|fS )zKCreate the next batched insert, update, or delete command, compressed.
    rj  )r  r  r   r   )r   rV   rW   r   r!  r"  r   r  r  r   r   s              r/   !_batched_write_command_compressedr  1  sT     29gtZsDMD'  ))+OJ sG##r   c           
      d    t               }t        | |||||||      \  }}	|j                         |fS )z?Encode the next batched insert, update, or delete command.
    )r   _batched_write_command_implr  )
r   rV   rW   r   r!  r"  r   r  r  r   s
             r/   r  r  ?  s<     *C,9gtZsCIJGQ<<>7""r   c           
      r   t               }|j                  t               |j                  d       t        | |||||||      \  }}	|j	                  d       t               }
|j                  t        |
             |j	                  d       |j                  t        |	             |
|j                         |fS )z?Create the next batched insert, update, or delete command.
    s         r   r   )r   r  r  r  r  r0   r  r  )r   rV   rW   r   r!  r"  r   r  r  r   r   s              r/   _batched_write_commandr  L  s     *C IIhII12 29gtZsCIOGV HHQKJIIi
#$HHQKIIi s||~w..r   c           	      r    |j                   j                  rt        | ||||||      S t        | ||||||      S )z#Batched write commands entry point.)r   r   r  r  r   rV   rW   r   r!  r"  r   s          r/   _do_batched_write_commandr  g  sM     }}((0y'4T3H 	H!9gtZsD Dr   c           	      x    |j                   j                  dkD  rt        | ||||||      S t        | ||||||      S )z Bulk write commands entry point.r   )r   r   r  r  r  s          r/   r  r  q  sR     }}%%)!y'4T3H 	H$9gtZsD Dr   c                    |j                   }|j                  }	|t        z   }
|j                  }|j	                  t
               |j	                  t        |              |j	                  t               |j	                  t               |j                         }|j	                  t        |             |j                  dd       |j                          	 |j	                  t        |          |t         t"        fv rd}|j                         dz
  }g }d}|D ]	  }t        t%        |            }t        |||      }t'        |      |
kD  }|r6t)        t*        j-                               |   }t/        |t'        |      |       |dk\  xr+ |j                         t'        |      z   t'        |      z   |k\  }||	k\  }|s|r ne|j	                  t0               |j	                  |       |j	                  t               |j	                  |       |j3                  |       |dz  } |j	                  t4               |j                         }|j                  |       |j	                  t7        ||z
  dz
               |j                  |       |j	                  t7        ||z
               ||fS # t        $ r t        d      w xY w)z(Create a batched OP_QUERY write command.r   r   r  Fr   r   r   )r*  r  _COMMAND_OVERHEADr  r  r4  r   _ZERO_8_SKIPLIMr  r   r  r  _OP_MAPr`  r   r  r  r>   r7   r  r_  r  r  _BSONOBJr  _ZERO_16r  )r   rV   rW   r   r!  r"  r   r  r*  r  max_cmd_sizer  command_start
list_startr  r  r$  r   r  r  r  enough_dataenough_documentsr   s                           r/   r  r  {  s`    %%M33 !#44L''N IIhIIa	lIIgIIh HHJMIIfWo HHROLLN2		')$% Wg&&
 aJG
C CksJ- E
\1JOO-.y9H%#e*m5ax N
SX-E
:~M 	#77*		(		#		'		%sq+2 IIh XXZFHHZIIi+a/01HH]IIi./0F?Y  20112s   J* *J?c                       e Zd ZdZdZ ej                  d      j                  ZdZ	d Z
ddZdeddfd	Zd
 Zd Zed        Zed        Zy)_OpReplyz$A MongoDB OP_REPLY response message.r   r   number_returnedr!   z<iqiir   c                 <    || _         || _        || _        || _        y r   r%  )r   r   r   r&  r!   s        r/   r   z_OpReply.__init__  s    
"."r   Nc                 B   | j                   dz  r&|t        d      d|fz  }d|dd}t        |d|      | j                   dz  rt        j                  | j
                        j                         }|j                  dd       |d	   j                  d
      rt        |d	   |      |j                  d      dk(  r+t        |j                  d	      |j                  d      |      t        d|j                  d	      z  |j                  d      |      | j
                  gS )a  Check the response header from the database, without decoding BSON.

        Check the response for errors and unpack.

        Can raise CursorNotFound, NotMasterError, ExecutionTimeout, or
        OperationFailure.

        :Parameters:
          - `cursor_id` (optional): cursor_id we sent to get this response -
            used for raising an informative exception when we get cursor id not
            valid at server response.
        r   z"No cursor id for getMore operationzCursor not found, cursor id: %dr   +   )rE   r<   rJ   r   rE   z$errz
not masterrJ   2   zdatabase error: %s)r   r   r   bsonBSONr!   r   r   
startswithr   rU   r   r   )r   r   r   errobjerror_objects        r/   raw_responsez_OpReply.raw_response  s(    ::> #$HII 4ylBCb9F b&11ZZ!^99T^^4;;=L##D!,F#..|<$\&%9<HH!!&)R/&|'7'7'?'3'7'7'?'35 5 ##7#/#3#3F#;$<#/#3#3F#;#/1 1 r   Fc                     | j                  |       |r t        j                  | j                  |      S t        j                  | j                  ||      S )ad  Unpack a response from the database and decode the BSON document(s).

        Check the response for errors and unpack, returning a dictionary
        containing the response data.

        Can raise CursorNotFound, NotMasterError, ExecutionTimeout, or
        OperationFailure.

        :Parameters:
          - `cursor_id` (optional): cursor_id we sent to get this response -
            used for raising an informative exception when we get cursor id not
            valid at server response
          - `codec_options` (optional): an instance of
            :class:`~bson.codec_options.CodecOptions`
        )r0  r+  
decode_allr!   _decode_all_selectiver   r   r   user_fieldslegacy_responses        r/   unpack_responsez_OpReply.unpack_response  sH    $ 	)$??4>>=AA))NNM;8 	8r   c                 N    | j                         }| j                  dk(  sJ |d   S )Unpack a command response.r   r   )r7  r&  )r   r   s     r/   command_responsez_OpReply.command_response  s-    ##%##q(((Awr   c                     t         z)Return the bytes of the command response.NotImplementedErrorr   s    r/   raw_command_responsez_OpReply.raw_command_response  s
     "!r   c                      y)+Is the moreToCome bit set on this response?Fr.   r   s    r/   more_to_comez_OpReply.more_to_come  s     r   c                 `    | j                  |      \  }}}}t        |dd       } | ||||      S )z%Construct an _OpReply from raw bytes.   N)UNPACK_FROMbytes)r   r   r   r   r   r&  r!   s          r/   unpackz_OpReply.unpack#  s=     03s/C,y!_ #bc(O	5)_i@@r   r   )r@   r   r   r   r   r  r  unpack_fromrE  OP_CODEr   r0  r  r7  r:  r?  r  rB  classmethodrG  r.   r   r/   r$  r$    sv    .FI&--(44KG#% N )-&D$(%80"
   A Ar   r$  c                       e Zd ZdZdZ ej                  d      j                  ZdZ	dZ
dZdZd Zdd
Zd	ed	dfdZd Zd Zed        Zed        Zy	)_OpMsgz"A MongoDB OP_MSG response message.)r   r   r&  payload_documentz<IBirU  r   r   i   c                      || _         || _        y r   )r   rM  )r   r   rM  s      r/   r   z_OpMsg.__init__<  s    
 0r   Nc                     t         r   r=  )r   r   s     r/   r0  z_OpMsg.raw_response@  s    !!r   Fc                 L    |rJ t        j                  | j                  ||      S )zUnpack a OP_MSG command response.

        :Parameters:
          - `cursor_id` (optional): Ignored, for compatibility with _OpReply.
          - `codec_options` (optional): an instance of
            :class:`~bson.codec_options.CodecOptions`
        )r+  r3  rM  r4  s        r/   r7  z_OpMsg.unpack_responseC  s-     #""))!!=+? 	?r   c                 (    | j                         d   S )r9  r   )r7  r   s    r/   r:  z_OpMsg.command_responseR  s    ##%a((r   c                     | j                   S r<  )rM  r   s    r/   r?  z_OpMsg.raw_command_responseV  s    $$$r   c                 4    | j                   | j                  z  S )rA  )r   MORE_TO_COMEr   s    r/   rB  z_OpMsg.more_to_comeZ  s     zzD----r   c                 <   | j                  |      \  }}}|dk7  r<|| j                  z  rt        d|fz        || j                  z  rt        d|fz        |dk7  rt        d|fz        t	        |      |dz   k7  rt        d      t        |dd       } | ||      S )z#Construct an _OpMsg from raw bytes.r   z-Unsupported OP_MSG flag checksumPresent: 0x%xzUnsupported OP_MSG flags: 0x%xz%Unsupported OP_MSG payload type: 0x%xr   z$Unsupported OP_MSG reply: >1 sectionN)rE  CHECKSUM_PRESENTr   rT  r7   rF  )r   r   r   first_payload_typefirst_payload_sizerM  s         r/   rG  z_OpMsg.unpack_  s     9<8L5!#5A:s+++##X&' ' s'''#4x?A A",./0 0 s8)A-- FGG !QR>5*++r   r   )r@   r   r   r   r   r  r  rH  rE  rI  rV  rT  EXHAUST_ALLOWEDr   r0  r  r7  r:  r?  r  rB  rJ  rG  r.   r   r/   rL  rL  /  s    ,MI&--'33KG LO1" )-&D$(%?)% . . , ,r   rL  c
                     t        d||d|d|||dt        dddd      }t        t        |            }
|	j                  }|rt
        j
                  j                         }|j                  ||       \  }}}|r]t
        j
                  j                         z
  }|	j                  |||| j                         t
        j
                  j                         }| j                  ||       | j                  |      }	 |j                  d|      }d|v r||j(                  |d|ddd}n|r|d   ni }d|d<   |rCt
        j
                  j                         z
  z   }|	j+                  |||
|| j                         |S # t        $ ry}|rqt
        j
                  j                         z
  z   }t        |t        t         f      r|j"                  }nt%        |      }|	j'                  |||
|| j                          d}~ww xY w)	zESimple query helper for retrieving a first (and possibly only) batch.r   Ncursorr  )
firstBatchidr   g      ?)r[  rE   rE   )r   r   r]  r^  r  r  r  r   r  r   send_messagereceive_messager7  r  r   r   r   r  rB   r  r   r  )r   r   r   r   r   rb  r   r9   r   r  r   r  r  r   r   rN  encoding_durationr  r   r  r  r  rX   s                          r/   _first_batchra    s    	2tQt]A';T4dE
 S	?D,,G!!%%'$)$5$5h	$J!J\$--113e;''Z!2!2	4!!%%'3-%%j1E$$T=9 3  $#%t,
 
 !abu%%))+e37HH))fdJ	0A0A	C M;  	 ))--/%7;LLH#0@AB++,S1--'4Y5F5FH	s   7E; ;	G=A4G88G=)NNNr   )FNr   )r   )r   N)r   r  r*   r  r+  r   r   r   r   r   bson.codec_optionsr   bson.raw_bsonr	   r
   bson.py3compatr   r   bson.sonr   pymongor   _use_cImportErrorpymongo.errorsr   r   r   r   r   r   r   r   pymongo.read_concernr   pymongo.read_preferencesr   pymongo.write_concernr   r-   r,   r  r  r  r  _EMPTYr  r  r  r4  r  r  r  r_  r   r  r0   r:   rB   r\   r   r|   r   r   objectr   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r%  r+  r0  r  r$   r8  r<  r>  _update_messager%   rH  rI  rS  rV  rY  r   rh  rl  rn  _query_messager   rq  rs  rw  ry  _get_more_messager   r|  r  r  r&   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r$  rL  rI  rG  _UNPACK_REPLYra  r.   r   r/   <module>rs     sY      " "
 5 A & !F+ + + 6 3 . 		  


..1// 
 
!-!*", 0
$5$N  " #    
  =A%)$NHLV HLVFAv FAT
,V 
,,x ,!U !8 )6==499  + . v}}W%** FMM$$$	4&#	# 
$44 @DJ."#	# 
$44 >BN (&--.33 V]]4 %%
46/= 
$,, '<( 37#$ BG# 
#22 >B	+  &--%**%ID 
&88M # CD# JNC1b< b<R  "#!2 "#J
OQd 
"55 ^^>B	# 
&==$/* 
//O>($# 
$-$K$K!/. 
&==DDHVfAv fARH,V H,X hoo
NNFMM6o2  Fs   L- -L87L8