
    H*j5c                     `   S SK r S SKrS SK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rS SKrS SKJr  S SKJr  S SKJr  S SKJr  S SKrS SKJr  S S	KJrJr  S S
KJr  S SKJrJrJ r J!r!  S SK"J#r#  S SK$J%r%  S SK&J'r'J(r(  S SK)J*r*J+r+J,r,  S SK-J.r.  S SK)J/r/J,r,  S SKJ0r0  S SK1r1S SK2J3r3  S SK4J5r5  S SK4J6r6  S SK7J8r8  S SK9J:r:  S SK;J<r<  S SK=J>r>  S SK?J@r@  S SKAJBrB  SrC " S S\'5      rD " S S \'5      rE " S! S"\'5      rF " S# S$\'5      rG " S% S&\'5      rHS' rIS( rJS) rKS* rLS+ rMS, rNS- rOS0S. jrPS1S/ jrQg)2    N)validateValidationError)	AIMessage)OllamaEmbeddings)FAISS)ChatPromptTemplate)AsyncWebCrawler)PromptTemplate)StrOutputParserPydanticOutputParser)RunnablePassthrough)PyPDFLoader
TextLoaderDocx2txtLoaderUnstructuredPowerPointLoader)	PdfReader)SemanticChunker)	BaseModelField)ListOptionalDict)urlparse)Unionr   )RunnableLambda)Presentation)	OllamaLLM)
ChatOllama)PdfConverter)create_model_dict)text_from_rendered)Path)MarkdownHeaderTextSplitter)fetch_image_for_slidenomic-embed-textc                       \ rS rSr% \" S5      r\\S'   \" SSS9r\	\   \S'   \" SS	S9r
\\   \S
'   \" SSS9r\\S'   \" SSS9r\	\   \S'   Srg)SlideContent*   flashtypeNz$An optional subheading for the slidedescription
subheading.z(List of paragraphs for the slide content
paragraphsz^A detailed suggestion for a relevant visualization or image (5-8 words with specific elements)visualization_suggestionzURL of the image for the slideimage )__name__
__module____qualname____firstlineno__r   r*   str__annotations__r-   r   r.   r   r/   r0   __static_attributes__r1       N/var/www/eduai.edurigo.com/storigo/production/generate_storigo_content_html.pyr'   r'   *   sn    gD# %d8^ _J_!#3]^JS	^$)#  <\  %]c  ] 3STE8C=Tr9   r'   c                   ~    \ rS rSr% \" S5      r\\S'   \" SSS9r\\S'   \" SSS9r	\
\   \S	'   \" SS
S9r\\S'   Srg)
MCQContent1   Questionr*   .zThe multiple-choice questionr+   questionzA list of 4 answer optionsoptionsz0The correct answer (e.g., 'a', 'b', 'c', or 'd')correct_answerr1   N)r2   r3   r4   r5   r   r*   r6   r7   r?   r@   r   rA   r8   r1   r9   r:   r<   r<   1   sK    j!D#!#+IJHcJs0LMGT#YM1cdNCdr9   r<   c                   P    \ rS rSr% \" SSS9r\\\4   \	S'   \" SSS9r
\\	S'   Srg	)
StorigoContent7   .7Dictionary of slide contents with slide numbers as keysr+   slides/Total token count for all the generated contenttoken_countr1   N)r2   r3   r4   r5   r   rF   r   r6   r'   r7   rH   intr8   r1   r9   r:   rC   rC   7   s0    &+C=v&wFDl"#wS._`K`r9   rC   c                   r    \ rS rSr% \" SSS9r\\\4   \	S'   \" SSS9r
\\\4   \	S'   \" SSS9r\\	S	'   S
rg)StorigoContentMCQ;   .rE   r+   rF   z8Dictionary of MCQs with identifiers like 'mcq_1' as keysmcqsrG   rH   r1   N)r2   r3   r4   r5   r   rF   r   r6   r'   r7   rM   r<   rH   rI   r8   r1   r9   r:   rK   rK   ;   sK    &+C=v&wFDl"#w"'9s"tD$sJ
tS._`K`r9   rK   c                   Z    \ rS rSr% \" SSS9r\\\\	\
4   4   \S'   \" SSS9r\\S'   Srg	)
StorigoContentMCQMid@   .zYDictionary of slide contents with slide numbers as keys and MCQs with MCQ numbers as keysr+   rF   rG   rH   r1   N)r2   r3   r4   r5   r   rF   r   r6   r   r'   r<   r7   rH   rI   r8   r1   r9   r:   rO   rO   @   sD    9>s  Ql  :mFDeL*4556  mS._`K`r9   rO   c                 F    [         R                  " SU 5      n[        U5      $ )Nz\w+)refindalllen)texttokenss     r:   count_tokensrW   D   s    ZZ%Fv;r9   c                   #    [        SS9 IS h  vN nUR                  U S9I S h  vN n[        U 5      nUR                  UR                  R                  SS5      -   nUR                  S5      (       d  US-  n[        US5       nUR                  UR                  5        S S S 5        UsS S S 5      IS h  vN   $  N N! , (       d  f       N%= f N! , IS h  vN  (       d  f       g = f7f)NT)verbose)url/_z.txtw)
r	   arunr   netlocpathreplaceendswithopenwritemarkdown)filecrawlerresult
parsed_urlfilenametxt_files         r:   	crawlerrrrl   H   s     t,,|||--d^
$$z'>'>sC'HH  ((H(C HNN6??+ ! -,,-
 !  -,,,sm   C/B>C/CC ACC#	C,C/8C9C/ C
C	CC/C,CC,(C/c                     U (       a$  [         R                  R                  U 5      (       d  g[        U SSS9 nUR	                  5       nS S S 5        W(       a  U$ S$ ! , (       d  f       N= f)N rzutf-8)encoding)osr`   isfilerc   read)inputrf   contents      r:   read_file_urlrv   S   sN    u--	eS7	+t))+ 
,7%2% 
,	+s   A
A*c           	      ,   Sn[        SSS9n[        S/US9nX2-  nSnU R                  5       n[        U5      U::  a  U /nOC/ n[	        S[        U5      U5       H'  nUR                  S	R                  XhX-    5      5        M)     / n	U HN  n
 UR                  SU
05      nU	R                  [        US
5      (       a  UR                  O
[        U5      5        MP     SR                  U	5      nU$ ! [         a  nU	R                  U
5         S nAM  S nAff = f)Nak  
    Extract only the meaningful content from the text below. Focus on descriptions, value propositions, mission statements,
    features, and anything that provides valuable information about the company, products, or services. Ignore any URLs,
    navigation links, contact forms, or irrelevant sections.

    Here is the content to process:

    {context}
    http://127.0.0.1:11434
gemma3:12b)base_urlmodelcontext)input_variablestemplatei  r    ru   

)r   r
   splitrT   rangeappendjoininvokehasattrru   r6   	Exception)ru   prompt_templatellmpromptrunnableMAX_WORDS_PER_CHUNKwordschunksicleaned_partschunkrh   efiltered_contents                 r:   clean_using_llmr   Z   s   O )C YK/RF|H MMOE
5z((q#e*&9:AMM#((51+B#CDE ; M	(__i%78F  7693M3MSVW]S^_  {{=1  	(  ''	(s   A
C--
D7DDc                 0   [        USS9n[        U [        5      (       a  U /n [        U S   [        5      (       a  U  Vs/ s H  nSU0PM	     n n[        S U  5       5      (       d  / $ UR	                  U  Vs/ s H  o3S   PM	     sn5      nU$ s  snf s  snf )N
percentile)breakpoint_threshold_typer   page_contentc              3   Z   #    U  H!  n[        U[        5      =(       a    S U;   v   M#     g7f)r   N)
isinstancedict.0docs     r:   	<genexpr>;split_text_with_semantic_chunker_for_url.<locals>.<genexpr>   s$     O$3z#t$>3)>>$s   )+)r   r   r6   allcreate_documents)docs
embeddingstext_splitterr   	documentss        r:   (split_text_with_semantic_chunker_for_urlr      s    #lM $v$q'3156#%6O$OOO	..t/TtN0Ct/TUI	 7 0Us   B7Bc                    [        U5      n[        R                  R                  SU5      n[        R                  " USS9  [        SS9n[        U SS9 H  u  pE[        R                  R                  U5      n[        R                  " USS9  [        R                  " U/US9n[        R                  R                  US	U 35      nUR                  U5        M     g )
Nmy_embeddingsT)exist_okr%   r{      start	embeddingfaiss_index)
r6   rq   r`   r   makedirsr   	enumerater   from_documents
save_local)	split_documents	client_idembedding_folder_baser   idxr   embedding_foldertemp_dbembedding_file_paths	            r:   create_and_save_embeddingsr      s    IIGGLL)DKK%5!(:;JoQ777<<(=>
$t4&&u
C ggll+;{3%=PQ./ 8r9   c                 f    [        SS9n[        R                  " XS9nSnUR                  U5        U$ )Nr%   r   r   faiss_supplier_index)r   r   r   r   )r   r   r   vectorstorefaiss_index_paths        r:   create_embeddingsr      s8    !(:;J&&MK-+,r9   c                 N   [        SS9nS nU SU  3n[        R                  " U5       Vs/ s H@  nUR                  S5      (       d  M  U[	        S5      S  R                  5       (       d  M>  UPMB     nn[        US S9nU H  n[        R                  R                  XH5      n	[        R                  " XSS9n
U
R                  R                  5        Vs/ s H(  nU
R                  R                  U5      R                  PM*     nnUc  U
nM  UR!                  U5        M     Ub  UR#                  U S	35        U H9  n[        R                  R                  XH5      n	 [$        R&                  " U	5        M;     U$ s  snf s  snf ! [(         a     MV  [*         a  n S nAMe  S nAff = f)
Nr%   r   r[   r   c                 8    [        U R                  SS5      5      $ )Nr   rn   )rI   ra   xs    r:   <lambda>!merge_all_faiss.<locals>.<lambda>   s    S=RT9U5Vr9   keyT)allow_dangerous_deserializationz/merged_faiss)r   rq   listdir
startswithrT   isdigitsortedr`   r   r   
load_localindex_to_docstore_idvaluesdocstoresearchr   	add_textsr   shutilrmtreeFileNotFoundErrorOSError)r   	base_pathr   merged_faissfolder_pathfolderfaiss_filessorted_filesrf   
faiss_pathcurrent_faissdoc_idcurrent_textsr   s                 r:   merge_all_faissr      s   !(:;JLKq,KZZ446]+ 	06s=7I7J0K0S0S0U 	4   ++VWLWW\\+4
((aef'4'I'I'P'P'RT'RV '//66v>KK'R 	 T(L""=1  ;-} =>WW\\+4
	MM*%  1T ! 	 		s/   E9	E9,E9/E>F
F$	F$F$c	                   ^^^E^F^G^H^I^J^K#     T(       a  T" SSSS.5        [        U 5      I S h  vN n	[        U	5      n
U
(       d  [        S5      eT(       a  T" SSSS.5        [        U
5      n[	        SS	9n[        X5      nT(       a  T" SS
SS.5        [        X5        [        U5      n[        SSSS9n[        UR                  R                  R                  5       5      n[        U5      nSJS jmG[        UG4S jU 5       5      n/ nUU::  a5  [        R                   " SUS-
  U["        S9nU Vs/ s H  nUU   PM
     nnGOU Vs/ s H&  n[        UR$                  R'                  5       5      PM(     nn[        U5      nU Vs/ s H  nUU-  U-  PM     nnU Vs/ s H  n[)        S[+        U5      5      PM     nnU[        U5      -
  nSnUS:w  aJ  US:  a  UU==   S-  ss'   US-  nO!US:  a  UU   S:  a  UU==   S-  ss'   US-  nUS-   U-  nUS:w  a  MJ  [-        UU5       H  u  nnUR/                  U/U-  5        M     SR1                  S US U  5       5      mESn TER'                  5       n![        U!5      U :  a  SR1                  U!S U  5      mESn"[3        [4        S9n#U#mJ[6        R8                  " U"5      n$UE4S jS UJ4S jS.U$-  U-  n%T(       a  T" SSS S.5        U%R;                  S!US".5      n&[=        U&S#5      (       a  U&R>                  n'O[A        U&5      n'U'RC                  S$5      n(U'RE                  S%5      S-   n)U(S&:X  d  U)S&:X  a  [        S'U' 35      eU'U(U) n' [F        RH                  " U'5      n* TJRK                  [F        RL                  " U*5      5      n.U.RN                  n/[Q        U/[        5      (       a   0 n1[S        U/SS+9 H  u  nn2U2U1S,U 3'   M     U1n/T(       a  U/RU                  5        H  u  n3n4T" S-U3[=        U4S.5      (       a  U4RV                  OU4RY                  S.5      [=        U4S/5      (       a  U4RZ                  OU4RY                  S/5      [=        U4S05      (       a  U4R\                  OU4RY                  S05      U3 S13S2.5        M     S3[@        4S4 jmF[_        [a        U/RU                  5       UF4S5 jS695      mI[Q        U["        5      (       a  US:H  n5O+[Q        U[@        5      (       a  URc                  5       S7;   n5OS8n5U5(       a  T(       a  T" SS9S:S.5        TIRU                  5        H  u  n3n4U4R\                  (       aa  [e        U3U4R\                  5      n6U6(       a"  U6U4l3        T(       a  T" S;U3U6U3 S<3S=.5        MT  MV  S U4l3        T(       a  T" S;U3S U3 S>3S=.5        Mv  Mx  S U4l3        M     OTIR                  5        H
  n4S U4l3        M     Sn7TIR                  5        HH  n2U2RV                   SSR1                  U2RZ                  5       SU2R\                   3n8U7[i        U85      -  n7MJ     U(       Ga@  T(       a  T" SS?S@T SA3S.5        SBmH[        TIRk                  5       5      mKUHUUIUUK4SC jn9U9" 5       I S h  vN n:U:R                  5        H3  n;U;SD    SSR1                  U;SE   5       SU;SF    3n8U7[i        U85      -  n7M5     0 n<Sn=Un>Tn?US:X  aa  U?S:  a  U>U?-  OU>n@[S        TK5       H9  u  nAn3TIU3   U<U3'   UAS-   W@-  S:X  d  M  U=U?:  d  M$  SGU=S-    3nBU:UB   U<UB'   U=S-  n=M;     [m        U<U7SH9nCUC$ TK H  n3TIU3   U<U3'   M     [o        U?5       H  n=SGU=S-    3nBU:UB   U<UB'   M     [m        U<U7SH9nCUC$ [5        TIU7SH9nDUD$  GNfs  snf s  snf s  snf s  snf !   S(U' 3n+UR;                  U+5      n,[=        U,S#5      (       a  U,R>                  O
[A        U,5      n-U-RC                  S$5      n(U-RE                  S%5      S-   n)U-U(U) n-[F        RH                  " U-5      n* GN= f! [         a  n0[        S)[A        U05       S*U* 35      eS n0A0ff = f GN! [         a  n0[        SI[A        U05       35      eS n0A0ff = f7f)KNstagecrawlingzCrawling HTML page...)r*   r   messagez#Failed to read content from the URLcleaningzCleaning content with LLM...r%   r   r   zSaving embeddings...rx   ry   ffffff?rz   r{   temperaturec           	      `    [        S[        [        U R                  5       5      U-  5      5      $ )Nr   )maxroundrT   r   )rU   words_per_slides     r:   estimate_slides4generate_slide_content_html.<locals>.estimate_slides   s$    q%DJJL 1O CDEEr9   c              3   H   >#    U  H  nT" UR                   5      v   M     g 7fNr   )r   r   r   s     r:   r   .generate_slide_content_html.<locals>.<genexpr>   s     U*3_S-=-=>>*s   "r   r   )numdtyper   c              3   8   #    U  H  oR                   v   M     g 7fr   r   r   s     r:   r   r      s     "\?[#3#3?[s   i  r   u  
Based on the following context, generate professional and engaging content for exactly {num_slides} slides in a Storigos presentation.

STRICT RULES:
- ❗ ONLY use the content provided in the 'context' below.
- ❌ DO NOT introduce any external knowledge, definitions, or examples not present in the context.
- ⚠️ Do not assume common sense or use general facts. Stick to the exact information given.
- ⚠️ Avoid generic phrases like "as we know", "in general", or "in this video".

Each slide must include:
- A clear and concise **sub-heading**
- **Exactly 2–4 concise paragraphs** derived solely from the context
- A **detailed visualization suggestion** (5-8 words, specific to the content with concrete elements)
- Include specific details: people, objects, actions, settings to make it highly unique
- CRITICAL: Each slide's visualization suggestion MUST BE COMPLETELY UNIQUE across all slides - no overlapping concepts, objects, or scenes
- If slides are related, vary all elements (people, objects, actions, settings) significantly to ensure completely different images

Important: Only output the final JSON object. No additional text, markdown, or explanation should be included.

Context:
{context}

{format_instructions}

The final output must be a valid JSON object where each slide is represented as "slide_1", "slide_2", ..., up to "slide_{num_slides}".
Each slide must contain:
- "subheading"
- "paragraphs"
- "visualization_suggestion"
)pydantic_objectc                    > T$ r   r1   )r   context_texts    r:   r   -generate_slide_content_html.<locals>.<lambda>,  s    \r9   c                     U S   $ )N
num_slidesr1   r   s    r:   r   r   -  s    ,r9   c                 $   > TR                  5       $ r   )get_format_instructions)r   parsers    r:   r   r   .  s    1O1O1Qr9   )r|   r   format_instructions
slide_textz$Generating slide content with LLM...rn   )queryr   ru   {}zInvalid JSON output from LLM:
zFix this JSON strictly:
zPydantic validation failed: z
Parsed JSON:
r   slide_slider-   r.   r/   z	 prepared)r*   	slide_keyr-   r.   r/   r   item_keyc                     U R                  SS5      u  pUS:X  a  SnOUS:X  a  SnOSnUR                  5       (       a  [        U5      OSnX44$ )Nr\   r   r
  r   mcqi  )r   r   rI   )r  prefixnum_strgroupnumbers        r:   custom_slide_sort_key:generate_slide_content_html.<locals>.custom_slide_sort_keyo  sQ    &nnS!4OF 5%,__%6%6S\CF?"r9   c                    > T" U S   5      $ )Nr   r1   )kvr  s    r:   r   r   z  s    I^_abc_dIer9   r   )1trueyes0Fimagesz Fetching visualization images...r0   z image ready)r*   r  r0   r   z image not foundr  zGenerating z MCQs...ur  
Based on the following context from the last two slides, generate one multiple-choice question (MCQ). The question should be relevant to the content and designed to test comprehension.

**Context**: {context}

The MCQ must include:
- A **question** related to the context
- Exactly **4 answer options**
- A clear indication of the **correct answer** as a single letter: 'a', 'b', 'c', or 'd'

⚠️ **Critical Requirements**:
- ✅ Return **only valid JSON** — no explanations, headers, or extra text.
- ✅ Ensure all fields and options are enclosed in **double quotes (`"`)**.
- ✅ Do **not** use letters like "A.", "B." in the options — just the plain text.
- Dont give Here is the MCQ while generating MCQ
- Directly follow the format given below

The final output **must strictly follow** this format:
```json
{{
    "question": "<The MCQ question>",
    "options": [
        "<Option 1>",
        "<Option 2>",
        "<Option 3>",
        "<Option 4>"
    ],
    "correct_answer": "<Correct option (e.g., 'a', 'b', 'c', or 'd')>"

    Always give "question","options","correct_answer" these labels in double quotes only
}}
c            
      b  >^^#    [         R                  " T5      m[        SSSS9m0 n / n[        S[	        T5      S5       H  n[	        U 5      T:  a    O/ n[        U[        US-   [	        T5      5      5       HD  nTTU      nUR                  UR                   SSR                  UR                  5       35        MF     S	R                  U5      nUU4S
 jn[	        U5      T:  d  M  U" Xb5      nUR                  U5        M     [        R                  " USS06I S h  vN n	U	 H  n
[        U
[        5      (       d  M  U
(       d  M#  S[	        U 5      S-    3nXU'   T(       d  MA  T" SUU
R                  S5      U
R                  S5      U
R                  S5      U S3S.5        M     U $  N7f)Nrx   ry   r   r   r      z: r   
c                   >^ #     [         R                  " 5       R                  S U UU4S j5      I S h  vN n[        US5      (       a  UR                  nO[        U5      nUR                  S5      nUS:w  ab  SnSn[        X4S  US9 H)  u  pxUS:X  a  US-  nM  US:X  d  M  US-  nUS:X  d  M'  Un  O   US:w  a  X4US-    n	[        R                  " U	5      n
Og g U	(       a  U	R                  5       (       d  g U
R                  S	S
5      U
R                  S/ 5      U
R                  SS
5      S.nUS	   (       a  [        US   5      S:X  a  US   (       a  U$ g  GN$! [         a
  n S nAg S nAff = f7f)Nc                  L   > [        U 4S j5      T-  T-  R                  0 5      $ )Nc                    > ST0$ )Nr|   r1   )r   ctx_texts    r:   r   ygenerate_slide_content_html.<locals>.generate_mcqs_async.<locals>.generate_single_mcq.<locals>.<lambda>.<locals>.<lambda>  s
    i=Rr9   )r   r   )r"  mcq_llm
mcq_prompts   r:   r   ggenerate_slide_content_html.<locals>.generate_mcqs_async.<locals>.generate_single_mcq.<locals>.<lambda>  s,    $23R$S&0%1&-%. #)&*	)-r9   ru   r  r  r   r   r   r  r?   rn   r@   rA   )r?   r@   rA      )asyncioget_event_looprun_in_executorr   ru   r6   findr   jsonloadsstripgetrT   r   )r"  r   
mcq_resultru   r   open_bracesendidx_charcharcontent_onlyjson_objectformatted_mcqr   r$  r%  s   `            r:   generate_single_mcqUgenerate_slide_content_html.<locals>.generate_mcqs_async.<locals>.generate_single_mcq  s{    3(/6/E/E/G/W/W $!-0 *J  'z9==*4*<*<*-j/$+LL$5E${./&(6?W\6]NH'+s{(3q(8)-(3q(8+6!+;2:C,1 7^ $'"93:Q3GL26**\2JK+/'+#/|7I7I7K7K'+ -8OOJ,K+6??9b+I2=//BRTV2W-M !.j 9 #M)$< = B -.> ?'4 4#'a*b  ) (#'(s^   E2.E EA*E #	E 0*E E2E 8E29AE E2E 
E/%E2*E//E2return_exceptionsTmcq_r   r  r?   r@   rA   z ready)r*   mcq_keyr?   r@   rA   r   )r   from_templater   r   rT   minr   r-   r   r.   r(  gatherr   r   r/  )rM   tasksr   context_slidesjr
  r   r8  taskresultsrh   r<  r$  r%  mcq_templatenum_mcqsordered_slidesprogress_cb
slide_keyss               @@r:   generate_mcqs_async8generate_slide_content_html.<locals>.generate_mcqs_async  s    /==lK
$5& # q#j/15A4yH,%'N"1c!a%Z&AB .z!} =&--1A1A0B"SXXeN^N^E_D`.ab C $(99^#<L4(l 5zH,2<CT*E 6H !( N NN%F!&$//FF$(TQ"8(.W&;'(-+2,2JJz,B+1::i+@28**=M2N.5Yf+=)  & ! Os+   C!F/*6F/ F-!F/F/
F/(AF/r?   r@   rA   r;  )rF   rH   z Error generating slide content: )2   )8rl   rv   r   r   r   r   r   r   r   listr   _dictr   rT   sumnplinspacerI   r   r   r   r   zipextendr   r   rC   r   r=  r   r   ru   r6   r+  rfindr,  r-  parsedumpsrF   r   r   itemsr-   r/  r.   r/   r   r   r.  r$   r0   rW   keysrO   r   )Ldocument_urlr   r   rF  is_imageis_questionquestion_positionGPUrH  rj   raw_contentmeaningful_contentr   r   merge_embeddingsr   
all_chunkstotal_chunkstotal_possibleselected_chunksindicesr   cword_countstotal_wordsr]   	raw_allocr   allocdiffr   countMAX_CONTEXT_WORDScontext_wordsslide_content_template
raw_parserslide_content_promptslide_content_chain
raw_resultru   r   r2  parsed_json
fix_promptfixedfixed_content
parsed_objslides_datar   slides_dictr
  r  slide_contentis_image_bool
image_pathrH   text_contentrJ  rM   r  interleaved_contentmcq_countertotal_slides
total_mcqsintervalr   r<  storigo_contentstorigo_content_without_mcr   r  r   rE  rG  r  rI  sL      `    `                                                            @@@@@@@r:   generate_slide_content_htmlr     s\	    IEWzVm$no"<00 $H-ABB WzVt$uv,[9 &,>?
BCUb W|Xn$op"?>*95 -
 *3399@@BC
:	F U*UU%kk!\A%5:SQG6=>gz!}gO>O@JK
13q~~3356
KKk*K?JK{![:5{IK/89y!SE!H%yE9E
*DA!)!8!HMHAIDAX%(Q,!HMHAIDUl* !) !$J 6u&&w7 !7 {{"\{PZ?["\\ !$**,} 1188M2D3D$EFL"< *.I
 1??@VW 27'Q
 ##  	 W|X~$  A(//"J0WX
 :y)) ((G*oG S!mmC 1$B;#)=gYGHH%$	4**W-K	bdjj&=>J$++K k4((K%k;5,1fQCL) <%K ,7,=,=,?(	=#!*>EmUa>b>b-":":huhyhy  {G  iH>EmUa>b>b-":":huhyhy  {G  iHZabo  rL  [M  [M0V0V  S`  Sd  Sd  e  S@"+I6  -@		#C 		# f[%6%6%8>efgh$$$MM#&&$NN,0IIM!MK8Xz({|,:,@,@,B(	= 99!6!%>>"J ".8+&'y[eu~t  @L  sM  )N  O ' /3+&'y[_oxny  zJ  mK  )L  M ' +/M' -C" "0!6!6!8&*# "9 #**,E#../q%:J:J1K0LAeNlNlMmnL<55K - K5WbckblltUu(vwL@ n1134J_ _B -..D{{}"%j/!2!CHHS^4L3MQsScOdNef|L99 % #%K%L!J A%9Ca<:5\&/
&;NC5CI5N'	2a8+q0[:5M$(q(9":7;G}+G4#q( '< #7>Q_j"k&& ",I5CI5N'	2 ", $)#4K $[1_$56G37='0 $5 #7>Q_j"k&&)7~[f)g&--G 1L ?KK9r	44WI>JJJz*E-4UI-F-FEMMCPUJM!&&s+E%%c*Q.C)%4M**]3K  	b:3q6(BRS^R_`aa	bR /N  E:3q6(CDDEs   b	!a  ^Da  2^a  	-^6a  ^!a  ^&>A a   Ea  ,^+ 1`1 4Ka  aB	a  a  $$a  b		>a  b	a  b	a  a  +B `.+a  1
a;aaa   
b*bbb	)r   r   )Rrq   timerandomrR   r,  heapq
jsonschemar   r   langchain_core.messagesr   requestsnumpyrP  langchain_community.embeddingsr    langchain_community.vectorstoresr   langchain_core.promptsr   crawl4air	   r(  r
   langchain_core.output_parsersr   r   langchain_core.runnablesr   $langchain_community.document_loadersr   r   r   r   PyPDF2r   $langchain_experimental.text_splitterr   pydanticr   r   typingr   r   r   urllib.parser   r   r   r   pptxr   langchain_ollamar   r   marker.converters.pdfr   marker.modelsr    marker.outputr!   pathlibr"   langchain_text_splittersr#   storigo_image_generatorr$   OLLAMA_MODELr'   r<   rC   rK   rO   rW   rl   rv   r   r   r   r   r   r  r1   r9   r:   <module>r     s    	   	   0 -   ; 2 5 $  1 O 8 v v  @ % ' ' !  3   & ' . + ,  ? :!U9 Ue eaY aa	 a
a9 a	&&P
0<JEr9   