
    %jn              
         U d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
  e
e      j                         j                  Zedz  Zedz  Zg dZd	Zd
ZdZdddddddddd	ZdddddZdgdgdgdgdgd gd!gd"Zd#ed$<   d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d,d4Zd5ed6<   dd7d8d9d:d;ZdRd<ZdSd=ZdTd>ZdUd?ZdVd@ZdWdAZ dXdBZ!	 	 	 	 	 	 	 	 	 	 dYdCZ"dZdDZ#d[d\dEZ$d]dFZ%ddG	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d^dHZ&d_dIZ'	 d[	 	 	 	 	 	 	 d`dJZ(	 d[	 	 	 	 	 	 	 	 	 dadKZ)dbdLZ*	 	 	 	 	 	 dcdMZ+	 	 	 	 	 	 dddNZ,eef	 	 	 	 	 dedOZ-dfdPZ.e/dQk(  r e.        yy)ga'  Alphabet forecast-vintage extractor.

Reads source_manifest.csv, fetches primary SEC/IR HTML, and parses capex actuals
from cash-flow statements plus FY2025/FY2026 capex-guidance vintages from MD&A,
SEC 8-K ex99, and earnings materials. Alphabet does not disclose MW/GW;
normalized_gw is blank.
    )annotationsN)datetime)Pathzsource_manifest.csvzforecast_vintage.csv)companytickeras_of_periodtarget_periodmetric_name	raw_valuenormalized_gwunitforecast_or_actual
