Библиотека Yet Another GetKey for REXX

Разборки с функцией SysGetKey (см. Особенности реализации SysGetKey() в REXX/Object REXX под OS/2) закономерно завершились разработкой собственной библиотеки внешних функций Yet Another GetKey for REXX. Подробности ниже.
---
000
Русский.


English.

001
Yet Another GetKey v0.07 для REXX.


Yet Another GetKey v0.07 for REXX.

002
Оглавление.

1. Введение
2. Установка, использование и удаление
3. Функции
3.1. yaGetKey
3.2. yaGetKeyDrop
3.3. yaGetKeyLoad
3.4. yaGetKeyVer
3.5. Пример
4. Замечания
5. Об авторах
6. Заявление об авторских правах


Contents.

1. Introduction
2. How Install, Use and Remove
3. Functions
3.1. yaGetKey
3.2. yaGetKeyDrop
3.3. yaGetKeyLoad
3.4. yaGetKeyVer
3.5. Example
4. Some Notes
5. About Authors
6. Full Copyright Statement

<<<
003
1. Введение.

Библиотека Yet Another GetKey для REXX предоставляет дополнительную функцию yaGetKey, работающую аналогично функции SysGetKey из стандартной библиотеки RexxUtil. В отличие от SysGetKey, двухбайтовые сканкоды, порождаемые нажатиями некоторых клавиш, функция yaGetKey сразу возвращает в виде двухбайтовых строк.


1. Introduction.

The "Yet Another GetKey for REXX" library provides the additional yaGetKey function. It operates similar to the SysGetKey function from standard RexxUtil library. But the yaGetKey function returns a scan-code as the double-byte string if a keystroke generates the double-byte scancode.
004
Потребность в новой функции возникла потому, что SysGetKey, считывая данные о нажатии клавиш из буфера клавиатуры, возвращает их для дальнейшей обработки в виде одиночных байтов. Двухбайтовые сканкоды, формируемые после нажатия функциональных клавиш, клавиш расширенной функциональности и некоторых комбинаций клавиш, тоже возвращаются побайтно, что требует повторного вызова SysGetKey после получения первого байта сканкода. Признаком начала сканкода считается получение байта с шестнадцатиричным значением "00"x или "E0"x.


This function is necessary because the SysGetKey function returns the keystroke data from the keyboard buffer as single bytes. Double-byte scancodes are returned byte-by-byte, too. In this case hexadecimal "00"x or "E0"x values identify the first byte of the double-byte scancode. The second byte will be returned by the repeated function call.

005
Такое решение серьёзно ограничивает использование существующей реализации SysGetKey для языков ввода, использующих кириллицу, для греческого и некоторых других языков, поскольку один из символов алфавита этих языков кодируется шестнадцатиричным значением "E0"x в соответствии с применяемой кодовой страницей. Например, для русского языка - это строчная буква кириллицы "р" в кодовой странице CP866, для болгарского - прописная буква кириллицы "Я" в кодовой странице CP855, для греческого - маленькая греческая буква "зета" в кодовой странице CP869 и так далее. Поэтому, получив от SysGetKey байт со значением "E0"x, невозможно понять требуется ли повторный вызов функции, потому что полученный байт может оказаться как отдельным символом национального алфавита, так и первым байтом сканкода.


But some languages use the code pages in which one of the letters of the alphabet is coded as "E0"x value, too. For example, it is CYRILLIC SMALL LETTER ER in Russian (CP866), CYRILLIC CAPITAL LETTER YA in Bulgarian (CP855), GREEK SMALL LETTER ZETA in Greek (CP869) and another. In this case if the SysGetKey function returns "E0"x value you can not identify it as the character of the national alphabet or as the first byte of the double-byte scancode.

006
Дополнительно функция yaGetKey позволяет проверить состояние переключателей Caps Lock, Num Lock, Scroll Lock и Insert во время нажатия клавиши, а также какие управляющие клавиши (Alt, Ctrl, Shift) были использованы в комбинации с нажатой клавишей.


Additionally the yaGetKey function allows you to check the Caps Lock, Num Lock, Scroll Lock and Insert status and the use of Alt, Ctrl and Shift keys.

<<<
007
2. Установка, использование и удаление.

Дистрибутивный пакет Yet Another GetKey для REXX представляет собой архивный файл с именем yaGetKeyNNN.zip, где NNN - номер версии.


2. How Install, Use and Remove.

The Yet Another GetKey for REXX distribution package is the archive file named yaGetKeyNNN.zip, where NNN is the version number.

008
Установка
  1. разархивируйте дистрибутивный архивный файл в какой-нибудь вновь созданный или существующий пустой временный каталог, например, в x:\yaGetKey

How install
  1. unzip the archive file to any new or existing empty temporary directory, i.e. x:\yaGetKey
009
  1. скопируйте следующие файлы из каталога x:\yaGetKey\BIN:

  1. copy the following files from x:\yaGetKey\BIN directory:
010
  • yaGetKey.dll - в один из каталогов, перечисленных в операторе LIBPATH файла CONFIG.SYS, например, c:\OS2\APPS\DLL. Именно в эта библиотека реализует функции API.

  • yaGetKey.dll - to a directory listed in your LIBPATH statement in your CONFIG.SYS file, i.e. c:\OS2\APPS\DLL. This dynamic link library contains the set of the yaGetKey API functions for REXX,
011
  • yaGetKey.inf - в один из каталогов, перечисленных в переменной окружения BOOKSHELF (см. оператор SET BOOKSHELF в файле CONFIG.SYS), например, c:\OS2\BOOK. Просмотреть эту документацию можно, например, с помощью команды VIEW.

  • yaGetKey.inf - to a directory listed in your BOOKSHELF environment variable (see SET BOOKSHELF= statement in your CONFIG.SYS file), i.e. c:\OS2\BOOK. Use OS/2 VIEW command for viewing of this file,
012
  • Sample.cmd - в любой собственный рабочий каталог, например, x:\MyApps. Это приложение демонстрирует работу всех функций библиотеки.

  • Sample.cmd - to any work directory, i.e. x:\MyApps.
013
  1. запустите сессию командной строки OS/2 и проверьте работоспобность библиотеки, выполнив приложение Sample.cmd из указанного собственного рабочего каталога. Примерные результаты выполнения приложения приведены в разделе 3.5. Пример.

  1. start Sample.cmd from this work directory in the OS/2 comand line session and check the results (see 3.5. Example),
014
  1. если вы не планируете самостоятельно модифицировать и пересобирать пакет, то временный каталог с содержимым дистрибутивного файла можно удалить, иначе следует обратиться к разделу 4. Замечания.

  1. if you do not plan to modify the package then clean or remove the used temporary directory else see 4. Some notes.
015
Использование функций
  1. добавьте в начало своего приложения REXX вызов функций, обеспечивающих регистрацию функций библиотеки, например, так:

How use
  1. add the following function calls at the beginning of your application for the registration:
       call RxFuncAdd 'yaGetKeyLoad','yaGetKey','yaGetKeyLoad'
       call yaGetKeyLoad
016
  1. после регистрации все функции библиотеки будут доступны для использования в приложении

  1. all functions will be available to use after the registration
017
  1. сбросить регистрацию функций библиотеки можно, выполнив перед завершением работы приложения вызов функции yaGetKeyDrop, например, так:
     call yaGetKeyDrop
    

  1. add the following function call at the end of your application for the registration drop:
     call yaGetKeyDrop
    
018
Удаление
  1. завершите со сбросом регистрации функций работу всех приложений, использующих библиотеку Yet Another GetKey,

How remove
  1. close all applications that use the Yet Another GetKey library (use the yaGetKeyDrop call for the registration drop),
019
  1. закройте все сессии командной строки OS/2, в которых выполнялись эти приложения,

  1. exit all CMD.EXE shells,
020
  1. удалите файлы yaGetKey.dll и yaGetKey.inf из соответствующих каталогов.

  1. remove yaGetKey.dll and yaGetKey.inf files from used directories.
