π
<-
Chat plein-écran
[^]

img2calc: des scripts Python encore plus petits

img2calc: des scripts Python encore plus petits

Unread postby critor » 08 Jan 2022, 22:07

13917Dans une série d'articles précédents nous te présentions , notre service en ligne gratuit sur
TI-Planet
te permettant de convertir tes images pour tes projets sur calculatrices.

Un large choix de formats cible t'était proposé :
  • fichiers à appeler depuis tes programmes en langage
    Basic
    :
    • pour
      Casio Graph 90+E
      et
      fx-CG50/20/10
    • pour
      Casio fx-CP400
      et
      fx-CG500
    • .8ca
      ou
      .8ci
      pour
      TI-83 Premium CE
      ,
      TI-84 Plus CE
      et
      TI-84 Plus C Silver Edition
    • .8xi
      pour les
      TI-83 Plus
      (compatible
      TI-82 Advanced
      ,
      TI-82 Plus
      et
      TI-84 Plus
      monochromes)
      ,
    • .83i
      pour les
      TI-83
      (compatible
      TI-82 Stats
      et
      TI-76.fr
      )
    • .82i
      pour les autres
      TI-82
    • .86i
      pour les
      TI-86
    • .85i
      pour les
      TI-85
    • .73i
      pour les
      TI-73
  • fichiers à appeler depuis tes scripts en langage
    Python
    :
    • pour les éditions
      Python
      des
      TI-83 Premium CE
      et
      TI-84 Plus CE
  • scripts
    Python
    pour les différentes bibliothèques graphiques des calculatrices :
    • ti_draw
      (
      TI-Nspire CX II
      )
    • graphic
      (
      TI-Nspire CX II
      avec
      KhiCAS
      ,
      TI-Nspire CX
      avec
      KhiCAS
      et
      NumWorks
      avec
      KhiCAS
      )
    • nsp
      (
      TI-Nspire
      avec )
    • ti_graphics
      (
      TI-83 Premium CE
      et
      TI-84 Plus CE
      éditions
      Python
      )
    • casioplot
      (
      Casio Graph 90/35+E II
      ,
      fx-9750/9860GIII
      et
      fx-CG50
      )
    • hpprime
      (
      HP Prime
      )
    • kandinsky
      (
      NumWorks
      )
Nous revenons aujourd'hui sur ce dernier point, soit les images converties en scripts
Python
pour ta calculatrice.

Rappelons que les interpréteurs
Python
de nos calculatrices font appel à 3 types de mémoires :
  • La mémoire de stockage qui comme son nom l'indique stocke physiquement tes fichiers de scripts
    Python
    .
  • La pile
    (stack)
    qui référence, à l'exécution, les objets
    Python
    créés par tes scripts. Sa capacité limite donc le nombre d'objets
    Python
    pouvant coexister simultanément en mémoire.
  • Le tas
    (heap)
    qui reçoit, à l'exécution, le contenu des objets
    Python
    créés. Il limite donc la taille globale utilisée pour les données de ces différents objets.

Voici quelques consommations
heap
valides pour les plateformes
32 bits
que sont à ce jour nos calculatrices :
  • pour un entier :
    24
    octets de base +
    4
    octets si non nul +
    4
    octets pour chaque groupe de 30 bits utilisés au-delà des premiers 31 bits dans sa représentation binaire
  • pour une liste :
    56
    octets de base +
    8
    octets par élément + les tailles de chaque élément
  • pour un tuple :
    40
    octets de base +
    8
    octets par élément + les tailles de chaque élément
  • pour une chaîne :
    49
    octets de base +
    1
    octet par caractère
  • pour un
    bytes
    :
    33
    octets de base +
    1
    octet par octet
Comme tu peux le constater le langage
Python
a le très gros défaut d'être un énorme consommateur de
heap
, mémoire qui sera bien souvent le facteur le plus limitant pour tes projets sur calculatrices. Rappelons les plus mauvais modèles sur ce critère :
  • NumWorks
    avec seulement
    32,5 Ko
    de
    heap
  • éditions
    Python
    des
    TI-83 Premium CE
    et
    TI-84 Plus CE
    avec encore pire
    19,7 Ko
    de
    heap

Comme déjà expliqué,
img2calc
a justement été conçu pour minimiser la consommation de
heap
. Pour cela
img2calc
mutualise deux approches :
  • La compression de ton image au format
    RLE
    .
  • Le compactage des données, avec l'utilisation des types d'objets
    Python
    les moins gourmands en mémoire :
    • des tuples pour la palette de couleurs
    • des
      bytes
      pour les données de la compression
      RLE
      (type d'objet
      Python
      s'utilisant comme une chaîne de caractères mais optimisé pour le stockage d'octets)

Prenons un exemple simple. Supposons que tu souhaites afficher l'image 15×15 pixels ci-contre dans un de tes scripts
Python
sur calculatrice.

Un premier codage très naïf dit
true color
de ton image pourrait alors ressembler à ça :
Code: Select all
image = [
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[054,111,159],[255,255,255],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,204,062],[255,204,062],[255,255,255],
[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],
[054,111,159],[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],
[054,111,159],[054,111,159],[054,111,159],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],
[255,255,255],[054,111,159],[054,111,159],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,255,255],[255,204,062],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,204,062],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],
]

Il s'agit donc d'une liste des couleurs de pixels, de gauche à droite puis de haut en bas, les couleurs étant codées en triplets de valeurs Rouge-Vert-Bleu, l'implémentation la plus fréquente sur calculatrices.

Ce premier codage est toutefois catastrophique en terme de consommation de mémoire
heap
. Il consomme à l'exécution
$mathjax$56+15\times 15\times\left(8+56+3\times\left(8+28\right)\right)$mathjax$
soit
38,756 Ko
de
heap
, excluant donc déjà les
TI-83 Premium CE
,
TI-84 Plus CE
et même
NumWorks
.

Mais c'est bête donc de repréciser à chaque fois la valeur de couleur, alors qu'il n'y a ici que 3 couleurs différentes dans notre image, non ? ;)

Outre le passage aux tuples déjà évoqué, une première amélioration majeure est d'externaliser les informations de couleurs dans une palette, ce que l'on appelle une image indexée :
Code: Select all
palette = ((255,255,255), (054,111,159), (255,204,062))

image = (
0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,
0,0,0,0,1,0,1,1,1,1,1,0,0,0,0,
0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,0,2,2,0,
1,1,1,1,1,1,1,1,1,1,0,0,2,2,2,
1,1,1,1,0,0,0,0,0,0,0,2,2,2,2,
1,1,1,0,0,2,2,2,2,2,2,2,2,2,2,
0,1,1,0,2,2,2,2,2,2,2,2,2,2,2,
0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,
0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,
0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,
0,0,0,0,2,2,2,2,2,0,2,0,0,0,0,
0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,
)


Cela n'occupe plus que
$mathjax$40+3\times\left(8+40+3\times\left(8+28\right)\right)+40+15\times 15\times\left(8+28\right)$mathjax$
soit
8,648 Ko
de
heap
. Notre icône est maintenant fonctionnelle sur tous les modèles ! :bj:

Et nous en arrivons maintenant à la compression
RLE
. Selon un parcours de l'image de gauche à droite puis de haut en bas, cette compression accompagne chaque information de couleur du nombre de pixels adjacents qui l'utilisent.

Avec notre image d'exemple, cela donne :
Code: Select all
0(×5) 1(×5) 0(×9)
1(×1) 0(×1) 1(×5) 0(×8)
1(×7) 0(×11)
1(×4) 0(×5)
1(×10) 0(×4)
1(×11) 0(×1) 2(×2) 0(×1)
1(×10) 0(×2) 2(×3)
1(×4) 0(×7) 2(×4)
1(×3) 0(×2) 2(×10)
0(×1) 1(×2) 0(×1) 2(×11)
0(×4) 2(×10) 0(×5)
2(×4) 0(×11)
2(×7) 0(×8)
2(×5) 0(×1) 2(×1) 0(×9)
2(×5) 0(×5)


Après encodage et compactage de ces informations sur du
RLE
2 bits
(puisque nous avons plus de 2 couleurs mais moins de 4 couleurs)
, voici le code
Python
associé :
Code: Select all
palette = (
(255,255,255),(55,109,157),(255,203,64),
)

image = (
b"\x10\x11\x20\x01\x00\x11\x1c\x19(\r\x10%\x0c)\x00\x06\x00%\x04\n\r\x18\x0e\t\x04&\x00\x05\x00*\x0c&\x10\x0e(\x1a\x1c\x12\x00\x02\x20\x12\x10"
)

Nous avions donc au final
$mathjax$40+3×(8+40+3×(8+28))+33+43×1×1$mathjax$
soit
584
octets de consommation
heap
.

Par contre, tu pouvais noter la longue écriture du
bytes
sur 140 caractères, et ce alors qu'il ne code que 43 octets.

En effet nombre de valeurs d'octets ne correspondent pas à des caractères affichables, et ont donc besoin d'une notation spéciale dite échappée :
  • \x10 bien que s'écrivant avec 4 caractères, ne code qu'1 octet, de valeur
    10
    en hexadécimal, soit
    16
    en décimal
  • \t, \n, et \r sont des notations plus courtes sur seulement 2 caractères codant les octets de valeurs respectives
    9
    ,
    10
    et
    13

Cette notation pouvant nécessiter jusqu'à 4 caractères pour écrire 1 octet n'était absolument pas un problème pour la mémoire
heap
, mais par contre elle pouvait l'être pour la mémoire de stockage.

Prenons par exemple l'image plein écran en 16 couleurs ci-contre.

img2calc
te la codait jusqu'à présent de la façon suivante :
Code: Select all
palette = (
(215,187,149),(239,183,116),(198,122,27),(90,45,18),(190,143,18),(255,255,247),(0,0,2),(190,172,149),(231,187,99),(239,163,18),(149,105,45),(207,176,107),(73,0,0),(149,67,64),(182,114,116),(247,195,133),
)