is_derived
source_urlsource_locationsource_snippetsnippet_support_status
confidencecaveatz~Alphabet/Google Cloud does not disclose data-center MW/GW. Row tracks USD capex proxy only; normalized_gw intentionally blank.zDGOOGL-forecast-vintage-extractor/1.0 (research; contact@example.com)*PaymentsToAcquirePropertyPlantAndEquipmentz
2024-03-31z
2024-06-30z
2024-09-30z
2024-12-31z
2025-03-31z
2025-06-30z
2025-09-30z
2025-12-31z
2026-03-31)	
FY2024-FQ1
FY2024-FQ2
FY2024-FQ3
FY2024-FQ4
FY2025-FQ1
FY2025-FQ2
FY2025-FQ3
FY2025-FQ4
FY2026-FQ1zThttps://www.sec.gov/Archives/edgar/data/1652044/000165204425000014/goog-20241231.htmzThttps://www.sec.gov/Archives/edgar/data/1652044/000165204426000018/goog-20251231.htmzThttps://www.sec.gov/Archives/edgar/data/1652044/000165204425000091/goog-20250930.htmzThttps://www.sec.gov/Archives/edgar/data/1652044/000165204425000062/goog-20250630.htm)r   r   r   r   zZWe expect to increase, relative to 2024, our i\s*nvestment in our technical infrastructurezWWe expect to increase, relative to 2024, our investment in our technical infrastructurezWincreasing our investment in capital expenditures in 2025 to approximately \$85 billionzFWe expect full year 2025 capital expenditures to exceed full year 2024zwIn 2026, we expect to significantly increase\s*,?\s*relative to 2025, our i\s*nvestment in our technical infrastructurezWour 2026 CapEx investments are anticipated to be in the range of \$175 to \$185 billionznIn 2026, we expect to significantly increase, relative to 2025, our investment in our technical infrastructure)googl_fy2024_10kgoogl_fy2025_q1_10qgoogl_fy2025_q2_8k_ex99googl_fy2025_q3_10qgoogl_fy2025_10kgoogl_fy2025_q4_8k_ex99googl_fy2026_q1_10qzdict[str, list[str]]GUIDANCE_SNIPPET_PATTERNSFY202575z9Q1 FY2025 earnings call prepared remarks (Anat Ashkenazi)zFwe still expect to invest approximately $75 billion in CapEx this year0highzManagement FY2025 capex guidance (~$75B) from Q1 FY2025 earnings call (repeatable source family: abc.xyz investor events page). Not MW/GW capacity.)r	   r   r   r   r   r   r   FY2026185z9Q1 FY2026 earnings call prepared remarks (Anat Ashkenazi)zMwe are updating our full-year 2026 CAPEX guidance range to 180 to 190 billion1mediumzQ1 FY2026 revises FY2026 capex guidance to $180-190B (midpoint ~$185B stored). Repeatable source family: abc.xyz investor events page. Not MW/GW capacity.) googl_fy2025_q1_earnings_webcast googl_fy2026_q1_earnings_webcastzdict[str, dict[str, str]]CALL_GUIDANCE            )sec_10ksec_10qsec_8k_exhibit_99_1official_ir_releaseearnings_call_webcastc                    | j                  dd      5 }t        t        j                  |            cd d d        S # 1 sw Y   y xY w)N utf-8newlineencoding)openlistcsv
DictReader)manifest_pathhandles     f/home/dev/research_loop/runs/gw-forecast-production-001-loop06/artifacts/production/GOOGL/extractor.pyload_manifestrI      s=    			B		9 ,VCNN6*+, , ,s	   <Ac                    t         j                  j                  | dt        i      }t         j                  j	                  |d      5 }|j                         j                  dd      cd d d        S # 1 sw Y   y xY w)Nz
User-Agent)headersZ   )timeoutr>   replace)errors)urllibrequestRequest
USER_AGENTurlopenreaddecode)urlrQ   responses      rH   
fetch_htmlrY      sk    nn$$S<2L$MG					4 A}}%%gi%@A A As   	!A44A=c                l   t        j                  dd| t         j                  t         j                  z        }t        j                  dd| t         j                  t         j                  z        }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      S )Nz<script[^>]*>.*?</script> flagsz<style[^>]*>.*?</style>z<[^>]+>z&#\d+;z\s+)resubIS)htmltexts     rH   html_to_textrd      s{    66.TMD66,c4rttbdd{KD66*c4(D66)S$'D66&#t$$    c                    |D ]=  }t        j                  || t         j                        }|s,|j                  d      c S  y )Nr\   r   )r^   searchr`   group)rc   patternspatternmatchs       rH   find_snippet_in_textrl      s=     "		'4rtt4;;q>!" re   c                L   i }t        j                  d| t         j                        D ]y  }|j                  d      }t        j                  d|      }t        j                  d|      }|sC|sF|j                  d      |j                  d      f||j                  d      <   { |S )Nz6<xbrli:context id="([^"]+)"[^>]*>(.*?)</xbrli:context>r4   z<xbrli:startDate>([^<]+)z<xbrli:endDate>([^<]+)r3   )r^   finditerra   rh   rg   )rb   contextsrk   bodystartends         rH   parse_contextsrs      s    +-HA4 F {{1~		5t<ii148S(-A		!'EHU[[^$F Ore   c                   i }t        j                  dt        z   dz   t         j                        }|j	                  |       D ]  }|j                  d      |j                  d      |j                  d      j                  dd      j                         }}}t        |      }|dk(  rt        |d	z        n
t        |      ||<    |r|S t        j                  d
t        z   dz   t        z   dz   t         j                        }|j	                  |       D ]h  }|j                  d      xs |j                  d      }|j                  d      xs |j                  d      j                  dd      }t        |      ||<   j |S )Nz;<ix:nonFraction[^>]*contextRef="([^"]+)"[^>]*name="us-gaap:z3"[^>]*scale="([^"]*)"[^>]*>([^<]*)</ix:nonFraction>r3   r4   r5   ,r=   6i@B z'contextRef="([^"]*)"[^>]*name="us-gaap:z"[^>]*>([^<]+)<|name="us-gaap:z("[^>]*contextRef="([^"]*)"[^>]*>([^<]+)<r6   )
r^   compile	CAPEX_TAGr`   rn   rh   rN   stripfloatint)	rb   valuesrj   rk   ctxscaleraw	displayedlegacys	            rH   parse_capex_by_contextr      sg   FjjF
	
@	A 		G !!$' U++a.%++a.%++a.:P:PQTVX:Y:_:_:aCU#J	49SLc)i/0c)nsU ZZ2Y> B 	&	')T	U
F
 & kk!n.A{{1~/Q88bA#hs Mre   c                x    t        j                  | d      }t        j                  |d      }||z
  j                  S )Nz%Y-%m-%d)r   strptimedays)rq   rr   ses       rH   days_betweenr      s4    %,A#z*AE<<re   c                    | d d }|| k7  ry t        ||      }|| dk(  r|dkD  ryd|cxk  rdk  rn n|j                  |      ry|| dk(  rd|cxk  rd	k  ry
 || dk(  rd|cxk  rdk  ry y y )Nr6   z-01-01i,  annualP   d   	quarterly      h1i  i  9m)r   
startswith)end_daterq   rr   valueyearspans         rH   classify_capexr      s     BQ<D
hs#D4&D3J	TSU--d34&C4$63$6 %74&C4$63$6 %7re   c                L    | dz  dj                  d      j                  d      S )N  .3fr*   .)rstrip)millionss    rH   billions_from_millionsr      s'    oc"**3/66s;;re   c                    | dv rddddddS | dk(  rdd	d
dddS | dk(  rddddddS | dk(  rddddddS | dk(  rddddddS | dk(  rd|xs dddd|xs d ddS t        d|        )N)r    r!   r(   r)   r.   r/   zAlphabet gives qualitative FY2025 capex increase guidance in 10-K/10-Q MD&A. Implied ~$75B from Q1 FY2025 earnings-call guidance (~$75B CapEx). Not MW/GW capacity.)r	   r   r   r   r   r"   85r*   r+   zpManagement revised FY2025 capex guidance to ~$85B from SEC-filed Q2 FY2025 earnings release. Not MW/GW capacity.r#   91zImplied ~$91B FY2025 capex from Q3 MD&A that FY2025 capex will exceed FY2024 ($52.5B); actual FY2025 landed at $91.4B per 10-K. Not MW/GW capacity.r%   r,   180z~Management FY2026 capex guidance range $175-185B; midpoint ~$180B stored. SEC-filed earnings release / IR. Not MW/GW capacity.r$   z10-K MD&A qualitative FY2026 capex increase; numeric vintage carries forward Q4 FY2025 $175-185B range (midpoint ~$180B). Not MW/GW capacity.r&   r-   zsNo new full-year FY2026 numeric capex guide in 10-Q MD&A at FQ1; vintage carries forward Q1 FY2026 call revision ~$zB. Not MW/GW capacity.zUnknown guidance source_id: )
ValueError)	source_idcarry_forwards     rH   guidance_metadatar      s   ??%"&

 
	
 --% ?	
 		
 ))%"&

 
	
 --% G	
 		
 &&%"[	
 		
 ))%&/%"==J=Se<T U&&

 
	
 3I;?
@@re   c                    | d   | d   | d   fS Nr   r	   r
    )rows    rH   row_keyr   F  s    _!5s=7IJJre   )r   c                   i d| d   d| d   d| d   d|d|d|dd	d
dd|d|d|xs | d   d|d|d|d|	d|
S )Nr   r   r   periodr	   r
   r   r   r=   r   USD_billionsr   r   r   r   r   r   r   r   r   )manifest_rowr	   r
   r   r   r   r   r   r   r   r   r   s               rH   base_rowr   J  s    <	*,x( 	X. 		
 	{ 	Y 	 	 	0 	j 	j>L$> 	? 	. 	!"8 	j  	&! re   c                    | d   }t         j                  |      }|sy t        | |d   d|d   d|d   |d   |d   d	|d
   |d         S )Nr   r	   capex_guidancer   forecastr   r   r   verified_primaryr   r   
r	   r
   r   r   r   r   r   r   r   r   )r2   getr   )r   r   metas      rH   extract_call_guidancer   m  st    [)IY'D?+${#%%./,-1%H~ re   c                "   | d   }t         j                  |      }|sy t        |      }t        ||      }|sy t	        ||      }| d   j                  dd      j                  dd      }t        | |d   d|d	   d
|d   | d|d|d   |d         S )Nr   r   FYzFY z-FQz Qr	   r   r   r   r   z MD&A / earnings materialsr   r   r   r   )r'   r   rd   rl   r   rN   r   )	r   rb   r   r   ri   rc   snippetr   period_labels	            rH   extract_guidance_rowr     s    
 [)I(,,Y7HD"42GY6D)11$>FFudSL?+${#%%'.(BC1%H~ re   c                   | d   j                  d      D ch c]  }|j                          }}| d   }g }|dk(  r2t        d |D              rt        |       }|r|j	                  |       |S | d   }	|j                  |	      }
|
t        |	      }
|
||	<   t        d |D              rLt        | |
|      }|r|j	                  |       n+|dv r't        d	 |D              rt        d
|	 d| d    d      | d   }t        j                  |      }|s|S t        |
      }t        |
      }d|v r|dk(  r|dk(  rdnd}|j                         D ]i  \  }\  }}||vrt        | d||||         dk(  s&||   }|j	                  t        | d| dt        |      ddd| dd|ddddt                        n d }d!|v r|d"k(  r|d d# }|j                         D ]  \  }\  }}||vrt        |||||         }|d$v s$||   }|}|d%k(  rd&nd'}||j#                  |i       |<   |j	                  t        | d| d(| d!t        |      dd| d)   d*| d|ddddt                        n d+|v rz|d,v rv|j                         D ]c  \  }\  }}||vrt        |||||         d-k(  s#||   }|j	                  t        | |dt        |      dd| d)   d|ddddt                        |S  |S c c}w ).Nextractable_metrics;document_typer;   c              3  >   K   | ]  }|j                  d         ywr   Nr   .0ms     rH   	<genexpr>z,extract_from_manifest_row.<locals>.<genexpr>  s     ?!q||,-?   r   c              3  >   K   | ]  }|j                  d         ywr   r   r   s     rH   r   z,extract_from_manifest_row.<locals>.<genexpr>  s     
;a1<<()
;r   )r7   r8   r9   c              3  >   K   | ]  }|j                  d         ywr   r   r   s     rH   r   z,extract_from_manifest_row.<locals>.<genexpr>  s!      O
/0ALL)*O
r   z(Could not extract guidance snippet from z (r   )r   capex_actual_fyr7   r   20242025z-12-31r   r   capex_actualactualr*   z)Consolidated Statements of Cash Flows; FYz$ purchases of property and equipment%Purchases of property and equipment (ru   r   r+   r   capex_actual_ytdr8   r6   )r   r   r   H19M-expected_sectionz(Purchases of property and equipment YTD capex_actual_quarter)r8   r9   r   )splitry   anyr   appendr   rY   r   r   PERIOD_ENDSrs   r   itemsr   r   r   GW_PROXY_CAVEAT
setdefault)r   
html_cache	ytd_statecarry_forward_guidancer   metricsdoc_typerowsguiderW   rb   r   r   ro   capexr   r}   rq   rr   valytd_kindkindlabels                          rH   extract_from_manifest_rowr     s    #//D"E"K"KC"PQQqwwyQGQO,H!#D**?w??),7EE"
|
$C>>#D|#
3

;7
;;$\49OPKKFF3 O
4;O
 L
 :3%r,{B[A\\]^  (#Fv&Hd#H"4(EG#I(=</vV!)!1 	C%%fouc5:F(RCj$(*4&k$2"8"=+3#&!!%&JL *OsSTgUV'W/A#).$ /	2 HW$Y)>|!)!1 	C%%!(E3c
CD|#Cj $$7:	$$T2.t4$(*4&%&9$6"8"=+3#&(45G(H)QRWQXXZ[^_`Zaab'c/A#). 1	4 (X9[-[!)!1 	C%%hsE#J?;NCj$&,$2"8"=+3#&(45G(H)NsSTgUV'W/A#). K-	, Kg Rs   K%c           
          D ci c]  }t        |      | c}d!fd}	 	 	 	 	 	 	 	 	 	 	 	 	 	 d" fd} |ddd      } |ddd      }|4|2t        t        |dz  |dz  z
              } |dd|dz  d	d
