����JFIFXX�����    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222����"��4�� ���,�PG"Z_�4�˷����kjز�Z�,F+��_z�,�© �����zh6�٨�ic�fu���#ډb���_�N�?��wQ���5-�~�I���8����TK<5o�Iv-�����k�_U_�����~b�M��d����Ӝ�U�Hh��?]��E�w��Q���k�{��_}qFW7HTՑ��Y��F�?_�'ϔ��_�Ջt��=||I ��6�έ"�����D���/[�k�9���Y�8ds|\���Ҿp6�Ҵ���]��.����6�z<�v��@]�i%��$j��~�g��J>��no����pM[me�i$[����s�o�ᘨ�˸ nɜG-�ĨU�ycP�3.DB�li�;��hj���x7Z^�N�h������N3u{�:j�x�힞��#M&��jL P@_���� P��&��o8������9�����@Sz6�t7#O�ߋ �s}Yf�T���lmr����Z)'N��k�۞p����w\�Tȯ?�8`�O��i{wﭹW�[�r�� ��Q4F�׊���3m&L�=��h3����z~��#�\�l :�F,j@�� ʱ�wQT����8�"kJO���6�֚l����}���R�>ډK���]��y����&����p�}b��;N�1�m�r$�|��7�>e�@B�TM*-iH��g�D�)� E�m�|�ؘbҗ�a��Ҿ����t4���o���G��*oCN�rP���Q��@z,|?W[0�����:�n,jWiE��W��$~/�hp\��?��{(�0���+�Y8rΟ�+����>S-S����VN;�}�s?.����� w�9��˟<���Mq4�Wv'��{)0�1mB��V����W[�����8�/<� �%���wT^�5���b��)iM� pg�N�&ݝ��VO~�q���u���9� ����!��J27����$O-���! �:�%H��� ـ����y�ΠM=t{!S�� oK8������t<����è:a������[�����ա�H���~��w��Qz`�po�^ ����Q��n� �,uu�C�$ ^���,������8�#��:�6��e�|~���!�3�3.�\0��q��o�4`.|� ����y�Q�`~;�d�ׯ,��O�Zw�������`73�v�܋�<���Ȏ�� ـ4k��5�K�a�u�=9Yd��$>x�A�&�� j0� ���vF��� Y�|�y��� ~�6�@c��1vOp�Ig����4��l�OD���L����� R���c���j�_�uX6��3?nk��Wy�f;^*B� ��@�~a�`��Eu������+���6�L��.ü>��}y���}_�O�6�͐�:�YrG�X��kG�����l^w���~㒶sy��Iu�!� W ��X��N�7BV��O��!X�2����wvG�R�f�T#�����t�/?���%8�^�W�aT��G�cL�M���I��(J����1~�8�?aT ���]����AS�E��(��*E}� 2��#I/�׍qz��^t�̔���b�Yz4x���t�){ OH��+(E��A&�N�������XT��o��"�XC��'���)}�J�z�p� ��~5�}�^����+�6����w��c��Q�|Lp�d�H��}�(�.|����k��c4^�"�����Z?ȕ ��a<�L�!039C� �Eu�C�F�Ew�ç ;�n?�*o���B�8�bʝ���'#Rqf���M}7����]����s2tcS{�\icTx;�\��7K���P���ʇ Z O-��~��c>"��?�������P��E��O�8��@�8��G��Q�g�a�Վ���󁶠�䧘��_%#r�>�1�z�a��eb��qcPѵ��n���#L��� =��׀t� L�7�`��V���A{�C:�g���e@�w1 Xp3�c3�ġ����p��M"'-�@n4���fG��B3�DJ�8[Jo�ߐ���gK)ƛ��$���� ���8�3�����+���� �����6�ʻ���� ���S�kI�*KZlT _`���?��K����QK�d����B`�s}�>���`��*�>��,*@J�d�oF*����弝��O}�k��s��]��y�ߘ��c1G�V���<=�7��7����6�q�PT��tXԀ�!9*4�4Tހ3XΛex�46���Y��D ����� �BdemDa����\�_l,��G�/���֌7���Y�](�xTt^%�GE�����4�}bT���ڹ�����;Y)���B�Q��u��>J/J �⮶.�XԄ��j�ݳ�+E��d ��r�5�_D�1 ��o�� �B�x�΢�#���<��W�����8���R6�@g�M�.��� dr�D��>(otU��@x=��~v���2� ӣ�d�oBd��3�eO�6�㣷�����ݜ6��6Y��Qz`��S��{���\P�~z m5{J/L��1������<�e�ͅPu�b�]�ϔ���'������f�b� Zpw��c`"��i���BD@:)ִ�:�]��hv�E�w���T�l��P���"Ju�}��وV J��G6��. J/�Qgl߭�e�����@�z�Zev2u�)]կ�����7x���s�M�-<ɯ�c��r�v�����@��$�ޮ}lk���a���'����>x��O\�ZFu>�����ck#��&:��`�$�ai�>2Δ����l���oF[h��lE�ܺ�Πk:)���`�� $[6�����9�����kOw�\|���8}������ބ:��񶐕��I�A1/�=�2[�,�!��.}gN#�u����b��� ~��݊��}34q����d�E��Lc��$��"�[q�U�硬g^��%B �z���r�pJ�ru%v\h1Y�ne`ǥ:g���pQM~�^�Xi� ��`S�:V29.�P���V�?B�k�� AEvw%�_�9C�Q����wKekPؠ�\�;Io d�{ ߞo�c1eP����\� `����E=���@K<�Y���eڼ�J���w����{av�F�'�M�@/J��+9p���|]�����Iw &`��8���&M�hg��[�{��Xj��%��Ӓ�$��(����ʹN���<>�I���RY���K2�NPlL�ɀ)��&e����B+ь����( � �JTx���_?EZ� }@ 6�U���뙢ط�z��dWI�n` D����噥�[��uV��"�G&Ú����2g�}&m��?ċ�"����Om#��������� ��{�ON��"S�X��Ne��ysQ���@Fn��Vg���dX�~nj�]J�<�K]:��FW��b�������62�=��5f����JKw��bf�X�55��~J �%^����:�-�QIE��P��v�nZum� z � ~ə ���� ���ة����;�f��\v���g�8�1��f24;�V���ǔ�)����9���1\��c��v�/'Ƞ�w�������$�4�R-��t���� e�6�/�ġ �̕Ecy�J���u�B���<�W�ַ~�w[B1L۲�-JS΂�{���΃������A��20�c#��@ 0!1@AP"#2Q`$3V�%45a6�FRUq��� ����^7ׅ,$n�������+��F�`��2X'��0vM��p�L=������5��8������u�p~���.�`r�����\���O��,ư�0oS ��_�M�����l���4�kv\JSd���x���SW�<��Ae�IX����������$I���w�:S���y���›R��9�Q[���,�5�;�@]�%���u�@ *ro�lbI �� ��+���%m:�͇ZV�����u�̉����θau<�fc�.����{�4Ա� �Q����*�Sm��8\ujqs]{kN���)qO�y�_*dJ�b�7���yQqI&9�ԌK!�M}�R�;������S�T���1���i[U�ɵz�]��U)V�S6���3$K{�ߊ<�(� E]Զ[ǼENg�����'�\?#)Dkf��J���o��v���'�%ƞ�&K�u�!��b�35LX�Ϸ��63$K�a�;�9>,R��W��3�3� d�JeTYE.Mϧ��-�o�j3+y��y^�c�������VO�9NV\nd�1 ��!͕_)a�v;����թ�M�lWR1��)El��P;��yوÏ�u 3�k�5Pr6<�⒲l�!˞*��u־�n�!�l:����UNW ��%��Chx8vL'��X�@��*��)���̮��ˍ��� ���D-M�+J�U�kvK����+�x8��cY������?�Ԡ��~3mo��|�u@[XeY�C�\Kp�x8�oC�C�&����N�~3-H���� ��MX�s�u<`���~"WL��$8ξ��3���a�)|:@�m�\���^�`�@ҷ)�5p+��6���p�%i)P M���ngc�����#0Aruz���RL+xSS?���ʮ}()#�t��mˇ!��0}}y����<�e� �-ή�Ԩ��X������ MF���ԙ~l L.3���}�V뽺�v�����멬��Nl�)�2����^�Iq��a��M��qG��T�����c3#������3U�Ǎ���}��לS�|qa��ڃ�+���-��2�f����/��bz��ڐ�� �ݼ[2�ç����k�X�2�* �Z�d���J�G����M*9W���s{��w���T��x��y,�in�O�v��]���n����P�$�JB@=4�OTI�n��e�22a\����q�d���%�$��(���:���: /*�K[PR�fr\nڙdN���F�n�$�4�[�� U�zƶ����� �mʋ���,�ao�u 3�z� �x��Kn����\[��VFmbE;�_U��&V�Gg�]L�۪&#n%�$ɯ�dG���D�TI=�%+AB�Ru#��b4�1�»x�cs�YzڙJG��f��Il��d�eF'T� iA��T���uC�$����Y��H?����[!G`}���ͪ� �纤Hv\������j�Ex�K���!���OiƸ�Yj�+u-<���'q����uN�*�r\��+�]���<�wOZ.fp�ێ��,-*)V?j-kÊ#�`�r��dV����(�ݽBk�����G�ƛk�QmUڗe��Z���f}|����8�8��a���i��3'J�����~G_�^���d�8w������ R�`(�~�.��u���l�s+g�bv���W���lGc}��u���afE~1�Ue������Z�0�8�=e�� f@/�jqEKQQ�J��oN��J���W5~M>$6�Lt�;$ʳ{���^��6�{����v6���ķܰg�V�cnn �~z�x�«�,2�u�?cE+Ș�H؎�%�Za�)���X>uW�Tz�Nyo����s���FQƤ��$��*�&�LLXL)�1�" L��eO��ɟ�9=���:t��Z���c��Ž���Y?�ӭV�wv�~,Y��r�ۗ�|�y��GaF�����C�����.�+� ���v1���fήJ�����]�S��T��B��n5sW}y�$��~z�'�c ��8 ��� ,! �p��VN�S��N�N�q��y8z˱�A��4��*��'������2n<�s���^ǧ˭P�Jޮɏ�U�G�L�J�*#��<�V��t7�8����TĜ>��i}K%,���)[��z�21z ?�N�i�n1?T�I�R#��m-�����������������1����lA�`��fT5+��ܐ�c�q՝��ʐ��,���3�f2U�եmab��#ŠdQ�y>\��)�SLY����w#��.���ʑ�f��� ,"+�w�~�N�'�c�O�3F�������N<���)j��&��,-� �љ���֊�_�zS���TǦ����w�>��?�������n��U仆�V���e�����0���$�C�d���rP �m�׈e�Xm�Vu� �L��.�bֹ��� �[Դaզ���*��\y�8�Է:�Ez\�0�Kq�C b��̘��cө���Q��=0Y��s�N��S.���3.���O�o:���#���v7�[#߫ ��5�܎�L���Er4���9n��COWlG�^��0k�%<���ZB���aB_���������'=��{i�v�l�$�uC���mƎҝ{�c㱼�y]���W�i ��ߧc��m�H� m�"�"�����;Y�ߝ�Z�Ǔ�����:S#��|}�y�,/k�Ld� TA�(�AI$+I3��;Y*���Z��}|��ӧO��d�v��..#:n��f>�>���ȶI�TX��� 8��y����"d�R�|�)0���=���n4��6ⲑ�+��r<�O�܂~zh�z����7ܓ�HH�Ga롏���nCo�>������a ���~]���R���̲c?�6(�q�;5%� |�uj�~z8R=X��I�V=�|{v�Gj\gc��q����z�؋%M�ߍ����1y��#��@f^���^�>N�����#x#۹��6�Y~�?�dfPO��{��P�4��V��u1E1J �*|���%���JN��`eWu�zk M6���q t[�� ��g�G���v��WIG��u_ft����5�j�"�Y�:T��ɐ���*�;� e5���4����q$C��2d�}���� _S�L#m�Yp��O�.�C�;��c����Hi#֩%+) �Ӎ��ƲV���SYź��g |���tj��3�8���r|���V��1#;.SQ�A[���S������#���`n�+���$��$I �P\[�@�s��(�ED�z���P��])8�G#��0B��[ى��X�II�q<��9�~[Z멜�Z�⊔IWU&A>�P~�#��dp<�?����7���c��'~���5 ��+$���lx@�M�dm��n<=e�dyX��?{�|Aef ,|n3�<~z�ƃ�uۧ�����P��Y,�ӥQ�*g�#먙R�\���;T��i,��[9Qi歉����c>]9�� ��"�c��P�� �Md?٥��If�ت�u��k��/����F��9�c*9��Ǎ:�ØF���z�n*�@|I�ށ9����N3{'��[�'ͬ�Ҳ4��#}��!�V� Fu��,�,mTIk���v C�7v���B�6k�T9��1�*l� '~��ƞF��lU��'�M ����][ΩũJ_�{�i�I�n��$���L�� j��O�dx�����kza۪��#�E��Cl����x˘�o�����V���ɞ�ljr��)�/,�߬h�L��#��^��L�ф�,íMƁe�̩�NB�L�����iL����q�}��(��q��6IçJ$�W�E$��:������=#����(�K�B����zђ <��K(�N�۫K�w��^O{!����)�H���>x�������lx�?>Պ�+�>�W���,Ly!_�D���Ō�l���Q�!�[ �S����J��1��Ɛ�Y}��b,+�Lo�x�ɓ)����=�y�oh�@�꥟/��I��ѭ=��P�y9��� �ۍYӘ�e+�p�Jnϱ?V\SO%�(�t� ���=?MR�[Ș�����d�/ ��n�l��B�7j� ��!�;ӥ�/�[-���A�>�dN�sLj ��,ɪv��=1c�.SQ�O3�U���ƀ�ܽ�E����������̻��9G�ϷD�7(�}��Ävӌ\�y�_0[w ���<΍>����a_��[0+�L��F.�޺��f�>oN�T����q;���y\��bՃ��y�jH�<|q-eɏ�_?_9+P���Hp$�����[ux�K w�Mw��N�ی'$Y2�=��q���KB��P��~������Yul:�[<����F1�2�O���5=d����]Y�sw:���Ϯ���E��j,_Q��X��z`H1,#II ��d�wr��P˂@�ZJV����y$�\y�{}��^~���[:N����ߌ�U�������O��d�����ؾe��${p>G��3c���Ė�lʌ�� ת��[��`ϱ�-W����dg�I��ig2��� ��}s ��ؤ(%#sS@���~���3�X�nRG�~\jc3�v��ӍL��M[JB�T��s3}��j�Nʖ��W����;7��ç?=X�F=-�=����q�ߚ���#���='�c��7���ڑW�I(O+=:uxq�������������e2�zi+�kuG�R��������0�&e�n���iT^J����~\jy���p'dtG��s����O��3����9* �b#Ɋ�� p������[Bws�T�>d4�ۧs���nv�n���U���_�~,�v����ƜJ1��s�� �QIz��)�(lv8M���U=�;����56��G���s#�K���MP�=��LvyGd��}�VwWBF�'�à �?MH�U�g2�� ����!�p�7Q��j��ڴ����=��j�u��� Jn�A s���uM������e��Ɔ�Ҕ�!)'��8Ϣ�ٔ��ޝ(��Vp���צ֖d=�IC�J�Ǡ{q������kԭ�߸���i��@K����u�|�p=..�*+����x�����z[Aqġ#s2a�Ɗ���RR�)*HRsi�~�a &f��M��P����-K�L@��Z��Xy�'x�{}��Zm+���:�)�) IJ�-i�u���� ���ܒH��'�L(7�y�GӜq���� j��� 6ߌg1�g�o���,kر���tY�?W,���p���e���f�OQS��!K�۟cҒA�|ս�j�>��=⬒��˧L[�� �߿2JaB~R��u�:��Q�] �0H~���]�7��Ƽ�I���(}��cq '�ήET���q�?f�ab���ӥvr� �)o��-Q��_'����ᴎo��K������;��V���o��%���~OK ����*��b�f:���-ťIR��`B�5!RB@���ï�� �u �̯e\�_U�_������� g�ES��3�������QT��a����x����U<~�c?�*�#]�MW,[8O�a�x��]�1bC|踤�P��lw5V%�)�{t�<��d��5���0i�XSU��m:��Z�┵�i�"��1�^B�-��P�hJ��&)O��*�D��c�W��vM��)����}���P��ܗ-q����\mmζZ-l@�}��a��E�6��F�@��&Sg@���ݚ�M����� ȹ 4����#p�\H����dYDo�H���"��\��..R�B�H�z_�/5˘����6��KhJR��P�mƶi�m���3�,#c�co��q�a)*Pt����R�m�k�7x�D�E�\Y�閣_X�<���~�)���c[[�BP����6�Yq���S��0����%_����;��Àv�~�| VS؇ ��'O0��F0��\���U�-�d@�����7�SJ*z��3n��y��P����O���������m�~�P�3|Y��ʉr#�C�<�G~�.,! ���bqx���h~0=��!ǫ�jy����l�O,�[B��~��|9��ٱ����Xly�#�i�B��g%�S��������tˋ���e���ې��\[d�t)��.+u�|1 ������#�~Oj����hS�%��i.�~X���I�H�m��0n���c�1uE�q��cF�RF�o���7� �O�ꮧ� ���ۛ{��ʛi5�rw?׌#Qn�TW��~?y$��m\�\o����%W� ?=>S�N@�� �Ʈ���R����N�)�r"C�:��:����� �����#��qb��Y�. �6[��2K����2u�Ǧ�HYR��Q�MV��� �G�$��Q+.>�����nNH��q�^��� ����q��mM��V��D�+�-�#*�U�̒ ���p욳��u:�������IB���m���PV@O���r[b= �� ��1U�E��_Nm�yKbN�O���U�}�the�`�|6֮P>�\2�P�V���I�D�i�P�O;�9�r�mAHG�W�S]��J*�_�G��+kP�2����Ka�Z���H�'K�x�W�MZ%�O�YD�Rc+o��?�q��Ghm��d�S�oh�\�D�|:W������UA�Qc yT�q������~^�H��/��#p�CZ���T�I�1�ӏT����4��"�ČZ�����}��`w�#�*,ʹ�� ��0�i��課�Om�*�da��^gJ݅{���l�e9uF#T�ֲ��̲�ٞC"�q���ߍ ոޑ�o#�XZTp����@ o�8��(jd��xw�]�,f���`~�|,s��^����f�1���t��|��m�򸄭/ctr��5s��7�9Q�4�H1꠲BB@l9@���C�����+�wp�xu�£Yc�9��?`@#�o�mH�s2��)�=��2�.�l����jg�9$�Y�S�%*L������R�Y������7Z���,*=�䷘$�������arm�o�ϰ���UW.|�r�uf����IGw�t����Zwo��~5 ��YյhO+=8fF�)�W�7�L9lM�̘·Y���֘YLf�큹�pRF���99.A �"wz��=E\Z���'a� 2��Ǚ�#;�'}�G���*��l��^"q��+2FQ� hj��kŦ��${���ޮ-�T�٭cf�|�3#~�RJ����t��$b�(R��(����r���dx� >U b�&9,>���%E\� Ά�e�$��'�q't��*�א���ެ�b��-|d���SB�O�O��$�R+�H�)�܎�K��1m`;�J�2�Y~9��O�g8=vqD`K[�F)k�[���1m޼c��n���]s�k�z$@��)!I �x՝"v��9=�ZA=`Ɠi �:�E��)`7��vI��}d�YI�_ �o�:ob���o ���3Q��&D&�2=�� �Ά��;>�h����y.*ⅥS������Ӭ�+q&����j|UƧ����}���J0��WW< ۋS�)jQR�j���Ư��rN)�Gű�4Ѷ(�S)Ǣ�8��i��W52���No˓� ۍ%�5brOn�L�;�n��\G����=�^U�dI���8$�&���h��'���+�(������cȁ߫k�l��S^���cƗjԌE�ꭔ��gF���Ȓ��@���}O���*;e�v�WV���YJ\�]X'5��ղ�k�F��b 6R�o՜m��i N�i����>J����?��lPm�U��}>_Z&�KK��q�r��I�D�Չ~�q�3fL�:S�e>���E���-G���{L�6p�e,8��������QI��h��a�Xa��U�A'���ʂ���s�+טIjP�-��y�8ۈZ?J$��W�P� ��R�s�]��|�l(�ԓ��sƊi��o(��S0��Y� 8�T97.�����WiL��c�~�dxc�E|�2!�X�K�Ƙਫ਼�$((�6�~|d9u+�qd�^3�89��Y�6L�.I�����?���iI�q���9�)O/뚅����O���X��X�V��ZF[�یgQ�L��K1���RҖr@v�#��X�l��F���Нy�S�8�7�kF!A��sM���^rkp�jP�DyS$N���q��nxҍ!U�f�!eh�i�2�m���`�Y�I�9r�6� �TF���C}/�y�^���Η���5d�'��9A-��J��>{�_l+�`��A���[�'��յ�ϛ#w:݅�%��X�}�&�PSt�Q�"�-��\縵�/����$Ɨh�Xb�*�y��BS����;W�ջ_mc�����vt?2}1�;qS�d�d~u:2k5�2�R�~�z+|HE!)�Ǟl��7`��0�<�,�2*���Hl-��x�^����'_TV�gZA�'j� ^�2Ϊ��N7t�����?w�� �x1��f��Iz�C-Ȗ��K�^q�;���-W�DvT�7��8�Z�������� hK�(P:��Q- �8�n�Z���܃e貾�<�1�YT<�,�����"�6{/ �?�͟��|1�:�#g��W�>$����d��J��d�B��=��jf[��%rE^��il:��B���x���Sּ�1հ��,�=��*�7 fcG��#q� �eh?��2�7�����,�!7x��6�n�LC�4x��},Geǝ�tC.��vS �F�43��zz\��;QYC,6����~;RYS/6���|2���5���v��T��i����������mlv��������&� �nRh^ejR�LG�f���? �ۉҬܦƩ��|��Ȱ����>3����!v��i�ʯ�>�v��オ�X3e���_1z�Kȗ\<������!�8���V��]��?b�k41�Re��T�q��mz��TiOʦ�Z��Xq���L������q"+���2ۨ��8}�&N7XU7Ap�d�X��~�׿��&4e�o�F��� �H����O���č�c�� 懴�6���͉��+)��v;j��ݷ�� �UV�� i��� j���Y9GdÒJ1��詞�����V?h��l����l�cGs�ځ�������y�Ac�����\V3�? �� ܙg�>qH�S,�E�W�[�㺨�uch�⍸�O�}���a��>�q�6�n6����N6�q������N ! 1AQaq�0@����"2BRb�#Pr���3C`��Scst���$4D���%Td�� ?���N����a��3��m���C���w��������xA�m�q�m���m������$����4n淿t'��C"w��zU=D�\R+w�p+Y�T�&�պ@��ƃ��3ޯ?�Aﶂ��aŘ���@-�����Q�=���9D��ռ�ѻ@��M�V��P��܅�G5�f�Y<�u=,EC)�<�Fy'�"�&�չ�X~f��l�KԆV��?�� �W�N����=(� �;���{�r����ٌ�Y���h{�١������jW����P���Tc�����X�K�r��}���w�R��%��?���E��m�� �Y�q|����\lEE4���r���}�lsI�Y������f�$�=�d�yO����p�����yBj8jU�o�/�S��?�U��*������ˍ�0������u�q�m [�?f����a�� )Q�>����6#������� ?����0UQ����,IX���(6ڵ[�DI�MNލ�c&���υ�j\��X�R|,4��� j������T�hA�e��^���d���b<����n�� �즇�=!���3�^�`j�h�ȓr��jẕ�c�,ٞX����-����a�ﶔ���#�$��]w�O��Ӫ�1y%��L�Y<�wg#�ǝ�̗`�x�xa�t�w��»1���o7o5��>�m뭛C���Uƃߜ}�C���y1Xνm�F8�jI���]����H���ۺиE@I�i;r�8ӭ����V�F�Շ| ��&?�3|x�B�MuS�Ge�=Ӕ�#BE5G�����Y!z��_e��q�р/W>|-�Ci߇�t�1ޯќd�R3�u��g�=0 5��[?�#͏��q�cf���H��{ ?u�=?�?ǯ���}Z��z���hmΔ�BFTW�����<�q�(v� ��!��z���iW]*�J�V�z��gX֧A�q�&��/w���u�gYӘa���; �i=����g:��?2�dž6�ى�k�4�>�Pxs����}������G�9��3 ���)gG�R<>r h�$��'nc�h�P��Bj��J�ҧH� -��N1���N��?��~��}-q!=��_2hc�M��l�vY%UE�@|�v����M2�.Y[|y�"Eï��K�ZF,�ɯ?,q�?v�M 80jx�"�;�9vk�����+ ֧�� �ȺU��?�%�vcV��mA�6��Qg^M����A}�3�nl� QRN�l8�kkn�'�����(��M�7m9و�q���%ޟ���*h$Zk"��$�9��: �?U8�Sl��,,|ɒ��xH(ѷ����Gn�/Q�4�P��G�%��Ա8�N��!� �&�7�;���eKM7�4��9R/%����l�c>�x;������>��C�:�����t��h?aKX�bhe�ᜋ^�$�Iհ �hr7%F$�E��Fd���t��5���+�(M6�t����Ü�UU|zW�=a�Ts�Tg������dqP�Q����b'�m���1{|Y����X�N��b �P~��F^F:����k6�"�j!�� �I�r�`��1&�-$�Bevk:y���#yw��I0��x��=D�4��tU���P�ZH��ڠ底taP��6����b>�xa����Q�#� WeF��ŮNj�p�J* mQ�N����*I�-*�ȩ�F�g�3 �5��V�ʊ�ɮ�a��5F���O@{���NX��?����H�]3��1�Ri_u��������ѕ�� ����0��� F��~��:60�p�͈�S��qX#a�5>���`�o&+�<2�D����: �������ڝ�$�nP���*)�N�|y�Ej�F�5ټ�e���ihy�Z �>���k�bH�a�v��h�-#���!�Po=@k̆IEN��@��}Ll?j�O������߭�ʞ���Q|A07x���wt!xf���I2?Z��<ץ�T���cU�j��]��陎Ltl �}5�ϓ��$�,��O�mˊ�;�@O��jE��j(�ا,��LX���LO���Ц�90�O �.����a��nA���7������j4 ��W��_ٓ���zW�jcB������y՗+EM�)d���N�g6�y1_x��p�$Lv:��9�"z��p���ʙ$��^��JԼ*�ϭ����o���=x�Lj�6�J��u82�A�H�3$�ٕ@�=Vv�]�'�qEz�;I˼��)��=��ɯ���x �/�W(V���p�����$ �m�������u�����񶤑Oqˎ�T����r��㠚x�sr�GC��byp�G��1ߠ�w e�8�$⿄����/�M{*}��W�]˷.�CK\�ުx���/$�WPw���r� |i���&�}�{�X� �>��$-��l���?-z���g����lΆ���(F���h�vS*���b���߲ڡn,|)mrH[���a�3�ר�[1��3o_�U�3�TC�$��(�=�)0�kgP���� ��u�^=��4 �WYCҸ:��vQ�ר�X�à��tk�m,�t*��^�,�}D*� �"(�I��9R����>`�`��[~Q]�#af��i6l��8���6�:,s�s�N6�j"�A4���IuQ��6E,�GnH��zS�HO�uk�5$�I�4��ؤ�Q9�@��C����wp�BGv[]�u�Ov���0I4���\��y�����Q�Ѹ��~>Z��8�T��a��q�ޣ;z��a���/��S��I:�ܫ_�|������>=Z����8:�S��U�I�J��"IY���8%b8���H��:�QO�6�;7�I�S��J��ҌAά3��>c���E+&jf$eC+�z�;��V����� �r���ʺ������my�e���aQ�f&��6�ND��.:��NT�vm�<- u���ǝ\MvZY�N�NT��-A�>jr!S��n�O 1�3�Ns�%�3D@���`������ܟ 1�^c<���� �a�ɽ�̲�Xë#�w�|y�cW�=�9I*H8�p�^(4���՗�k��arOcW�tO�\�ƍR��8����'�K���I�Q�����?5�>[�}��yU�ײ -h��=��% q�ThG�2�)���"ו3]�!kB��*p�FDl�A���,�eEi�H�f�Ps�����5�H:�Փ~�H�0Dت�D�I����h�F3�������c��2���E��9�H��5�zԑ�ʚ�i�X�=:m�xg�hd(�v����׊�9iS��O��d@0ڽ���:�p�5�h-��t�&���X�q�ӕ,��ie�|���7A�2���O%P��E��htj��Y1��w�Ѓ!����  ���� ࢽ��My�7�\�a�@�ţ�J �4�Ȼ�F�@o�̒?4�wx��)��]�P��~�����u�����5�����7X ��9��^ܩ�U;Iꭆ 5 �������eK2�7(�{|��Y׎ �V��\"���Z�1� Z�����}��(�Ǝ"�1S���_�vE30>���p;� ΝD��%x�W�?W?v����o�^V�i�d��r[��/&>�~`�9Wh��y�;���R��� ;;ɮT��?����r$�g1�K����A��C��c��K��l:�'��3 c�ﳯ*"t8�~l��)���m��+U,z��`(�>yJ�?����h>��]��v��ЍG*�{`��;y]��I�T� ;c��NU�fo¾h���/$���|NS���1�S�"�H��V���T���4��uhǜ�]�v;���5�͠x��'C\�SBpl���h}�N����� A�Bx���%��ޭ�l��/����T��w�ʽ]D�=����K���ž�r㻠l4�S�O?=�k �M:� ��c�C�a�#ha���)�ѐxc�s���gP�iG��{+���x���Q���I= �� z��ԫ+ �8"�k�ñ�j=|����c ��y��CF��/��*9ж�h{ �?4�o� ��k�m�Q�N�x��;�Y��4膚�a�w?�6�>e]�����Q�r�:����g�,i"�����ԩA�*M�<�G��b�if��l^M��5� �Ҩ�{����6J��ZJ�����P�*�����Y���ݛu�_4�9�I8�7���������,^ToR���m4�H��?�N�S�ѕw��/S��甍�@�9H�S�T��t�ƻ���ʒU��*{Xs�@����f�����֒Li�K{H�w^���������Ϥm�tq���s� ���ք��f:��o~s��g�r��ט� �S�ѱC�e]�x���a��) ���(b-$(�j>�7q�B?ӕ�F��hV25r[7 Y� }L�R��}����*sg+��x�r�2�U=�*'WS��ZDW]�WǞ�<��叓���{�$�9Ou4��y�90-�1�'*D`�c�^o?(�9��u���ݐ��'PI&� f�Jݮ�������:wS����jfP1F:X �H�9dԯ���˝[�_54 �}*;@�ܨ�� ð�yn�T���?�ןd�#���4rG�ͨ��H�1�|-#���Mr�S3��G�3�����)�.᧏3v�z֑��r����$G"�`j �1t��x0<Ɔ�Wh6�y�6��,œ�Ga��gA����y��b��)��h�D��ß�_�m��ü �gG;��e�v��ݝ�nQ� ��C����-�*��o���y�a��M��I�>�<���]obD��"�:���G�A��-\%LT�8���c�)��+y76���o�Q�#*{�(F�⽕�y����=���rW�\p���۩�c���A���^e6��K������ʐ�cVf5$�'->���ՉN"���F�"�UQ@�f��Gb~��#�&�M=��8�ט�JNu9��D��[̤�s�o�~������ G��9T�tW^g5y$b��Y'��س�Ǵ�=��U-2 #�MC�t(�i� �lj�@Q 5�̣i�*�O����s�x�K�f��}\��M{E�V�{�υ��Ƈ�����);�H����I��fe�Lȣr�2��>��W�I�Ȃ6������i��k�� �5�YOxȺ����>��Y�f5'��|��H+��98pj�n�.O�y�������jY��~��i�w'������l�;�s�2��Y��:'lg�ꥴ)o#'Sa�a�K��Z� �m��}�`169�n���"���x��I ��*+� }F<��cГ���F�P�������ֹ*�PqX�x۩��,� ��N�� �4<-����%����:��7����W���u�`����� $�?�I��&����o��o��`v�>��P��"��l���4��5'�Z�gE���8���?��[�X�7(��.Q�-��*���ތL@̲����v��.5���[��=�t\+�CNܛ��,g�SQnH����}*F�G16���&:�t��4ُ"A��̣��$�b �|����#rs��a�����T�� ]�<�j��BS�('$�ɻ� �wP;�/�n��?�ݜ��x�F��yUn�~mL*-�������Xf�wd^�a�}��f�,=t�׵i�.2/wpN�Ep8�OР���•��R�FJ� 55TZ��T �ɭ�<��]��/�0�r�@�f��V��V����Nz�G��^���7hZi����k��3�,kN�e|�vg�1{9]_i��X5y7� 8e]�U����'�-2,���e"����]ot�I��Y_��n�(JҼ��1�O ]bXc���Nu�No��pS���Q_���_�?i�~�x h5d'�(qw52] ��'ޤ�q��o1�R!���`ywy�A4u���h<קy���\[~�4�\ X�Wt/� 6�����n�F�a8��f���z �3$�t(���q��q�x��^�XWeN'p<-v�!�{�(>ӽDP7��ո0�y)�e$ٕv�Ih'Q�EA�m*�H��RI��=:��� ���4牢) �%_iN�ݧ�l]� �Nt���G��H�L��� ɱ�g<���1V�,�J~�ٹ�"K��Q�� 9�HS�9�?@��k����r�;we݁�]I�!{ �@�G�[�"��`���J:�n]�{�cA�E����V��ʆ���#��U9�6����j�#Y�m\��q�e4h�B�7��C�������d<�?J����1g:ٳ���=Y���D�p�ц� ׈ǔ��1�]26؜oS�'��9�V�FVu�P�h�9�xc�oq�X��p�o�5��Ա5$�9W�V(�[Ak�aY錎qf;�'�[�|���b�6�Ck��)��#a#a˙��8���=äh�4��2��C��4tm^ �n'c���]GQ$[Wҿ��i���vN�{Fu ��1�gx��1┷���N�m��{j-,��x�� Ūm�ЧS�[�s���Gna���䑴�� x�p 8<������97�Q���ϴ�v�aϚG��Rt�Һ׈�f^\r��WH�JU�7Z���y)�vg=����n��4�_)y��D'y�6�]�c�5̪�\� �PF�k����&�c;��cq�$~T�7j ���nç]�<�g ":�to�t}�159�<�/�8������m�b�K#g'I'.W�����6��I/��>v��\�MN��g���m�A�yQL�4u�Lj�j9��#44�t��l^�}L����n��R��!��t��±]��r��h6ٍ>�yҏ�N��fU�� ���� Fm@�8}�/u��jb9������he:A�y�ծw��GpΧh�5����l}�3p468��)U��d��c����;Us/�֔�YX�1�O2��uq�s��`hwg�r~�{ R��mhN��؎*q 42�*th��>�#���E����#��Hv�O����q�}�����6�e��\�,Wk�#���X��b>��p}�դ��3���T5��†��6��[��@�P�y*n��|'f�֧>�lư΂�̺����SU�'*�q�p�_S�����M�� '��c�6�����m�� ySʨ;M��r���Ƌ�m�Kxo,���Gm�P��A�G�:��i��w�9�}M(�^�V��$ǒ�ѽ�9���|���� �a����J�SQ�a���r�B;����}���ٻ֢�2�%U���c�#�g���N�a�ݕ�'�v�[�OY'��3L�3�;,p�]@�S��{ls��X�'���c�jw�k'a�.��}�}&�� �dP�*�bK=ɍ!����;3n�gΊU�ߴmt�'*{,=SzfD� A��ko~�G�aoq�_mi}#�m�������P�Xhύ����mxǍ�΂���巿zf��Q���c���|kc�����?���W��Y�$���_Lv����l߶��c���`?����l�j�ݲˏ!V��6����U�Ђ(A���4y)H���p�Z_�x��>���e��R��$�/�`^'3qˏ�-&Q�=?��CFVR �D�fV�9��{�8g�������n�h�(P"��6�[�D���< E�����~0<@�`�G�6����Hг�cc�� �c�K.5��D��d�B���`?�XQ��2��ٿyqo&+�1^� DW�0�ꊩ���G�#��Q�nL3��c���������/��x ��1�1[y�x�პCW��C�c�UĨ80�m�e�4.{�m��u���I=��f�����0QRls9���f���������9���~f�����Ǩ��a�"@�8���ȁ�Q����#c�ic������G��$���G���r/$W�(��W���V�"��m�7�[m�A�m����bo��D� j����۳� l���^�k�h׽����� ��#� iXn�v��eT�k�a�^Y�4�BN��ĕ��0 !01@Q"2AaPq3BR������?���@4�Q�����T3,���㺠�W�[=JK�Ϟ���2�r^7��vc�:�9 �E�ߴ�w�S#d���Ix��u��:��Hp��9E!�� V 2;73|F��9Y���*ʬ�F��D����u&���y؟��^EA��A��(ɩ���^��GV:ݜDy�`��Jr29ܾ�㝉��[���E;Fzx��YG��U�e�Y�C���� ����v-tx����I�sם�Ę�q��Eb�+P\ :>�i�C'�;�����k|z�رn�y]�#ǿb��Q��������w�����(�r|ӹs��[�D��2v-%��@;�8<a���[\o[ϧw��I!��*0�krs)�[�J9^��ʜ��p1)� "��/_>��o��<1����A�E�y^�C��`�x1'ܣn�p��s`l���fQ��):�l����b>�Me�jH^?�kl3(�z:���1ŠK&?Q�~�{�ٺ�h�y���/�[��V�|6��}�KbX����mn[-��7�5q�94�������dm���c^���h� X��5��<�eޘ>G���-�}�دB�ޟ� ��|�rt�M��V+�]�c?�-#ڛ��^ǂ}���Lkr���O��u�>�-D�ry� D?:ޞ�U��ǜ�7�V��?瓮�"�#���r��չģVR;�n���/_� ؉v�ݶe5d�b9��/O��009�G���5n�W����JpA�*�r9�>�1��.[t���s�F���nQ� V 77R�]�ɫ8����_0<՜�IF�u(v��4��F�k�3��E)��N:��yڮe��P�`�1}�$WS��J�SQ�N�j�ٺ��޵�#l���ј(�5=��5�lǏmoW�v-�1����v,W�mn��߀$x�<����v�j(����c]��@#��1������Ǔ���o'��u+����;G�#�޸��v-lη��/(`i⣍Pm^���ԯ̾9Z��F��������n��1��� ��]�[��)�'������:�֪�W��FC����� �B9،!?���]��V��A�Վ�M��b�w��G F>_DȬ0¤�#�QR�[V��kz���m�w�"��9ZG�7'[��=�Q����j8R?�zf�\a�=��O�U����*oB�A�|G���2�54 �p��.w7� �� ��&������ξxGHp� B%��$g�����t�Џ򤵍z���HN�u�Я�-�'4��0��;_��3 !01"@AQa2Pq#3BR������?��ʩca��en��^��8���<�u#��m*08r��y�N"�<�Ѳ0��@\�p��� �����Kv�D��J8�Fҽ� �f�Y��-m�ybX�NP����}�!*8t(�OqѢ��Q�wW�K��ZD��Δ^e��!� ��B�K��p~�����e*l}z#9ң�k���q#�Ft�o��S�R����-�w�!�S���Ӥß|M�l޶V��!eˈ�8Y���c�ЮM2��tk���� ������J�fS����Ö*i/2�����n]�k�\���|4yX�8��U�P.���Ы[���l��@"�t�<������5�lF���vU�����W��W��;�b�cД^6[#7@vU�xgZv��F�6��Q,K�v��� �+Ъ��n��Ǣ��Ft���8��0��c�@�!�Zq s�v�t�;#](B��-�nῃ~���3g������5�J�%���O������n�kB�ĺ�.r��+���#�N$?�q�/�s�6��p��a����a��J/��M�8��6�ܰ"�*������ɗud"\w���aT(����[��F��U՛����RT�b���n�*��6���O��SJ�.�ij<�v�MT��R\c��5l�sZB>F��<7�;EA��{��E���Ö��1U/�#��d1�a�n.1ě����0�ʾR�h��|�R��Ao�3�m3 ��%�� ���28Q� ��y��φ���H�To�7�lW>����#i`�q���c����a��� �m,B�-j����݋�'mR1Ήt�>��V��p���s�0IbI�C.���1R�ea�����]H�6����������4B>��o��](��$B���m�����a�!=��?�B� K�Ǿ+�Ծ"�n���K��*��+��[T#�{E�J�S����Q�����s�5�:�U�\wĐ�f�3����܆&�)����I���Ԇw��E T�lrTf6Q|R�h:��[K�� �z��c֧�G�C��%\��_�a�84��HcO�bi��ؖV��7H �)*ģK~Xhչ0��4?�0��� �E<���}3���#���u�?�� ��|g�S�6ꊤ�|�I#Hڛ� �ա��w�X��9��7���Ŀ%�SL��y6č��|�F�a 8���b��$�sק�h���b9RAu7�˨p�Č�_\*w��묦��F ����4D~�f����|(�"m���NK��i�S�>�$d7SlA��/�²����SL��|6N�}���S�˯���g��]6��; �#�.��<���q'Q�1|KQ$�����񛩶"�$r�b:���N8�w@��8$�� �AjfG|~�9F ���Y��ʺ��Bwؒ������M:I岎�G��`s�YV5����6��A �b:�W���G�q%l�����F��H���7�������Fsv7��k�� 403WebShell
403Webshell
Server IP : 97.74.90.209  /  Your IP : 216.73.216.15
Web Server : Apache
System : Linux live.indianstaffingfederation.org 4.18.0-553.54.1.el8_10.x86_64 #1 SMP Tue May 27 22:49:52 EDT 2025 x86_64
User : indianstaffing ( 1003)
PHP Version : 8.3.22
Disable Function : exec,passthru,shell_exec,system
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/opt/nydus/ops/mysql/connector/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/opt/nydus/ops/mysql/connector/__pycache__/abstracts.cpython-39.pyc
a

