Ë
    IB™jW  ã                   ó,  — U d dl Z d dlZd dlmZmZ d dlmZmZmZmZ d dl	Z	d dl
Zd dlmZmZ d dlmZ d dlmZmZ d dlmZ  edd	g¬
«      Z ej.                  d«        ej0                  d d «       e j2                  j5                  e j2                  j7                  e«      «      Ze j2                  j=                  ed«      Ze j2                  j=                  ed«      Z e j2                  j=                  ed«      Z! e jD                  e d¬«        ej.                  e!«       i Z#ee$ee$ef   f   e%d<   g d¢Z&i dd“dd“dd“dd“dd“dd“dd “d!d"“d#d$“d%d&“d'd(“d)d*“d+d,“d-d.“d/d0“d1d2“d3d4“d5d6d7d8d9d:d;d<d=d>œ	¥Z'i dejP                  “dejR                  “dejT                  “dejV                  “dejX                  “dejZ                  “dej\                  “d!ej^                  “d#ej`                  “d%ejb                  “d'ejd                  “d)d?“d+ejf                  “d@d?“d-ejh                  “d/ejj                  “d1ejl                  “ejn                  dAdBdCœ¥Z8dDdEdFdGdHdIdJdKdLdMdNdOœZ9d dPdQœdRdSdQœdTdPdQœdUdPdQœdVdPdQœdWœZ:dXdYdQœdZdYdQœd[dYdQœd\dYdQœd]dYdQœd^d_dQœd`œZ; G da„ dbe«      Z<dce=dde$fde„Z>	 dždfe?dge?dhe?die?dje?dke=dle=dce=dmee$   dnedoe=dpe=dqee$   dre$fds„Z@dte=dde=fdu„ZAdve=dwe=dde=fdx„ZBdy„ ZCdzefd{„ZDd|e=dde$fd}„ZEd|e=dde$fd~„ZFde=dde$fd€„ZGdŸdte=dde$fd�„ZHd‚„ ZIdƒe=d„e?fd…„ZJd dƒe=d†e=d‡e=fdˆ„ZKd|e=d‰ee=   dde?fdŠ„ZLdre$d|e=d‹e=dŒe?fd�„ZMdŽ„ ZNd�„ ZOd dƒe=d†e=d‡e=fd�„ZPd‘e$fd’„ZQd“ed”e=d‘e$fd•„ZRd–„ ZSd—e<fd˜„ZTej«                  d™«      d—e<fdš„«       ZVej¯                  d›«      dœe$fd�„«       ZXy)¡é    N)ÚdatetimeÚ	timedelta)ÚOptionalÚDictÚAnyÚList)Ú	APIRouterÚHTTPException)Ú	BaseModel)ÚAstrologicalSubjectÚKerykeionChartSVG)Úextract_solar_return_wheelz/calculatorszSaturn Return)ÚprefixÚtagsz/usr/share/epheÚchartsÚsaturn_returnÚepheT)Úexist_okÚSATURN_RETURN_RESULTS)ÚAriesÚTaurusÚGeminiÚCancerÚLeoÚVirgoÚLibraÚScorpioÚSagittariusÚ	CapricornÚAquariusÚPiscesÚSunu   â˜‰ÚMoonu   â˜½ÚMercuryu   â˜¿ÚVenusu   â™€ÚMarsu   â™‚ÚJupiteru   â™ƒÚSaturnu   â™„ÚUranusu   â™…ÚNeptuneu   â™†ÚPlutou   â™‡ú
North Nodeu   â˜Šú
South Nodeu   â˜‹úBlack Moon Lilithu   âš¸ÚCeresu   âš³ÚPallasu   âš´ÚJunou   âšµÚVestau   âš¶u   âš·u   Ï†ÚWÚASÚDSÚMCÚICÚVxÚX)	ÚChironÚPholusúWhite Moon SelenaÚ	AscendantÚ
DescendantÚ	Midheavenú
Imum CoeliÚVertexúPart of Fortuneéç  r<   é  é  )r2   r:   r;   u   â˜Œu   â˜�u   â–³u   â–¡u   âš¹u   âšºu   âˆ u   â¬ u   âš¼u   â«²u   âš»)ÚconjunctionÚ
oppositionÚtrineÚsquareÚsextileÚsemisextileÚ
semisquareÚquintileÚsesquiquadrateÚ
biquintileÚquincunxé   )ÚangleÚorbé<   é   éZ   éx   é´   )rF   rJ   rI   rH   rG   é   é   é-   éH   é‡   é�   é–   é   )rK   rL   rM   rN   rO   rP   c                   óÜ   — e Zd ZU eed<   eed<   eed<   eed<   eed<   dZeed<   eed<   eed	<   d
Zeed<   dZe	e
   ed<   dZe	e   ed<   dZe	e   ed<   dZe	e
   ed<   dZe