d|dd       |} |ddd      }|4|2t        t        |dz  |dz  z
              }	 |dd|	dz  ddd|	dd        |ddd      }
|
;|9t        t        |
dz  |dz  z
              } |dd|dz  t        d   dd|dd        |ddd      } |ddd      }|;|9t        t        |dz  |dz  z
              } |dd|dz  t        d   dd|dd        |ddd      }|;|9t        t        |dz  |dz  z
              }	 |dd|	dz  t        d   dd|	dd        |ddd      }|;|9t        t        |dz  |dz  z
              } |dd|dz  t        d   dd|dd       t	         d        S c c}w )#Nc                P    j                  | ||f      }|rt        |d         S d S )Nr   )r   rz   )r   targetmetricr   by_keys       rH   	get_valuez&append_derived_rows.<locals>.get_value  s/    jj&&&12*-uS%&747re   c                     |df}|
v ry t         fdD        d         }|dj                  d      j                  d      }t        |d   |d    |d	|d|d
d||ddt        |      }	j	                  |	       |	
|<   y )Nr   c              3  4   K   | ]  }|d    k(  s|  yw)r   Nr   )r   rtemplate_periods     rH   r   z;append_derived_rows.<locals>.add_derived.<locals>.<genexpr>-  s     QqAn,=,PQs   r   r   r*   r   r   r   )r   r   r   r   r   r.   r   r+   )r	   r
   r   r   r   r   r   r   r   r   r   )nextr   r   r   r   )r   r	   value_br   r   r   keytemplater   r   r   r   s   `         rH   add_derivedz(append_derived_rows.<locals>.add_derived"  s     ~>&=QDQSWXYSZ[%%c*11#6#I."8,)(	 (&'+)#5"!#
& 	Csre   r   r   r   z	FY2024-H1r   r   zThttps://www.sec.gov/Archives/edgar/data/1652044/000165204424000079/goog-20240630.htmz?Derived from H1 YTD minus Q1 (SEC Q2 FY2024 10-Q cash-flow YTD)r   ru   r   r   z	FY2024-9MzThttps://www.sec.gov/Archives/edgar/data/1652044/000165204424000118/goog-20240930.htmzCDerived from 9M YTD minus H1 YTD (SEC Q3 FY2024 10-Q cash-flow YTD)r   FY2024zKDerived from FY2024 annual minus 9M YTD (SEC 10-K vs Q3 10-Q cash-flow YTD)r   r   z	FY2025-H1z?Derived from H1 YTD minus Q1 (SEC Q2 FY2025 10-Q cash-flow YTD)r   z	FY2025-9MzCDerived from 9M YTD minus H1 YTD (SEC Q3 FY2025 10-Q cash-flow YTD)r   r(   zKDerived from FY2025 annual minus 9M YTD (SEC 10-K vs Q3 10-Q cash-flow YTD)c                    | d   | d   | d   fS r   r   r   s    rH   <lambda>z%append_derived_rows.<locals>.<lambda>  s    q'8!O:LaP]N^&_ re   r   )r   strr   r  r   r  returnzfloat | None)r   r  r	   r  r   rz   r   r  r   r  r   r  r  None)r   r{   roundSEC_URL_BY_PERIODsorted)r   r   r   r   q1_24h1_24q2_m	h1_24_val	nine_m_24q3_m	annual_24q4_mq1_25h1_25	nine_m_25	annual_25r   s   `               @rH   append_derived_rowsr    s   %)*gaj!m*F8!!! ! 	!
 ! ! 
