CHAT(8)

명칭
chat - 모뎀 접속의 확립을 자동화하는 스크립트 언어

서식
chat [ options ] script

해설

chat 프로그램은 컴퓨터와 모뎀의 사이의 메시지 교환을 제어합니다. 이 명령의 주된 목적은, Point-to-Point Protocol demon (pppd)와 리모트의 pppd 프로세스의 사이의 접속을 확립하는 것입니다.

옵션

-f <chat file>
    chat script를 chat file 로부터 읽어들입니다. 이 옵션과 script 파라미터란, 서로 배타의 관계에 있습니다. chat 명령을 실행하는 유저는, 이 파일의 리드 액세스권을 가지고 있지 않으면 안됩니다. 이 파일 중(안)에서는, 캐릭터 라인의 단락으로서 스페이스와 탭을 사용할 수가 있습니다.

-t <timeout>
    캐릭터 라인의 수신 기다리는 타임 아웃을 지정합니다. 만약, 시한까지 지정된 캐릭터 라인을 수신할 수 없었던 경우에는, 응답 캐릭터 라인의 송신을 행하지 않습니다. 이 때, 차이의 응답 캐릭터 라인이 지정되어 있으면 그것이 송신되어 지정되어 있지 않으면 스크립트의 실행이 실패합니다. 스크립트의 실행이 실패하면(자), chat 프로그램은 0 이외의 에러 코드를 돌려주어 종료합니다.

-r <report file>
    리포트 캐릭터 라인을 출력하는 파일을 지정합니다. 키워드 REPORT 를 이용하면(자), 결과의 캐릭터 라인이 이 파일에 출력됩니다. 이 옵션을 지정하지 않고 REPORT 키워드를 사용하면(자), 리포트 캐릭터 라인은 stderr 에 출력됩니다.

-e  에코 옵션을 유효하게 해 개시합니다. chat 스크립트의 특정의 장소에 있어 ECHO 키워드에서 에코의 유효 및 무효를 바꿀 수가 있습니다. 에코가 유효하게 되면(자), 모뎀으로부터의 출력은 모두 stderr 에 에코 됩니다.

-v  chat 스크립트를 장황 모드로 실행합니다. 이것을 지정하면(자), chat 프로그램은, chat script의 실행 상태, 모뎀으로부터 수신한 모든 텍스트, 모뎀에 보낸 모든 텍스트의 로그를 취합니다. 디폴트에서는 syslogd(8) (을)를 개입시켜 취득합니다. 로그의 방법은 -S 및 -s 의 플래그로 변경할 수 있습니다. 장황 트레이스의 로그 새는 local2 퍼실리티의 레벨 info 그리고 행해져 에러에 대해서는 레벨 err 가 사용됩니다.

-V  chat 스크립트를 표준 에러 출력 장황 모드에서 실행하도록(듯이) 요구합니다. chat 프로그램은, 모뎀으로부터 수신하는 모든 텍스트 및 모뎀에 송신하는 모든 텍스트를 표준 에러 출력 디바이스에 로그 합니다. chat 혹은 pppd 프로그램을 동작시키고 있는 장소에서는, 이 디바이스는 통상 로컬의 콘솔입니다.

-s  표준 에러 출력을 사용합니다. '-v'에 의한 전로그 메세지 및 전에러 메세지를 표준 에러 출력에 보내집니다.

-S  syslog(3) (을)를 사용하지 않습니다. 디폴트에서는 에러 메세지는 syslog(3) 에 보내집니다. -S 를 사용하면(자) '-v'에 의한 로그 및 에러 메세지는 syslog(3) 에는 보내지지 않게 됩니다.

-T <phone number>
    송신 캐릭터 라인에 대해 \T 치환 메타 캐릭터를 옮겨놓는 임의의 캐릭터 라인을 건네줍니다. 통상은 전화번호입니다.

-U <phone number 2>
    송신 캐릭터 라인에 대해 \U 치환 메타 캐릭터를 옮겨놓는 제 2 캐릭터 라인을 건네줍니다. 통상은 전화번호입니다. 2 개의 번호를 필요로 하는 ISDN 터미널 어댑터로 다이얼 하는 경우에 유용합니다.

script
    -f 옵션의 파일로 스크립트가 지정되어 있지 않으면, chat 프로그램에 대한 파라미터 캐릭터 라인이 스크립트로서 읽힙니다.

chat script

chat 스크립트에는 통신의 순서를 정의합니다.

스크립트는 하나 또는 그 이상의 「수신 대기-송신」캐릭터 라인의 조로부터 되어, 각각은 공백에서 단락지어지고 있습니다. 옵션으로서 「부수신 대기-부송신」캐릭터 라인의 조를 추가할 수도 있어 그 경우에는 이하의 예의 같게 데쉬로 단락짓습니다:

    ogin:-BREAK-ogin: ppp ssword: hello2u2

이것에 의해, chat 프로그램은 캐릭터 라인 "ogin:" 의 수신 대기를 행합니다. 만약 타임 아웃 하기 전에 로그인 prompt를 수신할 수 없으면, 리모트 호스트에 브레이크 신호를 송신해, 그리고 캐릭터 라인 "ogin:" 를 수신 기다려 합니다. 만약 최초의 "ogin:" 가 수신 되어 있으면, 브레이크 신호는 송신되지 않습니다.

일단 로그인 prompt를 수신하면(자), chat 프로그램은 캐릭터 라인 ppp 를 송신해, prompt "ssword:" 의 수신을 기다립니다. 패스워드 prompt를 수신하면(자), chat 프로그램은 패스워드 hello2u2 를 송신합니다.

응답 캐릭터 라인에 이어, 통상은 왕복대 리턴 캐릭터가 보내집니다. 「수신 대기」캐릭터 라인중에서는, \r 캐릭터 순차 순서로 명시적으로 지정하지 않는 한, 왕복대 리턴은 캐릭터 라인에 포함되지 않습니다.

목적의 캐릭터 라인을 식별하는데 필요한 부분만큼을 수신 대기 캐릭터 라인에 지정하도록(듯이) 해야 합니다. 왜냐하면, 수신 대기 캐릭터 라인은 통상 디스크 파일에 기록되기 (위해)때문에, 동적으로 변화하는 정보를 포함할 수가 없기 때문입니다. 일반적으로는, 시각을 나타내는 캐릭터 라인이나 네트워크 ID 캐릭터 라인 그 외의 변화하는 데이터의 덩어리를 수신 기다려 시킬 수 없습니다.

통신의 초기 단계에서는, 캐릭터가 변해 수신되는 경우가 있습니다. 이 경우에도 올바르게 인식을 할 수 있도록(듯이), 캐릭터 라인 "login:" 는 아니고 "ogin:" 를 기다리도록(듯이) 합니다. 만일 최초의 "l" 라고 하는 캐릭터가 변해 수신되었다고 하면, 리모트 시스템이 "login:" 를 송신했다고 해도, 그 캐릭터 라인은 인식되지 않게 됩니다. 이 때문에, 스크립트에서는 "login:" 는 아니고 "ogin:" 를, "password:" 는 아니고 "ssword:" 를 기다리도록(듯이) 합니다.

매우 단순한 스크립트는, 이하와 같이 되겠지요:

    ogin: ppp ssword: hello2u2

말 있고 돌아가면(자),....ogin: 를 수신 기다려 해 ppp 를 송신해,...ssword: 를 수신 기다려 해 hello2u2 를 송신한다고 하는 것이 됩니다.

현실 문제로서는, 단순한 스크립트가 사용되는 것은 거의 없을 것입니다. 적어도, 최초의 수신 대기 캐릭터 라인을 수신할 수 없었던 경우에, 부수신 대기 캐릭터 라인을 실행하도록(듯이) 해야 하는 것이지요. 예를 들어, 이하의 스크립트를 생각해 보겠습니다:

    ogin:--ogin: ppp ssword: hello2u2

이것은 이전에 사용한 단순한 것보다 좋은 스크립트지요. 이전의 것과 같게 login: prompt를 기다립니다만, 만약 수신할 수 없었던 경우에는 리턴을 하나 보내고 나서 다시 login: 가 보내져 오는 것을 기다립니다. 최초의 로그인 prompt가 라인 노이즈에 의해 변했다고 해도, 공행이 보내지는 것으로, 통상은 한번 더 로그인 prompt가 송신됩니다.

코멘트
코멘트를 chat 스크립트중에 묻는 것이 가능합니다. 코멘트는 # (해시) 캐릭터를 컬럼 1 으로부터 개시하는 행입니다. 이러한 코멘트행은 chat 프로그램은 단지 무시합니다. 「수신 대기」캐릭터 라인의 최초의 캐릭터가 `#'캐릭터의 경우, 「수신 대기」캐릭터 라인을 쿼트 할 필요가 있습니다. 캐릭터 # (해시)로부터 시작되는 prompt를 기다리고 싶은 경우에는, 이하와 같이 쓰지 않으면 되지 않을 것입니다:

    # Now wait for the prompt and send logout string
    '# ' logout

중단 캐릭터 라인
많은 모뎀은 다이얼의 결과를 캐릭터 라인으로서 리포트합니다. 이러한 캐릭터 라인은 CONNECTED 였거나, NO CARRIER 나 BUSY 이기도 하겠지요. 모뎀이 상대와의 접속에 실패했을 경우에는, 스크립트를 종료시키고 싶으면 생각하는 일이 자주 있겠지요. 문제는, 어느 캐릭터 라인을 다음에 수신하는가 하는 것을, 스크립트가 정확하게 알 수 없다고 하는 것입니다. 어느 BUSY 를 수신할지도 모릅니다만, 다음에는 NO CARRIER 를 수신할지도 모릅니다.

이러한 「중단」캐릭터 라인은, ABORT 순차 순서에 의해 스크립트중으로 지정할 수가 있습니다. 그것은, 이하의 예의 같게 스크립트로 지정합니다:

    ABORT BUSY ABORT 'NO CARRIER' '' ATZ OK ATDT5551212 CONNECT

이 순차 순서는 수신 대기를 행하지 않습니다. 그리고 캐릭터 라인 ATZ 를 송신합니다. 수신 대기 캐릭터 라인은 OK 입니다. OK 를 수신하면(자), 전화를 걸기 위해서(때문에) 캐릭터 라인 ATDT5551212 를 송신합니다. 수신 대기 캐릭터 라인은 CONNECT 입니다. 캐릭터 라인 CONNECT 를 수신하면(자), 스크립트의 나머지가 실행됩니다. 한편, 모뎀이 화중을 검출하면(자), 캐릭터 라인 BUSY 가 보내져 중단 캐릭터 라인에의 일치가 일어납니다. 이 일치가 일어난 것에 의해, 스크립트는 실패합니다. 만약 캐릭터 라인 NO CARRIER 를 수신하면(자), 그것은 같은 이유로 중단됩니다. 어느 쪽의 캐릭터 라인이 수신되어도, chat 스크립트는 종료합니다.

CLR_ABORT 캐릭터 라인
이 순차 순서는 이전으로 설정한 ABORT 캐릭터 라인을 클리어 합니다. ABORT 캐릭터 라인은 규정 사이즈(컴파일시로 결정)의 배열에 보관 유지됩니다; CLR_ABORT 는 클리어 된 엔트리의 area를 재요구해, 새로운 캐릭터 라인을 거기에 격납할 수 있도록(듯이) 합니다.

SAY 캐릭터 라인
SAY 지시문에서, script 가 표준 에러 출력을 개입시켜 유저 단말헤 캐릭터 라인을 보낼 수가 있습니다. chat 가 pppd 로부터 기동되는 경우, pppd 는 demon로서 실행되고(제어 단말로부터 떼어내지고), 표준 에러 출력은 통상 /etc/ppp/connect-errors (으)로 리디렉트 됩니다.

SAY 캐릭터 라인은, 싱글 쿼트 혹은 더블 쿼트에서 괄필요가 있습니다. 출력중에 왕복대 리턴 및 라인 피드가 필요한 경우, 명시적으로 캐릭터 라인중에 포함할 필요가 있습니다.

SAY 캐릭터 라인을 사용해 script 의 진척 상황 메세지를 표시하는 것으로, 'ECHO OFF' 하면서도 유저에게 뭐가 떠나고 있는지 가리키는 것이 가능합니다. 예를 나타냅니다:

    ABORT BUSY
    ECHO OFF
    SAY "Dialling your ISP...\n"
    '' ATDT5551212
    TIMEOUT 120
    SAY "Waiting up to 2 minutes for connection ... "
    CONNECT ''
    SAY "Connected, now logging in ...\n"
    ogin: account
    ssword: pass
    $ SAY "Logged in OK ...\n" etc ...

이 순차 순서는 SAY 캐릭터 라인만 유저에게 나타내, script 의 자세한 것은 숨깁니다. 예를 들면, 상기 script 를 실행했을 경우, 유저가 보는 것은 이하입니다:

    Dialling your ISP...
    Waiting up to 2 minutes for connection ... Connected, now logging in ...
    Logged in OK ...

리포트 캐릭터 라인
리포트 캐릭터 라인은 ABORT 캐릭터 라인을 닮아 있습니다. 다른 것은, 그 캐릭터 라인 자신과 왕복대 리턴등의 다음의 제어 캐릭터까지의 모든 캐릭터가 리포트 파일에 쓰여진다고 하는 것입니다.

리포트 캐릭터 라인은 모뎀의 코네크트 캐릭터 라인의 전송 레이트와 chat 유저에게로의 리턴치를 잘라 나누기 위해서(때문에) 사용할 수 있습니다. 리포트 캐릭터 라인 논리의 분석은, 수신 대기 캐릭터 라인의 검색등의 다른 캐릭터 라인 처리와 동시에 행해집니다. 리포트 캐릭터 라인과 중단 캐릭터 라인에 같은 캐릭터 라인을 사용하는 일도 가능합니다만, 아마 그다지 용도가 없을 것입니다.

리포트 캐릭터 라인은 프로그램의 종료 코드에 영향을 미치지 않습니다.

이러한 「리포트」캐릭터 라인은, REPORT 순차 순서에 의해 스크립트중으로 지정할 수가 있습니다. 그것은, 이하의 예의 같게 스크립트로 지정합니다:

    REPORT CONNECT ABORT BUSY '' ATDT5551212 CONNECT '' ogin: account

이 순차 순서는 수신 대기를 행하지 않고, 캐릭터 라인 ATDT5551212 를 송신해 전화를 겁니다. 수신 대기 캐릭터 라인은 CONNECT 입니다. 캐릭터 라인 CONNECT 를 수신하면(자), 스크립트의 나머지가 실행됩니다. 게다가 캐릭터 라인 "CONNECT" 와 거기에 계속되는 접속 레이트등의 임의의 캐릭터가 리포트 파일에 기록됩니다.

CLR_REPORT 캐릭터 라인
이 순차 순서를 사용해, 이전으로 설정한 REPORT 캐릭터 라인을 클리어 할 수 있습니다. REPORT 캐릭터 라인은 규정 사이즈(컴파일시로 결정)의 배열에 보관 유지됩니다; CLR_REPORT 는 클리어 된 엔트리의 area를 재요구해, 새로운 캐릭터 라인을 거기에 격납할 수 있도록(듯이) 합니다.

에코
에코 옵션은 모뎀으로부터의 출력을 stderr 에 에코 하는지 아닌지 (을)를 제어합니다. 이 옵션을 -e 옵션에서 설정할 수가 있고, ECHO 키워드에서 제어할 수도 있습니다. 「수신 대기-송신」캐릭터 라인의 조 ECHO ON 는 에코를 유효하게 해, ECHO OFF 는 무효로 합니다. 이 키워드를 사용해 어느 회화를 보이는지를 선택 가능합니다. 예를 들면 이하의 script 에서는:

    ABORT 'BUSY'
    ABORT 'NO CARRIER'
    '' ATZ
    OK\r\n ATD1234567
    \r\n \c
    ECHO ON
    CONNECT \c
    ogin: account

모뎀 설정 결과 및 다이얼 결과는 보이지 않습니다만, CONNECT (혹은 BUSY) 메세지 후는 모두를 에코 합니다.

회선 절단
HANGUP 옵션은 모뎀의 회선 절단을 에러와 취급하는지 아닌지를 제어합니다. 이 옵션은, 시스템에 다이얼 후에 회선 절단 해 콜백 하는 script 중에서 유효합니다. HANGUP 옵션은 ON 혹은 OFF 로 할 수 있습니다.
HANGUP 를 OFF 로 설정해 모뎀을 회선 절단 (즉 콜백 시스템에의 최초의 로그인) 하면(자), chat 는 script 의 실행을 계속합니다 (즉 호출과 두번째의 로그인 prompt를 기다립니다). 호출에서 접속 후 곧바로, HANGUP ON 지시문을 사용해 통상의 회선 절단 시그널의 동작을 되돌릴 필요가 있습니다. (간단한) script 예를 나타냅니다:

    ABORT 'BUSY'
    '' ATZ
    OK\r\n ATD1234567
    \r\n \c
    CONNECT \c
    'Callback login:' call_back_ID
    HANGUP OFF
    ABORT "Bad Login"
    'Callback Password:' Call_back_password
    TIMEOUT 120
    CONNECT \c
    HANGUP ON
    ABORT "NO CARRIER"
    ogin:--BREAK--ogin: real_account
    etc ...

타임 아웃
타임 아웃의 초기치는 45 초입니다. 이것은 -t 파라미터에 의해 변경할 수가 있습니다.

다음에 수신 기다려 하는 캐릭터 라인의 타임 아웃치를 변경하려면 , 이하와 같이 합니다:

    ATZ OK ATDT5551212 CONNECT TIMEOUT 10 ogin:--ogin: TIMEOUT 5 assword: hello2u2

이것은 login: prompt를 수신 기다려 할 때의 타임 아웃을 10 초로 변경합니다. 한층 더 password prompt를 수신 기다려 하려면 타임 아웃을 5 초로 변경합니다.

일단 타임 아웃치가 변경되면(자), 다음으로 변경될 때까지는 그대로 됩니다.

EOT 의 송신
채팅 프로그램은 특수한 응답 캐릭터 라인 EOT 에 의해, 리모트측에 EOT 캐릭터를 송신합니다. 통상, 이것은 파일 종료를 나타내는 캐릭터입니다. EOT 에 이어 리턴 캐릭터가 보내질 것은 없습니다.

^D 순차 순서를 사용해 EOT 를 송신 캐릭터 라인에 묻을 수가 있습니다.

브레이크의 생성
특수한 응답 캐릭터 라인 BREAK 에 의해, 브레이크 신호가 보내집니다. 브레이크는 송신측에서는 특수한 신호로서 다루어집니다. 수신측에서는 통상, 전송 레이트의 변경 요구로서 처리됩니다. 이것에 의해, 정상적으로 login prompt를 수신할 수 있을 때까지 브레이크 신호를 보내는 것으로, 리모트측이 서포트하고 있는 전송 레이트를 차례차례 바꾸게 할 수가 있습니다.

\K 순차 순서를 사용해 브레이크 신호를 송신 캐릭터 라인에 묻을 수가 있습니다.

escape sequence
수신 대기 캐릭터 라인과 응답 캐릭터 라인에는, escape sequence를 지정할 수가 있습니다. 응답 캐릭터 라인에서는, 모든 escape sequence를 사용할 수 있습니다. 수신 대기 캐릭터 라인에서는, 대부분의 escape sequence를 사용할 수 있습니다. 수신 대기 캐릭터 라인에서는 사용할 수 없는 escape sequence에 대해서는, 설명문중에 그것이 쓰여져 있습니다.

''  공문자열을 수신 기다려 하거나 송신하거나 합니다. 만약, 공문자열을 송신하려고 하면(자), 그것은 리턴 몬지를 보내게 됩니다. 이 순차 순서는 어퍼스트로피 캐릭터 또는 쿼트 캐릭터의 페어의 어디라도 괜찮습니다.

\\b 백 스페이스 캐릭터를 나타냅니다.

\\c 응답 캐릭터 라인의 말미의 개행을 억제합니다. 이것은 말미에 개행 몬지가 도착하지 않는 캐릭터 라인을 보내는 유일한 방법입니다. 이것은 송신 캐릭터 라인의 마지막에 놓여지지 않으면 안됩니다. 예를 들어, 캐릭터 라인 hello\c 는 단지 h, e, l, l, o 라고 하는 캐릭터만을 보냅니다. (수신 대기 캐릭터 라인에서는 사용할 수 없습니다)

\\d 1 초의 지연입니다. 프로그램은 1 초의 지연을 위해서(때문에) sleep(1)를 사용합니다. (수신 대기 캐릭터 라인에서는 사용할 수 없습니다)

\\K 브레이크 신호를 삽입합니다. (수신 대기 캐릭터 라인에서는 사용할 수 없습니다)

\\n 개행 캐릭터를 송신합니다.

\\N 하늘 (null) 캐릭터를 송신합니다. \0 그렇지만 같은 순차 순서를 나타낼 수가 있습니다. (수신 대기 캐릭터 라인에서는 사용할 수 없습니다)

