ó
    òïÒj7  ã            	       óÒ	  • S r SSKrSSKJr  SSKJr  SSKJr  SSKJ	r	J
r
JrJrJrJrJrJrJr  \" 5         SSKrSSKrSSKrSSKrSSKJr  SSKJr  \	" \5      r\R<                  R?                  S	S
5      \l         S r!\RD                  S 5       r#\!" 5       r$\RJ                  RM                  SSS\" SS9S9  \RN                  RQ                  \RN                  RS                  \RN                  RU                  \+5      5      SS5      r,SSSS.r-S r.\." 5       r/\R`                  " 5         \Rb                  " 5         \Rd                  " 5         \Rf                  " \R<                  5        S r4S r5SXS jr6S r7S r8S r9\Ru                  S 5      S! 5       r;\Ru                  S"5      S# 5       r<\Ru                  S5      \5" S$5      S% 5       5       r=\Ru                  S5      \5" S&S'5      S( 5       5       r>\Ru                  S5      \5" S'5      S) 5       5       r?\Ru                  S*5      S+ 5       r@\Rƒ                  S,5      S- 5       rB\Rƒ                  S.5      \5" S&S'5      S/ 5       5       rC\R?                  S05      \5" 5       S1 5       5       rD\R?                  S25      \5" S$5      S3 5       5       rE\Rƒ                  S45      \5" S$5      S5 5       5       rF\Rƒ                  S65      \5" S$5      S7 5       5       rG\R?                  S85      \5" S&S'5      S9 5       5       rH\R?                  S:5      \5" S&S'5      S; 5       5       rI\Rƒ                  S<5      \5" S&S'5      S= 5       5       rJS> rK\R?                  S?5      \5" S&S'5      S@ 5       5       rL\Rƒ                  S?5      \5" S&S'5      SA 5       5       rM\Rƒ                  SB5      \5" S&S'5      SC 5       5       rN\Rƒ                  SD5      \5" S&S'5      SE 5       5       rO\Rƒ                  SF5      \5" S&S'5      SG 5       5       rPSH rQ\R?                  SI5      \5" S'5      SJ 5       5       rR\R?                  SK5      \5" S'5      SL 5       5       rS\Rƒ                  SK5      \5" S'5      SM 5       5       rT\Rƒ                  SN5      \5" S'5      SO 5       5       rU\Rƒ                  SP5      \5" S'5      SQ 5       5       rV\Rƒ                  SR5      \5" S'5      SS 5       5       rW\ST:X  a  \R±                  SUSVSSW9  gg)Yuœ   Le chat Mistou 2 â€“ interactive French for Grade 2.