ed<   dZe
ed<   y)ÚSaturnReturnRequestÚyearÚmonthÚdayÚhourÚminuter   ÚsecondÚlatitudeÚ	longitudeç      @ÚtimezoneNÚbirth_placeÚreturn_latitudeÚreturn_longitudeÚreturn_placeÚfirstÚcycleÚPÚhouse_system)Ú__name__Ú
__module__Ú__qualname__ÚintÚ__annotations__rh   Úfloatrl   rm   r   Ústrrn   ro   rp   rr   rt   © ó    ú=/var/www/html/Astrologybackend/backend/saturn_return_chart.pyrb   rb   v   s†   … Ø
ƒIØƒJØ	ƒHØ
ƒIØƒKØ€FˆCƒOàƒOØÓØ€HˆeÓà!%€K�˜#‘Ó%à'+€O�X˜e‘_Ó+Ø(,Ð�h˜u‘oÓ,Ø"&€L�(˜3‘-Ó&à€Eˆ3ÓØ€L�#Ôr}   rb   rl   Úreturnc                 ó(   — | dk(  ry| dk(  ryd|  d›�S )Nrk   úAsia/Kolkatar   ÚUTCzEtc/GMTz+dr|   )rl   s    r~   Úget_timezone_strrƒ   Œ   s'   € Ø�3‚ØØ	�QŠØà˜(˜ 2˜Ð'Ð'r}   Ú
birth_yearÚbirth_monthÚ	birth_dayÚ
birth_hourÚbirth_minuteÚ	birth_latÚ	birth_lonrm   Ú	return_dtÚ
return_latÚ
return_lonrp   Únamec                 ó°  — 	 t        |«      }|xs d}d}t        |› d�| |||||||||¬«      }|xs |xs d}t        |› d�|	j                  |	j                  |	j                  |	j
                  |	j                  |||
||¬«      }dj                  d„ |D «       «      xs d	}|› d
t        j                  «       j                  d«      › �}t        t        j                  t        «      «      }t        |d|t        ¬«      }|j!                  «        t        t        j                  t        «      «      }t#        ||z
  «      }|D �cg c]$  }|j%                  «       j'                  d«      sŒ#|‘Œ& }}|sEt        j                  t        «      D �cg c]#  }|j%                  «       j'                  d«      r|‘Œ% }}|sy |j)                  d„ d¬«       |d   }t        j*                  j                  t        |«      }|› d�}t        j*                  j                  t        |«      }t-        ||«       d|› �S c c}w c c}w # t.        $ r} t1        d| «       Y d } ~ y d } ~ ww xY w)NzBirth PlaceÚINz Natal)rŽ   rc   rd   re   rf   rg   ÚcityÚnationÚlatÚlngÚtz_strzReturn Placez Saturn ReturnÚ c              3   óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­w©N)Úisalnum)Ú.0Úcs     r~   ú	<genexpr>z/generate_saturn_return_chart.<locals>.<genexpr>Ç   s   è ø€ Ò; !¨q¯y©y­{œAÑ;ùs   ‚˜ÚchartÚ_Saturn_Return_z%Y%m%d%H%M%SÚTransit)Ú
chart_typeÚ
second_objÚnew_output_directoryz.svgc                 ó„   — t         j                  j                  t         j                  j                  t        | «      «      S r˜   )ÚosÚpathÚgetmtimeÚjoinÚSATURN_RETURN_DIR)Úfs    r~   ú<lambda>z.generate_saturn_return_chart.<locals>.<lambda>â   s%   € œ"Ÿ'™'×*Ñ*¬2¯7©7¯<©<Ô8IÈ1Ó+MÓN€ r}   T)ÚkeyÚreverser   z/charts/saturn_return/z%Saturn Return chart generation error:)rƒ   r   rc   rd   re   rf   rg   r§   r   ÚnowÚstrftimeÚsetr¤   Úlistdirr¨   r   ÚmakeSVGÚlistÚlowerÚendswithÚsortr¥   r   Ú	ExceptionÚprint)!r„   r…   r†   r‡   rˆ   r‰   rŠ   rl   rm   r‹   rŒ   r�   rp   rŽ   Útimezone_strr‘   r’   Únatal_subjectÚreturn_cityÚreturn_subjectÚ	safe_nameÚ
chart_nameÚbefore_filesr�   Úafter_filesÚ	new_filesr©   Ú	svg_filesÚ
latest_svgÚlatest_pathÚ
final_nameÚ
final_pathÚes!                                    r~   Úgenerate_saturn_return_chartrÇ   •   sF  € ð MÜ'¨Ó1ˆØÒ+˜mˆØˆä+Ø�6˜�ØØØØØØØØØØô
ˆð #ÒD lÒD°nˆÜ,Ø�6˜Ð(Ø—‘Ø—/‘/Ø—‘Ø—‘Ø×#Ñ#ØØØØØô
ˆð —G‘GÑ; tÔ;Ó;ÒF¸wˆ	Ø!�{ /´(·,±,³.×2IÑ2IÈ.Ó2YÐ1ZÐ[ˆ
äœ2Ÿ:™:Ô&7Ó8Ó9ˆä!ØØ Ø%Ü!2ô	
ˆð 	�‰Œäœ"Ÿ*™*Ô%6Ó7Ó8ˆÜ˜ |Ñ3Ó4ˆ	à )ÖH˜1¨Q¯W©W«Y×-?Ñ-?ÀÕ-G’QÐHˆ	ÐHÙäŸ:™:Ô&7Ó8öØØ—7‘7“9×%Ñ% fÔ-ò ðˆIð ñ
 Øà�‰ÙNØð 	ô 	
ð
 ˜q‘\ˆ
Ü—g‘g—l‘lÔ#4°jÓAˆà"�| 4Ð(ˆ
Ü—W‘W—\‘\Ô"3°ZÓ@ˆ
ä" ;°
Ô;à'¨
 |Ð4Ð4ùò/ Iùòøô. ò ÜÐ5°qÔ9ÜûðúsC   ‚D>H6 Å $H,Å%H,Å)H6 Æ(H1Æ0H6 Æ5A6H6 È,
H6 È6	IÈ?IÉIÚvaluec                 ó   — | dz  S ©Nih  r|   )rÈ   s    r~   Únormalize_degrË   õ   s   € Ø�3‰;Ðr}   ÚaÚbc                 óB   — t        | |z
  «      dz  }t        |d|z
  «      S rÊ   )ÚabsÚmin)rÌ   rÍ   Údiffs      r~   Ú
