ó
    ¦ghN  ã                   ó¢   • S r SSKrSSKrSSKrSSKJrJr  SSKJr  SSKJ	r	  SSK
JrJrJr  S	S
KJr  \R                   " \5      r " S S\	5      rg)u    
Procesador EstadÃ­stico - MVP v1.0

Maneja el procesamiento de estadÃ­sticas por perÃ­odos de 15 minutos,
calculando promedios, mÃ¡ximos, mÃ­nimos y desvÃ­os.
é    N)ÚdatetimeÚ	timedelta)Údefaultdicté   )ÚBaseProcessoré   )ÚSTATISTICS_BATCH_SIZEÚSTATISTICS_SLEEPÚPROCESS_INTERVALé   )ÚIntegrationCalculatorc                   óh   ^ • \ rS rSrU 4S jrS rS rS rS rSS jr	S r
S	 rS
 rS rS rSrU =r$ )ÚStatisticsProcessoré   c                 ó  >• [         TU ]  U5        [        5       U l        [        U l        0 U l        SSSS.U l        [        U l	        SU l
        SU l        0 U l        U R                  5         [        R                  S5        g )Nr   )Úprocessed_measurementsÚgenerated_recordsÚactive_periodsr   é   z StatisticsProcessor inicializado)ÚsuperÚ__init__r   Ú
calculatorr	   Ú
batch_sizeÚcurrent_periodsÚmetricsr   Úprocess_intervalÚmax_retriesÚretry_delayÚconfigsÚ_load_configurationsÚloggerÚinfo)ÚselfÚdb_nameÚ	__class__s     €ÚB/var/www/blue/EV-Temp_rev04/src/processors/statistics/processor.pyr   ÚStatisticsProcessor.__init__   su   ø€ Ü‰Ñ˜Ô!Ü/Ó1ˆŒÜ/ˆŒØ!ˆÔà&'Ø!"Øñ
ˆŒô
 !1ˆÔØˆÔØˆÔØˆŒØ×!Ñ!Ô#Ü�‰Ð6Õ7ó    c                 óx  • [         R                  " 5       nSnU R                  (       aÄ   U R                  5       (       d  [        R
                  " S5        M?  [         R                  " 5       nX1-
  R                  5       U:¼  a  U R                  5         UnU R                  5       nU(       d  [        R
                  " S5        M«  [        R
                  " S5        U R                  (       a  MÃ  gg! [         aA  n[        R                  S[        U5       35        [        R
                  " S5         SnAN[SnAff = f)u%   Ejecuta el procesamiento estadÃ­sticoé   r   r   u%   Error en procesamiento estadÃ­stico: N)r   ÚnowÚrunningÚcheck_connectionÚtimeÚsleepÚtotal_secondsÚcheck_timeout_periodsÚ_process_pending_measurementsÚ	Exceptionr!   ÚerrorÚstr)r#   Úlast_timeout_checkÚtimeout_check_intervalr+   ÚsuccessÚes         r&   ÚrunÚStatisticsProcessor.run)   sß   € ä%Ÿ\š\›^ÐØ!#Ðà�l�lðØ×,Ñ,×.Ñ.Ü—J’J˜q”MÙä—l’l“n�ð Ñ,×;Ñ;Ó=ÐAWÓWØ×.Ñ.Ô0Ø),Ð&ð ×<Ñ<Ó>�ÞÜ—J’J˜q”MÙä—
’
˜1”ð' �l�l‹løô* ó Ü—‘ÐDÄSÈÃVÀHÐMÔNÜ—
’
˜1—‘ûðús$   ª+C. ÁA*C. ÃC. Ã.
D9Ã87D4Ä4D9c                 ó  • U R                  S5      u  pU(       a  U(       d  gU Hä  nUS   nUS   nUR                  UR                  U R                  -  U R                  -  SSS9nX@R                  ;  a  UUS   / US   S	.U R                  U'   U R                  U   nUS
   [        U R                  S9-   nXh:¼  a8  US   (       a  U R                  XG5        UUS   U/US   S	.U R                  U'   MÐ  US   R                  U5        Mæ     g)uC   Procesa mediciones pendientes y cierra perÃ­odos cuando correspondeaþ  
            SELECT 
                bb.id,
                bb.dmac,
                bb.temp,
                bb.fecha,
                m.idSistema,
                e.idEntrada,
                d.factor
            FROM bandeja_blue bb
            JOIN modbus m ON bb.dmac = m.dmac
            JOIN entradas e ON m.idModbus = e.idModbus
            JOIN dispositivos d ON e.idDispositivo = d.idDispositivo 
            WHERE bb.procesado_el IS NULL
            ORDER BY bb.fecha
            LIMIT 1000
        TÚdmacÚfechar   ©ÚminuteÚsecondÚmicrosecondÚ	idEntradaÚfactor©Úperiod_startrC   ÚmeasurementsrD   rF   ©ÚminutesrG   )Úexecute_queryÚreplacer@   r   r   r   Ú_close_periodÚappend)	r#   r8   rG   Úmeasurementr=   r>   Úperiodo_medicionÚcurrent_infoÚcurrent_period_ends	            r&   r2   Ú1StatisticsProcessor._process_pending_measurementsG   sG  € à $× 2Ñ 2ð 4ó !Ñˆö$ žlØó (ˆKØ˜vÑ&ˆDØ Ñ(ˆEð  %Ÿ}™}ØŸ™¨×(=Ñ(=Ñ=À×AVÑAVÑVØØð  -ð  Ðð ×/Ñ/Ó/à$4Ø!,¨[Ñ!9Ø$&Ø)¨(Ñ3ñ	.�×$Ñ$ TÑ*ð  ×/Ñ/°Ñ5ˆLØ!-¨nÑ!=Ä	ÐRV×RgÑRgÑ@hÑ!hÐð  Ó5Ø ×/Ø×&Ñ& tÔ:ð %5Ø!,¨[Ñ!9Ø%0 MØ)¨(Ñ3ñ	.�×$Ñ$ TÓ*ð ˜^Ñ,×3Ñ3°KÖ@ñK (ðN r(   c                 óÊ  • [         R                  " 5       n[        [        R                  " SS5      5      nU R                  S5      u  p4U(       d  gU Vs0 sH  oUS   US   _M     nnUR                  5        Hã  u  pxU R                  R                  U5      n	U	(       as  U	S   [        U R                  S9-   n
U
[        US9-   nX:¼  aG  U	S	   (       a  U R                  XyS
S9  OU R                  XŠ5        U
nUU/ U	S   S.U R                  U'   M˜  Mš  UR                  UR                  U R                  -  U R                  -  SSS9nUU/ SS.U R                  U'   Må     gs  snf )u@   Verifica y cierra perÃ­odos que han excedido el tiempo de esperaÚPERIOD_TIMEOUT_MINUTESr   z©
            SELECT DISTINCT m.dmac, e.idEntrada
            FROM modbus m
            JOIN entradas e ON m.idModbus = e.idModbus
            WHERE m.estado = 1
        Nr=   rC   rF   rH   rG   T)ÚforcedrD   rE   r   r?   r   )r   r+   ÚintÚosÚgetenvrJ   Úitemsr   Úgetr   r   rL   Ú_save_null_recordrK   r@   )r#   r+   Útimeout_minutesr8   Úactive_inputsÚinputÚactive_dmacsr=   Ú
id_entradaÚcurrent_periodÚ
period_endÚtimeout_thresholdÚnext_period_startrF   s                 r&   r1   Ú)StatisticsProcessor.check_timeout_periodsˆ   s~  € ä�lŠl‹nˆÜœbŸišiÐ(@À!ÓDÓEˆð "&×!3Ñ!3ð 5ó "Ñˆö ØáGTÓUÁ}¸e˜f™ u¨[Ñ'9Ò9Á}ˆÐUà ,× 2Ñ 2Ö 4ÑˆDØ!×1Ñ1×5Ñ5°dÓ;ˆNæØ+¨NÑ;¼iÐPT×PeÑPeÑ>fÑf�
Ø$.´À?Ñ1SÑ$SÐ!ð Ó+Ø% n×5Ø×*Ñ*¨4ÈÐ*ÒMà×.Ñ.¨zÔFð )3Ð%à(9Ø%/Ø(*Ø"0°Ñ":ñ	2�D×(Ñ(¨Ó.ñ ,ð   #Ÿ{™{ØŸJ™J¨$×*?Ñ*?Ñ?À4×CXÑCXÑXØØ !ð  +ð  �ð %1Ø!+Ø$&Øñ	.�×$Ñ$ TÓ*ò; !5ùò Vs   ÁE c           	      óÈ   • U R                  UU[        U R                  S9-
  SSSSS.5      nU(       a/  U R                  (       a  [        R                  SU SUS 35        ggg)z>Guarda un registro con valores NULL para una entrada sin datosrH   N©ÚpromedioÚmaximoÚminimoÚdesvioz"Registro NULL generado - Entrada: õ   , PerÃ­odo: ú%Y-%m-%d %H:%M)Ú_save_statisticsr   r   Údebugr!   )r#   r`   rb   r8   s       r&   r[   Ú%StatisticsProcessor._save_null_record¾   sq   € à×'Ñ'ØØœ¨4×+@Ñ+@ÑAÑAà ØØØñ	ó	
ˆö �t—z—zÜ�L‰LØ4°Z°Lð AØ'¨Ð7ð9õð "ˆ7r(   c                 ób  ^•  US   nUS   nU Vs/ sH  n[        US   U-  S5      PM     nnU(       Ga5  [        [        U5      [        U5      -  S5      m[        [        U5      S5      n[        [	        U5      S5      n	[        U5      S:”  a4  [        U4S jU 5       5      n
[        U
[        U5      S-
  -  S-  S5      nOSnU R                  US	   US
   TUU	US.5      nU(       a€  U Vs/ sH  ofS   PM	     nnU R                  U5        U R                  (       aK  [        R                  SU(       a  SOS SU SUS
   [        U R                  S9-   S S[        U5       35        gs  snf s  snf ! [         a.  n[        R                  SU S[        U5       35         SnAgSnAff = f)u<   Cierra un perÃ­odo, ya sea por nueva mediciÃ³n o por timeoutrG   rD   Útempr   c              3   ó0   >#   • U H  oT-
  S -  v •  M     g7f©r   N© ©Ú.0Úxrh   s     €r&   Ú	<genexpr>Ú4StatisticsProcessor._close_period.<locals>.<genexpr>à   s   øé € Ð(LÁeÀ¨h©,¸1Ö)<Âeùó   ƒç      à?r   ç        rC   rF   rg   Úidu   PerÃ­odo cerrado zpor timeoutÚ ú	 - DMAC: z, Fin: rH   rm   z, Mediciones: Tu   Error cerrando perÃ­odo para ú: NF)ÚroundÚsumÚlenÚmaxÚminrn   Ú_mark_as_processed_batchro   r!   r   r   r3   r4   r5   )r#   r=   Úperiod_inforU   Úmeasurements_to_processrD   ÚmÚtempsri   rj   Úsuma_cuadradosrk   r8   Úidsr9   rh   s                  @r&   rL   Ú!StatisticsProcessor._close_periodÑ   sÅ  ø€ ð.	Ø&1°.Ñ&AÐ#Ø  Ñ*ˆFñ <SÓSÑ;R°a”U˜1˜V™9 vÑ-¨qÖ1Ñ;RˆEÐSçÜ ¤ U£¬c°%«jÑ!8¸!Ó<�Üœs 5›z¨1Ó-�Üœs 5›z¨1Ó-�ä�u“: “>Ü%(Ô(LÁeÓ(LÓ%L�NÜ" N´c¸%³jÀ1±nÑ$EÈ#Ñ#MÈqÓQ‘Fà �Fð ×/Ñ/Ø Ñ,Ø Ñ/à$,Ø"(Ø"(Ø"(ñ	ó	�ö á,CÓDÑ,C q˜Tœ7Ñ,C�CÐDØ×1Ñ1°#Ô6à—z—zÜŸ™Ø/Æ±ÈRÐ/Pð Q%Ø%) Fð +$Ø%0°Ñ%@Ä9ÐUY×UjÑUjÑCkÑ%kÐm{Ð#|ð }+Ü+.¨u«:¨,ð8ôð ùòM Tùò6 Eøô ó 	Ü�L‰LÐ8¸¸¸bÄÀQÃÀÐIÔJÜûð	ús5   ƒE6 ‘E,¬CE6 Ã/E1Ã<A/E6 Å,
E6 Å6
F.Æ $F)Æ)F.c                 óÖ  •  U[        U R                  S9-   nUR                  UR                  U R                  -  U R                  -  SSS9nU R                  (       a   [
        R	                  SU SUS SUS 35        U R                  SSUUUS	   US
   US   UR                  SS5      4SS9u  pVU$ ! [         a+  n[
        R                  S[        U5       35         SnAgSnAff = f)u#   Guarda las estadÃ­sticas calculadasrH   r   r?   u#   Guardando estadÃ­sticas - Entrada: rl   rm   z -> a§  
                INSERT INTO registros 
                    (idSistema, idEntrada, fecha, medio, maximo, minimo, desvio)
                VALUES 
                    (%s, %s, %s, %s, %s, %s, %s)
                ON DUPLICATE KEY UPDATE
                    medio = VALUES(medio),
                    maximo = VALUES(maximo),
                    minimo = VALUES(minimo),
                    desvio = VALUES(desvio)
            rh   ri   rj   rk   T©Úcommitu   Error guardando estadÃ­sticas: NF)r   r   rK   r@   ro   r!   rJ   rZ   r3   r4   r5   )r#   r`   rF   Ústatsrb   r8   Úresultr9   s           r&   rn   Ú$StatisticsProcessor._save_statistics  s  € ð(	à%¬	¸$×:OÑ:OÑ(PÑPˆJØ#×+Ñ+Ø"×)Ñ)¨T×-BÑ-BÑBÀd×F[ÑF[Ñ[ØØð ,ð ˆJð �z�zÜ—‘Ø9¸*¸ð F!Ø!-¨nÐ =¸TÀ*È^ÐA\ð^ôð #×0Ñ0ð 
2ð ØØØ�jÑ!Ø�h‘Ø�h‘Ø—	‘	˜( AÓ&ðð ð% 1ð ‰OˆGð( ˆNøäó 	Ü�L‰LÐ:¼3¸q»6¸(ÐCÔDÜûð	ús   ‚B0B3 Â3
C(Â=!C#Ã#C(c                 ó–  • U(       d  g SR                  S/[        U5      -  5      nU R                  SU S3[        R                  " 5       /U-   SS9u  p4U(       a5  U R
                  (       a#  [        R                  S[        U5       S	35        ggg! [         a+  n[        R                  S
[        U5       35         SnAgSnAff = f)z+Marca un lote de mediciones como procesadasNz, z%szj
                UPDATE bandeja_blue 
                SET procesado_el = %s 
                WHERE id IN (z;)
                AND procesado_el IS NULL
                Tr�   z	Marcadas z mediciones como procesadasz"Error en mark_as_processed_batch: )
Újoinr„   rJ   r   r+   ro   r!   r3   r4   r5   )r#   r�   Úplaceholdersr8   r“   r9   s         r&   r‡   Ú,StatisticsProcessor._mark_as_processed_batch/  sÅ   € æØð	HØŸ9™9 d V¬c°#«hÑ%6Ó7ˆLØ"×0Ñ0ðð +˜^ð ,ðô —’“Ð  3Ñ&Øð 1ð 	‰OˆGö ˜4Ÿ:Ÿ:Ü—‘˜y¬¨S«¨
Ð2MÐNÕOð &ˆwøô ó 	HÜ�L‰LÐ=¼cÀ!»f¸XÐF×GÑGûð	Hús   ŠBB Â
CÂ!CÃCc                 ó¤  •  U R                  S5      u  pU(       ah  U H5  nUS   US   4nUS   US   US   US   US   US	   S
.U R                  U'   M7     [        R                  S[	        U R                  5       S35        g[        R                  S5        g! [         a+  n[        R                  S[        U5       35         SnAgSnAff = f)z0Carga las configuraciones desde la base de datosa  
                SELECT 
                    d.idDispositivo,
                    d.factor,
                    c.idSistema,
                    c.idEntrada,
                    c.vMin1,
                    c.vMax1,
                    c.tMax1,
                    c.generaAlarma
                FROM configuraciones c
                JOIN entradas e ON c.idEntrada = e.idEntrada AND c.idSistema = e.idSistema
                JOIN dispositivos d ON e.idDispositivo = d.idDispositivo
                WHERE c.generaAlarma = 1
            Ú	idSistemarC   ÚidDispositivorD   ÚvMin1ÚvMax1ÚtMax1ÚgeneraAlarma)r›   rD   rœ   r�   rž   rŸ   zConfiguraciones cargadas: z	 entradaszError cargando configuracionesz#Error en carga de configuraciones: N)rJ   r   r!   r"   r„   r4   r3   r5   )r#   r8   r“   ÚconfigÚkeyr9   s         r&   r    Ú(StatisticsProcessor._load_configurationsG  sÛ   € ð!	IØ"×0Ñ0ð 2ó ‰OˆGö  Û$�FØ! +Ñ.°°{Ñ0CÐD�Cà)/°Ñ)@Ø"(¨Ñ"2Ø!'¨¡Ø!'¨¡Ø!'¨¡Ø(.¨~Ñ(>ñ)�D—L‘L Ó%ñ %ô —‘Ð8¼¸T¿\¹\Ó9JÐ8KÈ9ÐUÕVä—‘Ð=Õ>øäó 	IÜ�L‰LÐ>¼sÀ1»v¸hÐG×HÑHûð	Iús   ‚BB ÂB Â
CÂ$!C
Ã
Cc                 óò   • U R                   S   U R                   S   U R                   S   U R                  R                  5        VVs/ sH  u  pUUS   US   R                  5       S.PM!     snnS.$ s  snnf )u    Obtiene mÃ©tricas del procesadorr   r   r   rC   rF   )r=   rC   rF   )r   r   r   r   )r   r   rY   Ú	isoformat)r#   r=   r"   s      r&   Úget_metricsÚStatisticsProcessor.get_metricsl  sŠ   € ð '+§l¡lÐ3KÑ&LØ!%§¡Ð.AÑ!BØ"Ÿl™lÐ+;Ñ<ð #'×"6Ñ"6×"<Ñ"<Ô">ô ñ #?‘J�Dð	 !Ø!% kÑ!2Ø$(¨Ñ$8×$BÑ$BÓ$Dôñ
 #?ò ñ	
ð 	
ùó s   Á%A3c                 ó  ^• U R                  5       (       d  g[        R                  S5        SnSn [        R                  " 5       nUR                  UR                  [        -  [        -  SSS9nU R                  SU45      u  pVU(       a  U(       a  US   S   (       d  [        R                  S5        gUS   S   nUR                  UR                  [        -  [        -  SSS9nX„:  Gaû  U[        [        S	9-   n	U R                  S
X‰45      u  pZU(       d  [        R                  S5        gU
(       Ga§  [        [        5      nU
 H  nX¼S      R                  U5        M     UR                  5        GHd  u  pÞ US   S   nU Vs/ sH  n[        US   U-  S5      PM     nnU(       Ga,  [        [!        U5      [#        U5      -  S5      m[        [%        U5      S5      n[        ['        U5      S5      n[#        U5      S:”  a4  [!        U4S jU 5       5      n[        U[#        U5      S-
  -  S-  S5      nOSnU R)                  US   S   UTUUUS.5      (       av  US-  nU Vs/ sH  oÌS   PM	     nnU R+                  U5        U[#        U5      -  nU R,                  (       a+  [        R                  SUS SU S[#        U5       35        GM^  GMa  GMd  GMg     U	nX„:  a  GMû  [        R                  SU SU 35        gs  snf s  snf ! [.         a0  n[        R                  SU S[1        U5       35         SnAGMÎ  SnAff = f! [.         a+  n[        R                  S [1        U5       35         SnAgSnAff = f)!u$   Procesa datos histÃ³ricos pendientesFu%   Iniciando procesamiento histÃ³rico...r   r?   z¸
                SELECT MIN(fecha) as inicio, MAX(fecha) as fin
                FROM bandeja_blue
                WHERE procesado_el IS NULL
                AND fecha < %s
            Úiniciou#   No hay datos histÃ³ricos pendientesTrH   a¬  
                    SELECT 
                        bb.id,
                        bb.dmac,
                        bb.temp,
                        bb.fecha,
                        m.idSistema,
                        e.idEntrada,
                        d.factor
                    FROM bandeja_blue bb
                    JOIN modbus m ON bb.dmac = m.dmac
                    JOIN entradas e ON m.idModbus = e.idModbus
                    JOIN dispositivos d ON e.idDispositivo = d.idDispositivo 
                    WHERE bb.procesado_el IS NULL
                    AND bb.fecha >= %s
                    AND bb.fecha < %s
                    ORDER BY bb.fecha
                u'   Error obteniendo mediciones histÃ³ricasr=   rD   rr   r   c              3   ó0   >#   • U H  oT-
  S -  v •  M     g7frt   ru   rv   s     €r&   ry   Ú>StatisticsProcessor.process_historical_data.<locals>.<genexpr>Ð  s   øé € Ð8\ÑV[ÐQR¸h¹,È1Ö9LÒV[ùr{   r|   r   r}   rC   rg   r~   u	   PerÃ­odo rm   r€   z procesado - Mediciones: u"   Error procesando grupo histÃ³rico r�   Nu@   Procesamiento histÃ³rico completado. Total registros generados: z, Total mediciones procesadas: u#   Error en procesamiento histÃ³rico: )r-   r!   r"   r   r+   rK   r@   r   rJ   r   r4   r   ÚlistrM   rY   r‚   rƒ   r„   r…   r†   rn   r‡   Úverboser3   r5   )r#   Útotal_records_generatedÚtotal_measurements_processedr+   Úultimo_cuartor8   r“   Úfecha_inicioÚfecha_actualÚfecha_siguienterG   Úperiod_groupsrŠ   r=   ÚgrouprD   r‹   ri   rj   rŒ   rk   r�   r9   rh   s                          @r&   Úprocess_historical_dataÚ+StatisticsProcessor.process_historical_data|  s¦  ø€ à×$Ñ$×&Ñ&Øä�‰Ð;Ô<Ø"#ÐØ'(Ð$ðv	ä—,’,“.ˆCØŸK™KØŸ
™
Ô&6Ñ6Ô:JÑJØØð (ð ˆMð #×0Ñ0ð 2ð
  Ð!ó#‰OˆGö ¦&°°q±	¸(×0CÜ—‘ÐAÔBØà! !™9 XÑ.ˆLØ'×/Ñ/Ø$×+Ñ+Ô/?Ñ?ÔCSÑSØØð 0ð ˆLð Ô.Ø".´ÔCSÑ1TÑ"T�ð )-×(:Ñ(:ð <ð" #Ð4ó#)6Ñ%�ö& Ü—L‘LÐ!JÔKØ çä$/´Ó$5�MÛ)˜Ø%¨¡iÑ0×7Ñ7¸Ö:ñ *ð (5×':Ñ':×'<™˜ð(%Ø%*¨1¡X¨hÑ%7˜FáKPÓ$QÉ5Àa¤U¨1¨V©9°vÑ+=¸qÖ%AÉ5˜EÐ$Qç$Ü+0´°U³¼cÀ%»jÑ1HÈ!Ó+L Ü).¬s°5«z¸1Ó)= Ü).¬s°5«z¸1Ó)= ä#& u£:°£>Ü58Ô8\ÑV[Ó8\Ó5\ NÜ-2°NÄcÈ%ÃjÐSTÁnÑ4UÐZ]Ñ3]Ð_`Ó-a¡Fà-0 Fð $(×#8Ñ#8Ø$)¨!¡H¨[Ñ$9Ø$0à4<Ø28Ø28Ø28ñ	%&÷	$"ñ 	$"ð %<¸qÑ$@Ð$;Ù<AÓ*B¹E°q¨T¬7¹E CÐ*BØ$(×$AÑ$AÀ#Ô$FØ$@ÄCÈÃJÑ$NÐ$@à'+§|§|Ü(.¯©Ø.7¸À^Ð7Tð U5Ø59°Fð ;;Ü;>¸u»:¸,ð-H÷)*ò (4ò	$"ò  %ñ (=ðX  /�ð] Ö.ô` �K‰Kð.Ø.EÐ-Fð G0Ø0LÐ/MðOôð
 ùò_ %Rùò2 +Cøô  )ó %Ü"ŸL™LÐ+MÈdÈVÐSUÔVYÐZ[ÓV\ÐU]Ð)^Ô_Þ$ûð%ûô ó 	Ü�L‰LÐ>¼sÀ1»v¸hÐGÔHÜûð	úsv   ²BM Â6A8M Ä/AM Å<LÆLÆ#CLÉ)L	É6ALËM Ë(M Ì
LÌ
MÌ$MÌ<M ÍMÍM Í
N Í!M;Í;N )r   r   r   r   r   r   r   r   )F)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r:   r2   r1   r[   rL   rn   r‡   r    r¥   rµ   Ú__static_attributes__Ú__classcell__)r%   s   @r&   r   r      sH   ø† õ8ò"ò<?òB4òlô&0òd*òXHò0#IòJ
÷ ð r(   r   )Ú__doc__rW   Úloggingr.   r   r   Úcollectionsr   Úbaser   Úconfig.constantsr	   r
   r   Úintegrationr   Ú	getLoggerr·   r!   r   ru   r(   r&   Ú<module>rÄ      sK   ðñó 
Û Û ß (Ý #Ý  ÷ñ õ
 /à	×	Ò	˜8Ó	$€ôd˜-õ dr(   