\\p 1 초 이하의 포즈입니다. 지연 시간은 1/10 초입니다. (수신 대기 캐릭터 라인에서는 사용할 수 없습니다)

\\q syslogd(8) 에의 캐릭터 라인 출력을 억제합니다. 대신에 캐릭터 라인 ?????? 하지만 로그에 출력됩니다. (수신 대기 캐릭터 라인에서는 사용할 수 없습니다)

\\r 왕복대 리턴 캐릭터를 송신 또는 수신 기다려 합니다.

\\s 캐릭터 라인중의 스페이스 캐릭터를 나타냅니다. 이것은 스페이스를 포함한 캐릭터 라인을 쿼트 하고 싶지 않은 경우에 사용합니다. 순차 순서 'HI TIM'와 HI\sTIM 는 등가입니다.

\\t 탭 캐릭터를 송신 또는 수신 기다려 합니다.

\\\\
    backslash 캐릭터를 송신 또는 수신 기다려 합니다.

\\ddd
    8 진수 (ddd)를 하나의 ASCII 캐릭터로 변환해, 그 캐릭터를 송신합니다. (수신 대기 캐릭터 라인에서는 사용할 수 없는 캐릭터가 몇개인가 있습니다)

^C  C 로 표현되는 제어 캐릭터에 바꿀 수 있습니다. 예를 들면, 캐릭터 DC1 (17)는 ^Q 로 나타내집니다. (수신 대기 캐릭터 라인에서는 사용할 수 없는 캐릭터가 몇개인가 있습니다)

종료 코드
chat 프로그램은 이하의 종료 코드를 돌려줍니다.

0   프로그램은 정상 종료했습니다. 이것은, 스크립트가 에러를 일으키지 않고 실행되어, 정상적으로 종료한 것을 나타냅니다.

1   하나 또는 그 이상의 파라미터가 부정한가, 수신 대기 캐릭터 라인이 내부 버퍼보다 너무 큽니다. 이것은 프로그램이 올바르고 실행되지 않았던 것을 나타냅니다.

2   프로그램의 실행중에 에러가 발생했습니다. 이것은, 어떠한 이유로 리드 또는 라이트의 조작이 실패했는지, chat 가 SIGINT 와 같은 시그널을 수신했기 때문에지요.

3   「-부송신」캐릭터 라인이 없는수신 대기캐릭터 라인이 있어, 타임 아웃 이벤트가 발생했습니다. 이것은, 스크립트가 올바르고 프로그램되어 있지 않은지, 예기치 않은 이벤트가 발생해 수신 대기 캐릭터 라인을 찾아낼 수 없었기 때문에지요.

4   ABORT 조건으로서 마크 된 1 번째의 캐릭터 라인을 검출했습니다.

5   ABORT 조건으로서 마크 된 2 번째의 캐릭터 라인을 검출했습니다.

6   ABORT 조건으로서 마크 된 3 번째의 캐릭터 라인을 검출했습니다.

7   ABORT 조건으로서 마크 된 4 번째의 캐릭터 라인을 검출했습니다.

... 그 외의 종료 코드도, ABORT 조건으로서 마크 된 캐릭터 라인을 검출한 것을 나타냅니다.

종료 코드를 사용하면(자), 어느 이벤트에 의해 스크립트가 종료했는지를 판단할 수가 있습니다. 즉,"NO DIAL TONE" 를 수신했는지 "BUSY" 를 수신했는지를 식별할 수가 있다고 하는 것입니다. 최초의 이벤트 (BUSY)라면 리트라이 하는 가치가 있습니다만, 둘째의 이벤트 (NO DIAL TONE)라고, 아마 리트라이 해도 그것이 잘될 가능성은 낮을 것입니다.

관련 항목
UUCP 의 문서로부터도, chat 스크립트에 관한 추가 정보를 얻을 수 있겠지요. chat 스크립트는 uucico 프로그램으로 사용된다 스크립트에 의해 제시된 아이디어를 기본으로 하고 있습니다.

uucico(1), uucp(1), syslog(3), syslogd(8).

저작권
chat 프로그램은, 퍼블릭 도메인의 소프트웨어입니다. 이것은 GNU 의 퍼블릭 라이센스 (일반 공유 사용 허락)와는 다릅니다. 이 프로그램을 분할하는 경우에는, 그 양쪽 모두를 관리하도록 해 주세요.