angle_diffrÒ   ù   s%   € Üˆq�1‰u‹:˜Ñ€DÜˆt�S˜4‘ZÓ Ð r}   c                 óŒ   — t        | |||||«      }t        |«      }t        t        ||z
  dz  «      «      }	|t        ||	¬«      z
  S )NrT   )ÚhoursÚminutes)r   rx   Úroundr   )
rc   rd   re   rf   rg   rh   rl   Úlocal_dtÚtz_hoursÚ
tz_minutess
             r~   Úlocal_to_utcrÚ   þ   sJ   € Ü˜˜e S¨$°¸Ó?€Hä�8‹}€HÜ”U˜H xÑ/°2Ñ5Ó6Ó7€Jà”i h¸
ÔCÑCÐCr}   Údtc                 óÂ   — t        j                  | j                  | j                  | j                  | j
                  | j                  dz  z   | j                  dz  z   «      S )NrT   i  )ÚsweÚjuldayrc   rd   re   rf   rg   rh   )rÛ   s    r~   Újd_from_datetimerß     sJ   € Ü�:‰:Ø
�‰Ø
�‰Ø
�‰Ø
�‰�"—)‘)˜b‘.Ñ  2§9¡9¨tÑ#3Ñ3ó	ð r}   rj   c                 ó>   — t         t        t        | «      dz  «         S )NrY   )ÚSIGNSrx   rË   )rj   s    r~   Úget_signrâ     s   € Ü””] 9Ó-°Ñ3Ó4Ñ5Ð5r}   c                 ó˜   — t        | «      } | dz  }t        |«      }||z
  dz  }t        t        |«      «      }|dk(  r|dz  }d}|› d|› d�S )NrY   rT   é   r   õ   Â° ú')rË   rx   rÖ   )rj   Údeg_in_signÚdegrg   Úminute_roundeds        r~   Úformat_degreerê     sf   € Ü˜iÓ(€IØ˜b‘.€Kä
ˆkÓ
€CØ˜CÑ 2Ñ%€FÜœ˜v›Ó'€Nà˜ÒØˆq‰ˆØˆàˆU�#�nÐ% QÐ'Ð'r}   Ú	orb_floatc                 ót   — t        | «      }t        t        | |z
  dz  «      «      }|dk(  r|dz  }d}|› d|› d�S )NrT   rä   r   rå   ræ   )rx   rÖ   )rë   rè   rÕ   s      r~   Ú
format_orbrí   #  sK   € Ü
ˆi‹.€CÜ”%˜ S™¨BÑ.Ó/Ó0€Gà�"‚}Øˆq‰ˆØˆàˆU�#�g�Y˜aÐ Ð r}   c                 ó¸   — |r
| dk\  rdnd}n	| dk\  rdnd}t        | «      }t        |«      }t        t        ||z
  dz  «      «      }|dk(  r|dz  }d}|› d|› d	|› �S )
Nr   ÚNÚSÚEr3   rT   rä   rå   z' )rÏ   rx   rÖ   )rÈ   r“   Ú	directionÚvrè   rÕ   s         r~   Údecimal_to_dmsrô   .  st   € Ù
Ø  Aš:‘C¨3‰	à  Aš:‘C¨3ˆ	äˆE‹
€AÜ
ˆa‹&€CÜ”%˜˜S™ B™Ó'Ó(€Gà�"‚}Øˆq‰ˆØˆàˆU�#�g�Y˜b  Ð,Ð,r}   c                 ó°   — 	 |dv r+t        j                  | |«      }t        |d   d   «      dddœS t        | |«      S # t        $ r t        | |«      cY S w xY w)N©rD   rE   r   F©rj   ÚspeedÚ
retrograde)rÝ   Úcalc_utrË   Ú	calc_bodyr¶   )ÚjdÚbody_idÚresults      r~   Úcalc_chiron_pholusrÿ   ?  sc   € ð&Ø�lÑ"Ü—[‘[  WÓ-ˆFÜ!.¨v°a©y¸©|Ó!<ÀqÐX]Ñ^Ð^Ü˜˜WÓ%Ð%øÜò &Ü˜˜WÓ%Ò%ð&ús   ‚.= ±= ½AÁArü   rý   c                 ó<  — 	 |dv r4t        j                  | |«      d   }t        |d   «      |d   |d   dk  dœS 	 t        j                  | |t         j                  t         j
                  z  «      d   }t        |d   «      |d   |d   dk  dœS # t        $ r Y Œ_w xY w)Nrö   r   r`   r÷   )rÝ   rú   rË   r¶   Ú