<<<
021
3. Функции.


3. Functions.

<<<
022
3.1. yaGetKey

Считывает и возвращает информацию о нажатой клавише из буфера клавиатуры. Если буфер клавиатуры пуст, то ожидает нажатия клавиши. Время ожидания нажатия клавиши можно ограничить указанием интервала. В отличие от SysGetKey не требует повторного вызова для получения сканкода.


3.1. yaGetKey

Reads and returns the keystroke data from the keyboard buffer. If the keyboard buffer is empty, yaGetKey waits until a key is pressed. Wait time can be restricted. Unlike the SysGetKey function, yaGetKey does not require a repeated call for reading the second byte of the scancode.

023
Синтаксис

 >---yaGetKey(-+--------------+-)---><
               |              |
               +-time-+-------+
                      |       |
                      +-,stem-+

Syntax

 >---yaGetKey(-+--------------+-)---><
               |              |
               +-time-+-------+
                      |       |
                      +-,stem-+
024
Параметры
time
(необязательный) неотрицательное целое число (до 9 значащих цифр).

Parameters
time
(optional) the non-negative integer number (max 9 digits).
025
Время ожидания нажатия клавиши в секундах. Значение 0 (по умолчанию) задаёт неограниченное время ожидания.

The parameter defines a wait time of a keystroke (in seconds). Default 0 value sets unlimited wait time.
026
stem
(необязательный) строка, содержащая правильное корневое имя кортежа (завершающая точка может быть опущена).

stem
(optional) the string containing a correct stem name (may be without the final dot).
027
Если параметр stem задан, то дополнительная информация о нажатой клавише помещается в элемент кортежа со следующим составным именем:


If the stem is specified, the function stores the additional information about the keystroke in the stem:

028
stem.0SCANCODE
(строка длиной 1 байт) сканкод. Для функциональных клавиш, клавиш расширенной функциональности и комбинаций клавиш это значение соответствует второму байту двухбайтового сканкода

stem.0SCANCODE
(single byte string) scancode. This value is equivalent to the second byte of the double-byte scancode (for function keys or extended function keys or some key shortcuts)
029
или, если время ожидания нажатия клавиши ограничено, то

or if the wait time is restricted
030
(строка нулевой длины) пустая строка, если возврат из функции произошёл по истечению заданного интервала времени или изменилось состояние переключателей в этом интервале времени.

(zero length string) empty string, if the timeout expired or the switches status changed.
031
Функция также заполняет указанный кортеж информацией о состоянии переключателей в момент нажатия и об использованных в комбинации управляющих клавишах, присваивая значение 0 или 1 элементам кортежа со следующими составными именами:


Also the function stores the information about additional environment of the keystroke assigning 0 or 1 value to stem elements named as:

032
stem.0SYSREQ_DOWN
клавиша SysReq нажата (1) или отжата (0),

stem.0SYSREQ_DOWN
SysReq key is down (1) or up (0),
033
stem.0CAPS_LOCK_DOWN
клавиша Caps Lock нажата (1) или отжата (0),

stem.0CAPS_LOCK_DOWN
Caps Lock key is down (1) or up (0),
034
stem.0NUM_LOCK_DOWN
клавиша Num Lock нажата (1) или отжата (0),

stem.0NUM_LOCK_DOWN
Num Lock key is down (1) or up (0),
035
stem.0SCROLL_LOCK_DOWN
клавиша Scroll Lock нажата (1) или отжата (0),

stem.0SCROLL_LOCK_DOWN
Scroll Lock key is down (1) or up (0),
036
stem.0RIGHT_ALT_DOWN
правая клавиша Alt нажата (1) или отжата (0),

stem.0RIGHT_ALT_DOWN
Right Alt key is down (1) or up (0),
037
stem.0RIGHT_CTRL_DOWN
правая клавиша Ctrl нажата (1) или отжата (0),

