Files
turboquant/scripts/__pycache__/upstream_watch.cpython-312.pyc

123 lines
13 KiB
Plaintext
Raw Normal View History

<EFBFBD>
<00><><EFBFBD>i #<00><00><><00>dZddlZddlZddlZddlZddlZddlZddlmZm Z m
Z
ddl m Z gd<05>Z dddd <09>Zdd
<EFBFBD>Zdd <0B>Zdd <0C>Zdd <0A>Zd<0E>Zd<0F>Zedk(re<14>yy)u<>
upstream_watch.py — Monitor upstream llama.cpp and Ollama for TurboQuant support.
Checks GitHub for:
1. llama.cpp PRs/issues mentioning TurboQuant, PolarQuant, QJL
2. Ollama release notes mentioning KV cache types
3. ggml commits adding new KV cache types
Usage:
python3 scripts/upstream_watch.py # generate report
python3 scripts/upstream_watch.py --json # machine-readable output
python3 scripts/upstream_watch.py --since 7d # check last 7 days
<EFBFBD>N)<03>datetime<6D> timedelta<74>timezone)<01>Path)<05>
turboquant<EFBFBD>
polarquant<EFBFBD>qjlzkv cache quant<6E>kv_type<70>ggerganov/llama.cppzggerganov/ggmlz ollama/ollama)z llama.cpp<70>ggml<6D>ollamac<00><><00>d|<00><00>}ddd<04>}|rd|<01><00>|d<tjj||<03><07>} tjj|d<08> <09>}t j
|j <00><00>S#tjj$r;}|jd
k(r
d d
d <0C>cYd}~St|<06>|jd <0C>cYd}~Sd}~wt$r}d t|<06>icYd}~Sd}~wwxYw)Nzhttps://api.github.comzapplication/vnd.github.v3+jsonzturboquant-watch)<02>Acceptz
User-Agentztoken <20> Authorization)<01>headers<72>)<01>timeouti<74><00> rate_limited)<02>error<6F>statusr) <0C>urllib<69>request<73>Request<73>urlopen<65>json<6F>loads<64>readr<00> HTTPError<6F>code<64>str<74> Exception)<07>path<74>token<65>urlr<00>req<65>resp<73>es <20>scripts/upstream_watch.py<70>
github_apir)$s<><00><00> "<22>4<EFBFBD>&<26>
)<29>C<EFBFBD>9<>I[<5B>\<5C>G<EFBFBD> <0C>%+<2B>E<EFBFBD>7<EFBFBD>#3<><07><0F> <20>
<10>.<2E>.<2E>
<20>
<20><13>g<EFBFBD>
<20>
6<EFBFBD>C<EFBFBD>!<21><15>~<7E>~<7E>%<25>%<25>c<EFBFBD>2<EFBFBD>%<25>6<><04><13>z<EFBFBD>z<EFBFBD>$<24>)<29>)<29>+<2B>&<26>&<26><> <11><<3C><<3C> !<21> !<21>3<> <0C>6<EFBFBD>6<EFBFBD>S<EFBFBD>=<3D>+<2B>s<EFBFBD>;<3B> ;<3B><1C>Q<EFBFBD><16>1<EFBFBD>6<EFBFBD>6<EFBFBD>2<>2<><32> <14>!<21><17><13>Q<EFBFBD><16> <20> <20><>!<21>s<<00>AA;<00>;C1<03>C<03>+C1<03>1C<03>C1<03> C1<03> C,<03>&C1<03>,C1c<00><><00>g}|D]<5D>}d|<00>d|<05>d|<02><00>}tjj|<06>}d|<07>d<05>}t||<03>} d| vr|j | d||d<07><03><00>\| j dg<00>D]O}
|j |||
d |
d
|
d |
d |
d d|
v|
j dg<00>D<00> cgc]} | d<00><02> c} d<11> <09><00>Q<00><>|Scc} w)Nzrepo:<3A> z created:>=z/search/issues?q=z#&sort=created&order=desc&per_page=5r)r<00>term<72>repo<70>items<6D>number<65>title<6C>html_url<72>state<74>
created_at<EFBFBD> pull_request<73>labels<6C>name) r-r,r/r0r$r2<00>created<65>is_prr5)r<00>parse<73>quoter)<00>append<6E>get) r-<00>terms<6D>
since_dater#<00>findingsr,<00>query<72> encoded_qr$<00>result<6C>item<65>ls r(<00> search_reporE5s<00><00><11>H<EFBFBD><15><0F><04><17><04>v<EFBFBD>Q<EFBFBD>t<EFBFBD>f<EFBFBD>K<EFBFBD>
<EFBFBD>|<7C><<3C><05><1A>L<EFBFBD>L<EFBFBD>&<26>&<26>u<EFBFBD>-<2D> <09>!<21>)<29><1B>,O<>P<><03><1B>C<EFBFBD><15>'<27><06> <12>f<EFBFBD> <1C> <14>O<EFBFBD>O<EFBFBD>f<EFBFBD>W<EFBFBD>o<EFBFBD>t<EFBFBD>T<EFBFBD>R<> S<> <14><1A>J<EFBFBD>J<EFBFBD>w<EFBFBD><02>+<2B> <0F>D<EFBFBD> <14>O<EFBFBD>O<EFBFBD><1C>d<EFBFBD>d<EFBFBD>8<EFBFBD>n<EFBFBD><1D>g<EFBFBD><1D>t<EFBFBD>J<EFBFBD>/?<3F><1D>g<EFBFBD><1D>4<EFBFBD> <0C>3E<33>'<27>4<EFBFBD>/<2F>.2<EFBFBD>h<EFBFBD>h<EFBFBD>x<EFBFBD><12>.D<>E<><11>1<EFBFBD>V<EFBFBD>9<EFBFBD>E<> <0E> <0F> <0F><0F> <14>O<EFBFBD><4F>Fs<00>. C c <00><><00>d|<00>d<02>}t||<01>}t|t<00>r d|vrd|digSg}|D]<5D>}|jd<04>xsdj <00>}|jd<06>xsdj <00>}|dz|z}dD<00> cgc] } | |vs<01>| <09><02> }
} |
s<01>h|j |d |d
|jdd<05>|d |d |
|r|dd ndd<0E><08><00><>|Scc} w)Nz/repos/z/releases?per_page=5r<00>body<64>r6r+)rrr <00>kv cacher
<00>release<73>tag_namer1<00> published_ati,)r-<00>type<70>tagr6r$<00> published<65> matched_terms<6D>snippet)r)<00>
isinstance<EFBFBD>dictr<<00>lowerr;) r-r#r$<00>releasesr?rJrGr6<00>text<78>t<>matcheds r(<00>check_releasesrYJs<00><00> <13>D<EFBFBD>6<EFBFBD>-<2D>
.<2E>C<EFBFBD><19>#<23>u<EFBFBD>%<25>H<EFBFBD><11>(<28>D<EFBFBD>!<21>g<EFBFBD><18>&9<><18>(<28>7<EFBFBD>+<2B>,<2C>-<2D>-<2D><11>H<EFBFBD><1B> <0F><07><17> <0B> <0B>F<EFBFBD>#<23>)<29>r<EFBFBD>0<>0<>2<><04><17> <0B> <0B>F<EFBFBD>#<23>)<29>r<EFBFBD>0<>0<>2<><04><13>c<EFBFBD>z<EFBFBD>D<EFBFBD> <20><04>X<>f<><11>\]<5D>ae<61>\e<>1<EFBFBD>f<><07>f<> <12> <14>O<EFBFBD>O<EFBFBD><1C>i<EFBFBD><07>
<EFBFBD>8K<EFBFBD><1F> <0B> <0B>F<EFBFBD>B<EFBFBD>/<2F><07>
<EFBFBD>8K<EFBFBD>$<24>^<5E>4<>w<EFBFBD>)-<2D>4<EFBFBD><04><13>:<3A>2<EFBFBD> <0E> <0F> <0F> <14>O<EFBFBD><4F>gs <00> C<06>Cc<00>d<00>td|<00>}td|<00>}ddd<05>}t|t<00>rD|rB|dddd|d <|dd
d d |d <|dd
djd<0F>ddd|d<t|t<00>rD|rB|dddd|d<|dd
d d |d<|dd
djd<0F>ddd|d<d |vrfd|vrbt j
|d j dd<16><00>}t j
|dj dd<16><00>}||z
j|d<|S)Nz-/repos/ggerganov/llama.cpp/commits?per_page=1z5/repos/TheTom/llama-cpp-turboquant/commits?per_page=1zTheTom/llama-cpp-turboquantr )<02>fork<72>upstreamr<00>sha<68><00> upstream_sha<68>commit<69> committer<65>date<74> upstream_date<74>message<67>
<EFBFBD>d<00>upstream_message<67>fork_sha<68> fork_date<74> fork_message<67>Zz+00:00<30> days_behind)r)rR<00>list<73>splitr<00> fromisoformat<61>replace<63>days)r#r\r[rB<00>u<>fs r(<00>check_fork_statusrt_sx<00><00><19>I<>5<EFBFBD>Q<>H<EFBFBD> <15>M<>u<EFBFBD> U<>D<EFBFBD>3<>AV<41> W<>F<EFBFBD><11>(<28>D<EFBFBD>!<21>h<EFBFBD>!)<29>!<21><1B>U<EFBFBD>!3<>B<EFBFBD>Q<EFBFBD>!7<><06>~<7E><1E>"*<2A>1<EFBFBD>+<2B>h<EFBFBD>"7<> <0B>"D<>V<EFBFBD>"L<><06><EFBFBD><1F>%-<2D>a<EFBFBD>[<5B><18>%:<3A>9<EFBFBD>%E<>%K<>%K<>D<EFBFBD>%Q<>RS<52>%T<>UY<55>VY<56>%Z<><06>!<21>"<22><11>$<24><04><1D>$<24>!<21>!<21>W<EFBFBD>U<EFBFBD>^<5E>B<EFBFBD>Q<EFBFBD>/<2F><06>z<EFBFBD><1A>"<22>1<EFBFBD>g<EFBFBD>h<EFBFBD>/<2F> <0B><<3C>V<EFBFBD>D<><06>{<7B><1B>!%<25>a<EFBFBD><17><18>!2<>9<EFBFBD>!=<3D>!C<>!C<>D<EFBFBD>!I<>!<21>!L<>T<EFBFBD>c<EFBFBD>!R<><06>~<7E><1E><16>&<26> <20>[<5B>F<EFBFBD>%:<3A> <14> "<22> "<22>6<EFBFBD>/<2F>#:<3A>#B<>#B<>3<EFBFBD><08>#Q<> R<><01> <14> "<22> "<22>6<EFBFBD>+<2B>#6<>#><3E>#><3E>s<EFBFBD>H<EFBFBD>#M<> N<><01>!"<22>Q<EFBFBD><15> <0C> <0C><06>}<7D><1D> <11>M<EFBFBD>c<00><><00>
<EFBFBD>tjtj<00>}dd|j d<03><00><00>d|<03><00>dg}t <00>}g}g}|D]I<00>
d<06>
vr|j <00>
<EFBFBD><00><19>
d<00>
df} | |vs<01>(|j| <09>|j <00>
<EFBFBD><00>K|j d <09>|D<00>
<EFBFBD>
cgc]<00>
t<00>
fd
<EFBFBD>d D<00><00>s<01><18>
<EFBFBD><02>} }
| rb|j d t| <0B><00>d <0A><03>| ddD];<00>
<EFBFBD>
drdnd} |j d| <0C>d<13>
d<00>d<14>
d<00>d<16>
ddd<00>d<19>
d<00>d<1B> <0B><00>=n"|j d<1C>|j d<1D>|j d<05>|D<00>
<EFBFBD>
cgc]<00>
t<00>
fd<1E>dD<00><00>s<01><18>
<EFBFBD><02>} }
| rk|j d t| <0A><00>d!<21><03>| ddD]4<00>
<EFBFBD>
drdnd} |j d| <0C>d<13>
d<00>d<14>
d<00>d<16>
ddd<00><00><08><00>6|j d<05>|j d"<22>|rrtd#<23>|D<00><00>s`|D<00>cgc]}|jd$<24>s<01>|<0E><02>}}|r+|D]%}|j d|d%<00>d|d<00>d&|d$<00><00><06><00>'n#|j d'<27>n|j d(<28>|j d<05>|j d)<29>d|vr<>|j d*|jd+d,<2C><00>d-|jd.d,<2C><00><00><04>|j d/|jd0d,<2C><00>d-|jd1d,<2C><00><00><04>d2|vr#|d2}|j d3|d4krd5n|<10>d6<64><02><00><02>|j d<05>|j d7<64>| r>| D<00>
cgc] }
|
dd8k(s<01> |
<EFBFBD><02>}}
|r|j d9<64>n#|j d:<3A>n|j d;<3B>d<j|<05>Scc}
wcc}
wcc}wcc}
w)=Nz"# TurboQuant Upstream Watch Reportz
Generated: z%Y-%m-%d %H:%M UTCzMonitoring since: rHrr-r/z## Upstream Landing Statusc3<00>H<00>K<00>|]}|<01>dj<00>v<00><01><00>y<01>w<01>r,N<>rT<00><03>.0rWrss <20>r(<00> <genexpr>z"generate_report.<locals>.<genexpr><3E>s!<00><><00><><00>"g<>a<EFBFBD>1<EFBFBD><01>&<26> <09><0F><0F>(9<>#9<>"g<><67><00>")rrr z**z1 findings** mentioning TurboQuant/PolarQuant/QJL:<3A>
r8<00>PR<50>Issuez- [z #z](r$z): r0<00>Pz (r2<00>)z9**No TurboQuant/PolarQuant/QJL mentions found upstream.**z4TurboQuant has NOT landed in upstream llama.cpp yet.c3<00>H<00>K<00>|]}|<01>dj<00>v<00><01><00>y<01>wrxryrzs <20>r(r|z"generate_report.<locals>.<genexpr><3E>s!<00><><00><><00>"h<>a<EFBFBD>1<EFBFBD><01>&<26> <09><0F><0F>(9<>#9<>"h<>r})rIr
<00> ggml_typez## KV Cache Related (z
findings)z## Ollama Releasesc3<00>$K<00>|]}d|v<00><01><00>
y<01>w)rN<>)r{<00>rs r(r|z"generate_report.<locals>.<genexpr><3E>s<00><00><><00>;<3B>Q<EFBFBD>G<EFBFBD>q<EFBFBD>L<EFBFBD>;<3B>s<00>rPrNz ): matched zBNo recent Ollama releases mention TurboQuant/KV cache compression.z,Could not check Ollama releases (API error).z## Fork Statusz- **Upstream (llama.cpp):** r_zN/Au — rgz- **Fork (turboquant):** rhrjrlz- **Fork freshness:** <20><00>CURRENTz days behindz## Recommendation<6F>closedzH**ACTION REQUIRED:** TurboQuant PRs merged upstream! Evaluate migration.zFTurboQuant PRs exist upstream but not yet merged. Continue monitoring.zNNo upstream TurboQuant support detected. Continue using fork. Re-check weekly.re) r<00>nowr<00>utc<74>strftime<6D>setr;<00>add<64>any<6E>lenr<<00>join)r?rU<00> fork_statusr>r<><00>lines<65>seen<65>unique<75>errors<72>keyrs<00>tq<74>kind<6E>kvr<76><00>tq_rel<65>d<>mergeds ` r(<00>generate_reportr<74>rsC<00><><00>
<12>,<2C>,<2C>x<EFBFBD>|<7C>|<7C>
$<24>C<EFBFBD> 1<><1C>S<EFBFBD>\<5C>\<5C>*><3E>?<3F>@<40> A<>!<21>*<2A><1C> .<2E><02> 4<>E<EFBFBD> <0F>5<EFBFBD>D<EFBFBD> <0F>F<EFBFBD> <0F>F<EFBFBD> <15><1D><01> <12>a<EFBFBD><<3C> <12>M<EFBFBD>M<EFBFBD>!<21> <1C> <14><10><16>y<EFBFBD>!<21>H<EFBFBD>+<2B>&<26><03> <0E>d<EFBFBD>?<3F> <10>H<EFBFBD>H<EFBFBD>S<EFBFBD>M<EFBFBD> <12>M<EFBFBD>M<EFBFBD>!<21> <1C><1D>
<EFBFBD>L<EFBFBD>L<EFBFBD>-<2D>.<2E><1B> h<><01>s<EFBFBD>"g<>Cf<43>"g<>g<>!<21> h<>B<EFBFBD> h<> <09> <0A> <0C> <0C>r<EFBFBD>#<23>b<EFBFBD>'<27><19>"S<>T<>U<><13>C<EFBFBD>R<EFBFBD><17> e<01>A<EFBFBD><1C>W<EFBFBD>:<3A>4<EFBFBD>7<EFBFBD>D<EFBFBD> <11>L<EFBFBD>L<EFBFBD>3<EFBFBD>t<EFBFBD>f<EFBFBD>B<EFBFBD>q<EFBFBD><18>{<7B>m<EFBFBD>2<EFBFBD>a<EFBFBD><05>h<EFBFBD>Z<EFBFBD>s<EFBFBD>1<EFBFBD>W<EFBFBD>:<3A>c<EFBFBD>r<EFBFBD>?<3F>BS<42>SU<53>VW<56>X_<58>V`<60>Ua<55>ab<61>c<> d<> e<01> <0E> <0C> <0C>P<>Q<> <0A> <0C> <0C>K<>L<> <09>L<EFBFBD>L<EFBFBD><12><14><1B> i<><01>s<EFBFBD>"h<>Cg<43>"h<>h<>!<21> i<>B<EFBFBD> i<> <09> <0A> <0C> <0C>,<2C>S<EFBFBD><12>W<EFBFBD>I<EFBFBD>Z<EFBFBD>@<40>A<><13>C<EFBFBD>R<EFBFBD><17> V<01>A<EFBFBD><1C>W<EFBFBD>:<3A>4<EFBFBD>7<EFBFBD>D<EFBFBD> <11>L<EFBFBD>L<EFBFBD>3<EFBFBD>t<EFBFBD>f<EFBFBD>B<EFBFBD>q<EFBFBD><18>{<7B>m<EFBFBD>2<EFBFBD>a<EFBFBD><05>h<EFBFBD>Z<EFBFBD>s<EFBFBD>1<EFBFBD>W<EFBFBD>:<3A>c<EFBFBD>r<EFBFBD>?<3F>BS<42>T<> U<> V<01> <0E> <0C> <0C>R<EFBFBD><18> <09>L<EFBFBD>L<EFBFBD>%<25>&<26><0F><03>;<3B>(<28>;<3B>;<3B>%<25>@<40><01><11><15><15><EFBFBD>)?<3F>!<21>@<40><06>@<40> <11><1B> Z<01><01><15> <0C> <0C>s<EFBFBD>1<EFBFBD>U<EFBFBD>8<EFBFBD>*<2A>B<EFBFBD>q<EFBFBD><15>x<EFBFBD>j<EFBFBD> <0B>A<EFBFBD>o<EFBFBD>DV<44>CW<43>X<>Y<> Z<01> <12>L<EFBFBD>L<EFBFBD>]<5D> ^<5E> <0A> <0C> <0C>C<>D<> <09>L<EFBFBD>L<EFBFBD><12><14> <09>L<EFBFBD>L<EFBFBD>!<21>"<22><0E>k<EFBFBD>!<21> <0A> <0C> <0C>3<>K<EFBFBD>O<EFBFBD>O<EFBFBD>N<EFBFBD>TY<54>4Z<34>3[<5B>[`<60>al<61>ap<61>ap<61>rD<02>FK<02>bL<02>aM<02>N<02> O<02> <0A> <0C> <0C>0<><1B><1F><1F><1A>U<EFBFBD>1S<31>0T<30>TY<54>Ze<5A>Zi<5A>Zi<5A>jx<6A>z<7A>[A<02>ZB<02>C<02> D<02> <18>K<EFBFBD> '<27><1B>M<EFBFBD>*<2A>A<EFBFBD> <11>L<EFBFBD>L<EFBFBD>1<>q<EFBFBD>A<EFBFBD>v<EFBFBD>)<29>a<EFBFBD>S<EFBFBD>P\<5C>K]<5D>1^<5E>_<> `<60> <09>L<EFBFBD>L<EFBFBD><12><14> <09>L<EFBFBD>L<EFBFBD>$<24>%<25> <09><1F>:<3A><01>1<EFBFBD>W<EFBFBD>:<3A><18>#9<>!<21>:<3A><06>:<3A> <11> <11>L<EFBFBD>L<EFBFBD>c<> d<> <11>L<EFBFBD>L<EFBFBD>a<> b<> <0A> <0C> <0C>e<>f<> <0F>9<EFBFBD>9<EFBFBD>U<EFBFBD> <1B><1B><>e
i<01><>
j<01><>A<01><>*;s0<00>2O<04> O<04>.O<04>O<04>$O<04>;O<04>4 O<04>Oc <00><><00>tjd<01><02>}|jdd<04><05>|jdd<07><08>|j<00>}t |j
j d d
<EFBFBD><00>}tjtj<00>t|<02> <0B>z
jd <0C>}d}tj<00>d z dz dz }|j<00>r|j!<00>j#<00>}g}t$j'<00>D]&\}}|j)t+|t,||<04><00><00>(t/t$d|<04>} t1|<04>}
|j2r}t5t3j6tjtj<00>j9<00>||D<00> cgc] } d| vs<01>| <0B><02> c} |D<00> cgc] } d| vs<01>| <0B><02> c} | |
d<12>d<13><14><00>yt;|| |
|<03>} t5| <0C>tt<<00>j?<00>j@j@dz } | jCd<16><17>| dz jE| <0C>ycc} wcc} w)NzTurboQuant upstream watch)<01> descriptionz--json<6F>
store_true)<01>actionz--since<63>30d)<01>defaultr<74>rH)rqz%Y-%m-%dz.config<69>githubr#r r)<06> generated<65>sincer?r<>rUr<><00>)<01>indent<6E>docsT)<01>exist_okzupstream-watch-report.md)#<23>argparse<73>ArgumentParser<65> add_argument<6E>
parse_args<EFBFBD>intr<74>rprr<>rr<>rr<>r<00>home<6D>exists<74> read_text<78>strip<69> WATCH_REPOSr.<00>extendrE<00> SEARCH_TERMSrYrtr<00>print<6E>dumps<70> isoformatr<74><00>__file__<5F>resolve<76>parent<6E>mkdir<69>
write_text)<0E>parser<65>argsrqr>r#<00> gh_token_path<74> all_findingsr6r-rUr<>rs<00>report<72>docs_dirs r(<00>mainr<6E><00>s<><00><00> <15> $<24> $<24>1L<31> M<>F<EFBFBD>
<EFBFBD><17><17><08><1C><17>6<>
<EFBFBD><17><17> <09>5<EFBFBD><17>1<> <11> <1C> <1C> <1E>D<EFBFBD> <0E>t<EFBFBD>z<EFBFBD>z<EFBFBD>!<21>!<21>#<23>r<EFBFBD>*<2A> +<2B>D<EFBFBD><1A>,<2C>,<2C>x<EFBFBD>|<7C>|<7C>,<2C>y<EFBFBD>d<EFBFBD>/C<>C<>M<>M<>j<EFBFBD>Y<>J<EFBFBD> <10>E<EFBFBD><18>I<EFBFBD>I<EFBFBD>K<EFBFBD>)<29>+<2B>h<EFBFBD>6<><17>@<40>M<EFBFBD><14><1B><1B><1D><1D>'<27>'<27>)<29>/<2F>/<2F>1<><05><15>L<EFBFBD>!<21>'<27>'<27>)<29>P<01>
<EFBFBD><04>d<EFBFBD><14><1B><1B>K<EFBFBD><04>l<EFBFBD>J<EFBFBD><05>N<>O<>P<01><1E>k<EFBFBD>(<28>3<>U<EFBFBD>;<3B>H<EFBFBD>#<23>E<EFBFBD>*<2A>K<EFBFBD> <0B>y<EFBFBD>y<EFBFBD> <0A>d<EFBFBD>j<EFBFBD>j<EFBFBD>!<21><1C><1C>h<EFBFBD>l<EFBFBD>l<EFBFBD>3<>=<3D>=<3D>?<3F><1F>$0<>E<>q<EFBFBD>G<EFBFBD>1<EFBFBD>4D<34><11>E<>".<2E>?<3F>Q<EFBFBD>'<27>Q<EFBFBD>,<2C>q<EFBFBD>?<3F> <20>&<26> 
<EFBFBD><14><15> <16>!<21><1C>x<EFBFBD><1B>j<EFBFBD>Q<><06> <0A>f<EFBFBD> <0A><17><08>><3E>)<29>)<29>+<2B>2<>2<>9<>9<>F<EFBFBD>B<><08><10><0E><0E><04><0E>%<25> <11>.<2E> .<2E>:<3A>:<3A>6<EFBFBD>B<><42>F<01><>?s<00>0 I<10>:I<10> I<12>I<12>__main__)N)<16>__doc__r<5F>r<00>os<6F>sys<79>urllib.requestr<00> urllib.parserrr<00>pathlibrr<>r<>r)rErYrtr<>r<><00>__name__r<5F>rur(<00><module>r<>sv<00><01> <04><10> <0B> <09>
<EFBFBD><15><13>2<>2<><18>-<2D> <0C>'<27> <1C><1D><02> <0B>!<21>"<14>*<14>*<12>&E<1C>P#C<01>L <0C>z<EFBFBD><19><08>F<EFBFBD>ru