﻿$TTFlash에 SCORM 1.2 추적 사용
$DS
ADL/SCORM 1.2 통신을 위한 제작 템플릿입니다. 학습 과정을 지원하도록 기능이 변경되었습니다. JavaScript가 포함되어 있어 ADL API 1.2 객체를 찾고 초기화할 수 있으며 Flash에서 LMS 함수를 호출할 수 있게 하는 FSCommand도 포함되어 있습니다.

$DF

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ko" lang="ko">
<head>
$CS
<script type="text/javascript" language="JavaScript" name="fsIeVbscript">
<!--
// Internet Explorer에 연결되는 지점
if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 && navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
	document.write('<script language=\"VBScript\"\>\n');
	document.write('On Error Resume Next\n');
	document.write('Sub $TI_FSCommand(ByVal command, ByVal args)\n');
	document.write('	Call $TI_DoFSCommand(command, args)\n');
	document.write('End Sub\n');
	document.write('</script\>\n');
}
//-->
</script>
<title>$TI</title>
</head>
<script type="text/javascript" language="JavaScript" name="cmifrag">
<!--

// FS SCORM - ADL SCORM 1.2 및 Flash MX 2004 학습 과정용 FSCommand 어댑터
// 버전 1.0    08/19/03
// 수정: Macromedia의 Andrew Chemey
// FS SCORM 어댑터 버전 1.2.4 기반:
// \t\tFragments Copyright 2002 Pathlore Software Corporation All rights Reserved
// \t\tFragments Copyright 2002 Macromedia Inc. All rights reserved.
// \t\tFragments Copyright 2003 Click2learn, Inc. All rights reserved.
// 		개발: Macromedia의 Tom King, Leonard Greenberg, Pathlore,, 및 Claude Ostyn, Click2learn, Inc.
// 		Macromedia의 Jeff Burton 및 Andrew Chemey가 작성한 코드가 포함되어 있습니다(2002년 9월 1일).
// -----------------------------------------------------------------

// 미리 설정된 값은 사용자가 원하는 대로 변경할 수 있습니다.

var g_bShowApiErrors = false; 	// true로 변경하면 오류 메시지가 표시됩니다.

var g_bInitializeOnLoad = true; // false로 변경하면 HTML 페이지가 로드될 때 LMS를 초기화하지 않습니다.

// g_bShowApiErrors가 true이면 이 문자열을 변환합니다.또한 응용 프로그램을 한글화해야 합니다.
var g_strAPINotFound = "Management system interface not found.";
var g_strAPITooDeep = "Cannot find API - too deeply nested.";
var g_strAPIInitFailed = "Found API but LMSInitialize failed.";
var g_strAPISetError = "Trying to set value but API not available.";
var g_strFSAPIError = 'LMS API adapter returned error code: "%1"\nWhen FScommand called API.%2\nwith "%3"';
var g_strDisableErrorMsgs = "Select cancel to disable future warnings.";

// LMSFinish 호출 시 "완료" 상태로 자동 설정하려면g_bSetCompletedAutomatically를 true로 변경합니다.
// 일반적으로, Flash 동영상에서 상태를 "완료", "전달" 또는 "실패"로 설정하는 FSCommand를 자체적으로 전송하여 상태를 완료로 설정한 경우이 플래그는 false로 남아 있습니다.  여기서 "전달"과" 실패" 모두 "완료"의 의미를 함축합니다. "passed" or "failed" (both of which imply "completed")
var g_bSetCompletedAutomatically = false;

// 이 값은 일반적으로 LMS에 의해 지정됩니다. 그렇지 않은 경우이것이 "전달/실패"를 결정하는 데 사용되는 기본값이 됩니다.
// Flash ActionScript에서 전달/실패를 결정하는 데 자체 메서드를 사용하는 경우이것을 null로 설정합니다.그렇지 않은 경우는 0에서 1사이의 값을 설정합니다."0.75" 같은 부동점 값도 포함됩니다.
var g_SCO_MasteryScore = null; // 허용되는 값: 0.0..1.0, 또는 null

//==================================================================