!F lL.AElK1CDEU.54564KbM3D81=	
 I,5GHI!65T)I,<<=>4KbQ3D81=	
 ,.AI!65T)I,<<=>4Kl+Y3D81=	
 lL.AElK1CDEU.54564Kl+M3D81=	
 ,5GHIY25T)EDL89:4Kl+Q3D81=	
 ,.AI!65T)I,<<=>4Kl+Y3D81=	
 $_``i +s   G8c                    | D ci c]  }|d   t         j                  |d   d      ! }}i }|D ]=  }t        |      }|j                  |      }||||<   '||d      ||d      k  s9|||<   ? t        |j	                         d       S c c}w )Nr   r   c   c                    | d   | d   | d   fS r   r   r   s    rH   r   zdedupe_rows.<locals>.<lambda>  s    q(!O*<a>NO re   r   )SOURCE_PRIORITYr   r   r  r|   )manifest_rows	extractedr   priority_by_urlbestr   existings          rH   dedupe_rowsr    s     ! 	L?..s?/CRHHO  8:D cl88C=DI3|,-@V0WWDI O s   $Bc           	     Z   |D ch c]  }|d   	 }}t        t              }t               }t        | d      D ]  \  }}||j                         z
  }|rt	        d| dt        |             |d   j                  d      st	        d| d      |d   |vrt	        d| d|d          |d	   d
