π
<-

TI-Nspire Découverte entrée série TI-Nspire ViewScreen

New postby critor » 16 Dec 2017, 15:42

363364360Les tablettes de rétroprojection TI-Nspire ViewScreen sont littéralement des calculatrices TI-Nspire dépourvues de clavier. On reconnaît en effet l'écran de chargement de ces dernières, ainsi que les icônes de reprogrammation des partitions Boot2 et Diags si l'on maintient au démarrage la touche haut enfoncée, ou bien les deux touches simultanément.

9071368367En les ouvrant, nous avions déjà remarqué que les tablettes TI-Nspire ViewScreen réutilisaient en fait le matériel des TI-Nspire CAS+, prototypes non finaux distribués dans les classes pilotes en 2006-2007 et incompatibles avec les TI-Nspire finales commercialisées à compter de 2007. On retrouve en effet répartis sur les deux faces les mêmes composants principaux :
  • TI-OMAP NP31AZZG (processeur 32-bits ARMv5/ARM9 78MHz)
  • HYB18L256160 (SDRAM 32Mio)
  • SST 39VF400A (Flash-NOR 512Kio, pour le Boot1)
  • ST NAND256W3A (Flash-NAND 32Mio, pour tout le reste)

361366La tablette de rétroprojection TI-Nspire ViewScreen dispose de deux ports USB utilisables une fois démarrée :
  • un USB type A pour afficher l'écran d'une TI-Nspire monochrome ou couleur
  • un USB type B pour afficher l'écran d'une TI-84 Plus ou TI-82 Advanced
Toutefois elle ne lance pas le protocole de transfert USB des TI-Nspire et ne peut donc pas recevoir par cette voie de fichiers depuis un ordinateur ou une autre calculatrice TI-Nspire. Si bien que nous n'avons pas pu lui appliquer les méthodes de dumping développées pour d'autres modèles TI-Nspire et que le système utilisée par la TI-Nspire ViewScreen reste donc non sauvegardé à ce jour.

369Contrairement aux TI-Nspire CAS+, la tablette TI-Nspire ViewScreen dispose de plusieurs emplacements internes pour connecteurs :
  • J7 : 2x10 broches avec 9 masses, ce qui ressemble énormément à un JTAG ARM...
  • surtout quand J010 juste à côté a 2x7 broches, comme le JTAG TI
  • JMP01 : 3 broches
  • JMP02 : 3 broches
Pas de connecteur Dock contrairement aux calculatrices, mais cela ne nous avait pas empêchés de trouver la sortie série TTL sur JMP02 et de récupérer le log de démarrage :
TI-Nspire ViewScreen wrote:Boot Loader Stage 1 (1.0.439)
Build: 2006/6/30, 5:44:11
Copyright (c) 2006 Texas Instruments Incorporated

Last boot progress: 34812

ViewScreen Adapter
System clock: 78 MHZ
SDRAM memory test: Pass
Clearing SDRAM...Done.
Clearing SDRAM...Done.
Clearing SDRAM...Done.
Checking for NAND: NAND Flash ID: ST Micro NAND256W3A

Loading DIAGS software...

Error reading/validating DIAGS image

Loading BOOT2 software...

100%

BOOT1: loading complete (328 ticks), launching image.

Rappelons que les calculatrices TI-Nspire démarrent usuellement en trois temps :
  1. Boot1
  2. Boot2
  3. système d'exploitation
Or, petite originalité sur la tablette TI-Nspire ViewScreen, il n'y a que deux étapes :
  1. Boot1
  2. Boot2
L'image programmée dans la partition Boot2 joue donc en pratique le rôle du système d'exploitation.

8385Nous n'avions pas trouvé à l'époque l'entrée TTL, mais c'est désormais chose faire après avoir bricolé des connexions un peu plus propres et donc fiables, juste à côté sur JMP01.
La difficulté qui nous avait fait rater ça, c'est que la tablette TI-Nspire ViewScreen refuse bizarrement de redémarrer à chaud lorsque cette entrée est connectée, et ce malgré des tests avec deux interfaces USB/TTL différentes.

