§
    éƒtj_  ã                  óÀ  — U d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZ ddlmZ ddlmZ dd	lmZ  ej        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d“dd“dd“ddddddddœ¥Zd Zi Zd!ed"<   i Zd#ed$<   d%Zdod-„Z dpd/„Z!dqd4„Z"drd5„Z#d6d7œdsd:„Z$dtd=„Z%dud@„Z&dvdA„Z' ej        dB¦  «        Z( ej        dC¦  «        Z) ej        dD¦  «        Z* ej        dE¦  «        Z+dFdGdHdIdJdKdLd6dMdNdOdPdQœZ, ej        dR¦  «        Z-dwdT„Z.dxdX„Z/dyd\„Z0dzd^„Z1d{d_„Z2d|da„Z3d}dd„Z4d~df„Z5ddg„Z6d€dh„Z7d€di„Z8d€dj„Z9d�dk„Z:dGdlœd‚dn„Z;dS )ƒzPDeterministic answers from uploaded KB statements (not vector-snippet guessing).é    )ÚannotationsN)ÚPath)ÚAny)Ú
_money_outÚ_pretty_moneyÚ_detect_currency_symbolÚ answer_statement_metric_questionÚcalculate_from_statement_totalsÚdescribe_pdf_jobÚformat_job_contextÚis_pdf_overview_question)Úextract_pdf)Údb)Úorg_storage_dirz›(?i)\b(jan(?:uary)?|feb(?:ruary)?|mar(?:ch)?|apr(?:il)?|may|jun(?:e)?|jul(?:y)?|aug(?:ust)?|sep(?:t(?:ember)?)?|oct(?:ober)?|nov(?:ember)?|dec(?:ember)?)\bÚjanÚjanuaryÚfebÚfebruaryÚmarÚmarchÚaprÚaprilÚmayÚjunÚjuneÚjulÚjulyÚaugÚaugustÚsepÚseptÚoctÚnovÚdec)Ú	septemberr"   Úoctoberr#   Únovemberr$   Údecemberzhdfc-v2z,dict[str, tuple[float, str, dict[str, Any]]]Ú
_JOB_CACHEz-dict[str, tuple[float, list[dict[str, Any]]]]Ú_JOBS_LIST_CACHEg      N@Úorg_idÚstrÚagent_idÚdocúdict[str, Any]ÚreturnúPath | Nonec                óÈ   — t          | |¦  «        }t          |                     |d         › d�¦  «        ¦  «        }|D ]#}|j                             ¦   «         dk    r|c S Œ$d S )NÚidz_*ú.pdf)r   ÚsortedÚglobÚsuffixÚlower)r+   r-   r.   ÚfolderÚmatchesÚpaths         ú./var/www/html/CA-Chatbot/app/saas/kb_answer.pyÚ_pdf_path_for_docr=   2   sr   € Ý˜V XÑ.Ô.€FÝ�V—[’[ C¨¤IÐ!1Ð!1Ð!1Ñ2Ô2Ñ3Ô3€GØð ð ˆØŒ;×ÒÑÔ &Ò(Ð(ØˆKˆKˆKð )àˆ4ó    úlist[dict[str, Any]]c                óâ   — g }| j         D ]d}t          |d¦  «        r(|                     t          |j        ¦  «        ¦  «         Œ:t          |t          ¦  «        r|                     |¦  «         Œe|S )NÚ__dict__)ÚrowsÚhasattrÚappendÚdictrA   Ú
isinstance)ÚresultrB   Úrs      r<   Ú
_row_dictsrI   ;   sp   € Ø!#€DØŒ[ð ð ˆÝ�1�jÑ!Ô!ð 	Ø�KŠK�˜QœZÑ(Ô(Ñ)Ô)Ð)Ð)Ý˜�4Ñ Ô ð 	Ø�KŠK˜‰NŒNˆNøØ€Kr>   r;   r   Úfilenameúdict[str, Any] | Nonec                óš  — t          |                      ¦   «         ¦  «        }	 |                      ¦   «         j        }n# t          $ r Y d S w xY wt
                               |¦  «        }|r%|d         |k    r|d         t          k    r|d         S t          | |¬¦  «        }|j	        dvr|j
        s	|j        sd S t          |¦  «        }|j
        pi }|rt          ||¬¦  «        nd }|€ddlm}	  |	||j	        pd¬	¦  «        }||j	        pd|j        |j        ||||j        pd
d d…         |j        |j        dœ
}
|t          |
ft
          |<   |
S )Nr   é   é   )rJ   >   ÚunknownÚbank_statement)rB   )Ú	calculaterP   )Údocument_kindÚ i † )
rJ   rR   Úsource_typeÚocr_usedÚstatement_totalsrB   ÚcalculationÚdocument_textÚtext_previewÚ
validation)r,   ÚresolveÚstatÚst_mtimeÚOSErrorr)   ÚgetÚ_CACHE_VERSIONr   rR   rV   rB   rI   r
   Úapp.pdf.calcrQ   rT   rU   rX   rY   rZ   )r;   rJ   ÚkeyÚmtimeÚcachedrG   rB   ÚtotalsÚcalcÚ	calc_rowsÚjobs              r<   Úbuild_statement_jobri   E   sš  € Ý
ˆd�lŠl‰nŒnÑ
Ô
€CðØ—	’	‘”Ô$ˆˆøÝð ð ð Øˆtˆtðøøøå�^Š^˜CÑ Ô €FØð �&˜”)˜uÒ$Ð$¨°¬µnÒ)DÐ)DØ�aŒyÐå˜¨Ð1Ñ1Ô1€FØÔÐ#@Ð@Ð@ÈÔI`Ð@àŒ{ð 	Ø�4å�fÑÔ€DØÔ$Ð*¨€FØAGÐQÕ*¨6¸Ð=Ñ=Ô=Ð=ÈT€DØ€|Ø7Ð7Ð7Ð7Ð7Ð7àˆy˜¨VÔ-AÐ-UÐEUÐVÑVÔVˆð ØÔ-ÐAÐ1AØÔ)Ø”OØ"ØØØ Ô.Ð4°"°h°w°hÔ?ØÔ+ØÔ'ðð €Cð �n¨cÐ2…Jˆs�OØ€Js   £= ½
AÁ
Ac                ór  — dd l }| › d|› �}t                               |¦  «        }|                     ¦   «         }|r||d         z
  t          k     r|d         S g }t          j        | |¦  «        D ]»}|                     d¦  «        dk    rŒt          |                     d¦  «        pd¦  «                             ¦   «          	                    d¦  «        sŒft          | ||¦  «        }|r|                     ¦   «         sŒŽt          ||d         ¦  «        }	|	r|                     |	¦  «         Œ¼||ft          |<   |S )	Nr   ú:rM   ÚstatusÚreadyrJ   rS   r4   )Útimer*   r_   Ú	monotonicÚ_JOBS_LIST_TTL_SÚsaas_dbÚlist_kb_documentsr,   r8   Úendswithr=   Úexistsri   rD   )