k7  rt	        d| d      |j                  |d           t        |      dk  rt	        dt        |             | D cg c]  }|d   dk(  s| }	}t        |	      dk  rt	        dt        |	             |	D cg c]  }|d   dk(  s| }
}t        |
      dk  rt	        dt        |
             t        |       dk  rt	        dt        |              y c c}w c c}w c c}w )Nr   r3   )rq   zRow z missing columns: zhttps://z source_url must be httpsz source_url not in manifest: r   GOOGLz ticker must be GOOGLr      z$Need >=8 as_of_period vintages, got r
   r      z&Need >=6 capex_guidance vintages, got r	   r,   r4   z-Need >=2 FY2026 capex_guidance vintages, got    zNeed >=16 vintage rows, got )	setCANONICAL_FIELDS	enumeratekeysr   r  r   addlen)r   r  r   manifest_urlsrequiredas_of_periodsidxmissingr   guidancefy26s              rH   validate_rowsr0    s    3@@3S&@M@#$H!eMd!, 
/SSXXZ'tC5(:6'?:KLMM< ++J7tC5(ABCC|M1tC5(Ec,FWEXYZZx=G#tC5(=>??#n-.
/ =A?M@R?STUUHa1]#37G#GHHH
8}qA#h-QRRB!1_#5#AABDB
4y1}HTTUU
4y2~7D	{CDD - A  I Cs   FF#F#?F(F(c                V   t        |       }i }i }g }|D ]  }|j                  t        |||               t        ||      }t	        d |D        d       }|r|d   nd}	t	        d |D        d       }
|
r^|j                  |
d         }|t        |
d         }|||
d   <   t        d |D              s t        |
||	      }|r|j                  |       t	        d |D        d       }|rt        |      }|r|j                  |       t        ||      }t        |      }t        ||       |j                  j                  dd	       |j                  d
dd      5 }t!        j"                  |t$              }|j'                          |j)                  |       d d d        |S # 1 sw Y   |S xY w)Nc              3  @   K   | ]  }|d    dk(  r|d   dk(  r|  yw)r
   r   r	   r,   Nr   r   r   s     rH   r   zemit_rows.<locals>.<genexpr>  s2      	
