From 37eb063f33a9922cf99b812589a9e8f73938b006 Mon Sep 17 00:00:00 2001
From: Putoo <290555932@qq.com>
Date: Sat, 18 Jul 2026 13:11:48 +0800
Subject: [PATCH] 12121
---
.../logdb/db/game_fight_data.cs | 6 -
.../Interface/Fight/IGameFightService.cs | 7 +-
.../Service/Fight/GameFightService.cs | 52 +++--
.../Tool/Base/FightCompute.cs | 217 ++++++++++++++++++
.../Controllers/Pub/FightController.cs | 107 +++++----
.../Model/RequestParms/Fight/FightParms.cs | 2 +-
Web/src/pages/fight/index.vue | 18 +-
Web/src/services/Index/FightService.ts | 6 +-
任务生成/resource/map.xls | Bin 56832 -> 35328 bytes
9 files changed, 315 insertions(+), 100 deletions(-)
create mode 100644 Service/Application.Domain/Tool/Base/FightCompute.cs
diff --git a/Service/Application.Domain.Entity/logdb/db/game_fight_data.cs b/Service/Application.Domain.Entity/logdb/db/game_fight_data.cs
index 5e6fd63..dc49111 100644
--- a/Service/Application.Domain.Entity/logdb/db/game_fight_data.cs
+++ b/Service/Application.Domain.Entity/logdb/db/game_fight_data.cs
@@ -97,12 +97,6 @@ namespace Application.Domain.Entity
[SugarColumn(IsNullable = true)]
public string? pars { get; set; }
- ///
- /// 预计用时
- ///
- [SugarColumn(IsNullable = true)]
- public long? dueTime { get; set; }
-
///
/// addTime
///
diff --git a/Service/Application.Domain/Services/Interface/Fight/IGameFightService.cs b/Service/Application.Domain/Services/Interface/Fight/IGameFightService.cs
index ef8b379..04d0990 100644
--- a/Service/Application.Domain/Services/Interface/Fight/IGameFightService.cs
+++ b/Service/Application.Domain/Services/Interface/Fight/IGameFightService.cs
@@ -13,7 +13,7 @@ public interface IGameFightService
Task RemoveFightHarm(string fightId, string userId);
Task AddFight(string fightId, string areaCode, string keyId, string mainId, string code,
string scene, string mapId,
- string userId,long dueTime, long exp = 0, long copper = 0, long petExp = 0, string award = "", string pars = "");
+ string userId, long exp = 0, long copper = 0, long petExp = 0, string award = "", string pars = "");
Task SetFightWin(game_fight_data fightData, string winUser, bool setDefMap=true);
Task HandleFightData();
@@ -29,7 +29,10 @@ public interface IGameFightService
Task RemoveFightGoods(string mapId, string mgId);
Task AutoUseDrug(UserAttrModel user, game_fight_data fight);
Task HandelFightEnd(string userId, List data);
- Task ValidFight(game_fight_data fight, bool isBlack = true);
+ Task CheckFightLock(string userId, string lockStr);
+ Task SetFightLock(string userId);
+ Task FightIsCool(string userId);
+ Task SetFightCool(string userId, long CoolTime);
#endregion
}
\ No newline at end of file
diff --git a/Service/Application.Domain/Services/Service/Fight/GameFightService.cs b/Service/Application.Domain/Services/Service/Fight/GameFightService.cs
index 277cdd5..8eab714 100644
--- a/Service/Application.Domain/Services/Service/Fight/GameFightService.cs
+++ b/Service/Application.Domain/Services/Service/Fight/GameFightService.cs
@@ -94,7 +94,7 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
public async Task AddFight(string fightId, string areaCode, string keyId, string mainId, string code,
string scene, string mapId,
- string userId, long dueTime, long exp = 0, long copper = 0, long petExp = 0, string award = "",
+ string userId,long exp = 0, long copper = 0, long petExp = 0, string award = "",
string pars = "")
{
long addTime = TimeExtend.GetTimeStampMilliseconds;
@@ -119,7 +119,6 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
petExp = petExp,
award = award,
pars = pars,
- dueTime = dueTime,
addTime = addTime,
okTime = 0,
endTime = endTime
@@ -382,11 +381,6 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
public async Task HandleFight(game_fight_data fightData)
{
- if (await ValidFight(fightData) == false)
- {
- return;
- }
-
string winUser = fightData.winUser;
string lowUser = fightData.userId == winUser ? fightData.mainId : fightData.userId;
@@ -701,26 +695,34 @@ public class GameFightService(ISqlSugarClient DbClient, IRedisCache redis) : IGa
await Task.CompletedTask;
}
-
- public async Task ValidFight(game_fight_data fight, bool isBlack = true)
+
+ public async Task CheckFightLock(string userId, string lockStr)
{
- bool result = true;
- if (fight.dueTime > 0)
- {
- int diffTime = Convert.ToInt32(fight.okTime - fight.addTime);
- if (diffTime < 3000)
- {
- result = diffTime >= fight.dueTime;
- if (result == false && isBlack) //异常处理
- {
- //封禁账号
- var userService = App.GetService();
- await userService.BlackUser(fight.userId);
- }
- }
- }
+ string key = string.Format(BaseCache.BaseCacheKey, "FightLock");
+ var onData = await redis.GetHashAsync(key, userId);
+ return onData == lockStr;
+ }
- return result;
+ public async Task SetFightLock(string userId)
+ {
+ string lockStr = StringAssist.NewGuid;
+ string key = string.Format(BaseCache.BaseCacheKey, "FightLock");
+ await redis.AddHashAsync(key, userId, lockStr);
+ return lockStr;
+ }
+
+ public async Task FightIsCool(string userId)
+ {
+ string key = string.Format(BaseCache.BaseCacheKey, "FightCool");
+ var onData = await redis.GetHashAsync(key, userId);
+ return TimeExtend.GetTimeStampMilliseconds >= onData;
+ }
+
+ public async Task SetFightCool(string userId, long CoolTime)
+ {
+ long lockStr = TimeExtend.GetTimeStampMilliseconds + CoolTime;
+ string key = string.Format(BaseCache.BaseCacheKey, "FightCool");
+ await redis.AddHashAsync(key, userId, lockStr);
}
#endregion
diff --git a/Service/Application.Domain/Tool/Base/FightCompute.cs b/Service/Application.Domain/Tool/Base/FightCompute.cs
new file mode 100644
index 0000000..435c93a
--- /dev/null
+++ b/Service/Application.Domain/Tool/Base/FightCompute.cs
@@ -0,0 +1,217 @@
+using Dm.util;
+
+namespace Application.Domain;
+
+public class FightCompute
+{
+ public static FightResultModel ComputeFight(UserAttrModel atkUser, UserAttrModel defUser)
+ {
+ int result = 0;
+ int myHarm = 0;
+ int otHarm = 0;
+ List myStateData = new List();
+ List myRemData = new List();
+ List otStateData = new List();
+ List otRemData = new List();
+
+ var atkHandle = UnitFight(atkUser, defUser);
+ myHarm += atkHandle.atkHarm;
+ otHarm += atkHandle.defHarm;
+ otStateData.AddRange(atkHandle.stateData);
+ otRemData.AddRange(atkHandle.remData);
+ if (defUser.IsSystem == 1) {
+ var defHandle = UnitFight(defUser, atkUser);
+ myHarm += defHandle.defHarm;
+ otHarm += defHandle.atkHarm;
+ myStateData.AddRange(defHandle.stateData);
+ myRemData.AddRange(defHandle.remData);
+ }
+
+ return new FightResultModel() {
+ result = result,
+ myHarm = myHarm,
+ otHarm = otHarm,
+ myStateData = myStateData,
+ myRemData = myRemData,
+ otStateData = otStateData,
+ otRemData = otRemData
+ };
+ }
+
+ private static UnitFightResult UnitFight(UserAttrModel atkUser, UserAttrModel defUser)
+ {
+ int atkHarm = 0;
+ int defHarm = 0;
+ List stateData = new List();
+ List remData = new List();
+ //闪避处理
+ if (defUser.Dodge > 0)
+ {
+ decimal dodgeRide = defUser.Dodge - atkUser.Deadly + defUser.DeadlyLess;
+ if (dodgeRide > 0)
+ {
+ if (randomTrigger(dodgeRide))
+ {
+ return new UnitFightResult()
+ {
+ atkHarm = 0,
+ defHarm = 0,
+ stateData = stateData,
+ remData = remData
+ };
+ }
+ }
+ }
+
+ //士气处理
+ if (atkUser.upMorale > 0)
+ {
+ atkUser.minAtk = Convert.ToInt32(atkUser.minAtk * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3));
+ }
+
+ if (defUser.upMorale > 0)
+ {
+ defUser.defense = Convert.ToInt32(defUser.defense * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3));
+ }
+
+ if (atkUser.minAtk > defUser.defense && defUser.defense > 0)
+ {
+ double harmRide = (atkUser.minAtk - defUser.defense) / defUser.defense;
+ harmRide = harmRide > 1.2 ? 1.2 : harmRide;
+ double fight_Harm = harmRide * atkUser.maxAtk;
+ defHarm +=Convert.ToInt32( 0 - fight_Harm);
+ }
+ else
+ {
+ defHarm = -1;
+ }
+
+ //暴击处理
+ if (atkUser.Crit > 0)
+ {
+ if (randomTrigger(atkUser.Crit))
+ {
+ defHarm = Convert.ToInt32(defHarm * 1.5) ;
+ }
+ }
+
+ //处理反弹
+ if (defUser.Rebound > 0)
+ {
+ decimal reboundRide = defUser.Rebound = atkUser.ReboundLess;
+ if (reboundRide > 0)
+ {
+ atkHarm += Convert.ToInt32( defHarm * reboundRide);
+ }
+ }
+
+ defHarm +=Convert.ToInt32(0 - atkUser.Harm_Add) ; //额外伤害
+ //连击处理
+ if (atkUser.Atk_Next > 0)
+ {
+ if (randomTrigger(atkUser.Atk_Next))
+ {
+ defHarm =Convert.ToInt32( defHarm * 1.3);
+ atkHarm += Convert.ToInt32(atkHarm * 1.3) ;
+ }
+ }
+
+ //免伤处理
+ if (defUser.NoHarm > 0 && defHarm < -1)
+ {
+ defHarm = Convert.ToInt32( defHarm * (1 - defUser.NoHarm));
+ defHarm = defHarm > 0 ? 0 : defHarm;
+ }
+
+ //吸血处理
+ if (defHarm < 0 && atkUser.InBlood > 0)
+ {
+ decimal inBloodRide = atkUser.InBlood - defUser.Punish;
+ if (inBloodRide > 0)
+ {
+ atkHarm += Convert.ToInt32((0 - defHarm) * inBloodRide);
+ }
+ }
+
+ //#region 状态类处理
+ decimal slow = atkUser.Slow - defUser.SlowLess;
+ if (randomTrigger(slow))
+ {
+ stateData.Add("Slow");
+ }
+
+ decimal poison = atkUser.Poison - defUser.PoisonLess;
+ if (randomTrigger(poison))
+ {
+ stateData.Add("Poison");
+ }
+
+ decimal curse = atkUser.Curse - defUser.CurseLess;
+ if (randomTrigger(curse))
+ {
+ stateData.Add("Curse");
+ }
+
+ decimal weaken = atkUser.Weaken - defUser.WeakenLess;
+ if (randomTrigger(weaken))
+ {
+ stateData.Add("Weaken");
+ }
+
+ decimal depressed = atkUser.Depressed - defUser.DepressedLess;
+ if (randomTrigger(depressed))
+ {
+ stateData.Add("Depressed");
+ }
+
+ decimal breach = atkUser.Breach - defUser.BreachLess;
+ if (randomTrigger(breach))
+ {
+ stateData.Add("Breach");
+ }
+
+ decimal palsyatk = atkUser.PalsyAtk - defUser.PalsyAtkLess;
+ if (randomTrigger(palsyatk))
+ {
+ stateData.Add("PalsyAtk");
+ }
+
+ if (randomTrigger(atkUser.Del_Fashion))
+ {
+ if (defUser.code == nameof(UserEnum.AttrCode.Person))
+ {
+ remData.Add(new FightRemoveData()
+ {
+ code = "Equ",
+ par = "Fashion",
+ count = 1
+ });
+ }
+ }
+
+ //#endregion
+
+ return new UnitFightResult()
+ {
+ atkHarm = atkHarm,
+ defHarm = defHarm,
+ stateData = stateData,
+ remData = remData
+ };
+ }
+
+ private static bool randomTrigger(decimal rate)
+ {
+ Random random = new Random();
+ double rand = random.NextDouble();
+ return rand < Convert.ToDouble(rate);
+ }
+}
+
+public class UnitFightResult
+{
+ public int atkHarm { get; set; }
+ public int defHarm { get; set; }
+ public List stateData { get; set; }
+ public List remData { get; set; }
+}
\ No newline at end of file
diff --git a/Service/Application.Web/Controllers/Pub/FightController.cs b/Service/Application.Web/Controllers/Pub/FightController.cs
index 8ed18d9..3243087 100644
--- a/Service/Application.Web/Controllers/Pub/FightController.cs
+++ b/Service/Application.Web/Controllers/Pub/FightController.cs
@@ -102,10 +102,8 @@ public class FightController : ControllerBase
}
}
- var otAttr = await _monsterService.GetMonsterAttrModel(keyId, mainId);
- long dueTime = FightTool.GetFightDueTime(userAttr, otAttr);
bool result = await _fightService.AddFight(fightId, areaCode, keyId, mainId, code, scene, mapId, userId,
- dueTime, exp,
+ exp,
copper, petExp, award, pars);
if (result)
{
@@ -177,11 +175,8 @@ public class FightController : ControllerBase
long petExp = 0;
string award = string.Empty;
string pars = "";
- var userAttr = await _attrService.GetUserAttrModel(userId);
- var otAttr = await _attrService.GetUserAttrModel(otUser.userId);
- long dueTime = FightTool.GetFightDueTime(userAttr, otAttr);
bool result = await _fightService.AddFight(fightId, areaCode, keyId, otUser.userId, code, onMapInfo.code,
- onMapInfo.mapId, userId, dueTime, exp,
+ onMapInfo.mapId, userId, exp,
copper, petExp, award, pars);
if (result)
{
@@ -227,57 +222,68 @@ public class FightController : ControllerBase
#region 此处处理战斗
- FightResultModel fightResult = new FightResultModel()
- {
- result = -1
- };
- if (!string.IsNullOrEmpty(parms.data))
- {
- fightResult = JsonConvert.DeserializeObject(parms.data);
- }
-
- #endregion
-
- //更新攻击
+ var myAttr = await _attrService.GetUserAttrModel(userId, fight.scene);
UserAttrModel otAttr = new UserAttrModel();
if (fight.code == nameof(GameEnum.FightCode.PVE))
{
otAttr = await _monsterService.GetMonsterAttrModel(fight.keyId, fight.mainId);
- if (fightResult.result == 0)
- {
- otAttr.blood = otAttr.blood + fightResult.otHarm;
- otAttr.blood = otAttr.blood < 0 ? 0 : otAttr.blood;
- otAttr.blood = otAttr.blood > otAttr.upBlood ? otAttr.upBlood : otAttr.blood;
- await _monsterService.SetMonsterBlood(fight.keyId, otAttr.blood);
- }
}
else
{
- if (fightResult.result == 0)
- {
- await _fightService.SetUserFightHarm(fight.mainId, fightResult.otHarm);
- await _attrService.UpdateUserBlood(fight.mainId, 1, fightResult.otHarm);
- await _attrService.AddUserLoadState(fight.mainId, fightResult.otStateData);
- await _fightService.HandelFightEnd(fight.mainId, fightResult.otRemData);
- }
-
otAttr = await _attrService.GetUserAttrModel(fight.mainId, fight.scene);
}
- if (fightResult.result == 0)
+ int cool = FightTool.GetFightCool(myAttr.agility, otAttr.agility); //冷却时间
+
+ FightResultModel fightResult = new FightResultModel()
{
- if (otAttr.blood > 0)
+ result = -1
+ };
+
+ if (await _fightService.CheckFightLock(userId, parms.key))
+ {
+ //此处还需要判断冷却时间
+ bool isCool = await _fightService.FightIsCool(userId);
+ if (isCool)
{
- myHarm = fightResult.myHarm;
- myHarm += await _fightService.GetUserFightHarm(userId);
- otHarm = fightResult.otHarm;
- await _attrService.UpdateUserBlood(userId, 1, fightResult.myHarm);
- await _attrService.AddUserLoadState(userId, fightResult.myStateData);
- await _fightService.HandelFightEnd(userId, fightResult.myRemData);
+ fightResult = FightCompute.ComputeFight(myAttr, otAttr);
+ if (fightResult.result == 0)
+ {
+ //此处记录冷却时间
+ await _fightService.SetFightCool(userId, cool);
+ otAttr.blood = otAttr.blood + fightResult.otHarm;
+ otAttr.blood = otAttr.blood < 0 ? 0 : otAttr.blood;
+ otAttr.blood = otAttr.blood > otAttr.upBlood ? otAttr.upBlood : otAttr.blood;
+ if (fight.code == nameof(GameEnum.FightCode.PVE))
+ {
+ await _monsterService.SetMonsterBlood(fight.keyId, otAttr.blood);
+ }
+ else
+ {
+ await _fightService.SetUserFightHarm(fight.mainId, fightResult.otHarm);
+ await _attrService.UpdateUserBlood(fight.mainId, 1, fightResult.otHarm);
+ await _attrService.AddUserLoadState(fight.mainId, fightResult.otStateData);
+ await _fightService.HandelFightEnd(fight.mainId, fightResult.otRemData);
+ }
+
+ if (otAttr.blood > 0)
+ {
+ myAttr.blood = myAttr.blood + fightResult.otHarm;
+ myAttr.blood = myAttr.blood < 0 ? 0 : myAttr.blood;
+ myAttr.blood = myAttr.blood > myAttr.upBlood ? myAttr.upBlood : myAttr.blood;
+
+ myHarm = fightResult.myHarm;
+ myHarm += await _fightService.GetUserFightHarm(userId);
+ otHarm = fightResult.otHarm;
+ await _attrService.UpdateUserBlood(userId, 1, fightResult.myHarm);
+ await _attrService.AddUserLoadState(userId, fightResult.myStateData);
+ await _fightService.HandelFightEnd(userId, fightResult.myRemData);
+ }
+ }
}
}
- var myAttr = await _attrService.GetUserAttrModel(userId, fight.scene);
+ #endregion
//结束战斗都此处直接返回
if (otAttr.blood < 1 || myAttr.blood < 1)
@@ -312,21 +318,19 @@ public class FightController : ControllerBase
//获取个人负面
var myLoad = await _attrService.GetUserLoadState(userId);
- //冷却时间
- int cool = FightTool.GetFightCool(myAttr.agility, otAttr.agility);
-
-
int exitCopper = otAttr.lev * 5; //退出战斗需要的铜贝
+ string fightKey = await _fightService.SetFightLock(userId);
var result = new
{
myHarm,
otHarm,
- myAttr = myAttr,
- otAttr = otAttr,
+ myAttr = new { no = myAttr.viceId, name = myAttr.name, blood = myAttr.blood, upBlood = myAttr.upBlood },
+ otAttr = new { no = otAttr.viceId, name = otAttr.name, blood = otAttr.blood, upBlood = otAttr.upBlood },
myDrug = myDrug.drug,
myLoad = myLoad,
exitCopper,
cool,
+ key = fightKey
};
return PoAction.Ok(result);
}
@@ -631,11 +635,6 @@ public class FightController : ControllerBase
return PoAction.Message("该战斗不可复刻挂机!");
}
- if (await _fightService.ValidFight(fight,false) == false)
- {
- return PoAction.Message("异常的战斗,无法挂机!");
- }
-
var myAttr = await _attrService.GetUserAttrModel(userId, fight.scene);
int diffTime = Convert.ToInt32(fight.okTime - fight.addTime);
diffTime = diffTime < 300 ? 300 : diffTime;
diff --git a/Service/Application.Web/Model/RequestParms/Fight/FightParms.cs b/Service/Application.Web/Model/RequestParms/Fight/FightParms.cs
index c28e5f2..76d084d 100644
--- a/Service/Application.Web/Model/RequestParms/Fight/FightParms.cs
+++ b/Service/Application.Web/Model/RequestParms/Fight/FightParms.cs
@@ -3,5 +3,5 @@
public class FightParms
{
public string fightId { get; set; }
- public string data { get; set; }
+ public string key { get; set; }
}
\ No newline at end of file
diff --git a/Web/src/pages/fight/index.vue b/Web/src/pages/fight/index.vue
index c85c79a..e367ec6 100644
--- a/Web/src/pages/fight/index.vue
+++ b/Web/src/pages/fight/index.vue
@@ -10,10 +10,10 @@
攻击
.
- 查看
+ 查看
- 查看
+ 查看
.
撤退({{ exitCopper }}铜贝)
@@ -68,6 +68,7 @@ const myDrug = ref>([]);
const myLoad = ref>([]);
const exitCopper = ref(0);
const coolTime = ref(0);
+const fightKey = ref('');
let coolLock = false;//冷却锁
const coolTimer = ref(0);//冷却定时器
@@ -89,8 +90,8 @@ onUnmounted(() => {
})
/**加载方法 */
-const BindData = async (data: string): Promise => {
- let result = await FightService.Fight(fightId, data);
+const BindData = async (fig:string): Promise => {
+ let result = await FightService.Fight(fightId, fig);
if (result.code == 0) {
myAttr.value = result.data.myAttr as IUserAttr;
otAttr.value = result.data.otAttr as IUserAttr;
@@ -100,7 +101,8 @@ const BindData = async (data: string): Promise => {
coolTime.value = result.data.cool;
dataLock = false;
myHarm.value = result.data.myHarm;
- otHarm.value = result.data.otHarm;
+ otHarm.value = result.data.otHarm;
+ fightKey.value = result.data.key;
}
else if (result.code == 100) {
PageExtend.RedirectTo("/fight/result?f=" + fightId);
@@ -150,10 +152,8 @@ const UseFightDrug = async (drugId: string) => {
/**攻击 */
const FightAtk = async () => {
if (coolLock == false && dataLock == false) {
- StartCool();
- let result = FightTool.FightHandle(myAttr.value, otAttr.value);
- let data = JSON.stringify(result);
- await BindData(data);
+ StartCool();
+ await BindData(fightKey.value);
}
}
diff --git a/Web/src/services/Index/FightService.ts b/Web/src/services/Index/FightService.ts
index 9f1cabe..d34d72a 100644
--- a/Web/src/services/Index/FightService.ts
+++ b/Web/src/services/Index/FightService.ts
@@ -22,10 +22,10 @@ export class FightService {
* 战斗接口
* POST /Fight/Fight
* @param fightId body
- * @param data body
+ * @param key body
*/
- static async Fight(fightId: string, data: string) {
- return await ApiService.Request("post", "/Fight/Fight", { fightId, data });
+ static async Fight(fightId: string, key: string) {
+ return await ApiService.Request("post", "/Fight/Fight", { fightId, key });
}
/**
diff --git a/任务生成/resource/map.xls b/任务生成/resource/map.xls
index f2f1ef21efc49aa405469484b8614a24a131cdb2..15bdffb6ca7b986a5116079e8438f161b7124180 100644
GIT binary patch
delta 8817
zcmZXa3wV^p6^3U6K|o|cs$Q?mMT?`AvKn#H;1jrJ(1`-GxNI;?}
zgdqt;1VIss#THYwRjik4y_80@wqEM3#kSTe(%KeHD|F_}nX~h6eWDCyi88|=Av`w&!5-7$1%nx$fF&?4aJ9dbc}W>Zp=^b*6X9d
zSh=cWZPEvot?eBrj7mB^MUENYyWdL{%FQ|j!fYWcQNLEQOty(#%0g@8UE^=;d~Nq{
z1B{(#^4akNV;8VMCd*caIqJ_0mcu%*Ky^h!sB3u=3&a}hXQN@bYxpehOy0!81SMCe
zM(f&k&CO3xJmv$LEZu^v7?#b}$-DP8hVn|$n}teHE4smoT?tAKRROD0Hk&$&DHi0~
zlps1{RDPKqkCmu=4)p}9S@3@jn1bZ;wp~YUF>9qMFo60R%T`mar#@3nK9f7=^Z%k02o%$8K_Z=xuP&}rVtzk{Gokb68W$0OaZ%*GrS~jD^GE~b-I<%%Cv}hX^
zvq{6Xvby%z#-pJGB}X?CtIyx!`oQqc&r+2Res4t{axfN=ZHglaH1!P>88I$X^^
zt%a>YOA!aS(s6(rDX2QB$Cu7LJy&O&&J<3+1IrsFLupF6viQLId3Fd^$z&a4=8)Z8
z@t8SiwxAxn8edw$?xKWpa8gEB=2XqLBe&&Xn<-t*M*@I}5T(%;yl>(qf{9k@nJq@k7qbM`uTPi`o2{nTPi?~8`#x`+**Ml5
z>$sMoJKHCW=OE7EOzod@Y$I(pd%?nHpAar7djl3W#^Om?dZXN2kXrD3nQy2WYO0ko
zq%j)+$?M>KvuYz8dK)Tx_hj|i())c9?RUVPQeXL-FBru&=G
z2SO=r`S&%^5jEv#e;mxC6K|D-1#>oxb*Obx``_(B!b0f_1*gKiKYHgRfZ>UN+O;V#
zdpkpC3TdxdC6~q2xIQfrrK|1kw(nfJUfK59bo?xbm3?$)YQb9-zK-BEb|%(bO6T0>
zz`~{#+z_VOvr2YMPwb|={nPf?b8aO#&Ef6ao7(NoU=>(FQ938OZc#!P;D*bOZ%31X
z3!Cq5ZmX#K-&Z3uaf0;+ybf>{}@oKGHFJ$oh-{?vL+VxjKZeYJIX3>^%ZQP<6$^XN%EjrU`?Z*l&jRmy#Er7f7
zo7Hr^TAtX7YF-Vg`*b=0))Mwx3tfgO~SC+DeON71}};&?*AZ
z-ygJ$)&lM5qlX`(LHtI`Ft7Z9^*t9--%O74a9RLYX4%q)5M7K`p*c_=dNH*$_=!+m
zbTID|d-2+DK=p~BFW#i0_bO}chlSOs-xkpJvw*gr0ZuP1h@XE;+}^3q;SH|`LL1at
zX`5L}P2aW#7Q>!tp_VnhD*5ebIquMep;?Fd3fO|g!GrZrmGIwT_2)GgFm@))*tfG)FrTr`QO0_#WNdPUEI8So
zbeOf~74`2B=pvWS6}+qRe6Q-MVKL6S$d0m8)ZbjSZ?Zdq^CEeA
zu84F;rpB%uoFX^7Gi3Kbt+UVBS>1^7cDjJGCpx>B9?9rD;a!ZZt1r8&FI$gfI==A{OD$uCrm-l$vzN-v7s9_aCK)(5rj#wkZfbd80P)FJ&)>EUZx_n0$*T2IL8
zCyz&jmxAnK!zgmw)IH|xa?~!t>>l$4?~m+KU{}Zy^MyA6SubE$Qsh?DBjxNW)Ov$+
zpuB&+h+K`V53p+}ayg7aF6T<2xr)EiRos>{HcD!Y{kFAZ5gU_&T!v-Ny&
zHWW1h&g*1xiQv~GO93`a-lHm}BfA_}21RZ~Jzrd%H`AZ~;2bVLRu!|5T>&h+wex~g
zNj!*f0KgpCzEF6%$gTwDQRFtGCzi7js9j~8GPFoUZa_BBmp#z8S@aTcrp_}=+STB^
zjv}`my*!+aLhTyklqVJmZ#1$&z{XJIX6q&6Y%FTmf^(c4uvqZ%$OZ$OAg3%A-i^po
zflZ{yt*953vq`9>f%7K0cd>{}Mm7Z4%@n!WdZ9U+g4$4U-a?V<)U(0at*BiGPEV$k
z3GX&!*BeHWn>`G&L#Pb{=Ty10Oz_*0r6X%86M;PWR9PyYhDs(VVR^btM5ZGf4r~TR
zZd-a=aW)gREO6#iFEypw)$
zLRGvIndhshe=3PzwR-n*R)o$G;G82zFArzU$0I2X0{C_k0tEk-yNU>QYjy8h={&Z4M|
z1LqPsbeZtVk&Op-7e#LN1jt^B+5~VelQqi(UykfXU@PPiRZ+dUFvN+#R#D_u)JKQ2
z3e+ZnbG1CTOhncoy9wA-irj2{$T+J+ZL-ff*|)g*0CHA^&YQs*mg|-aZ!NMZhEe3U
zqYou#>rlG|vrjG;yc*f9z-GvHRdGGC+kn~4f19sA`Y>`9Lubf1WoU(n)F7J*Yy(AZ
zfAq2CY$Iy7gR_<**O>>-I@I#Oxk;W_A-v7VrUAQ~A~#!oMX7eSpcV#ay&SMo@OzL=
z2X?QVvQl_kk<9>hA4P6OeKBx$KWa0;cq@j8mRg755;UV_0k73iS>@h_D#oUfH!$c>9pe1!gzKT;I0R_YY?ep>v*b%A!gU
z*^ev&>;Oe>C-t4g*~6&K2j?Rcxy}-B9z?AKoR7*6RWA=ATLA1ZMQ*mf**N`w=>$
z;I#7_^*NV-^T+610?uP{=vv`Dfvnsxiril6OO>-$)b7IUnze%e1ldwxPs$^z;#0_$
z8Ag#?QD3{9J&oFOaQ;-DTPq?zL$<;&irj2{L38#DYAeC{EJdzUU*4P@M{N~2pOfp>
z3Ge5~Du6vtk(;d#8D}q`wi=wrwVeleY-_p@0|S#
zo$4oQ6}{FvV7+>)Pav!T_-l&X#`PBDtPQmd;Cxe#+#tM@$Tk{Ak(;gG1J2$;trnbb
z%k3Kk{|&M_WY4II?;zU*?6(xT74?h3+3!%>49<6D_l+X*9@1wTG
z=iK6(wt8@WfX;ewzA3kE6yEQV-D4O2-qt1=&tupUYWw!uu<-M#Cs_`=eh<&b~mc37n_o
z<8>nPH)PF*QRHUpmy)wDQQHMh+w)z%p6mCMv#-#(+w@2d-6Xuz$XX1e$ZbczshoX{
z+5_M`BWpGZ{&!@1kR4GK|AFj5!zgkq>L-S?Z&2Hd+2>Tne|b*5=I<`kKYly}
z8UIH0AyCiCe)Yop7TJDZd;5Lk*N-u0-=XsW)-JCXk#=Mc8%B}aTm3+D_8-(9@i`yy
zwWFVF&i;$egWxkf@-N=IEU*YTWF#*+hutOTEC`aLM1dtPIim;?1Oy~Ukswi2Fo2?*F{_k_&`yJ>#Q{Vnhb*ifFIdl5V+i&GOzvan-
z7nJjAs4}SQDOpse03JohNc_s7)G#`Ld_5&4MT1Jw;s3n;i+bQss%tV0UIt1rlrmDn
zm}jOGODPMbn5ntj8Yt>;*?5IDoLpnrP7qjP%2BQ9HsJ5il&VmwN~s#9cuEPB5-C-u
zRD)7YO0_7}rc{SgT}t&R)u+^eQbS6OC^e?kgi=#V%_ude)Phn=O1DyKMX5EV+bFf6
z)Rxlil-f~hPpJc?j+8o4>P)E%rLL5^QR+^q2c@2r?x56*Qg2FqDD|b(k5Ye1cTyTa
zX&|LRl#(b7rZj}oP)hJEq!DyHG9ce56YHc#)4vHc7A@2$dLO5zQYnA^m5(gO)Fqlu
zi;Klyr4I97?n-@xzqe$2ZFa6tqK4DqOc)xyx>M=n)ClSW)B~;j&tADybd)I{?|s%KOJIa4)quo^1vfB&l~*Wu16)Zs97aD%8!DvGcS6j6ZDxYOU<{C6+2
z4)Nax9F54n#(Y{8{*M`|M|5N6E#|)^`0vg1H%dLr=X}UWJjJie#7~*A6a%X6qn=&Z
zt8;tcAKyScn}YtRRQmIzfyXkQx;{6B;6q7sO?3!e>UVlA4T3#2}=3YC>sX*#cHOcR>a
zi>7^Q`Xw7B!)QiMP*MFgNZijAeSY7SH(&p)c8<7h{w3v1cp(RaxSi4+xsaqGuNUx}>
zg}R2b;vRchMy9#k+e>(N7h-$J=s(`yi}d5%Wgp>
z$EA0AdNqhBI?wA-rLLyX4ClWN#{rKbnem@YM*27cY8XE)99qNp|2N}Nd_8~`;-&i&
z>vrx3v)u6UN@?I((!k57fmaB{vA8t--#D&uoT(2jZbI?Q2H%h~XTGfYvZ|PZY$vz^
z3e$tDqA(mQt1vvP!QWL>o5r`8`rwL+`3|1l#_57e_ot7O-3Hr*D>BxzGH1>;S=Uhg
zt8)Eum1gjlioH}!#bjX|9$|3J*Ep``G(LE+=GS6AuJ9OtSM{fI>4Hwz2UmT9-`O~>
zn%}NG2Hz+3jH$qSaCOLhAFs?ft{82+BICGZ--rGZyULr+?Gku>zA)&JUl
zQrEvo+}*Kx)ZK7k|J7KPKQ*%Q^w`R3x`o3kqv?|kx|U;Z0frr3DcbtP`^yHvehL#_0&`T2{(mcnM1JH5G+Qpl$4XczBFo#fsfRf*#GVXd~Typ
zz?ChMd8JVTKIDm%Fk{9Hw}d86pWqXr47420!`gBEYF-$LG)i@q6sB|jKP$m!QbtKi
zqrX@a*NE_;R=ORw%xQlyIw7-f6TuEMHW9>(O$0Gx6G6=JlTmal
z6=zkdQKLrw38qp(%v36fnMwsQQ>h<*_`%l~sZ^wlG%8ixs#LJGrcy!7R4Ry>N(Hg>
zD)rm+R1V_yR0*q6!Pc5e1u;{pAZ98R#7w2OZ{MD(r-C2vNKd)$P?9R8Eg6w4WoA?=
zB_S>A>KJAzIyHt&Gqq!)#&FCq7r~O+ywa#$Y0A$)C+jHq+NC#B)s8;$^073Ol(Ceg
z980ZagUa;pl$5oVT-@NFV9atu(!Z@qIbTUyeL@8Pl}2;$`L^zp3@T~x-|W~50VOBf
z{!Jwn14n)H)GY8HvO8!Eh
z)C?#&+4gTLsTEL?kQk;UP`R|4Q#+tU-+VJCndTT7?`iZ2?srA{B)H5qO8!Eh;D(t|
zao0n1Y7y1M@
z4ULkMZU3f{Mgb)WiD61i&G636SrJX4c&18O9$Qc?5A-74bxMg=wfnxZ093GY%*>F2
z_nb3h_&wLmjQpN^W+r~mGcz;4=bahL@A+nCq4zBG;UL`#`8xUaWvPmYzKM!JjxHiQ
zeJB{Cq6RO#t;@WmN<)^%7PV^>oi!y!nOuEJ7QS5*m3ipewW+jc@JKsyG}WVz{pc>!
z=L=q6R<^&^ALr<=k&;nG@=c`*p;FKjM<1xBs#Jy?R4J2dPAMEYB_ZULoc<|@nCRW?
zbmQ7DB{AfbT>dGDkNT9NkyEONoRZr=1?vWTD&QG!`qCBy~*HThV!_w~%9~ahm#D
z2sJNLfAguuLEW-&&0VRr<|8U{v{p}*z!)4J`sI+Wott&6KXiGlI|lh_3?ljFw30aO
z`pWGC(>m=IIxUiK+E5A=yEVC9|5O#rP=G3i98JwkUkr#+QPX=akG+Mu5}%4bh)YFW9t$%BUB9AYil*F5
z_gKo%H(@>fAo9l5U?yRM$-8PccmsrnRGKe|sFq~E7d=k{qrx_uf^-7x(=4O5+%Zl6X}H%h-x!&FyK
zw@yvuZFL|AScf(lVsPhAsd?=_Ym9gE!qxGFp-Cf?s;14s
zJwVNgF!K-=%i2avU7c?_N%vF2huuLYAK!lGs5^%wjjJ+cWODYCx8HO$E=S`F)3;1s
z`a!LM2g|h>@YEZ74*sl~Z7A5}*yb~vK05d1=d)|Q`DvcB54OqPv(kpl+3!y}Rb~FO
zm+!8$v(T;&TNQq_Qu2jkdB6H*$}K1MEzbRE>*M1)PA_?O>Da}0(onv*)m(RRfF58&8gGw%MSMb7j_gs5<)Ge_K&g6W!(yNQdJkVmw#FRg;?b+O*
zz~?cU<2K#j;N94P<)41xp(62f?krX1scbthk32bLR;fcjoOpBo*2K3TeEXqsdCpGC
z)%;AgRvn{Z_K&CudvJ@+L=e8La-n_o5$i6jMJ3iOsz2z6b?N?<@)%14e?$#yWzd7o;k0)MUeZ9?y
znv>r+HG9{;&eu5p_1?!WTs%AY;AfxJIDY=o5x=zQSaEo_!haSVba{V`yLa9(tZTiS
z`_3M4+nH|)*1iAr{q1Vpnty5h)_HxWywLgEqWi}Gk}G3!xn0|L-12mnX$w|w{(aHp
z3y(JKSgLiw<5TZDHZ*qM$l|wU+7NT=pj>TgWd88z@!v+>ci(`Kt!~dhzj)bo$#aSg
zj=ky5N3Ndz@lxLgGYTG>cKwS#EJd}xa?ddfOP_!6=0zjw6uo?I#n;E?*UnWg(T!>+I(WyTNi6KoVct*j``CTT^ji9oGS&_
zw_f>6m!CT}{cdKl;st(R^siIDzWv(7Idj^!ua?wg$eg*CPkj8v`Ms-ty7+d(KZZ5h
z@#8Bk#u8b}-w7i97q1E%nKVhfZa?
z^x>qE_0PZ3tNy%-r>5ope#ZL`e>8OU#{RqRzgqg+KJ)H5x8>-wFE$&!`^y4%7sn3#fB4PLVPi5)&Qqc3ozeZ?X3XdssDOZ7O16Cecb#(OubBE?D*{sjn0nL)~
zm-(i8kN0Lh+PC|@y(2b`t-m8j?14ISD!!cI%lYebeDB?Qd0hD!^*fI2cGv#P&px)H
z_towv3tgCdXyR90>(3nj{_aaVKKsY}pS^q~smkuFo%XkC@y)nFefyTp`}5g{?pL*U
zHcc85J*(r&nfG2ip8u=lH)cP$W>mBhhLiEP_dFE4
zE$PE?@75T3A#Ti(?0ZLi_{?|5ZYwoB>;8&kf4?{~>irJecEA5zo)<>^_-4j0y7kQ3
z?DJQDZvS+Pl*jw0WIUYd+Lkx=U3h(B%k9;QG@ku)N=(|5Atuaz4qv9xoGM_>UGmoOqt&v_yEONO*{7#>JahDx(vzxgU)rqd*6Hd(xfw%C
z6#A&p#gEz_%XHJh*g4xSU3;X#^*sxJy|D71arxHo&UEy%W{ut$dSOz7muAd5F?ZX}
z(y_g!jJa>?T_5f5cc{bZt@TgE7uw$HnQE(YdGkMLf2h-*rh`tO$Z_Vj79Uj~P-@1`
zWn=rDE4FrHf%7%nzH>ESr*pOX?^&|zM9R}gtDW4~{>Y5ImA-5dGpg3gw!^*{uw_@(
z&pW@cbXU^ucZDe?zs}rKd+U;JUzFIoqsj4uZ@0QOar)*f4@TYnYN;0n9LkD8D)YC^v*Q^zEY?}IhPtW*vLr
z*u!@pKEAG0z7y|1wX^H**V>-x(sWl`zT`?DeE!@&r}W-)?eoo(ZdvhTmv6fE9XfZ=
z^v`!a`qS@Ul|Oj4LVSk|v&%mAQ`CyS=ho!^@~a%x%73$?%QqYAd|Y5f@{*F%K6z@rHf=zuH>bS*_QYRjR!+{`ZOL7A8m@0%czL&L#}?*(
z^h}PI&sTb4?fN1$J}vh_)8pI6zqn#r{xhqF4jsR`TGx9rRhqsxVg1(yyNu59YsQwR
zt5sU^%HE3=QW{)b^w{WLL!P`csov{xKh*i*i{HwAmAG_K;&pFomU>y%{yO?%`wnfQ
zqVv$LRkLt(yNWXCqp>*p+dE5W$7u!O_87U#gKv(-(+v(|k#?c3n-Wfh>79c`w0@z2r6>j6A-yxAt=bC=8!
zr5VY?gO%cAUO>A#+^dC%4t$)MN=M+@p+lRDJjhw-8!3&*yXLYXETY{Zi=3;S#j%6b
z;sA!5-c6N`_k~dzUclcl+`n;3<5bOv`OCI$
zy5g^Td8Jfk+0nr6hsAVXG_{2U2WD|>vs4T#w52v`y9m>O2C38_DyB1*wwecGr>F-4
zp?n3MT!8*{q3>Z0P|36jsWWXsoXSTXXnSIk8c%5geT3UjHK8r514+WB(RkVlJ4{WY
zt%?)UI3pp|8B1bsQ%eG6;~Qt#Cj6h5jr(y+>9*j~fHqP^GqQfUdB9C_^YFDfJP2RG036t+6Jd8j+i!*&O^7o&OmdV#-T
zp>8Rrr?5_R^Gr|W49PPs#!AyY&$J2`Gj1NrL77-0x_KxEd3i(f@MUx4;d58_Jo-46
z^T2WQ@C|O92acPEFKZ(YUkmRah1Slcdi~gq4pgS7&a_oMi6cWie|Bgh(Qlc%R-$tuHRGxzPI$wRN1bri;TKDVSTGQTbIn3VW
z@>Du}vwL)3IgFCbJH{4zQtP-R?eyd+z}u
zJ}4vvg+vss^(02{L^_>Ru1o%Al&>X`;wBYdzGs_udq?^wRgauho$mM(;g*T{=T?i<
zq&oe!fv=-F-IDZAtpRqY*=UrH)zaDV+-5!vhY6&EDG)@RK9p8!Apv!sJW}ecF^esg
z)j2hEwX{$(DAWoH+~@}F{#^QCZ@)fhsb3$dGNuUWW_?%H-;y$3J+v{z%@MH=OL_e_e`W1%sw_mZjQI}KRv7mj)d1gT@qU>&s}b<~2?
z5rW_6T97{1LO>guLj9Y+vu}=?QXOdgxL5lp4drTRl*i}ES>JUFVBF60;~(lJW1*Sc
z&KZ5B*ELofBk}Xfw(|pLb2x9iIKYGTQ`z0^8o>?d?AEh4>EHp4zBgz=EJ+Ju#aa+6
z)`D2E76QG8nBi9}k$ynK7yPlnIll2|A<&h6^w&93gIYXf+{~28MMttyU@&%SW{ciA
zlf`T_%H7$rYr%FF%H0`lx>GZ`J3B4AZ(TrV9q7zhCTdFco{VDoA5Z@%V9gnSWTjsN
zjZ5XVAl;`0=@%_XS3pRh=tw2>?_6wf8*SD=6Lnjj?N~jzo1R29DqUTNDaNttqCpgmB$A9=y{Bd->u
zv$PPXkso<=P7OU}K;ZfR<}PDv!+%oO$9F9
zY;cZEMzCnoBl?^``H3_u_|;4#n+ymXO*i&hw0;|A5u-Lxk$_V1Y)ul+HbS87;@Rj^
zZKAAL3%pv;In`mh7;it@SE<(o9M}#e|Cub~pwXHbhg&ATx%NWuT8sEpjZ3SvAib&u
zX$%BjhI+lr4PkdgGzZ3WhY_TEb&j-33v3mqCtVrGh5$@#0*BH~`j8`tR*2t1iTa{*
z#~}^o=sC|nnM0S(@iFNhXyL__)**(9`4{VPZnPF;T(!W_Y}S4E-pB3(*Y~T1nbSX2
z3(`(4NISJ4Hl+n=mlnjPv>;_`LHZa1>%zF|s}ioQ#(CX~NbdI>4#k^rDEcuY#1l@T
zv+$aO9c7q-Vyw8c^rXSM^^_r%)`C=83mjq);cz;ij6)eZ912@UZ^qI8Qq+}^pUjy&
za#deCQKLMz`jErpn!!=HFw+Qk0}kP{f@0pKmP{UbZc?3DKE~x>gy2Ag>O-!eK1_sr
zTp2kTp->~-AvokU$j&JX#*ghSnNpn2^z})}K>c%h8U@1UhXb}bJwQAZ`jC4~AJ#-o
zTIiYpL1EM&9P+t(VAwBlDA_pVY~Asktq%hz8@Wcg>u@ONLxB)m|
z7Ul|EEKrB&L)M2w=^K5>eWMS#uk|4hhCbvj(1+Xw`jE@QA(xH=4mUNaNSG=c!gsxo
z^q_7zxoj_OAtB4unebpj@9excsbdgjqcaq?`^Z!Qz?iq7F4?mpvs@;z7^843p*BLqsukOyc|
zGHef{LM0bjT&8^&Tt3vKPSRdY=!Mxou92?NC`Us>;Rt2~87NJYYG^?UgQ21@E<+1}
z9GP8e(y(e@_i4CRBgfjYvD!p3T20__ykl_DHSF0MW8-?Z;|V<~FnHfaw7`TJ3%cV%
zp(a&Cw=y7zdFdQ!f)?0y^f_$p`cPaMlmLN!OB1Ah@B_atS`ZQh(Sk$noLUq%z~?KI
zo5%AtjKMhAb(+m<0fTX^jli`w0ynsGKfc1%7snNE)Sm-8{CVoQ;xH_Ovk4i2
zO~?pr>_%XFG6G*A=I_iyXE151E{sjxyG@_QrlJoetb@R&qEW7>K9suYILT|5S`sv+zjTh&LklwU
zCbm))QtlZsyKK+SOS!v&Bdi7l=~SJ=b(%hDoe5>SK>WxfnMn2au|qhrXcSj1gq9z@
zh2}S3Ay)f@K0dk7kS;yA2cTJc0Eg0S9J1CmNxk$(Cbfb=+z8wq_~bUZBYzfPa6T1H
zyR?{#)@umqBrQn8v>^SW1u+vX@MY%rlMA&IOVy~jofc#uAYexH3zX|NT_^dBzz94q
zYJq2sO?`iy%pb{WOjPPAh~xI`?hU((W1ESI3(^AD@_f?s?XKZ-z*^Ly@F(`>!tKNd
zfcZwO1!<`kWSIa#EI=Rf#I9A!H~|++#i7_F4yE3DvXV~Kg7lc4i8v&T?Od(<1x%l{
zcn-umG9d5>e%X2yoG@1&%)D
zhIAMr5lv4z(ivKihCuMgR14xsMUe;5PsMXVl42BjspsX44(<-lb
z$Gcdm#`*NxGMn&4*@hwPR~m!$Q1=$>`R<50eJz|M`_{w<+{f(leE6GM|1DdMW+v^IH08=gsu<&AaGl(4SCh>;a{w9#-n!<4PSl
zfjgKqM^H_o>1RAWKFh@sruH>W@dRoVk5KherJvufTXk{yU42nSAey$n+{r`?={y
zv!m{%oFlxy0(bmoGkXsIE#tGlZd5jKjBTs>b-7Xb!0{I9rz}(}+9pf?P$&9E?KA!9
z|M^DdJxXn$J#HI}0<9*Ezg|(fM>|(f6>|(e>>|(gH>|*-oziivU1}B$SBm~26
zZMnQ+4)!Pey8cdpQd){4UxfW>DVjY~OF%u+X(TXVZD7JnJPOxZf~|V|eGTNn%RT<)
zik5;*Xd|1K^Jt+IU}ms%q9l*JQkOtcIlzpun5c!vEkk(}j{{8lsXCHOJ>df$e^(w%
z{CIYxo|!BrJj3It31((ynzm=Qm}rZ~-_8J&wj7cKTh>yrbhO2ze>yJ*A~0P@h=k)B8YMp^`q^Av0y%&g3Wm1`-;gdckRy$R%HvzUm<5uNZ(kH19$W_F8-
z7#?Awot}bcfJu9LNrF#kDab^tJ^mI2@?dchCgy^OPV|V!->Co-u`$y292OH^j~~d;
z<>h21#tr9TW{K!T|9Jek1?1(jbmB+TBTV$2$D0blq#v#($&4m`SUti--0=9(4PfHu
zb3J~DgO-9!L=%r6?tnb{(cu6yucZ?`>8UvS3uZoxna^UPmpxTnnE5Scev65CgrBg`
zI_bBy1Et?$F%hLa`ZZ+Dq#x4`F!2NPk+!4HJ^n^H>Pf$eOj2n%ub{<5MDzIJ6=2d2
zAd_V5vyjC^ob!0o2AGAJX>6&m#YFV;_(2$87Gb9G%_0^PG0~%6n$Rtx-}ok}f-ePI
zgh=V}12v$tn8n2JkLb3aqc7DQCKF4Ju0VSJ{y)t5aa5ukuQ8r3hLLkIjFF3#3c)ZY
zF0V`oRyG7H7lNTDU47_J7poY8RSLl>hhSAgu&Nm1WO3P5<{@+Ay|zNtY!#S
zD+H?@g4GGZ>V{zTLNHpyr|RbhA(;M6CVLH`e_|ql+iaEN$s5Z86~k9$i0aCVn0#61&S-On8PzSKyji)?(uKaw4U}Up%_d
z*UWOvgsq?_=z$~wCcMa_i)WojzvEAmiHYScCVb1Ii(}2KU@>ux6e%4Z=h1bxW>&PA
zxQ>c2;fEeS{s%Ry#7q+tD_Km8oW~Cd0<*HktZXsivmQT62+S%Lvx>!pCwu(BAuy{l
z6BetbU_D_Q9zT)@dDSeP_@+^$MX(J|H5M)O`~Z@S)!|dj2otv9(YLg9dGxpjl8i0k
z>kttpY{TP+Affa`W;T=a@QHJT3ES{!UeG$LGZXU;&cmmo5hiTIlxnD`tm!h{uh{E#Ow>sU;D
zy(Yp$?DF_gP+-zyBSsvYz{XBl~
z6qpSxW&?`}3-kE#RA4r=m<=r^BBe*)i`F%3WHB50%p185XiR0f^Cv9S#hQj-ut=8&
zOLVaoAy~^0?A8#hRS4EP1iLK+YZHQD)ZO~s9)h(C!Pk@)>
z4Z*sFVBJHo9wAuI5bTZ+tXBxuI|Sh!9}ovE%`9d!iwV2-_%U)|HfN@Z^35$K
ztli^>&4Jm%Vz#iD@Bxn>Ne5<2W}5k+rNxA2c>LfxFmGihMode=w!>dMezYC(S}_x2
zrllYgUgYt^?~vD;nHV)K1)1dyxn5LXFb~Upi6JZOk+#!EG9hJrpEMzf>EL@e<5QJr9RV&-tdv=rk9`naRTJ
zZ0Urxd;B;;FuO2wlrXzkOhglp_J!&4x-xT&F9l0SjPcZ1$?L{UGn(BjorpXh?MBl&
zyIaie78CKvqdjYy*@Ky8jCxp1L@AGUuW4paW|}eTX))mm9zC*8Gw)!g8KXNaCL)?g
zyW%vnm&NR5G2t_wnk>xT7PGg-MD+9MafMoEAB)+?V#2#TewZW1s4p|8$$5P(CVb6P
zcS&A9X5Q^fW{hs+I-oykcjqzqv5R5+U2I?oHYfyxXS(MO4#9?mU_(Q&VIdg&$Sq?;
z2nH{5c_TwG_>jwk@3Fh^R#60!9Az;_Sxk7c
zr&b7aG&9W%H`-#tzdf~5m}4yF7>fz7_tYw3j^CVl)TBz
z+~i9^CgPE&HcQ?VW^VDNAQMr_Qx8ktRAz4Vr63cr%TwDVZyGbV`%;jJh~}vsl6RNI
zyvyoO#5qsx6z1I)^KOfY*yX8R!ko@b)AQ3UCgPf>9uej}7V{p9i74l(-NKx~%tw96
zwCF~z17?zTH?AXsx)|c9iy?lx7^0|)A$qzPVyKHDcDfiMsEZ+Tx)|c8iy>~h7$T&L
zAr`tAqMnN(zPT78nTsK2xfr68iy;oV7$S~~A-1>}qKJzjUbq+{gNwmRT?}!-#Sk4_
z3{kM{DOCCsmn`;xJEKS3qx0v%SCcMZ~&kA#a#av)9;ai?M
zAk6!j`J68W>j{tZ)boOvD0Dy)4Y-7IV49
zM1=6vQDLrN<}1Dw>`%lEPrWL6D=p?qODCdUCkRW2Tv3*I7)&E>FE7%=H#?y~RXC^VCUU
zK4>u?w3vu@?dRy`~GShg+MoT9mrKe5{
za}zVoxNq{AH*y`YnaT>rW_)J=>oXU_y3EC}I&-mYAsDR8SCC0Tnsadi(w9NG0YY&hIzroU{@}NS;55+|6L4`-o+5pT@2CN
z#Sp_?46)nAV52UE$n9c?(JqE)>|%(!K@79|X2LvmhW=^^>i}c%n|+H%9<0(+?+9~?
z<(XS7CT!JH?+Wu_%QGLgn6O|^ofYO*i@DWe!md5_o-nsr%xxAE*6yiu!rX2#w_8m3
zfT!LU<_?Rw!(zfSJoSMvcQVuT(oTyBfAQ3Z!rW!)++{K0MV|Udn2%V@M=U0M%Tpf<
zb2l?h{Mv0X;c=e&M3|3S%ttLI{LoYX5aweR^D&DF@ATBC!hGCfK5jALvz|IH%sm!!
zkHv&1d+LHP_cHS{Ukb)<__wD%m%Jw|<`b4qc)h2-5ayH2G-LFn#Y8Od)R)41%F_9i
z#YBYg)K|iM+G0L!F%dUB^-p2$vzYrVCZdU_z82?8(}`fOfwfgV=)nV
zJoT+GpJk?*3!k-^h)15fD9i)Q{Fg5Udmd5BQ{PG6b5=c{vveYMdFp#%KF`ccz7*66
ztM$}n$veo*E4~zDBF=g02gy5RF%Ma#Bl>yjM`6BTF<-Elh>4#1NtiEM%oi;tBBiIU
z3iBmq{_IPpo;PwGaG10QV>8wPSkt-~R4mv<}#!y41&VKwPu
zSU0*DR){W!wV;b()#qYZ-?Y5FrInX@(oy}r+yLU
z5zC8?SWMWer+yXY%gi+K>t%}x3-;7+!aT~%-+jsW8)^o-_UM=JbUj~Triov#SUO?t
z9<@d@U$vO8T1@zWr>+b0HD;RG=rxN8&+z!^$f(OPX3`(-vtt$${^H^1nmO+{GoyVe
z*dlll?Z1$`6U;Qx^Ms`nzD3`X7v}30^L2{}kE2gUg!zWWe8XbG4{1+_Fi%>{lNJ-+
zN#COr<|$?x3pr&m;j^^+Lzr(eGm9?;+YV2rJspzw7BkIgzGdlzf76~0VZLqE^KFX>
zuctj7!aQv;Pg_jH0@~9d%rh4AjKxHRpdA9je8*zGV=)moX!nOO-({xhrFShRqKT(+
z2=lDPJZmu#V`!gMf*gA`JturLyL)sMms}<`H{u^$YLVS(T);ferz#6wwQ>1w4+3rpD?qa
zF9lnKm`M9XB<~;0G`;i>OD7^F?Gq8^r&j5o`pg@-4meLG24geU0T)6r#3z@BRkDj=
zJ?vsw`MMa^xGsj(tczjY>S9=-x)|1?E{0X7i^1Dn3~Npo!|Kw-5G7pEv-=wetGx)@f6E{56E#V~KW7-mQp!(8ZMm=RqJGog!N&T}!$ZZ4MMV3^a+
z6Gr=;#Ny9eUUc5Kcram=^nH3^Ua*)KEGBG~c18*FGmH6|#e@aZ&M0Ai&P)@PKDU^#
zYuXtl%r7kF7ZwxNPCKK7`K87D(qh5~XlIl#zhb6|AYWNbcn0l^66QadS=yI^u?GG^
zJEJ7;Ym51{r4wF6JEMg84KvI6Qcx#+i}pK7-nSO>TT3TAj`l(c^P}5FBFt+R^P0s(JfeLf!u-Wz
z{$eo^rD&gsFn_g}zgkShF4`v|%-@)4#^^VTiHJt~M1=Xf#r)l3BF=fLp)mhoW+Pt;
zjuE0C?Gur_KbdL9=ub;0Vj}Gm5$1JfnsL8wF%c;WS7sIuLi{Yxl#c+M#Vz?4;F|7Gr46Az=!y3xPu(o$Gtm0h^>vb2y%G|}U26r*6
zwp|SCY8S%_+QqO|b}_7qT@163i(yUdVp#pU7}mKih83-gVeRT-n15UhD_0l88r8)x
zi@O-+YZt@J9K;Z@V1J%!Mt`-0&jXAX(c|Mu%1AzeJXj^|j1p!PiL{f>mx4^#D(#Gt
zyl7?`AC9(k!h&gMlrS?`%nTM2c1=5@gc)NoV=N}DopweEGo!`KXffdfv@=SWnV4zX
zp2=duGiYa&Ff%jLv^}%Mgul?vC}GB0rN>%KcoFT*5M~x;=9j+CVlm-cw1-NVH(AV^
zEG9gT_D~5ktHsP}G2w@_hf0{)ta@g%nD9>8LnX}Y%)D9ZncZT-XKC+=FmJY)H(N}2
zGVMJPre`rdiwXaxeJR4sVKH-9On5!*QW0iOi<#46A{Njt6=CMGn7J$_A_VPH5oT_S
zncHF_ZqP0jVdk-zc`PQP3GGr5W?p8RanEZp5o2hViZJt8%zPFTk;hYa2s1x3d-)Q4
zv$sfyN3=`Dm*B;HeJRL9l%icKl2?Fr8fF15-RMN@@>G9e7POcJEhZuw?Pn2YA*-H+
zEGFWdrv?bKu*EEFF%kV}=Zi3lSj-|86ETr?z6i4@Gfj(%T1-Sr+W8{PV$2-uOQx4@
zySeXzE*CuXV5EoqxS0*loYY-R1)rN~>F`6^Z6$e?EM_H3C%lt(TM4tW#jI>G;j^BaCd?|#G~-^y
zV#1SYUzRYdTFj~z6aMX~yM7|BN
zJrOBsH;phGF>{$O8J#zB9nhGx2V*nV0Zl@%rXg6f5UhC!)*=LJ8G_v!g0%|4T8Ch_
zgQ!8(UvT|%&~Ay~H%ta}L7BLwRig542<^$Njy
zhhTj|FsyT3yXxm)nB8H2wAYLNY6!oFdAxQWGttW=m$82-4DG
z!ZSRzPMEh^%v&uc{DpRf3A2^OY-KUwMV@+4n5~(4k3^-`78AZj`^SWN8#9xId7H(A
z$9d`@VYXqW=_PuYI_1HBFw*ct+G*xX78VY^yq$G!_NAas_^hY4NM1W;
zKI}_DCOp|wTP3eOGy6)5+FPZ=ziCgJFgq}FlQ272OnAMgwhOZ(Gk5q>uyn)%+LI=E
zotU}Hmx4@02-;~Td7YWL+n0h^h9DtTR)`Is*SnTRH|Cr9$SGINhF1(}F3wC_gp
zx-s(!UkWl2d1yC{}fH3T1><)+D#+O
zJD6$4{SJ$Xh(^0|Z7SY+q(utTz
zyJ>{kmzgt#+1FwsQhMs3F#9p{kT03iZ{#|lKWTU4^_?NufDmk82sS7LOA5gThhRfO
zu%RK?un=r`2sR=FOAf(ChG3&Yu+bsdm=J7i2sSPR8y|vA2*D`KBDOfrp8to{Nyt|k=M@I85ODEzS?I;oE-OT*Vmx4MG{b)yt
zEe^pR2*H+wU`s==Wg*z|5Nt&VwlV};
z6@sk}!PbOeYeTSgA=vs5?7F%|duvOacB+OaN{MMI(o(T)4T}+ZU+hWePbi%GZ^)F%0VWx?mb1WvT
zo%TBkb1pMY^qgxk;RCeaNtpLp%=;`RJi}9$ggK9yCeF^YnD7_c870j57IVJEgcs4?
z3}G%{<`2FU>?QaX?TnJV`_;mtohvOS
zq6zIN5#}n3xyoW9#&{}Pn5&s-#(lNLMC75pC&FA~G1pj3#3R~!BFweSG#0YfVj@b>
zw}XVaj+xKNoW0IsB6iW<6Jf4rW@cXsjwT`+o}r_A=|PM6prsRWj-DqX%ni)E$(MpU
z5&dXKiR3-R%xu0CWFjWgJ`u^=$V@Zt8?Dk2DQTaGFgG#N^ChG6My>;}UUt_3TS73b
zmR;V~5Nulrwmk&f5rXXu!FGjUkAz@YPrLPdGz7!i)8#!Lf??(9^7e*cPlRAkhG0*H
zU{8l&`$Dk&A=on^*s~$nfe`Gu5bXI7>|h9XCU1bZ^KFFrq*c!+Ehb_C?dcHaQ_L*uOTl^~LeTeSCGTmgo=;mk5jSX0hcNdsvw|-L
zbt0P3P7TT1&&*1`6l5aC&`u4>dxn`+d@0C8OTFiqM6LF5dhb+uP%rtF3WHAx_
zXitYQU$B@jSWLu3+S4J-7nzw^RyHqMOhiiB(;>{4ta`rWGjHTN;4qcw&UZ&bu$M!y
zqYj1`41KiML|Smz>XpNO3&2DvwAVzKN0@1P<%q>Z*|gV0m@iw*mn|l0M0-tydDLPa
z^_l1B`DWO^QeU3Y)G#`idL|P*zA>SLDB-m*HU}krjK70uv0a3;XSfsB++M%FsN$=V#`KD5oPlKQlWi`+xBnn30a)v0$+={r$INp--fd
z&;`KP$awqm*4_
zx?HCR7Ak&lV=j8nO(_qhyp+KIpVxm!58z?QQJIvtKKd+%oX7lkFH>~+*WT*iSWz3u
zKn`Q)AHDwne&<3>IQ)0-cKtT~lTX%vLh79ZvmW8@JD)%}pP$aVIqw$u3iO}
z2cOTPjx%qIK&CBo|KaO8_1#Szf$S48+~?KMbQ0oL44qUA@02QZ
z=sdV}M=c}9bypqeQ7HP^?}_vvv+DGSGCayXkss5iRAb_(XEw*ZGUtORKECqKtFv=`
z5(RyTnfm-VdhE+!`ZtUoLX$*ju&+LUroYD~#(Gx9Ui}V;~c#1)~Xxyzn@+V5E!Wqr5G8}#~5%fCUz`fC2$%ZDA{RiDNL@eD86
z4TfkN1hS{c=nw2?A0@06&QpTTRU;B)I$vJy