image = (
b"\xb0\r\x11\"\x01\xb0&\xe3\x01\xf0\x00\x11\xa0$\x01C\x021\x02\xf3\x00\x01\x10\x93\x01\x01\x80#\x01c\xc1\x013\x01\x13\x91\x01\x02#\x11\x80\"\x01\xf3\x00\x02Q\x02\xf1\x00S\xb1\x01\x023\x01\xb0!\xf3\x00\x12\xa1\x02\x02#\x91\x02\x83\x01\x01\xf0\x1f\x01S\x91\x03\x131\x02a\x12\x91\x01c\x01\xa0\x1fS\x02\xf1\x00\x02\xa1\x01\x02\xf1\x00\x03a\x02\x91\x02\xf3\x00\xf0\x1eS\x91\x01\x02\xa1\x01\x02\xf1\x00\x03a\x02\xb1\x02c\x01\xb0\x1eS\x91\x02\x02\x81\x01B\x03\x02\x91\x02\x02\xd1\x01\x02#\x01\xe0\x1d\x013\xc1\x02\x02\xf1\x00R\x03\xa2\x02\x81\x023\x02\x01\xa0\x1d#\x02A\x02\xf1\x00\x02!\x02\x81\x01\x92\x01\x13\xe2\x02a\x02Q\x023\x80\x1d#\x02Q\x02\xf1\x00\x02\xa1\x01\xb2\x01\x13\x82\x02\xf3\x00\xd1\x013\xb0\x1c\x01\x00\x01#\xf1\x02\x82\x02\x13\x82\x03\x13\x02A\x02a3\x90\x1c3\xc1\x02\xd2\x02#\x92\x03\x13\x02\xc1\x01#\xe0\x1b\x01#\xa1\x02\xf2\x01\xc3\x02\x02\x04\xa2\x02\x03\x121\x02\xf1\x00\x13\x01\xc0\x04\x15\xb0\x16\x01#\x02\x81\x02\xe2\x01\x93\x02\x12S\x12\x04\x82\x02\x13\x02!\x02\x81\x01\x13\x01\xf0\x01\xf5\x00\x005`%\xc0\x015\x80\x14#!\x02A\x02\x81\x01\x92\x01S\x02\x04\x02\xf4\x00Cd\x02\xc3\x01\xe2\x01\xa1\x01\x02\x13\xe0\x01\x05V%\x16\x05\a@\x05&\x05\xb0\x01\x05\x16\x05\xe0\x13\x01\x13\x02\x81\x02\x82\x01C\x02\x84\x02#\xa4\x02\x023\xc2\x011\x12Q#\x01\xb0\x01\x05f\x15\x16%0\x05&\x05\x20\a5\x00\a\x10\x05\x16\x15\a\x05\x00\x050\a\x00\a\xf0\x00%P%P%\a\xd0\x02\x05\x00\x05\x00\x05\x80\x0b#\xf1\x01\x82\x01C\x02\xb4\x02\x13\xe4\x023\xd2\x01\xa1\x01#\xa0\x01%\x16E&5\x105\x20\x156E\x16%\x06\x00\x15\x00E\a\x15\x20\x15&\x15\x10%\x16%\a\x15&\x15`\x05\xa0\x01\x15\x16\x15\x06\x15\xd0\n#\xf1\x01\x02\x03RC\xe4\x02\x13\xe4\x02\x123\xb2\x01\xb1\x01\x13\x02\x90\x01%\x16EV\a\x05\x00\x15\x06\x15\x10\x05V5\x16\x156\x15\x16\x05&\x15\x00\a\x15F\x05\x10\x156\x15\a\x05F\x15@UP\x15f\x05\xb0\n\x01#\xe1\x01\x02\x03R3\x94\x03\x13\xa4\x03\x02#\xb2\x01\xb1\x01\x13\x01\x90\x01\x05\x16\x15\x10\x05f%&%\xf6\x00\x05\a\x05\x16\x056%\xf6\x00%f%V%V\x05@F\x05P\x05\xf6\x00\x05\a\x80\n\x01#Q\x02\xf1\x00\x13R#\xf4\x02H\x13H\xf4\x02\x02\x13\xc2\x01\x01\x02\x91\x01\x13\x80\x01\x05\x16\x15\x10\x05&\x15\x16%&\x156%\a\x15\a\x05V5&\x15&\x15&%\x16%&5\a\x05&%\a@\x056\x05@\x05&5\x16\x05\xf0\t\x01#\x02\xc1\x01\x02\x13B3\xd4\x02\x88\x01\x13h\t\b\xd4\x02#\xb2\x01\xb1\x01\x13\x01`\x05\x16\x15\x10\x05&\x15&\x15&\x15&%\x17\x05\a\x156U\x16%&\x15\x86\x01\x05\a\x0565\a&\x15P\x056\a@\x05&\x15\a\x05\x16\x05\xd0\t\x01C\xc1\x01\x02\x03RC\xa4\x02\t\xa8\x01\x13\x98\x01\xc4\x02\x02#\xb2\x01\xb1\x01\x13`\x05\x16\x15\x10\x05\x16%&\x15&\x15&\x15\a\x15\a%F\x05\a%\x16%&\x15\x86\x01\x05\a\x15&\x15\a%&\a\x050\x05FP\x05&\x05\a\x15\x16\x05\xb0\t\x013\xd1\x01\x02\x03b3\xf4\x01\x98\x019(\x138I\x88\x01\xf4\x013\x92\x01a\x12\x11\x02\x13P\x05&\x05\x10\x05\x16%&\x15&\x156%\x065\x16\x05&\x05\a\x15\x16%&\x15\x16\xc5\x01&E&\x050\x05\a6\x150\x05&5\x16\x05\x90\t\x02#\xe1\x01\x82\x013\xd4\x01\t\xb8\x01i\x18\x03(Y\xf8\x01\xa4\x01\x02\x13\xa2\x01\x91\x01#@\x05&\x05\x10\x05\x16%&\x15&%\xf6\x00%\x16\x15&\x05\a\x05\x16%&\x15&%\x16%&\x05\x16%\x16\x05&\x05`5@\x05\x86\x01\x05\xf0\b\x01#\xf1\x01\x03b3\xb4\x01\x19\xe8\x01i\x18\x13\bi\xb8\x02\x84\x01\x02\x13\x82\x01\x11\x02\xf1\x00\x13@\x05&\x05\x10\x05\x16%&\x15&\x05\x00\x15V\x15\a\x05&\x15&\x15\x16%&5F\x15\x00\x156\x15\x00\x05F\x15\x80\x02\x15f\x05\xf0\b\x13\x81\x02\x82\x01#\xb4\x01\t\x88\x02i\x18\x13\x18Y\x98\x01\t\x98\x01\x84\x01\x02\x13\x82\x01\x91\x01\x13@\x05&\x05\x10\x05\x16%&\x15&\x05\x10\x156%\x00\x05&%\x16\x15\x16\x05\x00\x05&5F\x05\x20\x056\x15\x00%\x16\x15\x90\x02%&\x05\x16\x05\xd0\b\x01\x13\x81\x01\x12A\x92\x01\x13\xb4\x01\xc8\x02Y\x18\x13\x18Y8:\xe8\x01\x84\x01\x02\x03\xf2\x00\x03\x02\xf1\x00S\x00\a%\x205\x17%\x005@E\x205\x00\a\x15\x20\x15\x20%0E@5@5\xc0\x02\xf5\x00\xd0\b\x13\xc1\x01\x02\x11\x82\x01\x13\xa4\x01\x19\xf8\x02\tH\x13\x18Y\b\x8b\x01\xe8\x01\xf4\x00\x02\x13\xf2\x00\x03Q\x02\xf3\x00\x80\x16\x13\x02\xd1\x01\xf2\x00#\xa4\x01\b\t\x98\x02\x1a\x1b\x1a\xf8\x00\x13\xf8\x00\n\xfb\x00\n\xa8\x02\t4\x02\x13\xf2\x00\x03\x02!\x02\x13A#\xf0\x15\x13\xe1\x01\xf2\x00#\x84\x01\x19\xb8\x02\x1a;\nh\x13\xf8\x00\n\xfb\x00\n\xf8\x00)\xf8\x00\x19D\x13\xf2\x00\x03\x02\x11#Q\x13\x01\xd0\x15\x13a\x02a\xf2\x00#\xf4\x00\x98\x01)\xa8\x01\x13K\nX\x13h\nk#Xi\x98\x01\t$\x02\x13bC\xf1\x00\x13\xd0\x15\x13\xc1\x01\xf2\x00#d\xa8\x01I\xa8\x01\n\x13KX\x13X\nk#\nX\xf9\x00\x98\x01\t\x14\x12\x13b\x13\x02\x91\x01\x13\x01\x90\x15\x11\x13\xb1\x01\x82\x01\x13d\t\xf8\x00\x89\x018\x1a\x03J[\nH\x13X\nk\x13\nX\x99\x01\xa8\x014\x13R\x13\x81\x01\x02\x01#\x80\x15\x023\xa1\x01\x82\x01\x13d\x88\x01\x99\x018\n\xcb\x01\nH\x13X\xfb\x00\x13\x0bX\x99\x01\xb8\x01$\x02\x0323\x02a\x12\x11\x13\xe0\x14\x01\x13\x02\x01#\x02Q\x02\x03\xf2\x00\x13d\x88\x01\xb9\x018\n\xcb\x01\nH\x13H\n+\x13\n+\n\x0bX\xa9\x01\xb8\x01\t\x14\x02S\x12\x13\x91\x01\x02\x13\xc0\x14#1#\x021\x13b#d\x98\x01\xb9\x018\n\xcb\x01\nH\x13H\n+#;\nX\xb9\x01X)(\t\x14S\"\x03\x02\xa1\x01\x03\x01\xa0\x14#Q\x02#\x11\x03\xf2\x00\x03\xf4\x00(9H\xb9\x018\n\x0b:#K\x18\t(\x03h\n\x0b#\x0b\n;\nX\xa9\x01HI(\x143R\x03\xa1\x01\x02\x03\xa0\x14#a\x02\x13\x12\x03b\x13d(\xf9\x00\x18\xb9\x018Z\x0b\x13;\n\x18\t(\x03h\x1a\x13\n\x0b\n;\nh\x89\x01HY(\t\x043\xf2\x00\xa1\x01\x03\x01\x80\x14\x13\x02\x81\x01\x02#b\x13d8i8Y\xe8\x01\x0b\x13;\nH\x13(\x14(\x1a\x0b\x18\x1a;\nX\x89\x018\xf9\x00(Sb\x01\x02\x81\x01\x02\x13\xf0\x13\x13A\x02\x01\x02!\x02#2\x13TX\xf9\x00H\t\xa8\x02\n\x0c+\x1a\x0bH\x03\x048\x19\xf8\x00\n\x1b*\x98\x01)Xi83\x04#bA\x021\x02\x13\xd0\x13\x01\x03\x02a\x02!\x03\x02#\x12\x13TX\x89\x01\x88\x03\x0b\x03\x1b\x1ah\x03\xe8\x01\x1a\x1b\xc8\x02i(\x13D\x02\x13R\xb1\x01\x03\x02\xc0\x13\x13\xb1\x01\x03\x12CTh\x89\x01hl\xb8\x01:8\t(\x0c\xe8\x01\x0b\xc8\x02\x19\bY(#T\x13b\xa1\x01\x13\xb0\x13#\xa1\x01\x0323Dh\x89\x01X\x1c=<\xe8\x02\x13\\\xa8\x02\t\xf8\x009()(\x138D#B\xb1\x01\x13\xa0\x13\x131\x02Q\x02\x03234h\x99\x018\x1c\r\x0em,\xa8\x02,\r\x0cM\x1cH\x19\x98\x01\x04\x88\x01\x04\x19\xf8\x00\x13h$\x02\x13R\xf1\x00\x02!\x13\x80\x13\x02\x13\x81\x01\x02\x13BC\x14\th\x89\x018\x0c\xbd\x01,h9HL\x0e\x0c]\x1c(Ih\x19\x88\x01)h\x13\x88\x01$#2\x03\x02\x01\x02\x81\x01\x02\x03\x01\xf0\x12#\x81\x01\x02\x03Rc\b\tX\x89\x018\x0c\xbd\x01,XIHL\x0e\x0c\r\x0e=\x1c89\xf8\x00\t\xa8\x01\th\x038\tX$\x13B\x03\xb1\x01\x13\xf0\x12\x03\x02\x91\x01b\x03D#h\x89\x01(\x0c\x1d\x0e=\x1e]\x1c8Y8,\r\x0c\x03\x0e\x0c\r.-\x1c\x88\x04\x13H9(4\x13\x042\x03\xb1\x01\x03\xe0\x12\x13A\x02AR\x13T#X\xf9\x008\x0c\r>\x9d\x01\x1c\x18\t\bY8\x1c\x1d\x0c\x03\r\x0c\r\x1eM\x0c\x98\x01I89H\t(\x138\xf9\x00\x18$\x02\x03R\x03A\x121\x13\xd0\x12\x03\x02\x91\x01R\x134H\x13X)h\x1c\r>M.-\x0c8Y8\x1c\x1d\x0c\x03\x1c\xfd\x00\x1c\x88\x01I8Ih\x138\x89\x01\x184\x13R\x01\x02\x81\x01\x02\x03\xc0\x12\x02\x03\xa1\x01B\x134\x18\t(#\xe8\x01\x1c\r>=>-\x1c(Y(,\x1d<=\x0e-\x1c\x88\x01I(YX\x13H\xf9\x00(D\x13R\x81\x01\x02\x01\x03\x01\xa0\x12\x02\x13\x91\x01B\x13$\t\xf8\x00#\xd8\x01\x0c=\x0eMN\x1d\x1c(Y(,\x1e,=\x1e-\x1ch\t\x189\x18i8#X\xf9\x00(\t4\x13b\x91\x01\x13\x01\x90\x12#\x81\x01B#$(\x19\x18\t\x18#\xf8\x00\x198\x9d\x01>-\x1c(9H,\x1e\x0c\x03\x0c\r\x1e\r\x1e-\x1cX\x19(\x19(i(\x138\x19\x18\xf9\x0084#b1\x021#\x80\x12\x02\x13\x11\x121\x02\x012#$\x18IH#X9(\x0c]\x1e-\x0eM\x0c(\t8\t(,\x1d,.],\b\t()hY(\x13\xc8\x01)X4\x02\x03b1\x02A\x13\x80\x12#\x91\x01\"#\x02\x14(IX#HI\x18\x0cM.\x8d\x01\x0c\xc8\x01\x1c\x1d,\x8d\x01,H9\xd8\x01\x13\xb8\x01\x0c\x98\x01\t4\x13b\x81\x01#\xf0\x11\x13\x91\x012#\x148Y\x18\t(\x13HI\x18\x0cM.=\x0e-\x1c\xc8\x01\x1c\x1d,\x8d\x01,H9H\th#\x18\tXlh\tD\x03b\x81\x01#\xe0\x11\x13a\x02!2\x03\x12\x14\tH\x19\x88\x01\x13898\x0cM\x0eM\x0e-\x0c\xd8\x01\x1c\x1d,\x1d\x1e=,\xb8\x019h\x03\xf8\x00,]\x1c8\t\x18D\x13R\x91\x01\x13\xe0\x11\x13\x91\x012\x13\x02\x14\t\x98\x02#8\x198\x0c\xfd\x00\x1eM\x0c8)h,\r\x0c\x03\x0c\r>-,(\t(\x99\x01\x18\t\b\x04\x03h\x1c\xad\x01\x0chD\x13R\x91\x01\x13\xc0\x11\x01\x03\xa1\x012\x03\x12\x14hL\xf8\x00#\x88\x01\x04\x1c-\x1e\r\x1e=\x0c(Yh\\\r>\x1d<X\xa9\x01\x18\t\x13\xf8\x00\x0c]\x1eM\x1cX4#B1\x02A\x02\x03\x01\xb0\x11\x13\xa1\x01\"\x13\x02\x14\tH\x8c\x01\x03X#\x88\x01\x1c-\x1e\r\x1e-\x0c8Yh\\\r>\x1d<X\xa9\x01\b\t\x04\x13h\x1c]\x1eM\x1cX\t4\x13B\xa1\x01\x13\x01\x90\x11#\x91\x012\x13\x02\x14H,M<\b\x198\x13\x88\x01\x1c\x8d\x01\x0cH\xf9\x00XL]<X\xb9\x01\x18\x03()\x18\x1c\x1d\x1e\x1d.]\x0c\xf8\x004\x13B\x91\x01\x02\x13\xd0\x04\x15\x90\x0c\x13\x02\x11\x02!\x02\x112\x13\x02$8\x1c\xfd\x00,\x88\x01\x13\x88\x01\x0cM\x1ch\x89\x01h\x13\x0c=Lh\xa9\x01\x18\x13\x189\x18\x1c\x1d.M\x1e-\x1c\xf8\x00$\x13R\x91\x01#0\xf5\x00\xa0\x02U\x16\x05\x80\x0c\x13\x91\x012\x13$\t\x18,=\x1eM\x1c(\tH\x13\xa8\x01\x1c\x98\x01\x89\x01h\x13\x8c\x01\xf8\x009\x04I\b\x1389\x18\x1c\x1d.M\x1e=\x0c\xf8\x004\x13BA\x02A\x130\x05V\x05\xa0\x02\x05&\x15&\x05\xf0\x0b\x13\x91\x012\x13\x14\t(,=\x1eM\x1c()8\x13\xd8\x02\x89\x01h\x03\b\xfc\x00(\tHI\b\x04(\n\x1389\b,\x1d.\xad\x01\x0c\xf8\x004#2A\x02Q\x03\x01\x20\x05f\x05@\x05\x00\a`5&\x15&\x05P%0%\xd0\x02\x17\x05\xd0\x06\x13\x02\x91\x01\"#\x148\x1cM\x1e\r\x1e\x1d,()8#H\tX\t\x88\x01ih\x038\rX\x19h\t\b\x0b\n\b\n\x0b\n\x03HY,-\x0e\x1d.m\x0c\xf8\x004#2\xb1\x01\x13\x20\x05&\x05&\x05\x10\x15\x16\x15\x00U&\x05&\xa5\x01\x00\x05\x16E\x16\x15\x80\x02\x85\x01\xa0\x06\x13a\x02\x112\x13$(,\xfd\x00\x1e\x1d,h*\b\n\x1389H98ih\x03\b\t\x88\x019X\n+\x1a\x03h9\b,].\x1d\x0e=\x0c8\x19(4#2\xa1\x01\x13\x11\x00\x05&\x15\x165f5\xf6\x00\x15&\x15&\x05\a\x05&\x15V\x05@\x05\x1650\x05f\x05\xa0\x06\x03\xa1\x012\x03\x02$(,\x1d\x1e\x8d\x01\x1ch\n+\n\x0b#\x1898Y89\x88\x01\x03\x18\thIh\n\x0b\n\x13\x18#\x0b\x18\x19(,\x9d\x01.-\x0c8)\x18\t$#2\xb1\x01\x13\x01\x00\x05f%\x16%&\a\x15&\x156\x15&\x15&%&\x15&\x05\x06\x15@\x05F\x0505&\x05\xa0\x06\x01\x03\x91\x01B\x03\x02$(,\x1d.-\x0e=\x1ch\n+\n\x0b\b#\x18)8i8)\x88\x01\x03\x98\x01Ih\x0b\x1a\x03\x0b\b\n#\n\x18\t8,\x8d\x01>-\x0c89\b\t$\x02\x132\xb1\x01#\x00\x05V5\x165\x16%&%&\x15&\x15&%&\x15&%P\x05F\x0505&\x05\xa0\x06\x13!\x02Q2\x13$8,\x1d.\x1d.-\x1ch\x1a+\n\x18#\b)8i\x98\x01\x198\x03\x98\x01I(\x19\x18\n\x13\b\n\x0b#\x0b\n\xf8\x00\x1c-.->-8Y\x18$\x02\x132\x01\x02\x81\x01#\x00\x05V5\x165\x16%\x16\x15\a\x05&\x15&%\x16%\x16\a\x05\a\x05&\x15P\x05F\x05@\x15&\x15\xa0\x06\x03\x02\x91\x012\x03\x02$8\x04\x1c]N\x1d\x1ch\n;\n8\x13hI\xa8\x01)8\x03\xa8\x01)X\x04\n\x13\x1b\bK\n()\x18\x1c=\x0e=>\x1d\x0c8Y\x184\x132\xb1\x01\x13\x00\x05V5\x16\x15\a\x05\x16%\x165&\x15&%\x16%\x16\x05\a5&\x05@\x05F\x05@\x15\x16\x15\xb0\x06\x03\xa1\x012\x03\x02$\x18\t\b\x04,MN\x1d\x0ch\n;\x1aH\x13\x04X9\xa8\x01)8\x03\x18\t\xf8\x01\x1a\x03\n\b\nk\n()\x18,\x8d\x01\x0e\x1d\x0e\x1c8Y($\x02\x13\"\xb1\x01#\x05&\x05&%&\x15&%&\x156\x15&%&\x05&%\x16\x15\x16\x05@UP\x05&5\x80\x06\x01\x03\xa1\x012\x034H,M>-\x0c\x18\t(\nK\n\x0bX\x13h\x19X\x198)8\x03\xa8\x02\n\x03\n\b\x0b\x03k\n()(\x1c\xbd\x01\x1cHi\x184#\x12\x81\x01\x02\x11#\x05&\x05&%\xf6\x00%\x86\x01\x15&%V\a\x05\a\x05\x16\x05&\x05PEP\x05V\x05\x80\x06\x13a\x02!\"\x13$\t\x18\x19\x18,]\x0e-\x1c\x18\t\b\x1a[\n\xf8\x00\x13\xd8\x01)()8\x0389\xa8\x01\x03\n\b\x0b\x18\n[\n\x18)H\x1c-.M\x0cXi\x184#\"!\x12Q#\x05&\x15&%f\x17\x15\xf6\x00\x15&\x05\x00\x15F\x05\x10\x05V\x05\xf0\x01\x05f\x05\xf0\x05\x01\x13a\x02\x11\x02\x03\x12\x13$\t\x18\x19(<],H\x1a;\x1aX\t(\x13\x98\x03\x03(iX\x04\x13\n\b\n\x13k\n\xb8\x01,\r.-\x1chi(4#\x12!\x02a#\x85\x01\x20\xf5\x00\x20\xf5\x00\x00E\x20E0e\xf0\x01\x85\x01\xf0\x05\x13\xa1\x01\"\x13\x02$\b\t\x04)(,\rlh\n;\n\xc8\x01\x13X\x19\xf8\x01\x03(\xf9\x00H\x13(\nk\x1a\xe8\x01lX\t(i(4#\"\x91\x01\x02\x13\x01\xf0\x0f\x13\xa1\x01\"\x134Y8\x8c\x01\xf8\x00\x1a\x0b\x1a\x0b\xc8\x01\x13H)\x98\x01*\x18\x13(\xf9\x00H\x13(\nk\x1a8\t\b\t\x98\x01\x1cX9(i(4\x02\x13\"\x91\x01\x02#\xf0\x0f\x13A\x02A\x03\x12\x134\xb8\x03\x1a\x0b(I\x88\x01\x03\x88\x02\n\x0b\b\n\b\x13(\xf9\x00(#8\x1a;\x1a8\xf9\x00\xd8\x01Y\x18i(\t4\x02\x13\x12\x91\x01\x02#\xf0\x0f\x13\x91\x01\x02\x03\x12\x13$(j\x88\x03I8\x198\x13\xd8\x01\n+\n\b\x13(\xf9\x00\x18#h:\x0b(\xa9\x01X\x19XI(Y8D\x13\x12A\x12!\x02#\xe0\x0f\x01\x03\x02\x91\x01\x02\x03\x02#\x14\x18\n\x8b\x01\x1a\x0bhIX\t\x18I(98\x13X*\b\x0b\x1a;\n\b\x13(i(\x13\xd8\x01\t\b\xb9\x018\t\x88\x019(IX4\x13\"1\x031\x02#\xe0\x0f\x01\x03\x02\x91\x01\x13\x02#\x14\x18\n\xab\x01\nhYH\t\x18I(I(#H\n\x0b:K\n\b\x13(Y(\x13\x88\x02\xb9\x01\x98\x01\x1b8\tHIH4\x02\x03\"1\x021\x02#\xe0\x0f\x13!\x02a\x13\x02\x13$\b\n\xdb\x01\n(\xf9\x00\xf8\x00I\x18YH\x13(\xab\x01\n\x18\x13(I(\x13XIX\xc9\x01X\x0b\x1a;*\x98\x019(4\x03\"1\x021\x02#\xe0\x0f\x03\x02\xa1\x01\x03\x12\x13$\n+\x03\n\xab\x01\n\x18\xf9\x00\xe8\x01YX\x13(\n\xfb\x00\n\x0b\x18\x13\x98\x01\x138\x89\x01H\xc9\x01X\x9b\x01\n\xf8\x00Y\x184\x13\x121\x021\x02#\xe0\x0f\x03\x12\x91\x01\x03\x12\x03\x02\x14\b\n\x1b#;\n[\n\x18\xf9\x00\xe8\x01Ih#\x18*+*(\x04\x13\x88\x01#8\x89\x01X\xa9\x01(\t\x18\n\xab\x01\nhY($\x13\x121\x021\x12\x13\x00\a\xc0\x0f\x03\x12\x91\x01\x03\x12\x03\x02\x14\b\n\x0b\x13\x1a;\x03\nK\n\x18\xf9\x00H)h9(\x198#\x18\x1a\x1b*H\x13(\x04\t(#\x18\xb9\x01X\x99\x01h\xbb\x01\nhY(\t\x14#\x12!\x031\x12\x13\x00\a\xb0\x0f\x13\x12\x91\x01\x03\x12\x03\x02\x14\x18\x1a\x0b\n;3\n\x1b\x1a\x18\xf9\x0089\xf8\x00)(9(\x138\x0b\x88\x01\x13(\x19\x18#X\xf9\x00h\x89\x01h\nk3\x1ahY(\t\x14\x02\x13\x12!\x12!\x12\x13\x00\a\xb0\x0f\x13\x12a\x02\x11\x03\x02\x13$8\nK\n3\x0b\x1a\xe8\x01)\xd8\x01I8\x13\xf8\x00)\x18\x13(\t\x18\x04\x13(\t(9\xa8\x03\n;\n+\n\x13\nhiH\x14\x13\"a\x12\x13\x01\x00\a\xa0\x0f\x13\x02\x91\x01\x02\x03\x02\x13\x14\t8\n;\x1a\b:\x0bX\xfc\x00\xf8\x00\t\xa8\x019X\x13\b\t(9\x18\x13H\x1389H\xfc\x00\xb8\x01)8\n\x1b\n\x03;\n\xa8\x01YH\x14\x13\x12A\x02\x11\x12\x13\x01\x00\a\xa0\x0f\x13\x02\x91\x01\x02\x03\x02\x13\x14HK\x1a\x98\x01\xac\x01h\x19\xa8\x01\x19h#89\x18\x13H\x1389(\xac\x01\xa8\x019(\n\x1b\x13;\n\xa8\x01YH\x14\x13\x121\x02\x03\x01\"\x13\x01\x00\a\xa0\x0f\x03\"\x01\x12Q\x02\x03\x02\x13\x148\nK\n\x98\x01\x1c\r\x0c\x8d\x01\x1cX\x04\xc8\x02\x13(9\x18\x13(\x13X9\b<M\\H\x04\x18Y\x18\n\x0b\x13\x1a;\nH)\x18iH\x04\x13\x121\x02\x03\x11\x12#\x00\a\xa0\x0f\x03\"\x81\x01\"\x13\x148*+\nX\x04\b\x1cm\x1e]\x0c8\t\x18I8)\x88\x01#8\t\x18\x13\x18#\x98\x01\x1c\xad\x01<Xi(\n\x03\n\b\n;\n\x0b8I898\x04\x13\"\x11\x12\x03\x11\x12#\x00\a\x90\x0f\x01\x03\"\x81\x01\"\x03\x02\x14X\x0b*\xf8\x00\x1c=\x0e\x1d.]\x0e\x0ch9(Y\x88\x01\x13X\x13\b#\x1898\x0c=\x1e\x8d\x01,\x18\t(I\x88\x01\n;\n(IHI(\x04\x02\x13\x12!\x02\x03\x11\"\x13\x00\x17\x80\x0f\x01\x03\"\xf1\x00\"\x13\x02\x14\xf8\x00\x1a\xf8\x00\x1c=\x0e\x1d.\xfd\x00\x0cX9\x18i8\t\b\t(\x13HC(I\x18,\x1d.\x9d\x01\x1ch)\x98\x01\n;\n(I8Y(\x04\x02\x13\x12!\x02\x03\x11\"\x13\x00\x17\x80\x0f\x01\x03\"\x01\x02\xf1\x00\x02\x13\x14\x98\x02\x1c\x1d\x0e\x1d\x0e-\x0e=\x1e-\x1c8I\x18iH\tH\x13(C(Y\x18,\x1d.-.=,\xa8\x0198\x1a\x1b\x1a\xb8\x01Y(\t\x04\x13\x121\x03\x11\"\x13\x00\x17\x90\x0f\x03\"\x01\x02\xf1\x00#\x14\x98\x02\x0c-\x0e\xfd\x01\x1cH)8\xf9\x00\x1898\x13\x1838I\x18,-\x1eM\x1e=<\x98\x0198*\x0b\xd8\x01Y(\t\x04\x02\x03\x12\x01\x02\x11\x03\x012\x03\x01\x00\x17\xf0\x02S\xb0\x0b\x13\x12\x91\x01#\x14\x98\x02\x0c\xbd\x01\x0cm\x1cX\tHY\xc8\x01\x13\b#8Y\x18\x1c-\x0e\xad\x01\x1e\r,\xa8\x01)H\x04(\t\xc8\x01I(\t\x04\x02\x03\x121\x12\x01\"\x037\xd0\x02\x023\x1f#\x90\x0b\x13\x12\x11\x02#!3\x14\x98\x02\x1c\r\xbc\x02\xb8\x019\xf8\x01CHI\b\x1c-.\x9d\x01\x1e\r,\xc8\x01\t\x88\x01\t\xd8\x01)8\t\x04\x02\x03\"1\x02\x01\x12\x137\xd0\x02\x13\x1f\x03?\x13\x80\x0b\x13\x12\xc3\x01\x02\x93\x05\xf4\x00\x184\x98\x01\x19\b\t\x14\x18C\xa8\x01\x1c-\xac\x02\x93\x02\xa8\x03\x043\x02A\x03\x01\x02\x13G\xc0\x02\x02\x03?\x03?\x13\x80\x0b\xf3\x00!\xf3\x02\x0c3L\xc3\x06\x88\x01L\xa3\x01@W\x00\x97\x01\x20\xb3\x04\"3\x017\xc0\x02\x02\x13\x0f\x03/\x03?\x13\xf0\n\x01#\x02a\x02S\xf8\x03\x13\x1c\x13\xf8\x00\xe3\x03\x10\xc3\x01\x00\a0\xe7\x05\x00'\x20\x1707\x11C\x01g\x80\x02\x12\x13\x02\x13_\x03?\x13\xe0\n3\x81\x013\x14\x88\x02\x03\xdc\x02\xd8\x01\xa3\x01H#\b#\xa0\x01\xf7\t\x00g\x90\x01\x12\xc3\x01\xbf\x01\x03\x02\xc0\n\x01\x13\x12\x81\x01\x02\x13\x02\x14X)\xf8\x00\x1c\xed\x01.\r,\xb8\x03\x13(\x13\b\x13\x97\x0c@\x12\x13\x12\xa8\x01\x02\x13\xff\x00\x03/\x13\xb0\n\x13\x12\xa1\x01\x13\x02\x14\x18\t\bYh,\x0e=\x1e-\x0e-.\x1d\x0c\x98\x02\t\x88\x01\x138\x13\x18\x13\x00\xe7\x0b\x20\x02\x13\x12\x88\x02\x13\xaf\x01\x13\x02\xa0\n\x13\x121\x02Q\x02\x03\x02\x14\x18\x89\x01h\x1c=>\r.\x1d.,\xf8\x00\n\x1b\n\x0b8)X#H\x138\x13\xb7\x0b\x10\x02\x03\x02H:\x0bHI(\x13\xaf\x01\x13\xa0\n\x13\x121\x02a\x03\x02\x14\x18\x89\x01h\x1c=>\x1d\x0e-\x1e\r,h\n;\n89\b\t(\x13X\x13H\x13\x00\x97\x0b\x02\x13\x02HK\n\x0b8Y\x18\x13\xbf\x01\x03\x02\x90\n\x03\"\xf1\x00\x02!\x13\x14\xa9\x01h<\x0e\r>\x8d\x01\x1c\nX\nK\n8Y\x18\x03\xf8\x00\x13X\x13\x00\xd7\n\x02\x03\x0c\xf8\x00\x02\x03[\x1a\x18i\x18\x13\xaf\x01\x13\x90\n\x03\"\xb1\x01\x13\x14\xe9\x018<-\x0e=\x1e=\x0c\xf8\x00k\n(I\x18\x03(9\x18\x138\t(\x13\x20\x17\x20'\xb0\b\x01\x10#\x02\x98\x01\x0b\n\x03k\n\b\xf9\x00\x18\x13?\x03_\x13\x80\n\x03\"\xb1\x01\x02\x03\x14\b\x89\x01\b9HL]\x0e-\x1c\x88\x01k\n()\x18\x138I\b\x138\x19(\x13\xc0\t\x02\x13\x02\xb8\x01\x1a\xbb\x01\bi(\x03\xbf\x01\x13\xf0\t\x03\"\xb1\x01\x02\x03\x14\x18Y(\x19\x04X\nL\xfd\x00\x1c\x88\x01\xfb\x00\n(\t(\x04\x13(Y\b\x138\x198\x13\x90\t\x02\x03\x0c\x02\xd8\x01\nK\n\x03;\b\n\x18Y(\x13\xaf\x01\x13\x02\xe0\t\x032\xb1\x01\x03\x02\x14\b9H\t\x04\t\x18\x0b8\x0b\x03\xac\x01\xb8\x01k\n\x18\t(\x13XI\b\x13(I(\x13\xe0\b\x138\x19\x04\t\xa8\x01\n;\n\x13;\n\x18Y8\x13\xaf\x01\x13\xe0\t\x132\xa1\x01\x13\x14\xc8\x01\x1a\x1b\x1aH\nL\xe8\x01\n[\n8#\xf8\x009\b\x13\b\xf9\x00(\x13\xa0\b\x02,\x03(\x19\x04\x19\x18)hZ\x13+\n(9X\x13\xaf\x01\x13\xd0\t\x01\x03\"!\x02\xf1\x00\x13\x148\x19h\x13;\n\x0b\xf8\x02\x1a;\x03\x0b(#H\t(9\b\x13\b\x99\x01(\x03\xf0\a\aL\r\xf8\x00ih\x04\x18\x1a\x03\x1b\n8\t\x98\x01\x13\xaf\x01\x03\x02\xd0\t\x032\xa1\x01#\x048)X\x13K\n\x88\x01\t\b\t\xb8\x01\x1a;\n\x0b(\x13X\t(9\b\x13\b\xa9\x01\x18\x13\xd0\a\x03\x1c\x1d,\xf8\x00i\xa8\x01J(\x19\x98\x01\x02\x03\xaf\x01\x13\xd0\t\x13\"Q\x121\x13\x04\xc8\x01\x03\x0c[\nhI\xb8\x01\x1a\x1b\x1a\x18\x13\xb8\x019\b\x13\b\xa9\x018\x03\xa0\a\x03\x0c\r\x1e\x1d,\x18\tHi\xb8\x01\x0b\n\x0b8\x19\xa8\x01\x13O\x03O\x13\xc0\t#\"\xa1\x01\x13\x04\xc8\x01\n\x03[\x1aXY\b\t\b\x04\xf8\x00:\x18\x138lH\t\b\x13\b\xb9\x018\x03\xe0\x06\x02\x03\x1cM,\x04\b\x19HY\xf8\x00I(\t\b\x19\x04\x19\xa8\x01\x13\xaf\x01\x13\xc0\t\x13\"\xa1\x01#\x04\xa8\x01\x0b\n\xfb\x00\nHi(I\x88\x01\x038,-L(\t\b#\b\xa9\x01H\x03\xd0\x06\x03\x0c\r\x0e\r.\r,\x04\b\t\xf8\x00\x19X\x99\x01\x18\x19\b)h\t8#\xaf\x01\x03\x02\xb0\t\x132\x91\x01\x02\x13\x04\x98\x01\x0b\n\xab\x018Y(Y\xf8\x00\x13(,M<(\t\b#\b\xa9\x01H\x13\xc0\x06\x0c\r\x1e\r.\r,\x04\xa8\x01\tX\x89\x01H9h)\x18\x02\x13O\x03O\x13\x02\xa0\t\x13B\x91\x01\x02\x03\x048\t(\x1a\xbb\x01\nHI(iH#(\x03\x0c\x9d\x01\x1c\b\x19\b\x138\x89\x01h\x03\xa0\x06\x1c\x1e\r.\r,\x04\x98\x02\x99\x01\xe8\x01I\x18\x02\x03\xbf\x01\x13\xb0\t\x02\x03\"1\x02a\x13()\b\x03k\n\x03K\nX)(\xf9\x008#8\x1c\x1d\x0e=\x0e\x1d\x1c\x18\t\b\x13XY\x88\x01\x03\xf0\x05\x02\x1c\r\x0e-\\\x04\xa8\x02\xf9\x00\xd8\x01i(\x13\xbf\x01\x13\xb0\t\x032\xf1\x00\x02\x11\x13\x04\x18)\b\n[\x1a\x13;\n\xb8\x01\xf9\x00(\x13X\x0c\x1d.-\x0e-\x1c\b\t\b\x13\x88\x01\t\xb8\x01\x13\xc0\x05\x02\x03\xac\x01\x14\x19\xf8\x00*\xf8\x00)\x18\t\xe8\x01\xf9\x00\x18\x02\x03\xbf\x01\x13\x02\xa0\t\x13\"\xf1\x00\x02\x11\x02\x13\x18)\b\nK*\x13;\n\xb8\x01\xf9\x00\x18#H\x1c\x1d.m\x1c\r\t\b\x13\xd8\x02\x13\xc0\x05\x03\x02\xac\x01\x04\b\t(\x04H\n\b\x1a\xf8\x00\t\xf8\x00\x04\x98\x01\xf9\x00(\x03\xcf\x01\x03\x02\xa0\t\x132\xa1\x01\x13(\x19\x18\n+\x1a\b\n\x13+\n\x189hi\x18\x13h\x1c\x1d.-\x0e-,\x18\x138\tH\x0b\x1a+\x1aX\x03\xa0\x05\x03\x028,H\t(\n\x1b\x03\n\x18\n[\x1a\x98\x01\xec\x01\x98\x01\x02\x03\xcf\x01\x03\x10\x025\xb0\b\x01\x032\xa1\x01#\x18\t(\x1a\x0b\n(\x0b\x13\x1b\x1a8\x04\thI\x18#\xf8\x00\x1cm.\x1d,\x18\x13()8\n\xfb\x00\x1a8\x03\x80\x05\x12\x18\th\tH\n+#\xfb\x00\n\x88\x01\x0c-.=>\x1d,8\x19\x18\x13\xbf\x01\x13\x15F\x05\xa0\b\x13\"1\x12Q\x13\b\tH\x1aH\x1a\x0b\x1a\x0b\xa8\x02\x13\x98\x01\x1cM\x1e\r\x0e-,\x18\x13\x189(\n\xab\x01\n8\x13\xd0\x04\x02\x03\x18\x04\xd8\x01K#[\n\x88\x01\x0cM\x1e=>-\x0e\r\x1cX\x02\x03\xcf\x01\x03\x15V\xa0\b\x1321\x02Q\x13\b\tH\x1aX*\x0bh\x04\xa8\x01#\x98\x01\x1cM\x1eM,\x18\x13()(\n\xab\x01\x1a(\x13\xd0\x04\x13\xf8\x01[#K\x1a\x0b\xf8\x00\x0c\r\x0e\x8d\x01>]\x1cX\x13\xbf\x01\x03\x02\x156\x05\xa0\b#2\x91\x01#\xa8\x01\x19\x98\x01\x9c\x01\x03\x18#H\x198\x1c\xbd\x01,\x18\x138\t8\n3\xfb\x00\x1a8\x03\xc0\x04\x03XIX\x8b\x02h,\x1d\x1e\xdd\x01\x0e-\x0cX\x03_\x03_\x03\x02\x15\x16\x15\xb0\b\x132\xa1\x01\x13\xb8\x0198,\x8d\x01<\x03HI8\x1c\xad\x01,\x18\x13H\t8\x1a#\xfb\x00\nH\x03\xb0\x04\x03(\xf9\x00h\xbb\x013\n\x18\t(<].\x8d\x01\x0e-\x0cH\x13\xbf\x01\x13\x15\x16\x05\xc0\b\x132\xb1\x01\x13\xa8\x019(\x1c\x1d\x0em\x1c\b\x13Hi(\x1c\r\x0e\x1d.=\x1c(\x13\xb8\x01\x0b\n\x8b\x01\nX\x13\x90\x04\x02\x18\x89\x018\x19\b\n\xab\x01#\x0b\n\x18\t8L=.=.M,8\x02\x03_\x03O\x13\x02\x05\x16\x05\xc0\x01\a\x00\a\xc0\x06#\"\xb1\x01\x13\xa8\x019(\x1c\x9d\x01\x0c\b#H\xf9\x00\x18\x1c=.-,(\x13\xf8\x00\t8\n+\x13;\nX\x13\x80\x04\x12\x18\x89\x018\x19\b\x04\n\xdb\x01\n\b)(\xfc\x00\xfd\x00.M,H\x03_\x03O\x13\x02\x05\x16\x05\xf0\x00\a\xf5\x00\xc0\x06\x132!\x02!\x02!\x02\x13(9(9\x18\x1c=.\x1d\x1c\b#\b\x0c8\xf9\x00\x18<\x1d.-\x1c8\x13h\x19(\n;#\x1b\x1a\xf8\x00\x03\xf0\x03\x02\x18\x99\x01()\x18*\xbb\x01\n\b)8\x04\xac\x01\x8d\x01<\x04H\x03\xbf\x01#\x05&\x05`\x05f\x05\xc0\x06\x01\x032\xb1\x01\x13(9\xf8\x00\x1cM.\r\x0c\x18\x1c\x18,(i8<M,H\x13h\x19(\n+\x1a#\x1a\x98\x01\x03\xe0\x03\x03\x18\x89\x01(I(\x04\n\x8b\x01\b\n(\tH\x19\x18\x9c\x02\r\x0c\x14H\x13_3\x0f#\x05&\x05P\x05\xf6\x00\x05\a\xc0\x06\x13\"\xb1\x01#\x189\xf8\x00\x1c]\x1e\x0c\b\x03\x1c\b\x03L\x18iX\xfc\x00(\t(\x13\x98\x01\x0b\n;\n\b\x1b\x1a\xa8\x01\x13\xd0\x03\x03\x18\xf9\x00\x98\x01\x1b\b\x0b*;*\x98\x01)($\xdc\x01\x14\b\t83\x0f\xa3\x01\x05&\x050\a\x00\x05\x16%&\x05\xd0\x06\x01\x032\xa1\x01#()\x18\tH\x1cm\x0c\x03\b,\b\\\x18ihL\x88\x01\x13\x98\x01\x1a;\n\x88\x01)H\x13\xc0\x03\x03\x18Y\x98\x01\x02cZ\x04\xb8\x01)\x18$(\xac\x01\x04\x18\t8\xf3\x01\x05&\x05P\x05\x165\x16\x05\xe0\x06\x032\xa1\x01#8I8,\r.\x1d\x0c\x18\x0c\b\x0c\b\x0c-,\x18i\xd8\x01\tX\x13\x98\x01\n\x0b\n+\n\xf8\x009X\x03\xc0\x03\x03\x189\x98\x01\x13\xf2\x00\x13\x02\x98\x01\x02XIH4h\x19H\x04\xf3\x01\x05&\x05@\x05&5\x16\x05\xe0\x06\x01\x03\"1\x02a#(Y(,\r.\r\x0c\x18\x0c(\x0c=<\bY\xa8\x01\t\x98\x01\x138\t\xf8\x00*\x88\x019h\x03\xa0\x03\x12\x18\x19h\t(\x03\xb2\x01\x138\x02\x83\x01\x04\b9\bi\xa8\x01\t8\x04C\xf2\x00#\x05&\x05@\x05&5\x16\x05\xf0\x06\x132\x91\x01#8I(,\x1d\x0e\r\x0c\b\x03\x1c\b\x1c\r\x0e-<\x18Ih\t\x18\x198I\b\x13\x18YX\x0b\n\x18)89(\t8\x03\x90\x03\x03\x88\x01)\x18\x04\x03\xc2\x01\b\x03(\x02\x03\x82\x01\x13\x028\x19\x04\t\xb8\x01\tX\x04\x02#\x92\x01\x13\x05&\x05P\x05\xf6\x00\x05\xf0\x06\x132\x91\x01#8I(,=\x0c\b\x1c\b\x1c\x1d\x1e\x1d<()\xa8\x01\tHI\b\x13\x18i\x88\x01)8)8\x19(\x13\xf0\x02\x02\x03\xb8\x01\x14\x02\x13\xb2\x01\b\x03\x02\b\x02\x13\xa2\x01\x038\x19\x04\xd8\x01\tH\x04\x02\x13\xa2\x01\x13\x05&\x05P\x05\xf6\x00\x05\xf0\x06\x01\x132A\x12\x11\x02#(I(,-\x0c\b\x13\b\x03=\x0e-<\x88\x01)8)(Y\b\x13\x18\xf9\x00\x18\x19(I\xf8\x00I(\x13\xd0\x02\x02\x03H\x03\"\b$\x02\xc3\x01\"\x03\x02\b\x04\x02\x03\xb2\x01\x03\x02(\x19\xa8\x02\x04\x02\x04#\xa2\x01\x13\x05&\x05`\x15&\x05\x16\x05\x80\a\x01\x032\x91\x01\x02\x13(I(<\r\x0c\x03\x0c\x03\b\x03\x0c\xfd\x00,\x88\x01I()(i\x13\b\xf9\x00(9\x189hi8\x03\xc0\x02\x03H\x03\x00\x12C\x02\x00G\x00\a\"c\x02\x04\x13\xd2\x01H\x04#\x028)X4\x03\xc2\x01\x03\x02\x05&\x05\xf0\x00\xf5\x00\x90\a\x132\x91\x01#\x98\x01\x04\x0c\r\x1c#\b\x1c\x8d\x01,hi\x98\x01Y\x13\x18i(\x19\xe8\x01YX\x03\xa0\x02\x02\b\x02(\x03\x02'0\xe7\x01\x20\a\x12\x93\x01B\x038\x02\x132\x13\x02$8D\x02\x13\xc2\x01\x03\x02\x05&\x05\x90\t\x132A\x0213\x18\thL\x03\b\x03\x1c=\x1e-,h\xf9\x00\x88\x01Y\x13\x18i\xb8\x02YX\x03\xa0\x02\x03\x02(\x02\x03\x00\xb7\x01\xf0\x00'\xf0\x00\x12c\"\x038\x02\x03R#\x02\x84\x013\xb2\x01\x13\x02\x05&\x05\xa0\t\x03B\x91\x01#\x98\x01<\x03\b\x03\x0c]\x1e\x1d<X\x89\x01\x98\x019\b\x13\x18i8\x9c\x01hIh\x13\x80\x02\x12(\x13\x02\x17\xf0\x02\a\x10'@\x12C\x02\x18\x04\x03\xf2\x00\xe3\x01\xc2\x01\a\x03\x15&\x05\xa0\t\x13RA\x12\x11#\x88\x01\x04\x03\x0c\x03\b\x1c\r.=\x0e\x1d,\xf8\x00iX)h\x13\x18I8\x1c\x8d\x01,H9\x98\x01\x03\x80\x02C\x02\xc0\x03\xd7\x01\x00\x03(S\xf2\x00c\xf2\x01\x03\x02\x156\x15\x90\t\x13R\x81\x01\x023h\x1c\x13\x0c\x1d>],\x98\x01Ih9X\x04\x03\x189(\x1c\xbd\x01\x0e\x1c(9\xb8\x01\x03\xb0\x02\a\x90\x04\xa7\x01\x003'\x02\xf3\x00\xc2\x02#\x02\a\x05V\x05\x90\t\x13R\x91\x01\x02#\x04\b)\x18\x13\b\x1c\x1d>],\x98\x01\x19\xf8\x00YX\x04\x03\x189(\x0c\x9d\x01\x0e=\x1c\x18\t\x18\t\xb8\x01\x13\x90\a\xf7\x00#\x00G\x12\x93\x01\xd2\x013\x12\a\x05\x036\x05\xa0\t\x01\x13R\x91\x01\x02#4#\x18<.],H:X\n\x0bHYX\x03\x18\x198\x0c=\x1e=.=\x1c\x88\x01*\x0bH\x13\xe0\a\xa7\x02\x05\x93\x02\x02\x10\x12e\xc0\t\x13\xf2\x00\x81\x01\x023\x04#8L=LH\n+\n8\x1a\x0b\nXIX\x03\x04X\x1c\x1dN\x9d\x01\x1ch\n\b;\nX\x03\x90\x01%\x90\x06G\x20\a\x02\x17@\xf7\x01\x00G\x00\x05\x02\x06\a\x05\x80\n\x13\xf2\x001\x02Ac(\t(\x9c\x01h+\n\x03\x0b\x18\n;X9h\x13H\x1c-^-\x0e]\x1chK\nh\x03\x80\x01\x05\x06\x05\xc0\x06\a\x90\x01\x97\x03\x05&\x05\x80\n#b\xa1\x01C\x88\x01\xfc\x00h\n+\x13\x1b\n[H9h\x13H,\x1d^-\x1eM\x1chK\nh\x03\xf0\x00\x15\x06\xb5\x01\x10\a\xc0\x06\xd7\x02\x00\x05&\x05\x90\n\x13\xf2\x00\xa1\x013\xf8\x02\n+#k\nH9h\x13H\x1c-^-\x1e]\x0ch\n;\n(\t8\x13P\x15\xc6\x01\x05\a\xd5\t&\x05\xa0\n\x13\xf2\x00Q\x02!3\x18\t()H\x19\xf8\x00\n+\x1ak\x1aH9(\x19\x18\x138,=\x1e]\x1e]\x0ch\n;\n\x98\x01\x03@\x05\x86\x0c\x05\xb0\n#ba\x02SH9\xd8\x01\n\xab\x01\x1ah\x19(9\b\x138,\xbd\x02\x0c\xf8\x00\n[\n\x0b(\t\x18\x130\x05\x86\x0c\x05\xb0\n#R\x03\x02Q#\x02#H9\xd8\x01\n\x8b\x01*\xc8\x01\t\x04\x19\b\x138,\xed\x01\x1e-\x0c\xf8\x00\n;\x1a\x13\n\x0b8\x130\x156\x005\xe6\n\x05\xb0\n\x01#R\x03\x021#13\x189H\x19\xf8\x00\nk\n\x1b\xd8\x019\b\x138,M\x0e=.\x1d.\x1d\x0ch\x0b\n;#\x0b\x1a\b\t\x18#\x20\x15\x16\x15P\xf5\x04\xd6\x05\x05\xc0\n\x01\x13b\x03\x02\x11\x02\x13\x02A3\xf8\x00Ih\x1a[#\x18\t\x18)\xf8\x00\t\x18\x138,=.-.-\x0e-\x0cH\n#;\x1a\x1b\x1a\b\x19\x18#\x01\x00\x15\x16\x05\xa0\x06\xe5\x04\x16\xf0\n\x01\x13b\x03\x02\x01\x13\xf1\x00CHYH\t\x18\x1a[\x13\x0b89\x98\x01\x138,->=\x1em\x0c8\n\x1b\x13\xfb\x00\x1a\b\x19\bC\x01\x15\x06\x05\x80\x0b\a\x05\x16\x05\xf0\n#b3\xf1\x00\x02CHI8\x19\x18\x1a\xfb\x00\n89\x98\x01\x138,->\xcd\x01\x0c8\n\xcb\x01\n\b\x19\bS\x15\x06\x05\x90\x0b\x05\x06\x15\xf0\n\x013B#\x11\x02\xf1\x00C89H\x198\x1aK\n\x0b(I\x18\th\x138,=\x1e-\x0e=\x1e=\x0cH\n\xab\x01\x1a8\x13\x01\x02#\x15\xb0\x0b\x15\xa0\x0b\x01\x93\x01\xd1\x01#(\x19\xf8\x00\tH*\x0b*h\tX\x1a(\x138\n\x1c\xfd\x00\x1e=\x1e-\x0cX\x1a\x8b\x01\nH\x13!3\xf0\x17#\x02\x03\xe1\x013\xb8\x01\x19H*\xe8\x01\n\x1b\n\x0b\n#\x1a\x18,\x8d\x02\x1cX\x0b\x1aK*8#13\x01\xb0\x17\x01\x00\a\x13\"\x03\xe1\x01#\xb8\x01\x19\xd8\x02;\n\b\n#\x1a\x18,\x8d\x02\x1c8\t(\xfa\x008\x13\x02AC\xc0\x055\xa0\x11\x17\x132\x03\x81\x02#\x98\x019\xa8\x02\nK\n#;\x18,M\x1e\xfd\x00\x1c(9\xc8\x01\x13\xf1\x003\x10\a\xe0\x04%6\x15\x90\x11\a\x13B\x03\x02Q\x12\xf1\x003\xf8\x00)\xc8\x02\x03[\x13+\n(,-.m\x1c(I\xa8\x01\x13\x91\x01C\a\x00\a\xc0\x04\x15V\x15\xa0\x11#b\x81\x023\xf8\x01\xf9\x00X\x0b\nK\x13+\n(\x04<\x0e\xfd\x00,(Y\x98\x01\x03a\x02A3\x00'\xb0\x045&\x05\xc0\x11\x01\x13b\x91\x023\xd8\x01\x99\x01X\nK\x13\x1b\x1aH<]<(i\x88\x01\x13\xc1\x01\x02#\x00'\xc0\x04%&\x05\xd0\x113R\x01\x02\x81\x023\xb8\x01\xa9\x01X\n;\x13\x0b\x1a\x88\x01\x8c\x018\xf9\x00h\x13\xf1\x01#\x10\x17\xd0\x04\x15&\x05\xe0\x113bQ\x02!\x02\xf1\x003\x98\x01\xb9\x018\x0b\x1a+\x13\x1a\xe8\x02iH#1\x02a\x02!\x02\x13\x02\x03G\xc0\x04\x05&\x15\xf0\x11\x01#b\xb1\x0238\t(\xb9\x01(\n#\x1b\n\x13\n\xc8\x02\tH)(C\xf1\x01\x02\x03\"\x03\x01G\xa0\x04\x15\x16E\xf0\x11\x01#R\xc1\x02#h\x89\x018\x0b\n[\n\x13(\t\xa8\x01\x19H\x19\xf8\x003\xa1\x01\x02A\x02\x132\x03g\x90\x04\x05V\x15\x80\x12\x01#b\xb1\x023X\xf9\x008\x1aK\x1a\x13(9\xf8\x00)\xb8\x01C\x81\x02\x02\x132\x13g\x80\x04\x15V\x15\xf0\x11\x17\x10\x13bA\x02\xe1\x013hI8\x1a;*\x03\x04(IXI\x88\x013\xc1\x01\x021\x82\x01\x03\x00g\x80\x04\x85\x01\x90\x127#R\xd1\x02Ch\tXJ\x18\x138Y8YX3\x91\x01\x12\xf1\x00\x82\x01\x13\xf7\x00\xc0\x177\x01#Ra\x02Q\x02Q\x02S\x98\x02\x13(i8\t\b\x19H3\x02\xa1\x02\x02\x03\x82\x01\x13\x87\x01\xe0\x17'\x01\x13b\xc1\x01\x02a\x02S\x88\x02\x13(i\xa8\x01C\xb1\x02\xa2\x01\x13\x00\x87\x01\xf0\x177#b\xd1\x023\xb8\x019\b#\x18i\xf8\x00Ca\x021\x02Q\xd2\x01\x13\x01\x97\x01\x80\x187#b\x03\x02\xf1\x01\x12A3h\t\b)\b#(Ih3\x02\x81\x02\xf2\x01\x13\x01\xb7\x01\x80\x18G\x01#b\x13Q\x12\xe1\x01\bS\x02h#\xa8\x01\x02#\x02\xa1\x02\xf2\x01\x13\x01\x00\xb7\x01\xa0\x187\x003\x82\x01A\x12\x81\x02\x02c\x0283\x018!\x02#\x02\xa1\x02\x82\x02\x13\x01\x00\xc7\x01\xb0\x18G\x01#\xf2\x00\x03\x02a\x12\x91\x02\x02\xd3\x02\xb1\x01\x02A\x92\x02#\x01\xd7\x01\xd0\x18W#\x82\x01\x03\x02\x91\x04#\x01S\xf1\x01\x02\x11\x92\x02#\x01\xf7\x01\xf0\x18W\x013\xf2\x00#\x02\x91\x01\x02\xb1\x02\x13\xd1\x01\x02a\xb2\x02#\x01\x00\xd7\x01\xb0\x19W\x013\xb2\x01\xd1\x03\x13\x81\x01\x021\x02Q\xb2\x02#\x01\x00\xe7\x01\xc0\x19g\x013\xb2\x01\x11\x12Q\x12\xf1\x01\x13A\x021\x12A\xc2\x023\x00\x87\x02\xf0\x19\xf7\x00S\xb2\x01\xd1\x01\x02\x81\x01\x13\xb1\x01\xe2\x023g\x00\xb7\x01\xa0\x1a\x87\x01\x01S\xb2\x01\xb1\x02\x13A\x92\x03C\xb7\x02\xe0\x1a\x97\x01\x01C\xe2\x01\xf1\x01\xf3\x00\xd2\x02S\xb7\x02\x90\x1b\xa7\x01\x00\xf3\x00\xb2\x02\x83\x01\xc2\x02S\x02\x01\x20\xa7\x02\xe0\x1b\xb7\x01\x01c\xe2\x02#\xd2\x01c\x01\xa7\x03\xa0\x1c\xd7\x01\x01c\x82\x02#\x00\x13\x92\x01#\x02\xf7\x03\xc0\x1c\xf7\x01\x01c\xe2\x01#\a\x01\x13\xf2\x00#\x01\x00\xd7\x03\x80\x1d\xa7\x02\x01\xf3\x00b3\x01'\x83\x01\x01\xd7\x03\xf0\x1d\x97\x02\x00\x17\xd3\x01\x01G\x001\x10\xc7\x03\xc0\x1e\x97\x031\xa7\x05\x80\x1f\xc7\b\xd0\x1f\xc7\a\xc0\x20\xf7\x06\x90!\x87\x06\x80\"\xb7\x05\xa0\a5\xb0\x15U`E\x80\x02U\x20\xb7\x04\xf0\x05\xb5\x01\x20\x15\x16\x15\xa0\x15\x056\x05`\x05&\x05\x80\x02\x056\x05`\xb7\x03\xb0\x06\x05\x86\x01\x15\a\x10\x056\x05\xa0\x15\x056\x15@\x056\x05\x80\x02\x056\x05\xb0\x01\xc7\x01\xd0\a\x05\xa6\x01\x05\x10\x056\x05\xa0\x15\x05F\x05@\x056\x05@\a\x00\x05\x00\x05\xf0\x006\x05\xe0\n\x05\xa6\x01\x05\x10\x056\x05\xa0\b\a\xf0\x0c\x056\x05@\x056\x050\x85\x01\a0\x05&\x05\x20E\x20U\x80\x015@%\x90\x01\xf5\x00\xe0\x03\x05\xb6\x01\x10\aE\xa0\x01\xa5\x01\x90\x01\xa5\x01\xd0\x01\xb5\x01\xe0\x0c\x056\x15\x20\x056\x050\x05\xf6\x00\x150\x05&\x050&\x20\x156\x05\a\x005\x00\x156E\x16%`\x05\xf6\x00\x05\xc0\x015\xc0\x01\x056%6\x15\x00U\x80\x01\x15\x96\x01\x05\x80\x01\x05\xa6\x01\x05\xa0\x01\x15V\x056\x05\xf0\x0c\x056\x05\x10\x156\x05\x20\x05\xa6\x01\x05\x10\x15&\x05\x10\x056\x05\x10\a\x056\x05\x10\x05\xb6\x01\x05V\x150\x15\x96\x01\x15\x90\x01\x056\x20\x05\x80\x01\x056%6\x15\x00\x056\x05\x80\x01\x15\x96\x01\x05\x80\x01\x05\xa6\x01\x05\x80\x01\a\x15\xb6\x01\x05\xf0\x0c\x156\x05\x00\x156\x05\x20\a\xa6\x01\x05\x20\x05&\x05\x206\x05\x20\x056\x05\x10\x05\xb6\x02\x050\x05\a\xa6\x01\x05\x80\x01\x15f\x15\xf0\x00\x056%6\x05\x10\x056\x05\x20\x150\x15\x86\x01\x15\x00\a%\a\x20\x05\x96\x01\x05\x20%0\x15\xc6\x01\x05\xf0\x0c\x156\x05\a\x05F\x05\x00\x15F%F\x05\x10\x056\x206\x05\x20\x056\x05\x10\x05\xb6\x02\x050\x05F%F\x05\xf0\x00\x15f\x05\x80\x01\x05\xa6\x01\x05\x00\a\x056\x05\x00\x15\x16\x15\x10\x15\x86\x01\x05\x10\x15\x16\x05\x20\x05\x86\x01\x15\x00\a\x05\x16\a\x05\x20\x1565F\x05\x80\r\x056%6\x05\x10\x156E6\x05\x10\x056\x05\x1060\x056\x05\x10\x05F%V\x15F\x20\x056e&\x05\xf0\x00\a\x05f\x05\x80\x01\x05\x96\x01\x05\x20\x0565&\x05@%F\x05\x10\x056\x05@\x15F\x05\a\x00\x056\x05\x20\a6U6\x05\x80\r\x156\x056\x15\x10\x05F5\a\x05&\x05\x10\x056\x05\x10\x056\x20\x056\x050&\x15\x10\x056\x05\x10\x056\x05\x10\x05\xd6\x01\x05\x80\x01\x95\x01\xf0\x00\x05\xf6\x005\x10\x056%6\x05P\x05F\x05\a\x10\x056\x05P\x056\x05\x20\x056\x05\x10\x056e6\x05\x90\r\x056\x056\x15\x10\x1565\a\x05&\x05\x10\x056\x05\x10\x056\x05\x10\x056\x05\x206\x15\x10\x056\x05\x10\x056\x05\x10\x05\xd6\x01\x05\x80\x01\x05f\x15\xf0\x00\x05V%\a\x05\x20\x0565&\x05@\x05V\x05\x20\x05&\x05P\x05F\x05\x20\x15&\x05\x10\x056e6\x05\x90\r\x056\x056\x05\x20\x156U&\x05\x00\x156\x05\x10\x056\x05\x10\x056\x05\x206\x05\a\x10\x056\x05\x206\x05\x10\x05\xd6\x01\x05\x80\x01\x05f\x15\xf0\x00\x056\x15\xf0\x00\x056\x05\x105P\x056\x15@5@\x156\x05@5\x20\x056e6\x05\x90\r\a\x05f\x050\x156\x15\a\x156\x05\x00\a\x056\x05\x10\x05656\x05\x10\x056\x05\x20\x05&\x050\x05&\x05\x10\x056\xa5\x01\x80\x01\x05f\x15\xf0\x00\x056\x05\x80\x01\x05F0\a`\x056\x15\xd0\x01\x05F\x05\xb0\x01\x05FU6\x05\xa0\r\x05f\x050\x15F%F\x05\x10\x056\x05\x10\x05F\x15F\x05\x10\x056\x05\x20\x05&\x050\x05&\x05\x10\x056e\x06\x15\a\x80\x01\x85\x01\x80\x01\x056\x05\x80\x01\x05F\xa0\x01\x056U\x90\x01\x056U\x90\x01V5F\x05\xa0\r\x05f\x05@\x05V\x05V\x05\x10\x056\x05\x10\x05\xa6\x01\x15\x10\x056\x05\x20\x0560\x05&\x15\x00\x056U\x16\x15\xb0\x01\x15\xd0\x01\x056\x05\x80\x01\x05F\x05\x90\x01\x056U\x90\x01\x056e\x80\x01\x05V%F\x05\xa0\r\x05f\x05P\x05\xa6\x01\x15\x10\x056\x05\x20\x05\x96\x01\x05\x20\x056\x05\x20\x0560\x05&\x15\x00\a\x05\xc6\x01\x05\xa0\x03\x056\x05\x80\x01\x05F\x05\xf0\x00\a\x05\x96\x01\x05\x90\x01\x05\x96\x01\x05\x80\x01\x15\xc6\x01\x05\xa0\r\x15F\x05\a@\a\x15\x96\x01\x05\x20\x056\x05\x20\x15\xf6\x00\x15\x20\x056\x05\x20\x056\x05\x10\a\x05&\x15\x20\x05\x96\x01\x15\xb0\x03\x056\x05\x80\x01\x05F\x05\xf0\x00\x15\x96\x01\x05\x80\x01\x05\xa6\x01\x05\x80\x01\a\x15\xb6\x01\x05\xb0\r\x156\x05\x80\x01\x15F%0\x05&\x150%6%0\x15&\x05\x20\x15\x06\x00\a0\x05&\x150\x15f\x05\xd0\x03\x056\x05\x90\x01\a6\x05\xf0\x00\x05\xa6\x01\x15\xf0\x00\x05\xa6\x01\x05\xb0\x01%&\x156\x05\xb0\re\x90\x01\xf5\x00@EP\xf5\x00PE050E@%\a6\x15\xe0\x03E\x90\x01E\x80\x01\xc5\x01\x80\x01\xc5\x01\xc0\x01\xb5\x01\xe0\r\x05\x90\x02\a\x80\x01\a\xf0\x02\x05\xe0\x01\x05\a\x80\x01\a\x005\xf0\a\x05`\a\xc0\x01\x17\x20\x05\x00\a\xc0Y"
)