stem.0RIGHT_CTRL_DOWN
Right Ctrl key is down (1) or up (0),
038
stem.0LEFT_ALT_DOWN
левая клавиша Alt нажата (1) или отжата (0),

stem.0LEFT_ALT_DOWN
Left Alt key is down (1) or up (0),
039
stem.0LEFT_CTRL_DOWN
левая клавиша Ctrl нажата (1) или отжата (0),

stem.0LEFT_CTRL_DOWN
Left Ctrl key is down (1) or up (0),
040
stem.0INSERT_ON
режим вставки включен (1) или выключен (0),

stem.0INSERT_ON
Insert status is ON (1) or OFF (0),
041
stem.0CAPS_LOCK_ON
режим Caps Lock включен (1) или выключен (0),

stem.0CAPS_LOCK_ON
Caps Lock status is ON (1) or OFF (0),
042
stem.0NUM_LOCK_ON
режим Num Lock включен (1) или выключен (0),

stem.0NUM_LOCK_ON
Num Lock status is ON (1) or OFF (0),
043
stem.0SCROLL_LOCK_ON
режим Scroll Lock включен (1) или выключен (0),

stem.0SCROLL_LOCK_ON
Scroll Lock status is ON (1) or OFF (0),
044
stem.0EITHER_ALT_DOWN
нажатые клавиши Alt есть (1) или нет (0),

stem.0EITHER_ALT_DOWN
either Alt key is down (1) or both keys are up (0),
045
stem.0EITHER_CTRL_DOWN
нажатые клавиши Ctrl есть (1) или нет (0),

stem.0EITHER_CTRL_DOWN
either Ctrl key is down (1) or both keys are up (0),
046
stem.0LEFT_SHIFT_DOWN
левая клавиша Shift нажата (1) или отжата (0),

stem.0LEFT_SHIFT_DOWN
Left Shift key is down (1) or up (0),
047
stem.0RIGHT_SHIFT_DOWN
правая клавиша Shift нажата (1) или отжата (0).

stem.0RIGHT_SHIFT_DOWN
Right Shift key is down (1) or up (0),
048
При возникновении ошибки значения элементов кортежа не изменяются.


The stem does not change if an error occured.

049
Возвращаемое значение

Тип и размерность возвращаемого значения зависит от обрабатываемого события:


Return Value

The type and length of the return value depends on the keyboard events:

050
символ
(строка длиной 1 байт) нажата одна из символьных клавиш.
Возвращаемый символ соответствует нажатой клавише (или комбинации клавиш) в выбранной раскладке клавиатуры для текущей кодовой страницы.

character
(single byte string) а character key is pressed.
The returned character corresponds to the pressed key (or key shortcut) in the selected keyboard layout for the current code page.
051
сканкод
(строка длиной 2 байта) нажата функциональная клавиша, клавиша расширенной функциональности или комбинация клавиш.

scancode
(double-byte string) a function key or extended function key or key shortcut is pressed.
052
пустая строка
(строка нулевой длины) произошла ошибка при обращении к буферу клавиатуры, истекло время ожидания нажатия клавиши или изменилось состояние переключателей в указанном интервале времени.

empty string
(zero length string) an error occured, wait time expired or the switches status changed.
053
Обработка ошибок

Специальная переменная KBDERRNO может принимать одно из следующих значений:


Errors

The function stores the following values in the REXX special variable, KBDERRNO:

054
""
(пустая строка) ошибок нет

""
(empty string) no error
055
"ERROR_KBD_FOCUS_REQUIRED"
клавиатура не в фокусе приложения

"ERROR_KBD_FOCUS_REQUIRED"
the focus required
056
"ERROR_KBD_KEYBOARD_BUSY"
клавиатура занята

"ERROR_KBD_KEYBOARD_BUSY"
the keyboard is busy
057
"ERROR_KBD_DETACHED"
клавиатура отключена

"ERROR_KBD_DETACHED"
the keyboard detached
058
"ERROR_KBD_CODE_NNN"
возникла ошибка с номером NNN

"ERROR_KBD_CODE_NNN"
where NNN is error number
059
Ограничения применения связаны с особенностями реализации и описываются в разделе 4. Замечания.


In details restrictions are described in the section 4. Some notes.

<<<
060
3.2. yaGetKeyDrop

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


3.2. yaGetKeyDrop

Drops registration of the library function set. All functions will become unavailable for the current session.

061
Синтаксис

 >---yaGetKeyDrop()---><

Syntax

 >---yaGetKeyDrop()---><
062
Параметры

Отсутствуют.


Parameters

None.

063
Возвращаемое значение

Пустая строка.


Return Value

Empty string.

064
Обработка ошибок

Значение специальной переменной KBDERRNO не изменяется.


Errors

The value of the KBDERRNO special variable does not change.

<<<
065
3.3. yaGetKeyLoad

Регистрирует все функции библиотеки, что делает их доступными для использования в текущей сессии.


3.3. yaGetKeyLoad

Registers the library function set. All functions will become available for the current session.

066
Синтаксис

 >---yaGetKeyLoad()---><

Syntax

 >---yaGetKeyLoad()---><
067
Параметры

Отсутствуют.


Parameters

None.

068
Возвращаемое значение

Пустая строка.


Return Value

Empty string.

069
Обработка ошибок

Значение специальной переменной KBDERRNO не изменяется.


Errors

The value of the KBDERRNO special variable does not change.

<<<
070
3.4. yaGetKeyVer

Возвращает версию и прочую информацию о библиотеке.


3.4. yaGetKeyVer

Returns the library version and another information.

071
Синтаксис

 >---yaGetKeyVer(-+------+-)---><
                  |      |
                  +-stem-+

Syntax

 >---yaGetKeyVer(-+------+-)---><
                  |      |
                  +-stem-+
072
Параметры
stem
(необязательный) строка, содержащая правильное корневое имя кортежа (завершающая точка может быть опущена).

Parameters
stem
(optional) the string containing a correct stem name (may be without the final dot).
073
Если параметр stem задан, то функция заполняет указанный кортеж дополнительной информацией о библиотеке, присваивая соответствующие значения элементам кортежа со следующими составными именами:


If the stem is specified, the function stores the additional information about the library in the stem. The function assigns appropriate values to stem elements named as:

074
stem.0ABOUT
строка с дополнительной информацией о библиотеке,

stem.0ABOUT
the string containing additional information about the library,
075
stem.0
число, общее количество фукций в библиотеке,

stem.0
the number of library functions,
076
stem.1
строка, имя первой функции,

stem.1
the string containing the name of the first function,
077
stem.2 (и далее)
строка, имя второй функции (и далее до номера, соответствующему общему количеству функций в библиотеке).

stem.2 (and above)
the string containing the name of the second function (and above to the number of library functions).
078
Возвращаемое значение

Строка с номером версии библиотеки.


Return Value

The string containing the version information.

079
Обработка ошибок

Значение специальной переменной KBDERRNO не изменяется.


Errors

The value of the KBDERRNO special variable does not change.

<<<
080
3.5. Пример

(отсутствует в HTML-версии, смотри INF-версию)


3.5. Example

(remove from HTML document, see INF document)

<<<
081
4. Замечания.

Об особенностях реализации

Функция yaGetKey основана на функции API KbdCharIn. Поэтому функция yaGetKey возвращает значения только после нажатия тех клавиш, которые в состоянии обработать функция KbdCharIn.


4. Some Notes.

About features of implementation

The yaGetKey function is based on the KbdCharIn function. Therefore the yaGetKey function returns values as keystrokes that can be produced by the KbdCharIn function.

082
Двухбайтовые сканкоды функция yaGetKey возвращает только после нажатия тех клавиш, для которых установлен бит 1 в поле fbStatus структуры KBDKEYINFO, за исключением двух случаев. Поскольку KbdCharIn особым образом обрабатывает нажатия клавиш Enter и Slash (/) на дополнительной цифровой клавиатуре (устанавливает бит 1 в поле fbStatus, но признак сканкода 0xE0 помещает в поле chScan, а в поле chChar помещает оттранслированный символ, а не наоборот), то для этих клавиш функция yaGetKey возвращает однобайтовый символ, полученный из поля chChar, несмотря на установленный бит 1 в поле fbStatus.


The yaGetKey function returns double-byte scancode only for those keystrokes in which the bit 1 is established in the fbStatus field of KBDKEYINFO structure except two cases. Since KbdCharIn processes the Enter and Slash (/) keystrokes on the additional digital keyboard in a special way (establishes bit 1 in the fbStatus field, but the 0xE0 value puts to the chScan field, and translated character puts to chChar field, and not vice versa), then the yaGetKey function returns the one-byte character (the chChar field) despite the established bit 1 in the fbStatus field for these keys.

083
О VirtualBox

Функция yaGetKey может вернуть недостоверную информацию о состоянии переключателей, если время ожидания нажатия клавиши было ограничено, а возврат из функции произошёл в результате истечения таймаута или изменения состояния переключателей. Это проблемы VirtualBox.


About VirtualBox

If the wait time is restricted and the timeout expired or the switches status changed then the yaGetKey function can return the invalid switches status. It is a VirtualBox problem.

084
О самостоятельной компиляции

Каталог .\SOURCE дистрибутивного пакета содержит всё необходимое для самостоятельной компиляции файлов программ и документации средствами Open Watcom C Compiler v1.9:
  • задание на компиляцию (файл makefile),
  • исходные тексты программ (.\SOURCE\C) и документации (.\SOURCE\INF).

About unaided compiling

The .\SOURCE directory of the distribution package contains everything needed for unaided compiling of program files and documents by tools of Open Watcom C Compiler v1.9:
  • the compiling scenario (makefile),
  • source codes of programs (.\SOURCE\C) and documentation (.\SOURCE\INF).
085
Для самостоятельной компиляции требуется:
  • установить Open Watcom C Compiler v1.9 в вашей операционной системе OS/2, если он ещё не установлен,
  • развернуть дистрибутивный пакет в свой рабочий каталог, например, в x:\yaGetKey,
  • запустить сессию командной строки OS/2,
  • перейти в каталог x:\yaGetKey\SOURCE,
  • выполнить одну из команд:
    • WMAKE (для компиляции модуля DLL и документации)
    • WMAKE DLL (для компиляции только модуля DLL)
    • WMAKE INF (для компиляции только документации)

Getting Started:
  • install Open Watcom C Compiler v1.9 to your OS/2 (if it is not installed),
  • unzip the distribution package to your work directory, i.e. x:\yaGetKey,
  • start the OS/2 command line session,
  • change the current directory to x:\yaGetKey\SOURCE,
  • execute one of the commands:
    • WMAKE (for full compiling)
    • WMAKE DLL (only DLL compiling)
    • WMAKE INF (only INF compiling)
<<<
086
5. Об авторах
VicTor Smirnoff
http://vasm.livejournal.com

5. About authors
VicTor Smirnoff
http://vasm.livejournal.com
<<<
087
6. Заявление об авторских правах

Copyright (c) 2015 VicTor Smirnoff

Данная лицензия разрешает лицам, получившим копию данного программного обеспечения и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"), безвозмездно использовать Программное Обеспечение без ограничений, включая неограниченное право на использование, копирование, изменение, добавление, публикацию, распространение, сублицензирование и/или продажу копий Программного Обеспечения, а также лицам, которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:


6. Full Copyright Statement

Copyright (c) 2015 VicTor Smirnoff

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

088
Указанное выше уведомление об авторском праве и данные условия должны быть включены во все копии или значимые части данного Программного Обеспечения.


The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

089
ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА УЩЕРБ ИЛИ ПО ИНЫМ ТРЕБОВАНИЯМ, В ТОМ ЧИСЛЕ, ПРИ ДЕЙСТВИИ КОНТРАКТА, ДЕЛИКТЕ ИЛИ ИНОЙ СИТУАЦИИ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.


THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

<<<

---