From 6c104ef0fdc24cb24a3ad130cdb25f30ca3d51b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E5=AE=B6=E7=82=9C?= <2029049582@qq.com> Date: Mon, 7 Apr 2025 19:37:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=8C=E4=BA=BA=E5=AF=B9=E5=B1=80=E6=96=B0?= =?UTF-8?q?=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base_project/Game/View/MainView.lua | 29 ++- .../Game/View/PlayerInfoView copy.lua | 20 +- .../base_project/Game/View/ViewUtil.lua | 164 ++++++------ .../majiang/changsha/EXGameController.lua | 241 +++++++++--------- .../extend/majiang/changsha/EXMainView.lua | 36 ++- .../majiang/changsha/EXPlayerInfoView.lua | 18 +- .../majiang/changsha/MJPlayerCardInfoView.lua | 5 +- .../qizhiba/main/MJPlayerSelfCardInfoView.lua | 200 +++++++-------- .../main/majiang/MJPlayerCardInfoView.lua | 10 +- .../main/majiang/MJPlayerSelfCardInfoView.lua | 16 +- .../ART/base/common/ui/Common_fui.bytes | Bin 247756 -> 247756 bytes .../main_majiang/ui/main_majiang_fui.bytes | Bin 244309 -> 246480 bytes 12 files changed, 391 insertions(+), 348 deletions(-) diff --git a/lua_probject/base_project/Game/View/MainView.lua b/lua_probject/base_project/Game/View/MainView.lua index d173ed16..1cbe38c7 100644 --- a/lua_probject/base_project/Game/View/MainView.lua +++ b/lua_probject/base_project/Game/View/MainView.lua @@ -120,7 +120,7 @@ function M:InitView(url, isHideIpAdds) self:continue_game(v) end) self.distance_view._view:GetController("state").selectedIndex = self._state.selectedIndex > 0 and - self._state.selectedIndex < 3 and 1 or 0 + self._state.selectedIndex < 3 and 1 or 0 self.distance_view:Show() end) end @@ -232,18 +232,21 @@ function M:InitView(url, isHideIpAdds) self._gamectr:PlayerReady() end) - -- local btn_xipai = _view:GetChild('btn_xipai') - -- if btn_xipai then - -- btn_xipai.onClick:Set(function() - -- self._gamectr:PlayerXiPai() - -- end) - -- end + if self._room.room_config.people_num ~= 2 then + local btn_xipai = _view:GetChild('btn_xipai') + if btn_xipai then + btn_xipai.onClick:Set(function() + self._gamectr:PlayerXiPai() + end) + end - -- local btn_start = _view:GetChild('btn_start') - -- btn_start.onClick:Set(function() - -- self._gamectr:StartGame() - -- end) + local btn_start = _view:GetChild('btn_start') + btn_start.onClick:Set(function() + self._gamectr:StartGame() + end) + end + local _btn_wxyqhy = _view:GetChild('btn_wxyqhy') if _btn_wxyqhy then @@ -781,7 +784,7 @@ function M:OnPlayerEnter(...) self:continue_game(v) end) self.distance_view._view:GetController("state").selectedIndex = self._state.selectedIndex > 0 and - self._state.selectedIndex < 3 and 1 or 0 + self._state.selectedIndex < 3 and 1 or 0 self.distance_view:Show() if self.btn_distance then self.btn_distance:GetController("state").selectedIndex = 1 @@ -1115,7 +1118,7 @@ function M:Show() self:continue_game(v) end) self.distance_view._view:GetController("state").selectedIndex = self._state.selectedIndex > 0 and - self._state.selectedIndex < 3 and 1 or 0 + self._state.selectedIndex < 3 and 1 or 0 self.distance_view:Show() self.btn_distance:GetController("state").selectedIndex = 1 end diff --git a/lua_probject/base_project/Game/View/PlayerInfoView copy.lua b/lua_probject/base_project/Game/View/PlayerInfoView copy.lua index d5cc739e..172417cc 100644 --- a/lua_probject/base_project/Game/View/PlayerInfoView copy.lua +++ b/lua_probject/base_project/Game/View/PlayerInfoView copy.lua @@ -1,5 +1,3 @@ ---- - local PlayerInfoView = { _view = nil, _main_view = nil, @@ -51,6 +49,7 @@ function M:init() self._ctr_room_owner = view:GetController('room_owner') self._ctr_mask_voice = view:GetController('mask_voice') self._ctr_dismiss_room = view:GetController('dismiss_room') + self._ctr_site = view:GetController('site') self.PlayerTGTips = view:GetChild('tuoguanTips') if self.PlayerTGTips and self.PlayerTGTips.displayObject.gameObject then @@ -162,6 +161,23 @@ function M:FillData(player) end end +function M:SetStartType(peopleNum, seat) + if peopleNum == 2 then + if seat == 1 then + self._ctr_site.selectedIndex = 1 + else + self._ctr_site.selectedIndex = 2 + self._tex_player_name = 154 + end + elseif peopleNum == 3 then + self._ctr_site.selectedIndex = 2 + seat + elseif peopleNum == 4 then + self._ctr_site.selectedIndex = 5 + seat + else + self._ctr_site.selectedIndex = 0 + end +end + function M:DismissRoom(state) state = state or false self._ctr_dismiss_room.selectedIndex = state == true and 1 or 0 diff --git a/lua_probject/base_project/Game/View/ViewUtil.lua b/lua_probject/base_project/Game/View/ViewUtil.lua index b6c76517..f923ca4d 100644 --- a/lua_probject/base_project/Game/View/ViewUtil.lua +++ b/lua_probject/base_project/Game/View/ViewUtil.lua @@ -2,45 +2,45 @@ ViewUtil = { Num_Converted = { "一", "二", "三", "四" }, Sex_Chat = { - "man", - "woman" + "man", + "woman" }, - + Fix_Msg_Chat = { - "大家好,很高兴见到各位!", - "和你合作太愉快了!", - "快点啊,我等的花儿都谢了!", - "你丫的牌打得也忒好了", - "不要吵了不要吵了,吵什么吵啊,专心打牌", - "怎么又断线了,网络这么差!", - "各位,真不好意思啊,我得离开一会", - "不要走,决战到天亮!", - "你是妹妹,还是哥哥啊?", - "我们交个朋友吧,能不能告诉我你的联系方法", - "再见了,我会想念大家的", - "不好意思临时有事,申请解散!" - } + "大家好,很高兴见到各位!", + "和你合作太愉快了!", + "快点啊,我等的花儿都谢了!", + "你丫的牌打得也忒好了", + "不要吵了不要吵了,吵什么吵啊,专心打牌", + "怎么又断线了,网络这么差!", + "各位,真不好意思啊,我得离开一会", + "不要走,决战到天亮!", + "你是妹妹,还是哥哥啊?", + "我们交个朋友吧,能不能告诉我你的联系方法", + "再见了,我会想念大家的", + "不好意思临时有事,申请解散!" + } } -function ViewUtil.GetPos(self_seat,seat,people_num) +function ViewUtil.GetPos(self_seat, seat, people_num) if self_seat == 0 then return seat end local cur_seat = self_seat local tem = seat - (cur_seat - 1) - if (tem <= 0) then tem = tem +people_num end + if (tem <= 0) then tem = tem + people_num end return tem end -- 隐藏手机号 function ViewUtil.phone_hide(phone) - return string.sub(phone,1,3).."****"..string.sub(phone,8) + return string.sub(phone, 1, 3) .. "****" .. string.sub(phone, 8) end -- 隐藏身份证 function ViewUtil.identity_hide(identity) - return string.sub(identity,1,8).."****"..string.sub(identity,13) + return string.sub(identity, 1, 8) .. "****" .. string.sub(identity, 13) end -local modal_wait_win =nil +local modal_wait_win = nil -- local modal_wait_win_url = "ui://Common/GlobalModalWaiting" function ViewUtil.ShowModalWait(blur_view, title) ViewUtil.CloseModalWait() @@ -51,14 +51,14 @@ function ViewUtil.CloseModalWait() ModalWaitingWindow.CloseModal() end -local _defaultTooltipWin =nil +local _defaultTooltipWin = nil local function __waittips(obj) _defaultTooltipWin:Dispose() _defaultTooltipWin = nil end local _tip_timer -local function __ShowTips(msg,time) +local function __ShowTips(msg, time) time = time or 2 if _defaultTooltipWin then _tip_timer:Stop() @@ -72,24 +72,24 @@ local function __ShowTips(msg,time) _defaultTooltipWin:MakeFullScreen() _tip_timer = Timer.New(function() __waittips() - end,time,1,true) + end, time, 1, true) _tip_timer:Start() end -function ViewUtil.ErrorTip(code,tip,time) - if(Table_Error_code_Map[code]~=nil) then - __ShowTips(string.format("%s",Table_Error_code_Map[code].note), time) +function ViewUtil.ErrorTip(code, tip, time) + if (Table_Error_code_Map[code] ~= nil) then + __ShowTips(string.format("%s", Table_Error_code_Map[code].note), time) else - __ShowTips(tip,time) + __ShowTips(tip, time) end end -function ViewUtil.ErrorMsg(_root_view,code,tip,url) +function ViewUtil.ErrorMsg(_root_view, code, tip, url) local msg = tip - if(Table_Error_code_Map[code]~=nil) then - msg = string.format("%s",Table_Error_code_Map[code].note) + if (Table_Error_code_Map[code] ~= nil) then + msg = string.format("%s", Table_Error_code_Map[code].note) end - local _curren_msg = MsgWindow.new(_root_view, msg, MsgWindow.MsgMode.OnlyOk,url) + local _curren_msg = MsgWindow.new(_root_view, msg, MsgWindow.MsgMode.OnlyOk, url) _curren_msg:Show() end @@ -106,10 +106,10 @@ function ViewUtil.ShowBannerOnScreenCenter(msg, s) banner:GetChild("tex_tip").text = msg GRoot.inst:AddChild(banner) banner:Center() - ViewUtil._banner = banner + ViewUtil._banner = banner local timer = Timer.New(function() banner:Dispose() - end,time,1,true) + end, time, 1, true) timer:Start() end @@ -117,51 +117,47 @@ function ViewUtil.PlaySoundBg() GameApplication.Instance:PlayMuisc("base/common/sound/bgmusic1.mp3") end -function ViewUtil.HandCardSort(a,b) +function ViewUtil.HandCardSort(a, b) local sort_a = a local sort_b = b - if a >= 400 then sort_a = sort_a -1000 end + if a >= 400 then sort_a = sort_a - 1000 end if b >= 400 then sort_b = sort_b - 1000 end - return sort_a>>",prefix,ct) + --printlog("get_majiang_prefix===>>>",prefix,ct) return prefix end @@ -237,7 +234,7 @@ end -- 获取gps function get_gps(callback) if Application.platform == RuntimePlatform.IPhonePlayer or Application.platform == RuntimePlatform.Android then - local s,e = pcall(function() + local s, e = pcall(function() Utils.LocalAddress(function(result, latitude, longitude) if not result or (latitude == 0 and longitude == 0) then return end DataManager.SelfUser.location = Location.new(tostring(longitude) .. "," .. tostring(latitude)) @@ -255,36 +252,33 @@ function get_gps(callback) end --依据宽度截断字符 -function ViewUtil.stringEllipsis(szText,size,full) - +function ViewUtil.stringEllipsis(szText, size, full) full = full or false size = size or 4 --截断结果 local szResult = "..." --完成判断 local bOK = false - + local i = 1 local char_count = 0 while true do - local cur = string.sub(szText,i,i) + local cur = string.sub(szText, i, i) local byte = string.byte(cur) if byte == nil then break end if char_count >= size and full == false then - bOK = true + bOK = true break end if byte > 128 then i = i + 3 char_count = char_count + 1 - elseif byte ~= 32 then - + elseif byte ~= 32 then if string.byte('A') <= byte and byte <= string.byte('Z') then - char_count = char_count + 1 else char_count = char_count + 0.5 @@ -295,25 +289,25 @@ function ViewUtil.stringEllipsis(szText,size,full) char_count = char_count + 0.5 end end - + if i ~= 1 then - szResult = string.sub(szText, 1, i-1) - if(bOK) then - szResult = szResult.."..." + szResult = string.sub(szText, 1, i - 1) + if (bOK) then + szResult = szResult .. "..." end end return szResult end -------------------------lingmeng--------------------------- -function ViewUtil.ShowOneChooose(showText,btnType,callback) +function ViewUtil.ShowOneChooose(showText, btnType, callback) local pop_oneChoose = UIPackage.CreateObjectFromURL("ui://Common/pop_oneChoose") pop_oneChoose:GetChild('text_show').text = showText GRoot.inst:AddChild(pop_oneChoose) pop_oneChoose:Center() local btn_center = pop_oneChoose:GetChild('btn_center') if type(btnType) == "number" then - btn_center.icon = string.format("ui://Common/btn_%d",btnType) + btn_center.icon = string.format("ui://Common/btn_%d", btnType) else btn_center.icon = btnType end @@ -323,4 +317,4 @@ function ViewUtil.ShowOneChooose(showText,btnType,callback) callback() end end) -end \ No newline at end of file +end diff --git a/lua_probject/extend_project/extend/majiang/changsha/EXGameController.lua b/lua_probject/extend_project/extend/majiang/changsha/EXGameController.lua index 8ec6da53..acd03944 100644 --- a/lua_probject/extend_project/extend/majiang/changsha/EXGameController.lua +++ b/lua_probject/extend_project/extend/majiang/changsha/EXGameController.lua @@ -6,17 +6,17 @@ local M = {} --- Create a new CS_GameController function M.new() - setmetatable(M,{__index = GameController}) - local self = setmetatable({}, {__index = M}) - self:init("测试麻将") - self.class = "CS_GameController" - return self + setmetatable(M, { __index = GameController }) + local self = setmetatable({}, { __index = M }) + self:init("测试麻将") + self.class = "CS_GameController" + return self end function M:init(name) - GameController.init(self,name) + GameController.init(self, name) - self._eventmap[CS_Protocol.GAME_EVT_PLAYER_DEAL] = self.OnEventSendCards + self._eventmap[CS_Protocol.GAME_EVT_PLAYER_DEAL] = self.OnEventSendCards self._eventmap[CS_Protocol.GAME_EVT_CHANGE_ACTIVE_PLAYER] = self.OnEventTurn self._eventmap[CS_Protocol.GAME_EVT_DRAW] = self.OnEventTakeCard @@ -40,35 +40,35 @@ function M:init(name) self._eventmap[CS_Protocol.GAME_EVT_PIAO] = self.OnEventPiao self._eventmap[CS_Protocol.GAME_EVT_TING_TIP] = self.OnEventTingTip self._eventmap[CS_Protocol.GAME_EVT_TING] = self.OnEventTing - self._eventmap[CS_Protocol.GAME_EVENT_XIPAI] = self.OnEventXiPai - self._eventmap[CS_Protocol.GAME_EVENT_NOTIFY_XIPAI] = self.OnEventXiPaiAnim + self._eventmap[CS_Protocol.GAME_EVENT_XIPAI] = self.OnEventXiPai + self._eventmap[CS_Protocol.GAME_EVENT_NOTIFY_XIPAI] = self.OnEventXiPaiAnim end local __pre_delete_card = false -- 发送出牌指令到服务器 function M:SendOutCard(card, callback) - local _room = self._room - local p = _room.self_player + local _room = self._room + local p = _room.self_player local _data = {} _data["card"] = card - _data["card_list"] = p.card_list - if p.outcard_list and #p.outcard_list>0 then - _data["outcard_list"] = p.outcard_list - end - - - local _client = ControllerManager.GameNetClinet + _data["card_list"] = p.card_list + if p.outcard_list and #p.outcard_list > 0 then + _data["outcard_list"] = p.outcard_list + end + + + local _client = ControllerManager.GameNetClinet _client:send(CS_Protocol.GAME_DIS_CARD, _data) -- 进行预删牌处理 - + _room.curren_outcard_seat = -1 - list_remove(p.card_list,card) + list_remove(p.card_list, card) table.sort(p.card_list, ViewUtil.HandCardSort) p.hand_left_count = p.hand_left_count - 1 if not p.outcard_list then p.outcard_list = {} end - p.outcard_list[#p.outcard_list+1] = card + p.outcard_list[#p.outcard_list + 1] = card __pre_delete_card = true callback() end @@ -77,60 +77,55 @@ end function M:SendAction(id) local _data = {} _data["id"] = id - local _client = ControllerManager.GameNetClinet + local _client = ControllerManager.GameNetClinet _client:send(CS_Protocol.GAME_ACTION, _data) end - function M:SendXiPaiAction(callBack) local _data = {} - local _client = ControllerManager.GameNetClinet + local _client = ControllerManager.GameNetClinet _client:send(CS_Protocol.GAME_XIPAI, _data) - self.XiPaiCallBack=callBack + self.XiPaiCallBack = callBack end function M:OnEventXiPai(evt_data) - if evt_data["result"]==0 then - if self.XiPaiCallBack then - self.XiPaiCallBack() - end - else - ViewUtil.ErrorTip(1000000,"申请洗牌失败") - end - + if evt_data["result"] == 0 then + if self.XiPaiCallBack then + self.XiPaiCallBack() + end + else + ViewUtil.ErrorTip(1000000, "申请洗牌失败") + end end - - function M:OnEventXiPaiAnim(evt_data) - printlog("洗牌动画===》》》》") - pt(evt_data) - local playeridList = evt_data["list"] - local my_isXiPai=false - local other_isXiPai=false - if playeridList and #playeridList>0 then - for i=1,#playeridList do - local p = self._room:GetPlayerById(playeridList[i]) - if p== self._room.self_player then - my_isXiPai=true - else - other_isXiPai=true - end - end - end - - self._cacheEvent:Enqueue(function() - DispatchEvent(self._dispatcher,CS_GameEvent.EventXiPai,my_isXiPai,other_isXiPai) - end) -end + printlog("洗牌动画===》》》》") + pt(evt_data) + local playeridList = evt_data["list"] + local my_isXiPai = false + local other_isXiPai = false + if playeridList and #playeridList > 0 then + for i = 1, #playeridList do + local p = self._room:GetPlayerById(playeridList[i]) + if p == self._room.self_player then + my_isXiPai = true + else + other_isXiPai = true + end + end + end + self._cacheEvent:Enqueue(function() + DispatchEvent(self._dispatcher, CS_GameEvent.EventXiPai, my_isXiPai, other_isXiPai) + end) +end function M:OnEventSendCards(evt_data) if ViewManager.GetCurrenView().dview_class == LobbyView then self:ReturnToRoom() return end - local _room = self._room + local _room = self._room -- if(_room.CurnrenState == StateType.Ready) then -- _room.CurnrenState = StateType.Palying -- end @@ -145,16 +140,16 @@ function M:OnEventSendCards(evt_data) local left_count = evt_data["left_count"] self._cacheEvent:Enqueue(function() _room.banker_seat = seat - for i=1,#_room.player_list do + for i = 1, #_room.player_list do _room.player_list[i].hand_left_count = _room.player_list[i].seat == _room.banker_seat and 14 or 13 _room.player_list[i].fz_list = {} _room.player_list[i].card_list = {} end p.card_list = handcards - self._room.self_player.hand_left_count = #handcards - table.sort( handcards, ViewUtil.HandCardSort ) - DispatchEvent(self._dispatcher,CS_GameEvent.SendCards, left_count) - end) + self._room.self_player.hand_left_count = #handcards + table.sort(handcards, ViewUtil.HandCardSort) + DispatchEvent(self._dispatcher, CS_GameEvent.SendCards, left_count) + end) end function M:OnEventOutCard(evt_data) @@ -162,7 +157,7 @@ function M:OnEventOutCard(evt_data) local card = evt_data["card"] local p = self._room:GetPlayerBySeat(seat) self._cacheEvent:Enqueue(function() - local _room = self._room + local _room = self._room if seat == _room.self_player.seat and __pre_delete_card then __pre_delete_card = false else @@ -172,13 +167,12 @@ function M:OnEventOutCard(evt_data) end p.hand_left_count = p.hand_left_count - 1 if not p.outcard_list then p.outcard_list = {} end - p.outcard_list[#p.outcard_list+1] = card - DispatchEvent(self._dispatcher,CS_GameEvent.OutCard, p, card) + p.outcard_list[#p.outcard_list + 1] = card + DispatchEvent(self._dispatcher, CS_GameEvent.OutCard, p, card) end end) end - function M:OnEventTakeCard(evt_data) local _room = self._room local seat = evt_data["seat"] @@ -186,34 +180,34 @@ function M:OnEventTakeCard(evt_data) local left_count = evt_data["left_count"] local p = _room:GetPlayerBySeat(seat) self._cacheEvent:Enqueue(function() - p.hand_left_count = p.hand_left_count +1 + p.hand_left_count = p.hand_left_count + 1 if (seat == _room.self_player.seat) then - _room.self_player.card_list[#_room.self_player.card_list+1] = card + _room.self_player.card_list[#_room.self_player.card_list + 1] = card -- table.sort( _room.self_player.card_list, ViewUtil.HandCardSort ) end - DispatchEvent(self._dispatcher,CS_GameEvent.GetCard, seat, card, left_count) + DispatchEvent(self._dispatcher, CS_GameEvent.GetCard, seat, card, left_count) end) end function M:OnEventOutHint(evt_data) self._cacheEvent:Enqueue(function() - DispatchEvent(self._dispatcher,CS_GameEvent.OutHint, evt_data) + DispatchEvent(self._dispatcher, CS_GameEvent.OutHint, evt_data) end) end function M:OnEventTurn(evt_data) local seat = evt_data["seat"] self._cacheEvent:Enqueue(function() - DispatchEvent(self._dispatcher,CS_GameEvent.EventTurn, seat) + DispatchEvent(self._dispatcher, CS_GameEvent.EventTurn, seat) end) end function M:OnEventFzTips(evt_data) self._cacheEvent:Enqueue(function() local tiplist = FZTipList.new() - local list = evt_data["tip_list"] - for i=1,#list do - local dtip = list[i] + local list = evt_data["tip_list"] + for i = 1, #list do + local dtip = list[i] local tip = {} tip.id = dtip["id"] tip.weight = dtip["weight"] @@ -222,12 +216,12 @@ function M:OnEventFzTips(evt_data) tip.opcard = dtip["opcard"] tiplist:AddTip(tip) end - DispatchEvent(self._dispatcher,CS_GameEvent.FZTips, tiplist) + DispatchEvent(self._dispatcher, CS_GameEvent.FZTips, tiplist) end) end function M:OnEventFzAction(evt_data) - local _room = self._room + local _room = self._room local playerid = evt_data["playerid"] local card = evt_data["card"] local actice_card = evt_data["active_card"] @@ -243,12 +237,12 @@ function M:OnEventFzAction(evt_data) local index = -1 local ftype = type if (ftype == FZType.Gang_Peng) then - for i=1,#p.fz_list do + for i = 1, #p.fz_list do if (p.fz_list[i].card == card) then p.fz_list[i].card = card fz = p.fz_list[i] fz.type = type - index = i -1 + index = i - 1 break end end @@ -259,21 +253,21 @@ function M:OnEventFzAction(evt_data) fz.opengang = opengang if (index == -1) then if (ftype == FZType.Chi) then - local data ={} - data[1] = opcard[1] - data[2] = card - data[3] = opcard[2] - fz.opcard =data + local data = {} + data[1] = opcard[1] + data[2] = card + data[3] = opcard[2] + fz.opcard = data end - p.fz_list[#p.fz_list+1] = fz + p.fz_list[#p.fz_list + 1] = fz end fz.from_seat = from_seat local remove_num = #opcard if (p == _room.self_player) then - for i=1,remove_num do - list_remove(p.card_list,opcard[i]) - end + for i = 1, remove_num do + list_remove(p.card_list, opcard[i]) + end end p.hand_left_count = p.hand_left_count - remove_num @@ -281,13 +275,13 @@ function M:OnEventFzAction(evt_data) -- if (fz.Type == FZType.Chi) then card = actice_card end local fp = _room:GetPlayerBySeat(from_seat) if card == fp.outcard_list[#fp.outcard_list] then - table.remove(fp.outcard_list,#fp.outcard_list) + table.remove(fp.outcard_list, #fp.outcard_list) else - table.remove(fp.outcard_list,#fp.outcard_list - 1) - end + table.remove(fp.outcard_list, #fp.outcard_list - 1) + end end - DispatchEvent(self._dispatcher,CS_GameEvent.FangziAction, fz, p, index) + DispatchEvent(self._dispatcher, CS_GameEvent.FangziAction, fz, p, index) end) end @@ -297,11 +291,12 @@ function M:OnEventHu(evt_data) local lose_p = self._room:GetPlayerBySeat(evt_data["from_seat"]) local win_card = evt_data["win_card"] local win_list = evt_data["win_list"] - + self._cacheEvent:Enqueue(function() win_p.card_list = cards - table.sort( win_p.card_list, ViewUtil.HandCardSort) - DispatchEvent(self._dispatcher,CS_GameEvent.ZPHuCard, evt_data["seat"], evt_data["from_seat"], win_card, cards, win_list) + table.sort(win_p.card_list, ViewUtil.HandCardSort) + DispatchEvent(self._dispatcher, CS_GameEvent.ZPHuCard, evt_data["seat"], evt_data["from_seat"], win_card, cards, + win_list) end) end @@ -317,15 +312,15 @@ function M:OneventResult1(evt_data) p.hand_left_count = 0 p.outcard_list = {} end - DispatchEvent(self._dispatcher,CS_GameEvent.ZPResult1, result); + DispatchEvent(self._dispatcher, CS_GameEvent.ZPResult1, result); end) elseif 1 == over or 2 == over then DataManager.CurrenRoom.Over = true - ControllerManager.SetGameNetClient(nil,true) + ControllerManager.SetGameNetClient(nil, true) local total_result = evt_data.total_result local result = evt_data.result self._cacheEvent:Enqueue(function() - DispatchEvent(self._dispatcher,CS_GameEvent.ZPResult2, result, total_result, over); + DispatchEvent(self._dispatcher, CS_GameEvent.ZPResult2, result, total_result, over); end) end end @@ -334,19 +329,19 @@ function M:OnEventNiao(evt_data) local list = evt_data["niao"] local start_seat = evt_data["start_seat"] self._cacheEvent:Enqueue(function() - DispatchEvent(self._dispatcher,CS_GameEvent.EventNiao, list, start_seat) + DispatchEvent(self._dispatcher, CS_GameEvent.EventNiao, list, start_seat) end) end function M:OnEventQSTip(evt_data) self._cacheEvent:Enqueue(function() - DispatchEvent(self._dispatcher,CS_GameEvent.EventQSTip, evt_data) + DispatchEvent(self._dispatcher, CS_GameEvent.EventQSTip, evt_data) end) end function M:OnEventQSAction(evt_data) self._cacheEvent:Enqueue(function() - DispatchEvent(self._dispatcher,CS_GameEvent.EvnetQSAction, evt_data) + DispatchEvent(self._dispatcher, CS_GameEvent.EvnetQSAction, evt_data) end) end @@ -360,13 +355,13 @@ function M:OnEventKaiGang(evt_data) for i = 1, #cardList do p.outcard_list[#p.outcard_list + 1] = cardList[i] end - DispatchEvent(self._dispatcher,CS_GameEvent.EventKaiGang, evt_data, self._room.self_player.outcard_list) + DispatchEvent(self._dispatcher, CS_GameEvent.EventKaiGang, evt_data, self._room.self_player.outcard_list) end) end function M:OnEventHaidi() self._cacheEvent:Enqueue(function() - DispatchEvent(self._dispatcher,CS_GameEvent.EvnetHaiDi, evt_data) + DispatchEvent(self._dispatcher, CS_GameEvent.EvnetHaiDi, evt_data) end) end @@ -376,52 +371,52 @@ function M:OnEventPiaoTip(evt_data) return end - self._cacheEvent:Enqueue(function() + self._cacheEvent:Enqueue(function() self._room.playing = true - DispatchEvent(self._dispatcher,CS_GameEvent.EvnetPiaoTip, evt_data) + DispatchEvent(self._dispatcher, CS_GameEvent.EvnetPiaoTip, evt_data) end) end function M:OnEventTingTip() - self._cacheEvent:Enqueue(function() - DispatchEvent(self._dispatcher,CS_GameEvent.EventTingTip) + self._cacheEvent:Enqueue(function() + DispatchEvent(self._dispatcher, CS_GameEvent.EventTingTip) end) end function M:OnEventTing(evt_data) - self._cacheEvent:Enqueue(function() - local seat = evt_data.seat - DispatchEvent(self._dispatcher,CS_GameEvent.EventTing, seat) + self._cacheEvent:Enqueue(function() + local seat = evt_data.seat + DispatchEvent(self._dispatcher, CS_GameEvent.EventTing, seat) end) end function M:OnEventPiao(evt_data) self._cacheEvent:Enqueue(function() - DispatchEvent(self._dispatcher,CS_GameEvent.EvnetPiao, evt_data.seat, evt_data.num) + DispatchEvent(self._dispatcher, CS_GameEvent.EvnetPiao, evt_data.seat, evt_data.num) end) end -function M:GetPosString( seat ) - if DataManager.CurrenRoom.room_config.people_num ~= 4 then return"" end - if seat == 1 then - return "北" - elseif seat == 2 then - return "西" - elseif seat == 3 then - return "南" - elseif seat == 4 then - return "东" - end +function M:GetPosString(seat) + if DataManager.CurrenRoom.room_config.people_num ~= 4 then return "" end + if seat == 1 then + return "北" + elseif seat == 2 then + return "西" + elseif seat == 3 then + return "南" + elseif seat == 4 then + return "东" + end end function M:Discard(card) - local _data = {} + local _data = {} _data["card"] = card local _room = self._room - local _client = ControllerManager.GameNetClinet + local _client = ControllerManager.GameNetClinet -- list_remove(_room.SelfPlayer.Cards,card) -- table.sort(_room.SelfPlayer.Cards) _client:send(CS_Protocol.Game_Da, _data) end -return M \ No newline at end of file +return M diff --git a/lua_probject/extend_project/extend/majiang/changsha/EXMainView.lua b/lua_probject/extend_project/extend/majiang/changsha/EXMainView.lua index 7898b695..593107e2 100644 --- a/lua_probject/extend_project/extend/majiang/changsha/EXMainView.lua +++ b/lua_probject/extend_project/extend/majiang/changsha/EXMainView.lua @@ -46,8 +46,13 @@ function M:InitView(url) self._full = true -- self.Fix_Msg_Chat = Fix_Msg_Chat UIPackage.AddPackage("extend/majiang/changsha/ui/Extend_MJ_ChangSha") - MJMainView.InitView(self, "ui://Main_Majiang/Main_new_" .. room.room_config.people_num) - -- MJMainView.InitView(self, "ui://Main_Majiang/Main_" .. room.room_config.people_num .. "_s2") + if self._room.room_config.people_num == 2 then + MJMainView.InitView(self, "ui://Main_Majiang/Main_new_" .. room.room_config.people_num) + else + MJMainView.InitView(self, "ui://Main_Majiang/Main_" .. room.room_config.people_num .. "_s2") + end + + @@ -57,10 +62,10 @@ function M:InitView(url) self.LaiziBG.text = "鬼牌" self.LaiziBG.visible = false self.selectLaiziBtn = self._view:GetChild('selectlaizi') - self.Laizi1Btn = self._view:GetChild('selectlaizi1') - self.Laizi2Btn = self._view:GetChild('selectlaizi2') - self.Laizi1Btn.visible = false - self.Laizi2Btn.visible = false + -- self.Laizi1Btn = self._view:GetChild('selectlaizi1') + -- self.Laizi2Btn = self._view:GetChild('selectlaizi2') + -- self.Laizi1Btn.visible = false + -- self.Laizi2Btn.visible = false self.selectLaiziBtn.visible = false self._hu_tip = HuTipView.new(self) @@ -111,7 +116,7 @@ function M:EventInit() _gamectr:AddEventListener(CS_GameEvent.SendCards, function(...) local arg = { ... } - self._tex_LeftCard.text = arg[1] + self._tex_LeftCard.text = string.format("剩余%d张牌", arg[1]) local info = self._player_card_info[1] info._player.auto_out_card = false self:UpdateRound() @@ -121,6 +126,7 @@ function M:EventInit() local p = list[i] local info = self._player_info[self:GetPos(p.seat)] info:FillData(p) + info:SetStartType(_room.room_config.people_num, p.seat) info:MarkBank(p.seat == _room.banker_seat) info:Ready(false) local card_info = self._player_card_info[self:GetPos(p.seat)] @@ -182,7 +188,7 @@ function M:EventInit() local arg = { ... } local seat = arg[1] local card = arg[2] - self._tex_LeftCard.text = arg[3] + self._tex_LeftCard.text = string.format("剩余%d张牌", arg[3]) -- self:UpdateRoomInfo() local info = self._player_card_info[self:GetPos(seat)] info:UpdateHandCard(true) @@ -450,7 +456,7 @@ function M:EventInit() _gamectr:AddEventListener(CS_GameEvent.EvnetPiaoTip, function() self:UpdateRound() - self._tex_LeftCard.text = "0" + self._tex_LeftCard.text = "剩余0张牌" self._state.selectedIndex = 1 if oldGameVersion == 1 then self:__PiaoNiaoTip() @@ -514,8 +520,13 @@ function M:EventInit() end function M:UpdateRound() - self._view:GetChild("text_round").text = string.format("当前局数:%d/%d", self._room.curren_round, - self._room.room_config.round) + if self._room.room_config.people_num == 2 then + self._view:GetChild("text_round").text = string.format("当前局数:%d/%d", self._room.curren_round, + self._room.room_config.round) + else + self._view:GetChild("tex_round1").text = self._room.curren_round + self._view:GetChild("tex_round2").text = self._room.room_config.round + end end function M:InitPlayerInfoView() @@ -851,7 +862,6 @@ function M:__KaiGang(data) self._view:AddChild(self.kg_card) self.kg_card:Center() info:UpdateOutCardList(nil, card, self._cursor) - self._view:GetChild("remaining_card").text = string.format("剩余%d张牌", self._room.remain_cards) coroutine.wait(1) self._popEvent = true @@ -1105,7 +1115,7 @@ function M:ReloadRoom(bskip) if bskip == nil or bskip == false then self:UpdateCardBox(self:GetPos(room.curren_outcard_seat)) - self._tex_LeftCard.text = room.left_count + self._tex_LeftCard.text = string.format("剩余%d张牌", room.left_count) self:UpdateRound() end local me = room.self_player diff --git a/lua_probject/extend_project/extend/majiang/changsha/EXPlayerInfoView.lua b/lua_probject/extend_project/extend/majiang/changsha/EXPlayerInfoView.lua index a1687132..3973eed6 100644 --- a/lua_probject/extend_project/extend/majiang/changsha/EXPlayerInfoView.lua +++ b/lua_probject/extend_project/extend/majiang/changsha/EXPlayerInfoView.lua @@ -1,9 +1,14 @@ -local PlayerInfoView = require("Game.View.PlayerInfoView copy") +local PlayerInfoView_copy = require("Game.View.PlayerInfoView copy") +local PlayerInfoView = require("Game.View.PlayerInfoView") local M = {} function M.new(view, mainView) - setmetatable(M, { __index = PlayerInfoView }) + if mainView._room.room_config.people_num == 2 then + setmetatable(M, { __index = PlayerInfoView_copy }) + else + setmetatable(M, { __index = PlayerInfoView }) + end local self = setmetatable({}, { __index = M }) self._view = view self._main_view = mainView @@ -12,7 +17,14 @@ function M.new(view, mainView) end function M:init() - PlayerInfoView.init(self) + if self._main_view._room.room_config.people_num ~= 2 then + PlayerInfoView.init(self) + self._tex_score = self._view:GetChild("info"):GetChild("tex_score1") + self._tex_score2 = self._view:GetChild("info"):GetChild("tex_score2") + self._ct_score = self._view:GetChild("info"):GetController("score") + else + PlayerInfoView_copy.init(self) + end end function M:ShowInteraction(type, str) diff --git a/lua_probject/extend_project/extend/majiang/changsha/MJPlayerCardInfoView.lua b/lua_probject/extend_project/extend/majiang/changsha/MJPlayerCardInfoView.lua index f9991009..ff8181cc 100644 --- a/lua_probject/extend_project/extend/majiang/changsha/MJPlayerCardInfoView.lua +++ b/lua_probject/extend_project/extend/majiang/changsha/MJPlayerCardInfoView.lua @@ -32,6 +32,7 @@ local function CardPos(obj, area, oder, loc, offset) end function M:UpdateHandCard(getcard, mp, opcard) + print("nandaodaozhelil", getcard, mp, opcard) -- mp 是否明牌 -- 如果不明牌,但是有 opcard 表示是起手胡 getcard = getcard or false @@ -56,7 +57,6 @@ function M:UpdateHandCard(getcard, mp, opcard) opnum = #opcard end local loc = 0 - print("===============================UpdateHandCard", getcard, mp, opcard, comp) if not mp then local comp_back = handcard_list["comp_back"] if self._current_card_type == 2 then @@ -74,7 +74,8 @@ function M:UpdateHandCard(getcard, mp, opcard) if opnum ~= -1 then loc = CardPos(obj, self._area_handcard_list, oder, loc, offset) else - ViewUtil.CardPos(obj, self._area_handcard_list, oder, i, offset) + print("=======zhihoudaizheli", oder) + ViewUtil.CardPos(obj, self._area_handcard_list, oder, i, offset, nil, -12) end --改变左右两边的手牌的x值 if self._current_card_type == 2 and (oder == AreaOderType.down_up or oder == AreaOderType.up_down) then diff --git a/lua_probject/extend_project/extend/majiang/qizhiba/main/MJPlayerSelfCardInfoView.lua b/lua_probject/extend_project/extend/majiang/qizhiba/main/MJPlayerSelfCardInfoView.lua index e09922b5..b66999ed 100644 --- a/lua_probject/extend_project/extend/majiang/qizhiba/main/MJPlayerSelfCardInfoView.lua +++ b/lua_probject/extend_project/extend/majiang/qizhiba/main/MJPlayerSelfCardInfoView.lua @@ -1,37 +1,37 @@ local MJPlayerCardInfoView = import(".MJPlayerCardInfoView") local CardView = { - card = nil, - -- 牌序号 - card_item =0, - -- 索引 - index = 0, - -- 原始位置 - old_postion = Vector2.zero + card = nil, + -- 牌序号 + card_item = 0, + -- 索引 + index = 0, + -- 原始位置 + old_postion = Vector2.zero } -local function NewCardView(card,cardItem) +local function NewCardView(card, cardItem) local self = {} - setmetatable(self,{__index = CardView}) + setmetatable(self, { __index = CardView }) self.card = card self.card_item = cardItem return self end local PlayerSelfView = { - _dragCom=nil, + _dragCom = nil, _carViewList = {} } local M = PlayerSelfView -function PlayerSelfView.new(view,mainView) - setmetatable(M,{__index = MJPlayerCardInfoView}) - local self = setmetatable({}, {__index = M}) - self._view = view - self._mainView = mainView - self:init() - return self +function PlayerSelfView.new(view, mainView) + setmetatable(M, { __index = MJPlayerCardInfoView }) + local self = setmetatable({}, { __index = M }) + self._view = view + self._mainView = mainView + self:init() + return self end function M:init() @@ -42,26 +42,27 @@ function M:setHandCardPos(btn_card, i, getcard) btn_card.x = i * btn_card.width * 1.05 + (getcard and 80 or 0) end -function M:UpdateHandCard(getcard,mp) +function M:UpdateHandCard(getcard, mp) + print("======================onthisUpdateHandCard") if self.outcard_button then self.outcard_button:Dispose() self.outcard_button = nil end getcard = getcard or false - mp = mp or false + mp = mp or false local pv = self local _carViewList = self._carViewList local _lit = pv._area_handcard_list - for i=1,#_carViewList do + for i = 1, #_carViewList do _carViewList[i].card:Dispose() end _carViewList = {} local _dragCom = self._dragCom if (_dragCom == nil) then - _dragCom = UIPackage.CreateObject("Common","UIPanel") - _dragCom.size = Vector2(1,1) - pv._view:AddChild(_dragCom) + _dragCom = UIPackage.CreateObject("Common", "UIPanel") + _dragCom.size = Vector2(1, 1) + pv._view:AddChild(_dragCom) end _dragCom.xy = pv._area_handcard_list.xy self._dragCom = _dragCom @@ -74,71 +75,70 @@ function M:UpdateHandCard(getcard,mp) local cards = DataManager.CurrenRoom.self_player.card_list if (not mp) then - for i=0,(#cards)-1 do - local tem_card = cards[i+1] + for i = 0, (#cards) - 1 do + local tem_card = cards[i + 1] - local btn_card = UIPackage.CreateObject(self:GetCardObjPack(), "Btn_Card"..b3d) - btn_card:SetScale(0.9,0.9)--(1.05,1.05) - -- btn_card.icon = UIPackage.GetItemURL("Main_Majiang", "201_" .. tem_card) - self:fillCard(btn_card,"201_",tem_card) - self:setHandCardPos(btn_card, i, i == #cards - 1 and getcard) - local c_v = NewCardView(btn_card, tem_card) - c_v.index = i - c_v.old_postion = btn_card.xy - _carViewList[#_carViewList+1] = c_v - - _lit:AddChild(btn_card) + local btn_card = UIPackage.CreateObject(self:GetCardObjPack(), "Btn_Card" .. b3d) + btn_card:SetScale(0.9, 0.9) --(1.05,1.05) + -- btn_card.icon = UIPackage.GetItemURL("Main_Majiang", "201_" .. tem_card) + self:fillCard(btn_card, "201_", tem_card) + self:setHandCardPos(btn_card, i, i == #cards - 1 and getcard) + local c_v = NewCardView(btn_card, tem_card) + c_v.index = i + c_v.old_postion = btn_card.xy + _carViewList[#_carViewList + 1] = c_v - if (not self._player.auto_out_card) then - btn_card.data = c_v - -- btn_card.draggable = true; - -- btn_card.onDragStart:Set(function(evt) - -- local _agent = evt.sender - -- _agent:RemoveFromParent() - -- _dragCom:AddChild(_agent) - -- if self.__OnDragStart then - -- self:__OnDragStart(evt) - -- end - -- _agent.onDragEnd:Set(self.__OnDragEnd,self) - -- end) - btn_card.onTouchBegin:Set(handler(self, self.onTouchBegin)) - btn_card.onTouchMove:Set(handler(self, self.onTouchMove)) - btn_card.onTouchEnd:Set(handler(self, self.__OnDragEnd)) - btn_card.onClick:Set(self.__OnClickHandCard,self) - else - btn_card:GetChild("icon").color = Color(0.5,0.5,0.5) - btn_card.touchable = false - end - end + _lit:AddChild(btn_card) + + if (not self._player.auto_out_card) then + btn_card.data = c_v + -- btn_card.draggable = true; + -- btn_card.onDragStart:Set(function(evt) + -- local _agent = evt.sender + -- _agent:RemoveFromParent() + -- _dragCom:AddChild(_agent) + -- if self.__OnDragStart then + -- self:__OnDragStart(evt) + -- end + -- _agent.onDragEnd:Set(self.__OnDragEnd,self) + -- end) + btn_card.onTouchBegin:Set(handler(self, self.onTouchBegin)) + btn_card.onTouchMove:Set(handler(self, self.onTouchMove)) + btn_card.onTouchEnd:Set(handler(self, self.__OnDragEnd)) + btn_card.onClick:Set(self.__OnClickHandCard, self) + else + btn_card:GetChild("icon").color = Color(0.5, 0.5, 0.5) + btn_card.touchable = false + end + end else - for i=0,(#cards)-1 do - - local mp_card = UIPackage.CreateObject("Main_PokeMaJiang", "Mp_self_card"..b3d) - -- mp_card.icon = UIPackage.GetItemURL("Main_Majiang", "202_" .. cards[i+1]) - self:fillCard(mp_card,"201_",cards[i+1]) - mp_card:SetScale(0.9,0.9)--(1.05,1.05) - -- mp_card.x = i * mp_card.width + (i == #cards - 1 and getcard and 20 or 0) - self:setHandCardPos(mp_card, i, i == #cards - 1 and getcard) - _lit:AddChild(mp_card) - end + for i = 0, (#cards) - 1 do + local mp_card = UIPackage.CreateObject("Main_PokeMaJiang", "Mp_self_card" .. b3d) + -- mp_card.icon = UIPackage.GetItemURL("Main_Majiang", "202_" .. cards[i+1]) + self:fillCard(mp_card, "201_", cards[i + 1]) + mp_card:SetScale(0.9, 0.9) --(1.05,1.05) + -- mp_card.x = i * mp_card.width + (i == #cards - 1 and getcard and 20 or 0) + self:setHandCardPos(mp_card, i, i == #cards - 1 and getcard) + _lit:AddChild(mp_card) + end end end function M:onTouchBegin(context) local button = context.sender local card = button.data - local xy = self._area_handcard_list:GlobalToLocal(Vector2.New(context.inputEvent.x,context.inputEvent.y)) + local xy = self._area_handcard_list:GlobalToLocal(Vector2.New(context.inputEvent.x, context.inputEvent.y)) card.touch_pos = xy - button.xy if self.__OnDragStart then self:__OnDragStart(card.card_item) end end -function M:onTouchMove(context) +function M:onTouchMove(context) local button = context.sender local card = button.data - local xy = self._area_handcard_list:GlobalToLocal(Vector2.New(context.inputEvent.x,context.inputEvent.y)) + local xy = self._area_handcard_list:GlobalToLocal(Vector2.New(context.inputEvent.x, context.inputEvent.y)) button.xy = xy - card.touch_pos end @@ -147,37 +147,37 @@ function M:__OnDragEnd(context) self.outcard_button:Dispose() self.outcard_button = nil end - local button = context.sender - -- button.onDragEnd:Set(nil) - --button:RemoveFromParent() - local card = button.data - local _room = DataManager.CurrenRoom - if not _room or _room:GetReloadStatus() then return end - - -- print("button.y"..button.y .. "_room.curren_outcard_seat".._room.curren_outcard_seat) - if (button.y < -150 and _room.curren_outcard_seat == _room.self_player.seat) then - self._mainView:OutCard(card.card_item) - button.touchable = false - self.outcard_button = buttond - else - self._area_handcard_list:AddChildAt(button, card.index) - button:TweenMove(card.old_postion, 0.2) - end + local button = context.sender + -- button.onDragEnd:Set(nil) + --button:RemoveFromParent() + local card = button.data + local _room = DataManager.CurrenRoom + if not _room or _room:GetReloadStatus() then return end + + -- print("button.y"..button.y .. "_room.curren_outcard_seat".._room.curren_outcard_seat) + if (button.y < -150 and _room.curren_outcard_seat == _room.self_player.seat) then + self._mainView:OutCard(card.card_item) + button.touchable = false + self.outcard_button = buttond + else + self._area_handcard_list:AddChildAt(button, card.index) + button:TweenMove(card.old_postion, 0.2) + end end function M:__OnClickHandCard(context) - local button = context.sender - local _carViewList = self._carViewList - for i=1,#_carViewList do - if (_carViewList[i].card ~= button) then - _carViewList[i].card.selected = false - end - end - local _room = DataManager.CurrenRoom - if (Utils.IsDoubleClick(context) and _room.curren_outcard_seat == _room.self_player.seat) then - local card = button.data - self._mainView:OutCard(card.card_item) - end + local button = context.sender + local _carViewList = self._carViewList + for i = 1, #_carViewList do + if (_carViewList[i].card ~= button) then + _carViewList[i].card.selected = false + end + end + local _room = DataManager.CurrenRoom + if (Utils.IsDoubleClick(context) and _room.curren_outcard_seat == _room.self_player.seat) then + local card = button.data + self._mainView:OutCard(card.card_item) + end end -- 获取手牌资源位置,可以在扩展中复写 @@ -187,10 +187,10 @@ end function M:Clear() MJPlayerCardInfoView.Clear(self) - for i=1,#self._carViewList do + for i = 1, #self._carViewList do self._carViewList[i].card:Dispose() end self._carViewList = {} end -return M \ No newline at end of file +return M diff --git a/lua_probject/main_project/main/majiang/MJPlayerCardInfoView.lua b/lua_probject/main_project/main/majiang/MJPlayerCardInfoView.lua index 868c0038..f2ba8588 100644 --- a/lua_probject/main_project/main/majiang/MJPlayerCardInfoView.lua +++ b/lua_probject/main_project/main/majiang/MJPlayerCardInfoView.lua @@ -303,16 +303,20 @@ function M:UpdateOutCardList(outcard, card_item, cursor) col = ((i - num) % (num + 2)) end end + if DataManager.CurrenRoom.room_config.people_num == 2 then + ViewUtil.CardPos(obj, self._area_outcard_list, oder, col, nil, nil, -6) + ViewUtil.CardPos(obj, self._area_outcard_list, multi_oder, row, nil, nil, -12) + else + ViewUtil.CardPos(obj, self._area_outcard_list, oder, col) + ViewUtil.CardPos(obj, self._area_outcard_list, multi_oder, row) + end - ViewUtil.CardPos(obj, self._area_outcard_list, oder, col) - ViewUtil.CardPos(obj, self._area_outcard_list, multi_oder, row) if self._current_card_type == 2 then self:adjust3dOutPut(obj, self._area_outcard_list, oder, num, i) end self:fillCard(obj, card, outlist[i + 1]) - print("==============================thisout", obj, card, outlist[i + 1]) -- 添加角标 self:AddFlag(i + 1, outlist[i], obj) -- obj.icon = "ui://Main_Majiang/"..card .. outlist[i+1] diff --git a/lua_probject/main_project/main/majiang/MJPlayerSelfCardInfoView.lua b/lua_probject/main_project/main/majiang/MJPlayerSelfCardInfoView.lua index 12c51db0..c879c928 100644 --- a/lua_probject/main_project/main/majiang/MJPlayerSelfCardInfoView.lua +++ b/lua_probject/main_project/main/majiang/MJPlayerSelfCardInfoView.lua @@ -55,11 +55,14 @@ function M:init() end function M:setHandCardPos(btn_card, i, getcard) - btn_card.x = i * btn_card.width * 1.05 + (getcard and 20 or 0) + if DataManager.CurrenRoom.room_config.people_num == 2 then + btn_card.x = i * (btn_card.width - 12) + (getcard and 20 or 0) + else + btn_card.x = i * btn_card.width * 1.05 + (getcard and 20 or 0) + end end function M:UpdateHandCard(getcard, mp) - print("======================main", getcard, mp) if self.outcard_button then self.outcard_button:Dispose() self.outcard_button = nil @@ -93,10 +96,15 @@ function M:UpdateHandCard(getcard, mp) if (not mp) then for i = 0, (#cards) - 1 do local tem_card = cards[i + 1] + local btn_card = nil + if DataManager.CurrenRoom.room_config.people_num == 2 then + btn_card = UIPackage.CreateObject(self:GetCardObjPack(), "Btn_Card_jiangxi" .. b3d) + else + btn_card = UIPackage.CreateObject(self:GetCardObjPack(), "Btn_Card" .. b3d) + btn_card:SetScale(1.05, 1.05) + end - local btn_card = UIPackage.CreateObject(self:GetCardObjPack(), "Btn_Card" .. b3d) - btn_card:SetScale(1.05, 1.05) -- btn_card.icon = UIPackage.GetItemURL("Main_Majiang", "201_" .. tem_card) self:fillCard(btn_card, "201_", tem_card) self:setHandCardPos(btn_card, i, i == #cards - 1 and getcard) diff --git a/wb_unity_pro/Assets/ART/base/common/ui/Common_fui.bytes b/wb_unity_pro/Assets/ART/base/common/ui/Common_fui.bytes index f413e169e4ece829d7f91170f6c0a2e18924a2ad..b07674bf83649e9ad586635486bc2f7259ebd53d 100644 GIT binary patch delta 93 zcmX@p&wr+$zhMjG5?40vdkhS$HPctQGHSxuH(eR^VQfA(Mjtkorwk0tlcy)RF($LI jvH;n}lMiypO+FbYJKcURBU?L{J0lP?ZRc`lKGXmJ4L=$= delta 93 zcmX@p&wr+$zhMjG5?401R}2hH@20PEWz>YRZ@Mz-!`OUoj6Q5k*+4Zu(-Yhnli8Sh j85kJ9Og_jVH~D0s>~#CNjBM>(?uaR=FFLyGiPRJXXClwi{(BYl+iNc zSKTFkq`Hq=zZw3;C7s&UfA_|a2M->c$8}VsUc^<~6J5Dw_6$1Ri#77>LUr4CK0Vz}XHB4?t=!Jj=uDE*-WA6l@vJ*j zPV0cwj%*e!PeHQ;omM>Gp6MIP4@+_DF;Z*Wn7R0*Jgw?#P2BYiYqUDQOd9T@BY0O;Kl=2s|FfMnaqwlf=+ww$;OlO0* z+?{5pv$2}AM3Q^RJw3-i=*oI|9i+Es(}xwcOQ=L2xvyvN(Y8`QxxeRS{2m|=^jtgo zC>!Ldd#n>1?3sJ44;$h+f2^m}PEPVvKi-8UduAR_^jsemAzi^kqlI^V>FCyF-N6$7s* zLQ%_jX-`)FBA%$r8Xc&>imUu5WS`=RKAS8}<-dB;zVE9{L&|hd-q|^9#v4iJhA=kM zv+36=ni?X>v*af{znt%_%yw0g=g^`u@NRw$^tqmv^W*423GSx6GECQ96OouM&!hY@ zEP>1OJ-=RvV^7kcvTO*KpQ5+RvKTMtY55uYwk&H84#k&qQlFI<(13Dm1h}3#pT$ZG z<>%<76;caRuBm@AHAuN|`*(FC9@<$*ZLhn#0*dwuY{A zgu1n!GDf3XbY4#$!jmYEWbhz6xNQ*uX;}ARbX4aF7%qb%~SNNROxkjyJrS|?~r#=lEzY{ zEP0ow``4+`Zut$*!LR!$Z$j4|PsEkB+FnT6@;9Cwb<=w2ObVPo~^Vc^$rFZ4`Jc(C(O7F`bP?X8~D5a6Qp-VX2bVtqKSK*XCCO*ybDpi&dzU>Ar@7#YlRtIU zmp>Cx$~UuIw3<8eb1~n<$(LNQ@)sa~8Aw{=>G4|?>9U;Xnf==k_7!C=7M=JtV#=-G zQrH#ip3C2OCf*pzuG)9sdamK_JDdBx{DWuQ?`eLcbx+>SnbL3a4a#Z79-)mjSaa!j`KIUMA3e1{Q2kr-pVXu# zn=IXy|Ds(rS#Rl%e3#a>Wsy{+7Awu}QQ~A?S(fk14_3Bg9VxpOE3PZ92lo}Ga5`O! z_0<&#ce0{Td^~IB8F?GHiWE)JJ@an&=88d0YqLjnhD3H*antGAtTsJck413Bq)qi$ zeOlOvmC%YIPZ6c4=ipy$v>uR)DM23NPJ*liDVFq2`vV!3Q9#f(vfx6D&eNG5=$+o@>;Z^0Sv8zlsKg- z4erERcz(NI!mNgb>hcIUzz$FMJEbXiA}`@-_Mn1UL#c@=X*XO!r9+r3%GPpqD+mFP zx;nVJxw;u_KC;IvwLRZF=qlAw>aM7dkyKBqzhV>XE;UdZuDFTcjg-c8tr3f*G{)js z6KfnQO_fJzU}JBhL01`TEHzV_Q#5D<1LvN{ff$K@}|yeI6JS`cSIOx>-m3B_l!?I5Mps%xv?D`nr44RGU}&Q%Z6W@b zkzoMyMTKXXCiRyTm(q^DFUq>IHJ&3CN>O4lR!Q_I4_4aK6UEq4>&C5gppYPzV%-!~ zI?{|Fwn}|)6_Kxm(uLB4SqH2-P6V^*tP(vM!bZr7q;#Y0A^znQ zr`Y0f7H_8Z)Uvo&zx)9T+v?o(M`0l)*c#S}UN3>760M?wt)i+cU96R|i;bm}wY(~I z3}xX(y7OSTQ)3{Si=yYUC@ijuP-Y*@UN45S2C||mJ?M*2e@lX?cS%-KSR%iHYELN1 zGAy%#VTm5bdRoW^Sn^AE-a&d1)!q>XTYCCcyC|x?t2b+7Q8!^UT<^i#7g2gCy%Bas z!JuK(y$@?c55m1wR{AJ?sZ<2p!1~d?2qq$HL@AcV`qTA6>;`8beR%w27 z@PM*||7HqiHPJBt@f4iIh6K#OeRNhE`MuNdL4&<6DOHpt#I%7!SZ9{(T}@u3ozd*P zl7fcPJt^);O1s50%8Fqn*kiQl0K6zOgsB>9A}Q76N%ThyTmFyBo^U2sJOjkajm^i( zE&l&=<>oB>ot2w--1!$PxBqIPuN5yNDMOWEw6hBPAIzQ9FOE5r=U}c3w^KTfBVR|Dhde>RJc$IV+DsoM~317tFJVhU-ftgh11s*O<@XpqWY@&Cfp5&dVQ?2RwXk(Tr zO;)B*=_Xj@PF1E+S`#dL$12n5WE0lcH&Yd-TD`Cu5pi2g8sih$DCp&**D}`%*9ya)t=d!8BX+pQd_s|Zcn8*0uI8J~Na zV|+d#=TTmB45QihXek(aZW^K%o7z$4*LFinC@|N%lRIUv( zJ!@N)(2{+F1glc-Iy9D2+prok7ON%2faonfZLLNlMY2g{+v2GZ3)N>VZE4H+BXq4M zX2>Ei#9n4MX3qw!um_uX{8S>W)#MC1v5eOwth>u=3y?YvD{j9qunwVo>zTq;|$ycu8o%?#al-&6e!xSiMvI-jYIGzB z;pw@qthvQoi}87?E9(*@GObglfieh}Wo4{)qz~=}dG-pn9(Pc~9oh(+Gyo`H+J zpL=4FCkhaYJiQl2z0fEYc^i9SauP_uB5%_g-i<4n_9{qZkKy?`JGUQe#Ffp^A)c*sWtJ?Tp|1v7 zt3W(o?_@7}SAmPL3S2N4tH9+-67?T~+W0S*D$=(@*zUhwGri=$X5tddQ?`(i%vQ6P z>BVGLlf6P&vseXBvJ|Q|l$2MMtrV2PW+|_sBHL(L3fm{Wu571{kFmjQhuHk_j9wAO zm7Vm%W5}H4Ng3Tx{ZLYNDZ8onP&SRd0ZyXER!Yj7${wmX42E8$U30L-vR6F%N6?mG ztg4m`?fbALmvyDQC#Ok~mBZm3`|;#jdN^wr^cKJa%G>ZDj_Wzk^5{yGUX81?b~uZY zvXz5$XgE77y`>xy!Ym3N$@)u&l^hx~lFedAC}bqV-qAKmc}ICS`_WOXI%DrqS}L2% z-lzOjHbwaW!{jJE{y6(pIi?&}PGk=rjU~MFq4E)Bje)@*(}OWE_#~AY%j&UH)O9S& zRC1Nmay;D_i*`6e-Nym=1o4(tmSU8%wA1fCN;yYG$6NSUudvEg{dwl5iQ`$j;0wy9 z_69fm6E(X{gLkkv)s}N!V^KQ0ubjdD`2(7j$txK!6Wb?Zdl?&56_m5cv-xk3Xl4pIG)HpS1zG?6DC;IJ2e4~ z_8En2W0f_{Dz_I!rLihbnpK|bHUBi}apem-J<-Z1s?ENnN|RWka#_iP-kFoIzAyY% z0n7YwDt(9r)6`k`r_N*)@RjvG!P=5mzNYz;Sr6>@oSV!NWU+#v+J{*^y^^GSqg;j7 z{u!3FdC#+Y^0%lLwOqj}Sp5+)H6TfJ$@sveS}^xxB(ZPlvFtcukLag;ZW#d}jKdmG)=*-5i1eUW~j4lO?_KS4`}8Glph6EhI@eh#Q* zhnZF_*Uc1L?&5VwMasI*iW{!GlJbl4D>Rjz#XQ)i!ayCV z2JuwpT^8@W;PHD$&|SP9I6Rj%`n%Ty6O_M{J5aq~$-hutg1RncofYM7;2VerRC7Lq z_J%ZXzSRb45}5GWHm|PhFp66O;$43;N%Cl08ou3z_C~q-h#0WGMe%LHY<*EdwtDk1ib5*w7UZ_;5|1+#gLCV%=SWR)` zgiHNvNmW!8887bno7#$ZX7u5+tVLiOHlVr-SoeQ^8^$*AhPo`NnyN$d{RPY;Ar5$w zyG7HUg=jUmY9jsUB43Gh#q+W?kV2{dVt8y3TDq7;J6*PCv1rt8)NWBB_hJVnwWwO` z-)Rf_TW$K1LfZJpk{YarK-<6X`z~^Er|Wg=omp4cOp2e+x(PeOmN}hYiOY#JXBitR z-aTDehR!dchN1v_*#Czy7^An6td4h#fSj$~4x+ z;FTmbLM;V7U0(R_!-g=gh+10t0n`EBu3K^h%gnMlB2VQ&*zX%h87SS*)y< zS0m}ym8ejZCuv-?E=_uHUyXKYp7GC=_vBAgXgskpQjA)GmJsH)iqx_Q3+HMjx&yREwIg zgNw(jwUM%H9a8GhcOs>(S`R6W)+41pWvs^*SOc{oQhr?jHx~IK*vA`KZA8=u8yq_t zQ00xRzZGIOvi5*ZY((h4N7py9;RrB&GuaHKv5L3QbT0GXYi{bNxhsWi7Mi=!n9Y{v zJ)4>3zn3<%(ZYW_ya?TosLi1J=!^eS_iHb~>gEBhCvEYzUY{*uY*_D;6Y0K>3~F$$wJxR(NttvX=w3UxVh>Y8z-S zw%gLY@pa%$MZB#7yP9ls?keLI!#T?E-k;nKSNdTa>#4L=+aYhu*Z=dp&}@(WP0)g( zpiE5lH@9QczrET4>U!+3)Mf1ej_qaNil+u8?}T06G^?Qo?X);{LuKtmbvmh?p+m{S zoO%Y;cG1BsUmmQSXn$6LUQ0*NF6X{r)K^1W{Y*!)SVa_Ox7Ge#P~JuD>T9bpyOFWc z$~{<-VZn)_WSaLT%CeG7v=_A8L2^r~y@yp4t0hLKx5Eb}yn&|crY71=X9zos;=*DI zL~nj;%{2Q>rvzJ_SfeKRSXI~;6t{;}FVI~9EjfD+TC%&^1KR&-7Mv)zbfUdC8Z@Ar zd%Y8V`)m;n#FD3p(o^jPB{|vHp!|;xX1u+Rh1w@F==?scpn6l>ewN1i(3<_uc(=A_ zXRy}P^et9!5QDPcVuQ`TY!<2~+Wwj+;Yx4^n=ryVPBJBUwKFF$h>t`?N7-q=<>cD?g-X44OzHrr* zo;&0XDpwC#LB+Q=pt0SoMG4bF}Ymc#$*z11$IO|}Ja^Y~5G!xylj6z27GM>cpGR?h! z{>nejWNdTa1PlAyEl$9zMtef0hblO^p^l+#CvZY&EL}c<_hRE*wV`A+WsLMAx%^#QP@YUKATLPKf+peiaOPMKh1kTU7cay<1xB|!ZfDN z%&zk>Gc;+I`UEvUi>Y@uN}fYo&cc+L^ygW2K$@$jQ{H8kqN-l3+QS^N5 z)gL&|+F_Hg##gAsQ`F@GlAl(eq16{yJG|=YOGUp1zJRKI$~v-{*_mInp_=BdEU63C z=Y-x7Y!0={`#-82sY#2}#pM2x&C-^j21{KtJuSO;Q*TJ@HFX(%^&@+RWzeXf>_b)R za$5cq8-O+a&p)w&%wsP(aV$!GfyV!grd*+}%>MLe%+idg`LC?Cg6&ClH9h+)+GP!0 z{1rXFmX6$Hp{57GI(Z*@x2C6gUJNCyWtu0UiA>dQF}Ek-$09}4_38%nT`5pnQ1|Ps zq$hKI5l`N;3h{gv!!}aq-&t8HQ{68pGern~^XFVe1j)=_#%-9q>C8IF9Y z8>qu|82*YUx_Y>*zN&7e!`Im)={0p5)&C7!;jgRPX_F9ks5`0X4M17yE_(6?8!PQr z-=G^eSRWM7@po2UdQ;s)qkp#wJO~4@Uvlwx)}Lily_;-+v`^hn%WtC0x8x0UNeBmU z3T6Et*kI`L2PX8ltrecE9+WqU)B)Nd^)TiDooZFVnlYmp4;Bp&F6F34sLd_xhrdHR zZ(&RQUG+Uu{=|0E8T#%v^t|tT+^s`D-NwXjrFfSL(O!ml0;0rKOjj>S>IdpkdiM5z zr@-1b5gP{Vj#Z>jVOL2#rXHt}ci3R*g!&;Jy@MwBh@$V}bj8Q?$X(o>r0y$OIlYvm zo>Ftw({$i2UI?6lW0$(e+G0~C`5t`YEOnoadgtC_igXU7Pw%nW>^$|k&(fp|>Zf%4 zKAVq?DeUt^(69&Cy8R5Vyd$`J(fjLj@2^YVUtg>!#w%)Hs+ZL~^{W+)`D*mt*DKEP zdgZRTs;J+%;?%3I`s%l?2I_Zc@&^yNglBN|3RPyjs`S131NCIQC;QPe;fWMkeN+93 zig2FDe#YyL2x*)83r!cdzj}tG!i5g0*XSE@pHKBA-h*AInktVle^bZ9WpTEPFY<)k z38!}?9?5RtFapkF{I1@lA~GMu{_x)4QvdYc-==)v>@SK?_#o+ydY3w=ygAmpkt(v? zS07NG!kclt8%IKASz{U(jAm3{=f!E2%EM$$#@_aBl~0g0MN=tO^+e(@)m#qtvvBNdJiz z72(}jF*4n}gBGPlqZjIWZ(_6xxase`si;-L&0On7s;tG*g(AF*gkv5QTNL(Im2c9* zqP(qCO{-34Ag~%#su=98snw!k#b9qdu^=8H)z<1zZZW+6udCIgvOy@bzSaO;bCIHg zcpI&uhSit!q;(@T)|#vg2DPd72z7>_HPf1ddWjN)L2aQWfcmt!sYziWcpKJIYen%P ze1P<*)|!@t@PSertu6f&!uzpyaG*}KtT8526R9QmNF2TxSAySR zT|6N}B0L+DRay|ryWsT2yl@PFW>;ZTXghR_faZ=Ebr%2i$ZLl_k%16M` zBrTb0l;UxoM8)J<3hj>IG1_D5Wo@W7j6RRx-K62#2*Ie&QpAjx{Y)udL{dg-qqJ0_ zviv!mv#k9>1H-jT(nf1zkeE`AXDMT~aS+4G^UkD4!7(S7$JT!ud}abIF3*$1Tbc4a zQJaJ#Wx?8HI?XtIj)6Eel1D02w5iCwCX$b1)5wV8ec5zMiGpE6p<#wLjh>6*jWM@c zCkw>Bn}#0NW@%3lkLF$RehvqMt4njVxs)CaVmiGQ&11EB+I%=BwuWPPT}-xRV|X=m z-BZ*thBs86hURA|Dn^W{XSD@5yMRQzfYNZdF^1QY7Re*1dnfWEp4xtQ8NyjH0(CZMpV5eNd6F#FXfqOLnsttf-`|u=dlrw$cl|Q;Cdkw>nD*YqfRso)Fe+8>nb3Z)Zs@RS*t#V$5&Ci(HC@ zzi+lY$9z$H3Dk`kJ8`rzmbYhHtaRyR?G+kd1-w^1ETM!h-A5I-YOm4fRiJ;H_Bt|c zg0BzuX4>v)v9OG+?a+3TyDG2j+4z-8IdQx?%c5W6cxh>uwp#%Gv{#|#4ed=zt;$={ zpVfGXXX$6KYOj_}=c@7nY@cWO1)MN?9kl)0Thyrp7$kTFYV0FC114G`R9igYI^G=u-Pgm!O#=9_nJNQ3{ z#)+m*HL%U|p7uUXs)71`;I02r?HFAa_s3~MO}v!iDCq=ZTc?`5x%8p-5iJ(N$J$By zxF+1>6tP-xlU(gI)vCqoVyFMU_6d!wg_wC(J4efF@o~ZD#p_Rg0atVE*1NXQgm_+= zU7!Z>$oZ-E84Zhvri-*n+<&fJq7UNvbmn zkJgr_q`JHa-E6=w6zFBwsCpyBr=!%S5#KD~ye$3L2#uQWJtwzA-cEfQG#g z%AVT>lO4MQT8Wj-xlUiV=O3}oZ{#(JWOTA4kCg6e_pAAv~FXl;e5{V#|05UB)RRJrt*QxAwDa+MT04xw#M@9d7j9pgvL<0UbZ;=P_)q74B5CvxOw@koezJz}!9h5B ztCv%%V)NxoST)O9H`Yz!)q~yvP+pHj(d!TqJOc2Xx?)mB5)Wcg;?P4FrBC4@QnVgJ zCz5#2e>~*dN_!u=D&R$8PBPXAVHBFece9EZspaWv3hzQ^hw)O>=`moH#iE3=g&1p% zY`uyeN0o>22~vb!mDUX9{Y|`>)vJl`df20s_Bb|{e<^`!eBE(uN6R>ktXHR&!?=gl zu=L*;hP6#i@j*}oc8&)O=WD6s<2=HX*&DBLM)1V4wO!*2PWn8GzUkl^i&NE5QwIgl z9>J$dW%RoA#|Vr`=R+3no9aC@V1J&=4Usln2u5si;RX{gnzf z_I7)P>*7lo6#6dRPvxCiWAR`RqBl`7Gq@Jxatn)|pn26;S-SH$W{;-&BUEWL?-PVi z2=sc&9@s0E%_BXv>r|v2qj?>vnckePjQ*dD(ZyphMq6NvW{<%bP4JG%mKdYW#$rsi z^4>q{jM3KKG1}(u#%No=G1|^MMjOzVgpQ~B{&ev4t7I-Ym;AGSLJN9^lq z7_q*C_G!F#z(M=klr({t^*;+}kK)@HxMCFJ%zc%W6M5Mn#0zok9<5gb*I6<7$9OVF zxGAYU(}T4_1D$G@!kBz+B9H#(;arSv;Dq}>M1nSx06je1|M7%hB*v*mk4)wz3XgVi z&|ZvoN>4{Dxi^_t*X&_V@l&vFEj+9n%==G=bvMo2An6_Sj+8g`f8s$4r@@0d!GqqM zhKJV9*l<7;e*+#=eLC*D2oEZvch!p_Hg$$8_oKJ_;fbT0*OLtlf%lcrW3Vl9}htQcByqwenkFhB;;ad?iu^bk@g}Zv@VqmKTg)JpJj?F8aR{}zE{?^*0mswZvmc&UyzW+Y z4wkI{lZi!q`azTCB0Twh_F>weeW3NLc+bLJ5DdS`1>b%Q_II~V{+<@;3BD`S&2%32 ze{wmj-}Ih(FPcA}_r|&TDtaHfG@n<}@YtvKl|LZ;Nj}wDj#SqB(bG?2a__GXpmR_1 z893G6?J1r}Up&Jr(z{RbzS0mqiON0A=S#_YilD^Nhfnh%(m=c+=^lxXJzG43kn@;6 zl=7az3C1U$;VIHEeYm)r6NKY^`Un+KS4u`aXk^Xo3!deJ>ztGHk@_fxgW!n9#y6N` zp9dlMEgk<_-{954?=48dqf@Z>y^q2d@VNi`w^8)M0t}y2oLW4*fDgv|HXIMY-V+M7 zjC&-AxmE8y^;n4gr(g8ZGH z=lB%s5a@T$AwW2XKwB>2lcn((qWc!{6qZKo`{Ii%MI2(SzZkQ?1aYJ^B6y;X#{wk* zszsx?u6q)Wm7*^f@lcby_*_?`k3Rb70rMPLU54wEJsGzmq}%!wYP5tW2FvzAQY^C` zK~7F@;S(mD%U<59T#$W|6v=}DzfRp%EGafE@Dh`kXeIG?OpmD8Pc~9bqBG#u~ z`c$~nG#pGVm%(dl_D-QE>2_&dpAKY(qSII(Qk2$a;IX2#K9de+@S*l`RO`fPIeiv& zTFz?)oI=%~pe@Vs+`Ft`1s5zU;$y9l=Xp=lK8p%ZK7&Uj)?S=(w9ca*dY-omvX7#| zm7fNqjpa&Mkk&PEEEV+-@05p&ud)VJ(r5qEiBg7? zJGio`*$X^HoKv-FtG(w`2fcvv;4^SywUR#PpLAQNRb2zn;O7c-o78Rv4>xgS)z+6p zhr1w9Em*-TSw~TEeigp70-0jy?G?PMIL8VqzEHn6LO6?kjuq!*HEOz&H?%V0Fe@?? z2gj;K8|P3f5?eZnbx0hRHF2I5Dc%al5pQqK6-S6=vA_4Cwc7R&wl~r#hxnuBJpLqF zwl5s%j)hfP#bc!T`jgag6&{(VD?MoMs(`0MPwe{* zRwD`nu@0@?S&hLeXyVXn?=|+9NjS8ch*v<&`XEbC|LvL8R5d};r{XiP&~*W}c%M{l zJLuJQcv5wWZn564=+*1}i+=jQDH_LR_bd7{`m@>1H}SWavOr&`KeuuVjybcJc(hbo zUrfti=221|eTi47t1tBm_4H+4p}wBs6&mPxp(Mx+_2<1pBi&;OtTENzf`+fAuMqb! zY^4{ksgn@O(XX4iTUmv&SBtXoZpqS9TVLxH>gemdLS22mCE#nBWzfUx>lD2Ub~ey6 zy@ZDPCa=&)-|Q6{>o0nRYWhn;h`~OZrM;&9vJlGA(pR}#dPRRVo4vw`Nn0VUeN{-W zL8|{6|AHyoVA|`JY1_S-YwJ5K0cT~Bx1(lt^(^b2*MmiyVVS<$OKhOO;T0O{Z+eAB z`W~;)Sl{avs_EH6h++G@_ce9Ab+Vg9Q_(+f=?4h?Q#ZTQ4*o2Y-qsIhpW7+yTI7n= z4^h%?9wB44K1A1c@o;4c9-C}&sjI#tE^{?-#0*Jw#N~MKx4F+tZb$S;MI7-3shA_K z&<{gAwHrmO)N>q>^dk^=z9CGA)!*@&uol+X;yPGki|b*{I~4h*pf+$4H^LYj&xA3y zxCzGC;$|3Qi!Z_$TYL$|yyG=y3yiVFmtl-W2$SV;`n$B`O zHqMVGzp0DW9W_F4Ee)*x0^Ar}v^cB3!Oa9Vhwr@-jGJ{L5ag)FFkH6<4{yew)M7NaDfig|xuMdeXcF;7%6TxpG}<%z0=HCNi8 zZg!T!byM1+ZZ=l9Zu(dHhf=E5VbNdfA4{p;Qv0C^YWX#RoS?reHKS$dR~%`ZyN{Qa z&=Ww#Z|2!Gdj7O{v}=C$7?9B@jvw|RAE1MdXG@I{k*g) zH`TwDw-A%Apy8BT`ge}3f3N?b|45hj3;+5_|5^V<$l?8K>A&ju8xO)= zYT#;CP-28jt)u5Vm{<=q@yF`x*Bz{IKK(cShWA^K^C;|{{g!UN7IZj>-Wz1SbX18Pvx2%}x1o2t9CG$Wk)zs+kzM;N7~FTEM& zAj6aX_LVlu7-ebvyYOw^+bCz?lSEOd2Ul}{UZfFaMAPNB(fr$8u||wHChl-mfq3|! zh<WFVhx+A_RxgBwjRKyYYO2r&8TR#lZ3efxX97o)*AMp~x zVvGt#MQMoF>d#IHRf~Rx_%@X@d@fP{XL{h_#G(N33ns zfjIXt29wRJZ!~bghDIYtY-}`vc+HR3%xLa_EsO+5Y-zNDn3Utw*T!h;fbER-j@ZHI z2=SC3uZz*u0lOKAj@aGk0kOpqpT6Ek9|!Df^mD}i#sG*r{dj|oAr6>iBs*e?@fgI& zcYOMW8zUTWq%q17Q;o+VF7xA!HO4vMcq7dbCm0hUKJepBF{V1;G-J9W&M;;=;w<9{ zN1ScU@p@;tGS^6V#CgVih?n1mjh5?%D^DBGIN-C!0!LhEJO{Dcdp_P0W2pl!Gcp`; zx$!*2!+yLK#!3eyW0fPWHr7C_^}bKvdSinFZZt9-ag(tb;zmE-7UN|He8qUx5w{wz zK@9r9r*FHl!vS|1S&q2N*bQ;6A8(Jb*8#JQeU7-_cnjh+Ki)y(kOLkzavbr9@eahK zqrP(AH$HH{qsB2uJZ_wTc*>9Wv2oG?PZ_z6c-lAvvBfc;zH`QT2fSc>>WH5i7a{KS z<9%U#>42AwJV*S>_!?s5ai6}c#O1Sh}}N4 z^jW;3?qUuYT~&CJ?Xr@tV1tJ75cUf+Mzcw}O~-(pPR9cUuQ+=Wg$a9o!uup7P^$ad&mVZtg@! z?C$OXvBfE$zTWOW4%pY-&k_5(2SD8E#~bV(;($r+WJgSKKL#-}*Qal|dxQgybdPex zRQKZ$m-+F=y2m--cz2p3PH<0z_`r`h#XZ#lr@5y);tcmpN1Ww;0;?=^O}H}KJ;xE} zy3^hBye>E2{iG02!$v#h8TYdexWK*85ubA}g4pehkGIsl%mFjp%N_A~w+G^3Ki*0= zIp8YyYDZk-UJJ3-Cq8`}+#4M*)4j+G%xQ{sEJMMQOCY|$@`+@tY z10Hi9cf=F!4=mtg2v9S12Q*B#BbsIrh}}N( z>Jz*mGuQz`%;Jt%!VHCY*pC-(MmS(8v$P|YG0Qq)IkUVYMw(G(G}XEY^)Y4zN33X8 zg1GS_%C^BOW}E|7HLE#db+ZP;mzWA1~4D?tneao{red>E8Iz#Qm^gUrDYclz;?%@hZG%pB^7!_46jBfs?N8)c?C;N#|KM;v30g}BU* zmu60Iz=`H0N1SX&M5);vcaU%`XzdGmsJ_AC|osri}nyqSzAvW9+7WadTlbBg{3 zJ6M;@FN{!X@eL1e`lV~5dD;5}CpIW5`t$Q#n;on=u$unZS2#Vt9J-{hjf%8gD7|8S zgSAcMRWu@2W+KphXNu*bCH`QF<)S72Wd00snc&$`?V4!?Op)cfX$4Fn-Y`YL6j|op zH2-j)_Zpc5L!K!xBuqAMiNhe~pGelN%icr-f@1+d{`wo_j)mO)8|0pah?ul4UN6(pdx&#g8B~#1$ru1R?4>5ZYMgiE?p1&@~TNoFK5H zAS4RH{sIki{Ryt8KuG`2wjT)VfPd0)4Z;;BRRf&mz&I_-(vU1Pqzl-H0Gub(zgeLE zH2|}5RTc#0Q4oT^_o`=`kR*P@P7U6#xWafI;Dqmy->~wdfmlVGAPNd&Ux1MIJr6Bw zC{_*A!T1e`*a(^?7={K$rchy81oU?xf%OC-*D*l?{1Ng^#U)A#lS0i~D}V4B$Z?v= z`k9P>#T6#iK<0P{Hj(tR4SC@(z{xi3!pBH_bO78GaE1ft+pwVEI{+xZ1UTmhn7-Mn z{c#Y)f#k<=jS~bp7leF4fPe)2Na7u6DlSWdc?N{2A3->85ujQU8_@*>qa+B4f-u`E zqBV-R1j0yMq6x$FuRur_gcBA4)#Ac6Q*eow-(lvbAY=)`lU5PuQN$tu-hl{$TXa#L zAk4D}$SDb9eT2_J2>uC#(pC}MQH1D1A3=|7WWL2p2%e6@(uwg4nzhKRz3-zzu!|e%Zpmh63?d2YtBcig-b|Y7th# zj8_8)-+_=U2xw7&IQSxo!vsDJIUr;Rg4Gp*Aa4#JyaPgxAfQ(P;78H$k59vUAmj_e zF^hnfE<`{dQq(UXd}I;cK@n^HHJCR*NEC#*1w}0LC%8|7kS+)x2m*sE$l}#}feq$O z5V8bey+crhzZ4LRXF)P7uWF*h215282vOC}j~IeaIccLC6&Zj1OqQ8|Feb%!fN%1756nb!Qd`!Ph~+bcbqwUbvd>*Fi`Sgx4&>(ZbbqzY0Q{ zAiQi5_B>S0mq5rA1S`@ik33Y(Ob~JfVS~`1RC%bH>);T-0bgU4fEZe6_^*P3ctKcc zDQNakEnfg3SrDGL2`tlEzvP zG6i9^MOgDtOA-jVg0R9dGO)W158UA<@Z|#6Vjil*GAM`_ge4ZC=tCwf0wGxt7Fq-` z-v^HEjUZ$Q!U2a6I3pPcLC6t=!;TGwngO+^d_lnM2qOnQR7=dJ6!ixPm|sD7@}b_w zWJ!sF@SPy=TxbxXupl}ZS3yV@1Wca*G2s;=U^1jELAWdka<7L7Ux1J&2%igr67~?` zGZ2DrfpEbheEJaK90&=5@QEO(qB8@HJPkscAe<5es~rLfAA^u72pJg}1FmQw9=*+ouVFH7=~C3?R70w3;ah7(sSZ1`;scQm!D}5d^C# zcl+1VeH;F82RJ5qq~k~3h<|)7iSb17ckIU^w4*AX_lDqVh%3xB2XL}KJO;^wafwHR zFxO*%Gi;c@f<{P0GCJJVR=_L}8ys+! zP;d1PzlZYQ2hbB&eL>KF10hcktQDwS-nQR+zD5ubC@A=z{lo_Q)nMcka5<4*68RHs z*vkDPlDpxWC}3AQ;4~Yy8fPVvyWpxKV5t(|OdDom?VOIw2S)?Wb;@pvvL^(vlrm%gsU^IFsTDF$J;QQkIX+IxuboBnIcps-$%s}ZIFn?JC4JP13%s?Or8cp zhLb-7ekTDEU0xPfn5!S)92>@GGA^wRlEnoXrS}1x@8mXZ<-#N4E%-^mQ4hSfyP#YX zhPA>a$`6w;;wkX~jEi(US~~!sB`&Mmq*)-O+xexg=(M|lTG*5@DFtwr1D~|vW`M;N zCJEc~Y*-9w%cBcm{=0c=MX+S;u_!MTM%fsk2{!r((5Gy*Ue%p|rg>2r&l(Cm)+*GC zwgj5#MTOO>uo(R+{@gsCeFfUkFOO$)%Wyr6hN zSRn`uPO3EwAUq91vLGzC2*)2HECV4!5SCa3w4C~9fQCgNylA&P@A*D7KO2x9{Xvq4A{1oSbQ0brqKm;pk%AizTrE{@vm=xe9R zAY=&wmQCn_I9ynx`)qK>fsiK%%`C!j5JXfc(BQ5CLa+qF1VNB@pa?N}`3RFhNDzc6 z76C&;6{F8b5Thqe5MZrci_-xF;lY`Lfcl~q(ag8U=e>GuG_9uRT_ zAzKiXO}O3-AnXSrUl0xm0zS9&j1>s$bfKekp zclNck`928gf^gKb;V}^I_!HdYLC6w>Y8Ig~>v75E_DzCJ2o!g6QpU0|-q)$P|PYf*`zJ6CtCZ9oz^V zlq(32S_HU*);@sH2JWB%Z)f2MmH6uh{t7xkLA)R!M4<#hfD*qFx`2=@2;BsM!JjoT znfXlU4nl??^b`aa2A;MvfY2L+96{(W2*Rf|FZ`sWWC_ABK~P46fKcl*(h!}QCkU3m z$k`x>S-YSXh7}zQ5a1WkfOSeC0^EcW1Yx2es6B913D5vHp)^5&UjTd#S^}KffSXXJ zAiys`=ncYe0U8jwC>MlImcOVUfRGqKfWIK4NDtI(xsSRW>2C+{;XV}aMv0dHs3(v) z&}QL3$%0_{kH!mYHse9a5QLgm(I0~lV6%iFPC0^5T@W<2a1o}Mm-7Xoo<(S0xCs3x z5TZ=)1j>%Xi+kC1z`6}(dRAfyXIBa1Kx1q8I3nE*nTAhfaw zdkb4&wgw?j5ZYRVHiau`wg(}&2nZc5!aNWH8rtj(LV_T4wFqxLWMm=;X@bzhA{>0E zhz1~J3PLYIP+ozC;r@MTip5v1Ak--!1WZ2WBZw76fme0#z+ht_0#LjlOer7)#0p~? z2+4vlLlEQ;m=G{C7_&gg5QIpJ@IDA11=u(Mgd9N_WEFv6SBNkKgnU6r76cJfwScf~ zJ_bTmF%U)w0>27EvVRfMI1myAVU$If4Z;C`g84WI>4JbY9f}a)2xHYZ(oLZuOAyio zL0$*~{N6_}M9j<+gb9M6u!jhfKnM;30h0_gbO8a+I6e(#6%Y~xp|WLzh6ATe` z(*(hax_mzff#FC*-AqA1Wb^h#U^^J&LC6&ZgkKQQ7lmx72zLkuZiQ_HT@i>Ih}IM@ z2nf%1R|J}XXidq2fbeXa5J*6@rVK$qc!mZ9TrFUNG%)p2jv#o$wy<%We>0ddAmj_e z9ihQ8(jkb)tuW;X2vH#*tgvhl)7MJ?8rxTxz7m8)LBRGbjJ*F4VG9W9A>Qa>1??er zUh9EM&jy?&^6#@OxB`zo{}^DAzag%sxWXhcsDg{z>dOOu-G&7vjEmTo z;0IgVdF9rUF~a^ zUJqa&L6G6UD@)k6y$keHqzV)c3+-i)J-&n#T2{s^0CWj1j5muRObk<3fstGS1z2%W zEdv9^BWXbaF8DuXI3;wq;X0sn6#4Z(0q2PP_e25WQPgU^cz_9lAPGXgou5V77GmnP z{_C(|iipcmq4vyh0pXwmpqlm-ChrBD7z*`PM6_0LSe;k|F|UX5Wgw*6`L#G$P#VcK zaET@kQ^kaxCGyv@%&Uv?*V_aP7d*S=fskkC7u{n;c0bg$6j{#p3fQ#1!@q)0(BFqKhd;no72+4u~V`1Oohcqk( zAwv+>3W5qJ(`E)}*bhREAbcqZ>_>pH}L6e@qmv5COs)76G%jhKCwoSGY1kNDzdL7U7eJiV%b}LD*ywT0%pHzXm4OAen;j zqD8W!jG+rv%Fm~)UEgDcpAu?D6@8@9Gd%K5{*1>kfCMj*6y zz6x^7O#x?>hH)pY#>+$hh(M2s?%lF=x0IRHi!U0K%d z_6tA}$b5$5V`X%^1LwiAE&i~p2H<2HwszH)`NPsAz!?sV0ICSMlzoM9;S)JF%+Z@x zwZj36C&(~~1J1W$31dbW@AAPi;HYw5%Oya{=K-(=IMIReP*Mms0jJxr))w^^lc!HP zVm@U#Fxs;a+z4=_GlF%T$F^sOIKw{kq*(fU|5^i7X8BY`}RotbKzzi=Tpe%cTJaM|(}P;Di7;0&s!@p91u%KP=&ij?(<$ z@BLx9IN(e_Sp4k(U)dZ}4(0m8qx@kx7~LIXTZW=pV9{b$iT8&Ci!K5<*?|vY6(Sy- z3#u($2Ats!iy5f^=GNTq59j*Baujms3-~sY?H}n0cw{PW!lV}FZT$D#y|4sFbs+%o zR`@LfP?)qBaH0(>?;vRkDktW3j|I;GobH#KVVtn#&=6z6L4dPt7zx&)IyMi&O#!os zfb;xdNd(o&fGp+wX~4l1y{7S>(JT}FVQC@Y1RGXgf^sbE#Ejz-E8j3_72q^~cp>0+ zfQDJ{CxA2kU~$^cf`?&s7URlYutTX0d%zZvo8idU8 zHY_qLF9Jr)V`AMG#&y8SHp~#Em1}^)3Sj7_48Po33qWq>C3H2;#yb;u089mA&T6m_X&;Nd6PBBw!;1aH0)M zSZ53Ktq*7$2w2YroNmL)Qakq_fGpT34mit(k?2yIo&%%q0^oWYeY2=aJnh_B+cUi|&RK-l~m zaIy{KKkw{P#v#{9TyY||bQN$$6_lSQ)H4GH{tDn2t{_2hy$M2&qrN!uZ$mO-usE-Z z{67HBcVNs&YAlk4fy*rT3gD_JVs_hm_QM!n6D{xsY$9n@#vtjE+h%in>Nw^5qe+f9#hB^FQyNG0H zu~xNVQY_$H8`jX$T09`(mJ4x(@gwN!4IeWiX=uvCVM*hLPjdy=8ajS#+W2w9$4#ah{iL#UOH4^^QmfXO>7!=M zs55C;gP~~?CeLuGBPTQ*+o&P-dg>;n)*sUVLcOF>)6=H8y!2u98rPj(XF@}fR6E|K zTE*3I1-D8WIy!0c__UEmk0CrwWsg%r!W`mWG!QzlzQTP@;PD36?&LXD?L)hME`G>trcrAsNg` zjAqKd+E2O`lwBefo8@$IvecH6rbsoiH%yTlL=`cw?n?i5MOKsAgBsPQ%PXXf_-plZ zS4tOkr;^lioD{QiB>tSb=mVO7I|@#d!sswbK|a=z@lqT;F;c3+>olV1RnjQ@)lBFq zP3dE$4s>|D)Llr$>Cod+s4thTyQUXgl_r(&VUEU7dSed0cY#eP_;`X=l#P&c>6E=l$rXJWHAs`o>Yj zk6M0|{LSz$F7?>%o_p5i!;O9S?%g8-9fvC|lvJijVi~5`imH_LSS2MQr6PCX7rU(= zS;kZss#+zja%k9fN0`X&|^3Z5#gR@JJ7Hhk37Jb(9&R$Z$RnsVx1r>0g* zQFsMt%0o>$vBIJ9sWy%6%=0fhZL-=S>vUVY4iYRDMTIU^D;&x@#0pJ4U6IudZ9Cmr zt*6xwu@Bp`2BD50rn83BB#sqQ8)=P0`*7PN)TvT}seG<#O|@pB%4fb%n`uJ8j!V<&A9FfR+tV{VntbpP}lbK~HV+;?_qcyl?DdPb?pp6L4xYUG=B(n@lmY9;MjiR(NtRL4# z(^8OEpC!&(`YE`o_FCRm{y^Rp)3= zghqe2na!m|c~}QChy?Sr`LrYts~TGUeQ|Yxw$Qz~{(TX15!l6;DtUisr7qEyhI;+b ziY=pJaV(i@A$QC?sV%2IacsD{LZeWJE5p^Nw3VUP@OzcEn%3t7@wB#va^+`T4Q(yd ztqWbddat=2(gtl~sP47q`XsPC;|?B&oqw|25uXl+Th)VN<&wrN?R+&>RxuWowiXO-=xeDAT;(AwWJ%-4`{ zAG;SRJmNq1_=~hG=`(Quuian)EcDyFeg0qti1SR`1;1y?s@aWqL|K~4Kb`<0ey ztc6(#iht97r}G+XtZ9E}f6|Ql!c2`h)J_*k|I%(#d`Ff-3w2ge)9z?@>446rJG!Y`5yGJkCd^q?L3;#rhi=a0ZRo;qUck(S47v3@bh8m_C+4djr{|+a7Hewe$4vpfAT4an8qpDp z6)^7s64aW}C5v@Ym{kU!_rwP+T9JAOY3E*N;5RUZU;S`qNma?4(p*`)Mn{rL!W&! z-se{;sDI~Ex>3VCtfT8#?o(r&N)g!wF^;9MrI$me_&rNYu9p|Cr6jBHUwW2qdPQgx zj-`dAi{5rUOEW{Sj2r1%?$xV6{I5JqH(ji|vEF4K)3hJ-G}<4}I-osH6=mhARv~l? zdX2~FRjE@Uwn*Lt^lJ1?AvQqX4pOvE$#aTS7P3wxVNh~iFD$0gv+BLln&BS8s7TQp1Er9ZZ32qVEE|fRTyQzWl zzDZ!KSPhy{45ihTrO8Yc^jdVS7;DYyQLW-^qNd%@>(id%QZp;Tq-JdmG~ZhSzRj&x zH9A)UlO8wP6VUuYKh|1Zh??Z-!#i@lK~#BeD8KOxZy}S;#~_~mJa0kMlbGf-)EmK< z48vf&pLQ2vrKwS0o=9hs+_uvj>rLo-5?jlf(!yj04@=jQ*)B|cxY#FkLvPMTQ2(Lq zT@#D9o=Y1-MrqbHx^yS8?5j4b0BhYMH=5~-HWxPgjCFu|8u48&sxPU)Vua%(mKk)vGosC{)dh;@@UC+VoT=`IsuwWHQGkg!L1X``gJtRDhOWK+Xy z+W^)}-v0Zgjb5(xzh2w)-ePTQKv#+&oSfc?*=8R&@V;2`mULoW|IL!uO5LdaM7`^= zHg-Qu8vm-7D`tVaS{yM0F`LSy8hkbn-X0VziRjoi(;!rApSqs!)_*4KQzoP zTHF<#-(RkP4pu<8nVxW_iFDY;8o#IsX1Z7oUv1)F4$ITJrl@$orYzpUnus<=zy#;i zq&N%GjR4F8pR8uMt7HoG@4-y^7ogD1VTCk(pu1WQmkZ_7%~-lRNWY(cY=*FOus(!Z zG-tilKKfAF)SPwqR*G`HTyH0xb>kLnnDmpvS?_GYhQl`$>kVf;jK)68y``ZlYO(-! zJwZ!*vy!yyUN%@{;=+w5v}CQFdOQvl-h&n7jxfCzJ=c=eQitmg(506Dlesys73Ss$ zM5Hgb!mJu8r%_~XjuN-*19xtYmN((KIYuUo%+0aBxj9af;kj9#K55HJv+)uOPtf|* zr5)Cy>;b4I;1pV23vmoWQFp$I=b-GdXhUjCJio;nfD=(*y$+ZpcmUQPL=-ru18Wr% z1@7p8VQ{-cOcdBfL$r98Fgv=M6Ji3uM#H#HKXhbe5g_UhQG7Zgz;Mi4hdrD#+-)PK zOaVFLIYPENomjd#QBMD>V)}P8C&9dMz}v;#sNKS|!Pk`e1TPj^!t~IEOr6Hu$BJ|9 zXIgw8Rt=5L-iKiC5xO)FfpwA9Jhw9$>JV#Ul#HjtLwQk}-9lMCY1J;QuQ?cbBC%*DZX&Vhblikv(QfJtM4t1z!kC$KvnwlT zwgQ=~m!MqT5LwQ`+{oyL=f2XIJjc3WOg|P)^*G|s+TD?AwmydzbVtN1@;-sc^+I>n zO`VIWTDu1u>%o*%6E{x+>Bi4Y$}0 zu0+a6a3xZPgR9mm;wmbh!A7%}XkiA!<1PJ?!FIAG-t#SMr)5!tfea70S(^v4+T2`< z?Ae}cL)badURUOXKKs2JUC&^qe8Szq^<^^tQYY)psqawsfjV7pO_heBPT2#PgI??s ziiusg$}Z|p()rZCtKUp>I4m@CoQtCR;;RAoua z7Uias;}QPs9l-{vtM#X;#7Nectr5F2p%Kf2TwhBEMncuP(0~!OjQ3T2y}p6Ujbano zMx;qM*$P$Pq(4KykAj_Vg$|c2#P!YM;kyt`9?i;`&!Vj7wAyqxKPw(OR5w>>a#?ta z;Xt3qgW->(Sxa*ZZno;%sKFSx^Jn!J=z+1AQ+dX+p6V8TySO`}?$CEqlW}Yc+eLZD zvMwgurs})(Jz0guvkFXoQE}*p@z|a^^oLE;OJeDmlZ)RIx<0?WHdxhPqPHJp59u!} ziv9{Un!v8>S^BH`-mIz*q080R^nLXB!!Z7JO0qeu-%r;cX4TaL>`v&KUW6J=WRK|w z^+S4ldUqn4<}fW-#j3M6=#zg&HZ^>N zrN_OaAJN<2y(6A+^T<_Z?IU;qnKA_d>F`%sQT?!7SME%K-goJg`1L0JF$HSmT^S6F zwo6$D=G=|3E(hjUA`LOJ>`qjH3%v(W)ou(o*I|yZR~WK8@YSPSe(D ztg+fnQRvdgEQzLXX9ca&s{WyV2D&P(l1=+WCYtsm+Mmf%ZMma^DiwB{Qle$>K>Zet zTjQlF<5bp-enGz|;Kx}vu3w_ovsst8%len$QKBTGTKB+}VU*n1 zj0Ne7*{nGGivF0*+UZ~G-ymn(IdHn)(xy4+-0$@7f#^@Zck{S3*RO|;o#?~$A4BC%jZVP17R9MNN{%1O{fZfl2p^^*PIQ>`s zH|SoukS*i-?_vs+q0Wm~rO3^+CCs3mi&$y|xf`a@q;(Aa5B*Q%AH7)Q|I5vvxxlR1i-u_evt{>&ppKh{~-%lWSD$7jM>FrFkpd z-bh#;9Z77zYUqaXZ?%|ztL5AZPfK0hGHhu0KYOqPHv+N?q;^mTEGUfAL-SV=t9TH1?A!S{9n1saqwwQZv7binQ)=`V_hgUc!UMWd78D<^B8$i zK-d@m=ME$47~qcYOlR$EURpKcjC@d*y!JnL4Z=z_Km6jVb<%Z6S8<$vSqE29z$gf9 zZP%lN?;+7SD}h zbZi5=UoUQyfSMW`S-V{KAe2;6?%q~X@7@meUyz^~iLS!laG~}lHc(GCN+R*tP2Ql2 zzA`FDMV^83QocF9>>0NYzkViWj{iv8PqNY0X4NQdl!3N=oAI=N;@7gFxMz!qjS<6E zz@-{x!QKBXJWe@!{aN^+@;1!%y9oor+8>O2&F-d9}wV`_GE;;O$?7={)7-Mh$&G-J19!zZZLho!H`U{NQN3nH zb7=T{ue7fAYhHS>^e>9sl`#=nL47Z(|C-b_@A$G+ISl?XUgWwW!&(*dnm}4QS&S z-DOlnKXm7S%q_HwrVCK-gRG<8+Gv9U{&7_sgaId3XV))Cd{YIK8=rtf+7M4fFmhgSM199kWp zUzm2(^$Vwt`uswj_g%k0@53*2H+n#S?qmOl{(lVNLitX}2=3|Qv1RxoxR$EX)98g# z{&C4DK^sowu>Ow|uJ!FtW?whP>Aj6U&{y(QG`9Wx6l<>bHTqG~X*^jyMq^L253p(2 z=tH~;$)LF(!ny%;RNM`uf@d&P28HrXDyWaf+IT-rKf|iA!SvD@>{AV)&)vH`AF&jB zC{{z9H{ofNgom5ZlEx-we8ftq!;IlH^CLDyeZUw&S3Y7jaB?8&W6a@E#%T9`jC()U z7#F_B<7`PCkKV@kEb|j=6sr#!6R5y>ET|8`h=*zNc~~``j-O}y)QQFR$R6bOVS;k{@;TD^sKaLV+)8TQf z6Yctm>1+T+WRZTTJX2vO1< zmY_amtfaz!psK4vhtuw%>3=ZYS*3N0glCQC=<;8no;S8okK1gN zy4Bc5@7`wJ*eWV<2g+VBwo~IftW)t-D5OVZORBxnLFu9Nu-R5Tvu`tY(9S!oC)-K( zUDnIlW$ea46js%NRmDRWhd80$>+)MF&RiIKv?plyT~zu-9PaoF$+2G~B0SA_S(`6_ zGNJT(*7Ehdg8GV)wfqEcrM_zHr6P7fPyeRw-+oQ)(FJm72x{%*VTT zxvH3o@df=E;N{ed#wAL1cxQGwH15#>n(>11C0%lOI{PZLyGtQ;oAEWZ&xPA>Xht*9 zk*^rv(p~|4M}gd^$M=+$mlraBFyN!qWJ=GA-C@ejORy_=OV3l(tHw3Dl$-Zq*WLRc zjT`R$%}~~~GTgv9j6A%Lddv8UipTK=-1wR1=jAERFUGIvhnpB{3u#<_79YB}QKK=? z&VG{#)ZdLi!a4q=zHvD6Wc;O1r8#kYoMzlM?$BRxyr*W|H5DPH(DZz~rOHfBNAvL} zI7r0v(fJy9TXr?bbE_JLYt8(;zp9%C4fqL<7#XQ}H8Zw4x9R=-ILKnsSNSnmEz_pT z1yK0_of^vu>L1^|V>-050B@}3GIP_}0=&JM$IJ`Er_#j&ytNr;;>?J$(Y?uU7QoFB z_okqUM;zsfxaq)I9;#AM{H{jR9h{tCj#WW1B;7tili zOPZzVISAOsydDqp%9trsrx46b75ljba)}9SmNmNNV*F3MD$m!iP-tC-L4Aw!_IOL)DGi;_lHMwg5!Z^6rm$khi>le$ zY(sTR@V?j;eyRk2z-*_On74OBX~j!Yg+yLdZEtpZ zs(sCVf-EamHiw%%#k!i+yCl!0>ix|Oa{!Gj!{@Pqp|mHl54Kx12buQ+teL`h>4VK7 z5U-^0b~uYsJC&ExhoPT_(|}ZXtOw|DDo-~@;QUscIg-*6cr|KUmY2{+nWK?wOj$k} zXZU!2`mroJek|222g`aR|2T6D^)JWkVDXmk^~E7XI$4fu>VxJ4`lKB1z#hUO$^ulU zJTL4#Y)-`RGjSEeSmC8Zl|D4Y2_Yz&M2pK~;yz+droH8PEv)c2%k%PTC-YG%QGwUe zry|WX>Ro}Sn3?8uba;Q-U!GUfX8@l`hb!>P`Yf#(D-lXNGnNKdiRGef7IF3in^ za&MiRi)0$5l(X7=8Y6lghHhEHW<@JZ6fxGEwI(o$|LWrF>C&Tk10@=0gSnA*RfX0~ zCiefULfPg}qq#*j^I7vbx=@Xm30=Hm(DG`$LhR=e2EqS zqs;2ALn~lDhNQ2US@c^C^xdmer6$gb0n?r^_foH#ysiBjDz+V#tn-3NgA!|D-~2uSUwW@`x9&p>|pm_)>#Y6FTlwOOMr*CWVV(f5;A^y=gOn3vXGO;#V z{7v&M8UVq3+k6LEs*+WQS7t}(KTF2I7}~(Y&OWrB(I$Bl4_SumOKtoIs`X4S1g-mz9aK z^BO8ml?PGR3Ccu8bx&(`X^4Wq)RxnUhJ3jC70#g6Ys4?=Uz^`RU1DQCRjA8a-%=9>%pdI)9>7KXisTG<(uLDd-q-(Y$b931EpQYae+I{_#^B} z)}-cqFlSd0Y8DJFNK2qRE%`L{8jkucZpoMB73Z(_C@;bdUWLJ9l3I^dmhLd z(~6H{ao5csS)4l^pFo-wG@v6dmsO+MarU(ykudqOAM)F{Hd$H@f9cvdW&Vn82%kPkqjN}L{saWa5D3TBo10fKUej>& zpxqEG;24!wJ}bW)f;Dc4bBWi6V7wI&-D(x2yhC{xb4U0U>H|YDGc?*al-K*4Be8XI z9Q^4xjrSENU9Ed?()Igcysfz#H$f|&>J7)LSx6jrNKp%0MQGh{-uWL-%T}f-58yEE zOUPRkr#EnHyQ9vht5zQR{sF#+B_L`pPOptX)KW|Y(3Ch5(ME9*&(H!PmH>)gOSF>c z&yjqb8fPWbm{Gi^cui}Sq~oJ_E2or_hW-*ixr7@oAwCm`r*5NpXEI0f!l4T-4SIJp ziYOCejSCoB0*pza%47Iy94Z$jeL04APAIF4iL5-$psTeq%I*JhDEq##{9(0#Ri54- zi@6v1Xa&1D&rpYPyk_MJ>`Nt8$t~7wrj)hBZCUR&Mc$@FkDcqA>BVup9FCKoAIF=h z6>)4Mc|1=~sHAj_jI4S}eR$EPHgAX?$JZmYXgu#`*MQ zd2!(1s-QoE8i-hXXeg~}DVp^Vud3FtYSOC@{ZHoPfQKL$@a3u|Uk;hL2!*jG4VVVkd5A-+}o$bYU`2@SU1Z3qv<@%;lTt%<%E~RQhNN zPsn>6F5-ebLoc3o&UkTz8CpLiu%aHbtjLtF|0w2v%-n85?>>sD^|wyIq9Rkl#ZG<` z$Kuh-8ZDj6i-vx@X3};f`5RwQLXs_qfy{myP&kFWVW)u2mhtve1Hm{q*lz}gVKWTFxij#r-CUl7 zQ`cZ=U^8*wLX5Xu*1eX2YP3Tod(hH>{Jw;i|1|DeVch*VGrB~yR=UfHECQi)r4!bY z?sAF1M3$dtq|&Y#2taoX!XxAMSr~zB@C1Hj79S}GAA~YXFPaqBf#q|*Mfj(YSd$)k z97{;-_Zz<9=pJ;H!!bZLXJbTo2VLc26Z>sPc(L&f(2@6H1XP-XZ0;KLlURdFQ=YC^ z3d`MxbEl>py?Q@dIwxjrIy;Bo`}f20->gm11FA2~#dGct20qTn_UXpLxmb9z4@rEm z@ef0C!n}VPlJCspMgBiVV`sIk)sDI^;9d3hN~+a?b}!(iO+1uZ9dYpW+yefv3~kC- z>C|f>!hufKeYABUBIeGDN}UpT0cxDUOHtoN==d&HSE{sxCsFUE@OD?1V2fqPBHqO5 zW_8E76MF=w#L4`kbkAaJW%RIm3Qc8c{bG*eX>@lnwg!7yy@iU$Xu=|B?KlxlbYTfr z{#h`npYa&gUCO6dJ)&CutqfK}#IeZ)M(C#w$Am#Q{s>Ta=z8n7AVD5(-!4f|L^C z<;+j4K`?nYoec5r+``8S_*_c;+!{>BLi{1~tc7ETdMUy7ik?G#{YlE@EE+f;4)|*{N-pU{k>?cgL`xhOhj*PuMLSAGjXJUlmN*tG z!6Y0EM@s6*D!M0R)hpr?DX!$BZ)HN9kCmkrO=tDxDOg9i1Dt|IJx@}DPOMVJe9Tbf zu?ppHmQHIlhSV4hPfA=wNJ(_KE?y?SFbIz_f9WiLoHZ8wIPG8Hn!=(`3_p7n2D@gB zr}eA&AQp32)|7{3tp};nYCMFxXJjSzs5OC}SdHiRX(H4tqv_)Fte;k6-SAGsc6ge% z6DKs~Y1j=<^QPu>+=$b#KRnI5nK%uLFM|7vljs@TdPp92%_|PD;z%qk)Nu`@#@%sr zxx_knoI7iHyn{osfP=VRqr|m*fP=%b;j~ZFg0bc>DG*_dRzEw zOrL4ZvL2(`FYv1PE_nA2o~Wi-vt6O8HOCdIS$IbzsOr{SSEymlbA_7Ld{?MtEsz2p zD8_B$$!Z;IkxP`fu<0i?2Dtd*`%(^@43eBRJ$J4&r>J?#>8tTnDs-dgJl6|HqbNG7%e-#epl(^#Qf z8?234cXn`M`X+0mT4lvfo|g6gE`C2#p8->K4?oBB&9L!V*T&~uU1`?yu29w5;tJKQ zt*%hr+U5#1tQTCNrnTJ_YFRs6p|-Wt73x^Kq<};0r(S~j6|FtuKAD4)$qjm zs^y6b)PO4%($riYxJb?8iHohh5aZrKVN0ynJaMVD&r9$mta+Vwy@n?}81uSo*9sUD z7750L#iw9QSX>EX!s03z^ExH&g96wR2A_s8VQ~$N35#oC%tIY+Tn}Sjr?Ic| z_@3$3er1jfG~BfuFVXIZIieI&v;o!u>!9SYccS2ma@Ha1u*Y=**C~c$?X5SgH|ZkO zH+ai>+j`SgF#yRb$0W1fv5t6Lk8B*f*Lv4FNErusL92p-@0{PmUHX1rUO#HRZylrQ z`+0oQQe}yC+|@0n_2?Mg+9K-%>jbSo$b-eTwbn`NgqsduawuhD({-k+`+3m@>#b8> zl1fMtTN`bYb=u=*fGZoDeY5o;iitbKgNCvkCZ7=|$Jcui4R_`r8tx-BT$sz=aLO9% zWBT9#lwmPkZ+#-E+N&pNnRS?^zM8^!eYnl3oeT6Xvovk6szg6Xvovk6s1M^SNlA z_?}-_Z>#u1Kn$`R1K})=;e@&D13~X#?N{*)67q?x;#XvR>K)Z_*ulK9p9eL)lh%<| z9YS+`tjwX4V%!u`SZnJO_b#a6d-zZ3`XOFXU&(*7&QaoFULJ2C+8yRalJ!g0dFz5} zTyc~VJ4*Ghtc%tKYJ3H~qJL{$@?`6>^`-R{9XgC@{j@6; zIhDq-`F^&3v3{cUZ}9l;zgoZjW3u0^KP+r%3KgQ|r^TxH%ewtfMH>%UcPP)B@ITgF zTcK%?D%#BED$b$^U6XJ<9HYxtZO!8z1vi$8zR6P(jmL3Dr=Oce{27{Zkt`JyV~K6i zD{u0ONwyvEI;S@h&5a}~q}Y!2K3gcfLC~;s*}3gJl=v26*SvNd?GQayK{1Ef`Ka4l z(39UTpq_UNn+83zV)YcX@3DiF{ywtsu6Dd#hz>zdQenG@UDVCe1X+AN^PG}mC%C@* zc_q~ow8rv8-Lr z6U*BbJh7r($rX#@m5@vdYIb!`tYO!Lm~jNB8p7%7*mXU!o?YJ)8`upYo{UM? z#BS=5&Fto$*uuUSV&iwC`dZsW73VY z$9v?1_5@FS$bJ~&#iP6kcSmNt{)j!<6Q|gZdg4@jnkyE?Yc!1DczuRF(<5iuk9p$b z_H2lU-iLwVbaU-_9y#A$;E46y@FZ0Nd{iG)@w^u-1ACqpSy~-n3+fRGq z8hb6oxZ_cM8|;l9xygRU6F1w>LYy9xZi~IuBe&Tvc;a?@2gDmO>2}+DJn}{RB~N_W zeg$I22hno(+OK)!KKpe~+;1O%crqs4Vfzh_eA9l*6W_Mqf!O#&RNs5{QICAzKIVzX z?GGUCib;3MKJAeo+GjlRBl}~Bi6^7_KC?gf$S>@(o_Nka4{=FMx=Z$DkNnd9$`ik~ zzp;ZWPDRyyZ~x$NSL~~vc+I{JacoSwoA$pv@|OLRC;n{z0`X!@y5H?TJn~QbFHgK} z-x1Z;E_%smnY^9GP|f&3m>AW+Z~ z?+FAUu8&DqI8ekRiv|)ru~?uu#JDq2eMy02k1QD|g*E)f8CYF9P{tEe0;!%@Hc-wJ z%LgiWV#PouS1gK6Dw#ViP}L)=1*&^ujX+I^86TnSaJo8yx*l0CP~Q_91R6p-8I!I_ zps7bT3pDq{7J+*qHvTxOuXUh}N45>L^ThUn4iI<6r0W#8&m%hrx_DyOKsShqpG5Wb z4D|BI-hn=z*f-D*;*ywj0|Em*a!}xYPaGT=VtuvZ)2O=Pfd@QpL|~*RjtY#1I5sBT zxWIUid@wM<6CVmZjA-kkNO!?)=0^gP15@15^JrkICr%4wdgAoJ3{RXHnB|F&1s?ar z*?~Di{0ut7isl98d*p(^LQh;2SPZes=h1Y_0wIrlGO*keR|E*+`j~X90;@gp>A)IK zTpL&iG46|~zKwxR9{EgQvnM_qcn;$9m~>kM+dT4xz;;jE5!eawMohXrffqgUrNGOc z_(~uPV#e8MxvvHGdF1PX{hoLra1i3jm~?Lh-t@?~0&jcbJAoq*8=s5nI~sW3Baa1+ zd*TOy6M>U%Pn`;!_QVeZXFTzvz{j5WN#Ik6iRYm+oaKwaS&uvyIPZxU0v91JiAncm z;46>(I`EArejE5MaB{_ksJbhGs~&ePaNQGs4BUV?HYVMzz)v3ebKnPeO-)Z2H4V^}w z*w|?T@nlT8=1vQbyw_>ziLIR05F39L)z{8x?~xsxj-HtAbb`1mCS4b&t4DTox_e>| zrzgb3ucP|&%0AC??%PXOTxPc9wYJQfC>&D&Ix*Eq7LUBsouc;!0-~#Pu=h);McDa-Fl@ z6E`>;h4_6`-)84ok9^K~-V?VtTOm%5Nw?kE;gLI?U7onx*#q%LOuCnyS3EMydDRp5 zIKk9&`?Q;$i0vh$lt5x5YDmy#9`J#Bs$E?>g@}Z@W)}*>?$?qt5%{ ziLE_(7ezURM6nwj&N)W} zn9^Zga4ve{B}WFC!i|0D$RJaQUpojg-L&62!pmNR*YO z;R-4{9NSu0FVeYI)GxLAMrWpm;VGzlDbBxPo?m zX$D009R6`PMnq|ABc*Kx?(Ulc*DFF@?i+6FunnNZkJ!^`h%3l1%4`B}j4OiMs>IQn zOw?ZP0pWL$or~ajm#sX4OY~LHx+`#DA`@dp>?cjc6||YeA(oSWWZ2zk5`->^KeA_F zonh~B*ek{Y!>cuR44EIsCF}^Q1wr2q(_Fl16h9NfS5OtTt$5ST&BY7At3Emix^I}q zm(mI!;iKz;UIBye5>muR_&o=h9vj2dhQA%;_g2w<+exQgD3!C#R$j8pvv zeJu-Ej{w)Ag!c((Kyj6(4n$RG~wMVsy&nL*&I zV{zx2hs)Chk@WT>5=T;facug)yODzZ_#uHa%m6LZSFrPAgzyz?lZR(3c!tCu%TWPo z5EHmhPaw%l@9D`5Pp1-s;A7BdReUulCh?Ow@S+mO)XO#)3kzKB4jtkr(n5jw2<{(@ znfFMdnL8R|G8Bm5{=t|};9L~!AB@sLscAV3eN^h{k;Bm35`R_nzxat-YP$q5zon+c zpUGjUTwPRw`wf-LnkowR8!DG6F*9UKXGRLP<+`Ts&2FiETNJDnmS)BnYX2F*eTLe< zOB|<3{C>s$HG;<&nu+Q6vmj)_eoGyR-^$UX)1)HI;cR_BUE;!9il0cu0y87H&(Oe2 zz%v#6t@vz~2KLAd0*|p2{$Q8HMZtbUW!$B8$zkXVGX0bshHjPk7s5)>|4~byj}U%K zpOyHL9ELs@B7&j7X|wbMTm?~D}eGt}NL@lUfEni;gWN#bq}OScHzXq%(p=Omut)gV%V%@ThhM+M}= zfpIuT`VAs|rYyi;gLQ(?g+cxrtdRxO$yS4){i4J(a#Uco#9>gjF1`}MpAz%0f20P> zBZ~Y5ha|o#N5M-aj+*&rjlDR6`}HgoxQXYdXcwb=c){2+6aJiCG>VEg0nl?UhaqVbLsEY;3_Vdl|A7oF#DMPipcPKED!KlkwLTcmeSg zVZ!`u9VSCevrmq8lOd@nHCwyM5LV*;c5@?45gfegYo1HO8jj$AUcAHe6~m2Ofc=SN z7^*I#OR!TW5etex$!9{3)`jxjb(3hqL;90^B$DVsY7$N&XS_ejDVgL`8iypJK@2fc z{Yj3CB!(DBe*Arj|Cs}SPvEiv{ppVgTtrJ+V_$>3Epar+a#hVIY!K~{EzMz(My&tY z@PiUZ<7C743tTL2+3?a6#a*72l0*MeI5OXJ5mpaz0#!cp_TYxA|~6 zJb@@id@P>n6Bc(~?+${+z1I5NmnC95ml2&4D zDzF%vPRXG6hiP?C4BcGNHbw$n11)yUWF67KN^e{>1#P*{jUzB9P#t+}sevLhBd+m+R`5(fqr$Xo&lP~%<4P5@S{n44FwIs2nvN? z`gWK$#I$?@7Xl`w9j>6-8gxa&?JPDEmR|wfCVT~*FGO?5Y##$_g)0SDP?O<|7?1cO zM4W7Oub?&n>J~zs+%8;#v8;j;qb31YQ0W1Bf0)Kcr;6DEu(%+@m~No2dAXgiaxti? zNE#6W6*FC16(~1_olS9x@`I|JY(h4{MRB{ZsDt=1_u-!=xa1H}r$F6Qs1vrT9niCX zfoc>^5>!Q1wtMskVH&YD{xr8JO;qJvm=-Qa&XEYse*&G`a+T{(W~bRm&<#BLL(p)j zQn9PNE$C5UTEh~mW8BBkO+c>!Emu!iZV0O}#_^FhOmk$&$1eaMi+eF$s!M#OoC|5d z#VCs6%Om(HA5I>QznB%9UWS?+dNNI6ZdB1?k%4tWOA9v>#WN+oFb6(g;_v0a=Sm!H zZeWDP=$RA2f0KBoSF^_@AqpPl%OGP)#fJCdX!QR*QlqzRQQN5x6Y)tPfu& zadb_#(Y`_AqF{geO>$#Y?VF?E&9Y#D`wM9ZpEY!`1Bb}V}(Q5YFs z_hr~8aX6@KiuSuWCFNG-zv3ut=g0#NPu8M}erX7;-Tq2jKBA&W7-FH0W~eN1^&=Q`z=x+ra9@7~ zs!3do+;4p8YY1G7P!oLs{hpf()RBZ3qCUSHs3&m@Q8U4(s6j-LSh=HyHj=oG^bh)Q ztScxOE2JOK3^a>mfK@SyT0}DV@s-VdIn4UmJgS1u9F~ij8K0Dr=P?}08fimWXnOS3w)>#m$OC_1^WiC z?K*r>uph_lK>4y@KOv`w5k!X6*a94cHo&k5_;Fj#4r3m4`MioPXNSbYUd44PwwxVC zSESGMc@&Ki^FC|J%KiTet6%E^{H9xXWRUNci8gs))rpum-8810{hyFkqUpi@TRrjgws z=RS!y%x;iVDT4b9vc8tMO-Th@C(Pc1d*~7_3eQ4#{<-WXfl8lgPHl-JIQNeNr@F*j zK9w#Os9h&^yfehjwPJ*2<{K- zD@5>9zVtOcJX@esDuVk~7h5`QJrf1{mj!!FB!kcU+v5bTwTGd{Vhgq(lz2YizID)k zNaAy|r*{fV{B0MHi8Y-rf)M{(EPnwGo*#k3`fNC!)m($bq>C;`PA`Fr1zY?b%ox0n z#Nqu-R3eNEC+uVhLj0`)Gb2I(S7kWPrvk^gkQwUXchJE`3epRFUu=5kep!H6rtb6M zLnPie2R_WXiN#bbFWD@8KxEL+bpD#zask%RblLC`BE8NiU%We`MPp@4BEu)qdnWc` zVj2azKHB7ZTd6Fl~2~)SFk-i zQg@%Bwp{CF-F>)I+^u`0V&06lWzZm7!k598!GUav(Y~6w!GRby{t8561Jo|sa&{y( z@TbqTWpKcMhN1($3^F(nd#2fN8Ntfl_8a5|4WhSwxP!ePcb@oh>t~5)ioW+Ubc6vx z-F|!>F?yg*U5sR*F1ER;gsk$)XCQ~XjeuFF|sEJS*^ zCz)Q>&5&Ira1-^G`29kUUPbCD3cP<9m&GfiycVWVQ8l0Jo=)LJRgqBCA!uPk69xSq zHm(Y=#uEQk;9^Tqwtoaye?y(F6?I#XC5E#hmUVX%b;KW3EFruJ`3XE`Nl=x-S5R9o zOG8tbDPas2DM3TVOX2~|5G^XwizkgB$7rRgVRdF%WGe!=A}-NqK|@ByX0@=90>?xE zE+b%xufcr;cRq)@b5JMt33YV8Tz<3ENJRqo7cg7mq8r6p88v9Rzzs1fCj0OgCH^?@MX`9M^Qj=%4*;i!iBk9-wC2hT zoseN$73L4#Tih_%%kA~#PAPV z+huwY7!Rj zjZ8lxdwT0>=O&zyc?wsfSVfj=DMqM?+C>dgponfKx|3RF6GNa3E;&2Zx}Ym2g(vkR z$Sr(XXad?X7B*2`3COAC_@#1zawz*dQaoAxGJMKd9V<9WcrdKz5Z1seT&%i zT!xS0JySXP_E!`jAN=%hBN?9XWkBFS*I=)3VdipN?|>F%h$;mYJOfd&eqtiN*>#?+V&^z8$8`Pe6a^qcLcyVySQ^T!d+xV`&A; z67>z!@`cjkSX#xy6D{;;EM9USzc7-BE66c~Xn&aI=v`TFxEyz2s2udQFs)+33hR|9 zt${99+BHoDrGMe0P0;N<`d>L{2lUi1ZDLf)04S=wGU)9djRws|*9LvgQ+_=MEqW|> z8P_x|F$XRCJ4~}4pg;3jUJbcNc{GMYHo6ArHDOwZ50j004>XA3802uEbll4guO)Lw zX#}ZsJ52LwnDH=AiPG?nR58W1T+$gn8s4A!dUPQu7lSF9djsf&9xWQxPj3RfKTK6%9m%|XMjQnA!udQA*1{)Ak# zZ2mIn|CJxdh~t-cj>Xp)eE2(#?oTNi!=-0 z3wnPneKMBT5QAN5fT$>F#Os*RjmRII#9s~D*YTmWy1-@*k2)dis2hiUx{ zKo7xs5tD=@Jq`5KnA{9Ag)N1KWJ%`*y**3=kYDkz84!LJG#d~4Tnw!Wzd8YwRL&m< zox6f-8o!EW86Qilb3r!<)5bGUo(8%Ta#t0~)u%v@ilyg*ZVBpsNq-1>O$;qQ*pc*L zLGyy3kB4ahiufFciPf~1pp`tJZ-;5|r*Snbhf!MX1G-|xXq)SsK*Q}Z5j+LC1-fsT zW^mH_kD!7PS}0!#Iy2m3A~0cM`InZnvQ8M+I>+MrN)I>Db<9M1I6XW~rVE^-QM8f3 z0f`GCLEuhzc7LBjAM%lSzbF)WeqanFCx}{vg zCFW|-E+%oLm+PZgX)qe0?jsL3^5FhsT$Kc_cNDl*3#;(~+@HoZUEo@0iNi%uwJL7o z>rVDW&RN*lw+g~4VWW;RMeoVt=n%6p?vLVHBye+>z?lvFI_}@al~>@( zOHj8T>O@!T`EhLn{3fo+f>yr=ea)jkgfS_Ah1H8C{UzvPY2n=YP(TO3J8^Z9^lZ@W z!?Y^eZ3p1>xY|p4FzBfsEt*?2>pEQJB>fKP?O|FxNf^Tcuf_GYq{T2h2U;|QF3SEE z@M>Jm1R?xplWzvErKz^lPrnClbt5(FuijJ09yMV6 zi2f6Xj~=S%BL@thJY3O-j;l4QI^FEAmM9?Q8rVdv-hX(Fku@RIpc(zuqLiGW=BLvG zRFp9~txEq%!-oyXx;j9;kvA!>@}M!J#*P_1c=UwIg9ePhzcSuWLSgNi;or6BR138L zwaHMOth3|rh712E*(ax}?R9PF_yLd5(za?rnvtQFr*EdJsd=k;XW-sm6pfC9eJ0{tpfw UIi$ZZrT^%`6SGn`sn3`Ae;X1L`v3p{