+
    e"Øj(:  ã                  óˆ  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIHt ^ RIHt ^ RIHtHt ^ RIHt ^ RIHtHt ]P0                  ! R4      t]P0                  ! R	4      t0 RmtRtRt0 RmtR
t]P0                  ! R4      t  ! R R]4      t! ! R R]4      t"R R lt#R t$]%R8X  d
   ]$! 4        R# R# )a  JARVIS update server with a narrow, authenticated publisher API.

The future Windows JARVIS Asset app stages a release and then explicitly publishes it.
Only the update namespace is writable; manifest.json is moved last so Android clients never
observe a partial release.
)ÚannotationsN)Ú
formatdate)Ú
HTTPStatus)ÚSimpleHTTPRequestHandlerÚThreadingHTTPServer)ÚPath)ÚunquoteÚurlparsez"^[A-Za-z0-9][A-Za-z0-9._-]{0,159}$z!^[A-Za-z0-9][A-Za-z0-9._-]{0,79}$z it.jarvis.app.personal.ecosystemz^bytes=(\d*)-(\d*)$c                  ó.   a € ] tR t^%tR V 3R lltRtV ;t# )ÚPublisherServerc               ó    € V ^8„  d   QhRRRR/# )é   Úrootr   ÚtokenÚstr© )Úformats   "ÚkC:\Users\rarin\Documents\AndroidStudioProjects\JARVIS-0.6.33-LIVE\release\update-server\publisher_server.pyÚ__annotate__ÚPublisherServer.__annotate__&   s   € ÷ 8ñ 8¨tð 8¸Cñ 8ó    c                	óh  <€ \         SV `  W4       VP                  4       V n        V P                  R ,          P                  4       V n        V P                  R,          P                  4       V n        W@n        V P                  P                  RRR7       V P
                  P                  RRR7       R# )zjarvis-ecosystemz.stagingT©ÚparentsÚexist_okN)ÚsuperÚ__init__Úresolver   ÚliveÚstagingr   Úmkdir)ÚselfÚaddressÚhandlerr   r   Ú	__class__s   &&&&&€r   r   ÚPublisherServer.__init__&   s€   ø€ Ü‰Ñ˜Ô*Ø—L‘L“NˆŒ	à—Y‘YÐ!3Õ3×<Ñ<Ó>ˆŒ	ØŸ	™	 JÕ.×7Ñ7Ó9ˆŒØŒ
Ø�	‰	�‰ ¨tˆÔ4Ø�‰×Ñ 4°$ÐÖ7r   )r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   Ú__static_attributes__Ú__classcell__©r$   s   @r   r   r   %   s   ø† ÷8ö 8r   r   c                  óè   a € ] tR t^1t$ R]R&   RtV 3R ltV 3R ltV 3R ltR t	V 3R lt
V 3R	 lt]R
 R l4       tR tR tV 3R ltR tR tR R ltR tR tR tR t]R R l4       tR tRtV ;t# )ÚHandlerr   ÚserverNc                	óp   <€ VP                  4       P                  R 4      '       d   R# \        SV `  V4      # )ú.apkz'application/vnd.android.package-archive)ÚlowerÚendswithr   Ú
