TXT AddressBook
1. Introduction
     Many addressbook softwares already exist on the Web. You might have tried many and never felt satisfy. They don't display or print out what you wish. They don't record the fields you want. You can't not export their format into another format document. You can not use them on any Operative System, but only on MS Windows, or on Linux, or on Macintosh.
     So you want to manage your own addressbook as you feel and as you want. You want no limit. You want to add as many fields as you wish.You want to export your addressbook in any format. You want to extract some fields, print out the fields you want with the presentation you imagined. Yes you can do all that. But you need to program it. And no, it's not difficult ... Let's go !

2. The TXT format file
     If you use to classify your files, your documents, your addresses, your mails and so on, you may know that the easiest and smartest way to do is to use the TXT format. This format has many advantages. It can be read by any OS on any computer. It's usually displayed in regular fonts such as Courier, so that you can easily vertically align the data since every caracter or space takes the same room.
     You can format your TXT file as you wish, the following file is just an example of formatting. I call the empty format file 000.txt and the other data files xxx.adr (adr for address and xxx for the number). To keep an alphabetic order, I should insert each new file within the existing files by shifting the excedent files. That can be done with a little script that I'll give here later. If a field is empty, the line can be erased from the file.

--------------------------------------------------------------------------------------------------------
Categorie:     Famille/Scolaire/Amis/International/Internet/Information/Secours/Commerce/Businesss
Societe:
Particule:
Nom:
Nom de JF:
Prenom:
Surnom:
Position:

Tel:
Fax:
MailTo:
Icq:
Urls:
Type:          Domicile Parental/Domicile Actuel/Bureau
Adresse:
Code Postal:
Ville:
Region:
Pays:
Anniversaire:
Mails:         /home/sylvain/internet/emails/mailsrecus/.txt
Commentaires:


3. The Research Script
     Now we start the programming. For the example, I'll program it into bash (the Linux shell language) but we can of course extend it to any stream language on Macintosh or MS Windows. What we need is to read the set of ADR files and extract the valuable information. The first use is to write a script which allow the user to find something in the set of files. Here is the script. If you have any question, please send an email. I remind you that you should set the executable rights to execute this file (chmod +x trouve) and then call it with "source ./trouve". You may also create a shortcut command to call the script function from anywhere.

#!/bin/sh

clear

echo "--------------------------------------------------------------------------------------------------------"
echo "|                                          Carnet d'adresses                                           |"
echo "--------------------------------------------------------------------------------------------------------"
echo " Rubriques:"
echo
echo " Categorie      Societe        Particule      Nom            Nom de JF      Prenom         Surnom"
echo " Position       Tel            MailTo         Icq            Urls           Type           Adresse"
echo " Code Postal    Ville          Region         Pays           Anniversaire   Mails          Commentaires"
echo
echo " Categorie: Famille / Scolaire / Amis / International / Internet / Information / Secours / Commerce / Business"
echo " Type:      Domicile Parental / Domicile Actuel / Bureau"
echo "--------------------------------------------------------------------------------------------------------"
echo
echo " Entrez l'expression reguliere a rechercher :                    ( . = 1 caractere qcq, * = repetition )"
echo "                                                       (ex: personnes nees en janvier = anniv.*/01/....)"
echo -n " --> "
read MOTIF
echo
grep -i -l $MOTIF /home/sylvain/gestion/lists/adresses/*.adr > /home/sylvain/gestion/lists/adresses/trouve.liste
echo "--------------------------------------------------------------------------------------------------------"
cat /home/sylvain/gestion/lists/adresses/trouve.liste
xargs -n1 cat < /home/sylvain/gestion/lists/adresses/trouve.liste
echo "--------------------------------------------------------------------------------------------------------"
echo -n "Nombre de fichiers trouves : "
cat /home/sylvain/gestion/lists/adresses/trouve.liste | wc -l
echo "--------------------------------------------------------------------------------------------------------"
rm /home/sylvain/gestion/lists/adresses/trouve.liste

4. Export to KMail email list
     Well, those of you who use Linux system may know Thunderbird. It's a software which allows you read and write your email offline, and send and get them from any POP/SMTP server. Other well-known softwares on Windows are MS Outlook (aahhhhh!!!) and Eudora (ha! :). This is the bash script which do this export.

#!/bin/sh
echo
echo "     Creation du fichier, patientez SVP ..."
REP="/home/sylvain/gestion/lists/adresses"
grep -l "MailTo:        " $REP/*.adr > $REP/emails.liste
(xargs -n1 -exec grep -l "Nom:           \|Prenom:        " ) < $REP/emails.liste > $REP/noms.liste
diff $REP/emails.liste $REP/noms.liste > $REP/surnoms.liste
grep $REP $REP/surnoms.liste > $REP/surnoms2.liste
rm -f $REP/surnoms.liste
cat $REP/surnoms2.liste | sed -e "s/< //" > $REP/surnoms.liste
rm -f $REP/surnoms2.liste
rm -f $REP/emails.liste
(xargs -n1 -exec grep "Nom:           \|Prenom:        \|MailTo:        " ) < $REP/noms.liste > $REP/noms2.liste
mv -f $REP/noms2.liste $REP/noms.liste
(xargs -n1 -exec grep "Surnom:        \|MailTo:        " ) < $REP/surnoms.liste > $REP/surnoms2.liste
mv -f $REP/surnoms2.liste $REP/surnoms.liste
cat $REP/noms.liste | sed -e "s/Nom:           \(.*\)/\"\1/" > $REP/noms2.liste
mv -f $REP/noms2.liste $REP/noms.liste
cat $REP/noms.liste | sed -e "s/Prenom:        \(.*\)/ \1\"/" > $REP/noms2.liste
mv -f $REP/noms2.liste $REP/noms.liste
cat $REP/noms.liste | sed -e "s/MailTo:        \(.*\)/ <\1>/" > $REP/noms2.liste
mv -f $REP/noms2.liste $REP/noms.liste
for i in 0 1 2 3 4 5 6 7 8 9
do
cat $REP/noms.liste | sed -e "s/ <\(.*\)  .*>/ <\1>/" > $REP/noms2.liste
mv -f $REP/noms2.liste $REP/noms.liste
done
cat $REP/surnoms.liste | sed -e "s/Surnom:        \(.*\)/\"\1\"/" > $REP/surnoms2.liste
mv -f $REP/surnoms2.liste $REP/surnoms.liste
cat $REP/surnoms.liste | sed -e "s/MailTo:        \(.*\)/ <\1>/" > $REP/surnoms2.liste
mv -f $REP/surnoms2.liste $REP/surnoms.liste
for i in 0 1 2 3 4 5 6 7 8 9
do
cat $REP/surnoms.liste | sed -e "s/ <\(.*\)  .*>/ <\1>/" > $REP/surnoms2.liste
mv -f $REP/surnoms2.liste $REP/surnoms.liste
done
cat $REP/surnoms.liste > $REP/kmail.liste
cat $REP/noms.liste >> $REP/kmail.liste
rm -f $REP/noms.liste
rm -f $REP/surnoms.liste
echo "     ... Fichier cree"
echo
echo "     Penser a faire un 'sort' sur le fichier kmail.liste genere apres"
echo "     l'avoir remis en forme, et a rajouter en entete le commentaire :"
echo "     # kmail addressbook file"
echo "     Fichier de destination: ~/.kde/share/apps/kmail/addressbook"
echo

As you can see, it's just stream analysis, and you can set as many filters as you want to get exactly the information you need !

5. Export the phone list to LaTeX for PDF printing
     Ok, now you know how to find an information, how to export it to another format. But we also want to print it out. Here, we will only print out the phone repertory. We need to 1) extract the information (phone numbers and associated names) and to 2) set this list into the built-in LaTeX file, then we just have to 3) compile it and print the PDF file !

#!/bin/sh

echo
echo "     Creation du fichier, patientez SVP ..."
REP="/home/sylvain/gestion/lists/adresses"

################################################
# Creation du fichier phones.liste contenant
# les noms des fichiers ADR contenant un ou
# plusieurs numeros de telephone
################################################

grep -l "Tel:           " $REP/*.adr > $REP/phones.liste

################################################
# Creation des fichiers noms.liste et
# surnoms.liste contenant les noms des fichiers
# ADR contenant un ou plusieurs numeros de
# telephone (Nom ou Prenom, sinon Surnom ou
# Societe)
################################################

(xargs -n1 -exec grep -l "Nom:           \|Prenom:        " ) < $REP/phones.liste > $REP/noms.liste
diff $REP/phones.liste $REP/noms.liste > $REP/surnoms.liste
grep $REP $REP/surnoms.liste > $REP/surnoms2.liste
rm -f $REP/surnoms.liste
cat $REP/surnoms2.liste | sed -e "s/< //" > $REP/surnoms.liste
rm -f $REP/surnoms2.liste
rm -f $REP/phones.liste

################################################
# Creation des fichiers noms.liste et
# surnoms.liste contenant les lignes utiles des
# fichiers ADR contenant un ou plusieurs numeros
# de telephone (Nom, Prenom, Surnom, Societe)
################################################

(xargs -n1 -exec grep "Nom:           \|Prenom:        \|Tel:           " ) < $REP/noms.liste > $REP/noms2.liste
mv -f $REP/noms2.liste $REP/noms.liste
(xargs -n1 -exec grep "Societe:       \|Surnom:        \|Tel:           " ) < $REP/surnoms.liste > $REP/surnoms2.liste
mv -f $REP/surnoms2.liste $REP/surnoms.liste
cat $REP/noms.liste | sed -e "s/Nom:           \(.*\)/\1/" > $REP/noms2.liste
mv -f $REP/noms2.liste $REP/noms.liste
cat $REP/noms.liste | sed -e "s/Prenom:        \(.*\)/\1/" > $REP/noms2.liste
mv -f $REP/noms2.liste $REP/noms.liste
cat $REP/noms.liste | sed -e "s/Tel:           \(.*\)/\& \1 \\\\\\\\ /" > $REP/noms2.liste
mv -f $REP/noms2.liste $REP/noms.liste
cat $REP/surnoms.liste | sed -e "s/Societe:       \(.*\)/\1/" > $REP/surnoms2.liste
mv -f $REP/surnoms2.liste $REP/surnoms.liste
cat $REP/surnoms.liste | sed -e "s/Surnom:        \(.*\)/\1/" > $REP/surnoms2.liste
mv -f $REP/surnoms2.liste $REP/surnoms.liste
cat $REP/surnoms.liste | sed -e "s/Tel:           \(.*\)/\& \1 \\\\\\\\ /" > $REP/surnoms2.liste
mv -f $REP/surnoms2.liste $REP/surnoms.liste

################################################
# Creation d'un fichier phones.liste contenant
# le futur fichier LATEX
################################################

echo "% POUR FAIRE UN SAUT DE PAGE, INSERER LA LIGNE: \sautdepage" > $REP/phones.liste
echo  >> $REP/phones.liste
echo "\documentclass[a4paper]{report}" >> $REP/phones.liste
echo "\usepackage[a4paper,left=1cm,right=1cm,top=1cm,head=2cm,headsep=0cm,nofoot,bottom=1cm]{geometry}" >> $REP/phones.liste
echo "\usepackage[french]{babel}" >> $REP/phones.liste
echo "\begin{document}" >> $REP/phones.liste
echo "\pagestyle{empty}" >> $REP/phones.liste
echo "\newcommand\entete{\hline \textit{NOMS} & \textit{TELEPHONES} \\\ }" >> $REP/phones.liste
echo "\newcommand\sautdepage{\hline \end{tabular} \newpage \begin{tabular}{|l|l|} \entete \hline}" >> $REP/phones.liste
echo "\begin{center}" >> $REP/phones.liste
echo "\fboxrule 1pt" >> $REP/phones.liste
echo "\fboxsep 10pt" >> $REP/phones.liste
echo "\framebox[350pt][c]{" >> $REP/phones.liste
echo "\begin{tabular}{c}" >> $REP/phones.liste
echo "\bfseries" >> $REP/phones.liste
echo "\Large" >> $REP/phones.liste
echo "R\'epertoire t\'el\'ephonique" >> $REP/phones.liste
echo "\mdseries" >> $REP/phones.liste
echo "\normalsize" >> $REP/phones.liste
echo "\end{tabular}" >> $REP/phones.liste
echo "}" >> $REP/phones.liste
echo "\end{center}" >> $REP/phones.liste
echo "\vspace{10pt}" >> $REP/phones.liste

################################################
# Ajout des fichiers noms.liste et surnoms.liste
# dans le fichier LATEX
################################################

echo "\begin{tabular}{|l|l|}" >> $REP/phones.liste
echo "\entete" >> $REP/phones.liste
echo "\hline" >> $REP/phones.liste
cat $REP/surnoms.liste >> $REP/phones.liste
cat $REP/noms.liste >> $REP/phones.liste
echo "\hline" >> $REP/phones.liste
echo "\end{tabular}" >> $REP/phones.liste

echo "\end{document}" >> $REP/phones.liste

rm -f $REP/noms.liste
rm -f $REP/surnoms.liste

################################################
# Filtrage des accents dans le fichier LATEX
################################################

for i in 0 1 2 3 4 5 6 7 8 9
do
cat $REP/phones.liste | sed -e "s/é/\\\'e/" > $REP/phones2.liste
mv -f $REP/phones2.liste $REP/phones.liste
cat $REP/phones.liste | sed -e "s/è/\\\\\`e/" > $REP/phones2.liste
mv -f $REP/phones2.liste $REP/phones.liste
cat $REP/phones.liste | sed -e "s/ê/\\\^e/" > $REP/phones2.liste
mv -f $REP/phones2.liste $REP/phones.liste
cat $REP/phones.liste | sed -e "s/à/\\\\\`a/" > $REP/phones2.liste
mv -f $REP/phones2.liste $REP/phones.liste
cat $REP/phones.liste | sed -e "s/ù/\\\\\`u/" > $REP/phones2.liste
mv -f $REP/phones2.liste $REP/phones.liste
cat $REP/phones.liste | sed -e "s/â/\\\^a/" > $REP/phones2.liste
mv -f $REP/phones2.liste $REP/phones.liste
cat $REP/phones.liste | sed -e "s/ç/\\\c{c}/" > $REP/phones2.liste
mv -f $REP/phones2.liste $REP/phones.liste
done

mv -f phones.liste annuaire.tex
echo "     ... Fichier 'annuaire.tex' cree"
echo

6. Export your AddressBook to LaTeX for PDF printing
     Now, let's do the same for the full contents of your addressbook !

#!/bin/sh

echo
echo "     Creation du fichier, patientez SVP ..."
REP="/home/sylvain/gestion/lists/adresses"

################################################
# Creation du fichier all.liste contenant
# tous les noms des fichiers ADR
################################################

more $REP/*.adr > $REP/all.liste

################################################
# Creation du fichier contents.liste contenant
# toutes les informations des fichiers ADR
################################################

more $REP/all.liste | grep -v ":::::::" | grep -v "/home/sylvain/gestion/" | grep -v "/home/sylvain/internet/" \
                | grep -v "Commentaires:" | grep -v "Mails:" > $REP/contents.liste
rm -f $REP/all.liste

################################################
# Creation du fichier contents.liste contenant
# les lignes utiles des fichiers ADR
################################################

cat $REP/contents.liste | sed -e "s/Categorie:     \(.*\)/\\\textbf{Categorie :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Societe:       \(.*\)/\\\textbf{Societe :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Particule:     \(.*\)/\\\textbf{Particule :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Nom:           \(.*\)/\\\textbf{Nom :} \& \\\textbf{\1}\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Nom de JF:     \(.*\)/\\\textbf{Nom de JF :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Prenom:        \(.*\)/\\\textbf{Prenom :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Surnom:        \(.*\)/\\\textbf{Surnom :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Position:      \(.*\)/\\\textbf{Position :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Tel:           \(.*\)/\\\textbf{Tel :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Fax:           \(.*\)/\\\textbf{Fax :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/MailTo:        \(.*\)/\\\textbf{MailTo :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Icq:           \(.*\)/\\\textbf{Icq :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Urls:          \(.*\)/\\\textbf{Urls :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Type:          \(.*\)/\\\textbf{Type :} \& \\\textit{\1}\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Adresse:       \(.*\)/\\\textbf{Adresse :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Code Postal:   \(.*\)/\\\textbf{Code Postal :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Ville:         \(.*\)/\\\textbf{Ville :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Region:        \(.*\)/\\\textbf{Region :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Pays:          \(.*\)/\\\textbf{Pays :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/Anniversaire:  \(.*\)/\\\textbf{Anniversaire :} \& \1\\\\\\\\/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
cat $REP/contents.liste | sed -e "s/\-\-\-\-\-\-\-\-\-\-\(.*\)/\\\hline/" > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste
more $REP/contents.liste | grep -v "               " > $REP/contents2.liste
mv -f $REP/contents2.liste $REP/contents.liste

################################################
# Creation d'un fichier all.liste contenant
# le futur fichier LATEX
################################################

echo "% POUR AJOUTER DES SAUTS DE PAGE, INSERER LA LIGNE: \sautdepage (Sinon Overflood lors de la compilation)" > $REP/all.liste
echo  >> $REP/all.liste
echo "\documentclass[a4paper]{report}" >> $REP/all.liste
echo "\usepackage[a4paper,left=1cm,right=1cm,top=1cm,head=2cm,headsep=0cm,nofoot,bottom=1cm]{geometry}" >> $REP/all.liste
echo "\usepackage[french]{babel}" >> $REP/all.liste
echo "\begin{document}" >> $REP/all.liste
echo "\pagestyle{empty}" >> $REP/all.liste
echo "\newcommand\sautdepage{\hline \end{tabular} \newpage \begin{tabular}{|ll|} \hline}" >> $REP/all.liste
echo "\begin{center}" >> $REP/all.liste
echo "\fboxrule 1pt" >> $REP/all.liste
echo "\fboxsep 10pt" >> $REP/all.liste
echo "\framebox[350pt][c]{" >> $REP/all.liste
echo "\begin{tabular}{c}" >> $REP/all.liste
echo "\bfseries" >> $REP/all.liste
echo "\Large" >> $REP/all.liste
echo "R\'epertoire d'adresses" >> $REP/all.liste
echo "\mdseries" >> $REP/all.liste
echo "\normalsize" >> $REP/all.liste
echo "\end{tabular}" >> $REP/all.liste
echo "}" >> $REP/all.liste
echo "\end{center}" >> $REP/all.liste
echo "\vspace{10pt}" >> $REP/all.liste
echo "\centering" >> $REP/all.liste

################################################
# Ajout du fichier contents.liste
# dans le fichier LATEX
################################################

echo "\begin{tabular}{|ll|}" >> $REP/all.liste
cat $REP/contents.liste >> $REP/all.liste
echo "\hline" >> $REP/all.liste
echo "\end{tabular}" >> $REP/all.liste

echo "\end{document}" >> $REP/all.liste

rm -f $REP/contents.liste

################################################
# Filtrage des accents dans le fichier LATEX
################################################

for i in 0 1 2 3 4 5 6 7 8 9
do
cat $REP/all.liste | sed -e "s/à/\\\\\`a/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
cat $REP/all.liste | sed -e "s/â/\\\^a/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
cat $REP/all.liste | sed -e "s/é/\\\'e/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
cat $REP/all.liste | sed -e "s/è/\\\\\`e/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
cat $REP/all.liste | sed -e "s/ê/\\\^e/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
cat $REP/all.liste | sed -e "s/î/\\\^i/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
cat $REP/all.liste | sed -e "s/ô/\\\^o/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
cat $REP/all.liste | sed -e "s/ù/\\\\\`u/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
cat $REP/all.liste | sed -e "s/û/\\\^u/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
cat $REP/all.liste | sed -e "s/ç/\\\c{c}/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
cat $REP/all.liste | sed -e "s/_/\\\äää/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
cat $REP/all.liste | sed -e "s/#/\\\ëëë/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
done

for i in 0 1 2 3 4 5 6 7 8 9
do
cat $REP/all.liste | sed -e "s/äää/_/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
cat $REP/all.liste | sed -e "s/ëëë/#/" > $REP/all2.liste
mv -f $REP/all2.liste $REP/all.liste
done

mv -f all.liste annuaire.tex
echo "     ... Fichier 'annuaire.tex' cree"
echo


Well ? Difficult ? :)
You just need to know a few command (cat, mv, sed, grep) and that's all folks !
This way is easy, portable and fast. Of course it's not a beautiful environment. But what you need is efficiency, right ?
 [Menu]
Last Update
10/12/2018
32719 visitors
850589 robots
since 01/01/2003
Page generated
in 0.51 second
💗 2003-2018 by S. MARLIERE. Copying is an act of love. Love is not subject to law. Please copy and share.