r+   r-   rn   Ú	cache_keyÚhitÚnowÚjobsr.   r;   rh   s
             r<   Úlist_agent_statement_jobsry   m   sJ  € Ø€K€K€KàÐ&Ð&˜HÐ&Ð&€IÝ
×
Ò
˜yÑ
)Ô
)€CØ
�.Š.Ñ
Ô
€CØ
ð ��c˜!”f‘Õ 0Ò0Ð0Ø�1Œvˆà!#€DÝÔ(¨°Ñ:Ô:ð 
ð 
ˆØ�7Š7�8ÑÔ Ò'Ð'ØÝ�3—7’7˜:Ñ&Ô&Ð,¨"Ñ-Ô-×3Ò3Ñ5Ô5×>Ò>¸vÑFÔFð 	ØÝ  ¨°3Ñ7Ô7ˆØð 	˜4Ÿ;š;™=œ=ð 	ØÝ! $¨¨J¬Ñ8Ô8ˆØð 	Ø�KŠK˜ÑÔÐøØ#&¨ +Õ�YÑØ€Kr>   é   )Úlimitr{   Úintc                óp  — ddl m}  |¦   «         j        j        dz  }|                     ¦   «         sdS t          |                     d¦  «        d„ d¬¦  «        }d}|d| …         D ]O}	 |j        }d	|v r|                     d	d
¦  «        d
         }t          ||¦  «        r|d
z  }Œ@# t          $ r Y ŒLw xY w|S )zSPre-extract recent local KB PDFs so the first spend question is fast after restart.r   )Úget_settingsÚ
kb_uploadsz*.pdfc                ó4   — |                       ¦   «         j        S ©N)r\   r]   )Úps    r<   ú<lambda>z-warm_local_statement_caches.<locals>.<lambda>�   s   € °Q·V²V±X´XÔ5F€ r>   T)rb   ÚreverseNÚ_rM   )Ú
app.configr~   Úchroma_persist_dirÚparentrt   r5   ÚrglobÚnameÚsplitri   Ú	Exception)r{   r~   ÚrootÚpdfsÚwarmedr;   rŠ   s          r<   Úwarm_local_statement_cachesr�   †   sî   € à'Ð'Ð'Ð'Ð'Ð'àˆ<‰>Œ>Ô,Ô3°lÑB€DØ�;Š;‰=Œ=ð ØˆqÝ�$—*’*˜WÑ%Ô%Ð+FÐ+FÐPTÐUÑUÔU€DØ€FØ�V�e�V”ð 	ð 	ˆð	à”9ˆDØ�dˆ{ˆ{Ø—z’z # qÑ)Ô)¨!Ô,�Ý" 4¨Ñ.Ô.ð Ø˜!‘�øøÝð 	ð 	ð 	ØˆHð	øøøà€Ms   Á)<B&Â&
B3Â2B3Úquestionú
str | Nonec                óÀ   — t                                | pd¦  «        }|sd S t                               |                     d¦  «                             ¦   «         ¦  «        S )NrS   rM   )Ú	_MONTH_REÚsearchÚ_MONTH_ALIASESr_   Úgroupr8   )r‘   Úms     r<   Ú_month_tokenr™   œ   sP   € Ý×Ò˜˜ RÑ(Ô(€AØð ØˆtÝ×Ò˜aŸgšg a™jœj×.Ò.Ñ0Ô0Ñ1Ô1Ð1r>   rB   Úmonthc                óÖ   ‡— d}| D ]bŠd                      ˆfd„dD ¦   «         ¦  «                             ¦   «         }t          j        d|› d�|¦  «        sd|› d�|v s|› d�|v r|dz  }Œc|S )Nr   Ú c              3  ó`   •K  — | ](}t          ‰                     |¦  «        pd ¦  «        V — Œ)dS ©rS   N©r,   r_   ©Ú.0ÚkrH   s     €r<   ú	<genexpr>z'_count_rows_in_month.<locals>.<genexpr>¦   sJ   øè è € ð 
ð 
Ø$%�C�—’�a‘”�˜BÑÔð
ð 
ð 
ð 
ð 
ð 
r>   )ÚdateÚdescriptionÚrawÚaccountú\bú'rM   )Újoinr8   Úrer•   )rB   rš   ÚnÚblobrH   s       @r<   Ú_count_rows_in_monthr®   £   s¬   ø€ Ø	€AØð ð ˆØ�xŠxð 
ð 
ð 
ð 
Ø)Rð
ñ 
ô 
ñ 
ô 
ç
Š%‰'Œ'ð 	õ Œ9�_˜5�_�_�_ dÑ+Ô+ð 	¨|°5¨|¨|¨|¸tÐ/CÐ/CÈ%À{À{À{ÐVZÐGZÐGZØ�‰FˆAøØ€Hr>   c                óh  — d„ t          j        | |¦  «        D ¦   «         }|sdS dt          |¦  «        › d�g}|dd…         D ]L}|                     d¦  «        pd}|                     d¦  «        pd	}|                     d
|› d|› d�¦  «         ŒMt          |¦  «        dk    r)|                     dt          |¦  «        dz
  › d�¦  «         t          | |¦  «        }|dd…         D ]$}|                     t          |¦  «        ¦  «         Œ%|                     d¦  «         d                     |¦  «        S )uG   Deterministic overview of uploaded KB docs â€” no LLM snippet guessing.c                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS ©rl   rm   ©r_   ©r¡   Úds     r<   ú
<listcomp>z+describe_knowledge_base.<locals>.<listcomp>°   s-   € ÐaÐaÐa�!ÀaÇeÂeÈHÁoÄoÐY`ÒF`ÐF`ˆAÐF`ÐF`ÐF`r>   NzYour knowledge base has z ready document(s):rz   rJ   ÚdocumentÚchunk_countr   u   - â€œõ   â€� (z chunks)u	   - â€¦and z morerN   zeAsk about spend, received, payment counts, a category like groceries, or a merchant on the statement.Ú
)rq   rr   Úlenr_   rD   ry   r   rª   )	r+   r-   ÚdocsÚlinesr´   rŠ   Úchunksrx   rh   s	            r<   Údescribe_knowledge_baser¾   ®   s`  € àaÐa•wÔ0°¸ÑBÔBÐaÑaÔa€DØð ØˆtàA¥3 t¡9¤9ÐAÐAÐAð€Eð �"�1�"ŒXð :ð :ˆØ�uŠu�ZÑ Ô Ð. JˆØ—’�}Ñ%Ô%Ð*¨ˆØ�ŠÐ8˜TÐ8Ð8¨Ð8Ð8Ð8Ñ9Ô9Ð9Ð9Ý
ˆ4�y„y�1‚}€}Ø�ŠÐ5¥ T¡¤¨Q¡Ð5Ð5Ð5Ñ6Ô6Ð6å$ V¨XÑ6Ô6€DØ�B�Q�BŒxð ,ð ,ˆØ�ŠÕ% cÑ*Ô*Ñ+Ô+Ð+Ð+Ø	‡L‚LØoñô ð ð �9Š9�UÑÔÐr>   a–  (?i)\b(?:on\s+|dated\s+)?(?:(?P<d1>\d{1,2})(?:st|nd|rd|th)?\s+(?P<m1>jan(?:uary)?|feb(?:ruary)?|mar(?:ch)?|apr(?:il)?|may|jun(?:e)?|jul(?:y)?|aug(?:ust)?|sep(?:t(?:ember)?)?|oct(?:ober)?|nov(?:ember)?|dec(?:ember)?)|(?P<m2>jan(?:uary)?|feb(?:ruary)?|mar(?:ch)?|apr(?:il)?|may|jun(?:e)?|jul(?:y)?|aug(?:ust)?|sep(?:t(?:ember)?)?|oct(?:ober)?|nov(?:ember)?|dec(?:ember)?)\s+(?P<d2>\d{1,2})(?:st|nd|rd|th)?)\bzQ(?i)\b(spent|spend|paid|payment|debit|withdrawn|outflow|money\s+out|how\s+much)\bzL(?i)\b(how\s+many|number\s+of|count|payments?\s+made|transactions?\s+made)\ba›  (?i)\b((?:spent|spend|paid|payment|outflow|money\s+out).{0,40}?(?:each|every|per|by|on\s+each|for\s+each|date[\s-]?wise|day[\s-]?wise|daily).{0,20}?(?:date|day|daily)|(?:each|every|per|by|on\s+each|for\s+each|date[\s-]?wise|day[\s-]?wise|daily).{0,20}?(?:date|day).{0,40}?(?:spent|spend|paid|payment|outflow|money\s+out|how\s+much)|spend\s+breakdown|daily\s+spend|day[\s-]?wise\s+spend|date[\s-]?wise\s+spend)\brM   rN   é   é   é   é   é   é	   é
   é   é   )r   r   r   r   r   r   r   r   r    r"   r#   r$   zE(?i)\b(\d{1,2})\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\bútuple[int, str] | Nonec                óD  — t                                | pd¦  «        }|sd S |                     d¦  «        rw|                     d¦  «        rbt          |                     d¦  «        ¦  «        }t                               |                     d¦  «                             ¦   «         ¦  «        }nat          |                     d¦  «        ¦  «        }t                               |                     d¦  «                             ¦   «         ¦  «        }|r|dk     s|dk    rd S ||fS )NrS   Úd1Úm1Úd2Úm2rM   é   )Ú_DAY_MONTH_REr•   r—   r|   r–   r_   r8   )r‘   r˜   Údayrš   s       r<   Ú_parse_day_monthrÑ   ì   sò   € Ý×Ò˜X˜^¨Ñ,Ô,€AØð ØˆtØ‡w‚wˆt�}„}ð :˜Ÿš ™œð :Ý�!—'’'˜$‘-”-Ñ Ô ˆÝ×"Ò" 1§7¢7¨4¡=¤=×#6Ò#6Ñ#8Ô#8Ñ9Ô9ˆˆå�!—'’'˜$‘-”-Ñ Ô ˆÝ×"Ò" 1§7¢7¨4¡=¤=×#6Ò#6Ñ#8Ô#8Ñ9Ô9ˆØð �C˜!’G�G˜s Ršx˜xØˆtØ�ˆ:Ðr>   ÚrowrÐ   Úboolc                óØ   ‡ ‡— d                      ˆ fd„dD ¦   «         ¦  «                             ¦   «         Šd|› d|› d�d|› d|› d�d|d›d|› d�g}t          ˆfd„|D ¦   «         ¦  «        S )	Nrœ   c              3  ó`   •K  — | ](}t          ‰                     |¦  «        pd ¦  «        V — Œ)dS rž   rŸ   )r¡   r¢   rÒ   s     €r<   r£   z)_row_matches_day_month.<locals>.<genexpr>ü   sK   øè è € ð ð Ø"#�ˆC�GŠG�A‰JŒJÐ˜"ÑÔðð ð ð ð ð r>   ©r¤   r¥   r¦   r¨   ú\s+z'?\d{0,4}\bÚ02dc              3  óB   •K  — | ]}t          j        |‰¦  «        V — Œd S r�   )r«   r•   )r¡   r‚   r­   s     €r<   r£   z)_row_matches_day_month.<locals>.<genexpr>  s/   øè è € Ð4Ð4 a�rŒy˜˜DÑ!Ô!Ð4Ð4Ð4Ð4Ð4Ð4r>   )rª   r8   Úany)rÒ   rÐ   rš   Úpatternsr­   s   `   @r<   Ú_row_matches_day_monthrÜ   û   s¼   øø€ Ø�8Š8ð ð ð ð Ø'Eðñ ô ñ ô ç‚e�g„gð 	ð
 	 ˆcÐÐ�eÐÐÐØ*ˆcÐ*Ð*�eÐ*Ð*Ð*Ø#ˆcÐ#Ð#Ð#˜%Ð#Ð#Ð#ð€Hõ
 Ð4Ð4Ð4Ð4¨8Ð4Ñ4Ô4Ñ4Ô4Ð4r>   Útextú