Nous sommes donc désormais enfin capables de reprogrammer les partitions Boot2 et Diags de la TI-Nspire ViewScreen, cette dernière partition de 640Kio étant de toutes façons vide selon le log de démarrage. :bj:



En pratique toutefois, les progrès vont s'arrêter ici pour aujourd'hui, puisque nous ne disposons d'aucune image compatible avec la TI-Nspire ViewScreen. Rappelons en effet que les calculatrices TI disposent d'identifiants qui leurs sont propres, et son précisés en entête de toute image exécutable qui leur est envoyée (que ce soit un système d'exploitation, une application, un Boot2 ou un Diags). En hexadécimal, cela donne à ce jour :
  • 01 : TI-92 Plus
  • 02 : TI-73
  • 03 : TI-89
  • 04 : TI-83 Plus
  • 08 : TI-Voyage 200
  • 09 : TI-89 Titanium
  • 0A : TI-84 Plus
  • 0B : TI-82 Advanced
  • 0C : TI-Nspire CAS / TI-Nspire CAS+
  • 0D : TI-Nspire Lab Cradle / TI-Nspire ViewScreen
  • 0E : TI-Nspire
  • 0F : TI-Nspire CX CAS / TI-84 Plus C Silver EDition
  • 10 : TI-Nspire CX
  • 11 : TI-Nspire CM CAS
  • 12 : TI-Nspire CM
  • 13 : TI-84 Plus CE / TI-83 Premium CE
  • 1B : TI-84 Plus T

La tablette TI-Nspire ViewScreen utilise l'identifiant 0x0D et refusera donc d'installer les images TI-Nspire CAS+ pourtant compatibles, ces dernières utilisant l'identifiant 0x0C.
Impossible d'installer des images où l'on aurait modifié cet identifiant dans les images, leur intégrité étant validée par une signature électronique ne pouvant être falsifiée puisque les clés privées en sont inconnues à ce jour.
Quant à l'interface TI-Nspire Lab Cradle utilisant le même identifiant 0x0D, non seulement les clés privées sont différentes, mais en prime les images prévues pour ce périphérique sont incompatibles car réutilisant quant à lui le matériel TI-Nspire TouchPad.

Pour faire passer et exécuter du code permettant de récupérer les images Boot1 et Boot2 utilisées par la tablette TI-Nspire ViewScreen, il va falloir soit exploiter de possibles bugs dans le code recevant, validant et exécutant les images reçues, bugs dans ce cas probablement déjà présents à l'identique sur TI-Nspire CAS+... ou à défaut se tourner vers le JTAG avec le connecteur J7...

9060En tous cas comme l'on touche et donc avance sur la TI-Nspire ViewScreen à peu près une fois tous les quatre ans, voici ci-contre de quoi ne pas perdre de temps à rechercher les (rares) informations la prochaine fois. ;)
Link to topic: Découverte entrée série TI-Nspire ViewScreen (Comments: 13)

HP Beta HP Prime 13217: débogueur programmes CAS+Python

New postby critor » 14 Dec 2017, 22:49

Hewlett Packard diffuse cette semaine de nouvelles versions beta de sa suite logicielle HP Prime, les versions 13217 datées du 11 décembre 2017 :
  • logiciel de communication HP Connectivity Kit
  • logiciel d'émulation HP Prime Virtual Calculator
  • firmware HP Prime

Rappellons que cette série de versions beta rajoute d'importantes fonctionnalités, comme la possibilité de programmer ses fonctions avec une écriture ressemblant au Python losque l'on est dans le contexte CAS, nouveauté très pertinente dans le cadre des nouveaux programmes du lycée dont l'application a commencé cette rentrée 2017 en Seconde. :bj:

Ce n'est pas la première fois que Hewlett Packard met quelque chose de remarquable niveau programmation sur sa HP Prime, puisque c'est à ce jour le seul modèle disposant d'un débogueur intégré. Accessible avec le bouton tactile Debog sous la liste des programmes ou via la commande DEBUG(), il permet d'accéder à une interface exécutant le programme pas à pas tout en suivant l'évolution des variables que l'on souhaite. De quoi obtenir la réponse avec justification directement recopiable d'un bon 90% des questions d'algorithmique au BAC ! :bj:


Toutefois, cela ne fonctionnait que dans le contexte numérique. Non disponible donc avec les programmes CAS, et même pire la saisie manuelle de l'instruction DEBUG() dans un contexte CAS déclenchait un redémarrage de la calculatrice. :'(


La version 13217 fait enfin fonctionner correctement la commande DEBUG() dans le contexte CAS. Il devient donc enfin possible d'y dérouler pas à pas l'exécution de fonctions de programmes nécessitant ce contexte. :)

Mais cela implique aussi autre chose d'extraordinaire, c'est que les programmes Python, langage ne fonctionnant que dans le contexte CAS, pourront eux aussi être déroulés pas à pas ! :bj:


On regrettera toutefois plusieurs choses pour le débogueur CAS, cette beta ayant été annoncée comme finale :
  • uniquement en anglais
  • remplacement de l'interface du débogueur numérique par une interface texte
  • impossibilité de choisir les variables à surveiller, ce qui pourra être embêtant quand il y en aura beaucoup
  • le détail des lignes en cours d'exécution est affiché non pas comme saisies dans l'éditeur (c'est-à-dire en HPPPL ou Python) mais avec une notation fonctionnelle qui ne correspond à aucun de ces deux langages
Dommage particulièrement avec ce dernier point qui pourra dérouter les utilisateurs les moins experts, ceux-ci ayant besoin de connaître 3 langages différents pour pouvoir dérouler pas à pas un programme Python sur leur HP Prime :
  • le langage Python bien évidemment
  • le langage HPPPL propre à la HP Prime pour pouvoir adapter le code Python lorsque faisant appel à des commandes ou fonctions absentes ou nommées autrement sur cette calculatrice
  • le langage fonctionnel propre au débogueur CAS HP Prime



Nous ne pouvons qu'être ravis des très grandes avancées en terme de programmation et donc de conformité aux actuels et futurs programmes du lycée français sur HP Prime avec cette série de versions beta. :bj: Surtout quand c'est innovant/exclusif, d'autres constructeurs pourtant bien plus populaires n'ayant toujours rien sorti dans ce contexte à ce jour alors que les nouveaux programmes sont en application depuis déjà 3 mois et demi.

Nous doutons toutefois que le fonctionnement assez complexe choisi sur HP Prime, à savoir l'obligation du contexte CAS pour le Python qui n'a pourtant rien d'une fonctionnalité liée au calcul formel ou même littéral, avec en prime un débogueur distinct qui n'a pas du tout le même degré de finition que le débogueur de l'environnement numérique, puisse véritablement faciliter la vie du lycéen moyen qui, rappelons-le, est censé débuter avec son premier langage de programmation textuel en Seconde. Si les habitués/experts l'enjamberont sans problème, la marche nous semble bien haute pour les débutants de Seconde voir même au-delà, vu qu'ils ne feront certainement pas tous le choix de se perfectionner avec les option ICN et/ou spécialité ISN.

Mais si Hewlett Packard continue sur sa soudaine lancée, nul doute que cela pourra être amélioré dans de futures mises à jour. ;)




Changelog officiel complet (anglais) :
Show/Hide spoilerAfficher/Masquer le spoiler
Some changes since the first two sets of beta files:

1. Added feature:
a. [a b/c] key works with the [angle] key to toggle complexes also.

FIXED ISSUES:
1. REPLACE function with strings could misbehave sometimes.
2. FREEZE not working anymore
3. Issue with BLIT using data from outside of graphic.
4. Tucked away drawing benchmark tool in 3d grapher.
5. Modified CellHasData and ClearCell to work on range instead of list.
6. Some speed improvements to catalogs with some types of geometry apps.
7. Fixed ARC drawing and enhanced sample programs.
8. High system resource use when hovering or pressing a button in emulator.
9. IFERR RETURN 10 … would not return 10 but a function of “RETURN 10”
10. Issues with user defined functions not loading properly on system boot.
11. Improvements to QPI output. Renamed back to QPI since no other ideas are really a significant improvement in a universal way.
12. Catalog sometimes was including geometry variables erroneously.
13. Reduced screen flicker in several places through the system (symb screen, choosers).
14. Various reported CAS issues.
15. Tweaked CAS debugging so it looks more like the HPPPL debugger screen.
16. Color changing during “transform” of a function causes screen to go solid color.
17. Matrix growing not checking against proper size limits (20K items).
18. ALPHA sorting in program list causing problems.




Téléchargements :
Source : http://www.hpmuseum.org/forum/thread-9678.html

Divers Fabrique un synthé avec la carte DSP TI-C5535 - #Épisode 2

New postby Wistaro » 12 Dec 2017, 19:03

Il y a quelques semaines, nous te parlions d'une carte électronique programmable, fabriquée par Texas instrument, la TMS320C5535 eZdsp.
8206
Mais cette carte n'était pas une carte ordinaire, c'était une carte DSP, pour Digital Signal Processing.

Comme nous le disions, les possibilités offerte par cette carte étaient nombreuses.



Aujourd'hui, après la théorie, passons à la pratique!


Je vous propose de réaliser un premier projet tout au long de cet série d'articles: un synthétiseur au clavier.
Il s'agit en quelque sorte d'un piano virtuel. Vous appuyez sur des touches de votre clavier, et la carte DSP joue un son, différent pour chaque touche.
Tous les synthétiseurs utilisent ce principe! Une circuit détecte l'appui d'une touche (par exemple, d'une touche au clavier s'il s'agit d'un piano électrique), et un autre circuit basé sur un ou plusieurs DSP se chargent de générer le signal.

Intéressant non?
Si vous êtes prêts, nous pouvons commencer.

Tout d'abord, il est important de définir notre cahier des charges, qui, dans un premier temps, vas être très simple! Nous serons peut-être amené à l'améliorer au fur et à mesure des épisodes de cette série. Aujourd'hui, nous ne nous imposons que très peu de limites!
En effet, nous voulons juste générer un son audible, à chaque appui d'une touche au clavier. Le programme devra tourner en boucle, pour pouvoir saisir autant de notes souhaitées. Nous pourrons ainsi créer une mélodie si nous sommes inspirés! :D

Nous voyons donc qu'il y a 2 parties majeures dans ce projet:
  • Générer un signal audible
  • Détecter l'appui d'une touche au clavier


Je vais détailler chaque partie, et vous allez voir que même si cela semble peut-être un poil complexe, ce n'est en réalité par le cas!

Commençons par la génération du son.


Un son, c'est quoi? C'est tout simplement une vibration de l'air. Ces vibrations se propagent un certain nombre de fois par seconde, c'est ce qu'on appelle la fréquence. Cela, vous savez ce que c'est. C'est en quelque sorte la "hauteur" du son: un son haute fréquence sera perçu aiguë, un son basse fréquence sera grave. Quand vous écoutez de la musique sur une enceinte, celle-ci va faire vibrer une membrane sous l'action d'une tension électrique, qui va faire vibrer les molécules d'air. Ces vibrations vont arriver jusqu'à vos tympans qui vont recevoir ces vibrations, et vous allez entendre quelque chose. Enfin, normalement.
Mais comment la source (votre téléphone, votre ordinateur...) génère t-elle la tension qui arrive à faire bouger la membrane? En fait, rien de secret, c'est très simple! Lorsque la source envoie une tension positive, la membrane est poussée dans un sens, et lorsque la tension est négative, elle est poussée dans l'autre sens. La répétition de cette tension positive, puis négative, puis positive, etc. va alors faire vibrer les molécules d'air: c'est le but recherché. Notez que le temps entre ces répétitions est la période, soit l'inverse de la fréquence (Pour être plus pointilleux, il s'agit de la demi-période! La période complète étant la temps entre 2 tensions de même signe!).

