From 452e8cef1c740d18ee398be6971d9952e41dbd4a Mon Sep 17 00:00:00 2001
From: wxr <464027401@qq.com>
Date: 星期三, 12 四月 2023 16:11:50 +0800
Subject: [PATCH] 1
---
HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/CommonMethod.cs | 459 ++++++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 341 insertions(+), 118 deletions(-)
diff --git a/HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/CommonMethod.cs b/HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/CommonMethod.cs
index f07cff2..0a6aec7 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/CommonMethod.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/VideoDoorLock/CommonMethod.cs
@@ -2,6 +2,12 @@
using HDL_ON.Entity;
using System.Collections.Generic;
using Shared;
+using HDL_ON.DAL.Server;
+#if __IOS__
+using Foundation;
+#else
+using Com.Videogo.Hdl;
+#endif
namespace HDL_ON.UI.UI2.FuntionControlView.VideoDoorLock
{
@@ -11,8 +17,15 @@
public class CommonMethod
{
private Loading loading;
- private static CommonMethod commonMethod = null;
+ /// <summary>
+ /// 璁板綍褰撳墠鐣岄潰绱㈠紩鍊�
+ /// </summary>
+ private int pageLayoutIndexValue;
+ private static CommonMethod commonMethod = null;
+ /// <summary>
+ /// 鑾峰彇瀵硅薄
+ /// </summary>
public static CommonMethod Current
{
get
@@ -28,33 +41,81 @@
}
- #region --------- 璺宠浆鍒癆ndroid閭h竟鐨勬柟娉�(钀ょ煶瑙嗛闂ㄩ攣) --------
+ #region --------- 璺宠浆鍒癆ndroid锛宨os閭h竟鐨勬柟娉�(钀ょ煶瑙嗛闂ㄩ攣) --------
/// <summary>
- /// 娣诲姞璁惧鍒颁簯绔�
- /// <paramref name="devSerial"/>璁惧搴忓垪鍙�</param>
- /// </summary>
- public void SkipAddDeviceActivity(string devSerial)
+ /// android,ios婧愮敓娣诲姞璁惧鍒颁簯绔垚鍔熷悗鍥炶皟鏂规硶
+ /// 鍐嶈鍙栦簯绔殑涓婅悿鐭宠澶囧垪琛�
+ /// <paramref name="spk"/>spk</param>
+ public void SkipAddDeviceActivity(string spk)
{
- if (string.IsNullOrEmpty(devSerial)) return;
- new System.Threading.Thread(() =>
+
+ this.InitializationAndroidData((isEzChildAccessToken) =>
{
- var list = VideDoorLockSend.Current.GetVideoDoorLockDeviceList(SPK.VideoDoorLock);
- if (list.Count > 0)
+ this.SunThread(() =>
{
- var function = list.Find((o) => o.sid == devSerial);
- if (function != null)
+ var list = this.GetVideoDoorLockLockModelsList("notAllowedConfigNetworkModels");
+ this.MainThread(() =>
{
- this.SaveFunctionFile(function);
- }
- }
- })
- { IsBackground = true }.Start();
- //鏈疄鐜�
#if __IOS__
+ //璺宠浆娣诲姞钀ょ煶璁惧
+ ezsdkDelegate = new IosIHdlInterface();
+ ezsdkDelegate.mAction += (serials) =>
+ {
+ this.GetYingshiDeviceList(serials);
+ };
+ EZSDK.IOS.EZSDK.SharedInstance().Delegate = ezsdkDelegate;
+ NSObject[] nSObject = new NSObject[list.Count];
+ for (int i = 0; i < list.Count; i++)
+ {
+ string strValue = list[i];
+ nSObject[i] = new NSString(strValue);
+ }
+ EZSDK.IOS.EZSDK.SharedInstance().ConnectTipModels = nSObject;
+ EZSDK.IOS.EZSDK.SharedInstance().AddEzvizMonitorWithDeviceType(spk);
#else
+ HDLEzvizSdk.Instance.JumpToEZScanActivity(Application.Activity, spk,list);
+ HDLEzvizSdk.SetAddCallback(new AndroidIHdlInterface((isBool, serials) =>
+ {
+ if (isBool)
+ {
+ this.GetYingshiDeviceList(serials);
+ }
+ }));
#endif
+
+ });
+
+
+ });
+ });
+
+
+
+
+
+ }
+ /// <summary>
+ /// 璇诲彇浜戠鐨勪笂钀ょ煶璁惧鍒楄〃
+ /// <paramref name="serials"/>搴忓垪鍙�</param>
+ private void GetYingshiDeviceList(string serials)
+ {
+ this.SunThread(() =>
+ {
+ var list = VideDoorLockSend.Current.GetVideoDoorLockDeviceList(SPK.VideoDoorLock);
+ this.MainThread(() =>
+ {
+ if (list.Count > 0)
+ {
+ var function = list.Find((o) => o.sid == serials);
+ if (function != null)
+ {
+ this.SaveFunctionFile(function);
+ }
+ }
+ });
+ });
}
/// <summary>
@@ -63,35 +124,88 @@
/// <param name="deviceSerial">璁惧搴忓垪鍙�</param>
/// <param name="deviceId">璁惧id(浜戠涓奷eviceId)</param>
/// <param name="spk">璁惧spk(浜戦泙涓婂畾涔夊ソ鐨�)</param>
- public void SkipRTVActivity(string deviceSerial, string deviceId, string spk)
+ /// <param name="isDialog">鏄惁闇�瑕佸脊妗�</param>
+ public void SkipRTVActivity(string deviceSerial, string deviceId, string spk, bool isDialog)
{
- Video.View.ShowDialog.Currnet.ClickBox(Language.StringByID(StringId.laizimenlinghujiao), (dialog) =>
+
+ this.InitializationAndroidData((isEzChildAccessToken) =>
{
- dialog.Close();
- }, (dialog) =>
- {
- dialog.Close();
+ this.MainThread(() =>
+ {
+ if (isDialog)
+ {
+ Video.View.ShowDialog.Currnet.ClickBox(Language.StringByID(StringId.laizimenlinghujiao), (dialog) =>
+ {
+ dialog.Close();
+ this.SkipRTVActivity(deviceSerial, deviceId, spk);
+ }, (dialog) => { dialog.Close(); });
+ }
+ else
+ {
+ this.SkipRTVActivity(deviceSerial, deviceId, spk);
+ }
+
+ });
});
-#if __IOS__
-#else
-#endif
- //jumpToEZRealPlayActivity(Shared.Application.Activity, deviceId, deviceSerial, spk)
+
}
+ /// <summary>
+ /// 鎵撳紑瀹炴椂瑙嗛鐢婚潰
+ /// </summary>
+ /// <param name="deviceSerial">璁惧搴忓垪鍙�</param>
+ /// <param name="deviceId">璁惧id(浜戠涓奷eviceId)</param>
+ /// <param name="spk">璁惧spk(浜戦泙涓婂畾涔夊ソ鐨�)</param>
+ private void SkipRTVActivity(string deviceSerial, string deviceId, string spk)
+ {
+
+#if __IOS__
+ //鎵撳紑钀ょ煶瑙嗛鐣岄潰
+ EZSDK.IOS.EZSDK.SharedInstance().PlayWithDeviceSerial(deviceSerial, deviceId, spk);
+
+#else
+ HDLEzvizSdk.Instance.JumpToEZRealPlayActivity(Application.Activity,deviceId,deviceSerial,spk);
+#endif
+
+
+ }
+
/// <summary>
/// 娴忚鍘嗗彶璁板綍
/// </summary>
- public void SkipRecordActivity()
+ public void SkipRecordActivity(string deviceId)
{
- //鏈疄鐜�
- //this.InitializationAndroidData();
- //
+ this.InitializationAndroidData((s) =>
+ {
+ this.MainThread(() =>
+ {
+#if __IOS__
+ //鎵撳紑钀ょ煶鍘嗗彶璁板綍鐣岄潰
+ EZSDK.IOS.EZSDK.SharedInstance().ToDeviceMsgListView(deviceId);
+#else
+ HDLEzvizSdk.Instance.JumpLockHistoryActivity(Application.Activity, deviceId);
+#endif
+ });
+ });
+
}
/// <summary>
/// 涓存椂瀵嗙爜寮�闂�
+ /// <paramref name="deviceId"/>
/// </summary>
- public void SkipPSWActivity()
+ public void SkipPSWActivity(string deviceId)
{
- //jumpTempPasswordActivity(Application.Activity, deviceId);
+ this.InitializationAndroidData((isBools) =>
+ {
+ this.MainThread(() =>
+ {
+#if __IOS__
+ //鎵撳紑钀ょ煶涓存椂瀵嗙爜鐣岄潰
+ EZSDK.IOS.EZSDK.SharedInstance().ToTemPassView(deviceId);
+#else
+ HDLEzvizSdk.Instance.JumpTempPasswordActivity(Application.Activity, deviceId);
+#endif
+ });
+ });
}
/// <summary>
@@ -100,6 +214,7 @@
public void InitializationAndroidData(Action<bool> action)
{
bool isBool = true;
+ this.Loading.Start();
this.SunThread(() =>
{
try
@@ -112,57 +227,29 @@
{
//Token
isBool = false;
+ this.ShowTip("鑾峰彇钀ょ煶浜戝瓙璐﹀彿token澶辫触銆�");
return;
}
- Application.RunOnMainThread(() =>
- {
-#if __IOS__
- //iOS
- //鍒濆鍖栬悿鐭充簯SDK锛屼腑鏂囧浗鍐卥ey銆佽嫳鏂囨捣澶杒ey 寮�鍙戣�呰处鍙蜂娇鐢ㄥ簲鐢ㄥ寘鍚嶇敵璇风殑APPKEY锛屼笉鍚屽寘鍚嶅簲鐢ㄩ渶閰嶇疆涓嶅悓鐨凙PPKEY
- EZSDK.IOS.EZSDK.SharedInstance().InitLibWithAppKey("1aa98a90489b4838b966b57018b4b04b", "1aa98a90489b4838b966b57018b4b04b");
- //1.璁剧疆鎵�闇�娌充笢鐨凙ccessToken鍜孯efreshToken銆佸煙鍚嶅湴鍧�
- EZSDK.IOS.EZSDK.SharedInstance().SetHDlAccessToken(UserVideoDoorLockInfo.Current.LoginTokenString, UserVideoDoorLockInfo.Current.RefreshToken);
- EZSDK.IOS.EZSDK.SharedInstance().SetRequestHttpsHostAndPlatform(OnAppConfig.Instance.RequestHttpsHost, 1, DB_ResidenceData.Instance.CurrentRegion.id);
- //2.璁剧疆钀ょ煶瀛愯处鍙风殑AccessToken鍒癝DK
- EZSDK.IOS.EZSDK.SharedInstance().SetEZAccessToken(ezChildAccessToken);
- ////3.鎵撳紑鎽勫儚澶磋澶囧垪琛ㄩ〉闈�
- EZSDK.IOS.EZSDK.SharedInstance().Go2EZvizMonitor();
- //EZSDK.IOS.EZDeviceInfo info = new EZSDK.IOS.EZDeviceInfo();
- //info.de
- //EZSDK.IOS.EZSDK.Play(info);
-#else
- //Android
- //1.璁剧疆鎵�闇�娌充笢鐨則oken銆佸煙鍚嶅湴鍧�
- //2.璁剧疆钀ょ煶瀛愯处鍙风殑token
- //3.鎵撳紑鎽勫儚澶磋澶囧垪琛ㄩ〉闈�
- ((BaseActivity)Shared.Application.Activity).SetCamera(b =>
- {
- if (b)
- {
- ((BaseActivity)Shared.Application.Activity).SetPermission(result =>
- {
- if (result)
- {
- Android.Content.Intent intent = new Android.Content.Intent();
- var bundle = new Android.OS.Bundle();
- //浼犻�抧ame鍙傛暟涓簍inyphp
- bundle.PutString("EzChildAccessToken", ezChildAccessToken);
- bundle.PutString("HdlToken", UserInfo.Current.LoginTokenString);
- bundle.PutString("HdlrefreshToken", UserInfo.Current.RefreshToken);
- bundle.PutString("Url", OnAppConfig.Instance.RequestHttpsHost);
- bundle.PutString("EzvizAppKey", "1aa98a90489b4838b966b57018b4b04b");
- bundle.PutInt("Platform", 1);
- bundle.PutString("HomeId", DB_ResidenceData.Instance.CurrentRegion.id);
- intent.PutExtras(bundle);
- //intent.SetComponent(new Android.Content.ComponentName(Shared.Application.Activity, "com.videogo.MainActivity"));
- //Shared.Application.Activity.StartActivity(intent);
- }
- }, "android.permission.RECORD_AUDIO");
- }
- });
+#if __IOS__
+ //iOS
+ //鍒濆鍖栬悿鐭充簯SDK锛屼腑鏂囧浗鍐卥ey銆佽嫳鏂囨捣澶杒ey 寮�鍙戣�呰处鍙蜂娇鐢ㄥ簲鐢ㄥ寘鍚嶇敵璇风殑APPKEY锛屼笉鍚屽寘鍚嶅簲鐢ㄩ渶閰嶇疆涓嶅悓鐨凙PPKEY
+ EZSDK.IOS.EZSDK.SharedInstance().InitLibWithAppKey("1aa98a90489b4838b966b57018b4b04b", "1aa98a90489b4838b966b57018b4b04b");
+ //1.璁剧疆鎵�闇�娌充笢鐨凙ccessToken鍜孯efreshToken銆佸煙鍚嶅湴鍧�
+ EZSDK.IOS.EZSDK.SharedInstance().SetHDlAccessToken(UserInfo.Current.LoginTokenString, UserInfo.Current.RefreshToken);
+ EZSDK.IOS.EZSDK.SharedInstance().SetRequestHttpsHostAndPlatform(OnAppConfig.Instance.RequestHttpsHost, 1, DB_ResidenceData.Instance.CurrentRegion.id);
+ //2.璁剧疆钀ょ煶瀛愯处鍙风殑AccessToken鍒癝DK
+ EZSDK.IOS.EZSDK.SharedInstance().SetEZAccessToken(ezChildAccessToken);
+ //////3.鎵撳紑鎽勫儚澶磋澶囧垪琛ㄩ〉闈�
+ //EZSDK.IOS.EZSDK.SharedInstance().Go2EZvizMonitor();
+ //EZSDK.IOS.EZDeviceInfo info = new EZSDK.IOS.EZDeviceInfo();
+ //info.de
+ //EZSDK.IOS.EZSDK.Play(info);
+#else
+ HDLEzvizSdk.Instance.Init(Application.Activity.Application, ezChildAccessToken, UserInfo.Current.LoginTokenString, UserInfo.Current.RefreshToken, OnAppConfig.Instance.RequestHttpsHost, "1aa98a90489b4838b966b57018b4b04b", 1, DB_ResidenceData.Instance.CurrentRegion.id);
+
#endif
- });
+
});
@@ -174,37 +261,108 @@
{
this.MainThread(() =>
{
+ this.Loading.Hide();
action?.Invoke(isBool);
});
}
});
}
+
/// <summary>
/// 鏇存崲浣忓畢
/// </summary>
/// <param name="home">瀵硅薄</param>
public void ChangeCurrHome(RegionInfoRes home)
{
+
if (DB_ResidenceData.Instance.CurrentRegion.id == home.id || string.IsNullOrEmpty(home.id)) return;
+#if __IOS__
+#else
+ HDLEzvizSdk.Instance.SetHomeId(home.id);
+#endif
}
#endregion
/// <summary>
- /// 钀ょ煶瑙嗛闂ㄩ攣鐨勫浘鏍�
- /// <param name="comerom">鏉ヨ嚜閭i噷</param>
+ /// 鑾峰彇銆愰棬閿佸瀷鍙枫�戝垪琛�
/// </summary>
- public string GetVideoDoorLockIcon(Comerom comerom)
+ /// <returns>杩斿洖缁撴灉涓嶄細涓簄ull</returns>
+ public List<string> GetVideoDoorLockLockModelsList(string mode = "lockModels")
{
- if (comerom == Comerom.collect)
+ return VideDoorLockSend.Current.GetVideoDoorLockLockModelsList(mode);
+ }
+ /// <summary>
+ /// 闂ㄩ攣鎺ㄩ��
+ /// </summary>
+ /// <param name="pushMessageType"></param>
+ /// <param name="jPushMessageInfo"></param>
+ public void DoorLockPush(JPushMessageInfo jpushMessageInfo)
+ {
+ this.MainThread(() =>
{
- return "FunctionIcon/DoorLock/VideoDoorLockOpen.png";
- }
- else
+ if (string.IsNullOrEmpty(jpushMessageInfo.expantContent)) return;
+ //{ "deviceSid":"J92513662","type":"opendoormsg","extDevId":"J92513662","deviceId":"1641010144999936001","spk":"security.door.ezviz"}
+ var expantContent = Newtonsoft.Json.JsonConvert.DeserializeObject<ExpantContent>(jpushMessageInfo.expantContent);
+ if (expantContent == null)
+ {
+ return;
+ }
+ if (expantContent.spk != SPK.VideoDoorLock)
+ {
+ return;
+ }
+ if (jpushMessageInfo.messageType.Contains(PushMessageType.DOOR_BELL.ToString()))
+ {
+ ///鎵撳紑瑙嗛闂ㄩ攣
+ this.SkipRTVActivity(expantContent.devSerial, expantContent.deviceId, expantContent.spk, true);
+ }
+ else if (jpushMessageInfo.messageType.Contains(PushMessageType.Alarm.ToString()))
+ {
+ //浣庣數閲忔帹閫�
+ this.UpdateDoorLockState(PushMessageType.Alarm);
+ }
+ else if (jpushMessageInfo.messageType.Contains(PushMessageType.Prompt.ToString()))
+ {
+ //寮�闂ㄦ帹閫�
+ this.UpdateDoorLockState(PushMessageType.Prompt);
+ }
+ });
+
+ }
+ /// <summary>
+ /// 鏇存柊寮�閿佸浘鏍囧拰鐢垫睜鐘舵��
+ /// </summary>
+ private void UpdateDoorLockState(PushMessageType pushMessageType)
+ {
+ int childrenCount = MainPage.BasePageView.ChildrenCount - 1;
+ for (int i = childrenCount; childrenCount > i; i--)
{
- return "FunctionIcon/DoorLock/VideoDoorlockClose.png";
+ View view = MainPage.BasePageView.GetChildren(i);
+ if (view is VideoDoorLockPage)
+ {
+ VideoDoorLockPage videoDoorLockPage = (VideoDoorLockPage)view;
+ if (videoDoorLockPage != null)
+ {
+ videoDoorLockPage.UpdateState(pushMessageType);
+ }
+
+ }
}
+ }
+ /// <summary>
+ /// 鑾峰彇钀ょ煶瑙嗛銆愰棬閿併�戝垪琛�
+ /// </summary>
+ /// <returns></returns>
+ public List<Function> GetVideoDoorLockList()
+ {
+ var list = FunctionList.List.GetVideoDoorLockList();
+#if DEBUG
+ //list.Add(new Function { name = "瑙嗛闂ㄩ攣涓�", sid = "23456789", spk = SPK.VideoDoorLock });
+ //list.Add(new Function { name = "瑙嗛闂ㄩ攣浜�", sid = "2345678922", spk = SPK.VideoDoorLock });
+#endif
+ return list;
}
#region --------- 鍔熻兘鏂囦欢淇濆瓨锛屽垹闄� --------
/// <summary>
@@ -232,6 +390,24 @@
}
#endregion
/// <summary>
+ /// 钀ょ煶瑙嗛闂ㄩ攣鐨勫浘鏍�
+ /// <param name="comerom">鏉ヨ嚜閭i噷</param>
+ /// </summary>
+ public string GetVideoDoorLockIcon(Comerom comerom)
+ {
+
+ if (comerom == Comerom.collect)
+ {
+ return "FunctionIcon/DoorLock/VideoDoorLockOpen.png";
+ }
+ else
+ {
+ return "FunctionIcon/DoorLock/VideoDoorlockClose.png";
+ }
+
+ }
+
+ /// <summary>
/// 鑾峰彇Loading瀵硅薄
/// </summary>
/// <returns></returns>
@@ -239,40 +415,32 @@
{
get
{
- if (loading == null)
+ this.MainThread(() =>
{
- loading = new Loading();
- }
- if (MainPage.BasePageView.ChildrenCount < 1)
- {
- return loading;
- }
- View view = MainPage.BasePageView.GetChildren(MainPage.BasePageView.ChildrenCount - 1);
- if (view is FrameLayout)
- {
- ((FrameLayout)view).AddChidren(loading);
- }
- else if (view is PageLayout)
- {
- ((PageLayout)view).AddChidren(loading);
- }
+ //if (loading != null && this.pageLayoutIndexValue == MainPage.BasePageView.ChildrenCount - 1)
+ //{
+ // //闃叉浜岄噸娣诲姞瀵硅薄
+ // return;
+ //}
+ if (loading == null)//|| MainPage.BasePageView.ChildrenCount < 1)
+ {
+ loading = new Loading();
+ }
+ //loading.BringToFront();
+ Application.MainPage.AddChidren(loading);
+ //View view = MainPage.BasePageView.GetChildren(MainPage.BasePageView.ChildrenCount - 1);
+ //if (view is ViewGroup)
+ //{
+ // pageLayoutIndexValue = MainPage.BasePageView.ChildrenCount - 1;
+ // ((ViewGroup)view).AddChidren(loading);
+ //}
+ });
return loading;
}
}
- /// <summary>
- /// 鑾峰彇钀ょ煶瑙嗛闂ㄩ攣鍒楄〃
- /// </summary>
- /// <returns></returns>
- public List<Function> GetVideoDoorLockList()
- {
- var list = FunctionList.List.GetVideoDoorLockList();
-#if DEBUG
- //list.Add(new Function { name = "瑙嗛闂ㄩ攣涓�", sid = "23456789", spk = SPK.VideoDoorLock });
- //list.Add(new Function { name = "瑙嗛闂ㄩ攣浜�", sid = "2345678922", spk = SPK.VideoDoorLock });
-#endif
- return list;
- }
+
+
#region ---------鑷畾涔夌嚎绋�(瀛愮嚎绋嬶紝涓荤嚎绋�)--------
/// <summary>
/// 瀛愮嚎绋�
@@ -356,6 +524,8 @@
new PublicAssmebly().TipMsgAutoClose(msg, false, time * 1000);
});
}
+
+
#endregion
/// <summary>
/// 寮规绫诲瀷
@@ -375,6 +545,59 @@
collect,//鏀惰棌
room,//鎴块棿
push,//鎺ㄩ��
+ sanfan,//娣诲姞绗笁鏂硅澶�
}
+
+#if __IOS__
+ IosIHdlInterface ezsdkDelegate;
+ /// <summary>
+ /// 涓撻棬瀹氫箟缁橧os鍥炶皟鐢�,娌℃湁鐗规畩鍚箟
+ /// </summary>
+ public class IosIHdlInterface : EZSDK.IOS.EZSDKDelegate
+ {
+ public Action<string> mAction;
+ public IosIHdlInterface()
+ {
+
+ }
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="p0">true鏄叆缃戞垚鍔�(婧愮敓鍥炶皟杩斿洖)</param>
+ /// <param name="p1">璁惧鐨勫簭鍒楀寲(婧愮敓鍥炶皟杩斿洖)</param>
+ public override void AddDeviceSuccessed(string deviceSerial)
+ {
+ mAction?.Invoke(deviceSerial);
+ }
+ }
+#else
+ /// <summary>
+ /// 涓撻棬瀹氫箟缁欏畨鍗撳洖璋冪敤,娌℃湁鐗规畩鍚箟
+ /// </summary>
+ public class AndroidIHdlInterface : Java.Lang.Object, IHdlInterface
+ {
+
+ Action<bool,string> mAction;
+ public AndroidIHdlInterface(Action<bool,string> action)
+ {
+ mAction = action;
+ }
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="p0">true鏄叆缃戞垚鍔�(婧愮敓鍥炶皟杩斿洖)</param>
+ /// <param name="p1">璁惧鐨勫簭鍒楀寲(婧愮敓鍥炶皟杩斿洖)</param>
+ public void AddCallback(bool p0, string p1)
+ {
+ mAction?.Invoke(p0,p1);
+ }
+
+
+ }
+#endif
+
+
}
+
+
}
--
Gitblit v1.8.0