§
    ÁÃjd/  ã                   óÈ  — d Z ddlZddlZddlZddlZddlZddlmZm	Z	m
Z
 d\  ZZdZdZdZdZej                             ed	¦  «        Zej                             ed
¦  «        Zd ej        ddd¦  «        fd ej        ddd¦  «        fgZg d¢Zg d¢Zddgddgg d¢g d¢g d¢dœdddgdœZdZd.d „Zd!„ Zd/d#„Zd0d%„Zd1d'„Zd(„ Z d)„ Z!d*„ Z"d+„ Z#d,„ Z$e%d-k    r e$¦   «          dS dS )2uÕ  
X4 briefing-card renderer â€” 800x480 PNGs for the Xteink X4 (CrossInk cards).

WHITE background, black text, one dark-gray accent. E-ink safe: solid colors
only, no gradients, big type. DejaVu fonts (emoji are DRAWN with PIL
primitives â€” DejaVu has no emoji glyphs).

Usage:
    python3 render.py nightstand|morning [--weekend] [--data /path/card.json]
                                         [--out /path/out.png]

Default outputs (served by x4-cards.service on :8080):
    cards/nightstand.png, cards/morning.png,
    cards/nightstand_weekend.png, cards/morning_weekend.png

--data JSON schema (all keys optional; built-in placeholder defaults apply):
{
  "date": "Monday, October 5",              # header date string
  "schedule": ["8:30a  MSP309 Atelier 4"],  # schedule lines (max 4 night / 3 morning shown)
  "schedule_weekend": ["9:00a  Gym"],       # used instead of schedule with --weekend
  "countdowns": ["Exams in 36 days"],       # else computed from MILESTONES vs render date
  "weather": {"hours": ["8h","12h","18h","22h"], "temps": [12,17,15,13]},
  "wear": "tee + light jacket",             # "Wear: ..." line under the graph
  "mot": {"word": "flÃ¢ner", "pron": "fla-nay", "gloss": "to stroll, aimlessly"},
  "liberty": ["first liberty line", "second liberty line"],
  "presence": "Aren't the trees outside beautiful?"
}

