Files
true-recall/tr-daily/__pycache__/curate_from_qdrant.cpython-312.pyc

136 lines
15 KiB
Plaintext
Raw Normal View History

<EFBFBD>
<00><><EFBFBD>i ,<00> <00>p<00>dZddlZddlZddlZddlZddlmZmZddlm Z ddl
m Z m Z m Z mZddlZdZdZdZd Zd
Zd Zd Zd efd<0E>Zdeded e e ee ffd<11>Zde e ee fd e e ee ffd<13>Zded e efd<15>Zde ee fded efd<17>Zde ee fded efd<18>Z de ee fded efd<19>Z!d<1A>Z"e#dk(re"<22>yy)aQ
True-Recall v2 Curator: Reads from Qdrant kimi_memories
Reads 24 hours of conversation from Qdrant kimi_memories collection,
extracts contextual gems using qwen3, stores to Qdrant true_recall with mxbai embeddings.
Usage:
python curate_from_qdrant.py --user-id rob
python curate_from_qdrant.py --user-id rob --date 2026-02-23
<EFBFBD>N)<02>datetime<6D> timedelta)<01>Path)<04>List<73>Dict<63>Any<6E>Optionalzhttp://10.0.0.40:6333<33> kimi_memories<65> true_recallzhttp://10.0.0.10:11434zmxbai-embed-largezqwen3:4b-instructzA/root/.openclaw/workspace/.projects/true-recall/curator-prompt.md<6D>returnc<00><><00> ttd<01>5}|j<00>cddd<02>S#1swYyxYw#t$r8d}t|d<01>5}|j<00>cddd<02>cYS#1swYYyxYwwxYw)zLoad the curator system prompt.<2E>rNzD/root/.openclaw/workspace/.projects/true-recall-v2/curator-prompt.md)<04>open<65>CURATOR_PROMPT_PATH<54>read<61>FileNotFoundError)<02>f<>CURATOR_PROMPT_PATH_V2s <20>Q/root/.openclaw/workspace/.projects/true-recall-v2/tr-daily/curate_from_qdrant.py<70>load_curator_promptr#sq<00><00><1C> <11>%<25>s<EFBFBD> +<2B> <1C>q<EFBFBD><14>6<EFBFBD>6<EFBFBD>8<EFBFBD> <1C> <1C> <1C><> <1C><1C>!g<><1E> <11>(<28>#<23> .<2E> <1C>!<21><14>6<EFBFBD>6<EFBFBD>8<EFBFBD> <1C> <1C> <1C><><1C>s;<00>8<00>,<03> 8<00>5<07>8<00>8<00>A9<03>A+<05>
A9<03>+A5 <09>0A9<03>5A9<03>user_id<69>date_strc <00><<00>ddd|id<04>dd|id<04>gi}g}d}d}d}||k<00>r6|d z }dd
|d <0B>}|r||d <tjjt<00>d t<00>d<0E>t j |<07>j<00>ddid<11><12>} tjj|d<13><14>5} t j| j<00>j<00><00>}
|
jdi<00>jdg<00>} | s
ddd<06>nN|j| <0B>|
jdi<00>jd<17>}|s
ddd<06>n ddd<06>||kr<02><01>6g} |D]<5D>}|jdi<00>}|jdd<1D>}|jdd<1D>}|jdd<1D>}|jd d<08>|jd|<00>|||jd!d<1D>|jd"d<1D>||jd|<01>|jd#d<1D>d$<24> }|d%s|d&s<01><>| j%|<13><00><>| j'd'<27><00>(<28>| S#1swY<00><>xYw#tjj$r/} | j dk(rt#dt<00>d<1A><03>gcYd} ~ S<00>d} ~ wwxYw))z<>
Get all conversation turns from Qdrant for a specific user and date.
Returns turns sorted by conversation_id and turn_number.
<20>mustr<00>value)<02>key<65>match<63>dateN<65>dr<00>T)<03>limit<69> with_payload<61>filter<65>offset<65> /collections/z/points/scroll<6C> Content-Type<70>application/json<6F>POST)<03>data<74>headers<72>method<6F><00><01>timeout<75>result<6C>points<74>next_page_offset<65><74>u⚠️ Collection z
not found<6E>payload<61> user_message<67><00> ai_response<73>
created_at<EFBFBD> turn_number<65>conversation_id<69>
session_id<EFBFBD> content_hash) <09>turnr<00>user<65>air9r:<00> timestamprr;r=r>c<00>J<00>|jdd<02>|jdd<04>fS)Nr9r5r<r)<01>get)<01>xs r<00><lambda>z'get_turns_from_qdrant.<locals>.<lambda><3E>s"<00><00>a<EFBFBD>e<EFBFBD>e<EFBFBD>$5<>r<EFBFBD>:<3A>A<EFBFBD>E<EFBFBD>E<EFBFBD>&<26>!<21><L<>M<><00>)r)<14>urllib<69>request<73>Request<73>
QDRANT_URL<EFBFBD>SOURCE_COLLECTION<4F>json<6F>dumps<70>encode<64>urlopen<65>loadsr<00>decoderA<00>extend<6E>error<6F> HTTPError<6F>code<64>print<6E>append<6E>sort)rr<00> filter_data<74>
all_pointsr$<00>max_iterations<6E>
iterations<EFBFBD> scroll_data<74>req<65>responser/r0<00>e<>turns<6E>pointr3<00>user_msg<73>ai_msgr7r<s r<00>get_turns_from_qdrantrc/s<><00><00> <0F><1D><17>'<27>(:<3A> ;<3B><1A>g<EFBFBD>x<EFBFBD>%8<> 9<>
<EFBFBD><06>K<EFBFBD><14>J<EFBFBD> <11>F<EFBFBD><18>N<EFBFBD><12>J<EFBFBD>
<14>~<7E>
%<25><12>a<EFBFBD><0F>
<EFBFBD><18> <20>!<21>
<EFBFBD> <0B> <12>$*<2A>K<EFBFBD><08> !<21><14>n<EFBFBD>n<EFBFBD>$<24>$<24><19>l<EFBFBD>-<2D>(9<>':<3A>.<2E> I<><15><1A><1A>K<EFBFBD>(<28>/<2F>/<2F>1<>#<23>%7<>8<><19> %<25>
<EFBFBD><03> <12><17><1E><1E>'<27>'<27><03>R<EFBFBD>'<27>8<> <1A>H<EFBFBD><1D><1A><1A>H<EFBFBD>M<EFBFBD>M<EFBFBD>O<EFBFBD>$:<3A>$:<3A>$<<3C>=<3D><06><1F><1A><1A>H<EFBFBD>b<EFBFBD>1<>5<>5<>h<EFBFBD><02>C<><06><1D><19> <1A> <1A><1B>!<21>!<21>&<26>)<29> <20><1A><1A>H<EFBFBD>b<EFBFBD>1<>5<>5<>6H<36>I<><06><1D><19> <1A> <1A><1E> <1A>' <15>~<7E>
%<25>N <0F>E<EFBFBD><1B><1F><05><17>)<29>)<29>I<EFBFBD>r<EFBFBD>*<2A><07><1B>;<3B>;<3B>~<7E>r<EFBFBD>2<><08><18><1B><1B>]<5D>B<EFBFBD>/<2F><06><1D>[<5B>[<5B><1C>r<EFBFBD>2<>
<EFBFBD><1C>K<EFBFBD>K<EFBFBD> <0A>q<EFBFBD>1<><1E>{<7B>{<7B>9<EFBFBD>g<EFBFBD>6<><1C><18>&<26>{<7B>{<7B>+<<3C>b<EFBFBD>A<>!<21>+<2B>+<2B>l<EFBFBD>B<EFBFBD>7<>#<23><1B>K<EFBFBD>K<EFBFBD><06><08>1<>#<23>K<EFBFBD>K<EFBFBD><0E><02>;<3B>

<EFBFBD><04> <10><06><<3C>4<EFBFBD><04>:<3A> <11>L<EFBFBD>L<EFBFBD><14> <1E>1<1F>6
<EFBFBD>J<EFBFBD>J<EFBFBD>M<>J<EFBFBD>N<> <10>L<EFBFBD>e <1A> <1A><><16>|<7C>|<7C>%<25>%<25> <12><10>v<EFBFBD>v<EFBFBD><13>}<7D><15>*<2A>+<<3C>*=<3D>Z<EFBFBD>H<>I<><19> <09> <11><>  <12>sO<00>!I<00>'AI<03>>I<00>5I<03><I<00>I<00>I <07>I<00>J<03>,#J<03>J<03>J<03>Jr_c
<00>J<00>|sgSt<00>}tj|d<01><02>}tjt
<00>d<03>t |d|<02>d<05>dddd <09>d
<EFBFBD><05> <0B>}|jd k7rtd |j<00><00><02><00>|j<00>}|jdd<0F>j<00>}d|vr5|jd<10>djd<12>dj<00>}n8d|vr4|jd<12>djd<12>dj<00>} tj|<05>}t|t<00>st!dt#|<06><00><00><02>|r|gng}|S#tj$$r,}t!d|<07><00><02>t!d|dd<00>d<19><03>gcYd}~Sd}~wwxYw)z2Use qwen3 to extract gems from conversation turns.<2E>)<01>indentz /api/generatez## Input Conversation
```json
z
```
## Output
Fg<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?i<>)<02> temperature<72> num_predict)<05>model<65>system<65>prompt<70>stream<61>options<6E>rJ<00><>zCuration failed: r]r5z```jsonr z```rz.Warning: Curator returned non-list, wrapping: zError parsing curator output: z Raw output: Ni<4E><00>...)rrJrK<00>requests<74>post<73>
OLLAMA_URL<EFBFBD>CURATION_MODEL<45> status_code<64> RuntimeError<6F>textrA<00>strip<69>splitrN<00>
isinstance<EFBFBD>listrT<00>type<70>JSONDecodeError)r_rk<00>conversation_jsonr]r/<00>output<75>gemsr^s r<00>extract_gems_with_curatorr<72><00>s<><00><00> <10><11> <09> <20> "<22>F<EFBFBD><1D>
<EFBFBD>
<EFBFBD>5<EFBFBD><11>3<><15><18>}<7D>}<7D> <15>,<2C>m<EFBFBD>$<24>#<23><1C>:<3A>;L<>:M<>Ma<4D>b<><1B>"<22>#<23><0E> 
<EFBFBD> <06>H<EFBFBD><10><1B><1B>s<EFBFBD>"<22><1A>.<2E>x<EFBFBD>}<7D>}<7D>o<EFBFBD>><3E>?<3F>?<3F> <15>]<5D>]<5D>_<EFBFBD>F<EFBFBD> <13>Z<EFBFBD>Z<EFBFBD>
<EFBFBD>B<EFBFBD> '<27> -<2D> -<2D> /<2F>F<EFBFBD><11>F<EFBFBD><1A><17><1C><1C>i<EFBFBD>(<28><11>+<2B>1<>1<>%<25>8<><11>;<3B>A<>A<>C<><06> <0E>&<26><1F><17><1C><1C>e<EFBFBD>$<24>Q<EFBFBD>'<27>-<2D>-<2D>e<EFBFBD>4<>Q<EFBFBD>7<>=<3D>=<3D>?<3F><06> <12><13>z<EFBFBD>z<EFBFBD>&<26>!<21><04><19>$<24><04>%<25> <11>B<>4<EFBFBD><04>:<3A>,<2C>O<> P<>!<21>D<EFBFBD>6<EFBFBD>r<EFBFBD>D<EFBFBD><13> <0B><> <0F> <1F> <1F><12> <0A>.<2E>q<EFBFBD>c<EFBFBD>2<>3<> <0A> <0C>V<EFBFBD>D<EFBFBD>S<EFBFBD>\<5C>N<EFBFBD>#<23>.<2E>/<2F><11> <09><><12>s<00>AE#<00>#F"<03>6!F<03>F"<03>F"rwc<00><><00>tjt<00>d<01>t|d<02><02><03>}|jdk7rt d|j <00><00><02><00>|j<00>dS)z9Get embedding vector from Ollama using mxbai-embed-large.z/api/embeddings)rirkrnrozEmbedding failed: <20> embedding)rqrrrs<00>EMBEDDING_MODELrurvrwrJ)rwr]s r<00> get_embeddingr<67><00>s]<00><00><17>}<7D>}<7D> <15>,<2C>o<EFBFBD>&<26>$<24><1A>
<EFBFBD><06>H<EFBFBD><10><1B><1B>s<EFBFBD>"<22><1A>/<2F><08> <0A> <0A><EFBFBD>?<3F>@<40>@<40> <13>=<3D>=<3D>?<3F>;<3B> '<27>'rD<00>gemc
<00><><00>tj|<01>d|jdd<03><00>d|jdd<03><00><00>j<00><00>j <00>dd}t
j |d<07><08>d zS)
z,Generate deterministic integer ID for a gem.<2E>:r9r5<00>
turn_rangeN<EFBFBD><00>big)<01> byteorderl)<07>hashlib<69>sha256rArL<00>digest<73>int<6E>
from_bytes)r<>r<00>
hash_bytess r<00>
get_gem_idr<EFBFBD><00>sp<00><00><18><1E><1E> <12>)<29>1<EFBFBD>S<EFBFBD>W<EFBFBD>W<EFBFBD>.<2E><02>3<>4<>A<EFBFBD>c<EFBFBD>g<EFBFBD>g<EFBFBD>l<EFBFBD>B<EFBFBD>6O<36>5P<35>Q<>X<>X<>Z<><06> <0C>f<EFBFBD>h<EFBFBD>r<EFBFBD><01><13>J<EFBFBD> <0F>><3E>><3E>*<2A><05>><3E> 6<>%<25> @<40>@rDc<00>h<00>t||<01>} tjjt<00>dt
<00>d|<02><00>ddid<05><06>}tjj |d<07><08>5} d d d <09>y
#1swYy xYw#tjj$r}|jd k(rYd }~y <0C>d }~wwxYw) z5Check if a similar gem already exists in true_recall.r%z/points/r&r'<00>GET)r*r+<00>
r-NTr2F)
r<EFBFBD>rErFrGrH<00>TARGET_COLLECTIONrMrQrRrS)r<>r<00>gem_idr\r]r^s r<00>check_duplicater<65><00>s<><00><00> <17><03>W<EFBFBD> %<25>F<EFBFBD> <0E><14>n<EFBFBD>n<EFBFBD>$<24>$<24><19>l<EFBFBD>-<2D>(9<>':<3A>(<28>6<EFBFBD>(<28> K<>#<23>%7<>8<><18>%<25>
<EFBFBD><03>
<14>^<5E>^<5E> #<23> #<23>C<EFBFBD><12> #<23> 4<> <18><08><17> <18> <18> <18><> <11><<3C><<3C> !<21> !<21><0E> <0C>6<EFBFBD>6<EFBFBD>S<EFBFBD>=<3D><18> <0A><><0E>s<<00>AA:<00>#A.<03>%A:<00>.A7<07>3A:<00>7A:<00>:B1<03>B,<03>+B,<03>,B1c<00>&<00>|jdd<02><00>d|jdd<02><00>d|jdd<02><00><00>}t|<02>}d|i|<00>}t||<01>}tjt
<00>dt <00>d<08>d |||d
<EFBFBD>gi<01> <0B>}|jd k(S) z%Store a gem to Qdrant with embedding.r<>r5<00> <20>context<78>snippetrr%z/pointsr0)<03>id<69>vectorr3rnro)rAr<>r<>rq<00>putrHr<>ru)r<>r<00>embedding_textr<74>r3r<>r]s r<00>store_gem_to_qdrantr<74><00>s<><00><00><1C><07><07><05>r<EFBFBD>*<2A>+<2B>1<EFBFBD>S<EFBFBD>W<EFBFBD>W<EFBFBD>Y<EFBFBD><02>-C<>,D<>A<EFBFBD>c<EFBFBD>g<EFBFBD>g<EFBFBD>i<EFBFBD>Y[<5B>F\<5C>E]<5D>^<5E>N<EFBFBD> <1A>><3E> *<2A>F<EFBFBD> <12>7<EFBFBD><06>
<0A><06>G<EFBFBD> <18><03>W<EFBFBD> %<25>F<EFBFBD><18>|<7C>|<7C> <15>,<2C>m<EFBFBD>$5<>#6<>g<EFBFBD>><3E> <14><1C> <20>"<22><0E><0F>
<EFBFBD> <06>H<EFBFBD> <14> <1F> <1F>3<EFBFBD> &<26>&rDc<00><><00>tjd<01><02>}|jddd<05><06>|jdd<08> <09>|jd
d d <0C> <0A>|j<00>}|jr |j}n2t j <00>td<0E><0F>z
}|jd<10>}td|j<00><00><02>td|<02><00><02>tdt<00><00><02>tdt<00><00><02>t<00>tdt<00>d<16><03>t|j|<02>}tdt|<04><00>d<18><03>|s td<19>ytd<1A>t!|ddd<0E>D]_\}}|j#dd<1D>dd}|j#dd<1D>dd}td |j#d!<21><00>d"|<07>d<16><05>td#|<08>d<16><03><00>at|<04>dkDrtd$t|<04>dz
<00>d%<25><03>td&<26>t%|<04>} td't| <09><00>d(<28><03>| s td)<29>ytd*<2A>t!| ddd<0E>D]<5D>\}}
td+|<05>d,<2C><03>td-|
j#d.d/<2F>dd0<00>d<16><03>td1|
j#d2g<00><00><00><02>td3|
j#d4d/<2F><00><00><02>td5|
j#d6d/<2F><00><00><02><00><>t| <09>dkDrtd7t| <09>dz
<00>d8<64><03>|j&r td9<64>ytd:<3A>d;} d;} d;} | D]<5D>}
t)|
|j<00>r(td<|
j#d.d/<2F>dd=<00>d<16><03>| dz } <0C>At+|
|j<00>r| dz } <0B>]td>|
j#d.d/<2F>dd=<00>d<16><03>| dz } <0A><>td?| <0B><00><02>td@| <0C><00><02>tdA| <0A><00><02>tdB<64>y)CNz*True-Recall Curator v2 - Reads from Qdrant)<01> descriptionz --user-idTzUser ID to process)<02>required<65>helpz--datez<Specific date to process (YYYY-MM-DD), defaults to yesterday)r<>z --dry-run<75>
store_truezDon't store, just preview)<02>actionr<6E>r )<01>daysz%Y-%m-%du 🔍 True-Recall Curator v2 for u📅 Processing date: u🧠 Embedding model: u💎 Target collection: u&📥 Fetching conversation turns from rpu
✅ Found z turnsu$⚠️ No turns to process. Exiting.u
📄 Sample turns:<3A>r=r5<00><r>z Turn r<z: User: z AI: z
... and z moreu1
🧠 Extracting gems with The Curator (qwen3)...u✅ Extracted z gemsu"⚠️ No gems extracted. Exiting.u
💎 Preview of extracted gems:z
--- Gem z ---zGem: r<>zN/Arz Categories: <20>
categoriesz Importance: <20>
importancez Confidence: <20>
confidencez
... and z
more gemsu
🏃 DRY RUN: Not storing gems.u
💾 Storing gems to Qdrant...ru ⏭️ Skipping duplicate: <20>2u ⚠️ Failed to store gem: u
✅ Stored: u⏭️ Skipped (duplicates): u ❌ Failed: u
🎉 Curation complete!)<16>argparse<73>ArgumentParser<65> add_argument<6E>
parse_argsrr<00>nowr<00>strftimerTrr<>r<>rIrc<00>len<65> enumeraterAr<><00>dry_runr<6E>r<>)<0E>parser<65>argsr<00> yesterdayr_<00>ir<rarbr<>r<><00>stored<65>skipped<65>faileds r<00>mainr<6E>s<><00><00> <15> $<24> $<24>1]<5D> ^<5E>F<EFBFBD>
<EFBFBD><17><17> <0B>d<EFBFBD>9M<39><17>N<>
<EFBFBD><17><17><08>'e<><17>f<>
<EFBFBD><17><17> <0B>L<EFBFBD>?Z<><17>[<5B> <11> <1C> <1C> <1E>D<EFBFBD> <0C>y<EFBFBD>y<EFBFBD><17>9<EFBFBD>9<EFBFBD><08><1C>L<EFBFBD>L<EFBFBD>N<EFBFBD>Y<EFBFBD>A<EFBFBD>%6<>6<> <09><1C>%<25>%<25>j<EFBFBD>1<><08> <09> ,<2C>T<EFBFBD>\<5C>\<5C>N<EFBFBD>
;<3B><<3C> <09> "<22>8<EFBFBD>*<2A>
-<2D>.<2E> <09> "<22>?<3F>"3<>
4<EFBFBD>5<> <09> $<24>%6<>$7<>
8<EFBFBD>9<> <09>G<EFBFBD>
<EFBFBD> 2<>3D<33>2E<32>S<EFBFBD>
I<EFBFBD>J<> !<21>$<24>,<2C>,<2C><08> 9<>E<EFBFBD> <09>J<EFBFBD>s<EFBFBD>5<EFBFBD>z<EFBFBD>l<EFBFBD>&<26>
)<29>*<2A> <10> <0A>4<>5<><0E>
<EFBFBD>
<20>!<21><1C>U<EFBFBD>2<EFBFBD>A<EFBFBD>Y<EFBFBD><01>*<2A>-<2D><07><01>4<EFBFBD><17>8<EFBFBD>8<EFBFBD>F<EFBFBD>B<EFBFBD>'<27><03><12>,<2C><08><15><18><18>$<24><02>#<23>C<EFBFBD>R<EFBFBD>(<28><06> <0A><07><04><08><08><16>(<28>)<29><18>(<28><1A>3<EFBFBD>?<3F>@<40> <0A><0F><06>x<EFBFBD>s<EFBFBD>+<2B>,<2C> -<2D>
 <0B>5<EFBFBD>z<EFBFBD>A<EFBFBD>~<7E> <0A>