Roles: admin (platform) -> parent (tenant, owns up to max_kids kids) -> kid (sub-tenant, the learner).é    N)Ú	timedelta©Úwraps)Úload_dotenv)	ÚFlaskÚrequestÚjsonifyÚsessionÚrender_templateÚredirectÚsend_from_directoryÚabortÚg)Úen)ÚLEXÚ
SECRET_KEYzfrench-gr2-dev-secretc                  ó  • SSK n U R                  5       nS HØ  n[        R                  R	                  [
        R                  U5      n[        [        R                  " U5      5       H„  nUR                  UR                  5       5        UR                  [        [        R                  R                  [        R                  R	                  X45      5      5      R                  5       5        M†     MÚ     UR                  5       SS $ )zgChanges whenever a script or stylesheet changes, so phones never run an old cached copy after a deploy.r   N)ÚjsÚcssé   )ÚhashlibÚmd5ÚosÚpathÚjoinÚappÚstatic_folderÚsortedÚlistdirÚupdateÚencodeÚstrÚgetmtimeÚ	hexdigest)r   ÚhÚsubÚdÚfs        Úapp.pyÚ_asset_versionr*      s§   € ãØ�‰‹€AÛˆÜ�G‰G�L‰Lœ×*Ñ*¨CÓ0ˆÜœŸ
š
 1›Ö&ˆAØ�H‰H�Q—X‘X“ZÔ  !§(¡(¬3¬r¯w©w×/?Ñ/?ÄÇÁÇÁÈQÓ@RÓ/SÓ+T×+[Ñ+[Ó+]Ö"^ó 'ñ ð �;‰;‹=˜˜!ÐÐó    c                  ó^   • [        [        R                  (       a  [        5       S9$ [        S9$ )N)Úv)Údictr   Údebugr*   ÚASSET_V© r+   r)   Ú_inject_versionr2   #   s   € ä¤c§i§i”.Ó"Ñ=Ð=´WÑ=Ð=r+   FTÚLaxé   )Údays)ÚJSON_AS_ASCIIÚSESSION_COOKIE_HTTPONLYÚSESSION_COOKIE_SAMESITEÚPERMANENT_SESSION_LIFETIMEÚstaticÚvocabÚ/z/parentz/admin)ÚkidÚparentÚadminc                  ó¸  • [         R                  " [        R                  5      n [        R
                   Vs/ s H  oS   PM	     sn[        R                   Vs/ s H  o"S   PM	     sn-   [        R                   Vs/ s H  o"S   PM	     sn-   [        R                   Vs/ s H  o3S   PM	     sn-   [        R
                   Vs/ s H  oS   PM	     sn-   [        R
                   Vs/ s H  oS   PM	     sn-   nU H:  n[         R                  " U5      nU(       d  M"  X`[         R                  " U5      '   M<     U $ s  snf s  snf s  snf s  snf s  snf s  snf )zOFrench -> English for the curriculum plus levels, badges and unit descriptions.é   ÚfrÚdesc_frÚtitle_fr)	ÚENÚbuildÚCURÚUNITSÚgamifyÚLEVELSÚBADGESÚlookupÚnorm)ÚmÚlÚbÚuÚextraÚsÚts          r)   Úbuild_enrU   .   s£  € ä
�Š”—‘Ó€AÜ!Ÿ=š=Ó)š=�aˆqŒT™=Ñ)¼f¿mºmÓ,Lºm¸¨t¬W¹mÑ,LÑLÔfl×fsÒfsÓOtÒfsÐabÐR[ÔP\ÑfsÑOtÑtô  OR÷  OXò  OXó  xYò  OXð  JKð  {Dô  yEñ  OXñ  xYñ  Yô  sv÷  s}ò  s}ó  \~ò  s}ð  noð  _hô  ]iñ  s}ñ  \~ñ  ~ô  Y\÷  Ycò  Ycó  Adò  Ycð  TUð  DNô  BOñ  Ycñ  Adñ  d€EÛˆÜ�IŠI�a‹Lˆßˆ1ØŒb�gŠg�a‹j‹Mñ ð €Hùò *ùÒ,LùÒOtùò  xYùò  \~ùò  Ads#   ·D>ÁEÁ=EÂ!EÃEÃ)Ec                  ó"  • S[         ;  av  [        R                  " S5      (       a*  [        R                  " [        R                  " S5      5      OSn U (       a  [        R                  " U 5      (       a  U OS[         l        [         R
                  $ )zbThe logged-in account, reloaded on every request so a suspension or deletion takes effect at once.ÚuserÚuidN)r   r
   ÚgetÚACCÚ	can_loginrW   ©rQ   s    r)   Úcurrent_userr]   B   sR   € à”QƒÜ+2¯;ª;°u×+=Ñ+=ŒC�GŠG”G—K’K Ó&Ô'À4ˆÞœCŸMšM¨!×,Ñ,‘°$ŒŒÜ�6‰6€Mr+   c                  ó   ^ • U 4S jnU$ )Nc                 ó4   >^ • [        T 5      U U4S j5       nU$ )Nc                  óF  >• [        5       n[        R                  R                  S5      nU(       d2  [        R
                  " 5         U(       a  [        SS9S4$ [        S5      $ T(       a0  US   T;  a'  U(       a  [        SS9S4$ [        [        US      5      $ T" U 0 UD6$ )	Nz/api/Únot_logged_in©Úerrori‘  ú/loginÚroleÚ
wrong_roleé“  )	r]   r   r   Ú
startswithr
   Úclearr	   r   ÚHOME)ÚaÚkwrQ   Úapir(   Úroless       €€r)   ÚwrapperÚ-login_required.<locals>.deco.<locals>.wrapperL   sŠ   ø€ ä“ˆAÜ—,‘,×)Ñ)¨'Ó2ˆCÞÜ—’”Þ@Cœ oÑ6¸Ð<Ð[ÌÐRZÓI[Ð[Þ˜˜6™¨%Ó/Þ=@œ lÑ3°SÐ9Ð_ÄhÌtÐTUÐV\ÑT]ÉÓF_Ð_Ù�a�;˜2‘;Ðr+   r   )r(   ro   rn   s   ` €r)   ÚdecoÚlogin_required.<locals>.decoK   s    ù€ Ü	ˆq‹õ	ó 
ð	ð ˆr+   r1   )rn   rq   s   ` r)   Úlogin_requiredrs   J   s   ø€ õð €Kr+   c                 ó   • [        U S9U4$ )Nrb   )r	   )ÚmsgÚcodes     r)   Úfailrw   Z   s   € Ü˜Ñ˜tÐ#Ð#r+   c                  ó>   • [         R                  " SSS9=(       d    0 $ )NT)ÚforceÚsilent)r   Úget_jsonr1   r+   r)   Úbodyr|   ^   s   € Ü×Ò $¨tÑ4×:¸Ð:r+   c                 óz   • [         R                  " U R                  S5      =(       d    S5      nU(       a  US   $ S$ )NÚcourse_levelrA   ÚbandÚkids)rG   ÚlevelrY   )r=   Úlvs     r)   Úkid_bandrƒ   b   s/   € Ü	�Š�3—7‘7˜>Ó*×/¨aÓ	0€BÞˆ2ˆf‰:Ð' Ð'r+   c                 ó¾   •  [         R                  " [        U 5      5      n[         R
                  " [        5       U5      (       a  U$ S$ ! [        [        4 a     gf = f)zPThe kid the caller may manage (admin: any kid; parent: only its own), else None.N)rZ   rY   ÚintÚ	TypeErrorÚ
ValueErrorÚcan_manage_kidr]   ©Úkid_idÚks     r)   Úmanaged_kidrŒ   g   sS   € ðÜ�GŠG”C˜“KÓ ˆô ×"Ò"¤<£>°1×5Ñ5ˆ1Ð?¸4Ð?øô ”zÐ"ó Ùðús   ‚A	 Á	AÁArd   c                  ód   • [        5       n U (       a  [        [        U S      5      $ [        S5      $ )Nre   z
login.html)r]   r   rj   r   r\   s    r)   Ú
login_pagerŽ   q   s*   € ä‹€AÞÜœ˜Q˜v™Y™Ó(Ð(Ü˜<Ó(Ð(r+   z/logoutc                  óB   • [         R                  " 5         [        S5      $ )Nrd   )r
   ri   r   r1   r+   r)   Úlogoutr�   y   s   € ä‡M‚M„OÜ�HÓÐr+   r=   c            	      óN   • [        5       n [        S[        U S   U S   U S   S9S9$ )Nzkid.htmlÚdisplay_nameÚidÚavatar)Únamer“   r”   )r=   )r]   r   r.   r\   s    r)   Úkid_pager–      s1   € ô 	‹€AÜ˜:¬4°Q°~Ñ5FÈ1ÈTÉ7Ð[\Ð]eÑ[fÑ+gÑhÐhr+   r>   r?   c                  óN   • [        S[        R                  " [        5       5      S9$ )Nzparent.html©Úme©r   rZ   Úpublicr]   r1   r+   r)   Úparent_pagerœ   †   s   € ô ˜=¬S¯ZªZ¼»Ó-GÑHÐHr+   c                  óN   • [        S[        R                  " [        5       5      S9$ )Nz
admin.htmlr˜   rš   r1   r+   r)   Ú
admin_pagerž   Œ   s   € ô ˜<¬C¯JªJ´|³~Ó,FÑGÐGr+   z/vocab/<key>.pngc                 ó†   • U R                  SS5      R                  5       (       d  [        S5        [        [        U S-   SS9$ )NÚ_Ú é”  ú.pngi€Q )Úmax_age)ÚreplaceÚisalnumr   r   Ú	VOCAB_DIR)Úkeys    r)   Ú	vocab_imgr©   ’   s6   € à�;‰;�s˜BÓ×'Ñ'×)Ñ)ÜˆcŒ
Üœy¨#°©,ÀÑFÐFr+   z
/api/loginc                  óT  • [        5       n [        R                  " U R                  SS5      U R                  SS5      5      u  pU(       a  [	        US5      $ [
        R                  " 5         [
        R                  " US   US   S9  S[
        l        [        SUS   [        US      S	9$ )
NÚusernamer¡   ÚpasswordéÈ   r“   re   )rX   re   T)Úokre   Úhome)r|   rZ   ÚauthenticaterY   rw   r
   ri   r    Ú	permanentr	   rj   )r'   rQ   Úerrs      r)   Ú	api_loginr³   ™   s„   € ä‹€AÜ×Ò˜aŸe™e J°Ó3°Q·U±U¸:ÀrÓ5JÓK�F€AÞ
Ü�C˜‹~ÐÜ‡M‚M„OÜ‡N‚N�q˜‘w Q v¡YÒ/Ø„GÔÜ�d  6¡´°a¸±i±ÑAÐAr+   z/api/account/passwordc                  óh  • [        5       n [        5       n[        R                  " XR	                  SS5      5      (       d  [        S5      $  [        R                  " US   U R	                  SS5      5        [        SS9$ ! [        R                   a  n[        [        U5      5      s S nA$ S nAff = f)NÚoldr¡   u6   ÙƒÙ„Ù…Ø© Ø§Ù„Ù…Ø±ÙˆØ± Ø§Ù„Ø­Ø§Ù„ÙŠØ© ØºÙŠØ± ØµØ­ÙŠØ­Ø©r“   ÚnewT©r®   )
r|   r]   rZ   Úcheck_pwrY   rw   Úset_passwordÚAccountErrorr"   r	   )r'   rQ   Úes      r)   Úapi_own_passwordr¼   ¥   s�   € ô 	‹€AÜ‹€AÜ�<Š<˜Ÿ5™5 ¨Ó+×,Ñ,ÜÐLÓMÐMðÜ×Ò˜˜4™ !§%¡%¨¨rÓ"2Ô3ô �dÑÐøô ×Ñó Ü”C˜“F‹|Õûðús   Á*A? Á?B1ÂB,Â&B1Â,B1z/api/curriculumc                  ó4  • [        5       n U S   S:X  a  U S   OSn[        R                  " U5      S   n[        [        R                  " U5      [        R                  " U5      U[
        R                  U   [
        R                  " U5      [        [        [        R                  R                  U[        R                  5      [        R                  R!                  ["        5      (       a,  [%        S [        R&                  " ["        5       5       5      S9	$ / S9	$ )Nre   r=   r~   rA   r   c              3   óZ   #   • U  H!  oR                  S 5      (       d  M  USS v •  M#     g7f)r£   Néüÿÿÿ)Úendswith)Ú.0r(   s     r)   Ú	<genexpr>Ú!api_curriculum.<locals>.<genexpr>»   s$   é € Ð[Ò/D¨!Ï
É
ÐSY×HZ›v˜q  "�vÒ/Dùs   ‚+Ÿ+)	ÚunitsÚcourser   ÚlevelsÚbadgesr   ÚlexÚavatarsÚimgs)r]   rG   r�   r	   Úunits_ofrI   ÚRANKSÚ
badges_forÚEN_MAPr   rZ   ÚAVATARS_BY_BANDrY   ÚAVATARSr   r   Úisdirr§   r   r   )rQ   Úlvlr   s      r)   Úapi_curriculumrÓ   ´   s  € ô 	‹€AØ  ™y¨EÓ1ˆ!ˆNÒ
°q€CÜ�9Š9�S‹>˜&Ñ!€DÜœŸš cÓ*´3·9²9¸S³>ÈÔU[×UaÑUaÐbfÑUgÔpv÷  qBò  qBð  CFó  qGô  LRô  X[ô  eh÷  exñ  ex÷  e|ñ  e|ð  }Aô  CF÷  CNñ  CNó  eOÜ_a×_fÑ_f×_lÑ_lÔmv×_wÑ_wœÑ[¬r¯zªz¼)Ô/DÓ[Ó[ñAð AØ}ñAð Ar+   z/api/mec            
      óø   • [        5       n [        R                  " U S   5      n[        [        R                  " U S   5      U[
        R                  " US   [        U 5      5      [        U S   5      U S   U S   S9$ )Nr“   ÚxpÚ
unlock_allr’   r”   )ÚprogressÚstatsr�   rÖ   r•   r”   )	r]   ÚdbrØ   r	   Úprogress_maprI   Úlevel_ofrƒ   Úbool)rQ   Ústs     r)   Úapi_merÞ   ¾   s   € ô 	‹€AÜ	�Š�!�D‘'Ó	€BÜœBŸOšO¨A¨d©GÓ4¸BÄfÇoÂoÐVXÐY]ÑV^Ô`hÐijÓ`kÓFlÔy}Ð~ð  AMñ  Nó  zOØ˜.Ñ)°!°H±+ñ?ð ?r+   z/api/me/avatarc                  óî   •  [         R                  " [        5       S   [        5       R	                  S5      S9  [        SS9$ ! [         R
                   a  n [        [        U 5      5      s S n A $ S n A ff = f)Nr“   r”   )r”   Tr·   )	rZ   r    r]   r|   rY   rº   rw   r"   r	   )r»   s    r)   Úapi_my_avatarrà   Ç   sZ   € ðÜ�
Š
”<“> $Ñ'´³·
±
¸8Ó0DÒEô �dÑÐøô ×Ñó Ü”C˜“F‹|Õûðús   ‚7A ÁA4ÁA/Á)A4Á/A4z/api/completec                  óD  ^• [        5       n U R                  S5      nU[        R                  ;  a  [	        S5      $ [        R
                  U   [        5       S   :w  a  [	        S5      $ [        R                  U   u  p#[        5       nUS   n[        R                  " XRXR                  SS5      U R                  SS5      US	   U R                  S
S5      [        U R                  S5      5      S9n[        R                  " U5      n[        R                  " U5      n/ n	[        R                  " Xx[        R                  [        R                  " US   5      US   5       HS  m[        R                   " UT5      (       d  M!  U	R#                  [%        U4S j[        R&                   5       5      5        MU     [        R                  " U5      n[        R(                  " U[        R                  U   5      n
[+        Xg[        R,                  " US   [/        U5      5      X˜U
S9$ )NÚactivity_idzunknown activityr~   z"this activity is not in your levelr“   Úscorer   ÚtotalÚpointsÚsecondsÚpartial)rç   c              3   ó<   >#   • U  H  oS    T:X  d  M  Uv •  M     g7f)r“   Nr1   )rÁ   ÚxrP   s     €r)   rÂ   Úapi_complete.<locals>.<genexpr>ã   s   øé € Ð"Lªm¨À¹wÈ!¹|§1¡1ªmùs   ƒ“	rÕ   )ÚresultrØ   r�   Ú
new_badgesr×   Úlesson_done)r|   rY   rG   Ú
ACTIVITIESrw   ÚLEVEL_OF_ACTIVITYr]   rÙ   Úrecord_attemptrÜ   rØ   rÚ   rI   Úcheck_badgesÚLESSONSrË   Úaward_badgeÚappendÚnextrK   rí   r	   rÛ   rƒ   )r'   ÚaidÚlidÚactrQ   rX   ÚresrÝ   r×   rì   rí   rP   s              @r)   Úapi_completerú   Ñ   sÏ  ø€ ô 	‹€AØ
�%‰%�Ó
€CØ
”#—.‘.Ó ÜÐ&Ó'Ð'Ü
×Ñ˜SÑ!¤\£^°NÑ%CÓCÜÐ8Ó9Ð9Ü�~‰~˜cÑ"�H€CÜ‹€AØ
ˆD‰'€CÜ
×
Ò
˜C c¯5©5°¸!Ó+<¸a¿e¹eÀGÈQÓ>OÐQTÐU]ÑQ^Ð`a×`eÑ`eÐfoÐqrÓ`sô  ~Bð  CD÷  CHñ  CHð  IRó  CSó  ~Tñ  U€CÜ	�Š�#‹€BÜ�Š˜sÓ#€HØ€JÜ× Ò  ¬s¯{©{¼C¿LºLÈÈ>ÑIZÓ<[Ð]^Ð_mÑ]nÖoˆÜ�>Š>˜#˜q×!Ó!Ø×ÑœdÔ"L¬f¯mªmÓ"LÓLÖMñ pô 
�Š�#‹€BÜ×$Ò$ X¬s¯{©{¸3Ñ/?Ó@€KÜ˜#¬v¯ª¸rÀ$¹xÌÐRSËÓ/UÐblð  NYñ  Zð  Zr+   z/api/kid/<int:kid_id>/overviewc                 óâ  • [        U 5      nU(       d  [        SS5      $ [        R                  " US   5      n[	        [
        R                  " U5      U[        R                  " US   [        U5      5      [        R                  " US   5      [        R                  " US   5      [        R                  " US   5      [        R                  " US   5      [        R                  " US   S5      S9$ )Nõ   ØºÙŠØ± Ù…Ø³Ù…ÙˆØ­rg   r“   rÕ   r~   é   )r=   rØ   r�   r×   ÚoutlinerÅ   rÇ   r5   )rŒ   rw   rÙ   rØ   r	   rZ   r›   rI   rÛ   rƒ   rÚ   rG   rþ   r�   rÍ   Ú
day_series)rŠ   r‹   rÝ   s      r)   Úapi_kid_overviewr   ê   só   € ô 	�FÓ€AÞÜÐ'¨Ó-Ð-Ü	�Š�!�D‘'Ó	€BÜ”s—z’z !“}¨B´f·o²oÀbÈÁhÔPXÐYZÓP[Ó6\Ôgi×gvÒgvÐwxÐy}Ñw~ÓgÜŸ;š; q¨Ñ'8Ó9Ä#Ç)Â)ÈAÈnÑL]ÓB^Ôgm×gxÒgxÐyzð  |Jñ  zKó  hLô  SU÷  S`ò  S`ð  abð  cgñ  ahð  jló  Smñnð nr+   z/api/kid/<int:kid_id>/historyc                 óh  • [        U 5      nU(       d  [        SS5      $ [        R                  R	                  5        VVVs0 s H?  u  nu  p4U[        US   [        R                  U   S   [        R                  U   S   S9_MA     nnnn[        [        R                  " US   S5      US9$ s  snnnf )	Nrü   rg   ÚtitleÚtitle_ar)r  ÚlessonÚ	lesson_arr“   iô  )ÚhistoryÚtitles)
rŒ   rw   rG   rî   Úitemsr.   rò   r	   rÙ   r  )rŠ   r‹   rö   r÷   rk   r  s         r)   Úapi_kid_historyr	  õ   sÕ   € ô 	�FÓ€AÞÜÐ'¨Ó-Ð-ô JM÷  JXñ  JX÷  J^ñ  J^ô  J`õ  aò  J`ñ  yFÐx{ñ  ~Fð  Bˆc”4˜a ™j´·±¸SÑ1AÀ'Ñ1JÔVY×VaÑVaÐbeÑVfÐgqÑVrÑsÒsñ  J`€Fò  aÜœ2Ÿ:š: a¨¡g¨sÓ3¸FÑCÐCùô as   ÁAB-z/api/kid/<int:kid_id>/resetc                 óÖ   • [        U 5      nU(       d  [        SS5      $ [        5       n[        R                  " US   UR                  S5      UR                  S5      5        [        SS9$ )Nrü   rg   r“   Ú	lesson_idrâ   Tr·   )rŒ   rw   r|   rÙ   ÚresetrY   r	   )rŠ   r‹   r'   s      r)   Úapi_kid_resetr  ÿ   sW   € ô 	�FÓ€AÞÜÐ'¨Ó-Ð-Ü‹€AÜ‡H‚HˆQˆt‰W�a—e‘e˜KÓ(¨!¯%©%°Ó*>Ô?Ü�dÑÐr+   c                  ó^  • [        5       n U S   S:X  a  U $ [        R                  R                  S5      =(       d    [	        5       R                  S5      nU(       a=  [        U5      R                  5       (       a  [        R                  " [        U5      5      OSnU(       a  US   S:X  a  U$ S$ )zfThe parent whose kids the request is about: a parent itself, or the admin's ?parent= / body parent_id.re   r>   Ú	parent_idN)	r]   r   ÚargsrY   r|   r"   ÚisdigitrZ   r…   )rQ   ÚpidÚps      r)   Ú_parent_scoper    s~   € ä‹€AØˆ�y�HÓØˆÜ
�,‰,×
Ñ
˜8Ó
$×
?¬«¯
©
°;Ó(?€CÞ ¤S¨£X×%5Ñ%5×%7Ñ%7Œ�Š”�C“Ô¸T€AÞ�a˜‘i 8Ó+ˆ1Ð5°Ð5r+   z	/api/kidsc                  ó&  • [        5       n U S   S:X  a†  [        R                  R                  S5      (       db  [	        [
        R                  " 5       [
        R                  " 5        Vs0 s H  oS   U_M
     sn[
        R                  [        R                  S9$ [        5       nU(       d  [        SS5      $ [	        [
        R                  " US   5      [
        R                  " U5      US   [
        R                  [        R                  S	9$ s  snf )
Nre   r?   r>   r“   )r€   ÚparentsrÉ   rÆ   õ#   ÙˆÙ„ÙŠ Ø§Ù„Ø£Ù…Ø± ØºÙŠØ± Ù…ÙˆØ¬ÙˆØ¯r¢   Úmax_kids)r€   r>   r  rÉ   rÆ   )r]   r   r  rY   r	   rZ   Úall_kidsr  rÐ   rG   rJ   r  rw   Úkids_ofr›   )rQ   r  s     r)   Úapi_kidsr    s×   € ô 	‹€AØˆ�y�GÓ¤G§L¡L×$4Ñ$4°X×$>Ñ$>ÜœCŸLšL›NÌÏÊÌÓ4WÊÀA°t±W¸a²ZÉÑ4WÔad×alÑalÔux×uÑuñ  Að  	AÜ‹€AÞÜÐ9¸3Ó?Ð?ÜœŸš A d¡GÓ,´S·Z²ZÀ³]ÈQÈzÉ]Ôdg×doÑdoÔx{÷  yCñ  yCñ  Dð  Dùò	 5Xs   Á(D
c                  ó  • [        5       n U (       d  [        S5      $ [        5       nUR                  S5      =(       d    [        R
                  " 5       n [        R                  " SUR                  S5      UR                  S5      X S   UR                  SS5      UR                  S	S
5      S9n[        S[        R                  " U5      US9$ ! [        R                   a  n[        [        U5      5      s S nA$ S nAff = f)Nu   Ø§Ø®ØªØ± ÙˆÙ„ÙŠ Ø§Ù„Ø£Ù…Ø±r¬   r=   r«   r’   r“   r”   r¡   r~   rA   )r  r”   r~   T)r®   r=   r¬   )r  rw   r|   rY   rZ   Úgen_passwordÚcreaterº   r"   r	   r›   )r  r'   r¬   r‹   r»   s        r)   Úapi_kid_creater  !  sÏ   € ô 	‹€AÞÜÐ0Ó1Ð1Ü‹€AØ�u‰u�ZÓ ×6¤C×$4Ò$4Ó$6€HðÜ�JŠJ�u˜aŸe™e JÓ/°·±°~Ó1FÈÐ^bÑ\cÐlm×lqÑlqÐrzÐ|~ÓlØ$%§E¡E¨.¸!Ó$<ñ>ˆô �d¤§
¢
¨1£¸ÑAÐAøô ×Ñó Ü”C˜“F‹|Õûðús   ÁAC ÃD Ã"C;Ã5D Ã;D z/api/kids/<int:kid_id>c           
      ón  • [        U 5      nU(       d  [        SS5      $ [        5       n [        R                  " US   40 S Vs0 s H  o3U;   d  M
  X2U   _M     snD6n[        S[        R                  " U5      S9$ s  snf ! [        R
                   a  n[        [        U5      5      s S nA$ S nAff = f)Nrü   rg   r“   )r’   r”   rÖ   Úactiver~   T)r®   r=   )	rŒ   rw   r|   rZ   r    rº   r"   r	   r›   )rŠ   r‹   r'   r(   r»   s        r)   Úapi_kid_updater"  1  s·   € ô 	�FÓ€AÞÜÐ'¨Ó-Ð-Ü‹€AðÜ�JŠJ�q˜‘wñ  CÑ4vó  #BÒ4v¨qð  @Añ  {A£7 1¨¡d¢7Ñ4vñ  #Bñ  Cˆô �d¤§
¢
¨1£Ñ.Ð.ùò #BøÜ×Ñó Ü”C˜“F‹|Õûðús5   ªB Á	A=Á	A=ÁB Á=B ÂB4ÂB/Â)B4Â/B4z/api/kids/<int:kid_id>/passwordc                 ób  • [        U 5      nU(       d  [        SS5      $ [        5       R                  S5      =(       d    [        R
                  " 5       n [        R                  " US   U5        [        SX!S   S9$ ! [        R                   a  n[        [        U5      5      s S nA$ S nAff = f)Nrü   rg   r¬   r“   Tr«   ©r®   r¬   r«   )
rŒ   rw   r|   rY   rZ   r  r¹   rº   r"   r	   )rŠ   r‹   r¬   r»   s       r)   Úapi_kid_passwordr%  ?  s�   € ô 	�FÓ€AÞÜÐ'¨Ó-Ð-Ü‹v�z‰z˜*Ó%×;¬×)9Ò)9Ó);€HðÜ×Ò˜˜4™ (Ô+ô �d X¸*¹ÑFÐFøô ×Ñó Ü”C˜“F‹|Õûðús   ÁA< Á<B.ÂB)Â#B.Â)B.z/api/kids/<int:kid_id>/deletec                 ó‚   • [        U 5      nU(       d  [        SS5      $ [        R                  " US   5        [	        SS9$ )Nrü   rg   r“   Tr·   )rŒ   rw   rZ   Údeleter	   r‰   s     r)   Úapi_kid_deleter(  M  s:   € ô 	�FÓ€AÞÜÐ'¨Ó-Ð-Ü‡J‚Jˆq�‰wÔÜ�dÑÐr+   c                 óV   • [         R                  " U 5      nU(       a  US   S:X  a  U$ S $ )Nre   r>   )rZ   rY   )r  r  s     r)   Ú_parentr*  X  s'   € Ü�Š�‹€AÞ�a˜‘i 8Ó+ˆ1Ð5°Ð5r+   z/api/admin/summaryc                  ó>   • [        [        R                  " 5       5      $ )N)r	   rZ   Úsummaryr1   r+   r)   Úapi_admin_summaryr-  ]  s   € ô ”3—;’;“=Ó!Ð!r+   z/api/admin/parentsc                  ó:   • [        [        R                  " 5       S9$ )N)r  )r	   rZ   r  r1   r+   r)   Úapi_admin_parentsr/  c  s   € ô œ3Ÿ;š;›=Ñ)Ð)r+   c            
      óÀ  • [        5       n U R                  S5      =(       d    [        R                  " 5       n [        R                  " SU R                  S5      U R                  S5      XR                  S[        R
                  5      S9n[        S[        R                  " U5      US9$ ! [        R                   a  n[        [        U5      5      s S nA$ S nAff = f)	Nr¬   r>   r«   r’   r  )r  T)r®   r>   r¬   )r|   rY   rZ   r  r  ÚDEFAULT_MAX_KIDSrº   rw   r"   r	   r›   )r'   r¬   r  r»   s       r)   Úapi_admin_parent_creater2  i  sµ   € ô 	‹€AØ�u‰u�ZÓ ×6¤C×$4Ò$4Ó$6€HðÜ�JŠJ�x §¡ zÓ!2°A·E±E¸.Ó4IÈ8×^cÑ^cÐdnÔps÷  qEñ  qEó  _Fñ  Gˆô �d¤3§:¢:¨a£=¸8ÑDÐDøô ×Ñó Ü”C˜“F‹|Õûðús   ¹AB+ Â+CÂ?CÃCÃCz/api/admin/parents/<int:pid>c           
      ód  • [        U 5      (       d  [        SS5      $ [        5       n [        R                  " U 40 S Vs0 s H  o"U;   d  M
  X!U   _M     snD6n[        S[        R                  " U5      S9$ s  snf ! [        R
                   a  n[        [        U5      5      s S nA$ S nAff = f)Nr  r¢   )r’   r  r!  T)r®   r>   )	r*  rw   r|   rZ   r    rº   r"   r	   r›   )r  r'   r(   r  r»   s        r)   Úapi_admin_parent_updater4  u  s›   € ô �3�<‰<ÜÐ9¸3Ó?Ð?Ü‹€AðÜ�JŠJ�sÑbÑ0VÓaÒ0V¨1Ð_`ÑZ`›w˜q A¡$šwÑ0VÑaÑbˆô �d¤3§:¢:¨a£=Ñ1Ð1ùò bøÜ×Ñó Ü”C˜“F‹|Õûðús4   ¨A= ¿	A8Á	A8ÁA= Á8A= Á=B/ÂB*Â$B/Â*B/z%/api/admin/parents/<int:pid>/passwordc                 óZ  • [        U 5      nU(       d  [        SS5      $ [        5       R                  S5      =(       d    [        R
                  " 5       n [        R                  " X5        [        SX!S   S9$ ! [        R                   a  n[        [        U5      5      s S nA$ S nAff = f)Nr  r¢   r¬   Tr«   r$  )
r*  rw   r|   rY   rZ   r  r¹   rº   r"   r	   )r  r  r¬   r»   s       r)   Úapi_admin_parent_passwordr6  ‚  sˆ   € ô 	�‹€AÞÜÐ9¸3Ó?Ð?Ü‹v�z‰z˜*Ó%×;¬×)9Ò)9Ó);€HðÜ×Ò˜Ô'ô �d X¸*¹ÑFÐFøô ×Ñó Ü”C˜“F‹|Õûðús   ÁA8 Á8B*ÂB%ÂB*Â%B*z#/api/admin/parents/<int:pid>/deletec                 óz   • [        U 5      (       d  [        SS5      $ [        R                  " U 5      n[	        SUS9$ )Nr  r¢   T)r®   Údeleted)r*  rw   rZ   r'  r	   )r  Úns     r)   Úapi_admin_parent_deleter:  �  s5   € ô �3�<‰<ÜÐ9¸3Ó?Ð?Ü�
Š
�3‹€AÜ�d AÑ&Ð&r+   Ú__main__z0.0.0.0iÄ  )ÚhostÚportr/   )i�  )YÚ__doc__r   Údatetimer   Ú	functoolsr   Údotenvr   Úflaskr   r   r	   r
   r   r   r   r   r   rÙ   rI   ÚaccountsrZ   Ú
curriculumrG   r   rE   Úcurriculum.en_lexiconr   Ú__name__r   ÚenvironrY   Ú
secret_keyr*   Úcontext_processorr2   r0   Úconfigr    r   r   ÚdirnameÚabspathÚ__file__r§   rj   rU   rÎ   Úinit_dbÚmigrate_timezoneÚmigrateÚ	bootstrapr]   rs   rw   r|   rƒ   rŒ   ÚrouterŽ   r�   r–   rœ   rž   r©   Úpostr³   r¼   rÓ   rÞ   rà   rú   r   r	  r  r  r  r  r"  r%  r(  r*  r-  r/  r2  r4  r6  r:  Úrunr1   r+   r)   Ú<module>rU     sÃ  ðñjó 
Ý Ý Ý ß l× lÕ lá „ã 	Û Û Û Ý Ý %áˆHƒo€Ø—‘—‘ Ð.EÓF€„òð ×Ññ>ó ð>ñ Ó
€Ø ‡
�
× Ñ  ¸tÐ]bñ  @Ið  OQñ  @RÐ ñ  SØ�G‰G�L‰L˜Ÿ™Ÿ™¨¯©¯©¸Ó)BÓCÀXÈwÓW€	Ø˜i°(Ñ;€òñ 
‹€à ‡
‚
„Ø × Ò Ô Ø ‡‚„Ø ‡‚ˆb�j‰jÔ òòô $ò;ò(ò
@ð ‡�ˆ8Óñ)ó ð)ð ‡�ˆ9Óñó ðð
 ‡�ˆ3ƒÙ�Óñió ó ðið
 ‡�ˆ9ÓÙ�˜'Ó"ñIó #ó ðIð ‡�ˆ8ÓÙ�ÓñHó ó ðHð ‡�ÐÓñGó ðGð ‡�ˆ,ÓñBó ðBð ‡�Ð
!Ó"Ù�˜'Ó"ñ	ó #ó #ð	ð ‡�Ð	ÓÙÓñAó ó ðAð ‡�ˆÓÙ�Óñ?ó ó ð?ð ‡�Ð
ÓÙ�Óñó ó ðð ‡�ˆ/ÓÙ�ÓñZó ó ðZð. ‡�Ð	)Ó*Ù�˜'Ó"ñnó #ó +ðnð ‡�Ð	(Ó)Ù�˜'Ó"ñDó #ó *ðDð ‡�Ð
'Ó(Ù�˜'Ó"ñó #ó )ðò6ð ‡�ˆÓÙ�˜'Ó"ñDó #ó ðDð ‡�ˆ+ÓÙ�˜'Ó"ñBó #ó ðBð ‡�Ð
"Ó#Ù�˜'Ó"ñ	/ó #ó $ð	/ð ‡�Ð
+Ó,Ù�˜'Ó"ñ	Gó #ó -ð	Gð ‡�Ð
)Ó*Ù�˜'Ó"ñó #ó +ðò6ð
 ‡�Ð	ÓÙ�Óñ"ó ó ð"ð ‡�Ð	ÓÙ�Óñ*ó ó ð*ð ‡�Ð
ÓÙ�ÓñEó ó  ðEð ‡�Ð
(Ó)Ù�Óñ2ó ó *ð2ð ‡�Ð
1Ó2Ù�Óñ	Gó ó 3ð	Gð ‡�Ð
/Ó0Ù�Óñ'ó ó 1ð'ð ˆzÓØ‡G�G� ¨T€GÒ2ð r+   