Autrement dit, pour un son plus aiguë, il va falloir être rapide!

Maintenant, quelle fonction mathématique possède des alternances négatives et positive au cours du temps? Il s'agit des fonction périodiques de valeur moyenne nulle. La plus simple d'entre-elle, est le sinus.

OK, maintenant nous savons que notre carte doit générer un signal sinusoïdal d'une certaine fréquence. Mais comment faire ça? Notre carte ne traite que les signaux binaires, à priori.
Sauf que nous sommes sur une circuit DSP, et que le traitement des signaux, c'est son job.

Encore une fois, le principe va être simple. Nous allons lui donner en entrée un nombre, par exemple 42. Puis un petit composant va se charger de convertir ce nombre en impulsion électrique. Ce petit composant s'appelle un Convertisseur Digital Analogique, ou DAC en anglais.
Son but? Convertir un valeur en un signal électrique.
Ici, le DAC sur notre carte est un AIC TI-3204, qui échantillonne les signaux à 192kHz.


Il ne reste plus qu'à calculer les valeurs d'un sinus pour pouvoir ensuite les envoyer au DAC.

En réalité, c'est un peu plus complexe. Pour des raisons de gestion de la mémoire, il serait problématique de calculer à chaque fois tous les points du signal sinusoïdal. Il est préférable de le pré-calculer au lancement du programme, puis de s'en servir après. N'oubliez que pas que nous sommes sur un circuit DSP!
J'ai donc au préalable généré une sinusoïde sur 16bits signés (capacité du DAC), c'est à dire qu'en sortie il y aura
$mathjax$2^{16}$mathjax$
niveaux de tension.