Niveau mémoire
heap
à l'exécution, nous avions donc
$mathjax$40+16×(8+40+3×(8+28))+33+9197×1×1$mathjax$
soit
11,766 Ko
; en théorie ça passait chez tout-le-monde.

En pratique toutefois, rien que pour les données du
bytes
cette écriture utilisait
32995
caractères, nécessitant donc au moins
32,995 Ko
en mémoire de stockage.

Rappelons ici aussi les pires modèles sur ce critère :
  • NumWorks
    avec seulement
    32,766 Ko
    d'espace de stockage pour les scripts
    Python
  • éditions
    Python
    des
    TI-83 Premium CE
    et
    TI-84 Plus CE
    qui certes offrent un espace de stockage de
    3 Mo
    , mais limitent la taille maximale de chaque script
    Python
    à seulement
    64 Ko

Sur les
TI-83 Premium CE
et
TI-84 Plus CE
ce n'était pas bien grave, car il te suffisait d'utiliser à la place le format de fichier externe propriétaire
IM8C.8xv
.

Par contre ici pour le coup, bien que parfaitement exécutable en théorie, il t'était impossible de faire rentrer le script affichant l'image sur la
NumWorks
. :mj:

Pas question de remettre en cause radicalement cette façon d'écrire, mais on peut mieux faire. Plusieurs améliorations ont été développées dans le cadre du formidable concours de dessin de Noël 2021 par
Casio
, avec une période de participation accessoirement prolongée jusqu'au
31 janvier 2022
.