Tuesday data-wiring: a scheduled job generates this JSON from calendar /
weather / health data, then runs render.py over SSH to refresh the cards.
é    N)ÚImageÚ	ImageDrawÚ	ImageFont)i   ià  )r   r   r   )éÿ   r   r   )éF   r   r   z /usr/share/fonts/truetype/dejavuzDejaVuSans-Bold.ttfzDejaVuSans.ttfÚExamsiê  é   é	   ÚExternaté   )z#Aren't the trees outside beautiful?u4   The maples on BelvÃ©dÃ¨re are showing off this week.u7   Crisp air, warm coffee â€” fall is doing its best work.z/What did today teach you that yesterday didn't?z9Text someone you haven't seen in a while. Thirty seconds.z(The light at 6pm is golden now. Go look.zA walk counts as thinking.u8   The library at noon on a Sunday â€” your kind of church.z+First snow is coming. Enjoy the in-between.z.You know more today than you did in September.z2The best study spot is the one you actually go to.z/Small steps, every day. That's the whole trick.z-Call your parents tomorrow. They'd like that.z<Somewhere out there, it's somebody's first day of something.z0Look up. The sky is doing something interesting.))u   flÃ¢nerzfla-nayzto stroll, aimlessly)Úlueurzlyoo-EURzglimmer, faint light)Úterroirz	teh-RWAHRzlocal soil; sense of place)u   dÃ©paysementzday-payz-MAHNzfeeling of being somewhere new)Úbricolerzbree-ko-LAYzto tinker, to DIY)Úfrissonz	free-SOHNzshiver; thrill)Úmusarderzmyoo-zar-DAYzto dawdle, to loiter)Ú	chuchoterzshoo-sho-TAYz
to whisper)u   Ã©phÃ©mÃ¨rezay-fay-MEHRzephemeral, fleeting)Úsavourerz
sa-voo-RAYzto savor)u   crÃ©pusculezkray-poos-KOOLztwilight, dusk)ÚaubeÚohbÚdawn)Úbruinezbroo-EENÚdrizzle)ÚfeuilleÚFOYÚleaf)u   rÃ©coltezray-KOLTÚharvest)Úcheminzshuh-MANz	path, way)Ú	rencontrezrahn-KOHNTRzencounter, meeting)Úsouvenirzsoo-vuh-NEERzmemory; keepsake)Úespoirz	ehs-PWAHRÚhope)Úcouragezkoo-RAHJr"   )Údouceurzdoo-SUHRzgentleness; mildness)Úlenteurz	lahn-TUHRÚslowness)Úsilencez
see-LAHNSSr&   )Úregardzruh-GARz
gaze, look)u   Ã©coutezay-KOOTÚ	listening)Úpartagez	par-TAHZHÚsharing)u   dÃ©couvertezday-koo-VEHRTÚ	discovery)Úaventureza-vahn-TOORÚ	adventure)Ú	merveillezmehr-VAYzmarvel, wonder)Ú	quotidienzko-tee-DYANzdaily life, the everydayz
No classesz#8:00p  MSP305 remise (REDCap + RPM)u"   8:00p  MSP305 remise â€” deadline!)u   9:00a  Gym â€” push dayz12:00p  Library (till 5)u    7:30p  Off the couch â€” go out!)Ú8hÚ12hÚ18hÚ22h)é   é   é   é   )ÚhoursÚtempsztee + light jacketu+   StrÃ¸m Wednesday â€” pack swimsuit, sandalsz'Pharmacy CE tonight 8pm, join from home)ÚscheduleÚschedule_morningÚschedule_weekendÚweatherÚwearÚliberty)iv  éÊ   i  iV  Fc                 óH   — t          j        |rt          nt          | ¦  «        S )N)r   ÚtruetypeÚF_BOLDÚF_REG)ÚsizeÚbolds     ú/opt/x4-cards/render.pyÚfontrH   ‚   s   € ÝÔ¨Ð7�f˜fµ%¸Ñ>Ô>Ð>ó    c                 óÚ   — |                       ||¬¦  «        |k    r|S |rH|                       |dz   |¬¦  «        |k    r*|dd…         }|r|                       |dz   |¬¦  «        |k    °*|dz   S )z+Truncate with ellipsis to fit max_w pixels.©rH   u   â€¦Néÿÿÿÿ)Ú
textlength)ÚdrawÚtextÚfntÚmax_ws       rG   Úfit_textrR   †   s‡   € à‡‚�t #€Ñ&Ô&¨%Ò/Ð/ØˆØ
ð �4—?’? 4¨%¡<°c�?Ñ:Ô:¸UÒBÐBØ�C�R�CŒyˆð ð �4—?’? 4¨%¡<°c�?Ñ:Ô:¸UÒBÐBà�%‰<ÐrI   é   c                 óÎ   — |                       ||z
  ||z
  ||z   ||z   gt          ¬¦  «         |                       ||z
  dz   ||z
  dz
  ||z   dz   ||z   dz
  gt          ¬¦  «         d S )N©Úfillr
   é   )ÚellipseÚBLACKÚWHITE)rN   ÚcxÚcyÚrs       rG   Ú	draw_moonr^   �   sv   € Ø‡L‚L�"�q‘&˜"˜q™& " q¡&¨"¨q©&Ð1½€LÑ>Ô>Ð>Ø‡L‚L�"�q‘&˜1‘*˜b 1™f q™j¨"¨q©&°1©*°b¸1±f¸q±jÐAÍ€LÑNÔNÐNÐNÐNrI   é   c                 óì  — |                       ||z
  ||z
  ||z   ||z   gt          d¬¦  «         dd l}t          ddd¦  «        D ]°}|                     |¦  «        }||dz   |                     |¦  «        z  z   ||dz   |                     |¦  «        z  z   }}||dz   |                     |¦  «        z  z   ||dz   |                     |¦  «        z  z   }
}	|                      |||	|
gt          d¬¦  «         Œ±d S )	Né   ©ÚoutlineÚwidthr   éh  é-   é   é   ©rV   rd   )rX   rY   ÚmathÚrangeÚradiansÚcosÚsinÚline)rN   r[   r\   r]   rj   ÚdegÚaÚx1Úy1Úx2Úy2s              rG   Údraw_sunrv   ”   s  € Ø‡L‚L�"�q‘&˜"˜q™& " q¡&¨"¨q©&Ð1½5È€LÑJÔJÐJØ€K€K€KÝ�Q˜˜RÑ Ô ð 9ð 9ˆØ�LŠL˜ÑÔˆØ�q˜1‘u §¢¨¡¤Ñ+Ñ+¨R°1°q±5¸D¿HºHÀQ¹K¼KÑ2GÑ-GˆBˆØ�q˜2‘v §¢¨!¡¤Ñ,Ñ,¨b°A¸±F¸d¿hºhÀq¹k¼kÑ3IÑ.IˆBˆØ�	Š	�2�r˜2˜rÐ"­°aˆ	Ñ8Ô8Ð8Ð8ð	9ð 9rI   é   c                 ón   — |                       |||z
  f||z   |f|||z   f||z
  |fgt          ¬¦  «         d S )NrU   )ÚpolygonrY   )rN   ÚxÚyr]   s       rG   Údraw_diamondr|   ž   sG   € Ø‡L‚L�1�a˜!‘e�*˜q 1™u a˜j¨1¨a°!©e¨*°q¸1±u¸a°jÐAÍ€LÑNÔNÐNÐNÐNrI   c                 ó4  ‡‡‡‡‡‡‡— t          |¦  «        Št          |¦  «        t          |¦  «        cŠ}t          |‰z
  d¦  «        Šˆˆˆfd„t          ‰¦  «        D ¦   «         }ˆˆˆˆfd„|D ¦   «         }	t	          t          ||	¦  «        ¦  «        }