// 경고!!!
// 내용을 정확히 파악하고 있지 않다면 이 행 아래의 내용을 절대 수정하지 마십시오!
// Flash 템플릿의 미리 설정된 설정이 이 두 값에 기반하므로값을 변경해서는 안됩니다!
var g_nSCO_ScoreMin = 0; 		=// 숫자여야 합니다.
var g_nSCO_ScoreMax = 100; 		// nSCO_Score_Min보다 큰 숫자여야 합니다.

// SCORM 사양에 따라 LMS는 마스터 점수를 제공하며 이 점수가 있는 경우 통과/실패 상태가 결정되면 점수를 해석해야 하는지 여부를해석하는 과정에서 SCO가 재정의되는 경우도 있습니다.
// 템플릿에서 마스터 점수를 가져오려고 시도합니다.마스터 점수를 사용할 수 있으면 SCO에서 점수를 전송할 때 해당 마스터 점수에 따라 통과 또는 실패 상태를 설정합니다.
// SCO가 종료되면 LMS에서 실제로 결정을 내립니다.
// 이 플래그의 기본값은 true입니다. 마스터 점수에 따라LMS에서 통과/실패 상태를 설정할 방법을 예측하지 않게 하려면해당 값을 false로 설정하십시오. 그러나 이 경우에도 LMS에서 상태를 설정하게 됩니다.
var g_bInterpretMasteryScore = true;

// 이 스크립트는 SCO 공통 논리 비헤이비어의다양한 측면을 구현합니다.

/////////// API 인터페이스 초기화 및 CATCHER 함수 ////////
var g_nFindAPITries = 0;
var g_objAPI = null;
var g_bInitDone = false;
var g_bFinishDone = false;
var	g_bSCOBrowse = false;
var g_dtmInitialized = new Date(); // 초기화 이후 조정됩니다.
var g_bMasteryScoreInitialized = false;

function AlertUserOfAPIError(strText) {
	if (g_bShowApiErrors) {
		var s = strText + "\n\n" + g_strDisableErrorMsgs;
		if (!confirm(s)){
			g_bShowApiErrors = false
		}
	}
}

function ExpandString(s){
	var re = new RegExp("%","g")
	for (i = arguments.length-1; i > 0; i--){
		s2 = "%" + i;
		if (s.indexOf(s2) > -1){
			re.compile(s2,"g")
			s = s.replace(re, arguments[i]);
		}
	}
	return s
}

function FindAPI(win) {
	while ((win.API == null) && (win.parent != null) && (win.parent != win)) {
		g_nFindAPITries ++;
		if (g_nFindAPITries > 500) {
			AlertUserOfAPIError(g_strAPITooDeep);
			return null;
		}
		win = win.parent;
	}
	return win.API;
}

function APIOK() {
	return ((typeof(g_objAPI)!= "undefined") && (g_objAPI != null))
}

function SCOInitialize() {
	var err = true;
	if (!g_bInitDone) {
		if ((window.parent) && (window.parent != window)){
			g_objAPI = FindAPI(window.parent)
		}
		if ((g_objAPI == null) && (window.opener != null))	{
			g_objAPI = FindAPI(window.opener)
		}
		if (!APIOK()) {
			AlertUserOfAPIError(g_strAPINotFound);
			err = false
		} else {
			err = g_objAPI.LMSInitialize("");
			if (err == "true") {
				g_bSCOBrowse = (g_objAPI.LMSGetValue("cmi.core.lesson_mode") == "browse");						if (!g_bSCOBrowse) {
					if (g_objAPI.LMSGetValue("cmi.core.lesson_status") == "not attempted") {
						err = g_objAPI.LMSSetValue("cmi.core.lesson_status","incomplete")
					}
				}
			} else {
				AlertUserOfAPIError(g_strAPIInitFailed)
			}
		}
		if (typeof(SCOInitData) != "undefined") {
			// SCOInitData 함수를 다른 SCO 스크립트에서 정의할 수 있습니다.
			SCOInitData()
		}
		g_dtmInitialized = new Date();
	}
	g_bInitDone = true;
	return (err + "") // 유형을 문자열로 고정시킵니다.
}

function SCOFinish() {
	if ((APIOK()) && (g_bFinishDone == false)) {
		SCOReportSessionTime()
		if (g_bSetCompletedAutomatically){
			SCOSetStatusCompleted();
		}
		if (typeof(SCOSaveData) != "undefined"){
			// SCOInitData 함수를 다른 SCO 스크립트에서 정의할 수 있습니다.
			SCOSaveData();
		}
		g_bFinishDone = (g_objAPI.LMSFinish("") == "true");
	}
	return (g_bFinishDone + "" ) // 유형을 문자열로 고정시킵니다.
}

// API 어댑터를 직접 호출하지 않고 Catcher 함수를 호출합니다.
function SCOGetValue(nam)			{return ((APIOK())?g_objAPI.LMSGetValue(nam.toString()):"")}
function SCOCommit()					{return ((APIOK())?g_objAPI.LMSCommit(""):"false")}
function SCOGetLastError()		{return ((APIOK())?g_objAPI.LMSGetLastError():"-1")}
function SCOGetErrorString(n)	{return ((APIOK())?g_objAPI.LMSGetErrorString(n):"No API")}
function SCOGetDiagnostic(p)	{return ((APIOK())?g_objAPI.LMSGetDiagnostic(p):"No API")}

// LMSSetValue는 다음과 같이 복잡한 데이터관리 논리를 사용하여 구현됩니다.

var g_bMinScoreAcquired = false;
var g_bMaxScoreAcquired = false;

// 여기서부터 특수 논리가 시작됩니다.
function SCOSetValue(nam,val){
	var err = "";
	if (!APIOK()){
			AlertUserOfAPIError(g_strAPISetError + "\n" + nam + "\n" + val);
			err = "false"
	} else if (nam == "cmi.core.score.raw") err = privReportRawScore(val)
	if (err == ""){
			err = g_objAPI.LMSSetValue(nam,val.toString() + "");
			if (err != "true") return err
	}
	if (nam == "cmi.core.score.min"){
		g_bMinScoreAcquired = true;
		g_nSCO_ScoreMin = val
	}
	else if (nam == "cmi.core.score.max"){
		g_bMaxScoreAcquired = true;
		g_nSCO_ScoreMax = val
	}
	return err
}

function privReportRawScore(nRaw) { // SCOSetValue에 의해서만 호출됩니다.
	if (isNaN(nRaw)) return "false";
	if (!g_bMinScoreAcquired){
		if (g_objAPI.LMSSetValue("cmi.core.score.min",g_nSCO_ScoreMin+"")!= "true") return "false"
	}
	if (!g_bMaxScoreAcquired){
		if (g_objAPI.LMSSetValue("cmi.core.score.max",g_nSCO_ScoreMax+"")!= "true") return "false"
	}
	if (g_objAPI.LMSSetValue("cmi.core.score.raw", nRaw)!= "true") return "false";
	g_bMinScoreAcquired = false;
	g_bMaxScoreAcquired = false;
	if (!g_bMasteryScoreInitialized){
		var nMasteryScore = parseInt(SCOGetValue("cmi.student_data.mastery_score"),10);
		if (!isNaN(nMasteryScore)) g_SCO_MasteryScore = nMasteryScore
	}
  	if ((g_bInterpretMasteryScore)&&(!isNaN(g_SCO_MasteryScore))){
    	var stat = (nRaw >= g_SCO_MasteryScore? "passed" : "failed");
    	if (SCOSetValue("cmi.core.lesson_status",stat) != "true") return "false";
  	}
  	return "true"
}

function MillisecondsToCMIDuration(n) {
//기간을 밀리초에서 0000:00:00.00 형식으로 변환합니다.
	var hms = "";
	var dtm = new Date();	dtm.setTime(n);
	var h = "000" + Math.floor(n / 3600000);
	var m = "0" + dtm.getMinutes();
	var s = "0" + dtm.getSeconds();
	var cs = "0" + Math.round(dtm.getMilliseconds() / 10);
	hms = h.substr(h.length-4)+":"+m.substr(m.length-2)+":";
	hms += s.substr(s.length-2)+"."+cs.substr(cs.length-2);
	return hms
}

