From 0756dd9560153427e2239bde0de0dd641968d730 Mon Sep 17 00:00:00 2001 From: 18401019693 Date: Thu, 21 Sep 2023 17:58:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=B8=E6=88=8F=E6=88=BF=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/CustomDrawerPopupAdapter.java | 9 +- .../adapter/InteractionGamesAdapter.java | 64 +++++++ .../adapter/LiveNewRoleFunGamesAdapter.java | 64 +++++++ .../LiveNewRoleInteractionGamesAdapter.java | 63 +++++++ .../adapter/LiveNewRolerPopupAdapter.java | 101 +++++++++++ .../adapter/NewRoleFunGamesAdapter.java | 64 +++++++ .../common/dialog/LiveNewRolePopup.java | 83 +++++++++ .../common/event/CustomDrawerPopupEvent.java | 20 +++ .../yunbao/common/event/LiveNewRoleEvent.java | 4 + .../event/NewRoleCustomDrawerPopupEvent.java | 168 ++++++++++++++++++ .../com/yunbao/common/http/PDLiveApi.java | 2 +- .../common/http/live/LiveNetManager.java | 28 ++- .../common/sud/QuickStartGameViewModel.java | 86 ++++++--- .../yunbao/common/sud/QuickStartUtils.java | 13 +- .../common/views/CustomDrawerPopupView.java | 9 +- .../InteractionGamesChildViewHolder.java | 56 ++++++ .../views/InteractionGamesViewHolder.java | 63 +++++++ .../views/LiveNewRoleFunGamesViewHolder.java | 65 +++++++ ...LiveNewRoleInteractionGamesViewHolder.java | 44 +++++ .../LiveNewRoleRigtsInterestsViewHolder.java | 56 ++++++ .../yunbao/common/views/LiveSudGamePopup.java | 85 +++++++++ .../views/NewRoleFunGamesChildViewHolder.java | 87 +++++++++ .../res/layout/dialog_live_new_function.xml | 32 ++++ .../main/res/layout/dialog_live_new_role.xml | 14 ++ .../main/res/layout/dialog_live_sud_game.xml | 11 ++ .../layout/view_interaction_games_view.xml | 63 +++++++ ...iew_live_new_role_fun_games_child_view.xml | 26 +++ ...ew_live_new_role_fun_games_child_view2.xml | 26 +++ ...w_live_new_role_interaction_games_view.xml | 32 ++++ .../view_live_new_roler_ights_interests.xml | 27 +++ .../layout/view_new_roler_fun_games_view.xml | 53 ++++++ config.gradle | 6 +- .../live/activity/LiveAudienceActivity.java | 64 ++++++- .../live/views/LiveAudienceViewHolder.java | 18 +- live/src/main/res/layout/dialog_live_role.xml | 8 +- .../main/res/layout/view_live_audience.xml | 1 + .../res/mipmap-xxxhdpi/icon_privilege.png | Bin 14476 -> 4558 bytes 37 files changed, 1559 insertions(+), 56 deletions(-) create mode 100644 common/src/main/java/com/yunbao/common/adapter/InteractionGamesAdapter.java create mode 100644 common/src/main/java/com/yunbao/common/adapter/LiveNewRoleFunGamesAdapter.java create mode 100644 common/src/main/java/com/yunbao/common/adapter/LiveNewRoleInteractionGamesAdapter.java create mode 100644 common/src/main/java/com/yunbao/common/adapter/LiveNewRolerPopupAdapter.java create mode 100644 common/src/main/java/com/yunbao/common/adapter/NewRoleFunGamesAdapter.java create mode 100644 common/src/main/java/com/yunbao/common/dialog/LiveNewRolePopup.java create mode 100644 common/src/main/java/com/yunbao/common/event/LiveNewRoleEvent.java create mode 100644 common/src/main/java/com/yunbao/common/event/NewRoleCustomDrawerPopupEvent.java create mode 100644 common/src/main/java/com/yunbao/common/views/InteractionGamesChildViewHolder.java create mode 100644 common/src/main/java/com/yunbao/common/views/InteractionGamesViewHolder.java create mode 100644 common/src/main/java/com/yunbao/common/views/LiveNewRoleFunGamesViewHolder.java create mode 100644 common/src/main/java/com/yunbao/common/views/LiveNewRoleInteractionGamesViewHolder.java create mode 100644 common/src/main/java/com/yunbao/common/views/LiveNewRoleRigtsInterestsViewHolder.java create mode 100644 common/src/main/java/com/yunbao/common/views/LiveSudGamePopup.java create mode 100644 common/src/main/java/com/yunbao/common/views/NewRoleFunGamesChildViewHolder.java create mode 100644 common/src/main/res/layout/dialog_live_new_role.xml create mode 100644 common/src/main/res/layout/dialog_live_sud_game.xml create mode 100644 common/src/main/res/layout/view_interaction_games_view.xml create mode 100644 common/src/main/res/layout/view_live_new_role_fun_games_child_view.xml create mode 100644 common/src/main/res/layout/view_live_new_role_fun_games_child_view2.xml create mode 100644 common/src/main/res/layout/view_live_new_role_interaction_games_view.xml create mode 100644 common/src/main/res/layout/view_live_new_roler_ights_interests.xml create mode 100644 common/src/main/res/layout/view_new_roler_fun_games_view.xml diff --git a/common/src/main/java/com/yunbao/common/adapter/CustomDrawerPopupAdapter.java b/common/src/main/java/com/yunbao/common/adapter/CustomDrawerPopupAdapter.java index 3f0c434c1..918d6de18 100644 --- a/common/src/main/java/com/yunbao/common/adapter/CustomDrawerPopupAdapter.java +++ b/common/src/main/java/com/yunbao/common/adapter/CustomDrawerPopupAdapter.java @@ -19,6 +19,7 @@ import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.views.DrawerRecommendViewHolder; import com.yunbao.common.views.DrawerTaskViewHolder; import com.yunbao.common.views.FunGamesViewHolder; +import com.yunbao.common.views.InteractionGamesViewHolder; import com.yunbao.common.views.RecommendViewHolder; import com.yunbao.common.views.RigtsInterestsViewHolder; @@ -72,9 +73,12 @@ public class CustomDrawerPopupAdapter extends RecyclerView.Adapter { case RIGHTS_INTERESTS: View rightsInterestsView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_rights_interests, parent, false); return new RigtsInterestsViewHolder(rightsInterestsView); - default: + case RECOMMEND: View recommendView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_recommend, parent, false); return new RecommendViewHolder(recommendView); + default: + View gamesView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_interaction_games_view, parent, false); + return new InteractionGamesViewHolder(gamesView); } } @@ -92,6 +96,9 @@ public class CustomDrawerPopupAdapter extends RecyclerView.Adapter { } else if (holder instanceof RigtsInterestsViewHolder) { RigtsInterestsViewHolder rigtsInterestsViewHolder = (RigtsInterestsViewHolder) holder; rigtsInterestsViewHolder.setData(infoModels.get(position)); + } else if (holder instanceof InteractionGamesViewHolder) { + InteractionGamesViewHolder interactionGamesViewHolder = (InteractionGamesViewHolder) holder; + interactionGamesViewHolder.setData(infoModels.get(position)); } else if (holder instanceof RecommendViewHolder) { RecommendViewHolder recommendViewHolder = (RecommendViewHolder) holder; diff --git a/common/src/main/java/com/yunbao/common/adapter/InteractionGamesAdapter.java b/common/src/main/java/com/yunbao/common/adapter/InteractionGamesAdapter.java new file mode 100644 index 000000000..3aa7909bc --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/InteractionGamesAdapter.java @@ -0,0 +1,64 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.CustomSidebarChildModel; +import com.yunbao.common.views.FunGamesChildViewHolder; +import com.yunbao.common.views.InteractionGamesChildViewHolder; + +import java.util.ArrayList; +import java.util.List; + +public class InteractionGamesAdapter extends RecyclerView.Adapter { + private Context mContext; + private boolean rigts; + private List child = new ArrayList<>(); + + public InteractionGamesAdapter(Context mContext, boolean rigts) { + this.mContext = mContext; + this.rigts = rigts; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View runGamesView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_fun_games_child_view, parent, false); + return new InteractionGamesChildViewHolder(runGamesView); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + InteractionGamesChildViewHolder childViewHolder = (InteractionGamesChildViewHolder) holder; + childViewHolder.setData(child.get(position), rigts); + } + + @Override + public int getItemCount() { + return child.size(); + } + + public void updateData(List mChild) { + child.clear(); + if (mChild.size() > 8) { + for (int i = 0; i < 8; i++) { + child.add(mChild.get(i)); + } + } else { + child.addAll(mChild); + } + notifyDataSetChanged(); + } + + public void selectAll(List mChild){ + child.clear(); + child.addAll(mChild); + notifyDataSetChanged(); + } +} diff --git a/common/src/main/java/com/yunbao/common/adapter/LiveNewRoleFunGamesAdapter.java b/common/src/main/java/com/yunbao/common/adapter/LiveNewRoleFunGamesAdapter.java new file mode 100644 index 000000000..17cb37cf3 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/LiveNewRoleFunGamesAdapter.java @@ -0,0 +1,64 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.CustomSidebarChildModel; +import com.yunbao.common.views.FunGamesChildViewHolder; +import com.yunbao.common.views.NewRoleFunGamesChildViewHolder; + +import java.util.ArrayList; +import java.util.List; + +public class LiveNewRoleFunGamesAdapter extends RecyclerView.Adapter { + private Context mContext; + private boolean rigts; + private List child = new ArrayList<>(); + + public LiveNewRoleFunGamesAdapter(Context mContext, boolean rigts) { + this.mContext = mContext; + this.rigts = rigts; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View runGamesView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_live_new_role_fun_games_child_view, parent, false); + return new NewRoleFunGamesChildViewHolder(runGamesView); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + NewRoleFunGamesChildViewHolder childViewHolder = (NewRoleFunGamesChildViewHolder) holder; + childViewHolder.setData(child.get(position), rigts); + } + + @Override + public int getItemCount() { + return child.size(); + } + + public void updateData(List mChild) { + child.clear(); + if (mChild.size() > 8) { + for (int i = 0; i < 8; i++) { + child.add(mChild.get(i)); + } + } else { + child.addAll(mChild); + } + notifyDataSetChanged(); + } + + public void selectAll(List mChild) { + child.clear(); + child.addAll(mChild); + notifyDataSetChanged(); + } +} diff --git a/common/src/main/java/com/yunbao/common/adapter/LiveNewRoleInteractionGamesAdapter.java b/common/src/main/java/com/yunbao/common/adapter/LiveNewRoleInteractionGamesAdapter.java new file mode 100644 index 000000000..7ae09c10c --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/LiveNewRoleInteractionGamesAdapter.java @@ -0,0 +1,63 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.CustomSidebarChildModel; +import com.yunbao.common.views.InteractionGamesChildViewHolder; + +import java.util.ArrayList; +import java.util.List; + +public class LiveNewRoleInteractionGamesAdapter extends RecyclerView.Adapter { + private Context mContext; + private boolean rigts; + private List child = new ArrayList<>(); + + public LiveNewRoleInteractionGamesAdapter(Context mContext, boolean rigts) { + this.mContext = mContext; + this.rigts = rigts; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View runGamesView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_live_new_role_fun_games_child_view, parent, false); + return new InteractionGamesChildViewHolder(runGamesView); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + InteractionGamesChildViewHolder childViewHolder = (InteractionGamesChildViewHolder) holder; + childViewHolder.setData(child.get(position), rigts); + } + + @Override + public int getItemCount() { + return child.size(); + } + + public void updateData(List mChild) { + child.clear(); + if (mChild.size() > 8) { + for (int i = 0; i < 8; i++) { + child.add(mChild.get(i)); + } + } else { + child.addAll(mChild); + } + notifyDataSetChanged(); + } + + public void selectAll(List mChild){ + child.clear(); + child.addAll(mChild); + notifyDataSetChanged(); + } +} diff --git a/common/src/main/java/com/yunbao/common/adapter/LiveNewRolerPopupAdapter.java b/common/src/main/java/com/yunbao/common/adapter/LiveNewRolerPopupAdapter.java new file mode 100644 index 000000000..67e49c60a --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/LiveNewRolerPopupAdapter.java @@ -0,0 +1,101 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.AnchorRecommendItemModel; +import com.yunbao.common.bean.CustomSidebarInfoModel; +import com.yunbao.common.views.LiveNewRoleFunGamesViewHolder; +import com.yunbao.common.views.LiveNewRoleInteractionGamesViewHolder; +import com.yunbao.common.views.LiveNewRoleRigtsInterestsViewHolder; + +import java.util.ArrayList; +import java.util.List; + +/** + * + */ +public class LiveNewRolerPopupAdapter extends RecyclerView.Adapter { + private Context mContext; + // "type": 1,//模块类型 1 充值送好礼类型2 任务中心类型 3趣味游戏类4 权益 ,5为你推荐 + private final int FUN_GAMES = 3; + private final int RIGHTS_INTERESTS = 4; + private List infoModels = new ArrayList<>(); + + public LiveNewRolerPopupAdapter(Context mContext) { + this.mContext = mContext; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + switch (viewType) { + case FUN_GAMES: + View runGamesView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_new_roler_fun_games_view, parent, false); + return new LiveNewRoleFunGamesViewHolder(runGamesView); + case RIGHTS_INTERESTS: + View rightsInterestsView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_live_new_roler_ights_interests, parent, false); + return new LiveNewRoleRigtsInterestsViewHolder(rightsInterestsView); + default: + View gamesView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_live_new_role_interaction_games_view, parent, false); + return new LiveNewRoleInteractionGamesViewHolder(gamesView); + } + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if (holder instanceof LiveNewRoleFunGamesViewHolder) { + LiveNewRoleFunGamesViewHolder funGamesViewHolder = (LiveNewRoleFunGamesViewHolder) holder; + funGamesViewHolder.setData(infoModels.get(position)); + } else if (holder instanceof LiveNewRoleRigtsInterestsViewHolder) { + LiveNewRoleRigtsInterestsViewHolder rigtsInterestsViewHolder = (LiveNewRoleRigtsInterestsViewHolder) holder; + rigtsInterestsViewHolder.setData(infoModels.get(position)); + } else if (holder instanceof LiveNewRoleInteractionGamesViewHolder) { + LiveNewRoleInteractionGamesViewHolder interactionGamesViewHolder = (LiveNewRoleInteractionGamesViewHolder) holder; + interactionGamesViewHolder.setData(infoModels.get(position)); + } + } + + @Override + public int getItemCount() { + return infoModels.size(); + } + + @Override + public int getItemViewType(int position) { + CustomSidebarInfoModel model = infoModels.get(position); + switch (model.getType()) { + + case "3": + return FUN_GAMES; + case "4": + return RIGHTS_INTERESTS; + + } + return super.getItemViewType(position); + + } + + public void updateData(List mInfoModels) { + infoModels.clear(); + infoModels.addAll(mInfoModels); + notifyDataSetChanged(); + } + + private CustomDrawerListener listener; + + public LiveNewRolerPopupAdapter setListener(CustomDrawerListener listener) { + this.listener = listener; + return this; + } + + public interface CustomDrawerListener { + void goToLive(AnchorRecommendItemModel model); + } +} diff --git a/common/src/main/java/com/yunbao/common/adapter/NewRoleFunGamesAdapter.java b/common/src/main/java/com/yunbao/common/adapter/NewRoleFunGamesAdapter.java new file mode 100644 index 000000000..f9a020e6b --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/NewRoleFunGamesAdapter.java @@ -0,0 +1,64 @@ +package com.yunbao.common.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.CustomSidebarChildModel; +import com.yunbao.common.views.NewRoleFunGamesChildViewHolder; + +import java.util.ArrayList; +import java.util.List; + +public class NewRoleFunGamesAdapter extends RecyclerView.Adapter { + private Context mContext; + + private List child = new ArrayList<>(); + private boolean rigts; + + public NewRoleFunGamesAdapter(Context mContext, boolean rigts) { + this.mContext = mContext; + this.rigts = rigts; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View runGamesView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_live_new_role_fun_games_child_view2, parent, false); + return new NewRoleFunGamesChildViewHolder(runGamesView); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + NewRoleFunGamesChildViewHolder childViewHolder = (NewRoleFunGamesChildViewHolder) holder; + childViewHolder.setData(child.get(position), rigts); + } + + @Override + public int getItemCount() { + return child.size(); + } + + public void updateData(List mChild) { + child.clear(); + if (mChild.size() > 8) { + for (int i = 0; i < 8; i++) { + child.add(mChild.get(i)); + } + } else { + child.addAll(mChild); + } + notifyDataSetChanged(); + } + + public void selectAll(List mChild) { + child.clear(); + child.addAll(mChild); + notifyDataSetChanged(); + } +} diff --git a/common/src/main/java/com/yunbao/common/dialog/LiveNewRolePopup.java b/common/src/main/java/com/yunbao/common/dialog/LiveNewRolePopup.java new file mode 100644 index 000000000..e09f5c337 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/dialog/LiveNewRolePopup.java @@ -0,0 +1,83 @@ +package com.yunbao.common.dialog; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.lxj.xpopup.core.BottomPopupView; +import com.yunbao.common.R; +import com.yunbao.common.adapter.LiveNewRolerPopupAdapter; +import com.yunbao.common.bean.CustomSidebarInfoModel; +import com.yunbao.common.event.LiveNewRoleEvent; +import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.utils.Bus; +import com.yunbao.common.utils.ToastUtil; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.List; + +public class LiveNewRolePopup extends BottomPopupView { + public LiveNewRolePopup(@NonNull Context context) { + super(context); + mContext = context; + } + + private RecyclerView drawerList; + private LiveNewRolerPopupAdapter adapter; + private Context mContext; + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.dialog_live_new_role; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + Bus.getOn(this); + initView(); + initDate(); + + } + + private void initDate() { + LiveNetManager.get(mContext) + .getCustomSidebarInfo("1", new com.yunbao.common.http.base.HttpCallback>() { + @Override + public void onSuccess(List data) { + adapter.updateData(data); + } + + @Override + public void onError(String error) { + ToastUtil.show(R.string.net_error); + } + }); + } + + private void initView() { + drawerList = findViewById(R.id.drawerList); + adapter = new LiveNewRolerPopupAdapter(mContext); + drawerList.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false)); + drawerList.setAdapter(adapter); + } + + @Override + protected void onDismiss() { + Bus.getOff(this); + + super.onDismiss(); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLiveNewRoleEvent(LiveNewRoleEvent event) { + dismiss(); + } + +} diff --git a/common/src/main/java/com/yunbao/common/event/CustomDrawerPopupEvent.java b/common/src/main/java/com/yunbao/common/event/CustomDrawerPopupEvent.java index 436161b05..1a1d138d9 100644 --- a/common/src/main/java/com/yunbao/common/event/CustomDrawerPopupEvent.java +++ b/common/src/main/java/com/yunbao/common/event/CustomDrawerPopupEvent.java @@ -28,6 +28,26 @@ public class CustomDrawerPopupEvent extends BaseModel { //畫質選擇 private boolean qualitySelection = false; private boolean fontSize = false; + private boolean interaction = false; + private long interactionID; + + public boolean isInteraction() { + return interaction; + } + + public CustomDrawerPopupEvent setInteraction(boolean interaction) { + this.interaction = interaction; + return this; + } + + public long getInteractionID() { + return interactionID; + } + + public CustomDrawerPopupEvent setInteractionID(long interactionID) { + this.interactionID = interactionID; + return this; + } public boolean isSmallWindow() { return smallWindow; diff --git a/common/src/main/java/com/yunbao/common/event/LiveNewRoleEvent.java b/common/src/main/java/com/yunbao/common/event/LiveNewRoleEvent.java new file mode 100644 index 000000000..a5e7acf36 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/LiveNewRoleEvent.java @@ -0,0 +1,4 @@ +package com.yunbao.common.event; + +public class LiveNewRoleEvent { +} diff --git a/common/src/main/java/com/yunbao/common/event/NewRoleCustomDrawerPopupEvent.java b/common/src/main/java/com/yunbao/common/event/NewRoleCustomDrawerPopupEvent.java new file mode 100644 index 000000000..7d78790dc --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/NewRoleCustomDrawerPopupEvent.java @@ -0,0 +1,168 @@ +package com.yunbao.common.event; + +import com.yunbao.common.bean.BaseModel; + +public class NewRoleCustomDrawerPopupEvent extends BaseModel { + //是否关闭弹窗 + private boolean isDisMiss = false; + //权益的名字 + private String rightsInterests = ""; + //活动的id + private int activityId = 0; + //跳转网页地址 + private String htmlUrl; + //是否半屏展示 + private boolean screen = false; + //系统消息 + private boolean systemNotice = false; + //在线客服 + private boolean online = false; + //举报 + private boolean reportLayout = false; + //刷新 + private boolean refresh = false; + //特效設置 + private boolean effects = false; + //小窗播放 + private boolean smallWindow = false; + //畫質選擇 + private boolean qualitySelection = false; + private boolean fontSize = false; + private boolean interaction = false; + private long interactionID; + + public boolean isInteraction() { + return interaction; + } + + public NewRoleCustomDrawerPopupEvent setInteraction(boolean interaction) { + this.interaction = interaction; + return this; + } + + public long getInteractionID() { + return interactionID; + } + + public NewRoleCustomDrawerPopupEvent setInteractionID(long interactionID) { + this.interactionID = interactionID; + return this; + } + + public boolean isSmallWindow() { + return smallWindow; + } + + public NewRoleCustomDrawerPopupEvent setSmallWindow(boolean smallWindow) { + this.smallWindow = smallWindow; + return this; + } + + public boolean isQualitySelection() { + return qualitySelection; + } + + public NewRoleCustomDrawerPopupEvent setQualitySelection(boolean qualitySelection) { + this.qualitySelection = qualitySelection; + return this; + } + + public boolean isRefresh() { + return refresh; + } + + public NewRoleCustomDrawerPopupEvent setRefresh(boolean refresh) { + this.refresh = refresh; + return this; + } + + public boolean isSystemNotice() { + return systemNotice; + } + + public NewRoleCustomDrawerPopupEvent setSystemNotice(boolean systemNotice) { + this.systemNotice = systemNotice; + return this; + } + + public boolean isOnline() { + return online; + } + + public NewRoleCustomDrawerPopupEvent setOnline(boolean online) { + this.online = online; + return this; + } + + public boolean isReportLayout() { + return reportLayout; + } + + public NewRoleCustomDrawerPopupEvent setReportLayout(boolean reportLayout) { + this.reportLayout = reportLayout; + return this; + } + + public String getHtmlUrl() { + return htmlUrl; + } + + public NewRoleCustomDrawerPopupEvent setHtmlUrl(String htmlUrl) { + this.htmlUrl = htmlUrl; + return this; + } + + public boolean isScreen() { + return screen; + } + + public NewRoleCustomDrawerPopupEvent setScreen(boolean screen) { + this.screen = screen; + return this; + } + + public int getActivityId() { + return activityId; + } + + public NewRoleCustomDrawerPopupEvent setActivityId(int activityId) { + this.activityId = activityId; + return this; + } + + public String getRightsInterests() { + return rightsInterests; + } + + public NewRoleCustomDrawerPopupEvent setRightsInterests(String rightsInterests) { + this.rightsInterests = rightsInterests; + return this; + } + + public boolean isDisMiss() { + return isDisMiss; + } + + public NewRoleCustomDrawerPopupEvent setDisMiss(boolean disMiss) { + isDisMiss = disMiss; + return this; + } + + public boolean isEffects() { + return effects; + } + + public NewRoleCustomDrawerPopupEvent setEffects(boolean effects) { + this.effects = effects; + return this; + } + + public boolean isFontSize() { + return fontSize; + } + + public NewRoleCustomDrawerPopupEvent setFontSize(boolean fontSize) { + this.fontSize = fontSize; + return this; + } +} diff --git a/common/src/main/java/com/yunbao/common/http/PDLiveApi.java b/common/src/main/java/com/yunbao/common/http/PDLiveApi.java index 29e10a140..2e31e7f21 100644 --- a/common/src/main/java/com/yunbao/common/http/PDLiveApi.java +++ b/common/src/main/java/com/yunbao/common/http/PDLiveApi.java @@ -297,7 +297,7 @@ public interface PDLiveApi { * 新侧边栏请求 */ @GET("/api/public/?service=Live.getCustomSidebarInfo") - Observable>> getCustomSidebarInfo(); + Observable>> getCustomSidebarInfo(@Query("type") String type); /** * 任务领取接口 diff --git a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java index d63b8dcff..7ff497ed9 100644 --- a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java +++ b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java @@ -29,7 +29,6 @@ import com.yunbao.common.bean.LiveAiRobotBean; import com.yunbao.common.bean.LiveAnchorCallMeModel; import com.yunbao.common.bean.LiveAnchorSayModel; import com.yunbao.common.bean.LiveDataInfoModel; -import com.yunbao.common.bean.LiveGiftBean; import com.yunbao.common.bean.LiveInfoModel; import com.yunbao.common.bean.LiveRoomActivityBanner; import com.yunbao.common.bean.LiveRoomVoteModel; @@ -50,6 +49,7 @@ import com.yunbao.common.bean.RedPacketInfoModel; import com.yunbao.common.bean.RedPacketListBean; import com.yunbao.common.bean.SetAttentsModel; import com.yunbao.common.bean.StarChallengeStatusModel; +import com.yunbao.common.bean.SudgameCodeModel; import com.yunbao.common.bean.UserAreaBean; import com.yunbao.common.bean.UserAvatarSelectBean; import com.yunbao.common.bean.VipModel; @@ -314,9 +314,9 @@ public class LiveNetManager { * * @param callback */ - public void getCustomSidebarInfo(HttpCallback> callback) { + public void getCustomSidebarInfo(String type,HttpCallback> callback) { API.get().pdLiveApi(mContext) - .getCustomSidebarInfo() + .getCustomSidebarInfo(type) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(listResponseModel -> callback.onSuccess(listResponseModel.getData().getInfo()), throwable -> { @@ -2194,6 +2194,28 @@ public class LiveNetManager { }).isDisposed(); } + public void getCode(HttpCallback> callback) { + API.get().pdLiveApi(mContext) + .getCode() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer>>() { + @Override + public void accept(ResponseModel> listResponseModel) throws Exception { + if (callback != null) { + callback.onSuccess(listResponseModel.getData().getInfo()); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + if (callback != null) { + callback.onError(mContext.getString(R.string.net_error)); + } + } + }).isDisposed(); + } + /** * 直播间取消网络请求 */ diff --git a/common/src/main/java/com/yunbao/common/sud/QuickStartGameViewModel.java b/common/src/main/java/com/yunbao/common/sud/QuickStartGameViewModel.java index db360ecde..01733549e 100644 --- a/common/src/main/java/com/yunbao/common/sud/QuickStartGameViewModel.java +++ b/common/src/main/java/com/yunbao/common/sud/QuickStartGameViewModel.java @@ -5,23 +5,15 @@ import android.view.View; import androidx.lifecycle.MutableLiveData; +import com.yunbao.common.CommonAppContext; +import com.yunbao.common.bean.SudgameCodeModel; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.sud.model.GameConfigModel; import com.yunbao.common.sud.model.GameViewInfoModel; -import com.yunbao.common.sud.state.MGStateResponse; import com.yunbao.common.sud.state.SudMGPMGState; -import org.json.JSONObject; - -import java.io.IOException; -import java.util.Objects; - -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.MediaType; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; +import java.util.List; import tech.sud.mgp.core.ISudFSMMG; import tech.sud.mgp.core.ISudFSMStateHandle; @@ -34,29 +26,57 @@ import tech.sud.mgp.core.ISudFSMStateHandle; */ public class QuickStartGameViewModel extends BaseGameViewModel { - /** Sud平台申请的appId */ + /** + * Sud平台申请的appId + */ public static String SudMGP_APP_ID = "1701178631292395522"; - /** Sud平台申请的appKey */ + /** + * Sud平台申请的appKey + */ public static String SudMGP_APP_KEY = "E3Eokfq58ZklwR8fM7iKWYGzarbIOkyh"; - /** true 加载游戏时为测试环境 false 加载游戏时为生产环境 */ + /** + * true 加载游戏时为测试环境 false 加载游戏时为生产环境 + */ public static final boolean GAME_IS_TEST_ENV = true; - /** 使用的UserId。这里随机生成作演示,开发者将其修改为业务使用的唯一userId */ - public static String userId = QuickStartUtils.genUserID(); + /** + * 使用的UserId。这里随机生成作演示,开发者将其修改为业务使用的唯一userId + */ + public static String userId = QuickStartUtils.genUserID(CommonAppContext.sInstance.getApplicationContext()); - /** 游戏自定义安全操作区域 */ + /** + * 游戏自定义安全操作区域 + */ public GameViewInfoModel.GameViewRectModel gameViewRectModel; - /** 游戏的语言代码 */ + /** + * 游戏的语言代码 + */ public String languageCode = "zh-CN"; public final MutableLiveData gameViewLiveData = new MutableLiveData<>(); // 游戏View回调 - /** 向接入方服务器获取code */ + /** + * 向接入方服务器获取code + */ @Override protected void getCode(Activity activity, String userId, String appId, GameGetCodeListener listener) { // TODO: 2022/6/10 注意,这里是演示使用OkHttpClient请求hello-sud服务 // TODO: 2022/6/10 开发者在与后端联调时需将其改成自己的网络请求方式向自己的服务器获取code + LiveNetManager.get(activity) + .getCode(new HttpCallback>() { + @Override + public void onSuccess(List data) { + + listener.onSuccess(data.get(0).getCode()); + + } + + @Override + public void onError(String error) { + listener.onFailed(); + } + }); // OkHttpClient client = new OkHttpClient(); // String req; // try { @@ -115,25 +135,33 @@ public class QuickStartGameViewModel extends BaseGameViewModel { // }); } - /** 设置当前用户id(接入方定义) */ + /** + * 设置当前用户id(接入方定义) + */ @Override protected String getUserId() { return userId; } - /** 设置Sud平台申请的appId */ + /** + * 设置Sud平台申请的appId + */ @Override protected String getAppId() { return SudMGP_APP_ID; } - /** 设置Sud平台申请的appKey */ + /** + * 设置Sud平台申请的appKey + */ @Override protected String getAppKey() { return SudMGP_APP_KEY; } - /** 设置游戏的语言代码 */ + /** + * 设置游戏的语言代码 + */ @Override protected String getLanguageCode() { return languageCode; @@ -175,13 +203,17 @@ public class QuickStartGameViewModel extends BaseGameViewModel { return GAME_IS_TEST_ENV; } - /** 将游戏View添加到页面中 */ + /** + * 将游戏View添加到页面中 + */ @Override protected void onAddGameView(View gameView) { gameViewLiveData.setValue(gameView); } - /** 将页面中的游戏View移除 */ + /** + * 将页面中的游戏View移除 + */ @Override protected void onRemoveGameView() { gameViewLiveData.setValue(null); diff --git a/common/src/main/java/com/yunbao/common/sud/QuickStartUtils.java b/common/src/main/java/com/yunbao/common/sud/QuickStartUtils.java index 1df24fba6..c378a182a 100644 --- a/common/src/main/java/com/yunbao/common/sud/QuickStartUtils.java +++ b/common/src/main/java/com/yunbao/common/sud/QuickStartUtils.java @@ -1,15 +1,20 @@ package com.yunbao.common.sud; +import android.content.Context; + +import com.yunbao.common.manager.IMLoginManager; + import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.UUID; public class QuickStartUtils { - /** 随机生成一个userId,用于演示 */ - public static String genUserID() { - return md5Hex8(UUID.randomUUID().toString()); + /** + * 随机生成一个userId,用于演示 + */ + public static String genUserID(Context mContext) { + return md5Hex8(String.valueOf(IMLoginManager.get(mContext).getUserInfo().getId())); } public static String md5Hex8(String plainText) { diff --git a/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java b/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java index 232ea3a6c..2a8beec76 100644 --- a/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java +++ b/common/src/main/java/com/yunbao/common/views/CustomDrawerPopupView.java @@ -170,7 +170,7 @@ public class CustomDrawerPopupView extends DrawerPopupView { adapter.updateData(data); } else { LiveNetManager.get(mContext) - .getCustomSidebarInfo(new com.yunbao.common.http.base.HttpCallback>() { + .getCustomSidebarInfo("0",new com.yunbao.common.http.base.HttpCallback>() { @Override public void onSuccess(List data) { adapter.updateData(data); @@ -221,6 +221,8 @@ public class CustomDrawerPopupView extends DrawerPopupView { void share(); void changeFontSize(); + + void interaction(long interactionID); } @Subscribe(threadMode = ThreadMode.MAIN) @@ -263,10 +265,13 @@ public class CustomDrawerPopupView extends DrawerPopupView { dismiss(); callBack.changeVideo(); } - if(event.isFontSize()){ + if (event.isFontSize()) { dismiss(); callBack.changeFontSize(); } + if (event.isInteraction()){ + callBack.interaction(event.getInteractionID()); + } } if (event.isRefresh()) { diff --git a/common/src/main/java/com/yunbao/common/views/InteractionGamesChildViewHolder.java b/common/src/main/java/com/yunbao/common/views/InteractionGamesChildViewHolder.java new file mode 100644 index 000000000..d876e03cc --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/InteractionGamesChildViewHolder.java @@ -0,0 +1,56 @@ +package com.yunbao.common.views; + +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.CustomSidebarChildModel; +import com.yunbao.common.event.CustomDrawerPopupEvent; +import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.utils.Bus; +import com.yunbao.common.views.weight.ViewClicksAntiShake; + +public class InteractionGamesChildViewHolder extends RecyclerView.ViewHolder { + private ImageView funGamePic; + private TextView funGameName; + + public InteractionGamesChildViewHolder(@NonNull View itemView) { + super(itemView); + funGamePic = itemView.findViewById(R.id.fun_game_pic); + funGameName = itemView.findViewById(R.id.fun_game_name); + } + + public void setData(CustomSidebarChildModel model, boolean rigts) { + if (rigts) { + ImgLoader.display(itemView.getContext(), model.getIcon(), funGamePic); + } else { + ImgLoader.display(itemView.getContext(), model.getResIcon(), funGamePic); + } + + + funGameName.setText(model.getTitle()); + + ViewClicksAntiShake.clicksAntiShake(itemView, new ViewClicksAntiShake.ViewClicksCallBack() { + @Override + public void onViewClicks() { + + if (!rigts) { + Bus.get().post(new CustomDrawerPopupEvent() + .setDisMiss(true).setRightsInterests(model.getTitle())); + } else { + long activityID = TextUtils.isEmpty(model.getSrc()) ? 0 : Long.parseLong(model.getSrc()); + if (activityID != 0) { + Bus.get().post(new CustomDrawerPopupEvent() + .setDisMiss(true).setInteractionID(activityID).setInteraction(true)); + } + + } + } + }); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/InteractionGamesViewHolder.java b/common/src/main/java/com/yunbao/common/views/InteractionGamesViewHolder.java new file mode 100644 index 000000000..b8f4ca34e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/InteractionGamesViewHolder.java @@ -0,0 +1,63 @@ +package com.yunbao.common.views; + +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.adapter.FunGamesAdapter; +import com.yunbao.common.adapter.InteractionGamesAdapter; +import com.yunbao.common.bean.CustomSidebarChildModel; +import com.yunbao.common.bean.CustomSidebarInfoModel; +import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.views.weight.ViewClicksAntiShake; + +import java.util.List; + +public class InteractionGamesViewHolder extends RecyclerView.ViewHolder { + private InteractionGamesAdapter funGamesAdapter; + private TextView sendGoodGift, selectMore; + private RecyclerView childList; + private ImageView selectMoreIcon; + boolean isShowMore = true; + + public InteractionGamesViewHolder(@NonNull View itemView) { + super(itemView); + sendGoodGift = itemView.findViewById(R.id.send_good_gift); + childList = itemView.findViewById(R.id.child_list); + selectMoreIcon = itemView.findViewById(R.id.select_more_icon); + selectMore = itemView.findViewById(R.id.select_more); + funGamesAdapter = new InteractionGamesAdapter(itemView.getContext(), true); + childList.setLayoutManager(new GridLayoutManager(itemView.getContext(), 4)); + childList.setAdapter(funGamesAdapter); + + } + + public void setData(CustomSidebarInfoModel model) { + List sidebarChildModels = model.getChild(); + itemView.findViewById(R.id.select_more_layout).setVisibility(sidebarChildModels.size() >= 8 ? View.VISIBLE : View.GONE); + sendGoodGift.setText(model.getTitle()); + funGamesAdapter.updateData(sidebarChildModels); + + ViewClicksAntiShake.clicksAntiShake(itemView.findViewById(R.id.select_more_layout), new ViewClicksAntiShake.ViewClicksCallBack() { + @Override + public void onViewClicks() { + if (isShowMore) { + funGamesAdapter.selectAll(sidebarChildModels); + + selectMore.setText(R.string.video_comment_collapsed); + ImgLoader.display(itemView.getContext(), R.mipmap.icon_more_up, selectMoreIcon); + } else { + funGamesAdapter.updateData(sidebarChildModels); + selectMore.setText(R.string.moer); + ImgLoader.display(itemView.getContext(), R.mipmap.icon_more_down, selectMoreIcon); + } + isShowMore = !isShowMore; + } + }); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/LiveNewRoleFunGamesViewHolder.java b/common/src/main/java/com/yunbao/common/views/LiveNewRoleFunGamesViewHolder.java new file mode 100644 index 000000000..731ff761e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/LiveNewRoleFunGamesViewHolder.java @@ -0,0 +1,65 @@ +package com.yunbao.common.views; + +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.adapter.FunGamesAdapter; +import com.yunbao.common.adapter.NewRoleFunGamesAdapter; +import com.yunbao.common.bean.CustomSidebarChildModel; +import com.yunbao.common.bean.CustomSidebarInfoModel; +import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.views.weight.ViewClicksAntiShake; + +import java.util.List; + +public class LiveNewRoleFunGamesViewHolder extends RecyclerView.ViewHolder { + private NewRoleFunGamesAdapter funGamesAdapter; + private TextView sendGoodGift, selectMore; + private RecyclerView childList; + private ImageView selectMoreIcon; + boolean isShowMore = true; + + public LiveNewRoleFunGamesViewHolder(@NonNull View itemView) { + super(itemView); + sendGoodGift = itemView.findViewById(R.id.send_good_gift); + childList = itemView.findViewById(R.id.child_list); + selectMoreIcon = itemView.findViewById(R.id.select_more_icon); + selectMore = itemView.findViewById(R.id.select_more); + funGamesAdapter = new NewRoleFunGamesAdapter(itemView.getContext(),true); + childList.setLayoutManager(new LinearLayoutManager(itemView.getContext(), LinearLayoutManager.HORIZONTAL, false)); + childList.setAdapter(funGamesAdapter); + + } + + public void setData(CustomSidebarInfoModel model) { + + List sidebarChildModels = model.getChild(); + itemView.findViewById(R.id.select_more_layout).setVisibility(sidebarChildModels.size() >= 8 ? View.VISIBLE : View.GONE); + sendGoodGift.setText(model.getTitle()); + funGamesAdapter.updateData(sidebarChildModels); + + ViewClicksAntiShake.clicksAntiShake(itemView.findViewById(R.id.select_more_layout), new ViewClicksAntiShake.ViewClicksCallBack() { + @Override + public void onViewClicks() { + if (isShowMore) { + funGamesAdapter.selectAll(sidebarChildModels); + + selectMore.setText(R.string.video_comment_collapsed); + ImgLoader.display(itemView.getContext(), R.mipmap.icon_more_up, selectMoreIcon); + } else { + funGamesAdapter.updateData(sidebarChildModels); + selectMore.setText(R.string.moer); + ImgLoader.display(itemView.getContext(), R.mipmap.icon_more_down, selectMoreIcon); + } + isShowMore = !isShowMore; + } + }); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/LiveNewRoleInteractionGamesViewHolder.java b/common/src/main/java/com/yunbao/common/views/LiveNewRoleInteractionGamesViewHolder.java new file mode 100644 index 000000000..98380e2f6 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/LiveNewRoleInteractionGamesViewHolder.java @@ -0,0 +1,44 @@ +package com.yunbao.common.views; + +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.adapter.InteractionGamesAdapter; +import com.yunbao.common.adapter.LiveNewRoleInteractionGamesAdapter; +import com.yunbao.common.bean.CustomSidebarChildModel; +import com.yunbao.common.bean.CustomSidebarInfoModel; + +import java.util.List; + +public class LiveNewRoleInteractionGamesViewHolder extends RecyclerView.ViewHolder { + private LiveNewRoleInteractionGamesAdapter funGamesAdapter; + private TextView sendGoodGift; + private RecyclerView childList; + private ImageView selectMoreIcon; + boolean isShowMore = true; + + public LiveNewRoleInteractionGamesViewHolder(@NonNull View itemView) { + super(itemView); + sendGoodGift = itemView.findViewById(R.id.send_good_gift); + childList = itemView.findViewById(R.id.child_list); + selectMoreIcon = itemView.findViewById(R.id.select_more_icon); + funGamesAdapter = new LiveNewRoleInteractionGamesAdapter(itemView.getContext(), true); + childList.setLayoutManager(new GridLayoutManager(itemView.getContext(), 4)); + childList.setAdapter(funGamesAdapter); + + } + + public void setData(CustomSidebarInfoModel model) { + List sidebarChildModels = model.getChild(); + sendGoodGift.setText(model.getTitle()); + funGamesAdapter.updateData(sidebarChildModels); + + + } +} diff --git a/common/src/main/java/com/yunbao/common/views/LiveNewRoleRigtsInterestsViewHolder.java b/common/src/main/java/com/yunbao/common/views/LiveNewRoleRigtsInterestsViewHolder.java new file mode 100644 index 000000000..d5e7e22ab --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/LiveNewRoleRigtsInterestsViewHolder.java @@ -0,0 +1,56 @@ +package com.yunbao.common.views; + +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.adapter.FunGamesAdapter; +import com.yunbao.common.adapter.LiveNewRoleFunGamesAdapter; +import com.yunbao.common.bean.CustomSidebarChildModel; +import com.yunbao.common.bean.CustomSidebarInfoModel; + +import java.util.ArrayList; +import java.util.List; + +public class LiveNewRoleRigtsInterestsViewHolder extends RecyclerView.ViewHolder { + private LiveNewRoleFunGamesAdapter funGamesAdapter; + private TextView sendGoodGift; + private RecyclerView childList; + + public LiveNewRoleRigtsInterestsViewHolder(@NonNull View itemView) { + super(itemView); + sendGoodGift = itemView.findViewById(R.id.send_good_gift); + childList = itemView.findViewById(R.id.child_list); + sendGoodGift = itemView.findViewById(R.id.send_good_gift); + childList = itemView.findViewById(R.id.child_list); + funGamesAdapter = new LiveNewRoleFunGamesAdapter(itemView.getContext(), false); + childList.setLayoutManager(new GridLayoutManager(itemView.getContext(), 4)); + childList.setAdapter(funGamesAdapter); + } + + public void setData(CustomSidebarInfoModel model) { + + sendGoodGift.setText(model.getTitle()); + funGamesAdapter.updateData(generateData()); + } + + private List generateData() { + List child = new ArrayList<>(); + child.add(new CustomSidebarChildModel() + .setTitle(itemView.getContext().getString(R.string.noble)) + .setResIcon(R.mipmap.live_more_icon_aristocrat)); + child.add(new CustomSidebarChildModel() + .setTitle(itemView.getContext().getString(R.string.guard_guard)) + .setResIcon(R.mipmap.live_more_icon_guard)); + child.add(new CustomSidebarChildModel() + .setTitle(itemView.getContext().getString(R.string.fan_club)) + .setResIcon(R.mipmap.live_more_icon_fans)); + return child; + + } +} + diff --git a/common/src/main/java/com/yunbao/common/views/LiveSudGamePopup.java b/common/src/main/java/com/yunbao/common/views/LiveSudGamePopup.java new file mode 100644 index 000000000..471ad4106 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/LiveSudGamePopup.java @@ -0,0 +1,85 @@ +package com.yunbao.common.views; + +import android.app.Activity; +import android.content.Context; +import android.view.View; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.lifecycle.Observer; + +import com.lxj.xpopup.core.BottomPopupView; +import com.yunbao.common.R; +import com.yunbao.common.event.LiveNewWishListEvent; +import com.yunbao.common.sud.QuickStartGameViewModel; +import com.yunbao.common.utils.Bus; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +/** + * sub半屏游戏弹窗 + */ +public class LiveSudGamePopup extends BottomPopupView { + private FrameLayout gameContainer; + private long mInteractionID; + private String mLiveUid; + private final QuickStartGameViewModel gameViewModel = new QuickStartGameViewModel(); // 创建ViewModel + + public LiveSudGamePopup(@NonNull Context context, long interactionID,String liveUid) { + super(context); + mInteractionID = interactionID; + mLiveUid = liveUid; + } + + // 返回自定义弹窗的布局 + @Override + protected int getImplLayoutId() { + return R.layout.dialog_live_sud_game; + } + + // 执行初始化操作,比如:findView,设置点击,或者任何你弹窗内的业务逻辑 + @Override + protected void onCreate() { + super.onCreate(); + Bus.getOn(this); + initView(); + initDate(); + + } + + private void initView() { + gameContainer = findViewById(R.id.game_container); + gameViewModel.gameViewLiveData.observe(this, new Observer() { + @Override + public void onChanged(View view) { + if (view == null) { // 在关闭游戏时,把游戏View给移除 + gameContainer.removeAllViews(); + } else { // 把游戏View添加到容器内 + gameContainer.addView(view, FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); + } + } + }); + // 加载游戏,参数定义可查看BaseGameViewModel.switchGame()方法注释 + + + // SudMGP平台64bit游戏ID + gameViewModel.switchGame((Activity) getContext(), mLiveUid, mInteractionID); + } + + private void initDate() { + + } + + @Override + protected void onDismiss() { + Bus.getOff(this); + + super.onDismiss(); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLiveNewWishListEvent(LiveNewWishListEvent event) { + + } +} diff --git a/common/src/main/java/com/yunbao/common/views/NewRoleFunGamesChildViewHolder.java b/common/src/main/java/com/yunbao/common/views/NewRoleFunGamesChildViewHolder.java new file mode 100644 index 000000000..9a2a2d7a9 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/NewRoleFunGamesChildViewHolder.java @@ -0,0 +1,87 @@ +package com.yunbao.common.views; + +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.R; +import com.yunbao.common.bean.CustomSidebarChildModel; +import com.yunbao.common.bean.IMLoginModel; +import com.yunbao.common.event.CustomDrawerPopupEvent; +import com.yunbao.common.event.LiveNewRoleEvent; +import com.yunbao.common.event.NewRoleCustomDrawerPopupEvent; +import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.utils.Bus; +import com.yunbao.common.views.weight.ViewClicksAntiShake; + +public class NewRoleFunGamesChildViewHolder extends RecyclerView.ViewHolder { + private ImageView funGamePic; + private TextView funGameName; + + public NewRoleFunGamesChildViewHolder(@NonNull View itemView) { + super(itemView); + funGamePic = itemView.findViewById(R.id.fun_game_pic); + funGameName = itemView.findViewById(R.id.fun_game_name); + } + + public void setData(CustomSidebarChildModel model, boolean rigts) { + if (rigts) { + ImgLoader.display(itemView.getContext(), model.getIcon(), funGamePic); + } else { + ImgLoader.display(itemView.getContext(), model.getResIcon(), funGamePic); + } + + + funGameName.setText(model.getTitle()); + + ViewClicksAntiShake.clicksAntiShake(itemView, new ViewClicksAntiShake.ViewClicksCallBack() { + @Override + public void onViewClicks() { + if (!rigts) { + Bus.get().post(new NewRoleCustomDrawerPopupEvent() + .setDisMiss(true).setRightsInterests(model.getTitle())); + } else { + int activityID = TextUtils.isEmpty(model.getActivityId()) ? 0 : Integer.parseInt(model.getActivityId()); + if (activityID != 0) { + Bus.get().post(new NewRoleCustomDrawerPopupEvent() + .setDisMiss(true).setActivityId(activityID)); + } else { + IMLoginModel userInfo = IMLoginManager.get(itemView.getContext()).getUserInfo(); + StringBuffer htmlUrl = new StringBuffer(); + if (model.getSrc().contains("?")) { + htmlUrl.append(CommonAppConfig.HOST).append("/").append(model.getSrc()) + .append("&uid=") + .append(userInfo.getId()) + .append("&token=") + .append(userInfo.getToken()); + } else { + htmlUrl.append(CommonAppConfig.HOST) + .append("/") + .append(model.getSrc()) + .append("?uid=") + .append(userInfo.getId()) + .append("&token=") + .append(userInfo.getToken()); + } + Bus.get().post(new NewRoleCustomDrawerPopupEvent() + .setHtmlUrl(htmlUrl.toString()) + .setDisMiss(true) + .setScreen(TextUtils.equals(model.getShowType(), "2"))); + + + + } + } + + + Bus.get().post(new LiveNewRoleEvent()); + } + }); + } +} diff --git a/common/src/main/res/layout/dialog_live_new_function.xml b/common/src/main/res/layout/dialog_live_new_function.xml index 8a1234d84..22711cedf 100644 --- a/common/src/main/res/layout/dialog_live_new_function.xml +++ b/common/src/main/res/layout/dialog_live_new_function.xml @@ -245,6 +245,38 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/dialog_live_sud_game.xml b/common/src/main/res/layout/dialog_live_sud_game.xml new file mode 100644 index 000000000..d2753e471 --- /dev/null +++ b/common/src/main/res/layout/dialog_live_sud_game.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_interaction_games_view.xml b/common/src/main/res/layout/view_interaction_games_view.xml new file mode 100644 index 000000000..c291f4db3 --- /dev/null +++ b/common/src/main/res/layout/view_interaction_games_view.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_live_new_role_fun_games_child_view.xml b/common/src/main/res/layout/view_live_new_role_fun_games_child_view.xml new file mode 100644 index 000000000..7525c91c4 --- /dev/null +++ b/common/src/main/res/layout/view_live_new_role_fun_games_child_view.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_live_new_role_fun_games_child_view2.xml b/common/src/main/res/layout/view_live_new_role_fun_games_child_view2.xml new file mode 100644 index 000000000..9698ed388 --- /dev/null +++ b/common/src/main/res/layout/view_live_new_role_fun_games_child_view2.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_live_new_role_interaction_games_view.xml b/common/src/main/res/layout/view_live_new_role_interaction_games_view.xml new file mode 100644 index 000000000..5ab821e4a --- /dev/null +++ b/common/src/main/res/layout/view_live_new_role_interaction_games_view.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_live_new_roler_ights_interests.xml b/common/src/main/res/layout/view_live_new_roler_ights_interests.xml new file mode 100644 index 000000000..0cf062d9b --- /dev/null +++ b/common/src/main/res/layout/view_live_new_roler_ights_interests.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/view_new_roler_fun_games_view.xml b/common/src/main/res/layout/view_new_roler_fun_games_view.xml new file mode 100644 index 000000000..457a59633 --- /dev/null +++ b/common/src/main/res/layout/view_new_roler_fun_games_view.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config.gradle b/config.gradle index 7a8acf55c..70d7f4fb4 100644 --- a/config.gradle +++ b/config.gradle @@ -5,13 +5,13 @@ ext { minSdkVersion : 21, targetSdkVersion : 33, versionCode : 450, - versionName : "6.5.5" + versionName : "6.5.6" ] manifestPlaceholders = [ //正式、 - serverHost : "https://napi.yaoulive.com", +// serverHost : "https://napi.yaoulive.com", // 测试 -// serverHost : " https://ceshi.yaoulive.com", + serverHost : " https://ceshi.yaoulive.com", diff --git a/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java index 0f59a4142..99c87f40c 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java @@ -65,6 +65,7 @@ import com.yunbao.common.event.GiftWallIlluminateEvent; import com.yunbao.common.event.JavascriptInterfaceEvent; import com.yunbao.common.event.LiveErrorEvent; import com.yunbao.common.event.LiveRoomChangeEvent; +import com.yunbao.common.event.NewRoleCustomDrawerPopupEvent; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.CommonHttpConsts; import com.yunbao.common.http.CommonHttpUtil; @@ -89,6 +90,7 @@ import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.views.CustomDrawerPopupView; +import com.yunbao.common.views.LiveSudGamePopup; import com.yunbao.common.views.floatingview.APPEasyFloat; import com.yunbao.common.views.weight.VerticalViewPager; import com.yunbao.live.R; @@ -121,10 +123,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import io.rong.imlib.IRongCoreCallback; -import io.rong.imlib.IRongCoreEnum; -import io.rong.imlib.chatroom.base.RongChatRoomClient; - /** * Created by cxf on 2018/10/10. * 看直播 @@ -983,6 +981,18 @@ public class LiveAudienceActivity extends LiveActivity { .setBean(mLiveBean) .setType(LiveAudienceEvent.LiveAudienceType.FONT_SIZE)); } + + @Override + public void interaction(long interactionID) { + new XPopup.Builder(mContext) + .enableDrag(false) + .hasBlurBg(true) + .dismissOnTouchOutside(false) + .dismissOnBackPressed(false) + .asCustom(new LiveSudGamePopup(mContext, interactionID, mLiveUid)) + + .show(); + } }); new XPopup.Builder(mContext) .hasShadowBg(false) @@ -1078,6 +1088,7 @@ public class LiveAudienceActivity extends LiveActivity { fragment.setActivityId(6); fragment.setRoomId(mLiveUid); fragment.show(((LiveAudienceActivity) mContext).getSupportFragmentManager(), "LiveGameDialogFragment"); + break; case FAN_CLUB: @@ -1622,6 +1633,51 @@ public class LiveAudienceActivity extends LiveActivity { }); } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onNewRoleCustomDrawerPopupEvent(NewRoleCustomDrawerPopupEvent event) { + //是否关闭弹窗 + + if (!TextUtils.isEmpty(event.getHtmlUrl())) { + if (TextUtils.equals(event.getHtmlUrl(), "recharge")) { + RouteUtil.forwardMyCoin(mContext); + } else if (TextUtils.equals(event.getHtmlUrl(), "to_me_information")) { + RouteUtil.forwardEditProfileActivity(); + } else { + if (!event.isScreen()) { + ZhuangBanActivity.forward(mContext, event.getHtmlUrl(), false, 1); + } else { + Bundle bundle = new Bundle(); + bundle.putString("url", event.getHtmlUrl()); + LiveHDDialogFragment fragment = new LiveHDDialogFragment(); + fragment.setArguments(bundle); + fragment.show(getSupportFragmentManager(), "LiveHDDialogFragment"); + } + } + } + if (event.getActivityId() != 0) { + LiveGameDialogFragment fragment = new LiveGameDialogFragment(); + fragment.setActivityId(event.getActivityId()); + fragment.setRoomId(mLiveUid); + fragment.show(((LiveAudienceActivity) mContext).getSupportFragmentManager(), "LiveGameDialogFragment"); + } + if (!TextUtils.isEmpty(event.getRightsInterests())) { + //跳转贵族 + if (TextUtils.equals(event.getRightsInterests(), getString(com.yunbao.common.R.string.noble))) { + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.NOBLE)); + //跳转守护 + } else if (TextUtils.equals(event.getRightsInterests(), getString(com.yunbao.common.R.string.guard_guard))) { + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.GUARD)); + //跳转粉丝团 + } else if (TextUtils.equals(event.getRightsInterests(), getString(com.yunbao.common.R.string.fan_club))) { + Bus.get().post(new LiveAudienceEvent() + .setType(LiveAudienceEvent.LiveAudienceType.FAN_CLUB)); + } + } + + } + @SuppressLint("SetTextI18n") public void showMsgRed(int num) { if (manager == null || manager.mLiveAudienceViewHolder == null || manager.mLiveAudienceViewHolder.mRedPoint == null) { diff --git a/live/src/main/java/com/yunbao/live/views/LiveAudienceViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveAudienceViewHolder.java index 3ee8cd3fb..0ed407271 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveAudienceViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveAudienceViewHolder.java @@ -29,6 +29,7 @@ import com.umeng.analytics.MobclickAgent; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; import com.yunbao.common.bean.NewPeopleInfo; +import com.yunbao.common.dialog.LiveNewRolePopup; import com.yunbao.common.event.MessageIMEvent; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.API; @@ -38,7 +39,6 @@ import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.ProcessResultUtil; import com.yunbao.common.utils.SpUtil; import com.yunbao.common.utils.ToastUtil; -import com.yunbao.live.dialog.LiveGiftPopup; import com.yunbao.common.views.weight.ViewClicksAntiShake; import com.yunbao.live.R; import com.yunbao.live.activity.LiveActivity; @@ -47,7 +47,6 @@ import com.yunbao.live.bean.LiveChatBean; import com.yunbao.live.dialog.LiveHDDialogFragment; import com.yunbao.live.dialog.LiveMicUserDialogFragment; import com.yunbao.live.dialog.LivePromotionDialogFragment; -import com.yunbao.live.dialog.LiveRoleDialogFragment; import com.yunbao.live.dialog.TextHintDialog; import com.yunbao.live.dialog.VoiceDialog; import com.yunbao.live.event.LiveAudienceEvent; @@ -461,11 +460,16 @@ public class LiveAudienceViewHolder extends AbsLiveViewHolder { * 身份特权 */ public void openRoleDialog() { - LiveRoleDialogFragment fragment = new LiveRoleDialogFragment(); - Bundle bundle = new Bundle(); - bundle.putBoolean("showRed", mRedPointPrivilege.getVisibility() == View.VISIBLE); - fragment.setArguments(bundle); - fragment.show(((LiveAudienceActivity) mContext).getSupportFragmentManager(), "LiveRoleDialogFragment"); +// LiveRoleDialogFragment fragment = new LiveRoleDialogFragment(); +// Bundle bundle = new Bundle(); +// bundle.putBoolean("showRed", mRedPointPrivilege.getVisibility() == View.VISIBLE); +// fragment.setArguments(bundle); +// fragment.show(((LiveAudienceActivity) mContext).getSupportFragmentManager(), "LiveRoleDialogFragment"); + new XPopup.Builder(mContext) + .enableDrag(false) + .hasBlurBg(true) + .asCustom(new LiveNewRolePopup(mContext)) + .show(); } diff --git a/live/src/main/res/layout/dialog_live_role.xml b/live/src/main/res/layout/dialog_live_role.xml index 99de1edf8..8b117c44a 100644 --- a/live/src/main/res/layout/dialog_live_role.xml +++ b/live/src/main/res/layout/dialog_live_role.xml @@ -1,10 +1,10 @@ - + android:layout_height="354dp" + android:background="@drawable/bg_live_tota"> - \ No newline at end of file + \ No newline at end of file diff --git a/live/src/main/res/layout/view_live_audience.xml b/live/src/main/res/layout/view_live_audience.xml index e9bb0ffb5..ca4ab61d2 100644 --- a/live/src/main/res/layout/view_live_audience.xml +++ b/live/src/main/res/layout/view_live_audience.xml @@ -345,6 +345,7 @@ Px`h)G02RCr$1oC|am)!o4VGqdl_CfQ^|9-9OLreGitVoI#iAPAzi98T5K+J~i2 zZL4j+TC1oV#h!|-wtQMB3VeDBM0{0S@lbh)1tbYV0)Zry2qcjAJG;qdcV~AV-}%qZ zgw1BNJF~ll!{y{`LT2ur`^*1*?;QfBzUcwL3;>DZR{{X20Du%f@rf7!;KWZS01S&? zLjd5O%10)qU@#p3SO6eZ{4~TkrV9Z20boG<^u*X-*xRobAPNA|0U!$irU3x{d^H*i z0KEXv2>?9+fIr8z#TyWU$OV8|0D!7Al?_$zA^^0;6I8qaVLu23zcf=xCB#^?2&x$X z_*kDM9)OYoU_JmO#riODzTW`=X8^z+OTV!KnhgN?01#_GvCJXdy(mHF0iY?`0ivB4 zdZuF0GetZ0RNjYP?<4@A`YCGB078}eG5{c?>#1Qla6+ldDFu`P01E>Gx+w!h0R>vE zmY^t#V1eann&w$nu~)|c^b`Pe%YASqfbsxf?zONt6h%RDa_mT+>ddAgNlciwRK(pA4!Q)+Wl^VtvouyNg6 zJv}|%5!VQ&B}y7Xssn)bNH@s=gpn}X9L$xbw4vmfOeQKXH&3^?q|AE%st0UZl{T3N z9#Fk{`nzh@Z+z~RrsgK+h--vZsB#GPH~{p8n^Yt~MgS z{^_?Le%xe8%p(W_c#a2-s5=}WG{`e2BTIpnNY$sQ zt)^VVG+nw*r!uHXk|gA7A_p80Jk7Y7K~KM@!+FWw@9v~&mgdo0Wm&Q``T64#Sh+e*X$MdCTR6&$O!`f%JT4tfOudy zmTnvDJG=Y8`}ZGd|G1@-yF8kmovB-W=e={6-?H*CilEdI3<0Vj7Xn@Jd%rYsV|Iy! z&Yt$8FKk)2`9kXj7ebP0m#`>zBv{o#O$XzhdEvxU3tD1f#;qyaR&Rd7Vl>ZDAj*?n z%DsR3z_$N%?mgY3x#Yb0=3BDvyZip9)RZO>jj|v;ekOh@W8eFK_CrHS;(-^8Hw%L! zLrt6B-0F(d^rGU!%f;i8OYM~C8?WMZ7NUFn`XoT5FEUC ztfFe@(^Gtwk9pv}2Oc*V60Cu6{A?sLqV$MlgpUA7f?Z-+7^Pjk@BVw|i@Oj0t9iga zAjiX@bw3zbPYMPUQF`z}5zwN{rIx?mwb7QOivu76pt8H>?M9}yamnhk`%{w5b4e9> zrJ5tz9TCD6Afoh){r?r!lfnQWL%R=tzVGGN-}}FsK}R1W!+4LAqCi0S{q1rpffAsX z@7NSOAT(PlfEve{4~)fRwk11t5vd{o?eY~vED?|-$8U!MB_~+A1YtvU<2hg$AA9=3 zsT~{McwtX>Uw0%Ahc)j{C7BEaWED#o5j92vwBhzmwnSZGbSj2(7U2+D0xp}I8;mz- z=aO22AOt|7-H{ATfKd*#J7dOrg1Sjz057N;!?DoX)pFq3zpmZZ+TH4jV7P0=I`=rA zvq&to%Ler4Wq-3JYN7;$qfh{(jsTyD2FLV%jx-S@sR6)<69EZQAvrB6stGX4lXk_$A@2!kiX#q0Hz^hfUu6dLTk7dQb6l(dDWJnjt&s12Jjg@Fl6olZ7Kzn z34qiCkQiW4JVu>yc2HS(P)ib|-w$bwz{UeVHv6wh~h8;$`PxDvKdJd^lb4~ zn=u*{6GuX0EO;#g2g6@#9@3@Ptt#39Rk8!3fHz|Hwln!!M2zH32qc2sR3HGC;p`?;&LsSsl^yYBcutE6O^P* z77uY^t%zZ~z7Gz)^W0k>?QB$#j|Fl#kAM^zXi3FNvzDelId5CJQ5A)e4txakXav9) zaP;l7Y~`7GW%Cx^FeCpS71mp&%1KBA91sQsq#8nv2#qqs@YM}R{`T^Ymp+x5hlLW5 zE~&JkXxUgp8OV~1Tg~P3wm)N}k}-daxi!%HwpZH!T|1=h9$C6%dEr;)E&drrsSW<} zQh+Qn|qmtrT;9Trd{-tQo4%UMTEb~pzFZl4e zM3osgEX3TZM&8}HuWi?KTz zr`?^9kU-^Hb9F^?iqpPc`kjYNT62K_2?PHzP=RR(FBI@u9}9Mu{rpSsKl$9bON~y2 z9xK!wgh={pa#M`J9u3#Y@|Mzi3z7aGb$r5k7KXJ!^B=VZ+^m(DD?&6;RgMv^3jMjb&3ITp(U z<70vLFy88mjoa#5&bPQmy(~fSJjXFS&5d}6y{#^X=lrOHZTBkNgeCw|6h%u?q^B~~ zR>RH7nF)*16E)LQHKb8T@FXd}C=I|79M5uY+DUiVyXceMU89wQ4sRtJV4g85BM%KG^V8h1V`{3 z!E!V=GV1WObhSB;wzWGC4>;L&Tnm%i1Qo*~nIa<%pe54vg~qRD{;Y6W)~frols;Ju z?c@$Tb{)%eOq;W-@o4wnLl+&pTRKLM4dWWyjHH#8Rk^=jk)K>prlwRzQbm$#9S|Cw zkMeLGTHt*GARo;F#icO>mqxS9l>}EDfcJ5X=bWRp_DugLRZT|IL%l&b@sa(37)M?$7z3 z!sq{_A}}HG7iKVcRADNjW?^W!1Ke&W=u~Df=`(@z1q7Bs{kweL;oYtK{(g2~XI=Bi zfdK{fNO1Ft14RlSGJHl_y1;iv>;MK>N|1$9s2GUmV`uO;I}P_N>PXzd7rt z&jiCqB_>r;DgwYV06aT69K7Gla-Kb{hqgBiY_Dy0?CJG_?9C2Bpr|<2@B><5`EAkG zsI&Rti63mQs;KRMv--UK!)^^_B$rv&7JVb{2TzBRPN5Xyj~}n3BVokY%W?GHw!=Fb z26xmn4}H|50FaPsC{9)-K)*piagw0_bW8-adPZnKN>v&G?Qf3?kdUk@E_X&<_e;vl&$W zRgLV0B;0rh=`XeiG-n^c@$C#S=o7-Uy1ru-bpuxd#l@LxiE1U^wv8Mb0!l-cragSa${A0+7!8n#fY{Nhu3fME zckr!q9ix>FscIQ?9Uj2LP37ZkK`05r`|#NIt>NOL1S(JaP~j(!C26e~9>myq-`>lA zw4ED#|MH;syc&xKc2tmHHuKzlG?c+a5EQ}lvNr(>W8kR*p6B@1;bT=*9WU1oc`vx7QiO(@ zrYg($Z9zfm>XjrxX>hMJucV%f{qw-HypKLJ@Xvh>eQ#YH^0v6y(6t~u-`W`JuP~Ve zNveiYgwixg(-Im;AT^oe|aU11^kCc5pYMGgAEpav~_waMWvwYR6 zMj==q?*$L%WrrCz>tI1#5D2Z1tQ57w%2Q@P@GGkH@`a+Nap{+=W5RloxN;c#zr z2q!_()29Id?q8hp<4{WQMR9FhjzdY~Ub6#rQA}LUEohYSXl6&Gi{(g=)W*+Sxlaio><=Yr!F8-|s8)CsGos{3@RS0=`|xBBX8rg|o9n6JiRYR~M=*mY z6b&Hk1A{j_9*$?|uZM=Or$C#7?;=vvq6LJ5;JshE4qi=hL3}lZ+~wwR0Am3pb%Z$^ zZbDB{^ryM{7Y_meCZBjvF6tH!K+@oN7zST2TNV zRD(h=Ux+UYh)SJ8fr>XEX$Qr4C>-53z8C;s(S@!%ZeRi@a<$a~mz3}v z2!cX8752ENjEBK;1typX1{e1tRJ&#L80M0zB|+hy3RMpcJAUF9Cd3F46JqK0UN~t? sB=Hkf2j7f@YC_>-;|2=8P@%Rn=*#H0l07*qoM6N<$g8jX6od5s; literal 14476 zcmV;7ICIB|P)PyA07*naRCr$PeF>Z$Rhj*%s#ovz>n)vy>_8Uw-GB-K1%VOAWq@&+zXLiTDyxdf zD5ArTg2OT{zY$Rp2N1z+92Hyv!BGam0E#S<03mxiy}q^9|L=VF-sLS%PJj2Fn!v$lqmoBY+5`UI3c_^lN}+`I$THy(b!g2##q0rURJ01tuBm6K(*t z4nWsLVyTG$AcAJT1`L6-Gu+5bFKaNFu(&fE_bZNZX9W;JL$EB=k2~eb*9UFDv}$Mk z5<44!C~nC%1WwjkW~|4PBD@p8-*zU=w6g$+Y_rz{V4IPGlHrYvM0Oh2xA6|3R~vAK zf`tHjZaf2NyaMRe4xHhD^u%}!ZQ~6<)HwU;jA~p{_YOKZhPH8~k;W5%sBtEuIL-oV z3~Rja@Y{F*5X03Wy1cN%PsmPm0LJ zO^v$|*$EG5hq2L)01$N!nP;LIfjb&^EaH-lUKq;*8EXLTuZ8khe#ckaXRQG6*RlH2 zV+EkekTq5#sy>I+|3}9{V2=fW2%aM*v#ha2kZy3xJWIcqaAEnBzx2kh+K< zA|qvT%Mw7lYFBv@JedsLh~JbTq9&q?-SAsh03vt}ZurqozTx(q0oKwQ4x%goGzp&V z8Rl$X+i(yy8bFia$rb>Oc=v{asF47oV18pGzTxD1WO@b~Dy$m?Ag1bXn9Q~^9r#AR zIYIPLBYdJp0BF+ZY2?t3-Fr2pe%1&8F>En>O}LxmI6OaA7=|$b-Y43P{?LQl^QE>I zKohdIb@Wk7=AQOXZ#rSks=pqXcb(#%`@ClT<4>-=@3Jp^gS0=l^1?ecanl-p8-@;F+f$My*!E?z``eVpA)A_LKj?SHF4xmmhs*{VyjN zh(;}{M+>0iCSq~)-N!9ha_tSDzjWb&C)(9bzei*h5IZdh%j@u$M<2jFKm9dcT)y_H z@7%xk(-Sb1Q4jqdK(H+r$7le=W-#6--0kxpUU=duANs%tXDmJjU8^6*%*DsTZQ2db zJ$eg%^P@Y^vu-1%y4B8qy>;W6B`@?Q+z9}-Sr2V1fEc=toq#7!zS4huZ0-pk_~+fv zi=8%9%MtQz^O4I>!MYWXqr71a!g>wmO0@Rai`JbThG95C&jYLXBc2hvtpJ*kq00c_ z9ZTDH`}*axzu4B%lymbgY%4+#1gMtkD0kNoL=l!f;oW!gWgBjspy1)xqCfPTk$%5z z0nmgEUFnl`=jAj1`M9H}ytjSsYy_2V^mUccy)Hn#;-jf0?mYdnzEA$&v$c&QJ;6Ka z^F}<=W269@(4i|m$jx~t_uZ>H&RFuArsJBOTCudgiq0+yF8}@wH$VO41We_Jf@Q0MdL#g1PxF{89oO1g%pZ5;eh0)+ zy=mP>Z^a{zKgX*e^V`*zEjjF*)Al&4V@hEboOY;tD_|Fa*al)B2ugt8jnMB!t=1nt z@~6&UUv%YDcRupirV(c>qx~YR$-VY93-+BqXWF!KHMi=Q_doK|7_lI~8$q<$+tvU? z;1EEW-%fqc@%vnP$(fft{p9^^VG!b=L*5wN_t29+J^kEkznRsC@3pwK<*wU~IqTrP z-J=n~vIv-5ySiIN1t7}-LLUgrh`k;}K`(-!gwQXeuM~8D_15(_U2)xCX~1Q2JLZT3 z=iT(B3olu@;?cRC8#=M{=(j{q{Q0Hd{^R>E|8f}ez%svWk%hJfpfO>e!O#H@BYj+M;&wgUMrvf6JB1q9Q*Ef7*@Z$5?5Vw>wo{`f#sQ9T&ZK*A`5K^Kx4)} zSDnA~9iO=3jt|>*3324XDa^)(<-f#l@A(e?^vAzFbL014{$wL5`zzPJ_P7t8Huu9W z`kN(0SuSk5pcu#Dy#ufbBpt${00=6GgI+{_AHuL7VNgaGR1tLm+Ze>cSnBY_GuJR@!oUe##2kB(5#x@h>zUddu*14HV2?F&Ah&H@xo)yeBay)VCAgX z&Lgmz(ciZTZrF)u{#^UNrDwc&_4Z~w@B4rI?*9494?b`1^wK_YP(}<3mc_51g9Qh$ z3+l1%1HJ{ga}YP}rovdg6H$2uB5xDoyn`qY#BmK#NCr{>A`3-P2;aBEpWWx*anY44 zezLL4t8LGy9<-ok`mb)D_pOe7-(b~xUxMXTQS0nPrK^Os>;0FGx?s~s8p+ICIoA7z zYk}PyfX0k{c+dsMv7h+y-j^=gYs!)!4iWevwFUf2*+2J^&hvkGfA`Am8HhXo>!i1y z{I;p5xzXAp;!p9*f_B2HK1HqO$?%cT7g^#ke{lu zu?Rp|mlPiLF2uDi5zv8GhwoU3TFF*`L|6eQUl1dXVpP0B`NzNXZ@u=$7av@`u{x?1 z>8G_ig)e_{#=8z&92{j;yeX?X-L=127Tk5+-F<)DURK`5lgf;bHL^j8!f*iMLf%|* zZcJ{D1M4H_zHZNxPCWAPJr?bKU|U<$^dQ(2u35eI`L%0Tu6pdT70Vy^?dlgF`rU@k z%E+=D>#fHxnDNo`kNmr%kDT$2g1x#GQJtxjYDSd-CMZH!<+5TO*vc@pD5RTo2G%5* znQCB-0ly6RCB%Lo0-b)|_WV$yJ^kyD|3JR-$zPM{^%zwSFBlI zuTXZiHM{wxhjq+cdiazD`|RDic+M`l#T_mF+=5$gLs+vyzb@}7cj7XPh<|i;#p}NE zU$y_d{bxPP#t1^M5Ys~eG-l$NMayNsf8(e3+Nb$-3N(7az(+CyZ!#%D-w7_>EpdnA zIF7;~@WTLcE}x@Wn?qc;SauM`;h;!4Z(7)|Ky=ujqLfOCtbc`Dau%D;H z*iZnCN%$f~KmOqBKYqYLt#49;#sxfbk_pKGk_|+r5J)^keKO4>U&BGwSGanP0fb_k z1U$kzkpfSNVThtP(!k(z$v`RaP&5meCDl@;4C)*4fy#)y3gWPiz^@?=RQeu;5h4PO zgBr*192c13GO1L9E@99_E+w*)ucQIS=TM(1rqrO5_cH+0Kni160xAU}vQf1fduLry z`S|Z1uWVPcF+z|HYQP@~pfL$wU%FNyHnJS4-EslRLB2uQ>X*WludA`KwQ zDFIT1m)FM6o^eUfLd5QS1R0bpv0)@RFL>XGHKT4pg&_fKLO*3xGN^EQU2Qlx8D&4`mQ4mg8p_CM>8K z+QNjc(n$nRP(|#O5e3vgOxbG!9EO`XRQiOhNC3%?I&y}27jc`5nEG5rHVqt|4Qe`4 z4=OzI&;&RVwg5{qK}&3cD6$Yz3)z7JH^If<2NCXlDE!v>*Z2G|>oEk7gt0V$xWgZp z-p%y(i|-%!-Z%fc^-5K~vBG!TWYfG1MyLp`Jb zK%uKZq;wGfYa`C(5EWg-RGBA(=;yL_C6_X(fLE%1jl7p0xdcE& zr55Nhfy954eRAskj1Lsl5c>>W6~ulG0sk!n>O(Sf0S=jHAdOGyU=^x(Ck^q!aVe&a z8?L`X5F!pDrL6)w+!V^@eVN_G63Qf;5!ZfC?k=g(bSN@)I57YcW+BfT;F!bI>AeVSql z^%mD#4r@R(8{wQ#k`8l;`Dny5A0w45J9Gpr$9t70bU^oXNDtxyZaa6jhB6^ zkF~2TZ=!?D$Yid6EQpc89=1Z z5zns9#L{_k@)ULTE5I5Jq(LOY*#M|X3s_5Os<4hYppjTZ=rfI{4^)>FUWGB5iGc`c zjwCjFvLlm)Hd)D26jeZa-E%Z!|KSEj+iv zdgP>wyROUP(NHA(e+pNpA+xYEc@psR; zvGLA*gjy8b=u< z1K~@~j`_P*qyi9=+M7S8nMjAPB#be1>0&A~KxSgXJ_L|6Ei_FoW=pm;kQ_7S5)14jU)jXe3;07%!oWE70< z(E|Dv0Meo&0gj0W23ST*r2(d|oAl?UjYPWAyz2~0UD|a-tcOLu6jMd>h>=J)TFelLZx{~G0mY?%XX4?B)C^+_-#}EGMw3cYDVjrDcB`jmu$Yet%`${oIlI!xthJjLH zOGd^3%v|m1EX`zJnz7`n*9@4r&HMcpyGry>qs=z&a@O*b!t!V$7E#6Cjz|4Mm)pCUB8L1 z|Job>eZZ>dV&k;9-bmTYP};NMTfHFF_mp;{h(sQ zP}0@4gLJl)JYR#xRNm#E!)0LvuI>mB56A)n?Orp}3hLqqg)E|m)IqwCN|8;lFnmct zm4GreE!}>RRQ*%hMj=F%Jv5MnaY7!R62_+fs_I}GK20#+6pNYQfRzhY4XuL??Pk8;MDcD%IAJ zq~|6NPH7{Pn#*&HJD2|c26P5_snBU$Z$Y%~1rhK^b5VJJZ z4=q5_{bEV)PD=9(RMw3{p%_R2pifO?*htrdlW=FM?;3Q5fh4t;OicMhBHNgeISy8b z?uxfw-1V`MAYqixd5*`QX$j+tpIxx@y!W?$+75gOfW$mB8pwnZ6UK}atr;L`=P;g6 z8UQInC7pzsu#t#sBdSxHNV~xU^*G(gCVfHLL^N5LG@Y@$pu{tKfnu4?qdXuokphk? zrwr=dNkUUf$7ubdgOsjs7-lk6cm4bXG?Z3aHwj2|s-JSG1-~>Eb$uRs6Prq5a|DU1HmwWu@;C56>tGO@%k4vf>Vl|!v zszaFef0WqOr4}&}%`o!!EL9BjI1NqVg_X44Nf=02YQR7=nVX1b9m0&TRuy|-Q&`-1 z%q5%7$Phs5G6&FAXU{w2;&a-rv>XD6zKhl%CWTM3uOVSYD)nj4MgvG|he3^IgEBBV z{aUH>66X8rB5GPANe0H7Zsjn2NCre4;6wwd5XL$3kp>bONTu)EiDpB+NG8)Z!k^j1 zuf?#oBMcz4N*+|TH=r<;GNHl4`&c2LzHtuxD){n@->V9|STdwUnx1pRf z_|1Cx{kUWuYhjt(zJ0~+C%o_Ert>U@uQY)8X@mSAlgkWo9Xan3aU~<;ffqAHu0_*NPHhMk0+A}X(&n?hx}Vt%n3L))(iWX z*%|bYO@olmxb#IZ;DZiy9-7jHDxw+Y(j^VkCSnA&uFR+PPh|RrVjGnpSN{9!svqbo zd83*UG6FzUGY8PGZ`$M3W0&UsNf=19j{%M`5luZz{xDG7G_4v*Ls?qOD2?!ndYFJq ztI_mR24!s~0~_Ky872}Fk)Ngeftb?hnwNAW>Mlg~E-Ut-nMg5h>R{T5HXe|+ml={2 z8<_*s;LxQDQ=wN~D5eOjL1Y+5FiE|oT010k@^8im(juCF4?+u$n~OjAjqu!upD#6h zpD+zB0npn=fV5FRMF4a}?w>4IXGlZC7*8t;s_D!t=@Lwp99|KoQrT7_ip}7p4p#=u zgfuOrC9Ijx)UB+hsXn5X(#70_fmpU+D$h)ebuiW3B|Z?-d2ydjI|nQCDQ`!24H|hS zI>xYz?t_-;(_#haA@!Xz~!%|vs5w*!_>tD zGzvu0hs|l#;$xD1m_XX-^7HH7bVb*PGt9!|lFl@QopIudM0xV8k04oWrEn@&XPAW7rNK&J9eH`-4X zQguCy1uHZ0PYY^>!302p8@ z#Wr5(c9)%WefK3POaXMvp&iqI{{Hgg&up%jd0<9BGaF+!BIkvv z%RiYx%C923MCo~6rpTI#7){a3MNCF~eVsP-} z+T2f1{Yv-Oc4`1Eo?C2L_Jf6AYikRq3}PUufl)x4Y;1_`F$|P;qmw=#6NU_cjQZ5q z#4BoLX%;f!&;VDrb4U{z?^-~Ufda+{m1R*}L_SSJJsU%pF_eL*3#!r!q{Ei!W!83r z@op6T4Aj3APzLmm@`Ct2ie*jvYSLq50A-rWh+ExMCgCi$RAn9xe*LU->&L&{^MkAb zl&KGt&pXblU+(>tU1mh{!Bn1?rg(T7I0i^Y2My9D>2Q-i4H`g6fs_CtL+S4Iw0o`S zO}{v01tfx9H0V03gvo zO85-XKLg$mGcdK8g6S91Vmrl1Dsn2#M7C4q4Emp{P590~;@>~_qyFvMP;M*W%iag# z0W7~~-)k1_8t*T)Fgx83lnz}cD>6OO9CY1qFIS^}u3?uXOr^^i1}rAUPp9qXh5B;_ zO)BK?IHg(71d%olHEmcJNHdYt!9+l_|CvAQhBEzV0Hh`v4)pG*CNVQ}gduC7i7a6x zq99Tl$)xVd&n6?&9+3bm@rG39rF?F24Sk(Z#nu(EpbV8At$>`E;ITckgrI z!TaE7uO?MjBsnnC!T?PZO)`Tc-3qIw zFY8)Zs+6IoyXj^!%|O&YEPI4jEpKX;pdE1CIwUzz6KiXO`mq+L~CbREJSV6o6IXI;|=YD=J(M{ zy(H$MmTIOKC<>T?+359h8{YD{{t6$Z`RG$vpT9prECKW0mX}U=_#hW52CAg&eCRdDI zE@M#tgsg+bHciBPPx*3pmi^E?YMB?7`LrIcNVe|2{k}e9dN}KqB6?^lum7E7WIVa1 zQ*lW6N@r!}DmNi5nLj^7dxnB1JY1T0!TBY+Ug*QUlu#TyLB{Nfv-qEvB({sm?nW;mwFv>Lo2o4^2KKEZA zxuyGiSrP-+2{M;yrV|VKC0@8^ziW2iHQe9Ir9+t3A{=xxML97PQ-XRR_tznPI1!zi zP^hnHm5iCMXzE`nKS;7Z-9SchCT$gb4Hqf!VM*Gqn#zplV>%Gkym*#2RIydqhgwON z`c=M<>H*U8xKc$`m{}JJK&IVwz=2L`UWwV5PU#2SXjuX&N##vpRi*HulZ!ulcXZ+ZJl4;}!Lzyz zn%bQC;tKbDW6#syBwmnd>oB2;k;8z+gtL@*PUgy|yqq+v2vAZ0(gQP~w@puUitQ3D zq(h?#X}Xcj06?-YX(UsNTd4_zx-UpCVr5oo9RQG;p+WMK)(7%-*M^v$)n4l)}xhy-0j#CqaF)5%qVS|Y7^N#ZnN><$=yiU~%v95ws#zzQA8#1S7>db6!U0xNm3a05 zsmA*-w$ShAyNS2GPmE^Nu^JlbV8ZnIE;ZWc?xLO>9B zTK}Zx#18;xpk;MnvY^V)Oe?EdzSlIMsaYNxfP?B^>1HxhjaSWN%)r*y+~vnzAs$ec zH*R|%wJ>wbv?~AMch1@Krb|0+P|fw)moefwS*0U2;gF*=sHx1bhhZJF9*P(wdObuv zH#n)Jr>5ozo9L!{S(Dm9tTQhTsA&V0H41f$XyjAhSctf2r*sNx=G2Wi9B`eY!4f}+ ztfd$>wph@#RKh1sk6Z^*g=-y=j5)2#9_lJc=7{NwL*~AxQhBomkxAo4w=<28RVQK; z*?6fx_sH8m-;?D6Q@sElGMAtMP^LQQb^EqY`@?tVf7{NnoMF}nN|}jrGb(*+|@?a=N;M8>O@WPMd6#5X%;p{C5*#rx~&3%AG5{MphnivLc6B z1>dxGaPW1>!w6v6AWG2yS8TQ7I^viMPjSK_mjJG-Ef6^2kjubuCXH7`TrVN=YOuJ} zaIIhV+pxk4VwR}tJ@W4;=;NBJ$y!%d-bQS5GZ-?;z|?2cQ)Jp$6QD~ii~^eFI~z}| zbM8Imi)b`Kre=;tp{mt#vpAcpnA&h`f+q*KdNq13 zrXY7V)AODta`O5dIess#Ep4TtCmo!R!}YXp<3bJJk;xT zc)kzcW6g|gWW#lHDA*zLVHqu!hhk7dQ@sSA8_h$z31)>R3{Wbe=aB@wq_wN?hU(be^~8@ z0L4XsJ5#&FLr({R;{hmxdueeY@X#wG;QGzt%W$oDrJHQW5%4%U7nZ|4UGl<83Owen z+c`#b*3$qg0o=W?+=p6?AnHf0(hpC-(}zl#_Y%te{V118sFZ60qI#_kukOL~LU#w>y(`8+TU1*%AE>l0~g?snAX2JY$e_89C18%P&CKx)!Q`Rb>B)P-ac2EJ^8d3pT+cEabu_cya}RKxzmBX#iCeaO(Ab z)CrzSpMa^{-zxyBln9_QD&;D?dL5MtH|+Hlc>F*%*&~R=>6V4dm6v3;K`@z}ZChw^ zfDSvr>|7Ny3pLD|9w6WDAaZPkwi|!xSGe@%U-f0RgU@ESI^ZZR1VAm6$?bRF-0Q5R z2YGL+ciZR+cSq1PUBs-NZ--Nu3b%O{3axWdY}*yN);WMZ0|2)_7%sFJ0Fi;JvXf5e zDFCt55JMSyypk<`hLeNi0DhA#D3MyXsvwNyo|T0^~7L$&I`_XE`Ho&bpJOcO+^k0?YKsJ0M`?IBhS z*NWj-5nMY)-icAj#b{<&vtkqwq1~%uPDdRrvy1WRHw9-tyu7kDlR;G4Cz+@?bYwCO zW4B(q>k03A^R)APr(HI&jp8N*Q2_y_z{*cUu6ZsBt@Ba<+C>TDK>#wLs|v(iHJ+Qm zaT{*6mwOylWhGTB=3)p8aUSg0hh^~|%F?-P^0F;%dujBSna3_Ejot;vv}>sC1(J>A z#8FgPr0O|SB@41g5JnP)d@q3KMW}lrsB(6Unp~jSjZw@;=xC17+yt~1W07@s1QbHAblf%lXLOaqtmeZ@`fk8E z+@+ma82kK37axA!>9apW@fgK9gi#)T*o??(1KjDdt#!U-Hkw-Iz-^fUi(5{bT?4si zhQ9#_HX!ykBKB4T{zgRpCfM9pgJ6n8Obu*3Dg8AA(`JlMC-qj@kw7hSscW8k7aX;5 zi43AoCQ!OW)wy*0h1r@(5=Y$-CW(Nu7?ODcrfWogp-L*M%3(|AV6ASUTC>2lw|e@4 zo__w@MqepLwH~9!Jzkhl#IoB495Rs;qsbxr#OP>=(b^2O6k`;dE#zFF9y^v!jQmSs>j?tR| z-=Od{G>tc}VHl&S*zje4Z@cz@lTJRN{S4V&Tknm*lkGU{p`-iDZJAO%HhPId9+;XZ zr7e8r2&%9`twRLS8c6j$+XRl@gF^;cN)^g*Q%>?gAG5qi(pgB>(JiX%K-6>HRo|&P z21|fL_M)~@d&)Co;^#Q>Gqb%s9Jd*{!W1~gnLyhjplKoEaE{72gA)AG-w>9cM$r3b zguScbRk%YDvoMw5tB;GNR49(LSYZ~pPcXMXt5#JRgU7}lBitsg$l>@)&+j~?x8yZ? zKY514S8SiKIpZUfHrLy~aKOnYzq$PbJn5oAXvQTSeWp6CLW^qSQ`8^zRS>>dfn|Ac zriMUkq--09hM!)jQ^ayky;d(CPXC9OIR~0|RUD@%rRk=`swGYFQe+Y!%F=bxJVy4R zxK-gyj>Le7@5%2VKyn~V$N70^ru)4ZYoY-Tv=7`OU5WVny5+lvnpazmBr^_2IA<LH*a#5L7sN(Wcirx43#gG{WfCR^{=q#EX}oHFcG`GSGQtiL0hOzOo9lw=@S zm;tH9qfDEIs#y_ue7@S=gFll!b>FtMG%=K^at!qfZ?^8Uw)uK5KvYrt(_3}oJO|62 z2FIO)xOp1vd=tE1)!coTy_xkhKMQwqG}b9*9R;15nG;QVN6qOmvt&7ev<}& zkt%xLm9Ba57%8SB->eX?Yi_!zshZ#QZi1RI)xfeDjVzRhWfzcZYJ;7h2B&R4oc8&! z+ZV!`HyiepgJ8An2DtRPSZjL*=y@1%_fv?xF4)|Wkgc3WZo#Q{3<^SYKKBH?N{4z^!D*||C4LfjGqeb}JYw#=i~?e-fH+cvDw!8+ zX+eb0=emdV|6@dT?*HW@@Ff?5q>-A6!=rpBf*)fg{;$vI%U<2DswyDscP6P!XG zw%a5OVi$^V3Pk}w&DYY@1V9)1) zLQ$1p_=N)x-OoOTa`##h<|4dJVAB$CeHWfxdd`N6yvDY2a7SonV6V7st@zVW7UDel zA6&Qaoo_g-_-@BRlbQEtPJ~)afSX^b4RYDtOPyoql+LkTM_rXVeWB(ssSNdwh*<$s zL4i!PkP*2*+3KNC!%hnUuzt`UB=2z4@^CE=7nbtsRY$_axB$9D?%8i2Pn4s!6rq zFK8^X#u1hpQ7URA7wq}x#R zmI@YOgrHhO_r@N){MVPlWe+W@|K)oRm0xUd$TCB;MfMpffEuoahKr>g#k_m`;T?01 zUD~pE@viQoc{6jnwzoR-+luj2H;+7Zw{5BV5Yr|V_S6Ch%3)Rw<)Vz4ZAsIZUNkD1 zeL+2{%s!db0s!BoeI+3}F4L}F&8SS!t7x+z+G9=*J@bfszri={}QKtvESOz71% z$Uw#mGCq(Bg$lsbXi9%5dJ@f+xL3Lln!lA=nu5MsrCu7v;vlkELaTc|D!u(!-&u+~ zyL!SkFL#D(pLr?jeDvvH&GHSk{)~H@H#Z!c&AdhfAUZ5u2BzWe^tOO0{oK6cI8$03 zch}iXO>?H@o9E89TW8P6x6YdCwzsyTt*vMmTbiAg<|eB-=UT;l&T1;SC^)uNaC27P zabnkXkz~C#(F39c!N~UC+D9Mj@7BQ2<9xCa%_-Yj8b9=yGHtwX;0c&~tI?lo1=Vrdn^k~1_Q@SpaAfMB@`g4F^w_ z0Gb5R_yG|$4}G47g{>^Iu+5#WNnyQXfz(jJJlt2wDuks!Ytkp$F(7J)&$G2d9}55( zpNM_clNJ1}jYwnu&J>;N7;cwIIFdsdD*%~end~JR$*64KbGECtwXGjL)&S!1v5L?B z>Pf?KTSsfl&!^sDL)fUQ>Z3iB9RVN{(kAO?qaC$ZzHZDy*3ggMQ2;W>F(GDpG!6%& zdMAb~GEXq7S8wNwb~Jz{*=Y0w$SjNI;IOM^jQ(x6?UmyJK$C2=ZDU5QL!C3Cd0X4| z*4zH<@dO~lMtkdxfVchIO#D}@2k@7%NY6)lD#sgu%yH9vJOlvep-tXYm?Gos&~P=} zK#W%anPVk@D70U#KpMBeF#|N-0h9(3dyTk8+^gX>?t!zj0Vo~XsFAov+(hfaHsY97 z^UO;Sjk*eV76uyb`;v{wN;`XaBiqo+;o}bRa<&IdJ2QaNtV9s)Okg5d*6ALdoenf< zz)b`IrN0lCWaS=F-0y>x|M61&r|HKOoWSYa8JT8tEH%*pH1vDY4w$0DoB>qUMO