guess_type)r!   Úpathr$   s   &&€r   r4   ÚHandler.guess_type5   s-   ø€ Ø�:‰:‹<× Ñ  ×(Ò(Ù<Ü‰wÑ! $Ó'Ð'r   c                	ó$  <€ \        V P                  4      P                  p\        V P                  V P                  4      4      pVP	                  4       '       d"   V P                  R V P                  V4      4       VP                  R4      '       g=   VP                  R4      '       g&   VP                  4       P                  R4      '       d7   V P                  RR4       V P                  RR4       V P                  RR	4       VP                  4       P                  R
4      '       dG   \        \        V4      4      P                  pV P                  RRV R24       V P                  RR4       V P                  RR4       \        SV `1  4        R# )ÚETagz/manifest.jsonz/catalog.jsonú.zipúCache-Controlz.no-store, no-cache, must-revalidate, max-age=0ÚPragmazno-cacheÚExpiresÚ0r1   zContent-Dispositionzattachment; filename="Ú"zX-Content-Type-OptionsÚnosniffzAccept-RangesÚbytesN)r	   r5   r   Útranslate_pathÚis_fileÚsend_headerÚ
_file_etagr3   r2   r   Únamer   Úend_headers)r!   Úrequest_pathÚ
local_pathÚfilenamer$   s   &   €r   rF   ÚHandler.end_headers:   sI  ø€ Ü §	¡	Ó*×/Ñ/ˆÜ˜$×-Ñ-¨d¯i©iÓ8Ó9ˆ
Ø×Ñ×ÒØ×Ñ˜V T§_¡_°ZÓ%@ÔAØ× Ñ Ð!1×2Ò2°l×6KÑ6KÈO×6\Ò6\Ð`l×`rÑ`rÓ`t×`}Ñ`}ð  E÷  aFò  aFØ×Ñ˜_Ð.^Ô_Ø×Ñ˜X zÔ2Ø×Ñ˜Y¨Ô,Ø×ÑÓ×(Ñ(¨×0Ò0ÜœG LÓ1Ó2×7Ñ7ˆHØ×ÑÐ2Ð6LÈXÈJÐVWÐ4XÔYØ×ÑÐ5°yÔAØ×Ñ˜¨'Ô2Ü‰ÑÖr   c                	ó„   <€ \         SV `  ! TR \        V4      ^8”  d   \        V^,          P                  4      MR/VB  R# )Ú	directoryN)r   r   Úlenr   r   )r!   ÚargsÚkwargsr$   s   &*,€r   r   ÚHandler.__init__J   s5   ø€ Ü‰Ò˜$Ða¼sÀ4»yÈ1¼}¬#¨d°1­g¯l©lÔ*;ÐRVÐaÐZ`Ôar   c                	óX   € \        V P                  ^ ,           RW,           2RR7       R# )é    z - T©ÚflushN)ÚprintÚclient_address)r!   ÚfmtrN   s   &&*r   Úlog_messageÚHandler.log_messageM   s%   € Ü�×$Ñ$ QÕ'Ð(¨¨C­J¨<Ð8À×Er   c           	     	óÔ  <€ \        V P                  4      P                  R 8X  d'   V P                  \        P                  RRRRR^/4      # V P
                  P                  R4      '       d[   V P                  4       '       dE   V P                  4       pVe/    V P                  WP                  4       VP                  4        R# R# \        SV `5  4       #   TP                  4        i ; i)z/healthÚokTÚservicezjarvis-update-serverÚpublisherApiÚRangeN)r	   r5   Ú_jsonr   ÚOKÚheadersÚgetÚ_if_range_matchesÚ_send_range_headersÚcopyfileÚwfileÚcloser   Údo_GET©r!   Úsourcer$   s   & €r   rh   ÚHandler.do_GETP   s±   ø€ Ü�D—I‘IÓ×#Ñ# yÔ0Ø—:‘:œjŸm™m¨d°D¸)ÐE[Ð]kÐmnÐ-oÓpÐpØ�<‰<×Ñ˜G×$Ò$¨×)?Ñ)?×)AÒ)AØ×-Ñ-Ó/ˆFØÒ!ð#Ø—M‘M &¯*©*Ô5à—L‘L”NÛÜ‰w‰~ÓÐøð —L‘L•Nús   ÂC ÃC'c                	óÚ   <€ V P                   P                  R 4      '       d=   V P                  4       '       d'   V P                  4       pVe   VP	                  4        R# \
        SV `  4       # )r^   N)ra   rb   rc   rd   rg   r   Údo_HEADri   s   & €r   rm   ÚHandler.do_HEAD]   sS   ø€ Ø�<‰<×Ñ˜G×$Ò$¨×)?Ñ)?×)AÒ)AØ×-Ñ-Ó/ˆFØÒ!Ø—‘”ÙÜ‰w‰Ó Ð r   c               ó   € V ^8„  d   QhRR/# ©r   r5   r   r   )r   s   "r   r   ÚHandler.__annotate__f   s   € ÷ :ñ :˜ñ :r   c                	ó`   € V P                  4       pR VP                  R RVP                  R R 2# )r>   ÚxÚ-)ÚstatÚst_sizeÚst_mtime_ns)r5   ru   s   & r   rD   ÚHandler._file_etage   s2   € à�y‰y‹{ˆØ�4—<‘< Ð" ! D×$4Ñ$4°QÐ#7°qÐ9Ð9r   c                	óª  € V P                   P                  R R4      P                  4       pV'       g   R# \        V P	                  V P
                  4      4      pVP                  4       '       g   R# VP                  R4      '       d&   \        P                  ! WP                  V4      4      # V\        VP                  4       P                  RR7      8H  # )zIf-RangeÚ TFr>   ©Úusegmt)ra   rb   Ústripr   rA   r5   rB   Ú
startswithÚhmacÚcompare_digestrD   r   ru   Úst_mtime)r!   Ú	conditionr5   s   &  r   rc   ÚHandler._if_range_matchesj   s™   € Ø—L‘L×$Ñ$ Z°Ó4×:Ñ:Ó<ˆ	ßÙÜ�D×'Ñ'¨¯	©	Ó2Ó3ˆØ�|‰|�~Š~Ùð ×Ñ ×$Ò$Ü×&Ò& y·/±/À$Ó2GÓHÐHØœJ t§y¡y£{×';Ñ';ÀDÔIÑIÐIr   c           	     	óˆ  € \        V P                  V P                  4      4      pVP                  4       '       g#   V P	                  \
        P                  R 4       R# VP                  4       P                  p\        P                  V P                  P                  RR4      P                  4       4      pRpV'       d¡   V^ 8”  dš   VP                  4       w  rVV'       g9   \        T;'       g    R4      pV^ 8”  d   \!        ^ W',
          4      V^,
          3pMG\        V4      pV'       d   \        V4      MV^,
          p	W‚8  d   W˜8¼  d   V\#        W’^,
          4      3pVfY   V P%                  \
        P&                  4       V P)                  RRV 24       V P)                  RR4       V P+                  4        R# Vw  r‰VP-                  R4      p
V
P/                  V4       W˜,
          ^,           V n        V P%                  \
        P2                  4       V P)                  R	V P5                  \7        V4      4      4       V P)                  RR
V RV	 RV 24       V P)                  R\7        V P0                  4      4       V P)                  R\9        VP                  4       P:                  RR7      4       V P+                  4        V
# )zFile not foundNr^   rz   r=   zContent-Rangezbytes */úContent-LengthÚrbúContent-Typezbytes rt   Ú/zLast-ModifiedTr{   )r   rA   r5   rB   Ú
send_errorr   Ú	NOT_FOUNDru   rv   ÚRANGE_HEADERÚ	fullmatchra   rb   r}   ÚgroupsÚintÚmaxÚminÚsend_responseÚREQUESTED_RANGE_NOT_SATISFIABLErC   rF   ÚopenÚseekÚrange_remainingÚPARTIAL_CONTENTr4   r   r   r�   )r!   r5   ÚsizeÚmatchÚselectedÚfirstÚlastÚsuffixÚstartÚendrj   s   &          r   rd   ÚHandler._send_range_headersw   s   € Ü�D×'Ñ'¨¯	©	Ó2Ó3ˆØ�|‰|�~Š~Ø�O‰OœJ×0Ñ0Ð2BÔCÙØ�y‰y‹{×"Ñ"ˆÜ×&Ñ& t§|¡|×'7Ñ'7¸ÀÓ'D×'JÑ'JÓ'LÓMˆØˆß�T˜A”XØŸ,™,›.‰KˆEßÜ˜TŸ[˜[ SÓ)�Ø˜A”:Ü # A t¥}Ó 5°t¸aµxÐ@�Høä˜E›
�ß#'”c˜$”i¨T°A­X�Ø”< C¤LØ %¤s¨3°qµÓ'9Ð:�HØÒØ×Ñœz×IÑIÔJØ×Ñ˜_°¸¸Ð.?Ô@Ø×ÑÐ-¨sÔ3Ø×ÑÔÙØ‰
ˆØ—‘˜4“ˆØ�‰�EÔØ"�{¨Q�ˆÔØ×Ñœ:×5Ñ5Ô6Ø×Ñ˜¨¯©¼¸T»Ó)CÔDØ×Ñ˜¨F°5°'¸¸3¸%¸qÀÀÐ*GÔHØ×ÑÐ)¬3¨t×/CÑ/CÓ+DÔEØ×Ñ˜¬*°T·Y±Y³[×5IÑ5IÐRVÔ*WÔXØ×ÑÔØˆr   c                	ó  <€ V P                   pVf   \        SV `	  W4      #  V^ 8”  dJ   VP                  \	        RV4      4      pV'       g   M%VP                  V4       V\        V4      ,          pKP  R V n         R #   R T n         i ; i)Ni   )r•   r   re   Úreadr�   ÚwriterM   )r!   rj   Ú
outputfileÚ	remainingÚchunkr$   s   &&&  €r   re   ÚHandler.copyfileœ   sx   ø€ Ø×(Ñ(ˆ	ØÒÜ‘7Ñ# FÓ7Ð7ð	(Ø˜a”-ØŸ™¤C¨
°IÓ$>Ó?�ßØØ× Ñ  Ô'ØœS ›ZÕ'’	à#'ˆDÖ ø 4ˆDÕ ús   ¢AA; Á;	Bc                	óØ  € V P                  4       '       g#   V P                  \        P                  R R/4      # V P	                  R4      pVe   \        V4      ^8w  d#   V P                  \        P                  R R/4      # Vw  r#\        P                  V4      '       d   V P                  V4      '       g#   V P                  \        P                  R R/4      # V P                  4       pVP                  4       P                  R4      '       d   \        M\        pVe   V^8  g   WE8”  d%   V P                  \        P                   R RRV/4      # V P"                  P$                  V,          P'                  4       pVP(                  V P"                  P$                  8w  d#   V P                  \        P                  R R/4      # VP+                  R	R	R
7       Wc,          P'                  4       pVP(                  V8w  d#   V P                  \        P                  R R/4      # \,        P.                  ! VRR7      ;_uu_ 4       pTp	V	'       d¤   V P0                  P3                  \5        RV	4      4      p
V
'       gR   \7        VP8                  4      P;                  R	R7       V P                  \        P                  R R/4      uuRRR4       # VP=                  V
4       V	\        V
4      ,          p	K«  \7        VP8                  4      pRRR4       \>        P@                  ! XV4       V P                  \        PB                  RR	RVRVRVRV PE                  V4      RR/4      #   + '       g   i     Lb; i)ÚerrorÚunauthorizedz/publisher/v1/stage/NÚunknown_endpointÚinvalid_nameÚinvalid_sizeÚlimitÚinvalid_releaseTr   Úinvalid_pathF)ÚdirÚdelete)Ú
missing_okÚincomplete_bodyr[   Ú	releaseIdÚfiler@   Úsha256ÚstateÚstaged)r1   r9   é   )#Ú_authorizedr_   r   ÚUNAUTHORIZEDÚ_partsrM   rŠ   ÚSAFE_RELEASErŒ   Ú_valid_filenameÚBAD_REQUESTÚ_content_lengthr2   r3   Ú	MAX_BYTESÚMAX_TEXT_BYTESÚREQUEST_ENTITY_TOO_LARGEr/   r   r   Úparentr    ÚtempfileÚNamedTemporaryFileÚrfiler¡   r�   r   rE   Úunlinkr¢   ÚosÚreplaceÚCREATEDÚ_sha256)r!   ÚpartsÚ
release_idrI   Úlengthr­   ÚfolderÚdestinationÚtempr¤   r¥   Ú	temp_paths   &           r   Údo_PUTÚHandler.do_PUTª   s©  € Ø×Ñ×!Ò!Ø—:‘:œj×5Ñ5¸ÀÐ7PÓQÐQØ—‘Ð2Ó3ˆØŠ=œC ›J¨!œOØ—:‘:œj×2Ñ2°WÐ>PÐ4QÓRÐRØ$Ñˆ
Ü×%Ñ% j×1Ò1¸×9MÑ9MÈh×9WÒ9WØ—:‘:œj×4Ñ4°wÀÐ6OÓPÐPØ×%Ñ%Ó'ˆØ%Ÿ^™^Ó-×6Ñ6Ð7G×HÒH•	ÌnˆØŠ>˜V aœZ¨6¬>Ø—:‘:œj×AÑAÀGÈ^Ð]dÐfkÐClÓmÐmØ—+‘+×%Ñ%¨
Õ2×;Ñ;Ó=ˆØ�=‰=˜DŸK™K×/Ñ/Ô/Ø—:‘:œj×4Ñ4°wÐ@QÐ6RÓSÐSØ�‰˜T¨DˆÔ1ØÕ(×1Ñ1Ó3ˆØ×Ñ Ô'Ø—:‘:œj×4Ñ4°wÀÐ6OÓPÐPÜ×(Ò(¨V¸E×BÕBÀdØˆIßØŸ
™
Ÿ™¬¨K¸Ó(CÓD�ßÜ˜Ÿ™“O×*Ñ*°dÐ*Ô;ØŸ:™:¤j×&<Ñ&<¸wÐHYÐ>ZÓ[÷ CÒBð —
‘
˜5Ô!ØœS ›ZÕ'’	Ü˜TŸY™Y›ˆI÷ Cô 	�
Š
�9˜kÔ*Ø�z‰zœ*×,Ñ,Ø�$Ø˜Ø�HØ�VØ�d—l‘l ;Ó/Ø�Xð/
ó ð 	÷ C×Bús   È<
MÉA3MË:MÍM)	c                	ón  € V P                  4       '       g#   V P                  \        P                  R R/4      # V P	                  R4      pVe3   \        V4      ^8w  g#   \        P                  V^ ,          4      '       g#   V P                  \        P                  R R/4      # V^ ,          pV P                  P                  V,          P                  4       pVP                  V P                  P                  8w  g   VP                  4       '       g#   V P                  \        P                  R R/4      #  V P                  V4      w  rEVP                  4        Fi  pVP!                  4       '       g   K  VP"                  R8w  g   K.  \$        P&                  ! W`P                  P(                  VP"                  ,          4       Kk  	  \$        P&                  ! VR,          V P                  P(                  R,          4       \*        P,                  ! VRR7       V P                  \        P.                  R	RR
RRVRVR,          R,          RVR,          R,          RV/4      #   \0        \2        \4        P6                  3 d8   pT P                  \        P8                  R RR\;        T4      /4      u Rp?# Rp?ii ; i)r¨   r©   z/publisher/v1/publish/Nrª   Úrelease_not_stagedúmanifest.jsonT)Úignore_errorsr[   r·   Ú	publishedr´   ÚversionCodeÚandroidÚversionNameÚapkr®   Údetail)rº   r_   r   r»   r¼   rM   r½   rŒ   rŠ   r/   r   r   rÄ   Úis_dirÚ_validate_releaseÚiterdirrB   rE   rÉ   rÊ   r   ÚshutilÚrmtreer`   Ú
ValueErrorÚKeyErrorÚjsonÚJSONDecodeErrorr¿   r   )r!   rÍ   rÎ   rÐ   ÚmanifestÚapk_nameÚitemÚexcs   &       r   Údo_POSTÚHandler.do_POSTÒ   s	  € Ø×Ñ×!Ò!Ø—:‘:œj×5Ñ5¸ÀÐ7PÓQÐQØ—‘Ð4Ó5ˆØŠ=œC ›J¨!œO´<×3IÑ3IÈ%ÐPQÍ(×3SÒ3SØ—:‘:œj×2Ñ2°WÐ>PÐ4QÓRÐRØ˜1•Xˆ
Ø—+‘+×%Ñ%¨
Õ2×;Ñ;Ó=ˆØ�=‰=˜DŸK™K×/Ñ/Ô/°v·}±}·²Ø—:‘:œj×2Ñ2°WÐ>RÐ4SÓTÐTð	hØ!%×!7Ñ!7¸Ó!?ÑˆHØŸ™Ö(�Ø—<‘<—>”> d§i¡i°?Ö&BÜ—J’J˜t§[¡[×%5Ñ%5¸¿	¹	Õ%AÖBñ )ô �JŠJ�v Õ/°·±×1AÑ1AÀOÕ1SÔTÜ�MŠM˜&°Õ5Ø—:‘:œjŸm™mØ�dØ˜Ø˜ZØ˜x¨	Õ2°=ÕAØ˜x¨	Õ2°=ÕAØ�xð.ó ð øô œH¤d×&:Ñ&:Ð;ô 	hØ—:‘:œj×4Ñ4°wÐ@QÐS[Ô]`ÐadÓ]eÐ6fÓgÕgûð	hús+   Ä49I Å2I ÆCI É J4É=,J/Ê)J4Ê/J4c               ó   € V ^8„  d   QhRR/# )r   rÐ   r   r   )r   s   "r   r   rq   î   s   € ÷ !"ñ !"¨ñ !"r   c                	ó  € VP                  4        Uu0 uF&  q"P                  4       '       g   K  VP                  kK(  	  pp\        V,
          pV'       d+   \	        R RP                  \        V4      4      ,           4      h\        P                  ! VR,          P                  RR7      4      pVR,          pVP                  R4      \        8w  d   \	        R4      h\        VP                  R4      \        4      '       d   VR,          ^8  d   \	        R	4      hV P                  P                  R,          pVP                  4       '       d”   \        P                  ! VP                  RR7      4      pVP                  R/ 4      p	V	P                  R4      \        8X  dB   V	P                  R^ 4      p
\        V
\        4      '       d   VR,          V
8:  d   \	        R
4      hVP                  RR4      pV P!                  V4      '       d&   VP#                  4       P%                  R4      '       g   \	        R4      hW,          pVP                  4       '       g   \	        R4      h\'        VP                  RR4      4      P#                  4       p\(        P*                  ! RV4      '       d,   \,        P.                  ! WÐP1                  V4      4      '       g   \	        R4      hVP                  R4      R8w  g   VP                  R4      R8w  d   \	        R4      h\        P                  ! VR,          P                  RR7      4       VR,          P                  RR7      P3                  4       '       g   \	        R4      hW[3# u upi )z	missing: z, rØ   úutf-8©ÚencodingrÜ   ÚpackageNamezunexpected packageNamerÛ   zinvalid versionCodezGversionCode must be greater than the currently published Personal buildÚurlrz   r1   zinvalid APK filenamezAPK not stagedr¶   z[0-9a-f]{64}zAPK sha256 mismatchÚ
summaryUrlúrelease-notes.mdÚ
detailsUrlúchanges.jsonz4release document paths must be local canonical nameszempty release notes)râ   rB   rE   ÚREQUIREDrå   ÚjoinÚsortedrç   ÚloadsÚ	read_textrb   ÚPERSONAL_PACKAGEÚ
isinstancerŽ   r/   r   r¾   r2   r3   r   ÚrerŒ   r   r€   rÌ   r}   )r!   rÐ   rë   ÚnamesÚmissingré   rÜ   Úcurrent_manifest_pathÚcurrentÚcurrent_androidÚcurrent_coderê   rÞ   Úexpecteds   &&            r   rá   ÚHandler._validate_releaseî   s²  € Ø'-§~¡~Ô'7ÓJÑ'7˜t¿<¹<¿>”�—”Ñ'7ˆÐJÜ˜UÕ"ˆßÜ˜[¨4¯9©9´V¸G³_Ó+EÕEÓFÐFÜ—:’:˜v¨Õ7×BÑBÈGÐBÓTÓUˆØ˜9Õ%ˆØ�;‰;�}Ó%Ô)9Ô9ÜÐ5Ó6Ð6Ü˜'Ÿ+™+ mÓ4´c×:Ò:¸gÀmÕ>TÐWXÔ>XÜÐ2Ó3Ð3Ø $§¡× 0Ñ 0°?Õ BÐØ ×(Ñ(×*Ò*Ü—j’jÐ!6×!@Ñ!@È'Ð!@Ó!RÓSˆGØ%Ÿk™k¨)°RÓ8ˆOØ×"Ñ" =Ó1Ô5EÔEØ.×2Ñ2°=À!ÓD�Ü! ,´×4Ò4¸ÀÕ8NÐR^Ô8^Ü$Ð%nÓoÐoØ—;‘;˜u bÓ)ˆØ×#Ñ# H×-Ò-°X·^±^Ó5E×5NÑ5NÈv×5VÒ5VÜÐ3Ó4Ð4ØÕˆØ�{‰{�}Š}ÜÐ-Ó.Ð.Ü�w—{‘{ 8¨RÓ0Ó1×7Ñ7Ó9ˆÜ�|Š|˜O¨X×6Ò6¼d×>QÒ>QÐRZ×\hÑ\hÐilÓ\m×>nÒ>nÜÐ2Ó3Ð3Ø�;‰;�|Ó$Ð(:Ô:¸g¿k¹kÈ,Ó>WÐ[iÔ>iÜÐSÓTÐTÜ�
Š
�F˜^Õ+×6Ñ6ÀÐ6ÓHÔIØÐ+Õ+×6Ñ6ÀÐ6ÓH×NÑN×PÒPÜÐ2Ó3Ð3ØÐ!Ð!ùòA Ks
   “M<¯M<c                	óÞ   € V P                   P                  R R4      pRpVP                  V4      ;'       d8    \        P                  ! V\        V4      R V P                  P                  4      # )ÚAuthorizationrz   zBearer N)ra   rb   r~   r   r€   rM   r/   r   )r!   ÚheaderÚprefixs   &  r   rº   ÚHandler._authorized  s[   € Ø—‘×!Ñ! /°2Ó6ˆØˆØ× Ñ  Ó(×iÐi¬T×-@Ò-@ÀÌÈFËÈÐAUÐW[×WbÑWb×WhÑWhÓ-iÐir   c                	óú   € \        \        V P                  4      P                  4      pVP                  V4      '       g   R # V\	        V4      R  P                  R4       Uu. uF  q3'       g   K  VNK  	  up# u upi )Nrˆ   )r   r	   r5   r~   rM   Úsplit)r!   r  r5   Úparts   &&  r   r¼   ÚHandler._parts  sa   € Ü”x §	¡	Ó*×/Ñ/Ó0ˆØ�‰˜v×&Ò&ÙØ!%¤c¨&£k lÐ!3×!9Ñ!9¸#Ô!>ÓGÑ!>˜Ã$—�Ñ!>ÑGÐGùÒGs   Á!	A8Á/A8c                	ó¢   € \        \        P                  V4      4      ;'       d+    \        V4      P                  P                  4       \        9   # )N)ÚboolÚ	SAFE_NAMErŒ   r   rœ   r2   ÚALLOWED_SUFFIXES)r!   rE   s   &&r   r¾   ÚHandler._valid_filename  s9   € Ü”I×'Ñ'¨Ó-Ó.×`Ð`´4¸³:×3DÑ3D×3JÑ3JÓ3LÔP`Ñ3`Ð`r   c                	ór   €  \        V P                  P                  R R4      4      #   \         d     R# i ; i)r…   rz   N)rŽ   ra   rb   rå   )r!   s   &r   rÀ   ÚHandler._content_length  s6   € ð	Ü�t—|‘|×'Ñ'Ð(8¸"Ó=Ó>Ð>øÜô 	Úð	ús   ‚$' §6µ6c               ó   € V ^8„  d   QhRR/# rp   r   )r   s   "r   r   rq   &  s   € ÷ "ñ "�dñ "r   c                	ó&  a€ \         P                  ! 4       pV P                  R 4      ;_uu_ 4       o\        V3R lR4       F  pVP	                  V4       K  	  RRR4       VP                  4       #   + '       g   i     TP                  4       # ; i)r†   c                 ó&   <€ S P                  R4      # )i   r¹   )r¡   )Ústreams   €r   Ú<lambda>Ú!Handler._sha256.<locals>.<lambda>)  s   ø€  f§k¡k°+Ô&>r   r   N)Úhashlibr¶   r“   ÚiterÚupdateÚ	hexdigest)r5   Údigestr¥   r  s   &  @r   rÌ   ÚHandler._sha256%  sl   ø€ ä—’Ó!ˆØ�Y‰Y�t�_Œ_ ÜÔ>ÀÖD�Ø—‘˜eÖ$ñ E÷ ð ×ÑÓ!Ð!÷ Ž_ð ×ÑÓ!Ð!ús   °)A1Á1B	c                	ó\  € \         P                  ! VR R7      P                  R4      pV P                  V4       V P	                  RR4       V P	                  R\        \        V4      4      4       V P	                  RR4       V P                  4        V P                  P                  V4       R# )	F)Úensure_asciirñ   r‡   zapplication/json; charset=utf-8r…   r:   zno-storeN)
rç   ÚdumpsÚencoder‘   rC   r   rM   rF   rf   r¢   )r!   ÚstatusÚpayloadÚbodys   &&& r   r_   ÚHandler._json-  sƒ   € Ü�zŠz˜'°Ô6×=Ñ=¸gÓFˆØ×Ñ˜6Ô"Ø×Ñ˜Ð)JÔKØ×ÑÐ)¬3¬s°4«y«>Ô:Ø×Ñ˜¨*Ô5Ø×ÑÔØ�
‰
×Ñ˜Ör   )r•   )r&   r'   r(   r)   Ú__annotations__r•   r4   rF   r   rX   rh   rm   ÚstaticmethodrD   rc   rd   re   rÔ   rí   rá   rº   r¼   r¾   rÀ   rÌ   r_   r*   r+   r,   s   @r   r.   r.   1   sš   ø‡ ØÓØ€Oõ(õ
õ bòFõ õ!ð ô:ó ð:òJò#õJ(ò&òPhõ8!"òFjò
Hòaòð ô"ó ð"÷ð r   r.   c               ó    € V ^8„  d   QhRRRR/# )r   r5   r   Úreturnr   r   )r   s   "r   r   r   7  s   € ÷ ñ �Tð ˜cñ r   c                ó0  € V P                   P                  R R R7       V P                  4       '       g(   V P                  \        P
                  ! ^04      RR7       V P                  RR7      P                  4       p\        V4      ^ 8  d   \        R4      hV# )Tr   rñ   rò   z3publisher token must contain at least 32 characters)
rÄ   r    ÚexistsÚ
write_textÚsecretsÚtoken_urlsaferþ   r}   rM   Ú
SystemExit)r5   r   s   & r   Ú
token_fromr8  7  st   € Ø‡K�K×Ñ˜d¨TÐÔ2Ø�;‰;�=Š=Ø�‰œ×-Ò-¨bÓ1¸GˆÔDØ�N‰N GˆNÓ,×2Ñ2Ó4€EÜ
ˆ5ƒz�B„ÜÐNÓOÐOØ€Lr   c                 ó  € \         P                  ! 4       p V P                  R \        \        \        4      P                  4       P                  R7       V P                  RRR7       V P                  R\        RR7       V P                  R\        \        \        P                  P                  R\        \        P                  ! 4       4      4      4      R	,          R
,          R,          R7       V P                  4       p\        VP                  VP                   3\"        VP$                  \'        VP(                  4      4      p\+        RVP                   RVP                    RVP$                   2RR7       VP-                  4        R# )z--root)ÚtypeÚdefaultz--hostz	127.0.0.1)r;  z--porti["  z--token-fileÚLOCALAPPDATAÚJARVISzupdate-serverzpublisher.tokenzJARVIS update server on http://Ú:z; root=TrS   N)ÚargparseÚArgumentParserÚadd_argumentr   Ú__file__r   rÄ   rŽ   rÉ   Úenvironrb   r   ÚhomeÚ
parse_argsr   ÚhostÚportr.   r   r8  Ú
token_filerU   Úserve_forever)ÚparserrN   r/   s      r   ÚmainrK  A  s)  € Ü×$Ò$Ó&€FØ
×Ñ˜¤t´T¼(³^×5KÑ5KÓ5M×5TÑ5TÐÔUØ
×Ñ˜¨+ÐÔ6Ø
×Ñ˜¤s°DÐÔ9Ø
×Ñ˜¬T¼4ÄÇ
Á
ÇÁØœœDŸIšI›KÓ(óA*ó <+Ø-5õ<6Ø8Gõ<HØJ[õ<\Ðô ]à×ÑÓ€DÜ˜dŸi™i¨¯©Ð3´W¸d¿i¹iÌÐTX×TcÑTcÓIdÓe€FÜ	Ð+¨D¯I©I¨;°a¸¿	¹	°{À'È&Ï+É+ÈÐ
WÐ_cÕdØ
×ÑÖr   Ú__main__>   ú.mdr1   ú.txtr9   ú.jsoni  À+i    >   rù   rØ   r÷   )&Ú__doc__Ú
__future__r   r?  r   r   rç   rÉ   r  r5  rã   rÅ   Úemail.utilsr   Úhttpr   Úhttp.serverr   r   Úpathlibr   Úurllib.parser   r	   Úcompiler  r½   r  rÁ   rÂ   rú   rÿ   r‹   r   r.   r8  rK  r&   r   r   r   Ú<module>rX     s¾   ðñõ #ã Û Û Û Û 	Û 	Û Û Û Ý "Ý ß EÝ ß *ð �JŠJÐ<Ó=€	Ø�zŠzÐ>Ó?€Ú;Ð Ø€	Ø €Ú@€Ø5Ð Ø�zŠzÐ0Ó1€ô	8Ð)ô 	8ôCÐ&ô CõLò
ð ˆzÔÙ†Fñ r   