FLG_MOSEPHÚ	FLG_SPEED)rü   rý   Údatas      r~   rû   rû   I  s³   € ð	Ø�lÑ"Ü—;‘;˜r 7Ó+¨AÑ.ˆDä*¨4°©7Ó3Ø˜a™Ø" 1™g¨™kñð ð #ô �;‰;�r˜7¤C§N¡N´S·]±]Ñ$BÓCÀAÑF€Dä" 4¨¡7Ó+Ø�a‘Ø˜1‘g ‘kñð øô ò Ùðús   ‚7B Â	BÂBr“   Úlonc                 óæ   — t        j                  | |||j                  «       «      \  }}t        |d   «      }t        |d   «      }t        |dz   «      }t        |dz   «      }	t	        |«      ||||	dœS )Nr   rä   rX   )Úcuspsr=   r>   r?   r@   )rÝ   ÚhousesÚencoderË   r²   )
rü   r“   r  rt   r  ÚascmcÚascÚmcÚdescÚics
             r~   Úget_chart_pointsr  \  sz   € Ü—:‘:˜b # s¨L×,?Ñ,?Ó,AÓB�L€Eˆ5ä
˜˜a™Ó
!€CÜ	�u˜Q‘xÓ	 €BÜ˜˜s™Ó#€DÜ	�r˜C‘xÓ	 €Bô �e“ØØØØñð r}   r  c                 óÖ   — t        | «      }t        d«      D ]P  }t        ||   «      }t        ||dz   dz     «      }||k  r||cxk  r|k  sŒ6n Œ9|dz   c S ||k\  s||k  sŒK|dz   c S  y)Né   rä   )rË   Úrange)rj   r  r  ÚiÚstartÚends         r~   Úhouse_for_longituder  m  s|   € Ü
˜	Ó
"€Cä�2‹Yò 	ˆÜ˜e A™hÓ'ˆÜ˜E 1 q¡5¨B¡,Ñ/Ó0ˆà�CŠ<Ø˜Ô!˜cÖ!Ø˜1‘u’à�eŠ|˜s S›yØ˜1‘u’ð	ð r}   rø   Úhousec                 óŽ   — | t         j                  | d«      t        t        |«      d«      t	        |«      t        |«      ||dk  dœS )Nr–   é   r   )rŽ   Úsymbolrj   ÚsignÚdegreer  rù   )ÚPLANET_SYMBOLSÚgetrÖ   rË   râ   rê   )rŽ   rj   rø   r  s       r~   Úformat_planetr  ~  sH   € àÜ ×$Ñ$ T¨2Ó.Üœ=¨Ó3°QÓ7Ü˜Ó#Ü 	Ó*ØØ˜a‘iñð r}   c                 ó$   — t        ||z   | z
  «      S r˜   ©rË   )Úsun_lonÚmoon_lonÚasc_lons      r~   Úpart_of_fortuner$  Š  s   € Ü˜ 8Ñ+¨gÑ5Ó6Ð6r}   c                 ó   — t        |dz   «      S )NrV   r   )r#  Úmc_lons     r~   Úvertex_approxr'  Ž  s   € Ü˜ "™Ó%Ð%r}   c                 óv  — t        | |||«      }|d   }g }i }t        j                  «       D ]N  \  }}	|dv rŒ	 t        | |	«      }
