Forum Index


Support myDVDEdit

Register Register
Log in Log in

Search Search
FAQ FAQ



--- Links ---
MacEtVideo
VideoHelp
Forum Mac-Video
 
Digicode
Par Jérôme Cabanis
Pour myDVDEdit version 1.0
Mise à jour le Wed 15 Apr 2009, 23:37

Forum Index -> Documentation/Tutorials

 

Le but de ce tutoriel est de vous apprendre à utiliser myDVDEdit pour modifier un DVD. Vous apprendrez la structure générale d’un DVD, vous apprendrez aussi à modifier des boutons, à ajouter des commandes et à ajouter un nouveau VTS à un DVD existant.

Dans ce tutoriel je veux ajouter un code d’accès à mon DVD pour rendre impossible à d'autres personnes de le regarder. Bien sûr, il est vain de penser qu’un DVD puisse être totalement protégé, car il existe de nombreux logiciels capables de lire un fichier VOB, à commencer par Quicktime et myDVDEdit bien sûr, mais en limiter l’accès à l’aide d’un lecteur DVD ordinaire n’est déjà pas si mal.

Pour çà j’ai tout d’abord besoin d’un menu représentant un digicode et d’un titre signalant que l’accès est autorisé. Vous trouverez donc ci-dessous, deux DVD (l’un en PAL, l’autre en NTSC, suivant l’utilisation que vous voulez en faire) contenant ce menu et ce titre.

Je ne vous montrerai pas ici comment je suis parvenu à faire ces DVD, ce n’est pas le but de ce tutoriel, je peux tout de même vous dire que j’ai utilisé Photoshop pour dessiner mes images et les incrustations du menu (ce qui deviendra après des boutons), et DVD Studio Pro pour assembler le tout sous la forme d’un DVD. J’ai ensuite supprimé toutes les commandes et tous les PGC inutiles pour obtenir ce que vous avez.

Bon, là, ça ne fait pas grand chose. mais examinons un peu ce DVD de plus près.
Commençons par le commencement.

First Play.

Si vous sélectionnez First Play dans le sélecteur de domaine (c’est ainsi que j’appelle le tableau en haut à gauche), vous verrez qu’il contient la commande Jump VMG Menu title. C’est un grand classique.
First Play est le premier PGC exécuté au lancement du DVD. Il contient en général l'initialisation des registres. En fin de ce PGC, il y a souvent deux possibilités : Soit le DVD affiche immédiatement un menu en utilisant la commande Jump Menu, soit il affiche un titre et utilise donc la commande Jump Title.

Note: Si vous ne connaissez pas encore les commandes Jump, je vous invite à lire la documentation "Les commandes de branchement".

VMG Menu title

Dans le domaine VMG Menu, on trouve un PGC marqué title. sa présence est indispensable au bon fonctionnement d’un DVD. C’est le PGC qui est appelé lorsque l’utilisateur appuie sur le bouton Titre (ou Title) de sa télécommande. On peut aussi retrouver le bouton sous les noms Menu Principal ou Top Menu.

Ici, une seule commande : Jump VTS Menu 1, Menu root. On ne fait juste que sauter au menu root de VTS Menu 1.

VTS Menu 1, Menu root

Continuons notre cheminement.