int | Noneútuple[float, int]c           	     óR  — d}d}| s||fS |dd…         }t          j        d| t           j        ¬¦  «        }t          |¦  «        dk    r|                      ¦   «         }|D ]·}|                     ¦   «         }|�t          j        d|› d	|› d
�|¦  «        sŒ5nt          j        d
|› d
�|¦  «        sŒPt          j        d|¦  «        D ]Q}		 |t          |	 	                    d¦  «         
                    dd¦  «        ¦  «        z  }|dz  }ŒB# t          $ r Y ŒNw xY wŒ¸t          |d¦  «        |fS )zCFallback: find outflow amounts near a date mention in raw PDF text.ç        r   Nr¿   zL(?=(?:^|\n)\s*\d{1,2}\s+(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))©ÚflagsrM   z\b0?r×   r¨   õ&   (?i)-\s*(?:â‚¹|rs\.?)\s*([\d,]+\.?\d*)Ú,rS   rN   )r«   r‹   ÚIrº   Ú
splitlinesr8   r•   ÚfinditerÚfloatr—   ÚreplaceÚ
ValueErrorÚround)
rÝ   rÐ   rš   ÚtotalÚhitsÚ	month_patr½   ÚchunkÚlowr˜   s
             r<   Ú_sum_spend_from_textrò     st  € à€EØ€DØð Ø�dˆ{Ðà�b�q�b”	€IåŒXØZØÝŒdðñ ô €Fõ
 ˆ6�{„{�aÒÐà—’Ñ"Ô"ˆàð ð ˆØ�kŠk‰mŒmˆØˆ?Ý”9Ð: SÐ:Ð:¨YÐ:Ð:Ð:¸CÑ@Ô@ð Øðå”Ð. Ð.Ð.Ð.°Ñ4Ô4ð 	Øå”ÐFÈÑNÔNð 	ð 	ˆAðØ�˜qŸwšw q™zœz×1Ò1°#°rÑ:Ô:Ñ;Ô;Ñ;�Ø˜‘	��øÝð ð ð Ø�ðøøøð		õ �˜‰?Œ?˜DÐ Ð s   Ã>DÄ
DÄDrh   c                óˆ   — |                       d¦  «        p|                       d¦  «        pd}t          |¦  «        dk    r|S |S )zUPrefer in-memory text; if truncated/missing, re-extract from PDF path when available.rX   rY   rS   iô  )r_   rº   )rh   rÝ   s     r<   Ú_full_statement_textrô   +  sD   € à�7Š7�?Ñ#Ô#ÐD s§w¢w¨~Ñ'>Ô'>ÐDÀ"€DÝ
ˆ4�y„y�CÒÐØˆØ€Kr>   c                óÔ   — | pd                      ¦   «         }|sdS t                               |¦  «        rdS t                               |¦  «        rt	          j        d|¦  «        rdS dS )NrS   FTz^(?i)\b(each|every|per|all)\s+(date|day|daily)\b|\bdate[\s-]?wise\b|\bday[\s-]?wise\b|\bdaily\b)ÚstripÚ_PER_DATE_SPEND_REr•   Ú_SPEND_INTENT_REr«   )r‘   Úqs     r<   Úis_per_date_spend_questionrú   3  sz   € Ø	ˆ�R×ÒÑ Ô €AØð ØˆuÝ× Ò  Ñ#Ô#ð Øˆtå×Ò˜qÑ!Ô!ð ¥b¤iØiØ	ñ'ô 'ð ð ˆtØˆ5r>   r­   c                óì   — t                                | pd¦  «        }|sd S t          |                     d¦  «        ¦  «        d›d|                     d¦  «                             ¦   «         d d…         › �S )NrS   rM   rØ   rœ   rN   r¿   )Ú_DATE_TOKEN_REr•   r|   r—   Útitle)r­   r˜   s     r<   Ú_normalize_date_labelrþ   B  sl   € Ý×Ò˜d˜j bÑ)Ô)€AØð ØˆtÝ�!—'’'˜!‘*”*‰oŒoÐ<Ð<Ð< A§G¢G¨A¡J¤J×$4Ò$4Ñ$6Ô$6°r¸°rÔ$:Ð<Ð<Ð<r>   Úlabelútuple[int, int]c                ó   — |                       ¦   «         }t          |¦  «        dk    rdS 	 t          |d         ¦  «        }n# t          $ r d}Y nw xY wt                               |d                              ¦   «         d d…         d¦  «        |fS )NrN   )éc   r  r   r  rM   r¿   )r‹   rº   r|   rë   Ú_MONTH_SORTr_   r8   )rÿ   ÚpartsrÐ   s      r<   Ú_date_sort_keyr  I  s�   € Ø�KŠK‰MŒM€EÝ
ˆ5�z„z�Q‚€ØˆxðÝ�%˜”(‰mŒmˆˆøÝð ð ð Øˆˆˆðøøøå�OŠO˜E !œHŸNšNÑ,Ô,¨R¨a¨RÔ0°"Ñ5Ô5°sÐ;Ð;s   «A ÁAÁAú!dict[str, dict[str, float | int]]c                óê  — i }| D ]°}t          |¦  «        }|dk    rŒt          t          |                     d¦  «        p|                     d¦  «        pd¦  «        ¦  «        }|sŒa|                     |dddœ¦  «        }t          |d         ¦  «        |z   |d<   t          |d         ¦  «        d	z   |d<   Œ±|                     ¦   «         D ](}t          t          |d         ¦  «        d
¦  «        |d<   Œ)|S )Nr   r¤   r¦   rS   rá   ©rí   r¬   rí   r¬   rM   rN   )	r   rþ   r,   r_   Ú
setdefaultré   r|   Úvaluesrì   )rB   ÚbyrH   Úoutrÿ   ÚbucketÚvs          r<   Ú_spend_by_date_from_rowsr  T  sù   € Ø,.€BØð 	+ð 	+ˆÝ˜‰mŒmˆØ�!Š8ˆ8ØÝ%¥c¨!¯%ª%°©-¬-Ð*M¸1¿5º5À¹<¼<Ð*MÈ2Ñ&NÔ&NÑOÔOˆØð 	ØØ—’˜u°¸!Ð&<Ð&<Ñ=Ô=ˆÝ  w¤Ñ0Ô0°3Ñ6ˆˆw‰Ý˜& œ+Ñ&Ô&¨Ñ*ˆˆs‰ˆØ�YŠY‰[Œ[ð 1ð 1ˆÝ�5  7¤Ñ,Ô,¨aÑ0Ô0ˆˆ'‰
ˆ
Ø€Ir>   c                óÈ  ‡— i }| s|S d}t          j        d|› d�| t           j        ¬¦  «        }|D �]r}t          j        d|› d�|t           j        ¦  «        }|sŒ*|                     ¦   «         Šd‰v st          j        d‰d	d
…         ¦  «        rŒ`t          ˆfd„dD ¦   «         ¦  «        sŒ|d„ t          j        d|¦  «        D ¦   «         }|sŒžt          t          |¦  «        ¦  «        dk    r|d         n|d         }t          |                     d¦  «        ¦  «        d›d|                     d¦  «                             ¦   «         d	d…         › �}|                     |dddœ¦  «        }	t          |	d         ¦  «        |z   |	d<   t          |	d         ¦  «        dz   |	d<   �Œt|                     ¦   «         D ](}
t!          t          |
d         ¦  «        d¦  «        |
d<   Œ)|S )zHGroup Paytm-style statement outflows by calendar date from raw PDF text.z/Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Decz(?=(?:^|\n)\s*\d{1,2}\s+(?:z)\b)râ   z\s*(\d{1,2})\s+(z)\bztotal money paidz\bpayments?\s+made\bNéd   c              3  ó    •K  — | ]}|‰v V — Œ	d S r�   © )r¡   r¢   rñ   s     €r<   r£   z+_spend_by_date_from_text.<locals>.<genexpr>x  s;   øè è € ð 
ð 
àð �ˆHð
ð 
ð 
ð 
ð 
ð 
r>   )zupi refz
money sentzpaid tozreceived fromÚrechargezmoney receivedztransferred toc                óz   — g | ]8}t          |                     d ¦  «                             dd¦  «        ¦  «        ‘Œ9S )rM   rå   rS   )ré   r—   rê   )r¡   Úas     r<   rµ   z,_spend_by_date_from_text.<locals>.<listcomp>…  sJ   € ð 
ð 
ð 
àõ �!—'’'˜!‘*”*×$Ò$ S¨"Ñ-Ô-Ñ.Ô.ð
ð 
ð 
r>   rä   rM   r   éÿÿÿÿrØ   rœ   rN   r¿   rá   r  rí   r¬   )r«   r‹   ræ   Úmatchr8   r•   rÚ   rè   rº   Úsetr|   r—   rý   r	  ré   r
  rì   )rÝ   r  Úmonthsr½   rð   r˜   ÚamtsÚamtrÿ   r  r  rñ   s              @r<   Ú_spend_by_date_from_textr  e  s*  ø€ à,.€BØð Øˆ	Ø>€FÝŒXØ5¨Ð5Ð5Ð5ØÝŒdðñ ô €Fð
 ð  +ñ  +ˆÝŒHÐ6¨6Ð6Ð6Ð6¸½r¼tÑDÔDˆØð 	ØØ�kŠk‰mŒmˆà Ð$Ð$­¬	Ð2IÈ3ÈtÐPSÈtÌ9Ñ(UÔ(UÐ$ØÝð 
ð 
ð 
ð 
ðð
ñ 
ô 
ñ 
ô 
ð 	ð ð
ð 
å”[Ð!JÈEÑRÔRð
ñ 
ô 
ˆð ð 	Øå�S ™YœY™œ¨1Ò,Ð,ˆd�1Œgˆg°$°r´(ˆÝ�q—w’w˜q‘z”z‘?”?ÐAÐAÐA¨¯ª°©¬×)9Ò)9Ñ);Ô);¸B¸Q¸BÔ)?ÐAÐAˆØ—’˜u°¸!Ð&<Ð&<Ñ=Ô=ˆÝ  w¤Ñ0Ô0°3Ñ6ˆˆw‰Ý˜& œ+Ñ&Ô&¨Ñ*ˆˆs‰‰Ø�YŠY‰[Œ[ð 1ð 1ˆÝ�5  7¤Ñ,Ô,¨aÑ0Ô0ˆˆ'‰
ˆ
Ø€Ir>   c                óÈ  — t          |¦  «        sdS t          | ¦  «        }|                      d¦  «        pd}|                      d¦  «        pi }|                      d¦  «        pi                      d¦  «        pi }t          t	          | ¦  «        ¦  «        }t          |                      d¦  «        pg ¦  «        }|                     d¦  «        }|                     d	¦  «        }	|€|                     d¦  «        }|	€|                     d	¦  «        }	d+d„}
 |
|¦  «        \  }} |
|¦  «        \  }}d}|r
|r||k    rd}|�R|rP	 t          |¦  «        }t          ||z
  ¦  «        t          ||z
  ¦  «        k    rd}n# t          t          f$ r Y nw xY w|r|r|n|}|sd|› d�S t          d„ |                     ¦   «         D ¦   «         ¦  «        }t          t          d„ |                     ¦   «         D ¦   «         ¦  «        d¦  «        }d|› d|› dt          ||¦  «        › d�g}t          |                     ¦   «         t           ¬¦  «        D ]a}||         }t#          |d         ¦  «        }t          |d         |¦  «        }|dk    rdnd}|                     d |› d!|› d"|› d#|› d$�	¦  «         Œb|�Š|	�ˆ	 t          |¦  «        }t          ||z
  ¦  «        d%k    st#          |	¦  «        |k    r7|                     d&t#          |	¦  «        › d't          ||¦  «        › d(�¦  «         n# t          t          f$ r Y nw xY w|                     d)¦  «         d*                     |¦  «        S ),uD   Deterministic daily spend breakdown â€” never leave this to the LLM.NrJ   Ú	statementrV   rW   ÚmetricsrB   Ú	money_outÚpayments_mader  r  r0   útuple[int, float]c                óÒ   — t          d„ |                      ¦   «         D ¦   «         ¦  «        }t          t          d„ |                      ¦   «         D ¦   «         ¦  «        d¦  «        }||fS )Nc              3  ó@   K  — | ]}t          |d          ¦  «        V — ŒdS ©r¬   N©r|   ©r¡   r  s     r<   r£   z7answer_spend_by_date.<locals>._score.<locals>.<genexpr>¬  ó,   è è € Ð1Ð1 •�A�c”F‘”Ð1Ð1Ð1Ð1Ð1Ð1r>   c              3  ó@   K  — | ]}t          |d          ¦  «        V — ŒdS ©rí   N©ré   r(  s     r<   r£   z7answer_spend_by_date.<locals>._score.<locals>.<genexpr>­  s.   è è € ÐAÐA°�%  '¤
Ñ+Ô+ÐAÐAÐAÐAÐAÐAr>   rN   )Úsumr
  rì   )r  r¬   rí   s      r<   Ú_scorez$answer_spend_by_date.<locals>._score«  s]   € ÝÐ1Ð1 R§Y¢Y¡[¤[Ð1Ñ1Ô1Ñ1Ô1ˆÝ•cÐAÐA°R·Y²Y±[´[ÐAÑAÔAÑAÔAÀ1ÑEÔEˆØ�%ˆxˆr>   FTu4   I couldn't build a per-date spend breakdown from â€œuR   â€�. Try asking about a specific day, e.g. â€œhow much did I spend on 16 July?â€�.c              3  ó@   K  — | ]}t          |d          ¦  «        V — ŒdS r&  r'  r(  s     r<   r£   z'answer_spend_by_date.<locals>.<genexpr>Å  r)  r>   c              3  ó@   K  — | ]}t          |d          ¦  «        V — ŒdS r+  r,  r(  s     r<   r£   z'answer_spend_by_date.<locals>.<genexpr>Æ  s.   è è € Ð=Ð=¨A•e˜A˜gœJÑ'Ô'Ð=Ð=Ð=Ð=Ð=Ð=r>   rN   u   Spend by date from â€œr¸   z payment(s), z total):)rb   r¬   rí   rM   ÚpaymentÚpaymentsz- u    â€” ú (rœ   ú)gš™™™™™©?zStatement header lists z payments / z> overall; this breakdown uses dated outflows found in the PDF.zMAsk about a specific day (e.g. "spend on 16 July") for merchant-level detail.r¹   )r  r  r0   r#  )rú   r   r_   r  rô   r  ré   ÚabsÚ	TypeErrorrë   r-  r
  rì   r   r5   Úkeysr  r|   rD   rª   )rh   r‘   ÚcurrJ   Úheaderr   Ú	from_textÚ	from_rowsÚ
header_outÚheader_nr.  Útext_nÚ
text_totalÚrow_nÚ	row_totalÚuse_textÚtargetr  Ún_payrí   r¼   rÿ   r  Úcountr  ÚunitÚh_outs                              r<   Úanswer_spend_by_daterH  –  s	  € å% hÑ/Ô/ð Øˆtå
! #Ñ
&Ô
&€CØ�wŠw�zÑ"Ô"Ð1 k€HØ�WŠWÐ'Ñ(Ô(Ð.¨B€FØ�wŠw�}Ñ%Ô%Ð+¨×0Ò0°Ñ;Ô;ÐA¸r€Gå(Õ)=¸cÑ)BÔ)BÑCÔC€IÝ(¨¯ª°©¬Ð)>¸BÑ?Ô?€Ið —’˜KÑ(Ô(€JØ�zŠz˜/Ñ*Ô*€HØÐØ—[’[ Ñ-Ô-ˆ
ØÐØ—;’;˜Ñ/Ô/ˆðð ð ð ð
  ˜ 	Ñ*Ô*Ñ€FˆJØ�v˜iÑ(Ô(Ñ€Eˆ9à€HØð �yð  F¨e¢O OØˆØÐ )Ðð	Ý˜:Ñ&Ô&ˆFÝ�: Ñ&Ñ'Ô'­3¨y¸6Ñ/AÑ+BÔ+BÒBÐBØ�øøÝ�:Ð&ð 	ð 	ð 	ØˆDð	øøøð Ð	; 9Ð	;ˆˆ°)€BØð 
ð]À8ð ]ð ]ð ]ð	
õ
 Ð1Ð1 R§Y¢Y¡[¤[Ð1Ñ1Ô1Ñ1Ô1€EÝ•#Ð=Ð=°·²±´Ð=Ñ=Ô=Ñ=Ô=¸qÑAÔA€Eàg ÐgÐg°ÐgÐgÅMÐRWÐY\ÑD]ÔD]ÐgÐgÐgð€Eõ ˜Ÿš™	œ	¥~Ð6Ñ6Ô6ð >ð >ˆØ�E”ˆÝ�F˜3”KÑ Ô ˆÝ˜F 7œO¨SÑ1Ô1ˆØ! QšJ˜Jˆyˆy¨JˆØ�ŠÐ<˜%Ð<Ð< cÐ<Ð<¨UÐ<Ð<°TÐ<Ð<Ð<Ñ=Ô=Ð=Ð=àÐ (Ð"6ð	Ý˜*Ñ%Ô%ˆEÝ�5˜5‘=Ñ!Ô! DÒ(Ð(­C°©M¬M¸UÒ,BÐ,BØ—’ðU­c°(©m¬mð Uð UÍÐW\Ð^aÑIbÔIbð Uð Uð Uñô ð øøõ �:Ð&ð 	ð 	ð 	ØˆDð	øøøà	‡L‚LÐ`ÑaÔaÐaØ�9Š9�UÑÔÐs%   Å7E> Å>FÆFÊ3A/L# Ì#L7Ì6L7c           
     óž	  ‡‡‡— t                                |pd¦  «        sdS t          |¦  «        rdS t          |¦  «        }|st	          |¦  «        nd}|s|sdS |                      d¦  «        pg }t          | ¦  «        }|                      d¦  «        pd}|�r÷|\  ŠŠ‰› d‰dd…                              ¦   «         ‰dd…         z   › �}‰d›d‰                     ¦   «         dd	…         › �}t          t          | ¦  «        ¦  «        }	|	                     |¦  «        }
