From db0448b468118790f29405e5e6f3bfc0e98e2b01 Mon Sep 17 00:00:00 2001
From: zhangqi <727393967@qq.com>
Date: Fri, 31 Oct 2025 16:15:28 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=BB=9F=E8=AE=A1=E5=88=86?=
=?UTF-8?q?=E6=9E=90=E6=9D=BF=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
config/dev.env.js | 2 +-
config/index.js | 2 +-
src/api/statistics.js | 111 ++
src/api/sysManage.js | 87 ++
src/components/public/Header.vue | 20 +-
src/router/index.js | 10 +
src/utils/index.js | 27 +
src/views/aboutUs.vue | 2 +-
src/views/dataSearch.vue | 60 +-
.../sampleViews/formViews/SampleList.vue | 16 +-
src/views/dataTransfer/voyageReg.vue | 7 +-
src/views/dicManage/visitorUnit.vue | 8 +
src/views/home.vue | 2 +-
src/views/personalCenter.vue | 6 +-
src/views/statistics/HovStatistics.vue | 489 ++++++++
src/views/statistics/ShipStatistics.vue | 1018 +++++++----------
src/views/statistics/components/BarChart.vue | 435 +++++++
src/views/statistics/components/PieChart.vue | 178 +++
src/views/statistics/index.vue | 38 +-
src/views/sysManage/roleManage.vue | 375 +-----
src/views/sysManage/userManage.vue | 610 +++++-----
static/img/01.png | Bin 3666 -> 1345 bytes
static/img/011.png | Bin 5252 -> 2178 bytes
23 files changed, 2162 insertions(+), 1341 deletions(-)
create mode 100644 src/api/statistics.js
create mode 100644 src/api/sysManage.js
create mode 100644 src/utils/index.js
create mode 100644 src/views/statistics/HovStatistics.vue
create mode 100644 src/views/statistics/components/BarChart.vue
create mode 100644 src/views/statistics/components/PieChart.vue
diff --git a/config/dev.env.js b/config/dev.env.js
index 57c3f9a..f9fae85 100644
--- a/config/dev.env.js
+++ b/config/dev.env.js
@@ -18,7 +18,7 @@ module.exports = merge(prodEnv, {
VUE_APP_BASE_API: '"/api"',
// VUE_APP_BASE_APIURL: '"http://ds2.hzzxq.com/api2"',
- VUE_APP_BASE_APIURL: '"http://crm.hzzxq.com/ds"',
+ VUE_APP_BASE_APIURL: '"http://test.gopmas.com/ds"',
VUE_APP_FULL_API: '"http://10.10.151.5:5555"',
VUE_APP_BASE_API_FRONT: '"http://10.10.150.128:8080/satellitePub/pub/index.html"',
VUE_APP_FILE_API: '"http://10.10.151.5:5555/archives"',
diff --git a/config/index.js b/config/index.js
index 2261511..9494e60 100644
--- a/config/index.js
+++ b/config/index.js
@@ -17,7 +17,7 @@ module.exports = {
// target: 'http://10.0.90.70', // 测试环境
// target: 'http://1.95.42.191:8080', // 测试环境
// target: 'http://ds2.hzzxq.com/api2', // 测试环境
- target: 'http://crm.hzzxq.com/ds', // 测试环境
+ target: 'http://test.gopmas.com/ds', // 测试环境
changeOrigin: true, // 是否跨域
secure: false, // 是否使用https
pathRewrite: {
diff --git a/src/api/statistics.js b/src/api/statistics.js
new file mode 100644
index 0000000..a8901ad
--- /dev/null
+++ b/src/api/statistics.js
@@ -0,0 +1,111 @@
+import request from '@/utils/request'
+
+// 报表配置查询接口
+export function reportList(data) {
+ return request({
+ url: '/report/type/list.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 科考船汇总统计属性
+export function shipTotal(data) {
+ return request({
+ url: '/report/ship/total.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 科考船航次统计
+export function shipVoyage(data) {
+ return request({
+ url: '/report/ship/voyage.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 科考船参航单位统计
+export function shipUnit(data) {
+ return request({
+ url: '/report/ship/unit.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 科考船参航单位统计(年度)
+export function shipUnitYear(data) {
+ return request({
+ url: '/report/ship/unit/year.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 载人潜水器汇总统计属性
+export function platformHov(data) {
+ return request({
+ url: '/report/platform/hov.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 载人潜水器潜次统计
+export function hovDiving(data) {
+ return request({
+ url: '/report/platform/hov/diving.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 载人潜水器参航单位统计
+export function hovUnit(data) {
+ return request({
+ url: '/report/platform/hov/unit.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 载人潜水器参航单位统计(年度)
+export function hovUnitYear(data) {
+ return request({
+ url: '/report/platform/hov/unit/year.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 无人航行潜水器统计
+export function platformAuv(data) {
+ return request({
+ url: '/report/platform/auv.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 遥控潜水器潜水器统计
+export function platformRov(data) {
+ return request({
+ url: '/report/platform/rov.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
diff --git a/src/api/sysManage.js b/src/api/sysManage.js
new file mode 100644
index 0000000..e1e5a6e
--- /dev/null
+++ b/src/api/sysManage.js
@@ -0,0 +1,87 @@
+import request from '@/utils/request'
+
+/* ********************************* 角色列表 **************************************/
+
+// 角色列表
+export function roleList(data) {
+ return request({
+ url: '/frame/role/page.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+/* ********************************* 用户列表 **************************************/
+
+// 用户列表
+export function optrList(data) {
+ return request({
+ url: '/frame/optr/page.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 用户新增
+export function optrAdd(data) {
+ return request({
+ url: '/frame/optr/add.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 用户编辑
+export function optrEdit(data) {
+ return request({
+ url: '/frame/optr/edit.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 用户删除
+export function optrDelete(data) {
+ return request({
+ url: '/frame/optr/delete.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+/* ********************************* 航次管理 **************************************/
+// 航次列表
+export function regList(data) {
+ return request({
+ url: '/voyage/reg/list.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 分配航次
+export function regGrant(data) {
+ return request({
+ url: '/voyage/reg/optr/grant.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
+// 清除航次
+export function regClear(data) {
+ return request({
+ url: '/voyage/reg/optr/clear.htm',
+ method: 'post',
+ type: 'application/x-www-form-urlencoded',
+ data
+ })
+}
+
diff --git a/src/components/public/Header.vue b/src/components/public/Header.vue
index 034c657..1fc56e7 100644
--- a/src/components/public/Header.vue
+++ b/src/components/public/Header.vue
@@ -170,11 +170,11 @@ export default {
path:"visitorUnit",
children:[]
},
- {
- name:"共享单位",
- path:"sharedUnit",
- children:[]
- },
+ // {
+ // name:"共享单位",
+ // path:"sharedUnit",
+ // children:[]
+ // },
{
name:"资助机构",
path:"fundingAgencies",
@@ -195,11 +195,11 @@ export default {
path:"roleManage",
children:[]
},
- {
- name:"单位管理",
- path:"unitManage",
- children:[]
- }
+ // {
+ // name:"单位管理",
+ // path:"unitManage",
+ // children:[]
+ // }
]
},
],
diff --git a/src/router/index.js b/src/router/index.js
index cc44b4a..4219a69 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -358,6 +358,16 @@ export const constantRoutes = [
loginAuthority: true
}
},
+ {
+ path: 'hov',
+ name: 'hov',
+ component: () => import('@/views/statistics/HovStatistics.vue'),
+ meta: {
+ title: '载人潜水器汇总统计',
+ icon: 'peoples',
+ loginAuthority: true
+ }
+ },
{
path: 'AboutUs',
name: 'AboutUs',
diff --git a/src/utils/index.js b/src/utils/index.js
new file mode 100644
index 0000000..a5b0ab4
--- /dev/null
+++ b/src/utils/index.js
@@ -0,0 +1,27 @@
+export function getYearRange(date) {
+ // 获取传入日期的年份
+ const year = date.getFullYear()
+
+ // 创建年份开始日期 (当年1月1日)
+ const startOfYear = new Date(year, 0, 1)
+
+ // 创建年份结束日期 (当年12月31日)
+ const endOfYear = new Date(year, 11, 31)
+
+ // 格式化日期为 YYYY-MM-DD
+ function formatDate(dateObj) {
+ const y = dateObj.getFullYear()
+ const m = String(dateObj.getMonth() + 1).padStart(2, '0') // 月份从0开始,需要+1
+ const d = String(dateObj.getDate()).padStart(2, '0')
+ return `${y}-${m}-${d}`
+ }
+
+ return {
+ start: formatDate(startOfYear),
+ end: formatDate(endOfYear)
+ }
+}
+
+export function filterDictItems(data, dictName) {
+ return data.filter(item => item.report_type === dictName)
+}
diff --git a/src/views/aboutUs.vue b/src/views/aboutUs.vue
index aca35bd..bad55f5 100644
--- a/src/views/aboutUs.vue
+++ b/src/views/aboutUs.vue
@@ -2,7 +2,7 @@
关于我们
-
团队成员主要由海洋地球物理学家、软件工程师和数据管理员构成,隶属于中国科学院深海科学与工程研究所,开展船潜载地球物理数据处理和深海数据系统信息化工具开发的应用基础研究,服务支撑fundingOptions、深海深渊科考、深海考古等国家重大需求。
+
团队成员主要由海洋地球物理学家、软件工程师和数据管理员构成,隶属于中国科学院深海科学与工程研究所,开展船潜载地球物理数据处理和深海数据系统信息化工具开发的应用基础研究,服务支撑、深海深渊科考、深海考古等国家重大需求。
团队组成
陈传绪:团队负责人,船潜载地球物理数据处理、算法开发,DSDS架构总设计。
* DSDS(Deep-Sea Data System)
diff --git a/src/views/dataSearch.vue b/src/views/dataSearch.vue
index 74d1262..ab761fd 100644
--- a/src/views/dataSearch.vue
+++ b/src/views/dataSearch.vue
@@ -27,11 +27,19 @@
-
+
+
{{ item.dataset_name }} {{ item.file_total }}
+
{{ item.create_time }}
+
+
+ - {{ sample.sample_name }}
+
+
航次:
-
{{ item.voyage_name }}
+
{{ item.voyage_name }}
平台类型:
@@ -65,24 +73,15 @@
-
-
{{ item.dataset_name }} {{ item.file_total }}
-
{{ item.create_time }}
-
-
- - {{ sample.sample_name }}
-
-
-
-
+
-
{{ item.voyage_name }} {{ item.voyage_mileage }}海里
+
+ {{ item.voyage_name }}
+ {{ item.voyage_mileage }}海里
{{ item.funding_org }}
@@ -271,9 +270,6 @@ export default {
rendered: []
}
},
- created() {
- this.getParams()
- },
watch: {
radio(val) {
this.dataList = []
@@ -314,23 +310,11 @@ export default {
}
},
},
+ mounted() {
+ this.imageryViewModels = setImageryViewModels(this.CesiumHostAddr)
+ this.initCesium()
+ },
methods: {
- // 获取从参数列表
- getParams() {
- getParamsList().then(res => {
- const arr = res.array
- if (arr.length) {
- arr.forEach(item => {
- if (item.param_name === 'CesiumHostAddr') {
- // this.CesiumHostAddr = item.param_value
- this.CesiumHostAddr = `${window.location.protocol}//${window.location.hostname}:${window.location.port}/tiles/`
- this.imageryViewModels = setImageryViewModels(this.CesiumHostAddr)
- this.initCesium()
- }
- })
- }
- })
- },
// 获取菜单
handleMenu() {
this.dataList = []
@@ -642,12 +626,13 @@ export default {
this.viewer.imageryLayers.addImageryProvider(contour6000)
},
turnDeatilPage(item) {
- this.$router.push({
+ const routeData = this.$router.resolve({
name: 'dataDetail',
query: {
voyage_name: item.voyage_name
}
})
+ window.open(routeData.href, '_blank')
},
shousuo() {
this.show = true
@@ -807,12 +792,13 @@ export default {
font-size: 16px;
color: #212121;
font-weight: bold;
- display: flex;
- justify-content: space-between;
+ //display: flex;
+ //justify-content: space-between;
.mileage {
font-size: 12px;
color: #909fa7;
+ float: right;
}
}
diff --git a/src/views/dataTransfer/sampleViews/formViews/SampleList.vue b/src/views/dataTransfer/sampleViews/formViews/SampleList.vue
index 9ec3637..7267242 100644
--- a/src/views/dataTransfer/sampleViews/formViews/SampleList.vue
+++ b/src/views/dataTransfer/sampleViews/formViews/SampleList.vue
@@ -172,6 +172,13 @@
+
+
+
+ 米
+
+
+
@@ -264,7 +271,8 @@ export default {
start_lat: '',
end_lon: '',
end_lat: '',
- line_deep: ''
+ line_deep: '',
+ conver_width: ''
},
rules: {
publish_rule: [
@@ -308,6 +316,9 @@ export default {
],
line_deep: [
{ required: true, message: '此处为必填项', trigger: 'blur' }
+ ],
+ conver_width: [
+ { required: true, message: '此处为必填项', trigger: 'blur' }
]
},
// 公开期限下拉数据
@@ -445,7 +456,8 @@ export default {
start_lat: '',
end_lon: '',
end_lat: '',
- line_deep: ''
+ line_deep: '',
+ conver_width: ''
}
this.dynamicTags = []
this.$refs['form'].resetFields()
diff --git a/src/views/dataTransfer/voyageReg.vue b/src/views/dataTransfer/voyageReg.vue
index e57e550..f127969 100644
--- a/src/views/dataTransfer/voyageReg.vue
+++ b/src/views/dataTransfer/voyageReg.vue
@@ -365,8 +365,11 @@ import {
voyageRegNav,
uploadNavigation,
voyageRegPeople,
- voyageRegPeopleDelete, voyageRegPeopleEdit, voyageRegPeopleUpload, voyageRegImport
-} from '@/api/dataTransfer'
+ voyageRegPeopleDelete,
+ voyageRegPeopleEdit,
+ voyageRegPeopleUpload,
+ voyageRegImport
+} from '../../api/dataTransfer'
import { time } from '@/utils/validate'
import { fundingAll } from '@/api/dicManage'
diff --git a/src/views/dicManage/visitorUnit.vue b/src/views/dicManage/visitorUnit.vue
index 933d51f..261a9e8 100644
--- a/src/views/dicManage/visitorUnit.vue
+++ b/src/views/dicManage/visitorUnit.vue
@@ -21,6 +21,7 @@
+
@@ -61,6 +62,9 @@
+
+
+
@@ -99,6 +103,7 @@ export default {
unit_addr: '',
unit_lon: '',
unit_lat: '',
+ unit_type: '',
unit_remark: ''
},
rules: {
@@ -110,6 +115,9 @@ export default {
],
unit_lat: [
{ required: true, message: '此处为必填项', trigger: 'blur' }
+ ],
+ unit_type: [
+ { required: true, message: '此处为必填项', trigger: 'blur' }
]
}
}
diff --git a/src/views/home.vue b/src/views/home.vue
index 32462ba..e62f235 100644
--- a/src/views/home.vue
+++ b/src/views/home.vue
@@ -284,7 +284,7 @@ export default {
},
{
pic: require('../../static/images/shuju2_bg3.png'),
- title: '支撑大科学计划',
+ title: '构建应急搜寻处置快速响应能力',
des: '应急搜捞应用',
routerName: 'SalvageHome'
}
diff --git a/src/views/personalCenter.vue b/src/views/personalCenter.vue
index 2dc503b..ab3e01d 100644
--- a/src/views/personalCenter.vue
+++ b/src/views/personalCenter.vue
@@ -281,7 +281,7 @@ export default {
},
updateInfoVisible: false,
updateInfoForm: {
- tsy_id: '',
+ optr_id: '',
optr_name: '',
optr_sex: '',
optr_status: '',
@@ -310,7 +310,7 @@ export default {
this.info = data
- this.updateInfoForm.tsy_id = data.tsy_id
+ this.updateInfoForm.optr_id = data.optr_id
this.updateInfoForm.optr_name = data.optr_name
this.updateInfoForm.optr_sex = data.optr_sex
this.updateInfoForm.optr_status = data.optr_status
@@ -337,7 +337,7 @@ export default {
this.$refs[formName].validate((valid) => {
if (valid) {
updatePassword({
- tsy_id: this.info.tsy_id,
+ optr_id: this.info.optr_id,
old_password: this.updatePwdForm.old_password,
new_pass: this.updatePwdForm.new_pass
}).then(res => {
diff --git a/src/views/statistics/HovStatistics.vue b/src/views/statistics/HovStatistics.vue
new file mode 100644
index 0000000..6c3fcb1
--- /dev/null
+++ b/src/views/statistics/HovStatistics.vue
@@ -0,0 +1,489 @@
+
+
+
+
+ {{ currentTitle }}
+
+ 全部载人潜水器
+
+ {{ item.report_name }}
+
+
+
+
+
+
{{ item.value }}{{ item.unit }}
+
{{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/statistics/ShipStatistics.vue b/src/views/statistics/ShipStatistics.vue
index 34ea8fc..eb1d54d 100644
--- a/src/views/statistics/ShipStatistics.vue
+++ b/src/views/statistics/ShipStatistics.vue
@@ -1,681 +1,505 @@
-
+
-

-
-
-
探索一号
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
-
+
+ {{ currentTitle }}
+
+ 全部科考船
+
+ {{ item.report_name }}
+
+
+
+
+
+
{{ item.value }}{{ item.unit }}
+
{{ item.label }}
-
-
-
-
参航单位
-
-
+
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/statistics/components/BarChart.vue b/src/views/statistics/components/BarChart.vue
new file mode 100644
index 0000000..4de1168
--- /dev/null
+++ b/src/views/statistics/components/BarChart.vue
@@ -0,0 +1,435 @@
+
+
+
+
+
diff --git a/src/views/statistics/components/PieChart.vue b/src/views/statistics/components/PieChart.vue
new file mode 100644
index 0000000..9dfc1b7
--- /dev/null
+++ b/src/views/statistics/components/PieChart.vue
@@ -0,0 +1,178 @@
+
+
+
+
+
diff --git a/src/views/statistics/index.vue b/src/views/statistics/index.vue
index 14e0077..5ca244e 100644
--- a/src/views/statistics/index.vue
+++ b/src/views/statistics/index.vue
@@ -19,8 +19,8 @@
科考船汇总统计
-
4艘
-
探索一号、探索二号、探索三号、海警101船
+
{{ ship.length }}艘
+
{{ item.report_name }}、
@@ -39,8 +39,8 @@
载人潜水器汇总统计
-
2型
-
深海勇士、奋斗者等
+
{{ hov.length }}艘
+
{{ item.report_name }}、
@@ -59,8 +59,8 @@
遥控潜水器汇总统计
-
数据加载中
-
+
{{ rov.length }}艘
+
{{ item.report_name }}、
@@ -79,8 +79,8 @@
无人航行潜水器汇总统计
-
数据加载中
-
+
{{ uuv.length }}艘
+
{{ item.report_name }}、
@@ -100,7 +100,6 @@
基站汇总统计
暂无数据
-
深海站、深渊站、国际站
@@ -130,17 +129,34 @@
diff --git a/src/views/sysManage/roleManage.vue b/src/views/sysManage/roleManage.vue
index a2c8b79..762dc86 100644
--- a/src/views/sysManage/roleManage.vue
+++ b/src/views/sysManage/roleManage.vue
@@ -8,380 +8,71 @@
角色管理
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
- 确定
- 取消
-
-
-
-
-
-
-
-
-
-
-
- 确定
- 取消
-
-
-
diff --git a/src/views/sysManage/userManage.vue b/src/views/sysManage/userManage.vue
index 62487df..ba52908 100644
--- a/src/views/sysManage/userManage.vue
+++ b/src/views/sysManage/userManage.vue
@@ -10,31 +10,33 @@
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
+
+
@@ -42,54 +44,64 @@
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+ {{ item.dict_text }}
+
+
+
+
+ {{ item.dict_text }}
+
@@ -97,347 +109,279 @@
style="width: 100px"
type="primary"
size="medium"
- @click="saveData"
+ @click="submitForm"
>确定
取消
+
-
-
-
-
-
-
-
-
- 确定
- 取消
-
+
+ 清除
+ 分配
+
+
+
+
+
+
+
+ {{ scope.row.voyage_start_date ? scope.row.voyage_start_date.slice(0,10) : '' }}
+
+
+
+
+ {{ scope.row.voyage_end_date ? scope.row.voyage_end_date.slice(0,10) : '' }}
+
+
+
+
+
+
+
+
+
diff --git a/static/img/01.png b/static/img/01.png
index 28958f99261caf2a58ef1cd0561121db8f9ec31b..fad134069e7836431bbbf93f9edda20717fa3c9a 100644
GIT binary patch
literal 1345
zcmV-H1-|-;P)6@q_#kVc4qf%=lo
z#t@4j)RqQCeevg^5urlCP{Cr@Y^;5dS|qy(5lXSyx&6+}?CwlvlHJYaesj+K&bep4
znY(jm)E0&)OeyGrxD2tG98>{qC-9HB89IiPcroXf$Q
zeN6$0(fptR-mg`Vp;9KbiFmS@P90rHZ$GV2UpZnEAVct*&eaY@
zS<{xiVRI?d^^QMY)o709GGUs4)^KYfzQqbij{o&A)6Wp#ReWB`q0I}`e8Zidnl+vjm)DI$=&F?Wrz9TmP
znCCoTKsk+(4|T0!SWC%DZS^aN2;kN4af5l#%l;UU1c3jTd&-6SrpmN8!KKr|#^V|FIVSO>uivwnAN;9!{+{x(b}sf*mgc9#0PUr?y;axk4<4oAUm
zs?o#w!1$Hi!yW$qB|B$MJVaz_vHE24f)si~ZfdF}O&ej9VU18-xhH
z)v*{W@@Q7LN{;4Lu>p@%{8oE$rsAs&2~ffSKf6{WA^?I(jS)|@^NrXxQs`BvuN;9u
z4yw&@Tmb@HxN@-PT9v005g^97K%U(^&O@l{BSqo_!SkTkvN5F)pt9~K{2T4TWlXsc$mKaNEc`o)5>X#<4{jzXCLET-QkhTUwO86
zj0kXl(eQ4y)gqC#)~UrzYLqAIArd}%l+#!QmOSrsXG{I}{o?yo6A|D?ytOvwmAJd$
z=hQWA+1Xu8^0s2&6#Yn#6~L>Sgm^zjv2iRit3krDM3)L$i#0z*Op6uZ<~evzE!VcU
z-baPztwb_gc$VB=0x-zBHs-LZfKq?zN9J?i=aC;KO)bUXREx3jHfQox!IxSlHK~3a
zRu!Ph%h&(cyKqtcW|ks(*A_kbPR_e#JLT#p8pn~orhuh^`%6YdMQ|C>&{DLG6?X7>
zR{=U_X#UlE`9T{wZD9hpmxkmxHYTMSEXrMJDV5x6wNgSi!0wqAU
zL!4o(Xo=h$IoYQ)pPcmkp?lW6^_r(>NPs354|kvE@8O90fb44@ovmIWPtHFr<_)lM
z3qMlKbbU>?q290nt+tR(orGWzY$Ebe``DjPw|#PH7a#O-u#p=sX1Yh{Hr$&MpjG*{
zdshrjs?Rs)xK%FuFE4yiOn1Gdd^2cTfEF+Ir(Oc&GQdwb!QG%=%%on#I@-Df=y^(+
zu5GmXN}l$84x_yua}xjn|Nqj_2nhfH00v1!K~w_(&|tvsRH*^x00000NkvXXu0mjf
D!>EYG
literal 3666
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
Eg75efIRF3v
literal 5252
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