La configuration du DAC est un peu complexe, car il faut paramètrer beaucoup de choses sur l'AIC et les ports. Il est vivement recommandé de se baser sur la documentation de la carte!




Il ne reste plus qu'à envoyer le signal! Mais le problème est ici que nous ne pouvons pas jouer sur le fréquence, étant donné que nous avons pré-généré le sinus! J'ai donc bidouillé un peu le code pour que quand la variable fréquence varie, le son change. Par la suite, nous essayerons de faire quelque chose de plus propre! Mais pour le moment, ce n'est pas grave. Remarquez aussi que j'ai copié le signal 2 fois, car nous sommes sur un port stéréo.
Cela fonctionne très bien. Dans un prochain épisode, nous verrons comment générer un signal plus propre, certes, mais aussi différent d'un signal sinusoïdal. Chaque forme de signal a sa tonalité bien particulière. Par exemple, un signal carré fait beaucoup pensé aux synthétiseurs dans les musiques des années 80 :p Il sera également possible d'appliquer des filtres, des effets au signal pour le rendre beaucoup, beaucoup plus cool. Mais pour l'instant, occupons-nous de notre petit piano électrique!

Voilà la fin de la première partie!
Maintenant, il ne reste plus qu'a détecter les touches du clavier.
Vous savez peut-être que lorsque vous appuyez sur une touche, votre ordinateur reçoit une donnée correspondante à la touche envoyée. On appelle ça le code ascii. Et bien, grâce à un petit programme installé de base sous windows, Hyperterminal, il est possible d'envoyer cette donnée non pas à Windows, mais plutôt sur un port spécifique. Un port est globalement une entrée/sortie de l'ordinateur qui communique au moyen d'un liaison série: un fil sert pour émettre des données, et un autre pour les recevoir.