<EFBFBD>3<EFBFBD>u<EFBFBD>:<3A><01>><3E>*<2A>%<25>0<>1<>
<EFBFBD>
><3E>?<3F> $<24>U<EFBFBD> +<2B>D<EFBFBD> <09>N<EFBFBD>3<EFBFBD>t<EFBFBD>9<EFBFBD>+<2B>U<EFBFBD>
+<2B>,<2C> <0F> <0A>2<>3<><0E>
<EFBFBD>
-<2D>.<2E><1B>D<EFBFBD><12>!<21>H<EFBFBD>a<EFBFBD>(<28>=<3D><06><01>3<EFBFBD> <0A>
<EFBFBD>1<EFBFBD>#<23>T<EFBFBD>"<22>#<23> <0A><05>c<EFBFBD>g<EFBFBD>g<EFBFBD>e<EFBFBD>U<EFBFBD>+<2B>D<EFBFBD>S<EFBFBD>1<>2<>#<23>6<>7<> <0A> <0C>S<EFBFBD>W<EFBFBD>W<EFBFBD>\<5C>2<EFBFBD>6<>7<>8<>9<> <0A> <0C>S<EFBFBD>W<EFBFBD>W<EFBFBD>\<5C>5<EFBFBD>9<>:<3A>;<3B><<3C> <0A> <0C>S<EFBFBD>W<EFBFBD>W<EFBFBD>\<5C>5<EFBFBD>9<>:<3A>;<3B><<3C> =<3D> <0B>4<EFBFBD>y<EFBFBD>1<EFBFBD>}<7D> <0A>
<EFBFBD>3<EFBFBD>t<EFBFBD>9<EFBFBD>q<EFBFBD>=<3D>/<2F><1A>4<>5<> <0B>|<7C>|<7C> <0A>1<>2<><0E>
<EFBFBD>
,<2C>-<2D> <0E>F<EFBFBD><0F>G<EFBFBD> <0E>F<EFBFBD><13> <18><03> <1A>3<EFBFBD><04> <0C> <0C> -<2D> <11>2<>3<EFBFBD>7<EFBFBD>7<EFBFBD>5<EFBFBD>%<25>3H<33><13>"<22>3M<33>2N<32>c<EFBFBD>R<> S<> <13>q<EFBFBD>L<EFBFBD>G<EFBFBD> <14> <1E>s<EFBFBD>D<EFBFBD>L<EFBFBD>L<EFBFBD> 1<> <12>a<EFBFBD>K<EFBFBD>F<EFBFBD> <11>2<>3<EFBFBD>7<EFBFBD>7<EFBFBD>5<EFBFBD>%<25>3H<33><13>"<22>3M<33>2N<32>c<EFBFBD>R<> S<> <12>a<EFBFBD>K<EFBFBD>F<EFBFBD> <18>
<EFBFBD>N<EFBFBD>6<EFBFBD>(<28>
#<23>$<24> <09> *<2A>7<EFBFBD>)<29>
4<EFBFBD>5<> <09>L<EFBFBD><16><08>
!<21>"<22> <09>
%<25>&rD<00>__main__)$<24>__doc__rJr<>rq<00>urllib.requestrErr<00>pathlibr<00>typingrrrr r<>rHrIr<>rsr<>rtr<00>strrrcr<><00>floatr<74>r<>r<><00>boolr<6C>r<>r<><00>__name__<5F>rDr<00><module>r<>sT<00><01> <04> <0C><0F><0F><15>(<28><18>,<2C>,<2C><0E>%<25>
<EFBFBD>#<23><11>!<21><11> %<25>
<EFBFBD>%<25><0F>$<24><0E>Z<01><13> <1C>S<EFBFBD> <1C>Y<11>3<EFBFBD>Y<11>#<23>Y<11>$<24>t<EFBFBD>C<EFBFBD><13>H<EFBFBD>~<7E>:N<>Y<11>x.<12>T<EFBFBD>$<24>s<EFBFBD>C<EFBFBD>x<EFBFBD>.<2E>%9<>.<12>d<EFBFBD>4<EFBFBD><03>S<EFBFBD><08>><3E>>R<>.<12>b (<28><03> (<28><04>U<EFBFBD> <0B> (<28> A<01>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD>A<01>S<EFBFBD>A<01>S<EFBFBD>A<01><0E><14>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E><0E>#<23><0E>$<24><0E>&'<27>T<EFBFBD>#<23>s<EFBFBD>(<28>^<5E>'<27>c<EFBFBD>'<27>d<EFBFBD>'<27><W'<27>t <0C>z<EFBFBD><19><08>F<EFBFBD>rD