Commit 378677db authored by caicaicai's avatar caicaicai

修改

parent 5c3d3690
......@@ -316,6 +316,68 @@ var HttpReq = function(){
data:data,
})
},
//区域管理——区域类别设置
RegionalTypeQuery: function(param){
return request({
url: '/api/Area',
method: 'get',
params:param,
})
},
RegionalTypeAdd: function(data){
return request({
url: '/api/Area',
method: 'POST',
data:data,
}).then((res) => {
return res
})
},
RegionalTypeUpdate: function(data){
return request({
url: '/api/Area',
method: 'PUT',
data:data,
})
},
RegionalTypeDel: function(data){
return request({
url: '/api/Area',
method: 'Delete',
data:data,
})
},
//区域管理——区域信息设置
RegionalInformationQuery: function(param){
return request({
url: '/api/AreaNew',
method: 'get',
params:param,
})
},
RegionalInformationAdd: function(data){
return request({
url: '/api/AreaNew',
method: 'POST',
data:data,
}).then((res) => {
return res
})
},
RegionalInformationUpdate: function(data){
return request({
url: '/api/AreaNew',
method: 'PUT',
data:data,
})
},
RegionalInformationDel: function(data){
return request({
url: '/api/AreaNew',
method: 'Delete',
data:data,
})
},
......
<template>
<div style="background: white">
<el-container>
<el-header style="font-size: 20px; font-weight: bold"
>鑫海矿业监控视频</el-header
>
<el-container>
<el-aside width="230px" style="height: 86vh">
<el-tree
:data="videoData"
:props="defaultProps"
@node-click="handleNodeClick"
accordion
>
<div slot-scope="{ node }">
<span>
<i class="el-icon-video-camera-solid"> {{ node.label }}</i>
</span>
</div>
</el-tree>
</el-aside>
<el-main id="elMain">
<div v-if="isChildren1" class="iframeList">
<div v-for="(item,index) in itemList" :key="index" class="videoChildren">
<video :ref="item.ref" width="330" height="200" muted autoplay class="twelveVideo"></video>
</div>
</div>
<div v-if="btnChildren" class="btn1">
<el-button
:disabled="up"
@click="upPage"
style="background-color: #7bbfea; color: white"
>上一页</el-button
><el-button
:disabled="down"
@click="downPage"
style="background-color: #7bbfea; color: white"
>下一页</el-button
>
</div>
<div v-if="isChildren2">
<iframe :src="url" class="iframeSingle"></iframe>
</div>
<div v-show="noPtz">
<video id="noPtzVideo" width="1378" muted autoplay></video>
</div>
<div v-show="isChildren3" class="dahuaViews"></div>
</el-main>
</el-container>
</el-container>
</div>
</template>
<script>
// import Hls from "hls.js"
// import EZUIKit from "ezuikit-js";
// import { httpGet, httpPost, httpPostForJson } from "@/common/httpBean.js";
// import {
// mainCameraDetail,
// cameraDetailToken,
// cameraDetailDahuatoken,
// mainCamera,
// startCamera,
// stopCamera,
// cameraDetailYuntai,
// } from "@/axios/api.js";
var noPtzhls = null;
export default {
data() {
return {
videoData: [],
defaultProps: {
children: "children",
label: "label",
},
itemList: [],
itemListNext: [],
itemListMiddleman: [],
isChildren1: true,
isChildren2: false,
isChildren3: false,
btnChildren: false,
isIP: "",
// url: "http://127.0.0.1:5500/webs/cn/demo.html",
// url1: "http://127.0.0.1:5500/webs/cn/demo1.html",
url:"http://192.168.9.2:85/cn/demo.html?ip=",
url1:"http://192.168.9.2:85/cn/demo",
dahuaData: [],
up: true,
down: false,
accessToken:"",
noPtz:false,
};
},
mounted() {
this.getCode();
this.getDaHua();
this.getAccessToken();
},
methods: {
getAccessToken() {
httpGet(cameraDetailToken).then(res => {
this.accessToken = res.data.accessToken;
});
},
getCode() {
//分区数据
httpGet(mainCamera, { size: 999 }).then((res) => {
//console.log(res);
let data1 = [];
res.content.forEach((item) => {
item.label = item.name;
data1.push(item);
});
//this.videoData = data1;
if (res != "") {
//总摄像头数据
httpGet(mainCameraDetail, { size: 999 }).then((res) => {
let fenqu1 = [];
let fenqu2 = [];
let fenqu3 = [];
let fenquName = [];
res.content.forEach((item,index) => {
item.ref = "video" + index;
item.hls = null;
item.label = item.cameraName;
fenquName.push(item);
});
fenquName.forEach(function (item) {
if (item.cameraId == 1) {
fenqu1.push(item);
} else if (item.cameraId == 2) {
fenqu2.push(item);
} else {
fenqu3.push(item);
}
});
let videoData1 = data1;
videoData1.forEach((item) => {
if (item.id == 1) {
item.children = fenqu1;
} else if (item.id == 2) {
item.children = fenqu2;
} else {
item.children = fenqu3;
}
});
this.videoData = videoData1;
console.log(this.videoData);
});
}
});
},
handleNodeClick(data) {
console.log(data);
let that = this;
if (data.children) {
if (data.children[0].brand == 1) {
let temporaryData1 = [];
let temporaryData2 = [];
if (data.children.length > 12) {
for (let i = 0; i < 12; i++) {
temporaryData1.push(data.children[i]);
}
for (let j = 12; j < data.children.length; j++) {
temporaryData2.push(data.children[j]);
}
this.itemList = temporaryData1;
this.itemListNext = temporaryData2;
this.btnChildren = true;
this.$nextTick(()=>{
this.itemList.forEach(function(item,index){
item.hls = new Hls();
item.hls.loadSource(item.url)
item.hls.attachMedia(that.$refs[item.ref][0]);
item.hls.on(Hls.Events.MANIFEST_PARSED,function() {
      that.$refs[item.ref][0].play();
    });
})
})
if(noPtzhls != null){
noPtzhls.destroy();
}
} else {
this.btnChildren = false;
this.itemList = data.children;
this.$nextTick(()=>{
this.itemList.forEach(function(item,index){
item.hls = new Hls();
item.hls.loadSource(item.url)
item.hls.attachMedia(that.$refs[item.ref][0]);
item.hls.on(Hls.Events.MANIFEST_PARSED,function() {
      that.$refs[item.ref][0].play();
    });
})
})
if(noPtzhls != null){
noPtzhls.destroy();
}
}
this.isChildren1 = true;
this.isChildren2 = false;
this.isChildren3 = false;
this.up = true;
this.down = false;
this.noPtz = false;
//改变视频大小
this.$nextTick(()=>{
this.winSize();
})
} else if (data.children[0].brand == 2) {
this.isChildren1 = false;
this.isChildren2 = false;
this.isChildren3 = true;
this.btnChildren = false;
this.noPtz = false;
if(noPtzhls != null){
noPtzhls.destroy();
}
let dahuaViews = document.querySelector(".dahuaViews");
dahuaViews.innerHTML = `<div><div id="dahuaVideo0"></div></div>
<div><div id="dahuaVideo1"></div></div>
<div><div id="dahuaVideo2"></div></div>
<div><div id="dahuaVideo3"></div></div>`;
var player = this.$cyberplayerJs(`dahuaVideo0`).setup({
width: 340, // 宽度,也可以支持百分比(不过父元素宽度要有)
height: 210, // 高度,也可以支持百分比
title: "", // 标题
isLive: true, // 必须设置,表明是直播视频
file: that.dahuaData[0].url, //您的视频源的地址(目前是乐橙示例播放地址)
image: "", // 预览图
autostart: true, // 是否自动播放
stretching: "uniform", // 拉伸设置
repeat: false, // 是否重复播放
volume: 0, // 音量,注:仅当用户同意、网站由用户激活或媒体无声时允许自动播放
controls: false, // 是否显示控制栏
hls: {
reconnecttime: 5, // hls直播重连间隔秒数
},
ak: "39f82ac87fc3462ea4dcc78734450f57", // 百度智能云平台注册(https://cloud.baidu.com)即可获得accessKey
});
var player = this.$cyberplayerJs(`dahuaVideo1`).setup({
width: 340, // 宽度,也可以支持百分比(不过父元素宽度要有)
height: 210, // 高度,也可以支持百分比
title: "", // 标题
isLive: true, // 必须设置,表明是直播视频
file: that.dahuaData[1].url, //您的视频源的地址(目前是乐橙示例播放地址)
image: "", // 预览图
autostart: true, // 是否自动播放
stretching: "uniform", // 拉伸设置
repeat: false, // 是否重复播放
volume: 0, // 音量,注:仅当用户同意、网站由用户激活或媒体无声时允许自动播放
controls: false, // 是否显示控制栏
hls: {
reconnecttime: 5, // hls直播重连间隔秒数
},
ak: "39f82ac87fc3462ea4dcc78734450f57", // 百度智能云平台注册(https://cloud.baidu.com)即可获得accessKey
});
var player = this.$cyberplayerJs(`dahuaVideo2`).setup({
width: 340, // 宽度,也可以支持百分比(不过父元素宽度要有)
height: 210, // 高度,也可以支持百分比
title: "", // 标题
isLive: true, // 必须设置,表明是直播视频
file: that.dahuaData[2].url, //您的视频源的地址(目前是乐橙示例播放地址)
image: "", // 预览图
autostart: true, // 是否自动播放
stretching: "uniform", // 拉伸设置
repeat: false, // 是否重复播放
volume: 0, // 音量,注:仅当用户同意、网站由用户激活或媒体无声时允许自动播放
controls: false, // 是否显示控制栏
hls: {
reconnecttime: 5, // hls直播重连间隔秒数
},
ak: "39f82ac87fc3462ea4dcc78734450f57", // 百度智能云平台注册(https://cloud.baidu.com)即可获得accessKey
});
var player = this.$cyberplayerJs(`dahuaVideo3`).setup({
width: 340, // 宽度,也可以支持百分比(不过父元素宽度要有)
height: 210, // 高度,也可以支持百分比
title: "", // 标题
isLive: true, // 必须设置,表明是直播视频
file: that.dahuaData[3].url, //您的视频源的地址(目前是乐橙示例播放地址)
image: "", // 预览图
autostart: true, // 是否自动播放
stretching: "uniform", // 拉伸设置
repeat: false, // 是否重复播放
volume: 0, // 音量,注:仅当用户同意、网站由用户激活或媒体无声时允许自动播放
controls: false, // 是否显示控制栏
hls: {
reconnecttime: 5, // hls直播重连间隔秒数
},
ak: "39f82ac87fc3462ea4dcc78734450f57", // 百度智能云平台注册(https://cloud.baidu.com)即可获得accessKey
});
}
} else {
this.btnChildren = false;
if (data.brand == 1) {
httpGet(cameraDetailYuntai, {ip:data.cameraIp}).then((res) => {
if(!res){
let noPtzVideo = document.getElementById('noPtzVideo');
noPtzhls = new Hls();
    noPtzhls.loadSource(data.url);
    noPtzhls.attachMedia(noPtzVideo);
    noPtzhls.on(Hls.Events.MANIFEST_PARSED,function() {
noPtzVideo.play();
    });
this.isChildren1 = false;
this.isChildren2 = false;
this.isChildren3 = false;
this.btnChildren = false;
this.noPtz = true;
}else{
this.url = "";
let originalUrl = "http://192.168.9.2:85/cn/demo.html?ip=";
// let originalUrl = "http://127.0.0.1:5500/webs/cn/demo.html?ip=";
this.isChildren1 = false;
this.isChildren2 = true;
this.isChildren3 = false;
this.isIP = data.cameraIp;
this.url = originalUrl + data.cameraIp;
this.btnChildren = false;
this.noPtz = false;
if(noPtzhls != null){
noPtzhls.destroy();
}
}
})
} else if (data.brand == 2) {
this.isChildren1 = false;
this.isChildren2 = false;
this.isChildren3 = true;
this.btnChildren = false;
this.noPtz = false;
if(noPtzhls != null){
noPtzhls.destroy();
}
let dahuaViews = document.querySelector(".dahuaViews");
dahuaViews.innerHTML = '<div id="dahuaVideoAlone"></div>';
var player = this.$cyberplayerJs(`dahuaVideoAlone`).setup({
width: 1390, // 宽度,也可以支持百分比(不过父元素宽度要有)
height: 760, // 高度,也可以支持百分比
title: "", // 标题
isLive: true, // 必须设置,表明是直播视频
file: data.url, //您的视频源的地址(目前是乐橙示例播放地址)
image: "", // 预览图
autostart: true, // 是否自动播放
stretching: "uniform", // 拉伸设置
repeat: false, // 是否重复播放
volume: 0, // 音量,注:仅当用户同意、网站由用户激活或媒体无声时允许自动播放
controls: false, // 是否显示控制栏
hls: {
reconnecttime: 5, // hls直播重连间隔秒数
},
ak: "39f82ac87fc3462ea4dcc78734450f57", // 百度智能云平台注册(https://cloud.baidu.com)即可获得accessKey
});
}
}
},
getDaHua() {
httpGet(mainCameraDetail, { page: 0, size: 100 }).then((res) => {
let that = this;
let dahua = [];
res.content.forEach(function (item) {
if (item.brand == 2) {
dahua.push(item);
}
});
this.dahuaData = dahua;
});
},
upPage() {
let that = this;
this.up = true;
this.down = false;
this.itemList = this.itemListMiddleman;
this.$nextTick(()=>{
this.itemList.forEach(function(item,index){
item.hls = new Hls();
item.hls.loadSource(item.url)
item.hls.attachMedia(that.$refs[item.ref][0]);
item.hls.on(Hls.Events.MANIFEST_PARSED,function() {
that.$refs[item.ref][0].play();
});
})
})
//改变视频大小
this.$nextTick(()=>{
this.winSize();
})
},
downPage() {
let that = this;
this.itemListMiddleman = this.itemList;
this.itemList = [];
this.up = false;
this.down = true;
this.itemList = this.itemListNext;
this.$nextTick(()=>{
this.itemList.forEach(function(item,index){
item.hls = new Hls();
item.hls.loadSource(item.url)
item.hls.attachMedia(that.$refs[item.ref][0]);
item.hls.on(Hls.Events.MANIFEST_PARSED,function() {
that.$refs[item.ref][0].play();
});
})
})
//改变视频大小
this.$nextTick(()=>{
this.winSize();
})
},
//监控el-main大小
winSize(){
let elMain = document.getElementById('elMain');
let elMainWight = parseInt(getComputedStyle(elMain).width) ;
if(elMainWight > 1650){
let twelveVideo = document.getElementsByClassName('twelveVideo');
for(let i = 0;i < twelveVideo.length;i++){
twelveVideo[i].width = 450;
twelveVideo[i].height = 320;
}
}
}
},
// 销毁
destroyed() {
this.itemList.forEach(function(item,index){
item.hls.destroy();
})
if(noPtzhls != null){
noPtzhls.destroy();
}
}
};
</script>
<style>
.mianBodysSon{
width: 100%;
display:flex;
flex-wrap:wrap;
justify-content: center;
}
.btn1 {
position: absolute;
top: 92%;
left: 57%;
}
.dahuaViews {
display: flex;
flex-wrap: wrap;
margin-left: 5px;
}
.dahuaViews>div{
margin-left: 1px;
border: 1px greenyellow solid;
}
.videoChildren {
scrollbar-width: none;
}
.el-header,
.el-footer {
background-color: #7bbfea;
color: white;
text-align: center;
letter-spacing: 10px;
font-size: 25px !important;
line-height: 60px;
}
.el-aside::-webkit-scrollbar {
display: none;
}
.el-aside {
scrollbar-width: none;
}
.el-aside {
background-color: #fffef9;
color: #333;
text-align: center;
}
.el-main {
background-color: white;
color: #333;
text-align: center;
height: 86vh;
overflow:hidden;
}
.el-tree-node__content {
height: 55px;
background-color: #e9eef3;
width: 228px;
}
.el-tree-node {
background-color: #e9eef3;
border: 1px solid #d3d7d4;
}
.el-tree-node__content:hover {
background-color: white;
}
.iframeList {
display: flex;
flex-wrap: wrap;
align-content: center;
padding-left: 25px;
box-sizing: border-box;
}
.iframeList>div{
border: 1px greenyellow solid;
}
.iframeItem {
height: 220px;
width: 340px;
background: #fff;
margin-bottom: 0px;
}
.iframeItem::-webkit-scrollbar {
display: none;
}
.iframeItem {
scrollbar-width: none;
}
@-moz-document url-prefix() {
.iframeItem {
border: 1px solid palegreen;
}
}
.iframeSingle {
width: 1378px;
height: 763px;
}
</style>
(function() {
var Nr = 10;
// convert two-dimensional indicies to one-dim array indices
var I00 = 0;
var I01 = 1;
var I02 = 2;
var I03 = 3;
var I10 = 4;
var I11 = 5;
var I12 = 6;
var I13 = 7;
var I20 = 8;
var I21 = 9;
var I22 = 10;
var I23 = 11;
var I30 = 12;
var I31 = 13;
var I32 = 14;
var I33 = 15;
// S-Box substitution table
var S_enc = new Array(
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16);
// inverse S-Box for decryptions
var S_dec = new Array(
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,
0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d,
0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,
0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,
0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea,
0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,
0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20,
0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31,
0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0,
0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,
0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d);
function cvt_hex8 (val) {
var vh = (val>>>4)&0x0f;
return vh.toString(16) + (val&0x0f).toString(16);
}
function cvt_byte (str) {
// get the first hex digit
var val1 = str.charCodeAt(0);
// do some error checking
if (val1 >= 48 && val1 <= 57) {
// have a valid digit 0-9
val1 -= 48;
} else if (val1 >= 65 && val1 <= 70) {
// have a valid digit A-F
val1 -= 55;
} else if (val1 >= 97 && val1 <= 102) {
// have a valid digit A-F
val1 -= 87;
} else {
// not 0-9 or A-F, complain
console.log( str.charAt(1)+" is not a valid hex digit" );
return -1;
}
// get the second hex digit
var val2 = str.charCodeAt(1);
// do some error checking
if ( val2 >= 48 && val2 <= 57 ) {
// have a valid digit 0-9
val2 -= 48;
} else if ( val2 >= 65 && val2 <= 70 ) {
// have a valid digit A-F
val2 -= 55;
} else if ( val2 >= 97 && val2 <= 102 ) {
// have a valid digit A-F
val2 -= 87;
} else {
// not 0-9 or A-F, complain
console.log( str.charAt(2)+" is not a valid hex digit" );
return -1;
}
// all is ok, return the value
return val1*16 + val2;
}
// conversion function for non-constant subscripts
// assume subscript range 0..3
function I(x,y) {
return (x*4) + y;
}
// remove spaces from input
function remove_spaces(instr) {
var i;
var outstr = "";
for(i=0; i<instr.length; i++) {
if ( instr.charAt(i) != " " )
// not a space, include it
outstr += instr.charAt(i);
}
return outstr;
}
// get the message to encrypt/decrypt or the key
// return as a 16-byte array
function get_value(str, isASCII) {
var dbyte = new Array(16);
var i;
var val; // one hex digit
if (isASCII) {
// check length of data
if (str.length > 16) {
console.log("is too long, using the first 16 ASCII characters" );
}
// have ASCII data
// 16 characters?
if (str.length >= 16) {
// 16 or more characters
for(i=0; i<16; i++) {
dbyte[i] = str.charCodeAt(i);
}
} else {
// less than 16 characters - fill with NULLs
for(i=0; i<str.length; i++) {
dbyte[i] = str.charCodeAt(i);
}
for( i=str.length; i<16; i++) {
dbyte[i] = 0;
}
}
} else {
// have hex data - remove any spaces they used, then convert
//str = remove_spaces(str);
// check length of data
if ( str.length != 32 ) {
//console.log("\tget_value:\tstr = " + str + "\tisASCII = " + isASCII); //isASCII = false
console.log("length wrong: Is " + str.length + " hex digits, but must be 128 bits (32 hex digits)");
dbyte[0] = -1;
return dbyte;
}
for( i=0; i<16; i++ ) {
// isolate and convert this substring
dbyte[i] = cvt_byte( str.substr(i*2,2) );
if( dbyte[i] < 0 ) {
// have an error
dbyte[0] = -1;
return dbyte;
}
}
}
// return successful conversion
return dbyte;
}
//do the AES GF(2**8) multiplication
// do this by the shift-and-"add" approach
function aes_mul(a, b) {
var res = 0;
while(a > 0) {
if((a&1) != 0)
res = res ^ b; // "add" to the result
a >>>= 1; // shift a to get next higher-order bit
b <<= 1; // shift multiplier also
}
// now reduce it modulo x**8 + x**4 + x**3 + x + 1
var hbit = 0x10000; // bit to test if we need to take action
var modulus = 0x11b00; // modulus - XOR by this to change value
while(hbit >= 0x100) {
if ((res & hbit) != 0) {
res ^= modulus; // XOR with the modulus
}
// prepare for the next loop
hbit >>= 1;
modulus >>= 1;
}
return res;
}
// apply the S-box substitution to the key expansion
function SubWord(word_ary) {
var i;
for(i=0; i<16; i++) {
word_ary[i] = S_enc[word_ary[i]];
}
return word_ary;
}
// rotate the bytes in a word
function RotWord(word_ary) {
return new Array(word_ary[1], word_ary[2], word_ary[3], word_ary[0]);
}
// calculate the first item Rcon[i] = { x^(i-1), 0, 0, 0 }
// note we only return the first item
function Rcon(exp) {
var val = 2;
var result = 1;
// remember to calculate x^(exp-1)
exp--;
// process the exponent using normal shift and multiply
while ( exp > 0 )
{
if ( (exp & 1) != 0 )
result = aes_mul( result, val );
// square the value
val = aes_mul( val, val );
// move to the next bit
exp >>= 1;
}
return result;
}
// round key generation
// return a byte array with the expanded key information
function key_expand( key )
{
var temp = new Array(4);
var i, j;
var w = new Array(4*(Nr+1));
// copy initial key stuff
for( i=0; i<16; i++ )
{
w[i] = key[i];
}
// generate rest of key schedule using 32-bit words
i = 4;
while ( i < 4*(Nr+1)) // blocksize * ( rounds + 1 )
{
// copy word W[i-1] to temp
for( j=0; j<4; j++ )
temp[j] = w[(i-1)*4+j];
if ( i % 4 == 0)
{
// temp = SubWord(RotWord(temp)) ^ Rcon[i/4];
temp = RotWord( temp );
temp = SubWord( temp );
temp[0] ^= Rcon( i>>>2 );
}
// word = word ^ temp
for( j=0; j<4; j++ )
w[i*4+j] = w[(i-4)*4+j] ^ temp[j];
i++;
}
return w;
}
// do S-Box substitution
function SubBytes(state, Sbox)
{
var i;
for( i=0; i<16; i++ )
state[i] = Sbox[ state[i] ];
return state;
}
// shift each row as appropriate
function ShiftRows(state)
{
var t0, t1, t2, t3;
// top row (row 0) isn't shifted
// next row (row 1) rotated left 1 place
t0 = state[I10];
t1 = state[I11];
t2 = state[I12];
t3 = state[I13];
state[I10] = t1;
state[I11] = t2;
state[I12] = t3;
state[I13] = t0;
// next row (row 2) rotated left 2 places
t0 = state[I20];
t1 = state[I21];
t2 = state[I22];
t3 = state[I23];
state[I20] = t2;
state[I21] = t3;
state[I22] = t0;
state[I23] = t1;
// bottom row (row 3) rotated left 3 places
t0 = state[I30];
t1 = state[I31];
t2 = state[I32];
t3 = state[I33];
state[I30] = t3;
state[I31] = t0;
state[I32] = t1;
state[I33] = t2;
return state;
}
// inverset shift each row as appropriate
function InvShiftRows(state)
{
var t0, t1, t2, t3;
// top row (row 0) isn't shifted
// next row (row 1) rotated left 1 place
t0 = state[I10];
t1 = state[I11];
t2 = state[I12];
t3 = state[I13];
state[I10] = t3;
state[I11] = t0;
state[I12] = t1;
state[I13] = t2;
// next row (row 2) rotated left 2 places
t0 = state[I20];
t1 = state[I21];
t2 = state[I22];
t3 = state[I23];
state[I20] = t2;
state[I21] = t3;
state[I22] = t0;
state[I23] = t1;
// bottom row (row 3) rotated left 3 places
t0 = state[I30];
t1 = state[I31];
t2 = state[I32];
t3 = state[I33];
state[I30] = t1;
state[I31] = t2;
state[I32] = t3;
state[I33] = t0;
return state;
}
// process column info
function MixColumns(state)
{
var col;
var c0, c1, c2, c3;
for( col=0; col<4; col++ )
{
c0 = state[I(0,col)];
c1 = state[I(1,col)];
c2 = state[I(2,col)];
c3 = state[I(3,col)];
// do mixing, and put back into array
state[I(0,col)] = aes_mul(2,c0) ^ aes_mul(3,c1) ^ c2 ^ c3;
state[I(1,col)] = c0 ^ aes_mul(2,c1) ^ aes_mul(3,c2) ^ c3;
state[I(2,col)] = c0 ^ c1 ^ aes_mul(2,c2) ^ aes_mul(3,c3);
state[I(3,col)] = aes_mul(3,c0) ^ c1 ^ c2 ^ aes_mul(2,c3);
}
return state;
}
// inverse process column info
function InvMixColumns(state)
{
var col;
var c0, c1, c2, c3;
for( col=0; col<4; col++ )
{
c0 = state[I(0,col)];
c1 = state[I(1,col)];
c2 = state[I(2,col)];
c3 = state[I(3,col)];
// do inverse mixing, and put back into array
state[I(0,col)] = aes_mul(0x0e,c0) ^ aes_mul(0x0b,c1)
^ aes_mul(0x0d,c2) ^ aes_mul(0x09,c3);
state[I(1,col)] = aes_mul(0x09,c0) ^ aes_mul(0x0e,c1)
^ aes_mul(0x0b,c2) ^ aes_mul(0x0d,c3);
state[I(2,col)] = aes_mul(0x0d,c0) ^ aes_mul(0x09,c1)
^ aes_mul(0x0e,c2) ^ aes_mul(0x0b,c3);
state[I(3,col)] = aes_mul(0x0b,c0) ^ aes_mul(0x0d,c1)
^ aes_mul(0x09,c2) ^ aes_mul(0x0e,c3);
}
return state;
}
// insert subkey information
function AddRoundKey( state, w, base )
{
var col;
for( col=0; col<4; col++ )
{
state[I(0,col)] ^= w[base+col*4];
state[I(1,col)] ^= w[base+col*4+1];
state[I(2,col)] ^= w[base+col*4+2];
state[I(3,col)] ^= w[base+col*4+3];
}
return state;
}
// return a transposed array
function transpose( msg )
{
var row, col;
var state = new Array( 16 );
for( row=0; row<4; row++ )
for( col=0; col<4; col++ )
state[I(row,col)] = msg[I(col,row)];
return state;
}
// final AES state
var AES_output = new Array(16);
// format AES output
// -- uses the global array DES_output
function format_AES_output(bASCII)
{
var i;
var bits;
var str="";
// what type of data do we have to work with?
if (bASCII)
{
// convert each set of bits back to ASCII
for( i=0; i<16; i++ )
str += String.fromCharCode( AES_output[i] );
}
else
{
// output hexdecimal data (insert spaces)
str = cvt_hex8( AES_output[0] );
for( i=1; i<16; i++ )
{
str += "" + cvt_hex8( AES_output[i] );
}
}
return str;
}
// do encrytion
function aes_encrypt(str, key, bASCII)
{
//console.log(" aes_encrypt:\tstr = " + str + "\tkey = " + key + "\t bASCII = " + bASCII);
var w = new Array( 4*(Nr+1) ); // subkey information
var state = new Array( 16 ); // working state
var round;
//accumulated_output_info = "";
// get the message from the user
// also check if it is ASCII or hex
var msg = get_value(str, bASCII);
// problems??
if ( msg[0] < 0 )
{
return;
}
// get the key from the user
var key = get_value(key, false);
// problems??
if ( key[0] < 0 )
{
return;
}
// expand the key
w = key_expand( key );
// initial state = message in columns (transposed from what we input)
state = transpose( msg );
// display the round key - Transpose due to the way it is stored/used
state = AddRoundKey(state, w, 0);
for( round=1; round<Nr; round++ )
{
state = SubBytes(state, S_enc);
state = ShiftRows(state);
state = MixColumns(state);
// display the round key - Transpose due to the way it is stored/used
// note here the spec uses 32-bit words, we are using bytes, so an extra *4
state = AddRoundKey(state, w, round*4*4);
}
SubBytes(state, S_enc);
ShiftRows(state);
AddRoundKey(state, w, Nr*4*4);
// process output
AES_output = transpose( state );
var szOutput = format_AES_output(!bASCII);
return szOutput;
}
// do decryption
function aes_decrypt(str, key, bASCII)
{
//console.log(" aes_decrypt:\tstr = " + str + "\tkey = " + key + "\tbASCII = " + bASCII);
var w = new Array( 4*(Nr+1) ); // subkey information
var state = new Array( 16 ); // working state
var round;
//accumulated_output_info = "";
// get the message from the user
// also check if it is ASCII or hex
var msg = get_value(str, bASCII);
// problems??
if ( msg[0] < 0 )
{
return;
}
// get the key from the user
var key = get_value(key, false);
// problems??
if ( key[0] < 0 )
{
return;
}
// expand the key
w = key_expand( key );
// initial state = message
state = transpose( msg );
// display the round key - Transpose due to the way it is stored/used
state = AddRoundKey(state, w, Nr*4*4);
for( round=Nr-1; round>=1; round-- )
{
state = InvShiftRows(state);
state = SubBytes(state, S_dec);
// display the round key - Transpose due to the way it is stored/used
// note here the spec uses 32-bit words, we are using bytes, so an extra *4
state = AddRoundKey(state, w, round*4*4);
state = InvMixColumns(state);
}
InvShiftRows(state);
SubBytes(state, S_dec);
AddRoundKey(state, w, 0);
// process output
AES_output = transpose( state );
var szOutput = format_AES_output(!bASCII);
return szOutput;
}
window.aes_encrypt = aes_encrypt;
window.aes_decrypt = aes_decrypt;
window.console = window.console || {
log: function() {}
};
}());
\ No newline at end of file
var dbits,canary=244837814094590,j_lm=(canary&16777215)==15715070;function BigInteger(a,b,c){a!=null&&("number"==typeof a?this.fromNumber(a,b,c):b==null&&"string"!=typeof a?this.fromString(a,256):this.fromString(a,b))}function nbi(){return new BigInteger(null)}function am1(a,b,c,d,e,g){for(;--g>=0;){var h=b*this[a++]+c[d]+e,e=Math.floor(h/67108864);c[d++]=h&67108863}return e}
function am2(a,b,c,d,e,g){var h=b&32767;for(b>>=15;--g>=0;){var f=this[a]&32767,o=this[a++]>>15,p=b*f+o*h,f=h*f+((p&32767)<<15)+c[d]+(e&1073741823),e=(f>>>30)+(p>>>15)+b*o+(e>>>30);c[d++]=f&1073741823}return e}function am3(a,b,c,d,e,g){var h=b&16383;for(b>>=14;--g>=0;){var f=this[a]&16383,o=this[a++]>>14,p=b*f+o*h,f=h*f+((p&16383)<<14)+c[d]+e,e=(f>>28)+(p>>14)+b*o;c[d++]=f&268435455}return e}
j_lm&&navigator.appName=="Microsoft Internet Explorer"?(BigInteger.prototype.am=am2,dbits=30):j_lm&&navigator.appName!="Netscape"?(BigInteger.prototype.am=am1,dbits=26):(BigInteger.prototype.am=am3,dbits=28);BigInteger.prototype.DB=dbits;BigInteger.prototype.DM=(1<<dbits)-1;BigInteger.prototype.DV=1<<dbits;var BI_FP=52;BigInteger.prototype.FV=Math.pow(2,BI_FP);BigInteger.prototype.F1=BI_FP-dbits;BigInteger.prototype.F2=2*dbits-BI_FP;var BI_RM="0123456789abcdefghijklmnopqrstuvwxyz",BI_RC=[],rr,vv;
rr="0".charCodeAt(0);for(vv=0;vv<=9;++vv)BI_RC[rr++]=vv;rr="a".charCodeAt(0);for(vv=10;vv<36;++vv)BI_RC[rr++]=vv;rr="A".charCodeAt(0);for(vv=10;vv<36;++vv)BI_RC[rr++]=vv;function int2char(a){return BI_RM.charAt(a)}function intAt(a,b){var c=BI_RC[a.charCodeAt(b)];return c==null?-1:c}function bnpCopyTo(a){for(var b=this.t-1;b>=0;--b)a[b]=this[b];a.t=this.t;a.s=this.s}function bnpFromInt(a){this.t=1;this.s=a<0?-1:0;a>0?this[0]=a:a<-1?this[0]=a+DV:this.t=0}
function nbv(a){var b=nbi();b.fromInt(a);return b}
function bnpFromString(a,b){var c;if(b==16)c=4;else if(b==8)c=3;else if(b==256)c=8;else if(b==2)c=1;else if(b==32)c=5;else if(b==4)c=2;else{this.fromRadix(a,b);return}this.s=this.t=0;for(var d=a.length,e=!1,g=0;--d>=0;){var h=c==8?a[d]&255:intAt(a,d);h<0?a.charAt(d)=="-"&&(e=!0):(e=!1,g==0?this[this.t++]=h:g+c>this.DB?(this[this.t-1]|=(h&(1<<this.DB-g)-1)<<g,this[this.t++]=h>>this.DB-g):this[this.t-1]|=h<<g,g+=c,g>=this.DB&&(g-=this.DB))}if(c==8&&(a[0]&128)!=0)this.s=-1,g>0&&(this[this.t-1]|=(1<<
this.DB-g)-1<<g);this.clamp();e&&BigInteger.ZERO.subTo(this,this)}function bnpClamp(){for(var a=this.s&this.DM;this.t>0&&this[this.t-1]==a;)--this.t}
function bnToString(a){if(this.s<0)return"-"+this.negate().toString(a);if(a==16)a=4;else if(a==8)a=3;else if(a==2)a=1;else if(a==32)a=5;else if(a==64)a=6;else if(a==4)a=2;else return this.toRadix(a);var b=(1<<a)-1,c,d=!1,e="",g=this.t,h=this.DB-g*this.DB%a;if(g-- >0){if(h<this.DB&&(c=this[g]>>h)>0)d=!0,e=int2char(c);for(;g>=0;)h<a?(c=(this[g]&(1<<h)-1)<<a-h,c|=this[--g]>>(h+=this.DB-a)):(c=this[g]>>(h-=a)&b,h<=0&&(h+=this.DB,--g)),c>0&&(d=!0),d&&(e+=int2char(c))}return d?e:"0"}
function bnNegate(){var a=nbi();BigInteger.ZERO.subTo(this,a);return a}function bnAbs(){return this.s<0?this.negate():this}function bnCompareTo(a){var b=this.s-a.s;if(b!=0)return b;var c=this.t,b=c-a.t;if(b!=0)return b;for(;--c>=0;)if((b=this[c]-a[c])!=0)return b;return 0}function nbits(a){var b=1,c;if((c=a>>>16)!=0)a=c,b+=16;if((c=a>>8)!=0)a=c,b+=8;if((c=a>>4)!=0)a=c,b+=4;if((c=a>>2)!=0)a=c,b+=2;a>>1!=0&&(b+=1);return b}
function bnBitLength(){return this.t<=0?0:this.DB*(this.t-1)+nbits(this[this.t-1]^this.s&this.DM)}function bnpDLShiftTo(a,b){var c;for(c=this.t-1;c>=0;--c)b[c+a]=this[c];for(c=a-1;c>=0;--c)b[c]=0;b.t=this.t+a;b.s=this.s}function bnpDRShiftTo(a,b){for(var c=a;c<this.t;++c)b[c-a]=this[c];b.t=Math.max(this.t-a,0);b.s=this.s}
function bnpLShiftTo(a,b){var c=a%this.DB,d=this.DB-c,e=(1<<d)-1,g=Math.floor(a/this.DB),h=this.s<<c&this.DM,f;for(f=this.t-1;f>=0;--f)b[f+g+1]=this[f]>>d|h,h=(this[f]&e)<<c;for(f=g-1;f>=0;--f)b[f]=0;b[g]=h;b.t=this.t+g+1;b.s=this.s;b.clamp()}
function bnpRShiftTo(a,b){b.s=this.s;var c=Math.floor(a/this.DB);if(c>=this.t)b.t=0;else{var d=a%this.DB,e=this.DB-d,g=(1<<d)-1;b[0]=this[c]>>d;for(var h=c+1;h<this.t;++h)b[h-c-1]|=(this[h]&g)<<e,b[h-c]=this[h]>>d;d>0&&(b[this.t-c-1]|=(this.s&g)<<e);b.t=this.t-c;b.clamp()}}
function bnpSubTo(a,b){for(var c=0,d=0,e=Math.min(a.t,this.t);c<e;)d+=this[c]-a[c],b[c++]=d&this.DM,d>>=this.DB;if(a.t<this.t){for(d-=a.s;c<this.t;)d+=this[c],b[c++]=d&this.DM,d>>=this.DB;d+=this.s}else{for(d+=this.s;c<a.t;)d-=a[c],b[c++]=d&this.DM,d>>=this.DB;d-=a.s}b.s=d<0?-1:0;d<-1?b[c++]=this.DV+d:d>0&&(b[c++]=d);b.t=c;b.clamp()}
function bnpMultiplyTo(a,b){var c=this.abs(),d=a.abs(),e=c.t;for(b.t=e+d.t;--e>=0;)b[e]=0;for(e=0;e<d.t;++e)b[e+c.t]=c.am(0,d[e],b,e,0,c.t);b.s=0;b.clamp();this.s!=a.s&&BigInteger.ZERO.subTo(b,b)}function bnpSquareTo(a){for(var b=this.abs(),c=a.t=2*b.t;--c>=0;)a[c]=0;for(c=0;c<b.t-1;++c){var d=b.am(c,b[c],a,2*c,0,1);if((a[c+b.t]+=b.am(c+1,2*b[c],a,2*c+1,d,b.t-c-1))>=b.DV)a[c+b.t]-=b.DV,a[c+b.t+1]=1}a.t>0&&(a[a.t-1]+=b.am(c,b[c],a,2*c,0,1));a.s=0;a.clamp()}
function bnpDivRemTo(a,b,c){var d=a.abs();if(!(d.t<=0)){var e=this.abs();if(e.t<d.t)b!=null&&b.fromInt(0),c!=null&&this.copyTo(c);else{c==null&&(c=nbi());var g=nbi(),h=this.s,a=a.s,f=this.DB-nbits(d[d.t-1]);f>0?(d.lShiftTo(f,g),e.lShiftTo(f,c)):(d.copyTo(g),e.copyTo(c));d=g.t;e=g[d-1];if(e!=0){var o=e*(1<<this.F1)+(d>1?g[d-2]>>this.F2:0),p=this.FV/o,o=(1<<this.F1)/o,q=1<<this.F2,n=c.t,k=n-d,j=b==null?nbi():b;g.dlShiftTo(k,j);c.compareTo(j)>=0&&(c[c.t++]=1,c.subTo(j,c));BigInteger.ONE.dlShiftTo(d,
j);for(j.subTo(g,g);g.t<d;)g[g.t++]=0;for(;--k>=0;){var l=c[--n]==e?this.DM:Math.floor(c[n]*p+(c[n-1]+q)*o);if((c[n]+=g.am(0,l,c,k,0,d))<l){g.dlShiftTo(k,j);for(c.subTo(j,c);c[n]<--l;)c.subTo(j,c)}}b!=null&&(c.drShiftTo(d,b),h!=a&&BigInteger.ZERO.subTo(b,b));c.t=d;c.clamp();f>0&&c.rShiftTo(f,c);h<0&&BigInteger.ZERO.subTo(c,c)}}}}function bnMod(a){var b=nbi();this.abs().divRemTo(a,null,b);this.s<0&&b.compareTo(BigInteger.ZERO)>0&&a.subTo(b,b);return b}function Classic(a){this.m=a}
function cConvert(a){return a.s<0||a.compareTo(this.m)>=0?a.mod(this.m):a}function cRevert(a){return a}function cReduce(a){a.divRemTo(this.m,null,a)}function cMulTo(a,b,c){a.multiplyTo(b,c);this.reduce(c)}function cSqrTo(a,b){a.squareTo(b);this.reduce(b)}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo;
function bnpInvDigit(){if(this.t<1)return 0;var a=this[0];if((a&1)==0)return 0;var b=a&3,b=b*(2-(a&15)*b)&15,b=b*(2-(a&255)*b)&255,b=b*(2-((a&65535)*b&65535))&65535,b=b*(2-a*b%this.DV)%this.DV;return b>0?this.DV-b:-b}function Montgomery(a){this.m=a;this.mp=a.invDigit();this.mpl=this.mp&32767;this.mph=this.mp>>15;this.um=(1<<a.DB-15)-1;this.mt2=2*a.t}
function montConvert(a){var b=nbi();a.abs().dlShiftTo(this.m.t,b);b.divRemTo(this.m,null,b);a.s<0&&b.compareTo(BigInteger.ZERO)>0&&this.m.subTo(b,b);return b}function montRevert(a){var b=nbi();a.copyTo(b);this.reduce(b);return b}
function montReduce(a){for(;a.t<=this.mt2;)a[a.t++]=0;for(var b=0;b<this.m.t;++b){var c=a[b]&32767,d=c*this.mpl+((c*this.mph+(a[b]>>15)*this.mpl&this.um)<<15)&a.DM,c=b+this.m.t;for(a[c]+=this.m.am(0,d,a,b,0,this.m.t);a[c]>=a.DV;)a[c]-=a.DV,a[++c]++}a.clamp();a.drShiftTo(this.m.t,a);a.compareTo(this.m)>=0&&a.subTo(this.m,a)}function montSqrTo(a,b){a.squareTo(b);this.reduce(b)}function montMulTo(a,b,c){a.multiplyTo(b,c);this.reduce(c)}Montgomery.prototype.convert=montConvert;
Montgomery.prototype.revert=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return(this.t>0?this[0]&1:this.s)==0}function bnpExp(a,b){if(a>4294967295||a<1)return BigInteger.ONE;var c=nbi(),d=nbi(),e=b.convert(this),g=nbits(a)-1;for(e.copyTo(c);--g>=0;)if(b.sqrTo(c,d),(a&1<<g)>0)b.mulTo(d,e,c);else var h=c,c=d,d=h;return b.revert(c)}
function bnModPowInt(a,b){var c;c=a<256||b.isEven()?new Classic(b):new Montgomery(b);return this.exp(a,c)}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo;
BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt;
BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);function bnClone(){var a=nbi();this.copyTo(a);return a}function bnIntValue(){if(this.s<0)if(this.t==1)return this[0]-this.DV;else{if(this.t==0)return-1}else if(this.t==1)return this[0];else if(this.t==0)return 0;return(this[1]&(1<<32-this.DB)-1)<<this.DB|this[0]}function bnByteValue(){return this.t==0?this.s:this[0]<<24>>24}function bnShortValue(){return this.t==0?this.s:this[0]<<16>>16}
function bnpChunkSize(a){return Math.floor(Math.LN2*this.DB/Math.log(a))}function bnSigNum(){return this.s<0?-1:this.t<=0||this.t==1&&this[0]<=0?0:1}function bnpToRadix(a){a==null&&(a=10);if(this.signum()==0||a<2||a>36)return"0";var b=this.chunkSize(a),b=Math.pow(a,b),c=nbv(b),d=nbi(),e=nbi(),g="";for(this.divRemTo(c,d,e);d.signum()>0;)g=(b+e.intValue()).toString(a).substr(1)+g,d.divRemTo(c,d,e);return e.intValue().toString(a)+g}
function bnpFromRadix(a,b){this.fromInt(0);b==null&&(b=10);for(var c=this.chunkSize(b),d=Math.pow(b,c),e=!1,g=0,h=0,f=0;f<a.length;++f){var o=intAt(a,f);o<0?a.charAt(f)=="-"&&this.signum()==0&&(e=!0):(h=b*h+o,++g>=c&&(this.dMultiply(d),this.dAddOffset(h,0),h=g=0))}g>0&&(this.dMultiply(Math.pow(b,g)),this.dAddOffset(h,0));e&&BigInteger.ZERO.subTo(this,this)}
function bnpFromNumber(a,b,c){if("number"==typeof b)if(a<2)this.fromInt(1);else{this.fromNumber(a,c);this.testBit(a-1)||this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);for(this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(b);)this.dAddOffset(2,0),this.bitLength()>a&&this.subTo(BigInteger.ONE.shiftLeft(a-1),this)}else{var c=[],d=a&7;c.length=(a>>3)+1;b.nextBytes(c);d>0?c[0]&=(1<<d)-1:c[0]=0;this.fromString(c,256)}}
function bnToByteArray(){var a=this.t,b=[];b[0]=this.s;var c=this.DB-a*this.DB%8,d,e=0;if(a-- >0){if(c<this.DB&&(d=this[a]>>c)!=(this.s&this.DM)>>c)b[e++]=d|this.s<<this.DB-c;for(;a>=0;)if(c<8?(d=(this[a]&(1<<c)-1)<<8-c,d|=this[--a]>>(c+=this.DB-8)):(d=this[a]>>(c-=8)&255,c<=0&&(c+=this.DB,--a)),(d&128)!=0&&(d|=-256),e==0&&(this.s&128)!=(d&128)&&++e,e>0||d!=this.s)b[e++]=d}return b}function bnEquals(a){return this.compareTo(a)==0}function bnMin(a){return this.compareTo(a)<0?this:a}
function bnMax(a){return this.compareTo(a)>0?this:a}function bnpBitwiseTo(a,b,c){var d,e,g=Math.min(a.t,this.t);for(d=0;d<g;++d)c[d]=b(this[d],a[d]);if(a.t<this.t){e=a.s&this.DM;for(d=g;d<this.t;++d)c[d]=b(this[d],e);c.t=this.t}else{e=this.s&this.DM;for(d=g;d<a.t;++d)c[d]=b(e,a[d]);c.t=a.t}c.s=b(this.s,a.s);c.clamp()}function op_and(a,b){return a&b}function bnAnd(a){var b=nbi();this.bitwiseTo(a,op_and,b);return b}function op_or(a,b){return a|b}
function bnOr(a){var b=nbi();this.bitwiseTo(a,op_or,b);return b}function op_xor(a,b){return a^b}function bnXor(a){var b=nbi();this.bitwiseTo(a,op_xor,b);return b}function op_andnot(a,b){return a&~b}function bnAndNot(a){var b=nbi();this.bitwiseTo(a,op_andnot,b);return b}function bnNot(){for(var a=nbi(),b=0;b<this.t;++b)a[b]=this.DM&~this[b];a.t=this.t;a.s=~this.s;return a}function bnShiftLeft(a){var b=nbi();a<0?this.rShiftTo(-a,b):this.lShiftTo(a,b);return b}
function bnShiftRight(a){var b=nbi();a<0?this.lShiftTo(-a,b):this.rShiftTo(a,b);return b}function lbit(a){if(a==0)return-1;var b=0;(a&65535)==0&&(a>>=16,b+=16);(a&255)==0&&(a>>=8,b+=8);(a&15)==0&&(a>>=4,b+=4);(a&3)==0&&(a>>=2,b+=2);(a&1)==0&&++b;return b}function bnGetLowestSetBit(){for(var a=0;a<this.t;++a)if(this[a]!=0)return a*this.DB+lbit(this[a]);return this.s<0?this.t*this.DB:-1}function cbit(a){for(var b=0;a!=0;)a&=a-1,++b;return b}
function bnBitCount(){for(var a=0,b=this.s&this.DM,c=0;c<this.t;++c)a+=cbit(this[c]^b);return a}function bnTestBit(a){var b=Math.floor(a/this.DB);return b>=this.t?this.s!=0:(this[b]&1<<a%this.DB)!=0}function bnpChangeBit(a,b){var c=BigInteger.ONE.shiftLeft(a);this.bitwiseTo(c,b,c);return c}function bnSetBit(a){return this.changeBit(a,op_or)}function bnClearBit(a){return this.changeBit(a,op_andnot)}function bnFlipBit(a){return this.changeBit(a,op_xor)}
function bnpAddTo(a,b){for(var c=0,d=0,e=Math.min(a.t,this.t);c<e;)d+=this[c]+a[c],b[c++]=d&this.DM,d>>=this.DB;if(a.t<this.t){for(d+=a.s;c<this.t;)d+=this[c],b[c++]=d&this.DM,d>>=this.DB;d+=this.s}else{for(d+=this.s;c<a.t;)d+=a[c],b[c++]=d&this.DM,d>>=this.DB;d+=a.s}b.s=d<0?-1:0;d>0?b[c++]=d:d<-1&&(b[c++]=this.DV+d);b.t=c;b.clamp()}function bnAdd(a){var b=nbi();this.addTo(a,b);return b}function bnSubtract(a){var b=nbi();this.subTo(a,b);return b}
function bnMultiply(a){var b=nbi();this.multiplyTo(a,b);return b}function bnSquare(){var a=nbi();this.squareTo(a);return a}function bnDivide(a){var b=nbi();this.divRemTo(a,b,null);return b}function bnRemainder(a){var b=nbi();this.divRemTo(a,null,b);return b}function bnDivideAndRemainder(a){var b=nbi(),c=nbi();this.divRemTo(a,b,c);return[b,c]}function bnpDMultiply(a){this[this.t]=this.am(0,a-1,this,0,0,this.t);++this.t;this.clamp()}
function bnpDAddOffset(a,b){if(a!=0){for(;this.t<=b;)this[this.t++]=0;for(this[b]+=a;this[b]>=this.DV;)this[b]-=this.DV,++b>=this.t&&(this[this.t++]=0),++this[b]}}function NullExp(){}function nNop(a){return a}function nMulTo(a,b,c){a.multiplyTo(b,c)}function nSqrTo(a,b){a.squareTo(b)}NullExp.prototype.convert=nNop;NullExp.prototype.revert=nNop;NullExp.prototype.mulTo=nMulTo;NullExp.prototype.sqrTo=nSqrTo;function bnPow(a){return this.exp(a,new NullExp)}
function bnpMultiplyLowerTo(a,b,c){var d=Math.min(this.t+a.t,b);c.s=0;for(c.t=d;d>0;)c[--d]=0;var e;for(e=c.t-this.t;d<e;++d)c[d+this.t]=this.am(0,a[d],c,d,0,this.t);for(e=Math.min(a.t,b);d<e;++d)this.am(0,a[d],c,d,0,b-d);c.clamp()}function bnpMultiplyUpperTo(a,b,c){--b;var d=c.t=this.t+a.t-b;for(c.s=0;--d>=0;)c[d]=0;for(d=Math.max(b-this.t,0);d<a.t;++d)c[this.t+d-b]=this.am(b-d,a[d],c,0,0,this.t+d-b);c.clamp();c.drShiftTo(1,c)}
function Barrett(a){this.r2=nbi();this.q3=nbi();BigInteger.ONE.dlShiftTo(2*a.t,this.r2);this.mu=this.r2.divide(a);this.m=a}function barrettConvert(a){if(a.s<0||a.t>2*this.m.t)return a.mod(this.m);else if(a.compareTo(this.m)<0)return a;else{var b=nbi();a.copyTo(b);this.reduce(b);return b}}function barrettRevert(a){return a}
function barrettReduce(a){a.drShiftTo(this.m.t-1,this.r2);if(a.t>this.m.t+1)a.t=this.m.t+1,a.clamp();this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);for(this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);a.compareTo(this.r2)<0;)a.dAddOffset(1,this.m.t+1);for(a.subTo(this.r2,a);a.compareTo(this.m)>=0;)a.subTo(this.m,a)}function barrettSqrTo(a,b){a.squareTo(b);this.reduce(b)}function barrettMulTo(a,b,c){a.multiplyTo(b,c);this.reduce(c)}Barrett.prototype.convert=barrettConvert;
Barrett.prototype.revert=barrettRevert;Barrett.prototype.reduce=barrettReduce;Barrett.prototype.mulTo=barrettMulTo;Barrett.prototype.sqrTo=barrettSqrTo;
function bnModPow(a,b){var c=a.bitLength(),d,e=nbv(1),g;if(c<=0)return e;else d=c<18?1:c<48?3:c<144?4:c<768?5:6;g=c<8?new Classic(b):b.isEven()?new Barrett(b):new Montgomery(b);var h=[],f=3,o=d-1,p=(1<<d)-1;h[1]=g.convert(this);if(d>1){c=nbi();for(g.sqrTo(h[1],c);f<=p;)h[f]=nbi(),g.mulTo(c,h[f-2],h[f]),f+=2}for(var q=a.t-1,n,k=!0,j=nbi(),c=nbits(a[q])-1;q>=0;){c>=o?n=a[q]>>c-o&p:(n=(a[q]&(1<<c+1)-1)<<o-c,q>0&&(n|=a[q-1]>>this.DB+c-o));for(f=d;(n&1)==0;)n>>=1,--f;if((c-=f)<0)c+=this.DB,--q;if(k)h[n].copyTo(e),
k=!1;else{for(;f>1;)g.sqrTo(e,j),g.sqrTo(j,e),f-=2;f>0?g.sqrTo(e,j):(f=e,e=j,j=f);g.mulTo(j,h[n],e)}for(;q>=0&&(a[q]&1<<c)==0;)g.sqrTo(e,j),f=e,e=j,j=f,--c<0&&(c=this.DB-1,--q)}return g.revert(e)}
function bnGCD(a){var b=this.s<0?this.negate():this.clone(),a=a.s<0?a.negate():a.clone();if(b.compareTo(a)<0)var c=b,b=a,a=c;var c=b.getLowestSetBit(),d=a.getLowestSetBit();if(d<0)return b;c<d&&(d=c);d>0&&(b.rShiftTo(d,b),a.rShiftTo(d,a));for(;b.signum()>0;)(c=b.getLowestSetBit())>0&&b.rShiftTo(c,b),(c=a.getLowestSetBit())>0&&a.rShiftTo(c,a),b.compareTo(a)>=0?(b.subTo(a,b),b.rShiftTo(1,b)):(a.subTo(b,a),a.rShiftTo(1,a));d>0&&a.lShiftTo(d,a);return a}
function bnpModInt(a){if(a<=0)return 0;var b=this.DV%a,c=this.s<0?a-1:0;if(this.t>0)if(b==0)c=this[0]%a;else for(var d=this.t-1;d>=0;--d)c=(b*c+this[d])%a;return c}
function bnModInverse(a){var b=a.isEven();if(this.isEven()&&b||a.signum()==0)return BigInteger.ZERO;for(var c=a.clone(),d=this.clone(),e=nbv(1),g=nbv(0),h=nbv(0),f=nbv(1);c.signum()!=0;){for(;c.isEven();){c.rShiftTo(1,c);if(b){if(!e.isEven()||!g.isEven())e.addTo(this,e),g.subTo(a,g);e.rShiftTo(1,e)}else g.isEven()||g.subTo(a,g);g.rShiftTo(1,g)}for(;d.isEven();){d.rShiftTo(1,d);if(b){if(!h.isEven()||!f.isEven())h.addTo(this,h),f.subTo(a,f);h.rShiftTo(1,h)}else f.isEven()||f.subTo(a,f);f.rShiftTo(1,
f)}c.compareTo(d)>=0?(c.subTo(d,c),b&&e.subTo(h,e),g.subTo(f,g)):(d.subTo(c,d),b&&h.subTo(e,h),f.subTo(g,f))}if(d.compareTo(BigInteger.ONE)!=0)return BigInteger.ZERO;if(f.compareTo(a)>=0)return f.subtract(a);if(f.signum()<0)f.addTo(a,f);else return f;return f.signum()<0?f.add(a):f}
var lowprimes=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,
733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],lplim=67108864/lowprimes[lowprimes.length-1];
function bnIsProbablePrime(a){var b,c=this.abs();if(c.t==1&&c[0]<=lowprimes[lowprimes.length-1]){for(b=0;b<lowprimes.length;++b)if(c[0]==lowprimes[b])return!0;return!1}if(c.isEven())return!1;for(b=1;b<lowprimes.length;){for(var d=lowprimes[b],e=b+1;e<lowprimes.length&&d<lplim;)d*=lowprimes[e++];for(d=c.modInt(d);b<e;)if(d%lowprimes[b++]==0)return!1}return c.millerRabin(a)}
function bnpMillerRabin(a){var b=this.subtract(BigInteger.ONE),c=b.getLowestSetBit();if(c<=0)return!1;var d=b.shiftRight(c),a=a+1>>1;if(a>lowprimes.length)a=lowprimes.length;for(var e=nbi(),g=0;g<a;++g){e.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);var h=e.modPow(d,this);if(h.compareTo(BigInteger.ONE)!=0&&h.compareTo(b)!=0){for(var f=1;f++<c&&h.compareTo(b)!=0;)if(h=h.modPowInt(2,this),h.compareTo(BigInteger.ONE)==0)return!1;if(h.compareTo(b)!=0)return!1}}return!0}
BigInteger.prototype.chunkSize=bnpChunkSize;BigInteger.prototype.toRadix=bnpToRadix;BigInteger.prototype.fromRadix=bnpFromRadix;BigInteger.prototype.fromNumber=bnpFromNumber;BigInteger.prototype.bitwiseTo=bnpBitwiseTo;BigInteger.prototype.changeBit=bnpChangeBit;BigInteger.prototype.addTo=bnpAddTo;BigInteger.prototype.dMultiply=bnpDMultiply;BigInteger.prototype.dAddOffset=bnpDAddOffset;BigInteger.prototype.multiplyLowerTo=bnpMultiplyLowerTo;BigInteger.prototype.multiplyUpperTo=bnpMultiplyUpperTo;
BigInteger.prototype.modInt=bnpModInt;BigInteger.prototype.millerRabin=bnpMillerRabin;BigInteger.prototype.clone=bnClone;BigInteger.prototype.intValue=bnIntValue;BigInteger.prototype.byteValue=bnByteValue;BigInteger.prototype.shortValue=bnShortValue;BigInteger.prototype.signum=bnSigNum;BigInteger.prototype.toByteArray=bnToByteArray;BigInteger.prototype.equals=bnEquals;BigInteger.prototype.min=bnMin;BigInteger.prototype.max=bnMax;BigInteger.prototype.and=bnAnd;BigInteger.prototype.or=bnOr;
BigInteger.prototype.xor=bnXor;BigInteger.prototype.andNot=bnAndNot;BigInteger.prototype.not=bnNot;BigInteger.prototype.shiftLeft=bnShiftLeft;BigInteger.prototype.shiftRight=bnShiftRight;BigInteger.prototype.getLowestSetBit=bnGetLowestSetBit;BigInteger.prototype.bitCount=bnBitCount;BigInteger.prototype.testBit=bnTestBit;BigInteger.prototype.setBit=bnSetBit;BigInteger.prototype.clearBit=bnClearBit;BigInteger.prototype.flipBit=bnFlipBit;BigInteger.prototype.add=bnAdd;BigInteger.prototype.subtract=bnSubtract;
BigInteger.prototype.multiply=bnMultiply;BigInteger.prototype.divide=bnDivide;BigInteger.prototype.remainder=bnRemainder;BigInteger.prototype.divideAndRemainder=bnDivideAndRemainder;BigInteger.prototype.modPow=bnModPow;BigInteger.prototype.modInverse=bnModInverse;BigInteger.prototype.pow=bnPow;BigInteger.prototype.gcd=bnGCD;BigInteger.prototype.isProbablePrime=bnIsProbablePrime;BigInteger.prototype.square=bnSquare;
(function(a,b,c,d,e,g,h){function f(a){var b,d,e=this,g=a.length,f=0,h=e.i=e.j=e.m=0;e.S=[];e.c=[];for(g||(a=[g++]);f<c;)e.S[f]=f++;for(f=0;f<c;f++)b=e.S[f],h=h+b+a[f%g]&c-1,d=e.S[h],e.S[f]=d,e.S[h]=b;e.g=function(a){var b=e.S,d=e.i+1&c-1,g=b[d],f=e.j+g&c-1,h=b[f];b[d]=h;b[f]=g;for(var k=b[g+h&c-1];--a;)d=d+1&c-1,g=b[d],f=f+g&c-1,h=b[f],b[d]=h,b[f]=g,k=k*c+b[g+h&c-1];e.i=d;e.j=f;return k};e.g(c)}function o(a,b,c,d,e){c=[];e=typeof a;if(b&&e=="object")for(d in a)if(d.indexOf("S")<5)try{c.push(o(a[d],
b-1))}catch(g){}return c.length?c:a+(e!="string"?"\x00":"")}function p(a,b,d,e){a+="";for(e=d=0;e<a.length;e++){var g=b,f=e&c-1,h=(d^=b[e&c-1]*19)+a.charCodeAt(e);g[f]=h&c-1}a="";for(e in b)a+=String.fromCharCode(b[e]);return a}b.seedrandom=function(q,n){var k=[],j,q=p(o(n?[q,a]:arguments.length?q:[(new Date).getTime(),a,window],3),k);j=new f(k);p(j.S,a);b.random=function(){for(var a=j.g(d),b=h,f=0;a<e;)a=(a+f)*c,b*=c,f=j.g(1);for(;a>=g;)a/=2,b/=2,f>>>=1;return(a+f)/b};return q};h=b.pow(c,d);e=b.pow(2,
e);g=e*2;p(b.random(),a)})([],Math,256,6,52);function SeededRandom(){}function SRnextBytes(a){var b;for(b=0;b<a.length;b++)a[b]=Math.floor(Math.random()*256)}SeededRandom.prototype.nextBytes=SRnextBytes;function Arcfour(){this.j=this.i=0;this.S=[]}function ARC4init(a){var b,c,d;for(b=0;b<256;++b)this.S[b]=b;for(b=c=0;b<256;++b)c=c+this.S[b]+a[b%a.length]&255,d=this.S[b],this.S[b]=this.S[c],this.S[c]=d;this.j=this.i=0}
function ARC4next(){var a;this.i=this.i+1&255;this.j=this.j+this.S[this.i]&255;a=this.S[this.i];this.S[this.i]=this.S[this.j];this.S[this.j]=a;return this.S[a+this.S[this.i]&255]}Arcfour.prototype.init=ARC4init;Arcfour.prototype.next=ARC4next;function prng_newstate(){return new Arcfour}var rng_psize=256,rng_state,rng_pool,rng_pptr;
function rng_seed_int(a){rng_pool[rng_pptr++]^=a&255;rng_pool[rng_pptr++]^=a>>8&255;rng_pool[rng_pptr++]^=a>>16&255;rng_pool[rng_pptr++]^=a>>24&255;rng_pptr>=rng_psize&&(rng_pptr-=rng_psize)}function rng_seed_time(){rng_seed_int((new Date).getTime())}
if(rng_pool==null){rng_pool=[];rng_pptr=0;var t;if(navigator.appName=="Netscape"&&navigator.appVersion<"5"&&window.crypto){var z=window.crypto.random(32);for(t=0;t<z.length;++t)rng_pool[rng_pptr++]=z.charCodeAt(t)&255}for(;rng_pptr<rng_psize;)t=Math.floor(65536*Math.random()),rng_pool[rng_pptr++]=t>>>8,rng_pool[rng_pptr++]=t&255;rng_pptr=0;rng_seed_time()}
function rng_get_byte(){if(rng_state==null){rng_seed_time();rng_state=prng_newstate();rng_state.init(rng_pool);for(rng_pptr=0;rng_pptr<rng_pool.length;++rng_pptr)rng_pool[rng_pptr]=0;rng_pptr=0}return rng_state.next()}function rng_get_bytes(a){var b;for(b=0;b<a.length;++b)a[b]=rng_get_byte()}function SecureRandom(){}SecureRandom.prototype.nextBytes=rng_get_bytes;
function SHA256(a){function b(a,b){var c=(a&65535)+(b&65535);return(a>>16)+(b>>16)+(c>>16)<<16|c&65535}function c(a,b){return a>>>b|a<<32-b}a=function(a){for(var a=a.replace(/\r\n/g,"\n"),b="",c=0;c<a.length;c++){var h=a.charCodeAt(c);h<128?b+=String.fromCharCode(h):(h>127&&h<2048?b+=String.fromCharCode(h>>6|192):(b+=String.fromCharCode(h>>12|224),b+=String.fromCharCode(h>>6&63|128)),b+=String.fromCharCode(h&63|128))}return b}(a);return function(a){for(var b="",c=0;c<a.length*4;c++)b+="0123456789abcdef".charAt(a[c>>
2]>>(3-c%4)*8+4&15)+"0123456789abcdef".charAt(a[c>>2]>>(3-c%4)*8&15);return b}(function(a,e){var g=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,
2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],h=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],f=Array(64),o,p,q,n,k,j,l,m,s,r,u,w;a[e>>5]|=128<<24-e%32;a[(e+64>>9<<4)+15]=e;for(s=0;s<a.length;s+=16){o=h[0];p=h[1];q=h[2];n=h[3];
k=h[4];j=h[5];l=h[6];m=h[7];for(r=0;r<64;r++)f[r]=r<16?a[r+s]:b(b(b(c(f[r-2],17)^c(f[r-2],19)^f[r-2]>>>10,f[r-7]),c(f[r-15],7)^c(f[r-15],18)^f[r-15]>>>3),f[r-16]),u=b(b(b(b(m,c(k,6)^c(k,11)^c(k,25)),k&j^~k&l),g[r]),f[r]),w=b(c(o,2)^c(o,13)^c(o,22),o&p^o&q^p&q),m=l,l=j,j=k,k=b(n,u),n=q,q=p,p=o,o=b(u,w);h[0]=b(o,h[0]);h[1]=b(p,h[1]);h[2]=b(q,h[2]);h[3]=b(n,h[3]);h[4]=b(k,h[4]);h[5]=b(j,h[5]);h[6]=b(l,h[6]);h[7]=b(m,h[7])}return h}(function(a){for(var b=[],c=0;c<a.length*8;c+=8)b[c>>5]|=(a.charCodeAt(c/
8)&255)<<24-c%32;return b}(a),a.length*8))}var sha256={hex:function(a){return SHA256(a)}};
function SHA1(a){function b(a,b){return a<<b|a>>>32-b}function c(a){var b="",c,d;for(c=7;c>=0;c--)d=a>>>c*4&15,b+=d.toString(16);return b}var d,e,g=Array(80),h=1732584193,f=4023233417,o=2562383102,p=271733878,q=3285377520,n,k,j,l,m,a=function(a){for(var a=a.replace(/\r\n/g,"\n"),b="",c=0;c<a.length;c++){var d=a.charCodeAt(c);d<128?b+=String.fromCharCode(d):(d>127&&d<2048?b+=String.fromCharCode(d>>6|192):(b+=String.fromCharCode(d>>12|224),b+=String.fromCharCode(d>>6&63|128)),b+=String.fromCharCode(d&
63|128))}return b}(a);n=a.length;var s=[];for(d=0;d<n-3;d+=4)e=a.charCodeAt(d)<<24|a.charCodeAt(d+1)<<16|a.charCodeAt(d+2)<<8|a.charCodeAt(d+3),s.push(e);switch(n%4){case 0:d=2147483648;break;case 1:d=a.charCodeAt(n-1)<<24|8388608;break;case 2:d=a.charCodeAt(n-2)<<24|a.charCodeAt(n-1)<<16|32768;break;case 3:d=a.charCodeAt(n-3)<<24|a.charCodeAt(n-2)<<16|a.charCodeAt(n-1)<<8|128}for(s.push(d);s.length%16!=14;)s.push(0);s.push(n>>>29);s.push(n<<3&4294967295);for(a=0;a<s.length;a+=16){for(d=0;d<16;d++)g[d]=
s[a+d];for(d=16;d<=79;d++)g[d]=b(g[d-3]^g[d-8]^g[d-14]^g[d-16],1);e=h;n=f;k=o;j=p;l=q;for(d=0;d<=19;d++)m=b(e,5)+(n&k|~n&j)+l+g[d]+1518500249&4294967295,l=j,j=k,k=b(n,30),n=e,e=m;for(d=20;d<=39;d++)m=b(e,5)+(n^k^j)+l+g[d]+1859775393&4294967295,l=j,j=k,k=b(n,30),n=e,e=m;for(d=40;d<=59;d++)m=b(e,5)+(n&k|n&j|k&j)+l+g[d]+2400959708&4294967295,l=j,j=k,k=b(n,30),n=e,e=m;for(d=60;d<=79;d++)m=b(e,5)+(n^k^j)+l+g[d]+3395469782&4294967295,l=j,j=k,k=b(n,30),n=e,e=m;h=h+e&4294967295;f=f+n&4294967295;o=o+k&4294967295;
p=p+j&4294967295;q=q+l&4294967295}m=c(h)+c(f)+c(o)+c(p)+c(q);return m.toLowerCase()}
var sha1={hex:function(a){return SHA1(a)}},MD5=function(a){function b(a,b){var c,d,e,f,g;e=a&2147483648;f=b&2147483648;c=a&1073741824;d=b&1073741824;g=(a&1073741823)+(b&1073741823);return c&d?g^2147483648^e^f:c|d?g&1073741824?g^3221225472^e^f:g^1073741824^e^f:g^e^f}function c(a,c,d,e,f,g,h){a=b(a,b(b(c&d|~c&e,f),h));return b(a<<g|a>>>32-g,c)}function d(a,c,d,e,f,g,h){a=b(a,b(b(c&e|d&~e,f),h));return b(a<<g|a>>>32-g,c)}function e(a,c,d,e,f,g,h){a=b(a,b(b(c^d^e,f),h));return b(a<<g|a>>>32-g,c)}function g(a,
c,d,e,f,g,h){a=b(a,b(b(d^(c|~e),f),h));return b(a<<g|a>>>32-g,c)}function h(a){var b="",c="",d;for(d=0;d<=3;d++)c=a>>>d*8&255,c="0"+c.toString(16),b+=c.substr(c.length-2,2);return b}var f=[],o,p,q,n,k,j,l,m,a=function(a){for(var a=a.replace(/\r\n/g,"\n"),b="",c=0;c<a.length;c++){var d=a.charCodeAt(c);d<128?b+=String.fromCharCode(d):(d>127&&d<2048?b+=String.fromCharCode(d>>6|192):(b+=String.fromCharCode(d>>12|224),b+=String.fromCharCode(d>>6&63|128)),b+=String.fromCharCode(d&63|128))}return b}(a),
f=function(a){var b,c=a.length;b=c+8;for(var d=((b-b%64)/64+1)*16,e=Array(d-1),f=0,g=0;g<c;)b=(g-g%4)/4,f=g%4*8,e[b]|=a.charCodeAt(g)<<f,g++;e[(g-g%4)/4]|=128<<g%4*8;e[d-2]=c<<3;e[d-1]=c>>>29;return e}(a);k=1732584193;j=4023233417;l=2562383102;m=271733878;for(a=0;a<f.length;a+=16)o=k,p=j,q=l,n=m,k=c(k,j,l,m,f[a+0],7,3614090360),m=c(m,k,j,l,f[a+1],12,3905402710),l=c(l,m,k,j,f[a+2],17,606105819),j=c(j,l,m,k,f[a+3],22,3250441966),k=c(k,j,l,m,f[a+4],7,4118548399),m=c(m,k,j,l,f[a+5],12,1200080426),l=c(l,
m,k,j,f[a+6],17,2821735955),j=c(j,l,m,k,f[a+7],22,4249261313),k=c(k,j,l,m,f[a+8],7,1770035416),m=c(m,k,j,l,f[a+9],12,2336552879),l=c(l,m,k,j,f[a+10],17,4294925233),j=c(j,l,m,k,f[a+11],22,2304563134),k=c(k,j,l,m,f[a+12],7,1804603682),m=c(m,k,j,l,f[a+13],12,4254626195),l=c(l,m,k,j,f[a+14],17,2792965006),j=c(j,l,m,k,f[a+15],22,1236535329),k=d(k,j,l,m,f[a+1],5,4129170786),m=d(m,k,j,l,f[a+6],9,3225465664),l=d(l,m,k,j,f[a+11],14,643717713),j=d(j,l,m,k,f[a+0],20,3921069994),k=d(k,j,l,m,f[a+5],5,3593408605),
m=d(m,k,j,l,f[a+10],9,38016083),l=d(l,m,k,j,f[a+15],14,3634488961),j=d(j,l,m,k,f[a+4],20,3889429448),k=d(k,j,l,m,f[a+9],5,568446438),m=d(m,k,j,l,f[a+14],9,3275163606),l=d(l,m,k,j,f[a+3],14,4107603335),j=d(j,l,m,k,f[a+8],20,1163531501),k=d(k,j,l,m,f[a+13],5,2850285829),m=d(m,k,j,l,f[a+2],9,4243563512),l=d(l,m,k,j,f[a+7],14,1735328473),j=d(j,l,m,k,f[a+12],20,2368359562),k=e(k,j,l,m,f[a+5],4,4294588738),m=e(m,k,j,l,f[a+8],11,2272392833),l=e(l,m,k,j,f[a+11],16,1839030562),j=e(j,l,m,k,f[a+14],23,4259657740),
k=e(k,j,l,m,f[a+1],4,2763975236),m=e(m,k,j,l,f[a+4],11,1272893353),l=e(l,m,k,j,f[a+7],16,4139469664),j=e(j,l,m,k,f[a+10],23,3200236656),k=e(k,j,l,m,f[a+13],4,681279174),m=e(m,k,j,l,f[a+0],11,3936430074),l=e(l,m,k,j,f[a+3],16,3572445317),j=e(j,l,m,k,f[a+6],23,76029189),k=e(k,j,l,m,f[a+9],4,3654602809),m=e(m,k,j,l,f[a+12],11,3873151461),l=e(l,m,k,j,f[a+15],16,530742520),j=e(j,l,m,k,f[a+2],23,3299628645),k=g(k,j,l,m,f[a+0],6,4096336452),m=g(m,k,j,l,f[a+7],10,1126891415),l=g(l,m,k,j,f[a+14],15,2878612391),
j=g(j,l,m,k,f[a+5],21,4237533241),k=g(k,j,l,m,f[a+12],6,1700485571),m=g(m,k,j,l,f[a+3],10,2399980690),l=g(l,m,k,j,f[a+10],15,4293915773),j=g(j,l,m,k,f[a+1],21,2240044497),k=g(k,j,l,m,f[a+8],6,1873313359),m=g(m,k,j,l,f[a+15],10,4264355552),l=g(l,m,k,j,f[a+6],15,2734768916),j=g(j,l,m,k,f[a+13],21,1309151649),k=g(k,j,l,m,f[a+4],6,4149444226),m=g(m,k,j,l,f[a+11],10,3174756917),l=g(l,m,k,j,f[a+2],15,718787259),j=g(j,l,m,k,f[a+9],21,3951481745),k=b(k,o),j=b(j,p),l=b(l,q),m=b(m,n);return(h(k)+h(j)+h(l)+
h(m)).toLowerCase()};function parseBigInt(a,b){return new BigInteger(a,b)}function linebrk(a,b){for(var c="",d=0;d+b<a.length;)c+=a.substring(d,d+b)+"\n",d+=b;return c+a.substring(d,a.length)}function byte2Hex(a){return a<16?"0"+a.toString(16):a.toString(16)}
function pkcs1pad2(a,b){if(b<a.length+11)throw"Message too long for RSA (n="+b+", l="+a.length+")";for(var c=[],d=a.length-1;d>=0&&b>0;){var e=a.charCodeAt(d--);e<128?c[--b]=e:e>127&&e<2048?(c[--b]=e&63|128,c[--b]=e>>6|192):(c[--b]=e&63|128,c[--b]=e>>6&63|128,c[--b]=e>>12|224)}c[--b]=0;d=new SecureRandom;for(e=[];b>2;){for(e[0]=0;e[0]==0;)d.nextBytes(e);c[--b]=e[0]}c[--b]=2;c[--b]=0;return new BigInteger(c)}
function RSAKey(){this.n=null;this.e=0;this.coeff=this.dmq1=this.dmp1=this.q=this.p=this.d=null}function RSASetPublic(a,b){a!=null&&b!=null&&a.length>0&&b.length>0?(this.n=parseBigInt(a,16),this.e=parseInt(b,16)):alert("Invalid RSA public key")}function RSADoPublic(a){return a.modPowInt(this.e,this.n)}function RSAEncrypt(a){a=pkcs1pad2(a,this.n.bitLength()+7>>3);if(a==null)return null;a=this.doPublic(a);if(a==null)return null;a=a.toString(16);return(a.length&1)==0?a:"0"+a}
RSAKey.prototype.doPublic=RSADoPublic;RSAKey.prototype.setPublic=RSASetPublic;RSAKey.prototype.encrypt=RSAEncrypt;function pkcs1unpad2(a,b){for(var c=a.toByteArray(),d=0;d<c.length&&c[d]==0;)++d;if(c.length-d!=b-1||c[d]!=2)return null;for(++d;c[d]!=0;)if(++d>=c.length)return null;for(var e="";++d<c.length;){var g=c[d]&255;g<128?e+=String.fromCharCode(g):g>191&&g<224?(e+=String.fromCharCode((g&31)<<6|c[d+1]&63),++d):(e+=String.fromCharCode((g&15)<<12|(c[d+1]&63)<<6|c[d+2]&63),d+=2)}return e}
function RSASetPrivate(a,b,c){a!=null&&b!=null&&a.length>0&&b.length>0?(this.n=parseBigInt(a,16),this.e=parseInt(b,16),this.d=parseBigInt(c,16)):alert("Invalid RSA private key")}
function RSASetPrivateEx(a,b,c,d,e,g,h,f){a!=null&&b!=null&&a.length>0&&b.length>0?(this.n=parseBigInt(a,16),this.e=parseInt(b,16),this.d=parseBigInt(c,16),this.p=parseBigInt(d,16),this.q=parseBigInt(e,16),this.dmp1=parseBigInt(g,16),this.dmq1=parseBigInt(h,16),this.coeff=parseBigInt(f,16)):alert("Invalid RSA private key")}
function RSAGenerate(a,b){var c=new SeededRandom,d=a>>1;this.e=parseInt(b,16);for(var e=new BigInteger(b,16);;){for(;;)if(this.p=new BigInteger(a-d,1,c),this.p.subtract(BigInteger.ONE).gcd(e).compareTo(BigInteger.ONE)==0&&this.p.isProbablePrime(10))break;for(;;)if(this.q=new BigInteger(d,1,c),this.q.subtract(BigInteger.ONE).gcd(e).compareTo(BigInteger.ONE)==0&&this.q.isProbablePrime(10))break;if(this.p.compareTo(this.q)<=0){var g=this.p;this.p=this.q;this.q=g}var g=this.p.subtract(BigInteger.ONE),
h=this.q.subtract(BigInteger.ONE),f=g.multiply(h);if(f.gcd(e).compareTo(BigInteger.ONE)==0){this.n=this.p.multiply(this.q);this.d=e.modInverse(f);this.dmp1=this.d.mod(g);this.dmq1=this.d.mod(h);this.coeff=this.q.modInverse(this.p);break}}}
function RSADoPrivate(a){if(this.p==null||this.q==null)return a.modPow(this.d,this.n);for(var b=a.mod(this.p).modPow(this.dmp1,this.p),a=a.mod(this.q).modPow(this.dmq1,this.q);b.compareTo(a)<0;)b=b.add(this.p);return b.subtract(a).multiply(this.coeff).mod(this.p).multiply(this.q).add(a)}function RSADecrypt(a){a=this.doPrivate(parseBigInt(a,16));return a==null?null:pkcs1unpad2(a,this.n.bitLength()+7>>3)}RSAKey.prototype.doPrivate=RSADoPrivate;RSAKey.prototype.setPrivate=RSASetPrivate;
RSAKey.prototype.setPrivateEx=RSASetPrivateEx;RSAKey.prototype.generate=RSAGenerate;RSAKey.prototype.decrypt=RSADecrypt;var _RSASIGN_DIHEAD=[];_RSASIGN_DIHEAD.sha1="3021300906052b0e03021a05000414";_RSASIGN_DIHEAD.sha256="3031300d060960864801650304020105000420";var _RSASIGN_HASHHEXFUNC=[];_RSASIGN_HASHHEXFUNC.sha1=sha1.hex;_RSASIGN_HASHHEXFUNC.sha256=sha256.hex;
function _rsasign_getHexPaddedDigestInfoForString(a,b,c){b/=4;for(var a=(0,_RSASIGN_HASHHEXFUNC[c])(a),c="00"+_RSASIGN_DIHEAD[c]+a,a="",b=b-4-c.length,d=0;d<b;d+=2)a+="ff";return sPaddedMessageHex="0001"+a+c}function _rsasign_signString(a,b){var c=_rsasign_getHexPaddedDigestInfoForString(a,this.n.bitLength(),b);return this.doPrivate(parseBigInt(c,16)).toString(16)}
function _rsasign_signStringWithSHA1(a){a=_rsasign_getHexPaddedDigestInfoForString(a,this.n.bitLength(),"sha1");return this.doPrivate(parseBigInt(a,16)).toString(16)}function _rsasign_signStringWithSHA256(a){a=_rsasign_getHexPaddedDigestInfoForString(a,this.n.bitLength(),"sha256");return this.doPrivate(parseBigInt(a,16)).toString(16)}function _rsasign_getDecryptSignatureBI(a,b,c){var d=new RSAKey;d.setPublic(b,c);return d.doPublic(a)}
function _rsasign_getHexDigestInfoFromSig(a,b,c){return _rsasign_getDecryptSignatureBI(a,b,c).toString(16).replace(/^1f+00/,"")}function _rsasign_getAlgNameAndHashFromHexDisgestInfo(a){for(var b in _RSASIGN_DIHEAD){var c=_RSASIGN_DIHEAD[b],d=c.length;if(a.substring(0,d)==c)return[b,a.substring(d)]}return[]}
function _rsasign_verifySignatureWithArgs(a,b,c,d){b=_rsasign_getHexDigestInfoFromSig(b,c,d);c=_rsasign_getAlgNameAndHashFromHexDisgestInfo(b);if(c.length==0)return!1;b=c[1];a=(0,_RSASIGN_HASHHEXFUNC[c[0]])(a);return b==a}function _rsasign_verifyHexSignatureForMessage(a,b){var c=parseBigInt(a,16);return _rsasign_verifySignatureWithArgs(b,c,this.n.toString(16),this.e.toString(16))}
function _rsasign_verifyString(a,b){var b=b.replace(/[ \n]+/g,""),c=this.doPublic(parseBigInt(b,16)).toString(16).replace(/^1f+00/,""),d=_rsasign_getAlgNameAndHashFromHexDisgestInfo(c);if(d.length==0)return!1;c=d[1];d=(0,_RSASIGN_HASHHEXFUNC[d[0]])(a);return c==d}RSAKey.prototype.signString=_rsasign_signString;RSAKey.prototype.signStringWithSHA1=_rsasign_signStringWithSHA1;RSAKey.prototype.signStringWithSHA256=_rsasign_signStringWithSHA256;RSAKey.prototype.verifyString=_rsasign_verifyString;
RSAKey.prototype.verifyHexSignatureForMessage=_rsasign_verifyHexSignatureForMessage;
var aes=function(){var a={Sbox:[99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,
95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22],ShiftRowTab:[0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11]};a.Init=
function(){a.Sbox_Inv=Array(256);for(var b=0;b<256;b++)a.Sbox_Inv[a.Sbox[b]]=b;a.ShiftRowTab_Inv=Array(16);for(b=0;b<16;b++)a.ShiftRowTab_Inv[a.ShiftRowTab[b]]=b;a.xtime=Array(256);for(b=0;b<128;b++)a.xtime[b]=b<<1,a.xtime[128+b]=b<<1^27};a.Done=function(){delete a.Sbox_Inv;delete a.ShiftRowTab_Inv;delete a.xtime};a.ExpandKey=function(b){var c=b.length,d,e=1;switch(c){case 16:d=176;break;case 24:d=208;break;case 32:d=240;break;default:alert("my.ExpandKey: Only key lengths of 16, 24 or 32 bytes allowed!")}for(var g=
c;g<d;g+=4){var h=b.slice(g-4,g);if(g%c==0){if(h=[a.Sbox[h[1]]^e,a.Sbox[h[2]],a.Sbox[h[3]],a.Sbox[h[0]]],(e<<=1)>=256)e^=283}else c>24&&g%c==16&&(h=[a.Sbox[h[0]],a.Sbox[h[1]],a.Sbox[h[2]],a.Sbox[h[3]]]);for(var f=0;f<4;f++)b[g+f]=b[g+f-c]^h[f]}};a.Encrypt=function(b,c){var d=c.length;a.AddRoundKey(b,c.slice(0,16));for(var e=16;e<d-16;e+=16)a.SubBytes(b,a.Sbox),a.ShiftRows(b,a.ShiftRowTab),a.MixColumns(b),a.AddRoundKey(b,c.slice(e,e+16));a.SubBytes(b,a.Sbox);a.ShiftRows(b,a.ShiftRowTab);a.AddRoundKey(b,
c.slice(e,d))};a.Decrypt=function(b,c){var d=c.length;a.AddRoundKey(b,c.slice(d-16,d));a.ShiftRows(b,a.ShiftRowTab_Inv);a.SubBytes(b,a.Sbox_Inv);for(d-=32;d>=16;d-=16)a.AddRoundKey(b,c.slice(d,d+16)),a.MixColumns_Inv(b),a.ShiftRows(b,a.ShiftRowTab_Inv),a.SubBytes(b,a.Sbox_Inv);a.AddRoundKey(b,c.slice(0,16))};a.SubBytes=function(a,c){for(var d=0;d<16;d++)a[d]=c[a[d]]};a.AddRoundKey=function(a,c){for(var d=0;d<16;d++)a[d]^=c[d]};a.ShiftRows=function(a,c){for(var d=[].concat(a),e=0;e<16;e++)a[e]=d[c[e]]};
a.MixColumns=function(b){for(var c=0;c<16;c+=4){var d=b[c+0],e=b[c+1],g=b[c+2],h=b[c+3],f=d^e^g^h;b[c+0]^=f^a.xtime[d^e];b[c+1]^=f^a.xtime[e^g];b[c+2]^=f^a.xtime[g^h];b[c+3]^=f^a.xtime[h^d]}};a.MixColumns_Inv=function(b){for(var c=0;c<16;c+=4){var d=b[c+0],e=b[c+1],g=b[c+2],h=b[c+3],f=d^e^g^h,o=a.xtime[f],p=a.xtime[a.xtime[o^d^g]]^f;f^=a.xtime[a.xtime[o^e^h]];b[c+0]^=p^a.xtime[d^e];b[c+1]^=f^a.xtime[e^g];b[c+2]^=p^a.xtime[g^h];b[c+3]^=f^a.xtime[h^d]}};return a}(),cryptico=function(){var a={};aes.Init();
a.b256to64=function(a){var c,d,e,g="",h=0,f=0,o=a.length;for(e=0;e<o;e++)d=a.charCodeAt(e),f==0?(g+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d>>2&63),c=(d&3)<<4):f==1?(g+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(c|d>>4&15),c=(d&15)<<2):f==2&&(g+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(c|d>>6&3),h+=1,g+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d&63)),h+=1,f+=1,f==3&&
(f=0);f>0&&(g+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(c),g+="=");f==1&&(g+="=");return g};a.b64to256=function(a){var c,d,e="",g=0,h=0,f=a.length;for(d=0;d<f;d++)c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(d)),c>=0&&(g&&(e+=String.fromCharCode(h|c>>6-g&255)),g=g+2&7,h=c<<g&255);return e};a.b16to64=function(a){var c,d,e="";a.length%2==1&&(a="0"+a);for(c=0;c+3<=a.length;c+=3)d=parseInt(a.substring(c,c+3),16),e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d>>
6)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d&63);c+1==a.length?(d=parseInt(a.substring(c,c+1),16),e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d<<2)):c+2==a.length&&(d=parseInt(a.substring(c,c+2),16),e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d>>2)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt((d&3)<<4));for(;(e.length&3)>0;)e+="=";return e};a.b64to16=function(a){var c="",
d,e=0,g;for(d=0;d<a.length;++d){if(a.charAt(d)=="=")break;v="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(d));v<0||(e==0?(c+=int2char(v>>2),g=v&3,e=1):e==1?(c+=int2char(g<<2|v>>4),g=v&15,e=2):e==2?(c+=int2char(g),c+=int2char(v>>2),g=v&3,e=3):(c+=int2char(g<<2|v>>4),c+=int2char(v&15),e=0))}e==1&&(c+=int2char(g<<2));return c};a.string2bytes=function(a){for(var c=[],d=0;d<a.length;d++)c.push(a.charCodeAt(d));return c};a.bytes2string=function(a){for(var c="",d=0;d<
a.length;d++)c+=String.fromCharCode(a[d]);return c};a.blockXOR=function(a,c){for(var d=Array(16),e=0;e<16;e++)d[e]=a[e]^c[e];return d};a.blockIV=function(){var a=new SecureRandom,c=Array(16);a.nextBytes(c);return c};a.pad16=function(a){var c=a.slice(0),d=(16-a.length%16)%16;for(i=a.length;i<a.length+d;i++)c.push(0);return c};a.depad=function(a){for(a=a.slice(0);a[a.length-1]==0;)a=a.slice(0,a.length-1);return a};a.encryptAESCBC=function(b,c){var d=c.slice(0);aes.ExpandKey(d);for(var e=a.string2bytes(b),
e=a.pad16(e),g=a.blockIV(),h=0;h<e.length/16;h++){var f=e.slice(h*16,h*16+16),o=g.slice(h*16,h*16+16),f=a.blockXOR(o,f);aes.Encrypt(f,d);g=g.concat(f)}d=a.bytes2string(g);return a.b256to64(d)};a.decryptAESCBC=function(b,c){var d=c.slice(0);aes.ExpandKey(d);for(var b=a.b64to256(b),e=a.string2bytes(b),g=[],h=1;h<e.length/16;h++){var f=e.slice(h*16,h*16+16),o=e.slice((h-1)*16,(h-1)*16+16);aes.Decrypt(f,d);f=a.blockXOR(o,f);g=g.concat(f)}g=a.depad(g);return a.bytes2string(g)};a.wrap60=function(a){for(var c=
"",d=0;d<a.length;d++)d%60==0&&d!=0&&(c+="\n"),c+=a[d];return c};a.generateAESKey=function(){var a=Array(16);(new SecureRandom).nextBytes(a);return a};a.generateRSAKey=function(a,c){Math.seedrandom(sha256.hex(a));var d=new RSAKey;d.generate(c,"10001");return d};a.publicKeyString=function(b){return pubkey=b.n.toString(16)};a.publicKeyID=function(a){return MD5(a)};a.publicKeyFromString=function(b){var b=b.split("|")[0],c=new RSAKey;c.setPublic(b,"10001");return c};a.encrypt=function(b,
c,d){var e="";try{var h=a.publicKeyFromString(c);e+=h.encrypt(b)+"?"}catch(f){return{status:"Invalid public key"}};return{status:"success",cipher:e}};a.decrypt=function(b,c){var d=b.split("?"),e=c.decrypt(d[0]);return{status:"success",plaintext:e,signature:"unsigned"}};return a}();
\ No newline at end of file
/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,
2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);
a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,
e)).finalize(b)}}});var n=d.algo={};return d}(Math);
(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,
l)}})();
CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},
finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=
c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,
e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
/*! jQuery v1.7.1 jquery.com | jquery.org/license */
(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,t2=/(trident.*rv:)([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||t2.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];if(b.length>0&& b[1].indexOf("trident")>-1){b[1]="msie"}return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
<template>
<div class="common-page device-manage">
<div class="option page-row">
<!--工具栏-->
<div class="head-container">
<!-- 搜索 -->
<label class="el-form-item-label" style="font-weight: 500;">设备识别码</label>
<el-input v-model="query.code" clearable size="small" placeholder="请输入设备识别码" style="width:180px;" @clear="clearLimit"/>
<el-button size="mini" type="success" icon="el-icon-search" @click="toSearch">搜索</el-button>
</div>
</div>
<div class="panel-bottom page-row">
<h3>设备管理列表</h3>
<div class="ctin-box">
<div class="content-within">
<div class="content-fix">
<div class="toolbar">
<el-button size="mini" type="primary" icon="el-icon-plus" @click="toAdd">新增</el-button>
</div>
<div class="content">
<el-table :data="tableData" v-loading="loading" border style="width:auto" :row-class-name="tableRowClassName">
<el-table-column prop="id" label="设备ID" align="center"></el-table-column>
<el-table-column prop="code" label="设备识别码" align="center"></el-table-column>
<el-table-column prop="name" label="设备名称" align="center"></el-table-column>
<el-table-column prop="alarmWindspeed" label="风速报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmTemperature" label="温度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmHumidity" label="湿度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmCo2" label="二氧化碳报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmMlux" label="光照报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmPh" label="酸碱度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmWaterTemperature" label="水温报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmElectricalConductance" label="电导率报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmWaterDepth" label="液位报警阈值" align="center"></el-table-column>
<el-table-column prop="createTime" label="设备激活时间" align="center"></el-table-column>
<el-table-column prop="addTime" label="最后采集时间" align="center"></el-table-column>
<el-table-column prop="projectId" label="所属项目" align="center" :formatter="formatter"></el-table-column>
<el-table-column label="操作" min-width="180px" align="center" fixed="right">
<template slot-scope="scope">
<el-button size="mini" type="success" icon="el-icon-view" @click="toSeeMore(scope.row)"></el-button>
<el-button size="mini" type="primary" icon="el-icon-edit" @click="toEdit(scope.row)"></el-button>
<el-button size="mini" type="danger" icon="el-icon-delete" @click="toDelete(scope.row)"></el-button>
<!-- <div class="btn-groub2">
<el-button size="mini" type="warning" icon="el-icon-set-up" @click="toInstructionSet(scope.row)"></el-button>
<el-button size="mini" type="info" icon="el-icon-tickets" @click="toInstructionLog(scope.row)"></el-button>
</div> -->
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<el-pagination :total="total" :current-page="page" style="margin-top: 8px;" layout="total, prev, pager, next, sizes" @size-change="sizeChange" @current-change="pageChange" />
</div>
</div>
</div>
</div>
</div>
<!-- 表单渲染 -->
<el-dialog append-to-body :close-on-click-modal="true" :before-close="cancelForm" :visible.sync="form.visible" :title="form.title" width="700px">
<el-form :model="form.item" :rules="rules" ref="form1" :inline="true" size="small" label-width="150px">
<el-form-item label="选择项目" prop="projectId" >
<el-select v-model="form.item.projectId" placeholder="请选择项目" size="small">
<el-option v-for="(obj,index) in form.selectList" :label="obj.name" :value="obj.id" :key="index"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="设备ID" prop="id">
<el-input v-model="form.item.id" style="width:280px;" placeholder="请输入设备编号" :disabled="form.reqType==='edit'"/>
</el-form-item> -->
<el-form-item label="设备识别码" prop="code">
<el-input v-model="form.item.code" style="width:260px;" placeholder="请输入设备识别码" :disabled="form.reqType==='edit'"/>
</el-form-item>
<el-form-item label="设备名称" prop="name">
<el-input v-model="form.item.name" style="width:260px;" placeholder="请输入设备名称"/>
</el-form-item>
<el-form-item label="风速报警阈值" prop="alarmWindspeed" >
<el-input v-model="form.item.alarmWindspeed" style="width:160px;" placeholder="请输入风速报警阈值"/>
</el-form-item>
<el-form-item label="温度报警阈值" prop="alarmTemperature" >
<el-input v-model="form.item.alarmTemperature" style="width:160px;" placeholder="请输入温度报警阈值"/>
</el-form-item>
<el-form-item label="湿度报警阈值" prop="alarmHumidity" >
<el-input v-model="form.item.alarmHumidity" style="width:160px;" placeholder="请输入湿度报警阈值"/>
</el-form-item>
<el-form-item label="二氧化碳报警阈值" prop="alarmCo2" >
<el-input v-model="form.item.alarmCo2" style="width:160px;" placeholder="请输入二氧化碳报警阈值"/>
</el-form-item>
<el-form-item label="光照报警阈值" prop="alarmMlux" >
<el-input v-model="form.item.alarmMlux" style="width:160px;" placeholder="请输入光照报警阈值"/>
</el-form-item>
<el-form-item label="酸碱度报警阈值" prop="alarmPh" >
<el-input v-model="form.item.alarmPh" style="width:160px;" placeholder="请输入酸碱度报警阈值"/>
</el-form-item>
<el-form-item label="水温报警阈值" prop="alarmWaterTemperature" >
<el-input v-model="form.item.alarmWaterTemperature" style="width:160px;" placeholder="请输入水温报警阈值"/>
</el-form-item>
<el-form-item label="电导率报警阈值" prop="alarmElectricalConductance" >
<el-input v-model="form.item.alarmElectricalConductance" style="width:160px;" placeholder="请输入电导率报警阈值"/>
</el-form-item>
<el-form-item label="液位报警阈值" prop="alarmWaterDepth" >
<el-input v-model="form.item.alarmWaterDepth" style="width:160px;" placeholder="请输入液位报警阈值"/>
</el-form-item>
<el-form-item label="上传设备位置" prop="position">
<el-input v-model="picFileName" style="width:160px;" placeholder="请上传设备位置" disabled />
<input type="file" name="image" @change="excelImport($event)" />
</el-form-item>
<div style="margin:0px 0px 10px 55px;font-size:16px;font-weight:bold;">摄像头参数配置</div>
<el-form-item label="摄像头ID" prop="camera">
<el-input v-model="form.item.camera" style="width:160px;" placeholder="请输入摄像头ID"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelForm">取消</el-button>
<el-button :loading="form.status.cu === 2" type="primary" @click="submitForm('form1', form.item)">确认</el-button>
</div>
</el-dialog>
<!-- 查看更多 -->
<el-dialog title="查看设备" :visible.sync="form.seeMoreDialog" width="800px">
<el-form :model="seeMoreData" style="margin-top:20px;">
<el-form-item label="摄像头位置图片" label-width="150px">
<el-image :src="seeMoreImgUrl" style="width:300px;"></el-image>
</el-form-item>
<el-form-item label="摄像头图像" label-width="150px">
<div id="video-container" style="width:550px;height:350px"></div>
</el-form-item>
<el-form-item label="摄像头ID" label-width="150px">
<el-input v-model="seeMoreData.camera" style="width:200px"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="form.seeMoreDialog = false">关闭</el-button>
</div>
</el-dialog>
<!-- 历史图表 -->
<el-dialog class="ecahrt1-dialog" append-to-body :close-on-click-modal="false" :before-close="cancelForm2" :visible.sync="form.historyDialog">
<el-form :rules="rules" ref="form1" :inline="true" size="small" label-width="80px">
<!-- <el-form-item prop="eprogramid" >
<el-select v-model="form.item2.value" placeholder="请选择月份">
<el-option v-for="obj in form.monthSelectList" :label="obj.name" :value="obj.value"></el-option>
</el-select>
</el-form-item> -->
<el-form-item prop="eprogramid" >
<date-range-picker v-model="query.timeSpace" class="date-item" />
</el-form-item>
<el-form-item >
<el-button type="primary" @click="findHistory">查询</el-button>
</el-form-item>
<el-form-item prop="content" style="display:block;" >
<div class="form-body">
<div id="ecahrtA"></div>
</div>
</el-form-item>
</el-form>
</el-dialog>
<!-- 指令下发 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="cancelForm3" :visible.sync="form2.visible" :title="form2.title" width="600px">
<el-form :model="form2.item" :rules="rules" ref="form2" :inline="true" size="small" label-width="100px">
<el-form-item label="设备ID" prop="ecode">
<el-input v-model="form2.item.ecode" style="width:280px;" placeholder="请输入设备编号" :disabled="form2.reqType==='edit'"/>
</el-form-item>
<el-form-item label="设备识别码" prop="subcode">
<el-input v-model="form2.item.subcode" style="width:260px;" placeholder="请输入设备识别码" :disabled="form2.reqType==='edit'"/>
</el-form-item>
<el-form-item label="是否启动校正" prop="ilAdjust" style="width:240px;">
<el-select v-model="form2.item.ilAdjust" placeholder="请选择" size="small" style="width:120px;">
<el-option v-for="obj in form2.adjustList" :label="obj.name" :key="obj.value" :value="obj.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否存储裂缝" prop="ilSave" style="width:240px;">
<el-select v-model="form2.item.ilSave" placeholder="请选择" size="small" style="width:120px;">
<el-option v-for="(obj,index) in form2.saveList" :label="obj.name" :value="obj.value" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item label="裂缝阈值" prop="ilThreshed" >
<el-input v-model="form2.item.ilThreshed" style="width:160px;" placeholder="请输入裂缝阈值"/>
<span style="color:#aaa;">1~255</span>
</el-form-item>
<el-form-item label="唤醒周期" prop="timekey" >
<el-select v-model="form2.item.timekey" placeholder="请选择时间" size="small" style="width:120px;">
<el-option v-for="(obj,index) in form2.timeList" :label="obj.name" :value="obj.value" :key="index"></el-option>
</el-select>
<el-input v-model="form2.item.time" style="width:160px;" placeholder="请输入时长"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelForm3">取消</el-button>
<el-button :loading="form2.status.cu === 2" type="primary" @click="reqSetInstruction('form2', form2.item)">确认</el-button>
</div>
</el-dialog>
<!-- 指令日志 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="cancelForm4" :visible.sync="form2.logVisible" :title="form2.title" width="65%">
<div class="content">
<el-table :data="form2.formData" v-loading="loading" border style="width:auto" :row-class-name="tableRowClassName">
<el-table-column prop="subcode" label="设备识别码" min-width="135px"></el-table-column>
<el-table-column prop="ilThreshed" label="裂缝阈值"></el-table-column>
<el-table-column prop="ilAdjust" label="校正功能"></el-table-column>
<el-table-column prop="ilSave" label="存储裂缝" ></el-table-column>
<el-table-column prop="ilSendTime" label="唤醒时间">
<template slot-scope="scope">
{{scope.row.time + '('+scope.row.timeUnit+')'}}
</template>
</el-table-column>
<el-table-column prop="ilSendSuccess" label="下发状态" ></el-table-column>
<el-table-column prop="ilSendTime" label="下发时间" min-width="145px"></el-table-column>
</el-table>
<!--分页组件-->
<el-pagination :total="form2.total" :current-page="form2.page" style="margin-top:8px;" layout="total, prev, pager, next, sizes" @size-change="sizeChange2" @current-change="pageChange2" />
</div>
</el-dialog>
<div id="app">
<EZUIKitJs />
</div>
</template>
<script>
import echarts from 'echarts';
import { Tools, HttpReq, Dates} from '@/assets/js/common.js';
import DateRangePicker from '@/components/DateRangePicker';
import cuAmap from '@/components/AMap';
import Axios from 'axios'
import EZUIKit from "ezuikit-js";
import EZUIKitJs from '../../../components/ezuikit/EZUIKitJs.vue'
export default {
name: 'Dashboard',
components: {
DateRangePicker, cuAmap
},
data() {
return {
loading: false,
page: 1,
size: 10,
total: 0,
query:{},
picFileName:'',
tableData: [],
seeMoreData:{},
seeMoreImgUrl:"",
form: {
title:'添加设备', visible:false, reqType:'add', historyDialog:false,seeMoreDialog:false,
status:{cu:0},
selectList:[],
item:{},
monthSelectList:[
{name:'一月', value:'01'},
{name:'二月', value:'02'},
{name:'三月', value:'03'},
{name:'四月', value:'04'},
{name:'五月', value:'05'},
{name:'六月', value:'06'},
{name:'七月', value:'07'},
{name:'八月', value:'08'},
{name:'九月', value:'09'},
{name:'十月', value:'10'},
{name:'十一月', value:'11'},
{name:'十二月', value:'12'},
],
item2:{
value:''
},
},
rules: {
projectId: [
{required: true, message: '请选择项目', trigger: 'blur' }
],
id: [
{required: true, message: '请输入设备ID', trigger: 'blur' }
],
code: [
{required: true, message: '请输入设备识别码', trigger: 'blur' }
],
name: [
{required: true, message: '请输入设备名称', trigger: 'blur' }
],
},
form2:{
title:'指令下发', visible:false, logDialog:false, logVisible:false,
query:{},
page: 1,
size: 10,
total: 0,
status:{cu:0},
item:{
ecode: "",
ename:'',
ilAdjust:0,
ilSave:0,
time:'',
ilThreshed:0,
timekey:'ilTimHour',
},
adjustList:[
{name:'启动', value:1},
{name:'不启动', value:0},
],
saveList:[
{name:'存储', value:1},
{name:'不存储', value:0},
],
timeList:[
{name:'', value:'ilTimHour'},
{name:'', value:'ilTimMins'},
{name:'', value:'ilTimSec'},
],
formData:[],
},
}
},
mounted() {
var that = this;
this.$nextTick(() => {
this.loadData();
})
},
methods: {
loadData() {
var that = this;
var sort = 'addTime,desc';
var param = this.query;
param.page = this.page - 1;
param.size = this.size;
param.sort = sort;
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list;
});
this.$nextTick(()=>{
HttpReq.plantFactory.getDeviceManageList(param).then((res) => {
//console.log(res);
this.loading = false;
this.tableData = res.content;
this.total = res.totalElements;
})
})
},
tableRowClassName({row, rowIndex}) {
if (rowIndex === 1) {
return 'warning-row';
} else if (rowIndex === 3) {
return 'success-row';
}
return '';
},
// 点击搜索
toSearch() {
this.page = 1
this.loadData()
},
clearLimit(){ // 清除限制
this.loadData()
},
cancelForm(a, b, c){
this.form.visible = false;
},
cancelForm2(){
this.form.historyDialog = false;
},
toAdd() {
// 请除表单验证
this.$refs['form1'] && this.$refs['form1'].clearValidate();
this.form.title = '添加设备';
this.form.status.cu = 0;
this.form.visible = true;
this.form.reqType = 'add';
this.form.item = {};
this.picFileName = '';
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list
});
},
toEdit(item) {
// 请除表单验证
this.$refs['form1'] && this.$refs['form1'].clearValidate();
this.form.title = '编辑设备';
this.form.status.cu = 0;
this.form.visible = true;
this.form.item = item;
this.form.reqType = 'edit';
this.picFileName = this.form.item.position;
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list
});
},
toDelete(item) {
var id = item.id;
this.$confirm('确认删除该条数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then((e) => {
this.reqRemoveProject([id])
}).catch((e) => {
})
},
//查看图片以及其他信息
toSeeMore(row){
//console.log(row);
this.seeMoreData = row;
this.seeMoreImgUrl = process.env.VUE_APP_LOCAL_API2 + "/avatar/" + row.position;
this.form.seeMoreDialog = true;
this.$nextTick(()=>{
let videoContainer = document.querySelector('#video-container');
videoContainer.innerHTML = '';
var player = new EZUIKit.EZUIKitPlayer({
autoplay: true,
id: 'video-container',
accessToken:'at.4qo66bb35a19h07a0d9pbmtj5v4g0o78-4jmzdu3k24-0866je6-qkz1xuwmf',
url: 'ezopen://open.ys7.com/J16440511/1.live',
template: "simple", // simple - 极简版;standard-标准版;security - 安防版(预览回放);voice-语音版;
width: 530,
height: 320
});
})
},
toHistoryLog(item){
this.form.historyDialog = true;
this.form.item2.value = Dates.format('MM');
this.form.item2.code = item.ecode;
this.$nextTick(() => {
var ecahrtEl = document.getElementById("ecahrtA");
this.ecahrtA = this.ecahrtA || this.createPanelEcharts(ecahrtEl);
this.reqHistoryList(this.form.item2);
});
EZUIKitJs
},
cancelForm3(a, b, c){
this.form2.visible = false;
},
cancelForm4(a, b, c){
this.form2.logVisible = false;
},
// 指令下发
toInstructionSet(item){
var form2 = this.form2;
// 请除表单验证
//this.$refs['form1'] && this.$refs['form1'].clearValidate();
form2.title = '指令下发';
form2.status.cu = 0;
form2.visible = true;
form2.reqType = 'edit';
form2.item = {
ecode:item.ecode,
subcode:item.subcode,
ilAdjust:form2.item.ilAdjust,
ilSave:form2.item.ilSave,
timekey:form2.item.timekey,
time:'',
};
},
// 指令日志
toInstructionLog(item){
var form2 = this.form2;
// 请除表单验证
//this.$refs['form1'] && this.$refs['form1'].clearValidate();
form2.title = '下发日志';
form2.logVisible = true;
form2.item = item;
var param = form2.query;
param.page = form2.page - 1;
param.size = form2.size;
param.sort = 'addTime,desc';
param.deviceId = item.ecode;
HttpReq.equipment.getInstructionLog(param).then((res) => {
if(res){
form2.total = res.totalElements;
var formData = res.content || [],
timeKeys = {'ilTimHour':'小时','ilTimMins':'分钟','ilTimSec':''};
for(var fitem of formData){
fitem.subcode = item.subcode;
for(var key in timeKeys){
if(fitem[key] || fitem[key] === 0){
fitem['time'] = fitem[key];
fitem.timeUnit = timeKeys[key];
}else{
delete fitem[key]
}
};
fitem.ilAdjust = ['不启动', '启动'][fitem.ilAdjust || 0];
fitem.ilSave = ['不存储', '存储'][fitem.ilSave || 0];
fitem.ilSendSuccess = ['下发失败', '下发成功'][fitem.ilSendSuccess || 0];
};
form2.formData = formData;
};
}).catch(function(error) {
console.log('error ________________ ', error);
});
},
pageChange(e) {
this.page = e
this.loadData()
},
sizeChange(e) {
this.page = 1
this.size = e
this.loadData()
},
pageChange2(e) {
this.form2.page = e
this.reqInstructionLog(this.form2.item)
},
sizeChange2(e) {
this.form2.page = 1;
this.form2.size = e;
this.reqInstructionLog(this.form2.item);
},
submitForm(validateName, item){
if(!this.form.status.cu){
this.form.status.cu = 2;
this.$refs[validateName].validate(valid => {
if(valid){
if(this.form.reqType === 'add'){
this.reqAddItem(this.form, item)
}else{
this.reqUpdateItem(this.form, item)
}
}else{
this.form.status.cu = 0
}
});
};
},
findHistory(){
this.reqHistoryList(this.form.item2);
},
//请求项目列表
reqProjectsSimple(){
return HttpReq.project.getProject().then((res) => {
if(res.code == 200){
return res.data.content;
}else{
return []
}
})
},
//添加设备
reqAddItem(form, item){
let lastData = item;
lastData.position = this.picFileName;
HttpReq.plantFactory.addDeviceManageList(lastData).then((res) => {
form.visible = false;
if(res == 1){
this.$notify({
title: '项目添加成功!',
type: 'success',
duration: 2500
});
this.loadData()
}else{
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}
}).catch(function(error) {
form.status.cu = 0
});
},
//修改设备
reqUpdateItem(form, item){
let lastData = item;
lastData.position = this.picFileName;
HttpReq.plantFactory.upDateDeviceManageList(lastData).then((res) => {
form.visible = false;
if(res.status == 400){
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}else{
this.$notify({
title: '修改成功!',
type: 'success',
duration: 2500
});
this.loadData()
}
}).catch(function(error) {
form.status.cu = 0
});
},
//删除设备
reqRemoveProject(item){
HttpReq.plantFactory.removeDeviceManageList(item).then((res) => {
if(res.status == 400){
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}else{
this.$notify({
title: '删除成功!',
type: 'success',
duration: 2500
});
}
this.loadData();
})
},
reqHistoryList(item){
var timeSpace = this.query.timeSpace;
var startTime = timeSpace ? timeSpace[0].split(' ')[0] : '';
var endTime = timeSpace ? timeSpace[1].split(' ')[0] : '';
HttpReq.historys.getItemBycode({codes:item.code, startTime:startTime, endTime:endTime}).then((res) => {
if(res.head.code === '0000'){
var body = res.body || {};
var list = body.list || [];
var xAxisData = [];
var helement = [];
var htemperature = [];
var hlenght1 = [], hlenght2 = [], hlenght3 = [];
for(var item of list){
xAxisData.push(item.createTime);
helement.push(item.helement);
htemperature.push(item.htemperature);
hlenght1.push(item.hlenght1);
hlenght2.push(item.hlenght2);
hlenght3.push(item.hlenght3);
};
this.ecahrtA.setData({
xAxis: [
{
type: 'category',
data: xAxisData,
},
],
series: [
{
name: '电压',
data: helement,
},
{
name: '温度',
data: htemperature,
},
{
name: '裂缝1',
data: hlenght1,
},
{
name: '裂缝2',
data: hlenght2,
},
{
name: '裂缝3',
data: hlenght3,
}
]
})
};
}).catch(function(error) {
console.log('catch __ ', error);
})
},
createPanelEcharts(el){
var myChart = echarts.init(el),
lineColor = 'green';
var option = {
title: {
text: '',
subtext: '设备值'
},
tooltip: {
trigger: 'axis'
},
legend: {
data: ['电压', '温度', '裂缝1', '裂缝2', '裂缝3'],
textStyle: {
color: "#000"
},
},
textStyle: {
color: "#333"
},
calculable: true,
xAxis: [
{
type: 'category',
data: [],
}
],
yAxis: [
{
type: 'value',
}
],
grid:{
top:40,
right:10,
bottom:20,
left:45,
},
series: [
{
name: '电压',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
//itemStyle: {normal: {areaStyle: {type: 'default', color:'#00e5ff'}, color:'#00e5ff'}, color:'green'},
},
{
name: '温度',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
},
{
name: '裂缝1',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
//itemStyle: {normal: {areaStyle: {type:'default', color:'red'}, color:'#1849fe'}, color:'red'},
},
{
name: '裂缝2',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
},
{
name: '裂缝3',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
}
]
};
myChart.setOption(option);
var setData = function(option){
myChart.hideLoading();
myChart.setOption(option)
};
return {setData:setData, myChart:myChart}
},
reqSetInstruction(form, item){
var param = {
deviceId:item.ecode,
ilAdjust:item.ilAdjust,
ilSave:item.ilSave,
ilThreshed:item.ilThreshed || 0,
[item.timekey]:item.time || 0,
};
HttpReq.equipment.setInstruction(param).then((res) => {
this.form2.visible = false;
this.$notify({
title: '修改成功!',
type: 'success',
duration: 2500
});
this.loadData()
}).catch(function(error) {
this.form2.status.cu = 0;
this.$notify({
title: error,
type: 'error',
duration: 2500
})
});
},
reqInstructionLog(item){
var form2 = this.form2;
var param = form2.query;
param.page = form2.page - 1;
param.size = form2.size;
param.sort = 'addTime,desc';
param.deviceId = item.ecode;
HttpReq.equipment.getInstructionLog(param).then((res) => {
if(res){
form2.total = res.totalElements;
var formData = res.content || [],
timeKeys = {'ilTimHour':'小时','ilTimMins':'分钟','ilTimSec':''};
for(var fitem of formData){
fitem.subcode = item.subcode;
for(var key in timeKeys){
if(fitem[key]){
fitem['time'] = fitem[key];
fitem.timeUnit = timeKeys[key];
}else{
delete fitem[key]
}
};
fitem.ilAdjust = ['不启动', '启动'][fitem.ilAdjust || 0];
fitem.ilSave = ['不存储', '存储'][fitem.ilSave || 0];
fitem.ilSendSuccess = ['下发失败', '下发成功'][fitem.ilSendSuccess || 0];
};
form2.formData = formData;
};
}).catch(function(error) {
console.log('error ________________ ', error);
});
},
//图片上传
excelImport(event) {
let that = this;
let file = event.target.files[0];
let formData1 = new FormData();
formData1.append("avatar", file);
Axios({
url: process.env.VUE_APP_LOCAL_API2 + '/api/wEquipment/updateAvatar',
method: "post",
data: formData1,
}).then(
response => {
if (response.status == 200) {
this.$message.success("上传成功");
that.picFileName = response.data.avatar;
} else {
this.$message.error("上传失败");
}
},
)
.catch(error => {
console.log(error);
});
},
//项目名称展示
formatter(row){
let proName = "";
this.form.selectList.forEach(function(item){
if(row.projectId == item.id){
proName = item.name;
}
})
return proName
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scope>
.el-table .warning-row {
background: oldlace;
}
.el-table .success-row {
background: #f0f9eb;
}
.device-manage{
.panel-bottom{
.el-button{margin:2px 0;padding:6px 15px;font-size:14px;}
.btn-groub2{
display:inline-block;
.el-button{margin:2px 0;padding:6px 15px;font-size:15px;}
.el-button--warning {
background-color: #e6a23c;
border-color: #e6a23c;
}
.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;}
}
}
}
.ecahrt1-dialog{
display:flex;align-items:center;
.el-dialog{
margin-top:inherit !important;display:table !important;width:fit-content;
.el-form-item{margin-right:0;}
}
.el-dialog__header{height:0;padding:0;display:block;}
.form-body{
border:1px solid #999;width:800px;height:500px;position:relative;
>div{position:absolute;top:0;left:0;height:100%;width:100%;}
}
}
<style scoped>
#app {
background-color: white;
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
}
*{
margin: 0;
padding: 0;
}
</style>
\ No newline at end of file
<template>
<div class="common-page device-manage">
<div class="option page-row">
<!--工具栏-->
<div class="head-container">
<!-- 搜索 -->
<label class="el-form-item-label" style="font-weight: 500;">设备识别码</label>
<el-input v-model="query.code" clearable size="small" placeholder="请输入设备识别码" style="width:180px;" @clear="clearLimit"/>
<el-button size="mini" type="success" icon="el-icon-search" @click="toSearch">搜索</el-button>
</div>
</div>
<div class="panel-bottom page-row">
<h3>设备管理列表</h3>
<div class="ctin-box">
<div class="content-within">
<div class="content-fix">
<div class="toolbar">
<el-button size="mini" type="primary" icon="el-icon-plus" @click="toAdd">新增</el-button>
<div class="iframeBody">
<!-- 分区设置 -->
<div class="leftMenuBar">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>监控分区</span>
<el-button style="float: right; padding: 3px 0" type="text" @click="zoneEdit('add')">添加分区</el-button>
</div>
<div class="content">
<el-table :data="tableData" v-loading="loading" border style="width:auto" :row-class-name="tableRowClassName">
<el-table-column prop="id" label="设备ID" align="center"></el-table-column>
<el-table-column prop="code" label="设备识别码" align="center"></el-table-column>
<el-table-column prop="name" label="设备名称" align="center"></el-table-column>
<el-table-column prop="alarmWindspeed" label="风速报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmTemperature" label="温度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmHumidity" label="湿度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmCo2" label="二氧化碳报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmMlux" label="光照报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmPh" label="酸碱度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmWaterTemperature" label="水温报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmElectricalConductance" label="电导率报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmWaterDepth" label="液位报警阈值" align="center"></el-table-column>
<el-table-column prop="createTime" label="设备激活时间" align="center"></el-table-column>
<el-table-column prop="addTime" label="最后采集时间" align="center"></el-table-column>
<el-table-column prop="projectId" label="所属项目" align="center" :formatter="formatter"></el-table-column>
<el-table-column label="操作" min-width="180px" align="center" fixed="right">
<div class="text item">
<el-table :data="main_camera" border style="width: 100%" @row-click="gridClick">
<el-table-column prop="id" label="NO." align="center" width="60"></el-table-column>
<el-table-column prop="name" label="分区名称" align="left"></el-table-column>
<el-table-column label="操作" width="150" align="center">
<template slot-scope="scope">
<el-button size="mini" type="success" icon="el-icon-view" @click="toSeeMore(scope.row)"></el-button>
<el-button size="mini" type="primary" icon="el-icon-edit" @click="toEdit(scope.row)"></el-button>
<el-button size="mini" type="danger" icon="el-icon-delete" @click="toDelete(scope.row)"></el-button>
<!-- <div class="btn-groub2">
<el-button size="mini" type="warning" icon="el-icon-set-up" @click="toInstructionSet(scope.row)"></el-button>
<el-button size="mini" type="info" icon="el-icon-tickets" @click="toInstructionLog(scope.row)"></el-button>
</div> -->
<el-button size="mini" round type="primary" @click="zoneEdit('change',scope.row)">编辑</el-button>
<el-button size="mini" round type="danger" @click="zoneDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<el-pagination :total="total" :current-page="page" style="margin-top: 8px;" layout="total, prev, pager, next, sizes" @size-change="sizeChange" @current-change="pageChange" />
</div>
</div>
</div>
</div>
</div>
</el-card>
<!-- 表单渲染 -->
<el-dialog append-to-body :close-on-click-modal="true" :before-close="cancelForm" :visible.sync="form.visible" :title="form.title" width="700px">
<el-form :model="form.item" :rules="rules" ref="form1" :inline="true" size="small" label-width="150px">
<el-form-item label="选择项目" prop="projectId" >
<el-select v-model="form.item.projectId" placeholder="请选择项目" size="small">
<el-option v-for="(obj,index) in form.selectList" :label="obj.name" :value="obj.id" :key="index"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="设备ID" prop="id">
<el-input v-model="form.item.id" style="width:280px;" placeholder="请输入设备编号" :disabled="form.reqType==='edit'"/>
</el-form-item> -->
<el-form-item label="设备识别码" prop="code">
<el-input v-model="form.item.code" style="width:260px;" placeholder="请输入设备识别码" :disabled="form.reqType==='edit'"/>
</el-form-item>
<el-form-item label="设备名称" prop="name">
<el-input v-model="form.item.name" style="width:260px;" placeholder="请输入设备名称"/>
</el-form-item>
<el-form-item label="风速报警阈值" prop="alarmWindspeed" >
<el-input v-model="form.item.alarmWindspeed" style="width:160px;" placeholder="请输入风速报警阈值"/>
<el-dialog :title="zoneTitle" :visible.sync="zoneVisible" width="30%">
<el-form ref="zoneData" :rules="rules" :model="zoneData" label-width="80px">
<el-form-item label="分区名称" style="margin-bottom:15px;" prop="name">
<el-input v-model="zoneData.name" ></el-input>
</el-form-item>
<el-form-item label="温度报警阈值" prop="alarmTemperature" >
<el-input v-model="form.item.alarmTemperature" style="width:160px;" placeholder="请输入温度报警阈值"/>
</el-form-item>
<el-form-item label="湿度报警阈值" prop="alarmHumidity" >
<el-input v-model="form.item.alarmHumidity" style="width:160px;" placeholder="请输入湿度报警阈值"/>
</el-form-item>
<el-form-item label="二氧化碳报警阈值" prop="alarmCo2" >
<el-input v-model="form.item.alarmCo2" style="width:160px;" placeholder="请输入二氧化碳报警阈值"/>
</el-form-item>
<el-form-item label="光照报警阈值" prop="alarmMlux" >
<el-input v-model="form.item.alarmMlux" style="width:160px;" placeholder="请输入光照报警阈值"/>
</el-form-item>
<el-form-item label="酸碱度报警阈值" prop="alarmPh" >
<el-input v-model="form.item.alarmPh" style="width:160px;" placeholder="请输入酸碱度报警阈值"/>
</el-form-item>
<el-form-item label="水温报警阈值" prop="alarmWaterTemperature" >
<el-input v-model="form.item.alarmWaterTemperature" style="width:160px;" placeholder="请输入水温报警阈值"/>
</el-form-item>
<el-form-item label="电导率报警阈值" prop="alarmElectricalConductance" >
<el-input v-model="form.item.alarmElectricalConductance" style="width:160px;" placeholder="请输入电导率报警阈值"/>
</el-form-item>
<el-form-item label="液位报警阈值" prop="alarmWaterDepth" >
<el-input v-model="form.item.alarmWaterDepth" style="width:160px;" placeholder="请输入液位报警阈值"/>
</el-form-item>
<el-form-item label="上传设备位置" prop="position">
<el-input v-model="picFileName" style="width:160px;" placeholder="请上传设备位置" disabled />
<input type="file" name="image" @change="excelImport($event)" />
</el-form-item>
<div style="margin:0px 0px 10px 55px;font-size:16px;font-weight:bold;">摄像头参数配置</div>
<el-form-item label="摄像头ID" prop="camera">
<el-input v-model="form.item.camera" style="width:160px;" placeholder="请输入摄像头ID"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelForm"></el-button>
<el-button :loading="form.status.cu === 2" type="primary" @click="submitForm('form1', form.item)">确认</el-button>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="zoneCancel()" style="padding:10px;"></el-button>
<el-button type="primary" @click="zoneSave()" style="padding:10px;">确 定</el-button>
</span>
</el-dialog>
<!-- 查看更多 -->
<el-dialog title="查看设备" :visible.sync="form.seeMoreDialog" width="800px">
<el-form :model="seeMoreData" style="margin-top:20px;">
<el-form-item label="摄像头位置图片" label-width="150px">
<el-image :src="seeMoreImgUrl" style="width:300px;"></el-image>
</el-form-item>
<el-form-item label="摄像头图像" label-width="150px">
<div id="video-container" style="width:550px;height:350px"></div>
</el-form-item>
<el-form-item label="摄像头ID" label-width="150px">
<el-input v-model="seeMoreData.camera" style="width:200px"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="form.seeMoreDialog = false">关闭</el-button>
</div>
<el-dialog title="提示" :visible.sync="zoneDeleteVisible" width="30%">
你确定删除该分区吗?
<span slot="footer" class="dialog-footer">
<el-button @click="cancelDeleteZone()" style="padding:10px;">取消</el-button>
<el-button type="danger" @click="agreeDeleteZone()" style="padding:10px;">删除</el-button>
</span>
</el-dialog>
<!-- 历史图表 -->
<el-dialog class="ecahrt1-dialog" append-to-body :close-on-click-modal="false" :before-close="cancelForm2" :visible.sync="form.historyDialog">
<el-form :rules="rules" ref="form1" :inline="true" size="small" label-width="80px">
<!-- <el-form-item prop="eprogramid" >
<el-select v-model="form.item2.value" placeholder="请选择月份">
<el-option v-for="obj in form.monthSelectList" :label="obj.name" :value="obj.value"></el-option>
</el-select>
</el-form-item> -->
<el-form-item prop="eprogramid" >
<date-range-picker v-model="query.timeSpace" class="date-item" />
</el-form-item>
<el-form-item >
<el-button type="primary" @click="findHistory">查询</el-button>
</el-form-item>
<el-form-item prop="content" style="display:block;" >
<div class="form-body">
<div id="ecahrtA"></div>
</div>
</el-form-item>
</el-form>
</el-dialog>
<!-- 指令下发 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="cancelForm3" :visible.sync="form2.visible" :title="form2.title" width="600px">
<el-form :model="form2.item" :rules="rules" ref="form2" :inline="true" size="small" label-width="100px">
<el-form-item label="设备ID" prop="ecode">
<el-input v-model="form2.item.ecode" style="width:280px;" placeholder="请输入设备编号" :disabled="form2.reqType==='edit'"/>
</el-form-item>
<el-form-item label="设备识别码" prop="subcode">
<el-input v-model="form2.item.subcode" style="width:260px;" placeholder="请输入设备识别码" :disabled="form2.reqType==='edit'"/>
</el-form-item>
<el-form-item label="是否启动校正" prop="ilAdjust" style="width:240px;">
<el-select v-model="form2.item.ilAdjust" placeholder="请选择" size="small" style="width:120px;">
<el-option v-for="obj in form2.adjustList" :label="obj.name" :key="obj.value" :value="obj.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否存储裂缝" prop="ilSave" style="width:240px;">
<el-select v-model="form2.item.ilSave" placeholder="请选择" size="small" style="width:120px;">
<el-option v-for="(obj,index) in form2.saveList" :label="obj.name" :value="obj.value" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item label="裂缝阈值" prop="ilThreshed" >
<el-input v-model="form2.item.ilThreshed" style="width:160px;" placeholder="请输入裂缝阈值"/>
<span style="color:#aaa;">1~255</span>
</el-form-item>
<el-form-item label="唤醒周期" prop="timekey" >
<el-select v-model="form2.item.timekey" placeholder="请选择时间" size="small" style="width:120px;">
<el-option v-for="(obj,index) in form2.timeList" :label="obj.name" :value="obj.value" :key="index"></el-option>
</el-select>
<el-input v-model="form2.item.time" style="width:160px;" placeholder="请输入时长"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelForm3">取消</el-button>
<el-button :loading="form2.status.cu === 2" type="primary" @click="reqSetInstruction('form2', form2.item)">确认</el-button>
<!-- 摄像头明细 -->
<div class="rightVideoBox">
<el-card>
<div slot="header" class="clearfix">
<span>{{DetailTitle}}</span>
<el-button style="float: right; padding: 3px 0" type="text" @click="cameraDetaileEdit('add')">添加摄像头</el-button>
</div>
</el-dialog>
<!-- 指令日志 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="cancelForm4" :visible.sync="form2.logVisible" :title="form2.title" width="65%">
<div class="content">
<el-table :data="form2.formData" v-loading="loading" border style="width:auto" :row-class-name="tableRowClassName">
<el-table-column prop="subcode" label="设备识别码" min-width="135px"></el-table-column>
<el-table-column prop="ilThreshed" label="裂缝阈值"></el-table-column>
<el-table-column prop="ilAdjust" label="校正功能"></el-table-column>
<el-table-column prop="ilSave" label="存储裂缝" ></el-table-column>
<el-table-column prop="ilSendTime" label="唤醒时间">
<div class="text item">
<el-table :data="cameraDetail" border style="width: 100%" height="710">
<el-table-column prop="id" label="NO." align="center" width="60"></el-table-column>
<el-table-column prop="cameraName" label="区域名称" align="left"></el-table-column>
<el-table-column prop="cameraIp" label="区域IP" align="left"></el-table-column>
<el-table-column prop="brand" :formatter="formatter" label="商标" align="center"></el-table-column>
<el-table-column label="操作" width="150" align="center">
<template slot-scope="scope">
{{scope.row.time + '('+scope.row.timeUnit+')'}}
<el-button size="mini" round type="danger" @click="cameraDetaileDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
<el-table-column prop="ilSendSuccess" label="下发状态" ></el-table-column>
<el-table-column prop="ilSendTime" label="下发时间" min-width="145px"></el-table-column>
</el-table>
<!--分页组件-->
<el-pagination :total="form2.total" :current-page="form2.page" style="margin-top:8px;" layout="total, prev, pager, next, sizes" @size-change="sizeChange2" @current-change="pageChange2" />
</div>
</el-card>
<el-dialog :title="cameraDetailTitle" :visible.sync="cameraDetailVisible" width="30%">
<el-form ref="cameraDetailData" :rules="rulesDetai" :model="cameraDetailData" label-width="80px">
<el-form-item label="名称" style="margin-bottom:15px;" prop="cameraName">
<el-input v-model="cameraDetailData.cameraName"></el-input>
</el-form-item>
<el-form-item label="IP" style="margin-bottom:15px;" prop="cameraIp">
<el-input v-model="cameraDetailData.cameraIp"></el-input>
</el-form-item>
<el-form-item label="端口" style="margin-bottom:15px;">
<el-input v-model="cameraDetailData.cameraPort"></el-input>
</el-form-item>
<el-form-item label="商标" style="margin-bottom:15px;" prop="brand">
<el-input v-model="cameraDetailData.brand" placeholder="1(海康威视) 2(大华)"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="cameraDetaileCancel()" style="padding:10px;">取 消</el-button>
<el-button type="primary" @click="cameraDetaileSave()" style="padding:10px;">确 定</el-button>
</span>
</el-dialog>
<el-dialog title="提示" :visible.sync="cameraDetaileDeleteVisible" width="30%">
你确定删除该摄像头吗?
<span slot="footer" class="dialog-footer">
<el-button @click="cancelDeleteCameraDetaile()" style="padding:10px;">取消</el-button>
<el-button type="danger" @click="agreeDeleteCameraDetaile()" style="padding:10px;">删除</el-button>
</span>
</el-dialog>
</div>
</div>
</template>
<script>
import echarts from 'echarts';
import { Tools, HttpReq, Dates} from '@/assets/js/common.js';
import DateRangePicker from '@/components/DateRangePicker';
import cuAmap from '@/components/AMap';
import Axios from 'axios'
import EZUIKit from "ezuikit-js";
// import { httpGet,httpPostForJson,httpDelForJson,putForJson } from "@/common/httpBean.js"
// import {mainCamera,delCamera,addCamera,updateCamera,mainCameraDetail,addCameraDetail,delCameraDetail} from "@/axios/api.js"
export default {
name: 'Dashboard',
components: {
DateRangePicker, cuAmap
},
data() {
return {
loading: false,
page: 1,
size: 10,
total: 0,
query:{},
picFileName:'',
tableData: [],
seeMoreData:{},
seeMoreImgUrl:"",
form: {
title:'添加设备', visible:false, reqType:'add', historyDialog:false,seeMoreDialog:false,
status:{cu:0},
selectList:[],
item:{},
monthSelectList:[
{name:'一月', value:'01'},
{name:'二月', value:'02'},
{name:'三月', value:'03'},
{name:'四月', value:'04'},
{name:'五月', value:'05'},
{name:'六月', value:'06'},
{name:'七月', value:'07'},
{name:'八月', value:'08'},
{name:'九月', value:'09'},
{name:'十月', value:'10'},
{name:'十一月', value:'11'},
{name:'十二月', value:'12'},
],
item2:{
value:''
},
},
created(){
this.getCode()
},
data(){
return{
//分区部分
main_camera:[],
zoneTitle:"",
zoneVisible:false,
zoneType:"",
zoneData:{ name:"",cnt:"",},
zoneDeleteVisible:false,
//详情部分
cameraDetailAll:[],
cameraDetail:[],
cameraDetailName:"",
cameraDetailTitle:"",
cameraDetailVisible:false,
cameraDetailType:"",
cameraDetailData:{},
cameraDetaileDeleteVisible:false,
disabledInp:false,
camID:"1",
DetailTitle:"",
rules: {
projectId: [
{required: true, message: '请选择项目', trigger: 'blur' }
],
id: [
{required: true, message: '请输入设备ID', trigger: 'blur' }
],
code: [
{required: true, message: '请输入设备识别码', trigger: 'blur' }
],
name: [
{required: true, message: '请输入设备名称', trigger: 'blur' }
],
},
form2:{
title:'指令下发', visible:false, logDialog:false, logVisible:false,
query:{},
page: 1,
size: 10,
total: 0,
status:{cu:0},
item:{
ecode: "",
ename:'',
ilAdjust:0,
ilSave:0,
time:'',
ilThreshed:0,
timekey:'ilTimHour',
},
adjustList:[
{name:'启动', value:1},
{name:'不启动', value:0},
],
saveList:[
{name:'存储', value:1},
{name:'不存储', value:0},
],
timeList:[
{name:'', value:'ilTimHour'},
{name:'', value:'ilTimMins'},
{name:'', value:'ilTimSec'},
],
formData:[],
name: [ { required: true, message: '请输入分区名称', trigger: 'blur' },]
},
rulesDetai:{
cameraName: [ { required: true, message: '请输入名称', trigger: 'blur' },],
cameraIp: [ { required: true, message: '请输入IP', trigger: 'blur' },],
brand: [ { required: true, message: '请输入IP', trigger: 'blur' },]
}
},
mounted() {
var that = this;
this.$nextTick(() => {
this.loadData();
})
},
methods: {
loadData() {
var that = this;
var sort = 'addTime,desc';
var param = this.query;
param.page = this.page - 1;
param.size = this.size;
param.sort = sort;
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list;
});
this.$nextTick(()=>{
HttpReq.plantFactory.getDeviceManageList(param).then((res) => {
//console.log(res);
this.loading = false;
this.tableData = res.content;
this.total = res.totalElements;
})
})
},
tableRowClassName({row, rowIndex}) {
if (rowIndex === 1) {
return 'warning-row';
} else if (rowIndex === 3) {
return 'success-row';
}
return '';
},
// 点击搜索
toSearch() {
this.page = 1
this.loadData()
},
clearLimit(){ // 清除限制
this.loadData()
},
cancelForm(a, b, c){
this.form.visible = false;
},
cancelForm2(){
this.form.historyDialog = false;
},
toAdd() {
// 请除表单验证
this.$refs['form1'] && this.$refs['form1'].clearValidate();
this.form.title = '添加设备';
this.form.status.cu = 0;
this.form.visible = true;
this.form.reqType = 'add';
this.form.item = {};
this.picFileName = '';
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list
methods:{
// 区域单击
gridClick (row, index) {
this.DetailTitle = row.name;
this.camID = row.id;
this.getCode1(row.id);
},
formatter(row, column) {
return row.brand === 1? "海康威视" : "大华";
},
getCode() {
httpGet(mainCamera).then(res => {
this.main_camera = res.content;
if(res.content.length > 0){
this.DetailTitle = res.content[0].name;
this.getCode1(res.content[0].id);
}
});
},
toEdit(item) {
// 请除表单验证
this.$refs['form1'] && this.$refs['form1'].clearValidate();
this.form.title = '编辑设备';
this.form.status.cu = 0;
this.form.visible = true;
this.form.item = item;
this.form.reqType = 'edit';
this.picFileName = this.form.item.position;
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list
getCode1(id) {
let that = this;
httpGet(mainCameraDetail,{page:0,size:100,cameraId:id}).then(res => {
console.log("mainCameraDetail",res);
this.cameraDetail = res.content
});
},
toDelete(item) {
var id = item.id;
this.$confirm('确认删除该条数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then((e) => {
this.reqRemoveProject([id])
}).catch((e) => {
})
},
//查看图片以及其他信息
toSeeMore(row){
//分区部分
zonechecked(row){
//console.log(row);
this.seeMoreData = row;
this.seeMoreImgUrl = process.env.VUE_APP_LOCAL_API2 + "/avatar/" + row.position;
this.form.seeMoreDialog = true;
this.$nextTick(()=>{
let videoContainer = document.querySelector('#video-container');
videoContainer.innerHTML = '';
var player = new EZUIKit.EZUIKitPlayer({
autoplay: true,
id: 'video-container',
accessToken:'at.4qo66bb35a19h07a0d9pbmtj5v4g0o78-4jmzdu3k24-0866je6-qkz1xuwmf',
url: 'ezopen://open.ys7.com/J16440511/1.live',
template: "simple", // simple - 极简版;standard-标准版;security - 安防版(预览回放);voice-语音版;
width: 530,
height: 320
});
})
},
toHistoryLog(item){
this.form.historyDialog = true;
this.form.item2.value = Dates.format('MM');
this.form.item2.code = item.ecode;
this.$nextTick(() => {
var ecahrtEl = document.getElementById("ecahrtA");
this.ecahrtA = this.ecahrtA || this.createPanelEcharts(ecahrtEl);
this.reqHistoryList(this.form.item2);
this.cameraDetailName = row.name + "分区详情表";
httpGet(mainCameraDetail,{page:0,size:100,cameraId:row.id}).then(res => {
console.log("mainCameraDetail",res);
this.cameraDetail = res.content
});
},
cancelForm3(a, b, c){
this.form2.visible = false;
},
cancelForm4(a, b, c){
this.form2.logVisible = false;
},
// 指令下发
toInstructionSet(item){
var form2 = this.form2;
// 请除表单验证
//this.$refs['form1'] && this.$refs['form1'].clearValidate();
form2.title = '指令下发';
form2.status.cu = 0;
form2.visible = true;
form2.reqType = 'edit';
form2.item = {
ecode:item.ecode,
subcode:item.subcode,
ilAdjust:form2.item.ilAdjust,
ilSave:form2.item.ilSave,
timekey:form2.item.timekey,
time:'',
};
},
// 指令日志
toInstructionLog(item){
var form2 = this.form2;
// 请除表单验证
//this.$refs['form1'] && this.$refs['form1'].clearValidate();
form2.title = '下发日志';
form2.logVisible = true;
form2.item = item;
var param = form2.query;
param.page = form2.page - 1;
param.size = form2.size;
param.sort = 'addTime,desc';
param.deviceId = item.ecode;
HttpReq.equipment.getInstructionLog(param).then((res) => {
if(res){
form2.total = res.totalElements;
var formData = res.content || [],
timeKeys = {'ilTimHour':'小时','ilTimMins':'分钟','ilTimSec':''};
for(var fitem of formData){
fitem.subcode = item.subcode;
for(var key in timeKeys){
if(fitem[key] || fitem[key] === 0){
fitem['time'] = fitem[key];
fitem.timeUnit = timeKeys[key];
}else{
delete fitem[key]
zoneEdit(type,row){
this.zoneData = {};
this.zoneVisible = true;
this.zoneType = type;
if(this.zoneType == "add"){
this.zoneTitle = "增加分区";
}else if(this.zoneType == "change"){
this.zoneTitle = "修改分区";
this.zoneData = {...row};
}
};
fitem.ilAdjust = ['不启动', '启动'][fitem.ilAdjust || 0];
fitem.ilSave = ['不存储', '存储'][fitem.ilSave || 0];
fitem.ilSendSuccess = ['下发失败', '下发成功'][fitem.ilSendSuccess || 0];
};
form2.formData = formData;
};
}).catch(function(error) {
console.log('error ________________ ', error);
});
},
pageChange(e) {
this.page = e
this.loadData()
},
sizeChange(e) {
this.page = 1
this.size = e
this.loadData()
},
pageChange2(e) {
this.form2.page = e
this.reqInstructionLog(this.form2.item)
},
sizeChange2(e) {
this.form2.page = 1;
this.form2.size = e;
this.reqInstructionLog(this.form2.item);
},
submitForm(validateName, item){
if(!this.form.status.cu){
this.form.status.cu = 2;
this.$refs[validateName].validate(valid => {
if(valid){
if(this.form.reqType === 'add'){
this.reqAddItem(this.form, item)
}else{
this.reqUpdateItem(this.form, item)
zoneSave(){
this.$refs['zoneData'].validate((valid) => {
if (valid) {
if(this.zoneType == "add"){
console.log(this.zoneData);
httpPostForJson(addCamera,this.zoneData).then(res => {
this.$message.success('添加成功');
httpGet(mainCamera).then(res => {
this.main_camera = res.content;
console.log("mainCamera",this.main_camera);
});
});
this.zoneVisible = false;
this.zoneData = {name: ''};
}else if(this.zoneType == "change"){
console.log(this.zoneData);
putForJson(updateCamera,this.zoneData).then(res => {
this.$message.success('修改成功');
httpGet(mainCamera).then(res => {
this.main_camera = res.content;
console.log("mainCamera",this.main_camera);
});
});
this.zoneVisible = false;
this.zoneData = {id:'',name: ''};
}
}else{
this.form.status.cu = 0
} else {
console.log('error submit!!');
return false;
}
});
};
},
findHistory(){
this.reqHistoryList(this.form.item2);
},
//请求项目列表
reqProjectsSimple(){
return HttpReq.project.getProject().then((res) => {
if(res.code == 200){
return res.data.content;
}else{
return []
}
})
zoneCancel(){
this.zoneVisible = false;
this.zoneData = {id:'',name: '',cnt:''};
},
//添加设备
reqAddItem(form, item){
let lastData = item;
lastData.position = this.picFileName;
HttpReq.plantFactory.addDeviceManageList(lastData).then((res) => {
form.visible = false;
if(res == 1){
this.$notify({
title: '项目添加成功!',
type: 'success',
duration: 2500
zoneDelete(row){
//console.log(row);
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
type: 'warning'
}).then( () => {
httpDelForJson(delCamera,[row.id]).then( res => {
this.$message({
message: "删除成功",
type: 'success'
});
this.loadData()
}else{
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}
}).catch(function(error) {
form.status.cu = 0
httpGet(mainCamera).then(res => {
this.main_camera = res.content;
console.log("mainCamera",this.main_camera);
});
},
//修改设备
reqUpdateItem(form, item){
let lastData = item;
lastData.position = this.picFileName;
HttpReq.plantFactory.upDateDeviceManageList(lastData).then((res) => {
form.visible = false;
if(res.status == 400){
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}else{
this.$notify({
title: '修改成功!',
type: 'success',
duration: 2500
});
this.loadData()
}
}).catch(function(error) {
form.status.cu = 0
});
},
//删除设备
reqRemoveProject(item){
HttpReq.plantFactory.removeDeviceManageList(item).then((res) => {
if(res.status == 400){
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}else{
this.$notify({
title: '删除成功!',
type: 'success',
duration: 2500
},
agreeDeleteZone(){
let that = this;
let arrs = [];
arrs.push(parseInt(that.zoneData.id));
console.log(arrs);
httpDelForJson(delCamera,arrs).then(res => {
this.$message.success('删除成功');
httpGet(mainCamera).then(res => {
this.main_camera = res.content;
console.log("mainCamera",this.main_camera);
});
});
this.zoneDeleteVisible = false;
},
cancelDeleteZone(){
this.zoneDeleteVisible = false;
this.zoneData = {id:'',name: '',cnt:''};
},
//详情部分
cameraDetaileEdit(type,row){
this.cameraDetailData = {};
this.cameraDetailVisible = true;
this.cameraDetailType = type;
if(this.cameraDetailType == "add"){
this.cameraDetailTitle = "增加摄像头";
this.disabledInp = false;
}else if(this.cameraDetailType == "change"){
this.cameraDetailTitle = "修改摄像头";
this.cameraDetailData = {...row};
this.disabledInp = true;
}
this.loadData();
})
},
reqHistoryList(item){
var timeSpace = this.query.timeSpace;
var startTime = timeSpace ? timeSpace[0].split(' ')[0] : '';
var endTime = timeSpace ? timeSpace[1].split(' ')[0] : '';
HttpReq.historys.getItemBycode({codes:item.code, startTime:startTime, endTime:endTime}).then((res) => {
if(res.head.code === '0000'){
var body = res.body || {};
var list = body.list || [];
var xAxisData = [];
var helement = [];
var htemperature = [];
var hlenght1 = [], hlenght2 = [], hlenght3 = [];
for(var item of list){
xAxisData.push(item.createTime);
helement.push(item.helement);
htemperature.push(item.htemperature);
hlenght1.push(item.hlenght1);
hlenght2.push(item.hlenght2);
hlenght3.push(item.hlenght3);
};
this.ecahrtA.setData({
xAxis: [
{
type: 'category',
data: xAxisData,
},
],
series: [
{
name: '电压',
data: helement,
},
{
name: '温度',
data: htemperature,
},
{
name: '裂缝1',
data: hlenght1,
},
{
name: '裂缝2',
data: hlenght2,
},
{
name: '裂缝3',
data: hlenght3,
cameraDetaileSave(){
this.$refs['cameraDetailData'].validate((valid) => {
if (valid) {
if(this.cameraDetailType == "add"){
this.cameraDetailData.cameraId = this.camID;
console.log(this.cameraDetailData);
httpPostForJson(addCameraDetail,this.cameraDetailData).then(res => {
this.$message.success('添加成功');
httpGet(mainCameraDetail,{page:0,size:100,cameraId:this.camID}).then(res => {
console.log("mainCameraDetail",res);
this.cameraDetail = res.content
});
});
this.cameraDetailVisible = false;
this.cameraDetailData = {};
}else if(this.cameraDetailType == "change"){
let that = this;
let newData = [];
this.cameraDetail.forEach(function(item){
if(item.id == that.cameraDetailData.id){
newData.push(that.cameraDetailData);
}else{
newData.push(item);
}
]
})
};
}).catch(function(error) {
console.log('catch __ ', error);
})
},
createPanelEcharts(el){
var myChart = echarts.init(el),
lineColor = 'green';
var option = {
title: {
text: '',
subtext: '设备值'
},
tooltip: {
trigger: 'axis'
},
legend: {
data: ['电压', '温度', '裂缝1', '裂缝2', '裂缝3'],
textStyle: {
color: "#000"
},
},
textStyle: {
color: "#333"
},
calculable: true,
xAxis: [
{
type: 'category',
data: [],
this.cameraDetail = newData;
this.cameraDetailVisible = false;
this.cameraDetailData = {id:"",cameraId:"",cameraName:"",cameraIp:"",cameraPort:"",cameraWay:""};
}
],
yAxis: [
{
type: 'value',
} else {
console.log('error submit!!');
return false;
}
],
grid:{
top:40,
right:10,
bottom:20,
left:45,
},
series: [
{
name: '电压',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
//itemStyle: {normal: {areaStyle: {type: 'default', color:'#00e5ff'}, color:'#00e5ff'}, color:'green'},
},
{
name: '温度',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
},
{
name: '裂缝1',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
//itemStyle: {normal: {areaStyle: {type:'default', color:'red'}, color:'#1849fe'}, color:'red'},
},
{
name: '裂缝2',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
});
},
{
name: '裂缝3',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
}
]
};
myChart.setOption(option);
var setData = function(option){
myChart.hideLoading();
myChart.setOption(option)
};
return {setData:setData, myChart:myChart}
cameraDetaileCancel(){
this.cameraDetailVisible = false;
this.cameraDetailData = {};
},
reqSetInstruction(form, item){
var param = {
deviceId:item.ecode,
ilAdjust:item.ilAdjust,
ilSave:item.ilSave,
ilThreshed:item.ilThreshed || 0,
[item.timekey]:item.time || 0,
};
HttpReq.equipment.setInstruction(param).then((res) => {
this.form2.visible = false;
this.$notify({
title: '修改成功!',
type: 'success',
duration: 2500
cameraDetaileDelete(row){
console.log(row);
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
type: 'warning'
}).then( () => {
httpDelForJson(delCameraDetail,[row.id]).then( res => {
this.$message({
message: "删除成功",
type: 'success'
});
this.loadData()
}).catch(function(error) {
this.form2.status.cu = 0;
this.$notify({
title: error,
type: 'error',
duration: 2500
})
httpGet(mainCameraDetail,{page:0,size:100,cameraId:this.camID}).then(res => {
console.log("mainCameraDetail",res);
this.cameraDetail = res.content
});
})
})
},
reqInstructionLog(item){
var form2 = this.form2;
var param = form2.query;
param.page = form2.page - 1;
param.size = form2.size;
param.sort = 'addTime,desc';
param.deviceId = item.ecode;
HttpReq.equipment.getInstructionLog(param).then((res) => {
if(res){
form2.total = res.totalElements;
var formData = res.content || [],
timeKeys = {'ilTimHour':'小时','ilTimMins':'分钟','ilTimSec':''};
for(var fitem of formData){
fitem.subcode = item.subcode;
for(var key in timeKeys){
if(fitem[key]){
fitem['time'] = fitem[key];
fitem.timeUnit = timeKeys[key];
}else{
delete fitem[key]
}
};
fitem.ilAdjust = ['不启动', '启动'][fitem.ilAdjust || 0];
fitem.ilSave = ['不存储', '存储'][fitem.ilSave || 0];
fitem.ilSendSuccess = ['下发失败', '下发成功'][fitem.ilSendSuccess || 0];
};
form2.formData = formData;
};
}).catch(function(error) {
console.log('error ________________ ', error);
agreeDeleteCameraDetaile(){
let that = this;
let arrs1 = [];
arrs1.push(parseInt(that.cameraDetailData.id));
console.log(arrs1);
httpDelForJson(delCameraDetail,arrs1).then(res => {
this.$message.success('删除成功');
httpGet(mainCameraDetail,{page:0,size:100,cameraId:this.camID}).then(res => {
console.log("mainCameraDetail",res);
this.cameraDetail = res.content
});
});
this.cameraDetaileDeleteVisible = false;
this.cameraDetailData = {};
},
//图片上传
excelImport(event) {
let that = this;
let file = event.target.files[0];
let formData1 = new FormData();
formData1.append("avatar", file);
Axios({
url: process.env.VUE_APP_LOCAL_API2 + '/api/wEquipment/updateAvatar',
method: "post",
data: formData1,
}).then(
response => {
if (response.status == 200) {
this.$message.success("上传成功");
that.picFileName = response.data.avatar;
} else {
this.$message.error("上传失败");
}
cancelDeleteCameraDetaile(){
this.cameraDetaileDeleteVisible = false;
this.cameraDetailData = {};
},
)
.catch(error => {
console.log(error);
});
},
//项目名称展示
formatter(row){
let proName = "";
this.form.selectList.forEach(function(item){
if(row.projectId == item.id){
proName = item.name;
}
})
return proName
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scope>
.el-table .warning-row {
background: oldlace;
}
.el-table .success-row {
background: #f0f9eb;
}
<style scoped>
*{
.device-manage{
.panel-bottom{
.el-button{margin:2px 0;padding:6px 15px;font-size:14px;}
.btn-groub2{
display:inline-block;
.el-button{margin:2px 0;padding:6px 15px;font-size:15px;}
.el-button--warning {
background-color: #e6a23c;
border-color: #e6a23c;
}
.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;}
}
}
margin: 0;
padding: 0;
}
.iframeBody{
height: 100%;
display: flex;
width: 100%;
}
.leftMenuBar{
width: 25%;
height: 100%;
background-color: white;
padding: 20px;
box-sizing: border-box;
}
.rightVideoBox{
width: 75%;
height: 100%;
border-left: 1px solid rgb(245,246,251);
background-color: white;
padding: 20px;
box-sizing: border-box;
}
.leftMenuSelected{
color: rgb(0,82,255);
}
.sonVideoBox{
width: 49.8%;
height: 49.8%;
border: 1px solid red;
}
</style>
<style>
.text {
font-size: 14px;
}
.ecahrt1-dialog{
display:flex;align-items:center;
.el-dialog{
margin-top:inherit !important;display:table !important;width:fit-content;
.el-form-item{margin-right:0;}
.item {
margin-bottom: 18px;
}
.el-dialog__header{height:0;padding:0;display:block;}
.form-body{
border:1px solid #999;width:800px;height:500px;position:relative;
>div{position:absolute;top:0;left:0;height:100%;width:100%;}
.clearfix:before,
.clearfix:after {
display: table;
content: "";
}
.clearfix:after {
clear: both
}
.box-card {
width: 380px;
height: 100%;
}
</style>
\ No newline at end of file
<template>
<div class="common-page device-manage">
<div class="option page-row">
<!--工具栏-->
<div class="head-container">
<!-- 搜索 -->
<label class="el-form-item-label" style="font-weight: 500;">设备识别码</label>
<el-input v-model="query.code" clearable size="small" placeholder="请输入设备识别码" style="width:180px;" @clear="clearLimit"/>
<el-button size="mini" type="success" icon="el-icon-search" @click="toSearch">搜索</el-button>
</div>
</div>
<div class="panel-bottom page-row">
<h3>设备管理列表</h3>
<div class="ctin-box">
<div class="content-within">
<div class="content-fix">
<div class="toolbar">
<el-button size="mini" type="primary" icon="el-icon-plus" @click="toAdd">新增</el-button>
</div>
<div class="content">
<el-table :data="tableData" v-loading="loading" border style="width:auto" :row-class-name="tableRowClassName">
<el-table-column prop="id" label="设备ID" align="center"></el-table-column>
<el-table-column prop="code" label="设备识别码" align="center"></el-table-column>
<el-table-column prop="name" label="设备名称" align="center"></el-table-column>
<el-table-column prop="alarmWindspeed" label="风速报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmTemperature" label="温度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmHumidity" label="湿度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmCo2" label="二氧化碳报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmMlux" label="光照报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmPh" label="酸碱度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmWaterTemperature" label="水温报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmElectricalConductance" label="电导率报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmWaterDepth" label="液位报警阈值" align="center"></el-table-column>
<el-table-column prop="createTime" label="设备激活时间" align="center"></el-table-column>
<el-table-column prop="addTime" label="最后采集时间" align="center"></el-table-column>
<el-table-column prop="projectId" label="所属项目" align="center" :formatter="formatter"></el-table-column>
<el-table-column label="操作" min-width="180px" align="center" fixed="right">
<template slot-scope="scope">
<el-button size="mini" type="success" icon="el-icon-view" @click="toSeeMore(scope.row)"></el-button>
<el-button size="mini" type="primary" icon="el-icon-edit" @click="toEdit(scope.row)"></el-button>
<el-button size="mini" type="danger" icon="el-icon-delete" @click="toDelete(scope.row)"></el-button>
<!-- <div class="btn-groub2">
<el-button size="mini" type="warning" icon="el-icon-set-up" @click="toInstructionSet(scope.row)"></el-button>
<el-button size="mini" type="info" icon="el-icon-tickets" @click="toInstructionLog(scope.row)"></el-button>
</div> -->
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<el-pagination :total="total" :current-page="page" style="margin-top: 8px;" layout="total, prev, pager, next, sizes" @size-change="sizeChange" @current-change="pageChange" />
</div>
</div>
</div>
</div>
</div>
<!-- 表单渲染 -->
<el-dialog append-to-body :close-on-click-modal="true" :before-close="cancelForm" :visible.sync="form.visible" :title="form.title" width="700px">
<el-form :model="form.item" :rules="rules" ref="form1" :inline="true" size="small" label-width="150px">
<el-form-item label="选择项目" prop="projectId" >
<el-select v-model="form.item.projectId" placeholder="请选择项目" size="small">
<el-option v-for="(obj,index) in form.selectList" :label="obj.name" :value="obj.id" :key="index"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="设备ID" prop="id">
<el-input v-model="form.item.id" style="width:280px;" placeholder="请输入设备编号" :disabled="form.reqType==='edit'"/>
</el-form-item> -->
<el-form-item label="设备识别码" prop="code">
<el-input v-model="form.item.code" style="width:260px;" placeholder="请输入设备识别码" :disabled="form.reqType==='edit'"/>
</el-form-item>
<el-form-item label="设备名称" prop="name">
<el-input v-model="form.item.name" style="width:260px;" placeholder="请输入设备名称"/>
</el-form-item>
<el-form-item label="风速报警阈值" prop="alarmWindspeed" >
<el-input v-model="form.item.alarmWindspeed" style="width:160px;" placeholder="请输入风速报警阈值"/>
</el-form-item>
<el-form-item label="温度报警阈值" prop="alarmTemperature" >
<el-input v-model="form.item.alarmTemperature" style="width:160px;" placeholder="请输入温度报警阈值"/>
</el-form-item>
<el-form-item label="湿度报警阈值" prop="alarmHumidity" >
<el-input v-model="form.item.alarmHumidity" style="width:160px;" placeholder="请输入湿度报警阈值"/>
</el-form-item>
<el-form-item label="二氧化碳报警阈值" prop="alarmCo2" >
<el-input v-model="form.item.alarmCo2" style="width:160px;" placeholder="请输入二氧化碳报警阈值"/>
</el-form-item>
<el-form-item label="光照报警阈值" prop="alarmMlux" >
<el-input v-model="form.item.alarmMlux" style="width:160px;" placeholder="请输入光照报警阈值"/>
</el-form-item>
<el-form-item label="酸碱度报警阈值" prop="alarmPh" >
<el-input v-model="form.item.alarmPh" style="width:160px;" placeholder="请输入酸碱度报警阈值"/>
</el-form-item>
<el-form-item label="水温报警阈值" prop="alarmWaterTemperature" >
<el-input v-model="form.item.alarmWaterTemperature" style="width:160px;" placeholder="请输入水温报警阈值"/>
</el-form-item>
<el-form-item label="电导率报警阈值" prop="alarmElectricalConductance" >
<el-input v-model="form.item.alarmElectricalConductance" style="width:160px;" placeholder="请输入电导率报警阈值"/>
</el-form-item>
<el-form-item label="液位报警阈值" prop="alarmWaterDepth" >
<el-input v-model="form.item.alarmWaterDepth" style="width:160px;" placeholder="请输入液位报警阈值"/>
</el-form-item>
<el-form-item label="上传设备位置" prop="position">
<el-input v-model="picFileName" style="width:160px;" placeholder="请上传设备位置" disabled />
<input type="file" name="image" @change="excelImport($event)" />
</el-form-item>
<div style="margin:0px 0px 10px 55px;font-size:16px;font-weight:bold;">摄像头参数配置</div>
<el-form-item label="摄像头ID" prop="camera">
<el-input v-model="form.item.camera" style="width:160px;" placeholder="请输入摄像头ID"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelForm">取消</el-button>
<el-button :loading="form.status.cu === 2" type="primary" @click="submitForm('form1', form.item)">确认</el-button>
</div>
</el-dialog>
<!-- 查看更多 -->
<el-dialog title="查看设备" :visible.sync="form.seeMoreDialog" width="800px">
<el-form :model="seeMoreData" style="margin-top:20px;">
<el-form-item label="摄像头位置图片" label-width="150px">
<el-image :src="seeMoreImgUrl" style="width:300px;"></el-image>
</el-form-item>
<el-form-item label="摄像头图像" label-width="150px">
<div id="video-container" style="width:550px;height:350px"></div>
</el-form-item>
<el-form-item label="摄像头ID" label-width="150px">
<el-input v-model="seeMoreData.camera" style="width:200px"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="form.seeMoreDialog = false">关闭</el-button>
</div>
</el-dialog>
<!-- 历史图表 -->
<el-dialog class="ecahrt1-dialog" append-to-body :close-on-click-modal="false" :before-close="cancelForm2" :visible.sync="form.historyDialog">
<el-form :rules="rules" ref="form1" :inline="true" size="small" label-width="80px">
<!-- <el-form-item prop="eprogramid" >
<el-select v-model="form.item2.value" placeholder="请选择月份">
<el-option v-for="obj in form.monthSelectList" :label="obj.name" :value="obj.value"></el-option>
</el-select>
</el-form-item> -->
<el-form-item prop="eprogramid" >
<date-range-picker v-model="query.timeSpace" class="date-item" />
</el-form-item>
<el-form-item >
<el-button type="primary" @click="findHistory">查询</el-button>
</el-form-item>
<el-form-item prop="content" style="display:block;" >
<div class="form-body">
<div id="ecahrtA"></div>
</div>
</el-form-item>
</el-form>
</el-dialog>
<!-- 指令下发 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="cancelForm3" :visible.sync="form2.visible" :title="form2.title" width="600px">
<el-form :model="form2.item" :rules="rules" ref="form2" :inline="true" size="small" label-width="100px">
<el-form-item label="设备ID" prop="ecode">
<el-input v-model="form2.item.ecode" style="width:280px;" placeholder="请输入设备编号" :disabled="form2.reqType==='edit'"/>
</el-form-item>
<el-form-item label="设备识别码" prop="subcode">
<el-input v-model="form2.item.subcode" style="width:260px;" placeholder="请输入设备识别码" :disabled="form2.reqType==='edit'"/>
</el-form-item>
<el-form-item label="是否启动校正" prop="ilAdjust" style="width:240px;">
<el-select v-model="form2.item.ilAdjust" placeholder="请选择" size="small" style="width:120px;">
<el-option v-for="obj in form2.adjustList" :label="obj.name" :key="obj.value" :value="obj.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否存储裂缝" prop="ilSave" style="width:240px;">
<el-select v-model="form2.item.ilSave" placeholder="请选择" size="small" style="width:120px;">
<el-option v-for="(obj,index) in form2.saveList" :label="obj.name" :value="obj.value" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item label="裂缝阈值" prop="ilThreshed" >
<el-input v-model="form2.item.ilThreshed" style="width:160px;" placeholder="请输入裂缝阈值"/>
<span style="color:#aaa;">1~255</span>
</el-form-item>
<el-form-item label="唤醒周期" prop="timekey" >
<el-select v-model="form2.item.timekey" placeholder="请选择时间" size="small" style="width:120px;">
<el-option v-for="(obj,index) in form2.timeList" :label="obj.name" :value="obj.value" :key="index"></el-option>
</el-select>
<el-input v-model="form2.item.time" style="width:160px;" placeholder="请输入时长"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelForm3">取消</el-button>
<el-button :loading="form2.status.cu === 2" type="primary" @click="reqSetInstruction('form2', form2.item)">确认</el-button>
</div>
</el-dialog>
<!-- 指令日志 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="cancelForm4" :visible.sync="form2.logVisible" :title="form2.title" width="65%">
<div class="content">
<el-table :data="form2.formData" v-loading="loading" border style="width:auto" :row-class-name="tableRowClassName">
<el-table-column prop="subcode" label="设备识别码" min-width="135px"></el-table-column>
<el-table-column prop="ilThreshed" label="裂缝阈值"></el-table-column>
<el-table-column prop="ilAdjust" label="校正功能"></el-table-column>
<el-table-column prop="ilSave" label="存储裂缝" ></el-table-column>
<el-table-column prop="ilSendTime" label="唤醒时间">
<template slot-scope="scope">
{{scope.row.time + '('+scope.row.timeUnit+')'}}
</template>
</el-table-column>
<el-table-column prop="ilSendSuccess" label="下发状态" ></el-table-column>
<el-table-column prop="ilSendTime" label="下发时间" min-width="145px"></el-table-column>
</el-table>
<!--分页组件-->
<el-pagination :total="form2.total" :current-page="form2.page" style="margin-top:8px;" layout="total, prev, pager, next, sizes" @size-change="sizeChange2" @current-change="pageChange2" />
</div>
</el-dialog>
<div id="app">
<EZUIKitJs />
</div>
</template>
<script>
import echarts from 'echarts';
import { Tools, HttpReq, Dates} from '@/assets/js/common.js';
import DateRangePicker from '@/components/DateRangePicker';
import cuAmap from '@/components/AMap';
import Axios from 'axios'
import EZUIKit from "ezuikit-js";
import EZUIKitJs from '../../../components/ezuikit/EZUIKitJs.vue'
export default {
name: 'Dashboard',
components: {
DateRangePicker, cuAmap
},
data() {
return {
loading: false,
page: 1,
size: 10,
total: 0,
query:{},
picFileName:'',
tableData: [],
seeMoreData:{},
seeMoreImgUrl:"",
form: {
title:'添加设备', visible:false, reqType:'add', historyDialog:false,seeMoreDialog:false,
status:{cu:0},
selectList:[],
item:{},
monthSelectList:[
{name:'一月', value:'01'},
{name:'二月', value:'02'},
{name:'三月', value:'03'},
{name:'四月', value:'04'},
{name:'五月', value:'05'},
{name:'六月', value:'06'},
{name:'七月', value:'07'},
{name:'八月', value:'08'},
{name:'九月', value:'09'},
{name:'十月', value:'10'},
{name:'十一月', value:'11'},
{name:'十二月', value:'12'},
],
item2:{
value:''
},
},
rules: {
projectId: [
{required: true, message: '请选择项目', trigger: 'blur' }
],
id: [
{required: true, message: '请输入设备ID', trigger: 'blur' }
],
code: [
{required: true, message: '请输入设备识别码', trigger: 'blur' }
],
name: [
{required: true, message: '请输入设备名称', trigger: 'blur' }
],
},
form2:{
title:'指令下发', visible:false, logDialog:false, logVisible:false,
query:{},
page: 1,
size: 10,
total: 0,
status:{cu:0},
item:{
ecode: "",
ename:'',
ilAdjust:0,
ilSave:0,
time:'',
ilThreshed:0,
timekey:'ilTimHour',
},
adjustList:[
{name:'启动', value:1},
{name:'不启动', value:0},
],
saveList:[
{name:'存储', value:1},
{name:'不存储', value:0},
],
timeList:[
{name:'', value:'ilTimHour'},
{name:'', value:'ilTimMins'},
{name:'', value:'ilTimSec'},
],
formData:[],
},
}
},
mounted() {
var that = this;
this.$nextTick(() => {
this.loadData();
})
},
methods: {
loadData() {
var that = this;
var sort = 'addTime,desc';
var param = this.query;
param.page = this.page - 1;
param.size = this.size;
param.sort = sort;
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list;
});
this.$nextTick(()=>{
HttpReq.plantFactory.getDeviceManageList(param).then((res) => {
//console.log(res);
this.loading = false;
this.tableData = res.content;
this.total = res.totalElements;
})
})
},
tableRowClassName({row, rowIndex}) {
if (rowIndex === 1) {
return 'warning-row';
} else if (rowIndex === 3) {
return 'success-row';
}
return '';
},
// 点击搜索
toSearch() {
this.page = 1
this.loadData()
},
clearLimit(){ // 清除限制
this.loadData()
},
cancelForm(a, b, c){
this.form.visible = false;
},
cancelForm2(){
this.form.historyDialog = false;
},
toAdd() {
// 请除表单验证
this.$refs['form1'] && this.$refs['form1'].clearValidate();
this.form.title = '添加设备';
this.form.status.cu = 0;
this.form.visible = true;
this.form.reqType = 'add';
this.form.item = {};
this.picFileName = '';
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list
});
},
toEdit(item) {
// 请除表单验证
this.$refs['form1'] && this.$refs['form1'].clearValidate();
this.form.title = '编辑设备';
this.form.status.cu = 0;
this.form.visible = true;
this.form.item = item;
this.form.reqType = 'edit';
this.picFileName = this.form.item.position;
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list
});
},
toDelete(item) {
var id = item.id;
this.$confirm('确认删除该条数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then((e) => {
this.reqRemoveProject([id])
}).catch((e) => {
})
},
//查看图片以及其他信息
toSeeMore(row){
//console.log(row);
this.seeMoreData = row;
this.seeMoreImgUrl = process.env.VUE_APP_LOCAL_API2 + "/avatar/" + row.position;
this.form.seeMoreDialog = true;
this.$nextTick(()=>{
let videoContainer = document.querySelector('#video-container');
videoContainer.innerHTML = '';
var player = new EZUIKit.EZUIKitPlayer({
autoplay: true,
id: 'video-container',
accessToken:'at.4qo66bb35a19h07a0d9pbmtj5v4g0o78-4jmzdu3k24-0866je6-qkz1xuwmf',
url: 'ezopen://open.ys7.com/J16440511/1.live',
template: "simple", // simple - 极简版;standard-标准版;security - 安防版(预览回放);voice-语音版;
width: 530,
height: 320
});
})
},
toHistoryLog(item){
this.form.historyDialog = true;
this.form.item2.value = Dates.format('MM');
this.form.item2.code = item.ecode;
this.$nextTick(() => {
var ecahrtEl = document.getElementById("ecahrtA");
this.ecahrtA = this.ecahrtA || this.createPanelEcharts(ecahrtEl);
this.reqHistoryList(this.form.item2);
});
EZUIKitJs
},
cancelForm3(a, b, c){
this.form2.visible = false;
},
cancelForm4(a, b, c){
this.form2.logVisible = false;
},
// 指令下发
toInstructionSet(item){
var form2 = this.form2;
// 请除表单验证
//this.$refs['form1'] && this.$refs['form1'].clearValidate();
form2.title = '指令下发';
form2.status.cu = 0;
form2.visible = true;
form2.reqType = 'edit';
form2.item = {
ecode:item.ecode,
subcode:item.subcode,
ilAdjust:form2.item.ilAdjust,
ilSave:form2.item.ilSave,
timekey:form2.item.timekey,
time:'',
};
},
// 指令日志
toInstructionLog(item){
var form2 = this.form2;
// 请除表单验证
//this.$refs['form1'] && this.$refs['form1'].clearValidate();
form2.title = '下发日志';
form2.logVisible = true;
form2.item = item;
var param = form2.query;
param.page = form2.page - 1;
param.size = form2.size;
param.sort = 'addTime,desc';
param.deviceId = item.ecode;
HttpReq.equipment.getInstructionLog(param).then((res) => {
if(res){
form2.total = res.totalElements;
var formData = res.content || [],
timeKeys = {'ilTimHour':'小时','ilTimMins':'分钟','ilTimSec':''};
for(var fitem of formData){
fitem.subcode = item.subcode;
for(var key in timeKeys){
if(fitem[key] || fitem[key] === 0){
fitem['time'] = fitem[key];
fitem.timeUnit = timeKeys[key];
}else{
delete fitem[key]
}
};
fitem.ilAdjust = ['不启动', '启动'][fitem.ilAdjust || 0];
fitem.ilSave = ['不存储', '存储'][fitem.ilSave || 0];
fitem.ilSendSuccess = ['下发失败', '下发成功'][fitem.ilSendSuccess || 0];
};
form2.formData = formData;
};
}).catch(function(error) {
console.log('error ________________ ', error);
});
},
pageChange(e) {
this.page = e
this.loadData()
},
sizeChange(e) {
this.page = 1
this.size = e
this.loadData()
},
pageChange2(e) {
this.form2.page = e
this.reqInstructionLog(this.form2.item)
},
sizeChange2(e) {
this.form2.page = 1;
this.form2.size = e;
this.reqInstructionLog(this.form2.item);
},
submitForm(validateName, item){
if(!this.form.status.cu){
this.form.status.cu = 2;
this.$refs[validateName].validate(valid => {
if(valid){
if(this.form.reqType === 'add'){
this.reqAddItem(this.form, item)
}else{
this.reqUpdateItem(this.form, item)
}
}else{
this.form.status.cu = 0
}
});
};
},
findHistory(){
this.reqHistoryList(this.form.item2);
},
//请求项目列表
reqProjectsSimple(){
return HttpReq.project.getProject().then((res) => {
if(res.code == 200){
return res.data.content;
}else{
return []
}
})
},
//添加设备
reqAddItem(form, item){
let lastData = item;
lastData.position = this.picFileName;
HttpReq.plantFactory.addDeviceManageList(lastData).then((res) => {
form.visible = false;
if(res == 1){
this.$notify({
title: '项目添加成功!',
type: 'success',
duration: 2500
});
this.loadData()
}else{
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}
}).catch(function(error) {
form.status.cu = 0
});
},
//修改设备
reqUpdateItem(form, item){
let lastData = item;
lastData.position = this.picFileName;
HttpReq.plantFactory.upDateDeviceManageList(lastData).then((res) => {
form.visible = false;
if(res.status == 400){
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}else{
this.$notify({
title: '修改成功!',
type: 'success',
duration: 2500
});
this.loadData()
}
}).catch(function(error) {
form.status.cu = 0
});
},
//删除设备
reqRemoveProject(item){
HttpReq.plantFactory.removeDeviceManageList(item).then((res) => {
if(res.status == 400){
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}else{
this.$notify({
title: '删除成功!',
type: 'success',
duration: 2500
});
}
this.loadData();
})
},
reqHistoryList(item){
var timeSpace = this.query.timeSpace;
var startTime = timeSpace ? timeSpace[0].split(' ')[0] : '';
var endTime = timeSpace ? timeSpace[1].split(' ')[0] : '';
HttpReq.historys.getItemBycode({codes:item.code, startTime:startTime, endTime:endTime}).then((res) => {
if(res.head.code === '0000'){
var body = res.body || {};
var list = body.list || [];
var xAxisData = [];
var helement = [];
var htemperature = [];
var hlenght1 = [], hlenght2 = [], hlenght3 = [];
for(var item of list){
xAxisData.push(item.createTime);
helement.push(item.helement);
htemperature.push(item.htemperature);
hlenght1.push(item.hlenght1);
hlenght2.push(item.hlenght2);
hlenght3.push(item.hlenght3);
};
this.ecahrtA.setData({
xAxis: [
{
type: 'category',
data: xAxisData,
},
],
series: [
{
name: '电压',
data: helement,
},
{
name: '温度',
data: htemperature,
},
{
name: '裂缝1',
data: hlenght1,
},
{
name: '裂缝2',
data: hlenght2,
},
{
name: '裂缝3',
data: hlenght3,
}
]
})
};
}).catch(function(error) {
console.log('catch __ ', error);
})
},
createPanelEcharts(el){
var myChart = echarts.init(el),
lineColor = 'green';
var option = {
title: {
text: '',
subtext: '设备值'
},
tooltip: {
trigger: 'axis'
},
legend: {
data: ['电压', '温度', '裂缝1', '裂缝2', '裂缝3'],
textStyle: {
color: "#000"
},
},
textStyle: {
color: "#333"
},
calculable: true,
xAxis: [
{
type: 'category',
data: [],
}
],
yAxis: [
{
type: 'value',
}
],
grid:{
top:40,
right:10,
bottom:20,
left:45,
},
series: [
{
name: '电压',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
//itemStyle: {normal: {areaStyle: {type: 'default', color:'#00e5ff'}, color:'#00e5ff'}, color:'green'},
},
{
name: '温度',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
},
{
name: '裂缝1',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
//itemStyle: {normal: {areaStyle: {type:'default', color:'red'}, color:'#1849fe'}, color:'red'},
},
{
name: '裂缝2',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
},
{
name: '裂缝3',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
}
]
};
myChart.setOption(option);
var setData = function(option){
myChart.hideLoading();
myChart.setOption(option)
};
return {setData:setData, myChart:myChart}
},
reqSetInstruction(form, item){
var param = {
deviceId:item.ecode,
ilAdjust:item.ilAdjust,
ilSave:item.ilSave,
ilThreshed:item.ilThreshed || 0,
[item.timekey]:item.time || 0,
};
HttpReq.equipment.setInstruction(param).then((res) => {
this.form2.visible = false;
this.$notify({
title: '修改成功!',
type: 'success',
duration: 2500
});
this.loadData()
}).catch(function(error) {
this.form2.status.cu = 0;
this.$notify({
title: error,
type: 'error',
duration: 2500
})
});
},
reqInstructionLog(item){
var form2 = this.form2;
var param = form2.query;
param.page = form2.page - 1;
param.size = form2.size;
param.sort = 'addTime,desc';
param.deviceId = item.ecode;
HttpReq.equipment.getInstructionLog(param).then((res) => {
if(res){
form2.total = res.totalElements;
var formData = res.content || [],
timeKeys = {'ilTimHour':'小时','ilTimMins':'分钟','ilTimSec':''};
for(var fitem of formData){
fitem.subcode = item.subcode;
for(var key in timeKeys){
if(fitem[key]){
fitem['time'] = fitem[key];
fitem.timeUnit = timeKeys[key];
}else{
delete fitem[key]
}
};
fitem.ilAdjust = ['不启动', '启动'][fitem.ilAdjust || 0];
fitem.ilSave = ['不存储', '存储'][fitem.ilSave || 0];
fitem.ilSendSuccess = ['下发失败', '下发成功'][fitem.ilSendSuccess || 0];
};
form2.formData = formData;
};
}).catch(function(error) {
console.log('error ________________ ', error);
});
},
//图片上传
excelImport(event) {
let that = this;
let file = event.target.files[0];
let formData1 = new FormData();
formData1.append("avatar", file);
Axios({
url: process.env.VUE_APP_LOCAL_API2 + '/api/wEquipment/updateAvatar',
method: "post",
data: formData1,
}).then(
response => {
if (response.status == 200) {
this.$message.success("上传成功");
that.picFileName = response.data.avatar;
} else {
this.$message.error("上传失败");
}
},
)
.catch(error => {
console.log(error);
});
},
//项目名称展示
formatter(row){
let proName = "";
this.form.selectList.forEach(function(item){
if(row.projectId == item.id){
proName = item.name;
}
})
return proName
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scope>
.el-table .warning-row {
background: oldlace;
}
.el-table .success-row {
background: #f0f9eb;
}
.device-manage{
.panel-bottom{
.el-button{margin:2px 0;padding:6px 15px;font-size:14px;}
.btn-groub2{
display:inline-block;
.el-button{margin:2px 0;padding:6px 15px;font-size:15px;}
.el-button--warning {
background-color: #e6a23c;
border-color: #e6a23c;
}
.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;}
}
}
}
.ecahrt1-dialog{
display:flex;align-items:center;
.el-dialog{
margin-top:inherit !important;display:table !important;width:fit-content;
.el-form-item{margin-right:0;}
}
.el-dialog__header{height:0;padding:0;display:block;}
.form-body{
border:1px solid #999;width:800px;height:500px;position:relative;
>div{position:absolute;top:0;left:0;height:100%;width:100%;}
}
}
<style scoped>
#app {
background-color: white;
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
}
*{
margin: 0;
padding: 0;
}
</style>
\ No newline at end of file
<template>
<div class="common-page device-manage">
<div class="option page-row">
<!--工具栏-->
<div class="head-container">
<!-- 搜索 -->
<label class="el-form-item-label" style="font-weight: 500;">设备识别码</label>
<el-input v-model="query.code" clearable size="small" placeholder="请输入设备识别码" style="width:180px;" @clear="clearLimit"/>
<el-button size="mini" type="success" icon="el-icon-search" @click="toSearch">搜索</el-button>
</div>
</div>
<div class="panel-bottom page-row">
<h3>设备管理列表</h3>
<div class="ctin-box">
<div class="content-within">
<div class="content-fix">
<div class="toolbar">
<el-button size="mini" type="primary" icon="el-icon-plus" @click="toAdd">新增</el-button>
<div class="iframeBody">
<!-- 分区设置 -->
<div class="leftMenuBar">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>监控分区</span>
<el-button style="float: right; padding: 3px 0" type="text" @click="zoneEdit('add')">添加分区</el-button>
</div>
<div class="content">
<el-table :data="tableData" v-loading="loading" border style="width:auto" :row-class-name="tableRowClassName">
<el-table-column prop="id" label="设备ID" align="center"></el-table-column>
<el-table-column prop="code" label="设备识别码" align="center"></el-table-column>
<el-table-column prop="name" label="设备名称" align="center"></el-table-column>
<el-table-column prop="alarmWindspeed" label="风速报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmTemperature" label="温度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmHumidity" label="湿度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmCo2" label="二氧化碳报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmMlux" label="光照报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmPh" label="酸碱度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmWaterTemperature" label="水温报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmElectricalConductance" label="电导率报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmWaterDepth" label="液位报警阈值" align="center"></el-table-column>
<el-table-column prop="createTime" label="设备激活时间" align="center"></el-table-column>
<el-table-column prop="addTime" label="最后采集时间" align="center"></el-table-column>
<el-table-column prop="projectId" label="所属项目" align="center" :formatter="formatter"></el-table-column>
<el-table-column label="操作" min-width="180px" align="center" fixed="right">
<div class="text item">
<el-table :data="main_camera" border style="width: 100%" @row-click="gridClick">
<el-table-column prop="id" label="NO." align="center" width="60"></el-table-column>
<el-table-column prop="name" label="分区名称" align="left"></el-table-column>
<el-table-column label="操作" width="150" align="center">
<template slot-scope="scope">
<el-button size="mini" type="success" icon="el-icon-view" @click="toSeeMore(scope.row)"></el-button>
<el-button size="mini" type="primary" icon="el-icon-edit" @click="toEdit(scope.row)"></el-button>
<el-button size="mini" type="danger" icon="el-icon-delete" @click="toDelete(scope.row)"></el-button>
<!-- <div class="btn-groub2">
<el-button size="mini" type="warning" icon="el-icon-set-up" @click="toInstructionSet(scope.row)"></el-button>
<el-button size="mini" type="info" icon="el-icon-tickets" @click="toInstructionLog(scope.row)"></el-button>
</div> -->
<el-button size="mini" round type="primary" @click="zoneEdit('change',scope.row)">编辑</el-button>
<el-button size="mini" round type="danger" @click="zoneDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<el-pagination :total="total" :current-page="page" style="margin-top: 8px;" layout="total, prev, pager, next, sizes" @size-change="sizeChange" @current-change="pageChange" />
</div>
</div>
</div>
</div>
</div>
</el-card>
<!-- 表单渲染 -->
<el-dialog append-to-body :close-on-click-modal="true" :before-close="cancelForm" :visible.sync="form.visible" :title="form.title" width="700px">
<el-form :model="form.item" :rules="rules" ref="form1" :inline="true" size="small" label-width="150px">
<el-form-item label="选择项目" prop="projectId" >
<el-select v-model="form.item.projectId" placeholder="请选择项目" size="small">
<el-option v-for="(obj,index) in form.selectList" :label="obj.name" :value="obj.id" :key="index"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="设备ID" prop="id">
<el-input v-model="form.item.id" style="width:280px;" placeholder="请输入设备编号" :disabled="form.reqType==='edit'"/>
</el-form-item> -->
<el-form-item label="设备识别码" prop="code">
<el-input v-model="form.item.code" style="width:260px;" placeholder="请输入设备识别码" :disabled="form.reqType==='edit'"/>
</el-form-item>
<el-form-item label="设备名称" prop="name">
<el-input v-model="form.item.name" style="width:260px;" placeholder="请输入设备名称"/>
</el-form-item>
<el-form-item label="风速报警阈值" prop="alarmWindspeed" >
<el-input v-model="form.item.alarmWindspeed" style="width:160px;" placeholder="请输入风速报警阈值"/>
<el-dialog :title="zoneTitle" :visible.sync="zoneVisible" width="30%">
<el-form ref="zoneData" :rules="rules" :model="zoneData" label-width="80px">
<el-form-item label="分区名称" style="margin-bottom:15px;" prop="name">
<el-input v-model="zoneData.name" ></el-input>
</el-form-item>
<el-form-item label="温度报警阈值" prop="alarmTemperature" >
<el-input v-model="form.item.alarmTemperature" style="width:160px;" placeholder="请输入温度报警阈值"/>
</el-form-item>
<el-form-item label="湿度报警阈值" prop="alarmHumidity" >
<el-input v-model="form.item.alarmHumidity" style="width:160px;" placeholder="请输入湿度报警阈值"/>
</el-form-item>
<el-form-item label="二氧化碳报警阈值" prop="alarmCo2" >
<el-input v-model="form.item.alarmCo2" style="width:160px;" placeholder="请输入二氧化碳报警阈值"/>
</el-form-item>
<el-form-item label="光照报警阈值" prop="alarmMlux" >
<el-input v-model="form.item.alarmMlux" style="width:160px;" placeholder="请输入光照报警阈值"/>
</el-form-item>
<el-form-item label="酸碱度报警阈值" prop="alarmPh" >
<el-input v-model="form.item.alarmPh" style="width:160px;" placeholder="请输入酸碱度报警阈值"/>
</el-form-item>
<el-form-item label="水温报警阈值" prop="alarmWaterTemperature" >
<el-input v-model="form.item.alarmWaterTemperature" style="width:160px;" placeholder="请输入水温报警阈值"/>
</el-form-item>
<el-form-item label="电导率报警阈值" prop="alarmElectricalConductance" >
<el-input v-model="form.item.alarmElectricalConductance" style="width:160px;" placeholder="请输入电导率报警阈值"/>
</el-form-item>
<el-form-item label="液位报警阈值" prop="alarmWaterDepth" >
<el-input v-model="form.item.alarmWaterDepth" style="width:160px;" placeholder="请输入液位报警阈值"/>
</el-form-item>
<el-form-item label="上传设备位置" prop="position">
<el-input v-model="picFileName" style="width:160px;" placeholder="请上传设备位置" disabled />
<input type="file" name="image" @change="excelImport($event)" />
</el-form-item>
<div style="margin:0px 0px 10px 55px;font-size:16px;font-weight:bold;">摄像头参数配置</div>
<el-form-item label="摄像头ID" prop="camera">
<el-input v-model="form.item.camera" style="width:160px;" placeholder="请输入摄像头ID"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelForm"></el-button>
<el-button :loading="form.status.cu === 2" type="primary" @click="submitForm('form1', form.item)">确认</el-button>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="zoneCancel()" style="padding:10px;"></el-button>
<el-button type="primary" @click="zoneSave()" style="padding:10px;">确 定</el-button>
</span>
</el-dialog>
<!-- 查看更多 -->
<el-dialog title="查看设备" :visible.sync="form.seeMoreDialog" width="800px">
<el-form :model="seeMoreData" style="margin-top:20px;">
<el-form-item label="摄像头位置图片" label-width="150px">
<el-image :src="seeMoreImgUrl" style="width:300px;"></el-image>
</el-form-item>
<el-form-item label="摄像头图像" label-width="150px">
<div id="video-container" style="width:550px;height:350px"></div>
</el-form-item>
<el-form-item label="摄像头ID" label-width="150px">
<el-input v-model="seeMoreData.camera" style="width:200px"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="form.seeMoreDialog = false">关闭</el-button>
</div>
<el-dialog title="提示" :visible.sync="zoneDeleteVisible" width="30%">
你确定删除该分区吗?
<span slot="footer" class="dialog-footer">
<el-button @click="cancelDeleteZone()" style="padding:10px;">取消</el-button>
<el-button type="danger" @click="agreeDeleteZone()" style="padding:10px;">删除</el-button>
</span>
</el-dialog>
<!-- 历史图表 -->
<el-dialog class="ecahrt1-dialog" append-to-body :close-on-click-modal="false" :before-close="cancelForm2" :visible.sync="form.historyDialog">
<el-form :rules="rules" ref="form1" :inline="true" size="small" label-width="80px">
<!-- <el-form-item prop="eprogramid" >
<el-select v-model="form.item2.value" placeholder="请选择月份">
<el-option v-for="obj in form.monthSelectList" :label="obj.name" :value="obj.value"></el-option>
</el-select>
</el-form-item> -->
<el-form-item prop="eprogramid" >
<date-range-picker v-model="query.timeSpace" class="date-item" />
</el-form-item>
<el-form-item >
<el-button type="primary" @click="findHistory">查询</el-button>
</el-form-item>
<el-form-item prop="content" style="display:block;" >
<div class="form-body">
<div id="ecahrtA"></div>
</div>
</el-form-item>
</el-form>
</el-dialog>
<!-- 指令下发 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="cancelForm3" :visible.sync="form2.visible" :title="form2.title" width="600px">
<el-form :model="form2.item" :rules="rules" ref="form2" :inline="true" size="small" label-width="100px">
<el-form-item label="设备ID" prop="ecode">
<el-input v-model="form2.item.ecode" style="width:280px;" placeholder="请输入设备编号" :disabled="form2.reqType==='edit'"/>
</el-form-item>
<el-form-item label="设备识别码" prop="subcode">
<el-input v-model="form2.item.subcode" style="width:260px;" placeholder="请输入设备识别码" :disabled="form2.reqType==='edit'"/>
</el-form-item>
<el-form-item label="是否启动校正" prop="ilAdjust" style="width:240px;">
<el-select v-model="form2.item.ilAdjust" placeholder="请选择" size="small" style="width:120px;">
<el-option v-for="obj in form2.adjustList" :label="obj.name" :key="obj.value" :value="obj.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否存储裂缝" prop="ilSave" style="width:240px;">
<el-select v-model="form2.item.ilSave" placeholder="请选择" size="small" style="width:120px;">
<el-option v-for="(obj,index) in form2.saveList" :label="obj.name" :value="obj.value" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item label="裂缝阈值" prop="ilThreshed" >
<el-input v-model="form2.item.ilThreshed" style="width:160px;" placeholder="请输入裂缝阈值"/>
<span style="color:#aaa;">1~255</span>
</el-form-item>
<el-form-item label="唤醒周期" prop="timekey" >
<el-select v-model="form2.item.timekey" placeholder="请选择时间" size="small" style="width:120px;">
<el-option v-for="(obj,index) in form2.timeList" :label="obj.name" :value="obj.value" :key="index"></el-option>
</el-select>
<el-input v-model="form2.item.time" style="width:160px;" placeholder="请输入时长"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelForm3">取消</el-button>
<el-button :loading="form2.status.cu === 2" type="primary" @click="reqSetInstruction('form2', form2.item)">确认</el-button>
<!-- 摄像头明细 -->
<div class="rightVideoBox">
<el-card>
<div slot="header" class="clearfix">
<span>{{DetailTitle}}</span>
<el-button style="float: right; padding: 3px 0" type="text" @click="cameraDetaileEdit('add')">添加摄像头</el-button>
</div>
</el-dialog>
<!-- 指令日志 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="cancelForm4" :visible.sync="form2.logVisible" :title="form2.title" width="65%">
<div class="content">
<el-table :data="form2.formData" v-loading="loading" border style="width:auto" :row-class-name="tableRowClassName">
<el-table-column prop="subcode" label="设备识别码" min-width="135px"></el-table-column>
<el-table-column prop="ilThreshed" label="裂缝阈值"></el-table-column>
<el-table-column prop="ilAdjust" label="校正功能"></el-table-column>
<el-table-column prop="ilSave" label="存储裂缝" ></el-table-column>
<el-table-column prop="ilSendTime" label="唤醒时间">
<div class="text item">
<el-table :data="cameraDetail" border style="width: 100%" height="710">
<el-table-column prop="id" label="NO." align="center" width="60"></el-table-column>
<el-table-column prop="cameraName" label="区域名称" align="left"></el-table-column>
<el-table-column prop="cameraIp" label="区域IP" align="left"></el-table-column>
<el-table-column prop="brand" :formatter="formatter" label="商标" align="center"></el-table-column>
<el-table-column label="操作" width="150" align="center">
<template slot-scope="scope">
{{scope.row.time + '('+scope.row.timeUnit+')'}}
<el-button size="mini" round type="danger" @click="cameraDetaileDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
<el-table-column prop="ilSendSuccess" label="下发状态" ></el-table-column>
<el-table-column prop="ilSendTime" label="下发时间" min-width="145px"></el-table-column>
</el-table>
<!--分页组件-->
<el-pagination :total="form2.total" :current-page="form2.page" style="margin-top:8px;" layout="total, prev, pager, next, sizes" @size-change="sizeChange2" @current-change="pageChange2" />
</div>
</el-card>
<el-dialog :title="cameraDetailTitle" :visible.sync="cameraDetailVisible" width="30%">
<el-form ref="cameraDetailData" :rules="rulesDetai" :model="cameraDetailData" label-width="80px">
<el-form-item label="名称" style="margin-bottom:15px;" prop="cameraName">
<el-input v-model="cameraDetailData.cameraName"></el-input>
</el-form-item>
<el-form-item label="IP" style="margin-bottom:15px;" prop="cameraIp">
<el-input v-model="cameraDetailData.cameraIp"></el-input>
</el-form-item>
<el-form-item label="端口" style="margin-bottom:15px;">
<el-input v-model="cameraDetailData.cameraPort"></el-input>
</el-form-item>
<el-form-item label="商标" style="margin-bottom:15px;" prop="brand">
<el-input v-model="cameraDetailData.brand" placeholder="1(海康威视) 2(大华)"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="cameraDetaileCancel()" style="padding:10px;">取 消</el-button>
<el-button type="primary" @click="cameraDetaileSave()" style="padding:10px;">确 定</el-button>
</span>
</el-dialog>
<el-dialog title="提示" :visible.sync="cameraDetaileDeleteVisible" width="30%">
你确定删除该摄像头吗?
<span slot="footer" class="dialog-footer">
<el-button @click="cancelDeleteCameraDetaile()" style="padding:10px;">取消</el-button>
<el-button type="danger" @click="agreeDeleteCameraDetaile()" style="padding:10px;">删除</el-button>
</span>
</el-dialog>
</div>
</div>
</template>
<script>
import echarts from 'echarts';
import { Tools, HttpReq, Dates} from '@/assets/js/common.js';
import DateRangePicker from '@/components/DateRangePicker';
import cuAmap from '@/components/AMap';
import Axios from 'axios'
import EZUIKit from "ezuikit-js";
// import { httpGet,httpPostForJson,httpDelForJson,putForJson } from "@/common/httpBean.js"
// import {mainCamera,delCamera,addCamera,updateCamera,mainCameraDetail,addCameraDetail,delCameraDetail} from "@/axios/api.js"
export default {
name: 'Dashboard',
components: {
DateRangePicker, cuAmap
},
data() {
return {
loading: false,
page: 1,
size: 10,
total: 0,
query:{},
picFileName:'',
tableData: [],
seeMoreData:{},
seeMoreImgUrl:"",
form: {
title:'添加设备', visible:false, reqType:'add', historyDialog:false,seeMoreDialog:false,
status:{cu:0},
selectList:[],
item:{},
monthSelectList:[
{name:'一月', value:'01'},
{name:'二月', value:'02'},
{name:'三月', value:'03'},
{name:'四月', value:'04'},
{name:'五月', value:'05'},
{name:'六月', value:'06'},
{name:'七月', value:'07'},
{name:'八月', value:'08'},
{name:'九月', value:'09'},
{name:'十月', value:'10'},
{name:'十一月', value:'11'},
{name:'十二月', value:'12'},
],
item2:{
value:''
},
},
created(){
this.getCode()
},
data(){
return{
//分区部分
main_camera:[],
zoneTitle:"",
zoneVisible:false,
zoneType:"",
zoneData:{ name:"",cnt:"",},
zoneDeleteVisible:false,
//详情部分
cameraDetailAll:[],
cameraDetail:[],
cameraDetailName:"",
cameraDetailTitle:"",
cameraDetailVisible:false,
cameraDetailType:"",
cameraDetailData:{},
cameraDetaileDeleteVisible:false,
disabledInp:false,
camID:"1",
DetailTitle:"",
rules: {
projectId: [
{required: true, message: '请选择项目', trigger: 'blur' }
],
id: [
{required: true, message: '请输入设备ID', trigger: 'blur' }
],
code: [
{required: true, message: '请输入设备识别码', trigger: 'blur' }
],
name: [
{required: true, message: '请输入设备名称', trigger: 'blur' }
],
},
form2:{
title:'指令下发', visible:false, logDialog:false, logVisible:false,
query:{},
page: 1,
size: 10,
total: 0,
status:{cu:0},
item:{
ecode: "",
ename:'',
ilAdjust:0,
ilSave:0,
time:'',
ilThreshed:0,
timekey:'ilTimHour',
},
adjustList:[
{name:'启动', value:1},
{name:'不启动', value:0},
],
saveList:[
{name:'存储', value:1},
{name:'不存储', value:0},
],
timeList:[
{name:'', value:'ilTimHour'},
{name:'', value:'ilTimMins'},
{name:'', value:'ilTimSec'},
],
formData:[],
name: [ { required: true, message: '请输入分区名称', trigger: 'blur' },]
},
rulesDetai:{
cameraName: [ { required: true, message: '请输入名称', trigger: 'blur' },],
cameraIp: [ { required: true, message: '请输入IP', trigger: 'blur' },],
brand: [ { required: true, message: '请输入IP', trigger: 'blur' },]
}
},
mounted() {
var that = this;
this.$nextTick(() => {
this.loadData();
})
},
methods: {
loadData() {
var that = this;
var sort = 'addTime,desc';
var param = this.query;
param.page = this.page - 1;
param.size = this.size;
param.sort = sort;
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list;
});
this.$nextTick(()=>{
HttpReq.plantFactory.getDeviceManageList(param).then((res) => {
//console.log(res);
this.loading = false;
this.tableData = res.content;
this.total = res.totalElements;
})
})
},
tableRowClassName({row, rowIndex}) {
if (rowIndex === 1) {
return 'warning-row';
} else if (rowIndex === 3) {
return 'success-row';
}
return '';
},
// 点击搜索
toSearch() {
this.page = 1
this.loadData()
},
clearLimit(){ // 清除限制
this.loadData()
},
cancelForm(a, b, c){
this.form.visible = false;
},
cancelForm2(){
this.form.historyDialog = false;
},
toAdd() {
// 请除表单验证
this.$refs['form1'] && this.$refs['form1'].clearValidate();
this.form.title = '添加设备';
this.form.status.cu = 0;
this.form.visible = true;
this.form.reqType = 'add';
this.form.item = {};
this.picFileName = '';
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list
methods:{
// 区域单击
gridClick (row, index) {
this.DetailTitle = row.name;
this.camID = row.id;
this.getCode1(row.id);
},
formatter(row, column) {
return row.brand === 1? "海康威视" : "大华";
},
getCode() {
httpGet(mainCamera).then(res => {
this.main_camera = res.content;
if(res.content.length > 0){
this.DetailTitle = res.content[0].name;
this.getCode1(res.content[0].id);
}
});
},
toEdit(item) {
// 请除表单验证
this.$refs['form1'] && this.$refs['form1'].clearValidate();
this.form.title = '编辑设备';
this.form.status.cu = 0;
this.form.visible = true;
this.form.item = item;
this.form.reqType = 'edit';
this.picFileName = this.form.item.position;
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list
getCode1(id) {
let that = this;
httpGet(mainCameraDetail,{page:0,size:100,cameraId:id}).then(res => {
console.log("mainCameraDetail",res);
this.cameraDetail = res.content
});
},
toDelete(item) {
var id = item.id;
this.$confirm('确认删除该条数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then((e) => {
this.reqRemoveProject([id])
}).catch((e) => {
})
},
//查看图片以及其他信息
toSeeMore(row){
//分区部分
zonechecked(row){
//console.log(row);
this.seeMoreData = row;
this.seeMoreImgUrl = process.env.VUE_APP_LOCAL_API2 + "/avatar/" + row.position;
this.form.seeMoreDialog = true;
this.$nextTick(()=>{
let videoContainer = document.querySelector('#video-container');
videoContainer.innerHTML = '';
var player = new EZUIKit.EZUIKitPlayer({
autoplay: true,
id: 'video-container',
accessToken:'at.4qo66bb35a19h07a0d9pbmtj5v4g0o78-4jmzdu3k24-0866je6-qkz1xuwmf',
url: 'ezopen://open.ys7.com/J16440511/1.live',
template: "simple", // simple - 极简版;standard-标准版;security - 安防版(预览回放);voice-语音版;
width: 530,
height: 320
});
})
},
toHistoryLog(item){
this.form.historyDialog = true;
this.form.item2.value = Dates.format('MM');
this.form.item2.code = item.ecode;
this.$nextTick(() => {
var ecahrtEl = document.getElementById("ecahrtA");
this.ecahrtA = this.ecahrtA || this.createPanelEcharts(ecahrtEl);
this.reqHistoryList(this.form.item2);
this.cameraDetailName = row.name + "分区详情表";
httpGet(mainCameraDetail,{page:0,size:100,cameraId:row.id}).then(res => {
console.log("mainCameraDetail",res);
this.cameraDetail = res.content
});
},
cancelForm3(a, b, c){
this.form2.visible = false;
},
cancelForm4(a, b, c){
this.form2.logVisible = false;
},
// 指令下发
toInstructionSet(item){
var form2 = this.form2;
// 请除表单验证
//this.$refs['form1'] && this.$refs['form1'].clearValidate();
form2.title = '指令下发';
form2.status.cu = 0;
form2.visible = true;
form2.reqType = 'edit';
form2.item = {
ecode:item.ecode,
subcode:item.subcode,
ilAdjust:form2.item.ilAdjust,
ilSave:form2.item.ilSave,
timekey:form2.item.timekey,
time:'',
};
},
// 指令日志
toInstructionLog(item){
var form2 = this.form2;
// 请除表单验证
//this.$refs['form1'] && this.$refs['form1'].clearValidate();
form2.title = '下发日志';
form2.logVisible = true;
form2.item = item;
var param = form2.query;
param.page = form2.page - 1;
param.size = form2.size;
param.sort = 'addTime,desc';
param.deviceId = item.ecode;
HttpReq.equipment.getInstructionLog(param).then((res) => {
if(res){
form2.total = res.totalElements;
var formData = res.content || [],
timeKeys = {'ilTimHour':'小时','ilTimMins':'分钟','ilTimSec':''};
for(var fitem of formData){
fitem.subcode = item.subcode;
for(var key in timeKeys){
if(fitem[key] || fitem[key] === 0){
fitem['time'] = fitem[key];
fitem.timeUnit = timeKeys[key];
}else{
delete fitem[key]
zoneEdit(type,row){
this.zoneData = {};
this.zoneVisible = true;
this.zoneType = type;
if(this.zoneType == "add"){
this.zoneTitle = "增加分区";
}else if(this.zoneType == "change"){
this.zoneTitle = "修改分区";
this.zoneData = {...row};
}
};
fitem.ilAdjust = ['不启动', '启动'][fitem.ilAdjust || 0];
fitem.ilSave = ['不存储', '存储'][fitem.ilSave || 0];
fitem.ilSendSuccess = ['下发失败', '下发成功'][fitem.ilSendSuccess || 0];
};
form2.formData = formData;
};
}).catch(function(error) {
console.log('error ________________ ', error);
});
},
pageChange(e) {
this.page = e
this.loadData()
},
sizeChange(e) {
this.page = 1
this.size = e
this.loadData()
},
pageChange2(e) {
this.form2.page = e
this.reqInstructionLog(this.form2.item)
},
sizeChange2(e) {
this.form2.page = 1;
this.form2.size = e;
this.reqInstructionLog(this.form2.item);
},
submitForm(validateName, item){
if(!this.form.status.cu){
this.form.status.cu = 2;
this.$refs[validateName].validate(valid => {
if(valid){
if(this.form.reqType === 'add'){
this.reqAddItem(this.form, item)
}else{
this.reqUpdateItem(this.form, item)
zoneSave(){
this.$refs['zoneData'].validate((valid) => {
if (valid) {
if(this.zoneType == "add"){
console.log(this.zoneData);
httpPostForJson(addCamera,this.zoneData).then(res => {
this.$message.success('添加成功');
httpGet(mainCamera).then(res => {
this.main_camera = res.content;
console.log("mainCamera",this.main_camera);
});
});
this.zoneVisible = false;
this.zoneData = {name: ''};
}else if(this.zoneType == "change"){
console.log(this.zoneData);
putForJson(updateCamera,this.zoneData).then(res => {
this.$message.success('修改成功');
httpGet(mainCamera).then(res => {
this.main_camera = res.content;
console.log("mainCamera",this.main_camera);
});
});
this.zoneVisible = false;
this.zoneData = {id:'',name: ''};
}
}else{
this.form.status.cu = 0
} else {
console.log('error submit!!');
return false;
}
});
};
},
findHistory(){
this.reqHistoryList(this.form.item2);
},
//请求项目列表
reqProjectsSimple(){
return HttpReq.project.getProject().then((res) => {
if(res.code == 200){
return res.data.content;
}else{
return []
}
})
zoneCancel(){
this.zoneVisible = false;
this.zoneData = {id:'',name: '',cnt:''};
},
//添加设备
reqAddItem(form, item){
let lastData = item;
lastData.position = this.picFileName;
HttpReq.plantFactory.addDeviceManageList(lastData).then((res) => {
form.visible = false;
if(res == 1){
this.$notify({
title: '项目添加成功!',
type: 'success',
duration: 2500
zoneDelete(row){
//console.log(row);
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
type: 'warning'
}).then( () => {
httpDelForJson(delCamera,[row.id]).then( res => {
this.$message({
message: "删除成功",
type: 'success'
});
this.loadData()
}else{
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}
}).catch(function(error) {
form.status.cu = 0
httpGet(mainCamera).then(res => {
this.main_camera = res.content;
console.log("mainCamera",this.main_camera);
});
},
//修改设备
reqUpdateItem(form, item){
let lastData = item;
lastData.position = this.picFileName;
HttpReq.plantFactory.upDateDeviceManageList(lastData).then((res) => {
form.visible = false;
if(res.status == 400){
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}else{
this.$notify({
title: '修改成功!',
type: 'success',
duration: 2500
});
this.loadData()
}
}).catch(function(error) {
form.status.cu = 0
});
},
//删除设备
reqRemoveProject(item){
HttpReq.plantFactory.removeDeviceManageList(item).then((res) => {
if(res.status == 400){
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}else{
this.$notify({
title: '删除成功!',
type: 'success',
duration: 2500
},
agreeDeleteZone(){
let that = this;
let arrs = [];
arrs.push(parseInt(that.zoneData.id));
console.log(arrs);
httpDelForJson(delCamera,arrs).then(res => {
this.$message.success('删除成功');
httpGet(mainCamera).then(res => {
this.main_camera = res.content;
console.log("mainCamera",this.main_camera);
});
});
this.zoneDeleteVisible = false;
},
cancelDeleteZone(){
this.zoneDeleteVisible = false;
this.zoneData = {id:'',name: '',cnt:''};
},
//详情部分
cameraDetaileEdit(type,row){
this.cameraDetailData = {};
this.cameraDetailVisible = true;
this.cameraDetailType = type;
if(this.cameraDetailType == "add"){
this.cameraDetailTitle = "增加摄像头";
this.disabledInp = false;
}else if(this.cameraDetailType == "change"){
this.cameraDetailTitle = "修改摄像头";
this.cameraDetailData = {...row};
this.disabledInp = true;
}
this.loadData();
})
},
reqHistoryList(item){
var timeSpace = this.query.timeSpace;
var startTime = timeSpace ? timeSpace[0].split(' ')[0] : '';
var endTime = timeSpace ? timeSpace[1].split(' ')[0] : '';
HttpReq.historys.getItemBycode({codes:item.code, startTime:startTime, endTime:endTime}).then((res) => {
if(res.head.code === '0000'){
var body = res.body || {};
var list = body.list || [];
var xAxisData = [];
var helement = [];
var htemperature = [];
var hlenght1 = [], hlenght2 = [], hlenght3 = [];
for(var item of list){
xAxisData.push(item.createTime);
helement.push(item.helement);
htemperature.push(item.htemperature);
hlenght1.push(item.hlenght1);
hlenght2.push(item.hlenght2);
hlenght3.push(item.hlenght3);
};
this.ecahrtA.setData({
xAxis: [
{
type: 'category',
data: xAxisData,
},
],
series: [
{
name: '电压',
data: helement,
},
{
name: '温度',
data: htemperature,
},
{
name: '裂缝1',
data: hlenght1,
},
{
name: '裂缝2',
data: hlenght2,
},
{
name: '裂缝3',
data: hlenght3,
cameraDetaileSave(){
this.$refs['cameraDetailData'].validate((valid) => {
if (valid) {
if(this.cameraDetailType == "add"){
this.cameraDetailData.cameraId = this.camID;
console.log(this.cameraDetailData);
httpPostForJson(addCameraDetail,this.cameraDetailData).then(res => {
this.$message.success('添加成功');
httpGet(mainCameraDetail,{page:0,size:100,cameraId:this.camID}).then(res => {
console.log("mainCameraDetail",res);
this.cameraDetail = res.content
});
});
this.cameraDetailVisible = false;
this.cameraDetailData = {};
}else if(this.cameraDetailType == "change"){
let that = this;
let newData = [];
this.cameraDetail.forEach(function(item){
if(item.id == that.cameraDetailData.id){
newData.push(that.cameraDetailData);
}else{
newData.push(item);
}
]
})
};
}).catch(function(error) {
console.log('catch __ ', error);
})
},
createPanelEcharts(el){
var myChart = echarts.init(el),
lineColor = 'green';
var option = {
title: {
text: '',
subtext: '设备值'
},
tooltip: {
trigger: 'axis'
},
legend: {
data: ['电压', '温度', '裂缝1', '裂缝2', '裂缝3'],
textStyle: {
color: "#000"
},
},
textStyle: {
color: "#333"
},
calculable: true,
xAxis: [
{
type: 'category',
data: [],
this.cameraDetail = newData;
this.cameraDetailVisible = false;
this.cameraDetailData = {id:"",cameraId:"",cameraName:"",cameraIp:"",cameraPort:"",cameraWay:""};
}
],
yAxis: [
{
type: 'value',
} else {
console.log('error submit!!');
return false;
}
],
grid:{
top:40,
right:10,
bottom:20,
left:45,
},
series: [
{
name: '电压',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
//itemStyle: {normal: {areaStyle: {type: 'default', color:'#00e5ff'}, color:'#00e5ff'}, color:'green'},
},
{
name: '温度',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
},
{
name: '裂缝1',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
//itemStyle: {normal: {areaStyle: {type:'default', color:'red'}, color:'#1849fe'}, color:'red'},
},
{
name: '裂缝2',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
});
},
{
name: '裂缝3',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
}
]
};
myChart.setOption(option);
var setData = function(option){
myChart.hideLoading();
myChart.setOption(option)
};
return {setData:setData, myChart:myChart}
cameraDetaileCancel(){
this.cameraDetailVisible = false;
this.cameraDetailData = {};
},
reqSetInstruction(form, item){
var param = {
deviceId:item.ecode,
ilAdjust:item.ilAdjust,
ilSave:item.ilSave,
ilThreshed:item.ilThreshed || 0,
[item.timekey]:item.time || 0,
};
HttpReq.equipment.setInstruction(param).then((res) => {
this.form2.visible = false;
this.$notify({
title: '修改成功!',
type: 'success',
duration: 2500
cameraDetaileDelete(row){
console.log(row);
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
type: 'warning'
}).then( () => {
httpDelForJson(delCameraDetail,[row.id]).then( res => {
this.$message({
message: "删除成功",
type: 'success'
});
this.loadData()
}).catch(function(error) {
this.form2.status.cu = 0;
this.$notify({
title: error,
type: 'error',
duration: 2500
})
httpGet(mainCameraDetail,{page:0,size:100,cameraId:this.camID}).then(res => {
console.log("mainCameraDetail",res);
this.cameraDetail = res.content
});
})
})
},
reqInstructionLog(item){
var form2 = this.form2;
var param = form2.query;
param.page = form2.page - 1;
param.size = form2.size;
param.sort = 'addTime,desc';
param.deviceId = item.ecode;
HttpReq.equipment.getInstructionLog(param).then((res) => {
if(res){
form2.total = res.totalElements;
var formData = res.content || [],
timeKeys = {'ilTimHour':'小时','ilTimMins':'分钟','ilTimSec':''};
for(var fitem of formData){
fitem.subcode = item.subcode;
for(var key in timeKeys){
if(fitem[key]){
fitem['time'] = fitem[key];
fitem.timeUnit = timeKeys[key];
}else{
delete fitem[key]
}
};
fitem.ilAdjust = ['不启动', '启动'][fitem.ilAdjust || 0];
fitem.ilSave = ['不存储', '存储'][fitem.ilSave || 0];
fitem.ilSendSuccess = ['下发失败', '下发成功'][fitem.ilSendSuccess || 0];
};
form2.formData = formData;
};
}).catch(function(error) {
console.log('error ________________ ', error);
agreeDeleteCameraDetaile(){
let that = this;
let arrs1 = [];
arrs1.push(parseInt(that.cameraDetailData.id));
console.log(arrs1);
httpDelForJson(delCameraDetail,arrs1).then(res => {
this.$message.success('删除成功');
httpGet(mainCameraDetail,{page:0,size:100,cameraId:this.camID}).then(res => {
console.log("mainCameraDetail",res);
this.cameraDetail = res.content
});
});
this.cameraDetaileDeleteVisible = false;
this.cameraDetailData = {};
},
//图片上传
excelImport(event) {
let that = this;
let file = event.target.files[0];
let formData1 = new FormData();
formData1.append("avatar", file);
Axios({
url: process.env.VUE_APP_LOCAL_API2 + '/api/wEquipment/updateAvatar',
method: "post",
data: formData1,
}).then(
response => {
if (response.status == 200) {
this.$message.success("上传成功");
that.picFileName = response.data.avatar;
} else {
this.$message.error("上传失败");
}
cancelDeleteCameraDetaile(){
this.cameraDetaileDeleteVisible = false;
this.cameraDetailData = {};
},
)
.catch(error => {
console.log(error);
});
},
//项目名称展示
formatter(row){
let proName = "";
this.form.selectList.forEach(function(item){
if(row.projectId == item.id){
proName = item.name;
}
})
return proName
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scope>
.el-table .warning-row {
background: oldlace;
}
.el-table .success-row {
background: #f0f9eb;
}
<style scoped>
*{
.device-manage{
.panel-bottom{
.el-button{margin:2px 0;padding:6px 15px;font-size:14px;}
.btn-groub2{
display:inline-block;
.el-button{margin:2px 0;padding:6px 15px;font-size:15px;}
.el-button--warning {
background-color: #e6a23c;
border-color: #e6a23c;
}
.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;}
}
}
margin: 0;
padding: 0;
}
.iframeBody{
height: 100%;
display: flex;
width: 100%;
}
.leftMenuBar{
width: 25%;
height: 100%;
background-color: white;
padding: 20px;
box-sizing: border-box;
}
.rightVideoBox{
width: 75%;
height: 100%;
border-left: 1px solid rgb(245,246,251);
background-color: white;
padding: 20px;
box-sizing: border-box;
}
.leftMenuSelected{
color: rgb(0,82,255);
}
.sonVideoBox{
width: 49.8%;
height: 49.8%;
border: 1px solid red;
}
</style>
<style>
.text {
font-size: 14px;
}
.ecahrt1-dialog{
display:flex;align-items:center;
.el-dialog{
margin-top:inherit !important;display:table !important;width:fit-content;
.el-form-item{margin-right:0;}
.item {
margin-bottom: 18px;
}
.el-dialog__header{height:0;padding:0;display:block;}
.form-body{
border:1px solid #999;width:800px;height:500px;position:relative;
>div{position:absolute;top:0;left:0;height:100%;width:100%;}
.clearfix:before,
.clearfix:after {
display: table;
content: "";
}
.clearfix:after {
clear: both
}
.box-card {
width: 380px;
height: 100%;
}
</style>
\ No newline at end of file
<template>
<div class="common-page device-manage">
<div class="option page-row">
<!--工具栏-->
<div class="head-container">
<!-- 搜索 -->
<label class="el-form-item-label" style="font-weight: 500;">设备识别码</label>
<el-input v-model="query.code" clearable size="small" placeholder="请输入设备识别码" style="width:180px;" @clear="clearLimit"/>
<el-button size="mini" type="success" icon="el-icon-search" @click="toSearch">搜索</el-button>
</div>
</div>
<!-- 表格 -->
<div class="panel-bottom page-row">
<h3>设备管理列表</h3>
<h3>区域信息管理</h3>
<div class="ctin-box">
<div class="content-within">
<div class="content-fix">
......@@ -19,30 +12,22 @@
</div>
<div class="content">
<el-table :data="tableData" v-loading="loading" border style="width:auto" :row-class-name="tableRowClassName">
<el-table-column prop="id" label="设备ID" align="center"></el-table-column>
<el-table-column prop="code" label="设备识别码" align="center"></el-table-column>
<el-table-column prop="name" label="设备名称" align="center"></el-table-column>
<el-table-column prop="alarmWindspeed" label="风速报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmTemperature" label="温度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmHumidity" label="湿度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmCo2" label="二氧化碳报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmMlux" label="光照报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmPh" label="酸碱度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmWaterTemperature" label="水温报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmElectricalConductance" label="电导率报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmWaterDepth" label="液位报警阈值" align="center"></el-table-column>
<el-table-column prop="createTime" label="设备激活时间" align="center"></el-table-column>
<el-table-column prop="addTime" label="最后采集时间" align="center"></el-table-column>
<el-table-column prop="projectId" label="所属项目" align="center" :formatter="formatter"></el-table-column>
<el-table-column label="操作" min-width="180px" align="center" fixed="right">
<el-table-column prop="code" label="编码" align="center"></el-table-column>
<el-table-column prop="name" label="区域名称" align="center"></el-table-column>
<el-table-column prop="areaclass" label="所属类别" align="center"></el-table-column>
<el-table-column prop="coordinate" label="中心坐标" align="center"></el-table-column>
<el-table-column prop="card" label="车辆标识图" align="center">
<template slot-scope="scope">
<img :src="imgSrcStart + '/avatar/' + scope.row.card" width="40" height="40"/>
</template>
</el-table-column>
<el-table-column prop="max" label="最大承接量" align="center"></el-table-column>
<el-table-column prop="createTime" label="日期" align="center"></el-table-column>
<el-table-column label="操作" align="center" fixed="right">
<template slot-scope="scope">
<el-button size="mini" type="success" icon="el-icon-view" @click="toSeeMore(scope.row)"></el-button>
<el-button size="mini" type="primary" icon="el-icon-edit" @click="toEdit(scope.row)"></el-button>
<el-button size="mini" type="danger" icon="el-icon-delete" @click="toDelete(scope.row)"></el-button>
<!-- <div class="btn-groub2">
<el-button size="mini" type="warning" icon="el-icon-set-up" @click="toInstructionSet(scope.row)"></el-button>
<el-button size="mini" type="info" icon="el-icon-tickets" @click="toInstructionLog(scope.row)"></el-button>
</div> -->
<el-button size="mini" type="success" icon="el-icon-view" v-show="scope.row.areaore == '是'"></el-button>
</template>
</el-table-column>
</el-table>
......@@ -57,178 +42,110 @@
<!-- 表单渲染 -->
<el-dialog append-to-body :close-on-click-modal="true" :before-close="cancelForm" :visible.sync="form.visible" :title="form.title" width="700px">
<el-form :model="form.item" :rules="rules" ref="form1" :inline="true" size="small" label-width="150px">
<el-form-item label="选择项目" prop="projectId" >
<el-select v-model="form.item.projectId" placeholder="请选择项目" size="small">
<el-option v-for="(obj,index) in form.selectList" :label="obj.name" :value="obj.id" :key="index"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="设备ID" prop="id">
<el-input v-model="form.item.id" style="width:280px;" placeholder="请输入设备编号" :disabled="form.reqType==='edit'"/>
</el-form-item> -->
<el-form-item label="设备识别码" prop="code">
<el-input v-model="form.item.code" style="width:260px;" placeholder="请输入设备识别码" :disabled="form.reqType==='edit'"/>
</el-form-item>
<el-form-item label="设备名称" prop="name">
<el-input v-model="form.item.name" style="width:260px;" placeholder="请输入设备名称"/>
</el-form-item>
<el-form-item label="风速报警阈值" prop="alarmWindspeed" >
<el-input v-model="form.item.alarmWindspeed" style="width:160px;" placeholder="请输入风速报警阈值"/>
</el-form-item>
<el-form-item label="温度报警阈值" prop="alarmTemperature" >
<el-input v-model="form.item.alarmTemperature" style="width:160px;" placeholder="请输入温度报警阈值"/>
</el-form-item>
<el-form-item label="湿度报警阈值" prop="alarmHumidity" >
<el-input v-model="form.item.alarmHumidity" style="width:160px;" placeholder="请输入湿度报警阈值"/>
</el-form-item>
<el-form-item label="二氧化碳报警阈值" prop="alarmCo2" >
<el-input v-model="form.item.alarmCo2" style="width:160px;" placeholder="请输入二氧化碳报警阈值"/>
<el-form-item label="编码" prop="code">
<el-input v-model="form.item.code" style="width:160px;" placeholder="请输入编码"/>
</el-form-item>
<el-form-item label="光照报警阈值" prop="alarmMlux" >
<el-input v-model="form.item.alarmMlux" style="width:160px;" placeholder="请输入光照报警阈值"/>
<el-form-item label="所属类别" prop="areaclass">
<el-select v-model="form.item.areaclass" placeholder="请选择所属类别" size="small" style="width:160px;">
<el-option v-for="(obj,index) in RegionalTypeData" :label="obj.classname" :value="obj.classname" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item label="酸碱度报警阈值" prop="alarmPh" >
<el-input v-model="form.item.alarmPh" style="width:160px;" placeholder="请输入酸碱度报警阈值"/>
<el-form-item label="区域名称" prop="name">
<el-input v-model="form.item.name" style="width:160px;" placeholder="请输入区域名称"/>
</el-form-item>
<el-form-item label="水温报警阈值" prop="alarmWaterTemperature" >
<el-input v-model="form.item.alarmWaterTemperature" style="width:160px;" placeholder="请输入水温报警阈值"/>
<el-form-item label="是否需要遮罩层" prop="shadow">
<el-select v-model="form.item.shadow" placeholder="请选择是否需要遮罩层" style="width:160px;">
<el-option label="是" value="是"></el-option>
<el-option label="否" value="否"></el-option>
</el-select>
</el-form-item>
<el-form-item label="电导率报警阈值" prop="alarmElectricalConductance" >
<el-input v-model="form.item.alarmElectricalConductance" style="width:160px;" placeholder="请输入电导率报警阈值"/>
<el-form-item label="最大承接车辆数" prop="max">
<el-input v-model="form.item.max" style="width:160px;" placeholder="请输入最大承接车辆数"/>
</el-form-item>
<el-form-item label="液位报警阈值" prop="alarmWaterDepth" >
<el-input v-model="form.item.alarmWaterDepth" style="width:160px;" placeholder="请输入液位报警阈值"/>
<el-form-item label="区域中心坐标点" prop="coordinate">
<el-input v-model="form.item.coordinate" style="width:160px;" placeholder="请输入区域中心坐标点"/>
</el-form-item>
<el-form-item label="上传设备位置" prop="position">
<el-input v-model="picFileName" style="width:160px;" placeholder="请上传设备位置" disabled />
<el-form-item label="区域标记">
<el-input v-model="picFileName" style="width:160px;" placeholder="请上传区域标记" disabled />
<input type="file" name="image" @change="excelImport($event)" />
</el-form-item>
<div style="margin:0px 0px 10px 55px;font-size:16px;font-weight:bold;">摄像头参数配置</div>
<el-form-item label="摄像头ID" prop="camera">
<el-input v-model="form.item.camera" style="width:160px;" placeholder="请输入摄像头ID"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelForm">取消</el-button>
<el-button :loading="form.status.cu === 2" type="primary" @click="submitForm('form1', form.item)">确认</el-button>
</div>
</el-dialog>
<!-- 查看更多 -->
<el-dialog title="查看设备" :visible.sync="form.seeMoreDialog" width="800px">
<el-form :model="seeMoreData" style="margin-top:20px;">
<el-form-item label="摄像头位置图片" label-width="150px">
<el-image :src="seeMoreImgUrl" style="width:300px;"></el-image>
</el-form-item>
<el-form-item label="摄像头图像" label-width="150px">
<div id="video-container" style="width:550px;height:350px"></div>
<el-form-item label="区域范围或直径" prop="arearange">
<el-input v-model="form.item.arearange" style="width:160px;" placeholder="请输入区域范围或直径"/>
</el-form-item>
<el-form-item label="摄像头ID" label-width="150px">
<el-input v-model="seeMoreData.camera" style="width:200px"></el-input>
<el-form-item label="电铲名称" prop="areashovel">
<el-input v-model="form.item.areashovel" style="width:160px;" placeholder="请输入电铲名称"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="form.seeMoreDialog = false">关闭</el-button>
</div>
</el-dialog>
<!-- 历史图表 -->
<el-dialog class="ecahrt1-dialog" append-to-body :close-on-click-modal="false" :before-close="cancelForm2" :visible.sync="form.historyDialog">
<el-form :rules="rules" ref="form1" :inline="true" size="small" label-width="80px">
<!-- <el-form-item prop="eprogramid" >
<el-select v-model="form.item2.value" placeholder="请选择月份">
<el-option v-for="obj in form.monthSelectList" :label="obj.name" :value="obj.value"></el-option>
<el-form-item label="矿种" prop="arearesources">
<el-select v-model="form.item.arearesources" placeholder="请选择矿种" style="width:160px;">
<el-option label="废石" value="废石"></el-option>
<el-option label="矿石" value="矿石"></el-option>
</el-select>
</el-form-item> -->
<el-form-item prop="eprogramid" >
<date-range-picker v-model="query.timeSpace" class="date-item" />
</el-form-item>
<el-form-item >
<el-button type="primary" @click="findHistory">查询</el-button>
<el-form-item label="是否配矿" prop="areaore">
<el-select v-model="form.item.areaore" placeholder="请选择是否配矿" style="width:160px;">
<el-option label="是" value="是"></el-option>
<el-option label="否" value="否"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="content" style="display:block;" >
<div class="form-body">
<div id="ecahrtA"></div>
</div>
<el-form-item label="优先级" prop="areapriority">
<el-input-number v-model="form.item.areapriority" :min="1" :max="10" label="请选择优先级"></el-input-number>
</el-form-item>
</el-form>
</el-dialog>
<!-- 指令下发 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="cancelForm3" :visible.sync="form2.visible" :title="form2.title" width="600px">
<el-form :model="form2.item" :rules="rules" ref="form2" :inline="true" size="small" label-width="100px">
<el-form-item label="设备ID" prop="ecode">
<el-input v-model="form2.item.ecode" style="width:280px;" placeholder="请输入设备编号" :disabled="form2.reqType==='edit'"/>
</el-form-item>
<el-form-item label="设备识别码" prop="subcode">
<el-input v-model="form2.item.subcode" style="width:260px;" placeholder="请输入设备识别码" :disabled="form2.reqType==='edit'"/>
</el-form-item>
<el-form-item label="是否启动校正" prop="ilAdjust" style="width:240px;">
<el-select v-model="form2.item.ilAdjust" placeholder="请选择" size="small" style="width:120px;">
<el-option v-for="obj in form2.adjustList" :label="obj.name" :key="obj.value" :value="obj.value"></el-option>
</el-select>
<!-- 如果所属类型是电子围栏,要添加一下属性 -->
<el-form-item label="启用时间段" prop="period" v-show="form.item.areaclass == '电子围栏'">
<el-time-picker
is-range
v-model="timePeriod"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
placeholder="选择时间范围">
</el-time-picker>
</el-form-item>
<el-form-item label="是否存储裂缝" prop="ilSave" style="width:240px;">
<el-select v-model="form2.item.ilSave" placeholder="请选择" size="small" style="width:120px;">
<el-option v-for="(obj,index) in form2.saveList" :label="obj.name" :value="obj.value" :key="index"></el-option>
<el-form-item label="限制类型" prop="limitclass" v-show="form.item.areaclass == '电子围栏'">
<el-select v-model="form.item.limitclass" placeholder="请选择限制类型" style="width:160px;">
<el-option label="限入" value="限入"></el-option>
<el-option label="限出" value="限出"></el-option>
</el-select>
</el-form-item>
<el-form-item label="裂缝阈值" prop="ilThreshed" >
<el-input v-model="form2.item.ilThreshed" style="width:160px;" placeholder="请输入裂缝阈值"/>
<span style="color:#aaa;">1~255</span>
<br/>
<el-form-item label="选择车辆" prop="cars" v-show="form.item.areaclass == '电子围栏'">
<div class="checkboxViews">
<el-checkbox-group v-model="checkDataList" style="width:480px;">
<el-checkbox v-for="(obj,index) in carInformationData" :label="obj.name + '/' + obj.number" :key="index">{{obj.name + '/' + obj.number}}</el-checkbox>
</el-checkbox-group>
</div>
</el-form-item>
<el-form-item label="唤醒周期" prop="timekey" >
<el-select v-model="form2.item.timekey" placeholder="请选择时间" size="small" style="width:120px;">
<el-option v-for="(obj,index) in form2.timeList" :label="obj.name" :value="obj.value" :key="index"></el-option>
<el-form-item label="启停状态" prop="status" v-show="form.item.areaclass == '电子围栏'">
<el-select v-model="form.item.status" placeholder="请选择启停状态" style="width:160px;">
<el-option label="启用" value="启用"></el-option>
<el-option label="停用" value="停用"></el-option>
</el-select>
<el-input v-model="form2.item.time" style="width:160px;" placeholder="请输入时长"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelForm3">取消</el-button>
<el-button :loading="form2.status.cu === 2" type="primary" @click="reqSetInstruction('form2', form2.item)">确认</el-button>
<el-button type="text" @click="cancelForm">取消</el-button>
<el-button :loading="form.status.cu === 2" type="primary" @click="submitForm('form1', form.item)">确认</el-button>
</div>
</el-dialog>
<!-- 指令日志 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="cancelForm4" :visible.sync="form2.logVisible" :title="form2.title" width="65%">
<div class="content">
<el-table :data="form2.formData" v-loading="loading" border style="width:auto" :row-class-name="tableRowClassName">
<el-table-column prop="subcode" label="设备识别码" min-width="135px"></el-table-column>
<el-table-column prop="ilThreshed" label="裂缝阈值"></el-table-column>
<el-table-column prop="ilAdjust" label="校正功能"></el-table-column>
<el-table-column prop="ilSave" label="存储裂缝" ></el-table-column>
<el-table-column prop="ilSendTime" label="唤醒时间">
<template slot-scope="scope">
{{scope.row.time + '('+scope.row.timeUnit+')'}}
</template>
</el-table-column>
<el-table-column prop="ilSendSuccess" label="下发状态" ></el-table-column>
<el-table-column prop="ilSendTime" label="下发时间" min-width="145px"></el-table-column>
</el-table>
<!--分页组件-->
<el-pagination :total="form2.total" :current-page="form2.page" style="margin-top:8px;" layout="total, prev, pager, next, sizes" @size-change="sizeChange2" @current-change="pageChange2" />
</div>
</el-dialog>
</div>
</template>
<script>
import echarts from 'echarts';
import { Tools, HttpReq, Dates} from '@/assets/js/common.js';
import DateRangePicker from '@/components/DateRangePicker';
import cuAmap from '@/components/AMap';
import Axios from 'axios'
import EZUIKit from "ezuikit-js";
export default {
name: 'Dashboard',
components: {
DateRangePicker, cuAmap
},
name: 'CarType',
components: {},
data() {
return {
imgSrcStart:process.env.VUE_APP_LOCAL_API2,
loading: false,
page: 1,
size: 10,
......@@ -236,75 +153,22 @@ export default {
query:{},
picFileName:'',
tableData: [],
seeMoreData:{},
seeMoreImgUrl:"",
RegionalTypeData:[],
carInformationData:[],
checkAll: false,
checkDataList:[],
timePeriod:[],
form: {
title:'添加设备', visible:false, reqType:'add', historyDialog:false,seeMoreDialog:false,
title:'新增区域信息',
visible:false,
reqType:'add',
status:{cu:0},
selectList:[],
item:{},
monthSelectList:[
{name:'一月', value:'01'},
{name:'二月', value:'02'},
{name:'三月', value:'03'},
{name:'四月', value:'04'},
{name:'五月', value:'05'},
{name:'六月', value:'06'},
{name:'七月', value:'07'},
{name:'八月', value:'08'},
{name:'九月', value:'09'},
{name:'十月', value:'10'},
{name:'十一月', value:'11'},
{name:'十二月', value:'12'},
],
item2:{
value:''
},
},
rules: {
projectId: [
{required: true, message: '请选择项目', trigger: 'blur' }
],
id: [
{required: true, message: '请输入设备ID', trigger: 'blur' }
],
code: [
{required: true, message: '请输入设备识别码', trigger: 'blur' }
],
name: [
{required: true, message: '请输入设备名称', trigger: 'blur' }
],
},
form2:{
title:'指令下发', visible:false, logDialog:false, logVisible:false,
query:{},
page: 1,
size: 10,
total: 0,
status:{cu:0},
item:{
ecode: "",
ename:'',
ilAdjust:0,
ilSave:0,
time:'',
ilThreshed:0,
timekey:'ilTimHour',
},
adjustList:[
{name:'启动', value:1},
{name:'不启动', value:0},
],
saveList:[
{name:'存储', value:1},
{name:'不存储', value:0},
],
timeList:[
{name:'', value:'ilTimHour'},
{name:'', value:'ilTimMins'},
{name:'', value:'ilTimSec'},
],
formData:[],
// time: [
// {required: true, message: '请输入区域信息', trigger: 'blur' }
// ],
},
}
},
......@@ -316,24 +180,31 @@ export default {
},
methods: {
loadData() {
var that = this;
var sort = 'addTime,desc';
var sort = 'createTime,desc';
var param = this.query;
param.page = this.page - 1;
param.size = this.size;
param.sort = sort;
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list;
});
this.$nextTick(()=>{
HttpReq.plantFactory.getDeviceManageList(param).then((res) => {
//console.log(res);
HttpReq.truckDispatching.RegionalInformationQuery(param).then((res) => {
if(res.code == 200){
this.loading = false;
this.tableData = res.content;
this.total = res.totalElements;
this.tableData = res.data.content;
this.total = res.data.totalElements;
}
})
//获取所属类别
HttpReq.truckDispatching.RegionalTypeQuery(param).then((res) => {
if(res.code == 200){
this.RegionalTypeData = res.data.content;
}
})
//获取车辆信息
HttpReq.truckDispatching.carInformationQuery(param).then((res) => {
if(res.code == 200){
this.carInformationData = res.data.content;
}
})
})
......@@ -346,47 +217,34 @@ export default {
}
return '';
},
// 点击搜索
toSearch() {
this.page = 1
this.loadData()
},
clearLimit(){ // 清除限制
this.loadData()
},
cancelForm(a, b, c){
this.form.visible = false;
},
cancelForm2(){
this.form.historyDialog = false;
},
toAdd() {
// 请除表单验证
this.$refs['form1'] && this.$refs['form1'].clearValidate();
this.form.title = '添加设备';
this.form.title = '新增区域信息';
this.form.status.cu = 0;
this.form.visible = true;
this.form.reqType = 'add';
this.form.item = {};
this.picFileName = '';
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list
});
this.checkDataList = [];
},
toEdit(item) {
// 请除表单验证
this.$refs['form1'] && this.$refs['form1'].clearValidate();
this.form.title = '编辑设备';
this.form.title = '修改区域信息';
this.form.status.cu = 0;
this.form.visible = true;
this.form.item = item;
this.form.item = {...item};
this.form.reqType = 'edit';
this.picFileName = this.form.item.position;
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list
});
this.picFileName = this.form.item.card;
this.checkDataList = this.form.item.cars;
let timePeriodCenter = [];
timePeriodCenter.push(this.form.item.startTime);
timePeriodCenter.push(this.form.item.endTime);
this.timePeriod = timePeriodCenter;
},
toDelete(item) {
var id = item.id;
......@@ -396,103 +254,7 @@ export default {
type: 'warning'
}).then((e) => {
this.reqRemoveProject([id])
}).catch((e) => {
})
},
//查看图片以及其他信息
toSeeMore(row){
//console.log(row);
this.seeMoreData = row;
this.seeMoreImgUrl = process.env.VUE_APP_LOCAL_API2 + "/avatar/" + row.position;
this.form.seeMoreDialog = true;
this.$nextTick(()=>{
let videoContainer = document.querySelector('#video-container');
videoContainer.innerHTML = '';
var player = new EZUIKit.EZUIKitPlayer({
autoplay: true,
id: 'video-container',
accessToken:'at.4qo66bb35a19h07a0d9pbmtj5v4g0o78-4jmzdu3k24-0866je6-qkz1xuwmf',
url: 'ezopen://open.ys7.com/J16440511/1.live',
template: "simple", // simple - 极简版;standard-标准版;security - 安防版(预览回放);voice-语音版;
width: 530,
height: 320
});
})
},
toHistoryLog(item){
this.form.historyDialog = true;
this.form.item2.value = Dates.format('MM');
this.form.item2.code = item.ecode;
this.$nextTick(() => {
var ecahrtEl = document.getElementById("ecahrtA");
this.ecahrtA = this.ecahrtA || this.createPanelEcharts(ecahrtEl);
this.reqHistoryList(this.form.item2);
});
},
cancelForm3(a, b, c){
this.form2.visible = false;
},
cancelForm4(a, b, c){
this.form2.logVisible = false;
},
// 指令下发
toInstructionSet(item){
var form2 = this.form2;
// 请除表单验证
//this.$refs['form1'] && this.$refs['form1'].clearValidate();
form2.title = '指令下发';
form2.status.cu = 0;
form2.visible = true;
form2.reqType = 'edit';
form2.item = {
ecode:item.ecode,
subcode:item.subcode,
ilAdjust:form2.item.ilAdjust,
ilSave:form2.item.ilSave,
timekey:form2.item.timekey,
time:'',
};
},
// 指令日志
toInstructionLog(item){
var form2 = this.form2;
// 请除表单验证
//this.$refs['form1'] && this.$refs['form1'].clearValidate();
form2.title = '下发日志';
form2.logVisible = true;
form2.item = item;
var param = form2.query;
param.page = form2.page - 1;
param.size = form2.size;
param.sort = 'addTime,desc';
param.deviceId = item.ecode;
HttpReq.equipment.getInstructionLog(param).then((res) => {
if(res){
form2.total = res.totalElements;
var formData = res.content || [],
timeKeys = {'ilTimHour':'小时','ilTimMins':'分钟','ilTimSec':''};
for(var fitem of formData){
fitem.subcode = item.subcode;
for(var key in timeKeys){
if(fitem[key] || fitem[key] === 0){
fitem['time'] = fitem[key];
fitem.timeUnit = timeKeys[key];
}else{
delete fitem[key]
}
};
fitem.ilAdjust = ['不启动', '启动'][fitem.ilAdjust || 0];
fitem.ilSave = ['不存储', '存储'][fitem.ilSave || 0];
fitem.ilSendSuccess = ['下发失败', '下发成功'][fitem.ilSendSuccess || 0];
};
form2.formData = formData;
};
}).catch(function(error) {
console.log('error ________________ ', error);
});
}).catch((e) => {})
},
pageChange(e) {
this.page = e
......@@ -503,15 +265,6 @@ export default {
this.size = e
this.loadData()
},
pageChange2(e) {
this.form2.page = e
this.reqInstructionLog(this.form2.item)
},
sizeChange2(e) {
this.form2.page = 1;
this.form2.size = e;
this.reqInstructionLog(this.form2.item);
},
submitForm(validateName, item){
if(!this.form.status.cu){
this.form.status.cu = 2;
......@@ -528,74 +281,71 @@ export default {
});
};
},
findHistory(){
this.reqHistoryList(this.form.item2);
},
//请求项目列表
reqProjectsSimple(){
return HttpReq.project.getProject().then((res) => {
if(res.code == 200){
return res.data.content;
}else{
return []
}
})
},
//添加设备
//新增区域信息
reqAddItem(form, item){
let lastData = item;
lastData.position = this.picFileName;
HttpReq.plantFactory.addDeviceManageList(lastData).then((res) => {
form.visible = false;
if(res == 1){
this.$notify({
title: '项目添加成功!',
type: 'success',
duration: 2500
});
this.loadData()
}else{
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}
}).catch(function(error) {
let lastData = {...item};
lastData.card = this.picFileName;
lastData.cars = this.checkDataList;
lastData.startTime = this.timePeriod[0];
lastData.endTime = this.timePeriod[1];
console.log(lastData);
// HttpReq.truckDispatching.RegionalInformationAdd(lastData).then((res) => {
// form.visible = false;
// if(res.code == 200){
// this.$notify({
// title: '区域信息新增成功!',
// type: 'success',
// duration: 2500
// });
// this.loadData()
// }else{
// this.$notify({
// title: res.msg,
// type: 'error',
// duration: 2500
// })
// }
// }).catch(function(error) {
// form.status.cu = 0
// });
form.status.cu = 0
});
},
//修改设备
//修改区域信息
reqUpdateItem(form, item){
let lastData = item;
lastData.position = this.picFileName;
HttpReq.plantFactory.upDateDeviceManageList(lastData).then((res) => {
form.visible = false;
if(res.status == 400){
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}else{
this.$notify({
title: '修改成功!',
type: 'success',
duration: 2500
});
this.loadData()
}
}).catch(function(error) {
let lastData = {...item};
lastData.card = this.picFileName;
lastData.cars = this.checkDataList;
lastData.startTime = this.timePeriod[0];
lastData.endTime = this.timePeriod[1];
console.log(lastData);
// HttpReq.truckDispatching.RegionalInformationUpdate(lastData).then((res) => {
// form.visible = false;
// if(res.code == 200){
// this.$notify({
// title: '区域信息修改成功!',
// type: 'success',
// duration: 2500
// });
// this.loadData()
// }else{
// this.$notify({
// title: res.msg,
// type: 'error',
// duration: 2500
// })
// this.loadData()
// }
// }).catch(function(error) {
// form.status.cu = 0
// });
form.status.cu = 0
});
},
//删除设备
//删除区域信息
reqRemoveProject(item){
HttpReq.plantFactory.removeDeviceManageList(item).then((res) => {
HttpReq.truckDispatching.RegionalInformationDel(item).then((res) => {
if(res.status == 400){
this.$notify({
title: res.head.message,
title: res.msg,
type: 'error',
duration: 2500
})
......@@ -609,195 +359,6 @@ export default {
this.loadData();
})
},
reqHistoryList(item){
var timeSpace = this.query.timeSpace;
var startTime = timeSpace ? timeSpace[0].split(' ')[0] : '';
var endTime = timeSpace ? timeSpace[1].split(' ')[0] : '';
HttpReq.historys.getItemBycode({codes:item.code, startTime:startTime, endTime:endTime}).then((res) => {
if(res.head.code === '0000'){
var body = res.body || {};
var list = body.list || [];
var xAxisData = [];
var helement = [];
var htemperature = [];
var hlenght1 = [], hlenght2 = [], hlenght3 = [];
for(var item of list){
xAxisData.push(item.createTime);
helement.push(item.helement);
htemperature.push(item.htemperature);
hlenght1.push(item.hlenght1);
hlenght2.push(item.hlenght2);
hlenght3.push(item.hlenght3);
};
this.ecahrtA.setData({
xAxis: [
{
type: 'category',
data: xAxisData,
},
],
series: [
{
name: '电压',
data: helement,
},
{
name: '温度',
data: htemperature,
},
{
name: '裂缝1',
data: hlenght1,
},
{
name: '裂缝2',
data: hlenght2,
},
{
name: '裂缝3',
data: hlenght3,
}
]
})
};
}).catch(function(error) {
console.log('catch __ ', error);
})
},
createPanelEcharts(el){
var myChart = echarts.init(el),
lineColor = 'green';
var option = {
title: {
text: '',
subtext: '设备值'
},
tooltip: {
trigger: 'axis'
},
legend: {
data: ['电压', '温度', '裂缝1', '裂缝2', '裂缝3'],
textStyle: {
color: "#000"
},
},
textStyle: {
color: "#333"
},
calculable: true,
xAxis: [
{
type: 'category',
data: [],
}
],
yAxis: [
{
type: 'value',
}
],
grid:{
top:40,
right:10,
bottom:20,
left:45,
},
series: [
{
name: '电压',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
//itemStyle: {normal: {areaStyle: {type: 'default', color:'#00e5ff'}, color:'#00e5ff'}, color:'green'},
},
{
name: '温度',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
},
{
name: '裂缝1',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
//itemStyle: {normal: {areaStyle: {type:'default', color:'red'}, color:'#1849fe'}, color:'red'},
},
{
name: '裂缝2',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
},
{
name: '裂缝3',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
}
]
};
myChart.setOption(option);
var setData = function(option){
myChart.hideLoading();
myChart.setOption(option)
};
return {setData:setData, myChart:myChart}
},
reqSetInstruction(form, item){
var param = {
deviceId:item.ecode,
ilAdjust:item.ilAdjust,
ilSave:item.ilSave,
ilThreshed:item.ilThreshed || 0,
[item.timekey]:item.time || 0,
};
HttpReq.equipment.setInstruction(param).then((res) => {
this.form2.visible = false;
this.$notify({
title: '修改成功!',
type: 'success',
duration: 2500
});
this.loadData()
}).catch(function(error) {
this.form2.status.cu = 0;
this.$notify({
title: error,
type: 'error',
duration: 2500
})
});
},
reqInstructionLog(item){
var form2 = this.form2;
var param = form2.query;
param.page = form2.page - 1;
param.size = form2.size;
param.sort = 'addTime,desc';
param.deviceId = item.ecode;
HttpReq.equipment.getInstructionLog(param).then((res) => {
if(res){
form2.total = res.totalElements;
var formData = res.content || [],
timeKeys = {'ilTimHour':'小时','ilTimMins':'分钟','ilTimSec':''};
for(var fitem of formData){
fitem.subcode = item.subcode;
for(var key in timeKeys){
if(fitem[key]){
fitem['time'] = fitem[key];
fitem.timeUnit = timeKeys[key];
}else{
delete fitem[key]
}
};
fitem.ilAdjust = ['不启动', '启动'][fitem.ilAdjust || 0];
fitem.ilSave = ['不存储', '存储'][fitem.ilSave || 0];
fitem.ilSendSuccess = ['下发失败', '下发成功'][fitem.ilSendSuccess || 0];
};
form2.formData = formData;
};
}).catch(function(error) {
console.log('error ________________ ', error);
});
},
//图片上传
excelImport(event) {
let that = this;
......@@ -822,16 +383,6 @@ export default {
console.log(error);
});
},
//项目名称展示
formatter(row){
let proName = "";
this.form.selectList.forEach(function(item){
if(row.projectId == item.id){
proName = item.name;
}
})
return proName
}
}
}
</script>
......@@ -856,9 +407,19 @@ export default {
}
.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;}
}
}
}
}
.checkboxViews{
padding-left: 10px;
box-sizing: border-box;
width: 490px;
height: 120px;
border: 1px gainsboro solid;
overflow-y:scroll;
overflow-x:hidden;
}
.ecahrt1-dialog{
display:flex;align-items:center;
.el-dialog{
......
<template>
<div class="common-page device-manage">
<div class="option page-row">
<!--工具栏-->
<div class="head-container">
<!-- 搜索 -->
<label class="el-form-item-label" style="font-weight: 500;">设备识别码</label>
<el-input v-model="query.code" clearable size="small" placeholder="请输入设备识别码" style="width:180px;" @clear="clearLimit"/>
<el-button size="mini" type="success" icon="el-icon-search" @click="toSearch">搜索</el-button>
</div>
</div>
<!-- 表格 -->
<div class="panel-bottom page-row">
<h3>设备管理列表</h3>
<h3>区域类别设置</h3>
<div class="ctin-box">
<div class="content-within">
<div class="content-fix">
......@@ -19,30 +12,15 @@
</div>
<div class="content">
<el-table :data="tableData" v-loading="loading" border style="width:auto" :row-class-name="tableRowClassName">
<el-table-column prop="id" label="设备ID" align="center"></el-table-column>
<el-table-column prop="code" label="设备识别码" align="center"></el-table-column>
<el-table-column prop="name" label="设备名称" align="center"></el-table-column>
<el-table-column prop="alarmWindspeed" label="风速报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmTemperature" label="温度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmHumidity" label="湿度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmCo2" label="二氧化碳报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmMlux" label="光照报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmPh" label="酸碱度报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmWaterTemperature" label="水温报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmElectricalConductance" label="电导率报警阈值" align="center"></el-table-column>
<el-table-column prop="alarmWaterDepth" label="液位报警阈值" align="center"></el-table-column>
<el-table-column prop="createTime" label="设备激活时间" align="center"></el-table-column>
<el-table-column prop="addTime" label="最后采集时间" align="center"></el-table-column>
<el-table-column prop="projectId" label="所属项目" align="center" :formatter="formatter"></el-table-column>
<el-table-column label="操作" min-width="180px" align="center" fixed="right">
<el-table-column prop="id" label="序号" align="center"></el-table-column>
<el-table-column prop="code" label="区域编码" align="center"></el-table-column>
<el-table-column prop="classname" label="类别名称" align="center"></el-table-column>
<el-table-column prop="color" label="区域遮罩层颜色" align="center"></el-table-column>
<el-table-column prop="createTime" label="日期" align="center"></el-table-column>
<el-table-column label="操作" align="center" fixed="right">
<template slot-scope="scope">
<el-button size="mini" type="success" icon="el-icon-view" @click="toSeeMore(scope.row)"></el-button>
<el-button size="mini" type="primary" icon="el-icon-edit" @click="toEdit(scope.row)"></el-button>
<el-button size="mini" type="danger" icon="el-icon-delete" @click="toDelete(scope.row)"></el-button>
<!-- <div class="btn-groub2">
<el-button size="mini" type="warning" icon="el-icon-set-up" @click="toInstructionSet(scope.row)"></el-button>
<el-button size="mini" type="info" icon="el-icon-tickets" @click="toInstructionLog(scope.row)"></el-button>
</div> -->
</template>
</el-table-column>
</el-table>
......@@ -57,56 +35,15 @@
<!-- 表单渲染 -->
<el-dialog append-to-body :close-on-click-modal="true" :before-close="cancelForm" :visible.sync="form.visible" :title="form.title" width="700px">
<el-form :model="form.item" :rules="rules" ref="form1" :inline="true" size="small" label-width="150px">
<el-form-item label="选择项目" prop="projectId" >
<el-select v-model="form.item.projectId" placeholder="请选择项目" size="small">
<el-option v-for="(obj,index) in form.selectList" :label="obj.name" :value="obj.id" :key="index"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="设备ID" prop="id">
<el-input v-model="form.item.id" style="width:280px;" placeholder="请输入设备编号" :disabled="form.reqType==='edit'"/>
</el-form-item> -->
<el-form-item label="设备识别码" prop="code">
<el-input v-model="form.item.code" style="width:260px;" placeholder="请输入设备识别码" :disabled="form.reqType==='edit'"/>
</el-form-item>
<el-form-item label="设备名称" prop="name">
<el-input v-model="form.item.name" style="width:260px;" placeholder="请输入设备名称"/>
</el-form-item>
<el-form-item label="风速报警阈值" prop="alarmWindspeed" >
<el-input v-model="form.item.alarmWindspeed" style="width:160px;" placeholder="请输入风速报警阈值"/>
</el-form-item>
<el-form-item label="温度报警阈值" prop="alarmTemperature" >
<el-input v-model="form.item.alarmTemperature" style="width:160px;" placeholder="请输入温度报警阈值"/>
</el-form-item>
<el-form-item label="湿度报警阈值" prop="alarmHumidity" >
<el-input v-model="form.item.alarmHumidity" style="width:160px;" placeholder="请输入湿度报警阈值"/>
</el-form-item>
<el-form-item label="二氧化碳报警阈值" prop="alarmCo2" >
<el-input v-model="form.item.alarmCo2" style="width:160px;" placeholder="请输入二氧化碳报警阈值"/>
</el-form-item>
<el-form-item label="光照报警阈值" prop="alarmMlux" >
<el-input v-model="form.item.alarmMlux" style="width:160px;" placeholder="请输入光照报警阈值"/>
</el-form-item>
<el-form-item label="酸碱度报警阈值" prop="alarmPh" >
<el-input v-model="form.item.alarmPh" style="width:160px;" placeholder="请输入酸碱度报警阈值"/>
</el-form-item>
<el-form-item label="水温报警阈值" prop="alarmWaterTemperature" >
<el-input v-model="form.item.alarmWaterTemperature" style="width:160px;" placeholder="请输入水温报警阈值"/>
<el-form-item label="区域编码" prop="code">
<el-input v-model="form.item.code" style="width:280px;" placeholder="请输入区域编码"/>
</el-form-item>
<el-form-item label="电导率报警阈值" prop="alarmElectricalConductance" >
<el-input v-model="form.item.alarmElectricalConductance" style="width:160px;" placeholder="请输入电导率报警阈值"/>
<el-form-item label="类别名称" prop="classname">
<el-input v-model="form.item.classname" style="width:280px;" placeholder="请输入类别名称"/>
</el-form-item>
<el-form-item label="液位报警阈值" prop="alarmWaterDepth" >
<el-input v-model="form.item.alarmWaterDepth" style="width:160px;" placeholder="请输入液位报警阈值"/>
<el-form-item label="区域遮罩层颜色" prop="color">
<el-input v-model="form.item.color" style="width:280px;" placeholder="请输入区域遮罩层颜色"/>
</el-form-item>
<el-form-item label="上传设备位置" prop="position">
<el-input v-model="picFileName" style="width:160px;" placeholder="请上传设备位置" disabled />
<input type="file" name="image" @change="excelImport($event)" />
</el-form-item>
<div style="margin:0px 0px 10px 55px;font-size:16px;font-weight:bold;">摄像头参数配置</div>
<el-form-item label="摄像头ID" prop="camera">
<el-input v-model="form.item.camera" style="width:160px;" placeholder="请输入摄像头ID"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelForm">取消</el-button>
......@@ -114,119 +51,15 @@
</div>
</el-dialog>
<!-- 查看更多 -->
<el-dialog title="查看设备" :visible.sync="form.seeMoreDialog" width="800px">
<el-form :model="seeMoreData" style="margin-top:20px;">
<el-form-item label="摄像头位置图片" label-width="150px">
<el-image :src="seeMoreImgUrl" style="width:300px;"></el-image>
</el-form-item>
<el-form-item label="摄像头图像" label-width="150px">
<div id="video-container" style="width:550px;height:350px"></div>
</el-form-item>
<el-form-item label="摄像头ID" label-width="150px">
<el-input v-model="seeMoreData.camera" style="width:200px"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="form.seeMoreDialog = false">关闭</el-button>
</div>
</el-dialog>
<!-- 历史图表 -->
<el-dialog class="ecahrt1-dialog" append-to-body :close-on-click-modal="false" :before-close="cancelForm2" :visible.sync="form.historyDialog">
<el-form :rules="rules" ref="form1" :inline="true" size="small" label-width="80px">
<!-- <el-form-item prop="eprogramid" >
<el-select v-model="form.item2.value" placeholder="请选择月份">
<el-option v-for="obj in form.monthSelectList" :label="obj.name" :value="obj.value"></el-option>
</el-select>
</el-form-item> -->
<el-form-item prop="eprogramid" >
<date-range-picker v-model="query.timeSpace" class="date-item" />
</el-form-item>
<el-form-item >
<el-button type="primary" @click="findHistory">查询</el-button>
</el-form-item>
<el-form-item prop="content" style="display:block;" >
<div class="form-body">
<div id="ecahrtA"></div>
</div>
</el-form-item>
</el-form>
</el-dialog>
<!-- 指令下发 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="cancelForm3" :visible.sync="form2.visible" :title="form2.title" width="600px">
<el-form :model="form2.item" :rules="rules" ref="form2" :inline="true" size="small" label-width="100px">
<el-form-item label="设备ID" prop="ecode">
<el-input v-model="form2.item.ecode" style="width:280px;" placeholder="请输入设备编号" :disabled="form2.reqType==='edit'"/>
</el-form-item>
<el-form-item label="设备识别码" prop="subcode">
<el-input v-model="form2.item.subcode" style="width:260px;" placeholder="请输入设备识别码" :disabled="form2.reqType==='edit'"/>
</el-form-item>
<el-form-item label="是否启动校正" prop="ilAdjust" style="width:240px;">
<el-select v-model="form2.item.ilAdjust" placeholder="请选择" size="small" style="width:120px;">
<el-option v-for="obj in form2.adjustList" :label="obj.name" :key="obj.value" :value="obj.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否存储裂缝" prop="ilSave" style="width:240px;">
<el-select v-model="form2.item.ilSave" placeholder="请选择" size="small" style="width:120px;">
<el-option v-for="(obj,index) in form2.saveList" :label="obj.name" :value="obj.value" :key="index"></el-option>
</el-select>
</el-form-item>
<el-form-item label="裂缝阈值" prop="ilThreshed" >
<el-input v-model="form2.item.ilThreshed" style="width:160px;" placeholder="请输入裂缝阈值"/>
<span style="color:#aaa;">1~255</span>
</el-form-item>
<el-form-item label="唤醒周期" prop="timekey" >
<el-select v-model="form2.item.timekey" placeholder="请选择时间" size="small" style="width:120px;">
<el-option v-for="(obj,index) in form2.timeList" :label="obj.name" :value="obj.value" :key="index"></el-option>
</el-select>
<el-input v-model="form2.item.time" style="width:160px;" placeholder="请输入时长"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelForm3">取消</el-button>
<el-button :loading="form2.status.cu === 2" type="primary" @click="reqSetInstruction('form2', form2.item)">确认</el-button>
</div>
</el-dialog>
<!-- 指令日志 -->
<el-dialog append-to-body :close-on-click-modal="false" :before-close="cancelForm4" :visible.sync="form2.logVisible" :title="form2.title" width="65%">
<div class="content">
<el-table :data="form2.formData" v-loading="loading" border style="width:auto" :row-class-name="tableRowClassName">
<el-table-column prop="subcode" label="设备识别码" min-width="135px"></el-table-column>
<el-table-column prop="ilThreshed" label="裂缝阈值"></el-table-column>
<el-table-column prop="ilAdjust" label="校正功能"></el-table-column>
<el-table-column prop="ilSave" label="存储裂缝" ></el-table-column>
<el-table-column prop="ilSendTime" label="唤醒时间">
<template slot-scope="scope">
{{scope.row.time + '('+scope.row.timeUnit+')'}}
</template>
</el-table-column>
<el-table-column prop="ilSendSuccess" label="下发状态" ></el-table-column>
<el-table-column prop="ilSendTime" label="下发时间" min-width="145px"></el-table-column>
</el-table>
<!--分页组件-->
<el-pagination :total="form2.total" :current-page="form2.page" style="margin-top:8px;" layout="total, prev, pager, next, sizes" @size-change="sizeChange2" @current-change="pageChange2" />
</div>
</el-dialog>
</div>
</template>
<script>
import echarts from 'echarts';
import { Tools, HttpReq, Dates} from '@/assets/js/common.js';
import DateRangePicker from '@/components/DateRangePicker';
import cuAmap from '@/components/AMap';
import Axios from 'axios'
import EZUIKit from "ezuikit-js";
export default {
name: 'Dashboard',
components: {
DateRangePicker, cuAmap
},
name: 'RegionalType',
components: {},
data() {
return {
loading: false,
......@@ -234,77 +67,18 @@ export default {
size: 10,
total: 0,
query:{},
picFileName:'',
tableData: [],
seeMoreData:{},
seeMoreImgUrl:"",
form: {
title:'添加设备', visible:false, reqType:'add', historyDialog:false,seeMoreDialog:false,
title:'新增区域类别',
visible:false,
reqType:'add',
status:{cu:0},
selectList:[],
item:{},
monthSelectList:[
{name:'一月', value:'01'},
{name:'二月', value:'02'},
{name:'三月', value:'03'},
{name:'四月', value:'04'},
{name:'五月', value:'05'},
{name:'六月', value:'06'},
{name:'七月', value:'07'},
{name:'八月', value:'08'},
{name:'九月', value:'09'},
{name:'十月', value:'10'},
{name:'十一月', value:'11'},
{name:'十二月', value:'12'},
],
item2:{
value:''
},
},
rules: {
projectId: [
{required: true, message: '请选择项目', trigger: 'blur' }
],
id: [
{required: true, message: '请输入设备ID', trigger: 'blur' }
],
code: [
{required: true, message: '请输入设备识别码', trigger: 'blur' }
],
name: [
{required: true, message: '请输入设备名称', trigger: 'blur' }
],
},
form2:{
title:'指令下发', visible:false, logDialog:false, logVisible:false,
query:{},
page: 1,
size: 10,
total: 0,
status:{cu:0},
item:{
ecode: "",
ename:'',
ilAdjust:0,
ilSave:0,
time:'',
ilThreshed:0,
timekey:'ilTimHour',
},
adjustList:[
{name:'启动', value:1},
{name:'不启动', value:0},
],
saveList:[
{name:'存储', value:1},
{name:'不存储', value:0},
],
timeList:[
{name:'', value:'ilTimHour'},
{name:'', value:'ilTimMins'},
{name:'', value:'ilTimSec'},
],
formData:[],
// time: [
// {required: true, message: '请输入车辆型号', trigger: 'blur' }
// ],
},
}
},
......@@ -316,24 +90,19 @@ export default {
},
methods: {
loadData() {
var that = this;
var sort = 'addTime,desc';
var sort = 'createTime,desc';
var param = this.query;
param.page = this.page - 1;
param.size = this.size;
param.sort = sort;
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list;
});
this.$nextTick(()=>{
HttpReq.plantFactory.getDeviceManageList(param).then((res) => {
//console.log(res);
HttpReq.truckDispatching.RegionalTypeQuery(param).then((res) => {
if(res.code == 200){
this.loading = false;
this.tableData = res.content;
this.total = res.totalElements;
this.tableData = res.data.content;
this.total = res.data.totalElements;
}
})
})
......@@ -346,47 +115,26 @@ export default {
}
return '';
},
// 点击搜索
toSearch() {
this.page = 1
this.loadData()
},
clearLimit(){ // 清除限制
this.loadData()
},
cancelForm(a, b, c){
this.form.visible = false;
},
cancelForm2(){
this.form.historyDialog = false;
},
toAdd() {
// 请除表单验证
this.$refs['form1'] && this.$refs['form1'].clearValidate();
this.form.title = '添加设备';
this.form.title = '新增区域类别';
this.form.status.cu = 0;
this.form.visible = true;
this.form.reqType = 'add';
this.form.item = {};
this.picFileName = '';
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list
});
},
toEdit(item) {
// 请除表单验证
this.$refs['form1'] && this.$refs['form1'].clearValidate();
this.form.title = '编辑设备';
this.form.title = '修改区域类别';
this.form.status.cu = 0;
this.form.visible = true;
this.form.item = item;
this.form.item = {...item};
this.form.reqType = 'edit';
this.picFileName = this.form.item.position;
//请求项目列表
this.reqProjectsSimple().then((list) => {
this.form.selectList = list
});
},
toDelete(item) {
var id = item.id;
......@@ -396,103 +144,7 @@ export default {
type: 'warning'
}).then((e) => {
this.reqRemoveProject([id])
}).catch((e) => {
})
},
//查看图片以及其他信息
toSeeMore(row){
//console.log(row);
this.seeMoreData = row;
this.seeMoreImgUrl = process.env.VUE_APP_LOCAL_API2 + "/avatar/" + row.position;
this.form.seeMoreDialog = true;
this.$nextTick(()=>{
let videoContainer = document.querySelector('#video-container');
videoContainer.innerHTML = '';
var player = new EZUIKit.EZUIKitPlayer({
autoplay: true,
id: 'video-container',
accessToken:'at.4qo66bb35a19h07a0d9pbmtj5v4g0o78-4jmzdu3k24-0866je6-qkz1xuwmf',
url: 'ezopen://open.ys7.com/J16440511/1.live',
template: "simple", // simple - 极简版;standard-标准版;security - 安防版(预览回放);voice-语音版;
width: 530,
height: 320
});
})
},
toHistoryLog(item){
this.form.historyDialog = true;
this.form.item2.value = Dates.format('MM');
this.form.item2.code = item.ecode;
this.$nextTick(() => {
var ecahrtEl = document.getElementById("ecahrtA");
this.ecahrtA = this.ecahrtA || this.createPanelEcharts(ecahrtEl);
this.reqHistoryList(this.form.item2);
});
},
cancelForm3(a, b, c){
this.form2.visible = false;
},
cancelForm4(a, b, c){
this.form2.logVisible = false;
},
// 指令下发
toInstructionSet(item){
var form2 = this.form2;
// 请除表单验证
//this.$refs['form1'] && this.$refs['form1'].clearValidate();
form2.title = '指令下发';
form2.status.cu = 0;
form2.visible = true;
form2.reqType = 'edit';
form2.item = {
ecode:item.ecode,
subcode:item.subcode,
ilAdjust:form2.item.ilAdjust,
ilSave:form2.item.ilSave,
timekey:form2.item.timekey,
time:'',
};
},
// 指令日志
toInstructionLog(item){
var form2 = this.form2;
// 请除表单验证
//this.$refs['form1'] && this.$refs['form1'].clearValidate();
form2.title = '下发日志';
form2.logVisible = true;
form2.item = item;
var param = form2.query;
param.page = form2.page - 1;
param.size = form2.size;
param.sort = 'addTime,desc';
param.deviceId = item.ecode;
HttpReq.equipment.getInstructionLog(param).then((res) => {
if(res){
form2.total = res.totalElements;
var formData = res.content || [],
timeKeys = {'ilTimHour':'小时','ilTimMins':'分钟','ilTimSec':''};
for(var fitem of formData){
fitem.subcode = item.subcode;
for(var key in timeKeys){
if(fitem[key] || fitem[key] === 0){
fitem['time'] = fitem[key];
fitem.timeUnit = timeKeys[key];
}else{
delete fitem[key]
}
};
fitem.ilAdjust = ['不启动', '启动'][fitem.ilAdjust || 0];
fitem.ilSave = ['不存储', '存储'][fitem.ilSave || 0];
fitem.ilSendSuccess = ['下发失败', '下发成功'][fitem.ilSendSuccess || 0];
};
form2.formData = formData;
};
}).catch(function(error) {
console.log('error ________________ ', error);
});
}).catch((e) => {})
},
pageChange(e) {
this.page = e
......@@ -503,15 +155,6 @@ export default {
this.size = e
this.loadData()
},
pageChange2(e) {
this.form2.page = e
this.reqInstructionLog(this.form2.item)
},
sizeChange2(e) {
this.form2.page = 1;
this.form2.size = e;
this.reqInstructionLog(this.form2.item);
},
submitForm(validateName, item){
if(!this.form.status.cu){
this.form.status.cu = 2;
......@@ -528,36 +171,21 @@ export default {
});
};
},
findHistory(){
this.reqHistoryList(this.form.item2);
},
//请求项目列表
reqProjectsSimple(){
return HttpReq.project.getProject().then((res) => {
if(res.code == 200){
return res.data.content;
}else{
return []
}
})
},
//添加设备
//新增区域类别
reqAddItem(form, item){
let lastData = item;
lastData.position = this.picFileName;
HttpReq.plantFactory.addDeviceManageList(lastData).then((res) => {
let lastData = {...item};
HttpReq.truckDispatching.RegionalTypeAdd(lastData).then((res) => {
form.visible = false;
if(res == 1){
if(res.code == 200){
this.$notify({
title: '项目添加成功!',
title: '区域类别新增成功!',
type: 'success',
duration: 2500
});
this.loadData()
}else{
this.$notify({
title: res.head.message,
title: res.msg,
type: 'error',
duration: 2500
})
......@@ -566,36 +194,35 @@ export default {
form.status.cu = 0
});
},
//修改设备
//修改区域类别
reqUpdateItem(form, item){
let lastData = item;
lastData.position = this.picFileName;
HttpReq.plantFactory.upDateDeviceManageList(lastData).then((res) => {
let lastData = {...item};
HttpReq.truckDispatching.RegionalTypeUpdate(lastData).then((res) => {
form.visible = false;
if(res.status == 400){
this.$notify({
title: res.head.message,
type: 'error',
duration: 2500
})
}else{
if(res.code == 200){
this.$notify({
title: '修改成功!',
title: '区域类别修改成功!',
type: 'success',
duration: 2500
});
this.loadData()
}else{
this.$notify({
title: res.msg,
type: 'error',
duration: 2500
})
}
}).catch(function(error) {
form.status.cu = 0
});
},
//删除设备
//删除区域类别
reqRemoveProject(item){
HttpReq.plantFactory.removeDeviceManageList(item).then((res) => {
HttpReq.truckDispatching.RegionalTypeDel(item).then((res) => {
if(res.status == 400){
this.$notify({
title: res.head.message,
title: res.msg,
type: 'error',
duration: 2500
})
......@@ -609,229 +236,6 @@ export default {
this.loadData();
})
},
reqHistoryList(item){
var timeSpace = this.query.timeSpace;
var startTime = timeSpace ? timeSpace[0].split(' ')[0] : '';
var endTime = timeSpace ? timeSpace[1].split(' ')[0] : '';
HttpReq.historys.getItemBycode({codes:item.code, startTime:startTime, endTime:endTime}).then((res) => {
if(res.head.code === '0000'){
var body = res.body || {};
var list = body.list || [];
var xAxisData = [];
var helement = [];
var htemperature = [];
var hlenght1 = [], hlenght2 = [], hlenght3 = [];
for(var item of list){
xAxisData.push(item.createTime);
helement.push(item.helement);
htemperature.push(item.htemperature);
hlenght1.push(item.hlenght1);
hlenght2.push(item.hlenght2);
hlenght3.push(item.hlenght3);
};
this.ecahrtA.setData({
xAxis: [
{
type: 'category',
data: xAxisData,
},
],
series: [
{
name: '电压',
data: helement,
},
{
name: '温度',
data: htemperature,
},
{
name: '裂缝1',
data: hlenght1,
},
{
name: '裂缝2',
data: hlenght2,
},
{
name: '裂缝3',
data: hlenght3,
}
]
})
};
}).catch(function(error) {
console.log('catch __ ', error);
})
},
createPanelEcharts(el){
var myChart = echarts.init(el),
lineColor = 'green';
var option = {
title: {
text: '',
subtext: '设备值'
},
tooltip: {
trigger: 'axis'
},
legend: {
data: ['电压', '温度', '裂缝1', '裂缝2', '裂缝3'],
textStyle: {
color: "#000"
},
},
textStyle: {
color: "#333"
},
calculable: true,
xAxis: [
{
type: 'category',
data: [],
}
],
yAxis: [
{
type: 'value',
}
],
grid:{
top:40,
right:10,
bottom:20,
left:45,
},
series: [
{
name: '电压',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
//itemStyle: {normal: {areaStyle: {type: 'default', color:'#00e5ff'}, color:'#00e5ff'}, color:'green'},
},
{
name: '温度',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
},
{
name: '裂缝1',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
//itemStyle: {normal: {areaStyle: {type:'default', color:'red'}, color:'#1849fe'}, color:'red'},
},
{
name: '裂缝2',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
},
{
name: '裂缝3',
type: 'line',
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
}
]
};
myChart.setOption(option);
var setData = function(option){
myChart.hideLoading();
myChart.setOption(option)
};
return {setData:setData, myChart:myChart}
},
reqSetInstruction(form, item){
var param = {
deviceId:item.ecode,
ilAdjust:item.ilAdjust,
ilSave:item.ilSave,
ilThreshed:item.ilThreshed || 0,
[item.timekey]:item.time || 0,
};
HttpReq.equipment.setInstruction(param).then((res) => {
this.form2.visible = false;
this.$notify({
title: '修改成功!',
type: 'success',
duration: 2500
});
this.loadData()
}).catch(function(error) {
this.form2.status.cu = 0;
this.$notify({
title: error,
type: 'error',
duration: 2500
})
});
},
reqInstructionLog(item){
var form2 = this.form2;
var param = form2.query;
param.page = form2.page - 1;
param.size = form2.size;
param.sort = 'addTime,desc';
param.deviceId = item.ecode;
HttpReq.equipment.getInstructionLog(param).then((res) => {
if(res){
form2.total = res.totalElements;
var formData = res.content || [],
timeKeys = {'ilTimHour':'小时','ilTimMins':'分钟','ilTimSec':''};
for(var fitem of formData){
fitem.subcode = item.subcode;
for(var key in timeKeys){
if(fitem[key]){
fitem['time'] = fitem[key];
fitem.timeUnit = timeKeys[key];
}else{
delete fitem[key]
}
};
fitem.ilAdjust = ['不启动', '启动'][fitem.ilAdjust || 0];
fitem.ilSave = ['不存储', '存储'][fitem.ilSave || 0];
fitem.ilSendSuccess = ['下发失败', '下发成功'][fitem.ilSendSuccess || 0];
};
form2.formData = formData;
};
}).catch(function(error) {
console.log('error ________________ ', error);
});
},
//图片上传
excelImport(event) {
let that = this;
let file = event.target.files[0];
let formData1 = new FormData();
formData1.append("avatar", file);
Axios({
url: process.env.VUE_APP_LOCAL_API2 + '/api/wEquipment/updateAvatar',
method: "post",
data: formData1,
}).then(
response => {
if (response.status == 200) {
this.$message.success("上传成功");
that.picFileName = response.data.avatar;
} else {
this.$message.error("上传失败");
}
},
)
.catch(error => {
console.log(error);
});
},
//项目名称展示
formatter(row){
let proName = "";
this.form.selectList.forEach(function(item){
if(row.projectId == item.id){
proName = item.name;
}
})
return proName
}
}
}
</script>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment