Files
tamigo-cli/venv/lib/python3.12/site-packages/rich/__pycache__/live.cpython-312.pyc

119 lines
20 KiB
Plaintext
Raw Normal View History

<EFBFBD>
<00><16>i<EFBFBD>;<00> <01>d<00>UddlmZddlZddlmZmZmZddlmZddl m
Z
m Z m Z m Z mZmZmZmZmZddlmZddlmZmZmZmZmZdd lmZdd
lmZdd lm Z dd l!m"Z"m#Z#dd l$m%Z%ddl&m'Z'e rddl(m)Z)Gd<10>de<06>Z*Gd<12>de e<1A>Z+e,dk(<00>rddl-Z-ddl.Z.ddl/m0Z0ddl m1Z1mZm2Z2ddl3m4Z4ddlmZddl5m+Z+ddl6m7Z7ddl8m9Z9ddl:m;Z;ddl<m=Z=e<16>Ze;ddd <20>!<21>Z:e=d"d#d$<24>Z<e<j}d%d&d'<27>d(e7d)<29>d*e<d+d,d-d.<2E>d/e:e9d0<64>g Z?e0e?<3F>Z@gd1<64>ZAe+e<15>2<EFBFBD>5ZBiZCd3eDd4<eEd5<64>D<00>]VZFeAeFeGeA<65>zZHeAD<00>]?ZIeIeHk(r<01>
e.j<>d6<64>e-j<>dd7<64>dkrej<>eMe@<40><00>d8e-jZ<00>d9zdzz eCeHeIf<eGeC<65>eGeA<65>dz
kDr(eCj<43>eOeCj<43><00><00>d<00>e=d:<3A>;<3B>Z<e<j<>d<<3C>e<j<>d=<3D>e<j<>d><3E>eCj<43><00>D],\\ZSZTZUe<j}eSeTe'eUd?<3F>eUd@krdAndB<64>C<EFBFBD><00><00>.eBj<42>e4j<34>e<<3C><00><00><01>B<00><01>Y ddd<02>yy#1swYyxYw)D<>)<01> annotationsN)<03>Event<6E>RLock<63>Thread)<01> TracebackType) <09>IO<49> TYPE_CHECKING<4E>Any<6E>Callable<6C>List<73>Optional<61>TextIO<49>Type<70>cast<73>)<01> get_console)<05>Console<6C>ConsoleRenderable<6C>Group<75>RenderableType<70>
RenderHook)<01>Control)<01> FileProxy)<01> JupyterMixin)<02>
LiveRender<EFBFBD>VerticalOverflowMethod)<01>Screen)<01>Text)<01>Selfc<01>4<00><00>eZdZdZd<05>fd<02> Zdd<03>Zdd<04>Z<06>xZS)<07>_RefreshThreadz3A thread that calls refresh() at regular intervals.c<01>`<00><01>||_||_t<00>|_t<00>|<00>d<01><02>y)NT)<01>daemon)<06>live<76>refresh_per_secondr<00>done<6E>super<65>__init__)<04>selfr$r%<00> __class__s <20><>O/home/daniel/Projects/tamigo-cli/venv/lib/python3.12/site-packages/rich/live.pyr(z_RefreshThread.__init__s+<00><><00><18><04> <09>"4<><04><1F><19>G<EFBFBD><04> <09> <0A><07><18><04><18>%<25>c<01>8<00>|jj<00>y<00>N)r&<00>set<65>r)s r+<00>stopz_RefreshThread.stops<00><00> <0C> <09> <09> <0A> <0A>r,c<01>f<00>|jjd|jz <00>s}|jj5|jj <00>s|jj <00>ddd<00>|jjd|jz <00>s<01>|yy#1swY<00>4xYw)Nr)r&<00>waitr%r$<00>_lock<63>is_set<65>refreshr0s r+<00>runz_RefreshThread.run"sz<00><00><16>)<29>)<29>.<2E>.<2E><11>T<EFBFBD>%<<3C>%<<3C>!<<3C>=<3D><15><19><19><1F><1F> (<28><1B>y<EFBFBD>y<EFBFBD>'<27>'<27>)<29><18>I<EFBFBD>I<EFBFBD>%<25>%<25>'<27> (<28><17>)<29>)<29>.<2E>.<2E><11>T<EFBFBD>%<<3C>%<<3C>!<<3C>=<3D> (<28> (<28>s <00>5B'<03>'B0)r$z'Live'r%<00>float<61>return<72>None<6E>r9r:)<08>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__r(r1r7<00> __classcell__)r*s@r+r!r!s<00><><00>=<3D>&<26> <18>(r,r!c <01><><00>eZdZdZ ddddddddddd<07> dd<08>Zedd <09><04>Zdd
<EFBFBD>Zddd <0B>Zdd <0C>Z dd <0A>Z
dd<0E>Z dd<0F>Z dd<10>Z edd<11><04>Zdd<12>dd<13>Zdd<14>Z d d<15>Zy)!<21>Livea<65>Renders an auto-updating live display of any given renderable.
Args:
renderable (RenderableType, optional): The renderable to live display. Defaults to displaying nothing.
console (Console, optional): Optional Console instance. Defaults to an internal Console instance writing to stdout.
screen (bool, optional): Enable alternate screen mode. Defaults to False.
auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()` or `update()` with refresh flag. Defaults to True
refresh_per_second (float, optional): Number of times per second to refresh the live display. Defaults to 4.
transient (bool, optional): Clear the renderable on exit (has no effect when screen=True). Defaults to False.
redirect_stdout (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True.
redirect_stderr (bool, optional): Enable redirection of stderr. Defaults to True.
vertical_overflow (VerticalOverflowMethod, optional): How to handle renderable when it is too tall for the console. Defaults to "ellipsis".
get_renderable (Callable[[], RenderableType], optional): Optional callable to get renderable. Defaults to None.
NFT<46><00>ellipsis) <09>console<6C>screen<65> auto_refreshr%<00> transient<6E>redirect_stdout<75>redirect_stderr<72>vertical_overflow<6F>get_renderablec <01><><00>|dkDsJd<02><00>||_|<02>|n t<00>|_||_d|_||_||_d|_d|_t<00>|_
d|_ ||_ d|_ |rdn||_d|_||_| |_|
|_t'|j)<00>| <09><05>|_d|_y)Nrzrefresh_per_second must be > 0FT)rK)<17> _renderablerrE<00>_screen<65> _alt_screen<65>_redirect_stdout<75>_redirect_stderr<72>_restore_stdout<75>_restore_stderrrr4<00>
ipy_widgetrG<00>_startedrH<00>_refresh_threadr%rK<00>_get_renderablerrL<00> _live_render<65>_nested) r)<00>
renderablerErFrGr%rHrIrJrKrLs r+r(z Live.__init__9s<><00><00>"<22>A<EFBFBD>%<25>G<>'G<>G<>%<25>%<25><04><18>")<29>"5<>w<EFBFBD>;<3B>=<3D><04> <0C><1D><04> <0C> <20><04><18> /<2F><04><1D> /<2F><04><1D>26<32><04><1C>26<32><04><1C><1A>W<EFBFBD><04>
<EFBFBD>)-<2D><04><0F>(<28><04><19>#<23><04> <0A>!'<27><14>Y<EFBFBD><04><0E>9=<3D><04><1C>"4<><04><1F>!2<><04><1E>-<2D><04><1C>&<26> <10> <1F> <1F> !<21>5F<35>
<EFBFBD><04><19><1D><04> r,c<01><00>|jS)z'Check if live display has been started.)rVr0s r+<00>
is_startedzLive.is_startedbs<00><00><14>}<7D>}<7D>r,c<01>^<00>|j<00>|j<00>n |j}|xsdS)N<>)rXrN)r)r[s r+rLzLive.get_renderablegs9<00><00><14>#<23>#<23>/<2F> <11> <20> <20> "<22><15>!<21>!<21> <13>
<1A><1F>R<EFBFBD>r,c<01><><00>|j5|jr
ddd<01>yd|_|jj|<00>sd|_ ddd<01>y|j
r |jj d<02>|_|jjd<03>|j<00>|jj|<00>|r |j<00>|jr5t||j <00>|_|j"j%<00>ddd<01>y#t$r|j<00><00>wxYw#1swYyxYw)z|Start live rendering display.
Args:
refresh (bool, optional): Also refresh. Defaults to False.
NTF)r4rVrE<00>set_liverZrO<00>set_alt_screenrP<00> show_cursor<6F>_enable_redirect_io<69>push_render_hookr6<00> Exceptionr1rGr!r%rW<00>start)r)r6s r+rgz
Live.startos<00><00> <12>Z<EFBFBD>Z<EFBFBD> -<2D><13>}<7D>}<7D><16> -<2D> -<2D>!<21>D<EFBFBD>M<EFBFBD><17><<3C><<3C>(<28>(<28><14>.<2E>#<23><04> <0C><16> -<2D> -<2D><14>|<7C>|<7C>#'<27><<3C><<3C>#><3E>#><3E>t<EFBFBD>#D<><04> <20> <10>L<EFBFBD>L<EFBFBD> $<24> $<24>U<EFBFBD> +<2B> <10> $<24> $<24> &<26> <10>L<EFBFBD>L<EFBFBD> )<29> )<29>$<24> /<2F><16><1A><18>L<EFBFBD>L<EFBFBD>N<EFBFBD><14> <20> <20>'5<>d<EFBFBD>D<EFBFBD><S<><S<>'T<><04>$<24><14>$<24>$<24>*<2A>*<2A>,<2C>5 -<2D> -<2D><>"!<21><1A>
<19>I<EFBFBD>I<EFBFBD>K<EFBFBD><19> <1A><># -<2D> -<2D>s0<00>E<03>*E<03>A4E<03> D&<02>AE<03>&E<05>E<03>E c<01>h<00>|j5|js
ddd<01>yd|_|jj<00>|jr;|j
s%|jj |j<00> ddd<01>y|jr-|j<00>!|jj<00>d|_ d|_ |j5 |js&|jjs|j<00>|j<00>|jj!<00>|jsF|jj"r0|j$j&r|jj)<00>|jj+d<04>|jr|jj-d<02>|j
r?|js3|jj/|j$j1<00><00>|j2<00>'|j
r|j2j5<00> ddd<01>ddd<01>y#|j<00>|jj!<00>|jsF|jj"r0|j$j&r|jj)<00>|jj+d<04>|jr|jj-d<02>|j
r?|js3|jj/|j$j1<00><00>|j2<00>(|j
r|j2j5<00>wwwxYw#1swY<00><01>UxYw#1swYyxYw)zStop live rendering display.NF<4E>visibleT)r4rVrE<00>
clear_liverZrH<00>printr[rGrWr1rKrP<00>
is_jupyterr6<00>_disable_redirect_io<69>pop_render_hook<6F> is_terminalrY<00>last_render_height<68>linercrb<00>control<6F>restore_cursorrU<00>closer0s r+r1z Live.stop<6F>s<><00><00> <11>Z<EFBFBD>Z<EFBFBD>" 0<><17>=<3D>=<3D><16>" 0<>" 0<>"<22>D<EFBFBD>M<EFBFBD> <10>L<EFBFBD>L<EFBFBD> #<23> #<23> %<25><13>|<7C>|<7C><1B>~<7E>~<7E><18>L<EFBFBD>L<EFBFBD>&<26>&<26>t<EFBFBD><EFBFBD><EFBFBD>7<><16>" 0<>" 0<><14> <20> <20>T<EFBFBD>%9<>%9<>%E<><14>$<24>$<24>)<29>)<29>+<2B>'+<2B><04>$<24>%.<2E>D<EFBFBD> "<22><15><1C><1C> 0<>0<><1F>+<2B>+<2B>D<EFBFBD>L<EFBFBD>L<EFBFBD>4K<34>4K<34><1C> <0C> <0C><0E><18>-<2D>-<2D>/<2F><18>L<EFBFBD>L<EFBFBD>0<>0<>2<> <20>,<2C>,<2C> <20>L<EFBFBD>L<EFBFBD>4<>4<> <20>-<2D>-<2D>@<40>@<40><1C> <0C> <0C>)<29>)<29>+<2B><18>L<EFBFBD>L<EFBFBD>,<2C>,<2C>T<EFBFBD>2<><1B>'<27>'<27><1C> <0C> <0C>3<>3<>E<EFBFBD>:<3A><1B>~<7E>~<7E>d<EFBFBD>.><3E>.><3E><1C> <0C> <0C>,<2C>,<2C>T<EFBFBD>-><3E>-><3E>-M<>-M<>-O<>P<><1B><EFBFBD><EFBFBD>2<>t<EFBFBD>~<7E>~<7E><1C><0F><0F>-<2D>-<2D>/<2F>' 0<>" 0<>" 0<><30>(<19>-<2D>-<2D>/<2F><18>L<EFBFBD>L<EFBFBD>0<>0<>2<> <20>,<2C>,<2C> <20>L<EFBFBD>L<EFBFBD>4<>4<> <20>-<2D>-<2D>@<40>@<40><1C> <0C> <0C>)<29>)<29>+<2B><18>L<EFBFBD>L<EFBFBD>,<2C>,<2C>T<EFBFBD>2<><1B>'<27>'<27><1C> <0C> <0C>3<>3<>E<EFBFBD>:<3A><1B>~<7E>~<7E>d<EFBFBD>.><3E>.><3E><1C> <0C> <0C>,<2C>,<2C>T<EFBFBD>-><3E>-><3E>-M<>-M<>-O<>P<><1B><EFBFBD><EFBFBD>2<>t<EFBFBD>~<7E>~<7E><1C><0F><0F>-<2D>-<2D>/<2F>8F<01>2<><32>% 0<> 0<><30>" 0<>" 0<>sJ<00>N(<03>AN(<03> A N(<03>N<05>2I<04> D<N<05>N(<03>D?N<07>N<05>N% <09> N(<03>(N1c<01>B<00>|j|jdu<01><01>|S)N<>r6)rgrNr0s r+<00> __enter__zLive.__enter__<5F>s <00><00> <0C>
<EFBFBD>
<EFBFBD>4<EFBFBD>+<2B>+<2B>4<EFBFBD>7<>
<EFBFBD>8<><13> r,c<01>$<00>|j<00>yr.)r1)r)<00>exc_type<70>exc_val<61>exc_tbs r+<00>__exit__z Live.__exit__<5F>s <00><00> <0A> <09> <09> r,c<01>:<00>|jjs|jjr<>|jrjt t
j t<00>sLt
j |_tdt|jt
j <00><00>t
_|jrlt t
jt<00>sMt
j|_ tdt|jt
j<00><00>t
_ yyyy)z&Enable redirecting of stdout / stderr.rN) rErorlrQ<00>
isinstance<EFBFBD>sys<79>stdoutrrSrrR<00>stderrrTr0s r+rdzLive._enable_redirect_io<69>s<><00><00> <0F><<3C><<3C> #<23> #<23>t<EFBFBD>|<7C>|<7C>'><3E>'><3E><13>$<24>$<24>Z<EFBFBD><03>
<EFBFBD>
<EFBFBD>I<EFBFBD>-N<>'*<2A>z<EFBFBD>z<EFBFBD><04>$<24>!<21>(<28>I<EFBFBD>d<EFBFBD>l<EFBFBD>l<EFBFBD>C<EFBFBD>J<EFBFBD>J<EFBFBD>,O<>P<><03>
<EFBFBD><13>$<24>$<24>Z<EFBFBD><03>
<EFBFBD>
<EFBFBD>I<EFBFBD>-N<>'*<2A>z<EFBFBD>z<EFBFBD><04>$<24>!<21>(<28>I<EFBFBD>d<EFBFBD>l<EFBFBD>l<EFBFBD>C<EFBFBD>J<EFBFBD>J<EFBFBD>,O<>P<><03>
<EFBFBD>.O<01>$<24> (?r,c<01><><00>|jr&td|j<00>t_d|_|jr'td|j<00>t_d|_yy)z'Disable redirecting of stdout / stderr.rN)rSrrr<>rTr<>r0s r+rmzLive._disable_redirect_io<69>sQ<00><00> <0F> <1F> <1F><1D>h<EFBFBD><04>(<<3C>(<<3C>=<3D>C<EFBFBD>J<EFBFBD>#'<27>D<EFBFBD> <20> <0F> <1F> <1F><1D>h<EFBFBD><04>(<<3C>(<<3C>=<3D>C<EFBFBD>J<EFBFBD>#'<27>D<EFBFBD> <20> r,c<01><><00>|jj}|r,||dur%t|D<00>cgc]}|j<00><00><02>c}<02>}n|j<00>}|jr t |<03>S|Scc}w)zwGet the renderable that is being displayed
Returns:
RenderableType: Displayed renderable.
r)rE<00> _live_stackrrLrPr)r)<00>
live_stackr$r[s r+r[zLive.renderable<6C>sk<00><00><1A>\<5C>\<5C>-<2D>-<2D>
<EFBFBD> <15>$<24>*<2A>Q<EFBFBD>-<2D>/<2F><1E>:<3A> N<>4<EFBFBD><14>!4<>!4<>!6<> N<>O<>J<EFBFBD><1D>,<2C>,<2C>.<2E>J<EFBFBD>%)<29>%5<>%5<>v<EFBFBD>j<EFBFBD>!<21>E<>:<3A>E<><45>!Os<00>A.rvc<01><><00>t|t<00>r|jj|<01>}|j5||_|r|j <00>ddd<01>y#1swYyxYw)z<>Update the renderable that is being displayed
Args:
renderable (RenderableType): New renderable to use.
refresh (bool, optional): Refresh the display. Defaults to False.
N)r~<00>strrE<00>
render_strr4rNr6)r)r[r6s r+<00>updatez Live.update<74>sR<00><00> <16>j<EFBFBD>#<23> &<26><1D><1C><1C>0<>0<><1A><<3C>J<EFBFBD> <11>Z<EFBFBD>Z<EFBFBD> <1F>)<29>D<EFBFBD> <1C><16><14> <0C> <0C><0E> <1F> <1F> <1F>s <00>A<03>A$c<01><><00>|j5|jj|j<00>|jrG|j
j r'|j
j dj<00> ddd<02>y|j
jr<> ddl m
}ddl m }|j<00>|<02>|_ ||j<00>|j5|jjd<05><06>|j
j|jj<00>ddd<02>n<>|j
j&rO|j
j(s9|j
5|j
jt+<00><00>ddd<02>nP|j,sD|j.s8|j
5|j
jt+<00><00>ddd<02>ddd<02>y#1swY<00>xYw#t $rddl}|j%d<07>Y<00>5wxYw#1swY<00>BxYw#1swY<00>NxYw#1swYyxYw)z&Update the display of the Live Render.rN)<01>display)<01>OutputT)r3z(install "ipywidgets" for Jupyter support)r4rY<00>set_renderabler[rZrEr<>r6rl<00>IPython.displayr<79><00>
ipywidgetsr<EFBFBD>rU<00> clear_outputrk<00> ImportError<6F>warnings<67>warnro<00>is_dumb_terminalrrVrH)r)r<>r<>r<>s r+r6z Live.refresh<73>s<><00><00> <11>Z<EFBFBD>Z<EFBFBD> 2<> <10> <1D> <1D> ,<2C> ,<2C>T<EFBFBD>_<EFBFBD>_<EFBFBD> =<3D><13>|<7C>|<7C><17><<3C><<3C>+<2B>+<2B><18>L<EFBFBD>L<EFBFBD>,<2C>,<2C>Q<EFBFBD>/<2F>7<>7<>9<><16>  2<> 2<><14>|<7C>|<7C>&<26>&<26>I<01>7<>1<> <1C><EFBFBD><EFBFBD>.<2E>*0<>(<28><04><0F><1F><04><0F><0F>0<><1D><1F><1F>I<01><1C><0F><0F>4<>4<>$<24>4<>?<3F><1C> <0C> <0C>*<2A>*<2A>4<EFBFBD>+<<3C>+<<3C>+G<>+G<>H<>I<01>I<01><16><1C><1C>)<29>)<29>$<24>,<2C>,<2C>2O<32>2O<32><19>\<5C>\<5C>2<><18>L<EFBFBD>L<EFBFBD>&<26>&<26>w<EFBFBD>y<EFBFBD>1<>2<>2<><19>M<EFBFBD>M<EFBFBD>$<24>.<2E>.<2E><19>\<5C>\<5C>2<><18>L<EFBFBD>L<EFBFBD>&<26>&<26>w<EFBFBD>y<EFBFBD>1<>2<>; 2<> 2<>(I<01>I<01><>#<23>N<01>#<23><1C>M<EFBFBD>M<EFBFBD>"L<>M<>N<01><>2<>2<><32>
2<>2<><32>; 2<> 2<>s<EFBFBD><00>A0H:<03>H:<03> G><02>)6H:<03>A G2<05>+AH:<03>,$H"<05>-H:<03>=$H.<05>!H:<03>2G; <09>7H:<03>>H<05>H:<03>H<05>H:<03>"H+ <09>'H:<03>.H7 <09>3H:<03>:Ic<01><><00>|j|j_|jjrb|j5|j
rt j<00>n|jj<00>}|g|<01>|j<00>}ddd<01>|S|js|jsg|<01>|j<00>}|S#1swY|SxYw)z;Process renderables to restore cursor and display progress.N) rKrYrE<00>is_interactiver4rPr<00>home<6D>position_cursorrVrH)r)<00> renderables<65>resets r+<00>process_renderableszLive.process_renderabless<><00><00>/3<>.D<>.D<><04><19><19>+<2B> <0F><<3C><<3C> &<26> &<26><15><1A><1A> G<01><1C>'<27>'<27><1C>L<EFBFBD>L<EFBFBD>N<EFBFBD><1D>*<2A>*<2A>:<3A>:<3A><<3C><16>
%<25>F<>{<7B>F<>D<EFBFBD>4E<34>4E<34>F<> <0B>  G<01><1B><1A> <15> <0A> <0A>d<EFBFBD>n<EFBFBD>n<EFBFBD>;<3B>K<EFBFBD>;<3B><14>):<3A>):<3A>;<3B>K<EFBFBD><1A><1A> G<01><1B><1A>s <00>A B><03>>Cr.)r[zOptional[RenderableType]rEzOptional[Console]rF<00>boolrGr<>r%r8rHr<>rIr<>rJr<>rKrrLz&Optional[Callable[[], RenderableType]]r9r:)r9r<>)r9r)F)r6r<>r9r:r;)r9r)ryzOptional[Type[BaseException]]rzzOptional[BaseException]r{zOptional[TracebackType]r9r:)r[rr6r<>r9r:)r<><00>List[ConsoleRenderable]r9r<>)r<r=r>r?r(<00>propertyr]rLrgr1rwr|rdrmr[r<>r6r<><00>r,r+rBrB)s=<00><00> <08>"04<30>'<1D>&*<2A><1C>!<21>$%<25><1F> $<24> $<24>4><3E>AE<41>'<1D>,<2C>'<1D>#<23> '<1D>
<15> '<1D> <1B> '<1D>"<22>'<1D><18>'<1D><1E>'<1D><1E>'<1D>2<>'<1D>?<3F>'<1D>
<0E>'<1D>R<0E><1D><0E><1D> <20> -<2D>D$0<>L<14><14>/<2F><14>)<29><14>(<28> <14>
<0E> <14>Q<01>(<28><0E> F<01><0E> F<01>EJ<01> <1F> 2<>D<1B>2<><1B> <20>r,rB<00>__main__)<01>cycle)<03>Dictr <00>Tuple)<01>Align)r)rB)<01>Panel)<01>Rule)<01>Syntax)<01>Tablea~def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]:
"""Iterate and generate a tuple with a flag for last value."""
iter_values = iter(values)
try:
previous_value = next(iter_values)
except StopIteration:
return
for value in iter_values:
yield False, previous_value
previous_value = value
yield True, previous_value<75>pythonT)<01> line_numbers<72>foo<6F>bar<61>baz<61>1<>2<>3z<33>You can make the terminal shorter and taller to see the live table hideText may be printed while the progress bars are rendering.z(In fact, [i]any[/i] renderable will workzSuch as [magenta]tables[/]...zPretty printed structures...<2E>examplezPretty printed)<02>type<70>textz Syntax...zGive it a try!)<13>SGD<47>MYR<59>EUR<55>USD<53>AUD<55>JPY<50>CNH<4E>HKD<4B>CAD<41>INR<4E>DKK<4B>GBP<42>RUB<55>NZD<5A>MXN<58>IDR<44>TWD<57>THB<48>VND)rEzDict[Tuple[str, str], float]<5D>exchange_rate_dict<63>dg<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>
<00><>i@zExchange Rates)<01>titlezSource CurrencyzDestination Currencyz Exchange Ratez.4fg<00>?<3F>red<65>green)<01>style)X<>
__future__rr<00> threadingrrr<00>typesr<00>typingrr r
r r r rrrr_rrErrrrrrrr<00>
file_proxyr<00>jupyterr<00> live_renderrrrFrr<>r<00>typing_extensionsrr!rBr<<00>random<6F>time<6D> itertoolsr<73>r<>r<><00>alignr<6E>r$<00>panelr<6C><00>ruler<65><00>syntaxr<78><00>tabler<65><00>add_row<6F>progress_renderables<65>examples<65> exchanges<65>
live_tabler<EFBFBD><00>__annotations__<5F>range<67>index<65>len<65>select_exchange<67>exchange<67>sleep<65>randint<6E>log<6F>next<78>pop<6F>list<73>keys<79>
add_column<EFBFBD>items<6D>source<63>dest<73> exchange_rater<65><00>centerr<72>r,r+<00><module>r<>s<><00><01>"<22>
<EFBFBD>*<2A>*<2A><1F>W<>W<>W<><19>R<>R<><1C>!<21>!<21>;<3B><1A><16><10>&<26>(<28>V<EFBFBD>(<28>&@<1B><<3C><1A>@<1B>F <0C>z<EFBFBD><19><11><0F><1F>(<28>(<28><1C> <20>"<22><1C><1A><1E><1C><15>i<EFBFBD>G<EFBFBD> <13>
"<22> <11><19><06>F<EFBFBD> <12>%<25><15><05> &<26>E<EFBFBD> <09>M<EFBFBD>M<EFBFBD>#<23>s<EFBFBD>C<EFBFBD> <20> E<01> <0A>8<>9<>'<27> <0A>&<26><1A>$4<>5<><13><0E> <0C> <1D><1E> <06><18><15>)<29>*<2A>H<EFBFBD><06>I<EFBFBD>*
<0E>g<EFBFBD> <1E>!7<>*<2A>;=<3D><1A>8<>=<3D><1A>3<EFBFBD>Z<EFBFBD> 7<>E<EFBFBD>'<27><05><03>I<EFBFBD><0E>(><3E>?<3F>O<EFBFBD>%<25> 7<><08><1B><EFBFBD>.<2E><1C><1A><04>
<EFBFBD>
<EFBFBD>3<EFBFBD><0F>!<21>6<EFBFBD>><3E>><3E>!<21>R<EFBFBD>(<28>1<EFBFBD>,<2C><1B>K<EFBFBD>K<EFBFBD><04>X<EFBFBD><0E>/<2F>BE<42>"<22>V<EFBFBD>]<5D>]<5D>_<EFBFBD>s<EFBFBD>*<2A>a<EFBFBD>/<2F>C<12>"<22>O<EFBFBD>X<EFBFBD>#><3E>?<3F><17>)<29>*<2A>S<EFBFBD><19>^<5E>a<EFBFBD>-?<3F>?<3F>&<26>*<2A>*<2A>4<EFBFBD>0B<30>0G<30>0G<30>0I<30>+J<>1<EFBFBD>+M<>N<><1D>$4<>5<><05><15> <20> <20>!2<>3<><15> <20> <20>!7<>8<><15> <20> <20><1F>1<>5G<35>5M<35>5M<35>5O<35><16>1<>N<EFBFBD>V<EFBFBD>T<EFBFBD>M<EFBFBD><19>M<EFBFBD>M<EFBFBD><1E><1C><1C>,<2C>S<EFBFBD>1<>+8<>3<EFBFBD>+><3E>%<25>G<EFBFBD><1A><16><16><1B>!<21>!<21>,<2C>%<25>,<2C>,<2C>u<EFBFBD>"5<>6<>7 7<> 7<>!7<>!7<>O<1A>N!7<>!7<>s <00>1E*J&<03>&J/