586 lines
22 KiB
JavaScript
586 lines
22 KiB
JavaScript
var cameraApp= angular.module('cameraApp',[]);
|
||
|
||
cameraApp.controller('cameraCtrl',function($http,$scope,$rootScope,$timeout){
|
||
$scope.channelIDs = 1;//频道号 默认为1
|
||
$scope.optMemory;//当前选择的存储配置
|
||
$scope.videotape;//录像设备
|
||
$(document).ready(function () {
|
||
if($scope.languageJson == undefined)
|
||
$scope.languageJson = angular.fromJson(sessionStorage.getItem("languageJson"));
|
||
var title = $scope.languageJson.Playback.Title;
|
||
var voides = JudgeBrowsers();
|
||
initvideoplugin(voides);
|
||
inittree(voides);
|
||
initVideotape();
|
||
inittimeline();
|
||
initdatetimepicker();
|
||
setSystemStyle();
|
||
});
|
||
function initvideoplugin(voides) {
|
||
if(voides != true) return;
|
||
|
||
if (-1==WebVideoCtrl.I_CheckPluginInstall()) {
|
||
$("#camera-plugin").innerHTML="<a href='files/WebComponentsKit.exe' target='_black'> 您还未安装过插件,单击该连接下载安装!</a>";
|
||
return;
|
||
}
|
||
var width=$("#camera-plugin").width();
|
||
var height=$("#camera-plugin").height();
|
||
WebVideoCtrl.I_InitPlugin(width, height, {
|
||
iWndowType: 2,
|
||
cbSelWnd: function (xmlDoc) {
|
||
g_iWndIndex = $(xmlDoc).find("SelectWnd").eq(0).text();
|
||
}
|
||
});
|
||
WebVideoCtrl.I_InsertOBJECTPlugin("camera-plugin");
|
||
}
|
||
function inittree(voides){
|
||
var dataObj={};
|
||
var dataArray = [];
|
||
dataArray.push({
|
||
K: 'videoEquipment.getAllPlayback',
|
||
V: 'NA'
|
||
});
|
||
dataObj.data = dataArray;
|
||
|
||
var result = [];//返回的数据
|
||
$http({
|
||
method: 'POST',
|
||
url: '/data',
|
||
data: dataObj,
|
||
headers: {
|
||
'Content-Type': 'text/plain'
|
||
}
|
||
}).then(function(response) {
|
||
var obj = eval(response.data);
|
||
if (angular.isArray(obj) & obj.length > 0 & obj[0].V!="]") {
|
||
result = eval(obj[0].V);
|
||
$scope.reocrdequipmen = result;
|
||
if(voides != true) return;
|
||
$scope.optMemory = result[0];//存放第一个存储设备数据
|
||
for(var i=0;i<result.length;i++){
|
||
var szIP = result[i].ip,
|
||
szPort = result[i].port,
|
||
szUsername = result[i].username,
|
||
szPassword = result[i].pwd,
|
||
szID = result[i].id;
|
||
WebVideoCtrl.I_Logout(szIP);
|
||
var iRet = WebVideoCtrl.I_Login(szIP, 1, szPort, szUsername, szPassword, {
|
||
success: function (xmlDoc) {
|
||
setTimeout(function(){
|
||
clickGetDigitalChannelInfo(szIP,$("#requipment"+szID));
|
||
},500);
|
||
},
|
||
error: function () {
|
||
// alert("请检测设备是否连接成功!");
|
||
}
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}
|
||
function JudgeBrowsers(){
|
||
var NV = {};
|
||
var UA = navigator.userAgent.toLowerCase();
|
||
NV.name = (UA.indexOf("chrome")>0)?'chrome':'unkonw';
|
||
NV.version = (NV.name=='chrome')?UA.match(/chrome\/([\d.]+)/)[1]:'0';
|
||
var isIe = "ActiveXObject" in window;
|
||
if(isIe) return true;
|
||
if(NV.name === 'chrome' && parseInt(NV.version) <= 42) return true;//64bit chrome v34
|
||
}
|
||
|
||
function setSystemStyle(){
|
||
var style = localStorage.getItem("systemStyle");
|
||
var random = parseInt(10000*Math.random());
|
||
if(style != undefined && style != "Blue")
|
||
$("#Camera_StyleLink").attr("href", "../css/"+style+"Style.css?v=" + random);
|
||
else
|
||
$("#Camera_VersionLink").attr("href","../css/versions2.css?v="+random);
|
||
|
||
$(".loginbody").addClass("body_bg");
|
||
};
|
||
|
||
|
||
function initVideotape(){
|
||
var dataObj={};
|
||
var dataArray = [];
|
||
dataArray.push({
|
||
K: 'videoEquipment.getAllMonitor',
|
||
V: 'NA'
|
||
});
|
||
dataObj.data = dataArray;
|
||
|
||
var result = [];//返回的数据
|
||
$http({
|
||
method: 'POST',
|
||
url: '/data',
|
||
data: dataObj,
|
||
headers: {
|
||
'Content-Type': 'text/plain'
|
||
}
|
||
}).then(function(response) {
|
||
var obj = eval(response.data);
|
||
if (angular.isArray(obj) & obj.length > 0) {
|
||
result = angular.fromJson(obj[0].V);//eval(V);
|
||
$scope.videotape = result;
|
||
}
|
||
});
|
||
}
|
||
function clickGetDigitalChannelInfo(ip,obj) {
|
||
var szIP =ip, iAnalogChannelNum = 0;
|
||
if ("" == szIP) return;
|
||
// 模拟通道
|
||
WebVideoCtrl.I_GetAnalogChannelInfo(szIP, {
|
||
async: false,
|
||
success: function (xmlDoc) {
|
||
iAnalogChannelNum = $(xmlDoc).find("VideoInputChannel").length;
|
||
}
|
||
});
|
||
|
||
var results = new Array();
|
||
// 数字通道
|
||
WebVideoCtrl.I_GetDigitalChannelInfo(szIP, {
|
||
async: false,
|
||
success: function (xmlDoc) {
|
||
var oChannels = $(xmlDoc).find("InputProxyChannelStatus");
|
||
$.each(oChannels, function () {
|
||
var values = {};
|
||
values.id = parseInt($(this).find("id").eq(0).text());
|
||
values.ipAddress = $(this).find("ipAddress").eq(0).text();
|
||
values.srcInputPort = $(this).find("srcInputPort").eq(0).text();
|
||
values.managePortNo = $(this).find("managePortNo").eq(0).text();
|
||
values.online = $(this).find("online").eq(0).text();
|
||
values.name= $(this).find("name").eq(0).text();
|
||
values.proxyProtocol = $(this).find("proxyProtocol").eq(0).text();
|
||
results.push(values);
|
||
});
|
||
|
||
$scope.reocrdequipmens = results;
|
||
$scope.$apply();
|
||
},
|
||
error: function () {
|
||
console.log(szIP + " 没有数字通道!");
|
||
}
|
||
});
|
||
}
|
||
function inittimeline(){
|
||
var tld = "timeline";
|
||
var tg1 = $("#placement").timeline({
|
||
"min_zoom":1,
|
||
"max_zoom":50,
|
||
"show_centerline":true,
|
||
"show_footer":true,
|
||
"display_zoom_level":true,
|
||
"event_modal":{type:"full"},
|
||
"event_overflow":"scroll",
|
||
"data_source":"#mylife"
|
||
});
|
||
|
||
/*setTimeout(function(){
|
||
initrecordplay();
|
||
},500);*/
|
||
}
|
||
function initrecordplay(){
|
||
$("#mylife >.timeglider-event-spanning").on('click',function(){
|
||
var starttime=$(this).attr("starttime");
|
||
$("#currentdate").text(starttime);
|
||
});
|
||
}
|
||
|
||
function initdatetimepicker(){
|
||
$('.form_time').datetimepicker({
|
||
|
||
weekStart: 1,
|
||
todayBtn: 1,
|
||
autoclose: 1,
|
||
todayHighlight: 1,
|
||
minView: 0,
|
||
maxView: 1,
|
||
forceParse: 0
|
||
});/*language: 'zh-CN',*/
|
||
var date = new Date();
|
||
var starttime = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate() + " 00:00:00";
|
||
$("#starttime").val(starttime);
|
||
$("#endtime").val(getNowFormatDate());
|
||
}
|
||
function getNowFormatDate() {
|
||
var date = new Date();
|
||
var seperator1 = "-";
|
||
var seperator2 = ":";
|
||
var month = date.getMonth() + 1;
|
||
var strDate = date.getDate();
|
||
if (month >= 1 && month <= 9) {
|
||
month = "0" + month;
|
||
}
|
||
if (strDate >= 0 && strDate <= 9) {
|
||
strDate = "0" + strDate;
|
||
}
|
||
var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate
|
||
+ " " + date.getHours() + seperator2 + date.getMinutes()
|
||
+ seperator2 + date.getSeconds();
|
||
return currentdate;
|
||
}
|
||
$scope.setcurrentrecord = function(ip,par,obj){
|
||
$scope.currentip=ip;
|
||
$(".tree li").css("color","#fff");
|
||
$("#"+ par.id+"_"+obj.id).css("color","#9E1F24");
|
||
$scope.channelIDs = obj.id;
|
||
};
|
||
function searchrecord(iType){
|
||
var xmlDoc = WebVideoCtrl.I_GetLocalCfg();
|
||
var szStartTime=$("#starttime").val(),
|
||
szEndTime=$("#endtime").val(),
|
||
szIP = $scope.optMemory.ip,//"192.168.2.144",
|
||
iChannelID = $scope.channelIDs,
|
||
bZeroChannel =false;
|
||
|
||
if ("" == szIP) return;
|
||
if (bZeroChannel) return;
|
||
// 首次搜索
|
||
if (0 == iType) iSearchTimes = 0;
|
||
WebVideoCtrl.I_RecordSearch(szIP, iChannelID, szStartTime, szEndTime, {
|
||
iSearchPos: iSearchTimes * 40,
|
||
success: function (xmlDoc) {
|
||
if("MORE" === $(xmlDoc).find("responseStatusStrg").eq(0).text()) {
|
||
for(var i = 0, nLen = $(xmlDoc).find("searchMatchItem").length; i < nLen; i++) {
|
||
var szPlaybackURI = $(xmlDoc).find("playbackURI").eq(i).text();
|
||
if(szPlaybackURI.indexOf("name=") < 0) break;
|
||
var szStartTime = $(xmlDoc).find("startTime").eq(i).text();
|
||
var szEndTime = $(xmlDoc).find("endTime").eq(i).text();
|
||
szStartTime = szStartTime.replace("T", " ").replace("Z", "");
|
||
szEndTime = szEndTime.replace("T", " ").replace("Z", "");
|
||
if(isstart)
|
||
{
|
||
videostarttime = szStartTime;
|
||
isstart = false;
|
||
}
|
||
recorddt += "<tr><td>"+szStartTime+"</td><td>"+szEndTime+"</td><td>ho</td><td>10</td><td></td></tr>";
|
||
}
|
||
iSearchTimes++;
|
||
searchrecord(1);// 继续搜索
|
||
} else if ("OK" === $(xmlDoc).find("responseStatusStrg").eq(0).text()) {
|
||
var iLength = $(xmlDoc).find("searchMatchItem").length;
|
||
for(var i = 0; i < iLength; i++) {
|
||
var szPlaybackURI = $(xmlDoc).find("playbackURI").eq(i).text();
|
||
if(szPlaybackURI.indexOf("name=") < 0) break;
|
||
var szStartTime = $(xmlDoc).find("startTime").eq(i).text();
|
||
var szEndTime = $(xmlDoc).find("endTime").eq(i).text();
|
||
szStartTime = szStartTime.replace("T", " ").replace("Z", "");
|
||
szEndTime = szEndTime.replace("T", " ").replace("Z", "");
|
||
recorddt += "<tr><td>"+szStartTime+"</td><td>"+szEndTime+"</td><td>ho</td><td>10</td><td></td></tr>";
|
||
}
|
||
|
||
var result = getinlinedata.replace("@data",recorddt);
|
||
result = result.replace("@videostarttime",videostarttime);
|
||
|
||
while($("#mylife").html()!==undefined){
|
||
$("#mylife").remove();
|
||
}
|
||
|
||
$("#timelinedata").children().remove();
|
||
$("#timelinedata").html(result);
|
||
inittimeline();
|
||
} else if("NO MATCHES" === $(xmlDoc).find("responseStatusStrg").eq(0).text()) {
|
||
setTimeout(function() {
|
||
//alert(szIP + " 没有录像文件!");
|
||
}, 50);
|
||
}
|
||
},
|
||
error: function () {
|
||
//alert(szIP + " 搜索录像文件失败!");
|
||
}
|
||
});
|
||
}
|
||
|
||
function loginvideo(ip,port,username,pwd,channelno) {
|
||
WebVideoCtrl.I_Logout(ip);
|
||
var iRet = WebVideoCtrl.I_Login(ip, 1, port, username, pwd, {
|
||
success: function (xmlDoc) {
|
||
recorddt="";
|
||
searchrecord(0);
|
||
}
|
||
});
|
||
}
|
||
$scope.fullscreen = function(){
|
||
if(-1==WebVideoCtrl.I_CheckPluginInstall()) return;
|
||
WebVideoCtrl.I_FullScreen(true)
|
||
};
|
||
|
||
$scope.getequipmentchannel = function(ip,port,username,pwd,channelno,obj) {
|
||
WebVideoCtrl.I_Logout(ip);
|
||
var iRet = WebVideoCtrl.I_Login(ip, 1, port, username, pwd, {
|
||
success: function (xmlDoc) {
|
||
clickGetDigitalChannelInfo(ip,obj);
|
||
}
|
||
});
|
||
};
|
||
$scope.optMemoryEquipment = function(prar){
|
||
$scope.optMemory = prar;
|
||
};
|
||
$scope.changeWndNum = function(iType) {
|
||
if (-1==WebVideoCtrl.I_CheckPluginInstall()) return;
|
||
iType = parseInt(iType, 10);
|
||
WebVideoCtrl.I_ChangeWndNum(iType);
|
||
};
|
||
var iSearchTimes = 0;
|
||
var recorddt,getinlinedata,videostarttime,isstart=true;
|
||
$scope.search = function(iType){
|
||
videostarttime = getNowFormatDate();
|
||
isstart=true;
|
||
getinlinedata = " <table style='display: none;' class='timeline-table' id='mylife' focus_date='@videostarttime' size_importance='false' initial_zoom='6'>";
|
||
getinlinedata +="<tr><th class='tg-startdate'></th><th class='tg-enddate'></th><th class='tg-date_limit'></th><th class='tg-importance'></th><th class='tg-title'></th></tr>@data</table>";
|
||
loginvideo($scope.optMemory.ip,$scope.optMemory.port,$scope.optMemory.username,$scope.optMemory.pwd,iType);
|
||
};
|
||
|
||
$scope.getUrlParameter = function(name){
|
||
var url = location.href;
|
||
var parameters = url.substr(url.indexOf("?")+1);
|
||
var paramItems = parameters.split("&");
|
||
var paramName;
|
||
var paramValue = "";
|
||
for(i in paramItems)
|
||
{
|
||
paramName = paramItems[i].split("=")[0];
|
||
paramValue = paramItems[i].split("=")[1];
|
||
if(paramName.toLowerCase() == name.toLowerCase())
|
||
{
|
||
return(paramValue);
|
||
}
|
||
}
|
||
return "";
|
||
};
|
||
|
||
//将时间转为yyyy-MM-dd HH:mm:ss格式字符串
|
||
function getFormatDate(date) {
|
||
date = new Date(date.getTime() - 1000*60*5 - 1000*26);
|
||
var seperator1 = "-";
|
||
var seperator2 = ":";
|
||
var month = date.getMonth() + 1;
|
||
var strDate = date.getDate();
|
||
if (month >= 1 && month <= 9) {
|
||
month = "0" + month;
|
||
}
|
||
if (strDate >= 0 && strDate <= 9) {
|
||
strDate = "0" + strDate;
|
||
}
|
||
var hour = date.getHours();
|
||
var minutes = date.getMinutes();
|
||
var seconds = date.getSeconds();
|
||
if (hour < 10) {
|
||
hour = "0" + hour;
|
||
}
|
||
if (minutes < 10) {
|
||
minutes = "0" + minutes;
|
||
}
|
||
if (seconds < 10) {
|
||
seconds = "0" + seconds;
|
||
}
|
||
|
||
var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate
|
||
+ " " + hour + seperator2 + minutes
|
||
+ seperator2 + seconds;
|
||
return currentdate;
|
||
}
|
||
|
||
function getCurrentDate(){
|
||
var curr = $("#currentdate").text();
|
||
var str = curr;
|
||
var index1 = curr.indexOf(":")-2;
|
||
var index2 = curr.indexOf(":");
|
||
var e = curr.substring(index1,index2);
|
||
var str1 = curr.substring(0,index1);
|
||
var str2 = curr.substring(index2);
|
||
if(e == "24" || e == "00"){
|
||
str = str1+"12"+str2;
|
||
}else if(e == "12"){
|
||
str = str1+"00"+str2;
|
||
}
|
||
return str;
|
||
}
|
||
//开始播放
|
||
$scope.clickStartPlay=function(){
|
||
var myTbody = document.getElementById("timelinedata").firstElementChild.lastElementChild;
|
||
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex),
|
||
szDeviceIdentify = $scope.optMemory.ip,
|
||
iRtspPort = 554,
|
||
iStreamType = 1,//码流;1为主码流;2为子码流;3为第三码流;4为转码流
|
||
bZeroChannel = false,
|
||
iChannelID = $scope.channelIDs,//1
|
||
szStartTime = myTbody.rows[1].cells[0].innerHTML,
|
||
szEndTime = myTbody.rows[myTbody.rows.length-1].cells[1].innerHTML,
|
||
bChecked = false,
|
||
szPlayTime = getCurrentDate();
|
||
//将时间转为yyyy-MM-dd HH:mm:ss格式
|
||
szPlayTime = getFormatDate(new Date(Date.parse(szPlayTime.replace(/-/g, "/"))));
|
||
|
||
//实现选择时间段回放
|
||
var dateStart = new Date(Date.parse(szStartTime.replace(/-/g, "/")));
|
||
var datePlay = new Date(Date.parse(szPlayTime.replace(/-/g, "/")));
|
||
var dateEnd = new Date(Date.parse(szEndTime.replace(/-/g, "/")));
|
||
if(datePlay>dateStart && datePlay<dateEnd){//当选择时间在查询时间段,则从选择时间段开始播放,否则从查询时间段开始播放
|
||
szStartTime = szPlayTime;
|
||
}
|
||
|
||
if (null == szDeviceIdentify) {
|
||
return;
|
||
}
|
||
|
||
if (bZeroChannel) {// 零通道不支持回放
|
||
return;
|
||
}
|
||
|
||
var startPlayback = function () {
|
||
if (bChecked) {// 启用转码回放
|
||
var oTransCodeParam = {
|
||
TransFrameRate: "14",// 0:全帧率,5:1,6:2,7:4,8:6,9:8,10:10,11:12,12:16,14:15,15:18,13:20,16:22
|
||
TransResolution: "1",// 255:Auto,3:4CIF,2:QCIF,1:CIF
|
||
TransBitrate: "19"// 2:32K,3:48K,4:64K,5:80K,6:96K,7:128K,8:160K,9:192K,10:224K,11:256K,12:320K,13:384K,14:448K,15:512K,16:640K,17:768K,18:896K,19:1024K,20:1280K,21:1536K,22:1792K,23:2048K,24:3072K,25:4096K,26:8192K
|
||
};
|
||
WebVideoCtrl.I_StartPlayback(szDeviceIdentify, {
|
||
iRtspPort: iRtspPort,
|
||
iStreamType: iStreamType,
|
||
iChannelID: iChannelID,
|
||
szStartTime: szStartTime,
|
||
szEndTime: szEndTime,
|
||
oTransCodeParam: oTransCodeParam,
|
||
success: function () {
|
||
|
||
},
|
||
error: function (status, xmlDoc) {
|
||
if (403 === status) {
|
||
alert("设备不支持Websocket取流!");
|
||
} else {
|
||
alert("开始回放失败!");
|
||
}
|
||
}
|
||
});
|
||
} else {
|
||
WebVideoCtrl.I_StartPlayback(szDeviceIdentify, {
|
||
iRtspPort: iRtspPort,
|
||
iStreamType: iStreamType,
|
||
iChannelID: iChannelID,
|
||
szStartTime: szStartTime,
|
||
szEndTime: szEndTime,
|
||
success: function () {
|
||
|
||
},
|
||
error: function (status, xmlDoc) {
|
||
if (403 === status) {
|
||
alert("设备不支持Websocket取流!");
|
||
} else {
|
||
alert("开始回放失败!");
|
||
}
|
||
}
|
||
});
|
||
}
|
||
};
|
||
|
||
if (oWndInfo != null) {// 已经在播放了,先停止
|
||
WebVideoCtrl.I_Stop({
|
||
success: function () {
|
||
startPlayback();
|
||
}
|
||
});
|
||
} else {
|
||
startPlayback();
|
||
}
|
||
|
||
};
|
||
//停止播放
|
||
$scope.clickStopPlay = function(){
|
||
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
|
||
if (oWndInfo != null) {
|
||
var iRet = WebVideoCtrl.I_Stop();
|
||
}
|
||
};
|
||
//倒放
|
||
$scope.clickReversePlay = function(){
|
||
var myTbody = document.getElementById("timelinedata").firstElementChild.lastElementChild;
|
||
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex),
|
||
szDeviceIdentify = $scope.optMemory.ip+"_"+$scope.optMemory.port,
|
||
iRtspPort = 554,
|
||
iStreamType = 1,
|
||
bZeroChannel = false,
|
||
iChannelID = $scope.channelIDs,//1,
|
||
szStartTime = myTbody.rows[1].cells[0].innerHTML,
|
||
szEndTime = myTbody.rows[myTbody.rows.length-1].cells[1].innerHTML;
|
||
|
||
if (null == szDeviceIdentify) {
|
||
return;
|
||
}
|
||
|
||
if (bZeroChannel) {// 零通道不支持倒放
|
||
return;
|
||
}
|
||
|
||
var reversePlayback = function () {
|
||
var iRet = WebVideoCtrl.I_ReversePlayback(szDeviceIdentify, {
|
||
iRtspPort: iRtspPort,
|
||
iStreamType: iStreamType,
|
||
iChannelID: iChannelID,
|
||
szStartTime: szStartTime,
|
||
szEndTime: szEndTime
|
||
});
|
||
|
||
if (0 == iRet) {
|
||
// "开始倒放成功!";
|
||
} else {
|
||
alert("开始倒放失败!");
|
||
}
|
||
};
|
||
|
||
if (oWndInfo != null) {// 已经在播放了,先停止
|
||
WebVideoCtrl.I_Stop({
|
||
success: function () {
|
||
reversePlayback();
|
||
}
|
||
});
|
||
} else {
|
||
reversePlayback();
|
||
}
|
||
};
|
||
//单帧
|
||
$scope.clickFrame = function(){
|
||
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
|
||
|
||
if (oWndInfo != null) {
|
||
WebVideoCtrl.I_Frame({
|
||
success: function () {
|
||
// "单帧播放成功!";
|
||
},
|
||
error: function () {
|
||
alert("单帧播放失败!");
|
||
}
|
||
});
|
||
}
|
||
};
|
||
// 慢放
|
||
$scope.clickPlaySlow = function() {
|
||
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
|
||
|
||
if (oWndInfo != null) {
|
||
WebVideoCtrl.I_PlaySlow({
|
||
success: function () {
|
||
//"慢放成功!";
|
||
},
|
||
error: function () {
|
||
alert("慢放失败!");
|
||
}
|
||
});
|
||
}
|
||
};
|
||
// 快放
|
||
$scope.clickPlayFast= function() {
|
||
var oWndInfo = WebVideoCtrl.I_GetWindowStatus(g_iWndIndex);
|
||
|
||
if (oWndInfo != null) {
|
||
WebVideoCtrl.I_PlayFast({
|
||
success: function () {
|
||
//"快放成功!";
|
||
},
|
||
error: function () {
|
||
alert("快放失败!");
|
||
}
|
||
});
|
||
}
|
||
};
|
||
}); |