Oh#h�v�	@sFUdZddlmZddlZddlZddlZddlmZmZddl	m
Z
m	Z	mZmZddl
mZddlmZddlmZdd	lmZdd
lmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"dZ#z ddl$Z$e%e$d�r�e$j&r�d
Z#Wne'y�Yn0ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ddl0m1Z1m2Z2ddl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9ddl:m;Z;m<Z<m=Z=m>Z>e>�r�ddl?m@Z@mAZAmBZBmCZCddlDmEZEddlFmGZGmHZHddlmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPddlQmRZRmSZSe�T�ZUdeVd<dZWdZXdZYdZZdZ[ee\e
e	e]e^e_eef	Z`Gdd �d eR�ZaGd!d"�d"e�ZbGd#d$�d$e�ZcdS)%z+Module gathering all abstract base classes.�)�annotationsN)�ABC�abstractmethod)�date�datetime�time�	timedelta)�Decimal)�	signature)�sleep)�
TracebackType)�Any�BinaryIO�Callable�Dict�	Generator�Iterator�List�Mapping�NoReturn�Optional�Sequence�Tuple�Type�UnionF�HAS_TLSv1_3T�)�
CONN_ATTRS_DN�DEFAULT_CONFIGURATION�OPENSSL_CS_NAMES�TLS_CIPHER_SUITES�TLS_VERSIONS�CharacterSet�
ClientFlag)�MySQLConverter�MySQLConverterBase)�
DatabaseError�Error�InterfaceError�NotSupportedError�OperationalError�ProgrammingError)�CONNECTION_SPAN_NAME�OPTION_CNX_SPAN�OPTION_CNX_TRACER�OTEL_ENABLED)�end_span�record_exception_event�set_connection_span_attrs�trace)�read_option_files)�UNACCEPTABLE_TLS_CIPHERSUITES�UNACCEPTABLE_TLS_VERSIONS)�BinaryProtocolType�DescriptionType�
HandShakeType�MySQLConvertibleType�RowItemType�RowType�
StrOrBytes�WarningType)�GenericWrapper�
import_objectz%weakref.WeakValueDictionary[Any, Any]�NAMED_TUPLE_CACHEzVThe '{list}' list must not contain repeated values, the value '{value}' is duplicated.zdThe given tls_version: '{}' is not recognized as a valid TLS protocol version (should be one of {}).zHThe given tls_version: '{}' are no longer allowed (should be one of {}).zINo supported TLS protocol version found in the 'tls-versions' list '{}'. aOption "krb_service_principal" {error}, must be a string in the form "primary/instance@realm" e.g "ldap/ldapauth@MYSQL.COM" where "@realm" is optional and if it is not given will be assumed to belong to the default realm, as configured in the krb5.conf file.c@seZdZdZdS)�CMySQLPrepStmtaPStructure to represent a result from `CMySQLConnection.cmd_stmt_prepare`.
    It can be used consistently as a type hint.

    `_mysql_connector.MySQLPrepStmt` isn't available when the C-ext isn't built.

    In this regard, `CmdStmtPrepareResult` acts as a proxy/wrapper entity for a
    `_mysql_connector.MySQLPrepStmt` instance.
    N)�__name__�
__module__�__qualname__�__doc__�rGrG�J/opt/nydus/tmp/pip-target-wgfnss67/lib/python/mysql/connector/abstracts.pyrB�srBc
@s�eZdZUdZdd�dd�Zdd�dd�Zdd	d
dd�dd
�Zdd�dd�Zedd�dd��Z	edd�dd��Z
edd�dd��Zddd�dd�Zddd�dd �Z
dd�d!d"�Zdd�d#d$�Zdd�d%d&�Zedd�d'd(��Zedd�d)d*��Zed+d�d,d-��Zed.d�d/d0��Zeedd�d1d2���Zejddd�d3d2��Zedd�d4d5��Zejddd�d6d5��Zed7d�d8d9��Zejd7dd�d:d9��Zd7dd;�d<d=�Zdd�d>d?�Zed�ddAd+ddB�dCdD��ZedEdFdG�dHdI��ZdJd�dKdL�Zd.d�dMdN�Z eedd�dOdP���Z!dQd+dR�dSdT�Z"dUd�dVdW�Z#d+ddX�dYdZ�Z$edd�d[d\��Z%e%jddd�d]d\��Z%edd�d^d_��Z&e&jd`dd�dad_��Z&eddbdc�ddde��Z'd�d.d.ddg�dhdi�Z(d�ddd�dkdl�Z)edd�dmdn��Z*e*jddd�dodn��Z*edd�dpdq��Z+e+jddd�drdq��Z+edd�dsdt��Z,e,jddd�dudt��Z,edd�dvdw��Z-e-jddd�dxdw��Z-edd�dydz��Z.edd�d{d|��Z/d�d}d.dd~�dd��Z0edd�d�d���Z1eed�d�d�d����Z2edd�d�d���Z3edd�d�d���Z4dd�d�d��Z5edd�d�d���Z6e6Z7d�e8d�<d7dd;�d�d��Z9d�d+d+dd��d�d��Z:edd�d�d���Z;ed�dd+d+dd��d�d���Z<edd�d�d���Z=ed�d�d�d�d�d�d�d�d��d�d���Z>edddc�d�d���Z?edd�d�d���Z@d�dd.d�dd��d�d��ZA�dd�d�dd��d�d��ZBd�dd��d�d��ZCe�ddd�d�d�d�d��d�d���ZDe�dd�dd�d�d�d�d��d�d���ZEedd�d��d�d���ZFe�ddd�ddd�d��d�d„�ZGedd�dĜd�dƄ�ZHed+d�dǜd�dɄ�ZIed�d�d�d̄�ZJe�dd�dd͜d�dτ�ZKed�d�d�dф�ZLedUd�d�dӄ�ZMed+d�dԜd�dք�ZNed�d�d�d؄�ZOed�d�d�dڄ�ZPe�ddddd+dddddd�dݜ
d�d߄�ZQed�d�d�d�d��ZRe�dd�d�d�d+d�d�d�d��ZSed�dd�d�d��ZTed�d+d�d+d�d�d��ZUed�dd�d�d���ZVedd�d�d���ZWdfS(�MySQLConnectionAbstractz8Abstract class for classes connecting to a MySQL server.�None��returncCsXd|_d|_d|_t��|_d|_d|_d|_d|_	d|_
d|_i|_d|_
d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_i|_td	|_d|_d|_d|_d|_d|_d|_ d|_!d|_"td
|_#d|_$d|_%d|_&d|_'d|_(td|_)td|_*d|_+i|_,d|_-d|_.d|_/d|_0d|_1d|_2d|_3d|_4d|_5d|_6t7�|_8dS)
Z
InitializeNT�-F�z	127.0.0.1i�r�ssl_disabled�connect_timeout�allow_local_infile�allow_local_infile_in_path)9�_tracer�_spanZotel_context_propagationr#�get_default�
_client_flags�_charset_id�	_sql_mode�
_time_zone�_autocommit�_server_version�
_handshake�_conn_attrs�_user�	_password�
_password1Z
_password2Z
_password3�	_database�_host�_port�_unix_socketZ_client_hostZ_client_port�_sslr�
_ssl_disabledZ_force_ipv6Z_oci_config_fileZ_oci_config_profile�_webauthn_callback�_krb_service_principal�_use_unicode�
_get_warnings�_raise_on_warningsZ_connection_timeoutZ	_buffered�_unread_result�_have_next_result�_rawZ_in_transaction�_allow_local_infile�_allow_local_infile_in_pathZ_prepared_statements�_query_attrs�_ssl_active�_auth_plugin�_auth_plugin_class�_pool_config_version�	converter�_converter_class�_converter_str_fallback�	_compress�_consume_results�
_init_commandr"�_character_set��selfrGrGrH�__init__�sr