|
||<   t	        |
d   |«      }|j                  t        ||
d   |
d   |«      «       ŒP dD ]\  \  }}		 t        j                  | |	«      }t        |d   d   «      }|ddœ||<   |j                  t        ||dt	        ||«      «      «       Œ^ d|v rAt        |d   d   d	z   «      }|j                  t        d
||d   d   t	        ||«      «      «       d|v r;t        |d   d   d	z   «      }|j                  t        d|dt	        ||«      «      «       dD ].  }||   }|j                  t        ||dt	        ||«      «      «       Œ0 d|v rGd|v rCt        |d   d   |d   d   |d   «      }|j                  t        d|dt	        ||«      «      «       t        |d   |d   «      }|j                  t        d|dt	        ||«      «      «       |S # t        $ r Y �Œûw xY w# t        $ r Y �Œ¸w xY w)Nr  )r:   r;   rj   rø   ))r:   rD   )r;   rE   r   )rj   rø   r,   rX   r-   r.   r<   )r=   r>   r?   r@   r"   r#   r=   rB   r?   rA   )r  ÚBODY_IDSÚitemsrû   r  Úappendr  r¶   rÝ   rú   rË   r$  r'  )rü   r“   r  rt   Úpointsr  ÚplanetsÚ
calculatedrŽ   rý   Úbodyr  rþ   Ú
chiron_lonÚ	south_lonÚ
selena_lonÚ
point_nameÚ	point_lonÚpof_lonÚvx_lons                       r~   Úcalculate_planetsr7  ’  s¡  € Ü˜b # s¨LÓ9€FØ�7‰O€Eà€GØ€Jä!Ÿ™Ó)ò 	‰ˆˆgØÐ'Ñ'Øð	Ü˜R Ó)ˆDØ#ˆJ�tÑÜ'¨¨[Ñ(9¸5ÓAˆEØ�N‰Nœ=¨¨t°KÑ/@À$ÀwÁ-ÐQVÓWÕXð	ð >ò ‰ˆˆgð	Ü—[‘[  WÓ-ˆFÜ& v¨a¡y°¡|Ó4ˆJØ-7À!ÑDˆJ�tÑØ�N‰Nœ=¨¨z¸1Ô>QÐR\Ð^cÓ>dÓeÕfðð �zÑ!Ü! *¨\Ñ":¸;Ñ"GÈ#Ñ"MÓNˆ	Ø�‰”} \°9¸jÈÑ>VÐW^Ñ>_ÔatÐu~ð  AFó  bGó  Hô  	Ià˜jÑ(Ü" :Ð.AÑ#BÀ;Ñ#OÐRUÑ#UÓVˆ
Ø�‰”}Ð%8¸*ÀaÔI\Ð]gÐinÓIoÓpÔqàLò gˆ
Ø˜:Ñ&ˆ	Ø�‰”} Z°¸AÔ?RÐS\Ð^cÓ?dÓeÕfðgð �
Ñ˜v¨Ñ3Ü! *¨UÑ"3°KÑ"@À*ÈVÑBTÐU`ÑBaÐciÐjuÑcvÓwˆØ�‰”}Ð%6¸ÀÔDWÐX_ÐafÓDgÓhÔiä˜6 +Ñ.°°{Ñ0CÓD€FØ‡N�N”= ¨6°1Ô6IÈ&ÐRWÓ6XÓYÔZà€Nøô? ò 	Úð	ûô ò 	Úð	ús%   ¸AHÂAH+È	H(È'H(È+	H8È7H8rr   c                 ó   — | dk(  ry| dk(  ryy)Nrh   )é8   rT   zSecond Saturn ReturnÚthird)éT   rV   zThird Saturn Return)é   é   zFirst Saturn Returnr|   )rr   s    r~   Úget_cycle_ranger>  Ã  s   € Ø�ÒØ-à�ÒØ,à(r}   Ú	birth_utcÚnatal_saturn_lonc                 ó   — t        |«      \  }}}| t        t        |dz  «      ¬«      z   }| t        t        |dz  «      ¬«      z   }g }|}	|	|k  rbt        |	«      }
t	        |
t
        j                  «      }t        |d   |«      }|dk  r|j                  |	|dœ«       |	t        d¬«      z  }	|	|k  rŒbg }|D ]V  }|s|j                  |«       Œ|d   }|d   |d   z
  j                  d	kD  r|j                  |«       ŒF|d
   |d
   k  sŒR||d<   ŒX g }|D ]å  }|d   }|t        d¬«      z
  }|t        d¬«      z   }|}d}|}||k  rRt        |«      }
t	        |
t
        j                  «      }t        |d   |«      }||k  r|}|}|t        d¬«      z  }||k  rŒRt        |«      }
t	        |
t
        j                  «      }|j                  ||d   ||d   dk  rdndt        || z
  j                  dz  d«      dœ«       Œç ||||fS )Ng     Ôv@)Údaysrj   g      ð?)r   rS   rä   éÿÿÿÿr   é   rS   r`   rC   rY   )rÕ   rø   r   Ú
RetrogradeÚDirect)Úutc_datetimeÚsaturn_longituderS   ÚmotionÚage)r>  r   rx   rß   rû   rÝ   ÚSATURNrÒ   r+  rB  rÖ   )r?  r@  rr   Ú	start_ageÚend_ageÚcycle_labelÚsearch_startÚ
search_endÚ
candidatesÚcurrentrü   ÚsaturnrS   ÚgroupedÚ	candidateÚlastÚexact_passesÚitemÚcenterÚrefine_startÚ
refine_endÚbest_dtÚbest_orbÚts                           r~   Úfind_saturn_return_passesr_  Í  sT  € Ü&5°eÓ&<Ñ#€Iˆw˜àœy¬c°)¸fÑ2DÓ.EÔFÑF€LØœY¬C°¸&Ñ0@Ó,AÔBÑB€Jà€JØ€Gà
�ZÒ
Ü˜gÓ&ˆÜ˜2œsŸz™zÓ*ˆä˜ Ñ,Ð.>Ó?ˆà�#Š:Ø×Ñà 'Øñôð 	”9 !Ô$Ñ$ˆð �ZÓ
ð  €Gàò (ˆ	ÙØ�N‰N˜9Ô%Øà�r‰{ˆà�jÑ! D¨Ñ$4Ñ4×:Ñ:¸RÒ?Ø�N‰N˜9Õ%à˜Ñ $ u¡+Ó-Ø'�˜’ð(ð €Làò  
ˆØ�jÑ!ˆØ¤	¨qÔ 1Ñ1ˆØœi¨QÔ/Ñ/ˆ
àˆØˆàˆà�:ŠoÜ! !Ó$ˆBÜ˜r¤3§:¡:Ó.ˆFÜ˜V KÑ0Ð2BÓCˆCà�XŠ~Ø�Ø�à” 2Ô&Ñ&ˆAð �:‹oô ˜gÓ&ˆÜ˜2œsŸz™zÓ*ˆà×Ñà 'Ø$*¨;Ñ$7ØØ*0°©/¸AÒ*=™,À8Ü˜g¨	Ñ1×7Ñ7¸&Ñ@À!ÓDñõ	
ð1 
ðD ˜ i°Ð8Ð8r}   c                 ó.  — g d¢}g }| D �ci c]  }|d   |“Œ
 }}|D �ci c]  }|d   |“Œ
 }}|D ]Æ  }||vrŒ||   }|j                  |«      }	|D ]¤  }