|                      |
t          dd¬¦  «         t          d¦  «        }t          d¦  «        }t          |
||¦  «        D ]¶\  \  }}}}|  	                    |dz
  |dz
  |dz   |dz   gt          ¬	¦  «         |› d
�}|  
                    ||                      ||¬¦  «        dz  z
  |dz
  f||t          ¬¦  «         |  
                    ||                      ||¬¦  «        dz  z
  ‰dz   f||t          ¬¦  «         Œ·dS )z;Minimalist temperature curve: black polyline, dots, labels.é   c                 ó2   •— g | ]}‰|‰‰z
  z  ‰d z
  z  z   ‘ŒS )é   © )Ú.0ÚiÚnÚx0rr   s     €€€rG   ú
<listcomp>z#draw_temp_graph.<locals>.<listcomp>§   s/   ø€ Ð	9Ð	9Ð	9¨1ˆ"ˆq�B˜‘G‰}  A¡Ñ&Ñ
&Ð	9Ð	9Ð	9rI   c                 ó2   •— g | ]}‰|‰z
  ‰z  ‰‰z
  z  z
  ‘ŒS r�   r�   )r‚   ÚtÚspanÚtminÚy0rs   s     €€€€rG   r†   z#draw_temp_graph.<locals>.<listcomp>¨   s0   ø€ Ð	<Ð	<Ð	<°ˆ"��D‘˜DÑ  B¨¡GÑ,Ñ