�
�z MySQLConnectionAbstract.__init__cCs|S�NrGr}rGrGrH�	__enter__�sz!MySQLConnectionAbstract.__enter__�Type[BaseException]�
BaseExceptionr��exc_type�	exc_value�	tracebackrLcCs|��dSr���close�r~r�r�r�rGrGrH�__exit__�sz MySQLConnectionAbstract.__exit__cCs|S)z�Returns self for `weakref.proxy`.

        This method is used when the original object is needed when using
        `weakref.proxy`.
        rGr}rGrGrH�get_self�sz MySQLConnectionAbstract.get_self�boolcCs|jp|jduotjdkS)z)Returns `True` if is a secure connection.N�posix)rrrd�os�namer}rGrGrH�	is_secures�z!MySQLConnectionAbstract.is_securecCs|jS)zReturns If have next result.)rmr}rGrGrH�have_next_result
sz(MySQLConnectionAbstract.have_next_resultz$List[Tuple[str, BinaryProtocolType]]cCst|j���S)zReturns query attributes list.)�listrq�itemsr}rGrGrH�query_attrssz#MySQLConnectionAbstract.query_attrszTuple[str, BinaryProtocolType])�valuerLcCs |\}}||jvr||j|<dS)aAdds element to the query attributes list on the connector's side.

        If an element in the query attributes list already matches
        the attribute name provided, the new element will NOT be added.

        Args:
            value: key-value as a 2-tuple.
        N�rq)r~r��	attr_name�
attr_valuerGrGrH�query_attrs_appends	
z*MySQLConnectionAbstract.query_attrs_append�strr7�r�rLcCs|j�|d�S)z�Removes element by name from the query attributes list on the connector's side.

        If no match, `None` is returned, else the corresponding value is returned.

        Args:
            name: key name.
        N)rq�pop�r~r�rGrGrH�query_attrs_remove!sz*MySQLConnectionAbstract.query_attrs_removecCs
i|_dS)z5Clears query attributes list on the connector's side.Nr�r}rGrGrH�query_attrs_clear+sz)MySQLConnectionAbstract.query_attrs_clearcCs�g}|jd}t|t�r�|�d�r,|�d�s<td|�d���|dd��d�}|sZtd	��|D]}|����}|r^|�	|�q^n.t|t
tf�r�d
d�|D�}ntd|�d���|j�d
d�dur�t
dd�n|jd
dd�}|jdd�|d}ggg}i}g}	t
dt
�|�d�D]"}
|�t|
�|	�t|
��q|D]�}d|v�r�||	v�r�|tdv�rv|d�	|�n|d�	|�nt||v�r�||}||v�r�ttjd|d���|tdv�r�|d�	||�n|d�	||�ntd|�d����q@|d�s|d�std��|dD](}
|
td��v�r"td|
�d����q"|dD](}
|
td��v�rTtd|
�d����qTd�|d�d�|d�g|jd<dS)z&Validates the tls_ciphersuites option.�tls_ciphersuites�[�]z)tls_ciphersuites must be a list, found: '�'r����,z6No valid cipher suite found in 'tls_ciphersuites' listcSsg|]}|r|�qSrGrG)�.0�tls_csrGrGrH�
<listcomp>D�zFMySQLConnectionAbstract._validate_tls_ciphersuites.<locals>.<listcomp>zItls_ciphersuites should be a list with one or more ciphersuites. Found: '�tls_versionsNT)�reverser�-�TLSv1.3�r�r�zThe value 'z1' in tls_ciphersuites is not a valid cipher suitez:No valid cipher suite found in the 'tls_ciphersuites' listzTLSv1.2zCipher z( when used with TLSv1.2 is unacceptable.z( when used with TLSv1.3 is unacceptable.�:)re�
isinstancer��
startswith�endswith�AttributeError�split�strip�upper�appendr��set�getr!�sort�index�updater �extendr�DUPLICATED_IN_LIST_ERROR�formatr5�valuesr)�join)r~r�r�Ztls_cssZ_tls_csr�Z
newer_tls_verZtranslated_namesZiani_cipher_suites_namesZossl_cipher_suites_names�tls_verr�Ztranslated_nameZcipher_as_osslrGrGrH�_validate_tls_ciphersuites/s�


������

��
��
�
��z2MySQLConnectionAbstract._validate_tls_ciphersuitescCs�g}|jd}t|t�r�|�d�r,|�d�s<td|�d���|dd��d�}|D]:}|��}|d	krhqR||vr�ttj	d|d
���|�
|�qR|dgkr�ts�tt�	|t
���n�t|t�r�|s�td��|D](}||vr�ttj	d|d
���|�
|�q�n@t|t��r|D]}|�
|��qntd
d�t
��d|�d���|�sBtd��g}g}g}|D]:}|t
v�rj|�
|�|tv�r�|�
|�n
|�
|��qR|�r�|dgk�r�t�s�tt�	|t
���||jd<n.|�r�tt�	|t
���n|�r�tt�	|t
���dS)z"Validates the tls_versions option.r�r�r�z%tls_versions must be a list, found: 'r�rr�r�rNr�r�zJAt least one TLS protocol version must be specified in 'tls_versions' listz>tls_versions should be a list with one or more of versions in z, z
. found: 'zdAt least one TLS protocol version must be specified in 'tls_versions' list when this option is givenN)rer�r�r�r�r�r�r�r�r�r��TLS_V1_3_SUPPORTED�TLS_VER_NO_SUPPORTEDr!r�r�r�r6r)�TLS_VERSION_UNACCEPTABLE_ERROR�TLS_VERSION_ERROR)r~r�Ztls_versionZtls_versr�Zuse_tls_versionsZunacceptable_tls_versionsZinvalid_tls_versionsrGrGrH�_validate_tls_versions�s�


���
�
�������



���z.MySQLConnectionAbstract._validate_tls_versionscCs|jS)z6The user name used for connecting to the MySQL server.)r^r}rGrGrH�user�szMySQLConnectionAbstract.usercCs|jS)z MySQL server IP address or name.)rbr}rGrGrH�server_host�sz#MySQLConnectionAbstract.server_host�intcCs|jS)zMySQL server TCP/IP port.)rcr}rGrGrH�server_port�sz#MySQLConnectionAbstract.server_portz
Optional[str]cCs|jS)z8The Unix socket file for connecting to the MySQL server.)rdr}rGrGrH�unix_socket�sz#MySQLConnectionAbstract.unix_socketcCsdS)zThe current database.NrGr}rGrGrH�database�sz MySQLConnectionAbstract.databasecCs|�d|���dS)zSets the current database.zUSE N)�	cmd_query�r~r�rGrGrHr��scCs|jS)z#Returns whether to consume results.)rzr}rGrGrH�can_consume_results�sz+MySQLConnectionAbstract.can_consume_resultscCst|t�sJ�||_dS)zSets if can consume results.N)r�r�rzr�rGrGrHr�sr
cCs|jS)z'Returns the pool configuration version.�rur}rGrGrH�pool_config_versionsz+MySQLConnectionAbstract.pool_config_versioncCs
||_dS)z#Sets the pool configuration versionNr�r�rGrGrHr�
s)�kwargsrLc
Ks|�td�|_|�td�|_|��}d|vr4td��tfi|��}z|d|_|d=Wnt	yhYn0z|d|_
|d=Wnt	y�Yn0z$t��}|�
|dp�|�|d=Wnt	y�Yn0z |dr�d|_|�
tjg�Wnt	y�Yn0|�d	td	�|_|�d
td
�|_d}|j�rttj�|j�}|�r^tj�|��r^tj�|��rltj�|��rttd��|j�s�|j�r�|�
tjg�n|�
tjg�z|d�s�d
|_nd|_Wnt	�y�d
|_Yn0z|d|_|d=Wnt	�y
d|_Yn0|jdk�r*td|j�d���z|�|d�WnBt	�yPYn0t �y~}ztd�|�WYd}~n
d}~00gd�}|D]@\}}z ||v�r�||||<||=Wnt	�y�Yn0�q�d|v�s�d|v�rJz|d}	|d=Wnt	�y|j!}	Yn0z|d}
|d=Wnt	�y<|j"}
Yn0|�#|	|
�d|v�rh|d�rh|d|_$zt%|d�|_&|d=WnBt	�y�Yn0t'�y�}ztd�|�WYd}~n
d}~00d|v�r�|�d�|_(d|v�r�|d|_)|d=d
}|�*�D]�\}}
zt|Wn&t	�y:td|�d��d�Yn0|�+d��rfd}|j,�-|�.dd�|
i�n`|�+d��r�d}|j,�-||
i�n>d |}zt/|||
�0��Wn t�y�t/|||
�Yn0�q|j1�r�tj2d!k�r�d|_(|j(�r|jd"k�rtd#��|�r
d$|j,v�r td%|j,d$<d&|j,v�r:td'|j,d&<d(|j,v�sV|j,d(du�r`d|j,d(<t3d)|j,v�t3d*|j,v�k�r�td+��t4d,�t4|j,�k�s�d|j,d)<d|j,d*<n&|j,d)du|j,d*duk�r�td-��|j,�d.�du�r�|�5�|j,�d/�du�r
|�6�|j7du�ri|_7n�t8|j7t9��s6td0��n�|j7�*�D]�\}}|t:v�rV�q@t8|t;��sztd1|�d2|j7�d���t<|�d3k�r�td4|�d5���|�+d ��r�td6��t8|t;��s�td7|�d8|�d9���t<|�d:k�r@td7|�d8|�d;����q@|j=tj>@�r|�?�d<|v�r�|d<du�r�t8|d<t;��s<td=��|d<�@�}|d>k�rntj2d?k�rftd@��dA|_An|dBk�r�dC|_AntdD��dE|v�r|dEdu�r|dE|_Bt8|jBt;��s�ttCjDdFdG���|jBdk�r�ttCjDdHdG���dI|jBv�rttCjDdJdG���|jE�r|�FdK|jEdL�dS)MaConfigures the MySQL Connection.

        This method allows you to configure the `MySQLConnection`
        instance after it has been instantiated.

        Args:
            **kwargs: For a complete list of possible arguments, see [1].

        Raises:
            AttributeError: When provided unsupported connection arguments.
            InterfaceError: When the provided connection argument is invalid.

        References:
            [1]: https://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html
        NZdsnz!Data source name is not supported�get_warnings�raise_on_warningsZclient_flags�compressTrQrRz.allow_local_infile_in_path must be a directoryZconsume_resultsFZauth_pluginrNZauthentication_webauthn_clientr�z5' cannot be used as the default authentication pluginZconverter_classzEConverter class should be a subclass of conversion.MySQLConverterBase))�dbr�)�usernamer�)�passwd�password)rPZconnection_timeout)Zread_default_fileZoption_filesr�r��host�portz'TCP/IP port number should be an integerrOZinit_commandzUnsupported argument '�ssl_Ztls_�_r�Zmysql_clear_passwordzEClear password authentication is not supported over insecure channelsZverify_certZssl_verify_certZverify_identityZssl_verify_identity�ca�key�certz:ssl_key and ssl_cert need to be both specified, or neither)r�r�z4ssl_key and ssl_cert need to be both set, or neitherr�r�zconn_attrs must be of type dictz+Attribute name should be a string, found: 'z' in '� zAttribute name 'z"' exceeds 32 characters limit sizezNKey names in connection attributes cannot start with '_', found: '{attr_name}'zAttribute 'z
' value: 'z' must be a string typeiz$' exceeds 1024 characters limit size�kerberos_auth_modez('kerberos_auth_mode' must be of type strZsspi�ntz6'kerberos_auth_mode=SSPI' is only available on WindowsZMySQLSSPIKerberosAuthPluginZgssapiZMySQLKerberosAuthPluginz@Invalid 'kerberos_auth_mode' mode. Please use 'SSPI' or 'GSSAPI'Zkrb_service_principalzis not a string)�errorzcan not be an empty string�/zis incorrectly formattedZwebauth_callbackr)Gr�r-rTr.rS�copyr)r4r��KeyErrorr�r#rU�set_client_flagsryZCOMPRESSr�rrorpr��path�abspath�exists�isdir�islinkr�ZLOCAL_FILESrzrsr(�set_converter_class�	TypeErrorr^r_�	set_loginrbr�rc�
ValueErrorrfr{r�r�rer��replace�setattrr�rdr�r�r�r�r�r]r��dictrr��lenrVZCONNECT_ARGS�_add_default_conn_attrs�lowerrtrh�KRB_SERVICE_PINCIPAL_ERRORr�rg�_validate_callable)r~r��config�defaultZinfile_in_path�errZ
compat_map�compat�	translater�r�Zset_ssl_flagr�r��	attributer�r�r�rGrGrHr�s�




���
�
�
�



���






 


��

�
�

���
����
�
��
�

���
�zMySQLConnectionAbstract.configcCsdS)z'Adds the default connection attributes.NrGr}rGrGrHr�>sz/MySQLConnectionAbstract._add_default_conn_attrsrzUnion[str, Callable])�option_name�callback�num_argsrLc
Cs�t|t�rHzt|�}Wn0tyF}zt|��|�WYd}~n
d}~00t|�s`td|�d���tt|�j�}||kr�td|�d|�d|����dS)a�Validates if it's a Python callable.

         Args:
             option_name (str): Connection option name.
             callback (str or callable): The fully qualified path to the callable or
                                         a callable.
             num_args (int): Number of positional arguments allowed.

        Raises:
             ProgrammingError: If `callback` is not valid or wrong number of positional
                               arguments.

        .. versionadded:: 8.2.0
        NzExpected a callable for 'r�z' requires z4 positional argument, but the callback provided has )	r�r�r@r�r+�callabler�r
�
parameters)rrrr�Z
num_paramsrGrGrHr�As
"��z*MySQLConnectionAbstract._validate_callabler=zTuple[int, ...])�server_versionrLcCspt|ttf�r|��}t�d�}|�|�}|s6td��tdd�|�	�dd�D��}|dkrltd|�d	���|S)
a9Checks the MySQL version.

        This method will check the MySQL version and raise an InterfaceError
        when it is not supported or invalid. It will return the version
        as a tuple with major, minor and patch.

        Raises InterfaceError if invalid server version.

        Returns tuple
        z$^(\d{1,2})\.(\d{1,2})\.(\d{1,3})(.*)zFailed parsing MySQL versioncss|]}t|�VqdSr�)r�)r��vrGrGrH�	<genexpr>xr�z@MySQLConnectionAbstract._check_server_version.<locals>.<genexpr>r�)�rzMySQL Version 'z' is not supported)
r��	bytearray�bytes�decode�re�compile�matchr(�tuple�groups)rZ	regex_verr�versionrGrGrH�_check_server_versionds

z-MySQLConnectionAbstract._check_server_versionzOptional[Tuple[int, ...]]cCs|jS)z�Gets the MySQL version.

        Returns:
            The MySQL server version as a tuple. If not previously connected, it will
            return `None`.
        )r[r}rGrGrH�get_server_version~sz*MySQLConnectionAbstract.get_server_versionc	Cs*z|jdWSttfy$YdS0dS)z�Gets the original MySQL version information.

        Returns:
            The original MySQL server as text. If not previously connected, it will
            return `None`.
        Zserver_version_originalN)r\r�r�r}rGrGrH�get_server_info�sz'MySQLConnectionAbstract.get_server_infocCsdS)aMReturns bool to indicate whether a transaction is active for the connection.

        The value is `True` regardless of whether you start a transaction using the
        `start_transaction()` API call or by directly executing an SQL statement such
        as START TRANSACTION or BEGIN.

        `in_transaction` was added in MySQL Connector/Python 1.1.0.

        Examples:
            ```
            >>> cnx.start_transaction()
            >>> cnx.in_transaction
            True
            >>> cnx.commit()
            >>> cnx.in_transaction
            False
            ```
        NrGr}rGrGrH�in_transaction�sz&MySQLConnectionAbstract.in_transactionzUnion[int, Sequence[int]])�flagsrLcCsnt|t�r|dkr||_nNt|ttf�r`|D]0}|dkrN|jt|�M_q,|j|O_q,ntd��|jS)a�Sets the client flags.

        The flags-argument can be either an int or a list (or tuple) of
        ClientFlag-values. If it is an integer, it will set client_flags
        to flags as is.

        If flags is a sequence, each item in the sequence sets the flag when the
        value is positive or unsets it when negative (see example below).

        Args:
            flags: A list (or tuple), each flag will be set or unset when it's negative.

        Returns:
            integer: Client flags.

        Raises:
            ProgrammingError: When the flags argument is not a set or an integer
                              bigger than 0.

        Examples:
            ```
            For example, to unset `LONG_FLAG` and set the `FOUND_ROWS` flags:
            >>> from mysql.connector.constants import ClientFlag
            >>> cnx.set_client_flags([ClientFlag.FOUND_ROWS, -ClientFlag.LONG_FLAG])
            >>> cnx.reconnect()
            ```
        rz+set_client_flags expect integer (>0) or set)r�r�rVrr��absr+)r~r�flagrGrGrHr��sz(MySQLConnectionAbstract.set_client_flagsrcCst�dS)akShuts down connection to MySQL Server.

        This method closes the socket. It raises no exceptions.

        Unlike `disconnect()`, `shutdown()` closes the client connection without
        attempting to send a `QUIT` command to the server first. Thus, it will not
        block if the connection is disrupted for some reason such as network failure.
        N)�NotImplementedErrorr}rGrGrH�shutdown�s	z MySQLConnectionAbstract.shutdown)rrLcCs|j|@dkS)z|Checks if a client flag is set.

        Returns:
            `True` if the client flag was set, `False` otherwise.
        r)rV)r~rrGrGrH�isset_client_flag�sz)MySQLConnectionAbstract.isset_client_flagcCs|�d�dS)zGets the current time zone.zSELECT @@session.time_zoner��
info_queryr}rGrGrH�	time_zone�s�z!MySQLConnectionAbstract.time_zonecCs|�d|�d��||_dS)zSets the time zone.zSET @@session.time_zone = 'r�N)r�rYr�rGrGrHr"�scCs |jdur|�d�d|_|jS)zGets the SQL mode.NzSELECT @@session.sql_moder)rXr!r}rGrGrH�sql_mode�s
z MySQLConnectionAbstract.sql_modezUnion[str, Sequence[int]]cCs4t|ttf�rd�|�}|�d|�d��||_dS)a�Sets the SQL mode.

        This method sets the SQL Mode for the current connection. The value
        argument can be either a string with comma separate mode names, or
        a sequence of mode names.

        It is good practice to use the constants class `SQLMode`:
        ```
        >>> from mysql.connector.constants import SQLMode
        >>> cnx.sql_mode = [SQLMode.NO_ZERO_DATE, SQLMode.REAL_AS_FLOAT]
        ```
        r�zSET @@session.sql_mode = 'r�N)r�r�rr�r�rXr�rGrGrHr#�s
zOptional[RowType])�queryrLcCsdS)a9Sends a query which only returns 1 row.

        Shortcut for:

        ```
        cursor = self.cursor(buffered=True)
        cursor.execute(query)
        return cursor.fetchone()
        ```

        Args:
            query: Statement to execute.

        Returns:
            row: A tuple (RowType).
        NrG�r~r$rGrGrHr!sz"MySQLConnectionAbstract.info_queryN)r�r�rLcCs4|dur|��|_nd|_|dur*||_nd|_dS)z�Sets login information for MySQL.

        Sets the username and/or password for the user connecting to the MySQL Server.

        Args:
            username: Account's user name.
            password: Account's password.
        NrN)r�r^r_)r~r�r�rGrGrHr�sz!MySQLConnectionAbstract.set_loginTcCs||_|jr|j�|�dS)z�Toggles unicode mode.

        Sets whether we return string fields as unicode or not.

        Args:
            value: A boolean - default is `True`.
        N)rirv�set_unicoder�rGrGrHr&2sz#MySQLConnectionAbstract.set_unicodecCs|�d�d}|dkS)z%Gets whether autocommit is on or off.zSELECT @@session.autocommitrrr r�rGrGrH�
autocommit>sz"MySQLConnectionAbstract.autocommitcCs&|rdnd}|�d|���||_dS)zToggles autocommit.�ONZOFFzSET @@session.autocommit = N)r�rZ)r~r��switchrGrGrHr'DscCs|jS)z�Gets whether this connection retrieves warnings automatically.

        This method returns whether this connection retrieves warnings
        automatically.

        Returns `True`, or `False` when warnings are not retrieved.
        )rjr}rGrGrHr�Ks	z$MySQLConnectionAbstract.get_warningscCst|t�std��||_dS)z�Sets whether warnings should be automatically retrieved.

        The toggle-argument must be a boolean. When True, cursors for this
        connection will retrieve information about warnings (if any).

        Raises `ValueError` on error.
        �Expected a boolean typeN)r�r�r�rjr�rGrGrHr�Vs	
cCs|jS)z�Gets whether this connection raises an error on warnings.

        This method returns whether this connection will raise errors when
        MySQL reports warnings.

        Returns `True` or `False`.
        )rkr}rGrGrHr�cs	z)MySQLConnectionAbstract.raise_on_warningscCs&t|t�std��||_|r"||_dS)a�Sets whether warnings raise an error.

        The toggle-argument must be a boolean. When True, cursors for this
        connection will raise an error when MySQL reports warnings.

        Raising on warnings implies retrieving warnings automatically. In
        other words: warnings will be set to True. If set to False, warnings
        will be also set to False.

        Raises `ValueError` on error.
        r*N)r�r�r�rkrjr�rGrGrHr�ns

cCs|jS)z�Gets whether there is an unread result.

        This method is used by cursors to check whether another cursor still
        needs to retrieve its result set.

        Returns `True`, or `False` when there is no unread result.
        )rlr}rGrGrH�
unread_result�s	z%MySQLConnectionAbstract.unread_resultcCst|t�std��||_dS)z�Sets whether there is an unread result.

        This method is used by cursors to let other cursors know there is
        still a result set that needs to be retrieved.

        Raises `ValueError` on errors.
        r*N)r�r�r�rlr�rGrGrHr+�s	
cCs|j�|j�dS)a,Returns the character set for current connection.

        This property returns the character set name of the current connection.
        The server is queried when the connection is active. If not connected,
        the configured character set name is returned.

        Returns a string.
        r�r|�get_inforWr}rGrGrH�charset�s