|
|vrŒ||
   }t        |d   |d   «      }dD ]�  }|dk(  rt        nt        }|j	                  «       D ][  \  }}t        ||d   z
  «      }||d   k  sŒ |j                  |
|d   |t        |   |||d   t        |«      t        |d	«      |	d
œ
«       Œ] Œƒ Œ¦ ŒÈ |j                  d„ ¬«       |S c c}w c c}w )N)r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r<   r/   r0   r1   r2   r:   r;   r=   r>   r?   r@   rA   rB   rŽ   rj   )ÚMajorÚMinorra  rR   rS   r  r  )
Úreturn_planetÚreturn_symbolÚaspectÚaspect_symbolÚaspect_typeÚnatal_planetÚnatal_symbolrS   Ú	orb_valueÚ
sort_orderc                 ó   — | d   | d   fS )Nrk  rj  r|   )Úxs    r~   rª   z(detect_overlay_aspects.<locals>.<lambda>N  s   €   ,¡°°;±Ð@€ r}   )r«   )ÚindexrÒ   ÚMAJOR_ASPECTSÚMINOR_ASPECTSr*  rÏ   r+  ÚASPECT_SYMBOLSrí   rÖ   rµ   )Únatal_planetsÚreturn_planetsÚplanet_orderÚaspectsÚpÚnatal_lookupÚreturn_lookupÚnp_nameÚnp_dataÚnp_orderÚrp_nameÚrp_datarÑ   rg  Úcfg_mapÚaspect_nameÚcfgrS   s                     r~   Údetect_overlay_aspectsr�    sr  € ò€Lð €Gà*7Ö8 Q�A�f‘I˜q‘LÐ8€LÐ8Ø+9Ö: a�Q�v‘Y ‘\Ð:€MÐ:àò  ˆØ˜,Ñ&Øà˜wÑ'ˆØ×%Ñ% gÓ.ˆà#ò 	ˆGØ˜mÑ+Øà# GÑ,ˆGÜ˜g kÑ2°G¸KÑ4HÓIˆDà1ò �Ø+6¸'Ò+A�-Ä}�à(/¯©«ò Ñ$�K Ü˜d S¨¡\Ñ1Ó2�Cà˜c %™jÓ(ØŸ™Ø-4Ø-4°XÑ->Ø&1Ü-;¸KÑ-HØ+6Ø,3Ø,3°HÑ,=Ü#-¨c£?Ü).¨s°A«Ø*2ñ(õ ñ	ññ	ð ðD ‡L�LÑ@€LÔAØ€NùòM 9ùÚ:s
   ‹DžDÚpayloadc                 ó  — | j                   }t        | j                  | j                  | j                  | j
                  | j                  | j                  |«      }t        |«      }| j                  }| j                  }| j                  �| j                  n|}| j                  �| j                  n|}| j                  }t        |t        j                   «      }	|	d   }
t#        ||
| j$                  «      \  }}}}|st'        dd¬«      ‚|d   }|d   }t        |«      }t)        | j                  | j                  | j                  | j
                  | j                  | j                  «      }|t+        |¬«      z   }t-        ||||«      }t-        ||||«      }t/        ||«      }|D �cg c]  }|d   d	k(  sŒ|‘Œ }}|D �cg c]  }|d   d