Ces améliorations viennent d'être mises en place et nous allons te les présenter.

Concernant les échappements courts sur 2 caractères pour coder un octet non affichable sous forme de caractère,
img2calc
en gérait jusqu'à présent 5 :
  • \a
    (7)
  • \b
    (8)
  • \t
    (9)
  • \n
    (10)
  • \r
    (13)

2 nouveaux échappements courts sont maintenant gérés :
  • \v
    (11)
  • \f
    (12)

Pour les autres octets correspondant à des caractères non affichables, était donc jusqu'à présent utilisé un échappement hexadécimal sur obligatoirement 4 caractères.

Et bien à la place on peut utiliser un échappement octal, qui a l'avantage d'accepter un nombre variable de chiffres, de 1 à 3. Par exemple :
  • au lieu de \x00, l'octet de valeur
    0
    peut être écrit \0
  • au lieu de \x07, l'octet de valeur
    7
    peut être écrit \7
  • au lieu de \x08, l'octet de valeur
    8
    peut être écrit \10
  • au lieu de \x1F, l'octet de valeur
    31
    peut être écrit \37
On gagne ainsi 2 caractères dans l'écriture des octets inférieurs à
7
, et 1 caractère dans celle des autres octets jusqu'à
31
.

La seule contrainte pour les échappements octaux courts avec seulement 1 ou 2 chiffres, est que l'octet suivant si correspondant à un caractère affichable, ne doit pas être un chiffre de 0 à 7.