Et, ça tombe bien, notre carte TMSezDSPC5535 est connecté sur l'un de ces ports séries de notre ordinateur! I suffit donc de connecter (virtuellement bien sûr! ) le fil d'émission de l'ordinateur sur le fil de réception de la carte , pour assurer une liaison entre les 2 deux. Ainsi, quand vous appuierez sur "E", le carte DSP recevra "E".
Mais cela n'est pas magique. Sur la carte, le composant qui réalise cela et un UART. Il fonctionne aussi bien en émission, qu'en réception. Ici, nous travaillons avec une fréquence de transmission de 115200 bits par seconde. Il faut donc que Hyperterminal reçoive aussi les données à cette fréquence, sinon il y a aura un gros problème!


Comme vous pouvez le voir à gauche, le code final est très simple. Dans une boucle infinie, je regarde en continu si je reçois un caractère. Si c'est le cas, alors je génère un signal pendant 1 seconde, et je réinitialise tout. On peut remarque que la je passe en paramètre de ma fonction qui génère le signal la touche appuyée. En effet, je m'en sert pour que, à chaque touche soit associée un son différent!
Notez que le programme pourrait être bien plus optimisé, notamment en travaillant avec les interruptions! Nous verrons ça un peu plus tard.

Bon, en réalité, avec mes bidouillages, le signal est en sortie n'est pas très beau. Il est même assez loin du signal sinusoïdal. Voyez par vous-même :)
Image Image