k(  sŒ|‘Œ }}g }t1        |«      D ]ª  \  }}|d   t+        |¬«      z   }|j3                  |dz   |j5                  d«      j7                  dd«      |j5                  d«      |dk(  rdnd|d›�|d   |d   |dk(  t9        |d   d«      t;        |d   «      t=        |d   «      t?        |d   «      dœ«       Œ¬ tA        | j                  | j                  | j                  | j
                  | j                  |||| jB                  |||| jD                  ¬«      }d|j5                  d«      j7                  dd«      | jB                  xs dtG        |d«      › dtG        |d«      › �|d k(  rd!n||d"|› d#|› �|j5                  d«      j7                  dd«      |j5                  d«      |dk(  rdnd|d›�|d$tI        |«      › �|d   d%z   |d   | jD                  xs | jB                  xs dtG        |d«      › dtG        |d«      › �d&œt9        |
d«      t;        |
«      t=        |
«      |	d'   d(œ|||||||d)œ
S c c}w c c}w )*Nrj   é”  zNo Saturn return pass found.©Ústatus_codeÚdetailr   rG  )rÔ   rg  ra  rb  rä   z	%B %d, %Yz 0ú z%H:%Mrk   r�   r‚   ú+rI  rJ  rH  r  rS   )Úpass_numberÚdateÚtimerl   rI  rJ  ÚusedrH  r  r  rS   )r„   r…   r†   r‡   rˆ   r‰   rŠ   rl   rm   r‹   rŒ   r�   rp   Tz%B %d, %Y at %H:%MzSelected locationz, Frs   ÚPlaciduszAge u   â€“z1 of z pass)Ú	birthdaterm   Úbirth_coordinatesrt   rN  Ú	age_rangeÚreturn_dateÚreturn_timerl   Úreturn_cycleÚ
exact_passÚ
pass_phaseÚage_at_exact_returnrp   Úreturn_coordinatesrù   )rj   r  r  rù   )
ÚsuccessÚdetailsÚnatal_saturnrW  rr  rs  Úoverlay_aspectsÚmajor_overlay_aspectsÚminor_overlay_aspectsÚ	chart_url)%rl   rÚ   rc   rd   re   rf   rg   rh   rß   ri   rj   rn   ro   rt   rû   rÝ   rK  r_  rr   r
   r   r   r7  r�  Ú	enumerater+  r®   ÚreplacerÖ   râ   rê   rí   rÇ   rm   rp   rô   Úlen)r‚  rl   r?  Úbirth_jdr‰   rŠ   rŒ   r�   rt   r›  r@  ÚpassesrN  rL  rM  Úselected_passÚ