Reprenons notre icône. Comparons avec ce que donne maintenant
img2calc
:
Code: Select all
palette = (
(255,255,255),(55,109,157),(255,203,64),
)

image = (
#b"\x10\x11\x20\x01\x00\x11\x1c\x19(\r\x10%\x0c)\x00\x06\x00%\x04\n\r\x18\x0e\t\x04&\x00\x05\x00*\x0c&\x10\x0e(\x1a\x1c\x12\x00\x02\x20\x12\x10"
b"\20\21 \1\0\21\34\31(\r\20%\f)\0\6\0%\4\n\r\30\16\t\4&\0\5\0*\f&\20\16(\32\34\22\0\2 \22\20"
)

L'écriture des données du
bytes
subit une réduction remarquable, n'utilisant plus
140
caractères mais seulement
91
. :D

Une formidable réduction en conséquence de
35%
de l'espace occupé en mémoire de stockage, il y a de l'espoir... ;)

Revenons donc à notre image plein écran.

Voici ce que sort le nouvel
img2calc
:

Code: Select all
palette = (
(215,187,149),(239,183,116),(198,122,27),(90,45,18),(190,143,18),(255,255,247),(0,0,2),(190,172,149),(231,187,99),(239,163,18),(149,105,45),(207,176,107),(73,0,0),(149,67,64),(182,114,116),(247,195,133),
)