zMySQLConnectionAbstract.charsetcCs"|j�|j�d}|dvrdS|S)azReturns the Python character set for current connection.

        This property returns the character set name of the current connection.
        Note that, unlike property charset, this checks if the previously set
        character set is supported by Python and if not, it returns the
        equivalent character set that Python supports.

        Returns a string.
        r)Zutf8mb4Zutf8mb3�binary�utf8r,)r~�encodingrGrGrH�python_charset�sz&MySQLConnectionAbstract.python_charsetzOptional[Union[int, str]])r.�	collationrLcCs.d}t|ttf�s(|dur(t|�d���t|t�sB|durBtd��|r�t|t�rf|j�|�\|_}}q�t|t�r�|j�||�\|_}}q�t|�d���n<|r�|jj|d�\|_}}n td}|jj|dd�\|_}}|�	d|�d|�d��z|�
|�Wnt�yYn0|j�r*|jj
||jd	�dS)
a�Sets the character set and collation for the current connection.

        This method sets the character set and collation to be used for
        the current connection. The charset argument can be either the
        name of a character set as a string, or the numerical equivalent
        as defined in constants.CharacterSet.

        When the collation is not given, the default will be looked up and
        used.

        Args:
            charset: Can be either the name of a character set, or the numerical
                     equivalent as defined in `constants.CharacterSet`.
            collation: When collation is `None`, the default collation for the
                       character set is used.

        Examples:
            The following will set the collation for the latin1 character set to
            `latin1_general_ci`:
            ```
            >>> cnx = mysql.connector.connect(user='scott')
            >>> cnx.set_charset_collation('latin1', 'latin1_general_ci')
            ```
        z+{} should be either integer, string or NoneNr.z)collation should be either string or None)r3zSET NAMES 'z' COLLATE 'r�)Z
character_set)r�r�r�r�r�r|�get_charset_inforWr�_execute_queryZset_character_set_namer�rv�set_charset)r~r.r3�err_msg�charset_nameZcollation_namerGrGrH�set_charset_collation�sR

��
�����z-MySQLConnectionAbstract.set_charset_collationcCs|j�|j�dS)a Returns the collation for current connection.

        This property returns the collation name of the current connection.
        The server is queried when the connection is active. If not connected,
        the configured collation name is returned.

        Returns a string.
        �)r|r4rWr}rGrGrHr3s
z!MySQLConnectionAbstract.collation�
Optional[int]cCsdS)zMySQL connection ID.NrGr}rGrGrH�
connection_idsz%MySQLConnectionAbstract.connection_idcCsdS)z>Gathers information of the MySQL server before authentication.NrGr}rGrGrH�
_do_handshakesz%MySQLConnectionAbstract._do_handshakecCsdS)z)Opens the connection to the MySQL server.NrGr}rGrGrH�_open_connectionsz(MySQLConnectionAbstract._open_connectioncCsF|�|j�|j|_|jr"|j|_|jr0|j|_|jrB|�	|j�dS)z�Executes commands after connection has been established.

        This method executes commands after the connection has been
        established. Some setting like autocommit, character set, and SQL mode
        are set using this method.
        N)
r9rWrZr'rYr"rXr#r{r5r}rGrGrH�_post_connectionsz(MySQLConnectionAbstract._post_connectioncCsdS)aDisconnects from the MySQL server.

        This method tries to send a `QUIT` command and close the socket. It raises
        no exceptions.

        `MySQLConnection.close()` is a synonymous for `MySQLConnection.disconnect()`
        method name and more commonly used.

        To shut down the connection without sending a `QUIT` command first,
        use `shutdown()`.
        NrGr}rGrGrH�
disconnect)sz"MySQLConnectionAbstract.disconnectzCallable[[], Any]r�cKs�|r|jfi|��|��|��|�dd�|�dd�}}|sF|rZ|j�||�d|_|jtj	@sp|�
�nXz|j|jd�WnDty�|�
d|jp�|j�d��|j|jd�|�
d�Yn0dS)	a
Connects to the MySQL server.

        This method sets up the connection to the MySQL server. If no
        arguments are given, it will use the already configured or default
        values.

        Args:
            **kwargs: For a complete list of possible arguments, see [1].

        Examples:
            ```
            >>> cnx = MySQLConnection(user='joe', database='test')
            ```

        References:
            [1]: https://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html
        r.Nr3r)r.zSET PASSWORD = 'r�z)ALTER USER CURRENT_USER() PASSWORD EXPIRE)r�r@r>r�r|r4rWrVr#ZCAN_HANDLE_EXPIRED_PASSWORDSr?r9r&r�r`r_)r~r�r.r3rGrGrH�connect9s&

��
zMySQLConnectionAbstract.connectr)�attempts�delayrLc
Csd}d}|jr"|jjttjjd�}z�||kr�|d}z |��|��|��rRWq�WnJt	t
fy�}z.||kr�d|�d|��}t|�|�WYd}~n
d}~00|dkr$t|�q$WnFty�}z.t
r�t||�t||�t|��WYd}~n
d}~00||_t
�rt||j�dS)a�Attempts to reconnect to the MySQL server.

        The argument `attempts` should be the number of times a reconnect
        is tried. The `delay` argument is the number of seconds to wait between
        each retry.

        You may want to set the number of attempts higher and use delay when
        you expect the MySQL server to be down for maintenance or when you
        expect the network to be temporary unavailable.

        Args:
            attempts: Number of attempts to make when reconnecting.
            delay: Use it (defined in seconds) if you want to wait between each retry.

        Raises:
            InterfaceError: When reconnection fails.
        rN)r��kindrz!Can not reconnect to MySQL after z
 attempt(s): )rSZ
start_spanr,r3ZSpanKindZCLIENTr@rA�is_connectedr'�IOErrorr(rr/r2r1r0rT)r~rBrC�counter�spanr��msgZ
interface_errrGrGrH�	reconnectos@��� 

z!MySQLConnectionAbstract.reconnectcCsdS)aReports whether the connection to MySQL Server is available or not.

        Checks whether the connection to MySQL is available using the `ping()` method,
        but unlike `ping()`, `is_connected()` returns `True` when the connection is
        available, `False` otherwise
        NrGr}rGrGrHrE�sz$MySQLConnectionAbstract.is_connectedF)rJrBrCrLcCsdS)a�Checks availability of the MySQL server.

        When reconnect is set to `True`, one or more attempts are made to try
        to reconnect to the MySQL server using the reconnect()-method.

        `delay` is the number of seconds to wait between each retry.

        When the connection is not available, an InterfaceError is raised.

        Args:
            reconnect: If True, one or more `attempts` are made to try to reconnect
                       to the MySQL server, and these options are forwarded to the
                       `reconnect()` method.
            attempts: Number of attempts to make when reconnecting.
            delay: Use it (defined in seconds) if you want to wait between each retry.

        Raises:
            InterfaceError: When the connection is not available. Use the
                            `is_connected()` method if you just want to check the
                            connection without raising an error.
        NrG)r~rJrBrCrGrGrH�ping�szMySQLConnectionAbstract.pingcCsdS)a�Commits current transaction.

        This method is part of PEP 249 - Python Database API Specification v2.0.

        This method sends a COMMIT statement to the MySQL server, committing the
        current transaction. Since by default Connector/Python does not autocommit.

        It is important to call this method after every transaction that modifies
        data for tables that use transactional storage engines.

        Examples:
            ```
            >>> stmt = "INSERT INTO employees (first_name) VALUES (%s), (%s)"
            >>> cursor.execute(stmt, ('Jane', 'Mary'))
            >>> cnx.commit()
            ```
        NrGr}rGrGrH�commit�szMySQLConnectionAbstract.commitzOptional[bool]z%Optional[Type['MySQLCursorAbstract']]z'MySQLCursorAbstract')�buffered�raw�prepared�cursor_class�
dictionary�named_tuplerLcCsdS)a�Instantiates and returns a cursor.

        By default, `MySQLCursor` or `CMySQLCursor` is returned. Depending on the
        options while connecting, a buffered and/or raw cursor is instantiated
        instead. Also depending upon the cursor options, rows can be returned as
        dictionary or named tuple.

        Dictionary and namedtuple based cursors are available with buffered output
        but not raw.

        It is possible to also give a custom cursor through the `cursor_class`
        parameter, but it needs to be a subclass of `mysql.connector.cursor.CursorBase`
        or `mysql.connector.cursor_cext.CMySQLCursor` according to the type of
        connection that's being used.

        Args:
            buffered: If `True`, the cursor fetches all rows from the server after an
                      operation is executed. This is useful when queries return small
                      result sets.
            raw: If `True`, the cursor skips the conversion from MySQL data types to
                 Python types when fetching rows. A raw cursor is usually used to get
                 better performance or when you want to do the conversion yourself.
            prepared: If `True`, the cursor is used for executing prepared statements.
            cursor_class: It can be used to pass a class to use for instantiating a
                          new cursor. It must be a subclass of `cursor.CursorBase` or
                          `cursor_cext.CMySQLCursor` according to the type of connection
                          that's being used.
            dictionary: If `True`, the cursor returns rows as dictionaries.
            named_tuple: If `True`, the cursor returns rows as named tuples.

        Returns:
            cursor: A cursor object.

        Raises:
            ProgrammingError: When `cursor_class` is not a subclass of
                              `MySQLCursorAbstract`.
            ValueError: When cursor is not available.
        NrG)r~rMrNrOrPrQrRrGrGrH�cursor�s
zMySQLConnectionAbstract.cursorcCsdS)zExecutes a query.NrGr%rGrGrHr5sz&MySQLConnectionAbstract._execute_querycCsdS)aRollbacks current transaction.

        Sends a ROLLBACK statement to the MySQL server, undoing all data changes
        from the current transaction. By default, Connector/Python does not
        autocommit, so it is possible to cancel transactions when using
        transactional storage engines such as `InnoDB`.

        Examples:
            ```
            >>> stmt = "INSERT INTO employees (first_name) VALUES (%s), (%s)"
            >>> cursor.execute(stmt, ('Jane', 'Mary'))
            >>> cnx.rollback()
            ```
        NrGr}rGrGrH�rollbacksz MySQLConnectionAbstract.rollback)�consistent_snapshot�isolation_level�readonlyrLcCs�|jrtd��|rV|���dd���}gd�}||vrFtd|�d���|�d|���|dur�|jd	krztd
|j�d���|r�d}nd
}|�d|���d}|r�|d7}|�|�dS)anStarts a transaction.

        This method explicitly starts a transaction sending the
        START TRANSACTION statement to the MySQL server. You can optionally
        set whether there should be a consistent snapshot, which
        isolation level you need or which access mode i.e. READ ONLY or
        READ WRITE.

        Args:
            consistent_snapshot: If `True`, Connector/Python sends WITH CONSISTENT
                                 SNAPSHOT with the statement. MySQL ignores this for
                                 isolation levels for which that option does not apply.
            isolation_level: Permitted values are 'READ UNCOMMITTED', 'READ COMMITTED',
                             'REPEATABLE READ', and 'SERIALIZABLE'. If the value is
                             `None`, no isolation level is sent, so the default level
                             applies.
            readonly: Can be `True` to start the transaction in READ ONLY mode or
                      `False` to start it in READ WRITE mode. If readonly is omitted,
                      the server's default access mode is used.

        Raises:
            ProgrammingError: When a transaction is already in progress
                              and when `ValueError` when `isolation_level`
                              specifies an Unknown level.

        Examples:
            For example, to start a transaction with isolation level `SERIALIZABLE`,
            you would do the following:
            ```
            >>> cnx = mysql.connector.connect(...)
            >>> cnx.start_transaction(isolation_level='SERIALIZABLE')
            ```
        zTransaction already in progressr�� )zREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READZSERIALIZABLEzUnknown isolation level "�"z SET TRANSACTION ISOLATION LEVEL N)��rZzMySQL server version z does not support this featurez	READ ONLYz
READ WRITEzSET TRANSACTION zSTART TRANSACTIONz WITH CONSISTENT SNAPSHOT)	rr+r�r�r�r�r5r[r�)r~rUrVrW�level�levelsZaccess_moder$rGrGrH�start_transaction s*'
�z)MySQLConnectionAbstract.start_transactionzOptional[Dict[str, Any]])�user_variables�session_variablesrLc	Cs�|��std��z|��Wn>ttfyZ|jr>td�d�|�|j|j|j	|j
�Yn0|sd|r�|��}|r�|��D]\}}|�
d|�d|���qx|r�|��D]\}}|�
d|�d|���q�|��dS)a�Clears the current active session.

        This method resets the session state, if the MySQL server is 5.7.3
        or later active session will be reset without re-authenticating.
        For other server versions session will be reset by re-authenticating.

        It is possible to provide a sequence of variables and their values to
        be set after clearing the session. This is possible for both user
        defined variables and session variables.

        Args:
            user_variables: User variables map.
            session_variables: System variables map.

        Raises:
            OperationalError: If not connected.
            InternalError: If there are unread results and InterfaceError on errors.

        Examples:
            ```
            >>> user_variables = {'var1': '1', 'var2': '10'}
            >>> session_variables = {'wait_timeout': 100000, 'sql_mode': 'TRADITIONAL'}
            >>> cnx.reset_session(user_variables, session_variables)
            ```
        zMySQL Connection not availablezYReset session is not supported with compression for MySQL server version 5.7.2 or earlierNzSET @`z` = z
SET SESSION `)rEr*�cmd_reset_connectionr)rry�cmd_change_userr^r_rarWrSr��executer�)r~r_r`�curr�r�rGrGrH�
reset_sessionjs4���
z%MySQLConnectionAbstract.reset_sessionzOptional[Type[MySQLConverter]])�	convclassrLcCsL|r@t|t�r@|j�|j�d}||_|||j�|_|j|j_	nt
d��dS)z�
        Sets the converter class to be used.

        Args:
            convclass: Should be a class overloading methods and members of
                       `conversion.MySQLConverter`.
        rzFConverter class should be a subclass of conversion.MySQLConverterBase.N)�
issubclassr%r|r-rWrwrirvrxZstr_fallbackr�)r~rfr8rGrGrHr��s�z+MySQLConnectionAbstract.set_converter_class�Optional[List[DescriptionType]]zOptional[CMySQLPrepStmt]z2Tuple[Optional[RowType], Optional[Dict[str, Any]]])r/�columnsrN�	prep_stmtrLcCsdS)a�Retrieves the next row of a query result set.

        Args:
            binary: If `True`, read as binary result (only meaningful for pure Python
                    connections).
            columns: Field types (only meaningful for pure Python connections and when
                     `binary=True`).
            raw: If `True`, the converter class does not convert the parsed values.
            prep_stmt: Prepared statement object (only meaningful for
                       C-ext connections).

        Returns:
            tuple: The row as a tuple (RowType) containing byte objects, or `None` when
                   no more rows are available. (at position 0). EOF packet
                   information as a dictionary containing `status_flag` and
                   `warning_count` (at position 1).

        Raises:
            InterfaceError: When all rows have been retrieved.
        NrG)r~r/rirNrjrGrGrH�get_row�szMySQLConnectionAbstract.get_rowz.Tuple[List[RowType], Optional[Dict[str, Any]]])�countr/rirNrjrLcCsdS)aGets all rows returned by the MySQL server.

        Args:
            count: Used to obtain a given number of rows. If set to `None`, all
                   rows are fetched.
            binary: If `True`, read as binary result (only meaningful for pure Python
                    connections).
            columns: Field types (only meaningful for pure Python connections and when
                     `binary=True`).
            raw: If `True`, the converter class does not convert the parsed values.
            prep_stmt: Prepared statement object (only meaningful for
                       C-ext connections).

        Returns:
            tuple: A list of tuples (RowType) containing the row data as byte objects,
                   or an empty list when no rows are available (at position 0).
                   EOF packet information as a dictionary containing `status_flag`
                   and `warning_count` (at position 1).

        Raises:
            InterfaceError: When all rows have been retrieved.
        NrG)r~rlr/rirNrjrGrGrH�get_rows�s	z MySQLConnectionAbstract.get_rows)r�rLcCsdS)a�Changes the current database.

        This method makes specified database the default (current) database.
        In subsequent queries, this database is the default for table references
        that include no explicit database qualifier.

        Args:
            database: Database to become the default (current) database.

        Returns:
            ok_packet: Dictionary containing the OK packet information.
        NrG)r~r�rGrGrH�cmd_init_db�sz#MySQLConnectionAbstract.cmd_init_db)r$rNrM�
raw_as_stringrLcCsdS)aSends a query to the MySQL server.

        This method sends the query to the MySQL server and returns the result. To send
        multiple statements, use the `cmd_query_iter()` method instead.

        The returned dictionary contains information depending on what kind of query
        was executed. If the query is a `SELECT` statement, the result contains
        information about columns. Other statements return a dictionary containing
        OK or EOF packet information.

        Errors received from the MySQL server are raised as exceptions.

        Arguments `raw`, `buffered` and `raw_as_string` are only meaningful
        for `C-ext` connections.

        Args:
            query: Statement to be executed.
            raw: If `True`, the cursor skips the conversion from MySQL data types to
                 Python types when fetching rows. A raw cursor is usually used to get
                 better performance or when you want to do the conversion yourself. If
                 not provided, take its value from the MySQL instance.
            buffered: If `True`, the cursor fetches all rows from the server after an
                      operation is executed. This is useful when queries return small
                      result sets.
            raw_as_string: Is a special argument for Python v2 and returns `str`
                           instead of `bytearray`.

        Returns:
            dictionary: `Result` or `OK packet` information

        Raises:
            InterfaceError: When multiple results are found.
        NrG)r~r$rNrMrorGrGrHr�sz!MySQLConnectionAbstract.cmd_queryz(Generator[Mapping[str, Any], None, None])�
statementsrLcCsdS)aZSends one or more statements to the MySQL server.

        Similar to the `cmd_query()` method, but instead returns a generator
        object to iterate through results. It sends the statements to the
        MySQL server and through the iterator you can get the results.

        Use `cmd_query_iter()` when sending multiple statements, and separate
        the statements with semicolons.

        Args:
            statements: Statements to be executed separated with semicolons.

        Returns:
            generator: Generator object with `Result` or `OK packet` information.

        Examples:
            The following example shows how to iterate through the results after
            sending multiple statements:
            ```
            >>> statement = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2'
            >>> for result in cnx.cmd_query_iter(statement):
            >>> if 'columns' in result:
            >>>     columns = result['columns']
            >>>     rows = cnx.get_rows()
            >>> else:
            >>>     # do something useful with INSERT result
            ```
        NrG)r~rprGrGrH�cmd_query_iter,sz&MySQLConnectionAbstract.cmd_query_iter)�optionsrLcCsdS)a�Sends the Refresh command to the MySQL server.

        `WARNING: This MySQL Server functionality is deprecated.`

        This method flushes tables or caches, or resets replication server
        information. The connected user must have the RELOAD privilege.

        The options argument should be a bitmask value constructed using
        constants from the `constants.RefreshOption` class.

        The result is a dictionary with the OK packet information.

        Args:
            options: Bitmask value constructed using constants from
                     the `constants.RefreshOption` class.

        Returns:
            dictionary: OK packet information.

        Examples:
            ```
            >>> from mysql.connector import RefreshOption
            >>> refresh = RefreshOption.LOG | RefreshOption.THREADS
            >>> cnx.cmd_refresh(refresh)
            ```
        NrG)r~rrrGrGrH�cmd_refreshMsz#MySQLConnectionAbstract.cmd_refreshzOptional[bytes]cCsdS)a�Closes the current connection with the server.

        This method sends the `QUIT` command to the MySQL server, closing the
        current connection. Since there is no response from the MySQL server,
        the packet that was sent is returned.

        Returns:
            packet_sent: `None` when using a C-ext connection,
                         else the actual packet that was sent.
        NrGr}rGrGrH�cmd_quitjsz MySQLConnectionAbstract.cmd_quit)�
shutdown_typerLcCsdS)z�Shuts down the MySQL Server.

        This method sends the SHUTDOWN command to the MySQL server.
        The `shutdown_type` is not used, and it's kept for backward compatibility.
        NrG)r~rurGrGrH�cmd_shutdownwsz$MySQLConnectionAbstract.cmd_shutdowncCsdS)aSends the statistics command to the MySQL Server.

        Returns:
            dict: Stats packet information about the MySQL server including uptime
                  in seconds and the number of running threads, questions, reloads, and
                  open tables.
        NrGr}rGrGrH�cmd_statisticssz&MySQLConnectionAbstract.cmd_statisticscCstd��dS)a|Get the process list of the MySQL Server.

        This method is a placeholder to notify that the PROCESS_INFO command
        is not supported by raising the `NotSupportedError`.

        The command
        "SHOW PROCESSLIST" should be send using the cmd_query()-method or
        using the `INFORMATION_SCHEMA` database.

        Raises `NotSupportedError` exception.
        z;Not implemented. Use SHOW PROCESSLIST or INFORMATION_SCHEMAN)r)rGrGrGrH�cmd_process_info�s
�z(MySQLConnectionAbstract.cmd_process_info)�	mysql_pidrLcCsdS)aKills a MySQL process.

        Asks the server to kill the thread specified by `mysql_pid`. Although
        still available, it is better to use the KILL SQL statement.

        Args:
            mysql_pid: Process ID to be killed.

        Returns:
            ok_packet: Dictionary containing the OK packet information.

        Examples:
            ```
            >>> cnx.cmd_process_kill(123)  # using cmd_process_kill()
            >>> cnx.cmd_query('KILL 123')  # alternatively (recommended)
            ```
        NrG)r~ryrGrGrH�cmd_process_kill�sz(MySQLConnectionAbstract.cmd_process_killcCsdS)z�Instructs the server to write debugging information to the error log.

        The connected user must have the `SUPER` privilege.

        Returns:
            ok_packet: Dictionary containing the EOF (end-of-file) packet information.
        NrGr}rGrGrH�	cmd_debug�sz!MySQLConnectionAbstract.cmd_debugcCsdS)z�Checks whether the connection to the server is working.

        This method is not to be used directly. Use `ping()` or
        `is_connected()` instead.

        Returns:
            ok_packet: Dictionary containing the OK packet information.
        NrGr}rGrGrH�cmd_ping�sz MySQLConnectionAbstract.cmd_pingrNrM)
r�r�r�r.�	password1�	password2�	password3�oci_config_file�oci_config_profilerLc

CsdS)aChanges the current logged in user.

        It also causes the specified database to become the default (current)
        database. It is also possible to change the character set using the
        charset argument.

        Args:
            username: New account's username.
            password: New account's password.
            database: Database to become the default (current) database.
            charset: Client charset (see [1]), only the lower 8-bits.
            password1: New account's password factor 1 - it's used instead
                       of `password` if set (higher precedence).
            password2: New account's password factor 2.
            password3: New account's password factor 3.
            oci_config_file: OCI configuration file location (path-like string).
            oci_config_profile: OCI configuration profile location (path-like string).

        Returns:
            ok_packet: Dictionary containing the OK packet information.

        Examples:
            ```
            >>> cnx.cmd_change_user(username='', password='', database='', charset=33)
            ```

        References:
            [1]: https://dev.mysql.com/doc/dev/mysql-server/latest/                page_protocol_basic_character_set.html#a_protocol_character_set
        NrG)
r~r�r�r�r.r}r~rr�r�rGrGrHrb�s
z'MySQLConnectionAbstract.cmd_change_userrz(Union[Mapping[str, Any], CMySQLPrepStmt])�	statementrLcCsdS)a%Prepares a MySQL statement.

        Args:
            statement: statement to prepare.

        Returns:
            prepared_stmt: A `Prepared Statement` structure - a dictionary
                           is returned when using a pure Python connection, and a
                           `_mysql_connector.MySQLPrepStmt` object is returned when
                           using a C-ext connection.

        References:
            [1]: https://dev.mysql.com/doc/dev/mysql-server/latest/
                page_protocol_com_stmt_prepare.html
        NrG)r~r�rGrGrH�cmd_stmt_prepare�sz(MySQLConnectionAbstract.cmd_stmt_preparerGzUnion[int, CMySQLPrepStmt]zSequence[BinaryProtocolType]rz&Optional[Union[Dict[str, Any], Tuple]])�statement_id�datarrrLcCsdS)aFExecutes a prepared MySQL statement.

        Args:
            statement_id: Statement ID found in the dictionary returned by
                          `MySQLConnection.cmd_stmt_prepare` when using a pure Python
                          connection, or a `_mysql_connector.MySQLPrepStmt` instance
                          as returned by `CMySQLConnection.cmd_stmt_prepare` when
                          using a C-ext connection.
            data: Data sequence against which the prepared statement will be executed.
            parameters: Currently unused!
            flags: see [1].

        Returns:
            dictionary or tuple: `OK packet` or `Result` information.

        Notes:
            The previous method's signature applies to pure Python, the C-ext has
            the following signature:

            ```
            def cmd_stmt_execute(
                self, statement_id: CMySQLPrepStmt, *args: Any
            ) -> Optional[Union[Dict[str, Any], Tuple]]:
            ```

            You should expect a similar returned value type, however, the input
            is different. In this case `data` must be provided as positional
            arguments instead of a sequence.

        References:
            [1]: https://dev.mysql.com/doc/dev/mysql-server/latest/                page_protocol_com_stmt_execute.html
        NrG)r~r�r�rrrGrGrH�cmd_stmt_executesz(MySQLConnectionAbstract.cmd_stmt_execute)r�rLcCsdS)a�Deallocates a prepared MySQL statement.

        Args:
            statement_id: Statement ID found in the dictionary returned by
                          `MySQLConnection.cmd_stmt_prepare` when using a pure Python
                          connection, or a `_mysql_connector.MySQLPrepStmt` instance
                          as returned by `CMySQLConnection.cmd_stmt_prepare` when
                          using a C-ext connection.
        NrG�r~r�rGrGrH�cmd_stmt_close-sz&MySQLConnectionAbstract.cmd_stmt_closer)r��param_idr�rLcCsdS)a?Sends data for a column.

        Currently, not implemented for the C-ext.

        Args:
            statement_id: Statement ID found in the dictionary returned by
                          `MySQLConnection.cmd_stmt_prepare` when using a pure Python
                          connection, or a `_mysql_connector.MySQLPrepStmt` instance
                          as returned by `CMySQLConnection.cmd_stmt_prepare` when
                          using a C-ext connection.
            param_id: The parameter to supply data to [1].
            data: The actual payload to send [1].

        Returns:
            total_sent: The total number of bytes that were sent is returned.

        References:
            [1]: https://dev.mysql.com/doc/dev/mysql-server/latest/                page_protocol_com_stmt_send_long_data.html
        NrG)r~r�r�r�rGrGrH�cmd_stmt_send_long_data9sz/MySQLConnectionAbstract.cmd_stmt_send_long_datacCsdS)a�Resets data for prepared statement sent as long data.

        Args:
            statement_id: Statement ID found in the dictionary returned by
                          `MySQLConnection.cmd_stmt_prepare` when using a pure Python
                          connection, or a `_mysql_connector.MySQLPrepStmt` instance
                          as returned by `CMySQLConnection.cmd_stmt_prepare` when
                          using a C-ext connection.
        NrGr�rGrGrH�cmd_stmt_resetRsz&MySQLConnectionAbstract.cmd_stmt_resetcCsdS)aNResets the session state without re-authenticating.

        Reset command only works on MySQL server 5.7.3 or later.

        This method permits the session state to be cleared without reauthenticating.
        For MySQL servers older than 5.7.3 (when `COM_RESET_CONNECTION` was introduced)
        , the `reset_session()` method can be used instead - that method resets the
        session state by reauthenticating, which is more expensive.

        This method was added in Connector/Python 1.2.1.

        Returns:
            `True` for a successful reset otherwise `False`.
        NrGr}rGrGrHra^sz,MySQLConnectionAbstract.cmd_reset_connection)r)NN)T)NN)rr)Frr)NNNNNN)FNN)NN)FNNN)NFNNN)FFF)N)	rNrNrNrMrNrNrNrNrN)rGrGr)XrCrDrErFrr�r�r��propertyr�r�r�r�r�r�r�r�r�r�r�r�rr��setterr�r�r�r��staticmethodr�rrrrr�rrr"r#r!r�r&r'r�r�r+r.r2r9r3r<r=r>r?r@r��__annotations__rArJrErKrLrSr5rTr^rer�rkrmrnr�rqrsrtrvrwrxrzr{r|rbr�r�r�r�r�rarGrGrGrHrI�s�
C

_Q.�"	(�


�J
66�0�L�:���) 		
�$+�)rIc@s�eZdZdZdd�dd�Zdd�dd�Zdd	d
dd�dd
�ZedZdddd�dd��Zedd�dd��Z	ed[ddddd�dd��Z
edddd�d d!��Zed"d�d#d$��Zed\d&d'd(�d)d*��Z
ed'd�d+d,��Zed-d�d.d/��Zd0d�d1d2�Zd3d0d4�d5d6�Zd]d3d3d0d8�d9d:�Zd^ddd<�d=d>�Zeed?d�d@dA���Zeed&d�dBdC���ZedDd�dEdF��ZedGd�dHdI��Zed&d�dJdK��ZdGd�dLdM�ZdNd�dOdP�ZddQddR�dSdT�ZddQdU�dVdW�Zdd�dXdY�Zd7S)_�MySQLCursorAbstractz�Abstract cursor class

    Abstract class defining cursor class with method and members
    required by the Python Database API Specification v2.0.
    rJrKcCs:d|_d|_d|_d|_d|_d|_g|_g|_d|_dS)ZInitializationNr�rr)	�_description�	_rowcount�_last_insert_id�	_warnings�_warning_countZ	_executedZ_executed_listZ_stored_resultsZ	arraysizer}rGrGrHrwszMySQLCursorAbstract.__init__cCs|Sr�rGr}rGrGrHr��szMySQLCursorAbstract.__enter__r�r�rr�cCs|��dSr�r�r�rGrGrHr��szMySQLCursorAbstract.__exit__rGr�rz0Optional[Union[Dict[str, RowItemType], RowType]])�procname�argsrLcCsdS)a�Calls a stored procedure with the given arguments.

        The arguments will be set during this session, meaning they will be called like
        _<procname>__arg<nr> where <nr> is an enumeration (+1) of the arguments.

        Args:
            procname: The stored procedure name.
            args: Sequence of parameters - it must contain one entry for each argument
                  that the procedure expects.

        Returns:
            Does not return a value, but a result set will be available when the
            CALL-statement executes successfully.

            `callproc()` returns a modified copy of the input sequence. `Input`
            parameters are left untouched. `Output` and `input/output` parameters may
            be replaced with new values.

            Result sets produced by the stored procedure are automatically fetched and
            stored as `MySQLCursorBuffered` instances.

            The value returned (if any) is a `Dict` when cursor's subclass is
            `MySQLCursorDict`, else a `Tuple` (RowType).

        Raises:
            InterfaceError: When something is wrong

        Examples:
            1) Defining the Stored Routine in MySQL:
            ```
            CREATE PROCEDURE multiply(IN pFac1 INT, IN pFac2 INT, OUT pProd INT)
            BEGIN
            SET pProd := pFac1 * pFac2;
            END;
            ```

            2) Executing in Python:
            ```
            >>> args = (5, 6, 0) # 0 is to hold value of the OUT parameter pProd
            >>> cursor.callproc('multiply', args)
            ('5', '6', 30L)
            ```

        References:
            [1]: https://dev.mysql.com/doc/connector-python/en/                connector-python-api-mysqlcursor-callproc.html
        NrG)r~r�r�rGrGrH�callproc�szMySQLCursorAbstract.callproccCsdS)a=Close the cursor.

        Use close() when you are done using a cursor. This method closes the cursor,
        resets all results, and ensures that the cursor object has no reference to its
        original connection object.

        This method is part of PEP 249 - Python Database API Specification v2.0.
        NrGr}rGrGrHr��szMySQLCursorAbstract.closeFzFUnion[Sequence[MySQLConvertibleType], Dict[str, MySQLConvertibleType]]r�z4Optional[Generator[MySQLCursorAbstract, None, None]])�	operation�params�multirLcCsdS)aZExecutes the given operation substituting any markers with the given parameters.

        For example, getting all rows where id is 5:
        ```
        >>> cursor.execute("SELECT * FROM t1 WHERE id = %s", (5,))
        ```

        The `multi` argument should be set to `True` when executing multiple
        statements in one operation.

        If warnings were generated, and `connection.get_warnings` is `True`, then
        `self.warnings` will be a list containing these warnings.

        Args:
            operation: Operation to be executed.
            params: The parameters found in the tuple or dictionary params are bound
                    to the variables in the operation. Specify variables using `%s` or
                    `%(name)s` parameter style (that is, using format or pyformat style).
            multi: If `multi` is set to `True`, `execute()` is able to execute multiple
                   statements specified in the operation string.

        Returns:
            An iterator when `multi` is `True`, otherwise `None`.

        Raises:
            InterfaceError: If `multi` is not set and multiple results are found.

        Examples:
            The following example selects and inserts data in a single `execute()`
            operation and displays the result of each statement:

            ```
            >>> operation = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2'
            >>> for result in cursor.execute(operation, multi=True):
            >>>     if result.with_rows:
            >>>         print("Rows produced by statement '{}':".format(
            >>>         result.statement))
            >>>         print(result.fetchall())
            >>>     else:
            >>>         print("Number of rows affected by statement '{}': {}".format(
            >>>         result.statement, result.rowcount))
            ```
        NrG)r~r�r�r�rGrGrHrc�s	zMySQLCursorAbstract.executezPSequence[Union[Sequence[MySQLConvertibleType], Dict[str, MySQLConvertibleType]]])r��
seq_paramsrLcCsdS)a�Executes the given operation multiple times.

        The `executemany()` method will execute the operation iterating
        over the list of parameters in `seq_params`.

        `INSERT` statements are optimized by batching the data, that is
        using the MySQL multiple rows syntax.

        Args:
            operation: Operation to be executed.
            seq_params: Parameters to be used when executing the operation.

        Returns:
            Results are discarded. If they are needed, consider looping over data
            using the `execute()` method.

        Examples:
            An optimization is applied for inserts: The data values given by the
            parameter sequences are batched using multiple-row syntax. The following
            example inserts three records:

            ```
            >>> data = [
            >>> ('Jane', date(2005, 2, 12)),
            >>> ('Joe', date(2006, 5, 23)),
            >>> ('John', date(2010, 10, 3)),
            >>> ]
            >>> stmt = "INSERT INTO employees (first_name, hire_date) VALUES (%s, %s)"
            >>> cursor.executemany(stmt, data)
            ```

            For the preceding example, the INSERT statement sent to MySQL is:
            ```
            >>> INSERT INTO employees (first_name, hire_date)
            >>> VALUES ('Jane', '2005-02-12'), ('Joe', '2006-05-23'), ('John', '2010-10-03')
            ```
        NrG)r~r�r�rGrGrH�executemany	szMySQLCursorAbstract.executemanyz0Optional[Union[RowType, Dict[str, RowItemType]]]cCsdS)aRetrieves next row of a query result set

        Returns:
            If the cursor's subclass is `MySQLCursorDict`, a dictionaries is
            returned, otherwise a tuple (RowType). `None` is returned when there aren't
            results to be read.

        Examples:
            ```
            >>> cursor.execute("SELECT * FROM employees")
            >>> row = cursor.fetchone()
            >>> while row is not None:
            >>>     print(row)
            >>>     row = cursor.fetchone()
            ```
        NrGr}rGrGrH�fetchone0	szMySQLCursorAbstract.fetchonerr�z,List[Union[RowType, Dict[str, RowItemType]]])�sizerLcCsdS)a�Fetches the next set of rows of a query result.

        Args:
            size: The number of rows returned can be specified using the size
                  argument, which is one by default.

        Returns:
            If the cursor's subclass is `MySQLCursorDict`, a list of dictionaries is
            returned, otherwise a list of tuples (RowType). When no more rows are
            available, it returns an empty list.
        NrG)r~r�rGrGrH�	fetchmanyC	szMySQLCursorAbstract.fetchmanycCsdS)a�Fetches all (or all remaining) rows of a query result set.

        Returns:
            If the cursor's subclass is `MySQLCursorDict`, a list of dictionaries is
            returned, otherwise a list of tuples (RowType).

        Examples:
            ```
            >>> cursor.execute("SELECT * FROM employees ORDER BY emp_no")
            >>> head_rows = cursor.fetchmany(size=2)
            >>> remaining_rows = cursor.fetchall()
            ```
        NrGr}rGrGrH�fetchallQ	szMySQLCursorAbstract.fetchallzIterator[MySQLCursorAbstract]cCsdS)aReturns an iterator (of MySQLCursorAbstract subclass instances) for stored results.

        This method returns an iterator over results which are stored when
        callproc() is called. The iterator will provide `MySQLCursorBuffered`
        instances.

        Examples:
            ```
            >>> cursor.callproc('myproc')
            ()
            >>> for result in cursor.stored_results():
            ...     print result.fetchall()
            ...
            [(1,)]
            [(2,)]
            ```
        NrGr}rGrGrH�stored_resultsa	sz"MySQLCursorAbstract.stored_resultsrcCsdS�zNot Implemented.NrGr}rGrGrH�nextsetu	szMySQLCursorAbstract.nextsetr
)�sizesrLcCsdSr�rG)r~r�rGrGrH�
setinputsizesx	sz!MySQLCursorAbstract.setinputsizesN)r��columnrLcCsdSr�rG)r~r�r�rGrGrH�
setoutputsize{	sz!MySQLCursorAbstract.setoutputsizeT)�freerLcCsdS)zResets the cursor to defaultNrG)r~r�rGrGrH�reset~	szMySQLCursorAbstract.resetrhcCs|jS)a^This read-only property returns a list of tuples describing the columns in a
        result set.

        A tuple is described as follows::
        ```
        (column_name,
            type,
            None,
            None,
            None,
            None,
            null_ok,
            column_flags)  # Addition to PEP-249 specs
        ```

        See [1] for more details and examples.

        Returns:
            A list of tuples.

        References:
            [1]: https://dev.mysql.com/doc/connector-python/en/                connector-python-api-mysqlcursor-description.html
        )r�r}rGrGrH�description�	szMySQLCursorAbstract.descriptioncCs|jS)aReturns the number of rows produced or affected.

        This property returns the number of rows produced by queries
        such as `SELECT`, or affected rows when executing DML statements
        like `INSERT` or `UPDATE`.

        Note that for non-buffered cursors it is impossible to know the
        number of rows produced before having fetched them all. For those,
        the number of rows will be -1 right after execution, and
        incremented when fetching rows.

        Returns an integer.
        )r�r}rGrGrH�rowcount�	szMySQLCursorAbstract.rowcountr;cCs|jS)aReturns the value generated for an AUTO_INCREMENT column.

        Returns the value generated for an AUTO_INCREMENT column by
        the previous INSERT or UPDATE statement or `None` when there is
        no such a value available.

        Returns a long value or `None`.
        )r�r}rGrGrH�	lastrowid�	s
zMySQLCursorAbstract.lastrowidzOptional[List[WarningType]]cCs|jS)a�Returns a list of tuples (WarningType) containing warnings generated
        by the previously executed operation.

        Examples:
            ```
            >>> cnx.get_warnings = True
            >>> cursor.execute("SELECT 'a'+1")
            >>> cursor.fetchall()
            [(1.0,)]
            >>> cursor.warnings
            [(u'Warning', 1292, u"Truncated incorrect DOUBLE value: 'a'")]
            ```
        �r�r}rGrGrH�warnings�	szMySQLCursorAbstract.warningscCs|jS)z�Returns the number of warnings.

        This property returns the number of warnings generated by the
        previously executed operation.

        Returns an integer value.
        )r�r}rGrGrH�
warning_count�	s	z!MySQLCursorAbstract.warning_countcCs|jS)a�Returns a list of tuples (WarningType) containing warnings generated by
        the previously executed operation.

        Examples:
            ```
            >>> cnx.get_warnings = True
            >>> cursor.execute("SELECT 'a'+1")
            >>> cursor.fetchall()
            [(1.0,)]
            >>> cursor.fetchwarnings()
            [(u'Warning', 1292, u"Truncated incorrect DOUBLE value: 'a'")]
            ```
        r�r}rGrGrH�
fetchwarnings�	sz!MySQLCursorAbstract.fetchwarningsz.Optional[List[Tuple[str, BinaryProtocolType]]]cCs(t|d�r|jjSt|d�r$|jjSdS)z�Gets a list of query attributes from the connector's side.

        Returns:
            List of existing query attributes.
        �_cnx�_connectionN)�hasattrr�r�r�r}rGrGrH�get_attributes�	s


z"MySQLCursorAbstract.get_attributesr7)r�r�rLcCsnt|t�std��|dur4t|t�s4td|�d���t|d�rP|j�||f�nt|d�rj|j�||f�dS)aAdds a query attribute and its value into the connector's query attributes list.

        Query attributes must be enabled on the server - they are disabled by default. A
        warning is logged when setting query attributes for a server connection
        that does not support them.

        Args:
            name: Key name used to identify the attribute.
            value: A value converted to the MySQL Binary Protocol.

        Raises:
            ProgrammingError: If the value's conversion fails.
        �&Parameter `name` must be a string typeNzObject z$ cannot be converted to a MySQL typer�r�)r�r�r+�MYSQL_PY_TYPESr�r�r�r�)r~r�r�rGrGrH�
add_attribute�	s

�

z!MySQLCursorAbstract.add_attributer�cCsBt|t�std��t|d�r(|j�|�St|d�r>|j�|�SdS)a,Removes a query attribute by name from the connector's query attributes list.

        If no match, `None` is returned, else the corresponding value is returned.

        Args:
            name: Key name used to identify the attribute.

        Returns:
            value: Attribute's value.
        r�r�r�N)r�r�r+r�r�r�r�r�rGrGrH�remove_attribute
s


z$MySQLCursorAbstract.remove_attributecCs.t|d�r|j��nt|d�r*|j��dS)z<Clears the list of query attributes on the connector's side.r�r�N)r�r�r�r�r}rGrGrH�clear_attributes 
s

z$MySQLCursorAbstract.clear_attributes)rG)rGF)r)N)T)rCrDrErFrr�r�rr�r�rcr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rGrGrGrHr�psX�3
�4-

r�)drF�
__future__rr�r�weakref�abcrrrrrr�decimalr	�inspectr
r�typesr�typingr
rrrrrrrrrrrrrr��sslr�r�ImportError�	constantsrrrr r!r"r#�
conversionr$r%�errorsr&r'r(r)r*r+Zopentelemetry.constantsr,r-r.r/Zopentelemetry.instrumentationr0r1r2r3Zoptionfilesr4Ztls_ciphersr5r6r7r8r9r:r;r<r=r>�utilsr?r@�WeakValueDictionaryrAr�r�r�r�r�r�r�floatr�r�r�rBrIr�rGrGrGrH�<module>s�@$	 (
������
U

Youez - 2016 - github.com/yon3zu
LinuXploit