Формы запроса
или учим мышку спрашивать...

Введение

Формы представляют собой инструмент для формирования запросов, подлежащих автоматической обработке. Запрос выглядит как сообщение, в теле которого находятся строго определенные поля, содержащие строковые переменные.

Запросы исходят от пользователя, оснащенного программой The Bat! с установленными шаблонами форм (файлами с расширением TBC, описывающими свойства формы). Такой пользователь называется клиентом. Перед тем, как сделать запрос, программа "The Bat!" предлагает клиенту заполнить форму подобную тем, которые вам наверняка приходилось заполнять на вебе. Программа обработки запросов клиента, называется сервером. Данные, занесенные клиентом, The Bat! автоматически преобразует в сообщение со строго определенными полями, при необходимости подпишет цифровой подписью и/или зашифрует, и отправит по электронной почте на сервер (e-mail адрес сервера уже есть в шаблоне формы). Система взаимодействия клиента и сервера посредством запросов и ответов называется The Bat! клиент-сервер. Один цикл запрос-ответ в системе клиент-сервер называется трансакцией.

Система клиент-сервер предназначена для удаленного доступа к информации и управления ей в режиме off-line, выдерживая требования безопасности. Область применения системы: управление банковскими счетами, бронирование авиабилетов, резервирование гостиничных номеров и т.д. Для безопасности трансакций на транспортном уровне используется шифрование и электронная подпись (алгоритмы RSA/IDEA/MD5), соответствующие RFC-1991. Серверная программа зависит от специфики запроса; банк, Интернет-магазин или агентство по бронированию авиабилетов используют разные серверные программы; клиент же, с помощью "The Bat!", может обращаться к услугам всех трех организаций одновременно.

Формат полей запроса строго согласован между сервером и клиентом. Один сервер обычно обслуживает более одного клиента, поэтому шаблон формы (TBC-файл) создается на сервере, подписывается электронной подписью и передается клиентам перед началом проведения трансакций определенного типа. По мере проведения трансакций, сервер может предоставлять новые виды услуг, для этого ему необходимо разослать клиентам новые версии шаблонов, позволяющие обращаться к этим услугам. Получив шаблон формы, и проверив соответствие электронной подписи, клиент добавляет его в свой список.

Наличие электронной подписи является обязательным атрибутом шаблона. Это способствует обеспечению согласованности форматов полей запроса и помогает защитить систему клиент-сервер от проникновения несанкционированных шаблонов форм. Такое проникновение может происходить под видом обновления шаблонов у всех клиентов и может привести к внедрению фальшивых форм на все или часть клиентов. Несанкционированные внедрения подобного рода могут служить как причиной простоя открытых сетей, так и причиной утечки информации из них. Такая утечка может являться следствием замена адреса сервера в шаблоне формы.

Формат шаблона формы

Шаблоны форм хранятся в текстовом файле с расширением TBC. Содержимое файлов подписано цифровой подписью. TBC-файлы создаются на сервере, подписываются электронной подписью и передаются клиентам перед началом проведения трансакций определенного типа. Получив TBC-файл, содержащий шаблон формы, и проверив соответствие электронной подписи, клиент добавляет его в свой список (меню Свойства/Шаблоны форм запросов).

Шаблон описывает свойства окна экранной формы, которую заполняет клиент, атрибуты сообщения, в котором будет отправлен запрос, и переменные запроса. Каждая строка шаблона содержит одно ключевое слово, за которым следуют один или несколько параметров. Если строка начинается с символа ';', то такая строка рассматривается как комментарий.

Свойства окна и атрибуты сообщения

Ключевое слово MSG предназначено для описания свойств окна и атрибутов сообщения, остальные ключевые слова используются для "набивки" формы. Ключевое слово MSG может иметь следующие параметры: FORMTITLE (заголовок окна форму запроса, строковое значение); FORMWIDTH (ширина окна; числовое значение); FORMHEIGHT(высота окна; числовое значение); AREAWIDTH (ширина области ввода внутри окна; числовое значение); AREAHEIGHT (высота области ввода внутри окна); TO (e-mail адрес сервера для отправки сообщения; строковое значение);SUBJ (Поле Subject сообщения; строковое значение); PRIORITY (поле Priority сообщения; строковое значение); ENCRYPT (зашифровать сообщение перед отправкой; логическое значение: ON или OFF); SIGN (подписать сообщение перед отправкой; ON или OFF).