image = (
b'\xb0\r\21"\1\xb0&\xe3\1\xf0\0\21\xa0$\1C\x021\2\xf3\0\1\20\x93\1\1\x80#\1c\xc1\x013\1\23\x91\1\2#\21\x80"\1\xf3\0\2Q\2\xf1\0S\xb1\1\x023\1\xb0!\xf3\0\22\xa1\2\2#\x91\2\x83\1\1\xf0\37\1S\x91\3\x131\2a\22\x91\1c\1\xa0\37S\2\xf1\0\2\xa1\1\2\xf1\0\3a\2\x91\2\xf3\0\xf0\36S\x91\1\2\xa1\1\2\xf1\0\3a\2\xb1\2c\1\xb0\36S\x91\2\2\x81\1B\3\2\x91\2\2\xd1\1\2#\1\xe0\35\x013\xc1\2\2\xf1\0R\3\xa2\2\x81\x023\2\1\xa0\35#\2A\2\xf1\0\2!\2\x81\1\x92\1\23\xe2\2a\2Q\x023\x80\35#\2Q\2\xf1\0\2\xa1\1\xb2\1\23\x82\2\xf3\0\xd1\x013\xb0\34\1\0\1#\xf1\2\x82\2\23\x82\3\23\2A\2a3\x90\x1c3\xc1\2\xd2\2#\x92\3\23\2\xc1\1#\xe0\33\1#\xa1\2\xf2\1\xc3\2\2\4\xa2\2\3\x121\2\xf1\0\23\1\xc0\4\25\xb0\26\1#\2\x81\2\xe2\1\x93\2\22S\22\4\x82\2\23\2!\2\x81\1\23\1\xf0\1\xf5\0\x005`%\xc0\x015\x80\24#!\2A\2\x81\1\x92\1S\2\4\2\xf4\0Cd\2\xc3\1\xe2\1\xa1\1\2\23\xe0\1\5V%\26\5\a@\5&\5\xb0\1\5\26\5\xe0\23\1\23\2\x81\2\x82\1C\2\x84\2#\xa4\2\x023\xc2\x011\22Q#\1\xb0\1\5f\25\26%0\5&\5 \a5\0\a\20\5\26\25\a\5\0\x050\a\0\a\xf0\0%P%P%\a\xd0\2\5\0\5\0\5\x80\v#\xf1\1\x82\1C\2\xb4\2\23\xe4\x023\xd2\1\xa1\1#\xa0\1%\26E&5\x105 \x156E\26%\6\0\25\0E\a\25 \25&\25\20%\26%\a\25&\25`\5\xa0\1\25\26\25\6\25\xd0\n#\xf1\1\2\3RC\xe4\2\23\xe4\2\x123\xb2\1\xb1\1\23\2\x90\1%\26EV\a\5\0\25\6\25\20\5V5\26\x156\25\26\5&\25\0\a\25F\5\20\x156\25\a\5F\25@UP\25f\5\xb0\n\1#\xe1\1\2\3R3\x94\3\23\xa4\3\2#\xb2\1\xb1\1\23\1\x90\1\5\26\25\20\5f%&%\xf6\0\5\a\5\26\x056%\xf6\0%f%V%V\5@F\5P\5\xf6\0\5\a\x80\n\1#Q\2\xf1\0\23R#\xf4\2H\23H\xf4\2\2\23\xc2\1\1\2\x91\1\23\x80\1\5\26\25\20\5&\25\26%&\x156%\a\25\a\5V5&\25&\25&%\26%&5\a\5&%\a@\x056\5@\5&5\26\5\xf0\t\1#\2\xc1\1\2\23B3\xd4\2\x88\1\23h\t\b\xd4\2#\xb2\1\xb1\1\23\1`\5\26\25\20\5&\25&\25&\25&%\27\5\a\x156U\26%&\25\x86\1\5\a\x0565\a&\25P\x056\a@\5&\25\a\5\26\5\xd0\t\1C\xc1\1\2\3RC\xa4\2\t\xa8\1\23\x98\1\xc4\2\2#\xb2\1\xb1\1\23`\5\26\25\20\5\26%&\25&\25&\25\a\25\a%F\5\a%\26%&\25\x86\1\5\a\25&\25\a%&\a\x050\5FP\5&\5\a\25\26\5\xb0\t\x013\xd1\1\2\3b3\xf4\1\x98\19(\238I\x88\1\xf4\x013\x92\1a\22\21\2\23P\5&\5\20\5\26%&\25&\x156%\x065\26\5&\5\a\25\26%&\25\26\xc5\1&E&\x050\5\a6\x150\5&5\26\5\x90\t\2#\xe1\1\x82\x013\xd4\1\t\xb8\1i\30\3(Y\xf8\1\xa4\1\2\23\xa2\1\x91\1#@\5&\5\20\5\26%&\25&%\xf6\0%\26\25&\5\a\5\26%&\25&%\26%&\5\26%\26\5&\5`5@\5\x86\1\5\xf0\b\1#\xf1\1\3b3\xb4\1\31\xe8\1i\30\23\bi\xb8\2\x84\1\2\23\x82\1\21\2\xf1\0\23@\5&\5\20\5\26%&\25&\5\0\25V\25\a\5&\25&\25\26%&5F\25\0\x156\25\0\5F\25\x80\2\25f\5\xf0\b\23\x81\2\x82\1#\xb4\1\t\x88\2i\30\23\30Y\x98\1\t\x98\1\x84\1\2\23\x82\1\x91\1\23@\5&\5\20\5\26%&\25&\5\20\x156%\0\5&%\26\25\26\5\0\5&5F\5 \x056\25\0%\26\25\x90\2%&\5\26\5\xd0\b\1\23\x81\1\22A\x92\1\23\xb4\1\xc8\2Y\30\23\30Y8:\xe8\1\x84\1\2\3\xf2\0\3\2\xf1\0S\0\a% 5\27%\x005@E 5\0\a\25 \25 %0E@5@5\xc0\2\xf5\0\xd0\b\23\xc1\1\2\21\x82\1\23\xa4\1\31\xf8\2\tH\23\30Y\b\x8b\1\xe8\1\xf4\0\2\23\xf2\0\3Q\2\xf3\0\x80\26\23\2\xd1\1\xf2\0#\xa4\1\b\t\x98\2\32\33\32\xf8\0\23\xf8\0\n\xfb\0\n\xa8\2\t4\2\23\xf2\0\3\2!\2\23A#\xf0\25\23\xe1\1\xf2\0#\x84\1\31\xb8\2\32;\nh\23\xf8\0\n\xfb\0\n\xf8\0)\xf8\0\31D\23\xf2\0\3\2\21#Q\23\1\xd0\25\23a\2a\xf2\0#\xf4\0\x98\1)\xa8\1\23K\nX\23h\nk#Xi\x98\1\t$\2\23bC\xf1\0\23\xd0\25\23\xc1\1\xf2\0#d\xa8\1I\xa8\1\n\23KX\23X\nk#\nX\xf9\0\x98\1\t\24\22\23b\23\2\x91\1\23\1\x90\25\21\23\xb1\1\x82\1\23d\t\xf8\0\x89\18\32\3J[\nH\23X\nk\23\nX\x99\1\xa8\x014\23R\23\x81\1\2\1#\x80\25\x023\xa1\1\x82\1\23d\x88\1\x99\18\n\xcb\1\nH\23X\xfb\0\23\vX\x99\1\xb8\1$\2\x0323\2a\22\21\23\xe0\24\1\23\2\1#\2Q\2\3\xf2\0\23d\x88\1\xb9\18\n\xcb\1\nH\23H\n+\23\n+\n\vX\xa9\1\xb8\1\t\24\2S\22\23\x91\1\2\23\xc0\24#1#\x021\23b#d\x98\1\xb9\18\n\xcb\1\nH\23H\n+#;\nX\xb9\1X)(\t\24S"\3\2\xa1\1\3\1\xa0\24#Q\2#\21\3\xf2\0\3\xf4\0(9H\xb9\18\n\v:#K\30\t(\3h\n\v#\v\n;\nX\xa9\1HI(\x143R\3\xa1\1\2\3\xa0\24#a\2\23\22\3b\23d(\xf9\0\30\xb9\18Z\v\23;\n\30\t(\3h\32\23\n\v\n;\nh\x89\1HY(\t\x043\xf2\0\xa1\1\3\1\x80\24\23\2\x81\1\2#b\23d8i8Y\xe8\1\v\23;\nH\23(\24(\32\v\30\32;\nX\x89\18\xf9\0(Sb\1\2\x81\1\2\23\xf0\23\23A\2\1\2!\2#2\23TX\xf9\0H\t\xa8\2\n\f+\32\vH\3\48\31\xf8\0\n\33*\x98\1)Xi83\4#bA\x021\2\23\xd0\23\1\3\2a\2!\3\2#\22\23TX\x89\1\x88\3\v\3\33\32h\3\xe8\1\32\33\xc8\2i(\23D\2\23R\xb1\1\3\2\xc0\23\23\xb1\1\3\22CTh\x89\1hl\xb8\1:8\t(\f\xe8\1\v\xc8\2\31\bY(#T\23b\xa1\1\23\xb0\23#\xa1\1\x0323Dh\x89\1X\34=<\xe8\2\23\\\xa8\2\t\xf8\09()(\238D#B\xb1\1\23\xa0\23\x131\2Q\2\x03234h\x99\18\34\r\16m,\xa8\2,\r\fM\34H\31\x98\1\4\x88\1\4\31\xf8\0\23h$\2\23R\xf1\0\2!\23\x80\23\2\23\x81\1\2\23BC\24\th\x89\18\f\xbd\1,h9HL\16\f]\34(Ih\31\x88\1)h\23\x88\1$#2\3\2\1\2\x81\1\2\3\1\xf0\22#\x81\1\2\3Rc\b\tX\x89\18\f\xbd\1,XIHL\16\f\r\16=\3489\xf8\0\t\xa8\1\th\38\tX$\23B\3\xb1\1\23\xf0\22\3\2\x91\1b\3D#h\x89\1(\f\35\16=\36]\348Y8,\r\f\3\16\f\r.-\34\x88\4\23H9(4\23\x042\3\xb1\1\3\xe0\22\23A\2AR\23T#X\xf9\08\f\r>\x9d\1\34\30\t\bY8\34\35\f\3\r\f\r\36M\f\x98\1I89H\t(\238\xf9\0\30$\2\3R\3A\x121\23\xd0\22\3\2\x91\1R\x134H\23X)h\34\r>M.-\f8Y8\34\35\f\3\34\xfd\0\34\x88\1I8Ih\238\x89\1\x184\23R\1\2\x81\1\2\3\xc0\22\2\3\xa1\1B\x134\30\t(#\xe8\1\34\r>=>-\34(Y(,\35<=\16-\34\x88\1I(YX\23H\xf9\0(D\23R\x81\1\2\1\3\1\xa0\22\2\23\x91\1B\23$\t\xf8\0#\xd8\1\f=\16MN\35\34(Y(,\36,=\36-\34h\t\309\30i8#X\xf9\0(\t4\23b\x91\1\23\1\x90\22#\x81\1B#$(\31\30\t\30#\xf8\0\318\x9d\1>-\34(9H,\36\f\3\f\r\36\r\36-\34X\31(\31(i(\238\31\30\xf9\084#b1\x021#\x80\22\2\23\21\x121\2\x012#$\30IH#X9(\f]\36-\16M\f(\t8\t(,\35,.],\b\t()hY(\23\xc8\1)X4\2\3b1\2A\23\x80\22#\x91\1"#\2\24(IX#HI\30\fM.\x8d\1\f\xc8\1\34\35,\x8d\1,H9\xd8\1\23\xb8\1\f\x98\1\t4\23b\x81\1#\xf0\21\23\x91\x012#\248Y\30\t(\23HI\30\fM.=\16-\34\xc8\1\34\35,\x8d\1,H9H\th#\30\tXlh\tD\3b\x81\1#\xe0\21\23a\2!2\3\22\24\tH\31\x88\1\23898\fM\16M\16-\f\xd8\1\34\35,\35\36=,\xb8\19h\3\xf8\0,]\348\t\30D\23R\x91\1\23\xe0\21\23\x91\x012\23\2\24\t\x98\2#8\318\f\xfd\0\36M\f8)h,\r\f\3\f\r>-,(\t(\x99\1\30\t\b\4\3h\34\xad\1\fhD\23R\x91\1\23\xc0\21\1\3\xa1\x012\3\22\24hL\xf8\0#\x88\1\4\34-\36\r\36=\f(Yh\\\r>\35<X\xa9\1\30\t\23\xf8\0\f]\36M\34X4#B1\2A\2\3\1\xb0\21\23\xa1\1"\23\2\24\tH\x8c\1\3X#\x88\1\34-\36\r\36-\f8Yh\\\r>\35<X\xa9\1\b\t\4\23h\34]\36M\34X\t4\23B\xa1\1\23\1\x90\21#\x91\x012\23\2\24H,M<\b\318\23\x88\1\34\x8d\1\fH\xf9\0XL]<X\xb9\1\30\3()\30\34\35\36\35.]\f\xf8\x004\23B\x91\1\2\23\xd0\4\25\x90\f\23\2\21\2!\2\x112\23\2$8\34\xfd\0,\x88\1\23\x88\1\fM\34h\x89\1h\23\f=Lh\xa9\1\30\23\309\30\34\35.M\36-\34\xf8\0$\23R\x91\1#0\xf5\0\xa0\2U\26\5\x80\f\23\x91\x012\23$\t\30,=\36M\34(\tH\23\xa8\1\34\x98\1\x89\1h\23\x8c\1\xf8\09\4I\b\2389\30\34\35.M\36=\f\xf8\x004\23BA\2A\x130\5V\5\xa0\2\5&\25&\5\xf0\v\23\x91\x012\23\24\t(,=\36M\34()8\23\xd8\2\x89\1h\3\b\xfc\0(\tHI\b\4(\n\2389\b,\35.\xad\1\f\xf8\x004#2A\2Q\3\1 \5f\5@\5\0\a`5&\25&\5P%0%\xd0\2\27\5\xd0\6\23\2\x91\1"#\248\34M\36\r\36\35,()8#H\tX\t\x88\1ih\38\rX\31h\t\b\v\n\b\n\v\n\3HY,-\16\35.m\f\xf8\x004#2\xb1\1\23 \5&\5&\5\20\25\26\25\0U&\5&\xa5\1\0\5\26E\26\25\x80\2\x85\1\xa0\6\23a\2\x112\23$(,\xfd\0\36\35,h*\b\n\2389H98ih\3\b\t\x88\19X\n+\32\3h9\b,].\35\16=\f8\31(4#2\xa1\1\23\21\0\5&\25\x165f5\xf6\0\25&\25&\5\a\5&\25V\5@\5\x1650\5f\5\xa0\6\3\xa1\x012\3\2$(,\35\36\x8d\1\34h\n+\n\v#\3098Y89\x88\1\3\30\thIh\n\v\n\23\30#\v\30\31(,\x9d\1.-\f8)\30\t$#2\xb1\1\23\1\0\5f%\26%&\a\25&\x156\25&\25&%&\25&\5\6\25@\5F\x0505&\5\xa0\6\1\3\x91\1B\3\2$(,\35.-\16=\34h\n+\n\v\b#\30)8i8)\x88\1\3\x98\1Ih\v\32\3\v\b\n#\n\30\t8,\x8d\1>-\f89\b\t$\2\x132\xb1\1#\0\5V5\x165\26%&%&\25&\25&%&\25&%P\5F\x0505&\5\xa0\6\23!\2Q2\23$8,\35.\35.-\34h\32+\n\30#\b)8i\x98\1\318\3\x98\1I(\31\30\n\23\b\n\v#\v\n\xf8\0\34-.->-8Y\30$\2\x132\1\2\x81\1#\0\5V5\x165\26%\26\25\a\5&\25&%\26%\26\a\5\a\5&\25P\5F\5@\25&\25\xa0\6\3\2\x91\x012\3\2$8\4\34]N\35\34h\n;\n8\23hI\xa8\1)8\3\xa8\1)X\4\n\23\33\bK\n()\30\34=\16=>\35\f8Y\x184\x132\xb1\1\23\0\5V5\26\25\a\5\26%\x165&\25&%\26%\26\5\a5&\5@\5F\5@\25\26\25\xb0\6\3\xa1\x012\3\2$\30\t\b\4,MN\35\fh\n;\32H\23\4X9\xa8\1)8\3\30\t\xf8\1\32\3\n\b\nk\n()\30,\x8d\1\16\35\16\348Y($\2\23"\xb1\1#\5&\5&%&\25&%&\x156\25&%&\5&%\26\25\26\5@UP\5&5\x80\6\1\3\xa1\x012\x034H,M>-\f\30\t(\nK\n\vX\23h\31X\318)8\3\xa8\2\n\3\n\b\v\3k\n()(\34\xbd\1\34Hi\x184#\22\x81\1\2\21#\5&\5&%\xf6\0%\x86\1\25&%V\a\5\a\5\26\5&\5PEP\5V\5\x80\6\23a\2!"\23$\t\30\31\30,]\16-\34\30\t\b\32[\n\xf8\0\23\xd8\1)()8\389\xa8\1\3\n\b\v\30\n[\n\30)H\34-.M\fXi\x184#"!\22Q#\5&\25&%f\27\25\xf6\0\25&\5\0\25F\5\20\5V\5\xf0\1\5f\5\xf0\5\1\23a\2\21\2\3\22\23$\t\30\31(<],H\32;\32X\t(\23\x98\3\3(iX\4\23\n\b\n\23k\n\xb8\1,\r.-\34hi(4#\22!\2a#\x85\1 \xf5\0 \xf5\0\0E E0e\xf0\1\x85\1\xf0\5\23\xa1\1"\23\2$\b\t\4)(,\rlh\n;\n\xc8\1\23X\31\xf8\1\3(\xf9\0H\23(\nk\32\xe8\1lX\t(i(4#"\x91\1\2\23\1\xf0\17\23\xa1\1"\x134Y8\x8c\1\xf8\0\32\v\32\v\xc8\1\23H)\x98\1*\30\23(\xf9\0H\23(\nk\328\t\b\t\x98\1\34X9(i(4\2\23"\x91\1\2#\xf0\17\23A\2A\3\22\x134\xb8\3\32\v(I\x88\1\3\x88\2\n\v\b\n\b\23(\xf9\0(#8\32;\328\xf9\0\xd8\1Y\30i(\t4\2\23\22\x91\1\2#\xf0\17\23\x91\1\2\3\22\23$(j\x88\3I8\318\23\xd8\1\n+\n\b\23(\xf9\0\30#h:\v(\xa9\1X\31XI(Y8D\23\22A\22!\2#\xe0\17\1\3\2\x91\1\2\3\2#\24\30\n\x8b\1\32\vhIX\t\30I(98\23X*\b\v\32;\n\b\23(i(\23\xd8\1\t\b\xb9\18\t\x88\19(IX4\23"1\x031\2#\xe0\17\1\3\2\x91\1\23\2#\24\30\n\xab\1\nhYH\t\30I(I(#H\n\v:K\n\b\23(Y(\23\x88\2\xb9\1\x98\1\338\tHIH4\2\3"1\x021\2#\xe0\17\23!\2a\23\2\23$\b\n\xdb\1\n(\xf9\0\xf8\0I\30YH\23(\xab\1\n\30\23(I(\23XIX\xc9\1X\v\32;*\x98\19(4\3"1\x021\2#\xe0\17\3\2\xa1\1\3\22\23$\n+\3\n\xab\1\n\30\xf9\0\xe8\1YX\23(\n\xfb\0\n\v\30\23\x98\1\238\x89\1H\xc9\1X\x9b\1\n\xf8\0Y\x184\23\x121\x021\2#\xe0\17\3\22\x91\1\3\22\3\2\24\b\n\33#;\n[\n\30\xf9\0\xe8\1Ih#\30*+*(\4\23\x88\1#8\x89\1X\xa9\1(\t\30\n\xab\1\nhY($\23\x121\x021\22\23\0\a\xc0\17\3\22\x91\1\3\22\3\2\24\b\n\v\23\32;\3\nK\n\30\xf9\0H)h9(\318#\30\32\33*H\23(\4\t(#\30\xb9\1X\x99\1h\xbb\1\nhY(\t\24#\22!\x031\22\23\0\a\xb0\17\23\22\x91\1\3\22\3\2\24\30\32\v\n;3\n\33\32\30\xf9\089\xf8\0)(9(\238\v\x88\1\23(\31\30#X\xf9\0h\x89\1h\nk3\32hY(\t\24\2\23\22!\22!\22\23\0\a\xb0\17\23\22a\2\21\3\2\23$8\nK\n3\v\32\xe8\1)\xd8\1I8\23\xf8\0)\30\23(\t\30\4\23(\t(9\xa8\3\n;\n+\n\23\nhiH\24\23"a\22\23\1\0\a\xa0\17\23\2\x91\1\2\3\2\23\24\t8\n;\32\b:\vX\xfc\0\xf8\0\t\xa8\19X\23\b\t(9\30\23H\2389H\xfc\0\xb8\1)8\n\33\n\3;\n\xa8\1YH\24\23\22A\2\21\22\23\1\0\a\xa0\17\23\2\x91\1\2\3\2\23\24HK\32\x98\1\xac\1h\31\xa8\1\31h#89\30\23H\2389(\xac\1\xa8\19(\n\33\23;\n\xa8\1YH\24\23\x121\2\3\1"\23\1\0\a\xa0\17\3"\1\22Q\2\3\2\23\248\nK\n\x98\1\34\r\f\x8d\1\34X\4\xc8\2\23(9\30\23(\23X9\b<M\\H\4\30Y\30\n\v\23\32;\nH)\30iH\4\23\x121\2\3\21\22#\0\a\xa0\17\3"\x81\1"\23\248*+\nX\4\b\34m\36]\f8\t\30I8)\x88\1#8\t\30\23\30#\x98\1\34\xad\1<Xi(\n\3\n\b\n;\n\v8I898\4\23"\21\22\3\21\22#\0\a\x90\17\1\3"\x81\1"\3\2\24X\v*\xf8\0\34=\16\35.]\16\fh9(Y\x88\1\23X\23\b#\3098\f=\36\x8d\1,\30\t(I\x88\1\n;\n(IHI(\4\2\23\22!\2\3\21"\23\0\27\x80\17\1\3"\xf1\0"\23\2\24\xf8\0\32\xf8\0\34=\16\35.\xfd\0\fX9\30i8\t\b\t(\23HC(I\30,\35.\x9d\1\34h)\x98\1\n;\n(I8Y(\4\2\23\22!\2\3\21"\23\0\27\x80\17\1\3"\1\2\xf1\0\2\23\24\x98\2\34\35\16\35\16-\16=\36-\348I\30iH\tH\23(C(Y\30,\35.-.=,\xa8\198\32\33\32\xb8\1Y(\t\4\23\x121\3\21"\23\0\27\x90\17\3"\1\2\xf1\0#\24\x98\2\f-\16\xfd\1\34H)8\xf9\0\3098\23\x1838I\30,-\36M\36=<\x98\198*\v\xd8\1Y(\t\4\2\3\22\1\2\21\3\x012\3\1\0\27\xf0\2S\xb0\v\23\22\x91\1#\24\x98\2\f\xbd\1\fm\34X\tHY\xc8\1\23\b#8Y\30\34-\16\xad\1\36\r,\xa8\1)H\4(\t\xc8\1I(\t\4\2\3\x121\22\1"\x037\xd0\2\x023\37#\x90\v\23\22\21\2#!3\24\x98\2\34\r\xbc\2\xb8\19\xf8\1CHI\b\34-.\x9d\1\36\r,\xc8\1\t\x88\1\t\xd8\1)8\t\4\2\3"1\2\1\22\x137\xd0\2\23\37\3?\23\x80\v\23\22\xc3\1\2\x93\5\xf4\0\x184\x98\1\31\b\t\24\30C\xa8\1\34-\xac\2\x93\2\xa8\3\x043\2A\3\1\2\23G\xc0\2\2\3?\3?\23\x80\v\xf3\0!\xf3\2\f3L\xc3\6\x88\1L\xa3\1@W\0\x97\1 \xb3\4"3\x017\xc0\2\2\23\17\3/\3?\23\xf0\n\1#\2a\2S\xf8\3\23\34\23\xf8\0\xe3\3\20\xc3\1\0\a0\xe7\5\0\' \x1707\21C\1g\x80\2\22\23\2\23_\3?\23\xe0\n3\x81\x013\24\x88\2\3\xdc\2\xd8\1\xa3\1H#\b#\xa0\1\xf7\t\0g\x90\1\22\xc3\1\xbf\1\3\2\xc0\n\1\23\22\x81\1\2\23\2\24X)\xf8\0\34\xed\1.\r,\xb8\3\23(\23\b\23\x97\f@\22\23\22\xa8\1\2\23\xff\0\3/\23\xb0\n\23\22\xa1\1\23\2\24\30\t\bYh,\16=\36-\16-.\35\f\x98\2\t\x88\1\238\23\30\23\0\xe7\v \2\23\22\x88\2\23\xaf\1\23\2\xa0\n\23\x121\2Q\2\3\2\24\30\x89\1h\34=>\r.\35.,\xf8\0\n\33\n\v8)X#H\238\23\xb7\v\20\2\3\2H:\vHI(\23\xaf\1\23\xa0\n\23\x121\2a\3\2\24\30\x89\1h\34=>\35\16-\36\r,h\n;\n89\b\t(\23X\23H\23\0\x97\v\2\23\2HK\n\v8Y\30\23\xbf\1\3\2\x90\n\3"\xf1\0\2!\23\24\xa9\1h<\16\r>\x8d\1\34\nX\nK\n8Y\30\3\xf8\0\23X\23\0\xd7\n\2\3\f\xf8\0\2\3[\32\30i\30\23\xaf\1\23\x90\n\3"\xb1\1\23\24\xe9\18<-\16=\36=\f\xf8\0k\n(I\30\3(9\30\238\t(\23 \27 \'\xb0\b\1\20#\2\x98\1\v\n\3k\n\b\xf9\0\30\23?\3_\23\x80\n\3"\xb1\1\2\3\24\b\x89\1\b9HL]\16-\34\x88\1k\n()\30\238I\b\238\31(\23\xc0\t\2\23\2\xb8\1\32\xbb\1\bi(\3\xbf\1\23\xf0\t\3"\xb1\1\2\3\24\30Y(\31\4X\nL\xfd\0\34\x88\1\xfb\0\n(\t(\4\23(Y\b\238\318\23\x90\t\2\3\f\2\xd8\1\nK\n\3;\b\n\30Y(\23\xaf\1\23\2\xe0\t\x032\xb1\1\3\2\24\b9H\t\4\t\30\v8\v\3\xac\1\xb8\1k\n\30\t(\23XI\b\23(I(\23\xe0\b\238\31\4\t\xa8\1\n;\n\23;\n\30Y8\23\xaf\1\23\xe0\t\x132\xa1\1\23\24\xc8\1\32\33\32H\nL\xe8\1\n[\n8#\xf8\09\b\23\b\xf9\0(\23\xa0\b\2,\3(\31\4\31\30)hZ\23+\n(9X\23\xaf\1\23\xd0\t\1\3"!\2\xf1\0\23\248\31h\23;\n\v\xf8\2\32;\3\v(#H\t(9\b\23\b\x99\1(\3\xf0\a\aL\r\xf8\0ih\4\30\32\3\33\n8\t\x98\1\23\xaf\1\3\2\xd0\t\x032\xa1\1#\48)X\23K\n\x88\1\t\b\t\xb8\1\32;\n\v(\23X\t(9\b\23\b\xa9\1\30\23\xd0\a\3\34\35,\xf8\0i\xa8\1J(\31\x98\1\2\3\xaf\1\23\xd0\t\23"Q\x121\23\4\xc8\1\3\f[\nhI\xb8\1\32\33\32\30\23\xb8\19\b\23\b\xa9\18\3\xa0\a\3\f\r\36\35,\30\tHi\xb8\1\v\n\v8\31\xa8\1\23O\3O\23\xc0\t#"\xa1\1\23\4\xc8\1\n\3[\32XY\b\t\b\4\xf8\0:\30\238lH\t\b\23\b\xb9\18\3\xe0\6\2\3\34M,\4\b\31HY\xf8\0I(\t\b\31\4\31\xa8\1\23\xaf\1\23\xc0\t\23"\xa1\1#\4\xa8\1\v\n\xfb\0\nHi(I\x88\1\38,-L(\t\b#\b\xa9\1H\3\xd0\6\3\f\r\16\r.\r,\4\b\t\xf8\0\31X\x99\1\30\31\b)h\t8#\xaf\1\3\2\xb0\t\x132\x91\1\2\23\4\x98\1\v\n\xab\18Y(Y\xf8\0\23(,M<(\t\b#\b\xa9\1H\23\xc0\6\f\r\36\r.\r,\4\xa8\1\tX\x89\1H9h)\30\2\23O\3O\23\2\xa0\t\23B\x91\1\2\3\48\t(\32\xbb\1\nHI(iH#(\3\f\x9d\1\34\b\31\b\238\x89\1h\3\xa0\6\34\36\r.\r,\4\x98\2\x99\1\xe8\1I\30\2\3\xbf\1\23\xb0\t\2\3"1\2a\23()\b\3k\n\3K\nX)(\xf9\08#8\34\35\16=\16\35\34\30\t\b\23XY\x88\1\3\xf0\5\2\34\r\16-\\\4\xa8\2\xf9\0\xd8\1i(\23\xbf\1\23\xb0\t\x032\xf1\0\2\21\23\4\30)\b\n[\32\23;\n\xb8\1\xf9\0(\23X\f\35.-\16-\34\b\t\b\23\x88\1\t\xb8\1\23\xc0\5\2\3\xac\1\24\31\xf8\0*\xf8\0)\30\t\xe8\1\xf9\0\30\2\3\xbf\1\23\2\xa0\t\23"\xf1\0\2\21\2\23\30)\b\nK*\23;\n\xb8\1\xf9\0\30#H\34\35.m\34\r\t\b\23\xd8\2\23\xc0\5\3\2\xac\1\4\b\t(\4H\n\b\32\xf8\0\t\xf8\0\4\x98\1\xf9\0(\3\xcf\1\3\2\xa0\t\x132\xa1\1\23(\31\30\n+\32\b\n\23+\n\309hi\30\23h\34\35.-\16-,\30\238\tH\v\32+\32X\3\xa0\5\3\28,H\t(\n\33\3\n\30\n[\32\x98\1\xec\1\x98\1\2\3\xcf\1\3\20\x025\xb0\b\1\x032\xa1\1#\30\t(\32\v\n(\v\23\33\328\4\thI\30#\xf8\0\34m.\35,\30\23()8\n\xfb\0\328\3\x80\5\22\30\th\tH\n+#\xfb\0\n\x88\1\f-.=>\35,8\31\30\23\xbf\1\23\25F\5\xa0\b\23"1\22Q\23\b\tH\32H\32\v\32\v\xa8\2\23\x98\1\34M\36\r\16-,\30\23\309(\n\xab\1\n8\23\xd0\4\2\3\30\4\xd8\1K#[\n\x88\1\fM\36=>-\16\r\34X\2\3\xcf\1\3\25V\xa0\b\x1321\2Q\23\b\tH\32X*\vh\4\xa8\1#\x98\1\34M\36M,\30\23()(\n\xab\1\32(\23\xd0\4\23\xf8\1[#K\32\v\xf8\0\f\r\16\x8d\1>]\34X\23\xbf\1\3\2\x156\5\xa0\b#2\x91\1#\xa8\1\31\x98\1\x9c\1\3\30#H\318\34\xbd\1,\30\238\t8\n3\xfb\0\328\3\xc0\4\3XIX\x8b\2h,\35\36\xdd\1\16-\fX\3_\3_\3\2\25\26\25\xb0\b\x132\xa1\1\23\xb8\198,\x8d\1<\3HI8\34\xad\1,\30\23H\t8\32#\xfb\0\nH\3\xb0\4\3(\xf9\0h\xbb\x013\n\30\t(<].\x8d\1\16-\fH\23\xbf\1\23\25\26\5\xc0\b\x132\xb1\1\23\xa8\19(\34\35\16m\34\b\23Hi(\34\r\16\35.=\34(\23\xb8\1\v\n\x8b\1\nX\23\x90\4\2\30\x89\18\31\b\n\xab\1#\v\n\30\t8L=.=.M,8\2\3_\3O\23\2\5\26\5\xc0\1\a\0\a\xc0\6#"\xb1\1\23\xa8\19(\34\x9d\1\f\b#H\xf9\0\30\34=.-,(\23\xf8\0\t8\n+\23;\nX\23\x80\4\22\30\x89\18\31\b\4\n\xdb\1\n\b)(\xfc\0\xfd\0.M,H\3_\3O\23\2\5\26\5\xf0\0\a\xf5\0\xc0\6\x132!\2!\2!\2\23(9(9\30\34=.\35\34\b#\b\f8\xf9\0\30<\35.-\348\23h\31(\n;#\33\32\xf8\0\3\xf0\3\2\30\x99\1()\30*\xbb\1\n\b)8\4\xac\1\x8d\1<\4H\3\xbf\1#\5&\5`\5f\5\xc0\6\1\x032\xb1\1\23(9\xf8\0\34M.\r\f\30\34\30,(i8<M,H\23h\31(\n+\32#\32\x98\1\3\xe0\3\3\30\x89\1(I(\4\n\x8b\1\b\n(\tH\31\30\x9c\2\r\f\24H\23_3\17#\5&\5P\5\xf6\0\5\a\xc0\6\23"\xb1\1#\309\xf8\0\34]\36\f\b\3\34\b\3L\30iX\xfc\0(\t(\23\x98\1\v\n;\n\b\33\32\xa8\1\23\xd0\3\3\30\xf9\0\x98\1\33\b\v*;*\x98\1)($\xdc\1\24\b\t83\17\xa3\1\5&\x050\a\0\5\26%&\5\xd0\6\1\x032\xa1\1#()\30\tH\34m\f\3\b,\b\\\30ihL\x88\1\23\x98\1\32;\n\x88\1)H\23\xc0\3\3\30Y\x98\1\2cZ\4\xb8\1)\30$(\xac\1\4\30\t8\xf3\1\5&\5P\5\x165\26\5\xe0\6\x032\xa1\1#8I8,\r.\35\f\30\f\b\f\b\f-,\30i\xd8\1\tX\23\x98\1\n\v\n+\n\xf8\09X\3\xc0\3\3\309\x98\1\23\xf2\0\23\2\x98\1\2XIH4h\31H\4\xf3\1\5&\5@\5&5\26\5\xe0\6\1\3"1\2a#(Y(,\r.\r\f\30\f(\f=<\bY\xa8\1\t\x98\1\238\t\xf8\0*\x88\19h\3\xa0\3\22\30\31h\t(\3\xb2\1\238\2\x83\1\4\b9\bi\xa8\1\t8\4C\xf2\0#\5&\5@\5&5\26\5\xf0\6\x132\x91\1#8I(,\35\16\r\f\b\3\34\b\34\r\16-<\30Ih\t\30\318I\b\23\30YX\v\n\30)89(\t8\3\x90\3\3\x88\1)\30\4\3\xc2\1\b\3(\2\3\x82\1\23\28\31\4\t\xb8\1\tX\4\2#\x92\1\23\5&\5P\5\xf6\0\5\xf0\6\x132\x91\1#8I(,=\f\b\34\b\34\35\36\35<()\xa8\1\tHI\b\23\30i\x88\1)8)8\31(\23\xf0\2\2\3\xb8\1\24\2\23\xb2\1\b\3\2\b\2\23\xa2\1\38\31\4\xd8\1\tH\4\2\23\xa2\1\23\5&\5P\5\xf6\0\5\xf0\6\1\x132A\22\21\2#(I(,-\f\b\23\b\3=\16-<\x88\1)8)(Y\b\23\30\xf9\0\30\31(I\xf8\0I(\23\xd0\2\2\3H\3"\b$\2\xc3\1"\3\2\b\4\2\3\xb2\1\3\2(\31\xa8\2\4\2\4#\xa2\1\23\5&\5`\25&\5\26\5\x80\a\1\x032\x91\1\2\23(I(<\r\f\3\f\3\b\3\f\xfd\0,\x88\1I()(i\23\b\xf9\0(9\309hi8\3\xc0\2\3H\3\0\22C\2\0G\0\a"c\2\4\23\xd2\1H\4#\28)X4\3\xc2\1\3\2\5&\5\xf0\0\xf5\0\x90\a\x132\x91\1#\x98\1\4\f\r\34#\b\34\x8d\1,hi\x98\1Y\23\30i(\31\xe8\1YX\3\xa0\2\2\b\2(\3\2\'0\xe7\1 \a\22\x93\1B\38\2\x132\23\2$8D\2\23\xc2\1\3\2\5&\5\x90\t\x132A\x0213\30\thL\3\b\3\34=\36-,h\xf9\0\x88\1Y\23\30i\xb8\2YX\3\xa0\2\3\2(\2\3\0\xb7\1\xf0\0\'\xf0\0\22c"\38\2\3R#\2\x84\x013\xb2\1\23\2\5&\5\xa0\t\3B\x91\1#\x98\1<\3\b\3\f]\36\35<X\x89\1\x98\19\b\23\30i8\x9c\1hIh\23\x80\2\22(\23\2\27\xf0\2\a\20\'@\22C\2\30\4\3\xf2\0\xe3\1\xc2\1\a\3\25&\5\xa0\t\23RA\22\21#\x88\1\4\3\f\3\b\34\r.=\16\35,\xf8\0iX)h\23\30I8\34\x8d\1,H9\x98\1\3\x80\2C\2\xc0\3\xd7\1\0\3(S\xf2\0c\xf2\1\3\2\x156\25\x90\t\23R\x81\1\x023h\34\23\f\35>],\x98\1Ih9X\4\3\309(\34\xbd\1\16\34(9\xb8\1\3\xb0\2\a\x90\4\xa7\1\x003\'\2\xf3\0\xc2\2#\2\a\5V\5\x90\t\23R\x91\1\2#\4\b)\30\23\b\34\35>],\x98\1\31\xf8\0YX\4\3\309(\f\x9d\1\16=\34\30\t\30\t\xb8\1\23\x90\a\xf7\0#\0G\22\x93\1\xd2\x013\22\a\5\x036\5\xa0\t\1\23R\x91\1\2#4#\30<.],H:X\n\vHYX\3\30\318\f=\36=.=\34\x88\1*\vH\23\xe0\a\xa7\2\5\x93\2\2\20\22e\xc0\t\23\xf2\0\x81\1\x023\4#8L=LH\n+\n8\32\v\nXIX\3\4X\34\35N\x9d\1\34h\n\b;\nX\3\x90\1%\x90\6G \a\2\27@\xf7\1\0G\0\5\2\6\a\5\x80\n\23\xf2\x001\2Ac(\t(\x9c\1h+\n\3\v\30\n;X9h\23H\34-^-\16]\34hK\nh\3\x80\1\5\6\5\xc0\6\a\x90\1\x97\3\5&\5\x80\n#b\xa1\1C\x88\1\xfc\0h\n+\23\33\n[H9h\23H,\35^-\36M\34hK\nh\3\xf0\0\25\6\xb5\1\20\a\xc0\6\xd7\2\0\5&\5\x90\n\23\xf2\0\xa1\x013\xf8\2\n+#k\nH9h\23H\34-^-\36]\fh\n;\n(\t8\23P\25\xc6\1\5\a\xd5\t&\5\xa0\n\23\xf2\0Q\2!3\30\t()H\31\xf8\0\n+\32k\32H9(\31\30\238,=\36]\36]\fh\n;\n\x98\1\3@\5\x86\f\5\xb0\n#ba\2SH9\xd8\1\n\xab\1\32h\31(9\b\238,\xbd\2\f\xf8\0\n[\n\v(\t\30\x130\5\x86\f\5\xb0\n#R\3\2Q#\2#H9\xd8\1\n\x8b\1*\xc8\1\t\4\31\b\238,\xed\1\36-\f\xf8\0\n;\32\23\n\v8\x130\x156\x005\xe6\n\5\xb0\n\1#R\3\x021#13\309H\31\xf8\0\nk\n\33\xd8\19\b\238,M\16=.\35.\35\fh\v\n;#\v\32\b\t\30# \25\26\25P\xf5\4\xd6\5\5\xc0\n\1\23b\3\2\21\2\23\2A3\xf8\0Ih\32[#\30\t\30)\xf8\0\t\30\238,=.-.-\16-\fH\n#;\32\33\32\b\31\30#\1\0\25\26\5\xa0\6\xe5\4\26\xf0\n\1\23b\3\2\1\23\xf1\0CHYH\t\30\32[\23\v89\x98\1\238,->=\36m\f8\n\33\23\xfb\0\32\b\31\bC\1\25\6\5\x80\v\a\5\26\5\xf0\n#b3\xf1\0\2CHI8\31\30\32\xfb\0\n89\x98\1\238,->\xcd\1\f8\n\xcb\1\n\b\31\bS\25\6\5\x90\v\5\6\25\xf0\n\x013B#\21\2\xf1\0C89H\318\32K\n\v(I\30\th\238,=\36-\16=\36=\fH\n\xab\1\328\23\1\2#\25\xb0\v\25\xa0\v\1\x93\1\xd1\1#(\31\xf8\0\tH*\v*h\tX\32(\238\n\34\xfd\0\36=\36-\fX\32\x8b\1\nH\23!3\xf0\27#\2\3\xe1\x013\xb8\1\31H*\xe8\1\n\33\n\v\n#\32\30,\x8d\2\34X\v\32K*8#13\1\xb0\27\1\0\a\23"\3\xe1\1#\xb8\1\31\xd8\2;\n\b\n#\32\30,\x8d\2\348\t(\xfa\08\23\2AC\xc0\x055\xa0\21\27\x132\3\x81\2#\x98\19\xa8\2\nK\n#;\30,M\36\xfd\0\34(9\xc8\1\23\xf1\x003\20\a\xe0\4%6\25\x90\21\a\23B\3\2Q\22\xf1\x003\xf8\0)\xc8\2\3[\23+\n(,-.m\34(I\xa8\1\23\x91\1C\a\0\a\xc0\4\25V\25\xa0\21#b\x81\x023\xf8\1\xf9\0X\v\nK\23+\n(\4<\16\xfd\0,(Y\x98\1\3a\2A3\0\'\xb0\x045&\5\xc0\21\1\23b\x91\x023\xd8\1\x99\1X\nK\23\33\32H<]<(i\x88\1\23\xc1\1\2#\0\'\xc0\4%&\5\xd0\x113R\1\2\x81\x023\xb8\1\xa9\1X\n;\23\v\32\x88\1\x8c\18\xf9\0h\23\xf1\1#\20\27\xd0\4\25&\5\xe0\x113bQ\2!\2\xf1\x003\x98\1\xb9\18\v\32+\23\32\xe8\2iH#1\2a\2!\2\23\2\3G\xc0\4\5&\25\xf0\21\1#b\xb1\x0238\t(\xb9\1(\n#\33\n\23\n\xc8\2\tH)(C\xf1\1\2\3"\3\1G\xa0\4\25\26E\xf0\21\1#R\xc1\2#h\x89\18\v\n[\n\23(\t\xa8\1\31H\31\xf8\x003\xa1\1\2A\2\x132\3g\x90\4\5V\25\x80\22\1#b\xb1\x023X\xf9\08\32K\32\23(9\xf8\0)\xb8\1C\x81\2\2\x132\23g\x80\4\25V\25\xf0\21\27\20\23bA\2\xe1\x013hI8\32;*\3\4(IXI\x88\x013\xc1\1\x021\x82\1\3\0g\x80\4\x85\1\x90\x127#R\xd1\2Ch\tXJ\30\238Y8YX3\x91\1\22\xf1\0\x82\1\23\xf7\0\xc0\x177\1#Ra\2Q\2Q\2S\x98\2\23(i8\t\b\31H3\2\xa1\2\2\3\x82\1\23\x87\1\xe0\27\'\1\23b\xc1\1\2a\2S\x88\2\23(i\xa8\1C\xb1\2\xa2\1\23\0\x87\1\xf0\x177#b\xd1\x023\xb8\19\b#\30i\xf8\0Ca\x021\2Q\xd2\1\23\1\x97\1\x80\x187#b\3\2\xf1\1\22A3h\t\b)\b#(Ih3\2\x81\2\xf2\1\23\1\xb7\1\x80\30G\1#b\23Q\22\xe1\1\bS\2h#\xa8\1\2#\2\xa1\2\xf2\1\23\1\0\xb7\1\xa0\x187\x003\x82\1A\22\x81\2\2c\283\18!\2#\2\xa1\2\x82\2\23\1\0\xc7\1\xb0\30G\1#\xf2\0\3\2a\22\x91\2\2\xd3\2\xb1\1\2A\x92\2#\1\xd7\1\xd0\30W#\x82\1\3\2\x91\4#\1S\xf1\1\2\21\x92\2#\1\xf7\1\xf0\30W\x013\xf2\0#\2\x91\1\2\xb1\2\23\xd1\1\2a\xb2\2#\1\0\xd7\1\xb0\31W\x013\xb2\1\xd1\3\23\x81\1\x021\2Q\xb2\2#\1\0\xe7\1\xc0\31g\x013\xb2\1\21\22Q\22\xf1\1\23A\x021\22A\xc2\x023\0\x87\2\xf0\31\xf7\0S\xb2\1\xd1\1\2\x81\1\23\xb1\1\xe2\x023g\0\xb7\1\xa0\32\x87\1\1S\xb2\1\xb1\2\23A\x92\3C\xb7\2\xe0\32\x97\1\1C\xe2\1\xf1\1\xf3\0\xd2\2S\xb7\2\x90\33\xa7\1\0\xf3\0\xb2\2\x83\1\xc2\2S\2\1 \xa7\2\xe0\33\xb7\1\1c\xe2\2#\xd2\1c\1\xa7\3\xa0\34\xd7\1\1c\x82\2#\0\23\x92\1#\2\xf7\3\xc0\34\xf7\1\1c\xe2\1#\a\1\23\xf2\0#\1\0\xd7\3\x80\35\xa7\2\1\xf3\0b3\1\'\x83\1\1\xd7\3\xf0\35\x97\2\0\27\xd3\1\1G\x001\20\xc7\3\xc0\36\x97\x031\xa7\5\x80\37\xc7\b\xd0\37\xc7\a\xc0 \xf7\6\x90!\x87\6\x80"\xb7\5\xa0\a5\xb0\25U`E\x80\2U \xb7\4\xf0\5\xb5\1 \25\26\25\xa0\25\x056\5`\5&\5\x80\2\x056\5`\xb7\3\xb0\6\5\x86\1\25\a\20\x056\5\xa0\25\x056\25@\x056\5\x80\2\x056\5\xb0\1\xc7\1\xd0\a\5\xa6\1\5\20\x056\5\xa0\25\5F\5@\x056\5@\a\0\5\0\5\xf0\x006\5\xe0\n\5\xa6\1\5\20\x056\5\xa0\b\a\xf0\f\x056\5@\x056\x050\x85\1\a0\5&\5 E U\x80\x015@%\x90\1\xf5\0\xe0\3\5\xb6\1\20\aE\xa0\1\xa5\1\x90\1\xa5\1\xd0\1\xb5\1\xe0\f\x056\25 \x056\x050\5\xf6\0\x150\5&\x050& \x156\5\a\x005\0\x156E\26%`\5\xf6\0\5\xc0\x015\xc0\1\x056%6\25\0U\x80\1\25\x96\1\5\x80\1\5\xa6\1\5\xa0\1\25V\x056\5\xf0\f\x056\5\20\x156\5 \5\xa6\1\5\20\25&\5\20\x056\5\20\a\x056\5\20\5\xb6\1\5V\x150\25\x96\1\25\x90\1\x056 \5\x80\1\x056%6\25\0\x056\5\x80\1\25\x96\1\5\x80\1\5\xa6\1\5\x80\1\a\25\xb6\1\5\xf0\f\x156\5\0\x156\5 \a\xa6\1\5 \5&\5 6\5 \x056\5\20\5\xb6\2\x050\5\a\xa6\1\5\x80\1\25f\25\xf0\0\x056%6\5\20\x056\5 \x150\25\x86\1\25\0\a%\a \5\x96\1\5 %0\25\xc6\1\5\xf0\f\x156\5\a\5F\5\0\25F%F\5\20\x056 6\5 \x056\5\20\5\xb6\2\x050\5F%F\5\xf0\0\25f\5\x80\1\5\xa6\1\5\0\a\x056\5\0\25\26\25\20\25\x86\1\5\20\25\26\5 \5\x86\1\25\0\a\5\26\a\5 \x1565F\5\x80\r\x056%6\5\20\x156E6\5\20\x056\5\x1060\x056\5\20\5F%V\25F \x056e&\5\xf0\0\a\5f\5\x80\1\5\x96\1\5 \x0565&\5@%F\5\20\x056\5@\25F\5\a\0\x056\5 \a6U6\5\x80\r\x156\x056\25\20\5F5\a\5&\5\20\x056\5\20\x056 \x056\x050&\25\20\x056\5\20\x056\5\20\5\xd6\1\5\x80\1\x95\1\xf0\0\5\xf6\x005\20\x056%6\5P\5F\5\a\20\x056\5P\x056\5 \x056\5\20\x056e6\5\x90\r\x056\x056\25\20\x1565\a\5&\5\20\x056\5\20\x056\5\20\x056\5 6\25\20\x056\5\20\x056\5\20\5\xd6\1\5\x80\1\5f\25\xf0\0\5V%\a\5 \x0565&\5@\5V\5 \5&\5P\5F\5 \25&\5\20\x056e6\5\x90\r\x056\x056\5 \x156U&\5\0\x156\5\20\x056\5\20\x056\5 6\5\a\20\x056\5 6\5\20\5\xd6\1\5\x80\1\5f\25\xf0\0\x056\25\xf0\0\x056\5\x105P\x056\25@5@\x156\5@5 \x056e6\5\x90\r\a\5f\x050\x156\25\a\x156\5\0\a\x056\5\20\x05656\5\20\x056\5 \5&\x050\5&\5\20\x056\xa5\1\x80\1\5f\25\xf0\0\x056\5\x80\1\5F0\a`\x056\25\xd0\1\5F\5\xb0\1\5FU6\5\xa0\r\5f\x050\25F%F\5\20\x056\5\20\5F\25F\5\20\x056\5 \5&\x050\5&\5\20\x056e\6\25\a\x80\1\x85\1\x80\1\x056\5\x80\1\5F\xa0\1\x056U\x90\1\x056U\x90\1V5F\5\xa0\r\5f\5@\5V\5V\5\20\x056\5\20\5\xa6\1\25\20\x056\5 \x0560\5&\25\0\x056U\26\25\xb0\1\25\xd0\1\x056\5\x80\1\5F\5\x90\1\x056U\x90\1\x056e\x80\1\5V%F\5\xa0\r\5f\5P\5\xa6\1\25\20\x056\5 \5\x96\1\5 \x056\5 \x0560\5&\25\0\a\5\xc6\1\5\xa0\3\x056\5\x80\1\5F\5\xf0\0\a\5\x96\1\5\x90\1\5\x96\1\5\x80\1\25\xc6\1\5\xa0\r\25F\5\a@\a\25\x96\1\5 \x056\5 \25\xf6\0\25 \x056\5 \x056\5\20\a\5&\25 \5\x96\1\25\xb0\3\x056\5\x80\1\5F\5\xf0\0\25\x96\1\5\x80\1\5\xa6\1\5\x80\1\a\25\xb6\1\5\xb0\r\x156\5\x80\1\25F%0\5&\x150%6%0\25&\5 \25\6\0\a0\5&\x150\25f\5\xd0\3\x056\5\x90\1\a6\5\xf0\0\5\xa6\1\25\xf0\0\5\xa6\1\5\xb0\1%&\x156\5\xb0\re\x90\1\xf5\0@EP\xf5\0PE050E@%\a6\25\xe0\3E\x90\1E\x80\1\xc5\1\x80\1\xc5\1\xc0\1\xb5\1\xe0\r\5\x90\2\a\x80\1\a\xf0\2\5\xe0\1\5\a\x80\1\a\x005\xf0\a\5`\a\xc0\1\27 \5\0\a\xc0Y'
)