return_utcÚ	return_jdÚlocal_birth_dtÚlocal_return_dtrr  rs  rœ  rÌ   r�  rž  rW  rn  rv  Úpass_local_dtrŸ  s                                  r~   Úcalculate_saturn_return_resultr«  R  st  € Ø×Ñ€HäØ�‰Ø�‰Ø�‰Ø�‰Ø�‰Ø�‰Øó€Iô   	Ó*€Hà× Ñ €IØ×!Ñ!€Ià,3×,CÑ,CÐ,O�×(Ò(ÐU^€JØ-4×-EÑ-EÐ-Q�×)Ò)ÐW`€Jà×'Ñ'€Lä˜X¤s§z¡zÓ2€LØ# KÑ0Ðä.GØØØ�‰ó/Ñ+€FˆK˜ Gñ Ü¨Ð4RÔSÐSà˜1‘I€MØ˜~Ñ.€JÜ  Ó,€IäØ�‰Ø�‰Ø�‰Ø�‰Ø�‰Ø�‰ó€Nð !¤9°8Ô#<Ñ<€Oä%ØØØØó	€Mô 'ØØØØó	€Nô -¨]¸NÓK€Oà"öØ a¨Ñ&6¸'Ó&AŠðÐð ð #öØ a¨Ñ&6¸'Ó&AŠðÐð ð €Lä˜fÓ%ò 
‰ˆˆqØ˜.Ñ)¬I¸HÔ,EÑEˆà×Ñà$ q™yØ%×.Ñ.¨{Ó;×CÑCÀDÈ#ÓNØ%×.Ñ.¨wÓ7Ø.6¸#ªo™NÀSÈÐRSÈÐCUØ˜H™+Ø˜‘xØ ™
Ü$)¨!Ð,>Ñ*?ÀÓ$CÜ  Ð#5Ñ!6Ó7Ü'¨Ð*<Ñ(=Ó>Ü! ! E¡(Ó+ñõ	
ð
ô& -Ø—<‘<Ø—M‘MØ—+‘+Ø—<‘<Ø—^‘^ØØØØ×'Ñ'Ø!ØØØ×)Ñ)ô€Ið" à'×0Ñ0Ð1EÓF×NÑNÈtÐUXÓYØ"×.Ñ.ÒEÐ2EÜ$2°9¸dÓ$CÐ#DÀBÄ~ÐV_ÐafÓGgÐFhÐ!iØ*6¸#Ò*=™JÀ<Ø&Ø 	˜{¨#¨g¨YÐ7Ø*×3Ñ3°KÓ@×HÑHÈÈsÓSØ*×3Ñ3°GÓ<Ø*2°cª/™ÀÀXÈaÀLÐ?QØ'Ø!¤# f£+ Ð/Ø'¨Ñ1°GÑ;Ø#0°Ñ#7Ø#×0Ñ0Ò^°G×4GÑ4GÒ^ÐK^Ü%3°JÀÓ%EÐ$FÀbÌÐXbÐdiÓIjÐHkÐ"lñ
ô$ Ð/°Ó3ÜÐ-Ó.Ü#Ð$4Ó5Ø& |Ñ4ñ	
ð %Ø&Ø(Ø*Ø!6Ø!6Øñ? ð  ùòYùòs   Æ#O>Æ1O>Æ;PÇ	Pz/saturn-return-chartc                 ó’   — t        | «      }t        t        j                  «       j                  «      d d }|t
        |<   d|d|› �|dœS )Né   Tz!/calculators/saturn-return-chart/)r™  Ú	result_idÚredirect_urlr  )r«  r{   ÚuuidÚuuid4rx   r   )r‚  rþ   r®  s      r~   Úcreate_saturn_return_chartr²  â  sS   € ä+¨GÓ4€Fä”D—J‘J“L×$Ñ$Ó% b qÐ)€IØ'-Ô˜)Ñ$ð ØØ;¸I¸;ÐGØñ	ð r}   z /saturn-return-chart/{result_id}r®  c                 óN   — t         j                  | «      }|st        dd¬«      ‚|S )Nr„  zSaturn return result not found.r…  )r   r  r
   )r®  rþ   s     r~   Úread_saturn_return_chartr´  ñ  s(   € ä"×&Ñ& yÓ1€FáÜ¨Ð4UÔVÐVà€Mr}   )ÚUser)T)rs   )Yr¤   r°  r   r   Útypingr   r   r   r   ÚpytzÚswissephrÝ   Úfastapir	   r
   Úpydanticr   Ú	kerykeionr   r   Úchart_utilsr   ÚrouterÚset_ephe_pathÚset_topor¥   ÚdirnameÚabspathÚ__file__ÚBASE_DIRr§   Ú
CHARTS_DIRr¨   Ú	EPHE_PATHÚmakedirsr   r{   ry   rá   r  ÚSUNÚMOONÚMERCURYÚVENUSÚMARSÚJUPITERrK  ÚURANUSÚNEPTUNEÚPLUTOÚ	TRUE_NODEÚ	MEAN_APOGÚCERESÚPALLASÚJUNOÚVESTAr)  rq  ro  rp  rb   rz   rƒ   rx   rÇ   rË   rÒ   rÚ   rß   râ   rê   rí   rô   rÿ   rû   r  r  r  r$  r'  r7  r>  r_  r�  r«  Úpostr²  r  r´  r|   r}   r~   ú<module>r×     s  ðÜ 	Û ß (ß ,Ó ,ã Û ß ,Ý ß <å 2á	˜.°Ð/@Ô	A€à €× Ñ Ð#Ô $Ø €‡�ˆQ�Ô à�7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€Ø�W‰W�\‰\˜( HÓ-€
Ø—G‘G—L‘L ¨_Ó=Ð Ø�G‰G�L‰L˜ 6Ó*€	à €‡�Ð¨Õ -Ø €× Ñ �)Ô à35Ð �t˜C  c¨3 h¡Ð/Ñ0Ó 5ò	€ð
Ø	ˆ5ðà
ˆEðð ˆuðð ˆUð	ð
 ˆEðð ˆuðð ˆeðð ˆeðð ˆuðð ˆUðð �%ðð �%ðð ˜ðð ˆUðð ˆeðð  ˆEð!ð" ˆUð#ð$ ØØØØØØØØò5€ð:Ø	ˆ3�7‰7ðà
ˆC�H‰Hðð ˆs�{‰{ðð ˆS�Y‰Yð	ð
 ˆC�H‰Hðð ˆs�{‰{ðð ˆc�j‰jðð ˆc�j‰jðð ˆs�{‰{ðð ˆS�Y‰Yðð �#—-‘-ðð �#ðð ˜Ÿ™ðð ˜ðð ˆS�Y‰Yðð  ˆc�j‰jð!ð" ˆC�H‰Hð#ð$ �Y‰YØØò)€ð0 ØØØØØØØØØØñ€ð  qÑ)Ø AÑ&Ø 1Ñ%Ø 1Ñ%Ø¨Ñ*ñ€ð  ¨Ñ*Ø qÑ)Ø QÑ'Ø #¨AÑ.Ø¨Ñ*Ø aÑ(ñ€ô˜)ô ð,(˜uð (¨ó (ð. ñ]Øð]àð]ð ð]ð ð	]ð
 ð]ð ð]ð ð]ð ð]ð ˜#‘ð]ð ð]ð ð]ð ð]ð ˜3‘-ð]ð ó]ð@˜ð  5ó ð!�%ð !˜Eð ! eó !ò
Dð˜ó ð6˜ð 6 #ó 6ð(˜Uð ( só (ð!˜%ð ! Có !ñ-˜%ð -¨có -ò"&ð�%ð  #ó ñ&˜ð  Uð °ó ð" 5ð °°e±ð Àó ð"	˜ð 	¨ð 	°eð 	ÀCó 	ò7ò&ñ.˜%ð . eð .°%ó .ðb)˜3ó )ðL9¨ð L9ÀUð L9ÐSVó L9ò^3ðlMÐ,?ó Mð` ‡�Ð#Ó$ðÐ(;ò ó %ðð ‡�Ð.Ó/ð¨ò ó 0ñr}   