ˆˆfd
„|D ¦   «         }|
�r|r&t          |
d         ¦  «        t          |¦  «        k    ròt          |
d         ¦  «        }t          |
d         ¦  «        }g }|dd…         D ]}Št          ‰                     d¦  «        pd¦  «                             d¦  «        d         dd…         }|                     |› dt#          t%          ‰¦  «        |¦  «        › d�¦  «         Œ~|rdd                     |¦  «        z   dz   nd}d|› d|› dt#          ||¦  «        › d|› d|› �
S |rüt)          t+          d„ |D ¦   «         ¦  «        d¦  «        }g }|dd…         D ]}Št          ‰                     d¦  «        pd¦  «                             d¦  «        d         dd…         }|                     |› dt#          t%          ‰¦  «        |¦  «        › d�¦  «         Œ~|rdd                     |¦  «        z   dz   nd}d|› d|› dt#          ||¦  «        › dt          |¦  «        › d|› �
S t-          t          | ¦  «        ‰‰¦  «        \  }}|rd|› d|› dt#          ||¦  «        › d |› d!�	S d"|› d|› d#�S |Š‰€J ‚‰dd…                              ¦   «         ‰dd…         z   }g }|D ]vŠd                     ˆfd$„d%D ¦   «         ¦  «                             ¦   «         }t1          j        d&‰› d&�|¦  «        r(t%          ‰¦  «        dk    r|                     ‰¦  «         Œw|rQt)          t+          d'„ |D ¦   «         ¦  «        d¦  «        }d(|› d|› dt#          ||¦  «        › dt          |¦  «        › d�	S t-          t          | ¦  «        d‰¦  «        \  }}|rd(|› d|› dt#          ||¦  «        › d |› d!�	S dS ))zNAnswer spend for a specific day or month from extracted rows / statement text.rS   NrB   rJ   r  rœ   rM   rØ   r¿   c                ó\   •— g | ](}t          |‰‰¦  «        ¯t          |¦  «        d k    ¯&|‘Œ)S )r   )rÜ   r   )r¡   rH   rÐ   rš   s     €€r<   rµ   z&answer_dated_spend.<locals>.<listcomp>÷  s@   ø€ ÐbÐbÐb˜Õ&<¸QÀÀUÑ&KÔ&KÐbÕPZÐ[\ÑP]ÔP]Ð`aÒPaÐPa�1ÐPaÐPaÐPar>   r¬   rí   rÀ   r¥   r1  r¹   r   é2   r3  r4  z Examples: z; ú.z	Spent on õ    in â€œu   â€�: z across z payment(s).c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r�   ©r   ©r¡   rH   s     r<   r£   z%answer_dated_spend.<locals>.<genexpr>  s(   è è € Ð=Ð=°�j¨™mœmÐ=Ð=Ð=Ð=Ð=Ð=r>   rN   z extracted payment(s).z from z/ outflow amount(s) found in the statement text.z1I couldn't find any money-out transactions dated õ   â€�.c              3  ó`   •K  — | ](}t          ‰                     |¦  «        pd ¦  «        V — Œ)dS rž   rŸ   r    s     €r<   r£   z%answer_dated_spend.<locals>.<genexpr>  s9   øè è € ÐTÐT°�˜AŸEšE !™HœH˜N¨Ñ+Ô+ÐTÐTÐTÐTÐTÐTr>   rÖ   r¨   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r�   rO  rP  s     r<   r£   z%answer_dated_spend.<locals>.<genexpr>#  s(   è è € Ð9Ð9¨A�* Q™-œ-Ð9Ð9Ð9Ð9Ð9Ð9r>   z	Spent in )rø   r•   rú   rÑ   r™   r_   r   Úupperrý   r  rô   r|   rº   ré   r,   r‹   rD   r   r   rª   rì   r-  rò   r8   r«   )rh   r‘   Ú	day_monthÚ
month_onlyrB   r8  rJ   rÿ   Údate_keyÚby_textÚtext_bucketÚmatchedrí   r¬   ÚexamplesÚdescÚextrar?  Ú	text_hitsÚmonth_labelr­   rÐ   rš   rH   s                        @@@r<   Úanswer_dated_spendr`  ß  sT  øøø€ å×"Ò" 8 >¨rÑ2Ô2ð Øˆtå! (Ñ+Ô+ð Øˆtå  Ñ*Ô*€IØ/8ÐB•˜hÑ'Ô'Ð'¸d€JØð ˜Zð Øˆtà�7Š7�6‰?Œ?Ð ˜b€DÝ
! #Ñ
&Ô
&€CØ�wŠw�zÑ"Ô"Ð1 k€Hàñ '`Ø‰
ˆˆUØÐ8Ð8˜˜r ˜rœŸšÑ*Ô*¨U°1°2°2¬YÑ6Ð8Ð8ˆØÐ3Ð3Ð3 §¢¡¤¨b¨q¨bÔ 1Ð3Ð3ˆå*Õ+?ÀÑ+DÔ+DÑEÔEˆØ—k’k (Ñ+Ô+ˆØbÐbÐbÐbÐb˜dÐbÑbÔbˆØñ 	Øð	Ý˜{¨3Ô/Ñ0Ô0µC¸±L´LÒ@Ð@å˜+ gÔ.Ñ/Ô/ˆEÝ�K Ô$Ñ%Ô%ˆAØˆHØ˜R˜a˜R”[ð Qð Q�Ý˜1Ÿ5š5 Ñ/Ô/Ð<°9Ñ=Ô=×CÒCÀDÑIÔIÈ!ÔLÈSÈbÈSÔQ�Ø—’ 4Ð OÐ O­=½ÀA¹¼ÈÑ+LÔ+LÐ OÐ OÐ OÑPÔPÐPÐPØCKÐS�] T§Y¢Y¨xÑ%8Ô%8Ñ8¸3Ñ>Ð>ÐQSˆEð1˜Eð 1ð 1¨(ð 1ð 1½ÀuÈcÑ9RÔ9Rð 1ð 1Øð1ð 1Ø).ð1ð 1ðð ð 
	Ý�#Ð=Ð=°WÐ=Ñ=Ô=Ñ=Ô=¸qÑAÔAˆEØˆHØ˜R˜a˜R”[ð Qð Q�Ý˜1Ÿ5š5 Ñ/Ô/Ð<°9Ñ=Ô=×CÒCÀDÑIÔIÈ!ÔLÈSÈbÈSÔQ�Ø—’ 4Ð OÐ O­=½ÀA¹¼ÈÑ+LÔ+LÐ OÐ OÐ OÑPÔPÐPÐPØCKÐS�] T§Y¢Y¨xÑ%8Ô%8Ñ8¸3Ñ>Ð>ÐQSˆEðF˜Eð Fð F¨(ð Fð F½ÀuÈcÑ9RÔ9Rð Fð FÝ˜g™,œ,ðFð FØ>CðFð Fðõ !5Õ5IÈ#Ñ5NÔ5NÐPSÐUZÑ [Ô [Ñˆ
�IØð 	ðS˜Eð Sð S¨(ð Sð S½ÀzÐSVÑ9WÔ9Wð Sð SØ!ðSð Sð Sðð `À5Ð_Ð_ÐQYÐ_Ð_Ð_Ð_ð €EØÐÐÐØ˜˜˜”)—/’/Ñ#Ô# e¨A¨B¨B¤iÑ/€KØ€GØð ð ˆØ�xŠxÐTÐTÐTÐTÐ5SÐTÑTÔTÑTÔT×ZÒZÑ\Ô\ˆÝŒ9�_˜5�_�_�_ dÑ+Ô+ð 	µ
¸1±´ÀÒ0AÐ0AØ�NŠN˜1ÑÔÐøØð 
Ý•cÐ9Ð9°Ð9Ñ9Ô9Ñ9Ô9¸1Ñ=Ô=ˆð;˜ð ;ð ;¨Hð ;ð ;½=ÈÐPSÑ;TÔ;Tð ;ð ;Ý˜'‘l”lð;ð ;ð ;ð	
õ 1Õ1EÀcÑ1JÔ1JÈDÐRWÑXÔXÑ€J�	Øð 
ðO˜ð Oð O¨Hð Oð O½=ÈÐUXÑ;YÔ;Yð Oð OØðOð Oð Oð	
ð ˆ4r>   c                óä  — t                                |pd¦  «        rt                               |pd¦  «        sd S t          |¦  «        rd S t	          |¦  «        }|sd S |                      d¦  «        pg }|                      d¦  «        pi }|                      d¦  «        pi                      d¦  «        pi }|                     d¦  «        }|€|                     d¦  «        }|                     d¦  «        }|€|                     d¦  «        }|d d…                              ¦   «         |dd …         z   }|rt          ||¦  «        nd	}	t                               |pd¦  «        sd S g }
|�|
                     |› d
�¦  «         |�|
                     |› d�¦  «         |
r)dd 	                    |
¦  «        › d�}|	r|d|	› d|› d�z  }|S |	d	k    rd S d|	› d|› d|                      d¦  «        › d�S )NrS   rB   rV   rW   r   r"  Úpayments_receivedrM   r   z payments madez payments receivedzThis statement lists z and z1 for the full period printed on the uploaded PDF.z Among extracted dated lines, z	 fall in rL  z
I counted z line items dated in rM  rJ   rQ  )
rø   r•   Ú_COUNT_INTENT_RErÑ   r™   r_   rT  r®   rD   rª   )rh   r‘   rš   rB   r9  r   ÚmadeÚrecvr_  r¬   ÚbitsÚbases               r<   Ú_month_aware_count_answerrh  1  sO  € å×Ò˜x˜~¨2Ñ.Ô.ð Õ7G×7NÒ7NÈxÈ~Ð[]Ñ7^Ô7^ð Øˆtå˜Ñ!Ô!ð Øˆtå˜Ñ"Ô"€EØð ØˆtØ�7Š7�6‰?Œ?Ð ˜b€DØ�WŠWÐ'Ñ(Ô(Ð.¨B€FØ�wŠw�}Ñ%Ô%Ð+¨×0Ò0°Ñ;Ô;ÐA¸r€GØ�;Š;�Ñ'Ô'€DØ€|Ø�zŠz˜/Ñ*Ô*ˆØ�;Š;Ð*Ñ+Ô+€DØ€|Ø�zŠzÐ-Ñ.Ô.ˆØ˜˜˜”)—/’/Ñ#Ô# e¨A¨B¨B¤iÑ/€KØ-1Ð8Õ˜T 5Ñ)Ô)Ð)°q€Aå×"Ò" 8 >¨rÑ2Ô2ð àˆtà€DØÐØ�Š�tÐ+Ð+Ð+Ñ,Ô,Ð,ØÐØ�Š�tÐ/Ð/Ð/Ñ0Ô0Ð0Øð ð@ G§L¢L°Ñ$6Ô$6ð @ð @ð @ð 	ð ð 	PØÐO°QÐOÐOÀÐOÐOÐOÑOˆDØˆØˆA‚v€vØˆtØ]˜Ð]Ð]°Ð]Ð]ÀCÇGÂGÈJÑDWÔDWÐ]Ð]Ð]Ð]r>   c                ó,  — |pd                      ¦   «         }|sdS t          j        d|¦  «        st          |¦  «        r)t          j        d|¦  «        rt	          | |¦  «        }|r|S t          | |¦  «        }|s<t          j        d|¦  «        r%t          j        | |¦  «        }d„ |D ¦   «         }|sdS dS t          |¦  «        r*t          j        d|¦  «        st          |d         ¦  «        S |D ]}t          ||¦  «        }	|	r|	c S Œ|D ]}t          ||¦  «        }
|
r|
c S Œt                               |¦  «        r*t          |¦  «        r|D ]}t          ||¦  «        }|r|c S Œ|D ](}t          |¦  «        rŒt          ||¦  «        }|r|c S Œ)dS )zEAnswer spend/count/totals from uploaded statement PDFs when possible.rS   Nz(?i)\bknowledge\s*base\bc                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS r±   r²   r³   s     r<   rµ   z/try_deterministic_kb_answer.<locals>.<listcomp>n  s,   € ÐCÐCÐC˜1¨¯ª¨h©¬¸7Ò(BÐ(B�QÐ(BÐ(BÐ(Br>   z[Your knowledge base has no ready documents yet. Upload a PDF, TXT, MD, or CSV in Feed data.r   )rö   r«   r•   r   r¾   ry   rq   rr   r   rH  r`  rc  r™   rh  rú   r	   )r+   r-   r‘   rù   Úoverviewrx   r»   rm   rh   Úby_dateÚdatedÚanss               r<   Útry_deterministic_kb_answerro  ^  s*  € à	ˆ�R×ÒÑ Ô €AØð Øˆtå	„yÐ,¨aÑ0Ô0ð  Õ4LÈQÑ4OÔ4Oð  ÝŒ9Ð0°!Ñ4Ô4ð 	 Ý.¨v°xÑ@Ô@ˆHØð  Ø�å$ V¨XÑ6Ô6€DØð ÝŒ9Ð0°!Ñ4Ô4ð 	uÝÔ,¨V°XÑ>Ô>ˆDØCÐC ÐCÑCÔCˆEØð uØtÐtØˆtå Ñ"Ô"ð )­2¬9Ð5PÐRSÑ+TÔ+Tð )Ý  Q¤Ñ(Ô(Ð(ð ð ð ˆÝ& s¨AÑ.Ô.ˆØð 	ØˆNˆNˆNð	ð ð ð ˆÝ" 3¨Ñ*Ô*ˆØð 	ØˆLˆLˆLð	õ ×Ò˜qÑ!Ô!ð ¥l°1¡o¤oð Øð 	ð 	ˆCÝ+¨C°Ñ3Ô3ˆCØð Ø�
�
�
ðð ð ð ˆå% aÑ(Ô(ð 	ØÝ.¨s°AÑ6Ô6ˆØð 	ØˆJˆJˆJð	àˆ4r>   )Úmax_jobsrp  c               óÊ   — t          | |¦  «        d|…         }|sdS g }|D ].}t          |¦  «        }|                     |dd…         ¦  «         Œ/d                     |¦  «        S )z4Compact structured totals to prepend to RAG context.NrS   i¬  z