15099L'écriture du
bytes
passe dans des proportions similaires de
32995
à seulement
24816
caractères, soit une économie de
24,79%
! :o

Victoire, ça rentre enfin sur
NumWorks
! :bj:

Voici donc dès aujourd'hui accessible le nouvel outil
img2calc
te permettant de faire rentrer beaucoup plus facilement tes scripts
Python
d'images sur les calculatrices les moins bien dotées en mémoire de stockage, et d'en faire rentrer beaucoup plus sur les autres ! :D

Liens
:

Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 28.3%
 
Posts: 39627
Images: 11666
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
YouTube: critor3000
Twitter: critor2000
Facebook: critor.ti
GitHub: critor

Re: img2calc: des scripts Python encore plus petits

Unread postby Adriweb » 08 Jan 2022, 22:14

Bien vu :)
Image
MyCalcs
: Help the community's calculator documentations by filling out your calculator info!
MyCalcs
: Aidez la communauté à documenter les calculatrices en donnant des infos sur votre calculatrice ![/url]
Inspired-Lua.org
: All about TI-Nspire Lua programming
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 73.5%
 
Posts: 13843
Images: 1133
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
Twitter: adriweb
GitHub: adriweb

Re: img2calc: des scripts Python encore plus petits

Unread postby grosged » 09 Jan 2022, 19:05

Très intéressant comme sujet !
Je me demandais ... Combien de valeurs d'octets ne correspondent-elles pas à des caractères affichables ?
Si j'ai bien compris, il faudrait réserver ces caractères affichables pour les octets les plus "présents", et les autres (avec anti-slash) pour les moins présents, c'est bien ça?
User avatar
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 30.7%
 
Posts: 770
Images: 81
Joined: 14 Sep 2011, 12:29
Gender: Not specified

Re: img2calc: des scripts Python encore plus petits

Unread postby critor » 09 Jan 2022, 19:28

Merci pour ton retour.

grosged wrote:Je me demandais ... Combien de valeurs d'octets ne correspondent-elles pas à des caractères affichables ?

Sur nos calculatrices, les codes de caractères affichables vont le plus souvent de 32 à 127.

grosged wrote:Si j'ai bien compris, il faudrait réserver ces caractères affichables pour les octets les plus "présents", et les autres (avec anti-slash) pour les moins présents, c'est bien ça?

C'est peu utile/pratique dans mon cas, car pour économiser pas mal de place en
heap
(ce qui reste le facteur le plus important)
je fusionne 2 informations au sein d'un même octet : index de couleur + nombre de pixels la réutilisant à la suite.
Autant les index de couleurs pourraient être permutés, autant le nombre de pixels non.
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 28.3%
 
Posts: 39627
Images: 11666
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
YouTube: critor3000
Twitter: critor2000
Facebook: critor.ti
GitHub: critor


Return to News Divers

Who is online

Users browsing this forum: No registered users and 6 guests

-
Search
-
Social
-
Featured topics
Reprise de ton ancienne fx-92 Collège ou Graph 25/35/90 à 5€. Même non fonctionnelle ou ancien modèle. Etiquette de retour fournie, pas de frais de port à payer.
Coque NumWorks édition limitée Mai 2022 à gagner.
Comparaisons des meilleurs prix pour acheter sa calculatrice !
123
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
624 utilisateurs:
>589 invités
>28 membres
>7 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)

-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)