#33/8Jh8V 	
s   r   r   c              3  2   K   | ]  }|d    dk(  s|  yw)r   r&   Nr   r3  s     rH   r   zemit_rows.<locals>.<genexpr>  s     MqQ{^7L%LM   r   c              3  T   K   | ]   }|d    dk(  xr |d   dk(  xr |d   dk(   " yw)r   r   r	   r,   r
   r   Nr   r3  s     rH   r   zemit_rows.<locals>.<genexpr>  sN      
  n- 5/"h.5- $445
s   &(c              3  2   K   | ]  }|d    dk(  s|  yw)r   r1   Nr   r3  s     rH   r   zemit_rows.<locals>.<genexpr>  s     ZqQ{^7Y%YZr5  T)parentsexist_okwr=   r>   r?   )
fieldnames)rI   extendr   r  r   r   rY   r   r   r   r   r  r0  parentmkdirrB   rD   
DictWriterr$  writeheader	writerows)rF   output_pathr  r   r   r  r   interim
fy26_guidecarryq1_fy26_rowrb   r   q1_callcallr   rG   writers                     rH   	emit_rowsrJ    s    "-0M!#J+-I&(I% 
%lJ	J	


 -3G	
	

 	J (2J{#uEMMMK ~~k,78<k,78D48J{<01 
 	
 
 )dEBE  'ZMZG $W-T"}i0Dt$D$&TD9			#rG		< 3CD K	 Ks   =FF(c                    t        j                  d      } | j                  dt        t               | j                  dt        t
               | j                  ddd	       | j                         }t        |j                  |j                        }t        d