---

)ry   r   rD   rª   )r+   r-   rp  rx   Úblocksrh   Úctxs          r<   Ústatement_context_notesrt  ’  sy   € å$ V¨XÑ6Ô6°y¸°yÔA€DØð ØˆrØ€FØð "ð "ˆå  Ñ%Ô%ˆØ�Š�c˜%˜4˜%”jÑ!Ô!Ð!Ð!Ø×Ò˜fÑ%Ô%Ð%r>   )r+   r,   r-   r,   r.   r/   r0   r1   )r0   r?   )r;   r   rJ   r,   r0   rK   )r+   r,   r-   r,   r0   r?   )r{   r|   r0   r|   )r‘   r,   r0   r’   )rB   r?   rš   r,   r0   r|   )r+   r,   r-   r,   r0   r’   )r‘   r,   r0   rÈ   )rÒ   r/   rÐ   r|   rš   r,   r0   rÓ   )rÝ   r,   rÐ   rÞ   rš   r,   r0   rß   )rh   r/   r0   r,   )r‘   r,   r0   rÓ   )r­   r,   r0   r’   )rÿ   r,   r0   r   )rB   r?   r0   r  )rÝ   r,   r0   r  )rh   r/   r‘   r,   r0   r’   )r+   r,   r-   r,   r‘   r,   r0   r’   )r+   r,   r-   r,   rp  r|   r0   r,   )<Ú__doc__Ú
__future__r   r«   Úpathlibr   Útypingr   ra   r   r   r   r	   r
   r   r   r   Úapp.pdf.extractr   Úapp.saasr   rq   Úapp.saas.kbr   Úcompiler”   r–   r`   r)   Ú__annotations__r*   rp   r=   rI   ri   ry   r�   r™   r®   r¾   rÏ   rø   rc  r÷   r  rü   rÑ   rÜ   rò   rô   rú   rþ   r  r  r  rH  r`  rh  ro  rt  r  r>   r<   ú<module>r~     s¼  ðØ VÐ VÐ Và "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð (Ð 'Ð 'Ð 'Ð 'Ð 'Ø "Ð "Ð "Ð "Ð "Ð "Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'àˆBŒJð]ñô €	ðØ	ˆ5ðØ˜Uðà	ˆ5ðà˜eðð 