,Ð	<Ð	<Ð	<rI   ra   Úcurve)rV   rd   Újointr5   é   rU   õ   Â°rK   é   ©rH   rV   rw   N)ÚlenÚminÚmaxrk   ÚlistÚzipro   rY   rH   rX   rO   rM   ÚGRAY)rN   r…   r‹   rr   rs   r8   r9   ÚtmaxÚxsÚysÚptsÚf_smÚf_hrrz   r{   rˆ   ÚhÚlabelr„   r‰   rŠ   s    ````             @@@rG   Údraw_temp_graphr    ¢   sÆ  øøøøøøø€ åˆE‰
Œ
€AÝ�U‘”�S ™ZœZ€J€Dˆ$Ýˆt�d‰{˜AÑÔ€DØ	9Ð	9Ð	9Ð	9Ð	9Ð	9µ°a±´Ð	9Ñ	9Ô	9€BØ	<Ð	<Ð	<Ð	<Ð	<Ð	<Ð	<°eÐ	<Ñ	<Ô	<€BÝ
�s�2�r‰{Œ{Ñ
Ô
€CØ‡I‚Iˆc� Q¨g€IÑ6Ô6Ð6Ý�‰8Œ8€DÝ�‰8Œ8€DÝ˜C ¨Ñ.Ô.ð +ð +‰‰ˆˆA��1Ø�Š�a˜!‘e˜Q ™U A¨¡E¨1¨q©5Ð1½ˆÑ>Ô>Ð>Ø���ˆØ�	Š	�1�t—’ u°4�Ñ8Ô8¸1Ñ<Ñ<¸aÀ"¹fÐEØ˜d­ð 	ñ 	0ô 	0ð 	0à�	Š	�1�t—’ q¨t�Ñ4Ô4°qÑ8Ñ8¸"¸q¹&ÐAØ˜$¥Tð 	ñ 	+ô 	+ð 	+ð 	+ð+ð +rI   c                 óÞ   — g }t          t          d„ ¬¦  «        D ]J\  }}|| z
  j        }|dk     rŒ|                     |dk    r|› d|› d�n|› d�¦  «         |dk    r|› d�|d	<   ŒK|d d
…         S )Nc                 ó   — | d         S )Nr€   r�   )Úms    rG   ú<lambda>z countdowns_for.<locals>.<lambda>¸   s
   € °a¸´d€ rI   )Úkeyr   r€   z in z daysz	 in 1 dayz today!rL   r~   )ÚsortedÚ
MILESTONESÚdaysÚappend)ÚtodayÚoutÚnameÚdayr„   s        rG   Úcountdowns_forr®   ¶   s£   € Ø
€CÝ�J¨N¨NÐ;Ñ;Ô;ð 'ð '‰	ˆˆcØ�5‰[ÔˆØˆqŠ5ˆ5ØØ�
Š
¨A°ªF¨F�dÐ(Ð( Ð(Ð(Ð(Ð(¸4Ð8JÐ8JÐ8JÑKÔKÐKØ�Š6ˆ6ØÐ&Ð&Ð&ˆC�‰GøØˆr�ˆrŒ7€NrI   c                 óŒ  — t          j        dt          t          ft          ¦  «        }t          j        |¦  «        }|                      d|                     d¦  «        ¦  «        }t          |dd¦  «         | 
                    d|t          dd¬	¦  «        t          ¬
¦  «         |                     ddt          dz
  dgt          d¬¦  «         | 
                    ddt          dd¬	¦  «        t          ¬
¦  «         |                      dt          d         ¦  «        d d…         }d}|D ]Y}| 
                    d|ft!          ||t          d¦  «        t          dz
  ¦  «        t          d¦  «        t          ¬
¦  «         |dz  }ŒZ|                     ddt          dz
  dgt          d¬¦  «         |                      d¦  «        pt#          |¦  «        }|rd                     |¦  «        nd}	|	r\|                     |	t          d¦  «        ¬¦  «        }
| 
                    t          |
z
  dz  df|	t          d¦  «        t          ¬