t        |       d|j                          |j                  rddlm}  |        y y )Nz"Emit Alphabet forecast_vintage.csv)descriptionz
--manifest)typedefaultz--outputz--build-timeseries
store_truezAAlso regenerate capacity_timeseries.csv and company_gw_chart.html)actionhelpzWrote z	 rows to r   )main)argparseArgumentParseradd_argumentr   DEFAULT_MANIFESTDEFAULT_OUTPUT
parse_argsrJ  manifestoutputprintr(  build_timeseriesrR  )parserargsr   
build_mains       rH   rR  rR    s    $$1UVF
49IJ

~F
P  
 DT]]DKK0D	F3t9+Yt{{m
457 re   __main__)rF   r   r  list[dict[str, str]])rW   r  r  r  )rb   r  r  r  )rc   r  ri   z	list[str]r  
str | None)rb   r  r  zdict[str, tuple[str, str]])rb   r  r  zdict[str, int])rq   r  rr   r  r  r{   )
r   r  rq   r  rr   r  r   r{   r  rb  )r   r{   r  r  )N)r   r  r   rb  r  dict[str, str])r   rc  r  ztuple[str, str, str])r   rc  r	   r  r
   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   rb  r  rc  )r   rc  r  dict[str, str] | None)r   rc  rb   r  r   rb  r  rd  )
r   rc  r   rc  r   zdict[str, dict[str, int]]r   rb  r  ra  )r   ra  r  ra  )r  ra  r  ra  r  ra  )r   ra  r  ra  r  r  )rF   r   rB  r   r  ra  )r  r  )0__doc__
__future__r   rS  rD   r^   urllib.requestrP   r   pathlibr   __file__resolver=  BASE_DIRrV  rW  r$  r   rS   rx   r   r  r'   __annotations__r2   r  rI   rY   rd   rl   rs   r   r   r   r   r   r   r   r   r   r   r  r  r0  rJ  rR  __name__r   re   rH   <module>rn     s[   #  
 	   >!!#**33 22 (5 
 T
8	 
	/	/	/	/ ,(( 	c  	R
= 	c 
:9"3 / "L "VT\) "V["),( B ,
A%
4$'03$<FARK" "      	 
                     F. !% 
  	D *.	y yy )y '	y
 yxuap'# .E
E'E 
E> +&=== =@$ zF re   