From 1c292787a1bae07f2b5f85b6c9f30c49b6235276 Mon Sep 17 00:00:00 2001 From: YANGJIANKUAN Date: Wed, 19 Nov 2025 18:27:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BA=A4=E6=8E=A5=E5=8D=95=20static=20?= =?UTF-8?q?ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.local.json | 4 +- app/src/main/AndroidManifest.xml | 10 + .../lukouguoji/module_base/bean/ComAttach.kt | 14 + .../module_base/bean/GjcInspectionBean.kt | 2 + .../lukouguoji/module_base/common/Constant.kt | 3 + .../lukouguoji/module_base/http/net/Api.kt | 8 + .../module_base/router/ARouterConstants.kt | 2 + .../res/layout/activity_gjc_handover.xml | 1295 ++++++++++++++++ .../gjc/activity/GjcHandoverActivity.kt | 37 + .../activity/GjcInspectionDetailsActivity.kt | 95 ++ .../gjc/holder/GjcInspectionViewHolder.kt | 6 + .../gjc/viewModel/GjcHandoverViewModel.kt | 12 + .../GjcInspectionDetailsViewModel.kt | 156 ++ .../gjc/viewModel/GjcInspectionViewModel.kt | 18 +- .../src/main/res/drawable/bg_table_cell.xml | 7 + .../main/res/layout/activity_gjc_handover.xml | 1300 +++++++++++++++++ .../activity_gjc_inspection_details.xml | 333 +++++ .../main/res/mipmap-mdpi/ic_document_fill.png | Bin 0 -> 2520 bytes 18 files changed, 3294 insertions(+), 8 deletions(-) create mode 100644 module_base/src/main/java/com/lukouguoji/module_base/bean/ComAttach.kt create mode 100644 module_gjc/res/layout/activity_gjc_handover.xml create mode 100644 module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcHandoverActivity.kt create mode 100644 module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcInspectionDetailsActivity.kt create mode 100644 module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcHandoverViewModel.kt create mode 100644 module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcInspectionDetailsViewModel.kt create mode 100644 module_gjc/src/main/res/drawable/bg_table_cell.xml create mode 100644 module_gjc/src/main/res/layout/activity_gjc_handover.xml create mode 100644 module_gjc/src/main/res/layout/activity_gjc_inspection_details.xml create mode 100644 module_gjc/src/main/res/mipmap-mdpi/ic_document_fill.png diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 2a2427a..27c913d 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -18,7 +18,9 @@ "Bash(git stash:*)", "Bash(jar tf:*)", "Bash(xargs -I {} sh -c 'echo \"\"\"\"=== {} ===\"\"\"\" && jar tf {} 2>/dev/null | grep -i \"\"\"\"gprinter\"\"\"\" | head -5')", - "Bash(xmllint:*)" + "Bash(xmllint:*)", + "Bash(xargs cat:*)", + "mcp__chrome-devtools__evaluate_script" ], "deny": [], "ask": [] diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0f34ecd..60b1220 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -99,6 +99,16 @@ android:configChanges="orientation|keyboardHidden" android:exported="false" android:screenOrientation="userLandscape" /> + + ? = null // 附件列表 // 多选状态绑定 val checked = ObservableBoolean(false) diff --git a/module_base/src/main/java/com/lukouguoji/module_base/common/Constant.kt b/module_base/src/main/java/com/lukouguoji/module_base/common/Constant.kt index 09f1b63..408d6b6 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/common/Constant.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/common/Constant.kt @@ -347,5 +347,8 @@ interface Constant { // 是否可修改 const val MODIFY = "MODIFY" + + // 运单主键ID + const val MAWB_ID = "maWbId" } } \ No newline at end of file diff --git a/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt b/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt index 9383af0..1917e1a 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt @@ -373,6 +373,14 @@ interface Api { @POST("IntExpCheckInCheck/pageQuery") suspend fun getGjcInspectionList(@Body data: RequestBody): BaseListBean + /** + * 获取-国际出港-收运检查-详情 + * 接口路径: /IntExpCheckInCheck/queryWbById + * @param maWbId 运单主键ID + */ + @POST("IntExpCheckInCheck/queryWbById") + suspend fun getGjcInspectionDetails(@Query("maWbId") maWbId: Long): BaseResultBean + /** * 批量审核-国际出港-收运检查(通过/退回) * TODO: 需要确认审核接口路径 diff --git a/module_base/src/main/java/com/lukouguoji/module_base/router/ARouterConstants.kt b/module_base/src/main/java/com/lukouguoji/module_base/router/ARouterConstants.kt index 8bce4ed..e50b58d 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/router/ARouterConstants.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/router/ARouterConstants.kt @@ -126,6 +126,8 @@ object ARouterConstants { const val ACTIVITY_URL_GJC_BOX_ASSEMBLE = "/gjc/GjcBoxAssembleListActivity" //国际出港 板箱组装 const val ACTIVITY_URL_GJC_GOODS_LIST = "/gjc/GjcGoodsListActivity" //国际出港 货物交接 const val ACTIVITY_URL_GJC_INSPECTION = "/gjc/GjcInspectionActivity" //国际出港 收运检查 + const val ACTIVITY_URL_GJC_INSPECTION_DETAILS = "/gjc/GjcInspectionDetailsActivity" //国际出港 收运检查详情 + const val ACTIVITY_URL_GJC_HANDOVER = "/gjc/GjcHandoverActivity" //国际出港 货物交接单 ///////////////// 国际进港模块 /** diff --git a/module_gjc/res/layout/activity_gjc_handover.xml b/module_gjc/res/layout/activity_gjc_handover.xml new file mode 100644 index 0000000..36fe56c --- /dev/null +++ b/module_gjc/res/layout/activity_gjc_handover.xml @@ -0,0 +1,1295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcHandoverActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcHandoverActivity.kt new file mode 100644 index 0000000..27482f9 --- /dev/null +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcHandoverActivity.kt @@ -0,0 +1,37 @@ +package com.lukouguoji.gjc.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.databinding.ActivityGjcHandoverBinding +import com.lukouguoji.gjc.viewModel.GjcHandoverViewModel +import com.lukouguoji.module_base.base.BaseBindingActivity +import com.lukouguoji.module_base.router.ARouterConstants + +/** + * 国际出港货物交接单页面 + */ +@Route(path = ARouterConstants.ACTIVITY_URL_GJC_HANDOVER) +class GjcHandoverActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_gjc_handover + + override fun viewModelClass() = GjcHandoverViewModel::class.java + + override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow("货物交接单") + + binding.viewModel = viewModel + } + + companion object { + @JvmStatic + fun start(context: Context) { + val starter = Intent(context, GjcHandoverActivity::class.java) + context.startActivity(starter) + } + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcInspectionDetailsActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcInspectionDetailsActivity.kt new file mode 100644 index 0000000..fdf099d --- /dev/null +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcInspectionDetailsActivity.kt @@ -0,0 +1,95 @@ +package com.lukouguoji.gjc.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.Gravity +import android.widget.TextView +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.databinding.ActivityGjcInspectionDetailsBinding +import com.lukouguoji.gjc.viewModel.GjcInspectionDetailsViewModel +import com.lukouguoji.module_base.base.BaseBindingActivity +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.router.ARouterConstants + +/** + * 国际出港收运检查详情页 + */ +@Route(path = ARouterConstants.ACTIVITY_URL_GJC_INSPECTION_DETAILS) +class GjcInspectionDetailsActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_gjc_inspection_details + + override fun viewModelClass() = GjcInspectionDetailsViewModel::class.java + + override fun initOnCreate(savedInstanceState: Bundle?) { + // 自定义Toolbar设置 + val toolbar: androidx.appcompat.widget.Toolbar = findViewById(R.id.toolbar) + setSupportActionBar(toolbar) + supportActionBar?.setDisplayHomeAsUpEnabled(false) + supportActionBar?.setDisplayShowTitleEnabled(false) + + // 返回按钮点击事件 + findViewById(R.id.tool_back).setOnClickListener { + finish() + } + + // 右侧文档按钮点击事件 + findViewById(R.id.ivDocument).setOnClickListener { + GjcHandoverActivity.start(this) + } + + binding.viewModel = viewModel + + // 初始化数据 + viewModel.initOnCreated(intent) + + // 监听数据变化,动态创建附件列表 + viewModel.dataBean.observe(this) { bean -> + binding.attachContainer.removeAllViews() + + val attachList = bean.attachList + if (attachList.isNullOrEmpty()) { + // 无附件时显示提示文字 + val textView = TextView(this).apply { + text = "无附件" + textSize = 14f + setTextColor(resources.getColor(R.color.text_gray_l, null)) + setPadding(0, 8.dp, 0, 8.dp) + } + binding.attachContainer.addView(textView) + } else { + // 有附件时动态创建TextView + attachList.forEachIndexed { index, attach -> + val textView = TextView(this).apply { + text = attach.name + textSize = 14f + setTextColor(resources.getColor(R.color.text_blue, null)) + gravity = Gravity.CENTER_VERTICAL + setPadding(0, 8.dp, 16.dp, 8.dp) + setOnClickListener { + viewModel.onAttachClick(attach) + } + } + binding.attachContainer.addView(textView) + } + } + } + } + + // 扩展属性:dp转px + private val Int.dp: Int + get() = (this * (resources?.displayMetrics?.density ?: 3f)).toInt() + + + companion object { + @JvmStatic + fun start(context: Context, maWbId: Long) { + val starter = Intent(context, GjcInspectionDetailsActivity::class.java) + .putExtra(Constant.Key.MAWB_ID, maWbId) + context.startActivity(starter) + } + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcInspectionViewHolder.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcInspectionViewHolder.kt index b3d0be2..0c7c69c 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcInspectionViewHolder.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/holder/GjcInspectionViewHolder.kt @@ -2,6 +2,7 @@ package com.lukouguoji.gjc.holder import android.graphics.Color import android.view.View +import com.lukouguoji.gjc.activity.GjcInspectionDetailsActivity import com.lukouguoji.gjc.databinding.ItemGjcInspectionBinding import com.lukouguoji.module_base.base.BaseViewHolder import com.lukouguoji.module_base.bean.GjcInspectionBean @@ -30,6 +31,11 @@ class GjcInspectionViewHolder(view: View) : } } + // 整行点击跳转到详情页 + binding.ll.setOnClickListener { + GjcInspectionDetailsActivity.start(it.context, bean.maWbId) + } + // 设置审核状态文本和颜色 binding.tvStatus.text = bean.getReviewStatusName() binding.tvStatus.setTextColor(Color.parseColor(bean.getReviewStatusColor())) diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcHandoverViewModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcHandoverViewModel.kt new file mode 100644 index 0000000..00c0d8e --- /dev/null +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcHandoverViewModel.kt @@ -0,0 +1,12 @@ +package com.lukouguoji.gjc.viewModel + +import com.lukouguoji.module_base.base.BaseViewModel + +/** + * 国际出港货物交接单 ViewModel + */ +class GjcHandoverViewModel : BaseViewModel() { + + // 暂时为静态页面,无业务逻辑 + +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcInspectionDetailsViewModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcInspectionDetailsViewModel.kt new file mode 100644 index 0000000..763163f --- /dev/null +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcInspectionDetailsViewModel.kt @@ -0,0 +1,156 @@ +package com.lukouguoji.gjc.viewModel + +import android.content.Intent +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import com.lukouguoji.module_base.base.BaseViewModel +import com.lukouguoji.module_base.bean.ComAttach +import com.lukouguoji.module_base.bean.FileBean +import com.lukouguoji.module_base.bean.GjcInspectionBean +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.common.ConstantEvent +import com.lukouguoji.module_base.http.net.NetApply +import com.lukouguoji.module_base.impl.FlowBus +import com.lukouguoji.module_base.ktx.launchLoadingCollect +import com.lukouguoji.module_base.ktx.showConfirmDialog +import com.lukouguoji.module_base.ktx.showToast +import com.lukouguoji.module_base.ktx.toRequestBody +import com.lukouguoji.module_base.ui.page.preview.PreviewActivity +import com.lukouguoji.module_base.util.MediaUtil +import kotlinx.coroutines.launch + +/** + * 国际出港收运检查详情 ViewModel + */ +class GjcInspectionDetailsViewModel : BaseViewModel() { + + // 运单主键ID + var maWbId: Long = 0 + + // 详情数据 + val dataBean = MutableLiveData() + + /** + * 初始化数据 + */ + fun initOnCreated(intent: Intent) { + maWbId = intent.getLongExtra(Constant.Key.MAWB_ID, 0) + if (maWbId > 0) { + getData() + } else { + showToast("参数错误") + getTopActivity().finish() + } + } + + /** + * 获取详情数据 + */ + private fun getData() { + launchLoadingCollect({ + NetApply.api.getGjcInspectionDetails(maWbId) + }) { + onSuccess = { + dataBean.value = it.data ?: GjcInspectionBean() + } + } + } + + /** + * 通过审核 + */ + fun auditPass() { + val bean = dataBean.value ?: return + getTopActivity().showConfirmDialog("确定要通过该单证吗?") { + performAudit(bean, true, "通过") + } + } + + /** + * 退回 + */ + fun auditReject() { + val bean = dataBean.value ?: return + getTopActivity().showConfirmDialog("确定要退回该单证吗?") { + performAudit(bean, false, "退回") + } + } + + /** + * 执行审核操作 + * @param bean 数据 + * @param isPass true:通过, false:退回 + * @param action 操作名称(用于提示) + */ + private fun performAudit(bean: GjcInspectionBean, isPass: Boolean, action: String) { + // 构建请求参数:数组对象,包含 maWbId、wbNo、prefix、no、reviewStatus(必传) + // 使用数据自身的 reviewStatus 值 + val requestData = listOf( + mapOf( + "maWbId" to bean.maWbId, + "wbNo" to bean.wbNo, + "prefix" to bean.prefix, + "no" to bean.no, + "reviewStatus" to bean.reviewStatus + ) + ).toRequestBody() + + // 根据审核状态调用不同接口 + launchLoadingCollect({ + if (isPass) { + NetApply.api.passGjcInspection(requestData) + } else { + NetApply.api.backGjcInspection(requestData) + } + }) { + onSuccess = { + showToast("${action}成功") + // 发送刷新事件 + viewModelScope.launch { + FlowBus.with(ConstantEvent.EVENT_REFRESH).emit("refresh") + } + // 返回上一页 + getTopActivity().finish() + } + } + } + + /** + * 获取附件名称列表(用于显示) + */ + fun getAttachNames(): String { + val attachList = dataBean.value?.attachList + return if (attachList.isNullOrEmpty()) { + "无附件" + } else { + attachList.joinToString(" ") { it.name } + } + } + + /** + * 附件点击处理 + * @param attach 附件对象 + */ + fun onAttachClick(attach: ComAttach) { + when { + // 图片格式:使用PreviewActivity预览 + attach.name.endsWith(".jpg", true) || + attach.name.endsWith(".png", true) || + attach.name.endsWith(".jpeg", true) -> { + val fileBean = FileBean( + url = MediaUtil.fillUrl(attach.path), + originalPic = attach.path + ) + PreviewActivity.start(getTopActivity(), listOf(fileBean)) + } + // PDF格式:提示暂不支持 + attach.name.endsWith(".pdf", true) -> { + showToast("PDF文件预览功能开发中") + } + // 其他格式 + else -> { + showToast("暂不支持该文件格式预览") + } + } + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcInspectionViewModel.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcInspectionViewModel.kt index a884fcd..6111cde 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcInspectionViewModel.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/viewModel/GjcInspectionViewModel.kt @@ -157,7 +157,7 @@ class GjcInspectionViewModel : BasePageViewModel() { return } getTopActivity().showConfirmDialog("确定要通过选中的 ${filter.size} 条数据吗?") { - performAudit(filter, "1", "通过") + performAudit(filter, true, "通过") } } @@ -172,28 +172,32 @@ class GjcInspectionViewModel : BasePageViewModel() { return } getTopActivity().showConfirmDialog("确定要退回选中的 ${filter.size} 条数据吗?") { - performAudit(filter, "2", "退回") + performAudit(filter, false, "退回") } } /** * 执行审核操作 * @param items 选中的数据列表 - * @param status 审核状态(1:通过, 2:退回) + * @param isPass true:通过, false:退回 * @param action 操作名称(用于提示) */ - private fun performAudit(items: List, status: String, action: String) { - // 构建请求参数:数组对象,包含 maWbId 和 wbNo + private fun performAudit(items: List, isPass: Boolean, action: String) { + // 构建请求参数:数组对象,包含 maWbId、wbNo、prefix、no、reviewStatus(必传) + // 使用数据自身的 reviewStatus 值 val requestData = items.map { mapOf( "maWbId" to it.maWbId, - "wbNo" to it.wbNo + "wbNo" to it.wbNo, + "prefix" to it.prefix, + "no" to it.no, + "reviewStatus" to it.reviewStatus ) }.toRequestBody() // 根据审核状态调用不同接口 launchLoadingCollect({ - if (status == "1") { + if (isPass) { NetApply.api.passGjcInspection(requestData) } else { NetApply.api.backGjcInspection(requestData) diff --git a/module_gjc/src/main/res/drawable/bg_table_cell.xml b/module_gjc/src/main/res/drawable/bg_table_cell.xml new file mode 100644 index 0000000..2ca9fd9 --- /dev/null +++ b/module_gjc/src/main/res/drawable/bg_table_cell.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/module_gjc/src/main/res/layout/activity_gjc_handover.xml b/module_gjc/src/main/res/layout/activity_gjc_handover.xml new file mode 100644 index 0000000..614b02d --- /dev/null +++ b/module_gjc/src/main/res/layout/activity_gjc_handover.xml @@ -0,0 +1,1300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjc/src/main/res/layout/activity_gjc_inspection_details.xml b/module_gjc/src/main/res/layout/activity_gjc_inspection_details.xml new file mode 100644 index 0000000..93e211a --- /dev/null +++ b/module_gjc/src/main/res/layout/activity_gjc_inspection_details.xml @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjc/src/main/res/mipmap-mdpi/ic_document_fill.png b/module_gjc/src/main/res/mipmap-mdpi/ic_document_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..a931a21e608c089e8db0ac28d81a57883c4fcdd9 GIT binary patch literal 2520 zcmai0_g@pq8{WhPHx%837K*q)q$)>II+6`RH(;a)f>MHlV50~qcz6edj!|OZPgaD4-%LDBkk@2fjb-?0n{(c|P;bGtV<`vctjsl41&C002m` zFs2j!Z{PSJQM@g4E6)P}(iIjHb&eps%_U@Ho4_LP>W0-dE{9h5+PALcZ@xI3aeotI z?y#$}nA@;GcvK|s{^s@CrL9Cbf(4*nMaMRSx^mz#S-N*Dz&+b=Ob&$OOo13lqJ~&S zzs@5Bjsv(LOZu<3)&RO1d}{~+VH#FM_1jK_o+X;siK@Vd_(-t4-z6eMu}WkHs}ev{ zvM#$#BN}-hih&vwI$vt?Sr{Jvz_(Urc(Va?aQARR!zKcF5oof8{v;voS)!wG1QLyG zrAI(9dkEl>0h93T!Am zmXE*XzpJG*Q#AC$TB($p;(}kPXSO9NNp`$(7=sKnc$NDeT~uXBti@?6c6&m{k2ncT zLeJ9Xnms8t-?}_$ch9RNy#`Dr7;PdfuZBh4_Dd@f`WB^%6uN-;c7Z#5!z7XlYKRLg zXhnCB982Yj$yX|ZKR@)j@c%IxUbZPnrafWkri!AS9=Gc}_|1N35V~HifA7llE$L7%VTS?aF!BMdlOYb0a-)9UxR z2bhPk7782xF>DD3GO85E*W^^&BloG~Hx|spbiSEVWKGfbK+n3MMN;vF7m!o-$@~>~ zinaiSP=;H3gx?Fw^b_aCRj~6VzbI63QiW?0gl{5(MPePddSq|Bwm2Qe zTS$yY77m3)M6b#$sa~!%nB8?_z)8v7wU#`!^i6yydapCjS@`Ra1lrUSBswMlxK$-= z&Ll3Nhw1tg86aG;BVcuIzqfxcR3WAGQx^)LAyb)};keRrCnAn)AwmMRUS@3?z2ka{smJYcuub*S{=x%A=i`{kc8^N{(+T z_X{iiOh0|DhC+IMzGJS;?MEq6)|~JcW@n%pr2>XgQiV=6<2VBJ12Ko^p zgIH>mOHTXY+JR>HG@U9Xv%0_p>LjMrcYEJ>2Rez968xwH!WUz;%c4A@8pu`6Sfg+u|&~Q z9>Ar>H5J+MWJ}x1DqVM;@m0VP; z?R?D%P;KW-zU&ym54naXwa6jU`SndLX_e%58dft#3EGeWL6yz31JKrh1TXJT}vT-0>f>mdsao2*nHzz1(RK>-~vYux4pz0X^H+bm-`96WfB$ z`N(`rX=XSo!F`HgMQ0rbL67d_1#VIjtLSqk#b&D(92}a8$#GBay+IQWXbYfy3m-oy^U8M~Vmw#=t#mlpBt>5EEFdTXPk z0!GIdK*uk{-;a-)Wnt2Us>GeKu)|)Lbob=KqPB&mP_1@G2kq<6R;SMps${wlFx~#Q z?3Pzfyc1i5vcB@PGtjasemUC*f*`!6P-RP0kYX4b|Hps;u5^KeNK8C^7n-r+X6>zs z3(47xbkm3c{=rUPNx%`Ue^2v1jmzUX^Hh)~?qKpM#*Ls_G}1_E4IafAt9d-Ti%I}V z8F~q$8Mt%4W(PGwQ?fL-3Tj{^&PAT7r6>*)BWQ6L#bH*uXZ2xxdiu_U=Xn4(r#Z*3 q4Oz0n%d#IoMB`y5-Vxm>%r*fj`Zi-y%TCA}DD9 literal 0 HcmV?d00001