Содержимое запроса Данные, занесенные пользователем в поля экранной формы, представляют собой содержимое запроса. Как только пользователь нажал OK, The Bat! помещает содержимое запроса в тело сообщения, и, если это указано в шаблоне, подпишет сообщение цифровой подписью и/или зашифрует, после чего отправит его по электронной почте на сервер (e-mail адрес сервера тоже указан в шаблоне). Тело сообщения выглядит как одна строка неограниченной длинны, содержащая строковые переменные. Переменные отделяются друг от друга символом "&". Имена переменных описаны в шаблоне, значения переменных берутся из полей экранной формы, заполненной клиентом. В строке запроса, передаваемой серверу в теле сообщения, имя переменной отделяется от ее значения символом "=". Предположим, запрос содержит две переменные с именами servicetype и accountnumber; переменная servicetype содержит значение "getaccountlog"; а переменная accountnumber - значение "849780094", в этом случае телом сообщения будет являться следующая строка:
servicetype=getaccountlog&accountnumber=849780094

Такой способ формирования строки запроса является совместимым с RFC1866 (раздел 8.2.1, тип application/x-www-form-urlencoded)

Имена и значения переменных могут содержать любые символы, но определенные символы должны заменяться по следующим правилам: пробельный символ заменяется на символ '+', все остальные символы, кроме цифр и букв, заменяются на "%HH" (символ "процент" и две шестнадцатеричные цифры, представляющие ASCII-код заменяемого символа).

Обзор элементов формы

Экранная форма может содержать такие графические элементы, как строки ввода, списки, переключатели, метки и кнопки. Все эти элементы описываются в шаблоне с помощью ключевых слов: EDIT (однострочное окно ввода), MEMO (многострочное окно ввода), CHECKBOX (переключатель), LISTBOX (список заранее определенных строк, одна или несколько из которых могут быть выбранными), COMBOBOX (выпадающий список строк). Кроме того, имеется специальная "невидимый" элемент HIDDEN (пользователь не может изменить значение переменной, образуемой этим элементом), а также видимый элемент LABEL, который не образует переменной и используется как метка, текст которой выводится на экране. Для управления формой имеются элементы SUBMIT (кнопка, при нажатии которой происходит отправка формы) и CANCEL (кнопка отмены).

Обзор параметров элементов

Графические элементы могут иметь следующие параметры: X, Y (координаты верхнего левого угла элемента в пределах окна; координаты увеличиваются сверху вниз, слева направо), WIDTH, HEIGHT (ширина/высота элемента; у всех элементов ширина и/или высота либо задана по умолчанию, либо вычисляется в зависимости от размеров шрифта, поэтому эти два параметра могут быть опущены), NAME, VALUE (имя переменной и значение переменной по умолчанию; для всех элементов кроме LABEL, SUBMIT и CANCEL). Кроме того, элемент EDIT может иметь параметр MASK (форматированный ввод), элементы LISTBOX и COMBOBOX - параметр ITEM (элемент списка), а элементы LABEL, CHECKBOX, SUBMIT и CANCEL - параметр CAPTION (надпись). Для элемента LABEL допустимы параметры FOCUSNAME (имя элемента, к которому привязан LABEL; при щелчке мышки в области элемента LABEL или нажатии горячей клавиши, курсор, или фокус ввода, будет перенесен на элемент, к которому привязан LABEL); JUSTIFY (выравнивание текста по центру или левому/правому краю); SHOWACCEL (использовать ли символ "&" как маркер горячей клавиши).

Перечень элементов

EDITОднострочное окно ввода. Обязательные параметры: X, Y, NAME; допустимые параметры: WIDTH, HEIGHT, VALUE, MASK.
MEMOМногострочное окно ввода. Обязательные параметры: X, Y, NAME; допустимые параметры: WIDTH, HEIGHT, VALUE.
CHECKBOXПереключатель. Обязательные параметры: X, Y, NAME; допустимые параметры: WIDTH, HEIGHT, VALUE.
LISTBOXСписок заранее определенных строк, одна или несколько из которых могут быть выбранными. Обязательные параметры: X, Y, NAME; допустимые параметры: ITEM, WIDTH, HEIGHT.
COMBOBOXВыпадающий список строк. Обязательные параметры: X, Y, NAME; допустимые параметры: ITEM, WIDTH, HEIGHT.
HIDDEN"Невидимый" элемент, образующий переменную. Обязательные параметры: NAME, VALUE.
LABELМетка. Обязательные параметры: X, Y, CAPTION, допустимые параметры:, WIDTH, HEIGHT, FOCUSNAME, JUSTIFY, SHOWACCEL.
SUBMITКнопка, при нажатии которой происходит отправка формы. Обязательные параметры: X, Y, допустимые параметры:, WIDTH, HEIGHT, CAPTION.
CANCELКнопка отмены. Обязательные параметры: X, Y, допустимые параметры:, WIDTH, HEIGHT, CAPTION.

Перечень параметров элементов

XГоризонтальная координата левого края элемента в пределах окна; координаты увеличиваются слева направо. Является обязательным параметром для всех видимых элементов: EDIT, MEMO, CHECKBOX, LISTBOX, COMBOBOX, LABEL, SUBMIT, CANCEL, то есть во всех, кроме HIDDEN. Числовое значение.
YВертикальная координата верхнего края элемента в пределах окна; координаты увеличиваются сверху вниз. Является обязательным параметром для всех видимых элементов: EDIT, MEMO, CHECKBOX, LISTBOX, COMBOBOX, LABEL, SUBMIT, CANCEL, то есть во всех, кроме HIDDEN. Числовое значение.
WIDTHШирина элемента. Ширина всех видимых элементов уже задана по умолчанию, поэтому этот параметр может быть опущен. Применяется во всех видимых элементах: EDIT, MEMO, CHECKBOX, LISTBOX, COMBOBOX, LABEL, SUBMIT, CANCEL, то есть во всех, кроме HIDDEN. Числовое значение.
HEIGHTВысота элемента. Высота многострочных видимых элементов (LISTBOX, MEMO) уже задана по умолчанию. Высота однострочных элементов (EDIT, LABEL, CHECKBOX) вычисляется в соответствии с размером шрифта. Применяется во всех видимых элементах: EDIT, MEMO, CHECKBOX, LISTBOX, COMBOBOX, LABEL, SUBMIT, CANCEL, то есть во всех, кроме HIDDEN. Числовое значение.
NAMEИмя переменной. Является обязательным параметром для всех элементов, которые формируют переменные: EDIT, MEMO, CHECKBOX, LISTBOX, COMBOBOX. Строковое значение.
VALUEЗначение переменной по умолчанию. Является обязательным параметром для элемента HIDDEN, применяется также в EDIT, MEMO и CHECKBOX. Строковое значение.
CAPTIONНадпись. Является обязательным параметром для элементов LABEL и CHECKBOX, применяется также в SUBMIT и CANCEL. Строковое значение.
FOCUSNAMEИмя элемента, который необходимо сфокусировать. Может использоваться только как параметр ключевого слова LABEL. Значением параметра является имя элемента, к которому будет привязан LABEL; при щелчке мышки в области элемента LABEL или нажатии горячей клавиши, курсор, или фокус ввода, будет перенесен на элемент, имя которого указано в качестве значения. Строковое значение.
JUSTIFYВыравнивание текста надписи. Может использоваться только как параметр ключевого слова LABEL. Допустимые значения: LEFT (выравнивать по левому краю), RIGHT (выравнивать по правому краю), CENTER (выравнивать по центру).
SHOWACCELИспользовать ли символ "&" как маркер горячей клавиши. Может использоваться только как параметр ключевого слова LABEL. Допустимые значения - ON или OFF.
ITEMИспользуется для добавления нового элемента в список: LISTBOX, COMBOBOX или CHECKLISTBOX. Формат параметра - две (LISTBOX/COMBOBOX) или три (CHECKLISTBOX) строки, разделенные запятыми. Первая содержит название нового элемента, вторая - его заголовок, а третья (только для CHECKLISTBOX) управляет положением переключателя - включен (любое значение) или выключен (пустая строка).
WORDWRAPПозволяет использовать перенос длинных строк текста, чтобы они умещались на экране. Логическое значение. ON - включить перенос по правой границе данного элемента. OFF - выстраивать в одну строчку (не поместившийся участок текста не отображается).
PASSWORDПоле для ввода пароля. Если указано значение ON, EDIT отображает специальный символ "звездочку" вместо любой введенной вами буквы.
COLUMNSКоличество колонок в списке, которые видны без помощи горизонтальной прокрутки. Необязательный параметр для элементов LISTBOX и CHECKLISTBOX. Числовое значение. По умолчанию COLUMNS=0 При этом используется одна колонка и если количество элементов не умещается на экране, пользователь может воспользоваться вертикальной прокруткой списка. Если увеличить значение этого параметра, программа будет переносить не поместившиеся элементы в начало новой колонки (ширина каждой колонки зависит от их общего количества, а также от значения параметра WIDTH).
DEFTPLШаблон для параметра VALUE. Используется в элементах EDIT, MEMO и HIDDEN. Поддерживает стандартный набор макросов, однако вместо знака процента (%) перед каждым названием необходимо ставить символ '#'. Пример: DEFTPL="#FOLDERFROMNAME" в элементе EDIT назначает параметру VALUE значение из поля "FROM", которое указано в свойствах активной папки на закладке "Личность".
VBODYREРезультат работы регулярного выражения (область поиска - текст выделенного письма). Работает аналогично параметру DEFTPL, только в качестве значения необходимо указать не шаблон, а регулярное выражение. Пример: VBODYRE="^UserFullName: (.+)$".
VFILEREРезультат работы регулярного выражения (область поиска - текстовый файл, для выбора которого программа откроет стандартное диалоговое окно Windows).

Посимвольная проверка при помощи параметра MASK

Параметр MASK позволяет заранее указать формат, в котором пользователю позволено вводить необходимые данные (к примеру, ограничить набор допустимых для ввода символов). Проверка осуществляется последовательно - символ за символом. При этом не следует ставить в начале маски амперсант (&), так как в результате программа считает ее содержимое ключевым словом (о них мы расскажем немного позже).

Маска состоит из трех частей, разделенных точкой с запятой. Первая часть, это ее текст. Вторая указывает на то, следует ли расценивать алфавитные символы маски как часть введенных данных. Третья содержит специальный символ для отметки участков текста, которые можно редактировать.

Специальные символы для первой части маски

СимволОписание
!Заменить необязательные символы в тексте на предшествующие пробелы
<Преобразовать все последующие буквы (вплоть до символа '&' или до конца маски) в прописные (верхний регистр)
>Преобразовать все последующие буквы (вплоть до символа '<' или до конца маски) в строчные (нижний регистр)
<>Отменить проверку регистра символов и не изменять введенные пользователем данные
\Отобразить следующий символ без изменений, даже если он является специальным (одним из перечисленных в этом списке)
LПотребовать обязательный алфавитный символ на этой позиции
lРазрешить необязательный алфавитный символ на этой позиции
AПотребовать обязательный алфавитно-цифровой символ на этой позиции
aРазрешить необязательный алфавитно-цифровой символ на этой позиции
CПотребовать обязательный любой символ на этой позиции
cРазрешить необязательный любой символ на этой позиции
0Потребовать обязательный цифровой символ на этой позиции
9Разрешить необязательный цифровой символ на этой позиции
#Разрешить необязательный цифровой символ (либо знак + или -) на этой позиции
:Заменить этот символ на стандартный разделитель часов, минут и секунд, который используется для отображения времени в вашей операционной системе
/Заменить этот символ на стандартный разделитель месяца, дня и года, который используется для отображения даты в вашей операционной системе
;Разделитель трех частей, из которых состоит маска
_Добавить в текст маски соответствующее количество пробелов

Все остальные символы будут показаны без изменений (программа введет их автоматически и не позволит редактировать). Чтобы отобразить аналогичным образом любой специальный символ из приведенной выше таблицы, необходимо поставить перед ним обратную косую черту (\).

Дополнительные возможности параметра MASK

Если в начале маски поставить символ "&", программа будет считать ее содержимое (вплоть до знака равенства =) одним из ключевых слов, перечисленных ниже:
URLИнформацию необходимо представить в виде сетевой ссылки
EMAILИнформацию необходимо представить в виде адреса электронной почты
DATAСодержимое элемента, параметром которого является MASK. Помогает осуществить проверку указанных пользователем данных.
Пример: EDIT NAME=UserPassword MASK="&DATA=UserPasswordAgain=Вы ошиблись при вводе пароля".
Программа посимвольно сравнивает содержимое своего элемента EDIT (NAME=UserPassword) со следующим (NAME=UserPasswordAgain). Если строки не совпадают, появляется окно с надписью "Вы ошиблись при вводе пароля"
REGEXФормат определяется результатом работы регулярного выражения.
Пример: MASK="®EX=^[a-fA-F0-9]{8}$".
Пользователь должен ввести восемь алфавитно-цифровых символов
MANDATORYЭлемент формы является обязательным для заполнения. Если пользователь его проигнорирует, программа выдаст сообщение об ошибке

Пример TBC-файла

Ниже приведено содержимое типичного TBC-файла, который используется для получения сводки курсов валют за определенный период времени. Экранная форма содержит выпадающий список для выбора наименования валюты (COMBOBOX), а также поля для ввода начальной и конечной даты (EDIT).
-----BEGIN PGP SIGNED MESSAGE-----

MSG FORMTITLE="Currency Rate Request"
MSG TO="Client-Bank "
MSG SUBJ="Client-Bank"
MSG PRIORITY="High"
MSG FORMWIDTH=260
MSG FORMHEIGHT=190
MSG ENCRYPT=ON
MSG SIGN=ON

HIDDEN NAME="service" VALUE="getcurrencytrend"
LABEL CAPTION="&Currency"  X=16 Y=8 FOCUSNAME="iso"
COMBOBOX NAME="iso"   X=16 Y=24 WIDTH=120

COMBOBOX NAME="iso"   ITEM="MDL","Moldavian Leu"
COMBOBOX NAME="iso"   ITEM="USD","US Dollar"
COMBOBOX NAME="iso"   ITEM="RUR","Russian Rouble"
COMBOBOX NAME="iso"   ITEM="UAH","Ukrainean Hr."
COMBOBOX NAME="iso"   ITEM="FIM","Finnish Mark"
COMBOBOX NAME="iso"   ITEM="DEM","Deutche Mark"
COMBOBOX NAME="iso"   ITEM="GBP","GB Pound"

LABEL CAPTION="&Starting Date" X=154 Y=8 FOCUSNAME="date1"
EDIT NAME="date1"              X=154 Y=24
EDIT NAME="date1"              MASK="00/00/0000" VALUE="01011996"
LABEL CAPTION="&Ending Date"   X=154 Y=52 FOCUSNAME="date2"
EDIT NAME="date2"              X=154 Y=68
EDIT NAME="date2"              MASK="00/00/0000" VALUE="01011999"

SUBMIT CAPTION="OK"            X=60 Y=112
CANCEL CAPTION="Cancel"        X=154 Y=112

-----BEGIN PGP SIGNATURE-----
iQDVAwUANfjoiRQeqwtQAYtzAQHkIQX+JhO61HCBfVw5VF3KqQhpApmOPhk2gEKz
C7qkNwpx7lexjbZvTVNGNfxTk7cTx5AxSFiUV32JH9WPm9fuJ5/bXIfWojDnaYbi
OM/BqS2KykFyoiuy+KULji10oRTt1jdC0Yqyv+OMgo2RuMwI0QhUozpHlVvkEHkk
r3acZ3NVIjBZHdW0I4YCjA3FKxBQmoFsQg9/ndjeE2lHZTCtLK2Kue036PeSCJq1
JWwVgWwT0JfhfFMXjj5tZm7pspNaGLst
=FBRX
-----END PGP SIGNATURE-----

Когда клиент нажмет на кнопку с надписью "OK", The Bat! сгенерирует строку запроса: service=getcurrencytrend&iso=USD&date1=01011996&date2=01011999

Экранная форма, описанная приведенным TBC-файлом, выглядит следующим образом:

Так как значения параметров ENCRYPT и SIGN ключевого слова MSG установлены в "ON", программа подпишет и зашифрует эту строку перед отправкой на сервер. Тело письма будет выглядеть примерно так:

-----BEGIN PGP MESSAGE-----
hMwDFB6rC1ABi3MBBgBuPwdXPA/obgJJ/fcjDSqO7oh820EHlKpA5mzbYSwg/qWg
wYvNO/iJq4mofSfUnwozK3S5dD4zSeNcEqzQzw3ZZpE5D8aLOlNRAKlRh2ZIfN4W
6pmLJrhcX/GvsH667YUfL97r8LCWbaBtYI8D85ZluPSNGzt8AIgjIEZLKaAcq6yD
eYpO5GpxvvDvT8Vb80QnUZW5kTX9MGFg+gtUGqcb3f3dibyewWZfjndhkjj4Br4I
QLQ5v0mjx76lqxhbi5qmAAABM3PfOx1lpLE7VkHCTuQSPsm09a69rjQqgKimOPxj
hcH8wKXAi2FYDQ8wY8iszRZ9IeDHJtqOsdr0vUltT0Mj0jGvWi1Jb/jFOZ0jW/2J
k1uFMo5Dy/gaGQjjCIZvRT2dWy7CQ67vnegTi2zsvMAPM6/Bz7qTA6lsMMY88E9p
4qDlcN6OZIlY8DGaExcIDpoZwPChgIQfA55VQyNfN5YKzfBxCmtqSWbbLFh7WnkR
8FBLi9E8rPGg2jmzfAn1CczYnlfXinHtuAKmxmt3m3bOyNv5SGmMz+9WWhWIBH8Q
XIBXrfH2yDDldKwkyj0tsjeXs6LFS7D/kMCdBNM1FClWw1EftTBbdwL0ykDX9Z6f
NS6fQxYJxGrfAMp7hSaGydrenSKEviAy5o6HyjBxoCqQLGKdsWQ=
=wflO
-----END PGP MESSAGE-----
Получив письмо, сервер его расшифрует, проверить подлинность подписи, обработает строку запроса и отправит текущий курс валют обратно пользователю.

Если добавить в шаблон эти строчки:

MSG TPL="Услуга : $service$"
MSG TPL="Валюта : $iso$"
MSG TPL="Начальная дата : $date1$"
MSG TPL="Конечная дата : $date2$"

...то программа сформирует читабельный запрос и расшифрованное тело письма будет выглядеть так:

Услуга : getcurrencytrend
Валюта : MDL
Начальная дата : 01.01.1996
Конечная дата : 01.01.1999

Если добавить в шаблон эти строчки:

MSG NFO="Письмо содержит запрос о текущем курсе валют и предназначено для"
MSG NFO="отправки в банк. Текст зашифрован при помощи OpenPGP, чтобы"
MSG NFO="обеспечить сохранность передаваемых данных. Если вы находитесь в"
MSG NFO="сети Internet, нажмите комбинацию клавиш или"
MSG NFO="воспользуйтесь пунктом главного меню программы "Ящик | Отправить"
MSG NFO="почту"."

... то тело письма перед отправкой будет выглядеть так:

Письмо содержит запрос о текущем курсе валют и предназначено для
отправки в банк. Текст зашифрован при помощи OpenPGP, чтобы
обеспечить сохранность передаваемых данных. Если вы находитесь в
сети Internet, нажмите комбинацию клавиш <Shift+F2> или
воспользуйтесь пунктом главного меню программы "Ящик | Отправить
почту".
-----BEGIN PGP MESSAGE-----
hMwDFB6rC1ABi3MBBgBuPwdXPA/obgJJ/fcjDSqO7oh820EHlKpA5mzbYSwg/qWg
wYvNO/iJq4mofSfUnwozK3S5dD4zSeNcEqzQzw3ZZpE5D8aLOlNRAKlRh2ZIfN4W
6pmLJrhcX/GvsH667YUfL97r8LCWbaBtYI8D85ZluPSNGzt8AIgjIEZLKaAcq6yD
eYpO5GpxvvDvT8Vb80QnUZW5kTX9MGFg+gtUGqcb3f3dibyewWZfjndhkjj4Br4I
QLQ5v0mjx76lqxhbi5qmAAABM3PfOx1lpLE7VkHCTuQSPsm09a69rjQqgKimOPxj
hcH8wKXAi2FYDQ8wY8iszRZ9IeDHJtqOsdr0vUltT0Mj0jGvWi1Jb/jFOZ0jW/2J
k1uFMo5Dy/gaGQjjCIZvRT2dWy7CQ67vnegTi2zsvMAPM6/Bz7qTA6lsMMY88E9p
4qDlcN6OZIlY8DGaExcIDpoZwPChgIQfA55VQyNfN5YKzfBxCmtqSWbbLFh7WnkR
8FBLi9E8rPGg2jmzfAn1CczYnlfXinHtuAKmxmt3m3bOyNv5SGmMz+9WWhWIBH8Q
XIBXrfH2yDDldKwkyj0tsjeXs6LFS7D/kMCdBNM1FClWw1EftTBbdwL0ykDX9Z6f
NS6fQxYJxGrfAMp7hSaGydrenSKEviAy5o6HyjBxoCqQLGKdsWQ=
=wflO
-----END PGP MESSAGE-----

Copyright © 1995-2001 RITLABS. All rights reserved.