π
<-
Chat plein-écran
[^]

Découvre les participations au concours de Noël Casio 2021

Découvre les participations au concours de Noël Casio 2021

Message non lude critor » 02 Fév 2022, 10:05

Collègien(ne), lycéen(ne) ou enseignant(e) en matière scientifique, jusqu'à ce lundi 31 janvier Casio t'a permis de participer à son formidable concours de Noël 2021.

Il te suffisait de programmer sur ta calculatrice Casio ou son émulateur ta liste au Père Noël, avec 3 catégories au choix :
  • catégorie étudiants : pour les participations individuelles d'élèves de collège ou lycée uniquement malgré le nom
  • catégorie professeurs : pour les participations individuelles des enseignant(e)s de matière scientifique en collège ou lycée
  • catégorie classe : pour les participations collectives de classes de collège ou lycée

Pour réaliser ton dessin, tu pouvais choisir entre les 2 technologies suivantes :
  • calculatrice scientifique fx-92+ Spéciale Collège avec son application Algorithmique t'offrant un langage de tracé à la Scratch/Logo
  • calculatrice graphique Graph 35+E II ou Graph 90+E avec son application Python

Pour chacune des 3 catégories étaient à gagner 2 superbes gros lots ; 1 pour le meilleur dessin sur fx-92+ Spéciale Collège, et 1 pour le meilleur dessin sur Graph 90/35+E II :
  • catégorie étudiants : console de jeux Nintendo Switch d'une valeur de 269,99€
  • catégorie professeurs : trottinette électrique d'une valeur de 199,99€
  • catégorie classe : 5 calculatrices graphiques au choix + montre Casio pour le professeur et chacun des élèves
    (calculatrice Graph 35+E II ou Graph 90+E + montre G-Shock ou vintage dans la limite de 35 élèves)
Et en prime avec Casio, pas de perdant : lot de goodies Casio pour tous les autres participants !
1432714658

Un superbe concours, merci Casio ! :favorite:

Le concours devait initialement se terminer le 7 janvier, mais la période de participation a été prolongée au dernier moment jusqu'au 31 janvier.

Nous avions très hâte de pouvoir te présenter les productions réalisées que nous espérions à la mesure de l'événement. Plusieurs candidats nous les ont fort aimablement partagées, découvrons tout cela ensemble.




  1. Hors concours Graph 90+E Python :
  2. Professeurs Graph 90+E Python :
  3. Classes Graph 90+E Python :
  4. Etudiants fx-92+ Spéciale Collège :




Hors concours Graph 90+E - Classpad III fx-CP600 - critor

Go to top

J'ai envoyé une participation pour représenter TI-Planet le soir de la date butoir initiale, en précisant bien que c'était pour le plaisir. Je ne souhaite en effet piquer de gros lots à personne ; même si il s'agit de très grots lots, il n'y en a que 6.

J'ai donc l'honneur et le plaisir de vous partager ma participation finale comme promis, préparée avec soin un petit peu chaque jour à compter de début décembre. Le script fait 1453 lignes et 73,717 Ko ; le script Python le plus gros jamais sorti sur machines Casio ! :D
(et ce n'est pas demain la veille qu'il tournera sur les modèles de milieu de gamme concurrents... :P)

Il s'agit non pas d'un simple dessin mais d'une véritable animation qui prend 15 minutes environ sur simulateur USB avant de boucler indéfiniment. Elle est à la gloire d'un future modèle haut de gamme, la Casio Classpad III fx-CP600 qui, je l'espère, aura une application Python avec une fonction get_key() dedans.

"Dessiner sa liste au Père Noël" je trouver cette consigne un petit peu trop terre à terre, trop concrète ; j'ai pensé faire l'original en y répondant de façon meta (ou mise en abyme si tu préfères) : sur l'écran de Graph 90+E je dessine donc une calculatrice fx-CP600, et sur l'écran dessiné de cette fx-CP600 je dessine les anciennes application Classpad ainsi que la nouvelle application Classpad Python. Si j'avais su, attends de voir les participations qui vont suivre... ;)

L'animation commence par présenter la frise chronologique des modèles Casio Classpad couleur, avant de faire intervenir le Père Noël pour la livraison de la fx-CP600 :


Pour les affichages, j'ai codé une classe qui me sert de calque et permet ainsi :
  • d'afficher un objet à différents endroits de l'écran
  • d'afficher un objet sous forme zoomée/dézoomée
  • d'afficher des rotations à 90° d'un objet
  • d'animer des déplacements
  • d'animer des zooms

Concernant les diverses images utilisées pour les calculatrices et leurs écrans, elles ont été conçues avec un logiciel de retouche d'images avant d'être converties en code Python pour Graph 90+E à l'aide de l'outil de conversion en ligne img2calc.

Concernant les inscriptions sous forme de texte, comme la méthode officielle casioplot.draw_string() ne permet ni les rotations ni les zooms j'ai dû tout refaire, c'est-à-dire recoder intégralement en Python la police de caractères. Ce fut d'ailleurs l'occasion d'inclure différentes tailles de polices, afin d'avoir un meilleur affichage en fonction du niveau de zoom. Il s'agit toutes de polices présentes sur Graph 35+E II ou Graph 90+E, extraites à l'aide d'un script Python à coups de get_pixel() :
  • 5 pixels de hauteur (police "small/medium" Graph 35+E II)
  • 7 pixels de hauteur (police "large" Graph 35+E II)
  • 10 pixels de hauteur (police "small" Graph 90+E)
Maintenant que les données de polices sont directement dans notre script, on peut effectivement les afficher comme on veut, selon différents niveaux de zoom ou différentes orientations.
Ces polices ont au passage été étendues de quelques caractères spéciaux absents qui étaient nécessaires ici.

Voici enfin une capture animée de ma participation ; ne pas hésiter à la jouer en vitesse x2 :

Code: Tout sélectionner
# My animated Christmas Wish List :
# + CASIO Classpad II fx-CP600
# + with Python app
# + and with getKey function
# Thanks

from math import sqrt, ceil, cos
from casioplot import *

#############################
# font globals
#############################
FONT_INTERSPACE = 1

########################
# non-graphic functions
########################
def iround(x): return int(round(x, 0))

def sign(x): return x>0 and 1 or x<0 and -1

def cos90(a):
  a %= 4
  return a==0 and 1 or a==2 and -1

def sin90(a):
  a %= 4
  return a==1 and 1 or a==3 and -1

def nullbits(n):
  k = 0
  while n and not (n % 2):
    n //= 2
    k += 1
  return k

#################
# font functions
#################
def blank_char(font_h):
  return [0 for k in range(font_h)]

def complete_font(font_bm, n, val):
  while(len(font_bm) < n):
    font_bm.append(val)

def shift_char_left(char_bm):
  kbits = -1
  for v in char_bm:
    if v:
      kv = nullbits(v)
      if kbits < 0:
        kbits = kv
      else:
        kbits = min(kbits, kv)
  if kbits >= 0:
    k = 2 ** kbits
    if k > 1:
      for i in range(len(char_bm)):
        char_bm[i] //= k

def shift_font_left(font_bm):
  for char_bm in font_bm:
    shift_char_left(char_bm)

def gen_font_widths(font_bm):
  font_h = len(font_bm[0])
  for char_bm in font_bm:
    if len(char_bm) <= font_h:
      char_w = 0
      for row in char_bm:
        row_w = 0
        while row:
          row_w += 1
          row //= 2
        if not char_w: char_w = 2 * FONT_INTERSPACE
        char_w = max(char_w, row_w)
      char_bm.append(char_w + FONT_INTERSPACE)


#############################
# font data + initialization
#############################
# most chars come from the Graph 35+E II or Graph 90+E

font_h_l = []
font_bm_l = []

font_h_l.append(5)
blank = blank_char(font_h_l[-1])
font_bm_l.append([
[ 4,14,21,17,14], # added power symbol
[ 4, 2,31, 2, 4], # added left arrow
[ 4, 8,31, 8, 4], # added right arrow
[ 8,12,14,12, 8], # added left arrow head
[ 2, 6,14, 6, 2], # added right arrow head
[ 0, 4,14,31, 0], # added top arrow head
[ 0,31,14, 4, 0], # added bottom arrow head
[ 4,10,17,10,14], # added shift symbol
[20,18,31, 2, 4], # added enter symbol
[21,14,27,14,21], # added gear
])
complete_font(font_bm_l[-1], 33, blank)
font_bm_l[-1].extend([
[ 1, 1, 1, 0, 1], #!
[ 5, 5, 0, 0, 0], #"
[10,31,10,31,10], ##
[30, 5,14,20,15], #$
[ 0, 9, 4, 2, 9], #%
[ 2, 5, 2, 5,11], #&
[ 3, 1, 1, 0, 0], #'
[ 2, 1, 1, 1, 2], #(
[ 1, 2, 2, 2, 1], #)
[ 0,21,14,21, 0], #*
[ 0, 2, 7, 2, 0], #+
[ 0, 0, 3, 2, 1], #,
[ 0, 0, 7, 0, 0], #-
[ 0, 0, 0, 3, 3], #.
[ 0, 4, 2, 1, 0], #/
[ 7, 5, 5, 5, 7], #0
[ 2, 2, 2, 2, 2], #1
[ 7, 4, 7, 1, 7], #2
[ 7, 4, 7, 4, 7], #3
[ 5, 5, 5, 7, 4], #4
[ 7, 1, 7, 4, 7], #5
[ 7, 1, 7, 5, 7], #6
[ 7, 5, 4, 4, 4], #7
[ 7, 5, 7, 5, 7], #8
[ 7, 5, 7, 4, 7], #9
[ 3, 3, 0, 3, 3], #:
[ 3, 3, 0, 2, 1], #;
[ 4, 2, 1, 2, 4], #<
[ 0, 7, 0, 7, 0], #=
[ 1, 2, 4, 2, 1], #>
[ 3, 4, 2, 0, 2], #?
[14,16,22,25,14], #@
[ 2, 5, 7, 5, 5], #A
[ 3, 5, 3, 5, 3], #B
[ 6, 1, 1, 1, 6], #C
[ 3, 5, 5, 5, 3], #D
[ 7, 1, 7, 1, 7], #E
[ 7, 1, 7, 1, 1], #F
[ 6, 1, 5, 5, 6], #G
[ 5, 5, 7, 5, 5], #H
[ 7, 2, 2, 2, 7], #I
[ 4, 4, 4, 5, 2], #J
[ 9, 5, 3, 5, 9], #K
[ 1, 1, 1, 1, 7], #L
[17,27,21,17,17], #M
[17,19,21,25,17], #N
[ 2, 5, 5, 5, 2], #O
[ 3, 5, 3, 1, 1], #P
[14,17,21, 9,22], #Q
[ 3, 5, 3, 5, 5], #R
[ 6, 1, 2, 4, 3], #S
[ 7, 2, 2, 2, 2], #T
[ 5, 5, 5, 5, 7], #U
[ 5, 5, 5, 5, 2], #V
[17,17,21,21,10], #W
[ 5, 5, 2, 5, 5], #X
[ 5, 5, 2, 2, 2], #Y
[ 7, 4, 2, 1, 7], #Z
[ 3, 1, 1, 1, 3], #[
[ 0, 1, 2, 4, 0], #\ modified
[ 3, 2, 2, 2, 3], #]
[ 2, 5, 0, 0, 0], #^
[ 0, 0, 0, 0, 7], #_
[ 3, 1, 2, 0, 0], #`
[ 2, 4, 6, 5, 6], #a
[ 1, 1, 7, 5, 3], #b
[ 0, 6, 1, 1, 6], #c
[ 4, 4, 7, 5, 6], #d
[ 2, 5, 7, 1, 6], #e
[ 4, 2, 7, 2, 2], #f
[ 6, 5, 6, 4, 3], #g
[ 1, 1, 3, 5, 5], #h
[ 0, 1, 0, 1, 1], #i
[ 4, 0, 4, 5, 2], #j
[ 1, 1, 5, 3, 5], #k
[ 3, 2, 2, 2, 7], #l
[ 0,11,21,21,21], #m
[ 0, 5,11, 9, 9], #n
[ 0, 2, 5, 5, 2], #o
[ 0, 3, 5, 3, 1], #p
[ 0, 6, 5, 6, 4], #q
[ 0,13, 3, 1, 1], #r
[ 6, 1, 2, 4, 3], #s
[ 2, 7, 2, 2, 4], #t
[ 0, 5, 5, 5, 7], #u
[ 0, 5, 5, 5, 2], #v
[ 0,17,21,21,10], #w
[ 0, 5, 2, 5, 5], #x
[ 0, 5, 5, 2, 1], #y
[ 0, 7, 2, 1, 7], #z
[ 6, 2, 1, 2, 6], #{
[ 1, 1, 1, 1, 1], #|
[ 3, 2, 4, 2, 3], #}
[ 0,10, 5, 0, 0], #~
])
complete_font(font_bm_l[-1], 215, blank)
font_bm_l[-1].append([0,5,2,5,0]) # added multiplication symbol
complete_font(font_bm_l[-1], 232, blank)
font_bm_l[-1].append([ 2, 5, 7, 1, 6]) #e instead of e-grave
font_bm_l[-1].append([ 2, 5, 7, 1, 6]) #e instead of e-acute
complete_font(font_bm_l[-1], 247, blank)
font_bm_l[-1].append([2,0,7,0,2]) # added division symbol

shift_font_left(font_bm_l[-1])
gen_font_widths(font_bm_l[-1])

font_h_l.append(7)
blank = blank_char(font_h_l[-1])
font_bm_l.append([
[ 8,42, 73, 65, 65,65,62], # added power symbol
[ 8, 4,  2,127,  2, 4, 8], # added left arrow
[ 8,24, 56,127, 56,24, 8], # added right arrow
[16,24, 28, 30, 28,24,16], # added left arrow head
[ 4,12, 28, 60, 28,12, 4], # added right arrow head
[ 0, 8, 28, 62,127, 0, 0], # added top arrow head
[ 0, 0,127, 62, 28, 8, 0], # added bottom arrow head
[ 8,20, 34, 65, 34,34,62], # added shift symbol
[64,64, 68, 66,127, 2, 4], # added enter symbol
[ 8,42, 20, 99, 20,42, 8], # added gear
])
complete_font(font_bm_l[-1], 33, blank)
font_bm_l[-1].extend([
[ 8, 8, 8, 8, 8, 0, 8], #!
[20,20,20, 0, 0, 0, 0], #"
[20,20,62,20,62,20,20], ##
[ 8,60,10,28,40,30, 8], #$
[ 6,38,16, 8, 4,50,48], #%
[12,18,10, 4,42,18,44], #&
[12, 8, 4, 0, 0, 0, 0], #'
[16, 8, 4, 4, 4, 8,16], #(
[ 4, 8,16,16,16, 8, 4], #)
[ 0, 8,42,28,28,42, 8], #*
[ 0, 8, 8,62, 8, 8, 0], #+
[ 0, 0, 0, 0,12, 8, 4], #,
[ 0, 0, 0,62, 0, 0, 0], #-
[ 0, 0, 0, 0, 0,12,12], #.
[ 0,32,16, 8, 4, 2, 0], #/
[28,34,50,42,38,34,28], #0
[ 8,12, 8, 8, 8, 8,28], #1
[28,34,32,16, 8, 4,62], #2
[62,16, 8,16,32,34,28], #3
[16,24,20,18,62,16,16], #4
[62, 2,30,32,32,34,28], #5
[24, 4, 2,30,34,28, 0], #6
[62,32,16, 8, 8, 8, 8], #7
[28,34,34,28,34,34,28], #8
[28,34,34,60,32,16,12], #9
[ 0,12,12, 0,12,12, 0], #:
[ 0,12,12, 0,12, 8, 4], #;
[16, 8, 4, 2, 4, 8,16], #<
[ 0, 0,62, 0,62, 0, 0], #=
[ 4, 8,16,32,16, 8, 4], #>
[28,34,32,16, 8, 0, 8], #?
[28,34,32,44,42,42,28], #@
[28,34,34,62,34,34,34], #A
[30,34,34,30,34,34,30], #B
[28,34, 2, 2, 2,34,28], #C
[14,18,34,34,34,18,14], #D
[62, 2, 2,30, 2, 2,62], #E
[62, 2, 2,30, 2, 2, 2], #F
[28,34, 2,58,34,34,60], #G
[34,34,34,62,34,34,34], #H
[28, 8, 8, 8, 8, 8,28], #I
[56,16,16,16,16,18,12], #J
[34,18,10, 6,10,18,34], #K
[ 2, 2, 2, 2, 2, 2,62], #L
[34,54,42,42,34,34,34], #M
[34,34,38,42,50,34,34], #N
[28,34,34,34,34,34,28], #O
[30,34,34,30, 2, 2, 2], #P
[28,34,34,34,42,18,44], #Q
[30,34,34,30,10,18,34], #R
[28,34, 2,28,32,34,28], #S
[62, 8, 8, 8, 8, 8, 8], #T
[34,34,34,34,34,34,28], #U
[34,34,34,34,34,20, 8], #V
[34,34,42,42,42,42,20], #W
[34,34,20, 8,20,34,34], #X
[34,34,34,20, 8, 8, 8], #Y
[62,32,16, 8, 4, 2,62], #Z
[28, 4, 4, 4, 4, 4,28], #[
[ 0, 2, 4, 8,16,32, 0], #\
[28,16,16,16,16,16,28], #]
[ 8,20,34, 0, 0, 0, 0], #^
[ 0, 0, 0, 0, 0, 0,62], #_
[12, 8,16, 0, 0, 0, 0], #`
[ 0, 0,28,32,60,34,60], #a
[ 2, 2,26,38,34,34,30], #b
[ 0, 0,28, 2, 2,34,28], #c
[32,32,44,50,34,34,60], #d
[ 0, 0,28,34,62, 2,28], #e
[48, 8,28, 8, 8, 8, 8], #f
[ 0, 0,60,34,60,32,28], #g
[ 2, 2,26,38,34,34,34], #h
[ 8, 0,12, 8, 8, 8,28], #i
[16, 0,24,16,16,18,12], #j
[ 4, 4,36,20,12,20,36], #k
[12, 8, 8, 8, 8, 8,28], #l
[ 0, 0,22,42,42,42,42], #m
[ 0, 0,26,38,34,34,34], #n
[ 0, 0,28,34,34,34,28], #o
[ 0, 0,30,34,30, 2, 2], #p
[ 0, 0,60,34,60,32,32], #q
[ 0, 0,26,38, 2, 2, 2], #r
[ 0, 0,60, 2,28,32,30], #s
[ 4,14, 4, 4, 4,36,24], #t
[ 0, 0,34,34,34,50,44], #u
[ 0, 0,34,34,20,20, 8], #v
[ 0, 0,34,34,42,42,20], #w
[ 0, 0,38,24, 8,12,50], #x
[ 0, 0,34,36,24, 8, 6], #y
[ 0, 0,62,16, 8, 4,62], #z
[ 8, 4, 4, 2, 4, 4, 8], #{
[ 8, 8, 8, 8, 8, 8, 8], #|
[ 8,16,16,32,16,16, 8], #}
[ 0, 0,36,42,18, 0, 0], #~
])
complete_font(font_bm_l[-1], 215, blank)
font_bm_l[-1].append([0,34,20,8,20,34,0]) # added multiplication symbol
complete_font(font_bm_l[-1], 232, blank)
font_bm_l[-1].append([4,8,28,34,62,2,28]) # added e-grave
font_bm_l[-1].append([16,8,28,34,62,2,28]) # added e-acute
complete_font(font_bm_l[-1], 247, blank)
font_bm_l[-1].append([0,8,0,62,0,8,0]) # added division symbol

shift_font_left(font_bm_l[-1])
gen_font_widths(font_bm_l[-1])

font_h_l.append(10)
blank = blank_char(font_h_l[-1])
font_bm_l.append([
[ 16, 84,146, 273, 257,257, 257,257,130,124], #added power symbol
[ 16,  8,  4,   2,1023,  2,   4,  8, 16,  0], # added left arrow
[ 32, 64,128, 256,1023,256, 128, 64, 32,  0], # added right arrow
[ 64, 96,112, 120, 124,120, 112, 96, 64,  0], # added left arrow head
[  8, 24, 56, 120, 248,120,  56, 24,  8,  0], # added right arrow head
[  0,  0, 32, 112, 248,508,1022,  0,  0,  0], # added top arrow head
[  0,  0,  0,1022, 508,248, 112, 32,  0,  0], # added bottom arrow head
[ 48,120,204, 390, 771,903, 132,132,132,252], # added shift symbol
[512,512,512, 520, 516,514,1023,  2,  4,  8], # added enter symbol
[ 48,378,132, 258, 771,771, 258,132,378, 48], # added gear
])
complete_font(font_bm_l[-1], 33, blank)
font_bm_l[-1].extend([
[  4,  4,  4,  4,  4,  4,  0,  0,  4,  4], #!
[ 54, 54, 36, 18,  0,  0,  0,  0,  0,  0], #"
[ 80, 80,252, 40, 40, 40,126, 20, 20,  0], ##
[  8, 28, 42, 10, 12, 24, 40, 42, 28,  8], #$
[  4, 42, 42, 20, 16, 72,168,164, 68,  0], #%
[ 24, 36, 36, 20,136, 84, 34, 34,220,  0], #&
[  6,  6,  4,  2,  0,  0,  0,  0,  0,  0], #'
[  8,  4,  4,  2,  2,  2,  2,  4,  4,  8], #(
[  2,  4,  4,  8,  8,  8,  8,  4,  4,  2], #)
[  0,  8, 42, 28,  8, 28, 42,  8,  0,  0], #*
[  0, 16, 16, 16,254, 16, 16, 16,  0,  0], #+
[  0,  0,  0,  0,  0,  0,  0,  6,  6,  4], #,
[  0,  0,  0,  0,254,  0,  0,  0,  0,  0], #-
[  0,  0,  0,  0,  0,  0,  0,  6,  6,  0], #.
[  0, 16, 16,  8,  8,  4,  4,  2,  2,  0], #/
[ 60, 66, 66, 66, 66, 66, 66, 66, 60,  0], #0
[ 16, 28, 16, 16, 16, 16, 16, 16,124,  0], #1
[ 60, 66, 66, 64, 32, 24,  4, 66,126,  0], #2
[ 60, 66, 66, 64, 56, 64, 66, 66, 60,  0], #3
[ 48, 40, 40, 36, 36, 34,126, 32,112,  0], #4
[126,  2,  2, 62, 66, 64, 64, 66, 60,  0], #5
[ 60, 66,  2,  2, 62, 66, 66, 66, 60,  0], #6
[126, 66, 34, 32, 16, 16,  8,  8,  8,  0], #7
[ 60, 66, 66, 66, 60, 66, 66, 66, 60,  0], #8
[ 60, 66, 66, 66,124, 64, 64, 66, 60,  0], #9
[  0,  0,  6,  6,  0,  0,  6,  6,  0,  0], #:
[  0,  0,  6,  6,  0,  0,  6,  6,  4,  2], #;
[  0, 16,  8,  4,  2,  4,  8, 16,  0,  0], #<
[  0,  0,  0,254,  0,254,  0,  0,  0,  0], #=
[  0,  2,  4,  8, 16,  8,  4,  2,  0,  0], #>
[ 28, 34, 34, 16,  8,  8,  0,  8,  8,  0], #?
[ 56, 68,178,170,170,170,114,  4,120,  0], #@
[ 16, 16, 40, 40, 68, 68,124,130,130,  0], #A
[126,132,132,132,124,132,132,132,126,  0], #B
[184,196,130,  2,  2,  2,130, 68, 56,  0], #C
[ 62, 68,132,132,132,132,132, 68, 62,  0], #D
[254,132,  4, 68,124, 68,  4,132,254,  0], #E
[254,132,  4, 68,124, 68,  4,  4, 14,  0], #F
[184,196,130,  2,242,130,130,196,184,  0], #G
[238, 68, 68, 68,124, 68, 68, 68,238,  0], #H
[ 62,  8,  8,  8,  8,  8,  8,  8, 62,  0], #I
[120, 32, 32, 32, 32, 32, 34, 34, 28,  0], #J
[238, 68, 36, 20, 44, 36, 68, 68,238,  0], #K
[ 14,  4,  4,  4,  4,  4,132,132,254,  0], #L
[774,396,396,340,340,340,292,292,910,  0], #M
[230, 76, 76, 84, 84,100,100, 68, 78,  0], #N
[ 56, 68,130,130,130,130,130, 68, 56,  0], #O
[126,132,132,132,124,  4,  4,  4, 14,  0], #P
[ 56, 68,130,130,130,130,186, 68,184,  0], #Q
[126,132,132,132,124, 36, 68, 68,142,  0], #R
[ 92, 98, 66,  4, 24, 32, 66, 70, 58,  0], #S
[254,146, 16, 16, 16, 16, 16, 16, 56,  0], #T
[238, 68, 68, 68, 68, 68, 68, 68, 56,  0], #U
[238, 68, 68, 68, 40, 40, 40, 16, 16,  0], #V
[942,292,292,340,340,340,136,136,136,  0], #W
[238, 68, 40, 40, 16, 40, 40, 68,238,  0], #X
[238, 68, 68, 40, 40, 16, 16, 16, 56,  0], #Y
[126, 66, 32, 32, 16,  8,  8, 68,126,  0], #Z
[ 14,  2,  2,  2,  2,  2,  2,  2,  2, 14], #[
[  0,  2,  2,  4,  4,  8,  8, 16, 16,  0], #\
[ 14,  8,  8,  8,  8,  8,  8,  8,  8, 14], #]
[  8, 20, 34,  0,  0,  0,  0,  0,  0,  0], #^
[  0,  0,  0,  0,  0,  0,  0,  0,254,  0], #_
[  2,  4,  8,  0,  0,  0,  0,  0,  0,  0], #`
[  0,  0,  0, 30, 32, 60, 34, 34, 92,  0], #a
[  6,  4,  4, 52, 76, 68, 68, 76, 52,  0], #b
[  0,  0,  0, 28, 34,  2,  2, 34, 28,  0], #c
[ 48, 32, 32, 44, 50, 34, 34, 50,108,  0], #d
[  0,  0,  0, 28, 34, 62,  2, 34, 28,  0], #e
[ 24, 36,  4, 30,  4,  4,  4,  4, 30,  0], #f
[  0,  0,  0, 92, 34, 28,  2, 60, 66, 60], #g
[  6,  4,  4, 52, 76, 68, 68, 68,238,  0], #h
[  4,  4,  0,  6,  4,  4,  4,  4, 14,  0], #i
[ 16, 16,  0, 24, 16, 16, 16, 18, 12,  0], #j
[  6,  4,  4,116, 36, 20, 44, 68,238,  0], #k
[  6,  4,  4,  4,  4,  4,  4,  4, 14,  0], #l
[  0,  0,  0,150,364,292,292,292,942,  0], #m
[  0,  0,  0, 54, 76, 68, 68, 68,238,  0], #n
[  0,  0,  0, 28, 34, 34, 34, 34, 28,  0], #o
[  0,  0,  0, 54, 76, 68, 76, 52,  4, 14], #p
[  0,  0,  0,108, 50, 34, 50, 44, 32,112], #q
[  0,  0,  0, 22, 44,  4,  4,  4, 14,  0], #r
[  0,  0,  0, 28, 34, 12, 16, 34, 28,  0], #s
[  0,  8,  8, 62,  8,  8,  8, 72, 48,  0], #t
[  0,  0,  0,102, 68, 68, 68,100,216,  0], #u
[  0,  0,  0,238, 68, 68, 40, 40, 16,  0], #v
[  0,  0,  0,942,292,340,340,136,136,  0], #w
[  0,  0,  0, 34, 20,  8,  8, 20, 34,  0], #x
[  0,  0,  0,238, 68, 40, 40, 16, 18, 12], #y
[  0,  0,  0, 62, 34, 16,  8, 36, 62,  0], #z
[  8,  4,  4,  4,  2,  2,  4,  4,  4,  8], #{
[  4,  4,  4,  4,  4,  4,  4,  4,  4,  4], #|
[  2,  4,  4,  4,  8,  8,  4,  4,  4,  2], #}
[  0,  0,  0, 12,146, 96,  0,  0,  0,  0], #~
])
complete_font(font_bm_l[-1], 215, blank)
font_bm_l[-1].append([0,258,132,72,48,48,72,132,258,0]) # added multiplication symbol
complete_font(font_bm_l[-1], 232, blank)
font_bm_l[-1].append([4,8,0,28,34,62,2,34,28,0]) # added e-grave
font_bm_l[-1].append([16,8,0,28,34,62,2,34,28,0]) # added e-acute
complete_font(font_bm_l[-1], 247, blank)
font_bm_l[-1].append([0,0,16,0,0,254,0,0,16,0]) # added division symbol

shift_font_left(font_bm_l[-1])
gen_font_widths(font_bm_l[-1])

##################
# graphic globals
##################

screen_w, screen_h = 384, 192 # Casio Graph 90+E / fx-CG50
BLACK = (0,0,0)
WHITE = (255,255,255)
 
############################
# generic graphic functions
############################

def fill_rect(x, y, w, h, c):
  if w and h:
    for dy in range(0, h, sign(h)):
      for dx in range(0, w, sign(w)):
        set_pixel(x + dx, y + dy, c)

def fill_ellipse(x, y, rx, ry, c):
  ry = abs(ry)
  for h in range(-int(ry), int(ry)+1):
    w = sqrt(max(0, rx*rx*(1-h*h/ry/ry)))
    fill_rect(int(x - w), int(y + h), int(2 * w), 1, c)

def fill_circle(x, y, r, c):
  if r:
    for h in range(int(r)+1):
      w = round(sqrt(max(0, r*r*(1-h*h/r/r))))
      fill_rect(x, y + h, w, 1, c)
      fill_rect(x, y + h, -w, 1, c)
      fill_rect(x, y - h, w, 1, c)
      fill_rect(x, y - h, -w, 1, c)
#      fill_rect(int(x - w), int(y + h), int(2 * w), 1, c)
#      fill_rect(int(x - w), int(y - h), int(2 * w), 1, c)
#    for h in range(-int(r), int(r)+1):
#      w = sqrt(max(0, r*r*(1-h*h/r/r)))
#      fill_rect(int(x - w), int(y + h), int(2 * w), 1, c)

def fill_rect_4_circles(x, y, w, h, r, c):
  fill_rect(x + sign(w)*r, y, w - sign(w)*2*r, h, c)
  fill_rect(x, y + sign(h)*r, w, h - sign(h)*2*r, c)
  fill_circle(x + sign(w)*r, y + sign(h)*r, r, c)
  fill_circle(x + w - sign(w) - sign(w)*r, y + sign(h)*r, r, c)
  fill_circle(x + sign(w)*r, y + h - sign(h) - sign(h)*r, r, c)
  fill_circle(x + w - sign(w) - sign(w)*r, y + h - sign(h) - sign(h)*r, r, c)

def fill_rect_2_circles_left(x, y, w, h, r, c, rot):
  if rot % 2:
    fill_rect(x, y + r*sign(h), w, h - r*sign(h), c)
    fill_rect(x + r*sign(w), y, w - 2*r*sign(w), h - r*sign(h), c)
    fill_circle(x + w - sign(w) - r*sign(w), y + r*sign(h), r, c)
    fill_circle(x + r*sign(w), y + r*sign(h), r, c)
  else:
    fill_rect(x + r*sign(w), y, w - r*sign(w), h, c)
    fill_rect(x, y + r*sign(h), w, h - 2*r*sign(h), c)
    fill_circle(x + r*sign(w), y + r*sign(h), r, c)
    fill_circle(x + r*sign(w), y + h - sign(h) - r, r, c)

def fill_rect_2_circles_right(x, y, w, h, r, c, rot):
  if rot % 2:
    fill_rect(x, y, w, h - r*sign(h), c)
    fill_rect(x + r*sign(w), y, w - 2*r*sign(w), h - r*sign(h), c)
    fill_circle(x + w - sign(w) - r*sign(w), y + h - sign(h) - r*sign(h), r, c)
    fill_circle(x + r*sign(w), y + h - sign(h) - r*sign(h), r, c)
  else:
    fill_rect(x, y, w - cos90(rot)*r*sign(w), h, c)
    fill_rect(x, y + cos90(rot)*r*sign(h), w, h - cos90(rot)*2*r*sign(h), c)
    fill_circle(x + w - sign(w) - cos90(rot)*r*sign(w), y + cos90(rot)*r*sign(h), r, c)
    fill_circle(x + w - sign(w) - cos90(rot)*r*sign(w), y + h - sign(h) - cos90(rot)*r*sign(h), r, c)

def fill_rect_2_ellipses(x, y, w, h, r, c, rot):
  if rot % 2:
    rx, ry = w / 2, r
    fill_rect(x, y + sin90(rot)*r, w, h - sin90(rot)*2*r, c)
    fill_ellipse(x + (w - sign(w))//2, y + sin90(rot)*ry, int(rx), ry, c)
    fill_ellipse(x + (w - sign(w))//2, y + h - sign(h) - sin90(rot)*ry, int(rx), ry, c)
  else:
    rx, ry = r, h / 2
    fill_rect(x + cos90(rot)*r, y, w - cos90(rot)*2*r, h, c)
    fill_ellipse(x + cos90(rot)*rx, y + (h - sign(h))//2, rx, int(ry), c)
    fill_ellipse(x + w - sign(w) - cos90(rot)*rx, y + (h - sign(h))//2, rx, int(ry), c)

def draw_char(x, y, st, c, rot, zoom=1, i_font = 0, sh=1):
  font_h = font_h_l[i_font]
  font_bm = font_bm_l[i_font]
  if rot % 2 and sh < 0:
    x -= 2 * sin90(rot) * font_h
  if rot % 2 == 0 and sh < 0:
    y += 2 * cos90(rot) * font_h
  bm = font_bm[ord(st[0])]
  for iy in range(font_h):
    row = bm[iy]
    ix = 0
    while row:
      if row & 1:
        if rot%2:
          fill_rect(x - iy*zoom*sin90(rot)*sign(sh), y + ix*sin90(rot), zoom, zoom, c)
        else:
          fill_rect(x + ix*cos90(rot), y + iy*zoom*cos90(rot)*sign(sh), zoom, zoom, c)
      row //= 2
      ix += zoom

def string_width(st, i_font = 0):
  font_h = font_h_l[i_font]
  font_bm = font_bm_l[i_font]
  stw = -FONT_INTERSPACE
  for ch in st:
    if ch == "\n":
      break
    stw += font_bm[ord(ch)][font_h]
  if ch == "\n":
    stw = max(string_width(st[st.index("\n")+1:], i_font), stw)
  return stw

def string_height(st, i_font = 0):
  font_h = font_h_l[i_font]
  font_bm = font_bm_l[i_font]
  sth = font_h
  for ch in st:
    if ch == "\n":
      sth += font_h + 1
  return sth

def draw_string_rotated(x, y, lst, c, rot, w=0, h=0, centerw=True, sh=1):
  i_font = 0
  font_h = font_h_l[i_font]
  font_bm = font_bm_l[i_font]
  if isinstance(lst, str):
    lst = (lst,)
  lst = sorted(lst, key=string_width, reverse=True)
  stw = rot % 2 and h + 1 or w + 1
 
  while (stw > w and rot%2 == 0 or stw>h and rot%2) and len(lst):
    st, lst = lst[0], lst[1:]
    stw = string_width(st, i_font)

  k_font = len(font_h_l)
  stw = rot % 2 and h + 1 or w + 1
  while (stw > w and rot%2 == 0 or stw>h and rot%2) and k_font:
    k_font -= 1
    stw = string_width(st, k_font)
  i_font = k_font
  font_h = font_h_l[i_font]
  font_bm = font_bm_l[i_font]
  sth = string_height(st, i_font)
  if rot % 2:
    zoomf = max(1, min(h // stw, w // sth))
    zoom = int(zoomf)
    if centerw:
      y += sin90(rot) * (h - stw*zoomf) // 2
    x -= sin90(rot) * (w - sth*zoomf) // 2
  else:
    zoomf = max(1, min(w // stw, h // sth))
    zoom = int(zoomf)
    if centerw:
      x += cos90(rot) * (w - stw*zoomf) // 2
    y += cos90(rot) * (h - sth*zoomf) // 2
  x0, y0 = x, y
  for ch in st:
    if ch == "\n":
      if rot % 2:
        y = y0 - sin90(rot)
        x -= sin90(rot) * (font_h + FONT_INTERSPACE) * zoom * sign(sh)
      else:
        x = x0 - cos90(rot)
        y += cos90(rot) * (font_h + FONT_INTERSPACE) * zoom * sign(sh)
    draw_char(x, y, ch, c, rot, zoom, i_font, sh)
    bm = font_bm[ord(ch)]
    if rot % 2:
      y += sin90(rot) * bm[font_h] * zoom
    else:
      x += cos90(rot) * bm[font_h] * zoom

def image_height(rle, w, pal):
  i, x, y = 0, 0, 0
  nvals = len(pal)
  nbits = 0
  nvals -= 1
  while(nvals):
    nvals >>= 1
    nbits += 1
  maskval = (1 << nbits) - 1
  maskcnt = (0xFF >> nbits >> 1) << nbits
  while i<len(rle):
    v = rle[i]
    mv = v & maskval
    c = (v & maskcnt) >> nbits
    if (v & 0b10000000 or nbits == 8):
      i += 1
      c |= rle[i] << (7 - nbits + (nbits == 8))
    c = (c + 1)
    while c:
      cw = min(c, w - x)
      c -= cw
      x = (x + cw) % w
      y += x == 0
    i += 1
  return y

def draw_image_rotated(data_l, x0, y0, pal, wr, hr, rot, itransp):
  f = lambda l: l[0]
  data_l = sorted(data_l, key=f, reverse=True)
  w = rot % 2 and hr + 1 or wr + 1
  while (w > wr and rot%2 == 0 or w > hr and rot%2) and len(data_l):
    data, data_l = data_l[0], data_l[1:]
    w = data[0]
  rle = data[1]
  i, x, y = 0, 0, 0
  x0, y0 = int(x0), int(y0)
  h = image_height(rle, w, pal)
  zoom_kx = sign(wr)
  wr = abs(wr)
  if rot % 2:
    zoomf = max(1, min(hr // w, wr // h))
    zoom = int(zoomf)
    y0 += sin90(rot) * (hr - w*zoomf) // 2
    x0 -= sin90(rot) * (wr - h*zoomf) // 2
  else:
    zoomf = max(1, min(wr // w, hr // h))
    zoom = int(zoomf)
    x0 += cos90(rot) * (wr - w*zoomf) // 2
    y0 += cos90(rot) * (hr - h*zoomf) // 2
  nvals = len(pal)
  nbits = 0
  nvals -= 1
  while(nvals):
    nvals >>= 1
    nbits += 1
  maskval = (1 << nbits) - 1
  maskcnt = (0xFF >> nbits >> 1) << nbits
  while i<len(rle):
    v = rle[i]
    mv = v & maskval
    c = (v & maskcnt) >> nbits
    if (v & 0b10000000 or nbits == 8):
      i += 1
      c |= rle[i] << (7 - nbits + (nbits == 8))
    c = (c + 1)
    while c:
      cw = min(c, w - x)
      if mv != itransp:
        if rot%2:
          fill_rect(x0, y0 + x*zoom*sin90(rot)*zoom_kx, zoom, cw*zoom*sin90(rot)*zoom_kx, pal[mv])
        else:
          fill_rect(x0 + x*zoom*cos90(rot)*zoom_kx, y0, cw*zoom*cos90(rot)*zoom_kx, zoom, pal[mv])
      c -= cw
      x = (x + cw) % w
      if rot%2:
        x0 -= (x == 0) and zoom * sin90(rot)
      else:
        y0 += x == 0 and zoom * cos90(rot)
    i += 1

def slide_cp(x, y, dx, dy, n, w, h, rot, mode, page, clean_over_func=None, clean_under_funcs=None):
  if callable(clean_under_funcs):
    clean_under_funcs = tuple(clean_under_funcs)
  elif not clean_under_funcs:
    clean_under_funcs = []
  for k in range(ceil(n / max(abs(dx), abs(dy))) + 1):
    for f in clean_under_funcs:
      f()
    draw_cp(x, y, w, h, rot, mode, page)
    if clean_over_func:
      clean_over_func()
    show_screen()
    x += dx
    y += dy
  return x - dx, y - dy

def slide_img(x, y, dx, dy, n, img, img_w, img_h, img_pal, rot=0, itransp=-1, clean_over_func=None, clean_under_funcs=None):
  if callable(clean_under_funcs):
    clean_under_funcs = tuple(clean_under_funcs)
  elif not clean_under_funcs:
    clean_under_funcs = []
  for k in range(n):
    for f in clean_under_funcs:
      f()
    draw_image_rotated(((img_w,img),), x, y, img_pal, img_w, img_h, rot, itransp)
    if clean_over_func:
      clean_over_func()
    show_screen()
    x += dx
    y += dy
  return x - dx, y - dy

def slide_imgs_forx(y, dy, n, img, img_w, img_h, img_pal, rot=0, itransp=-1, half = False, clean_over_func=None, clean_under_funcs=None):
  if callable(clean_under_funcs):
    clean_under_funcs = tuple(clean_under_funcs)
  elif not clean_under_funcs:
    clean_under_funcs = []
  if half:
    half = 2
  for k in range(n):
    for f in clean_under_funcs:
      f()
    for x in range(0, screen_w, img_w):
      draw_image_rotated(((img_w,img),), x + (half % 2 and img_w - 1), y, img_pal, img_w * (half % 2 and -1 or 1), img_h, rot, itransp)
      if half: half += 1
    if clean_over_func:
      clean_over_func()
    show_screen()
    y += dy
  return y - dy

class Canvas:
  def __init__(self, x0, y0, w, h, rot, w0, h0):
    self.x0 = x0
    self.y0 = y0
    self.w0 = w0
    self.h0 = h0
    self.w = w
    self.h = h
    self.rot = rot % 4
    if self.rot % 2:
      self.w0, self.h0 = self.h0, self.w0
    self.scale = min(self.w / self.w0, self.h / self.h0)
    self.w, self.h = iround(self.w0 * self.scale) * sign(self.w), iround(self.h0 * self.scale) * sign(self.h)

  def rescale_xy(self, dx, dy):
    if self.rot % 2 == 0:
      return iround(self.x0 + dx*self.scale*cos90(self.rot)), iround(self.y0 + dy*self.scale*cos90(self.rot))
    else:
      return iround(self.x0 - dy*self.scale*sin90(self.rot)), iround(self.y0 + dx*self.scale*sin90(self.rot))
   
  def rescale_wh(self, w, h):
    if self.rot % 2 == 0:
      return iround(w * self.scale) * cos90(self.rot), iround(h * self.scale) * cos90(self.rot)
    else:
      return -iround(h*self.scale)*sin90(self.rot), iround(w*self.scale)*sin90(self.rot)

  def rescale_l(self, l):
    return iround(l * self.scale)

  def fill_rect(self, x, y, w, h, c):
    x, y = self.rescale_xy(x, y)
    w, h = self.rescale_wh(w, h)
    fill_rect(x, y, w, h, c)

  def fill_rect_4_circles(self, x, y, w, h, r, c):
    x, y = self.rescale_xy(x, y)
    w, h = self.rescale_wh(w, h)
    r = self.rescale_l(r)
    fill_rect_4_circles(x, y, w, h, r, c)

  def fill_rect_2_circles_left(self, x, y, w, h, r, c):
    x, y = self.rescale_xy(x, y)
    w, h = self.rescale_wh(w, h)
    r = self.rescale_l(r)
    fill_rect_2_circles_left(x, y, w, h, r, c, self.rot)

  def fill_rect_2_circles_right(self, x, y, w, h, r, c):
    x, y = self.rescale_xy(x, y)
    w, h = self.rescale_wh(w, h)
    r = self.rescale_l(r)
    fill_rect_2_circles_right(x, y, w, h, r, c, self.rot)

  def fill_rect_2_ellipses(self, x, y, w, h, r, c):
    x, y = self.rescale_xy(x, y)
    w, h = self.rescale_wh(w, h)
    r = self.rescale_l(r)
    fill_rect_2_ellipses(x, y, w, h, r, c, self.rot)

  def draw_string_rotated(self, x, y, st, c, w=0, h=0, centerw=True):
    sh = h
    x, y = self.rescale_xy(x, y)
    w, h = self.rescale_wh(w, h)
    w, h = abs(w), abs(h)
    draw_string_rotated(x, y, st, c, self.rot, w, h, centerw, sign(sh))

  def draw_image_rotated(self, data, x, y, pal, wr, hr, itransp=-1):
    x, y = self.rescale_xy(x, y)
    wr, hr = self.rescale_wh(wr, hr)
    wr, hr = abs(wr), abs(hr)
    draw_image_rotated(data, x, y, pal, wr, hr, self.rot, itransp)

########################
# sprites & images data
########################

sled_img_w, sled_img_h = 219, 84
sled_img_halfw = 98
sled_img_pal = (BLACK, (0,0,127))
sled_img = (
b"R\3\x96\3\3\22\5\x94\3\a\20\a\x92\3\t\20\5\x96\3\a\16\5\x80\3\3\22\a\f\5\x80\3\t\16\a\n\5\x80\3\r\f\5\n\5\x82\3\r\n\a\b\5\x88\3\t\n\5\b\5\xea\1\3\x9a\1\a\n\5\6\a\xe6\1\27\x8c\1\5\n\5\6\5\xe8\1\33\36\3d\a\b\5\6\5\xe6\1\37\30\r`\5\b\5\4\5\xe8\1#\24\17^\5"
b"\6\23\xe8\1'\16\21N\3\n\5\6\21\xea\1\31\2\v\f\23J\a\b\5\4\21\xea\1\27\6\v\n\x154\1\24\5\6\a\4\17\xec\1\25\n\t\b\x172\5\22\a\4\a\2\r\xee\1\25\f\a\n\x190\5\24#\xf2\1\23\36\35,\a\26\35\xf6\1\23\34#$\v\30\31\xf8\1\23\30'\"\r\36\17\xfa\1\27\24) \21\34\r\xf8"
b"\1\31\24+ \5\4\a\32\v\xfa\1\31\22-\n\r\22\t\26\v\xfa\1\33\20/\6\25\20\r\f\r\xfc\1\33\16O\22'\xfe\1\33\n?\n\a\24#\xfe\1\33\n=\16\5\32!\xd4\1\3 \33\b=\20\a \33\xd0\1\t\30\35\n%\2\5\2\t\22\5\"\33\xb0\1\1\24\21\24\37\b\33\2\a\2\a\0\t\22\5 \5\2\25\xa8\1\r\2"
b"#\f!\b\33\2\37\n\r\36\a\2\27\xa2\1=\6#\6A\b\r\36'\x9e\1C\0'\4\23\2)\b\r\34)\x96\1%\f\3\0;\2\27\0)2-\x88\1/\26\x81\1.1|)\n\5\26\x81\1.1p3\f\a\24M\x021,\a\16\33`-\n\a\16\5\24M\x021F\x190\5\32/\30\5\16\5\24\x83\1F\33.\5\2;$\5\16\5\22\x87\1D\35\"CD\a\nQ"
b"\x029B!\32;P\a\bU\x029@'\x0e5\\\t\b\x95\1<]l\t\b)\0%\0C<\35\x029j\17\4)\2\a\2\5\0\a\0\5\2C:\37\0;h\21\x027\0\a\2\5\2M8\27\2Cd\v\0\xa7\x018\27\2Cd\t\x021\2q8\17\2KbA\2q8\a\2\3\2M`\23\2\xa1\x016\a\2U^\25\0\xa3\x018a\4\tL\xbb\x018uHA\2u:u.\v\n\27\2%\2u<w&"
b"\21\b\27\2\x9f\1>?\2!\2\17\36\25\b\xb9\1B7\20\23\16\21\26\25\b?\0wD-\30\21\24\17\22\25\n?\2uD!$\t \r\20\v\24\31\2\x99\1F\37&\a&\a\20\v\26\31\2\x99\1F\35&\aB\t\x1a5\2yD!&\aB\t\32\37\2\a\0\a\2wF\37&\tB\t\32\37\2\5\2\x81\1F\a\n\r&\aD\v\32)\0\xff\0H\a\16\t"
b"&\aF\t\32\xa9\1J\a\16\t\6\5\30\aF\t\34\xa3\1N\a\20\a\4\t\24\aH\v\34\x9d\1T\5\20\27\26\3L\v\36\x93\1Z\5\20\25j\r\36\xff\0\4\vZ\5\20\21p\r\"9\2\r4\tZ\a\0\1\f\az\r\"#\30\t6\t\\\v\x90\1\17\36\t4\t4\t\34\v2\v\x92\1\21\32\t4\t6\t\16\x192\t\x94\1\25\24\t4\t45"
b"\xd4\1\33\f\t4\t09\xd8\1/4\t\34K\xde\1/0g\xf0\1\xb7\1\x82\2\xa3\1\x98\2\x8b\1\xb2\2o\xd6\2?f"
)

tree_img_w, tree_img_h = 85, 122
tree_img_pal = (BLACK, (0,95,0))
tree_img_pal2 = (BLACK, (255,255,0))
tree_img = (
b"R\1\xa6\1\3\xa2\1\5\xa2\1\a\xa0\1\a\x9e\1\v\x9c\1\v\x96\1\31\x84\1+\xfe\0'\x82\1#\x86\1\37\x8a\1\33\x8e\1\27\x90\1\27\x90\1\27\x90\1\27\x90\1\31\x8c\1\v\2\v\x8c\1\a\n\a\x8c\1\5\20\3\x8c\1\1\x86\4\1\xa4\1\5\xa0\1\t\x9c\1\r\x98\1\21\x94\1\25\x90\1\31\x8c"
b"\1\35\x88\1!\x84\1\5\4\31\x80\1\a\4\33|\v\0\v\4\rx\33\6\rt\35\6\17p!\2\23l=j?p9x1\xfe\0+X\v #T\17&\35P\21.\27L\23\n\t \21H\25\n\v(\tF\25\b\v2\1T\t\4\v\22\an\35\22\21b\37\22\31X!\22\33T#\20\37P'\16\25\2\aL+\n\25\6\aHO\6\tDQ\4\r@!\4A<!\6C8#\6E4%\6G0)\4G."
b"m8eZAd9l/v',\aH\35*\1\n\tD\23.\t\n\v@\t*\3\f\a\n\rj\r\16\a\6\21h\v\20\t\2\25P\v\b\v\20%B\27\b\r\16'4#\b\r\16)*/\2\21\n-$K\x043 \x89\1\34\37\0k\30\37\4k\24!\4m\22\x97\1&\x83\1>Kx1\x90\1\31>\1\xa2\1\t\16\5\x86\1\t\20\r\n\ah\v\20\v\f!L\r\22\t\f!\n\21,\17"
b"\22\t\f\37\16\25$\21\20\r\b\r\6\v\16\27 \25\16\17\4\17\6\v\f\33\34\31\n'\6\r\n\35\30\35\4+\6\17\6!\24\x95\1\20\x99\1\f\x9d\1\b\xa1\1\4\xa5\1\0\xa9\1\0\1@\35\xb8\2\25\x92\1\25\x90\1\31\x8e\1\31\x8e\1\31\x8e\1\31\x8e\1\31\x8c\1\35\x8a\1\35\x8a\1\35\x8a\1"
b"\35\x8a\1\35\x8a\1\35\x88\1!\x88\1\37B"
)

curtain_img_pal = ((239,203,81),BLACK,(231,89,107),(174,17,27),BLACK,)
curtain_img_w, curtain_img_h = 32, 58
curtain_img = (
b'(\1\xc2\1 \1\3\xc2\1\30\1\v\xc2\1\30\v\xc2\1(\xca\1(\xc2\1\b\1 \xba\1\b\3\t\20\x92\x010\23\t\b\x8a\1\1(#\t\x8a\1\3\1 \2+\x8a\1\v\1\30\22\33\x92\1\v\30"\v\x9a\1 \xd2\1 \xca\1 \1\xca\1\20\t\3\xc2\1\b\t\23\xc2\1\t#\xc2\1\v"\23Z\br+B\brK\32\30\xfa\0[\30'
b'\x8a\1#h\xfa\0\v\1X\1CB\3\1H\1k*\3\x018\1S\n\33"\x038[\32\23\32H\32;\32\33\nHR\v\32\33 \t J\4\3"\23\20\t\v\t\20J\4\v"\3\b\t+\t\bB\4\v*\tK\tB\4\23*cB\f\v2[:\0\f\x132c*\0\f\x1b2\x83\1\b\24\23Bs\b\24\33J;0\34\33R+\1(\34#b\33\1 $#r\v\1\30$+\x82\1\30,+r 4+j'
b' <+Z \1D+R\20\t\3L3:\b\t\23T;*\t#\\K\22+\2d\xfb\0\22l\x8b\1\xfc\0\xfb\0\x8c\1k\x9c\1[\xb4\1C\xd4\1#'
)

floor_img_pal = ((7,97,182),(55,139,223),(99,176,247),(141,216,247))
floor_img_w, floor_img_h = 16, 16
floor_img = b"\x80\1!\24!\30\36\31\36\31\6\27\32\37\32\37\32\37\32\27\6\31\36\31\36\30!\24!\x80\1"

back_img_w, back_img_h = 32, 32
back_img_pal = ((247,176,36),(247,207,73),(231,89,0),(247,131,8))
back_img = (
b"\b\5\n?\n\5\30\5\n7\n\5 \5\n/\n\5(\5\n'\n\x050\5\n\37\n\x058\5\n\27\n\5@\5\n\17\n\5H\5\n\a\n\5P\5\26\5X\5\16\5`\5\6\5d\a\6\a`\a\2\4\2\aX\a\2\f\2\aP\a\2\4\a\4\2\aH\a\2\4\17\4\2\a@\a\2\4\27\4\2\a8\a\2\4\37\4\2\a0\a\2\4'\4\2\a(\a\2\4/\4\2\a \a\2\x047\4\2"
b"\a\30\a\2\4?\4\2\a\20\a\2\4G\4\2\a\b\a\2\4O\4\2\a\0\a\2\4W\4\2\v\2\4_\4\2\3\2\4g\4\16g\n\1\n_\n\t\nW\n\5\0\5\nO\n\5\b\5\nG\n\5\4"
)

#############################
# specific graphic functions
#############################

def draw_sled():
  draw_image_rotated(((sled_img_w, sled_img),), sled_img_x, sled_img_y, sled_img_pal, sled_img_w, sled_img_h, 0, 0)

def draw_curtain():
  for x in range(0, screen_w, 2 * curtain_img_w):
    draw_image_rotated(((curtain_img_w, curtain_img),), x, curtain_img_y, curtain_img_pal, curtain_img_w, curtain_img_h, 0, 4)
    draw_image_rotated(((curtain_img_w, curtain_img),), x + 2*curtain_img_w - 1, curtain_img_y, curtain_img_pal, -curtain_img_w, curtain_img_h, 0, 4)

def draw_tree(pal=tree_img_pal):
  draw_image_rotated(((tree_img_w, tree_img),), tree_img_x, tree_img_y, pal, tree_img_w, tree_img_h, 0, 0)

def draw_floor():
  for x in range(0, screen_w, floor_img_w):
    draw_image_rotated(((floor_img_w, floor_img),), x, floor_img_y, floor_img_pal, floor_img_w, floor_img_h, 0, -1)

def draw_back():
  for y in range(ceil(screen_h / 32)):
    for x in range(ceil(screen_w / 32)):
      draw_image_rotated(((back_img_w, back_img),), x * back_img_w, y * back_img_h, back_img_pal, back_img_w, back_img_h, 0, -1)

def draw_cps(anim = False):
  for i in range(len(cp_imgs)):
    if cp_imgs[i][1] < screen_h:
      draw_cp(cp_imgs[i][0], cp_imgs[i][1], cp_imgs[i][2], cp_imgs[i][3], 0, i, cp_imgs[i][5])
      if anim:
        cp_imgs[i][5] = (cp_imgs[i][5] + 1) % N_PAGES

###############
# main program
###############

MODE_FXCP400 = 0
MODE_FXCP400PE = 1
MODE_FXCG500 = 2
MODE_FXCP600 = 3

PAGE_OFF = 0
PAGE_LOGO_ON = 1
PAGE_LOGOBAT_ON = 2
PAGE_MENU_1 = 3
PAGE_MENU_2 = 4
PAGE_LOGO_OFF = 5
N_PAGES = PAGE_LOGO_OFF + 1

def draw_cp(x, y, w, h, rot, mode=0, page=PAGE_OFF):
  w0, h0 = 904, 2044 # full calculator
  if mode == MODE_FXCP600:
    palette=((36,190,240) ,(220,49,58) ,(44,108,179) ,(220,49,58)  ,(36,190,240) ,(220,49,58),(245,246,248) ,(10,76,108)   ,(10,76,108) ,WHITE,(200,175,0)  ,(10,76,108)  ,(10,76,108)  ,(36,190,240) ,(36,190,240),(44,108,179) ,WHITE,BLACK)
  elif mode == MODE_FXCG500:
    palette=((235,235,235),(0,122,150) ,(244,242,242),(244,242,242),(244,242,242),(205,200,202),(170,170,170),(200,200,200),(15,99,219) ,BLACK,(15,99,219)  ,(170,170,170),(170,170,170),WHITE        ,(10,10,10)  ,(170,170,170),BLACK,WHITE)
  else:
    palette=((177,177,187),(71,168,212),(32,32,32)   ,(45, 45, 45) ,(10, 10, 10) ,(45,45,45)   ,WHITE        ,(102,102,102),(43,124,255),WHITE,(1,211,253)  ,(102,102,102),(45,45,45)   ,(70,70,70)   ,(10,10,10)  ,(45,45,45)   ,WHITE,WHITE)
  canvas = Canvas(x, y, w, h, rot, w0, h0)
  canvas.fill_rect_4_circles(0, 0, w0, h0, 64, palette[0])
  canvas.fill_rect_4_circles(24, 14, 856, 2020, 114, palette[1])
  canvas.fill_rect_4_circles(36, 24, 832, 2000, 105, palette[2])
  canvas.fill_rect_4_circles(88, 1324, 728, 180, 27, palette[3])
  canvas.fill_rect_4_circles(100, 1336, 704, 156, 17, palette[4])
  canvas.fill_rect_4_circles(88, 88, 728, 1212, 27, palette[5])
  canvas.fill_rect_4_circles(100, 100, 704, 1188, 17, palette[14])
  keys = (
    ("="  , "x", "y", "z",   "^",    "\xf7"),
    ("("  , "7", "8", "9",   "\xd7"),
    (")"  , "4", "5", "6",   "-"),
    (","  , "1", "2", "3",   "+"),
    ("(-)", "0", ".", ("EXP","EE"), ("EXE","\b")),
  )
  for iy in range(5):
    y = 1532 + iy*96
    h = 64
    if iy:
      for ix in range(5):
        x = 88 + (ix and 124) +  ((ix > 1) and (ix - 1) * 168)
        w = ix%4 and 144 or 100
        canvas.fill_rect_4_circles(x, y, w, h, 12, palette[6 + (ix==4 and iy==4 and 2 or ix==0 or ix==4)])
        canvas.draw_string_rotated(x, y, keys[iy][ix], iy == 4 and ix == 4 and WHITE or (ix == 0 or ix == 4) and palette[9] or BLACK, w, h)
    else:
      for ix in range(6):
        x = 88 + ix*126 - 2*(ix == 5)
        w = 100
        canvas.fill_rect_4_circles(x, y, w, h, 12, palette[7])
        canvas.draw_string_rotated(x, y, keys[iy][ix], palette[9], w, h)
  keys = (
    (("Keyboard","Kbrd","Keys","Key","Kb"), "\1"),
    (("Shift","Shft","2nd","\a"), ("Clear","Clr")),
  )
  for iy in range(2):
    y = 1344 + iy*88
    w, h = 168, 52
    for ix in range(2):
      x = 112 + ix*512
      canvas.fill_rect_4_circles(x, y, w, h, 12, palette[11])
      if ix and iy:
        canvas.draw_string_rotated(x, y, "\0", palette[10], w, h, 0)
      canvas.draw_string_rotated(x + (ix and iy and h), y, keys[iy][ix], palette[9 + (iy and not ix)], w - (ix and iy and h), h)
  canvas.fill_rect_2_ellipses(306, 1332, 292, 164, 38, palette[15])
  canvas.fill_rect_2_ellipses(314, 1340, 276, 148, 30, palette[12])
  canvas.fill_rect_4_circles(388, 1400, 140, 28, 5, palette[13])

  if mode == MODE_FXCP600:
    labels = ("CASIO", ("CLASSPAD PYTHON","PYTHON"), ("fx-CP600","fx CP600","fxCP600","CP600"))
  elif mode == MODE_FXCG500:
    labels = ("CASIO", ("fx-CG500","fx CG500","fxCG500","CG500"))
  elif mode == MODE_FXCP400PE:
    labels = ("CASIO", ("MODE EXAMEN","MODE EXAM","EXAMEN","EXAM"), ("fx-CP400+E","fx CP400+E","fxCP400+E","CP400+E"))
  else:
    labels = ("CASIO", ("fx-CP400","fx CP400","fxCP400","CP400"), "CLASSPAD")
  for iy in range(len(labels)):
    canvas.draw_string_rotated(0, (24, 1300, 1980)[iy], labels[iy], palette[16], min(canvas.w0, canvas.h0), (64, 24, 44)[iy])

  canvas.draw_string_rotated(314, 1399, "\3", palette[9], 68, 30)
  canvas.draw_string_rotated(522, 1399, "\4", palette[9], 68, 30)
  canvas.draw_string_rotated(382, 1341, "\5", palette[9], 140, 58)
  canvas.draw_string_rotated(382, 1429, "\6", palette[9], 140, 58)

  icon_calc = (
  (8,b"\4\t\2\1\f\1\2\1\2\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\2\1\4\1\0\1"),
  (10,b"\4\r\4\1\16\1\2\3\0\1\0\1\0\1\0\1\2\1\2\1\0\1\0\1\2\1\0\1\0\1\4\3\0\1\0"),
  (11,b"\6\r\6\1\n\1\2\1\2\3\0\1\2\1\0\1\0\1\2\1\4\1\0\1\0\1\2\1\0\1\2\1\4\3\0\1\0"),
  (12,b"\6\17\6\1\f\1\4\1\2\3\0\1\0\1\2\1\2\1\2\1\4\1\0\1\2\1\2\1\4\1\0\1\2\1\2\1\0\1\2\1\6\3\0\1\0"),
  (13,b"\b\17\b\1\26\1\2\3\0\1\0\3\2\1\2\1\2\1\6\1\0\1\2\1\2\1\6\1\0\1\2\1\2\1\0\1\4\1\6\3\0\1\0"),
  )
  icons_mono = ((
  (5,b'\1\0\1\0\1\0\5\0\3\0\3\0\5\0\1\0\1\0\1'),
  (7,b"\4\1\6\1\0\1\0\1\4\1\0\1\2\3\4\3\2\1\0\1\4\1\0\1\0\1\6\1\4"),
  (9,b"\6\1\b\1\0\5\0\1\4\1\4\1\4\1\b\1\0\3\b\3\0\1\b\1\4\1\4\1\4\1\0\5\0\1\b\1\6"),
  (10,b"\6\3\b\1\0\a\0\1\4\1\6\1\4\1\n\1\0\3\n\a\n\3\0\1\n\1\4\1\6\1\4\1\0\a\0\1\b\3\6"),
  (13,b"\n\1\16\1\2\5\2\1\4\25\4\5\4\5\6\3\b\3\4\3\f\3\0\5\f\5\0\3\f\3\4\3\b\3\6\5\4\5\4\25\4\1\2\5\2\1\16\1\n"),
  (14,b"\n\3\16\1\2\a\2\1\4\27\4\5\6\5\6\3\n\3\4\3\16\3\0\5\16\v\16\5\0\3\16\3\4\3\n\3\6\5\6\5\4\27\4\1\2\a\2\1\16\3\n"),
  ),(
  (7,b'\5\0\v\0\5\f\5\0\v\0\5'),
  (9,b"\a\0\v\0\1\0\3\0\t\0\a\20\a\0\v\0\1\0\3\0\t\0\a"),
  (11,b"\t\0\r\2\1\0\3\2\5\2\1\0\3\2\v\0\t\24\t\0\r\2\1\0\3\2\5\2\1\0\3\2\v\0\t"),
  ),icon_calc,(
  (7,b'\5\0\a\0\1\0\1\0\a\0\1\0\a\0\5'),
  (13,b"\t\4\v\0\1\0\1\4\1\0\1\0\5\0\3\4\3\0\5\0\1\2\1\0\1\2\1\0\a\0\t\2\5\6\1\0\1\2\1\0\3\4\1\4\3\0\5\4\1\4\1\0\1\0\v\4\t"),
  (17,b"\r\4\17\b\1\4\1\b\3\0\1\0\1\0\1\4\1\0\1\0\1\0\3\34\3\0\1\0\1\2\1\0\1\2\1\0\1\0\3\b\3\0\3\b\t\0\r\2\1\0\3\b\3\0\3\b\3\n\1\0\1\2\1\0\1\0\3\34\3\b\1\4\1\0\1\0\1\0\3\b\1\4\1\b\17\4\r"),
  ),(
  (7,b'\5\0\a\0\1\0\v\0\1\0\a\0\5'),
  (13,b"\t\4\v\0\1\0\1\4\1\4\5\0\3\4\1\4\3\0\1\2\1\0\1\6\a\0\t\0\a\6\1\0\1\2\1\0\3\4\1\4\3\0\5\4\1\4\1\0\1\0\v\4\t"),
  (17,b"\r\4\17\b\1\4\1\b\3\0\1\0\1\0\1\4\1\b\3\34\3\0\1\0\1\2\1\0\1\n\3\b\3\0\3\b\t\0\r\0\t\b\3\0\3\b\3\n\1\0\1\2\1\0\1\0\3\34\3\b\1\4\1\0\1\0\1\0\3\b\1\4\1\b\17\4\r"),
  ),(
  (7,b'\3\b\3\b\3\0\v\0\a'),
  (12,b"\b\1\n\5\0\a\6\5\2\1\2\1\4\5\n\1\2\5\n\1\2\5\b\5\0\5\n\1\2\5\20\5\0\17\6\17\6\17"),
  (13,b"\n\1\n\5\2\3\n\5\0\t\6\5\2\3\2\1\4\5\4\1\4\1\2\5\f\1\2\5\b\17\n\5\0\5\f\1\2\5\32\21\6\21\6\21"),
  (16,b"\f\1\16\a\2\3\16\a\0\t\n\a\2\3\2\1\b\a\4\1\4\1\6\a\16\1\4\a\16\1\4\a\n\t\0\a\f\5\2\a\16\1\4\a\26\a\0\25\b\25\b\25\b\25"),
  (22,b"\20\1\26\v\2\3\26\v\0\v\20\v\2\3\4\3\f\v\4\1\b\1\n\v\22\1\b\v\22\1\b\v\24\1\6\v\24\1\6\v\24\1\6\v\20\t\2\v\22\5\4\v\24\1\6\v\36\v\0)\0\35\f\35\f\35\f\35\f\35"),
  ),(
  (5,b'\0\1\4\a\2\1\2\1\6\1\0\5\0'),
  (7,b"\2\1\b\3\6\t\4\3\2\1\4\1\4\1\n\1\b\1\2\a\2"),
  (8,b"\2\1\n\3\b\v\4\3\4\1\4\1\6\1\f\1\n\1\2\t\2"),
  (9,b"\2\1\f\3\n\r\4\3\6\1\4\1\b\1\16\1\f\1\2\v\2"),
  (14,b"\4\1\26\3\24\5\22\23\b\5\n\3\6\3\16\1\6\1\20\1\30\1\26\1\24\3\4\21\6"),
  ),)

  for i in range(len(icons_mono)):
    canvas.draw_image_rotated(icons_mono[i], 100 + i*704//7, 1176, (BLACK,palette[17]), 704//7, 112, 0)

  page = page % N_PAGES
  canvas.fill_rect(132, 120, 640, 1056, page and WHITE or BLACK)
  if page == PAGE_LOGO_ON or page == PAGE_LOGOBAT_ON:
    canvas.draw_string_rotated(132, 120, "CLASSPAD", (127,127,127), 640, 1056)
    canvas.draw_string_rotated(132, 120, "CLASSPAD", (223,223,223), 640, -1056)
  if page == PAGE_LOGO_OFF:
    canvas.draw_string_rotated(132, 120, "CASIO", (0,50,150), 640, 1056)
  if page in (PAGE_LOGOBAT_ON, PAGE_MENU_1, PAGE_MENU_2):
    icon_battery = (
    (9,b"\0\17\0\1\n\5\0\a\0\3\2\a\0\5\0\a\0\1\0\1\n\1\0\17"),
    (10,b"\0\21\0\1\f\5\0\1\0\1\0\1\0\3\2\1\0\1\0\1\0\5\0\1\0\1\0\1\0\1\0\1\f\1\0\21"),
    (13,b"\0\27\0\1\22\1\0\1\0\3\0\3\0\3\0\5\0\3\0\3\0\3\0\3\2\3\0\3\0\3\0\3\2\3\0\3\0\3\0\5\0\3\0\3\0\3\0\1\0\1\0\3\0\3\0\3\0\1\0\1\22\1\0\27"),
    (19,b"\2!\2!\2\3\30\v\0\5\0\5\0\5\0\v\0\5\0\5\0\5\0\a\4\5\0\5\0\5\0\a\4\5\0\5\0\5\0\a\4\5\0\5\0\5\0\a\4\5\0\5\0\5\0\v\0\5\0\5\0\5\0\v\0\5\0\5\0\5\0\3\2\3\30\3\2!\2!"),
    )
    canvas.draw_image_rotated(icon_battery, 726, 1120, (BLACK,(90,89,90)), 46, 56, 0)
  if page == PAGE_MENU_1 or page == PAGE_MENU_2:
    x0 = 146
    canvas.draw_string_rotated(x0, 120, "MENU \t", BLACK, 612, 90, False)
    canvas.fill_rect_2_circles_left(400, 1142, 48, 14, 5, page == PAGE_MENU_1 and (74,125,165) or (206,203,206))
    canvas.fill_rect_2_circles_right(456, 1142, 48, 14, 5, page == PAGE_MENU_2 and (74,125,165) or (206,203,206))
    if page == PAGE_MENU_1:
      apps = (((("Principale","Princ.","Princ","Main"),(222,0,0),icon_calc),),(
        (("eActivity","e-Act","e Act","eAct","e-\nAct"),(164,0,156),(
        (7,b"\17\2\1\2\3\0\5\0\3\2\1\2\3\0\5\0\3\2\1\2\17"),
        (15,b"\24\3\2\21\0\1\2\1\0\1\4\1\4\3\6\3\2\5\2\1\b\3\4\1\2\1\b\1\0\1\2\5\0\3\4\1\2\1\4\1\2\1\0\1\0\1\4\1\2\5\0\a\6\1\4\1\4\1\n\21\n"),
        (23,b'$\3&\1\2\1"\1\6\1\36\1\b!\b\1\0\1\16\1\6\1\b\1\2\1\16\1\4\1\b\1\4\1\f\5\0\5\4\1\6\1\16\1\2\1\0\3\0\3\6\1\16\1\2\1\2\3\0\1\6\1\f\5\0\a\2\1\6\1\16\1\16\1\6\1\16\1\16\1\6\1\f\5\f\1\6\1\16\1\16\1\6\1\16\1\16\1\6\1\16\1\16\1\6%\6')
        )),
        (("Statis-\ntiques","Statis-\ntics","Stats","Stat"),(0,137,106),(
        (10,b"\0\1\4\5\4\1\0\5\0\1\4\1\0\1\0\1\0\5\0\1\0\1\0\1\0\1\0\25\0\1\16"),
        (12,b"\0\1\4\5\b\1\4\1\0\5\4\1\0\5\0\1\0\1\4\1\0\1\0\1\0\1\0\5\0\1\0\1\0\1\0\1\0\1\0\31\0\1\22"),
        (16,b"!\32\3\2\1\4\5\b\3\2\1\4\1\0\5\4\3\2\1\0\5\0\1\0\1\4\3\2\1\0\1\0\1\0\1\0\5\0\3\2\1\0\1\0\1\0\1\0\1\0\1\0\3\0\27\0\3\2\1\24\3\32!")
        ))
      ),(
        (("Tableur","Spread\nSheet","S-Sht","S Sht","SSht","S-\nSht"),(106,170,0),(
        (7,b"\17\0\1\4\21\0\1\0\1\0\3\0\v\0\1\0\1\0\17"),
        (13,b"\33\2\1\16\35\2\1\2\1\2\1\2\3\2\25\2\1\2\1\2\1\2\3\2\25\2\1\2\1\2\1\2\33")
        )),
        (("Graphe&\nTable","Graphe\nTable","Graph\nTable","Grph\nTbl"),(32,20,148),(
        (11,b"\1\6\1\6\3\6\1\6\1\0\1\4\1\4\1\2\1\4\1\4\1\4\1\2\1\2\1\b\1\0\1\0\1\4\25\b\1\22\1\b"),
        (19,b"\1\6\1\6\1\0\17\6\1\6\1\0\1\2\1\2\3\6\1\6\1\0\1\2\1\2\1\0\1\4\1\4\1\2\r\0\1\4\1\4\1\2\1\2\1\2\1\2\1\2\1\2\1\4\1\2\1\2\1\4\1\0\1\0\1\6#\0\1\2\1\2\1\b\1\n\1\2\1\2\1\b\1\n\r"),
        (24,
        b"!\f\1\2\1\6\1\6\1\2\1\f\1\2\1\6\1\6\1\2\1\f\1\2\1\6\1\6\1\2\1\f\1\4\1\4\1\4\1\4\21\4\1\4\1\4\1\4\1\n\3\6\1\2\1\2\1\6\1\4\1\2\3\b\1\0\1\0\1\b\1\6\1\0#\0\3\0\1\0\3\f\1\f\1\6\1\0\3\f\1\f\1\0\3\0\1\0\3\f\1\f\1\6\1\0#\0\3\0\1\0\1\f\1\0\1\24\1\0\1\f"
        b"\1\2\1\20\1\2\1\f\1\34\1\f!"
        )))
      ),(
        (("Graphe 3D","Graphe3D","Graph 3D","Graph3D","Graphe\n3D","Graph\n3D","3D"),(8,20,222),(
        (9,b"\4\v\2\1\6\3\0\1\6\1\0\r\2\3\6\1\2\3\6\1\2\3\6\1\0\1\0\1\6\3\2\v\4"),
        (15,b"\n\1\30\5\30\1\32\v\16\3\4\3\f\1\0\1\2\1\0\1\n\v\2\1\n\1\2\1\0\1\2\1\0\1\6\1\2\21\4\1\0\1\2\1\0\1\2\1\6\3\4\3\16\v\n\1\0\1\26\3\30\5\26"),
        (24,b'\20\1*\5&\1\0\1\0\1(\1,\3\0\3\0\3\0\3\24\5\f\5\20\3\2\1\b\3\24\3\0\t\0\3\6\1\16\1\6\1\6\1\6\1\30\1"\1\6\1\6\1\6\1\16\1\6\1\6\1\6\1\30\1\24\1\n\1\6\1\6\1\6\1\2\1\b\1\6\35\f\3\16\3\4\1\b\5\f\5\6\1\2\1\4\3\2\3\0\3\0\1\20\1\0\3&\3*\a&'),
        (27,
        b"\22\x010\5,\1\0\1\0\1.\x012\5\0\3\0\3\0\5\26\5\22\3\22\3\2\1\16\3\0\1\20\1\6\1\n\3\26\5\0\t\0\5\b\1\16\1\b\1\b\1\b\1\16\1\b\1\b\1&\1\24\1\16\1\b\1\b\1\b\1\16\1\b\1\b\1&\1\24\1\0\1\n\1\b\1\b\1\b\1\2\1\b\1\b!\16\3\24\1\4\1\b\1\0\3\16\1\2\3\4\1\n"
        b"\3\22\5\16\1\4\5\0\3\0\3\0\5\22\1\0\3,\x030\a,"
        ),
        (33,
        b'\32\1<\x058\1\0\1\0\1:\1>\a\0\3\0\3\0\a\36\5\24\5\30\3\4\1\16\3\4\1\22\3\n\1\b\3\n\1\20\a\0\3\0\3\0\a"\1\16\1\6\1\16\1\20\1\16\1\6\1\16\1\20\1\16\1\6\x014\1\30\1\20\1\16\1\6\1\16\1\20\1\16\1\6\x014\1\30\1\20\1\16\1\6\1\16\1\0\1\f\1\16\1\6\1\16'
        b'\1\2\1\34%\b\1\b\5\b\1\n\3\4\1\n\1\2\5\16\1\4\3\b\1\f\5\24\5\24\1\6\a\0\3\0\3\0\a\30\1\2\x036\5:\t6'
        ),
        (36,
        b'\32\1B\5>\1\0\1\0\1@\1D\a\0\3\0\3\0\3\0\a\36\5\32\5\30\3\4\1\24\3\4\1\22\3\n\1\16\3\n\1\20\a\0\3\0\3\0\3\0\a"\1\16\1\f\1\16\1\20\1\16\1\f\1\16\1\20\1\16\1\f\x014\1\36\1\20\1\16\1\f\1\16\1\20\1\16\1\f\x014\1\36\1\20\1\16\1\f\1\16\1\20\1\16\1\f'
        b'\x014\1\36\1\20\1\16\1\f\1\16\1\0\1\f\1\16\1\f\1\16\1\2\1\34+\b\1\b\5\16\1\n\3\4\1\n\1\2\5\24\1\4\3\b\1\f\5\32\5\24\1\6\a\0\3\0\3\0\3\0\a\30\1\2\3<\5@\t<'
        ),
        (37,
        b"\32\1D\5@\t<\3\0\1\0\3@\1F\a\0\3\0\3\0\3\0\a \5\32\5\32\3\4\1\24\3\4\1\24\3\n\1\16\3\n\1\22\a\0\3\0\3\0\3\0\a$\1\16\1\f\1\16\1\22\1\16\1\f\1\16\1\22\1\16\1\f\x016\1\36\1\22\1\16\1\f\1\16\1\22\1\16\1\f\x016\1\36\1\22\1\16\1\f\1\16\1\22\1\16\1\f"
        b"\x016\1\36\1\0\1\16\1\16\1\f\1\16\1\0\3\f\1\16\1\f\1\16\1\2\3\34-\b\1\b\5\16\1\n\3\4\3\n\1\2\5\24\1\4\3\b\3\f\5\32\5\16\1\4\1\6\a\0\3\0\3\0\3\0\a\32\1\2\3>\5B\t>"
        ),
        (43,
        b' \1P\5L\tH\3\0\1\0\3L\1R\a\0\3\0\3\0\3\0\3\0\a&\5 \5 \3\4\1\32\3\4\1\32\3\n\1\24\3"\3\20\1\16\3\20\1\22\a\0\3\0\3\0\3\0\3\0\a\24\1\22\1\24\1\f\1*\1\24\1\f\1\24\1*\1$\1\22\1\24\1\f\1*\1\24\1\f\1\24\1*\1$\1\22\1\24\1\f\1*\1\24\1\f\1\24\1*\1$\1\22'
        b'\1\24\1\f\1\30\1\16\1\24\1\f\1\24\1\0\3$\1$\1\2\3\n\1\x143\b\1\16\5\16\1\20\3\4\3\26\5"\3\b\3\f\1\2\5\32\1\4\3\16\1\16\5 \5\34\1\6\a\0\3\0\3\0\3\0\3\0\a \1\2\3J\5N\tJ'
        ),
        (44,
        b' \1R\5N\tJ\3\0\1\0\3N\1T\1T\a\0\3\0\3\0\3\0\3\0\a(\5 \5"\3\4\1\32\3\4\1\34\3\n\1\24\3$\3\20\1\16\3\20\1\24\a\0\3\0\3\0\3\0\3\0\a\24\1\24\1\24\1\f\1,\1\24\1\f\1\24\1,\1$\1\24\1\24\1\f\1,\1\24\1\f\1\24\1,\1$\1\24\1\24\1\f\1,\1\24\1\f\1\24\1,\1$\1'
        b'\24\1\24\1\f\1\32\1\16\1\24\1\f\1\24\1\2\3$\1$\1\4\3\n\1\x145\b\1\16\5\16\1\20\3\6\3\26\5"\3\n\3\f\1\2\5\32\1\4\3\20\1\16\5 \5\36\1\6\a\0\3\0\3\0\3\0\3\0\a"\1\2\3L\5P\tL'
        ))),
        (("G\xe9om\xe9trie","Geometry","G\xe9om\xe9-\ntrie","G\xe9om\xe9-\ntry","G\xe9om","G\xe9o"),(74,80,148),(
        (8,b"\0\3\b\1\2\1\6\1\2\1\b\3\2\1\n\1\0\1\6\1\4\1\4\t"),
        (14,b"\2\5\22\1\4\1\6\1\4\1\2\1\2\1\2\1\0\1\2\1\0\5\0\1\2\1\0\1\2\1\2\1\2\5\4\1\2\1\4\1\2\1\4\1\4\5\2\1\b\1\6\1\2\r\0\3\0\1\b\1\4\1\2\3\b\1\4\3\4\v\b\3\4\3\20\3\4\3\20\3\2\1\24\3\6"),
        (18,b"\2\5\32\1\4\1\16\1\4\1\2\1\2\1\n\1\0\1\2\1\0\5\0\1\n\1\0\1\2\1\2\1\2\r\4\1\2\1\4\1\n\1\4\1\4\5\n\1\b\1\6\1\n\r\6\1\16\1\16\1\16\1\b\3\0\1\16\1\6\1\2\3\16\1\6\3\4\3\n\1\n\3\4\r\16\3\4\3\30\3\4\3\30\3\4\3\30\3\2\1\34\3\6")
        ))
      ),(
        (("Plot Image","PlotImage","Plot\nImage","Plot\nImg","Plt\nImg","Plt\nIm"),(0,153,0),(
        (11,b"\0\1\6\1\b\1\2\1\4\1\0\1\0\1\f\1\2\1\0\1\6\1\0\1\0\1\20\25\0\1\20"),
        (18,b"\0\1\f\1\0\1\f\1\16\1\16\1\b\1\0\1\0\1\0\1\b\1\6\1\f\1\6\1\4\1\20\3\2\1\4\1\16\1\2\1\0\1\26\1\2\1\0\1\0\1\0\1\20\3\2\1\2\1\32\1\0\1\0\1\30\1\36#\0\1\36"),
        (23,b'\0\1\24\1\0\1\16\1\26\1\20\1\16\3\0\1\0\1\0\3\b\1\f\1\20\1\6\1\6\1\0\1\24\3\2\1\b\1\24\1\2\1\0\1\6\1\0\1\22\1\2\1\0\1"\3\2\1\6\1 \1\6\1 \1\4\1"\1\4\1"\1*\1\0\1\0\1"\1\2\1$\1\0\1\0\1"\1(-\0\1(')
        )),
        (("CalcDiff\nInteractif","CalcDiff\nInteract","CalcDiff\nInterac","CalcDiff\nInter","Calc\nDiff"),(0,117,156),(
        (11,b"\1\6\1\6\3\6\1\6\1\0\1\4\1\4\1\2\1\4\1\4\1\4\1\2\1\2\5\4\1\0\1\0\3\2\25\2\3\0\1\b\3\4\1\b"),
        (15,b"\0\1\6\1\6\1\6\1\6\1\6\1\2\1\0\1\6\1\6\1\0\1\4\1\4\1\4\1\0\1\6\1\4\1\4\3\2\1\4\1\2\1\2\t\b\1\0\1\0\5\6\35\2\5\0\3\f\3\6\1\30\3\26\1\0\1\16"),
        (19,b"'\2\1\6\1\6\1\6\3\2\1\6\1\6\1\2\1\0\3\2\1\6\1\6\1\0\1\2\3\4\1\4\1\4\1\0\1\4\3\4\1\4\1\4\3\2\1\0\3\6\1\2\1\2\t\2\3\b\1\0\1\0\5\b\3\0\35\0\3\4\5\0\3\16\3\0\3\6\1\20\3\n\3\20\3\b\1\0\1\20'")
        ))
      ),(
        (("Coniques","Conics","Coni-\nques","Coniq"),(8,170,197),(
        (13,b"\3\6\1\6\3\2\1\4\1\4\1\b\1\2\1\2\1\f\1\0\1\0\1\6\31\6\1\0\1\0\1\f\1\2\1\2\1\b\1\4\1\4\1\2\3\6\1\6\3"),
        (17,b"#\f\1\f\3\0\3\6\1\6\3\0\3\4\1\4\1\4\1\4\3\6\1\2\1\2\1\6\3\b\1\0\1\0\1\b%\b\1\0\1\0\1\b\3\6\1\2\1\2\1\6\3\4\1\4\1\4\1\4\3\0\3\6\1\6\3\0\3\f\1\f#"),
        )),
        (("EqDiff\nGraph","Equa\nDiff","Equ\nDiff","Eq\nDiff"),(8,117,189),(
        (9,b"\1\0\1\0\1\0\1\0\3\0\1\0\1\0\1\0\3\4\1\4\1\0\1\2\1\2\1\0\21\2\1\0\1\0\1\2\1\2\5\2\1\0\1\2\1\2\1\0"),
        (11,b"\1\0\1\2\1\2\1\0\3\0\1\2\1\2\1\0\3\6\1\6\1\0\1\0\1\0\1\0\1\0\1\2\1\4\1\4\1\0\25\4\1\0\1\0\1\6\1\2\5\2\1\4\1\2\1\2\1\2"),
        (13,b"\1\0\1\4\1\4\1\0\3\0\1\4\1\4\1\0\1\4\1\2\1\2\1\4\31\6\1\0\1\0\1\6\1\0\1\2\5\2\1\0\3\2\1\2\1\2\1\2\1\n\1\n"),
        (15,b"\1\0\1\6\1\6\1\0\3\0\1\6\1\6\1\0\1\4\1\4\1\4\1\4\35\6\1\2\1\2\1\6\1\0\1\2\1\0\1\0\1\2\1\0\3\2\1\2\5\2\1\2\1\f\1\f"),
        (17,
        b"\1\0\1\2\1\2\1\2\1\2\1\0\3\0\1\2\1\2\1\2\1\2\1\0\1\2\1\2\1\2\1\2\1\2\1\2\1\0\1\4\1\0\1\0\1\4\1\0\3\2\1\2\1\0\1\0\1\2\1\2\1\4\1\4\5\4\1\4!\6\1\4\1\4\1\6\1\0\1\2\1\2\1\2\1\2\1\0\3\2\1\2\1\0\1\0\1\2\1\2\1\f\5\f\1\0\1\2\1\2\1\2\1\2\1\0\3\2\1\2\1\0"
        b"\1\0\1\2\1\2\1"
        ),
        (19,
        b"\1\0\1\2\1\4\1\4\1\2\1\0\3\0\1\2\1\4\1\4\1\2\1\0\1\2\1\2\1\4\1\4\1\2\1\2\1\0\1\4\1\2\1\2\1\4\1\0\3\2\1\2\1\2\1\2\1\2\1\2\1\4\1\4\1\0\1\0\1\4\1\4%\6\1\6\1\6\1\6\1\0\1\2\1\4\1\4\1\2\1\0\3\2\1\2\1\2\1\2\1\2\1\2\1\f\t\f\1\0\1\2\1\4\1\4\1\2\1\0\3\2"
        b"\1\2\1\2\1\2\1\2\1\2\1"
        ),
        (23,
        b"/(\3\0\1\0\1\2\1\4\1\4\1\2\1\0\1\0\3\0\1\0\1\2\1\4\1\4\1\2\1\0\1\0\3\4\1\2\1\4\1\4\1\2\1\4\3\0\1\0\1\4\1\2\1\2\1\4\1\0\1\0\3\0\1\2\1\2\1\2\1\2\1\2\1\2\1\0\3\6\1\4\1\0\1\0\1\4\1\6\3\0%\0\3\b\1\6\1\6\1\b\3\0\1\0\1\2\1\4\1\4\1\2\1\0\1\0\3\0\1\2\1"
        b"\2\1\2\1\2\1\2\1\2\1\0\3\16\t\16\3\0\1\0\1\2\1\4\1\4\1\2\1\0\1\0\3\0\1\2\1\2\1\2\1\2\1\2\1\2\1\0\3\22\1\22/"
        )))
      ),)
    else:
      app_python = (("Python&\nGetkey","Python","Py-\nthon"),(64,104,136),(
      (14,b"\6\t\20\v\24\5\b\21\0\3\0\21\2\r\n\r\2\21\0\3\0\21\b\5\24\v\20\t\6"),
      (28,b"\20\21\"\27\34\3\2\21\34\3\2\23\32\33\32\33(\r\22#\0\5\b%\0\a\4'\0\t\2%\2\t\0'\x021\2\37\24\37\24\37\x021\2'\0\t\2%\2\t\0'\4\a\0%\b\5\0#\22\r(\33\32\33\32\23\2\3\34\21\2\3\34\27\"\21\20"),
      ))
     
      app_physium = (("Physium","Phy-\nsium"),(82,68,164),(
      (9,b"\1\f\5\4+\26\v"),
      (11,b"\1\20\5\6\r\6K\32\17"),
      (13,b"\4\1\0\1\f\1\2\5\n\5\0\1\0\1\0\17\bY\36\23"),
      (17,b"\5\2\1\0\1\n\a\0\1\2\5\n\1\0\3\0\3\0\1\0\1\0\v\0\3\2\1\b\1\n\3\2\r\n\3\34\3\34#(\31\6\1\24\1\6\31"),
      (20,b"\a\4\1\0\1\n\t\2\1\4\5\n\1\2\3\2\5\0\1\0\1\0\v\2\3\6\1\0\1\0\1\0\1\f\3\6\1\b\1\f\3\6\r\f\3\"\3\")2\33\n\1\26\1\n\33"),
      (21,b"\a\4\1\0\1\f\t\2\1\4\1\0\1\f\1\2\3\2\5\0\5\0\r\2\3\6\1\0\1\0\1\0\1\16\3\6\1\0\1\0\1\0\1\16\3\6\1\b\1\16\3\6\r\16\3$\3$+4\35\n\1\30\1\n\35"),
      (25,b"3,\3\0\a\4\1\0\1\f\a\0\3\0\1\2\1\4\1\0\1\f\1\2\1\0\3\0\1\2\5\0\5\0\r\2\1\0\3\0\1\6\1\0\1\0\1\0\1\16\1\0\3\0\1\6\1\0\1\0\1\0\1\16\1\0\3\0\1\6\1\b\1\16\1\0\3\0\1\6\r\16\1\0\3\0\1$\1\0\3\0\1$\1\0\3\0)\0\3,\3\f\35\0\3\f\1\30\1\0\3\f\35\0\3,3"),
      (48,
      b"aZ\3Z\3\2\17\n\3\2\3\32\17\2\3\2\17\n\3\2\3\32\17\2\3\2\3\6\3\n\3\2\3\32\3\6\3\2\3\2\3\6\3\n\3\2\3\32\3\6\3\2\3\2\3\6\v\2\v\2\33\6\3\2\3\2\3\6\v\2\v\2\33\6\3\2\3\2\3\16\3\2\3\2\3\2\3\36\3\2\3\2\3\16\3\2\3\2\3\2\3\36\3\2\3\2\3\16\3\2\3\2\3\2\3\36"
      b"\3\2\3\2\3\16\3\2\3\2\3\2\3\36\3\2\3\2\3\16\3\22\3\36\3\2\3\2\3\16\3\22\3\36\3\2\3\2\3\16\33\36\3\2\3\2\3\16\33\36\3\2\3\2\3J\3\2\3\2\3J\3\2\3\2\3J\3\2\3\2\3J\3\2\3\2S\2\3\2S\2\3Z\3Z\3\32;\2\3\32;\2\3\32\x032\3\2\3\32\x032\3\2\3\32;\2\3\32;\2\3Z"
      b"\3Za"
      ),),)
      app_algy2 = (("Algy 2","Algy2","Algy\n2"),(238,101,8),(
      (14,b"\0\1\2\1\4\3\0\1\0\3\0\1\0\1\2\1\4\1\0\a\0\1\2\1\0\1\2\1\0\1\0\1\0\3\2\3\2\1(\1\32\1\26\1\30\3\n"),
      (17,b"\0\3\2\1\6\5\0\1\0\3\2\1\0\1\4\1\6\1\0\t\0\1\4\1\0\3\2\1\0\1\2\1\0\1\4\1\2\1\2\1\0\1\2\1\0\5\2\5\2\x010\3 \1\34\1\34\1\36\5\f"),
      (21,b'\0\5\2\1\b\5\0\1\4\3\4\1\0\1\6\1\b\1\0\1\0\t\0\1\6\1\0\3\4\1\2\1\4\1\0\1\6\1\2\1\4\1\2\1\4\1\0\a\2\5\4\1@\3"\1\2\1$\1$\1$\a\16'),
      (25,b"\2\3\4\1\n\a\2\1\4\1\0\1\2\1\2\1\b\1\6\1\0\3\0\5\6\1\0\1\b\1\f\5\0\v\0\1\b\1\2\5\4\1\2\1\6\1\0\1\b\1\6\1\4\1\2\1\6\1\0\t\2\a\6\1L\3*\1\2\1,\1,\1,\1.\a\22"),
      (29,b"\2\5\4\1\f\a\2\3\4\3\0\1\4\1\2\1\n\1\6\1\2\3\0\3\0\1\2\1\2\1\0\1\n\1\16\5\2\1\0\5\0\1\0\1\n\1\2\5\6\1\4\1\2\1\2\1\0\1\n\1\6\1\6\1\4\1\b\1\0\1\n\1\6\1\6\1\4\1\b\1\0\v\2\a\b\1Z\x032\1\2\x016\x014\x014\x014\x016\a\26"),
      (36,
      b"\4\5\6\3\16\v\2\1\n\1\2\3\0\3\4\3\f\17\0\3\6\3\0\3\4\3\2\3\f\3\6\3\2\3\2\3\0\3\2\1\2\3\0\3\f\3\20\a\2\3\0\5\0\3\0\3\f\3\0\t\6\3\4\3\2\1\2\3\0\3\f\3\0\t\6\3\4\3\b\3\0\3\f\3\6\3\6\3\4\3\b\3\0\17\0\17\6\3\4\3\b\3\0\17\2\v\b\3n\a<\1\6\1:\1\4\3@\3@\3@"
      b"\3@\3B\1D\v\32"
      ),
      (42,
      b"\4\t\6\3\20\17\2\3\b\3\2\r\4\3\16\23\0\5\4\5\0\5\4\5\2\3\16\5\6\5\2\5\0\5\0\5\2\1\2\5\0\3\16\3\n\3\4\t\2\3\2\5\2\3\0\3\16\3\26\5\4\3\4\1\4\3\0\3\16\3\2\v\6\5\4\3\f\3\0\3\16\3\2\v\6\5\4\3\f\3\0\3\16\3\n\3\6\5\4\3\f\3\0\3\16\5\6\5\6\5\4\3\f\3\0\21"
      b"\0\23\6\5\4\3\f\3\0\21\2\17\b\5\xfe\0\aH\vD\3\6\3B\3\6\3L\5J\5J\5J\5J\5J\5L\17B\17 "
      ),),)

      apps = [(
        ("R\xe9sol\nNum",(231,134,8),(
        (10,b"\0\1\2\1\0\1\4\1\0\1\2\1\2\5\0\1\2\1\b\1\0\3\0\1\0\3"),
        (14,b"\0\1\2\1\0\1\6\1\2\1\0\1\2\1\2\3\0\3\0\1\0\1\2\1\b\1\0\1\0\1\0\3\0\1\0\3\0\3\0"),
        (15,b"\0\1\4\1\0\1\6\1\2\1\0\1\4\1\2\3\0\3\0\1\0\1\4\1\b\1\0\1\0\1\0\1\0\1\0\1\0\3\0\3\0"),
        )),
        (("Suites","Suite","Seq"),(8,16,198),(
        (9,b"\0\1\4\1\6\1\2\1\0\5\0\1\2\1\0\1\4\1\0\1\0\3\4\1\0\1\4\3\0\3\0\5\4\5\b\21\0\1\f"),
        (20,b"\0\1\6\1\32\1\4\1\0\25\4\1\4\1\0\1\24\1\0\1\2\1\2\1\16\5\2\1\2\1\2\1\b\5\b\1\0\1\4\1\2\5\16\1\0\1\4\5\24\3\0\5\32\5\36'\0\1\""),
        (24,b"1*\3\2\1\6\1\32\3\2\1\4\1\0\25\4\3\2\1\4\1\0\1\24\1\0\3\2\1\2\1\2\1\16\5\2\3\2\1\2\1\2\1\b\5\b\3\2\1\0\1\4\1\2\5\16\3\2\1\0\1\4\5\24\3\2\3\0\5\32\3\2\5 \3\0'\0\3\2\1$\3*1"),
        ),)
      ),(
        (("Finances","Finance","Finan-\nces","TVM"),(198,186,0),(
        (9,b"\0\1\6\5\0\3\2\1\4\1\4\a\2\1\4\1\b\1\0\a\0\3\4\1\6\1\6\5"),
        (12,b"\2\1\b\5\2\a\2\1\4\3\0\1\4\a\4\5\4\1\n\1\0\1\0\a\2\a\4\1\4\1\2\1\b\5\0"),
        (13,b"\2\1\n\5\2\5\6\1\4\3\0\1\0\1\2\1\b\1\0\1\4\v\2\5\4\1\f\1\0\1\0\t\2\1\0\1\0\1\2\1\n\5\6\1\4\1\2\1\n\5\0"),
        (26,b"\24\35\24\1\b\5\b\1\24\1\6\1\4\1\6\1\24\1\4\a\n\1\24\1\6\1\16\1\24\1\4\a\n\1\24\1\6\1\4\1\6\37\2\5\b\3\n\1\n\31\b\a\6\1\24\1\6\1\0\1\n\1\24\1\b\5\b\1\24\1\n\1\0\1\6\1\24\1\6\a\b\1\24\1\n\1\n\1\24\35\24"),
        (29,
        b"\26!\26\1\f\5\b\1\26\1\n\1\4\1\6\1\26\1\b\1\20\1\26\1\6\v\b\1\26\1\b\1\20\1\26\1\6\t\n\1\26\1\b\1\20#\2\1\4\1\6\3\f\1\f\1\4\5\b\3\n\5\n\33\b\1\0\1\0\1\b\1\26\1\b\1\0\1\f\1\26\1\n\5\n\1\26\1\f\1\0\1\b\1\26\1\b\1\0\1\0\1\b\1\26\1\n\5\n\1\26\1\f"
        b"\1\f\1\26!\26"
        ),
        (32,
        b"\30%\30\1\16\5\n\1\30\1\f\1\4\1\b\1\30\1\n\1\22\1\30\1\b\v\n\1\30\1\n\1\22\1\30\1\b\t\f\1\30\1\n\1\22'\2\1\4\1\b\3\16\1\16\1\4\5\n\3\f\5\f\35\n\1\0\1\0\1\n\1\30\1\n\1\0\1\16\1\30\1\f\5\f\1\30\1\16\1\0\1\n\1\30\1\n\1\0\1\0\1\n\1\30\1\f\5\f\1"
        b"\30\1\16\1\16\1\30%\30"
        ),
        (35,
        b"\32)\32\1$\1\32\1\20\5\f\1\32\1\16\1\4\1\n\1\32\1\f\1\24\1\32\1\n\v\f\1\32\1\f\1\24\1\32\1\n\t\16\1\32\1\f\1\24+\2\1\4\1\n\3$\1\4\5\f\3\20\1\20\1\30\3\16\5\16\37\f\1\0\1\0\1\f\1\32\1\f\1\0\1\20\1\32\1\16\5\16\1\32\1\20\1\0\1\f\1\32\1\f\1\0\1"
        b"\0\1\f\1\32\1\16\5\16\1\32\1\20\1\20\1\32\1$\1\32)\32"
        ),
        (38,
        b"\34-\34\1(\1\34\1\22\5\16\1\34\1\20\1\4\1\f\1\34\1\16\1\26\1\34\1\f\v\16\1\34\1\16\1\26\1\34\1\f\t\20\1\34\1\16\1\26/\2\1\4\1\f\3(\1\4\5\16\3\22\1\22\1\32\3\20\5\20!\16\1\0\1\0\1\16\1\34\1\16\1\0\1\22\1\34\1\20\5\20\1\34\1\22\1\0\1\16\1\34\1"
        b"\16\1\0\1\0\1\16\1\34\1\20\5\20\1\34\1\22\1\22\1\34\1(\1\34-\34"
        ),
        ),),
        (("Programme","Program","Pro-\ngramme","Pro-\ngram","Prgm","Prog"),(148,170,66),(
        (15,b"\0\3\26\1\2\1\24\1\2\1\4\3\f\3\2\3\0\1\22\1\4\1\f\v\0\v\2\1\b\3\6\1\2\3\f\3\0\1\2\1\0\1\f\1\0\1\0\1\4\1\16\1\2\1\0\1\20\1\2\3\22\1\2\1\24\1\0\37\30\37"),
        (16,b"\0\3\30\1\2\1\26\1\2\1\6\3\f\3\4\3\0\1\24\1\4\1\f\r\0\v\2\1\n\3\6\1\2\1\0\3\n\3\0\1\2\3\2\1\n\1\0\1\0\1\6\1\16\1\0\1\b\1\f\1\2\1\6\1\f\1\2\1\2\3\16\1\2\5\22\1\2\1\26\1\0!\32!"),
        (18,b"\0\3\34\1\2\1\n\3\n\1\2\1\6\3\0\1\f\3\4\3\4\1\24\1\b\1\f\r\4\v\2\1\n\3\0\1\6\1\2\1\0\3\b\3\0\3\0\1\2\3\2\1\16\1\0\1\0\1\6\1\22\1\0\1\b\1\20\1\2\1\6\1\20\1\2\1\2\3\22\1\2\5\26\1\2\1\32\1\0%\36%"),
        (20,b'\0\5\36\1\4\1\n\3\f\1\4\1\6\3\0\1\f\1\4\1\2\3\4\1\16\5\2\1\b\1\32\3\4\1\20\21\0\v\6\1\16\3\6\1\6\5\20\3\0\1\4\3\2\1\20\1\0\1\2\1\6\1\24\1\2\1\b\1\22\1\4\1\6\1\22\1\4\1\2\3\24\1\6\3\30\1\6\1\32\1\2)")'),
        (24,
        b'\2\5&\3\0\3"\3\4\3\f\3\16\1\b\1\b\3\0\1\16\3\4\3\4\3\4\1\20\3\0\3\2\3\b\1\22\5\2\1\f\1\36\3\b\1\22\23\4\r\6\1\20\3\0\1\b\1\6\1\2\3\f\3\0\5\0\1\6\5\2\1\24\1\0\1\4\3\6\1\24\1\0\1\2\1\f\1\26\1\2\1\f\1\26\1\4\1\f\1\24\1\4\1\f\1\24\1\6\1\6\3\26\1'
        b'\6\1\2\3\32\1\6\5\36\1\6\1"\1\x021*1'
        ),),)
      ),(
        (("E-CON3","ECON3","E-\nCON3","E-\nCON"),(115,16,180),(
        (13,b"\33\24\3\0\5\0\3\0\3\0\3\2\1\16\33\4\1\26\1\0\t\n\5\4\a\b\t\4"),
        (15,b"\37\30\3\0\5\0\5\0\5\0\3\0\5\0\5\0\5\0\3\2\1\22\37\4\1\32\1\0\v\f\5\6\t\b\v\6"),
        (17,b"\0\1\36\1\36\1\36\1\36\1\34\5\0\33\0\1\0\1\24\3\0\1\0\1\0\5\0\3\0\3\0\3\0\1\0\1\2\1\16\a\0\31\0\1\b\1\22\r\20"),
        (19,b'\0\1"\1"\1"\1"\1"\1 \5\0\37\0\1\0\1\30\3\0\1\0\1\0\5\0\5\0\5\0\3\0\1\0\1\0\5\0\5\0\5\0\3\0\1\0\1\2\1\22\a\0\35\0\1\b\1\26\r\24'),
        (23,b"\0\1*\1*\1*\1*\1*\1*\1(\5\0'\0\1\0\1 \3\0\1\0\1\0\t\0\a\0\a\0\3\0\1\0\1\0\t\0\1\2\1\0\1\2\1\0\3\0\1\0\1\0\t\0\a\0\a\0\3\0\1\0\1\4\1\30\a\0%\0\1\n\1\34\17\32"),
        )),
        (("Communi-\ncation","Commu-\nnication","Commu-\nnicat","Com-\nmunic","Comm","Link"),(123,161,164),(
        (16,b"\0\21\f\1\f\1\2\a\0\1\6\3\0\1\2\1\2\1\0\1\b\1\0\1\2\1\2\1\0\1\f\1\2\1\2\1\0\1\f\1\2\1\2\27\0\t\20\1\0\35\0\a"),
        (22,b"\0\33\16\1\26\1\2\t\0\1\16\5\0\1\2\1\4\1\0\1\22\1\0\1\2\1\4\1\0\1\22\1\0\1\2\1\4\1\0\1\26\1\2\1\4\1\0\1\26\1\2\1\4\1\0\1\26\1\2\1\4\1\0\1\26\1\2)\0\v\32\1\0)\0\t"),
        (24,b"\0\35\20\1\30\1\2\v\0\1\20\5\0\1\2\1\6\1\0\1\24\1\0\1\2\1\6\1\0\1\24\1\0\1\2\1\6\1\0\1\30\1\2\1\6\1\0\1\30\1\2\1\6\1\0\1\30\1\2\1\6\1\0\1\30\1\2\1\6\1\0\1\30\1\2-\0\3\2\5\34\1\0-\0\v"),
        (28,b"\2!\24\1\34\1\24\1\24\5\0\1\4\v\2\1\30\1\0\1\4\1\6\1\2\1\30\1\0\1\4\1\6\1\2\1\34\1\4\1\6\1\2\1\34\1\4\1\6\1\2\1\34\1\4\1\6\1\2\1\34\1\4\1\6\1\2\1\34\1\4\1\6\1\2\1\34\1\x045\0\3\2\5$\1\x005\0\v"),
        (33,
        b'\2\'\30\1"\1\30\1\32\5\0\1\4\17\2\1\36\1\0\1\4\1\n\1\2\1\36\1\0\1\4\1\0\a\0\1\2\1"\1\4\1\0\a\0\1\2\1"\1\4\1\0\a\0\1\2\1"\1\4\1\0\a\0\1\2\1"\1\4\1\0\a\0\1\2\1"\1\4\1\0\a\0\1\2\1"\1\4\1\0\a\0\1\2\1"\1\4\1\n\1\2\1"\1\4\1\2\3\x021\0\1\n\3*\1\0\1'
        b'\n1\0\17'
        ),
        (37,
        b"\2-\32\1(\1\32\1 \5\0\1\4\21\2\1$\1\0\1\4\1\f\1\2\1$\1\0\1\4\1\0\t\0\1\2\1(\1\4\1\0\t\0\1\2\1(\1\4\1\0\t\0\1\2\1(\1\4\1\0\t\0\1\2\1(\1\4\1\0\t\0\1\2\1(\1\4\1\0\t\0\1\2\1(\1\4\1\0\t\0\1\2\1(\1\4\1\0\t\0\1\2\1(\1\4\1\0\t\0\1\2\1(\1\4\1\f\1\2\1"
        b"(\1\4\1\2\5\x027\0\1\f\x030\1\0\1\f7\0\21"
        ),
        (41,
        b"\x023\34\1.\1\34\1&\5\0\1\4\23\2\1*\1\0\1\4\1\16\1\2\1*\1\0\1\4\1\0\v\0\1\2\1.\1\4\1\0\v\0\1\2\1.\1\4\1\0\v\0\1\2\1.\1\4\1\0\v\0\1\2\1.\1\4\1\0\v\0\1\2\1.\1\4\1\0\v\0\1\2\1.\1\4\1\0\v\0\1\2\1.\1\4\1\0\v\0\1\2\1.\1\4\1\0\v\0\1\2\1.\1\4\1\0\v\0"
        b"\1\2\1.\1\4\1\16\1\2\1.\1\4\1\2\a\2\1\2\1.\1\4\1\2\a\2=\0\1\16\x036\1\0\1\16=\0\23"
        ),),)
      ),]
      line = [
      (("Syst\xe8me","Syst\xe8m","Sys-\nt\xe8me","Sys-\nt\xe8m","Syst","Sys"),(24,117,139),(
      (11,b"\2\1\6\5\4\1\4\5\6\1\4\3\2\1\2\1\4\3\0\3\0\5\2\23\2\5\0\1\0\1\0\1\2\1\0\1\0\1\0\1\0\1\2\1\0\1\0\1\0\1\0\1\2\1\0\1\0\1\0\1\0\1\2\1\0\1\2\5\6\1\2"),
      (12,b"\2\1\6\1\0\1\6\1\4\3\0\3\4\1\4\3\0\3\4\1\2\5\0\5\0\5\0\r\0\1\0\1\2\t\0\t\2\5\2\1\0\1\0\1\2\5\2\1\0\1\0\1\2\5\2\1\0\1\0\1\2\5\2\1\0\1\0\1\2\5\4\5\4\5\2"),
      (13,b"\0\5\4\1\2\1\4\1\0\1\2\3\2\3\4\1\4\3\2\3\4\1\2\5\2\5\2\1\2\17\0\5\0\17\0\1\0\1\2\v\0\t\2\a\2\1\0\1\0\1\2\a\2\1\0\1\0\1\2\a\2\1\0\1\0\1\2\a\2\1\0\1\0\1\2\a\4\5\4\a\2"),
      (14,b"\0\5\6\1\2\1\4\1\0\1\4\3\2\3\4\1\6\3\2\3\4\1\4\5\2\5\2\1\4\17\0\5\2\17\0\1\0\1\4\v\0\t\4\a\2\1\0\1\0\1\4\a\2\1\0\1\0\1\4\a\2\1\0\1\0\1\4\a\2\1\0\1\0\1\4\a\2\1\0\1\0\1\4\a\4\5\6\a\2"),
      (15,b"\0\5\4\1\6\1\4\1\0\1\2\5\2\5\2\1\0\1\2\5\2\5\4\1\4\5\2\5\4\1\2\a\2\a\2\1\2\23\0\5\0\23\0\1\0\1\2\17\0\t\2\v\2\1\0\1\0\1\4\a\4\1\0\1\0\1\4\a\4\1\0\1\0\1\4\a\4\1\0\1\0\1\4\a\4\1\0\1\0\1\4\a\6\5\6\a\4"),
      (16,b"\0\5\6\1\6\1\4\1\0\1\6\3\2\3\4\1\0\1\4\5\2\5\4\1\6\5\2\5\4\1\6\5\2\5\4\1\4\a\2\a\0\5\2\23\0\1\0\1\2\23\0\1\0\1\4\17\0\t\4\v\2\1\0\1\0\1\6\a\4\1\0\1\0\1\6\a\4\1\0\1\0\1\6\a\4\1\0\1\0\1\6\a\4\1\0\1\0\1\6\a\6\5\b\a\4"),
      (17,b"\2\5\4\1\6\1\b\1\0\1\4\3\2\3\b\1\0\1\2\5\2\5\6\1\0\1\2\5\2\5\b\1\4\5\2\5\b\1\2\a\2\a\6\1\2\23\4\5\0\23\4\1\0\1\2\17\6\1\0\1\4\v\6\t\4\a\b\1\0\1\0\1\4\a\b\1\0\1\0\1\4\a\b\1\0\1\0\1\4\a\b\1\0\1\0\1\4\a\b\1\0\1\0\1\4\a\n\5\6\a\6"),
      (18,
      b"\0\5\b\1\6\1\6\1\0\1\b\3\2\3\6\1\0\1\6\5\2\5\4\1\0\1\6\5\2\5\6\1\b\5\2\5\6\1\6\a\2\a\4\1\4\27\0\5\4\23\2\1\0\1\6\17\4\1\0\1\b\v\4\t\b\a\6\1\0\1\0\1\b\a\6\1\0\1\0\1\b\a\6\1\0\1\0\1\b\a\6\1\0\1\0\1\b\a\6\1\0\1\0\1\b\a\6\1\0\1\0\1\b\a\b\5\n\a\6"
      ),
      (20,
      b"\4\1\n\1\6\1\n\1\0\1\b\3\2\3\n\1\0\1\6\5\2\5\b\1\0\1\6\5\2\5\6\1\4\1\4\5\2\5\6\1\4\1\2\a\2\a\4\1\4\1\0\27\2\1\4\1\2\23\6\1\0\1\6\17\b\1\0\1\b\v\n\1\0\1\n\a\n\t\b\a\n\1\4\1\b\a\n\1\4\1\b\a\n\t\b\a\f\1\0\1\n\a\n\1\4\1\b\a\n\1\4\1\b\a\n\1\4\1\b\a\n"
      b"\t\b\a\b"
      ),
      (22,
      b"\6\1\f\1\6\1\f\1\0\1\n\3\2\3\f\1\0\1\b\5\2\5\n\1\0\1\b\5\2\5\b\1\4\1\6\5\2\5\b\1\4\1\4\a\2\a\6\1\4\1\2\27\4\1\4\1\4\23\b\1\0\1\b\17\n\1\0\1\n\v\f\1\0\1\f\a\16\1\0\1\f\a\n\r\b\a\n\1\b\1\b\a\n\1\b\1\b\a\n\r\b\a\16\1\0\1\f\a\f\1\4\1\n\a\f\1\4\1\n\a"
      b"\f\1\4\1\n\a\f\1\4\1\n\a\f\t\n\a\b"
      ),
      (23,
      b"\6\1\16\1\6\1\f\1\0\1\f\3\2\3\f\1\0\1\n\5\2\5\n\1\0\1\n\5\2\5\b\1\4\1\b\5\2\5\b\1\4\1\6\a\2\a\6\1\4\1\4\27\4\1\4\1\6\23\b\1\0\1\n\17\n\1\0\1\f\v\f\1\0\1\16\a\16\1\0\1\16\a\n\r\n\a\n\1\b\1\n\a\n\1\b\1\n\a\n\r\n\a\16\1\0\1\16\a\f\1\4\1\f\a\f\1\4\1"
      b"\f\a\f\1\4\1\f\a\f\1\4\1\f\a\f\1\4\1\f\a\f\t\f\a\b"
      ),
      (24,
      b"\b\1\16\1\6\1\16\1\0\1\f\3\2\3\16\1\0\1\n\5\2\5\f\1\0\1\n\5\2\5\n\1\4\1\b\5\2\5\n\1\4\1\6\a\2\a\b\1\4\1\4\27\6\1\4\1\6\23\n\1\0\1\n\17\f\1\0\1\f\v\16\1\0\1\16\a\20\1\0\1\16\a\n\21\b\a\n\1\f\1\b\a\n\1\f\1\b\a\n\21\b\a\20\1\0\1\16\a\16\1\4\1\f\a\16"
      b"\1\4\1\f\a\16\1\4\1\f\a\16\1\4\1\f\a\f\1\b\1\n\a\f\1\b\1\n\a\f\r\n\a\b"
      ),
      (25,
      b"\b\1\20\1\6\1\16\1\0\1\16\3\2\3\16\1\0\1\f\5\2\5\f\1\0\1\f\5\2\5\n\1\4\1\n\5\2\5\n\1\4\1\b\a\2\a\b\1\4\1\6\27\6\1\4\1\b\23\n\1\0\1\f\17\f\1\0\1\16\v\16\1\0\1\20\a\20\1\0\1\20\a\n\21\n\a\n\1\f\1\n\a\n\1\f\1\n\a\n\21\n\a\20\1\0\1\20\a\16\1\4\1\16\a"
      b"\16\1\4\1\16\a\16\1\4\1\16\a\16\1\4\1\16\a\16\1\4\1\16\a\f\1\b\1\f\a\f\1\b\1\f\a\f\r\f\a\b"
      ),
      (26,
      b"\b\3\20\1\6\1\16\1\2\1\16\3\2\3\16\1\2\1\f\5\2\5\f\1\2\1\f\5\2\5\n\1\6\1\n\5\2\5\n\1\6\1\b\a\2\a\b\1\6\1\6\27\6\1\6\1\b\23\n\1\2\1\f\17\f\1\2\1\16\v\16\1\2\1\20\a\20\1\2\1\20\a\20\1\2\1\20\a\n\23\n\a\n\1\16\1\n\a\n\1\16\1\n\a\n\23\n\a\20\1\2\1\20"
      b"\a\16\1\6\1\16\a\16\1\6\1\16\a\16\1\6\1\16\a\16\1\6\1\16\a\16\1\6\1\16\a\f\1\n\1\f\a\f\1\n\1\f\a\f\17\f\a\b"
      ),
      (27,
      b"\n\3\16\1\6\1\22\1\2\1\f\3\2\3\22\1\2\1\n\5\2\5\20\1\2\1\n\5\2\5\16\1\6\1\b\5\2\5\16\1\6\1\6\a\2\a\f\1\6\1\4\27\n\1\6\1\6\23\16\1\2\1\n\17\20\1\2\1\f\v\22\1\2\1\16\a\24\1\2\1\16\a\24\1\2\1\16\a\24\1\2\1\16\a\16\23\b\a\16\1\16\1\b\a\16\1\16\1\b\a"
      b"\16\23\b\a\24\1\2\1\16\a\22\1\6\1\f\a\22\1\6\1\f\a\22\1\6\1\f\a\22\1\6\1\f\a\22\1\6\1\f\a\20\1\n\1\n\a\20\1\n\1\n\a\20\17\n\a\n"
      ),
      (28,
      b"\n\3\20\1\6\1\22\1\2\1\16\3\2\3\22\1\2\1\f\5\2\5\20\1\2\1\f\5\2\5\16\1\6\1\n\5\2\5\16\1\6\1\b\a\2\a\f\1\6\1\6\27\n\1\6\1\b\23\16\1\2\1\f\17\20\1\2\1\16\v\22\1\2\1\20\a\24\1\2\1\20\a\24\1\2\1\20\a\24\1\2\1\20\a\24\1\2\1\20\a\16\23\n\a\16\1\16\1\n"
      b"\a\16\1\16\1\n\a\16\23\n\a\24\1\2\1\20\a\22\1\6\1\16\a\22\1\6\1\16\a\22\1\6\1\16\a\22\1\6\1\16\a\22\1\6\1\16\a\20\1\n\1\f\a\20\1\n\1\f\a\20\17\f\a\n"
      ),
      (29,
      b"\n\3\22\1\6\1\22\1\2\1\20\3\2\3\22\1\2\1\16\1\0\1\2\1\0\1\20\1\2\1\16\1\0\1\2\1\0\1\16\1\6\1\f\1\0\1\2\1\0\1\16\1\6\1\n\1\2\1\2\1\2\1\f\1\6\1\b\3\4\3\4\3\n\1\6\1\n\1\16\1\16\1\2\1\16\1\n\1\20\1\2\1\20\1\6\1\22\1\2\1\22\1\2\1\24\1\2\1\22\1\2\1\24"
      b"\1\2\1\22\1\2\1\24\1\2\1\22\1\2\1\24\1\2\1\22\1\2\1\24\1\2\1\22\1\2\1\16\23\f\1\2\1\16\1\16\1\f\1\2\1\16\1\16\1\f\1\2\1\16\23\f\1\2\1\24\1\2\1\22\1\2\1\22\1\6\1\20\1\2\1\22\1\6\1\20\1\2\1\22\1\6\1\20\1\2\1\22\1\6\1\20\1\2\1\22\1\6\1\20\1\2\1\20\1"
      b"\n\1\16\1\2\1\20\1\n\1\16\1\2\1\20\17\16\a\n"
      ),
      (30,
      b"\n\3\22\1\b\1\22\1\2\1\20\3\4\3\22\1\2\1\16\1\0\1\4\1\0\1\20\1\2\1\16\1\0\1\4\1\0\1\16\1\6\1\f\1\0\1\4\1\0\1\16\1\6\1\n\1\2\1\4\1\2\1\f\1\6\1\n\1\4\1\0\1\4\1\f\1\6\1\b\3\6\1\6\3\f\1\2\1\f\1\20\1\16\1\2\1\16\1\f\1\20\1\2\1\20\1\b\1\22\1\2\1\22\1\4"
      b"\1\24\1\2\1\22\1\4\1\24\1\2\1\22\1\4\1\24\1\2\1\22\1\4\1\24\1\2\1\22\1\4\1\24\1\2\1\22\1\4\1\16\23\f\1\4\1\16\1\16\1\f\1\4\1\16\1\16\1\f\1\4\1\16\23\f\1\4\1\24\1\2\1\22\1\4\1\22\1\6\1\20\1\4\1\22\1\6\1\20\1\4\1\22\1\6\1\20\1\4\1\22\1\6\1\20\1\4\1"
      b"\22\1\6\1\20\1\4\1\20\1\n\1\16\1\4\1\20\1\n\1\16\1\4\1\20\17\16\t\n"
      ),
      (31,
      b" \1\f\1\24\5\16\3\b\3\22\1\4\1\f\1\0\1\4\1\0\1\22\1\4\1\n\1\2\1\4\1\2\1\20\1\4\1\n\1\2\1\4\1\2\1\16\1\b\1\b\1\2\1\4\1\2\1\16\1\b\1\6\1\4\1\4\1\4\1\f\1\b\1\6\1\6\1\0\1\6\1\f\1\b\1\4\3\b\1\b\3\f\1\4\1\b\1\24\1\16\1\4\1\n\1\20\1\20\1\4\1\f\1\f\1\22"
      b"\1\4\1\16\1\b\1\24\1\4\1\16\1\b\1\24\1\4\1\16\1\b\1\24\1\4\1\16\1\b\1\24\1\4\1\16\1\b\1\24\1\4\1\16\1\b\1\16\25\b\1\b\1\16\1\20\1\b\1\b\1\16\1\20\1\b\1\b\1\16\25\b\1\b\1\24\1\4\1\16\1\b\1\22\1\b\1\f\1\b\1\22\1\b\1\f\1\b\1\22\1\b\1\f\1\b\1\22\1\b"
      b"\1\f\1\b\1\22\1\b\1\f\1\b\1\20\1\f\1\n\1\b\1\20\1\f\1\n\1\b\1\20\21\n\r\n"
      ),),),]
      line.append(mode == MODE_FXCP600 and app_python or app_physium)
      apps.append(line)

      line = []
      if mode == MODE_FXCP600:
        line.append(app_physium)
      line.append(app_algy2)
      apps.append(line)

    for iy in range(len(apps)):
      for ix in range(min(2, len(apps[iy]))):
        x, y = x0 + ix*318, 210 + iy*156
        w, h = len(apps[iy]) == 1 and page == PAGE_MENU_1 and 612 or 294, 114
        canvas.fill_rect_4_circles(x, y, w, h, 10, (156, 153, 156))
        canvas.fill_rect_4_circles(x + 8, y + 10, w - 16, h - 16, 7, (205, 210, 213))
        canvas.fill_rect_4_circles(x + 16, y + 16, w - 32, h - 32, 4, (231, 235, 232))
        canvas.fill_rect_2_circles_left(x, y, h, h, 8, apps[iy][ix][1])
        canvas.draw_image_rotated(apps[iy][ix][2], x, y, (BLACK, WHITE), h, h, 0)
        canvas.draw_string_rotated(x + h, y, apps[iy][ix][0], BLACK, w - 122, h, False)
  return canvas.w, canvas.h

data = (
  (2013, "Classpad II fx-CP400"),
  (2016, "Classpad II fx-CP400+E"),
  (2017, "fx-CG500"),
  (2022, "Classpad III fx-CP600"),
)
w, h = draw_cp(screen_w, 0, screen_w, screen_h, 3, MODE_FXCP400)
fullw = w + sled_img_w
for x in range(screen_w, -len(data)*fullw, -2):
  clear_screen()
  for mode in range(len(data)):
    x0 = x + fullw*mode
    if x0 < screen_w and x0 + w + sled_img_halfw> 0:
      c = ((127,0,0),(127,0,127),(127,127,0),(0,0,127))[mode]
      if mode == MODE_FXCP600:
        draw_image_rotated(((sled_img_w, sled_img),), x0, 0, (BLACK, c), sled_img_w, screen_h, 0, 0)
        draw_string_rotated(x0 + sled_img_halfw, 0, "?", c, 0, w, h)
      else:
        draw_image_rotated(((sled_img_w, sled_img),), x0, 0, (BLACK, c), sled_img_w, screen_h, 0, 0)
        draw_cp(x0 + sled_img_halfw + screen_w, 0, screen_w, screen_h, 1, mode, [PAGE_OFF, PAGE_LOGOBAT_ON, PAGE_MENU_1][mode])
      draw_string_rotated(x0, 0, str(data[mode][0]) + ":", c, 0, sled_img_halfw, screen_h - h)
      draw_string_rotated(x0, h, "Casio", c, 0, sled_img_halfw, screen_h - h)
      draw_string_rotated(x0 + sled_img_halfw, h, data[mode][1], c, 0, screen_w, screen_h - h)
  show_screen()

draw_back()

w0, h0 = draw_cp(0, screen_h, screen_w, 170, 0, MODE_FXCP400, PAGE_OFF)

cp_imgs = [
  [0,               screen_h, w0, h0, 5/6, PAGE_OFF],
  [screen_w - 2*w0, screen_h, w0, h0, 3/4, PAGE_LOGOBAT_ON],
  [screen_w - w0,   screen_h, w0, h0, 4/5, PAGE_MENU_2],
]
for i in range(3):
  cp_imgs[i][0], cp_imgs[i][1] = slide_cp(cp_imgs[i][0], cp_imgs[i][1], 0, -1, int(h0 * cp_imgs[i][4]) - floor_img_h, w0, h0, 0, i, cp_imgs[i][5])
  cp_imgs[i][5] += 1
  draw_cp(cp_imgs[i][0], cp_imgs[i][1], cp_imgs[i][2], cp_imgs[i][3], 0, i, cp_imgs[i][5])

floor_img_y = slide_imgs_forx( screen_h - 1, -1, floor_img_h, floor_img, floor_img_w, floor_img_h, floor_img_pal, 0, -1)

clean_under_l = [draw_back, draw_cps, draw_floor]
tree_img_x, tree_img_y = slide_img((screen_w - tree_img_w) // 2, screen_h - 1 - floor_img_h, 0, -1, tree_img_h - floor_img_h, tree_img, tree_img_w, tree_img_h, tree_img_pal, 0, 0, draw_floor, clean_under_l)

sled_img_x, sled_img_y = screen_w, 0
dx = sled_img_w // 2 + 50

clean_over = None
clean_under_l = clean_under_l[:2] + [draw_tree, draw_floor]

while 1:
  cp6_w, cp6_h = draw_cp(screen_w, screen_h, screen_w, 82, 3, MODE_FXCP600, PAGE_OFF)
  cp6_x, cp6_y = screen_w, 0
  cp6_page = 0
  released = False
  for sled_img_x in range(screen_w - dx + cp6_w//2, -sled_img_w, -1):
    dy = screen_h - cp6_h - 16 - sled_img_h - 1
    sled_img_y = -int((sled_img_x - screen_w // 2 + dx)**2 / 1000)
    if not released:
      cp6_x, cp6_y = sled_img_x + dx - cp6_w//2, sled_img_y + sled_img_h + cp6_h + dy
    draw_back()
    draw_cps(released)
    draw_tree(released and tree_img_pal2 or tree_img_pal)
    draw_floor()
    draw_cp(cp6_x, cp6_y, cp6_w, cp6_h, 3, MODE_FXCP600, cp6_page)
    draw_image_rotated(((sled_img_w, sled_img),), sled_img_x, sled_img_y, sled_img_pal, sled_img_w, sled_img_h, 0, 0)
    if not released:
      fill_rect(sled_img_x + sled_img_w - 2*(sled_img_w - 100)//3, sled_img_y + sled_img_h - 2, 1, dy + 3, BLACK)
      fill_rect(sled_img_x + sled_img_w - (sled_img_w - 100)//3, sled_img_y + sled_img_h - 2, 1, dy + 3, BLACK)
    if clean_over:
      clean_over()
    if not released:
      released = sled_img_x == screen_w // 2 - dx
      if released:
        draw_tree(released and tree_img_pal2)
        draw_floor()
        for k in range(2):
          cp6_page += 1
          draw_cp(cp6_x, cp6_y, cp6_w, cp6_h, 3, MODE_FXCP600, cp6_page)
          show_screen()
        if not clean_over:
          curtain_img_y = slide_imgs_forx(-curtain_img_h, 1, curtain_img_h, curtain_img, curtain_img_w, curtain_img_h, curtain_img_pal, 0, 4, True, None, [draw_sled])
          clean_over = draw_curtain
    show_screen()

  clean_under_l.append(draw_curtain)

  cp6_page += 1
  draw_cp(cp6_x, cp6_y, cp6_w, cp6_h, 3, MODE_FXCP600, cp6_page)
  show_screen()

  for dh in range(screen_h - cp6_h + 1):
    cp6_h += 1
    cp6_w, cp6_h = draw_cp(screen_w, screen_h, 2 * screen_w, cp6_h, 3, MODE_FXCP600, PAGE_OFF)
    cp6_x = (screen_w - cp6_w) // 2
    cp6_y = max(cp6_y, cp6_h - 1)
    draw_cp(cp6_x, cp6_y, cp6_w, cp6_h, 3, MODE_FXCP600, cp6_page)
    show_screen()

  slide_cp(cp6_x, screen_h - 1, -2, 0, cp6_w + cp6_x, cp6_w, cp6_h, 3, MODE_FXCP600, PAGE_MENU_1, None, clean_under_l)
  slide_cp(0, 0, 2, 0, cp6_w + screen_w, cp6_w, cp6_h, 1, MODE_FXCP600, PAGE_MENU_2, None, clean_under_l)

  w, h = draw_cp(screen_w, 0, screen_w, 5*screen_h, 0, MODE_FXCP400)
  slide_cp(0, screen_h - 1, 0, -3, h + screen_h, w, h, 0, MODE_FXCP600, PAGE_MENU_2, None, clean_under_l)
  clean_under_l = clean_under_l[:-1]
  show_screen()

# credits :
# 5 pixels character font : based on the Casio Graph 35+E II / fx-9750/9850GIII Python application tiny/medium font
# 7 pixels character font : based on the Casio Graph 35+E II  / fx-9750/9850GIII Python application large font
# 10 pixels character font : based on the Casio Graph 90+E / fx-CG50 Python application tiny font
# fx-CP400 skin : based on the one used in the Casio Classpad II Manager software
# fx-CG500 skin : based on the one used in the Casio fx-CG500 Manager software
# Classpad screens : based on Casio fx-CP400 screen captures or pictures
# back + floor sprites : Toad house sprites from the "Super Mario All-Stars: Super Mario Bros 3" Nintendo SNES game
# curtain + floor : based on the Toad house sprite from the "Super Mario All-Stars: Super Mario Bros 3" Nintendo SNES game
# Christmas sled image : http://clipart-library.com/clipart/1133395.htm (personal use license)
# Christmas tree image : http://clipart-library.com/clip-art/christmas-tree-silhouette-vector-13.htm (personal use license)
Télécharger




Hors concours Graph 90+E - Graph 90+E 3D - Lephe

Go to top

15178Lephe a également envoyé quelque chose pour représenter Planète Casio. Participation hors concours puisque n'étant plus lycéen, et pas (encore ?...) enseignant. ;)

Afficher ses cadeaux sur une Graph 90+E, Lephe semble avoir pensé comme moi : c'est trop simple, trop concret, pas suffisamment 'meta' à son goût, il faut trouver un moyen de tordre la consigne, de se distinguer... Voici donc sur l'écran Graph 90+E le dessin d'une Graph 90+E, dont l'écran dessiné affiche à son tour les cadeaux ! :P

Ici encore une animation mais quelle animation, la Graph 90+E étant en effet affichée en 3D. Il s'agit d'un moteur semi-complet avec rastérization de triangles (par Ninestars), textures, z-buffer, et effet d'assombrissement avec la profondeur.

L'affichage est certes petit mais c'est fait exprès ; cela permet à l'animation de se jouer sur calculatrice en un temps raisonnable, contrairement à la participation précédente qui cible le simulateur beaucoup plus rapide sur clé USB.

Les données brutes (RGB-888) d'une image 43×90 pixels fournie par le script img.py sont plaquées sur un pavé droit qui se met ensuite à tourner sous nos yeux émervéillés :

Code: Tout sélectionner
from casioplot import *
from img import *
import math

WIDTH = 100
HEIGHT = 100

TEX_WIDTH = TEXTURE_GRAPH90_WIDTH
TEX_HEIGHT = TEXTURE_GRAPH90_HEIGHT

zbuf = [32768 for i in range(WIDTH*HEIGHT)]

def edge(p1, p2, p3):
    return (p3[0] - p1[0]) * (p2[1] - p1[1]) - (p3[1] - p1[1]) * (p2[0] - p1[0])

def edge_start(x1, y1, x2, y2, px, py):
    return (y2 - y1) * (px - x1) - (x2 - x1) * (py - y1)

def triangle(p1, p2, p3, zbuf, color):
    x1, y1, z1, zn1, w1, h1 = p1
    x2, y2, z2, zn2, w2, h2 = p2
    x3, y3, z3, zn3, w3, h3 = p3

    if zn1 < 0 or zn2 < 0 or zn3 < 0:
        return

    min_x = max(0, min(x1, min(x2, x3)))
    max_x = min(WIDTH-1, max(x1, max(x2, x3)))
    min_y = max(0, min(y1, min(y2, y3)))
    max_y = min(HEIGHT-1, max(y1, max(y2, y3)))

    area = edge(p1, p2, p3)
    if area < 1:
        return

    w0 = w1 * z1
    h0 = h1 * z1
    w1 = w2 * z2
    h1 = h2 * z2
    w2 = w3 * z3
    h2 = h3 * z3

    u0_start = edge_start(x2, y2, x3, y3, min_x, min_y)
    u0_step_x = y3 - y2
    u0_step_y = x2 - x3
    u1_start = edge_start(x3, y3, x1, y1, min_x, min_y)
    u1_step_x = y1 - y3
    u1_step_y = x3 - x1
    u2_start = edge_start(x1, y1, x2, y2, min_x, min_y)
    u2_step_x = y2 - y1
    u2_step_y = x1 - x2

    z_num_start = int((u0_start * zn1 + u1_start * zn2 + u2_start * zn3) / area)
    z_num_step_x = int((u0_step_x * zn1 + u1_step_x * zn2 + u2_step_x * zn3) / area)
    z_num_step_y = int((u0_step_y * zn1 + u1_step_y * zn2 + u2_step_y * zn3) / area)

    z_div_start = u0_start * z1 + u1_start * z2 + u2_start * z3
    z_div_step_x = u0_step_x * z1 + u1_step_x * z2 + u2_step_x * z3
    z_div_step_y = u0_step_y * z1 + u1_step_y * z2 + u2_step_y * z3

    for x in range(min_x, max_x+1):
        u0 = u0_start
        u1 = u1_start
        u2 = u2_start
        z_num = z_num_start
        z_div = z_div_start

        for y in range(min_y, max_y+1):
            if (u0 | u1 | u2) > 0 and zbuf[y*WIDTH+x] > z_num:
                if color is None:
                    w = int(((u0 * w0 + u1 * w1 + u2 * w2) // z_div) % TEX_WIDTH)
                    h = int(((u0 * h0 + u1 * h1 + u2 * h2) // z_div) % TEX_HEIGHT)
                    row = TEXTURE_GRAPH90[h]
                    c = (row[3*w], row[3*w+1], row[3*w+2])
                else:
                    c = color

                # Put pixel
                r = c[0] * (32768-z_num) >> 15
                g = c[1] * (32768-z_num) >> 15
                b = c[2] * (32768-z_num) >> 15
                set_pixel(x, y, (r, g, b))
                zbuf[y*WIDTH+x] = z_num

            u0 += u0_step_y
            u1 += u1_step_y
            u2 += u2_step_y
            z_num += z_num_step_y
            z_div += z_div_step_y

        u0_start += u0_step_x
        u1_start += u1_step_x
        u2_start += u2_step_x
        z_num_start += z_num_step_x
        z_div_start += z_div_step_x

CAMERA_NEAR = 10
CAMERA_FAR = 60
SCREEN_CENTER_X = WIDTH // 2
SCREEN_CENTER_Y = HEIGHT // 2
SCREEN_SCALE = 15

def world2camera(vertices, camera):
    camera_vertices = []
    cx, cy, cz, ca1, ca2 = camera

    for x, y, z, w, h in vertices:
        x -= cx
        y -= cy
        z -= cz

        sin1 = math.sin(-ca1)
        cos1 = math.cos(-ca1)
        x, z = cos1*x - sin1*z, sin1*x + cos1*z

        sin2 = math.sin(-ca2)
        cos2 = math.cos(-ca2)
        y, z = cos2*y + sin2*z, -sin2*y + cos2*z

        camera_vertices.append((x, y, z, w, h))
    return camera_vertices

def camera2screen(vertices):
    screen = []
    for x, y, z, w, h in vertices:
        screen.append((
            int(+x * CAMERA_NEAR * SCREEN_SCALE / z + SCREEN_CENTER_X),
            int(-y * CAMERA_NEAR * SCREEN_SCALE / z + SCREEN_CENTER_Y),
            (1 << 15) / z,
            int((1 << 15) * (z - CAMERA_NEAR) / CAMERA_FAR),
            w*TEX_WIDTH,
            h*TEX_HEIGHT))
    return screen

vertices = [
    (-5,-9, 5, 0, 1), (-5,-9, 7, 0, 0), (-5,+9, 5, 0, 0), (-5,+9, 7, 0, 0),
    (+5,-9, 5, 1, 1), (+5,-9, 7, 0, 0), (+5,+9, 5, 1, 0), (+5,+9, 7, 0, 0),
]
faces = [
    # Bottom square
    (0, 1, 4),
    (4, 1, 5),
    # Top square
    (2, 6, 3),
    (3, 6, 7),
    # Front square
    (0, 4, 2),
    (2, 4, 6),
    # Left square
    (0, 2, 1),
    (1, 2, 3),
    # Right square
    (4, 5, 6),
    (6, 5, 7),
    # Back square
    (1, 3, 5),
    (5, 3, 7),
]
camera = [0, 17, -20, 0, -0.5] # x, y, z, ha, va

BLACK = (0x00, 0x00, 0x00)
GRAY1 = (0x40, 0x40, 0x40)
GRAY2 = (0x80, 0x80, 0x80)
GRAY3 = (0xc0, 0xc0, 0xc0)
GRAY4 = (0xe0, 0xe0, 0xe0)
colors = [GRAY4, GRAY4, GRAY3, GRAY3, None, None,
          GRAY2, GRAY2, GRAY2, GRAY2, GRAY1, GRAY1]

for i in range(33):
    angle = math.pi / 16 * i
    camera[0] = 30 * math.sin(angle)
    camera[2] = -30 * math.cos(angle) + 6
    camera[3] = angle

    for y in range(HEIGHT):
        for x in range(WIDTH):
            set_pixel(x, y, BLACK)

    for i in range(WIDTH*HEIGHT):
        zbuf[i] = 32768

    v_camera = world2camera(vertices, camera)
    v_screen = camera2screen(v_camera)

    for i in range(len(faces)):
        p1, p2, p3 = faces[i]
        triangle(v_screen[p1], v_screen[p2], v_screen[p3], zbuf, colors[i])

    show_screen()
Code: Tout sélectionner
TEXTURE_GRAPH90_WIDTH=43
TEXTURE_GRAPH90_HEIGHT=90
TEXTURE_GRAPH90=[
b'\xfc\xfb\xfb\xe0\xe9\xe6\xb4\xb3\xb7\x98\x90\x9a\x89\x8a\x94\x85\x85\x8f\x8c\x89\x93\x8c\x88\x93\x86\x83\x8f\x85\x87\x92\x86\x87\x92\x87\x88\x94\x87\x88\x93\x85\x87\x92\x81\x88\x92\x82\x89\x93\x82\x8a\x93\x82\x89\x93\x81\x89\x93\x82\x89\x96\x82\x88\x95\x81\x88\x95\x81\x87\x94\x82\x88\x94\x82\x89\x93\x82\x89\x92\x82\x8a\x93\x83\x8a\x94\x83\x8a\x93\x83\x89\x91\x83\x8a\x91\x83\x89\x91\x83\x89\x91\x84\x89\x91\x86\x84\x8f\x8c\x8a\x94\x88\x87\x91\x87\x87\x91\x8f\x8e\x97\xa4\xa0\xa5\xd3\xd4\xd6\xf4\xf7\xf5\xfe\xfb\xfd',
b'\xd6\xd4\xd6\x8e\x8a\x94\x7f\x8a\x97\x71\x94\xa1\x7b\xa0\xb3\x8a\xae\xbf\x90\xb0\xc3\x93\xb0\xc4\x97\xb3\xc7\x9b\xb5\xc6\x9e\xb8\xc9\x9f\xb9\xca\xa3\xbd\xce\xa9\xc1\xd1\xb4\xc2\xcc\xb7\xc5\xcf\xb9\xc7\xd1\xba\xc8\xd2\xb9\xc8\xd1\xb8\xc7\xcd\xb7\xc6\xcc\xb6\xc5\xcc\xb6\xc5\xcc\xb6\xc5\xcc\xb5\xc3\xcd\xb4\xc2\xcc\xb3\xc2\xcc\xb3\xc2\xcc\xb2\xc1\xcd\xac\xbf\xd1\xaa\xbe\xd0\xa8\xbc\xcd\xa3\xb6\xc8\x9e\xb5\xc7\x91\xb1\xc4\x8f\xb1\xc3\x88\xaa\xbd\x84\xa5\xb7\x76\x95\xa7\x71\x87\x94\x8a\x91\x98\x9f\x9c\xa4\xf4\xf3\xf5',
b'\xa4\x9f\xa7\x7c\x84\x90\xaa\xc4\xca\xe2\xd7\xe7\xe5\xe2\xe2\xe7\xe3\xe2\xe8\xe4\xe3\xe8\xe4\xe3\xe5\xe2\xdf\xe6\xe2\xdf\xe7\xe3\xe0\xe5\xe2\xdf\xe5\xe2\xdf\xe6\xe3\xe0\xe4\xe2\xe0\xe5\xe3\xe1\xe5\xe3\xe1\xe4\xe2\xe0\xe3\xe1\xe0\xe3\xe1\xe3\xe3\xe1\xe3\xe3\xe1\xe3\xe3\xe2\xe3\xe4\xe2\xe3\xe4\xe2\xe0\xe4\xe2\xe0\xe3\xe1\xdf\xe3\xe1\xdf\xe4\xe2\xdf\xe4\xe2\xde\xe5\xe2\xdf\xe7\xe4\xe1\xe5\xe3\xdf\xe7\xe4\xe1\xe8\xe3\xe3\xe7\xe3\xe2\xe7\xe3\xe3\xe8\xe4\xe3\xe5\xdf\xe2\xca\xd3\xe0\x82\x9a\xa7\x86\x88\x8f\xe6\xe6\xe5',
b'\x88\x8e\x95\x9c\xaa\xae\xe7\xe2\xe7\xdb\xde\xd9\xe3\xdf\xe1\xe5\xe2\xe3\xe4\xe0\xe1\xe2\xdf\xde\xe2\xdf\xdf\xe3\xdf\xe3\xe4\xe0\xe3\xe1\xdd\xe0\xe4\xe0\xe3\xe1\xdd\xe0\xe0\xde\xe0\xe0\xde\xe1\xe1\xdf\xe2\xe1\xdf\xe2\xe2\xe0\xe2\xe1\xe0\xdf\xe0\xdf\xde\xe0\xde\xdd\xdf\xde\xdc\xdf\xde\xdd\xdf\xdd\xdf\xdf\xdd\xe0\xdf\xdd\xe0\xdf\xdd\xdf\xe0\xdd\xe0\xd8\xd2\xd8\xd1\xcb\xd1\xd4\xcf\xd5\xd3\xce\xd4\xd9\xd3\xd8\xd5\xd1\xd2\xd4\xd0\xd1\xde\xdb\xdc\xd4\xd3\xd4\xdf\xdf\xdf\xd9\xd9\xd9\xd0\xd7\xd9\x70\x78\x84\xe2\xdf\xe5',
b'\x77\x82\x8e\xca\xc7\xc6\xdf\xe0\xe3\xe0\xdf\xe0\xa7\xa7\xa9\xb0\xb0\xb2\xac\xad\xaf\xae\xae\xb0\x8f\x8f\x91\x9f\x9f\xa1\x9b\x9c\x9d\xab\xab\xad\xba\xba\xbc\xe3\xe2\xe4\xde\xdc\xdd\xdf\xdd\xde\xe0\xde\xdf\xe0\xde\xdf\xdf\xdd\xde\xde\xdc\xdd\xde\xdc\xdd\xdd\xdb\xdc\xde\xdc\xdd\xde\xdc\xdd\xde\xdc\xdd\xdf\xdd\xde\xdf\xdd\xde\xde\xdc\xdd\xdf\xdd\xde\xb9\xb9\xbb\x9a\x9a\x9c\xa8\xa8\xaa\xb0\xb0\xb2\xaf\xaf\xb1\xab\xab\xad\xa2\xa2\xa4\xc4\xc4\xc6\xb0\xb0\xb3\xe1\xe0\xe1\xdc\xdc\xdf\xe0\xdd\xde\x81\x8e\x9a\xcc\xce\xd0',
b'\x75\x81\x8d\xd4\xd2\xd1\xdf\xdf\xe3\xe1\xe0\xe1\xad\xad\xaf\xad\xad\xae\xa5\xa5\xa6\xa9\xa9\xaa\xa6\xa6\xa7\xa5\xa5\xa6\xab\xab\xac\xa8\xa8\xa9\xc4\xc4\xc5\xe1\xe1\xe2\xde\xdc\xdd\xdf\xdd\xde\xe0\xde\xdf\xe0\xde\xdf\xdf\xdd\xde\xdf\xdd\xde\xdf\xdd\xde\xdf\xdd\xde\xdf\xdd\xde\xdf\xdd\xde\xdf\xdd\xde\xdf\xdd\xde\xdf\xdd\xde\xdf\xdd\xde\xde\xdd\xde\xdf\xde\xe0\xc7\xc6\xc8\xb0\xaf\xb1\xad\xad\xaf\xc5\xc5\xc6\xb6\xb6\xb8\xb3\xb3\xb4\xab\xab\xad\xb4\xb4\xb6\xe2\xe1\xe2\xd8\xd8\xdb\xe2\xe0\xe0\x91\x9e\xaa\xbb\xbc\xbe',
b'\x77\x83\x8f\xd5\xd2\xd2\xde\xdf\xe2\xdc\xda\xdb\xde\xde\xde\xe3\xe2\xe2\xde\xde\xde\xe0\xe0\xe0\xe1\xe1\xe1\xe2\xe2\xe2\xe2\xe2\xe2\xe3\xe2\xe2\xdf\xdf\xdf\xdc\xdc\xdc\xe0\xde\xdf\xe0\xde\xdf\xe0\xde\xdf\xe0\xde\xdf\xe0\xde\xdf\xdf\xdd\xde\xdf\xdd\xde\xdf\xdd\xde\xdf\xdd\xde\xdf\xdd\xde\xe0\xde\xdf\xdf\xdd\xde\xdf\xdd\xde\xdf\xdd\xde\xe0\xde\xdf\xe1\xdf\xe0\xd9\xd7\xd8\xd7\xd5\xd6\xd7\xd5\xd6\xd9\xd8\xd8\xd5\xd5\xd5\xda\xda\xda\xd7\xd7\xd7\xda\xd9\xda\xda\xd8\xd8\xdb\xdb\xde\xe3\xe0\xe1\x98\xa5\xb1\xae\xb0\xb2',
b'\x79\x85\x91\xd8\xd6\xd6\xde\xde\xe2\xdf\xdd\xde\xdf\xdd\xde\xdd\xdb\xdc\xe0\xde\xdf\xdf\xdd\xde\xe0\xde\xdf\xe2\xdf\xe1\xe4\xe2\xe3\xe1\xdf\xe0\xe2\xe0\xe1\xe4\xe2\xe3\xe2\xe0\xe1\xe2\xe0\xe1\xe2\xe0\xe1\xe2\xe0\xe1\xe2\xe0\xe1\xe1\xdf\xe0\xe2\xe0\xe1\xe1\xdf\xe0\xe1\xdf\xe0\xe1\xdf\xe0\xe2\xe0\xe1\xe1\xdf\xe0\xe1\xdf\xe0\xe2\xe0\xe1\xe2\xe0\xe1\xe1\xdf\xe0\xe1\xdf\xe0\xdf\xdd\xde\xe4\xe2\xe3\xdf\xdd\xde\xdf\xdd\xde\xe0\xde\xdf\xde\xdc\xdd\xe0\xdd\xde\xdf\xdd\xdd\xdb\xdb\xde\xe2\xe0\xe0\x9a\xa7\xb3\xa6\xa8\xaa',
b'\x7b\x88\x94\xd8\xd5\xd5\xdf\xe0\xe2\xd7\xd5\xd6\xc6\xc4\xc6\xcc\xc9\xca\xc5\xc3\xc1\xca\xc8\xc9\xc9\xc7\xc8\xc8\xc6\xc7\xca\xc8\xc8\xcb\xca\xca\xca\xc9\xc9\xc9\xc7\xc7\xc9\xc7\xc8\xc9\xc7\xc8\xc8\xc6\xc7\xc9\xc7\xc8\xc8\xc6\xc7\xc8\xc6\xc6\xc8\xc6\xc7\xc8\xc6\xc6\xc7\xc5\xc5\xc8\xc6\xc6\xc8\xc6\xc7\xc9\xc7\xc8\xc8\xc6\xc7\xc9\xc7\xc7\xc9\xc7\xc8\xc9\xc7\xc7\xcb\xc9\xc9\xcb\xc9\xc9\xc7\xc5\xc5\xcb\xc9\xc9\xca\xc8\xc8\xc9\xc7\xc7\xc8\xc6\xc6\xce\xcd\xcd\xd0\xce\xcd\xda\xda\xdc\xe6\xe3\xe3\x9e\xab\xb7\xa4\xa6\xa7',
b'\x78\x86\x94\xd9\xd7\xd7\xe2\xe1\xe1\xde\xdc\xda\xc5\xc5\xb7\xc7\xc5\xc6\xc4\xc4\xbb\xc6\xc5\xc2\xc2\xc0\xc1\xc7\xc6\xc4\xc4\xc3\xc1\xc2\xc1\xbf\xc2\xc1\xbf\xc4\xc3\xc1\xc1\xc0\xbf\xc6\xc5\xc1\xc5\xc4\xc0\xc2\xc3\xbe\xc4\xc4\xc0\xc6\xc2\xc1\xbf\xbf\xbd\xc2\xc2\xc0\xc6\xc6\xc4\xc3\xc2\xc0\xc3\xc2\xc0\xc2\xc1\xbf\xc5\xc4\xc2\xc6\xc5\xc3\xc2\xc1\xbf\xc0\xbf\xbd\xc6\xc5\xc3\xc3\xc2\xbf\xc5\xc4\xc2\xc2\xc1\xbf\xc4\xc3\xbf\xc4\xc3\xbf\xc4\xc3\xbf\xc0\xbf\xbb\xca\xca\xc6\xe5\xe2\xe1\xe6\xe1\xe3\xa3\xb0\xbb\x9c\x9c\x9d',
b'\x79\x87\x95\xd8\xd5\xd6\xd8\xd7\xd7\xbc\xbb\xb8\x93\x92\x9b\x87\x86\x8e\x89\x87\x95\x86\x86\x81\x8f\x90\x89\x88\x87\x86\x8d\x8c\x8a\x8c\x8b\x89\x90\x8f\x8d\x8c\x8c\x8a\x8d\x8c\x88\x8d\x8c\x89\x8c\x8b\x88\x8e\x8d\x89\x8b\x89\x87\x8d\x8b\x8c\x91\x91\x8f\x8c\x8c\x8a\x8a\x89\x86\x8e\x8d\x8a\x8f\x8e\x8c\x8f\x8e\x8c\x8d\x8c\x8a\x8c\x8b\x89\x90\x8f\x8e\x8f\x8e\x8d\x8d\x8c\x8a\x90\x8f\x8e\x8e\x8d\x8b\x90\x8f\x8e\x90\x8f\x8d\x91\x90\x8e\x8d\x8c\x8a\x94\x93\x92\xa1\xa1\x9f\xd3\xcf\xce\xe2\xde\xdf\xa1\xae\xb9\x9b\x9b\x9c',
b'\x77\x86\x93\xdb\xd8\xd9\xd7\xd5\xd6\x4e\x4e\x4f\x61\x49\x27\x92\x49\x2a\xc1\x86\x5b\xd8\x9b\x71\xe7\x39\x1f\xe4\xa4\x7d\xe9\xcd\xa1\xdf\xbe\x8b\x7f\x6c\x49\x05\x05\x04\x93\x62\x52\xaa\x74\x63\x80\x4a\x3a\x89\x30\x25\x96\x4a\x3e\x98\x74\x52\xd4\xa7\x7b\x8f\x70\x4b\x98\x72\x47\x92\x67\x3b\x92\x72\x4a\xa1\x86\x67\x65\x76\x6b\x40\x53\x4c\x83\x67\x40\xd7\xa9\x70\x87\x84\x6d\x62\x61\x53\xb8\x82\x74\xd1\x4e\x40\xdc\x4c\x3e\xf6\x5d\x50\xf8\x76\x66\xf8\xb9\xae\xa3\xa3\xa1\xba\xb6\xb5\xdd\xd9\xda\xa1\xae\xb9\x9b\x9b\x9c',
b'\x78\x86\x94\xdd\xda\xdb\xd7\xd6\xd6\x4d\x4d\x4d\x6d\x5d\x31\x8f\x78\x48\xb4\x94\x61\xd7\xb9\x87\xda\xa0\x74\xeb\x96\x71\xe8\xca\x99\xdf\xc1\x8d\x67\x5b\x3f\x10\x22\x12\x17\x30\x1b\x3e\x40\x32\x37\x4b\x38\x23\x3f\x2f\x52\x47\x35\xcf\x9f\x68\xc5\x95\x63\x97\x86\x6b\x75\x5f\x41\x94\x7f\x63\x3a\x4b\x45\x5b\x5f\x57\x84\x76\x6c\x6b\x79\x6d\x5c\x4d\x38\xce\xa1\x65\x59\x54\x40\xea\xe2\xd0\xfa\xf0\xe0\xdf\x73\x66\xe0\x55\x49\xec\x56\x49\xec\x59\x4b\xf4\x95\x89\xa8\xa8\xa8\xb3\xaf\xaf\xe3\xdf\xe0\xa4\xb1\xbb\x97\x98\x99',
b'\x7a\x88\x96\xd9\xd7\xd8\xd8\xd7\xd7\x58\x59\x55\x8d\x77\x50\x40\x39\x1e\x7e\x6b\x45\xb7\x9b\x6a\xb8\x9d\x70\xcd\xae\x80\xf1\xd9\xb2\xb6\xa1\x77\x1c\x32\x1d\x23\x36\x23\x3f\x48\x34\x36\x48\x36\x31\x4b\x3d\x25\x41\x3e\x1d\x2c\x28\x90\x70\x4e\x9c\x79\x51\x6e\x69\x55\x46\x5e\x59\x2f\x44\x41\x51\x29\x27\xd5\x49\x43\xde\x52\x49\x7c\x70\x64\x49\x5c\x54\x49\x41\x2e\xdd\xd5\xc4\xfe\xf7\xe9\xf3\x95\x88\xf4\x28\x25\xde\x4e\x41\xf3\x5c\x50\xf9\x75\x6a\xef\xd5\xc4\x9e\x9e\x9e\xb2\xaf\xae\xe4\xdf\xe1\xa5\xb1\xbc\x97\x97\x98',
b'\x79\x88\x95\xdb\xdb\xdb\xd7\xd7\xd7\x5b\x5b\x5a\xbd\xa1\x6f\x43\x3b\x29\x0a\x0f\x0d\x49\x41\x2d\x4f\x45\x2c\x77\x65\x41\xcb\xb1\x83\xb2\x9f\x76\x2d\x42\x2b\x1f\x32\x1e\x2b\x3d\x2e\x1c\x31\x21\x54\x5a\x49\x90\x87\x6e\x31\x46\x40\x35\x4d\x48\x3a\x51\x4d\x2f\x46\x42\x24\x35\x31\x70\x37\x2b\xde\x49\x42\xea\x50\x48\xef\x57\x4e\xde\x5c\x52\x59\x43\x3e\xac\x9e\x8a\xfd\xf5\xe7\xfc\xf1\xe5\xf2\x81\x76\xe3\x4b\x40\xed\x53\x46\xea\x8a\x7d\xec\x6a\x5a\xb3\x95\x7d\xac\xac\xac\xb1\xb0\xaf\xe2\xde\xdf\xa8\xb3\xbf\x98\x97\x98',
b'\x7a\x88\x96\xdc\xdc\xdc\xd7\xd7\xd7\x5a\x5a\x59\xcf\xb7\x8a\xb2\x98\x6a\x7a\x6e\x51\x0a\x11\x0e\x07\x0b\x0a\x07\x08\x07\x46\x41\x2a\x51\x4c\x34\x7e\x6d\x4e\xa5\x7f\x60\xc5\x3b\x30\xe3\xbb\x90\xf3\xd4\xa6\xf3\xd4\xa7\x8d\x8d\x7b\x3b\x54\x4f\x2f\x44\x40\x15\x24\x20\x80\x2a\x26\xd9\x85\x6f\xea\x63\x56\xec\x56\x4c\xeb\x56\x4c\xee\x5c\x50\xda\x8b\x79\x69\x4a\x3c\xb4\xa0\x8e\xf1\x8b\x86\xfa\x5f\x54\xfa\xd7\xcb\xf4\xdd\xd0\xf0\xed\xe1\x73\x79\x6e\x9f\x86\x64\xab\xab\xab\xb2\xb1\xaf\xe3\xdf\xe0\xa9\xb4\xbf\x99\x98\x99',
b'\x7b\x89\x96\xdc\xdc\xdc\xd6\xd7\xd7\x5b\x5a\x59\xc3\xab\x7f\xc1\xa5\x73\xca\xad\x7b\x89\x71\x4f\x07\x0c\x0b\x06\x07\x06\x0a\x07\x05\xd3\xaf\x7a\xe9\xc2\x90\xeb\xc7\x99\xf7\x83\x6c\xf4\xbd\x96\xf1\xcc\x9f\xf2\xcc\xa0\xb0\xa2\x85\x2b\x40\x3c\x13\x21\x1e\x98\x2f\x2c\xe6\x4d\x45\xed\x54\x4c\xe6\x93\x7c\xea\x54\x49\xe2\x52\x47\xe4\x9d\x85\xf3\x8d\x77\xd8\x60\x55\x47\x39\x36\x66\x14\x0e\xea\xb8\xab\xfd\xf8\xed\xf2\xef\xe3\x6e\x73\x69\xb4\x95\x6a\xf8\xe7\xc4\xac\xac\xac\xb2\xb1\xb0\xe4\xdf\xe1\xa9\xb4\xc0\x99\x98\x99',
b'\x7b\x89\x97\xdd\xdd\xdd\xd6\xd6\xd6\x5a\x59\x59\xbd\xa0\x6c\xb8\x99\x67\xab\x8e\x62\x77\x62\x44\x05\x08\x07\x0b\x05\x04\x05\x04\x04\xa5\x85\x55\xb3\x47\x30\xf6\x98\x79\xf2\x8e\x71\xed\x8e\x71\xb0\x42\x21\xd7\x6b\x4f\xd1\x87\x6e\x1b\x2a\x24\xad\x34\x2f\xeb\x4d\x46\xe6\x5d\x51\xf0\x83\x6f\xed\x7f\x6a\xe1\x9e\x80\xda\xa9\x8d\xd6\x8b\x74\xe8\xa8\x8c\xee\x97\x82\xd5\x60\x55\x43\x3c\x36\x63\x59\x49\xdd\xd6\xc6\x86\x88\x7f\xb7\x98\x6a\xf8\xe6\xc4\xf9\xea\xc9\xab\xab\xab\xb2\xb1\xaf\xe4\xdf\xe1\xa9\xb4\xc0\x99\x98\x99',
b'\x7c\x8a\x97\xdd\xdd\xde\xd6\xd6\xd6\x5a\x59\x58\x0e\x13\x10\x6a\x34\x2f\x9e\x77\x69\x9b\x82\x6d\x33\x2c\x23\x05\x04\x05\x04\x04\x04\x8d\x6f\x4c\xc8\x71\x4c\xce\x4a\x38\xd4\x45\x37\xd4\x42\x2e\xde\x28\x04\xe4\x6b\x50\xe9\x98\x79\x0f\x19\x13\x8b\x2a\x24\xec\x51\x49\xe9\x62\x53\xd2\x6a\x58\xd8\xaa\x8f\xd4\xb2\x92\xe9\xb0\x95\xea\x89\x72\xef\x6d\x5e\xef\x64\x57\xeb\x63\x57\xab\x75\x69\x3e\x51\x49\x2c\x3c\x35\xac\x90\x66\xf5\xe4\xc0\xf3\xde\xb8\xf4\xe3\xc1\xab\xab\xab\xb2\xb1\xae\xe4\xdf\xe2\xaa\xb6\xbf\x98\x98\x9a',
b'\x7a\x89\x96\xdd\xdd\xdf\xd5\xd6\xd5\x59\x59\x57\x7f\x65\x59\x9e\x5e\x54\x32\x26\x22\x3b\x29\x23\x79\x5d\x50\x05\x06\x06\x04\x04\x04\x3e\x0b\x06\xbf\x46\x2e\xca\x47\x2e\xee\x6b\x58\xd8\x51\x40\xde\x27\x18\xf8\x7b\x63\xf3\xbb\x93\x61\x5c\x4c\x0c\x13\x0f\x93\x31\x2b\xed\x55\x4c\xcf\x6d\x5a\xe1\x95\x7b\xed\x7e\x6d\xe7\x67\x59\xe4\x8a\x77\xed\x61\x54\xe8\x60\x53\xbd\x88\x77\x64\x72\x66\x31\x42\x3b\x97\x82\x60\xf7\xe5\xc2\xf8\xe8\xc7\xfb\xec\xcc\xe6\xce\xa4\xab\xab\xab\xb3\xb1\xab\xe4\xdf\xe4\xab\xb9\xbe\x9a\x9a\x9e',
b'\x7a\x88\x96\xdd\xdd\xdf\xd5\xd5\xd4\x59\x58\x57\x2e\x1a\x17\x13\x1b\x19\x6b\x5b\x4f\xa2\x74\x65\x49\x2e\x2a\x05\x07\x07\x05\x05\x05\x07\x06\x04\xdc\xba\x87\xae\x40\x26\xef\x9a\x75\xf5\x83\x6d\xeb\xa0\x7b\xe5\x9c\x78\xf3\xa2\x85\x9e\x90\x76\x1e\x2e\x2a\x0a\x0e\x0c\xa4\x64\x4d\xee\x73\x64\xed\x56\x4d\xf0\x60\x55\xeb\x5c\x50\xe4\x73\x62\xe8\x9a\x84\x9e\x75\x6a\x61\x6f\x65\x2d\x40\x3b\x7e\x69\x48\xf5\xdf\xb7\xf8\xe6\xc1\xf9\xe8\xc6\xf8\xe7\xc4\xf6\xe2\xbe\xab\xab\xab\xb3\xb0\xab\xe4\xdf\xe4\xab\xb9\xbf\x9a\x9a\x9e',
b'\x79\x88\x95\xde\xdd\xdf\xd5\xd5\xd4\x58\x58\x56\xa1\x5d\x52\xa6\x71\x66\xa6\x8e\x7b\x5d\x4f\x45\x09\x0f\x0d\x06\x0a\x09\x06\x06\x06\x05\x05\x04\xa7\x6d\x48\xbd\x4b\x32\xee\xc8\x9a\xee\x87\x6a\xea\x93\x75\xcf\xb2\x89\xb2\x8e\x6e\x78\x70\x5c\x23\x38\x36\x16\x27\x24\x0e\x12\x10\xa7\x38\x34\xec\x56\x4d\xeb\x5a\x50\xed\x5e\x53\xdb\x5f\x53\x9b\x85\x75\x74\x80\x73\x4e\x61\x58\x22\x34\x2e\x24\x20\x13\xc6\xac\x82\xf9\xe4\xbd\xf1\xdc\xb5\xf4\xe2\xbe\xf8\xe8\xc8\xab\xab\xab\xb4\xb1\xab\xe4\xe0\xe4\xac\xba\xbf\x9a\x9a\x9e',
b'\x79\x88\x95\xde\xde\xe0\xd5\xd5\xd4\x58\x58\x56\x6b\x36\x1b\x46\x3e\x23\x2e\x1c\x1b\x33\x28\x23\x0b\x13\x12\x09\x10\x0f\x08\x0e\x0c\x09\x0d\x0c\x68\x29\x14\x9a\x61\x49\x82\x6c\x4e\x67\x50\x42\xc1\xb8\xa5\xc7\xbf\xb0\xc5\x8b\x80\xdc\xd5\xc4\xe2\xdc\xca\x90\x91\x88\x1d\x2f\x2c\x0e\x11\x0f\xab\x43\x3d\xec\x5b\x51\xda\x68\x5e\x7a\x74\x6b\x60\x71\x67\x39\x4c\x46\x48\x3d\x37\xc0\x78\x66\x5e\x48\x40\x2c\x2c\x1c\xc2\xa9\x7d\xf8\xe4\xbe\xf9\xe7\xc5\xec\xd7\xb0\xab\xab\xab\xb4\xb1\xab\xe5\xe1\xe5\xad\xba\xc0\x9b\x9b\x9f',
b'\x7a\x88\x96\xde\xde\xdf\xd6\xd5\xd5\x58\x58\x56\xc2\x8a\x77\x7c\x60\x48\x4b\x27\x22\x60\x2e\x25\x0e\x1a\x1a\x0d\x19\x1a\x0e\x1d\x1c\x0f\x1a\x17\x0d\x17\x14\x0c\x16\x13\x07\x0c\x0b\x37\x22\x1d\xef\xe2\xcc\xe1\x9a\x8c\xee\xa9\x9b\xf9\xf1\xe2\xf8\xf0\xdf\xa7\xa4\x95\x2d\x42\x3f\x22\x37\x34\x21\x2f\x2d\x98\x52\x4b\x7a\x7f\x73\x64\x75\x6c\x3c\x51\x4d\x14\x1c\x19\xc4\x74\x61\xed\x92\x7a\xea\x9f\x8b\xb4\xb2\xa4\x24\x25\x19\xb7\x9d\x72\xed\xd7\xb0\xf9\xe8\xc6\xaa\xaa\xaa\xb4\xb2\xac\xe6\xe2\xe7\xae\xbb\xc1\x9b\x9b\x9f',
b'\x7b\x88\x95\xdd\xdf\xde\xd7\xd5\xd6\x59\x58\x58\xbe\x93\x85\x1a\x1a\x18\x5b\x1e\x14\x41\x22\x1d\x10\x21\x20\x33\x31\x21\x60\x56\x40\x55\x51\x3f\x11\x21\x20\x0f\x1d\x1c\x09\x0f\x0d\x45\x0f\x0b\xe3\xa8\x94\xd9\x7e\x6f\xed\x81\x75\xf6\xdb\xca\xf5\xc6\xb8\xb1\x94\x8a\x27\x3b\x39\x81\x48\x31\xd4\x8c\x69\x77\x7d\x71\x52\x64\x5c\x33\x48\x43\x18\x27\x24\x95\x53\x45\xee\x8b\x74\xe7\x90\x78\xf5\xda\xcc\xfd\xfa\xf1\xe1\xdd\xd4\x5e\x42\x36\xad\x93\x6d\xf6\xe0\xba\xab\xab\xab\xb3\xb1\xab\xe8\xe3\xe9\xae\xbb\xc1\x9b\x9b\x9f',
b'\x7b\x88\x96\xde\xdf\xdf\xd8\xd6\xd7\x58\x57\x57\x4b\x2e\x2b\x7d\x59\x1b\x5d\x47\x40\x2c\x2f\x2c\x71\x59\x45\x99\x8a\x6d\x63\x61\x50\x27\x38\x31\x13\x26\x25\x0e\x1b\x1a\x0a\x10\x0f\x05\x05\x05\xd5\x9e\x8d\xec\xae\x9e\xe0\x9f\x8f\xea\x7c\x6f\xe8\x8f\x7e\xc1\x7f\x72\x88\x52\x3c\xe2\xb5\x9a\xe9\xb4\x96\xe2\x95\x6d\x5f\x57\x4d\x19\x28\x24\x81\x71\x5b\xf3\xe0\xd2\xe8\xbc\xac\xfa\xf1\xe0\xf9\xf0\xdc\xfc\xf5\xea\xe9\xb0\xa0\xe7\x9d\x83\x9e\x6c\x5d\x8d\x76\x55\xa8\xa8\xa8\xb4\xb2\xac\xe8\xe4\xea\xae\xbc\xc2\x9b\x9c\x9f',
b'\x7b\x88\x96\xdf\xe1\xe0\xd8\xd6\xd7\x59\x58\x57\x2b\x31\x2d\x65\x57\x46\x4f\x4c\x44\x46\x45\x3c\x8b\x80\x6a\x97\x77\x22\x1e\x2b\x26\x19\x31\x30\x17\x2b\x2a\x10\x20\x1f\x09\x0f\x0e\x06\x06\x06\xda\xd0\xbb\xf3\xe9\xd8\xf7\xdb\xcc\xe6\xbe\xae\xec\xae\x9f\xc4\xb4\xa6\x93\x5b\x43\xd7\xc6\xb6\xee\xbb\xa1\xe4\x90\x63\x63\x4c\x3a\x3e\x28\x1d\xe1\xcd\xb1\xf6\xee\xdd\xf7\xf0\xe0\xf1\xe9\xd7\xf9\xf3\xe6\xf6\xe9\xdd\xf1\xca\xbf\xed\x9d\x86\xef\x9d\x85\xd3\x90\x7a\xac\xac\xad\xb5\xb2\xad\xe9\xe4\xeb\xaf\xbd\xc2\x9c\x9c\xa0',
b'\x7b\x88\x96\xe0\xe1\xe1\xd8\xd7\xd7\x5a\x59\x58\x50\x44\x2d\x57\x4d\x34\x4c\x47\x3b\x3d\x3b\x33\xba\xa5\x91\xb4\xab\x9a\x9d\x92\x78\x4e\x50\x43\x14\x2c\x2a\x18\x2b\x29\x0b\x13\x10\x22\x28\x1b\xa0\x9a\x87\xa6\xa1\x92\xa3\x91\x83\x9e\x93\x87\x7c\x70\x65\x86\x55\x4f\x15\x26\x24\x8f\x4d\x31\xda\xa3\x84\x63\x56\x47\x13\x15\x12\xb4\x53\x49\xd9\x86\x74\xf8\xf1\xe2\xf0\xe8\xd4\xf7\xed\xd9\xf7\xee\xdb\xfb\xf5\xe7\xf8\xf1\xe1\xeb\xb3\x9f\xeb\x8f\x79\xef\x9b\x83\xad\xad\xad\xb6\xb3\xad\xea\xe5\xeb\xb0\xbd\xc3\x9c\x9c\xa0',
b'\x7e\x8a\x98\xe0\xe1\xe1\xd8\xd7\xd7\x49\x48\x47\x24\x24\x23\x21\x23\x1e\x9b\x55\x3d\xe0\x2f\x17\xc1\x2e\x25\x32\x2c\x29\x7a\x64\x21\x92\x8b\x70\x5a\x5f\x58\x0f\x21\x1f\x09\x0f\x0e\x66\x74\x53\x68\x75\x53\x5a\x6b\x4b\x54\x64\x49\x61\x70\x56\x44\x59\x51\x45\x5b\x51\x27\x40\x3c\x26\x3d\x39\x42\x4b\x45\x16\x2a\x27\x2a\x11\x10\xcd\x5f\x55\xce\x86\x75\xf5\xed\xdd\xf1\xe7\xcf\xf6\xed\xd8\xfb\xf5\xe8\xfa\xf5\xe8\xf1\xe6\xcf\xec\xbe\xa7\xe6\x80\x6b\xe9\x87\x73\x80\x80\x80\xb5\xb2\xae\xeb\xe6\xeb\xb2\xbf\xc7\x9b\x9b\x9e',
b'\x7a\x86\x94\xe3\xe4\xe4\xda\xd8\xd8\x46\x44\x43\x73\x43\x3a\x73\x52\x47\xd1\x25\x05\xfc\x24\x06\xfb\x58\x4b\xf4\x4c\x3e\x15\x1f\x1f\x3a\x34\x29\x55\x42\x29\x46\x35\x1f\x3d\x2d\x13\x50\x56\x43\x6f\x7c\x59\x51\x63\x43\x41\x50\x37\x93\x9a\x79\x79\x82\x64\xa9\xa5\x82\xab\x8e\x64\xa7\x9c\x7f\x69\x6e\x5e\x6f\x69\x56\x56\x4f\x3d\x0e\x0d\x0b\x87\x60\x4f\xe9\xdd\xc4\xe5\xd9\xbd\xf7\xee\xdb\xfc\xf7\xeb\xfd\xfa\xf2\xfb\xf9\xf1\xf5\xe2\xda\xed\xa0\x90\xe7\x7e\x6c\x6f\x70\x71\xb5\xb1\xb1\xed\xe8\xec\xaf\xbb\xc6\x9f\x9f\x9f',
b'\x7f\x8a\x98\xe3\xe4\xe4\xdd\xdb\xdc\x5e\x5b\x5c\x73\x73\x74\x71\x71\x73\x4f\x4f\x50\x7a\x7a\x7b\x7d\x7d\x7e\x63\x62\x64\x5b\x5b\x5c\x5e\x5e\x60\x54\x53\x55\x56\x56\x58\x5c\x5c\x5e\x61\x61\x63\x5b\x5b\x5d\x56\x56\x57\x57\x57\x59\x74\x72\x74\x5e\x5d\x5e\x5e\x5c\x5e\x5f\x5e\x5f\x4f\x4e\x50\x4e\x4e\x4e\x7a\x7a\x7a\x65\x65\x66\x5a\x5a\x5b\x5f\x5e\x62\x5a\x5a\x5b\x60\x60\x62\x5e\x5e\x5f\x51\x51\x53\x48\x48\x49\x53\x53\x54\x43\x43\x44\x4f\x4f\x51\x4b\x4b\x4d\x35\x35\x36\xc4\xc1\xc0\xeb\xe7\xeb\xb0\xbd\xc7\x99\x99\x9a',
b'\x7b\x86\x95\xe5\xe7\xe8\xe6\xe4\xe7\xec\xe9\xe9\xe9\xea\xe5\xef\xef\xea\xeb\xec\xe7\xec\xec\xe8\xed\xee\xe9\xea\xea\xe6\xe9\xea\xe5\xe6\xe7\xe2\xe9\xea\xe5\xe7\xe8\xe3\xe8\xe9\xe4\xe8\xe9\xe4\xe8\xe9\xe4\xe5\xe5\xe1\xe5\xe6\xe1\xe9\xea\xe5\xe5\xe6\xe1\xe4\xe4\xe0\xe5\xe6\xe1\xe5\xe6\xe1\xe3\xe3\xdf\xe5\xe6\xe1\xe4\xe4\xe0\xe4\xe4\xe1\xe2\xe3\xe0\xe2\xe2\xe0\xe3\xe3\xe1\xe1\xe1\xde\xdf\xdf\xdd\xe0\xe0\xdd\xde\xde\xdb\xdd\xdd\xda\xe0\xdf\xdd\xe0\xe0\xdd\xe6\xe6\xe4\xef\xec\xeb\xed\xe9\xec\xb2\xbf\xc9\x9e\x9e\x9f',
b'\x7e\x8a\x98\xe1\xe2\xe4\xeb\xea\xed\xea\xe6\xe9\xf3\xf1\xf1\xef\xed\xee\xf2\xf0\xf0\xf4\xf3\xf3\xf1\xef\xef\xf0\xef\xef\xf4\xf3\xf3\xf2\xf0\xf0\xf1\xef\xef\xf0\xef\xef\xf0\xf1\xf0\xf5\xf5\xf4\xf4\xf4\xf3\xf2\xf2\xf1\xf2\xf2\xf2\xf2\xf2\xf1\xf6\xf7\xf6\xf2\xf2\xf2\xf4\xf4\xf4\xf4\xf4\xf4\xf0\xf0\xf0\xf5\xf6\xf5\xf3\xf3\xf1\xf2\xf3\xf0\xf4\xf4\xf2\xf4\xf2\xf2\xf2\xf0\xf1\xf2\xf1\xf1\xf4\xf2\xf2\xf4\xf2\xf2\xf3\xf1\xf1\xf3\xf1\xf1\xf2\xf1\xf1\xf3\xf1\xf1\xf2\xf1\xf1\xef\xec\xeb\xf1\xed\xf0\xb1\xbe\xc9\x9b\x9b\x9c',
b'\x7b\x87\x95\xe7\xe7\xea\xe7\xe6\xea\xe5\xe2\xe5\xdf\xdc\xda\xdf\xda\xcd\xdd\xd7\xcd\xe3\xe0\xdf\xe2\xe2\xe6\xe4\xe3\xea\xe4\xe0\xe0\xdf\xdb\xd0\xe1\xdc\xd0\xe4\xe0\xdb\xe3\xe3\xe5\xe6\xe3\xe3\xdf\xdc\xd0\xde\xd9\xc9\xe1\xdb\xcd\xe2\xdc\xd0\xe1\xde\xdd\xe4\xe2\xeb\xe4\xe1\xdd\xdb\xd5\xc6\xe1\xdc\xd1\xdd\xda\xd3\xe6\xe4\xe3\xe4\xe4\xe7\xe2\xe0\xe0\xe0\xda\xce\xdf\xda\xce\xe3\xdf\xd8\xe6\xe3\xe4\xe3\xdf\xe7\xe4\xe1\xe3\xdd\xda\xd5\xdd\xdb\xd2\xde\xdc\xd8\xe2\xe1\xe2\xe7\xe3\xe5\xee\xea\xed\xb1\xbe\xc8\x9c\x9c\x9d',
b'\x7b\x88\x95\xe8\xe5\xe9\xe7\xe7\xea\xe4\xe2\xe4\xe1\xde\xda\xd9\xd3\xbb\xd9\xd1\xc1\xe3\xdf\xe0\xe2\xe3\xe7\xe7\xe7\xe8\xe2\xde\xd8\xdb\xd6\xbd\xd7\xd2\xba\xe6\xe1\xda\xe4\xe4\xe7\xe4\xe1\xe4\xdf\xdc\xcb\xdb\xd4\xbe\xdd\xd4\xc3\xdb\xd5\xbd\xdc\xdc\xcf\xe7\xe7\xe9\xe0\xde\xd5\xd9\xd4\xb9\xda\xd2\xbf\xde\xda\xcd\xe7\xe5\xe4\xe3\xe2\xe7\xe8\xe6\xe4\xe1\xda\xca\xd7\xd1\xbf\xda\xd5\xc8\xe5\xe3\xe3\xe3\xe2\xe9\xe7\xe4\xe6\xdd\xd8\xce\xdf\xda\xcb\xe0\xdc\xd6\xe5\xe3\xe5\xe7\xe3\xe7\xef\xec\xee\xb0\xbd\xc7\x9b\x9b\x9c',
b'\x7b\x88\x95\xe8\xe4\xe9\xe6\xe7\xe9\xe4\xe2\xe4\xce\xcd\xcf\xcf\xd0\xcb\xb4\xb4\xb6\xd3\xd1\xd7\xe3\xe1\xe2\xe3\xe2\xe4\xda\xd7\xdc\xcf\xcd\xcc\xbd\xbc\xbb\xca\xcb\xd1\xe5\xe5\xe9\xe6\xe5\xec\xda\xdb\xdb\xc9\xca\xcb\xc1\xbf\xc8\xca\xc8\xce\xe8\xe8\xe4\xe6\xe6\xe8\xda\xd9\xe0\xc5\xc7\xca\xbf\xbd\xc0\xbe\xbc\xbe\xe8\xe5\xeb\xe4\xe1\xe5\xe1\xde\xde\xc3\xc3\xc7\xc1\xc1\xc4\xb5\xb4\xb7\xe3\xe3\xe6\xe0\xe0\xe3\xe4\xe2\xe7\xc9\xc5\xc6\xcb\xc6\xc8\xb4\xb2\xb5\xdf\xdf\xe3\xe8\xe4\xe8\xef\xec\xee\xaf\xbc\xc7\x9b\x9b\x9c',
b'\x7c\x88\x96\xe8\xe5\xea\xe7\xe8\xea\xe2\xe0\xe1\xc1\xc2\xc1\xca\xcd\xcf\xa1\xa3\xa7\xa5\xa5\xa6\xea\xe6\xe4\xe8\xe6\xe9\xba\xb9\xbf\xcc\xcc\xd0\xa7\xaa\xa9\x9a\x9c\x9b\xe5\xe2\xe5\xe5\xe2\xe7\xbc\xbb\xbd\xd3\xd3\xd3\xa8\xa9\xa9\x91\x91\x92\xe2\xdd\xdf\xe7\xe2\xe6\xc6\xc4\xc5\xd9\xdb\xd8\xb0\xb2\xb2\x9c\x9e\x9d\xde\xdc\xe2\xe8\xe4\xea\xce\xcb\xcb\xd3\xd3\xd1\xb0\xb1\xb1\x96\x95\x98\xd4\xd2\xd5\xe4\xe2\xe4\xd1\xd1\xd0\xd1\xd0\xd2\xb5\xb4\xb8\x9c\x9c\x9d\xbd\xbe\xbf\xea\xe6\xea\xed\xea\xec\xb0\xbd\xc7\x9b\x9c\x9c',
b'\x7c\x88\x96\xe8\xe5\xea\xe6\xe6\xe9\xe3\xe1\xe2\x9e\x9e\x9e\x90\x91\x91\x81\x82\x7f\xa5\xa4\xa4\xe7\xe5\xe9\xe7\xe7\xe5\xa9\xa9\xa7\x89\x8a\x88\x92\x93\x8f\x8b\x8a\x88\xe4\xe2\xe6\xe5\xe3\xe5\xac\xab\xad\x93\x92\x91\x8d\x8c\x87\x8e\x8d\x8a\xe6\xe4\xe4\xe2\xe0\xde\xbe\xbd\xba\x9a\x9a\x97\x7e\x80\x7d\x8d\x8d\x89\xe2\xe0\xe3\xe2\xe0\xe5\xce\xce\xcf\x95\x95\x92\x8c\x8d\x8a\x91\x93\x91\xd7\xd5\xd8\xe3\xe0\xe5\xd5\xd3\xd6\x98\x98\x98\x82\x82\x83\x88\x87\x87\xc1\xc0\xc2\xe9\xe5\xe9\xed\xea\xec\xb0\xbd\xc8\x9b\x9b\x9c',
b'\x7a\x88\x95\xe8\xe3\xea\xe5\xe5\xe9\xe5\xe4\xe5\xd1\xcc\xd3\x97\x93\x92\x9f\x9b\x99\xdc\xd7\xde\xe3\xe0\xe4\xe4\xe3\xe6\xd9\xd8\xda\x98\x96\x9a\x95\x92\x96\xd5\xd3\xd6\xe5\xe5\xe6\xe3\xe3\xe6\xdd\xdf\xe1\x9b\x9f\xa2\x86\x8a\x90\xce\xce\xd1\xe3\xe3\xe7\xe2\xe2\xe6\xde\xde\xde\xa3\xa2\xaa\x89\x89\x8a\xc2\xc1\xc0\xe2\xe1\xe5\xe4\xe3\xe7\xdf\xe0\xe2\xad\xad\xb0\x91\x92\x93\xb9\xba\xbb\xe3\xe3\xe5\xe3\xe2\xe5\xe7\xe4\xe9\xb4\xb2\xb5\x88\x87\x89\xab\xa9\xac\xe3\xe1\xe5\xe7\xe3\xe7\xef\xeb\xed\xaf\xbc\xc7\x9b\x9b\x9c',
b'\x79\x88\x94\xe8\xe1\xe9\xe6\xe5\xea\xe1\xe2\xe3\xdf\xe1\xe6\xe2\xe5\xe5\xe3\xe6\xe6\xdf\xe0\xe7\xe3\xe6\xe0\xe5\xe3\xe6\xe2\xe0\xe3\xe9\xe7\xea\xe9\xe7\xea\xe3\xe1\xe4\xe4\xe5\xe6\xe3\xe1\xe7\xe6\xe3\xe4\xe6\xe1\xe0\xf1\xeb\xec\xe4\xe0\xdf\xe6\xe3\xe9\xe4\xe1\xea\xe4\xe0\xdf\xe9\xe4\xe1\xe6\xe1\xe3\xe5\xe1\xe0\xe6\xe4\xe7\xe4\xe2\xe6\xe4\xe3\xe4\xe4\xe4\xe6\xe5\xe5\xe7\xe3\xe3\xe5\xd0\xd0\xd1\xcf\xcf\xcf\xd0\xce\xd1\xe0\xde\xe1\xe2\xe0\xe3\xe3\xe1\xe4\xe2\xe0\xe3\xe7\xe3\xe7\xef\xeb\xed\xaf\xbc\xc6\x9c\x9c\x9d',
b'\x79\x88\x95\xe8\xe1\xe9\xe6\xe5\xe9\xe2\xe1\xe4\xe3\xdd\xe8\xe4\xde\xe3\xe0\xdb\xdd\xe4\xe0\xe9\xe4\xe0\xe7\xe5\xe5\xe7\xe3\xe2\xe4\xe5\xe4\xe7\xe1\xe1\xe3\xe3\xe3\xe5\xe0\xe2\xe6\xe6\xe4\xe7\xe2\xdc\xcd\xd2\xcb\xa9\xd1\xc9\x9f\xda\xd3\xbe\xe6\xe1\xe8\xe5\xe2\xea\xdf\xd9\xce\xcb\xc7\x9c\xd6\xd3\xb6\xd1\xce\xb7\xe8\xe5\xde\xe3\xdf\xe3\xe4\xe2\xe6\xe3\xe3\xe5\xc0\xc0\xc2\x94\x94\x95\xb6\xb6\xb6\xb3\xb3\xb3\xa0\x9f\xa0\x88\x87\x88\xb1\xb1\xb2\xe2\xe2\xe3\xdf\xdf\xe0\xe7\xe2\xe6\xee\xeb\xed\xaf\xbd\xc7\x9c\x9c\x9d',
b'\x79\x88\x95\xe7\xe0\xe8\xe4\xe4\xe8\xdb\xdb\xdd\xd7\xd8\xd1\xde\xdd\xdd\xdd\xdb\xde\xd4\xd6\xd2\xcf\xd2\xd2\xd5\xd5\xd6\xdb\xdb\xdc\xdc\xdc\xdd\xd8\xd8\xd9\xd9\xd9\xd9\xd2\xd2\xcf\xd8\xd6\xdd\xdc\xdb\xe0\xe0\xdd\xe0\xdd\xda\xde\xdc\xd7\xe0\xd1\xd1\xd4\xd6\xd8\xd5\xdf\xdd\xe2\xe5\xe0\xe0\xe0\xdd\xe2\xdb\xd9\xdc\xcf\xce\xd4\xdd\xdd\xe2\xe5\xe5\xe7\xba\xba\xbc\x89\x89\x8a\xc5\xc5\xc5\xbe\xbe\xbe\x9d\x9d\x9d\x9d\x9d\x9d\x91\x91\x91\x6f\x6f\x6f\xae\xae\xae\xe3\xe3\xe4\xe6\xe2\xe6\xee\xea\xec\xaf\xbc\xc7\x9c\x9c\x9d',
b'\x78\x87\x94\xe8\xe1\xe9\xe3\xe2\xe6\xd8\xd6\xd7\xd3\xcb\xb0\xca\xc2\x97\xce\xc8\x99\xcc\xc8\xa6\xd4\xce\xce\xd4\xd4\xd4\xd0\xd0\xd0\x98\x98\x98\xaa\xaa\xaa\x9e\x9e\x9e\xcd\xcd\xce\xd4\xd4\xd5\xd4\xd7\xd2\x9b\x9e\x99\x96\x97\x97\xaa\xad\xa8\xd7\xd7\xd6\xd2\xd2\xd4\xc9\xca\xc6\x97\x98\x96\x9a\x9c\x96\xae\xaf\xa9\xd4\xd4\xd5\xdd\xdc\xe1\xd8\xd7\xd9\x9d\x9d\x9d\xe3\xe3\xe3\xcd\xcd\xcd\xbd\xbd\xbc\x4e\x4e\x4d\x65\x65\x65\x9d\x9d\x9d\x9a\x9a\x9a\x8c\x8c\x8c\xcb\xcb\xcc\xe7\xe2\xe6\xec\xe9\xeb\xae\xbb\xc6\x9c\x9d\x9d',
b'\x79\x87\x93\xe4\xdf\xe6\xe1\xe1\xe5\xd4\xd2\xd3\xde\xdc\xd6\xda\xd9\xd5\xd8\xdb\xd0\xd9\xd9\xd0\xcb\xcc\xcb\xcd\xcc\xcf\xe0\xdf\xde\xd5\xd4\xd6\xdc\xdb\xde\xce\xce\xd0\xcd\xcd\xcd\xd1\xd0\xd3\xe1\xe0\xe5\xd3\xd3\xd4\xd0\xcf\xd2\xd1\xd1\xd1\xcb\xcd\xcf\xd0\xcd\xd1\xde\xdc\xdb\xce\xd1\xd7\xcf\xd2\xd2\xcc\xcf\xcb\xcd\xce\xcc\xdf\xdc\xdf\xc0\xbc\xc0\xe6\xe6\xe6\xee\xee\xee\xf4\xf4\xf4\xd1\xd1\xd0\xbf\xbf\xbe\xa4\xa4\xa4\xd7\xd7\xd7\xe3\xe3\xe3\xd8\xd8\xd8\xb1\xb1\xb2\xe8\xe3\xe7\xea\xe7\xe8\xaf\xbc\xc6\x9c\x9c\x9d',
b'\x7b\x87\x94\xe2\xdf\xe3\xe2\xe3\xe5\xd6\xd4\xd4\xbd\xbb\xb6\xc0\xbe\xba\xc0\xba\xb6\xbc\xbe\xbb\xcc\xc5\xcc\xd8\xd6\xd5\xbd\xbc\xb6\xc4\xc3\xc0\xbc\xbc\xbe\xc3\xc1\xc2\xc9\xc2\xc8\xdc\xd6\xd4\xbf\xbd\xaf\xbf\xbd\xc2\xc1\xc0\xbe\xc2\xbe\xbd\xcd\xc2\xc1\xd7\xd6\xda\xc2\xc3\xc1\xc1\xb8\xaf\xbf\xb9\xb6\xc0\xbc\xbf\xc6\xc4\xcb\xe2\xe2\xe5\xb5\xb4\xb2\xd6\xd6\xd6\xd3\xd3\xd3\xdf\xdf\xdf\xe8\xe8\xe8\xcc\xcc\xcc\xe9\xe9\xe9\xe9\xe9\xe9\xd3\xd3\xd3\xc7\xc7\xc7\xaf\xaf\xb0\xe3\xdf\xe3\xe9\xe6\xe8\xaf\xbc\xc6\x9e\x9e\x9f',
b'\x79\x86\x93\xe3\xe0\xe4\xe0\xe1\xe4\xde\xdc\xda\xcb\xc1\x9c\xd9\xc9\xa6\xcf\xc3\xb1\xd6\xc7\xa1\xde\xda\xdc\xdb\xda\xd6\xcf\xcf\xc7\xde\xdd\xdb\xdb\xdb\xdb\xdb\xd9\xd9\xda\xce\xd9\xe0\xd9\xd2\xd0\xcf\xba\xde\xda\xdf\xdb\xda\xda\xd8\xd1\xcf\xd2\xbc\xc0\xdc\xdc\xe1\xd8\xdc\xd8\xcf\xc2\xae\xcf\xca\xaa\xdb\xd5\xcd\xe1\xdf\xe4\xe2\xe1\xe5\xb5\xb5\xb4\xe4\xe4\xe4\xd1\xd1\xd1\xa6\xa6\xa6\xc9\xc9\xc9\xbc\xbc\xbc\xe3\xe3\xe3\xca\xca\xca\xc5\xc5\xc5\xd6\xd6\xd6\xaf\xaf\xb0\xe1\xdc\xe0\xe9\xe6\xe8\xad\xba\xc5\x9e\x9e\x9f',
b'\x78\x85\x91\xe2\xdf\xe4\xde\xde\xe1\xd6\xd5\xd7\xdd\xdc\xe1\xdc\xdb\xdc\xd5\xda\xd4\xda\xd8\xd8\xcc\xcf\xd7\xd0\xcf\xd0\xe4\xe4\xe2\xdb\xdb\xde\xd4\xd3\xd8\xd4\xd3\xd5\xcf\xcc\xcc\xd4\xd2\xd4\xe2\xe3\xe3\xdb\xdc\xdc\xd7\xd9\xd6\xd9\xd6\xd7\xd4\xcf\xd8\xd6\xd4\xd8\xe0\xe1\xde\xda\xda\xd8\xd9\xd9\xde\xd3\xd5\xd7\xcb\xcc\xcd\xdb\xda\xdd\xc5\xc2\xc5\xce\xce\xce\xde\xde\xde\xac\xac\xac\xa2\xa2\xa2\xbf\xbf\xbf\xe4\xe4\xe4\xf0\xf0\xf0\xe3\xe3\xe3\xd1\xd1\xd1\xb0\xb0\xb1\xe3\xdf\xe3\xe7\xe4\xe6\xad\xba\xc5\x9c\x9c\x9d',
b'\x7a\x86\x93\xe0\xdd\xe1\xdf\xe0\xe2\xd3\xd1\xd1\xce\xb6\xb5\xda\xaa\xb1\xc5\xa0\xa5\xc9\x9d\x9b\xd0\xce\xcd\xd3\xd3\xd6\xe6\xe6\xe5\xcd\xcc\xd0\xb0\xb0\xb3\xd5\xd6\xd3\xd1\xd1\xd2\xd2\xd2\xd4\xe5\xe5\xe4\xc6\xc5\xc9\xb8\xb8\xb5\xd7\xd7\xd7\xcc\xd3\xd0\xd1\xcf\xd2\xdc\xd9\xdc\x9b\xa0\x9e\xa8\xaa\xa4\xbd\xc0\xba\xd3\xd4\xd1\xd8\xd6\xd8\xdb\xda\xdd\x7d\x7d\x7d\x9c\x9c\x9c\x9b\x9b\x9b\xd0\xd0\xd0\xd4\xd4\xd4\xe7\xe7\xe7\xc4\xc4\xc4\xcb\xcb\xcb\x7f\x7f\x7f\xd4\xd4\xd4\xe2\xde\xe2\xe6\xe3\xe5\xac\xb9\xc3\x9d\x9d\x9e',
b'\x78\x87\x92\xe0\xdb\xdf\xe1\xe0\xe3\xd3\xd2\xd3\xcf\xcb\xcd\xcf\xcc\xcc\xd1\xd2\xcf\xd0\xcd\xcc\xc4\xc5\xc8\xcc\xce\xce\xde\xdd\xdc\xd5\xd5\xd5\xd2\xd3\xd0\xd5\xd6\xcf\xc7\xc7\xc5\xd1\xd2\xd1\xdf\xe0\xdb\xd4\xd3\xd1\xd8\xd9\xd7\xd0\xd0\xce\xcb\xcd\xc8\xcd\xcd\xcf\xde\xdd\xe0\xd1\xd1\xd0\xd5\xcf\xd0\xd3\xd3\xd2\xc8\xcc\xcd\xdb\xd7\xe0\xdc\xdd\xe1\xcb\xcb\xca\x72\x73\x72\x95\x94\x92\xb6\xb4\xb5\xb3\xb4\xb7\xc7\xc7\xca\xbc\xb9\xb9\x73\x73\x72\xbc\xbd\xbc\xdd\xdd\xde\xe1\xdd\xe0\xe6\xe4\xe5\xaa\xb9\xc3\x9e\x9f\x9f',
b'\x78\x88\x91\xe3\xdd\xe1\xe1\xdf\xe2\xdb\xda\xdb\xcf\xcc\xcf\xc4\xc2\xc5\xc5\xc4\xc6\xc4\xc1\xc5\xd2\xcd\xd3\xd9\xd8\xdf\xc8\xc2\xcc\xc5\xc4\xc7\xc5\xc6\xca\xc8\xc6\xd1\xd0\xd0\xd8\xd5\xd9\xe0\xc6\xc5\xc5\xca\xc6\xcf\xc2\xc1\xc7\xc7\xc6\xcc\xce\xcd\xd3\xd7\xd7\xdb\xc4\xc4\xc4\xc4\xc4\xc5\xc5\xc4\xcc\xc4\xc4\xc6\xcc\xcd\xcf\xda\xdb\xda\xdc\xde\xdb\xdc\xdb\xdf\xcc\xce\xd4\x95\x93\x96\x91\x90\x8f\x9f\xa1\xa1\x9d\x9e\x9c\x8f\x8d\x90\xc0\xc2\xc7\xdb\xdc\xe2\xdd\xd9\xe1\xe2\xde\xe2\xe8\xe5\xe7\xaa\xb9\xc3\x9e\x9e\x9e',
b'\x77\x88\x91\xe2\xdc\xe0\xe0\xde\xe0\xdd\xdd\xdc\xdb\xdb\xd6\xd8\xde\xde\xd4\xd9\xdd\xdf\xdc\xe1\xdd\xd5\xd9\xd9\xd7\xd3\xd7\xd5\xc0\xd9\xd8\xd4\xdd\xde\xe5\xdd\xdb\xd9\xdc\xd7\xd3\xdd\xde\xd6\xd6\xd3\xcc\xdc\xd9\xcf\xde\xdc\xe1\xe2\xdf\xdd\xda\xd6\xd7\xdf\xdb\xe0\xdd\xd8\xdf\xe0\xdc\xe2\xd5\xd9\xd7\xe1\xdc\xde\xdb\xcd\xd7\xdb\xdb\xdc\xe2\xdd\xd7\xdc\xdb\xd8\xde\xdc\xe2\xdc\xd8\xdd\xd7\xd2\xd4\xd2\xd0\xd0\xd8\xd0\xd2\xde\xda\xe1\xd7\xd8\xde\xdd\xda\xdc\xdb\xd3\xd5\xe1\xdd\xe1\xe6\xe3\xe5\xa8\xb8\xc2\x9e\x9e\x9f',
b'\x76\x86\x8f\xe2\xdd\xe0\xe1\xdf\xe2\xde\xdc\xdc\xcf\xc4\xbe\xd8\xd2\xd2\xd9\xd3\xd7\xd8\xcd\xd0\xd1\xc2\xc3\xd7\xd5\xcf\xca\xc8\xb6\xd8\xd8\xd2\xd7\xd9\xdb\xd9\xd7\xd3\xd6\xc4\xc8\xde\xd6\xd2\xd1\xce\xbe\xdc\xda\xd6\xd5\xd6\xd5\xda\xd3\xd8\xd0\xca\xca\xdd\xd9\xcd\xc8\xc6\xae\xd0\xce\xb9\xda\xd8\xdc\xd7\xce\xd3\xd0\xc1\xc5\xde\xda\xcf\xcb\xc4\xb0\xd1\xcd\xc1\xdb\xd7\xd5\xdd\xd4\xd8\xcf\xc5\xca\xdf\xda\xd8\xc8\xc2\xa8\xd5\xd0\xc2\xd8\xd7\xd3\xd8\xd0\xd4\xd5\xcb\xd1\xe3\xdf\xe2\xe5\xe3\xe5\xa8\xb7\xc1\x9f\xa0\xa0',
b'\x76\x86\x8f\xe3\xdd\xe0\xe1\xdf\xe2\xd6\xd6\xd6\xd2\xd6\xd1\xde\xe3\xe0\xd4\xd9\xd7\xd2\xd5\xd5\xc9\xcb\xca\xd3\xd4\xd6\xe5\xe0\xe8\xde\xdd\xde\xdd\xdf\xdf\xda\xd7\xe2\xd3\xcf\xd1\xd0\xd0\xd2\xe3\xe1\xe4\xdb\xdb\xd8\xe2\xe2\xec\xd7\xd5\xd9\xcd\xcb\xd1\xd3\xd0\xd6\xe3\xe1\xe4\xe1\xe0\xe0\xdc\xda\xd5\xda\xd8\xd5\xcd\xcd\xd1\xd2\xcc\xd3\xe2\xe0\xe0\xe5\xe3\xe2\xdc\xdb\xdc\xdb\xd7\xd7\xce\xc9\xcb\xd3\xd3\xd7\xe2\xe1\xe7\xd9\xd5\xd9\xdd\xdc\xe0\xdb\xda\xdc\xcb\xc9\xcb\xdf\xdb\xdf\xe7\xe4\xe6\xa7\xb7\xc0\x9e\x9e\x9f',
b'\x75\x87\x90\xe2\xdc\xe1\xdf\xde\xe0\xd6\xd7\xd6\xc3\xc2\xc7\xbc\xb8\xbd\xae\xad\xac\xbb\xbc\xbc\xd3\xd2\xd8\xcf\xd0\xcf\xe6\xe7\xea\xa1\xa4\xa7\x99\x9c\x9f\xd1\xd2\xd2\xcf\xcf\xd3\xd2\xd3\xd5\xe7\xe8\xe1\xc0\xbc\xc0\xb1\xaf\xb1\xdd\xde\xdb\xcf\xcf\xce\xce\xd0\xd0\xe8\xea\xeb\xaa\xab\xad\xa1\xa1\xa4\xc9\xcb\xc8\xcf\xd3\xd3\xce\xcd\xd1\xe4\xe7\xe8\xae\xb1\xab\x9c\xa1\x9c\xbf\xc0\xc2\xd4\xd4\xd6\xcb\xce\xcc\xe5\xea\xe4\xae\xb0\xab\x98\x9a\x97\xc2\xc5\xc4\xd5\xd8\xd9\xde\xda\xdc\xe5\xe2\xe3\xa7\xb6\xc0\x9f\x9f\xa0',
b'\x76\x88\x92\xe4\xde\xe4\xe0\xdf\xe1\xd1\xd2\xd0\xde\xdf\xdd\xd1\xd2\xcf\xd2\xd7\xd6\xcf\xd3\xd3\xc8\xc7\xc7\xce\xcd\xd0\xdd\xdc\xd7\xdb\xda\xd9\xc1\xc1\xc1\xcf\xcf\xcc\xc9\xca\xc6\xcc\xce\xd1\xdb\xdf\xe0\xd5\xd9\xd4\xd4\xd8\xd6\xd2\xd1\xd2\xcb\xcb\xcb\xcc\xcc\xca\xdd\xdd\xda\xd5\xd4\xd3\xd8\xd7\xd8\xd2\xd1\xd0\xcb\xca\xcd\xcc\xca\xcc\xe1\xe0\xe0\xda\xd6\xe3\xd8\xd3\xda\xcf\xd2\xd0\xcb\xcc\xcc\xd3\xcc\xd3\xdb\xd8\xdf\xd7\xd8\xd9\xd5\xd6\xdb\xd6\xd5\xd8\xcf\xce\xcd\xdc\xd9\xda\xe6\xe4\xe4\xa8\xb7\xc1\xa1\xa1\xa1',
b'\x74\x87\x90\xe2\xdc\xe2\xe2\xe1\xe3\xd4\xd4\xce\xc6\xbc\x9b\xbf\xbb\x9f\xcb\xc7\xc6\xd0\xc5\xcf\xd2\xc4\xc4\xd2\xd5\xc0\xc5\xbe\xb4\xcc\xc5\xad\xc1\xbd\xad\xcc\xc9\xc0\xd4\xc4\xd1\xdf\xd3\xd4\xbf\xbb\xa4\xcf\xc8\xd3\xd0\xcd\xcc\xca\xc8\xcd\xd0\xcd\xce\xdd\xda\xd5\xc8\xc4\xbb\xc8\xc5\xbd\xcb\xc9\xca\xce\xca\xcd\xd0\xcb\xd0\xdf\xda\xd7\xc7\xc2\xb0\xc6\xc2\xad\xca\xcf\xd0\xce\xc2\xc5\xd3\xc7\xc8\xd8\xd9\xd9\xbe\xba\x8b\xc5\xc5\xbe\xc9\xca\xc7\xc9\xc4\xc7\xcf\xc7\xcd\xe2\xde\xe0\xe7\xe5\xe5\xa6\xb5\xbf\xa2\xa2\xa2',
b'\x76\x89\x92\xe1\xdb\xe0\xe1\xe0\xe3\xd9\xd9\xd5\xd3\xcb\xbe\xcf\xcd\xbf\xdb\xdb\xdd\xd5\xcf\xd7\xd0\xc6\xc5\xd1\xd2\xca\xd2\xcb\xc4\xda\xd3\xc4\xcf\xca\xc2\xd5\xd2\xcd\xd1\xc8\xce\xe0\xd9\xd9\xd2\xd0\xc1\xd7\xd5\xda\xd7\xd8\xd5\xd7\xd5\xd9\xd2\xd0\xd0\xdb\xd8\xd4\xd1\xcd\xc5\xda\xd7\xd0\xdb\xd9\xda\xd5\xd3\xd3\xce\xca\xce\xd8\xd4\xd1\xcd\xc9\xb9\xc7\xc3\xae\xd4\xd7\xd3\xdd\xd5\xd4\xd1\xc8\xcb\xda\xd7\xdc\xca\xc5\xa8\xd3\xd2\xcd\xd6\xd6\xd6\xd9\xd4\xd8\xce\xc8\xcb\xe2\xdf\xe1\xe5\xe3\xe4\xa6\xb6\xc0\xa2\xa2\xa2',
b'\x76\x89\x92\xe2\xdc\xe2\xdf\xde\xe0\xd2\xd4\xd2\xe3\xe4\xe1\xc8\xc8\xc6\xa8\xad\xaa\xd9\xdd\xdc\xce\xcd\xd0\xce\xcd\xcc\xe5\xe5\xde\xde\xde\xdc\xdd\xde\xdc\xd7\xd7\xd3\xce\xcf\xcc\xcc\xcf\xd2\xe5\xe8\xe9\xdb\xde\xda\xd6\xd8\xd8\xdb\xdb\xdb\xcf\xcf\xcf\xd1\xd1\xd1\xe4\xe4\xe3\xdf\xdf\xde\xd3\xd3\xd2\xdd\xde\xda\xce\xcf\xce\xd0\xd1\xd2\xe5\xe7\xe5\xe1\xe0\xe4\xe1\xde\xde\xd7\xdb\xd9\xcc\xce\xcf\xd6\xd0\xd5\xe7\xe5\xeb\xe2\xe1\xe1\xe0\xdf\xe3\xdc\xdb\xdb\xd6\xd5\xd4\xdf\xdc\xdd\xe6\xe4\xe4\xa7\xb7\xc0\x9f\x9f\xa0',
b'\x75\x87\x91\xe2\xdc\xe2\xde\xdd\xe0\xd1\xd2\xd1\xe9\xe9\xe8\xbe\xbe\xbc\xa2\xa3\xa3\xe0\xe0\xe3\xcc\xcb\xcf\xd0\xd2\xd5\xda\xdb\xde\xb5\xb9\xbb\xbf\xc2\xc3\xac\xac\xab\xd4\xd2\xd4\xd2\xd1\xd0\xe5\xe5\xe2\xd2\xd1\xd0\xcd\xcd\xcd\xdb\xde\xde\xce\xcf\xcd\xcc\xcf\xcf\xe3\xe7\xe4\xe1\xe3\xdb\xbf\xbd\xbc\xe0\xe1\xe1\xcf\xd0\xca\xd5\xd0\xcf\xe5\xe7\xea\xe6\xe1\xe2\xcb\xc8\xc7\xda\xdd\xdc\xd3\xd6\xd5\xcc\xcc\xcc\xe4\xe4\xe7\xe0\xdd\xde\xbc\xbb\xbb\xe0\xdf\xdf\xd5\xd3\xd4\xdf\xdb\xdd\xe6\xe4\xe5\xa7\xb6\xc0\xa1\xa1\xa2',
b'\x77\x88\x93\xe2\xdb\xe1\xdf\xdd\xe1\xd2\xd4\xd4\xcb\xca\xce\xc8\xc7\xc6\xba\xb9\xb9\xcc\xcb\xca\xc7\xc4\xc2\xcf\xcc\xc9\xd6\xd4\xd4\xd7\xd4\xd5\xd3\xd0\xd2\xd2\xd1\xd4\xc4\xc4\xc7\xd1\xd2\xd4\xd4\xd4\xd6\xcf\xcf\xcf\xcb\xcb\xcd\xcd\xc9\xcc\xcb\xc4\xc9\xd0\xcd\xd6\xd2\xd0\xd9\xd5\xcf\xd5\xc9\xcd\xce\xcb\xd0\xcf\xc5\xbf\xc8\xc9\xcc\xd3\xd9\xd9\xd7\xcf\xd1\xd3\xd3\xd1\xd6\xcb\xce\xce\xc9\xc7\xc6\xd4\xce\xd1\xd5\xd8\xd3\xd2\xd0\xd0\xd3\xd5\xd8\xcc\xcf\xd2\xc4\xc3\xc4\xe2\xdf\xe0\xe5\xe3\xe5\xa7\xb7\xc0\xa1\xa1\xa1',
b'\x77\x88\x93\xe2\xdb\xe1\xdf\xdd\xe1\xda\xdd\xdb\xd6\xda\xd4\xd4\xd5\xda\xd9\xd9\xdd\xd0\xd4\xd0\xd8\xdd\xd7\xdd\xdc\xe0\xda\xd6\xd3\xd5\xda\xde\xd2\xd7\xdf\xd8\xd5\xd7\xd9\xd8\xdd\xdd\xdb\xe0\xd9\xd7\xda\xd6\xd4\xd6\xd5\xd3\xd5\xd9\xd9\xdb\xdb\xda\xdb\xd6\xd9\xdc\xd3\xd6\xd5\xd9\xd8\xd9\xdb\xd7\xd8\xd5\xd6\xd0\xdf\xdd\xe1\xe4\xdc\xd6\xd5\xd7\xd7\xd7\xdc\xd6\xd2\xda\xd6\xd6\xd4\xd8\xd9\xd8\xd9\xd6\xdb\xda\xd7\xd3\xda\xd6\xd1\xcf\xd8\xd7\xd6\xd5\xd5\xd5\xdc\xdb\xd9\xe5\xe1\xe3\xe6\xe3\xe5\xa7\xb7\xc0\xa0\xa0\xa0',
b'\x75\x87\x91\xe2\xda\xe1\xdf\xdd\xe1\xd8\xd8\xd5\xd4\xcc\xbd\xd5\xcd\xbb\xd4\xcc\xb4\xd7\xce\xc4\xe2\xd6\xdd\xd6\xc8\xca\xdf\xe1\xe3\xdb\xd3\xc3\xdc\xd1\xbf\xdc\xdf\xd9\xe4\xe1\xe1\xe2\xdb\xde\xd2\xc9\xcc\xe5\xdd\xdc\xd8\xd3\xcb\xda\xd3\xbe\xd6\xcf\xc0\xe3\xdf\xdc\xe7\xe0\xe4\xd7\xcd\xcf\xe2\xd9\xe2\xdc\xd8\xd8\xd1\xce\xbe\xe0\xdc\xdc\xdf\xd9\xdf\xd4\xbe\xc8\xda\xbd\xc6\xdb\xd1\xd8\xdd\xdc\xe0\xe4\xdd\xe0\xdb\xd8\xd0\xd1\xcd\xba\xd5\xd3\xcc\xdc\xda\xde\xdf\xdb\xdf\xe1\xde\xdf\xe8\xe5\xe7\xa6\xb5\xbf\x9f\x9f\x9f',
b'\x75\x86\x91\xe1\xd9\xdf\xe1\xdf\xe3\xd9\xda\xd7\xcd\xc9\xb8\xd4\xcd\xbd\xcf\xc9\xb0\xd2\xce\xbe\xdd\xd5\xd6\xd5\xc7\xc9\xe0\xe0\xe2\xd3\xcc\xbf\xd8\xcf\xc1\xd9\xdb\xdb\xde\xde\xe0\xdf\xda\xe0\xcd\xc5\xcb\xe7\xe2\xe2\xd6\xd3\xca\xd4\xcd\xb7\xd5\xd0\xbd\xdb\xda\xd3\xe2\xdd\xdc\xd6\xcb\xce\xe4\xdb\xe2\xd9\xd6\xcd\xcb\xc5\xb7\xcf\xd0\xd0\xd7\xd1\xd7\xcc\xae\xbd\xcd\xae\xb9\xda\xd0\xcf\xdc\xdf\xe1\xd3\xd2\xdd\xcf\xce\xd2\xc7\xc5\xb4\xce\xcd\xc9\xd6\xd4\xda\xdf\xdd\xe1\xe1\xde\xdf\xe9\xe6\xe8\xa5\xb4\xbe\xa0\xa0\xa0',
b'\x76\x86\x90\xe3\xdd\xe1\xe3\xe1\xe5\xd6\xd6\xd7\xc1\xc0\xc7\xbe\xbd\xc7\x9e\x9f\xa1\xbc\xbd\xbe\xc8\xc9\xd0\xcb\xc5\xce\xde\xd7\xdb\xbe\xbf\xc7\xc0\xc0\xc9\xa8\xa1\xa6\xae\xad\xb4\xc7\xc7\xd0\xc9\xc7\xcd\xd8\xd8\xda\xc1\xc3\xc4\xbe\xbe\xc3\xb3\xb2\xb7\x9f\x9f\xa6\xc2\xc2\xc9\xc6\xc8\xcb\xe3\xdc\xe1\x8f\x99\xc1\x50\x60\xcc\x55\x5f\xc2\x50\x5f\xc1\x4c\x5f\xbf\x41\x5a\xc6\x8d\x92\xc3\xb6\xb7\xc7\x4c\x5e\xbf\x4b\x5a\xbb\x57\x68\xbf\x49\x55\xc4\x50\x5f\xbb\x90\x98\xc9\xe3\xe3\xe3\xe7\xe5\xe7\xa7\xb4\xbd\xa0\x9f\xa5',
b'\x77\x86\x91\xe1\xdb\xdf\xe3\xe0\xe4\xd0\xd0\xd0\xbf\xbd\xbf\xbf\xbf\xc5\x7b\x7a\x7f\xad\xab\xb1\xc7\xc5\xcf\xc2\xc6\xc8\xd8\xd8\xd6\xbe\xc0\xc5\xb7\xbb\xc0\x6d\x6d\x6e\x7f\x7d\x81\xca\xca\xce\xc8\xc5\xc8\xdb\xd7\xdc\xbf\xbf\xc6\xc1\xc1\xc6\x93\x92\x98\x70\x70\x76\xbd\xbd\xc2\xc6\xc7\xcd\xda\xd4\xda\x8e\x98\xbf\x66\x79\xca\x85\x91\xc8\x8c\x9c\xd0\x7a\x87\xca\x3f\x50\xc6\x83\x8c\xbb\xb0\xb0\xce\x76\x88\xd0\x87\x90\xce\x72\x7b\xca\x5a\x67\xc1\x77\x88\xcd\x70\x77\xba\xe1\xe1\xe5\xe8\xe6\xe7\xa5\xb3\xba\xa1\xa0\xa7',
b'\x77\x87\x92\xe1\xdb\xdf\xe5\xe3\xe7\xcb\xcb\xcc\xbd\xbd\xc3\xc0\xc0\xcb\x95\x95\x9e\xc4\xc4\xcb\xc9\xc8\xd0\xc4\xc3\xc6\xde\xd8\xdd\xc2\xbb\xc5\xc0\xbc\xc6\x86\x84\x8d\x92\x92\x9a\xcd\xcc\xd3\xca\xc6\xc8\xdc\xda\xdd\xbc\xbc\xc5\xbf\xbe\xc4\xa7\xa7\xad\x7e\x7f\x84\xbe\xbf\xc4\xca\xca\xd1\xdf\xd8\xda\x8c\x8e\xc1\x65\x70\xc5\x7b\x81\xcb\x78\x84\xc8\x72\x78\xca\x68\x77\xcb\x87\x8b\xb9\xb6\xae\xc4\x6e\x85\xc7\x76\x7f\xce\x76\x88\xc7\x46\x55\xcb\x40\x51\xc5\x6a\x70\xcd\xe5\xe4\xeb\xe8\xe6\xe6\xa8\xb6\xba\x9e\x9d\xa5',
b'\x76\x86\x91\xe1\xdb\xdf\xe3\xe1\xe5\xc4\xc4\xc5\x9b\x9b\xa2\x9a\x99\x9f\x9d\x9d\x9c\x99\x9b\x99\x9f\xa0\xa3\xb3\xb2\xb8\xd5\xd6\xde\x9e\x9d\xa2\x9c\x9b\x9f\x9b\x9c\xa3\xa0\xa0\xa8\x9b\x9b\xa5\xa7\xa3\xa8\xd9\xd8\xda\xa0\xa4\xa6\x9a\x98\x9e\x9d\x9d\xa2\x99\x99\x9e\xa2\xa0\xa6\xa3\xa0\xa6\xcf\xd9\xd6\x90\x9d\xbb\x23\x44\x92\x21\x3c\x99\x1f\x3f\x98\x21\x40\x9b\x11\x3f\x98\x8a\x91\xbf\xb5\xb9\xc4\x1f\x3d\x9d\x27\x41\xa1\x22\x40\xa1\x25\x42\x97\x2f\x46\x99\x68\x6d\xa3\xe4\xe2\xe6\xea\xe7\xe9\xa7\xb5\xbb\xa0\xa0\xa6',
b'\x75\x85\x8f\xe2\xdc\xe0\xe6\xe3\xe8\xd9\xd8\xd7\xcc\xc3\xb8\xd2\xc9\xbc\xd1\xcb\xba\xd0\xca\xc7\xd5\xcf\xd6\xdb\xce\xd1\xe1\xe1\xe0\xcf\xcd\xc0\xce\xc6\xb5\xcf\xc8\xba\xd0\xcb\xbb\xdc\xd3\xd4\xcd\xc1\xc8\xe8\xe2\xe7\xd4\xd4\xd7\xd3\xd1\xd5\xd2\xd2\xd4\xd4\xd3\xd5\xd9\xd2\xd6\xd1\xc3\xc7\xe9\xdd\xe5\xde\xd4\xd2\xd1\xd3\xd6\xda\xd2\xd7\xd4\xd3\xd0\xd3\xd5\xce\xd6\xcb\xd1\xe1\xd3\xd7\xe4\xe1\xde\xd4\xc9\xcb\xd6\xd3\xd4\xd3\xd2\xd3\xd5\xd2\xd6\xd9\xcf\xd3\xd5\xcb\xd1\xe8\xe7\xe4\xeb\xe7\xea\xa9\xb6\xc0\x9e\x9e\xa4',
b'\x77\x84\x90\xe2\xdf\xe3\xe3\xe3\xe6\xde\xdc\xdb\xd3\xd0\xbe\xd3\xd0\xbc\xd4\xd1\xbe\xd5\xd2\xc4\xdf\xdb\xd4\xe3\xdc\xdf\xe6\xe1\xe0\xda\xd6\xce\xd4\xd0\xc2\xd4\xd0\xc3\xdd\xd9\xd4\xe2\xdd\xdd\xce\xc7\xcc\xe6\xe0\xe6\xe2\xde\xe4\xde\xdc\xdf\xdf\xde\xe1\xdb\xd9\xdc\xe4\xe0\xe4\xd0\xcc\xcf\xe5\xe3\xe4\xdd\xda\xda\xdf\xde\xe1\xe1\xde\xe2\xdd\xdc\xdf\xe1\xdf\xe1\xda\xd4\xda\xdc\xd7\xd9\xe2\xe0\xe0\xda\xd5\xd3\xdd\xde\xdf\xdd\xdd\xdf\xdd\xde\xe0\xdd\xdb\xde\xd7\xd5\xd7\xeb\xe7\xe9\xeb\xe8\xea\xa6\xb3\xbd\xa1\xa1\xa2',
b'\x77\x84\x91\xe2\xdf\xe4\xe2\xe2\xe5\xce\xcc\xce\xbe\xbb\xc5\xbe\xbc\xc4\xab\xa9\xb0\xbc\xb9\xc4\xc9\xc6\xd3\xc5\xc4\xca\xda\xd9\xde\xc2\xc0\xc4\xc0\xbe\xc1\xac\xab\xac\xb2\xb1\xb3\xc8\xc6\xca\xc7\xc6\xca\xdb\xd9\xde\xc1\xc0\xc5\xbe\xbd\xc2\xb2\xb1\xb7\xae\xad\xb2\xc1\xc0\xc5\xcb\xca\xcf\xd9\xd7\xda\xcc\xca\xce\xc2\xc0\xc4\xb5\xb4\xb9\xbf\xbe\xc3\xbc\xbb\xc0\xcb\xc9\xcd\xcd\xcb\xcf\xd6\xd3\xd6\xc0\xbe\xc1\xbd\xbd\xc2\xb9\xb8\xbe\xc4\xc3\xc9\xc6\xc5\xca\xc9\xc8\xcc\xe6\xe2\xe6\xed\xea\xec\xa7\xb4\xbe\xa0\xa0\xa1',
b'\x76\x83\x8f\xe1\xdd\xe2\xe3\xe3\xe6\xcb\xc9\xcb\xc0\xbf\xc1\xae\xae\xae\x6b\x6b\x6a\xb2\xb2\xb3\xc3\xc3\xc7\xc5\xc4\xca\xd8\xd7\xde\xbc\xbb\xc3\xc2\xc1\xc9\x75\x74\x7c\x9f\x9e\xa4\xc5\xc4\xca\xc8\xc7\xcc\xd5\xd4\xd9\xc1\xc0\xc5\xc6\xc5\xcb\x85\x84\x8a\x84\x83\x88\xc0\xbf\xc5\xc7\xc6\xcb\xd4\xd2\xd7\xcb\xc9\xce\xbd\xbb\xc1\xab\xaa\xb0\x67\x67\x6d\xb9\xb9\xbe\xc8\xc7\xcd\xc4\xc3\xc8\xd1\xd0\xd5\xbc\xbb\xc1\xb7\xb6\xbc\x83\x82\x88\xa1\xa0\xa6\xc9\xc8\xce\xc6\xc5\xca\xe7\xe3\xe6\xee\xeb\xed\xa5\xb2\xbc\xa0\xa1\xa1',
b'\x78\x84\x91\xe0\xdd\xe1\xe0\xe1\xe4\xcb\xc9\xcc\xc0\xbe\xc9\xbb\xb9\xc3\x97\x96\x9f\xb6\xb5\xbf\xc9\xc8\xd1\xc8\xc8\xca\xd6\xd5\xd8\xc1\xc1\xc6\xc0\xbf\xc5\x98\x97\x9e\x9a\x99\x9f\xcf\xce\xd4\xc8\xc7\xcc\xd5\xd4\xd9\xc3\xc2\xc7\xc3\xc2\xc8\x9b\x9a\xa0\x85\x84\x8a\xc4\xc3\xc9\xca\xc9\xcf\xd2\xd0\xd5\xca\xc9\xce\xbf\xbe\xc4\xad\xac\xb2\xa2\xa1\xa7\xb7\xb8\xbd\xcb\xcb\xd0\xc9\xc8\xcd\xd1\xd0\xd5\xc3\xc2\xc7\xbe\xbd\xc3\x9f\x9e\xa4\xbf\xbe\xc4\xca\xc9\xcf\xc9\xc8\xcd\xe7\xe3\xe6\xec\xe8\xea\xa7\xb4\xbe\xa0\xa0\xa1',
b'\x79\x85\x92\xde\xdb\xdf\xe3\xe3\xe6\xc1\xbf\xc1\xa1\xa0\xa5\x9e\x9c\xa2\xa1\xa0\xa5\xa1\xa1\xa3\xa4\xa3\xa6\xb3\xb3\xb6\xd2\xd1\xd5\xa3\xa1\xa7\x9f\x9e\xa4\xa1\x9f\xa5\xa4\xa2\xa7\xa1\xa0\xa5\xa8\xa7\xac\xd8\xd7\xdc\xa6\xa5\xaa\xa0\xa0\xa5\xa2\xa2\xa7\xa3\xa3\xa8\xa2\xa1\xa7\xac\xab\xb1\xd0\xd0\xd4\xba\xb9\xbd\xa2\xa1\xa6\xa1\xa1\xa5\xa3\xa3\xa8\xa5\xa4\xaa\xa6\xa6\xab\xbd\xbb\xc0\xc8\xc6\xca\xa2\xa0\xa5\x9f\x9c\xa3\xa0\x9f\xa4\x9e\x9d\xa3\xa2\xa3\xa8\xae\xaf\xb2\xe6\xe2\xe6\xeb\xe7\xe9\xa8\xb5\xc0\xa0\xa0\xa1',
b'\x78\x87\x93\xe2\xdc\xe2\xe2\xe0\xe4\xda\xd6\xd7\xd2\xc6\xc6\xcf\xc9\xcb\xce\xcc\xd1\xd0\xd0\xd4\xcf\xcb\xcf\xdb\xcd\xd9\xde\xdb\xdc\xd1\xc9\xc0\xd0\xca\xc2\xd1\xd5\xd4\xd2\xd0\xd3\xd5\xce\xd1\xcf\xc7\xca\xe4\xe0\xe1\xd4\xd2\xd4\xd4\xd3\xd6\xce\xce\xd0\xd2\xd1\xd4\xd9\xd0\xd5\xc8\xbc\xc1\xe4\xd7\xda\xd9\xd2\xd0\xd1\xd0\xcd\xcd\xcc\xcc\xd4\xcf\xd5\xcf\xcf\xd0\xd1\xcb\xca\xdf\xd1\xd8\xe0\xdf\xda\xcf\xc9\xc1\xd2\xd1\xd4\xd2\xd1\xd4\xd3\xd1\xd4\xd5\xcc\xd2\xd4\xc8\xce\xe7\xe3\xe7\xea\xe7\xe8\xa5\xb2\xbd\xa0\xa0\xa1',
b'\x76\x85\x91\xe2\xdc\xe2\xe5\xe3\xe7\xdc\xd9\xd7\xce\xca\xb2\xd7\xd5\xc7\xd9\xd9\xd5\xda\xd9\xdd\xd8\xd4\xda\xd9\xcd\xce\xe1\xdd\xdc\xce\xc8\xb3\xd6\xd0\xbb\xde\xde\xe3\xdc\xdb\xde\xdf\xdb\xe0\xd1\xcb\xcf\xe2\xde\xe1\xdc\xda\xdc\xdc\xdb\xdf\xdd\xdd\xe0\xda\xd8\xdc\xe2\xdc\xe1\xcd\xc4\xca\xe1\xd8\xda\xdd\xd8\xd6\xda\xd9\xd7\xdf\xde\xe1\xdd\xd9\xdf\xde\xde\xe0\xd6\xd2\xd3\xde\xd3\xd9\xdf\xde\xdc\xd7\xd2\xcd\xde\xdc\xe0\xdb\xd9\xdd\xdd\xdd\xe0\xe0\xda\xdf\xd5\xcc\xd2\xe8\xe4\xe8\xeb\xe8\xea\xa5\xb2\xbc\xa1\xa1\xa2',
b'\x76\x85\x91\xe1\xdb\xe1\xe4\xe2\xe6\xd2\xd0\xd3\xbd\xb9\xc9\xbb\xb8\xc8\xb4\xb3\xbe\xbf\xbe\xc5\xca\xc8\xd0\xc3\xc3\xcc\xd4\xda\xd7\xbf\xbd\xca\xbf\xbe\xcb\xac\xb2\xaf\xbc\xbc\xc2\xc7\xc5\xcb\xc5\xc3\xc8\xd8\xd6\xdb\xc0\xbf\xc4\xbe\xbd\xc3\xb1\xb1\xb7\xb3\xb4\xb9\xc1\xc0\xc6\xcb\xc8\xcf\xd4\xd1\xd4\xcc\xcb\xcd\xc0\xc0\xc2\xbd\xbb\xc1\xbc\xba\xc0\xbf\xc0\xc2\xc8\xc5\xc9\xcd\xc9\xcf\xd5\xd4\xd7\xbe\xbd\xbf\xbc\xba\xc1\xbe\xbb\xc2\xc0\xc1\xc6\xc4\xc3\xc9\xc7\xc3\xc9\xe4\xe0\xe4\xea\xe7\xe9\xa5\xb2\xbc\xa3\xa3\xa4',
b'\x76\x86\x91\xe3\xdd\xe2\xe4\xe1\xe5\xcd\xcb\xcd\xbc\xbc\xc0\xbd\xbd\xc0\x83\x83\x85\xbc\xbc\xbe\xc7\xc7\xc9\xc5\xc2\xc7\xd6\xd4\xd8\xbe\xbb\xc4\xbf\xbd\xc5\x99\x99\x9b\x8e\x8f\x94\xc8\xc7\xcd\xca\xc9\xcf\xd1\xd0\xd5\xc1\xc0\xc5\xbb\xba\xc0\xb4\xb3\xb9\x73\x73\x78\xbf\xc0\xc5\xc8\xc9\xcd\xd2\xd2\xd4\xc6\xc6\xca\xbf\xbe\xc3\xab\xaa\xb0\x70\x70\x75\xb3\xb1\xb7\xc9\xc6\xce\xc8\xc8\xcc\xd1\xcd\xd2\xbe\xc0\xc6\xb4\xb4\xba\x95\x92\x99\xa0\xa2\xa7\xc7\xc7\xcd\xc5\xc3\xc9\xe6\xe2\xe6\xea\xe6\xe8\xa5\xb2\xbd\xa3\xa3\xa4',
b'\x77\x86\x92\xe4\xde\xe3\xe5\xe2\xe6\xcf\xcd\xcf\xc0\xbf\xc6\xbf\xbc\xc3\x97\x95\x9c\xbe\xbc\xc6\xc7\xc8\xcf\xc6\xc5\xc8\xd5\xd2\xd9\xbe\xc0\xc0\xbb\xc0\xc1\x7c\x7b\x84\xac\xab\xb1\xc8\xc7\xcd\xc6\xc5\xca\xd8\xd6\xdb\xc1\xc0\xc5\xc1\xc0\xc6\xac\xab\xb0\x83\x82\x88\xc2\xc2\xc7\xc9\xc9\xce\xd3\xd2\xd4\xcb\xca\xcf\xbd\xbc\xc1\xba\xb9\xbf\x90\x91\x95\xc1\xbb\xc3\xcb\xc9\xd3\xc7\xca\xcc\xd5\xcf\xd4\xbc\xbf\xc6\xbb\xba\xc0\xb1\xae\xb4\xb6\xb5\xbb\xc9\xc8\xce\xc8\xc6\xcb\xe8\xe4\xe8\xe9\xe5\xe7\xa6\xb3\xbe\xa3\xa3\xa4',
b'\x79\x86\x91\xe2\xdf\xe3\xe6\xe7\xea\xc1\xbe\xc2\x9d\x9b\xa4\x9b\x99\xa3\x9c\x9b\xa0\x9f\x9e\xa2\xa3\xa1\xa7\xb1\xaf\xb5\xd2\xd1\xd6\x9e\x9e\xa2\x9d\x9f\xa4\x9c\x9d\xa3\x9f\x9e\xa4\xa1\xa2\xa7\xa8\xa8\xad\xd4\xd4\xd8\xa3\xa3\xa7\xa0\x9f\xa6\x9f\x9e\xa7\x9d\x9c\xa1\xa0\xa0\xa2\xa3\xa3\xa8\xcf\xcd\xd2\xb6\xb6\xbb\x9f\x9f\xa9\x9c\x9c\xa3\x9d\x9e\x9f\xa1\x9e\xa8\xa5\xa3\xac\xb8\xb8\xba\xc9\xc8\xca\xa0\x9f\xa3\x9f\x9f\xa5\x9d\x9f\xa7\xa1\xa0\xa6\xa4\xa2\xa9\xae\xad\xb3\xe7\xe3\xe5\xe9\xe6\xe8\xa5\xb2\xbd\xa3\xa3\xa3',
b'\x79\x86\x91\xe4\xe0\xe5\xe5\xe6\xe9\xdb\xd9\xda\xc6\xc3\xba\xca\xc9\xca\xca\xca\xcc\xcc\xcc\xcf\xcb\xc9\xcf\xd1\xc8\xcb\xe5\xde\xdc\xc4\xc1\xba\xc8\xc5\xc4\xcc\xc5\xc9\xbe\xaa\xaf\xc8\xb4\xba\xc3\xb3\xb7\xe7\xe0\xdf\xc8\xc5\xbf\xcd\xc8\xbf\xcb\xc8\xca\xcc\xca\xce\xcf\xc9\xcd\xc9\xc0\xc7\xe2\xda\xdd\xd5\xd2\xd3\xc9\xc8\xc9\xc9\xc4\xc1\xc4\xbf\xb5\xc5\xc4\xbd\xcb\xc9\xcb\xd8\xd6\xd9\xdc\xda\xdd\xc7\xc5\xca\xcc\xc9\xd4\xcb\xca\xc0\xc8\xc3\xcc\xca\xc9\xc9\xce\xd0\xcd\xeb\xe7\xe8\xe8\xe5\xe7\xa2\xaf\xb9\xa5\xa5\xa6',
b'\x7a\x87\x92\xe2\xde\xe3\xe6\xe7\xeb\xe1\xdf\xe0\xd9\xd5\xcc\xe4\xe1\xe5\xde\xdc\xe2\xe0\xe0\xe2\xd8\xd6\xd9\xdb\xd1\xd4\xe5\xde\xd8\xcd\xc9\xc0\xe0\xdd\xda\xe3\xdd\xe1\xd3\xb7\xbd\xcf\xb2\xb9\xd2\xbd\xc1\xe7\xe1\xde\xd1\xd2\xca\xdf\xda\xd2\xe1\xdf\xe4\xdc\xdc\xe2\xe3\xdf\xe2\xce\xc3\xc8\xe4\xd9\xdd\xdf\xdc\xe2\xe0\xdf\xe5\xd7\xd3\xca\xd4\xcf\xb9\xdd\xdd\xd4\xe0\xdd\xe1\xe0\xde\xe3\xdf\xdd\xe0\xe4\xe2\xe6\xe3\xdc\xe6\xd4\xce\xb2\xe0\xdb\xdc\xe1\xe1\xe1\xdd\xdd\xdd\xea\xe6\xe8\xeb\xe8\xea\x9f\xac\xb6\xaa\xaa\xaa',
b'\x7c\x88\x94\xe0\xdd\xe1\xe9\xe9\xed\xcd\xcb\xce\xc2\xbf\xc5\xbd\xbb\xc6\xaf\xad\xb4\xbb\xbb\xbd\xbc\xba\xbf\xc5\xc1\xc8\xdb\xd9\xda\xc7\xc7\xc6\xc5\xc6\xc9\xc5\xc7\xcd\xc1\xc6\xc8\xc9\xcb\xce\xc5\xc2\xc7\xd8\xd7\xd9\xc2\xc2\xc4\xc6\xc4\xca\xc0\xc1\xcc\xb8\xbb\xc1\xc2\xc1\xc3\xc4\xc2\xc4\xdb\xd8\xd8\xc6\xc8\xc8\xc5\xc8\xcd\xc6\xc5\xcd\xc6\xc3\xc8\xc5\xc4\xca\xc5\xc3\xcd\xca\xc8\xce\xd6\xd6\xd8\xc2\xc4\xc7\xc0\xc3\xcc\xc3\xc3\xc9\xbe\xc6\xc3\xbc\xc0\xc4\xc6\xc2\xcc\xe5\xe1\xe5\xed\xea\xec\x9e\xab\xb6\xb2\xb2\xb2',
b'\x78\x84\x90\xe0\xdd\xe1\xe3\xe4\xe8\xcb\xc9\xcd\xb9\xb9\xbf\xac\xae\xb3\x90\x92\x92\xa1\xa0\xa6\xbc\xb9\xc5\xbe\xbd\xc2\xd7\xd6\xdc\xc1\xbf\xc6\xc3\xc2\xc8\xab\xa8\xad\xbf\xb8\xc0\xc1\xbf\xc5\xbc\xbc\xc2\xda\xd7\xdd\xc0\xbb\xc0\xbe\xbe\xc4\x82\x7e\x86\x94\x90\x94\x8e\x8d\x93\xb8\xb7\xc2\xd4\xd3\xdb\xc9\xc7\xcc\xb9\xb6\xbe\xb0\xb0\xb5\xae\xb0\xaf\xa8\xa8\xae\xb8\xb8\xbd\xc4\xc5\xc7\xd2\xd2\xd8\xa9\xab\xc4\x8a\x9e\xc6\x81\x90\xcd\x85\x9f\xc1\x93\xa0\xc3\xc1\xbf\xc4\xe8\xe3\xe8\xe7\xe4\xe6\x9d\xaa\xb4\xbb\xbb\xba',
b'\x7d\x85\x8d\xd2\xd4\xdb\xe8\xe3\xe2\xbd\xbf\xc7\xba\xb9\xc1\xaf\xaf\xb6\x7f\x7e\x85\xa1\xa0\xa8\xba\xb9\xc0\xbe\xbd\xc3\xd6\xd5\xdb\xc2\xc1\xc7\xbf\xbe\xc4\xb6\xb5\xba\xbb\xba\xc0\xbe\xbd\xc3\xbc\xbb\xc0\xd5\xd3\xd8\xbf\xbd\xc3\x90\x8f\x95\x8b\x89\x8f\x85\x84\x8a\xa7\xa6\xac\xc0\xbf\xc5\xd5\xd4\xda\xc6\xc5\xca\xb8\xb7\xbd\xb4\xb3\xb9\xb9\xb8\xbe\xaa\xa9\xaf\xba\xb9\xbf\xc6\xc5\xcb\xd0\xcf\xd5\xac\xae\xc2\x88\x99\xc9\x8b\x99\xbd\x84\x98\xc9\x95\xa3\xc4\xb7\xbd\xbf\xe7\xe4\xe6\xe5\xdf\xe4\x8c\x9f\xa9\xc3\xc2\xc9',
b'\x82\x88\x91\xbf\xc6\xd2\xe7\xe2\xe3\xc9\xc9\xce\x98\x97\x9c\xa2\xa1\xa6\x96\x95\x9a\xa2\xa1\xa6\xa2\xa1\xa6\xb2\xb1\xb6\xd2\xd1\xd6\xa3\xa2\xa7\xa6\xa5\xab\xa6\xa5\xab\xa8\xa7\xad\xa6\xa5\xab\xa8\xa7\xac\xd6\xd5\xda\xa6\xa5\xaa\xa5\xa4\xa9\xa7\xa6\xab\x9f\x9e\xa3\xa6\xa5\xaa\xa7\xa6\xab\xd1\xd0\xd5\xba\xb9\xbe\xa8\xa7\xac\xa8\xa7\xac\xa4\xa3\xa8\xab\xaa\xaf\xa5\xa4\xaa\xbd\xbc\xc2\xc7\xc6\xcb\xa4\xa5\xaa\xa4\xa3\xac\xa6\xa1\xac\xa1\xa4\xab\x9d\x9d\xa1\xb4\xac\xb1\xe6\xe3\xe4\xdb\xd9\xde\x7b\x90\x97\xd3\xd0\xd7',
b'\x9a\x9f\xa6\xa9\xb4\xc2\xdf\xdb\xde\xe2\xdd\xe1\xcd\xcb\xce\xc4\xc2\xc5\xc2\xc0\xc3\xc3\xc1\xc4\xc3\xc1\xc4\xcf\xcd\xd0\xde\xdc\xdf\xc2\xc0\xc3\xc0\xbe\xc1\xc4\xc2\xc6\xc2\xc0\xc4\xc5\xc3\xc8\xc7\xc5\xca\xe2\xe0\xe4\xc8\xc6\xca\xc3\xc1\xc4\xc3\xc1\xc4\xc2\xc0\xc3\xc4\xc2\xc5\xc3\xc1\xc4\xe1\xdf\xe3\xd2\xd0\xd4\xc6\xc4\xc8\xc3\xc1\xc5\xc7\xc5\xc9\xc0\xbe\xc1\xc5\xc3\xc6\xd7\xd5\xd8\xdd\xdb\xde\xc3\xc1\xc3\xc3\xc2\xc5\xc5\xc2\xc9\xc0\xc4\xc2\xc5\xc7\xca\xe0\xda\xe8\xe1\xdc\xe0\xcf\xd1\xd6\x71\x85\x89\xe4\xdf\xe6',
b'\xc3\xc4\xc5\x8a\x96\xa1\xde\xdb\xdf\xde\xdb\xde\xda\xd8\xdb\xe0\xde\xe1\xde\xdc\xdf\xde\xdc\xdf\xe0\xde\xe1\xe0\xde\xe1\xde\xdc\xdf\xdf\xdd\xe0\xe2\xe0\xe3\xdf\xdd\xdf\xe0\xde\xe1\xe1\xdf\xe2\xe2\xe0\xe3\xe2\xe0\xe3\xe1\xdf\xe2\xe0\xde\xe1\xe4\xe2\xe5\xe1\xdf\xe2\xe2\xe0\xe3\xe1\xdf\xe2\xe1\xdf\xe2\xe3\xe1\xe4\xe0\xde\xe1\xe2\xe0\xe3\xe0\xde\xe1\xe0\xde\xe1\xe4\xe2\xe5\xe2\xe0\xe3\xdf\xdd\xe0\xe1\xde\xe3\xe7\xe3\xe9\xe0\xdf\xde\xe2\xe1\xe3\xe0\xdf\xe1\xde\xdd\xdc\xdc\xd9\xdc\xc4\xc6\xcc\x7b\x87\x8a\xf2\xef\xf2',
b'\xf5\xf4\xf1\x8f\x98\x9e\xab\xaa\xae\xd0\xd0\xd4\xdd\xdb\xde\xdf\xdd\xe0\xe1\xdf\xe2\xe2\xe0\xe3\xdf\xdd\xe0\xe0\xde\xe1\xdf\xdd\xe0\xe0\xde\xe1\xdf\xdd\xe0\xe2\xe0\xe2\xe1\xdf\xe0\xe3\xe1\xe2\xe3\xe1\xe4\xe1\xdf\xe2\xe2\xe0\xe2\xe4\xe2\xe5\xe2\xe0\xe3\xe2\xe0\xe3\xe1\xdf\xe2\xe2\xe0\xe3\xe2\xe0\xe2\xe1\xdf\xe1\xe1\xdf\xe1\xe1\xdf\xe1\xe2\xe0\xe2\xe2\xe0\xe3\xe2\xe0\xe3\xe2\xe0\xe3\xe3\xe1\xe4\xe4\xe2\xe5\xe3\xe0\xe3\xe6\xe3\xe8\xe6\xe0\xe8\xe3\xdf\xe4\xd7\xd7\xd7\xc3\xc2\xc7\x87\x86\x8e\xcb\xd6\xd7\xff\xfc\xff',
b'\xfb\xfb\xfb\xf9\xf9\xfa\xa1\xa1\xa3\x8e\x8d\x92\xa9\xa8\xad\xba\xb9\xbe\xc1\xc0\xc3\xca\xc9\xcc\xcc\xca\xce\xcf\xcd\xd2\xd2\xd0\xd5\xd3\xd1\xd6\xd4\xd3\xd7\xd5\xd4\xd8\xd5\xd4\xd8\xd7\xd5\xda\xd7\xd6\xdb\xd7\xd6\xda\xd7\xd5\xda\xd8\xd7\xdb\xd8\xd7\xdb\xd8\xd7\xdb\xd8\xd7\xdb\xd8\xd6\xdb\xd6\xd5\xd9\xd7\xd6\xda\xd8\xd7\xdb\xd7\xd6\xda\xd7\xd6\xda\xd8\xd6\xda\xd5\xd4\xd8\xd5\xd3\xd8\xd3\xd2\xd6\xd2\xd0\xd4\xd0\xce\xd1\xc6\xc5\xc8\xbd\xbd\xbf\xb1\xb1\xb4\x9f\x9e\xa3\x85\x84\x89\xd3\xd2\xd5\xfd\xfe\xfe\xfe\xfe\xfd',
b'\xfe\xfe\xfe\xfd\xfd\xfd\xf8\xf8\xf9\xd7\xd7\xda\x96\x99\x9e\x86\x89\x8d\x96\x99\x9e\x9a\x9e\xa3\xa3\xa6\xac\xa2\xa5\xab\xa3\xa6\xac\xa5\xa8\xad\xa5\xa9\xae\xa5\xa8\xae\xa5\xa8\xae\xa7\xaa\xaf\xa8\xab\xb1\xa9\xac\xb2\xa9\xac\xb2\xa9\xad\xb2\xa9\xac\xb1\xa9\xac\xb1\xa9\xac\xb1\xaa\xac\xb2\xab\xac\xb3\xaa\xac\xb2\xa9\xaa\xb1\xa8\xa9\xb0\xa8\xa9\xb0\xa7\xab\xb1\xa5\xa9\xae\xa3\xa6\xac\xa1\xa4\xaa\xa0\xa4\xaa\x9b\x9e\xa6\x99\x9c\xa3\x8c\x8f\x95\x88\x8b\x91\xb3\xb5\xb9\xed\xed\xee\xfd\xfd\xfe\xfe\xfe\xfe\xfe\xfe\xfe',
]

Télécharger




Hors concours Graph 90+E - getkey() - ptitjoz

Go to top

ptitjoz n'ayant lui plus le privilège d'être élève et pas encore celui d'être enseignant, a malgré tout fait l'effort d'adresser pour le plaisir à Casio une participation hors concours en Python sur Graph 90+E.

Il en profite pour leur transmettre un mystérieux message, GETKEY(). Les vrais savent... ;)




Professeurs Graph 90+E - Liste manuscrite - Afyu

Go to top

15180Visiblement, je ne suis pas le seul à m'être retapé tout l'alphabet pour ce concours. En effet Afyu, enseignant en Mathématiques, a quant à lui conçu sa liste de Noël en écriture manuscrite pour la bibliothèque turtle de la Graph 90+E, et ici encore la chose est animée.

D'autant plus impressionnant que la tortue écrit et enchaîne les lettres littéralement sans lever le stylo, exactement comme si elle écrivait à la main, regarde bien la construction de l'animation :


Code: Tout sélectionner
from turtle import *
from random import *
from math import sin,cos,pi

taille_initiale=1
l_liste=215
h_liste=150

def tracer(lettre,x,y):
  global taille_initiale
  #hideturtle()
  if lettre == "a":
    penup()
    goto(x,y)
    setheading(60) # vers la droite
    pendown()
    fd(4)
    rt(130)
    for i in range(30):
      fd(1)
      lt(18)
    setheading(-90)
    fd(-3)
    fd(4)
    for i in range(4):
      lt(18)
      fd(1)

  if lettre == "b":
    penup()
    goto(x,y)
    pendown()
    setheading(-10)
    for i in range(10):
      lt(20-2*i)
      fd(2)
      #lt(6-i)
    for i in range(5):
      lt(30)
      fd(1)
    for i in range(9):
      fd(2)
      lt(2*i+4)
    for i in range(4):
      lt(25)
      fd(1)
    rt(95)
    fd(2)
  if lettre == "c":
    penup()
    goto(x,y)
    setheading(30) # vers la droite
    pendown()
    fd(5)
    lt(75)
    for i in range(8):
      fd(1)
      rt(18)
    rt(162)
    for i in range(15):
      fd(1)
      lt(18)
  if lettre == "d":
    penup()
    goto(x,y)
    setheading(60) # vers la droite
    pendown()
    fd(4)
    rt(130)
    for i in range(30):
      fd(1)
      lt(18)
    setheading(-90)
    fd(-10)
    fd(11)
    for i in range(4):
      lt(18)
      fd(1)
  if lettre == "e":
    penup()
    goto(x,y)
    setheading(60) # vers la droite
    pendown()
    fd(5)
    rt(90)
    for i in range(10):
      fd(1)
      lt(15)
    lt(30)
    for i in range(10):
      lt(25)
      fd(2)
  if lettre == "E":
    penup()
    goto(x,y)
    setheading(60) # vers la droite
    pendown()
    fd(5)
    rt(90)
    for i in range(10):
      fd(1)
      lt(15)
    lt(30)
    for i in range(10):
      lt(25)
      fd(2)
    penup()
    goto(x+5,y+12)
    pendown()
    setheading(45)
    fd(5)
  if lettre == "W":
    penup()
    goto(x,y)
    setheading(60) # vers la droite
    pendown()
    fd(5)
    rt(90)
    for i in range(10):
      fd(1)
      lt(15)
    lt(30)
    for i in range(10):
      lt(25)
      fd(2)
    penup()
    goto(x+2,y+13)
    pendown()
    setheading(0)
    fd(2)
    penup()
    fd(2)
    pendown()
    fd(2)
  if lettre == "f":
    penup()
    goto(x,y)
    setheading(-10)
    pendown()
    fd(2)
    for i in range(9):
      lt(20-2*i)
      fd(2)
    for i in range(9):
      lt(19)
      fd(1)
    fd(22)
    for i in range(9):
      fd(1)
      lt(21)
    for i in range(6):
      fd(2)
      lt(2*i)
    rt(150)
    for i in range(3):
      fd(2)
      lt(20)
  if lettre == "g":
    penup()
    goto(x,y)
    setheading(60) # vers la droite
    pendown()
    fd(4)
    rt(130)
    for i in range(30):
      fd(1)
      lt(18)
    setheading(-90)
    fd(-3)
    fd(14)
    for i in range(9):
      rt(19)
      fd(1)
    for i in range(6):
      rt(20-2*i)
      fd(2)
  if lettre == "h":
    penup()
    goto(x,y+1)
    setheading(40)
    pendown()
    fd(1)
    rt(60)
    for i in range(10):
      lt(20-2*i)
      fd(1.7)
    for i in range(10):
      lt(18)
      fd(1)
    fd(14)
    lt(180)
    for i in range(7):
      fd(1.3)
      rt(25)
    for i in range(3):
      lt(30)
      fd(1)
  if lettre == "i":
    penup()
    goto(x,y)
    setheading(-15)
    pendown()
    for i in range(8):
      lt(14)
      fd(1.3)
    penup()
    fd(2)
    pendown()
    fd(1)
    penup()
    setheading(-90)#rt(180)
    fd(3)
    pendown()
    for i in range(6):
      fd(1.3)
      lt(15)
  if lettre == "j":
    penup()
    goto(x,y)
    setheading(-15)
    pendown()
    for i in range(8):
      lt(14)
      fd(1.3)
    penup()
    fd(2)
    pendown()
    fd(1)
    penup()
    setheading(-90)#rt(180)
    fd(3)
    pendown()
    fd(14)
    for i in range(8):
      rt(26)
      fd(1)
    for i in range(6):
      rt(2*i+4)
      fd(2)
  if lettre == "k":
    penup()
    goto(x,y+2)
    setheading(40)
    pendown()
    fd(1)
    rt(60)
    for i in range(10):
      lt(20-2*i)
      fd(1.7)
    for i in range(10):
      lt(18)
      fd(1)
    fd(15)
    lt(180)
    fd(3)
    for i in range(12):
      fd(1.3)
      rt(30)
    rt(90)
    for i in range(5):
      fd(1)
      rt(10)
    for i in range(4):
      lt(20)
      fd(1)
  if lettre == "l":
    penup()
    goto(x,y)
    pendown()
    setheading(-10)
    for i in range(10):
      lt(20-2*i)
      fd(2)
      #lt(6-i)
    for i in range(5):
      lt(30)
      fd(1)
    for i in range(11):
      fd(2)
      lt(2*i+4)
  if lettre == "m":
    penup()
    goto(x,y)
    pendown()
    setheading(-10)
    for i in range(3):
      fd(0.5)
      lt(34)
    fd(5)
    for j in range(3):
      for i in range(10):
        fd(0.4)
        rt(18)
      fd(6)
      lt(180)
      fd(6)
    fd(-7)
    rt(90)
    fd(2)
  if lettre == "n":
    penup()
    goto(x,y)
    pendown()
    setheading(-10)
    for i in range(3):
      fd(0.5)
      lt(33)
    fd(4)
    for j in range(2):
      for i in range(10):
        fd(0.6)
        rt(18)
      fd(5)
      lt(180)
      fd(5)
    fd(-5)
    rt(90)
    fd(1)
  if lettre == "N":
    penup()
    goto(x,y+3)
    setheading(-90)
    pendown()
    for i in range(10):
      fd(1)
      lt(18)
    fd(15)
    rt(145)
    fd(20)
    lt(145)
    fd(15)
    for i in range(10):
      fd(1)
      rt(18)

  if lettre == "o":
    penup()
    goto(x,y)
    setheading(60) # vers la droite
    pendown()
    fd(4)
    rt(130)
    for i in range(30):
      fd(1)
      lt(18)
    for i in range(7):
      fd(1)
      lt(35)
    fd(5)
  if lettre == "p":
    penup()
    goto(x,y)
    setheading(10)
    pendown()
    for i in range(6):
      fd(1.4)
      lt(15)
    setheading(-90)
    fd(15)
    fd(-15)
    lt(90)
    for i in range(7):
      fd(1)
      rt(30-10*i)
  if lettre == "q":
    penup()
    goto(x,y)
    setheading(60) # vers la droite
    pendown()
    fd(4)
    rt(130)
    for i in range(30):
      fd(1)
      lt(18)
    setheading(-90)
    fd(-4)/255
    fd(18)
    fd(-11)
    lt(80)
    fd(2)
  if lettre == "r":
    penup()
    goto(x,y+1)
    setheading(0)
    pendown()
    for i in range(8):
      fd(1)
      lt(18)
    setheading(0)
    fd(5)
    rt(100)
    for i in range(7):
      fd(1)
      lt(13)
  if lettre == "s":
    penup()
    goto(x,y+1)
    setheading(0)
    pendown()
    for i in range(8):
      fd(1)
      lt(18)
    rt(150)
    for i in range(8):
      fd(1)
      rt(8)
    lt(30)
    fd(2)
    fd(-2)
    rt(90)
    for i in range(8):
      fd(1)
      rt(12)
  if lettre == "t":
    penup()
    goto(x,y)
    setheading(-15)
    pendown()
    for i in range(8):
      lt(13)
      fd(1)
    fd(9)
    fd(-3)
    rt(90)
    fd(5)
    fd(-7)
    fd(2)
    rt(90)
    fd(7)
    for i in range(7):
      lt(15)
      fd(1)

  if lettre == "u":
    penup()
    goto(x,y)
    setheading(-10)
    pendown()
    for i in range(5):
      fd(1)
      lt(20)
    fd(4)
    rt(180)
    fd(3)
    for i in range(7):
      fd(1)
      lt(25)
    fd(5)
    rt(180)
    fd(3)
    for i in range(5):
      fd(1)
      lt(20)
  if lettre == "v":
    penup()
    goto(x,y)
    setheading(45)
    pendown()
    for i in range(3):
      fd(1)
      lt(15)
    fd(2)
    for i in range(5):
      fd(1)
      rt(36)
    fd(3)
    for i in range(5):
      fd(1)
      lt(36)
    fd(3)
    rt(110)
    fd(3)
  if lettre == "w":
    penup()
    goto(x,y)
    setheading(45)
    pendown()
    for i in range(3):
      fd(1)
      lt(15)
    fd(2)
    for i in range(4):
      fd(1)
      rt(45)
    fd(3)
    for i in range(4):
      fd(1)
      lt(45)
    fd(5)
    rt(180)
    fd(4)
    for i in range(5):
      fd(1)
      lt(36)
    fd(4)
    rt(110)
    fd(1)
  if lettre == "x":
    penup()
    goto(x,y)
    setheading(80)
    fd(5)
    pendown()
    for i in range(16):
      fd(1)
      rt(19)
    penup()
    rt(110)
    fd(9)
    pendown()
    rt(240)
    for i in range(13):
      fd(1)
      lt(19)
  if lettre == "y":
    penup()
    goto(x,y)
    setheading(45)
    pendown()
    for i in range(5):
      fd(1)
      lt(9)
    fd(2)
    for i in range(5):
      fd(1)
      rt(36)
    fd(3)
    for i in range(5):
      fd(1.3)
      lt(36)
    fd(4)
    rt(180)
    fd(14)
    for i in range(9):
      rt(19)
      fd(1)
    for i in range(5):
      rt(20-2*i)
      fd(2)
  if lettre == "z":
    penup()
    goto(x,y+1)
    setheading(0)
    pendown()
    for i in range(8):
      fd(1)
      lt(18)
    setheading(0)
    fd(6)
    rt(140)
    for i in range(6):
      fd(1)
      lt(10)
    rt(180)
    for i in range(10):
        fd(0.5)
        rt(19)
    fd(10)
    for i in range(9):
      rt(19)
      fd(1)
    for i in range(3):
      rt(20-2*i)
      fd(2)
    fd(6)
  if lettre == ".":
      penup()
      goto(x+5,y+5)
      pensize(5)
      pendown()
      rt(90)
      for i in range(5):
        fd(1)
        rt(72)
      pensize(taille_initiale)


def dessin():
  hideturtle()
  penup()
  goto(-120,70)
  pensize(3)
  pencolor([170/255,60/255,60/255])
  pendown()
  setheading(210)
  for i in range(50):
    fd(1)
    rt(6)
  fd(h_liste)
  for i in range(50):
    fd(1)
    lt(6)
  for i in range(5):
    rt(6)
    fd(-1)
  setheading(0)
  fd(l_liste)
  for i in range(30):
    fd(1)
    rt(6)
  fd(l_liste)
  fd(-l_liste)
  for i in range(30):
    lt(6)
    fd(-1)
  fd(-5)
  lt(90)
  fd(h_liste-10)
  for i in range(15):
    fd(1)
    lt(6)
  fd(l_liste)

def liste():
  penup()
  pensize(2)
  mot="ma liste de N oWl"
  for rang in range(len(mot)):
    pencolor([12*rang/255,(255-12*rang)/255,(160+rang*5)/255])
    tracer(mot[rang],-95+10*rang,55)
  pensize(1)
  #speed(1)
  mot=". un sapin dEcorE"
  for rang in range(len(mot)):
    pencolor([12*rang/255,(255-12*rang)/255,(160+rang*5)/255])
    tracer(mot[rang],-100+10*rang,30)
  mot=". des jolis cadeaux"
  for rang in range(len(mot)):
    pencolor([(255-12*rang)/255,12*rang/255,(160+rang*5)/255])
    tracer(mot[rang],-100+10*rang,10)
  mot=". un bon repas"
  for rang in range(len(mot)):
    pencolor([(160+5*rang)/255,5*rang/255,(160+rang*5)/255])
    tracer(mot[rang],-100+10*rang,-10)
  mot=". de la neige"
  for rang in range(len(mot)):
    pencolor([12*rang/255,(255-12*rang)/255,(255-rang*12)/255])
    tracer(mot[rang],-100+10*rang,-30)
  mot=". une trotinette"
  for rang in range(len(mot)):
    pencolor([(160+5*rang)/255,(100-5*rang)/255,(255-rang*12)/255])
    tracer(mot[rang],-100+10*rang,-50)
  pensize(2)
  penup()
  goto(70,-40)
  pendown()
  setheading(0)
  fd(1)
  penup()
  fd(4)
  pendown()
  fd(1)
  penup()
  goto(70,-45)
  setheading(-60)
  pendown()
  for i in range(10):
    fd(1)
    lt(12)

def sapin(x,y,orientation):
  penup()
  goto(x,y)
  pensize(4)
  setheading(0+orientation)
  pendown()
  pencolor([140/255,40/255,40/255])#marron

  k=1
  for m in range(2):
    fd(2)
    lt(90*k)
    fd(5)
    pensize(3)
    pencolor([0,255/255,0])#vert

    rt(110*k)
    l=1
    for j in range(7):
      for i in range(8):
        fd(2*l)
        lt(5*k)
      rt(35*k)
      for i in range(10):
        fd(-2*l)
        lt(-5*k)
      lt(50*k)
      l=l*0.7
    setheading(-180+orientation)
    k=-1
    penup()
    goto(x,y)
    pendown()
    pensize(4)
    pencolor([140/255,40/255,40/255])#marron
  penup()#remplissage
  goto(x,y)
  setheading(orientation+90)
  fd(5)
  pendown()
  pencolor([0,255/255,0])#vert
  rt(90)
  fd(8)
  fd(-16)
  fd(8)
  lt(90)
  fd(4)
  rt(90)
  fd(6)
  fd(-12)
  fd(4)
  lt(90)
  fd(15)
  rt(90)
  fd(4)
  rt(90)
  fd(15)



  boule(x,y,10*(2*randint(0,1)-1),5,orientation)
  boule(x,y,-13,15,orientation)
  boule(x,y,7,22,orientation)
  boule(x,y,-2*(2*randint(0,1)-1),30,orientation)
  etoile(x,y,orientation)

def boule(x,y,dx,dy,orientation):
  penup()
  goto(x,y)
  setheading(orientation)
  fd(dx)
  lt(90)
  fd(dy)
  pendown()
  pensize(5)
  pencolor([(127*randint(0,2))/255,(127*randint(0,2))/255,(127*randint(0,2))/255])
  fd(1)
  penup()

def etoile(x,y,orientation):
  penup()
  goto(x,y)
  setheading(90+orientation)
  fd(36)
  pendown()
  pensize(2)
  pencolor([200/255,200/255,0])#jaune doré
  rt(30)
  for i in range(5):
    fd(8)
    lt(144)


def renne(x,y,orientation):
  penup()
  goto(x,y)
  setheading(orientation)
  pendown()
  for k in [-1,1]:
    penup()
    pensize(3)
    goto(x,y)
    pencolor([140/255,40/255,40/255])#marron
    setheading(90+orientation-90*k)
    pendown()
    for i in range(25):
      fd(1)
      lt(5*k)
    for i in range(3):
      fd(1)
      rt(20*k)
    for i in range(5):
      fd(1)
      lt(5*k)
    rt(70*k)#oreilles
    for i in range(10):
      fd(1)
      rt(5*k)
    rt(100*k)
    for i in range(10):
      fd(1)
      rt(5*k)
    rt(100*k)
    for i in range(10):
      fd(1)
      lt(5*k)
    rt(90*k) #début des bois
    for i in range(10):
      fd(1)
      rt(5*k)
    for i in range(10):
      fd(1)
      lt(10*k)
    rt(180*k)
    for i in range(10):
      rt(10*k)
      fd(1)
    rt(70*k)
    for i in range(5):
      fd(1)
      rt(5*k)
    for i in range(5):
      fd(1)
      lt(5*k)
    for i in range(5):
      rt(5*k)
      fd(-1)
    for i in range(5):
      lt(5*k)
      fd(-1)
    lt(70*k)
    for i in range(5):
      lt(5*k)
      fd(1)
    rt(90*k)
    fd(5)
    fd(-5)
    lt(90*k)
    for i in range(5):
      lt(5*k)
      fd(1)
    rt(90*k)
    for i in range(11):
      fd(1)
      lt(8*k)
    lt(90*k)#remplissage
    fd(5)
    pensize(5)
    lt(40*k)
    for i in range(6):
      fd(1)
      rt(20*k)
      for n in range(10):
        fd(1)
        lt(36*k)
    for i in range(8):
      fd(1)
      lt(10*k)
      for n in range(10):
        fd(1)
        lt(36*k)
    for i in range(13):
      fd(1)
      rt(10*k)
      for n in range(10):
        fd(1)
        lt(36*k)
    rt(90*k)
    fd(25)
    penup()
    goto(x,y)
    setheading(90+orientation-90*k)
    lt(85*k)
    fd(10)
    pendown()
    pensize(5)
    pencolor([200/255,140/255,140/255])
    fd(6)#museau
    rt(90*k)
    for i in range(36):
      fd(1)
      rt(10*k)
    lt(90*k)
    penup()
    fd(-16)
    lt(5*k)
    fd(13)
    pensize(5)
    pencolor([255/255,0,0])
    pendown()
    fd(2)#nez
    rt(90*k)
    for i in range(20):
      fd(1)
      rt(18*k)
    lt(90*k)
    penup()
    fd(9)
    rt(90*k)
    fd(4)
    pensize(3)
    pencolor([255/255,255/255,255/255])
    pendown()
    lt(90*k)
    for i in range(3):#blanc oeil
      fd(1)
      for i in range(10):
        fd(1)
        rt(36*k)
    penup()
    pensize(5)
    pencolor([0,0,0])
    fd(-1)
    pendown()
    fd(-1)#pupille
    penup()
    fd(-1)
    rt(90*k)
    fd(11)
    pencolor([200/255,140/255,140/255])
    pensize(3)
    pendown()
    fd(1)#creux oreille

def nez_renne(x,y,orientation,couleur):
  penup()
  goto(x,y)
  setheading(orientation+90)
  fd(14)
  pensize(5)
  pencolor(couleur)
  pendown()
  rt(90)
  for i in range(15):
    fd(1)
    rt(24)
  for i in range(20):
    fd(1)
    rt(18)

def flocon(x,y,orientation,nb=6,etapes=4):
  k=5
  penup()
  goto(x,y)
  setheading(orientation)
  pendown()
  pensize(2)
  pencolor([0,255/255,255/255])
  for i in range(nb):
    for j in range(etapes):
      fd(k)
      lt(45)
      fd(k)
      fd(-k)
      rt(90)
      fd(k)
      fd(-k)
      lt(45)
    fd(-etapes*k)
    lt(360//nb)

def flocon2(x,y,orientation,nb=6,etapes=4):
  k=5
  penup()
  goto(x,y)
  setheading(orientation)
  pendown()
  pensize(2)
  pencolor([0,255/255,255/255])
  for i in range(nb):
    for j in range(etapes):
      fd(k)
      lt(45)
      fd(k)
      lt(90)
      fd(3)
      fd(-3)
      rt(90)
      fd(-k)
      rt(90)
      fd(k)
      rt(90)
      fd(3)
      fd(-3)
      lt(90)
      fd(-k)
      lt(45)
    fd(-etapes*k)
    lt(360//nb)

def flocon3(x,y,orientation,nb=6,etapes=4,angle=30):
  k=5
  penup()
  goto(x,y)
  setheading(orientation)
  pendown()
  pensize(2)
  pencolor([0,255/255,255/255])
  for i in range(nb):
    for j in range(etapes):
      fd(k)
      lt(45)
      fd(k)
      rt(angle)
      fd(3)
      fd(-3)
      lt(angle)
      fd(-k)
      rt(90)
      fd(k)
      lt(angle)
      fd(3)
      fd(-3)
      rt(angle)
      fd(-k)
      lt(45)
    fd(-etapes*k)
    lt(360//nb)

def guirlande(x,y,dx,dy,orientation):
  penup()
  goto(x,y)
  setheading(orientation+20)
  pensize(5)
  j=0
  k=1
  while j<dx+dy:
    for i in range(5):
      fd(10)
      rt(8*k)
      pencolor(choice([[255/255,0,0],[0,255/255,0],[0,0,255/255],[255/255,255/255,0],[255/255,0,255/255],[0,255/255,255/255]]))
      pendown()
      fd(1)
      penup()
    k=-k
    j+=12*5


def clignotement(n):
  for i in range(n):
    for (x,y,orientation) in [(133,-50,10),(130,60,-30),(-145,25,-30),(-137,-90,-10)]:
      boule(x,y,10*(2*randint(0,1)-1),5,orientation)
    nez_renne(175,0,20,[255/255,255/255,0])
    guirlande(-117,90,h_liste,0,-90)
    for (x,y,orientation) in [(133,-50,10),(130,60,-30),(-145,25,-30),(-137,-90,-10)]:
      boule(x,y,-13,15,orientation)
    nez_renne(-170,-30,-15,[255/255,255/255,0])
    guirlande(103,96,h_liste,0,-90)
    for (x,y,orientation) in [(133,-50,10),(130,60,-30),(-145,25,-30),(-137,-90,-10)]:
      boule(x,y,7,22,orientation)
    nez_renne(175,0,20,[255/255,0,0])
    guirlande(-118,86,0,l_liste,0)
    for (x,y,orientation) in [(133,-50,10),(130,60,-30),(-145,25,-30),(-137,-90,-10)]:
      boule(x,y,-2*(2*randint(0,1)-1),30,orientation)
    nez_renne(-170,-30,-15,[255/255,0,0])

dessin()
liste()

sapin(133,-50,10)
sapin(130,60,-30)
sapin(-145,25,-30)
sapin(-137,-90,-10)

renne(175,0,20)
renne(-170,-30,-15)

guirlande(-117,90,h_liste,0,-90)
guirlande(103,96,h_liste,0,-90)
guirlande(-118,86,0,l_liste,0)

flocon(-165,85,70,8,4)
flocon(75,-15,25,6,3)
flocon2(-170,-60,15,8,3)
flocon3(20,-80,25,6,3,-30)
flocon3(170,-75,-10,6,3,30)
clignotement(10)
Télécharger




Classes Graph 90+E - Un matin de Noël à 10h42 - cent20

Go to top

15179cent20, enseignant en Mathématiques et NSI au lycée privé catholique Louis Pasteur à Avignon, a brillamment oeuvré pour que la production de sa classe soit prête dès la date butoir initiale du 7 janvier. Il a en effet demandé à ses élèves de réaliser chacun un petit dessin en DM pendant les vacances de Noël, avec la contrainte qu'il soit compatible avec la bibliothèque turtle de la Graph 90+E. Une fois les DM remis, il lui a suffi de sélectionner les meilleures productions et les intégrer à un unique script. Un grand stratège que ce cent20 ! :bj:

Ici encore du grand art à la mesure de l'investissement de Casio dans cet événement ; le dessin est encore une fois animé.

cent20 a écrit:Nous sommes le 25 décembre, il est précisément 10h42. Dehors il neige, d'ailleurs le bonhomme de Neige construit par les enfants la veille peut être aperçu à travers la fenêtre. Dans le salon, le feu a été attisé, il illumine la pièce pour permettre aux enfants d'ouvrir leurs cadeaux dans une ambiance chaleureuse. Le père noël, qui est passé la veille, a d'ailleurs oublié son bonnet à côté de la cheminée, mais heureusement il n'a pas oublié les cadeaux qui attendent d'être déballés au pied du sapin. Aujourd'hui, c'est Noël !


Voici pour le détail de la construction de l'animation :


Tout petit léger détail, plusieurs appels turtle.pensize() au sein du script utilisent une épaisseur de crayon supérieure à 5, taille non supportée chez Casio. Dans ce cas à l'exécution, la taille est automatiquement ramenée à 5.
Code: Tout sélectionner
# Participation au Jeu concours de Noël de Casio
"""
Catégorie Classe : Elèves du Lycée Louis Pasteur d'Avignon
Professeurs : Vincent ROBERT, Raphaël CLEMENTE
Elèves : 15 élèves citées dans ce document, sous la forme Prénom N.
(Le listing complet avec les prénoms et photos des carnets vous sera communiqué sur demande,
comme prévu à l'article 6 des modalités de participation.)
https://www.casio-education.fr/actualites/jeu-concours-casio-de-noel/
"""
# ------------------------------------------------------------


# Un projet de classe avec des objets paramétrables
"""
Ayant découvert ce concours par sur  site tiplanet.org,
que nous remercions de diffuser régulièrement les annonces des différents constructeurs de calculatrices,
nous avons demandé à nos élèves de programmer en python des "cadeaux de Noël".
Plus précisément, après la démonstration en classe de la construction d'un sapin de Noël,
ils avaient pour consigne de créer une fonction pour rendre la construction de leur cadeau paramétrable
afin que l'on puisse le positionner sur l'écran au coordonnées (x,y) et choisir la taille de l'objet.
"""
# ------------------------------------------------------------


# Importation des librairies nécessaires
# ----------------------------------------------------
from turtle import *
from math import *


# Une étoile par Rémi A.
# ----------------------------------------------------
def etoile(x, y, longueur, epaisseur, couleur_1=(0.81, 0.06, 0.06), couleur_2=(0.98, 0.93, 0.18)):
    compteur = int(longueur * 1.1)
    if compteur > 0:
        if compteur % 2 == 0:
            coul = couleur_2
        else:
            coul = couleur_1
        penup()
        goto(x, y)
        pensize(epaisseur)
        pencolor(coul)
        pendown()
        left(8)
        speed(0)
        for repetition in range(5):
            forward(longueur)
            left(54)
            forward(longueur)
            right(126)
        right(8)
        etoile(x + 1.45 * epaisseur, y - 0.5 * epaisseur, longueur - epaisseur, epaisseur + 1, couleur_1, couleur_2)


# Un cadeau ouvert par Rémi A.
# ----------------------------------------------------
def ruban(x, y, longueur, epaisseur, couleur=(1.0, 0.89, 0.08)):
    compteur = int(longueur * 0.2)
    if compteur > 0:
        penup()
        goto(x, y)
        pensize(epaisseur)
        pendown()
        speed(0)
        pencolor(couleur)
        for i in range(2):
            forward(4 * longueur)
            left(120)
            forward(longueur / 10)
            right(60)
            forward(longueur / 10)
            left(120)
        ruban(x + epaisseur, y, longueur - 0.5 * epaisseur, epaisseur, couleur)


def contour_cad(x, y, longueur, epaisseur, couleur=(0.81, 0.06, 0.06)):
    penup()
    goto(x, y)
    pensize(epaisseur)
    pendown()
    speed(0)
    pencolor(couleur)
    for i in range(4):
        forward(longueur)
        left(90)
    forward(longueur)
    left(45)
    forward(sqrt(longueur ** 2 / 3))
    left(45)
    forward(longueur)
    left(90)
    forward(longueur)
    left(45)
    forward(sqrt(longueur ** 2 / 3))
    left(45)
    forward(longueur)
    left(90)
    penup()
    goto(x + longueur, y + longueur)
    left(45)
    pendown()
    forward(sqrt(longueur ** 2 / 3))
    right(45)


def fond_cad(x, y, longueur, epaisseur, couleur=(0.94, 0.06, 0.06)):
    compteur = int(longueur * 1.1)
    if compteur > 0:
        penup()
        goto(x, y)
        pensize(epaisseur)
        pendown()
        speed(0)
        pencolor(couleur)
        for compteur in range(2):
            forward(longueur)
            left(45)
            forward(sqrt(longueur ** 2 / 3))
            left(45)
            forward(longueur)
            left(90)
        fond_cad(x + 0.5 * epaisseur, y + 0.5 * epaisseur, longueur - 0.5 * epaisseur, epaisseur + 1, couleur)


def carton(x, y, longueur, epaisseur, couleur=(0.45, 0.16, 0.07)):
    compteur = int(longueur * 1.1)
    if compteur > 0:
        penup()
        goto(x, y)
        pencolor((0.45, 0.16, 0.07))
        pendown()
        pensize(epaisseur)
        speed(0)
        for i in range(2):
            forward(longueur)
            left(45)
            forward(sqrt(longueur ** 2 / 4))
            left(135)
        carton(x, y, longueur - 0.5 * epaisseur, epaisseur, couleur)


def couvercle(x, y, longueur, epaisseur, couleur=(0.94, 0.06, 0.06)):
    compteur = int(longueur * 1.1)
    if compteur > 0:
        penup()
        goto(x, y)
        pensize(epaisseur)
        pendown()
        speed(0)
        pencolor(couleur)
        for compteur in range(2):
            left(45)
            forward(sqrt(longueur ** 2 / 3))
            left(100)
            forward(longueur)
            left(35)
        couvercle(x, y, longueur - 0.5 * epaisseur, epaisseur, couleur)


def cadeau(x, y, longueur, epaisseur, couleur_fond=(0.94, 0.06, 0.06), couleur_contour=(0.81, 0.06, 0.06),
           couleur_ruban=(1.0, 0.89, 0.08)):
    ruban(x - longueur * 1.25, y + 0.15 * longueur, longueur, epaisseur, couleur_ruban)
    fond_cad(x, y, longueur, epaisseur, couleur_fond)
    contour_cad(x, y, longueur, epaisseur, couleur_contour)
    carton(x + 2 * epaisseur, y + longueur + epaisseur, longueur - 2 * epaisseur, epaisseur)
    couvercle(x + longueur, y + longueur, longueur, epaisseur, couleur_fond)
    pencolor(couleur_contour)
    pensize(epaisseur)
    for compteur in range(2):
        left(45)
        forward(sqrt(longueur ** 2 / 3))
        left(100)
        forward(longueur)
        left(35)
    penup()
    goto(x, y)


# Un bonhomme de neige par Alexandre B.
# ----------------------------------------------------
def bdn(x, y, taille, vitesse, col_bdn="black", col_nez="orange", remplissage="oui"):
    speed(0)
    if remplissage == "oui":
        penup()
        pencolor("white")
        goto(x, y + taille)
        pendown()
        pensize(taille * 2)
        circle(taille * 0.01)
    pensize(taille / 50)
    penup()
    goto(x, y)
    pendown()
    pencolor(col_bdn)
    pensize(taille / 50)
    """circle(taille) # rond 1
    if remplissage == "oui":
        penup()
        pencolor("white")
        goto(x, y + 2 * taille + taille * 0.8)
        pendown()
        pensize(taille * 2 * 0.8)
        circle(taille *0.01)
    pensize(taille / 50)"""
    penup()
    goto(x, y + 2 * taille)
    pendown()
    pencolor(col_bdn)
    circle(taille * 0.8)  # rond 2
    if remplissage == "oui":
        penup()
        pencolor("white")
        goto(x, y + 2 * taille + 2 * taille * 0.8 + taille * 0.6)
        pendown()
        pensize(taille * 2 * 0.6)
        circle(taille * 0.01)
    pensize(taille / 50)
    penup()
    goto(x, y + 2 * taille + 2 * taille * 0.8)
    pendown()
    pencolor(col_bdn)
    circle(taille * 0.6)  # rond 3
    penup()
    right(90)
    forward((2 * taille * 0.8) / 8)
    right(90)
    pendown()
    circle(taille * 0.1)  # bouton 1
    penup()
    left(90)
    forward((2 * taille * 0.8) / 4)
    right(90)
    pendown()
    circle(taille * 0.1)  # bouton 2
    penup()
    left(90)
    forward((2 * taille * 0.8) / 4)
    right(90)
    pendown()
    circle(taille * 0.1)  # bouton 3
    penup()
    goto(x, y + 2 * taille + 2 * taille * 0.8)
    forward((2 * taille * 0.6) / 4)
    right(90)
    forward((2 * taille * 0.6) / 4)
    pendown()
    circle(taille * 0.05)  # bouche 1
    penup()
    right(90)
    forward((2 * taille * 0.6) / 8)
    right(90)
    forward((2 * taille * 0.6) / 8)
    right(180)
    pendown()
    circle(taille * 0.05)  # bouche 2
    penup()
    right(90)
    forward((2 * taille * 0.6) / 6)
    right(90)
    forward((2 * taille * 0.6) / 16)
    right(180)
    pendown()
    circle(taille * 0.05)  # bouche 3
    penup()
    goto(x, y + 2 * taille + 2 * taille * 0.8)
    forward((2 * taille * 0.6) / 4)
    right(90)
    forward((2 * taille * 0.6) / 4)
    right(90)
    pendown()
    circle(taille * 0.05)  # bouche 4
    penup()
    forward((2 * taille * 0.6) / 8)
    right(90)
    forward((2 * taille * 0.6) / 8)
    left(90)
    pendown()
    circle(taille * 0.05)  # bouche 5
    penup()
    goto(x, y + 2 * taille + 2 * taille * 0.8)
    pencolor(col_nez)
    right(180)
    forward((2 * taille * 0.6) / 2.4)
    pendown()
    forward((2 * taille * 0.6) / 6)  # nez
    right(100)
    forward((2 * taille * 0.6) / 2)
    right(160)
    forward((2 * taille * 0.6) / 2)
    penup()
    pencolor(col_bdn)
    goto(x, y + 2 * taille + 2 * taille * 0.8)
    forward((2 * taille * 0.6) / 8)
    right(90)
    forward((2 * taille * 0.6) / (4 / 3))
    right(180)
    pendown()
    circle(taille * 0.05)  # oeil 1
    penup()
    goto(x, y + 2 * taille + 2 * taille * 0.8)
    left(90)
    forward((2 * taille * 0.6) / 4)
    left(90)
    forward((2 * taille * 0.6) / (24 / 17))
    right(180)
    pendown()
    circle(taille * 0.05)  # oeil 2
    penup()
    goto(x, y + 2 * taille + 2 * taille * 0.8 + 2 * taille * 0.6)
    right(100)
    forward((2 * taille * 0.6) / 2.4)
    right(180)
    pendown()
    forward((2 * taille * 0.6) / 1.2)  # chapeau
    left(90)
    forward((2 * taille * 0.6) / 7.5)
    left(90)
    forward((2 * taille * 0.6) / 1.2)
    left(90)
    forward((2 * taille * 0.6) / 7.5)
    right(180)
    forward((2 * taille * 0.6) / 7.5)
    right(90)
    forward((2 * taille * 0.6) / 12)
    left(90)
    forward((2 * taille * 0.6) / 3)
    right(90)
    forward((2 * taille * 0.6) / 1.5)
    right(90)
    forward((2 * taille * 0.6) / 3)
    penup()
    goto(x + taille * 0.8, y + 2 * taille + taille * 0.8)
    left(120)
    pensize(taille / (100 / 3))
    pendown()
    forward((2 * taille * 0.8) / 1.6)  # bras 1
    backward((2 * taille * 0.8) / 6.4)
    right(30)
    forward((2 * taille * 0.8) / (16 / 3))
    backward((2 * taille * 0.8) / (16 / 3))
    left(30)
    backward((2 * taille * 0.8) / 8)
    left(40)
    forward((2 * taille * 0.8) / (16 / 3))
    right(40)
    penup()
    goto(x - taille * 0.8, y + 2 * taille + taille * 0.8)
    left(120)
    pendown()
    forward((2 * taille * 0.8) / 1.6)  # bras 2
    backward((2 * taille * 0.8) / 6.4)
    right(35)
    forward((2 * taille * 0.8) / (16 / 3))
    backward((2 * taille * 0.8) / (16 / 3))
    left(35)
    backward((2 * taille * 0.8) / 8)
    left(35)
    forward((2 * taille * 0.8) / (16 / 3))
    right(185)


# Une montre par Alexandre B.
# ----------------------------------------------------
def montre(x, y, taille, vitesse, col1="black", col2="black", col3="black"):
    pencolor(col1)
    speed(0)
    pensize(taille / 50)
    penup()
    goto(x, y - taille * 2 * 0.4)
    pendown()
    forward(taille / (10 / 3))
    left(90)
    forward(taille / (2 / 7))
    left(90)
    forward(taille / (5 / 3))
    left(90)
    forward(taille / (2 / 7))
    left(90)
    forward(taille / (10 / 3))
    penup()
    goto(x, y - taille * 2 * 0.4)
    backward(taille / 5)
    left(90)
    for i in range(6):
        penup()
        forward(taille / 10)
        pendown()
        circle(taille * 0.025)
    penup()
    goto(x, y - taille * 2 * 0.4)
    right(90)
    forward(taille / 5)
    left(90)
    for i in range(6):
        penup()
        forward(taille / 10)
        pendown()
        right(180)
        circle(taille * 0.025)
        right(180)
    penup()
    goto(x, y - taille * 2 * 0.4 + taille / (2 / 7))
    right(90)
    backward(taille / 5)
    right(90)
    for i in range(6):
        penup()
        forward(taille / 10)
        pendown()
        right(180)
        circle(taille * 0.025)
        right(180)
    penup()
    goto(x, y - taille * 2 * 0.4 + taille / (2 / 7))
    left(90)
    forward(taille / 5)
    right(90)
    for i in range(6):
        penup()
        forward(taille / 10)
        pendown()
        circle(taille * 0.025)
    left(90)
    penup()
    goto(x, y + taille)
    pensize(taille * 2 + taille * 2 * 0.1)
    pencolor("white")
    pendown()
    circle(taille * 0.01)
    penup()
    goto(x, y)
    pendown()
    pensize(2)
    pencolor(col2)
    circle(taille)
    penup()
    goto(x, y - taille * 0.1)
    pendown()
    circle(taille + taille * 0.1)
    penup()
    goto(x, y)
    left(90)
    forward(taille / 10)
    pensize(taille / 20)
    right(90)
    forward(taille / (20 / 3))
    left(90)
    pencolor(col3)
    for i in range(12):
        pendown()
        forward(taille / 5)
        right(60)
        penup()
        forward(taille / (20 / 7))
        left(90)
        pendown()
        backward(taille / 5)
    penup()
    goto(x, y + taille)
    left(60)
    pendown()
    backward(taille / 10)
    forward(taille / 2.5)
    backward(taille / (10 / 3))
    left(70)
    backward(taille / 10)
    forward(taille / 2)
    right(220)


# Un cadeau fermé par Raphaël C.
"""Presque un homonyme de l'enseignant, c'est néanmoins un élève"""
# ----------------------------------------------------

def contour(x, y, longueur, epaisseur, couleur=(0.81, 0.06, 0.06)):
    penup()
    goto(x, y)
    pensize(epaisseur)
    pendown()
    speed(0)
    pencolor(couleur)
    for i in range(4):
        forward(longueur)
        left(90)
    forward(longueur)
    left(45)
    forward(sqrt(longueur ** 2 / 3))
    left(45)
    forward(longueur)
    left(90)
    forward(longueur)
    left(45)
    forward(sqrt(longueur ** 2 / 3))
    left(45)
    forward(longueur)
    left(90)
    penup()
    goto(x + longueur, y + longueur)
    left(45)
    pendown()
    forward(sqrt(longueur ** 2 / 3))
    right(45)


def fond(x, y, longueur, epaisseur, couleur=(0.94, 0.06, 0.06)):
    compteur = int(longueur * 1.1)
    if compteur > 0:
        penup()
        goto(x, y)
        pensize(epaisseur)
        pendown()
        speed(0)
        pencolor(couleur)
        for compteur in range(2):
            forward(longueur)
            left(45)
            forward(sqrt(longueur ** 2 / 3))
            left(45)
            forward(longueur)
            left(90)
        fond(x + 0.5 * epaisseur, y + 0.5 * epaisseur, longueur - 0.5 * epaisseur, epaisseur + 1, couleur)


def noeud(x, y, longueur, epaisseur, couleur_n=(0.44, 0.44, 0.44)):
    penup()
    pensize(epaisseur * 1.15)
    pencolor(couleur_n)
    goto(x + longueur // 2, y)
    right(270)
    pendown()
    forward(longueur // 2)
    right(90)
    forward(longueur // 2)
    right(180)
    forward(longueur)
    right(180)
    forward(longueur // 2)
    left(90)
    forward(longueur // 2)
    right(45)
    forward(sqrt(longueur ** 2 / 3))
    right(180)
    forward((sqrt(longueur ** 2 / 3)) // 2)
    right(45)
    forward((sqrt(longueur ** 2 / 3)) * 0.85)
    right(180)
    forward(sqrt(longueur ** 2))
    right(90)
    forward(sqrt(longueur ** 2))
    right(180)
    forward((sqrt(longueur ** 2 / 3)) * 0.85)
    right(45)
    forward((sqrt(longueur ** 2 / 3)) // 2)
    right(180)
    forward(sqrt(longueur ** 2 / 3))


def curve(longueur):
    for i in range(200):
        right(1)
        forward(longueur / 200)


def heart(x, y, longueur):
    penup()
    goto(x + longueur // 8 + (sqrt(longueur ** 2 / 3)), y + longueur + (sqrt(longueur ** 2 / 3) // 2))
    right(225)
    pendown()
    left(140)
    forward(longueur // 2)
    curve(longueur)
    left(120)
    curve(longueur)
    forward(longueur // 2)


def cadeauf(x, y, longueur, epaisseur, couleur_n=(0.44, 0.44, 0.44), couleur_fond=(0.94, 0.06, 0.06),
            couleur_contour=(0.81, 0.06, 0.06)):
    speed(0)
    fond(x, y, longueur, epaisseur, couleur_fond)
    contour(x, y, longueur, epaisseur, couleur_contour)
    noeud(x, y, longueur, epaisseur, couleur_n)
    heart(x, y, longueur)
    penup()
    right(225)
    setheading(0)


# Une bougie par Raphaël C.
"""Presque un homonyme de l'enseignant, c'est néanmoins un élève"""
# ----------------------------------------------------
def rect(x, y, long, epai, couleur_r=(0.66, 0.02, 0.02)):
    penup()
    goto(x, y)
    pendown()
    long2 = 3 * long
    pencolor(couleur_r)
    pensize(epai)
    for i in range(long // 4):
        for j in range(4):
            if j % 2 == 0:
                forward(long)
                left(90)
            else:
                forward(long2)
                left(90)
        long -= 4
        long2 -= 4


def c_beige(x, y, long, epai, couleur_c=(1, 0.96, 0.83)):
    c = long // 3.846
    pensize(epai * (long / 67.5))
    penup()
    goto(x + long // 2, y + long * 3.06)
    pendown()
    pencolor(couleur_c)
    while c > 1:
        circle(c)
        penup()
        goto(x + long // 2, y + long * 3.1)
        pendown()
        c -= 1


def bord_fla(x, y, long, epai, couleur_bf=(0.94, 0, 0.008)):
    pensize(epai * (long / 100))
    penup()
    goto(x + long // 1.25, y + long * 3.38)
    pendown()
    pencolor(couleur_bf)
    left(90)
    circle(long / 0.7, long // 1.25)
    penup()
    goto(x + long // 5, y + long * 3.38)
    pendown()
    right(40)
    circle(-(long / 0.7), long // 1.25)


def int_fla(x, y, long, epai, couleur_if=(1, 0.54, 0.08)):
    penup()
    goto(x + long // 2, y + long * 3.64)
    pendown()
    pensize(epai * (long / 41.6))
    pencolor(couleur_if)
    right(45)
    circle(long / 8.3)


def int_fla_bleu(x, y, long, epai, couleur_ifb=(0.31, 0.49, 0.82)):
    penup()
    goto(x + long // 2, y + long * 3.06)
    pendown()
    pensize(epai * (long / 41.6))
    pencolor(couleur_ifb)
    circle(long / 16.67)


def mech(x, y, long, epai, couleur_m=(0, 0, 0)):
    penup()
    goto(x + long // 2, y + long * 3)
    pendown()
    pencolor(couleur_m)
    pensize(epai * (long // 250))
    left(85)
    forward(long * 0.5)


def bougie_finale(x, y, long, epai):
    speed(0)
    rect(x, y, long, epai, couleur_r=(0.66, 0.02, 0.02))
    c_beige(x, y, long, epai, couleur_c=(1, 0.96, 0.83))
    bord_fla(x, y, long, epai, couleur_bf=(0.94, 0, 0.008))
    int_fla(x, y, long, epai, couleur_if=(1, 0.54, 0.08))
    int_fla_bleu(x, y, long, epai, couleur_ifb=(0.31, 0.49, 0.82))
    mech(x, y, long, epai, couleur_m=(0, 0, 0))
    penup()
    right(90)


# Un flocon par Ethan G.
# ----------------------------------------------------
def flocon(x, y, longueur1, longueur2, epaisseur, angle, couleur):
    pencolor(couleur)
    pensize(epaisseur)
    for i in range(9):
        penup()
        goto(x, y)
        pendown()
        left(angle)
        forward(longueur1)
        left(20)
        forward(longueur2)
        backward(longueur2)
        right(40)
        forward(longueur2)
        left(60)


# Une cheminée par Aël D.
# ----------------------------------------------------
def flamme(x=0, y=0, taille=100, angle=0, couleur="orange", epaisseur=5):
    right(angle)
    pensize(epaisseur)
    pencolor(couleur)
    penup()
    goto(x, y)
    pendown()
    for i in range(floor(taille / 2)):
        forward(i)
        forward(-i)
        penup()
        left(90)
        forward(1)
        right(90)
        pendown()
    for j in range(floor(taille)):
        forward(floor(taille / 2) - floor(j / 2))
        forward(-(floor(taille / 2) - floor(j / 2)))
        penup()
        left(90)
        forward(1)
        right(90)
        pendown()
    penup()
    goto(0, 0)
    right(-angle)


def flamme2(x=0, y=0, taille=100, angle=0, couleur="orange", epaisseur=5):
    right(angle)
    pensize(epaisseur)
    pencolor(couleur)
    penup()
    goto(x, y)
    pendown()
    for i in range(floor(taille / 2)):
        forward(-i)
        forward(i)
        penup()
        left(90)
        forward(1)
        right(90)
        pendown()
    for j in range(floor(taille)):
        forward(-(floor(taille / 2) - floor(j / 2)))
        forward((floor(taille / 2) - floor(j / 2)))
        penup()
        left(90)
        forward(1)
        right(90)
        pendown()
    penup()
    goto(x, y)
    right(-angle)


def buche(x=0, y=0, taille=100, angle=0, epaisseur=20, couleur="brown"):
    right(angle)
    pencolor(couleur)
    pensize(floor(epaisseur))
    penup()
    goto(x, y)
    pendown()
    forward(taille)
    penup()
    right(-angle)
    goto(x, y)
    pendown()


# pour mettre une valeur à l'échelle
def ech(taille, x):
    return x / 150 * taille


def feu(x=0, y=0, taille=150, angle=0, couleurbuche1="#4f0000", couleurbuche2="#591909", couleurfeu1="#de910d",
        couleurfeu2="#d15000"):
    penup()
    goto(x, y)
    pendown()
    right(angle)
    epaisseur = ech(taille, 20)
    buche(x - ech(taille, 100), y - ech(taille, 10), taille, angle + 10, epaisseur, couleurbuche1)
    buche(x + ech(taille, 100), y - ech(taille, 10), -taille, angle - 10, epaisseur, couleurbuche2)
    flamme2(x - ech(taille, 35), y, floor(taille / 2), angle - 40, couleurfeu1, floor(epaisseur / 4))
    flamme(x + ech(taille, 35), y, floor(taille / 2), angle + 40, couleurfeu2, floor(epaisseur / 4))
    flamme2(x - ech(taille, 75), y, floor(taille / 4), angle - 42, couleurfeu2, floor(epaisseur / 4))
    flamme(x + ech(taille, 75), y, floor(taille / 4), angle + 42, couleurfeu1, floor(epaisseur / 4))
    flamme2(x + 0, y + 0, taille, angle - 5, couleurfeu2, floor(epaisseur / 4))
    flamme(x + 0, y + 0, taille, angle + 5, couleurfeu2, floor(epaisseur / 4))
    flamme2(x - ech(taille, 70), y + ech(taille, 60), floor(taille / 4), angle - 17, couleurfeu1, floor(epaisseur / 4))
    flamme(x + ech(taille, 70), y + ech(taille, 60), floor(taille / 4), angle + 17, couleurfeu1, floor(epaisseur / 4))


def cheminee(x=0, y=0, taille=150, angle=0, couleur1=(92 / 255, 16 / 255, 6 / 255),
             couleurbuche1=(69 / 255, 33 / 255, 25 / 255), couleurbuche2=(79 / 255, 31 / 255, 21 / 255),
             couleurfeu1=(222 / 255, 145 / 255, 13 / 255), couleurfeu2=(209 / 255, 80 / 255, 0)):
    pencolor(couleur1)
    for i in range(floor(taille / 10)):
        left(90)
        penup()
        goto(x - floor(taille / 2) + i, y)
        pendown()
        forward(taille + i)
        for j in range(2):
            right(angle + 90)
            forward(taille + j)  ## modif avant i
        penup()
        left(90)
    left(90)
    penup()
    goto(x - floor(taille / 2), y)

    forward(ech(taille, 20))
    right(angle + 90)
    pendown()
    feu(position()[0] + ech(taille, 75), position()[1], ech(taille, 60), angle, couleurbuche1, couleurbuche2,
        couleurfeu1, couleurfeu2)
    penup()


# Un bonnet de Noël par Aël D.
# ----------------------------------------------------
def bonnet(x: object = 0, y: object = 0, angle: object = 0, taille: object = 42, couleur1: object = "red", couleur2: object = (0.80859375, 0.8984375, 0.88671875)) -> object:
    right(angle)
    pencolor(couleur1)
    penup()
    goto(x, y)
    pendown()
    for j in range(taille, 0, -1):
        forward(j)
        forward(-j)
        penup()
        left(90)
        forward(1)
        right(90)
        pendown()
    left(-90)

    right(90)
    for i in range(floor(taille / 2), 0, -1):
        forward(i)
        if i == floor(taille / 2):
            x0, y0 = position()
        forward(-i)
        penup()
        left(90)
        forward(1)
        right(90)
        pendown()

    goto(x0, y0)
    pencolor(couleur2)
    pensize(floor(taille / 5))
    circle(1)
    penup()
    goto(x, y)
    right(180)
    pendown()
    forward(taille)


# Une guirlande avec des boules par Gabin P.
# ----------------------------------------------------
class Boule:
    def __init__(self, x, y, t, t_pen=1, col_boule="black", col_carre="black", col_triangle="black"):
        self.x_abs = x
        self.y_ord = y
        self.couleur_boule = col_boule
        self.couleur_carre = col_carre
        self.couleur_triangle = col_triangle
        self.taille = t
        self.taille_pen = t_pen

    def carre_boule(self):
        pensize(self.taille_pen)
        pencolor(self.couleur_carre)
        goto(self.x_abs - self.taille, self.y_ord + self.taille)
        goto(self.x_abs, self.y_ord + 2 * self.taille)
        goto(self.x_abs + self.taille, self.y_ord + self.taille)
        goto(self.x_abs, self.y_ord)
        pencolor(self.couleur_boule)

    def triangle_boule(self):
        pencolor(self.couleur_triangle)
        pensize(self.taille_pen)
        goto(self.x_abs - 0.5 * self.taille, self.y_ord + 1.5 * self.taille)
        goto(self.x_abs + self.taille, self.y_ord + self.taille)
        goto(self.x_abs - 0.5 * self.taille, self.y_ord + 0.5 * self.taille)
        goto(self.x_abs + 0 * self.taille, self.y_ord + 2 * self.taille)
        goto(self.x_abs + 0.5 * self.taille, self.y_ord + 0.5 * self.taille)
        goto(self.x_abs - self.taille, self.y_ord + self.taille)
        goto(self.x_abs + 0.5 * self.taille, self.y_ord + 1.5 * self.taille)
        goto(self.x_abs, self.y_ord)
        pencolor(self.couleur_boule)

    def affiche_boule(self):
        pencolor(self.couleur_boule)
        penup()
        goto(self.x_abs, self.y_ord)
        pendown()
        pensize(self.taille_pen)
        circle(self.taille)
        self.carre_boule()
        self.triangle_boule()
        penup()
        goto(self.x_abs - 4, self.y_ord + 2 * self.taille)
        pendown()
        goto(self.x_abs - 4, self.y_ord + 2 * self.taille + 4)
        left(90)
        circle(-4, 180)
        goto(self.x_abs + 4, self.y_ord + 2 * self.taille + 4)
        goto(self.x_abs + 4, self.y_ord + 2 * self.taille)
        setheading(0)
        penup()
        goto(self.x_abs, self.y_ord + 0.675 * self.taille)
        pendown()
        circle(self.taille * 0.32)
        penup()

    def allume_boule(self, couleur):
        penup()
        pencolor(couleur)
        goto(self.x_abs, self.y_ord + 0.675 * self.taille)
        pensize(5)
        rayon_petit_cercle = self.taille * 0.32
        goto(self.x_abs, self.y_ord + 0.675 * self.taille + 0.5 * rayon_petit_cercle)
        pensize(rayon_petit_cercle - 1)
        pendown()
        circle(0.5 * rayon_petit_cercle)
        penup()

    def eteint_boule(self):
        pencolor("white")
        goto(self.x_abs, self.y_ord + 0.675 * self.taille)
        pensize(5)
        rayon_petit_cercle = self.taille * 0.32
        goto(self.x_abs, self.y_ord + 0.675 * self.taille + 0.5 * rayon_petit_cercle)
        pensize(rayon_petit_cercle - 1)
        pendown()
        circle(0.5 * rayon_petit_cercle)
        penup()


class Guirlande:
    def __init__(self, boule):
        self.boule = boule
        self.boule_prec = None
        self.boule_suiv = None

    def ajoute_boule(self, boule):
        self.boule_suiv = Guirlande(boule)
        self.boule_suiv.boule_prec = self

    def affiche_guirlande(self):
        pendown()
        self.boule.affiche_boule()
        if type(self.boule_suiv) is not Guirlande:
            penup()
        else:
            self.boule_suiv.affiche_guirlande()

    def clignotement_guirlande(self, couleur, repetition=2):
        pendown()
        sens = 0
        temp_self = self
        while repetition != 0:
            if sens == 0:
                self.boule.allume_boule(couleur)
                temp_self = self
                self = self.boule_suiv
                for i in range(9999):
                    pass
            elif sens == 1:
                self.boule.eteint_boule()
                temp_self = self
                self = self.boule_prec

            if type(self) is not Guirlande and sens == 0:
                sens = 1
                repetition -= 1
                self = temp_self
            elif type(self) is not Guirlande and sens == 1:
                repetition -= 1
                self = temp_self
                sens = 0


# Un sapin  par Gabin P.
# ----------------------------------------------------
def sapin(x_dep, y_dep):
    penup()
    goto(x_dep, y_dep)
    pendown()
    pensize(5)
    pencolor((0.03, 0.32, 0.165))
    left(135)
    forward(22)
    left(90)
    forward(42)
    temp_guirlande = Guirlande(
        Boule(xcor(), ycor() - 20, 10, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796)))
    left(135)
    forward(20)
    left(225)
    forward(42)
    temp_guirlande.ajoute_boule(
        (Boule(xcor(), ycor() - 20, 10, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796))))
    left(135)
    forward(20)
    left(225)
    forward(42)
    temp_guirlande.boule_suiv.ajoute_boule(
        (Boule(xcor(), ycor() - 20, 10, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796))))
    left(135)
    forward(62)
    penup()
    pencolor((0.325, 0.207, 0.039))
    goto(xcor() - 13, ycor())
    pendown()
    left(-90)
    forward(42)
    goto(xcor() - 5, ycor())
    left(180)
    forward(42)
    setheading(0)
    #temp_guirlande.affiche_guirlande()


# Une fenêtre par le prof, les élèves ayant choisi des items plus complexes il me restait la fenêtre !
# ----------------------------------------------------
def fenetre(x, y, longueur=90, hauteur=80, epaisseur=5, couleur=(155 / 256, 114 / 256, 49 / 256)):
    penup()
    goto(x, y)
    pendown()
    pensize(epaisseur)
    pencolor(couleur)
    for _ in range(2):
        left(90)
        forward(hauteur)
        left(90)
        forward(longueur)
    left(180)
    forward(longueur // 2)
    right(90)
    forward(hauteur)
    setheading(0)


# Une haltère par Marius L.
# ----------------------------------------------------
def poids(l, Largeur):
    for i in range(2):
        forward(l)
        left(90)
        forward(Largeur)
        left(90)


def depart(depassement, l):
    left(180)
    forward(depassement)
    penup()
    left(90)
    forward(l)
    right(90)
    forward(l - l / 3)
    pendown()
    left(180)


def haltere(l, Largeur, depassement, barre, taille, coord1, coord2):
    pencolor((0.42, 0.42, 0.42))
    pensize(taille)
    penup()
    goto(coord1, coord2)
    pendown()
    depart(depassement, l)
    poids(l - l / 3, Largeur / 2)
    left(90)
    forward(l)
    left(180)
    forward(Largeur / 2)
    right(90)
    forward(l)
    left(180)
    poids(l, Largeur)
    penup()
    left(90)
    forward(Largeur / 2)
    pendown()
    left(90)
    forward(barre)
    penup()
    forward(l)
    pendown()
    penup()
    left(90)
    forward(Largeur / 2)
    left(90)
    pendown()
    poids(l, Largeur)
    penup()
    left(90)
    forward(Largeur - l)
    left(90)
    pendown()
    poids(l - l / 3, Largeur / 2)
    penup()
    forward(l - l / 3)
    left(90)
    forward(l)
    right(90)
    pendown()
    forward(depassement)
    setheading(0)


# Par Lili G.
# ----------------------------------------------------
def mug(x, y, longueur, epaisseur, couleur, couleur2):
    penup()
    speed(100)
    pensize(epaisseur)
    pencolor(couleur)
    goto(x, y)
    pendown()
    v = epaisseur / 2
    while v < longueur * 0.66:
        for i in range(2):
            forward(longueur * 0.66 - v)
            left(90)
            forward(longueur - v)
            left(90)
        v += epaisseur / 2
    penup()
    x += longueur * 0.8
    y += longueur * 0.33
    goto(x, y)
    pendown()
    left(45)
    circle(longueur / 3)
    right(45)
    penup()
    x -= longueur * 0.8
    y = y - longueur * 0.33 + longueur
    x += longueur / 12
    y -= longueur / 3
    pencolor(couleur2)
    goto(x, y)
    pendown()
    for i in range(5):
        forward(longueur / 2)
        right(144)


hideturtle()

def trace_boule_complet():
    guirlande_tout = Guirlande(Boule(145.745, 35.857 - 20, 10, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796)))
    guirlande_tout.ajoute_boule(Boule(136.046, 6.159 - 20, 10, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796)))
    guirlande_tout.boule_suiv.ajoute_boule(Boule(126.348, -23.539 - 20, 10, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796)))
    guirlande_tout.boule_suiv.boule_suiv.ajoute_boule(Boule(-60, 55, 15, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796)))
    guirlande_tout.boule_suiv.boule_suiv.boule_suiv.ajoute_boule(Boule(-20, 50, 15, 1, (0.835, 0.627, 0.129), (0.835, 0.627, 0.129), (0.498, 0.172, 0.796)))
    penup()
    goto(-60, 95)
    pendown()
    pensize(1)
    pencolor("black")
    left(-90)
    circle(21, 180)
    setheading(0)
    guirlande_tout.affiche_guirlande()
    guirlande_tout.clignotement_guirlande((154 / 255, 76 / 255, 159 / 255), 42)


# Propositions non retenue
# ----------------------------------------------------
"""
Parfois les élèves ont rendu un dessin non paramétrable, que l'on ne peut pas redimensionner.
Ils ont participé leur production n'a juste pas été sélectionné pour le dessin final.
"""
# Marie L. : Le doudou chien & Le sapin de Noël
# Baptiste M : Des boules de noël et un bonhomme de Neige
# Thomas V. : Une fleur, une voiture
# Raphaël M : Une carte mère d'ordinateur
# Margot S. : Des livres multicolores fermés
# Maxence H. : Yin-Yang
# Adam Y. : Une chausette de Noël


# Assemblage final
# ----------------------------------------------------
"""
Plusieurs secondes sont requises pour réaliser l'assemblage final.
En plus du fichier .py, vous ont été fourni :
- Une capture d'écran du rendu final
- Une vidéo de la construction sur une calculatrice Casio Graph 90+E
- Une vidéo de la scène finale
"""

bdn(91, -25, 20, 11, "black", "orange", "non")
flocon(60, 70, 5, 3, 1, 0, (2 * 42 / 255, 5 * 42 / 255, 242 / 255))
flocon(107, 80, 3, 3, 1, 0, (4 * 42 / 255, 5 * 42 / 255, 242 / 255))
flocon(117, 55, 3, 3, 1, 0, (3 * 42 / 255, 4 * 42 / 255, 242 / 255))
flocon(75, 40, 5, 3, 1, 0, (4 * 42 / 255, 3 * 42 / 255, 242 / 255))
flocon(50, 20, 3, 3, 1, 0, (4 * 42 / 255, 4 * 42 / 255, 242 / 255))
fenetre(124, 12)
cheminee(-145, -35, 75)
bougie_finale(-145, 48, 10, 10)
bonnet(-80, 0, 0, 42 - 12)
sapin(191, 50)
etoile(160, 80, 10, 4)
cadeauf(140, -75, 32, 2, (204 / 255, 164 / 255, 59 / 255), (154 / 255, 76 / 255, 159 / 255),
        (154 / 255, 76 / 255, 159 / 255))
cadeauf(128, -87, 24, 2, (204 / 255, 164 / 255, 59 / 255), (7 / 255, 113 / 255, 135 / 255),
        (7 / 255, 113 / 255, 135 / 255))
cadeauf(155, -92, 20, 2, (204 / 255, 164 / 255, 59 / 255), (196 / 255, 73 / 255, 0 / 255),
        (196 / 255, 73 / 255, 0 / 255))
cadeau(-170, -90, 25, 2, (154 / 255, 76 / 255, 159 / 255), (2 * 42 / 255, 2 * 42 / 255, 2 * 42 / 255),
       (204 / 255, 164 / 255, 59 / 255))
haltere(10, 40, 5, 50, 5, -35, -70)
mug(50, -90, 50, 4, (157 / 255, 92 / 255, 99 / 255), (214 / 255, 227 / 255, 248 / 255))
montre(0, -60, 42 - 2, 11, "grey", "black", "black")
trace_boule_complet()

hideturtle()
Télécharger




Elèves fx-92+ Spéciale Collège - Noël Casio - _Orlando_

Go to top

_Orlando_ participe en tant qu'élève de collège sur fx-92+ Spéciale Collège. Il place la barre extrêmement haut. En effet :
  • il dessine pas moins de 7 images différentes, images non constituées de formes géométriques simples
  • et en prime il accompagne cela de quelques inscriptions

Or le langage ne fournit aucune instruction pour faire cela de façon simple, nous n'avons que les déplacements élémentaires de la tortue, même pas de quoi écrire. Qui plus est la taille maximale du script est de 900 octets, franchement pas beaucoup pour stocker les images, de quoi afficher les images, et de quoi afficher les inscriptions.

En pratique les images monochromes sont codées en binaire, et présentes donc sous la forme de gros nombres au sein même du script.

C'est très hautement impressionnant, aux âmes bien nées la valeur n'attend point le nombre des années, toutes nos félicitations !
Code: Tout sélectionner
Aller à x=-2; y=16
S'orienter à 180 degrés
-10→E
54→M
73908999719→A
71030273809→B
7→C
Répéter 9
  39→D
  Si x=110 Alors
    Aller à x=-43; y=E
    20→M
    330302753020→A
    5523528707→B
    555001849→C
  Fin
  Si x=13 Alors
    Aller à x=-16; y=2E
    189875800049→A
    36479286949→B
    4251023430→C
  Fin
  Si x=40 Alors
    Aller à x=11; y=E
    219707870718→A
    439093560256→B
    2142255588→C
  Fin
  Si x=67 Alors
    Aller à x=38; y=2E
    2097016270→A
    138480215461→B
    2261852748→C
  Fin
  Si x=94 Alors
    Aller à x=65; y=E
    549629726467→A
    A-151674892→B
    134415963→C
  Fin
  Si x=121 Alors
    Aller à x=94; y=2E
    22→M
    479650820087→A
    139988187231→B
    4262478351→C
  Fin
  Si x=150 Alors
    Aller à x=7E; y=2E
    344638079224→A
    274872652131→B
    487935→C
  Fin
  x→F
  Répéter 117
    Si D=0 Alors
      B→A
      C→B
      39→D
    Fin
    D-1→D
    A÷2→A
    Si x<F-M+2 Alors
      Aller à x=F; y=y+2
    Fin
    Avancer de ,6 pixels
    Si A≠Ent(A Alors
      Stylo écrit
      Ent(A→A
    Fin
    Aller à x=x; y=y+1
    Avancer de 1 pixels
    Aller à x=x-,4; y=y-1
    Stylo relevé
  ⤴
  Aller à x=F+56; y=8(y-22
  185247487863→A
  335875282309→B
  1→C
Télécharger




Elèves fx-92+ Spéciale Collège - Du Casio sur Nintendo - _aubin_

Go to top

Et voici maintenant _aubin_ toujours sur fx-92+ Spéciale Collège, visiblement un concurrent très dangereux pour ce dernier. ;)

Afficher des cadeaux sur sa calculatrice, c'est trop concret. Ici encore il nous fait ça à la 'meta' / mise en abyme. Il nous rajoute donc une couche intermédiaire en dessinant sur l'écran de la calculatrice une console Nintendo Switch qui affiche elle-même les cadeaux, sélectionnés tout en finesse pour pour faire plaisir à Casio : calculatrice et dictionnaire électronique EX-Word de la marque ; souhaitons-lui que ce soit remarqué et apprécié. ;)
Bon, si tout-le-monde a cru se distinguer pour pour finalement faire pareil, l'originalité commence à se discuter... :P

Ici encore des images sans formes géométriques simples, et visiblement beaucoup plus détaillées que pour la participation précédente. Mais comment est-ce possible alors que cette dernière frôlait déjà la limite mémoire de 900 octets ?

Comme tu peux le voir, le code est anormalement simple :
Code: Tout sélectionner
Aller à x=-96; y=23
Répéter 662
  ? →A
  Répéter jusqu'à A=0
    Si x=96 Alors
      Aller à x=-96; y=y-1
    Fin
    Avancer de 1pixels
    A-1→A
  ⤴
  ? →A
  Répéter jusqu'à A=0
    Stylo écrit
    Si x=96 Alors
      Stylo relevé
      Aller à x=-96; y=y-1
      Stylo écrit
    Fin
    Avancer de ,4pixels
    Stylo relevé
    Avancer de ,6pixels
    A-1→A
  ⤴

Stylo relevé
Avancer de 193pixels
Télécharger

C'est qu'_aubin_ s'est montré extrêmement malin pour contourner la limite de 900 octets, diabolique même, les données des images ne sont pas dans le script. Ce dernier demande en boucle à l'utilisateur de saisir les données (un fan de input(), cent20 devrait aimer) et c'est donc à Casio de saisir un par un les nombres de la liste communiquée avec la participation. Voici la liste de nombres qu'_aubin_ nous a communiquée :
Code: Tout sélectionner
156 2 5 10 29
85 60 2 5 12 26
2 8 3 62 3 9 2 57 5 2 14 23
2 10 3 42 2 18 3 2 1 8 2 54 23 21
1 8 3 1 3 5 21 14 4 18 3 1 3 9 1 52 25 19
1 13 3 5 1 19 1 12 7 17 3 2 1 11 1 51 26 18
1 13 3 5 1 1 5 4 5 1 2 1 1 10 4 3 2 17 3 14 1 50 28 16
1 14 3 5 1 19 1 8 4 5 3 16 3 15 1 49 29 15
1 14 3 5 1 1 17 1 1 6 4 8 2 16 3 15 1 49 30 14
1 4 6 4 3 5 1 1 1 15 1 1 1 4 4 10 3 15 3 15 1 20 1 28 30 14
1 3 8 3 3 5 1 1 1 15 1 1 1 4 2 13 2 15 3 15 1 19 3 27 30 14
1 3 8 3 3 5 1 1 1 15 1 1 1 5 2 12 3 14 3 7 2 6 1 19 3 27 4 23 3 14
1 3 8 3 3 5 1 1 1 15 1 1 1 5 2 12 5 12 3 7 2 6 1 16 9 24 2 27 2 13
1 3 8 3 3 5 1 1 1 15 1 1 1 5 3 9 4 3 3 9 3 15 1 19 3 26 1 31 1 12
1 3 8 3 3 5 1 1 1 15 1 1 1 6 2 8 3 2 1 1 1 3 2 7 3 4 2 4 2 3 1 18 2 1 2 25 1 31 1 12
1 3 8 3 3 5 1 1 17 1 1 6 3 5 3 2 1 4 1 4 2 5 3 4 2 4 2 3 1 16 9 23 1 31 1 12
1 4 6 4 3 5 1 19 1 7 2 4 3 2 1 1 1 1 1 3 1 1 3 5 3 15 1 13 15 21 2 27 2 13
1 14 3 5 1 2 1 1 1 3 3 3 1 1 1 2 1 7 3 1 3 2 1 4 1 2 1 2 3 6 3 7 2 6 1 19 3 29 2 23 2 15
1 14 3 5 1 7 1 3 1 7 1 8 4 2 1 3 1 1 1 2 1 1 4 7 3 7 2 6 1 19 3 30 25 16
1 14 3 5 1 1 2 1 2 2 3 2 2 1 2 1 1 9 2 5 1 2 1 1 1 2 4 8 3 15 1 18 6 28 1 3 1 3 1 6 1 3 1 4 1 16
1 14 3 5 1 19 1 9 6 5 1 2 4 9 3 15 1 15 4 1 2 1 2 26 1 3 1 2 1 2 1 4 1 2 1 2 1 4 1 15
1 14 3 5 1 1 2 1 2 1 2 1 2 1 2 1 2 1 1 11 8 2 5 10 3 15 1 14 12 25 1 4 1 3 1 6 1 3 1 5 1 15
1 14 3 5 1 19 1 15 9 12 3 15 1 12 17 14 1 7 1 5 3 8 3 6 1 15
1 14 3 5 1 1 2 1 2 1 2 1 2 1 2 1 2 1 1 19 4 13 3 15 1 19 4 19 3 6 2 23 2 15
1 14 3 5 1 19 1 36 3 15 1 17 2 1 4 16 7 4 1 1 4 14 5 1 1 15
1 14 3 5 1 1 2 1 2 1 2 1 2 1 2 1 2 1 1 36 3 15 1 16 10 16 3 6 1 5 14 6 1 15
1 14 3 5 1 19 1 36 3 15 1 14 7 1 2 1 3 12 3 1 3 4 1 3 1 18 1 2 1 15
1 6 2 6 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 9 2 25 3 5 6 4 1 11 3 1 3 1 8 1 2 8 11 2 1 1 1 3 3 9 3 5 1 15
1 6 2 6 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 8 1 2 3 22 3 4 8 3 1 9 22 11 3 6 1 5 1 2 9 2 1 2 1 2 1 15
1 14 3 5 1 19 1 7 5 2 2 20 3 4 8 3 1 17 4 1 2 17 5 6 1 5 1 11 1 1 1 3 1 16
1 3 2 4 2 3 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 5 2 2 4 2 1 20 3 4 8 3 1 14 3 1 9 10 13 2 1 6 2 7 2 3 1 2 1 16
1 14 3 5 1 19 1 5 1 1 3 2 2 1 1 20 3 4 8 3 1 13 15 13 5 6 1 5 1 2 7 2 1 5 1 16
1 6 2 6 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 5 1 2 1 1 2 1 3 20 3 4 8 3 1 11 4 1 3 1 6 1 3 10 2 1 4 6 1 1 1 13 1 5 1 17
1 6 2 6 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 5 2 1 1 2 1 1 1 1 1 20 3 5 6 4 1 10 2 1 9 1 8 6 13 3 1 10 1 7 1 2 1 17
1 14 3 5 1 19 1 5 1 1 2 2 5 20 3 15 1 8 21 1 3 2 17 2 1 3 1 11 1 3 1 18
1 14 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 5 1 2 4 2 1 21 3 15 1 7 27 7 3 1 1 8 1 8 1 4 1 4 1 18
1 14 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 5 2 1 1 2 1 1 1 22 3 15 1 20 1 19 7 8 1 17 1 20
1 13 3 5 1 19 1 7 3 1 2 23 3 14 1 39 11 6 1 3 1 13 1 20
1 13 3 5 21 10 2 24 3 14 1 37 3 1 2 1 5 1 2 5 2 6 1 3 1 2 2 22
1 12 3 62 3 13 1 36 11 1 7 5 1 11 1 25
2 10 3 62 3 11 2 36 21 4 1 11 1 27
2 8 3 62 3 9 2 48 1 15 2 7 2 30
85 68 7

Malgré une compression RLE sur 1 bit cela fait quand même pas moins de 1324 nombres différents à saisir un par un en attendant à chaque fois la fin du déplacement de la tortue, espérons pour Casio qu'ils ne sont pas nombreux à avoir usé de cette technique, sinon ils seront encore dessus le mois prochain... :P

Par contre, si c'est bien cette liste exacte qui a été communiquée à Casio, alors c'est extrêmement dommage car il semble y avoir selon nos tests 2 erreurs faisant différer l'affichage de la photo d'_aubin_ partagée plus haut :
  • une ligne de données semble manquante, réduisant la hauteur des touches haut/bas du pavé directionnel inférieur gauche de la Switch, ainsi que celle de la rangée de touches correspondante sur la calculatrice
  • un peu après il semble de plus y avoir un décalage des données d'1 pixel horizontal
C'est extrêmement dommage, et nous sommes bien tristes lorsque nous pensons au nombre d'heures qu'_aubin_ a dû passer là-dessus. Espérons que Casio ne le pénalisera pas trop pour ce détail n'enlevant rien au génie de sa participation...




Comme l'année dernière, le niveau sur fx-92+ Spéciale Collège reste très élevé ; c'est fantastique tout ce que l'on peut réaliser avec cette petite machine. :favorite:

Mais mieux que l'année dernière, tous ceux qui ont bien voulu partager leurs créations sur Graph 90+E jusqu'à présent (et ça fait déjà beaucoup) se sont visiblement donné à fond, désintégrant littéralement les limites de ce qui avait pu être réalisé jusqu'alors en Python sur cette machine ! :#tritop#:

Nous trouvons que la chose est à la mesure des gros efforts consentis par Casio en dotation pour ce concours, et espérons que ces derniers sont également satisfaits de ce qu'ils ont reçu. ;)
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 43.3%
 
Messages: 41534
Images: 14894
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Re: Découvre les participations au concours de Noël Casio 20

Message non lude critor » 02 Fév 2022, 17:53

Précision apportée à l'annonce histoire de créditer les œuvres au mieux : le jusqu'à présent mystérieux ami d'_Orlando_, c'est _aubin_.
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 43.3%
 
Messages: 41534
Images: 14894
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Re: Découvre les participations au concours de Noël Casio 20

Message non lude critor » 03 Fév 2022, 15:55

La participation d'_aubin_ a été partagée et analysée. C'est rajouté à l'article, et je mets également le détail ci-dessous.

Je vois que certains participants s'impatientent pour les résultats, ben vous allez vite comprendre pourquoi... :P
Et si il y a plein de participations comme celle d'_aubin_, ben il va vous falloir attendre le moins prochain... :troll:

Et voici maintenant _aubin_ toujours sur fx-92+ Spéciale Collège, visiblement un concurrent très dangereux pour ce dernier. ;)

Afficher des cadeaux sur sa calculatrice, c'est trop concret. Ici encore il nous fait ça à la 'meta' / mise en abyme. Il nous rajoute donc une couche intermédiaire en dessinant sur l'écran de la calculatrice une console Nintendo Switch qui affiche elle-même les cadeaux, sélectionnés tout en finesse pour pour faire plaisir à Casio : calculatrice et dictionnaire électronique EX-Word de la marque ; souhaitons-lui que ce soit remarqué et apprécié. ;)
Bon, si tout-le-monde a cru se distinguer pour pour finalement faire pareil, l'originalité commence à se discuter... :P

Ici encore des images sans formes géométriques simples, et visiblement beaucoup plus détaillées que pour la participation précédente. Mais comment est-ce possible alors que cette dernière frôlait déjà la limite mémoire de 900 octets ?

Comme tu peux le voir, le code est anormalement simple :
Code: Tout sélectionner
Aller à x=-96; y=23
Répéter 662
  ? →A
  Répéter jusqu'à A=0
    Si x=96 Alors
      Aller à x=-96; y=y-1
    Fin
    Avancer de 1pixels
    A-1→A
  ⤴
  ? →A
  Répéter jusqu'à A=0
    Stylo écrit
    Si x=96 Alors
      Stylo relevé
      Aller à x=-96; y=y-1
      Stylo écrit
    Fin
    Avancer de ,4pixels
    Stylo relevé
    Avancer de ,6pixels
    A-1→A
  ⤴

Stylo relevé
Avancer de 193pixels
Télécharger

C'est qu'_aubin_ s'est montré extrêmement malin pour contourner la limite de 900 octets, diabolique même, les données des images ne sont pas dans le script. Ce dernier demande en boucle à l'utilisateur de saisir les données (un fan de input(), cent20 devrait aimer) et c'est donc à Casio de saisir un par un les nombres de la liste communiquée avec la participation. Voici la liste de nombres qu'_aubin_ nous a communiquée :
156 2 5 10 29
85 60 2 5 12 26
2 8 3 62 3 9 2 57 5 2 14 23
2 10 3 42 2 18 3 2 1 8 2 54 23 21
1 8 3 1 3 5 21 14 4 18 3 1 3 9 1 52 25 19
1 13 3 5 1 19 1 12 7 17 3 2 1 11 1 51 26 18
1 13 3 5 1 1 5 4 5 1 2 1 1 10 4 3 2 17 3 14 1 50 28 16
1 14 3 5 1 19 1 8 4 5 3 16 3 15 1 49 29 15
1 14 3 5 1 1 17 1 1 6 4 8 2 16 3 15 1 49 30 14
1 4 6 4 3 5 1 1 1 15 1 1 1 4 4 10 3 15 3 15 1 20 1 28 30 14
1 3 8 3 3 5 1 1 1 15 1 1 1 4 2 13 2 15 3 15 1 19 3 27 30 14
1 3 8 3 3 5 1 1 1 15 1 1 1 5 2 12 3 14 3 7 2 6 1 19 3 27 4 23 3 14
1 3 8 3 3 5 1 1 1 15 1 1 1 5 2 12 5 12 3 7 2 6 1 16 9 24 2 27 2 13
1 3 8 3 3 5 1 1 1 15 1 1 1 5 3 9 4 3 3 9 3 15 1 19 3 26 1 31 1 12
1 3 8 3 3 5 1 1 1 15 1 1 1 6 2 8 3 2 1 1 1 3 2 7 3 4 2 4 2 3 1 18 2 1 2 25 1 31 1 12
1 3 8 3 3 5 1 1 17 1 1 6 3 5 3 2 1 4 1 4 2 5 3 4 2 4 2 3 1 16 9 23 1 31 1 12
1 4 6 4 3 5 1 19 1 7 2 4 3 2 1 1 1 1 1 3 1 1 3 5 3 15 1 13 15 21 2 27 2 13
1 14 3 5 1 2 1 1 1 3 3 3 1 1 1 2 1 7 3 1 3 2 1 4 1 2 1 2 3 6 3 7 2 6 1 19 3 29 2 23 2 15
1 14 3 5 1 7 1 3 1 7 1 8 4 2 1 3 1 1 1 2 1 1 4 7 3 7 2 6 1 19 3 30 25 16
1 14 3 5 1 1 2 1 2 2 3 2 2 1 2 1 1 9 2 5 1 2 1 1 1 2 4 8 3 15 1 18 6 28 1 3 1 3 1 6 1 3 1 4 1 16
1 14 3 5 1 19 1 9 6 5 1 2 4 9 3 15 1 15 4 1 2 1 2 26 1 3 1 2 1 2 1 4 1 2 1 2 1 4 1 15
1 14 3 5 1 1 2 1 2 1 2 1 2 1 2 1 2 1 1 11 8 2 5 10 3 15 1 14 12 25 1 4 1 3 1 6 1 3 1 5 1 15
1 14 3 5 1 19 1 15 9 12 3 15 1 12 17 14 1 7 1 5 3 8 3 6 1 15
1 14 3 5 1 1 2 1 2 1 2 1 2 1 2 1 2 1 1 19 4 13 3 15 1 19 4 19 3 6 2 23 2 15
1 14 3 5 1 19 1 36 3 15 1 17 2 1 4 16 7 4 1 1 4 14 5 1 1 15
1 14 3 5 1 1 2 1 2 1 2 1 2 1 2 1 2 1 1 36 3 15 1 16 10 16 3 6 1 5 14 6 1 15
1 14 3 5 1 19 1 36 3 15 1 14 7 1 2 1 3 12 3 1 3 4 1 3 1 18 1 2 1 15
1 6 2 6 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 9 2 25 3 5 6 4 1 11 3 1 3 1 8 1 2 8 11 2 1 1 1 3 3 9 3 5 1 15
1 6 2 6 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 8 1 2 3 22 3 4 8 3 1 9 22 11 3 6 1 5 1 2 9 2 1 2 1 2 1 15
1 14 3 5 1 19 1 7 5 2 2 20 3 4 8 3 1 17 4 1 2 17 5 6 1 5 1 11 1 1 1 3 1 16
1 3 2 4 2 3 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 5 2 2 4 2 1 20 3 4 8 3 1 14 3 1 9 10 13 2 1 6 2 7 2 3 1 2 1 16
1 14 3 5 1 19 1 5 1 1 3 2 2 1 1 20 3 4 8 3 1 13 15 13 5 6 1 5 1 2 7 2 1 5 1 16
1 6 2 6 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 5 1 2 1 1 2 1 3 20 3 4 8 3 1 11 4 1 3 1 6 1 3 10 2 1 4 6 1 1 1 13 1 5 1 17
1 6 2 6 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 5 2 1 1 2 1 1 1 1 1 20 3 5 6 4 1 10 2 1 9 1 8 6 13 3 1 10 1 7 1 2 1 17
1 14 3 5 1 19 1 5 1 1 2 2 5 20 3 15 1 8 21 1 3 2 17 2 1 3 1 11 1 3 1 18
1 14 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 5 1 2 4 2 1 21 3 15 1 7 27 7 3 1 1 8 1 8 1 4 1 4 1 18
1 14 3 5 1 1 3 1 3 1 3 1 2 1 2 1 1 5 2 1 1 2 1 1 1 22 3 15 1 20 1 19 7 8 1 17 1 20
1 13 3 5 1 19 1 7 3 1 2 23 3 14 1 39 11 6 1 3 1 13 1 20
1 13 3 5 21 10 2 24 3 14 1 37 3 1 2 1 5 1 2 5 2 6 1 3 1 2 2 22
1 12 3 62 3 13 1 36 11 1 7 5 1 11 1 25
2 10 3 62 3 11 2 36 21 4 1 11 1 27
2 8 3 62 3 9 2 48 1 15 2 7 2 30
85 68 7

Malgré une compression RLE sur 1 bit cela fait quand même pas moins de 1324 nombres différents à saisir un par un en attendant à chaque fois la fin du déplacement de la tortue, espérons pour Casio qu'ils ne sont pas nombreux à avoir usé de cette technique, sinon ils seront encore dessus le mois prochain... :P

Par contre, si c'est bien cette liste exacte qui a été communiquée à Casio, alors c'est extrêmement dommage car il semble y avoir selon nos tests 2 erreurs faisant différer l'affichage de la photo d'_aubin_ partagée plus haut :
  • une ligne de données semble manquante, réduisant la hauteur des touches haut/bas du pavé directionnel inférieur gauche de la Switch, ainsi que celle de la rangée de touches correspondante sur la calculatrice
  • un peu après il semble de plus y avoir un décalage des données d'1 pixel horizontal
C'est extrêmement dommage, et nous sommes bien tristes lorsque nous pensons au nombre d'heures qu'_aubin_ a dû passer là-dessus. Espérons que Casio ne le pénalisera pas trop pour ce détail n'enlevant rien au génie de sa participation...
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 43.3%
 
Messages: 41534
Images: 14894
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Re: Découvre les participations au concours de Noël Casio 20

Message non lude critor » 03 Fév 2022, 20:39

cent20 nous annonce que lui et son groupe de 15 élèves sont les gagnants dans la catégorie classe-Python ! :D
Nous sommes absolument fiers de vous ! :bj:

Ils gagnent donc :

Les autres gagnants dénoncez-vous, parce que justement on attend après vous pour pouvoir faire une annonce globale. ;)
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 43.3%
 
Messages: 41534
Images: 14894
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Re: Découvre les participations au concours de Noël Casio 20

Message non lude critor » 03 Fév 2022, 21:35

Nouveau gagnant, _Orlando_ dans la catégorie élèves-collège ! :D
Nous sommes extrêmement fiers de toi ! :#tritop#:

Il gagne donc la console de jeux Nintendo Switch.

Les gagnants par catégorie à date :
  • élèves-collège : _Orlando_
  • élèves-Python : ?
  • enseignants-collège : ?
  • enseignants-Python : ?
  • classe-collège : ?
  • classe-Python : cent20
Les 4 autres, cessez de vous cacher. ;)
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 43.3%
 
Messages: 41534
Images: 14894
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Re: Découvre les participations au concours de Noël Casio 20

Message non lude critor » 03 Fév 2022, 22:50

_aubin_ a mis en ligne une nouvelle liste de nombres à taper, censée corriger l'erreur, et censée être celle envoyée à Casio :
Mais désolé, pour moi ici aucune différence après téléchargement, les deux listes de nombres sont absolument identiques et produisent donc les mêmes défauts.
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 43.3%
 
Messages: 41534
Images: 14894
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Re: Découvre les participations au concours de Noël Casio 20

Message non lude cent20 » 04 Fév 2022, 10:54

critor a écrit:Nouveau gagnant, _Orlando_ dans la catégorie élèves-collège ! :D
Nous sommes extrêmement fiers de toi ! :#tritop#:

Il gagne donc la console de jeux Nintendo Switch.



Très surprenant son code. Comment on peut avoir l'idée de coder ainsi ?
Il a fait du pixel art sur une feuille puis a exploité un algo qui lui donne les valeurs de A, B, C ... exploitées dans son script ? Cela ne me parait pas naturel ce système de codage.
En tout cas c'est un futur spé NSI 😍🥳😎

Bravo à lui, il a bien mérité de gagner ! 🤩
Image
Enseignant de mathématiques et d'informatique. Spécialité NSI : Des projets, des tutos, mais aussi de l'art
Calculatrice NumWorks : Des applications et des jeux, scripts, 📙 Découvrir la NumWorks
Avatar de l’utilisateur
cent20VIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 46.1%
 
Messages: 1013
Images: 64
Inscription: 17 Mai 2012, 09:49
Localisation: Avignon
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: nsi_xyz

Re: Découvre les participations au concours de Noël Casio 20

Message non lude critor » 04 Fév 2022, 13:04

Pour information, finalement ptitjoz me dit qu'il n'a pas osé envoyer sa participation, n'étant ni élève ni enseignant.
Bien dommage mais pas grave de notre côté, elle va continuer à être affichée dans notre catégorie "hors concours" où elle figurait déjà.
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 43.3%
 
Messages: 41534
Images: 14894
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Re: Découvre les participations au concours de Noël Casio 20

Message non lude critor » 04 Fév 2022, 13:08

cent20 a écrit:
critor a écrit:Nouveau gagnant, _Orlando_ dans la catégorie élèves-collège ! :D
Nous sommes extrêmement fiers de toi ! :#tritop#:

Il gagne donc la console de jeux Nintendo Switch.



Très surprenant son code. Comment on peut avoir l'idée de coder ainsi ?
Il a fait du pixel art sur une feuille puis a exploité un algo qui lui donne les valeurs de A, B, C ... exploitées dans son script ? Cela ne me parait pas naturel ce système de codage.
En tout cas c'est un futur spé NSI 😍🥳😎

Bravo à lui, il a bien mérité de gagner ! 🤩

Les codes d' _Orlando_ et _aubin_ sont très impressionnants en effet, d'autant plus pour des collégiens.

Faudrait que tu les fasses déménager pour les récupérer... et puis nous sommes si bien dans le sud, il faisait très bon hier, j'entends les oiseaux chanter en ce moment-même... j'ignore si il va rester mais nous avons le printemps qui pointe déjà le bout de son nez.
Si tu proposais à ton lycée de leur offrir l'internat, ou encore un semestre de frais ? ;)
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 43.3%
 
Messages: 41534
Images: 14894
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Re: Découvre les participations au concours de Noël Casio 20

Message non lude Lephe » 04 Fév 2022, 16:25

Excellent travail ! Merci à Critor pour cette compilation, et bravo à _Orlando_ et Cent20 déjà pour leurs victoires. Toutes les versions ici sont vraiment recherchées :)

Dans mon mail de participation j'ai indiqué en PS qu'on espérait toujours un getkey() en Python (un ajout qui ne prendrait qu'1 heure max à la R&D, j'en suis persuadé), et j'ai eu comme réponse que "C'est aussi bien noté pour l'ajout de getkey(), nous transmettons à la R&D." On croise les doigts :)
Avatar de l’utilisateur
LephePartenaire
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Prochain niv.: 67.7%
 
Messages: 386
Inscription: 15 Juin 2018, 19:53
Genre: Homme
Calculatrice(s):
MyCalcs profile

Suivante

Retourner vers News Casio

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 22 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1312 utilisateurs:
>1293 invités
>14 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)