// SCOReportSessionTime은 이 스크립트에 의해 자동으로 호출됩니다.또한 사용자가 원하는 시기에 직접 SCO에서 호출할 수도 있습니다.
function SCOReportSessionTime() {
	var dtm = new Date();
	var n = dtm.getTime() - g_dtmInitialized.getTime();
	return SCOSetValue("cmi.core.session_time",MillisecondsToCMIDuration(n))
}

// SCO의 디자이너만 완료의 의미를 알고 있으므로 다른SCO 스크립트에서 이 함수를 호출하여 완료 상태로 설정할 수 있습니다.
// 함수는 SCO가 검색 모드가 아닌지 확인하고"전달" 또는 "실패" 상태를 덮어쓰지 않도록 방지합니다. 왜냐하면 "전달" 또는 "실패"는 모두 "완료"의 의미를 함축하기 때문입니다.
function SCOSetStatusCompleted(){
	var stat = SCOGetValue("cmi.core.lesson_status");
	if (SCOGetValue("cmi.core.lesson_mode") != "browse"){
		if ((stat!="completed") && (stat != "passed") && (stat != "failed")){
			return SCOSetValue("cmi.core.lesson_status","completed")
		}
	} else return "false"
}

// 객관적 관리 논리

function SCOSetObjectiveData(id, elem, v) {
	var result = "false";
	var i = SCOGetObjectiveIndex(id);
	if (isNaN(i)) {
		i = parseInt(SCOGetValue("cmi.objectives._count"));
		if (isNaN(i)) i = 0;
		if (SCOSetValue("cmi.objectives." + i + ".id", id) == "true"){
			result = SCOSetValue("cmi.objectives." + i + "." + elem, v)
		}
	} else {
		result = SCOSetValue("cmi.objectives." + i + "." + elem, v);
		if (result != "true") {
			// 이 LMS는 엔트리를 기록하는 것만 허용할 수 있습니다.
			i = parseInt(SCOGetValue("cmi.objectives._count"));
			if (!isNaN(i)) {
				if (SCOSetValue("cmi.objectives." + i + ".id", id) == "true"){
					result = SCOSetValue("cmi.objectives." + i + "." + elem, v)
				}
			}
		}
	}
	return result
}

function SCOGetObjectiveData(id, elem) {
	var i = SCOGetObjectiveIndex(id);
	if (!isNaN(i)) {
		return SCOGetValue("cmi.objectives." + i + "."+elem)
	}
	return ""
}

function SCOGetObjectiveIndex(id){
	var i = -1;
	var nCount = parseInt(SCOGetValue("cmi.objectives._count"));
	if (!isNaN(nCount)) {
		for (i = nCount-1; i >= 0; i--){ // LMS가 무연산 명령어를 기록하는 경우 카운트가 1씩 줄어듭니다.
			if (SCOGetValue("cmi.objectives." + i + ".id") == id) {
				return i
			}
		}
	}
	return NaN
}

// AICC 호환 토큰 또는 약자를 SCORM 토큰으로 변환하는 함수입니다.
function AICCTokenToSCORMToken(strList,strTest){
	var a = strList.split(",");
	var c = strTest.substr(0,1).toLowerCase();
	for (i=0;i<a.length;i++){
			if (c == a[i].substr(0,1)) return a[i]
	}
	return strTest
}

function normalizeStatus(status){
	return AICCTokenToSCORMToken("completed,incomplete,not attempted,failed,passed", status)
}

function normalizeInteractionType(theType){
	return AICCTokenToSCORMToken("true-false,choice,fill-in,matching,performance,sequencing,likert,numeric", theType)
}

function normalizeInteractionResult(result){
	return AICCTokenToSCORMToken("correct,wrong,unanticipated,neutral", result)
}

// Internet Explorer를 감지합니다.
var g_bIsInternetExplorer = navigator.appName.indexOf("Microsoft") != -1;