Nous arrivons dans le domaine VTS Menu 1. Comme vous devez le savoir maintenant (si vous avez lu mon tutoriel Guide d'utilisation de myDVDEdit) un DVD est constitué de fichiers VIDEO_TS qui forment le VMG, et de plusieurs fichiers du type VTS_xx_n, qui forment les VTS, xx étant leur numéro. Un VTS est constitué de deux domaines, le domaine menu (VTS Menu xx) et le domaine titre (VTS xx).
Le VTS Menu doit contenir au moins un PGC marqué root. C’est le PGC qui est appelé lorsque le lecteur de DVD exécute un PGC du VTS et que l’utilisateur appuie sur le bouton Menu de sa télécommande. root est appelé une entrée PGC.

Alors que pour un VMG Menu il n’existe qu’une entrée possible, title, un VTS Menu peut avoir jusqu’à cinq entrées, chaque entrée correspondant à un bouton de la télécommande :
root, bouton Menu.
subpicture, bouton Menu sous-titres.
audio, bouton Menu audio.
angle, bouton Menu angle.
chapter, bouton Menu chapitre.

En dehors du bouton Menu, la présence des autres boutons est rare sur les lecteurs de DVD classiques (ne pas confondre le bouton Menu sous-titres avec le bouton Sous-titres qui lui est toujours présent, même chose pour Audio et Angle).
Ces entrées PGC permettent d’avoir des menus spécifiques pour changer les sous-titres, la piste audio, ou choisir un chapitre en particulier. Leur présence n’est pas indispensable.

Revenons a notre projet.

Ici Pgc 1 est donc notre entrée PGC root et contient une Cell . Sa durée est de 00:00:00.12 / 30 si vous avez ouvert le projet NTSC, et 00:00:00.10 / 25 si vous avez ouvert le projet PAL. Ce qui signifie que le film fait 12 images avec 30 images par secondes en NTSC, ou 10 images avec 25 images par secondes en PAL. Après l’affichage de cette vidéo que l’on peut considérée comme courte, normalement un lecteur exécute ensuite les post-commandes, seulement ici la Cell est marquée pause infinie . Le lecteur va donc rester indéfiniment sur cette image jusqu’à ce que l’utilisateur appuie sur un bouton de sa télécommande. Nous avons là un classique menu fixe.

Les boutons justement. Il sont au nombre de 12 . Vous avez la possibilité de mieux les voir en cliquant sur les options contour et numéro . Vous constaterez que j’ai fait correspondre les boutons 1 à 9 avec les touches 1 à 9 de mon digicode, ceci afin que la touche 1 soit activée lorsque l’on appuie sur le 1 de la télécommande, la touche 2 pour le 2, etc...

Le menu a été prévu pour fonctionner aussi bien en 16/9 qu’en 4/3. En mode 4/3, l’affichage se fait en pan&scan, ce qui est habituel pour un menu. Le sélecteur de groupe  permet d’afficher les boutons suivant le mode d’affichage. Vous remarquerez que les boutons n’ont pas la même position ni la même taille suivant le groupe sélectionné. C’est assez logique puisque, suivant le mode, l’image affichée est différente.

Ce qui est vrai pour les boutons l’est aussi pour les subpictures chargées de représenter le bouton sélectionné ou activé. En cliquant sur l’onglet Informations, dans la partie Subpicture, vous verrez qu’il y a deux flux renseignés : un pour le 16/9, un autre pour pan&scan. Si pour les sous-titres les flux peuvent parfois être les mêmes, ce n'est pratiquement jamais le cas pour les menus où les subpictures doivent se superposer à l'image au bon endroit.

Et enfin nous avons ce qui va nous intéresser dans ce tutoriel, la commande du bouton .
Pour le moment, elle est configurée sur Nop, se qui signifie No Operations, aucune opération.

Note: J’ai pu constater que certains lecteurs de DVD n’aimaient pas beaucoup la commande NOP concernant un bouton. Je vous conseille donc si vous vouliez l’utiliser de la remplacer plutôt par une commande comme R0 = R0. Ce qui ne fait grand chose de plus, vous en conviendrez.

VTS 1 - Pgc 1

Pour terminer notre petit tour dans la structure de notre DVD, vous trouverez dans le Pgc 1 de VTS 1, une Cell de 1/2 secondes. Ce temps peut vous paraître court pour afficher une image mais vous ne devez pas oublier que le lecteur pourra mettre entre 0,5 et 1,5 secondes supplémentaire pour afficher l’image suivante (le temps pour lui de relancer son décodeur). L’image apparaîtra donc entre 1 et 2 secondes à l’écran. Si ceci vous parait quand même trop court, rien ne vous empêche d’ajouter une pause de 1 seconde dans les paramètres de la Cell.

Préparons le terrain

Pour gérer mon digicode, je vais devoir utiliser deux registres, un pour mémoriser le code entré par l’utilisateur, et un second pour signaler si le code a été validé ou pas. Pour ça je vais utiliser R14 et R15.
En règle général je réserve les registres du bas (R0, R1 etc...) aux opérations courants et temporaire, et les registres du haut (R15, R14 etc..) aux informations permanentes devant être conservées durant toute la lecture du DVD. Ici il faut aussi prendre en considération le fait que ce projet va être intégré à un projet déjà existant. Il ne faut donc pas utiliser des registres déjà utilisés dans ce projet. Sachez par exemple que DVD Studio Pro utilise déjà les registres R0 à R7.

Pour profiter d’une fonctionnalité de myDVDEdit depuis la version 1.0, je vais renommer le registre R15 en passCode. Cela aura deux avantages, je n’aurai plus besoin de me souvenir quel est le numéro du registre, et je ne risquerai plus de le réutiliser pas erreur dans le reste du projet.

Sélectionnez le menu Fichier / Propriétés du projet, puis cliquez sur l’icône Registres. Dans la colonne Nom double-cliquez sur R15 pour entrer le nom passCode. Voilà, votre registre est renommé.

Deuxième modification, nous allons temporairement passer en affichage hexadécimal. J’en vois déjà qui paniquent. Mais non, n’ayez pas peur, vous verrez, c’est très simple.

Sélectionnez le menu myDVDEdit / Préférences, puis cliquez sur l’icône Commandes. Dans la partie Valeurs numériques sélectionnez hexa.

Mais pourquoi donc passer en hexadécimal. Simplement parce que en décimal, je n’ai droit qu’à 10 chiffres par unité (de 0 à 9). Or là j’ai 12 touches. En passant en hexadécimal je vais pouvoir coder jusqu’à 16 chiffres par unité (de 0 à 9, puis A, B, C, D, E et F). Dans un cas on est en base 10, dans l’autre en base 16.

Pour mieux me faire comprendre, prenons un exemple: Je veux que la combinaison de mon digicode soit 1234. Si je veux la faire tenir dans un registre en base 10, pas de problème, j’écris R0 = 1234. Maintenant, si je veux que ma combinaison soit 53A8, là en base 10, je vais avoir un peu plus de mal, mais en base 16 par contre aucun problème puisque j’ai 16 chiffres par unité à ma disposition. Il me suffit donc d’écrire R0 = 0x53A8.
Le 0x est utilisé pour préciser à l’éditeur que l’on donne un chiffre en hexadécimal. Vous pouvez utiliser aussi le caractère $. R0 = $53A8.
OK. Maintenant si votre affichage se fait en décimal, vous allez voir s’afficher comme commande R0 = 21416, ce qui est la correspondance en décimal de la valeur 0x53A8. Pas très clair! Voilà pourquoi nous passons, temporairement, l’affichage en hexadécimal.

Note : Par défaut, les valeurs supérieures à 255 sont automatiquement affichées en hexadécimal, mais dans ce tutoriel, je vais également devoir manipuler des nombres plus petits.

Les opérations binaires

Je vais faire une formation rapide sur les nombres binaires, l’hexadécimal et les opérations logiques qui nous seront utiles dans la suite du tutoriel. Si vous connaissez déjà tout ça, passez au chapitre suivant.

Un lecteur DVD, comme un ordinateur et tout ce qui fonctionne a base de microprocesseur, fonctionne en binaire. Ça signifie qu’il ne connaît que deux valeurs possibles, le 0 et le 1. Pour représenter cette valeur, on utilise le terme de bit.

Avec un bit on ne peut donc avoir que deux valeurs possibles, 0 ou 1. Si l’on utilise 2 bits, on peut avoir 4 combinaisons de bits possibles : 00, 01, 10 et 11. Avec 3 bits ont peut avoir 8 combinaisons possibles : 000, 001, 010, 011, 100, 101, 110, 111. A chaque fois que l’on ajoute un bit, on multiplie par deux le nombre de combinaisons.
Cette constatation simple permet de définir que le nombre de combinaisons est égale à 2 à la puissance du nombre de bits, ou 2n.

Note : c’est une règle vraie quelle que soit la base utilisée. En base 10, ou décimale, qui est celle que nous utilisons tout les jours, avec n chiffres nous pouvons écrire 10n nombres (n’oubliez pas le 0). En base 16 ou hexadécimal, avec n chiffres, nous pouvons écrire 16n nombres.

Pour lire des nombres en binaire avec beaucoup de bits, ce n’est pas simple. Pour simplifier un peu, on regroupe les bits par 4. Avec 4 bits on peut écrire 16 valeurs possibles. Et revoilà nos valeurs hexadécimales. On a donc le tableau de conversion suivant :

0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F

Si on prend les 16 bits suivantes : 1001101001000111
En les regroupant par 4, cela donne : 1001 1010 0100 0111
Puis en utilisant le nombre hexadécimal correspondant à chaque groupe, on obtient 9A47
Ce qui est un peu plus facile a lire que les 16 bits de départ.

Pour éviter de confondre les nombres décimaux et hexadécimaux, on va utiliser la syntaxe du langage C en ajoutant 0x devant les nombres hexadécimaux.

le nombre s’écrit alors 0x9A47

 

Opération binaire ET (ou AND)

Le ET logique est une opération très simple faite entre deux bits. Elle consiste à dire que le résultat vaut 1 si les deux bits sont à 1, et vaut 0 dans le cas contraire.

on l’écrit x = a & b. (x est à 1 si a ET b sont à 1).

On peut représenté ça aussi sous forme de tableau avec toutes les valeurs possibles :

a b x
0 0 0
0 1 0
1 0 0
1 1 1

Quand nous effectuons un ET entre deux nombres de 16 bits, nous effectuons un ET entre chaque bit de même position des deux nombres.

Maintenant remarquons ce qui se passe lorsque nous utilisons les chiffres 0 et F dans une opération ET entre deux nombre hexadécimaux.
Prenons par exemple le nombre 0x9A47 et effectuons un ET avec 0x0FFF, que ce passe t'il ?

0x9A47 s’écrit 1001 1010 0100 0111 en binaire.
0x0FFF s’écrit 0000 1111 1111 1111 en binaire.
Un ET entre les deux donne 0000 1010 0100 0111
Soit en hexadécimal 0x0A47.

On se rend compte que l’opération ET nous a permis d’effacer le premier chiffre qui ne nous intéressait pas tout en conservant les autres. C’est un opération très courante en informatique.

 

Opération binaire OU (ou OR)

Le OU logique est tout aussi simple. Le résultat est à 1 si le premier ou le second bit est à 1, et à 0 dans le cas contraire.

on l’écrit x = a | b. (x est à 1 si a OU b est à 1).

On peut représenté ça aussi sous forme de tableau avec toutes les valeurs possibles :

a b x
0 0 0
0 1 1
1 0 1
1 1 1

Quand nous effectuons un OU entre deux nombres de 16 bits, nous effectuons un OU entre chaque bit de même position des deux nombres.

Par exemple 0x45A2 | 0x1938 = ?
0x45A2 s’écrit 0100 0101 1010 0010
0x1938 s’écrit 0001 1001 0011 1000
Un OU donne 0101 1101 1011 1010
Ce qui s’écrit en hexadécimal : 0x5DBA

 

Les décalages de bits

Une autre opération classique en informatique est le décalage de bits, c’est à dire le déplacement vers la gauche ou vers la droite des bits d’un nombre. Malheureusement cette opération n’existe pas dans les commandes DVD. Pour pallier ce problème on va se servir d’une autre opération, la multiplication.
En effet, de la même manière que lorsque l’on multiplie un nombre décimal par 10, on décale tous ses chiffres et on ajoute un 0, en multipliant un nombre binaire par 2, on décale tous ses bits et on ajoute un bit à 0. Si vous multipliez ce même chiffre quatre fois de suite par 2 (donc en le multipliant par 16), vous ajoutez quatre bits 0 à ce nombre. Et quatre bits à zéro forment le chiffre hexadécimal 0.

0x0A2B * 16 = 0xA2B0

Bon, finie la théorie, passons maintenant à la pratique.

 

Les Pré-commandes

Nous allons ajouter des pré-commandes à notre menu.
Nous voulons modifier les registres R15, pardon passCode, et R14 pour leur donner une valeur initiale.

Les commandes sont :

passCode = 0x53A8
R14 = 0

Si plus tard vous voulez modifier le code d’accès à votre DVD, il vous suffira de modifier la valeur initiale de passCode.

Sélectionner VTS Menu 1 - Pgc 1 puis sélectionnez l’onglet Pré-cmds

Ajoutez une nouvelle commande. Pour cela trois façons de faire, à vous de choisir votre préférée.

  • En cliquant sur le bouton + placé sous l’éditeur de commande.
  • En effectuant un clic droit avec la souris (ou ctrl clic) sur l’éditeur de commande, puis sur le menu Ajouter une commande.
  • En appuyant sur la touche + de votre clavier (l’éditeur de commande doit être sélectionné).

Modifiez maintenant la nouvelle commande en cliquant sur le triangle.
Type : Set Register
Registre : passCode = Direct 0x53A8

Recommencez la même opération avec la commande
R14 = 0.
Nous verrons plus tard à quoi sert R14.

 

Configuration des boutons

Nous allons maintenant modifier les commandes des boutons. Le but est de faire correspondre un bouton et la valeur numérique de la touche du digicode. Il y a plusieurs façons de procéder, ma préférée consiste à modifier le contenu d’un registre directement dans le bouton.

Sélectionnez VTS Menu 1 - Pgc 1 puis sélectionnez l’onglet Boutons. Cliquez maintenant sur le bouton Editer.

Commençons par le bouton 1.
Cliquez sur le petit triangle à gauche de la commande.
puis entrez la commande :
type : Set register
Registre : R0 = direct 1
Link TailPgc
Bouton sélectionné : Aucun

Passez au bouton 2 et faites la même chose en entrant la valeur 2.
Pour le bouton 10, la valeur sera 0 (puisque c’est la touche 0 du digicode).
Pour le bouton 11 entrez la valeur 0xA.
Pour le bouton 12 entrez la valeur 0xB.

Cette commande modifie le contenu du registre R0 en lui donnant la valeur de la touche correspondante du digicode. Puis elle effectue un Link TailPgc, qui demande au lecteur de DVD d’exécuter les Post-commandes.

Cliquez sur le bouton OK pour enregistrer toutes le modifications.

 

Les post-commandes

C’est ici qu’est programmé le mécanisme de vérification du code. Pour cela, seulement 5 commandes suffisent :

1 - R14 &= 0x0FFF
2 - R14 *= 0x0010
3 - R14 |= R0
4 - if(R14 != passCode) Link Cell 1
5 - Jump VTSTitle 1

 

R14 &= 0x0FFF
Type : Set Registrer, Registre R14 &= Direct 0x0FFF

Cette commande est équivalente à R14 = R14 & 0x0FFF

Celle-là m'à donné quelques soucis. Elle n’est théoriquement pas nécessaire mais un bug dans Lecteur DVD fait que les registres ne sont pas gérés sur 16 bits comme cela devrait être le cas dans un vrai lecteur de DVD, mais sur 32 bits. Lorsque l’on multiplie la valeur 0x1234 par 16, si le registre fait 16 bits, cela devrait donner 0x2340, mais avec Lecteur DVD, ça fait 0x12340.
Pour pallier ce problème, cette commande efface le chiffre de gauche du registre R14 en faisant une opération ET binaire.

 

R14 *= 0x0010
Type : Set Register, Registre R14 *= Direct 0x10

Cette commande est équivalente à R14 = R14 * 0x0010

J’effectue un décalage à gauche de mon nombre hexadécimal en le multipliant par 16 (oui, 16 s’écrit 0x0010 en hexadécimal).

 

R14 |= R0
Type : Set Register, Registre R14 |= R0

Cette commande est équivalente à R14 = R14 | R0

Après le décalage, on remplace le dernier chiffre par le contenu de R0 grâce à un OU logique. J’aurais très bien pu utiliser l’addition puisque le dernier chiffre de R14 est toujours un 0 et que R0 est un nombre à un seul chiffre. Déformation professionnelle sans doute.

 

if(R14 != passCode) link Cell 1
Type : Link, cocher if, R14 != passCode, LinkCell, Cell : 1

Je teste le registre R14 pour voir s'il est différent du registre passCode. Si c’est le cas, le lecteur effectue un branchement à la Cell 1, sinon le lecteur exécute l’instruction suivante.

Contrairement à Link Pgc 1, la commande Link Cell 1 évite l'exécution des Pré-commandes.

 

Jump VTSTitle 1
Type : Jump/Call, Jump VTSTitle, VTSTitle : 1

Affichage de Titre 1.

Options interdites

Pour que, lorsque le digicode est affiché, l’utilisateur ne puisse pas utiliser des moyens détournés pour accéder au DVD, il est important de lui interdire l’utilisation des différents boutons de sa télécommande. Le bouton Titre par exemple pourrait lui permettre d’aller directement à un titre sans avoir à rentrer le code d’accès.

Pour çà nous allons modifier les Options interdites.

Sélectionnez le domaine VTS Menu 1, puis l’onglet PGC 1 / Options interdites.

Les cases cochées correspondent aux actions interdites à l’utilisateur. Les options peuvent êtres enregistrées soit au niveau du PGC (donc dans le fichier IFO), soit au niveau de la Cell (donc dans le fichier VOB).

Sélectionnez toutes les options PGC pour interdire toutes les actions sauf :

  • Stop, on ne va tout de même pas interdire d’arrêter la lecture du disque.
  • Reprendre.
  • Sélection/Activation, qui permet de sélectionner et d’activer les boutons. Sans cela les boutons ne fonctionneraient plus.

 

Faisons un petit test

Basculez le sélecteur en mode Débug (ou R). Vous devez être positionné sur First Play/Pré-commandes, la commande étant un Jump VMG Menu title.
Appuyez sur le bouton Continuer (G) pour exécuter les commandes en continu. Le débugueur s’arrête sur l’affichage du digicode.
Sélectionnez l’onglet des registres, puis exécutez plusieurs boutons.

Pour exécuter un bouton, plusieurs possibilités:

  • Double-cliquez sur le bouton désiré.
  • Au clavier, sélectionnez votre bouton à l’aide des flêches puis appuyez sur la touche return.
  • A la souris, sélectionnez votre bouton en cliquant sur les flêches de la télécommande, puis cliquez sur Enter.

A chaque exécution, vous verrez R0 prendre la valeur du bouton sélectionné, la valeur de R14 être décalée vers la gauche et son chiffre des unités prendre la valeur du bouton.
Si vous exécutez consécutivement les touches 5, 3, A et 8, R14 prendra alors la valeur 0x53A8 et sera identique au registre 15 : passCode. Le lecteur affichera alors le texte ‘Granted’ (autorisé). Si vous exécutez le menu Continuer (G), le débugueur continu et boucle en retournant au menu.

Notre code fonctionne bien.

 

Intégration dans un autre projet DVD

Nous allons maintenant intégrer notre digicode dans un projet DVD existant.

Vous pouvez fermer le projet actuel.

Je vous propose de récupérer le DVD ci-dessous appelé Countdown. c’est un petit projet tout simple avec juste un menu et une animation exécutée lorsque l’utilisateur clique sur le bouton OK.

En passant, vous pourrez noter comment est géré un mécanisme très couramment utilisé dans les DVD, le point de boucle.
Dans First Play, le registre R7 est initialisé à 0. puis dans VTS Menu 1, R7 est testé, s’il vaut 0, il est passé à 1 et Cell 1 est affiché, sinon c’est Cell 2 qui est affiché.
A la fin de Cell 2, la Commande Cell Link TopCell provoque le retour au début de Cell 2, et ceci jusqu’à ce que l’utilisateur appuie sur le bouton Enter de sa télécommande.
Cell 1 qui est l’introduction du menu ne contient aucun bouton et ne sera joué qu’une seule fois. Le premier objet de Cell 2 est notre point de boucle.

Le projet Countdown n’est donné ici qu’à titre d’exemple. Vous pouvez bien évidement en utiliser un autre.

 

Importation

Pour importer notre digicode dans le projet, exécutez le menu Fichier/Importer un VTS. Une boite de dialogue s’ouvre vous invitant à sélectionner le fichier à importer. Parcourez le disque jusqu’au dossier VIDEO_TS de AccessKeypadPAL (ou de AccessKeypadNTSC si votre projet est en NTSC), sélectionnez VTS_01_0.IFO puis cliquez sur Choisir.

Les fichiers sont copiés et les domaines VTS Menu 2 et VTS 2 sont apparu dans le projet.

Renommez, comme expliqué précédemment, le registre R15 en accessCode. Ce n’est pas obligatoire (mais moi j’aime bien !)

Dans First Play, remplacez la commande Jump VMG Menu Title par Jump VTS Menu 2, Menu Root. Si vous utilisez un autre projet de départ, remplacez ‘2’ par le numéro correct du VTS importé.

Et voilà!



© Copyright 2017 Jérôme Cabanis
Tous droits réservés

Forum Index -> Documentation/Tutorials