En effet, si vous regardez mon code, vous voyez que je n'envois pas la totalité du sinus à chaque fois. Pour faire varier la fréquence, je n'envoie qu'une partie à chaque fois, et je répète cette partie. Le signal n'est donc pas sinusoïdal en sortie. D'ailleurs, c'est également bien visible sur le spectre, qui comporte quelques harmoniques.


Attention donc les oreilles :troll:
Nous sommes encore loin d'un beau synthétiseur, mais on s'approche :D

Voici une courte vidéo vous montrant le résultat :p



Le code source du projet est disponible gratuitement sur GitHub: https://github.com/Wistaro/DspSynthesizer


Et ensuite...?
Dans les prochains épisodes, comme je l'ai déjà dit, nous améliorerons ce projet, notamment avec ceci:
  • Génération de signaux plus propre
  • Génération de différents types de signaux
  • Ajout d'effet et filtres
  • Lecture d'une musique
  • Affichage d'un vu-mètre
  • Transformateur de voix
  • Reconnaissance vocale

Et bien plus encore! N'hésitez pas à me donner vos avis!

A bientôt!

Épisode précédant - Épisode suivant

TI-z80 Oiram CE, 8 niveaux à la Super Mario 3 par John35588

New postby critor » 12 Dec 2017, 13:25

7698En attendant les vacances, pour continuer à avoir du fun sur Oiram CE, le passionnant moteur de jeux Mario-like pour ta TI-83 Premium CE, John35588 te sort cette semaine son propre pack de 8 niveaux.

On note une inspiration des mondes du jeu Super Mario Bros 3 sorti en 1990 sur console Nintendo NES (ou dès 1988 pour la console Famicom japonaise) pris dans l'ordre chronologique : Grass Land, Desert Land, Water Land, Ice Land, Pipe Land et Sky Land, voir même Dark Land pour le dernier :

Ce n'est certes pas la première fois que l'on note de telles similitudes, mais cela n'en reste pas moins un bel hommage au monument vidéoludique de toute une génération, à moins que tu ne sois plutôt un·e disciple du regretté Maître Sega. Dommage toutefois que jusqu'à présent, personne n'ait été capable d'adapter le niveau 5 de Super Mario Bros 3, Giant Land, ce dernier étant systématiquement sauté dans ce type de pack.




Téléchargements :

TI-z80 Vote Program Of The Year ticalc.org 2017 - TI-Z80 couleur

New postby Lionel Debroux » 11 Dec 2017, 20:04

Après la catégorie TI-Z80 monochrome la semaine dernière, le deuxième vote pour élire un autre programme de l'année 2017 (Program of the Year, abrégé en POTY) sur ticalc.org a été lancé.

La deuxième catégorie est pour la 84+CSE, avec deux programmes en compétition cette année:


Nous vous encourageons toujours à aller voter sur ticalc.org, parce que ce vote reste un rendez-vous significatif de la communauté, et il est bien sûr d'autant plus significatif qu'il y a plus de votants :)
Rappelons que pour voter, il faut avoir un compte; pour les inscrits, le sondage est sur la page principale du site, toujours dans la barre de droite, en-dessous du flux Twitter.

Les autres votes à venir seront pour les 83PCE / 84+CE (TI-eZ80), les TI-68k et les Nspire. Probablement dans cet ordre.

-
Search
-
Social TI-Planet
-
Featured topics
Grand Concours 2024-2025 - Programmation Python
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
12345
-
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.
1053 utilisateurs:
>1028 invités
>18 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)