// Flash 동영상의 FSCommand 메시지를 처리하고 필요한 경우AICC Flash 템플릿 명령을 SCORM으로 다시 매핑합니다.
function $TI_DoFSCommand(command, args){

	var $TIObj = g_bIsInternetExplorer ? $TI : document.$TI;

	// SCORM API가 없는 경우에는 아무런 동작도 발생하지 않습니다.

	var myArgs = new String(args);
	var cmd = new String(command);
	var v = "";
	var err = "true";
	var arg1, arg2, n, s, i;
	var sep = myArgs.indexOf(",");
	if (sep > -1){
		arg1 = myArgs.substr(0, sep); // API에서 가져오는 데이터 요소 이름입니다.
		arg2 = myArgs.substr(sep+1) 	// 설정할 Flash 동영상 변수의 이름입니다.
	} else {
		arg1 = myArgs
	}
	if (!APIOK()) return;

	if (cmd.substring(0,3) == "LMS"){
		// "LMSxxx" FScommands(fsSCORM html 템플릿 호환)를 처리합니다.
		if ( cmd == "LMSInitialize" ){
			err = (APIOK() + "")
			// 실제 LMSInitialize는 템플릿에 의해 자동 호출됩니다.
		}	else if ( cmd == "LMSSetValue" ){
			err = SCOSetValue(arg1,arg2)
		} else if ( cmd == "LMSFinish" ){
			err = SCOFinish()
			// 템플릿에 의해 자동 처리되지만 동영상에서먼저 호출할 수 있습니다
		}	else if ( cmd == "LMSCommit" ){
			err = SCOCommit()
		}	else if ( cmd == "LMSFlush" ){
			// no-op
			// LMSFlush는 SCORM에 정의되어 있지 않으므로 이를 호출하면 테스트 그룹 오류가 발생합니다.
		}	else if ((arg2) && (arg2.length > 0)){
			if ( cmd == "LMSGetValue") {
				$TIObj.SetVariable(arg2, SCOGetValue(arg1));
			}	else if ( cmd == "LMSGetLastError") {
				$TIObj.SetVariable(arg2, SCOGetLastError(arg1));
			}	else if ( cmd == "LMSGetErrorString") {
				$TIObj.SetVariable(arg2, SCOGetLastError(arg1));
			}	else if ( cmd == "LMSGetDiagnostic") {
				$TIObj.SetVariable(arg2, SCOGetDiagnostic(arg1));
			}	else {
				// 이 LMS는 항목이 뒤로 이동하는 것을
				v = eval('g_objAPI.' + cmd + '(\"' + arg1 + '\")');
				$TIObj.SetVariable(arg2,v);
			}
		} else if (cmd.substring(0,3) == "LMSGet") {
			err = "-2: No Flash variable specified"
		}
		// "LMSxxx" 처리의 끝 부분입니다.
	} else if ((cmd.substring(0,6) == "MM_cmi")||(cmd.substring(0,6) == "CMISet")) {
		// Macromedia 학습 구성 요소 Fscommands를 처리합니다.
		// 이는 AICC HACP 데이터 모델 규약을 준수하므로필요한 경우 데이터를 AICC에서 SCORM으로 다시 매핑합니다.
		var F_intData = myArgs.split(";");
		if (cmd == "MM_cmiSendInteractionInfo") {
			n = SCOGetValue("cmi.interactions._count");
			s = "cmi.interactions." + n + ".";
			// SCORM 호환성 테스트 오류를 방지하기 위해 전체 오류를 Catch합니다.
			// 이 과정에 ID를 입력하지 않으면 기록이 불가능합니다.
			v = F_intData[2]
			if ((v == null) || (v == "")) err = 201; // ID가 없으면 기록은 불가능합니다.
			if (err =="true"){
				err = SCOSetValue(s + "id", v)
			}
			if (err =="true"){
				var re = new RegExp("[{}]","g")
				for (i=1; (i<9) && (err=="true"); i++){
					v = F_intData[i];
					if ((v == null) || (v == "")) continue
					if (i == 1){
						err = SCOSetValue(s + "time", v)
					} else if (i == 3){
						err = SCOSetValue(s + "objectives.0.id", v)
					} else if (i == 4){
						err = SCOSetValue(s + "type", normalizeInteractionType(v))
					} else if (i == 5){
						// 응답에서 "{" 및 "}" 제거
						v = v.replace(re, "");
						err = SCOSetValue(s + "correct_responses.0.pattern", v)
					} else if (i == 6){
						// 응답에서 "{" 및 "}" 제거
						v = v.replace(re, "");
						err = SCOSetValue(s + "student_response", v)
					} else if (i == 7){
						err = SCOSetValue(s + "result", normalizeInteractionResult(v))
					} else if (i == 8){
						err = SCOSetValue(s + "weighting", v)
					} else if (i == 9){
						err = SCOSetValue(s + "latency", v)
					}
				}
			}
		} else if (cmd == "MM_cmiSendObjectiveInfo"){
			err = SCOSetObjectiveData(F_intData[1], ".score.raw", F_intData[2])
			if (err=="true"){
				SCOSetObjectiveData(F_intData[1], ".status", normalizeStatus(F_intData[3]))
			}
		} else if ((cmd=="CMISetScore") ||(cmd=="MM_cmiSendScore")){
			err = SCOSetValue("cmi.core.score.raw", F_intData[0]);
		} else if ((cmd=="CMISetStatus") || (cmd=="MM_cmiSetLessonStatus")){
			err = SCOSetValue("cmi.core.lesson_status", normalizeStatus(F_intData[0]))
		} else if (cmd=="CMISetTime"){
			err = SCOSetValue("cmi.core.session_time", F_intData[0])
		} else if (cmd=="CMISetCompleted"){
			err = SCOSetStatusCompleted()
		} else if (cmd=="CMISetStarted"){
			err = SCOSetValue("cmi.core.lesson_status", "incomplete")
		} else if (cmd=="CMISetPassed"){
			err = SCOSetValue("cmi.core.lesson_status", "passed")
		} else if (cmd=="CMISetFailed"){
			err = SCOSetValue("cmi.core.lesson_status", "failed")
		} else if (cmd=="CMISetData"){
			err = SCOSetValue("cmi.suspend_data", F_intData[0])
		} else if (cmd=="CMISetLocation"){
			err = SCOSetValue("cmi.core.lesson_location", F_intData[0])
		} else if (cmd=="CMISetTimedOut"){
			err = SCOSetValue("cmi.core.exit", "time-out")
		} // 이 컨텍스트에서 다른 학습 구성 요소 Fscommands는 무연산 명령어입니다.
	} else {
		if (cmd=="CMIFinish" || cmd=="CMIExitAU"){
			err = SCOFinish()
		} else if (cmd=="CMIInitialize" || cmd=="MM_StartSession"){
			err = SCOInitialize()
		} else {
			// 알 수 없는 명령입니다. API Extension에서 호출한 명령일 수 있습니다.
			// 명령에 두 번째 인수가 있다면 값이 반환될 것입니다. otherwise assume it is just a cmd
			if (eval('g_objAPI.' + cmd)) {
				v = eval('g_objAPI.' + cmd + '(\"' + arg1 + '\")');
				if ((arg2) && (arg2.length > 0)){
					$TIObj.SetVariable(arg2,v)
				} else {
					err = v
				}
			} else {
				err = "false"
			}
		}
	}
	// 명령 변환 및 처리의 마지막 부분입니다.
	// LMS 오류 반환과 같이 감지된 오류를 처리합니다.
	if ((g_bShowApiErrors) && (err != "true")) {
		AlertUserOfAPIError(ExpandString(g_strFSAPIError, err, cmd, args))
	}
	return err
}
//-->
</script>
<body bgcolor="$BG" onload="SCOInitialize()" onunload="SCOFinish()" onbeforeunload="SCOFinish()">
<script type="text/javascript" language="JavaScript" name="earlyInit">
<!--
// HTML 페이지의 로딩이 완료되기 전에일부 ActionScript가 실행된 경우동영상를 로드하기 전에 API를 초기화할 것인지 여부를 결정합니다.
// 이것은 이 파일의 도입부에서 전역 부울(g_bInitializeOnLoad)을 설정하여 구성할 수 있습니다. 기본값은 TRUE입니다.
if (g_bInitializeOnLoad) {
	SCOInitialize()
}
//-->
</script>
<!-- 동영상에서 사용된 URL-->
$MU
<!-- 동영상에서 사용된 텍스트-->
$MT
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=$FV,$JR,$NR,0" id="$TI" width="$WI" height="$HE" align="$HA">
<param name="allowScriptAccess" value="sameDomain" />
$PO
<embed $PEwidth="$WI" height="$HE" name="$TI" align="$HA" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer_kr" />
</object>
</body>
</html>