¦  «         |S )NÚRGBÚdateú
%A, %B %-dé<   é&   )éd   é   é    T©rF   r‘   é(   éN   r~   ri   )r¹   é\   ÚTOMORROWrS   r:   rW   é~   é   éP   é"   i|  Ú
countdownsu    Â· Ú é   rK   iˆ  )r   ÚnewÚWÚHrZ   r   ÚDrawÚgetÚstrftimer^   rO   rH   rY   ro   r—   ÚPLACEHOLDERrR   r®   ÚjoinrM   )Údatarª   ÚimgÚdÚdate_strÚschedr{   ro   ÚcdÚfooterÚfws              rG   Úrender_nightrÔ   Â   s  € Ý
Œ)�E�A�q˜6¥5Ñ
)Ô
)€CÝŒ�sÑÔ€Aà�xŠx˜ §¢¨|Ñ <Ô <Ñ=Ô=€HÝˆa��RÑÔÐØ‡F‚Fˆ9�h¥T¨"°4Ð%8Ñ%8Ô%8½u€FÑEÔEÐEà‡F‚FˆB�•A˜‘F˜BÐ¥d°!€FÑ4Ô4Ð4à‡F‚Fˆ8�Z¥d¨2°DÐ&9Ñ&9Ô&9Å€FÑEÔEÐEØ�HŠH�Z¥¨ZÔ!8Ñ9Ô9¸"¸1¸"Ô=€EØ€AØð ð ˆØ	�Š��Aˆw�  D­$¨r©(¬(µA¸±FÑ;Ô;Ý˜‘H”H¥5ð 	ñ 	*ô 	*ð 	*à	ˆR‰ˆˆà‡F‚FˆB�•Q˜‘V˜SÐ!­°A€FÑ6Ô6Ð6Ø	�Š�,Ñ	Ô	Ð	8¥>°%Ñ#8Ô#8€BØ "Ð*ˆV�[Š[˜‰_Œ_ˆ_¨€FØð FØ�\Š\˜&¥t¨B¡x¤xˆ\Ñ0Ô0ˆØ	�Š•�R‘˜1‘˜cÐ" Fµ°b±´ÅˆÑEÔEÐEØ€JrI   c                 óØ
  — t          j        dt          t          ft          ¦  «        }t          j        |¦  «        }|                      d|                     d¦  «        ¦  «        }t          |dd¦  «         | 
                    d|t          dd¬	¦  «        t          ¬
¦  «         |                     ddt          dz
  dgt          d¬¦  «         | 
                    ddt          dd¬	¦  «        t          ¬
¦  «         |                      dt          d         ¦  «        d d…         }d}|D ]Y}| 
                    d|ft!          ||t          d¦  «        t          dz
  ¦  «        t          d¦  «        t          ¬
¦  «         |dz  }ŒZ|                     ddt          dz
  dgt          d¬¦  «         | 
                    ddt          dd¬	¦  «        t          ¬
¦  «         |                      dt          d         ¦  «        }t#          |dddd|d          |d!         ¦  «         |                      d"t          d"         ¦  «        }	| 
                    d#t!          |d$|	› �t          d%¦  «        d&¦  «        t          d%¦  «        t          ¬
¦  «         t$          \  }
}}}|                     |
|||gt          d¬'¦  «         d(}| 
                    |
||
z
  |                     |t          d)¦  «        ¬*¦  «        z
  dz  z   ||z   dz  d+z
  f|t          d)¦  «        t          ¬
¦  «         |                     dd,t          dz
  d,gt          d¬¦  «         |                      d-¦  «        }|€>t*          |                     ¦   «         t/          t*          ¦  «        z           \  }}}|||d.œ}d/|d0         › d1|d2         › d3|d4         › �}| 
                    d5t!          ||t          d¦  «        t          dz
  ¦  «        t          d¦  «        t          ¬
¦  «         |                      d6t          d6         ¦  «        d d…         }d7}|D ]o}t1          |d8|d9z   d:¬;¦  «         | 
                    d<|ft!          ||t          d¦  «        t          d=z
  ¦  «        t          d¦  «        t          ¬
¦  «         |d%z  }Œp|                      d>t2          |                     ¦   «         t/          t2          ¦  «        z           ¦  «        }t!          ||t          d¦  «        t          dz
  ¦  «        }|                     |t          d¦  «        ¬*¦  «        }| 
                    t          |z
  dz  d?f|t          d¦  «        t          ¬