ˆ5ðð ˜5ðð 
ˆ5ð	ð ˜5ð	ð
 
ˆ5ðð 
ˆ5ðð ˜%ðð 
ˆ5ðð ˜%ðð 
ˆ5ðð ˜Eðð 
ˆ5ðð ˜%ðð /4Ø˜UØ˜eØ˜eðð ð €ð" €Ø;=€
Ð =Ð =Ð =Ñ =ØBDÐ Ð DÐ DÐ DÑ DØÐ ðð ð ð ðð ð ð ð%ð %ð %ð %ðPð ð ð ð2 12ð ð ð ð ð ð ð,2ð 2ð 2ð 2ðð ð ð ðð ð ð ð0 �”
ðñô €ð �2”:ØXñô Ð ð �2”:ØSñô Ð ð  �R”Zðñô Ð ð �Q˜q¨°1¸QØ�Q˜q¨°B¸rðð €ð �”ØLñô €ð
ð ð ð ð
5ð 
5ð 
5ð 
5ð !ð  !ð  !ð  !ðFð ð ð ðð ð ð ð=ð =ð =ð =ð<ð <ð <ð <ðð ð ð ð".ð .ð .ð .ðbFð Fð Fð FðROð Oð Oð Oðd*^ð *^ð *^ð *^ðZ1ð 1ð 1ð 1ðh LMð 
&ð 
&ð 
&ð 
&ð 
&ð 
&ð 
&ð 
&r>   