¦  «         |S )@Nr°   r±   r²   r³   é$   )rµ   r_   r�   Tr¸   r‘   r¹   é>   r~   ri   )r¹   r   ÚTODAYrS   r:   r;   ra   é`   r¾   r¿   é°   )r¹   é¸   ÚWEATHERr=   é2   éÒ   iX  i  r8   r9   r>   )r¹   i:  zWear: rÃ   i0  rb   Úavatarr¶   rK   r4   i^  Úmot)ÚwordÚpronÚglossu   MOT DU JOUR  Â·  rá   ú (râ   u   ) â€” rã   )r¹   re   r?   i„  é4   é
   é   )r]   éD   én   Úpresencei¸  )r   rÄ   rÅ   rÆ   rZ   r   rÇ   rÈ   rÉ   rv   rO   rH   rY   ro   r—   rÊ   rR   r    Ú
AVATAR_BOXÚ	rectanglerM   ÚMOTSÚ	toordinalr’   r|   ÚPRESENCE_LINES)rÌ   rª   rÍ   rÎ   rÏ   rÐ   r{   ro   Úwr>   r…   r‹   rr   rs   Úlblrà   Úw_râ   rã   Úmot_lineÚlibsÚpresÚpws                          rG   Úrender_morningr÷   Ý   sú  € Ý
Œ)�E�A�q˜6¥5Ñ
)Ô
)€CÝŒ�sÑÔ€Aà�xŠx˜ §¢¨|Ñ <Ô <Ñ=Ô=€HÝˆQ��BÑÔÐØ‡F‚Fˆ9�h¥T¨"°4Ð%8Ñ%8Ô%8½u€FÑEÔEÐEØ‡F‚FˆB�•A˜‘F˜BÐ¥d°!€FÑ4Ô4Ð4ð ‡F‚Fˆ8�W¥4¨°Ð#6Ñ#6Ô#6½T€FÑBÔBÐBØ�HŠH�Z¥Ð-?Ô!@ÑAÔAÀ"À1À"ÔE€EØ
€AØð ð ˆØ	�Š��Aˆw�  D­$¨r©(¬(µA¸±FÑ;Ô;Ý˜‘H”H¥5ð 	ñ 	*ô 	*ð 	*à	ˆR‰ˆˆà‡F‚FˆB�•Q˜‘V˜SÐ!­°A€FÑ6Ô6Ð6ð ‡F‚Fˆ9�i¥d¨2°DÐ&9Ñ&9Ô&9Å€FÑEÔEÐEØ�Š��K¨	Ô2Ñ3Ô3€AÝ�A�r˜3  S¨!¨G¬*°a¸´jÑAÔAÐAØ�8Š8�F�K¨Ô/Ñ0Ô0€DØ‡F‚Fˆ9•h˜q /¨4 / /µ4¸±8´8¸SÑAÔAÝ�R‘”�uð ñ &ô &ð &õ  �N€BˆˆB�Ø‡K‚K��R˜˜RÐ ­$°a€KÑ8Ô8Ð8Ø
€CØ‡F‚FˆB�"�r‘'˜AŸLšL¨µ4¸±8´8˜LÑ<Ô<Ñ<ÀÑAÑAØ�"‰W˜‰M˜BÑð Ø!$­4°©8¬8½$ð ñ @ô @ð @ð ‡F‚FˆB�•Q˜‘V˜SÐ!­°A€FÑ6Ô6Ð6ð �(Š(�5‰/Œ/€CØ
€{Ý˜uŸšÑ0Ô0µ3µt±9´9Ñ<Ô=‰ˆˆD�%Ø 4°%Ð8Ð8ˆØS 3 v¤;ÐSÐS°#°f´+ÐSÐSÀSÈÄ\ÐSÐS€HØ‡F‚Fˆ9•h˜q (­D°©H¬Hµa¸"±fÑ=Ô=Ý�R‘”�uð ñ &ô &ð &ð �8Š8�I�{¨9Ô5Ñ6Ô6°r¸°rÔ:€DØ€AØð ð ˆÝ�Q˜˜A ™F aÐ(Ñ(Ô(Ð(Ø	�Š��Aˆw�  D­$¨r©(¬(µA¸±GÑ<Ô<Ý˜‘H”H¥5ð 	ñ 	*ô 	*ð 	*à	ˆR‰ˆˆð �8Š8�JÝ" 5§?¢?Ñ#4Ô#4µs½>Ñ7JÔ7JÑ#JÔKñMô M€Då�A�t�T "™XœX¥q¨2¡vÑ.Ô.€DØ	
�Š�d¥ b¡¤ˆÑ	*Ô	*€BØ‡F‚F�Q�‰V�q‰L˜#Ð ­4°©8¬8½$€FÑ?Ô?Ð?Ø€JrI   c            	      óü  — t          j        ¦   «         } |                      dddg¬¦  «         |                      dd¬¦  «         |                      dd d	¬
¦  «         |                      dd ¬¦  «         |                      dd d¬
¦  «         |                      ¦   «         }|j        r$t
          j                             |j        ¦  «        nt
          j                             ¦   «         }i }|j        r@t          |j        ¦  «        5 }t          j        |¦  «        }d d d ¦  «         n# 1 swxY w Y   |j        r5|                     d|                     dt          d         ¦  «        ¦  «         |j        dk    rt#          ||¦  «        nt%          ||¦  «        }|j        |j        rdndz   }|j        pd|› d�}|                     |¦  «         t+          d|› d|j        d         › d|j        d         › d�¦  «         d S )NÚcardÚ
nightstandÚmorning)Úchoicesz	--weekendÚ
store_true)Úactionz--datazJSON file with card content)ÚdefaultÚhelpz--out)rÿ   z--datez4YYYY-MM-DD (default: today); drives countdowns/poolsr:   r<   Ú_weekendrÂ   z/opt/x4-cards/cards/z.pngzwrote rä   r   rz   r€   ú))ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsr±   ÚdtÚfromisoformatrª   rÌ   ÚopenÚjsonÚloadÚweekendÚ
setdefaultrÈ   rÊ   rù   rÔ   r÷   r«   ÚsaveÚprintrE   )ÚapÚargsrª   rÌ   ÚfrÍ   r¬   r«   s           rG   Úmainr    s<  € Ý	Ô	 Ñ	"Ô	"€BØ‡O‚O�F \°9Ð$=€OÑ>Ô>Ð>Ø‡O‚O�K¨€OÑ5Ô5Ð5Ø‡O‚O�H dÐ1N€OÑOÔOÐOØ‡O‚O�G T€OÑ*Ô*Ð*Ø‡O‚O�H dØOð ñ Qô Qð Qà�=Š=‰?Œ?€Dà04´	ÐN�BŒG×!Ò! $¤)Ñ,Ô,Ð,½r¼w¿}º}¹¼€Eà€DØ„yð  Ý�$”)‰_Œ_ð 	  Ý”9˜Q‘<”<ˆDð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 à„|ð CØ�Š˜
ØŸšÐ!3Ý!,Ð-?Ô!@ñBô Bñ	Cô 	Cð 	Cð (,¤y°LÒ'@Ð'@�,�t˜UÑ
#Ô
#Ð
#Ý˜D %Ñ(Ô(ð ð Œ9 d¤lÐ:˜
˜
¸Ñ;€DØ
Œ(Ð
7Ð7¨TÐ7Ð7Ð7€CØ‡H‚HˆS�M„M€MÝ	Ð
6�3Ð
6Ð
6˜#œ( 1œ+Ð
6Ð
6¨¬°¬Ð
6Ð
6Ð
6Ñ7Ô7Ð7Ð7Ð7s   ÄD&Ä&D*Ä-D*Ú__main__)F)rS   )r_   )rw   )&Ú__doc__r  Údatetimer  r
  ÚosÚsysÚPILr   r   r   rÅ   rÆ   rY   rZ   r—   ÚFONT_DIRÚpathrË   rC   rD   r±   r§   rï   rí   rÊ   rë   rH   rR   r^   rv   r|   r    r®   rÔ   r÷   r  Ú__name__r�   rI   rG   ú<module>r     s8  ððð ð@ €€€Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø 
€
€
€
à +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +à�€€1Ø€Ø€Ø€à-€Ø	Œ�Š�hÐ 5Ñ	6Ô	6€Ø
Œ�Š�XÐ/Ñ0Ô0€ð ˆgˆbŒg�d˜B Ñ"Ô"Ð#Ø��”˜˜r 2Ñ&Ô&Ð'ð€
ðð ð €ð&ð ð €ðF ÐDÐEØ%Ð'KÐLð=ð =ð =à4Ð4Ð4Ð?OÐ?OÐ?OÐPÐPØ Ø=Ø9ð;ð	ð 	€ð "€
ð?ð ?ð ?ð ?ðð ð ðOð Oð Oð Oð
9ð 9ð 9ð 9ðOð Oð Oð Oð+ð +ð +ð(	ð 	ð 	ðð ð ð6<ð <ð <ð~8ð 8ð 8ð< ˆzÒÐØ€D�F„F€F€F€Fð ÐrI   