From c1616ed744e87220fee6aa51e422f6f4a1288e3c Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Fri, 30 Jun 2023 15:35:05 +0800 Subject: [PATCH 01/12] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=BD=A6?= =?UTF-8?q?=E4=BF=A1=E6=B5=8B=E8=AF=95=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 8 +- .../com/navinfo/omqs/db/ImportPreProcess.kt | 88 ++++++++++++++----- .../personalcenter/PersonalCenterFragment.kt | 2 +- .../src/main/assets/editormarker.xml | 23 ++++- .../src/main/assets/omdb/1301_0_j.svg | 1 + .../src/main/assets/omdb/1301_0_v.svg | 1 + .../src/main/assets/omdb/1301_1_j.svg | 1 + .../src/main/assets/omdb/1301_1_v.svg | 1 + 8 files changed, 93 insertions(+), 32 deletions(-) create mode 100644 collect-library/src/main/assets/omdb/1301_0_j.svg create mode 100644 collect-library/src/main/assets/omdb/1301_0_v.svg create mode 100644 collect-library/src/main/assets/omdb/1301_1_j.svg create mode 100644 collect-library/src/main/assets/omdb/1301_1_v.svg diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index a211f51e..20ae5c30 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -224,7 +224,7 @@ "k": "geometry", "v": "~", "klib": "geometry", - "vlib": "generateDirectReferenceLine(direct=3)" + "vlib": "generateDirectReferenceLine()" }, { "k": "geometry", @@ -250,19 +250,19 @@ "k": "geometry", "v": "~", "klib": "geometry", - "vlib": "translateBack()" + "vlib": "translateRight(direct=3)" }, { "k": "geometry", "v": "~", "klib": "geometry", - "vlib": "translateRight()" + "vlib": "unpackingLaneInfo()" }, { "k": "geometry", "v": "~", "klib": "geometry", - "vlib": "generateDirectReferenceLine()" + "vlib": "generateS2EReferenceLine()" } ] }, diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index de475584..556bb376 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -16,6 +16,7 @@ import org.oscim.core.GeoPoint class ImportPreProcess { val code2NameMap = Code2NameMap() lateinit var cacheRdLink: Map + val defaultTranslateDistance = 3.0 fun checkCircleRoad(renderEntity: RenderEntity): Boolean { val linkInId = renderEntity.properties["linkIn"] @@ -50,9 +51,9 @@ class ImportPreProcess { } if (Geometry.TYPENAME_POINT == geometry?.geometryType) { // angle为与正北方向的顺时针夹角 var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! - if (isReverse) { - angle += 180 - } +// if (isReverse) { +// angle += 180 +// } // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角 angle=(450-angle)%360 radian = Math.toRadians(angle) @@ -65,20 +66,26 @@ class ImportPreProcess { val p2: Coordinate = coordinates.get(coordinates.size - 1) // 计算线段的方向 radian = Angle.angle(p1, p2) - point = p2 + point = p1 } // 计算偏移距离 - val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian) - val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian) + val dx: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.cos(radian) + val dy: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.sin(radian) // 计算偏移后的点 val coord = Coordinate(point.getX() + dy, point.getY() - dx) - // 将这个点记录在数据中 - val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)) - renderEntity.geometry = geometryTranslate.toString() + // 记录偏移后的点位或线数据,如果数据为线时,记录的偏移后数据为倒数第二个点右移后,方向与线的最后两个点平行同向的单位向量 + if (Geometry.TYPENAME_POINT == geometry?.geometryType) { + val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)) + renderEntity.geometry = geometryTranslate.toString() + } else { + val coorEnd = Coordinate(coord.x+dx, coord.y+dy) + val geometryTranslate: Geometry = GeometryTools.createLineString(arrayOf(coord, coorEnd)) + renderEntity.geometry = geometryTranslate.toString() + } } /** @@ -98,9 +105,9 @@ class ImportPreProcess { var point = Coordinate(geometry?.coordinate) if (Geometry.TYPENAME_POINT == geometry?.geometryType) { var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! - if (isReverse) { - angle += 180 - } +// if (isReverse) { +// angle += 180 +// } // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角 angle=(450-angle)%360 radian = Math.toRadians(angle) @@ -117,8 +124,8 @@ class ImportPreProcess { } // 计算偏移距离 - val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian) - val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian) + val dx: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.cos(radian) + val dy: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.sin(radian) // 计算偏移后的点 val coord = @@ -137,8 +144,14 @@ class ImportPreProcess { val translateGeometry = renderEntity.wkt val startGeometry = GeometryTools.createGeometry(renderEntity.properties["geometry"]) - val pointEnd = translateGeometry!!.coordinates[translateGeometry.numPoints-1] // 获取这个geometry对应的结束点坐标 - val pointStart = startGeometry!!.coordinates[startGeometry.numPoints-1] // 获取这个geometry对应的结束点坐标 + var pointEnd = translateGeometry!!.coordinates[translateGeometry.numPoints-1] // 获取这个geometry对应的结束点坐标 + var pointStart = startGeometry!!.coordinates[startGeometry.numPoints-1] // 获取这个geometry对应的结束点坐标 + if (translateGeometry.geometryType == Geometry.TYPENAME_LINESTRING) { // 如果是线数据,则取倒数第二个点作为偏移的起止点 + pointEnd = translateGeometry!!.coordinates[translateGeometry.numPoints-2] // 获取这个geometry对应的结束点坐标 + } + if (startGeometry.geometryType == Geometry.TYPENAME_LINESTRING) { // 如果是线数据,则取倒数第二个点作为偏移的起止点 + pointStart = startGeometry!!.coordinates[startGeometry.numPoints-2] // 获取这个geometry对应的结束点坐标 + } // 将这个起终点的线记录在数据中 val startEndReference = ReferenceEntity() @@ -162,7 +175,7 @@ class ImportPreProcess { if (direction.isNotEmpty()) { val paramDirections = direction.split("=") if (paramDirections.size>=2 && renderEntity.properties[paramDirections[0].trim()] == paramDirections[1].trim()) { - isReverse = true; + isReverse = true } } var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向 @@ -170,9 +183,9 @@ class ImportPreProcess { if (Geometry.TYPENAME_POINT == geometry?.geometryType) { point = Coordinate(geometry?.coordinate) var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! - if (isReverse) { - angle += 180 - } +// if (isReverse) { +// angle += 180 +// } // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角 angle=(450-angle)%360 radian = Math.toRadians(angle) @@ -185,12 +198,12 @@ class ImportPreProcess { val p2: Coordinate = coordinates.get(coordinates.size - 1) // 计算线段的方向 radian = Angle.angle(p1, p2) - point = p2 + point = p1 } // 计算偏移距离 - val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian) - val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian) + val dx: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.cos(radian) + val dy: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.sin(radian) val coorEnd = Coordinate(point.getX() + dx, point.getY() + dy) @@ -254,6 +267,35 @@ class ImportPreProcess { } } + /** + * 解析车信数据二级属性 + * */ + fun unpackingLaneInfo(renderEntity: RenderEntity) { + if (renderEntity.code == 4601) { + if (!renderEntity.properties["laneinfoGroup"].isNullOrEmpty()&&renderEntity.properties["laneinfoGroup"]!="null") { + // 解析laneinfoGroup,将数组中的属性放会properties + val laneinfoGroup = JSONArray(renderEntity.properties["laneinfoGroup"].toString().replace("{", "[").replace("}", "]")) + // 分别获取两个数组中的数据,取第一个作为主数据,另外两个作为辅助渲染数据 + val laneInfoDirectArray = JSONArray(laneinfoGroup[0].toString()) + val laneInfoTypeArray = JSONArray(laneinfoGroup[1].toString()) + + for (i in 0 until laneInfoDirectArray.length()) { + // 根据后续的数据生成辅助表数据 + val referenceEntity = ReferenceEntity() + referenceEntity.renderEntityId = renderEntity.id + referenceEntity.name = "${renderEntity.name}参考方向" + referenceEntity.table = renderEntity.table + // 与原数据使用相同的geometry + referenceEntity.geometry = renderEntity.geometry.toString() + referenceEntity.properties["qi_table"] = renderEntity.table + referenceEntity.properties["currentDirect"] = laneInfoDirectArray[i].toString().split(",").distinct().joinToString("_") + referenceEntity.properties["currentType"] = laneInfoTypeArray[i].toString().split(",").distinct().joinToString("_") + Realm.getDefaultInstance().insert(referenceEntity) + } + } + } + } + /** diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index 3c687be0..c1383b38 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -112,7 +112,7 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) : viewModel.readRealmData() // 定位到指定位置 niMapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( 39.799624915997725, 116.51407667184905 )) + .animateTo(GeoPoint( 39.79440941020727, 116.51302718503038 )) } // R.id.personal_center_menu_task_list -> { // findNavController().navigate(R.id.TaskManagerFragment) diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 29d2d7b1..65f6c03b 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1600,7 +1600,7 @@ - + @@ -1818,8 +1818,9 @@ - - + + + @@ -1834,7 +1835,21 @@ - + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/1301_0_j.svg b/collect-library/src/main/assets/omdb/1301_0_j.svg new file mode 100644 index 00000000..8ccdaec2 --- /dev/null +++ b/collect-library/src/main/assets/omdb/1301_0_j.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/1301_0_v.svg b/collect-library/src/main/assets/omdb/1301_0_v.svg new file mode 100644 index 00000000..17134ff3 --- /dev/null +++ b/collect-library/src/main/assets/omdb/1301_0_v.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/1301_1_j.svg b/collect-library/src/main/assets/omdb/1301_1_j.svg new file mode 100644 index 00000000..36afcd59 --- /dev/null +++ b/collect-library/src/main/assets/omdb/1301_1_j.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/1301_1_v.svg b/collect-library/src/main/assets/omdb/1301_1_v.svg new file mode 100644 index 00000000..94806ed0 --- /dev/null +++ b/collect-library/src/main/assets/omdb/1301_1_v.svg @@ -0,0 +1 @@ + \ No newline at end of file From 3f173aa86f0b467d5cbd13505bfdce8a3af8eee3 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Tue, 18 Jul 2023 10:56:21 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E9=9D=A2=E6=95=B0=E6=8D=AE=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=BA=B9=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 3 +++ .../omqs/ui/activity/map/MainActivity.kt | 1 + .../personalcenter/PersonalCenterFragment.kt | 2 +- collect-library/resources/rendertheme.xsd | 1 + .../src/main/assets/editormarker.xml | 9 ++++----- collect-library/src/main/assets/omdb/test.jpeg | Bin 0 -> 80656 bytes .../library/map/source/OMDBDataDecoder.java | 6 +----- .../map/source/OMDBReferenceDecoder.java | 2 +- .../collect/library/utils/GeometryTools.java | 2 -- vtm | 2 +- 10 files changed, 13 insertions(+), 15 deletions(-) create mode 100644 collect-library/src/main/assets/omdb/test.jpeg diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt index 64ac2675..cbc2aca8 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -153,6 +153,9 @@ class ImportOMDBHelper @AssistedInject constructor( if (list != null) { // 将list数据转换为map for ((index, line) in list.withIndex()) { + if (line == null || line.trim() == "") { + continue + } Log.d("ImportOMDBHelper", "解析第:${index+1}行") val map = gson.fromJson>(line, object:TypeToken>(){}.getType()) .toMutableMap() diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index e9d14e89..8c7ec3f1 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -164,6 +164,7 @@ class MainActivity : BaseActivity() { // 在mapController初始化前获取当前OMDB图层显隐 viewModel.refreshOMDBLayer(LayerConfigUtils.getLayerConfigList()) mapController.mMapView.vtmMap.viewport().maxZoomLevel = 25 + mapController.mMapView.vtmMap.viewport().maxTilt = 85f //关联生命周期 binding.lifecycleOwner = this //给xml转递对象 diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index 8dbcfbd7..e78ff100 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -115,7 +115,7 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) : viewModel.readRealmData() // 定位到指定位置 niMapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( 39.79440941020727, 116.51302718503038 )) + .animateTo(GeoPoint( 39.7991980627346, 116.50936676873703 )) } // R.id.personal_center_menu_task_list -> { // findNavController().navigate(R.id.TaskManagerFragment) diff --git a/collect-library/resources/rendertheme.xsd b/collect-library/resources/rendertheme.xsd index 3d4d76c5..6b2e9c6d 100644 --- a/collect-library/resources/rendertheme.xsd +++ b/collect-library/resources/rendertheme.xsd @@ -144,6 +144,7 @@ + diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 3d2a4ca0..f6ef4f7a 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1600,7 +1600,7 @@ - + @@ -1835,10 +1835,6 @@ - - - @@ -2237,6 +2233,9 @@ + + + diff --git a/collect-library/src/main/assets/omdb/test.jpeg b/collect-library/src/main/assets/omdb/test.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..06d62e5ff585f50a177f4ecb0f6b09db3c4fe1c3 GIT binary patch literal 80656 zcmb5VbzGC*8~;DLdvr*Q4(Uc|Hku7as&sdUN=Z#XHbNK-5JrrWF5f6fH;j-5kq{Ix zKosjc-tW)%`}_Mh{@CNeea`FkysmR|?sM*Q@pt9#4uH|v5Ml@*A|e8S2|s|p>i|6f zB{?|-ITq*t=WjoNiIV7?B!+}Y5J1dCM8ZV$ zcL=}(0FV%1uX+FXAtELLkdl*8P!g`1Fan5)NJxmuh)F1jNl8d4DgM36#4I4EV@1Xy z=n|5M1j_4@3qhZ?49ru!Wd*s0D(HO@7772%rlf2DbBm~GeQlGZ7=|K>X zh4r9rf7bxCgto*?Bus$YfM2h(#g>O7?vYy#`&$k3Sn10-WQ*-)h=&*fLyTCV&|Sji z3RJ43>-BHN;FSo~3RFR-c)gV{Exfvde6_;ZK`4@>?|m z%#QB#&J%@{=0T_;iPHy;^jY1enQhF~=S6>G7wK0(FlL|^&jO%()_4`J2;mXta2ws~ zY>pfdEXjvuw_D37;H&VCGvg2&z~yf1QDE`U`3W`dUohtMkmctevFk;U29_)k0#ug} zG7CJ$WoC5uXhr$4Z=SaO?jOKdhhnH5?!`!MXH;xQ*z;@Z=!Ce(P6nK%`AQCV%bRemg9 zoMNlk8p=rYy<(cjD69t?UnPQv)Tby&xYt6p*Ihc~9fH}&l+&1==X`C8meIDQyHj2RZrMKbpvXClq?|0hYzc*x} z$|iI!E1NjMmV;|WXfgA{uwkKz39ukUDH!XiJ*~`LxQ7(#+O-Uha4H@{>`S4EOqeW#6m>hzn;8x|xI$jfy0%8K8yP-bwcICR-D?3&q zVsntJURa$0zZCYJnj+2mhDuqg780 zJJ1;(xr3tLo251rtoNZdR~rt}Hj7@Xt>@lPdvIhjw3Uf?I4&q<`XxucXMjRWUQD45 z!_TtK3ZG}Ax(x&h?LBF{c?q}IKtp4ReMc6b<_9lA3l|}@pYS%H5_nM@0w1Sva)>ZE7Yu1l#fcCsQaHe-~tftVl!LiDAXdxn`UX&gxq&fN{n6~;s% zeZ2f7^Wr5ivS9(p0o2)zvl2@;&BXBmA%$)^(JxaZCJvQk?8cj^SEGpqPArtXGVJ)d z(E~(k(`--R8q^+{GCvs*M%31>xL#d$t}uPV#n+5#qtgnb^}K1ZWgec&8s$uO#}w!x z0WNu!8oSp)9b^gg!9IsnJ=OJONfMbT<#Hzb$0VkoeW?|i&rDk$Z3i5YctcwaBJK#0 zjwBhL>-)aQ9rj2FLaBT({p?4rPM_8YE>(utuC7;6HmoJyFnixRnuJc6?UUDMd5|_t z6sR&oAB%oi+Z*UD(`;v0CvX0`tDxy>fZ|=OSDKy8%-|~rapq?;gVkjGQ7)#h4I-RC z9#0^d&77CjOcI&7&E?XmKlt~)_+THY*Cn@>GC1geZnZU^Jqvs~Y0qsZ)VV(I@q}Ey z-}kZxT%h%hf}_96(WN#w8S};Gs^VzI{z1|tbL~bZ^_BzpYLI?C$PC1_WX+p*@xefV z3FAm#2*i?@23ETW$=5$>Xd#m;AhFfhnP;p>fN%iGY8N2`<1=QOIWg(A^b@fcSPO26 zd!~$kz8z^|ksYa|pF;ZB?2-y60gjl@7CgiX^)8>m(&W{m6ryU1zr#08%&i_INfOs? ze3XoVNczD^-*E?-Nxv%MD%YU@?L8VO6yQi-49!s-IVyBgpc%?SwGP#}Nf8BxhS&!z z8SXh-vL!pp4J?M`T1da_E|86c4SX>69P%$pY1SKQ{Dms4%)h874$11OfP-M%s${7@ zchQm|OiRt{RiZmzKCbf`{YxROCdvqHU9ZR*!)w+4zdqFk>rN&d8sghp-ot@{0gem^ zC{eWvOtG6s_p?yY?Gpho($s&4?NAiRwqzY>h&-`d-Cylg&kprPt^1|8(*3a5%1icM zRiJSh*uC=#WtbuIz_&j~uJhbjA7NEOJV+r5oLi?XzB^dGm^v%3@Nq3W)Mq$+Q(8?e zDZhZAI0&woH&XauOPZL~bFK3)Y!Gl`Bio4|@X(O3=gN@KshrFd;GRAro(x68YT%j`q5iC^PvO zwjRNE2?LtFh@~+kj1SG^P!}OB;&$)IOaP7nGvWrliJ4bESxxR)N zK5pK-jW5A>lrg`*u0CJBZjaG$v);ur(9lf%H88nz6KASMFj$yjJwP<%=>raZ$!xNR z0?g<46_d5~frkMvph77U#WUkzo4v2vhJbI?avm8g2Q5$Lv0N=f!cH?slyD6`Nk;aj zgF-{1nRQFKq@jfwmh%biq!vpH#eFSxopMHM(5$#Dg##CvnkmW;c)nvLS_HP{Yo{Dm zHMJCf>07U9Y^Eq@z0fHhZY3iUrP|$2F;og+X3v(u{kJX!5@u@E3NpfKwaO=9EuB1- zdn>&eO6S_6IK-Dn0D$b%X*hFD6e{X=g`uUm{jFs3o{1_Bo0pInSig%u)RyF{u0cDk zdOV@fgv%ZKV~z@y`yYU-4fum{zgh@`E>TAUvh)`PnmnKFgmTBH6;k_2jtyA5yAUuY z&soJ`N;Cd5Q$&AYsMZm&ni}YE4V#6hTJV!XIwudaFnNt{gac=uH&gJARS+6M_|Cf` zK$j=(wC*A~Q4KjqYP(6;M|*8v%{9n-0P)dKakp=_mK`0!-X<^2-<6-3x(UkHMg7Th zGrS8C+RArB77G_^rLltOASO?|{G@Vx_&?h}yD36wT9fboIz{!=fCKpk1-`@*RY`=L zINOsjF|op4nSFo8`x3>#_oG}Wzp%h_R$H~sxYft9hT?+B<(JC-z*?kU1|z z7?T~M-nmq(c98q|fvfGGIvrrcP=Rw;GY_=-@-*>@R(?Z!C+`mf4xxMp<=o*BU6dc%xMmhN_STnZjjx{DlZzE(!1^;*w^v+;Rrl%$f$(W?i z#%QHYW4<^VhYv=6<;mSbxoG+IB9BEvKMflZ`}-X>s%jTZ_;#i-?6IfEUqD>}7id!= z?u9p(<-e+_nsHDAZ|l?zrb*APe2p;^jcZXv!w1<6T^_kx73AmmfH;xPyK9RFUGn3( z$Ck>RbyBoBt&+~j&RKV*uc)83x=HL?~#xq~+y z6&D;it7xMvmG8x3Kd7MU(&);pcqJW2C0Z6gPW}bh@Y68|R@r5rl>2nOdQC$Dl0pPq z@GXfotlBBR?d|j~Y~u5jI#oGOdB^Ir976o))<194_h68AjKqwPl3v7>_=ck*K8Yaj zbWsPQ>mthc}1G5tsH)3=U&%7#^Nz#z#B z7K;%71u)enVD-UquGH?PZrR=7A-ev?AfCEEHJ+wHb!fv372_7(b-?DWzW}UISM*yC z_`vO_Yn80I_2e5W!Wq@kr(AHU{|wqEgQfGte;+*14<%D9hP0XsDGgo&uC?RE_W{3p zK3MR+FrbkrVOHj?cfby0*LdFTtqU~@{wgPPOhgC}*!XI%_d0oveiPsZ3?crjPT!}> z(~5O5+P7t5mps{tS9Qy_+{yU^$)x`YlRQ10d}E`S#T=OLdb^XTSL-hTY(!$fQdh$A z!!Wwm$o+W2Trbp7@yq|`!0H1J@qcDrPfC&%`g znmm#xvDk`;E+UIF_0n>vnA+V6+8;X2t9GI`0)t&&$oY^yp!IgKCh-dTJQY&>Ua4x^nT^MU^P^GxJ z-6ZZ-ZHB7pYEQ(Odz)qw1dYX+vcTM4iEEiwWAr91yb(~%(Dudx=brPUddss-vFMM| zyU2j-&}#;?UFM^pd|rv{Rw;tm76E`lxG=k?D&={E$LSJ@F%?@va7bysQkQ1g^tR#| zPnLk1v$|{1vcY4({tGv|5q2=|RvdcpyGFvG-)qJguC?Z|e4+_{m!(h(?#Nk?i^I2mZs=cq< ziXXF`PPLB^QcXgH`Jk~A68y#w8$Idl#UEzxhG#gh)_0BpMNCUdKGn!kcWubR^C;T$ zryq)zp5LKy>rkU*`BO)o$soF|*y^-Bz;C8@WGti=b7npc30tjR+t~uJEvS$#9)Pd zITUwzmiZ6Y(rc`_z^{p7USyRLGS=KVveFb493xRCu?GkNF*Jsw*&$BrooHsClTIwg&GfImkYL zvF`YDjgn>8t8@wgOe4Ra1T?Q}A#?-yCGWSDyZmd-cd=9lEIqUMX5{(vNGcy)7kbJ@e9BFF{h=1WUs!H3pSX@Ui zVKSxiYXogh*a9n7zDN;=FAv+off^9cY=yglu2KG}mJA^#m%hDrCH>O^v|~91LQ<-i z*vB(c^8JTMgrLuz3`)hHm}w{kt$0VWATVDfGIG5NcslcKBDB5wjzoBq+DMp15i_}~ zlI*)JG<&3K1mKcYPP1vKj_%fB7`&X$#@@8m(9W~G-SdH-6t@1ljE?V|HYYv{zPcTU1SXWX-@3f*OR)6zb{W6^u z^3DoReqyz;RE4R?;Dky2Bzt#eTs^QJm`9GfleV>XY|C)Fgo)euoqGC=F9P5ALW9m! zb!4@Yv{l0gB}*?)sbM|6I4cwr(v+fl!8 z@t9P6QWmVhdxx2G&SZ|$1=06INNl~5Tosn1;>1}93 z?QWFxxqj6IAxx^B?ekmX`5mejW`vnW!kbD8gw*OLgI&7pNn^ZJ33d)!KJE{ghbo2m zaabhw<)H`IN3HQSe)IPa0hTH0%@RKed0Dx-p520@5;=*mE8?ZQU&16QckfV#?`Mqv zr=)KmwQ}>-v~foBgOT?fTqc-*$$Mnj48Sw_BPL8GKWzkJ9?{Pz<#R&GmEfJF_V@H# z#Ky)X!oZigoJFn~;m=0wFvkS+_J+OgE}@%uzux+TuriCB;%F@?8)L&ofp%@O6{^7F zt_tV%CSm)IQWZC0JY<(Ys=7+;d8AszX35NbK-4Cu*LO(ahP3qdHi}8{HT%sEk^>~1 zP2T&xo^Yv}+m&VxCOw%mE&9EdI|ZV#*r()@9#1DGTl(+Cqpi(zK4dM?(g~lwZtLvL zU!Q4}Fbq$UcjUZ+=`O^W-&?dzQl91zEij^yGFBLX!QyaePw=}tVj%^Z_!gxl5BWRh z=6CxJ$Boqji;|fMUaXEah3Z%@u#j;2EWRFeAQ^J=>9JeF%fA4{91F=#P?lk|L>Po$ zCt_yOpd7uP;(2y9PMP@<#(v=ztUcmOB|I*Wac6dK!6vTAbP74rYyD0trcRR}BU%u_ zl0{fDDWbyDoC0gTeHvHbkrTEzWh3;}bvUIAALhBpr?0%K=V6pX%T7z)DiR{m(wPQ5 zWiBcb$_lO_?fCD$j!;vJ?aBwC-ln_S#xEeM22DAw=yPJ+`m7G*1`fP0coPWeMflji z9_PxufN6tU2%!4Jeu2Ejy-b|C%CF$6{BBCDaj6%~FaDI+xOeAGK^2|EM;wX{#3>44 zi;<&!AdJ8p?m8|mKh?;{i6}ZT59<})@xvp-n+hgu>Ma9=*#SB>ou*B6V*GW&Lo8jE zfadUM$)+H5)7*yZAM5-Ye`UkJfEwV}_VT)>)xEFQKE`?t)xTU(Y9LRdIobv6g3jY!54yGtS;mts>FN5*<3l0X7r@@a6Y;jc#4YdT8u1T!mQ2@buVNhKwr? zPmDG+{lTM71FT`N_+{uXz*icRP_y)CMx_c4 zIu(09C(QYw?`Caj@*1Y_xSzG{Xqsh)Sy{V*=z}ShD1z34qap^h)iMVBMLWlNVgPmR zkUM1UwPJSd6z_RvaJ^ZswPM~)760rAgb+?`3_EOuX|IoRM#QjHmH2E0BVTbbx>;aY zc3vcF0tEu}NSQ>nf>IQ*3hPj*ic*9^3kLdus{qet>QTW?tcI1a^FR;b4R1FEQP?(c z)cDkoPP)4S{8J#GrvAo6v-4=gZ3p$7t5}!^qx-x`Xxo+2IqT@~6GcV)*2JaY@`)y>Er5F{`sSF%}12r zf~}ZT;))0530hjraITinR!we*&>ubKmV;9JfUkbu+mL^C(?No^?cRtO~MhNL1;}K)Rs#iDx8wXNURL`F=%;Ud#G3jk%?v znDUAX_J?^WbD?-?A*mSt0Ml0f%rRRq0VV5M(PNpzrWHlLU1C!sP;fBSjaY;4RS+h@ zx*x_}G(rjUvJ^=^*ls4(3?ZqF9CaHSJ?gZ8G+lFV{kf^Dr^3A_$uK7faT8;Sc)}f{ z+tzI0UzL*lPGQJliH(K^68#;P78lb?wjXjl$bo*)gX5I)6cPfJsFE2xL37SytMv?D zBm8>kkAtCo3yS^M0torTOi~1+dCX&#RgRgIF>!mCn!K@2?4ps)4M1KfJ{~~8-Py+K z70N2Cdm(n@8Lx9&{9z`c&94fOY=PjrWg@jBl#Jlfg}GcbQ(xa;fm6W<{fa8C36y9{ zots3f*qi;Z7KG$jgPW z>$Um3<@c8F+>j`FBT4cD!sI0clG&aq0%cVA*ef1wcF>EBe7lrqgGRi&pUGp1I$ko- z4K<=m5k2)CC`>e-Lb%%$&HMzJ3>77KJBe#35Fuikpqszi)7y|J_Mg{I`XJBqaL~!0 z^OnAjg#u_q;!8t%3BY$0nUjP$B|iZ;YSVi!Rnh1Fqka>F zgDg{6B_o*cI2byRXwv`PCZfN`7nc>&B?>Yo-6hreOvRj2R{m-v>k1k|2IDBGwq^ z2m=4IevW8LMKBSN-Rf)5t3LcF2wFKd|6cM1IV;lxo(7_nUu}boa^LD95q>m^q^NjH zYR5CP>NSo>!>=OAhcLJ%Dbg>spBV^uyvUU> zZ&pvD7lVWmWJE!K%872rwnQfy=SpMjU!@2<;He>J|1x_l6x5-)FzT-><$*~J?tAHr z4yZ^scD!^WK<5j0_U5pP+P&jXMkKX@5;dh+k|@i2pA^T(Tepn!)XmHvN%ky3f4PT# zbcw(DJ)PsH4YsEyw96Aj#+OH zOQrna`6yPO2jj^zw2Jke!Tw`o1m_mG#;ESNrKLQq zV=K3ZlVXC%O;8Se%^TpQGo5LO7h*j_)KBtwS==qBT_)y7zXD&bH9Z$Mp9xa@gxq6F zOc~d7O=`ZsFZM%bC+$L+u*k+D){{0~Kyn*6^A_-WuXJ%jh^F?T z1JOHV-&FwOUOpsH01|fnkh^LBMbRCxJws- z$G=s7R4-=_zA~#BT1{cp@5z-w7dbL9K=Y+WiO3YI{}_Ee*!FVdnTXGrbP~M0^=d=6ThaFR1FUiaIP& zkA$qm~0WEo@IeHKdYQJ#}hz7!hp*J>-7*^AR0 zl31=uM(&d?Un7)_3Z_7v1tlN1Y&UmP11?9r->PzEI*&60;8h`-ubrP5d=~wxRzd`9z#pCj&qT5pXf1-5!&_P(86MteBM}zZjFEuG5wHU zis{MDRff&sNr1(JT5L$l%E^gcKj-9L&{okdj5CwRvr3^_s>y}8`6mXyD{kkKYTGg` zCui`ZkT`A`%o-fIo(Y#F&v|KR5nEPQj7ivw#oy-9M6y0^JLP3-#kt1Ri|T4wMNknw@$iQ}hZeEXxUQ3uZyT0{Pjx;$d< z>H&px65wsC4Uiybk#6fgL9V3GWuyjBTH`yvF1S-dh(f9LpK8-gWY$qwQ}LsMJK#C(9^!pLk>{#hAKy3O!$VRGzG}@NF%=@iLu9U0`qMv znI~;@iiI`Cw3BQWsI7n$}i`pa?4ujte^9yYGBHa~bX~DVH z4*zsCp=^EDdG0XpUNQj&C8!*k2IP);+q5(U8hxv_6P4;5@M>V3&z4i-W}^0&ZsKHe z*L72)ruUge1{}w*LUu5tzqc zT{|CTfqy{5Ixh+xoq$>Hrq9MKb?Q2LDetoS`*9;Xq~J`|nMXu%VY=eoUUA_Z`6%A3 zjkWcPcm`iRh#-!T2VF^T@Eh)Zj>CZWF+HS53(5GBb^gR%INqHCM3^P*L}f6y zB(+=y`kY-qC=04WBRaYznI|3*yjJU&g8V+944{#mYXvtMvH%p|g(SIY#ZD8YQB01x zTrxff+|c^YqvD`_kJiPc>((#mU;v57yZiObp(+g@{6gWZ`SNKJ&l2nYu(DBPI6`s) z4Yz$uZgFMQsB7Qdz@q~>qXNr^7=)Wf+B7=1|5Pso`J|x?VEr?TEe_g0P@-gZxt-@< z?HVqL{gVmc{dF|fcA#q=M)3L#*3d`$RyD(34c!V2nRh(rdBl3xoO}{JuCvr%vXI}^ zE(meA(Ik$IjuZ? zobpr%|9`{SESOw-Eo&$%eIMl(bYiaI4U(3E5;ui{w`1|r*tY>gIGnj|D(OK(Cyoco zA0VQWnbl(Xc#w(J`l$a{?HLe}EORpdoIyDIzj3I5(l}|hN}Q7tj^Nsv6->C3c=nJl zFH9Z_Xnv3}stVuvY}$zf20m+cauf0;1b|!EZCk!$WIz3;-H7kBlE0&vZP$9DQ=3)+ zEzI9Zw1>29(SQ!WtwjI{cI4+@*Q6F2uz#!)7+3|LS$V9tuEyCJGLDcvFOuu}R>Q*x zo|X!v3_}_IoXc^TA|=)*Grv~qUB`MKbCZowaa#+0+S8{F--+OvOJ^l_I<1Y4QT5`Q zT3i1MfE4j}4WZPthfcsbdW7_M3uHsM&n&bmrX|L}=b6q64OCpsv_v6EhD)JC`wLZG z4eHq~MbEvT#M@9Av{#NXi|CAT5nhR7W$8jydD}WDe`&GmVpMr!7c6|+jGvcH$R&d@ z2F3pEcRBRPrP9s)b=>2yuSzG3m7+-gFA=rdnP+HW*GImQB%P6syeJ7W)l1c_%+3!|h*dsh z0v))x;G}gv+J}y#mABU*TbvWa!D}SSJ(oKcviHFZUnr;#_nUv2LfZ(ZncRsS{<>@Rml+RiZRC@wiCTI-;qtEe+g zNJ_rdL=WbF6nkWIlDpOrLTxLE>n--am6>?aSY_!>sJEgpmgaEP!hM5eM}b-GQ1lPQ zl%Gr@ttr_La`ZJ2F|QqcTDfeZL{jtJa(s%2MmwCJMb%T=Oko8=s#9}RM2aW*mWp&n zJ6OvU3rY95MtNW&re7czJkr(pZDG@ISoG_){tzlqqqqjHEw;|^u`2a zaGnr(tg&FkUU0jEa+lD#<&6?rjZg1|&wI8iy?+|%{{mQ>@&hu|{Mr6UEfG#-orXtVVq!ySKaiGX#{jxMoCT zCK2@To2~S_=8iLQ=q#vUz%^dkH&@pk|1865=KHk5|1^=h9Ky8Rj-^-KIBfK$(#xyx z*lNV~_>3||wJ*e@40gKuYiI#N+dB2Yl#wn8U1=m0%vd8IKC74zr>1PYwY9}vH&+nN zWtq;APw}v*CUt$Blbhr!3_|u#d8)kHA88}s1wAQL87#ejMcNo0XR<24wVkH8^(9{_ zf_e7XHC|2$vg5X3JfT|x!Pau9lqR^Jd>24NY$E9lvpZ1XX6z7L%#P^UG&b^D4+lAic&|}+i@WY0=JT? zbd$|eCO)?eUfIE2D2l#M5%EZ7fL{K=G5k$rg?}0iQyI0-o0!Y@Inh2b_5@S6W6{Ll zb(aJ=app1OxX0&K#cJjBT~x)*E;LZ|>)jyuhjK5pM5rFv|Hz8s=49gTC&2Rie?e3gb7=I16)zKB?cgIc;=DZ3+-HubPAH z?k`|%8P`;4@0#AYdGEHvVQ1$HW^#q8X+na!)~ZZBE6ktk*Kh;pD_buvf7Y$86nibo z*Jr)aT;v|)g6yHJ4iuR6So)7X!~2pB{8DV9?1&F9y*O`uuQy^HQbqxWw<#tWW|teK zMFq{CORB9j@`jUd&7WMV!><;7%9g_nF% zXYlP?!s6|*R03l{_A@l}t2IfIg$*0NGT(36J&gX~)cNhQ!XQj@MDGRpuUCN*)+2to zjU*v0=J4#vH`@~5;N+_pfHAqGo`asfPhAD45Me$~3v6!x$;ln|{|gfJWrj-agH4iT zdVo9E!x z)-YblaBJ(lJF?VG6r{5MGX(xB^}rr!wduU@svsD0J$l|$_>TO?X`e>2@uuJ7-WvRp ztLi~PjEV}*QPI48b(d_d9jJa3Pm&VPsgeJ}Al;Di7dnIWcqz5*zkvMEfq-Z`4GX!P zQ@w}xx>zOMl(wPdZmuO5-n<9DzuRtl3X@RDNp2~o&4N~bn2D^Y^E^%Cpl7$M$Cb0{>D0;G196z++C8Y% zy6K$kQtxZoaBX9m5|q_{00><*fN?O*VT5y?u5xtzW6C3`eRD zXgM~V)z|w?TouO?HT7`9y)C}m&crylaB+ZaygzQgzQ{nLX(J<)zshQt^4lS1S~2(^ z@6e&_#5(-#QDFr>Bm2~~x#~~N$&*IgFXQv2A}i!MV&l%HDR(e^rf1K)jAPy*C+b>g zuG;YqAGXF#R zN>4`!1^pI>ZV1fYxa%jSAUCOTe1b~Q+FkB7Onc49E-Oms2K{O&YAr=Ss=G7?oyZKO8ZCsQDrtN+EAg%z>)6DAu- zvD^&3rS(2{!b}xNyx@}Y!7dq5S0xn7<HvXTl*P_16n^#WS7!lfvQi!4 zWhhC`%=rG{IXjgUQuCL8Qss%9%(s-)z{eB|i-^lrj9B0ufn= z&;~5pyS3Uo=u}xdmqL!r*o%^DlQibC_N0`=22Skv^TwIMSc*h&=NnG$Mc1k?Ix{sY%J7B)g*_=fB?k_N znQ7FCS`D!P;ftsRGwG{qJ;D=uV92=$9O$U-IAJb~o-el*vSve#YthVoDgKuEtRa=8 zmT;s1c}(ZsttGDFnPCD2r<0qmCXp%%ju6GVHH-9G4Z2$IbMyE`pRh< zQuo$y|5XQUHu_}E(24093?b32&9#6IZpWZzzKR)Wlkh<{sQp5eZ$}TLeI`QKd0I?R^|*`LW%}}ql>9!vggO~9lUnj-Q)#5EVFE$fOI6_lPb)6I z;|4;)KhoxuL*pT8HxBX_K(8L;tJ>snCvTkH3;*^ief+DP`duP9v>B%=2WMtp64R}_%t=0vc(HhzHzA~L_^%D*NtjmKOzr0zgT*en0S*IVLsifzyKi_8QkwAS806Qu zc@L4NVjFnuo~S7I76OV#7v+tsVovf^l?ELXBcqRVXj#&~!{M2tj`4X`rEf3q*i zAT{PlK)k&5nL>O()ZnirnKK#Y9mn+% z?2dxM=WoF2{|(h+hhX01M!XIt?Nhn?OH`Dg4s$&t3s~((Q*lp|YsV8^2BjIoa9s{V zC5xDsA)cA!1dgCG#9`9a7b9|$=wF?h#1RZ%buvu5ckS0Dg6TnWh3sCjghNfO+&k*-!>-{u7Z2;wB~B@UAGMnsUkqc+k${gLEd<35CFd-l-3 zPeBX(DXfUPBhs=k^igkjZ|aD$K3`Z4ee}KiHvGLgYY@fHfcYfztgl_h2Wdk$K@l<1 zm0ya>LCrVj7CG`JF&SR|xc7(5va5;rZ(UsexwL7C8S6jgA5r7}2< zeN0a;y&q3)tFUR{nq8}T@NeAM*0_`Z4FyFLApY@s@R$FT zQWb1%2}{{pdG0VITJJ9EjR+U_CRehNB>bWaLM>>-n-thT$M)t(B>@dzH|0Ps)tVj` zow_y~S@VT4(i={mAsX1_i(}kNWx4nv;x8Xc7D)aa2O}FRnN+k17RE)-TEG6^pod)o_F3GuHzN>m6=p#; zRL#j3-7lB9uR^hldOtC>+~AVDJVN2c#4`Kjt?{m7VMBfrgJKSY%NfGN@WsuHJMMR} zGIHOrh^tfh^77GsDLT8s=6PTZ!a9j^v5ii@i{xavsEyw56C^75y)%)Aew@3pAZs+@ggT2@U_JF=;4)n^a>0@_{Jxe_Dk88qC0 zDDKpvq|TJP$}_%iSSHXyS)tP}e^JY6_F5E{GrhD$m{cU47!QhSx_DnksBzhybU3sB zxu@7dbwNDE!AIbg9{LhHng*xtGrid zB8a|-Kd3$m`a-@cF4N+kiPmRk>7iH$-e2W7rj|P;{L`MHC2`hzpZzBZ7@PFAhl{ zTLSMga%H^tmJ4tUF`v@r4)himMe2Wj^x|lms9rIGIl2NulI@+rtu{={cm7Tk>3CZa zqF)kTAsaR9lH})3S6i``s2QN2)2E_Un^5jm^z|z8|1kBIQE@d* z*YM!(?jAhBB{+d$kl+qUaF^ijK0ya3xVt+9cXxM(;7*Xdlk5JTwZ7j>Rqb8fhjmt; zUAqg}${KL8-+QXavrXXH*mfc(;sm&$i^;*i%yqXvnWRloTapbWQv&Y~yOM-)$akB`=(=|Y(iHPvNGSf^zA|L0n zEi(`-U^}uEeG4~8=Q26KoTfc>3^=UhFA|k=7?%}(mAS_K^%t;`v9H|)f(sDQJPd__7TWm4sLUu2mVdE7mzk3P#BVLTsDw2_uO z%>rgrpY6fo2uFV}{~eG=9`H{Eal{rUx0`-D)K8Qt5bclYAwa?_xPupME&G^ZZjn;t zcV8;Y)t85sWCtLdRzn@Ef&-nq;+L_h2^?xEM5_HKsc7Jp8B1e^PaX3Fy|EvQ;p^{7 zjisBvmTb7^e&leW7=nA3N=gv(6)~>k5TL$D7$K4Pu{1B3KEqHYc-Rg$YMeM9D|Y&r zF3(=>U8ozJ_wCT&N~U~DjxF)W7HaggueSIlZT6bxsD3}V_@?R@Nml%p`)Wk3W1hN>ZCg-~iy&O_Z(TRl) zu)dT+^n1}Py64=W>D^agP`(2sT80OhE7=Jgi-*fJ)E(~R8AiImlBQYyc}_qQ@7d7s zGUL$ArJ_t3MDo?Opz@OYSy@DNCYS)=$}4 z<`jLPaPl&NmeU)no<3S=?`ndLZ5fi7u7roV8}0j-KPak*K2e(1qt;y5q3_*#qGYI6 zO5m{pw!-C0_48ltM>{qil8A^28}DL8g4*9%S$^sZi?rLfzgnVd8q3LJ(tf&U zmgovpd<9Ja-`bGQ?^?zhy0K>|3hk+%l~mjMg~(`N&VN<< zj}~9!F-PS7y|l(1-fOYm7xu9<`bHCP6YK8Dg@kX~8=#uKbpGrkYV)Oe^Y;20gL2}b zUQ?Bln%B~9c*M}@k*@su#edw^{8&Ehq$cKp=l7yeRJ;5|E?H*QyDe?v!=t~MXna!< zTS;55fQ|x6giPp(rc*hnQqmZ@|E84PoRY(Cx#vZ2w8Dr)-5m-2QU)aRwL^lzH2Kgqa zPuW7jysBof0#%q@20T>JMeV2#yV+V=B*W63Ko@UL$=-@^@rN6=tgSBJf7$B;{{nie zNQ{PAvp!kSIGtK861iqlLLtY6j^wEsLq{IE{HIoYO`{MBTW@?n9|*juQ}s)ZO@Feu zrZ<=8paFVrxs*XmSX(5Es@&OtiRLpm7t%H_-8kE)1BnE``v{2c zLDqjJ1w8R04vqwG1Gs*d{RJ#{tQ9u2%MZiKTTORxwO&g60Via#m3^O*u)1b5m&cZj zyc_g9&ODjy1&7U<7}gfgExpZG`~@I5RtXzKU2pyQ?$fWhlJPV3QEMCS;;Rf<|JPUb zz1GHtdc7Q?gJpH7EPO8Mq2&L^Ik)DD3Zu<5Ooat`=089M{o`3-1dC;3hP44DHCLMC z$QT$!2g=I2)>T}$_MC&)E&Er>b@d#&_24jc2~_Syijyigds~YpQ5Dig4YZR> z?A}a%lW`9b4<~Ww*-Z^ZqADa%rez|ft`C9xJ;OFfezG>$7FpQUErx`SEz9-)cA4xs zyA21GX5$u2Nk?G$M`@b+ml0HC-o?~w`zET9!{ojip-&iXAUXjfWM!--&piEZgzDz& zq2Vs&j`I7WfC}?P7G@;TY9D&yV^rG+AE z#h%Wd#hx(lCo%Ud-xAUTV)l^k7z)_qO_9>?>k)fs3~e-G35^(p9km(3Ci{*Y&KZJF zrAiL=W<<&#SFZz3#3a;Ff{RJqD<12FqLs0MuPk$GsHY4;yIO2N2yi5`0+hEy|7~}rf&(O zr*1W3TAKc%Rm1;IG(8Lt!1!t%&W>+|q-K-t8S#i;EsRI#q89%Yur%8c&HBQ6d8b=m z)h_qRfn3>RK-kN2Q>28p+d!oWvk@44Odpe%{(Xtn%+aU0#m!KpRraKQj6-MmD)*%RBXV=OiBb@Npqod1l<)3-I&IpQA;R64TyHOGHC7eW198`GYXBO z=b`auhkn_m@zT8Ok26>} z2WjZ@P)Lr7pNOZ?jMHtHo=R(ynIpaIfqc=DAS4l|ntYFKBefzjjE*~x9sD@Lv=#}| zg}MNEi(^n6~l9SFe^uCR7%7e>7~lnI&lQ_ z%s5W7h$$)>m>WCB-HUert@*-SlzOe^;oKOau$ykHryKlUi};*55dy6%`m9=C6JJzR zy;22zgB-g~kS#wCHvfefkCFf07dk{iZ_HRlVX2;%?(cM8FhASZ^F{o9E@$*Dd|LF0 z+l6%gzrhX_25j>)4SA<~xr-oZ6cZw;yfJ=P8Tr;hfb+{QrmWV_p3x`P+y+~yP6a?q z2~A;pY1{ixbR_*uHrLFfAMp9U97V`O|4RBRicg{<;4dIgs#XBbNebXLZj{O+=`Xl8 zEvtPjn!eCe`BY9v@tN?m6e;}`D}ovXi$^i&cqq3N-)S5n9A+HXd%CB1Sj@9q86t7m zU=}HeB&-IHD!4WypjxJ|&V0Q(9rsYwLk<0fMlejEH1_~`Q07PVXI2gaiUoBbLjW}9 z`sZ{p#^X3P*#Df%f*zF!KBhrxe&Qn5Gr~R zKktXs5zISR8riR(z^w|+9!GPQ#8BMl%e$xq0!8@?-IIV&y-iLDp8K+Hc9-vSc?lV( zi{K=^z0Mf>bA`Bz0IIsSiCLUBg&uC(LejdK$(o@6VsVWO zp&kp$svWa9BG^WK!okkfEXN{5kaD>W#f4-K3JSIt*UGs1qMAUUd{?8JI%t>67m=xK*&OG#b3m6ApA6SD}f<{a*pv+9>rv z^*|>GKQDSf3W;MjJ0tzhv2C|H8aivqP}fCufmEQmrAjYe4eKw22q$m}xIRnT@mfj?NcG8@p3oPN+=x*g(%S-*syB z&vj1os-bFFuhC~6Q(GwrXjrhIYl7Gl90)ltKlQuztE9MpJMMkO+=)?N^|0VugZxk8 zN@FnfM)=Qm9DQ$Bv2mpbI4S0U=Lbz9h|kPs@l0l26J#Y*2b% zs{qzF3@||X3&6iz`DEigmThBf8@5n@71CFEmT0h7!^Wj(Va7c`n48V^{v`UCBBhyw z|1yg~y|FQnU6o_1?ZRKQFp;jlEqzUzMF@bOK>ec9QXPH3l#Ou|5isNVGTUp8QTLRe z8_U62{b%++mhw&97p9r@5B0an#^7a|T!g{dar$d*V3jr7bV;mX5C{C>AGLytdYs>G zl)91s3P9mVRneL1jXC!Jbn3h-{qpGT#vx-@5%OP&xlzodHq7yr=TcALmk;Kk4o1&a zk0*EPn&piNJK9u=o?`}NA(hk@Q3fv^^C*QNbdqYN$I?%x7!?A*#iPbCxhAUHpi>vavbitJz#at|x+cz@B`Tvnl{$SZ~D zZD&X@Me(}3vm0TJ9_t??1Lw?6G0%KLj+M@IXJ$A!GM{n%!sCo4 zt+JAs^96obOl_-Qxp@ zd36((J=;|oh@(3NRs!k+RM!}aUKfN-o(>a}Cb7-=1Vu$QZq(QKG7D|4({e#+BLT9F z+dW-_LiUq!_33(5>o1e-S@1;M|Irpta+`gcR){|Nk9HwsVEro!bZ`uv!#GglEfHix z(`d*%RRBa3YblOFiyUQZjcZ?EPufV1e5uf5VJa)hj9-=-!+2qw=W$J%>V<6eAqhdD zh&Q^`p%^Dp%vs)IyB4)ngRM0hG<(VryMLd`SWPYU+Ijcp$X&%;XfapN1Yu5Wj{Z@s zJymwdnBg@X=i59xfLO9s^nPM1F5iXjI?&sEZhccIwLBa#<L57a) zm6C%o{zA{P9%?xm#al*60=XhdZ=LInR(U!HXKGBzl}6*ubqELhhj+MxEJE3X*+C5? zCUrsTj&k4`bnHQRu>0wDkV2ST0-5o18syR0%)^YW;($U&XlBoR|3pjNP5n1Ty22B5 zMLAdX2C?tVI7Dio?AYxNaOsQ3f+zzq=NmvgXp4QXr|G%VYhGd`VR}v$`1Vxx8 zEy!h$_Zg2*L;+~6-~FXzN9D0$F$r`gZYP6T*KB#IeQvr zWG4djY6bZmAx`-OWJdXoDye%vSym<-EgiXQ?^yGNN)PWHxDU5kW$fV{(D{_H>_jd7 z_A5=%YgxI_Jr!MxG8g!RhSWla1TH%5=93nP!~H-keEm!qp`mU~3cKN$bTyU#qhJbI zq51?W)yt4^WHt&!-X*rleq8fjAdIV@d|&W!!mWb6-WDmg2rWI!ugI#!;E1hynR^s4 zVE4Yr-nKKp^ZEfdR7=y8m{ido{9_GzOwp=JrOF2-pyT~Rm@iZFtr zcNRzzwt=br*+!9{6*pG>WVzvIV9WEXU=%Idda(i3@DDtr_T&b5MXUqN2(3I7?crB4W^Pvgm!-PY768ogu+{?^5 zfJKm+8LMY3(~{{SgJ-HST;aZ-3>K;C+rfGf}wNu|{A;XL0kkn0yrk$b{` zvD!F72)@a#-CX#t3rm^XSuOhX;4m~r8L8#cnar@J;}ep|Z(%Ft+;p>lf@rJK7WwBE zVuQ$N4r@Ge?{vHka9>%=z2;gI9+o*VxG6O#H}^1GtVL1Z+ixi=4t? zf_h=hJu`Dp4Dki;K@}f34mGPQ5s}@IQW~6{_&g@@Or5i5+jl8I7 zMeVp*jnCAn|Du-8WT6_VQql)k&6!MAjmS`9eXkqsRS!rVA2C#11vH5RmvW;00nf_d zWq(YGb)O#x*+1^B>t4~7i#Oz$hhe8oUwTDn&e7FtFLCtj)*L{DJbpsOSFh1Mna+vz zrJQhg1PA%`8-Fw+ftFC+7E=9<`TIx1DZGA_tv*D0Z}VbdFBLE|oqiqX*MOE18C&iQ zg=_1{Pt_%AGL~MY99I-ema~3-iJ)@GJ9LhGmq{MV*@=vd%U;S@C44(vvzfRWxH~TB z_cf$&3dMd;#Dj!-S5>>zlwg-)+X`fnj-O8W_JN*3gAK?ws8^Ec)*keW zr>+Eg;Rik_WU*p;A9#7%2IXoZLXBm|ZsqQMU3!JKLjlT41Tu}RHq*dI#y~8}IfFn@ z!246R!VW8(75$<94Oy2%TSi0GM$Cl=i7+r!(KlOob1|=p1|Ja=$xI=!HkCA_Bm~XF zQL2Q$$T_h>7d1q3S9_!0)C6G|6{^jI%eXm{(-tD(SK}t=t?*yxi}4NTt&!IZW$dOi z!lLX+!omc}3H0C$W3-g?n>(>4Lu6g{wwSvJ^oq}kWytM-k8#Oa1)njmrW#hZQ)Zle zaL0`we+1EOF9KNN2R-Xn5*pkM<7MfLFh{STnpy4IuQDdbRZdw}fjaAQ`+G@WJeFv> z@W%|!E?f`^xjV2FQ@AhYRabj)3AJ8=?aPF+Zh+QUed{Fjy_EnBMzB|Lr4C)RATs?9 zP|-KxzHz1p#p6qS-MQ15Y7*vvVp*XbcbGm*D?6p=qxK5%=?3vPd5)!^CtnuV4I=W7 z->x~<8Y?EB@}oyi%q{7YY(1l6gZ+^jbkA7}p*Fg)LFu65NeUJVpMn(;jkD^=Bf*Z$ zzX0dDN57rQ_F;}Ad<0cLcD+kmg7nzlcS#1$Tc`DGXNAGI*F)2BePKe+TEebcP6{*f zJl%H`G{hlrh0Lj;qO=e7OdOn>mt5l<=9{GjO~Lu1dNH3W_wVfd#>uiUUoJ{y@0&>l_9MsA4El_a=Lrq(nF@2o^aSJM)5rBg83xCa*6k0F| zve8oFY`SrQ;`krao)`^tD){;ALr<^QnJ@14JLgcESHV3w!juhDY>|AbpWxF-0%n6^ zLm?vz?p$9jzY5#^1H(Jf$REGf9>GRW7eEeeL6&ca z?3p(S4a?)y)?Np+>qTvsy&mrL@r%UzEO^x-#}~Bid{@%=`GN)v&WDuqG%Gv#@hy2#BFz9137gzT1QIz zc{!g}Ii8hGRh#&KbWk@koYa~3lEjRd(cgU81^%3bimH8BzoCMh#r6`&Q+e&*?&P08 z46L(7yY!WWL}mm`@|awTtyupA?KajlawxdraJNpGk zypYc9TIo$>G?5&BHB)RM;7E({dKpQ0uri{Z6aPuzAOGF7gZj&mh&-PKWyhJ5O|cEg z?)|s>tVs{E`gQRXIrir;1;tQ#vq~7)+L}faO-*3NVoH)b>GO3U z?Qbs;q>!h|Uu0bX^;lPbEK}+nYG6GVM1;e5I(*TJ+x!ql?*Q_C@jpi@#FQ7~-n0dZc%I^So6t(E$`3+ak zoiVv!l~$!C`RmhD*`~WkdvjFENrc4fvH;12dRz3J4WU53sH?a++#J%=4rF9z2d|_k zarO=cMeJV(mT}K~!3WNf_F$Ndgz&3}9(OiB=zn@Lcs4$`??vQ`6iq?!rfx&=@yxb2 zua^0BZOv_o`AMeYn{C=l{z$VG&R?WmlOzT5-`V(22*SP0aBMEi*L#*y#e`guV%i{I zK8z%u1+-<-9;$=HX#ODz9nzDg9q5+F0wK{T3KrDYH3x@rj~xFA4x>BHY(QZ$#^-ku77ALZ-;1I`NYkXJCHs5x*0@YrNx1MnD3Su*9ijYs;y)T=y<#|i$ZB-tnA!5)=9|s(SRwv!VsDJ^ zBv%hIPiC*UWRk|LN8%$h?__tI*IDSE!!a zd|g7kS9^Hqu{hI2a3F!xl4z#98^sC@2#x;>z!T&m+{idH&)gq{I(I$6;v!v_%2V{{ z9?87>$_>pZr+q%6m{3KKg@Yj&OV_)};>On*?mTKrB&gP?V=jj;BQQ`4rSOw7GwGZZm7OrtW6c@-5Td_&!GxKw{l88*>4)>?QhB)LNg_b zb)EbrJUvd)BIP~2Sxj{RL9~pR zEN#G9^5A{GH!IRUtIuivJ?J__pa>!e*_3NEIZ~qbORJt;9(9zpT+H$zud!3TAvx>6K`y>nRo;*!;M=V`t zKsdQ=W?=AlP!Yqw5xji&e27|-Eu4QtX_^bvvsVa?s8yq3;?!}oKh4tUh9`1gM)YXLnys*LSBWD|2ttSL@LtX z@s)dAn_@mKT}b{5TioxSL&M2mrs3~Et0D;S5#7UP50m(${BC>4150JpC#uPq6N_@x z^!rVMhdd@R%5Z{kS)PuSHM>w#xO~tW`H8*ve65uzp^g#CS!Q6Yq%8fp(}ZOPMOJ*# zN`$8N(1c#0`IQkW|ka)+&d?J-t%JV@GDF+8us=A70VHuah;MiJ*TMNMPAzZ+g75!%m)3F{Kscl4O0V(K(OrK_ z8~l_sSeXZmRXMFj`F9(9+G(C zu(bw!_!l6ZWPS%|KJ_Rag-XxxO`yUy*`GnR^@PW4ZH=Her=c!R4RYfOmG-%y$j-N> zJUnPJgXl6<9dkcrjoGCe)ofl3qe{JWuHN_jO1R_2rgxZa4ibHn+<<+2hk$Y6S-Dmf zpibK*bB>4G949pJN?J>EHXW*Gqne0b%Nl#-dvm6dy+a=^b|K!0Gi#3hjhf>{>3gSh zmQiiPt_s-U$xekxfBCrHu+FpIuX8GsGcc zTPHqc-twsZH3nUdvayHsfiMabsLGxPXk>U-4kP=PLDY9|f*K52`- zDCoRrlNfDOdptx63`137h2rGKO{6ZKy2R(`TR#RkAX+MkeF*U9XyDtMfJ(mdan`L> zXRXh9qC%j@+IaMP^ikwih{$9Oss{%a3p`SzE!)w(2bnAKL0P=&eshWR0ZHGAOT`(> z(J5g2lu9uk!z+lh^iyunBA?@A?UFsG>Q`=_5{ikbR^r~5vSbpb5t<1PlJiO=^0reB|gRXhh*|ep6d1IQ~8^+PR~e z4G?P}%jzF>$zkA>0?_!c#|)S1uTSEulsg>AV)E21dC#uMJ8GAYWbe|%KQEXBBslO= zB!wfan>Le@88L1Q`Hg=vI`#8lf-eN}dV@1czYzf~U&gKr!~uR*(rq0XD^j2Z4iL<> z_U>kZ^Ovtm=$tGvsSEzDgBltV;#fMcp4&3{5EHgahj}4o0uD+{=W)(ZOdCt z;q=l430tfb$u<|CP1#pDb*2%QF(~~~cwwkb$-gMBj7nEHwa$9-g@R~3uAbQn&&iNn zUr%#nKUeD=^0N+vW- z@yChowYgB<(ZI0#;O51`;TYlchl7r&&8MPiU+#8O-jxolhE5}~kjD@+TvpN+*aNiR z1i^6b88oh2=qR~Q7H(tP#!l}U?~(4=<6NPf({sw;N|md7q_Qo&B|5E8WTj@W&?SyJ z3u{$7b50NZ*MLKlh0ZJ7qYFoR`u#j8!X~S%2>q|W7L)M@m?X`$N!YwhraP}>vl}Aw zJ(5%rA+A)s9}t83UmPD-KB02Lv9s*a8^4wMw^Rt&^(T`Bp-rt3?(CquLeH3%;S~=b zWgkb2%hzgdOaM<_22Cp+O#yF%zSEC+G9r6BGf0~Xaeu<^Rhs{#z0%zq-xF>OvG-!} z`8IKV_zURz=)Ks|SQ|L!dnWQl`~0)rH-JV{=^tVWICvt#Q`kyjqTtJ_+k+A6D)yGt z&gkR1dzA*yQTyfJ*3PJ8sA39M*nTX}1f>wg->YFkVWBjEM7WO{kiUSv(7%A@c%{Dp z%sM!#u$Z$i8l~@lM76&k4ts-*36ypk-_o36hDnE;`V+RaI9DO{6|esF~!ViGDjiWIfbos%c9?fR-K|ebG23|e zm!|daW4nEAx+vp_`U3^X=A@xk^RLW}Zd0fmFm?`iqf)1prasr|57!G*y zQz&=&DLzHS)0tXR(rIgi3P-P?LZmuofNWn|qn;Bh9Zm{1$3cz|^e%&*_<^X3v7lQB zhf;%M&j%Blv1aQIe5zsH4Jw7XE%m9=V?KmyfZ?CR z^XZ|1r8nRoz0sS^&nPD&`B50mFPW%Y_+Xi$Tv6ga;jQf|*bi_MpTRVMcMq~Xev=Yp` zcPQIDXIJVFudoaVNAp*mhjAf&d4d|pj!K@O8mIxTEUo`@)D#cTp%9XMBi@B`GNlJo zxO33c&vca#1`UR_>LbO0;1A!mtu?ye$oEu-d3(o(iS<7)G>uzx{Br~!a<`M{owMie zNkdESCF*9pwk&GCsVxpuy5bio<(ZMOFE5!NfH^24n=Jlc3U$n=^^TDwbqPBnCqEuz z9d!x?ZD+=`K(sKy50OysWQH`?lw6pQy~f)!wzw|+s_nd3zX46FqCPaKuy(61<-THWfFcI*39WC zy$Tfm9KS6+Te|@}vF0NT37%r{#I+Yd11Z=~)+>lO>*C}wOzX(=};hnmnK zS7C^p2}|>8nHmWN4IA(^Ot-VpE+3}yCqCpUH9b8x)9~FU-44~FlOGK6+5k+?XHD^SMH$bL3D6MPefjxH z^+y+;grIu*yZ8x_8tFR#VD%SYE;dATE+8eN>yL&~EelzPv`v%M*myeD;U_g$e9+I_ ziugdL!8w(OEYm)_Cj zc(c;Ar0l#hVrix+9aoH_l5>{qAlQkUW1f<`d%}V&eAAY`3TiSeT+@TNn#tM1!wq%! z#rP#Yi9)&EkN~udGU^P4Oh(F2my_nw4ePC|^3|fQW9~RRg7B=q`l=S>WQkk5m z5*rO3QiCcEZ{*3(PvLsRg>jw4*ZXN^bHEt2L{{bT{jh<+!$>=&eqIMk3pn@%3NaSh z_gQ1tdEtD5M=XK6qroG?fgcU<(zH#Zf%G)G~&cQWy7U}I07 z{?JkMw#9J4!U*9yJ>;>kK7}&n&KJ3E!e+{cXN&jQtrJ+YyW{0{M zMdz6+_Y%7y%Zb{jeJ9W0$sKIa04G^1MuhsvU%;=g^3CibxsyeyaY4 zC}UW!sBT0T8!UFwmJTb3&B5 za>g2X-tyt#@zNFt{{pJ~q*=4D-OXNj2sexYB>#HLYjFXqC+ooWRVU^KHYaBG7em8% z!(4Fql58}&CB2`gtg!0x`j+-r&>~Ae9*fY+{PJSahnUha*e=q=!S}T7E6hMwIp>oIW=T8|6Ij^53+(Blecl3&UWKXR`qkR~z3E z6kJ)W9;_Qer1bOf6^buzw36;;M&`}L5^M5EjFc2G?-XqSBjyJx6 zaQ`-+ay>+Dh3}i>1N}W*TD8@an}hVYUF#6os6UT`(o?XTNnVO2)OwYbU%ADvGvg|qemi9K`_o|C^_{MtH?LaVwGl>qq0_DUdoJwph9wO9o0A;Lx zzs6qi*QI?!N{rBR9TWUbMjlf$RIK~s78PnvtL!yho;zQr)&E*{#dle?{5v&Q>;@MG zo$jr1$*1Ly3jW?}?Q5o%i9KNxdVbI(-La}zqgY)L^g%lN3wYh!X^$#rwX`H?bs!Cy z^gXC3Z30Oj>)m(WyZ;3|G<5z2w7qEYKpw@;(6w+@ln|z7;HM+Ef;Q<^Iw(u`s@uKn zSA?>Q%%iD&Q*$hkrIxDbp5?bNo&^P4r9T)9nj6NGyb-<)R(Q)RQCJ7^E;q&csTe2< z?Q}YKR)_Vqi%O+2Km@VN!+~R+2c7s=lNd_NV%Qdi!;PZF^nxFg8-=1-e?~L@1yl;} zdsoIyUBb5!<_Z8#y_3Hzg5PjvHZ~T=69;l(W&jVoUe?`gT=EWfv=#&3M029IURe*8 z+@mUP^EjJh;i9bb<4&zBzme2|fej#&*viTM!fa95gNoh`{i=~COq=a4J4T(Wj@f6K zQi%KLT4Pa-UvJY18_J*$uh%B_3weY+LQ^VhloS>SZf#!pH<}(pD>ZW1{)FPI{{{5r zw4=T=#rIq~9!WNi2O<(Bk%8E1^`s%9Eh5rcBM#eK=m2H{1gnoCC@HxU@*RZv92Z$-Jt#1Su`x6@u8aln2Mzh#D8` zKAi9Aa5$&pDaz=R;yo7BbMv-J(c zd+?6?(h7YB!+HL?qOD9F6YpE{%|&O{KJTyLIEq4l;1JjH9lG}-*W=F#mp7a-MrisN zaQPd9J${8C`7yFO0 zZr-+FX?)W4f$x084?MQ#q|#Om&6JCDSkb0Hk0h*UcE{vTgdMViqXm$NgVP8}+=_ zP!FV>Am@eVaRj$g#*n;tI<}8lS)1pPTy-YH*gz^36{0F;Hfpn&4o`0l)AlH;5p^@e zHh7Z3;oRD8a>UQn)E5~Y35$f_7I6+MhVD7k}Q9|)wQWmO`G3PJ;(zA z(GMQ$ElevW{q4SrB>Z3u$+iZ0y^OA)+tr#W7aVZ%N zA=KXBQDMjCkw#BKeU+qboO%TMJ5+A1pVF*UY}hA{sxR__Ly?IWZ*$k5_lr?e*}LHI zHKCX9dWx$|c&f5pjqI}c)N-mTK}T70=YkF*?euP_kuKC;BwYWCnwMpivW1Zqk&Ilx zApYzr4wrsgSjDU+HH?^v+uor~3cW20&I)-ynuNpQMq2^GF(h~#2mZiCGlhQ$0hB$n zT_IYjaVH7Uunt(X2LO7`*K8FEMM!I^FF*`3w%zwb1y7o5N@+~}F(u!9Z$pg~N93;3 z+!B?K;e30lne!X@erujsJ~LRt!i20%X|lQLYu*q{Y`sbo#zBALv=XsD@`;(zlwQSb zh70i^oH=qQS+{2QNkjg7wV+TXs}<#@6+@!yz}sBwV$HLPXv8lzr?kG@v$TJ zqwuu6EmMd%_e}NFp&$uGaiS_u5cCq}bX(}%&1k?(h{uIOX@Jx0K>`pBYBZiokSxwi zqw^y$)HtpdnclUKozzD0@RtF&nLer*d9KDL>i7`F?sS$++9AA6h>5t66%UksuJ#vpCJG4db=)&c8m0c!| z;P5Mv4M1lK*Pp2JV^I!;r?unUhK6<$Bnwh&xi)o^FQgX=>XN@E9M!Ox`0Bf@B=A6Y z8Z-b1+BLoI9@I6&w}PR^73j*rv2t5ieo7`0wrS8R&8&SO4eS8&y5Q28Ts3f}K9$67mj|j*_=Ic# zbJ+4nJsS@y&@?9u0Iz+K@$y>!kZSA1L^D@=NmxdIe`%-_SaUJCq^V7-fES~<1p_tT z;7cr+<68G9apY#2BS?aa`q5C`@9~d#<0wz?Z-ffsv;GAeDI2k1_{L=J_Z0HXw;{Z;cI>wP z=-b+V0Yn0i_?pOc%8DXF{)qhfgww(oeA)5rRXrNroS1ZQQkC+V-!hI1LlGk?dJz^UC4Cd68Ut{g{$n3f-)H#HBmt&k zczm5WYx)c5K$ds1wDvzI_!*`D8bapWfPM0LSLhVTjF7LYcw+@$4d*j3_kg|H{=ts? zLkj;U^xb|R_B1anpY0Ap{PB}Rn~Zk&?xXCX_J#tumX3=Gr1mN_Z`M*@-xb%>=1`XI z1p^cU(Mgoa&ISS~q-j?^G0f@{LbEpiBg3?3(LH0$hVgf{W}oSvs3pDxB@C4$6utJeB$egI}YTOo7Lg}nY#OFe-T@!Cm0Y6m(2XeG%Tu*9N??oYKL3?>>A2w4| zX#SwJwgzrIPGuF^G(ZkPRJ{ch3gUM}{qU!g(U-!51y~0hCo?5bqN4a+cz|YT%TOK5 zoM4dduhdnE)DVbV?Ys@5hFJ+o0O*CdJybS?g>&lbzQx;!?*CgxwB)`I?6!b~ZSAW} zUw^Hm&SSsRdP^%|>3H0YD1%++Fu~Qg-OiOx!OKo$C93~N(^V2s4|HETs{x!nDEd7>hW~+LB7paU@g(t`)19#ur`l-g86tUJX_hnOjEVB8@Py3mloEdCY15jsH^wDmJdeVhw zRoG1%?df)lo+*#@&+sGXNJ+3OVIK{>?#37Kbl!1=_wwGu{{y8gQ9U4Mm3tNMM6V)J zB-QnQPBxy0Nic|CT9)!4?+=w`qTensLKEWwKBk_A?s`~Wkz3KwvPf%PnE^9?3|_mD zcs{JubI`$mnHcihi+P;pA$`UMj1q<`dp+!z3>J!hd;QV>kUK82v($Ljw0|Z(b3i}- z)bga5!8N;KT1yGxBgTjEkuMy(7q`t??&@QER`Wo{vlq@TauSfZGZI6Y0+I2y{Ecb*xy-i zRNo7S;RL#?93QTNJAef%)78Vtox0L;!SfLfaSJAcMk|bbhn;eao|-t%lE#DAgHUh7s88uqt74AfeuEUn6*PCh9 zoOTuQKGM?Eid=6ZMC{*ie^Rp)M;yzlw2DBgy!^55U2ufU2TKH0RRiad1%c=Tk5h;(r%} zuInGsHkwXsvY>P$W>5fA?qkndR9-628@UvIsBh3w@TOtmT@HRTYjn}GSP%Tkfi@==Z4oC2{FV^ow=e^R7TH0JvnAsVPKC$XgBGrm z-IKqE`gI(-54D~vfIo1M&op^vpBeU!<^{s*EFWjcy{y&H$lmR>bW{N(gY{@~Vbvm> zr`9y6jtF0m;{p6I4s4tvYm@4?lNHDq8RIhJ0+hV+6ldv08XIU>PRi8$sh)cbOoV@JwTz5_lr6Os6JeXF@m(4inhLz1xx_dyWd61@1-=F`F21LHtQt zOp#ce<4l^r{*L?5+DzT$%ZM^5r#0R+T(v8WzwATj?Db6mJKV$ zt~pBHod56xiCGHvBd#goLIDL;GM&Q`E5;(5u8HwxZC^a|Y0Vi|>Bm-A;r00+w~f-7 zD%GZ3d=A1AK`%$Ke6^}mpY7uk8r+NX5K1Fs>UC~^9Y|7yAF+$xJ5>Dgy(<07gAGqv zL7m3xiua;VYbm-$Mrm`do=G~)Hc(NT=N9^a2)o1<9oh$c7W*B6I6qYjE!LW8o(GL2 z9*+;S60%(d1QS{m7>wnwdr*UO>R5~w&32lrH{euWl8fWUH2DYOR-4!*K0Owj)C33* zbtR`6`$%e}X8T&XPkG_{#k4hcnA}gR?(3Hp{czrc`q2l!%ShJfR#u4K@oN&&LV@{73JWPY5 za072grxf$%5&nh9I7AJ+y4rtA>GqS{vu19Jk!~z)v)C}@8aA$wqody}YdWY;01LBm za*hi@6I94^=CkJJ?#mRE_Ge|VQLme^$3JKD-=<_nmZ*U ztTvy^ree@u8zgXbY+k$q8-m6)VLrhHU(PL94OA#pduJV7@@fu=Upx_geaWQf$$XpvU(S3j?&b0XL2>y(I@q8IiD`qhnySR*+ zAKmxA4nSEsgGO$JO%0bL7Mdy3C#Z|1Qkd0CDU+8J z?BMNi9WO4juP-KncM%^0Rb;$fJn7{bNJ?}T9!kZmAotY%3i~Qq<>EvrawBQLKxRC% z@lctF5V{d#kfj>ueaUa;UMu5hVUxa|^rU zZ@1Lc@i>pWsDml5ipOVj-v#!F+{dGq>4m{TbhzxyjYf7D;gVEh(vqrI>W?inXwf_1 zWL)%p9_Z16`wuLgSrX!p+)DHoeTgM-9F0|)C_fixBIeXvY{jNB?GFxW%lM(iGlMTp z;UNq?fw#puS-@AyGd5tzK2rN?$X=?mAYluUrRK3z$$Hf-GZ8Tk=d47_RIdg#D6i;Y zjO`Eu(W4%Au`KC#LM8zLglT`F(x7&#jhkV~ToN2VExaD4^=sd*@X7EwBBu6WltR(R zC>=H1BeHsGa*@Y1`lIlA+0?iRb~n^RZsgQDgd*wc@owB-Rpkj>B}-^62Ah z%R1VG@bT{qX078t+R-EakntPK^RhfX$_vMpN{m@K;G&gn;Mu6xzR2Fk z86kQA)#|=BVe2fxIw30}B8H&>voyxCHb4y-NsfF=X^Z5Pm9D{789a(t*6#h#?CJ_8 zN}p}5O1s!Qh*#(?iK2=W2O^}V*xyBI+Y<8MYf$2$t-nuQl*&T$ruql!+G3UhFOs`C z$~3QGb!|>~RP`gorc6g^38ZUGWg;Him_&0)CBqNTI;#KPZiw%5Nj3eFrQ{0!oJ*fp zZ+)d#b$K53wzitr>Gakh+b^#jF689qj`-cs5(SU1nESOpPK3#5c(X;dIt%Ur=6h?<|_nK00R~ z*2T&)JyAlt?*p$YhmM}OD4XN80tPgXbkBG+PF{G-+DSG(xkfTme%}&M;(t5*qC$J>rsQI zYHi8t==)R)6zl%??6|EtGpYTrd1))}doOi>NVL^HKB6?}2l9w;<>~DRzGA4S_ z?&X)Wo#J=tv#wCmfu6X>`q*8m{;SF?%MG{SSuF+z-pf`X;tP{>)mfi2j{za!ogzz~ zab~GHkujXN&*e@_IWGmRgcg|+E+_!=#XemXuWQzNu;8a`{t|83i_(&3Vd%oL-uUOT zX!<`HGPqszr^l)RP#qZ$Ov#?CC$_lSysZbdA(Lx4edgNP>V2Rq4AWLlz;ErW(CO>w z#-TNS9!Ol?19#cH{=LEb@aeM9w>EH$z@lt6AA2+GZE8_wjq^b0z6mtY%-tlcjA9_- z2*ON%SWh?wYBuLQLh3OF-sRZFUo*>eyE9(t6nU!{wfcal$zX(uKY?@k4xCvr4$r9(JLF?k6Z+9S9`47IxHU?r6s8{frDL5m`LT6ybNp>aKG840wq#&|Pc2e5OXgGue%sHiMv{ zM6U|&z4;&@wNk?9?lO!HPLSIr7`B@Cvr+p(U(f_$)i6YO>Ow^n*z~V{=+)*^qwo8} z1+Ll|1RfUT{P;C1GIT8l8h@w#sE!r*3T#n+%L@(+j?11%RcP8U z;Dixsc|#rL%YWSTYNxEuJ|rUd_3&vIxPE(`=7hVq;)jDb=uebRD)wkvcKTY3_v=jS zu7$0Q5I0c`dpdLVzyLX3^-;SZI2)p&GN(ZGkmx@z%mu#G1a5NWg!fP2v^n;6Q9Ho{ zp(TQ1!>VX()NB%h=$%58$RpnVcmvi87aM^F>XU4UTNKtfM1VaZGV5H*y52wCHf$RnH^WUq64{0yJ$V2(@c;R?ebcMhpp%u=^2T+Fu zIjrXI2-Dx()!8g8jw*ds$9l-h_v>@Okh?}E@w;)Q%U*<|tf&F7Se7Fxj zuj!^my4F-rpFBJUR^`hP#O3`UAwkGnbd`0+f?EG z3I|<%7X2`x1Y>AOau%$pW4BtIG2afc>vL$kLuD=I$E`Gv)tT`Oqx+qt8!j4)Q?DNh zf>|e9_Z9nzN(rpy?-oRK=*g7T8!-SeuNN#d^;eG=dUfUsRX<{=ojjVbm5epWp1wC^}y#P*?jwnh|S`plpQd^46byZ2~)~uBAX|twiWhsqv!< zSPX7^tGXCrB@Eo)Gy(NcMspO4(|ogj9^*NR-8lGw#7z4ElPFzXly-Wnx^z1)q4-UT zaEYZlF#@mp#CE*Yc>O1JVvw&zGLdsx+D}T)RmCIfB&6H^HZ+5J)p)vE$N;RpCvEB5 zj7LRvBRAN6!B%X}zLmYaZ#DNpmmM}L{AK>^x4-lP%qy)B#^l$1XlQp4lhxzppNmzc zCApTbdd=ME1p8L@him%N?L1Wm*?-#w1z)^LcVitaqo(woE*dZW#-EfXg*$-Ld0@#q zq->PZf<$h64d{+gssCOwW4WGKq~eke!t>P%vnMD{!%yYQHLHV1c_;-pVj@9uJekC*3wK_fS)9u%IMC4sz~I;@@9ned3RA@X6L0aCE&MP z8u-LVBkR3XuA=mod31%>npmaifB=<7vJs`(5%C#7cwdZMBndLMX{V2ZzgZFQM#5H? z#mlEvV1Zb7@c9@P5Pz>ohB{>Gq^tDAmt@!$Idk@c75H84AH02ONpj`NJ7v1C&=V^~zgg@06KgxTb-$rPJNcjWBwcWk68^x{DsieK6(nUX=Nc2z08Q$4c6 zko?se1Y+IAr)Q`ld{SP}4){lX>r zXG8qx@wp^jh%0Fy2{n3sIWV|v8CM2FZ^$K8I^I>VRn1PW^I|IoNvfNjr64TRqFkmX zL*%M>9x6mX=`tG@0yO%mTZJXxHfVFY#Ok~{@4IL!o5GLySWmTZB;=rn2PF6fEAe|8<69*wGvMWNdZt3cp*aIoFO|(1-UTlR1 z8+{v%+%Ig5c7`8G7*W_HgJVKR$MHwn{=mo|+joi<@OUTb%gk06s z#r5Z1$!`0l0Th8vH()XnAHu)Eo3FM5=Ir&+8$!&3JCu%$LKW^??J2)Q%pwDv`%0L` zFAJNRTfG92Nxu1Gj3s&LgS7FXXifq4lG>2y06 zV>%e>MH8H7@Tk!nH_P7F+!sHIf`p2eqV?CF45zE3>P$)AjtB3y!Z7`uZ=#I zy3D^c?%yGPg9dHhis>;=TB-Pq&-DIt5gE~Hv5SZ2oZpW|)vF?-3zMh^7>y^r-nPV= zksqqYoRL5jL_qiVNwc{on=ShAM=op#Fll}P=j3BAd~`6kx;m#@pRny>CX}`g*(_@; zhA5@zEm6Mk;%*P_OnwMG{8bM3kNbl5wl)p{AjY2}GY@9*XV8P<7Cfg>q#pgUaOa-A zF`B5G1a3?`@{vIBr5VtCEyq$TKM`d@XO)X{dul-0yWJ$2$N-y>vUPE6;OkWyT9yYf z0pJSauJ+*Sf%zM1W?bmXPCrXxsj$PuLuO!N=b(8lI$@YU9|bjWwj_~oNvroiS0pr7s9WeX_C z`@M{7{{x)^-Lm2(D>M3@GOZSusUn2KZB7DVg?ph{kI}T-2jwL#f4=-$C8yp{@=Y!N zxj+75#t*8%xWlEi;x39PT9Ng;)H&7e?lb6o67~X^JmPv1|3GPQYo32+BoAsVXIb(C z(c(lk>LC{NGqUAnf75p%l;G#XZ2d8TOT_y(P1ou(q6R|V;)Y{^7c`}t#@B$%;3@51 z`_SswmsW!7+KUIYXA!K+E|o_qYGs6rt!1LL%^8Vqg_rq+m+6;lf|@VT^4B7}lCeso zz{TOYSd^m}mm6$@_5B}{)|kFiLyQ!4>J=wN@Y!-khJ&6JzAu!;fxm)iIT3pALoCwAzKwV3Pbva1R{tYc3Pjf?7L&Qx5gu5 z)bnBGR}d0*XlsnB6FMd7gdOLCFn5f3_)?Y^+ z2#lqpQyOPWyPS=JGiEe~XLG*VWcwu3V{S;@7%IB7H#ifMd4PH6x)SDEMjk$Bj@a$IhOSqeR=h|1p_ev|H!;sLiIBiG&!NR-mR@go#V5abIErf;N1OA6N!{$I6rTqJbk>V+z1p5LqSuxzQ;GrRIdmV^R@Tde5Am zG8n~k5({c|fjeLcSLBpetz)Cj6_FwjVgj#DmGyApKWev7RzycLZ<2as`~x9rz@6an z`CB&N_Jgi_*d9SanBSwxFGeKP^FiPV+=lH5#3|_6WVRL z8NA5PFtbzJX#)I>z@R4-%>=odi$^NyFXYX!h_XxttiiA|r|Rh|V&+vS?A@IEYnZcB zx)y$%APpZWVB3HCg`D3$2`4f=7<|w_$|6YlVN>%cXYa%v2c;8>8T=~5%m3{rRCDPO z@c?9_600ZmZC%nR%8wy#yiNOJX9GzLBVdGC=1gEU4UyqZV;YFqoO(7bmuk~WL-xA* z`$B~1@nxw^I2 zcJH)z5PSd($J-jsBfR!kki*aNkz`ar9Wxh2mgVVze6F3~54~Et-^@g$L|Xj{OH|A~ z$E>?NoGNPZF&)Fvw_cnWo)Mr@pu(oZfx4#W6L{igygYx_>wb@Sp1x!-lKsjHScXkK(i?R zS10)w=WpgPdHao*1z|gDny>`wziP)xX3?E9VJIoezkWWbRw3^}Cizj^n&nH?lW_1k zZQW9AS9tVGhGEEI3lz9{gG0EC`2>aIp5db5Iyxm3SBcZ*o?v!T}kSiwB zs(&+H+C=&zizj|V1ArW4TIMN+=enMDmdhR;H!6plV7oP3sQ9tv6Emq12<~M3?g`2o zS)uBIo|Y2PDu0yTu2L#oOHj{YlY_|Pk}*UC=VCx`ef0XMq;_x-;HAGez_VV;kd_4F zHTovyS^_ts-LK^NpZSH1>|L-sV9|`Fd{RUgTBRW43l<82s&Nf(H;k#6}wL;5~giJ6L9IHS4u!$4^%EEYp~v)JDW(EH{+ zs@z?01=DIGcPnyWmV;QnqH{3+-D*~iSaagr-e_lxw*6H-5S4Digsmnwja6swyEuXn zq4B0(nbN|rXcchkAZ-B8smyL|`u!`j;MXNh28`5c)PB;I=JnUFZuxgBig+9;8U6v| zuR>x3Z2of7F#QMf-r;3v;XJ594{-k~D_v$unRXVJTua1H4#f#NdmmKEkM;0!^(6z$h(Pfj7lKJb}dOYCB1#gzJKE3k+BWe{?tQ8m6nVF)+|Lr^pDKzp>!$ z<8xFumnqDUGR*q(ol<~r8`aVn6oU{2nVTJ!Cq^=^B}rwa(XIZtdL z<$=|zEv94Mn{G9a-}W_GPvTO`iH!hvp_JHsU2V4=d!is^(0oBn91u=p{mNV+VctUu zbSfnyA}vU+(vxNrzaP)5`KmhSS^P|sUTXT|rESKx;)sg^Nw zPquxXNvVS$GAfDYN)|2&oIKwss|NO=9TXVRbtWz*PKy$oUe5a&3uUhhdiGSA?4IRC z#&_2cjMS%4&`2DIx*F6aPgao}+ zQe0A~XlwbZ^xFpJQ$2xvWk%aXVE_7He|TzYEz^*C zHE3hxZCi?ra9>P>4e`(vvw(_b#xDl!uB$Qdioe(RP-X{>i!Wls_qr+3S=J6Ew5KCQ zPM%AeS|iQjoL)>H^9>KV61;c!l^Fi5&<1Hb$Ee*W4k#gJFVs+gjI?s0EXRwbZky^iQQM&_e+~Z^A}4l3j@9W}3&qk94JUPt;nCr# zGQn-LMuC=2y&P;MeK3IAZ)kwmV~0&O6M)~|CAiv#Cu23i+r?TEugORoctSg>uh-@H z4-|KvC4p);f1L3>nJSBHI6tk3f-^$!Gmar^_}5nWkbFO~w0H^o5j ziyQqv&>iqDm8%9+_b=Pj>Q(F2XY}G&f#&8fl+Oi_RduHQgv$z;+a+U_)D8#WSFIIg zsovaZA0i2;!V`?|6yW##%B6yoXLQtL)NIw1G}P#7Jscq0(eO@EC3OgP_PO%vEJaUO zIW;6!quZVx>;>avR*R*X0tzW@d4^B>*GgC}YTk^yy;&R9$!Z3FVqT{Gf{Tvhe3SmK zbT17Y{Q`|NOl-ZF1+n76fUCadGe_ml-ILVc_M}|@!BpI^F%C+gV4u~X59X!4k?A=J z;|?PKh!3%se5t?t5qytf`X?@C1a-d1Dhi!;5E@NT`#pEi6VGejmJV__$OWb;GElOc zxw7FEU1`aiwM7SRbY!%<$|TE8^-ttRCV*fx`C>r#YVC1uA@gCX`%R97hY4Yl5J0m4 zEM(un}*A?voU;Un1B(U;f7abb)`I(0HXEXfQKw9F`TzkFQ03)GXuux5|of@+2k9jj#ZF6-8}wUtVfacc#>1KkiD+-l6Wf5wvLk=}w9 zv9Swe=h)Jhk2R}Ph{H1wL4D<<`V0S#JkhI6bZ^67yI+R4J!IdWEor^41V^U715!Iy zZs@R1#WJn4xb{`KzQNxI@CU8n73G#L{9U@|vD&*1TTl~w(cQ=PiVLH1|tqcAO9v-1m@y&ZKR*0R;+efeKjAKic6 zA0xBx$iX8!V!|G)HMKTWBOz7C{R7cd7R3Qb5*d3gkGD4E!|+#W2~l$UBTuvnVyLl1 zafA;1&x+Oq>-A4U5%PCac~&!vh3^jKsI+WTS-OmHlpDjemf53_jmKc$a{B`QWu*=- z_U4hLpAs&DuRoqI))$Gf_K#%an4pL0`B4D3chTr39i@d~BQwHyQD7dd8iy20W2O;} zP+tar*-ef;-N$4HT=i$6Hj2DeGHb30rAQB;zMrNK%74$$lEoSgJRo*Du&O7hV!| z@G21n+H1RubG22Faj6o%pZ5(6pb{{IvgdB5*aON`I0qEu)V)${lN|GEZL$I3ot`jt z=wCrx&%@H~hi`@ShaLq~IbRAhuKX=KFsgM@BRw4krV`R7WH4J?_Cs*Cxqf9DlI zsQZK;tXAzY&tew^Equ*K0ksj6Ze1i>=MdW4SPL2VRl{)3h*#o*Dr6JS*+7bJEg3K2 zTn0H#TIyoJE~kMtUGleT*;h4U9@?yuwNTA<=0vE3tbJO#8wy#}D{?{Jnr$0{Nsdm@ zHnu&@!;bX35L5>Jd(_}vL8+)m5$qQ|m5btG=hraTuiOJ!N<_4j!AJm_P>vZlpt%R= z?&hZ#4?Y1R#z33k#qynV1tjfvBr}&+S`4`J)?tYst0~#?n!mniOOyh%0tN8opX@EC zJ`M^97g=mVb_l>+h`;--8e}LNUbK7Am|lz?Tfj8XcVC?Mcit*8@=X3pe}|I$n{*T) zV>E|ws^SA0$ZPu^k7ATIHQ&T|-4CnU1!YcA!RS<)Bf$;i%Auv_VS2I z4c%6Ayuy$OIo<5qWWy3>7~YISDK3;870%@?LwTqKMqt!9fu+*qAh#s{qlyMk9`4`f~1aSJ8F!*yzCvF zDzY0^T-+eHyw6R(Wo&#CCqc-x%Ja}4J&EZ;_~Pt~jk@6RivotYBF?)*>9Pu^yxrAg z8Hbv#z6>#k@HcW2E}Uhi!p>XvhN3muWBfF~)V&Fa6)(}wvf4fj^#`VL8a#g{Zx(^J zCTPCnBD+_l!P#Z~mhCk9anxvFHGRtTgGp8!&97+rHB9M{uTH&U-uYMvjsWk#XtH`L zP68dQcQsV65h?O{~YUw36QUam;x&{K%|)vQVjd6=&Q{dwKEc zhup~55kIl!|gm-q_~J zB5%Jo#X2PvxhtSp-d7sn+HW=bS&B40MnT@1iGzN@DjOMoVW}Wy$Vf}xX^cvW4%NFx z@Mc`wmMMGNR@LFun29SE%4=>ftL%=}SSA>H~I6@pCvYpacc0`=FNZ)8>`UCAC6t4VTwp{52z$g=~=|fH^bE!G}=i z$#tS<{9vOlb#-&q=KLN6x8?RYyTFQKPgWP|0-z3L*m`q!;9Ot>Smu^zq`N*9VIjMY zzk$5hBol02;@ScONv7ZymArpnLlBkI2*>q;^;yQ9Y<3%FCA3!_)|RC%bTO;Ia@rP10!=$tMO| zHQdr#{m8zIvwNq;tfTXXQ20#+qo%*WYN6e1!qAlXM#?&qO2=h>+UolsktXj#x4-Z) zwdo8u2F?|WIAp?K7RYEjh7cyS&3aB{c0=U_ES6yKVhYoeMrQ)88a&XQYLT~}6{Pp* zt!>d#Nnlh_=KbsOtZCinaNlCcJ8!4YX3oA(_#E)2$MF-_e$;{K9Lc=iN=2PRA1*vv zo?k+TZO3kawQFrtYGGJ+128qe>T(y4jS>A>DRf81!}P4;eYK17<8z8Ulull>U6qEa z#xNaZ1S5HXsE~sS%V}uMF8D2?rL;xCWS+R6|KoOf33L$_9Qg*s;rIs7NXo<4w5Aq> z3!eJp6t68A3vWVK4~HW^U{eg}?iO%h8DiBpp1voxgIPywW7dW;ieo3+nVOe3AMuf| zkky%lgf9E=&W)eHuSC0E1h7pjrabG=W0-ecU+{Na4qdm(QP;ztu9qg(upYh~eShxp zyFuI6U5)5jU6k2yyPTJGoM?dc!+1%!DYC9~di2@gx2yb_r05SY`p zj13Xf!Z3!pSiIay;W4d-NC#6+lYVb!0eeWA3yoD z88jvFmRXKAD4dP%$Q^{7psVET^it~nE5*hemuQa6mqHERhs^ZFLqPh>wMMHe#Vk(9 zFa$oHKV9iO3xl8UQNm>tnn6ouMC>PPY)WLm1Lz2UGqbzKGRKk3#ItCTjAGTtYXIH~ zP3|$AnkjWvFE1GFGfCwcZB=o3gwm1Qv7ZQcT1os+&+)#~v4G=A_pb=f&#X{3W^b{J zE$~5+M7X;I{kDe{cz9mQ6t03A0qn5bX+PewMluEGF98)~??UI=aDwQQ1hnon08kRG zdcyF;KHXMVOIjPF-LM_FhL6O!w4kF?mid*DW)~dAd7l^aXZ=ZZsnsDX6QTP!r%NxuOb4^3?YYbAdRg)`bo`3Q@OG{$d_@w;sUJPKB=?!55%jf z8y=uElkInwW3tCCm0FL`u%t&C?*wQHn?p1>wT?*9>sAG&dI|EuBr)>A>D9QUNGd@x)JODklf5$wZ>xo`RQ ztz<7;){uMu^faW8j5ndQ_!3o$X9_^DdCsI0pA^sXP^CtD1GERl#a=rcb|YA>fj)jK zYx0ckp?%WU!p{oQUJ;t6foEM+%yfSfAbd=I_}YyA5*z*u$WFbqYWe zxMsF&0LtA`6?Dg8QQL|m9An!tg;>AB7db`XM!uSJ0V_ze&@&~)=)!L}CVw@x)D1L_ z!^0A9wcl@6C^}?s?Bh{t(ZS+2J*;8r*zc1LTe?u0#A!``V9iW4Yp(adx7*N+x&#&t zP<8!bW74g}St8O-TkL@jQkn9b-S4D@jt);Jgb>WsJ~C6DZtxfN60`{85UqUA6lc0r z!O&hFLTah~^4Uv`GJu-&0;Y37KtTG>DvrOA##A3*Bls%?CgXUDhgtu~y0+C8;Q!Vv z>j>?c!NhPa$6e)o*2&|7XWDvQ9cw@*MmAhT;Ny|Q%EW61`i3|@4z19n2pC359H)oH zYHC^e2yhX8$ykR80bGPFsa(37bI(^nTXVsOZX9IEtMe%=rnk0a(l{6^9wp$&AvPKr zn1Rs=KR-lq@ORRoED7F7WkmYjSS(X=_g>bjp7Ru;PM)V{s!$_AoVfih8|5?`-1hyS zy2(Z>ZA*3#sq7y}BQSjTIiLSj2XrK4x@MC^wc7E9FjhJhf5wpAJ)Zp|BEyV1deLzr3(HmLTq^OFoWST<$^-|7g>(n zL{rp@NP$P$I>a33tK>S8C23SH6Kv$=sixRxJISS}k{+9t>55|V=apCw(g;vGphZNe zemlUQMySk^jLh*c={}JYiEmaeK&K`9=bg*)NwO+)RrebSkh)tq9}s&lH13-ep7Oo) zn1SNjq0H$g<<3bph**rg(A8xBVi-$u z5H(p7g0>=z$ZrTskxDcz(z|Ien2zEz%H~O7YKLtMMURuOyKGjV_B#}=6Yno;-)s9h zj1sQaBo@v=^bNcK?ynj*(aJ(eHV9+uxpYy#clxBMk>J~{#b51`_ns*UftRv_dr%Zm zzJ}9znp)J@cKXvKgY9}z^*gS4Z$b+XA>bpKSNJR+U^oxMP1V(wvuviLu@ctAa-Ua& z+2XN8GJf=Hi-wJDH+b!&&ZPP)J74$8;N8(W6wK)iqL7$%jr%5!5}jPpde5qwz=OB4 zS&L!gifXM+Gm41~dKK}VwFjZ^I2WYCy`b%OHE1Ip3rE)6&23ct-G7+|R2FMIV)vIbYMx=0^bx122GKu=YbE zv3C7tT-t+_P$>!zw&^7in<7eHbN%ddJdY*b^vFZ&u2uYG#jPsa$x)uATJ$34SvQh| zadS33L`rKpWE_`QF^*tCNi+Ca%!Bp(&m{FQJ|V1Xe#chZ%t+5a&|ZD{dntsA-%U%n z2Lkyx$D}a;X8`CmOLVQ_C{Mk%(0yN{zMCm;$CJ)x);c6!ma!8F z2QbQ-r>_tK$aYuD@QVJik6z~AYdjwtCzyKtJ#amUw&5jMz7JL3@ zwVbLDI!9Gda$$dZ)fay$p63 z5F9U0NKg^^?d)0Z+9a|4pYy*<6d=+~B_|01sTubw%Lqa$-+sxf+9pWetYfdVLuBSs z*l^fmB_BQZ8-qV;058edGJ|n{cPA>m=hZ8HjTOy_rzys z_q5<#v;Iz9Ah`{%$UIg8Q~3i+7%mr&bBTz>%>soK5@9r8HgBcacY|@PA$#N&-9j~K z0l0lz+G5e`zjuRbI{yCBE5Gz7`-g~s(QteAQd*)ukppXplxgCCR9^@&>U_ycx8r#~ zrgB_6*m?UHnrGO)7))3)#*dzAICgdWnET}i{pjgW1^_!y(r;QSWkyyP|K5Z36CT!v zLOp$bI;5LI3yClu|MWO*H>SISGU;!cR{g=%o)L&}dZgRF=b$Y|=#>)WPoDO5yhF{} z03qN*#hcs;R3H_WJF6A_`GJYK$O45HvbSYi z7=RI=>bCD5uGja*;(R6nr~y<*+Y&MDA0RyvmUP&s*-f0Zf1Wgk?BT-6)j_ljf4?u! zY2Ufb^o)X`qh-xd^iVYdCW#)~3Voc-XqEI$z~MhSF_L2+3%NtBp@Zn%%rL53VaJMx zJ^I-{5c7JgT~ntDv`yl{`cYcI{7Li9w5NrxVj0WGHC!L&j+ZFkJC&DP@)P+sl?N)Y z{MO^TTC!uuB#us1@Ly@ws=Ha`=33#Iq7QnaIFg>7?7vZlav-xC&d;U%11aJC1Gxg- zESm`rZ0>7UOE>!!@n7K2scZc(_Cv%4{()k1uM(a_?&s>BtLmH1{XmjOxtF@~6&i{- zApFZqJ)I`~z9vpdgJfX$-eP)Ix~E&(DMY}Al=Z}a`VaI+z(FsMo*H|8Zf~uI{t<|G zOa$%V{|EZ90u0D{joe7-No<_qBq`lgds zyL8Tojh`|h+Dog(k!k6O@5~*-xoKk>FI_d@*C8@cR@WuA?F~0FOl-vAl$GzBZ2BPp zQ<16HRMTMtz9hHT*o!@vf2i0K!T} zN9Yi3T{QV~4qwcCU}NaVbG%>xcs=f}LW0SqzlCnNPf$^`$70&`yGE1Yrva ztl>YRbO5gJ1}u1Jcpt8j(zsrs27A@dS(*X0pqju0hVsib-n650wD(Ug(+VVL7}Rgr zdCY-(+djD)n<}5*SI~_pvBVK7!~gu+Fa?zEimaXlI{sS&#WJ3i&_~yiUHSJ z%skddg@SyzXGZ=|mRp?#r$+-O|AtPa6dr5#l^gHvVO60}7hmd0`4YoM}@`ebrm zOQ4iZCW3DdIQ`@GR-sE!vuwjT-1`G(5VW*h>ptR^sRD{|VenggR#PEkV|ta77MoX* z_F;YG1vRfe#`rVt$=503h(a)*1fND~E12^Vt`2;5D@@<_PiCb^OTSP+Elh(p0>p zHTwSG(v}qq)Ssv_{z*nTe zZkweo17&ku#`Xll#D`cWV3ujLL3I~^?#g{;8W~Vo0c3-ut0E?cSF*v#t3pb~#f(9p zPlBrXDzmVS*R|NLJUf_WJMV7PyaVHnV$+hydE~cE($B#SSQCI?YefdZ4cjHtiEXve}rR} zlsK4`fn!RwX&PQ{a5J)&dRsH% zIGTGE%z6@^_fDC4@FJrlfIRnXr-e}SF*mn=KP3Q=U>%0qF2`hjQF&2%fI`dhyNX90qzoG}?IrVh7 zv(}VK4Yynny((>~p;$5CujbiBUKak@6N zVDwf>jtQR5hKrIdfAvCA4Vw-uZo6>JcVGSQig#M@%A*Vf85IFbyRKba+i8|$b9v^( zPMLMmEj@w&EMQ+Uu8C`U^}f{bR!;t`#x#<`{SHfj44e?)G{~w)u$EAmjoGVbOiZL9 zJ9D9|;5jD)_VmY{_v0SMk-NFW#O8R5-`H-!T`NGTAgeM;97W}!1w4VhC!ME3W8L?Y z-8ASK4`xY9wdq;qn9Yx*#RVaFcSVdwo?D9{f&V~is$ng|rMx@Uz>7atYV1 z_hl~cZhy7JP_pKvq^~QP*(RzQNdX}#j6r;0h9mL zgq_6R&=unymUJdXz#HG}5}W^63%AdyfjeBxLuclD^oo@NbNMSMK;iRXI%MFm5fevp z%tuVsA-c{asSjOT>a?>!Job%_jf=K#YD+`Z~84>fUHSgdiyrO6MSrbaxC4-Hp;I-Jnv^ zLk*JB4BcH)(%m85NJ|MweDA^c-e2w?u%G=r=M2M{eb)M{a;RlfTrv+3F=r^ZNgQlk)k#Xiws0s;DZAF2e>I-CT3P#bGVxZu{aE7 z^q-eH5$)z%WxeyVWCo$!siivRH#5SCb3wiVEA4gH{F?pbHsMNea$EDNrE<~QYE>g0bl+#OFZm8GNVqnWj4*9Tev0>WPYbL zxB15hE4Qx*7xWSSxqi~a%Y{(AgoaDrCI5+rFZDN@pP;oZ&eSsD9Y`<(AXU02BcIp< zDF9~SAP>fs*irosA}1i};Ex0s5CU)^HK$m%X{p}eK|^<{W>|U{L9r!2$14D23;-Uv z=26@+fi&eD>yox33PKaiCDhbqf2L!)4%Ui!N-LFp1XAoVWc!_>*G@lEC|>rVI=p{- zmc5dlCWu#l5Uv?e=1Ijf2VXg45z1Z?$^(Boq;A5_ivs@9+JrWD=kw=9l2AwN-6+Y< zwxx%3_)()nAXp#g*}jWWkHD^xrI!9B0A#;?d-BE_$R+4bq_k2b_q(k4*1811STSC5 z4LSb{0FXLg2ZFd;mpmY^^x6I8P|duY8r$Ya&KN85Th6!K2qoQ$u##v#hr|fX@j8fohXY!~FrwOwRK)L=^$jz$n5cvo z4uhHEi96q0i}LkfX;8?U=zgGFzpR}1Hxr*hv|9Y`Adfd|?bJK@W|8%?Bc$y{tgl1p z3>7Yr@G`^E1@W6@JH={7CR|`lR?Qsh4sVa4WTN9N3t-i~Jo|lUpTw$#c7Wq_L*MZ` z^8W1~!v}>kCnU@I?~wN2+d|s<)vV@^Nur{$%eqJHNOz_i@9XeFt6TM{NNnCuGv60K z&Pt+ozU#C=_Ay@jt?0i&H0xkZ(YQ@q5}_U1*HBVY@(S?*K<3UW7=+i96e3sKY0QKa zMP(k031^M5gx~N2oBp*d4ek{&@4hEpSoTib)|tGVTWajweqfAb=mK6}e9=vPD0(RW zJ-+ZOb9EGduXn|n?t#;<88CD@z4_j8topay!;Qf3236IGfI>VX!ItcC^6zJ#n@S`{ zhD@_*9HpM>4{+%9s1#({wOJT1zz8+4WgmX>KTyv}L0emD1-k`(R3qE*k!WdQcg}a) zm-Ru=`!vsD>6-*Wy*!B$mqYY7ZM0DO`becJD_t6?y$_jt^-|XIA78fI-c+*A-7^Ot zy&dw&`%chHh-(I`Fp%Ja9v{Cq>wG6?&7$yeGmjI_p|=$o7P9<~XHz)b90UuE75*43 z<%Hh>KesvFi~tDs35?*ziv{g58_&;H(Yb=}*&bdK9UX`oS)FQ~iT%hZ%VePgmphYu z^Jf?aSnI}OZvgcPIo~<48MC51nu?!Oug+eNRdBb)x`a~2zdV3(hZ0ZzN&2Atzv#W($=y_0Hq%J+y!{$&9ey&B(y*T_!? zjdmnt+X7(stRAPG?@7YmTY8%g;2{jw&v%%=vU;A<2mHaQMj;p(0L@;lsR^5JbEWmC z&PF3nKg9#_tIbZEjE=UMkIJVXe{D9p5nBF>18}%0F~ll5-sY~U48?g{K;;Ywfmw|D+US`$@{|KWaBQT;A3h`#%`xM3UWfhB zt7P2Ihkhmk6N1lOs1*QL{X=ByWEt9{WF}@R8|hzH(G#Vjd&>SAeZ2 zU{cuM&g+BysX(`T8g5ct0V+Xk5V|9)zy^gZvS_f|+9z}rUw`)SjE zPa=EE)8~;;2+--%-4+X-M1RI%sB-|Nfq(@jfn?8NM-#tLIu2^nQ7Ny-gr%sE=#dx; zDnv$vXepfT6AeCzb3Y)llYdGUxb|{#-N(62TAKrOjft z-tMs{T0ZNoV4+`xc|8}AP}3A3tdY+a+j7Uj@pP+lZ=qIgn=&Rjk06=O8d=_2OruXE zOm^MMq4Sl`Z(=%O?|NYPN!UcmwE#KgePTLSpKaXpK$9ghJEVo?}BR&(1mgy<`~aTM;C z3w6~V@uK#Gj09zo+L38O36AectAIb!bLYvx$m=MJG>-}TN8Yc2jx1=as`zv65#{QG z=)bA`0?vDt^z49K07_Ya6PC{yVB%`%J1b>ZGE5@F&seLz!+5cLz=qhf>=o&IuTb12 zlIbEdvXA6iC>mxUzx}leaBME+zv1^hNE)maZY_YxBeC{|xv8UB39`iuNBYoz9Z&~# z9?bOV>P5Y5`Xw~m;pvC~+2{7M_DK-3_niCbzywfhExdS&!2rgeShPh4u8)E%ws1T9?Um3;w6_uEMvsjRE(oy&T72$mQ9DI5FQd6#Cae5@`1tqg-9vUdzP zqpE+luZQQWWgz!1ag0B=0=i=B5j+i0_cwgqWM6UNFQAxS=2a@}5fTNiQTbAun0NK} z;uEmod%Zu^8|c~BUiieq6DUWP#<+eO+s0nrK5!eNsl$I$76Tl{}|XaN^0en+`r}L-i08^19By2+kUkKaDOb^Hw^~0Gq8M9GRaWm+)C?0Q6=(W> zL2fX#9+NUS`g|uo<#iOvVfxg!#JEQYOP|DI(KQzS3zg$OG-#1^_=NEri+CIFN^LySI2 z&6x>h^C$_sr7gBgA8y9DBt-FR1k!Zt2M#V}8!H`#3CROuvnSBMHJSyw<;9f}JGNRX z35T2#vfHsD`FSn!?{$LeF<6fPDmG0e&svFF*a&4JJ)<{61xgH6%sgrM96>go*5Wdg zMoK4GT>+|shH>Qw1ky^C1L%OM#Be6JQ{5g&0r@WHtoorn(qEs=A* z05{tc@ju{6zbyeL0J0jaj8$1S)~x zpP5O^p_Fz=p>L{ACz62e08oA?-Ln|?*y|Fu$;g!g?@J;eJ>U}2*aRidVl3SXBStvk z#XuNoy(Fud+q14qM>k^#BW!T&YkmH{i9E0c0 z5YPELSttBv<0Z=}42E@$E*J6&fA^uAjXn%2g%LB^&33UUnRRqUgQJSi9mi_M#N~^& zv=f@H92kGKa$7Uy&OnO{fXK8SU%o zJBlSZ0tKV}e<`~7GY{W*Q{zfJ`xiMt|1blaNCYeThTj!29ieubrhq zo{2A<+f|(o4<(%M$GJn3M#2{!%@)IN0TjOcI|xh~9FCjB*q(lMTRQ0DWbX)1Bo=;y z1ir^4A3(~lyNs3#v19jPe8yWrT0B+f-*?zTUB3WqpzQR zk)y>pe3+VCz6ty>GQFJ%MOdl|O3O6WOTcnExLRfhH%#uIRbBwuU)=Kl{Mesn7+j*r zRb9Q^pgN;Fb_N>ck0+$bA`t~us`B>M*Vhc`PB{~R;Hp&>JT~lr!06fRS(Qf@-M$*O z{G6dKkoffhtw|WCa+u<@vTZ&APD|(IeVMpd?p!(oFDr>9L1#W#FgBj#+hip;6lSSP}t^)w%ZR*1O5QFpCq8dC7U^BW}IeOio*_;xv&JXU< zB^O*Yz9ccWxj2f~icVK@e{{ByKg#BeLyuQn?!znc9& zUt!?`uXIQSn3YfrL73QNMBV9e`Icb3^<#ViuX5u$Pf(w&SXGqm?;GX1io z(v$uNrOj)hzI-c$qotj1t_ke-Qi2LkzBFX3XJ0^5)8GKzZ|x+%?LR#vep%+}91D7lAVl8%L|^>I`c*DHlB%J_q1l z{>P(FhIN3N(yhdTm;c_r_eV`m242^tvK^PpBnTY{?}Pl(^6M8zv1^SCSyhRLkBiKk z#1#zv?o{zoP_QEyDYH18<^RyaonF^9rXHII>GK>t8UR>&=xRM_qoeMQ&x!MXAwik< z;L^h}Cg;saGAg$o|He`=5FxNdzAP)1&bL2$0phUoia8rZ(&hr>4Ayu+ z+%IiZym@YfH)^&j?ZFBF@JmKF8ye2*>ztu)62i{ssi|C5cC*f2>HLZED17;1xcbh# zP4gRwr=c=cCnknmh2?#c-?zW-AHZ!Le2#I3OX!L7y1)OC`Qw>I5|+xGhzG?}%onD* z{T%!lbwXyZr+3-8f6KD2GC81*I>rs`_=_hsgYMv7rFh3n$+!B=-37^4v1G?jWPYfK z4slbPh*meyGct z_P3twP@P8kjG;#t((M;;p8^5{Njr9)K;kXxBR})DcT+U^^{xRXS}Jr;^PcYbUnZSg zE^*1CB5k{5c2n*~w{^vFD}&@D6K2fdWCQH^pq_)ZLW3=Fbt$Kpp(IKe1kF?_)Buvd zgEz`XzuA($a{R1)NO4m`Me&g^1-e}Y2(=q^Ll??iq)6pR`cWu%QS zt2JZJv5G-9%l!N7O{0>=2L(WSOak>r{pH8IyT1iNo^hOML=g3a87=g1D1Yhip6=z0 zvoo!dGRL0J4k)p3+b?sIhCYiDFfVkc51Mt+VC|ti+T3?Q%0S0^Kl-K?4qN$L z>=W+5hSl9VZthU7A0-ll2b_u&%ewd=b7$YzMpj=MCuMf&qf=r>vjMiheI}#+N|khN z2d3F0RHd>zfeLVh_G+d_sqHp>09O3 zhPABd;__nCf$#u@ELOauF|i2oSLYd0_~xgXS%eox#6e$TSy#}O{3i8HK)MK{$)W^ohq}ZCOdB47y7Ir?dJitF40ADbeuvH$YQxc%W^ERVu~otDI>7MP6z((T$ zu8+`Oz8mmEUrltRPS_I{D z3j&#%=%NoSAi+^0CCtFg#6TUMLg-?OEeel}BK2Z8Bbx8WsetA&pECC>6`O?J6s}so zN%pA5)lfprq1WKOv`o7t+Zs#8(#$L#6uJiA385DS-=633+<`9`>%!Z!It-Z2wZ`~v z7ZbHzReb)=IpFM%Pa#||XJ4cJ3X72&bG1#=o1dPqG@t}B72L}rza))|8@%^!X*ij+ z7?>=vzKs1;ti2WAZOw43f8TIv;qUtqlE+Xuh499i#r>9S^dWeZ)Ytdwz;-fE?;=+I zdNH1e_tm&42;Jx;a*z;?k{*9q;FB9WJ##TL`LI~=AX**y zygJEheD{FA`12LNLDHD9uY$Wx5{Jt^<(&p=wIa3PAh~-v!`DYxfUvcj3aWgwsA#o< zSy$^xxd+sf!OIen3I5@+*PKTtRlWWBeLAMz9M{P0nD2$bd-@AXiE$-Z+E*w7(Ch)& zevuiknjd;rU&*&)IO{bG!_9@f&9B6V8fdi#ffVfgXfyWl^n(L_1my$2jvlU#Rd9=U z8c`IrFM9hk>NJcUbU`{8_NP+C?Iun;6p~nhwQE4DKNpu(MUXG2#GIsi29?Se;WS34OKO#s|pzxrpbf0!sy)3UpRZ zE!YzK?7c#M4J)>e%9q^N5w}6ey9UZ>NCY)1@;e!4LB8(u!SF*y!phkvl*>OkdKpNRg%S?6x81{9+1WEb` zpW-=rn|?>85k6Xh|ACC?U-Rj@X5%7?hfMIqG7c_`7Z>9y7ChI@8K{thq*2wQ^?sbf z%x|Z_YKqR**iRG9@D(eDj|ljN4kd5!{zM_)Y4vk^Y}RVLXA1vrJ((egPJDN!d9NM4 zU6eDED5!*tK5u{Vf3Y)-)Ea0FY2}%}en=}FWGfG?h z_5Y5iqTW3rGUq#)?H&koQx1<2pU1$N4cRUVlBG9f3UJ9X?`wHB8JujZk2BlsKP+L+Z{~R}eB>F!CzY2NpR?Cvpiso{D?( z+llH?P$TZi>Omt#jEnu*DC>!#zhY&)2Ss@?rMc-+AS^4JXp|zPuEYYi0|jq=psFOg z_Q!B?b9N+}jmZE95o?S;%gyVY%1xC-XC=%EG$1yp`8B!4DCA|ud7)xk{j&e>U8TUJ z{<1){F%*3owk6gFYxpylazTc@jBW7{;!F5@fG!p%nvQ}~;RD-=HFsVqg%A{#qlokz zYmB0AxO!iY&AZ!?2LS3WO(*^?zZYB8wxtu)@akI-f5$Y(LYA!eB~o52-6bm%=Tm=u zT?}8~jx1LYt{xL$w0{xOg%4VEXFQI4)t3D-%&l!sPNCZ`eSRyBY=yJq;XPYUUGxkbbq@8qz)Nep5R~K)0}<Pk#|e#TYB&=XDe?z9$E$$jg{t^5t|F(^LMfPCsCF?-HxaYwZvVHWsB=N|UYj}9GO zn~3XoBrXLr3So-AF6kD2XKAhUrb z^wi;x73Ifl{0pML%@DIH4>iMr2MJ+hmHcDtOcG%eh@q0GWK@AX}Hh|=q7%e z*meg#)hn%V!(chE_Ujp|7!|fUDk~<^QoMm4b!(!9K4A@xFkUwi3i-ZU)e|b8os690 zXN=-|Uc;Lmn`il5KBi_K~X@L^|joC+;*TQ?_@7Io|xhC{N|Fl{kydaWUMF+UVomOsb1T97pQNQEY zFeE+8v4gOU=6;-ozR+ujQ;R96lU+_ml}fkx0;YV&3vQ8kIP`vD2~ghWWXk@xtutfR zo0p*;&qBFWo{;*#rfTOftUPT;76GI_I~%qATWR`&RxURIrW+Gk_B zTWRCu-123__}@UdE)r9Y`VGT!FUx7ldpS<7;$jC97E1XV~knMG_4?&pTgRJA5tZed(hFghc`;bxez=zewW*g^7npPxEu4pJmzN( z#do_jx5i#{c_5RCG9v(8ARm0P(xBB=PR)BEsvqzH z`%L!pFC11kIr;LMtNf)lf?r=@lby%`#5qCAL`o$>Y4onL$haIhCI~-utxgc1@SN7W zru-?rQ<-2GN*n%Nf#nRun@}o*jH;ed$q6oIZ^PP?ey4SzIu+TI?I`<7VuZW%R5B1N z!0S}joTXi!^1-Go!5_6tTe55UPj);bS-j#-l9`IC!+xr~F-_yChJcRz>}C|TC&{`y zPZtqnIdi7;RmQp8;BN8|drx}&1d7IIi{RzB3>t~n_!Hkr@9viEBOy{9DFTIthhJqv zpY-XrFBD(2)a<>JO$eWTJq^p8%?siHj+PQM&tWl&_;QkIRuHYJ@{Y@5(Ee`&TsMy( z_S8Im61Q79X%#vdN;sFF2ACABT;^k@?Z*Tbc+b<8a-R>TPJa)yxHrPsi7R{)Mqfu* zSPovsga+qmO~iJL6Xi8d@LI&&ip+#Yy*n6QD}iKbtFjC97m|p+N)omKzR0)FRe3Tc zlce%SE`A7 zD>8A8J;iCJ5IcmFuPmB>RQ`hM1uf2wh)y+XHxYObd|{xcqa&f3ql#XR9u21j3WtfP z$4pDi7l*m3^3s%_%_N$Modd-GQfwFO0$y@#%ygZ2)GH!z#^7!|aHb74Q#j6-ED`w- z_f_u7Yn(6#ko6_-zwE%nvYh*38TiH>HH%FZXRe4QlCGFDq2X0NQ7SBKZmXFg4bot{ zOCP}${gqTv)gEn7dg=EpABB&0=oodOz6NxVZIq;Z&MYcxrFi`+`;5o=YmDkUzQHjT zS<9V`tEK~}qn)&2*G#!yQ`q;_@mYPg%`nygJJDD9I4}tcODF^Vw=_*VM+W+ZlulAD z(!3vM5|jN5l>p6|h|%<@(os{GD6bs(r$-LSG2D&R;?~aFv0ke&5?`NZ`#9wB>iGvH z3$aFYxT2fnvB9pZaRdx0U$U3k_SobnV~^91WS~)HqAwEg9b!1tYBzIp*7{|(`A*LI z)ou3g?>fii8op=ygJWrU3&cYmDeLDzto6*qaM$dwgs4cff2&KA4Ti$ORrQ~x%F zw=cr&+0|2H6!}G_6z%4@;Uj$DLB2G6kRk(2#U>P`7gl_7f_ zn~P0tnMR8dT%Do$>lK! z**Sar^$jzmQakFW#^5Mp&!WH2RpDbQDERZPw17;&VaebbI`NOI+akG*_=ET?>Dp@g ztTg>&%7bk?D~`aL;=ac#Q`9Ph?=FLPKX3#3h3s~!?nRG%^bd(gDcl8X4yE|{6h+j3 z5Z~H##;p};Q`bbU-1lG>K9#I6bOM49YJA{fJEijx-GOCRXhG1v9y`SVht$x4}<#1tmgu?wus+#@Q$?;ktE3_ z{2MD>t)&)zvTd2t`PxD=`r%;TiLI?Hf;>zgeHh!V(9Y5{D{R(&Xk5SF=5S*q!N%aE zQ`Lc@rF!BE{tIkj%_Z-TI#WL3CI5}4=!Bd4JYh5i8mGuj?zfxyXUecOWSBGH?G8|R zUz2J{y6$WBet^==WFdQE(as!puWloXD>gNwm!Kpnn*G8r+RLL))0N zI3)wct$C3|z6Y(a2Z~czaE*YsTRHpZ^M(2B!|X35vtX{J*5;^GR39r^RdHh$RXMf) zn~~~9fwyO>J&cRb^*(Sh z+Na|?CqVTVX(Yi8K&^Ca*ta6_0`l(+%+5G()1}S&tT6hzOtX?4l&5Rh@31kCIZTt} zFDz(nCGhvM)H?(*@AVv|x)JLZZ;LInE}j2R)iGs}VRXpv`Wj9PAWY(w)AJV|tmC=T zbOg!UxU+thFD|}|vZ)VfQ>Xv#ZtTCwadP0TM}${+y!_V{OXN~_MdF+^>!YXZ$cW3; zeq?Rv*c3(OBpns;_T1RebAUN+-0+SxsTM<9`#GwqsyHu`2)XF;v{)*3bb9kL?(BES zlwb1}(!x^6iW<;Ty}hArdATvsnEb5)HwN}~6# zu~aN|!!dM#ezIY24PcqCC=c|%DJBa(i$$rYdijLJ|558hO`#A*B6g){@8ggYFa0w9 z7r>z}{o3{W`YcgsjK|~eH(|N8>w6l}nAT?va@5G&3o&bi4Xcz%N94@K!0oLce-_dw z6ANDTqK|UO+K()MsGDbxB>A2#s!&M6OCLLrE;UKKU>u?(SYzG2_FOzPtT{<{YG({m z5nM0w$G6NMJ2o&rv&T9%a&GS2@W){h>`~S{opd|2Z_Abx`tfMH+M%Nlhyh%boC$1N zC@h^@9mBr4+i_o70OPX+lt?^?+Bt1(oLD5*HRNUKs@m~4oG**mQGCzF%`PP2`Sa)0 zi3~>uS(Le7fY)_F80%&z!<;atl`SI&;~2%j=XnqI!}H@aMI4xOOA}_k-2V2wh>m8K z;o#eEgARuNFl{I5BrjPVF+IwsY7@t5?&T16Doafji`3uOKgP`}UBKn}Q55y=6h*`K zCDQ|t&d2vugcF?;bT~5B=cVME&1SVJ8II>ZZH78)_r{!J__~o} z0x2Ar2$#YHO?&F=7j(7`Mt1v<1ClouYW>4hDNKFJJa|0MA@Zmn%G@IBcszCg7H37u z872+Xv9VS0^$~t}v2&(Klq=H}fEBy3JwsQQ8q??_GQK%mue19)B{x(EeHXO#Ce7Ge zNc))MQfqa3620z)^En@xE@_J<)DfpSf;hnU@}`{d4PG}G~`Y14(XMg@cZUs|I(SoH@5~kJF zd3tH`*x#jL^B3;rjNF-F`DWc_N zj$9Q9)_5IOHOSrNYdpR%p_|6ckg@?*)%&?b{Q#tPm$@1mrE_$19kd~>t%`vZz`3SH zZe7pZ^Mu~FQ)L?*WDw_>Vln}V3*^JMGUjZq1V!%Wn0_(iSV(<864tOWbA^t+=Luf< zs>AVI7;_}`17JhJ#Q>pP=xbH@=i{sV+W!&vf+vS_F%*C-r?FxXkG@217A((O&_N+; zJe6sZcaw2x1F6_sB*+%Y*ooSt|7NrZ)FVivHBDDj>p6FmW>v=TVZ(nZIDj0EigTTB ztPj8lqc}y*RuRSIv^it9g2zgWHK3*DZ2h3SIgQ&jDg_n-Zxs|IxZ8z7$?@M9KQ$|} zesbK)-c-%CdQ~PZgR_>=QW~vw51t_sUGQE#^WoUdUp3aF9%K;3zQ~ZKo!Nf81%TcE z)BAc(9@Awx@>vG3(DH&iAvPZxqaD#E%%E-3%s`jV432I#&s5R_Bhz(?hiTXUVd?dijKdt>E8xXs*dP3CSGzw%JklMGYeoKFN0T5DqOZKejKciue{Y7JIF>LwCeA8&&ryfg%@5)<6MsMqW4 zonaRJS1MiS!YXnlBUFB!eX-cgzD>bU65Crnh*^is_3_V8I_)`%b7=HwOWDh@;I}mH zC*96=Occu%Bhy??`?6&IZ6pQFJ}{R!mvmO6dBGsb9^I9u4|sQ5Thg?QXMAk2)TRgtc4T z&I;KL<%nPZ;KW{4PC%*6yB9WvUKYc)T*qbFHS83#1XSLJ_jZD2)8M z(x(qu^qkcQRs3;a1d)7T#+923+^E@n8soJY-rRab_bR}GcQ@>J{&EXXB`7v+;vFwI zhmyd?DTza5$;|JjmsQ>8k%_}W*vY0@_1adMEV}W1`jUOo^;*p&`e{MZ2EKFh*$Ws~ z2ESIojPY?`2JB92WiqWM9WjdnnZ6xhAd{r4RQ(=H)qOQdDg*m(QF+cZUjmR1*tf(b zb$JLOIP$(;cdrp$*5-XEeeKkrv|mfYE?_hDm#hA;F6`Tm}5B z0=#3gmkF&TtJK6HGQecB>?e-*XV^j#SVgU{hi5v1Cv^32=xf%1Ey!ZAE0-HD6ApU$ zHYQH)C!JRNrsFudKqhK#b0N8p>UD^g5!#K+|PjT-IKWpgnvXX$Vd*Ho@%wVwCK+fBgd-bo^W3xm*VssI?#=@ zq@qd2Iv84|g%6I*6vX-NN(|G|e$r`yp9_O0V+G7BJ_^WE@{ zJNfw2vBIit%x^)0K)^)B3EU!RnQ;iXjdbgn%{e_H|94Vybd$&|Fv-$i^~B2U?+MqZ zm@Iga0gl3V^Tsoc@!r0KDC1zX51-Z72-zwsp4G*2h1&E`}B zFfJELoj-kgY8%d_Cs!hfl{<+{dv(|Dj9;PsR*taZDiAdYSUOb8I9)xF-22X0{zZ#C z=JCq@uC-`ap6v&$BKL$#3{+yUyiDdpX^B0+g^6vq^mpnkA+?w$`>HDdK(K$jzGrh| z+x|>i7T~jo^i6e#;!LxeKj;HgFiFI>9;tCI=SBE?VOChYjl(6#EjIJYAFs7JQg0(r z%Z@avYJhT~G=*Hcj~+ml=LutzqpxFDzexa){I6epyp9ps4dqyneY*a}1cP2wVN7Zw z=MoI$xHkp$&FNiqN=QsijGU!_F*=gvZl73QgAMgj0{8R7ehS&!x3vwrr5*Sjh5^jo z5$%AWq%CW+C(o!)i~3*&ZOs67?0fBs#NA7pPW@C~r=ztwMt&nuf)#_co7xXZdtO#C ziyQe@KPz9cPsJ+VecXr`IXpZ|ivfNj4AMdo>jYpKn}xPF<>p3xGX14$WLjozZ3*~a zVH^@o89>Vv)`=S(C2@)8yXCxxgQ$rqrf2LB z?sR^ICzn^h%1v=6JMZ6ocA;$-`DA`B3U7%v!i(z?qjBba8L~$DCL+6UVGb?Ww1f6l zJstK(g>N&bt8fQ`iTe%mQsE1k764(s92>q-zrIy+tfqfLe)uEgkzjl^F~Gj0S1DNl znT#pRsK+_cq|q9$=H%(r=GMB%+ua;$ibRZ)iQ z)<=wRuDvZr^XI-?gwybqrDEYW69)OL&4*y!Go<JwyM1|Z)n^=SoMeg38svAw2)D-;=*W+haW?I|)__1bg4UKzEe(ZTqf5yR4I02AFD zV9bL+j((S=++#zUuh>>tGfiDlh}8RprtuG7iZm)r)&h8Y+Wg&tegTlD$du1l#I@N5 zmrq)#q3ECNonaGv^hN_)urmk+cnC+e7Rf3q-C_EhJM7!zvwev$wrmv4*%cH7nXjg< z1Q2gu=gPRW;J(-CM~=~ZbC>y*C?(_ZGHoG!-K-?Ohc>_7Ep5b5fDChF1aw_i<~#YG zw-M`9f!8{HZU*|NY(!!)0*h1dPfo&W_?yr?nV;+>)Kj|+HuV_wlrxGi8<^ape+8=( zph&BWGQQf66bc|ILC_jS7li`C3u1z%T*GWCy9g|F@E(~acYGCD8d3mBFX*RmY#TnZ zhZ))yp-7*3y2FLU;KYl1ybXvmV|laE)XRMox2echbC*boTgMl3QHm39$u|p+;vXmR zxt$7~(ySAcG0~v=y^L|pfR_G>JW<@hSdUya&E2zWp#LHp?6syMH;R`0iN<@6@P}G) zItaa9@vH^(vx)P^TNXxO=`X(Am2JK*Rjn;kITfV8b+xI|#Q@h;Fm+oX_<{ zkqSSxCTk8JJR50QYqm!LDU3_9@XM6S5ON@VMWCEKcGex>@@eWzSJ9JYL=cXJ*NH?Pe5(d&6Oitm^=d#L1{cr@= zOz_`Ca{vOYVJi-3tz>E%awvfo(zuKQ+?nxxLkjfc>DUlYt18&=158oCqyiAdP+3gE zB!>X9PrrJ>sWb`Dy{6)_jcwFCYvEUfQ!AjqL>M9&Jm1e$nKhWG!*qWjZ|dvS^e2*8 zWQ^(pt!~NGB0D0zlv@YenrIVD)-b=*ynsb%LE23U)5zT z;Aaz0g+hNZfWS$>1RzMoQBWZJQchoTB|$L7B8Q)Ge1 z+etP+yLj~-7m1UfEAl;+u+^}cddH{y#TiIs3% zTiami8wbMkS_woLx|PeNf|FI^LO(7-6IN@I65maffcAFbOq-k{p`z4|U7?)vZ#SEqNtt-| ztSpxvN{|m{WSm2qtWZezDX#4OQo*0Ny0W*Z_tc8{!$;1mB5`cOR20p{ku&`kju#-+ zwZhnOt?7QdX-qlZtJ0Ji!c`8{(B1;D?u~-4fQM|w(AMGOw4yKD@tpe0nLFkHr14QK zzrrMC{H0%_xE`3{XU`pp(IS;eex^E$FBXd)=~U3Ytd;K;c;|9e`UbGS42|L-!s>6c z-cHBvpq-JVS?M`kt6!8q)7EZBJ?HOrpqm zVB8_gTZhWn6AH0Rv69Bid<)mS46kTq{l66Ep=%i&WsTpd(jQ3L)rPAS3II1LE6vcb zKjW!tCNNdxO>})1rdh)9*oZF5eI(-AS)W5TIuk-N)tdgv`~S@qL^;3vu|q}tYmGOe z-B0dWlRGR9>HxqDp?>7AqFlB!l$=XIgFIEk4np7C-v#kIFKLBE7#f+9GKqXY>UC~k zy^?f?Z_<5XH3e}3b3LY)8ouZ434GHq8J{RP!|Zy42=a`?GC3pxM$338-fL;Bwp1q* zf$?EA_s>Ui3_3ZNGr@AmnjG2-5Su;nmA}7UnjGwVs_s1$!2d9^z1kZTO4-mtO8=AJ z*lr(z>Sky&zO$xQ1Q=(_t$VDPM9S7V->cr1EE^jx)C7`=#5~pg^WSg-=G0;JSNB;e z;)#OamFG5cgBG}Qrl3NQPbHN;gnU7JgI5Fr+1PuHcN3wCesNPNLp3K|4S#3EH+5TX$;zsuB-X-9J@LmyaNNd{z9bYgXf^a_Fsh+#*&iV~{5%Xv~)S zyH7f6!(X?jj{;y&GF1M>DHs*7_(^=XSajr-uNIB9X_fI96MH=LR^ooB0jxj&v+*E%DLU=Cs2vYi`=4pj=@EP=lhf8Ma$Ytp*Ewr?!r z$ypRl(0FHKt|vuaJ8_4=afF%#M_K2`YI)S9i)gyQ>(;;*Qn&;129_{R(20u_6HU`h zA6J<;heNSIJU;V1i^?-?v{sh$D5El+N1s^qXliUA-*j4G!y;J4TX2-ABj~+q(ykb< z?P8|>MtvV%Z6nChZm{kpdA2?KQ{VYXS3Ly+xibW2(9XY_WQj3rW1Q<}0sP~mHi$?E zC3EH#X$N)ws=@tJLtD~a(cD^(s|trhR7X+b0u#2Z?`mk$7Kcc7*PWs@Vcg= zi092E{%9vz+RH)mo@!XB2ad7}KC?j~T1l{R@~zA=YVa6Sa35#8EnSnBGbNkg`W{cg zIRk(QOSdM|gz|Xa{D42Lejk3J#@mRCo0Z7gs08Nhrz{sqU)Lo0A-(&xi-NP=Mh@%> zSHN3w)8tndFO(+SqIS@^@Q%Tc2k{71Xv#T{t&12)9;Q#gcY;%kYVut=foQN zP5nG{?qA_*!Sg)HvYXm4rZ^m`uS#8J7np#9Z8e_3TCC{z3!~j&qrTM)R!!KJopmA& zC}dE?+)eR}(iW#pVjRPw$zI+Or}{VnccqeIcNv!i&g3NUxKxQ(6Dcehm?f_ZDqE!ANbuzC?n~`B%hfXv zjjSR%McvZS+!;ur@1u*pM-iiwFhm+tyS{+G;Ka$-71+yn;(l%fGpng-UUB}kuQUJ! z;R`G{Xwxo{=v%Tbu#Ennp1wP*sbzbcj#TLe6O`UTO2E*RPC`vWh}0txY5=7xSPoqX zAtrzwe(s&ra5Q*IKhDGqd-sc~?MA8nccz zKAIqO-WZ7$yx#wv!Q@)^i+K|xOhjk!7&R(OULuBlvTUj5J}U-?lrn|Fxgu;XRiVVn zlB3rWBL?+r$sH|@>*9qU!#RD;4+yM@#wZWDx=@M*HXf-C8}KzPHy`Ll&h2?f&kvWI zd(LyE;xohVNly=p<-|{0_9eSEL3PylQKEjVmckQ?ixm`0dpF0~7*4SY7VJXN7C{l+ zOBLEs4rLzM1ws)>gOyp5NZh@0FVNe9p6XXWnT=$V>Ug)- z5+mmi^@9V3Iz^O6?6TT}3#9|68oxN3dhNzN_3#ZX8cy%NIGLmap*)Ubd}(E;wCh6g z29hSh5UcD8ahDjH>%v<=rg!fUp2+qK`9&8XSvPwGFCH92b0&AL8ed7t=K4D~kak|d zNxZNEHMv~_6pbJh?0iE18klm1<}ZX6jRF>ce%&JimwaKOVj}o@BW&ubnDK zQaPC~Plz;8N{Dhi5b@q%U)i%Yh0gfv@<^s0r41vD)uSQaq2ao}cN?InO2^d9w~_hxIwpB7nJ&i3`y?guID2N#y5v$>hQ zbDV9q5^_#%e&s{6C~ulTlt+?eO2fWl4}H>191;vgVi^RuLga4b!YlCUdjLLi?41Fx zAf7m7&Z=Jek!Jy&Ai&yTRKJzao*p593%Rk%bEP3es~Pkrf#c5vW`slgjxUtNV}vOq zh;!5o`16JHL^WDg2C21+0*xsklacO{? zLCr~Lopq9@ifeq6q~z=TL>x^g^sK!D7)Ayouqt)H(U*V;+zvz}mQDb8Z}}?xfhta< z3vHw(`{Bg=sYo%%+(`;|L$R3=TWqB(SHhUo?4)M!0IafO@9K>*jk(e}KCS-6V`nd6 zgr3U>oaW{zu0{3>g6h~nKmnfy*?t4pXAep@l%;`cBPf0KrbR*JP=kU>ueFYm^6aIz z=I<77dVhf(&FAe;+nG*Gj%zus%$$|wH)^SQE!spUtU+|;*d*HnX|xKREX3j@V!!}* zwYFOS<5R#E%L27sKGJ>Ft^w?v_*fry#2n5$+)4Gi#Vr%b^UFCmiB0~Ri!oblT^?(x z&QMIz+t(3ZgpjMTYv0{HdM!2Bn^t_%cz(@szbQ+Hj~h4XX2(_!Ts>Jc-7kn3maI_q zcu^_6%d2m`ady*Iwb?&ybSurGkl?@iKD1cAy_f2)@5vw5JT%|d85<#yxZp?B>c4ms z%fs0vxKFU|D^8V-O{O6{)OPF^G{PK5GKatonNM3&S zdz;zUxGG)U#QAfus&AT@-r?3%gq=S3L+oc{a_!{Ykrlr;^h@IC})#yK*td zue&9oy|-%w6p?iMM~_&R3$`WwhAT?>Lm`JlD{|+5d|Ko}qEhkDtU> zy$puj3PD5#hT5zDqU?g?|3sKt2y}}Kzw5a^`IPKFAos9&_yl=_^2h;IXwA5x^?^78 zMB>=IG<4$D-`(s6N}=csjjQsUmo*>aaCaMce3M*Ln&ORUp?2XJIo~(Pb*6Wh6Bdo9$ zm(;2?%$U~+{HiO)O%C>UyFR##%9XzU zAC{B#>_zKx20uz=NoPG;5@0+3o@FV_9V<@vf3z$o|Lx;h_0H|ugm#n;FqUQ4nJ3T$DqvO!qD62%=?8yqLZv)ENJg)*c?|_yv>Gma# zrH1Q9TM6*DUv*hYhAx%r;Kw^&Xs>ktUfDwno+-!elFFodAQ$+{$y+s+s9q?cZ+GL+ zZC=qy4Jj2-ykozk0Sr{EZ?-CWp27nnl6WA|^`8fXnU34LK|%08_SP%W4B?9A81JYT z?w21q%)kv|cI@kf988aH$1)CO3e!#uuY<8M#F|W`A>n=KyHY3A5BfwbOUtN zs^hLgQ4_{*cj&>jBRSSwHk&^gbC5gt3FAUF_J1tXArvG%l?_=Va4xQ3WndN z<@&mw*Gu;@)WyOOTUVO>BDt5E{T*5#38?l`2l&+>$(9{6ex~+*5f*6et!BO~14bX1 zYWb^Dz0MZ;S=n2Z90I{fmRE1OPRa9v*wUUKTBgL7kwe0W$nxr~RNlq%rhI6W9nGM; z`p`OGuR5ceIbUv$@8dr(zsp9DjUe($v;H$%7J^e+N-tn>bnxZUQpT}0{Z(~MwI5Xt^zBAOS6N_uwf+2rYP50|i2bKP4 zXw4F#oOMQyh?!U4cl>i`mG8`2{G>ts_UMYc)l98Q@i?d_M8-nO_T5`G&^!k^ttW3G)GBg*~AK2QMZ(`0@8U30`Pw^Dt4xMFG zSncON{Kf>V7L2O&8B^?=o|m3=T*1+Zu}hB}BNw-!OqrXi%`-2hf(4AhYUi#z$2-bk zb9%kA4Zl=gpE0w9aaS{3Q%qk|_GmN@ykSxH^TU7b$EZYnzzc~pPf*O3<%m%hBY=`{ zww5k4+jZ;>dr{1gdvuBwP|_%ap>g_L^!W2@S7oirbO#@M$U^YDY6=f+PbFr3+bYlN zS$58LEr}X1Zf;GrimEcA%+sMuf;lxGy24++E9!fo9V@+;Sd#OC_ou^Y2p&v9K-i={ zn|^R`2(xPrR44#6-GcU{S8e~g4e2s{ST_{L%i2PWAccU$w+}(d9V{j)idjYK_-&S> zbR$|&>1S&*=`$&Z=rq#gcZ-bl{WZ&usp2w}sP&!G-LfgM6zR*O&||k!S01LcicVgy zbr9_Vv?ad^U4y3eOhq$XiCs}KM~Wda*{^LEV4(gTOc2I=x~$))TS_&;YXc+`Nxlg;E9<+vaC6u!}i*a*eqoZ!8QV2wPt--G?jEN60BE%!4|cMsmO zlp3xOctS>Sq<(OMmQ}PSN5i@r_cmLWZ3s1qmggX0^sbF)I$>0PriBREh(bz)$@LD~ zX&XU4s?H3^J#VJp!R<=#Td9P!^)nl;6K5en>JKz;O#Lmk|I2H3X3d7`(|1|)E+bN| zvc|(?va9BKj%~ej{cYL007_W8F)!xTp;<0X`{dL74$e)i8fZ#$RQs_F^l&MoQ37q& zHwb3Pf3lsb50;rU^%dMeB`x$VC3-(HGiIipZ%wWd)KvQwe@~rqM)fHt+)KDEAM(I9 z2P<4zoP(?0Di2+9^V(3~xR2mY#FnVI1Ajh);aRg40{UfeGDBBeYrjZ7E2=+y}MRKCzNr~ zX0vxriT`=zkOx2d^~T-EM@*BjHWNTAn=uOu3Id@9^tbVf-ED{42p$gAb-Rc|3}L}aw6<7bQ0I~UR`*^Q zjeC}lbMSQu9=$lC_pCQB;=ZF`pG(b?tzGsXI@zsl}H84c6i=&DnvL_2C)Mt=Qz6KxSH zL$DH{Kl%9Od!y?^EoqjWg@3NJWiQ$3jXk6liSG0-@V=v|JmHW-2tM35dnMIs>%J!x zU9GJxxpW7bKePz0b9!!jwPXMO_;LvH+;+B7jHnnVahB!!+*T+o%)Y&rvDuN>(0?sp2`z0IUB>HqJz6M zyO6+)XKelP07zb^y_B6>L055uL!Q&ByIKTq7dPjVJB+BIH*YX1GyAK-{_WWwcdn^F zyHF&RP&)#7lJa?a@^O{Xdb>*SG}lOB`s7mO*!qX|iO!ODi^C}5+4l|*Hib}#gp?sB zY;R3zE|0y@2}<=arnc%=o~5%liRJx=C65>R>EqmqHI$uD1-DagOs%KK&&d>^XL6-b zMm27>Mb$mNHsHt?oAuQ{;XQRiru=13``e3cH9aOS6)BcrZqDB5YJ~z+a@A_jRNm@F zVPVVIk*TrE83WFaRNS#H;M)yF-15?_!dj*ichPWE%NHmv-CEGVq!!sX{kYUsu-lk9 z!j4eW75P__d;_iuxb*eJs#qI~_s(~d;K~%+OSkgN>PMtIry6z-Xhq1J(9Ju*nF1E~ z@7Ss*n5+x6H9|xYZR%2aM=3w#=6tq9w)sT1A^#`);kQz}YY%9qhFAR>*4rsHlE6!x zgO)FP*;)ydkv(UUgf+MPHQ+c4yl_K)gOqISLXI)d>5A2n5$|L#Iky@bxd+Nw9GWaG=6j+(&}E%;b)-Ez%qA zVOpPc{3ZA`m(B01NsWk3m4V#GRJ8ifjp({C=E+E`(0b9$8AJTwFTpP-e9o}0snoT+cpgooz&}{gE z4hZTx-0cES*P&(ba?eV3G3fWwMa52bu}c#ou(AOb<;PpIExIOEE2SGN!@DD4qBB`pBQ0Z zDoj>g&tq^Vy!wem?>&CDL_btP$QE>AFjs&CL@2aXdnIv3tnoz)>DH06W|NK+upK+v zLEC8w5X>NM_Fye<+fiTX>FMbII*AXwwrHdD#FlFO0jT!<$}hV2F}qMjr+chm2Far` z_>$|!A1l?u%Qq8@PGh)gT9EMad#RRL{gW*>wh}L0gZb7P#gy)^^BS1^5F7S8d+)3q zKEmOW!=$%=lDwhKq(^0le5Ak_^_4MZj`26PFBbaQn7~GIy3L6wE^cvl{BRK3>?SqL z?*e4z1}_*|UmJ^_P?hA0!EJ=W8+40~OkZ%IO9h<$#v&x6S5$|@iVAu5Pl`$U#c6?R z1y_UMpIO9Cq5vLX3*`&t7p!OB(i)K&24#6X=@eO`-P?s_kSIS<8Iyi6CV6}t$*h3& zizDPIE|`<3caA_k7bCy&!aM%(R?ge?K(3N4S44d>_uN71Xju z)Vb1jTM9KbMoKZ~R4EFBrS|pDKc844J`K#b?UiL6{p=7NkSm8gH9G_{=AC-D)O6(3 zvqwmJn)E(L)-mXr(CQpZ9?V0@12?{~s4&ni>01`(AhNQH)oB$SrL>z2l`v~7a_)k2H)u0X>ftqf?{P%Y zrUnk`?sJ-BeB(kjKd)V*i);l=E9HEQi>SN?wV`=uZlu~$GgIZi5Nb}5pY@AXYa@U> z=mx##&3$yG29g$Vdkrl*R@qe)CZ7uZc}VU)TynugQq}=yT{0)(mr#7S?T|Pm2^7{{c1lMya+;TI}rp^ljJ-qU{xF z=Vk_e7H)U{RHc~-7PG%HHhBY^w*}v`NcmdaJhPR(_BNKRo(MO=;KaB%6dzx&J@$SINOFu4@HZ*9}(@? zjfq^0!lg6iYR3C{OQT0!L$>gMf-XU^k#cg!snr{% zziO)5DbALjck^upRHn4YHxl!`b6S4>yZ!q}Vj@c&FjW2=Q8EX@d4U+bsiDu0y z+Lit`V9fX<6T5H4E_b3`_zB*UGRD7td-lGb?-g)MIi6)B+ho^t*bxB;o}zpuYiZ9; z&p$O@kAIA&96I~9rG5m`%*CllKy1eaU@H1jy1&!}`%eGNP*h3Ll`$sYa7NUzgRcz; z_$kIuT?#!QsEG~^HfJL(1MLS&*WNj?%9iKe12xMQ3K1pU<;-6FT$c4c(=mF)3sC*tC!4RSS}c-~+EsmtMY2Y}&`R{Bi7wTs_U zkfBPSj>Cwwlm&nWRLA5XE#7BuGXFnL+fyhvaiF>o0^|`k!qb2RR{kWA+1Du+pvD?#d=kW~P(PrLb+E z#78GKu~&!9zKiQwy>)IaWSJSQ9Uqg7^%UO*Gvz;Pb5<<;+F*jo;}{ul01u-}4+0WPa$&71NKrxVtYF|(>% ztAg~!)o6fJ&_UBLmb3gR^_60>mx^y9A8WI8m}3A*`Pq7j)_HnwlJS&YHa_@nuH+Rd zSDVvp5!5MOzk;8k`!w6b`6|em+?5o_?J~2*8I&1V3k(scJ?vrx6o#5L=&Zs&@L8l@ z_z9iyY`Y>0Or$#Ttfs(rRfcw_L$&;f+Le?uv{VOFq*5yUSz(BSaV>plERe#sv+}h@ zV}-OBbW7>jrBdHS$%KU+uydg=L0eJZIPA$1t^B!@GB}N=rZIWdIwUXSIcg9@0o)4O z9@XvPRD0oG6lJ4(g?Q4zJlU(fI|~=Uj-!WRuj;6{ReA_T34091j#<0|{5te(bCe@# zxe`l~#rT^Bgs9-?j~M;JSI@M>M5rE>R@&TH3)E^Nb>iY98%g`pO$7x^>}yN|v5^{1A)@{?agxj#Vi zgSM?-5-g?b3s4PW(@ayg%bQorM2{E0k?{ttwIR_qbErCSv4F_57ONh4kMj5yMLoIy z;_;6k^)Dj^xAd$-qv&A{jcc%!g?|AM(XJVrrYi;t6VQ^~;QgCv7?PG-+6{gb;cq=j zI#C7n#GU4872YT29gi0~v#(qvw?2JxG8xKtkt0fk z{o+T?U7_$arvilUqq%{ESe6R*86=P2B-A zNjcJAhD%?nfD7h$`Hhc#;BA@;KGd z|K4by<=A;<3*1u*&wAF~s!+k3mmKeh44wv?qHnx?aKY9J;K97DP_SXM^Rq(!@n39> zh$G}2$l>}@Lasba)h3j1IoIcjvi7JS`EiUg$1VKd=^BskI!#CvqS~sJ9;@MriVwZf z|6z$v8zw zSp8CYKj`whI219`Onme^_YHaQ9m;6+e&ISPNaGHkhH(o zd$K27n1y%J)`FFM+5VS@*fOheextfrG z44yjVMCdf!ngo0$0!U3YSOT*j1>s&xzArsJp%}t$iQ&L~s3QD#FwIzfR zB$3K0o?BH#3LW>9E+M-IXW8rYgWYoW9BNGIaq^SfVN@tVpFLi6^puH;SR>+Ksa5B` zW3ZF3Umf{MfnjT4gRX5wDCEyhWNF~h6uMjK2$THK%i|ipB|3($B**x9Ecaf!n$B5A zo3;CB&Na$w5wq3h&`jI94&XEfimVyY2_;~f4S-c~fW^+RSXFvU?#=#}_VPB~x0ihj zx2%@AmEN0*xvb?zi+C8kz?-dUW>3?N5RSyeNZ57}@(@S4^LZ(`%`a$J?3sDij&Ref zX!5m)j*${SdriUHTP@J|NUm3SD`nRvgCF&Kl3)Dz51&Aftt^$Uqc4P_wZ5%~IzOBq z>JY5>$~Y~4ZO1HHH-tlU4}CITGkYpXka-Q0RWU=>|2c5(o*0q)@iHAxmY3*3+NMzz55IY{ityP>ceTPgs5uLB2-RWOZ{P>5<^6jQ9?OxKMGEFv=~(x-qY21tQG2fc zF4QyJ@H=4Uytt|>ZWgy8_0UCg`XFr}>TsfX1umn@g6Ea&t{akg)r- zfS|Bp^&u2+QzXP(Rv*c>sz<^6!{MOic(e1e|KFqN&;GN!@E2PUbYTOXO~Zq|dFV3j z`2a|DlGW$2qY9P-_4ARQ_de(3E*mrWoR+@h#IZxvz5zd>iJIBs$v-M?xZ-5BBn%Em zd)1RJ9>@Z49yWf!}fiM58TRxVt=SR#`9Vwik-YvCFX`J1k^5t9XC*B zR&Grx^NjaCA)TQxOOF3i8qgWBxw~w<{$S$jsug*X^~$zbCa?1EHJaH9U#?j&G`|3> zgcAcD#%bO>`w_O+GgaJVd$R1HO|Z|0o&WSq;~+-O z20L&W(~IXTTRC!)Kz^}n6r})aPCVl$&9zWIxU$_~!ZH>72vz7oc=~j4oe1TM z;~y1EJhu_jJ6kwO$H?WbJXt^XS0yJT+u*&eA2G{dsRL!;b3YzQ;2OdM8C1b7k*M=Z zZ*#<=C`DgOqq{+J_(hiu=D%B_(Q=Nl^|qDUJGNptTsw}@oIHd#?|5C#3ltlN9`8i^ zUut0Cj#tX59Btgnm+34GkN@N$9aCEpBJr1+pTLABr>|Lg^~Pz=J7T)PC@ZhH5K{_= z>YA6E8#K_wtLrt~+e4>i@UyzdV|y9!4Ve@YkQNj`cnUnycurRX5SbLTmDer?jQ>$KP`HEp@iUE+D^9GvI-`|pBb%LG9;XBv2+N>X zBu)rlct+^sb#(mV1meoLH52O8uK$$GqKs3DF9`*cH zb1?!tEVGe8l*EK!c7MMtL^=m)c8xNmr&S76I5xZoC~|kJrq=?r@h+~UXABt-kYQZP z4sH5Hrw+H=R9?Ydn9CK5v~q$6jI0$jp5nbm7u>~Icb~E!t+(-UNc9@jb#|S*w!YTv z;6UxF+D%DuR;oY!Yyla-e{w0OwO zvN1=siu(uy9474)WLoBYAS_5OoDtA+aV~D%L%Sxu{&YYa(0lB--mV^FJ;D)0;WV_Y zkf(HyOq{X`KV`(;&roCV*7X0ABO-mm_{J8Q8%*z>r!X+8mA?X)lAc!>Wlcun!_IV$ ztl)ecs%(X-IDmvAv{5bg%@RDjc-oV5vhQPXuDGDJ?jFk3oP6En&~5z?BHHtfL8@Mq zCQVw3Tct)invG04oXT=D-}b(KfT*$+cTT$gjRB877PsRY+|i7wJ?%0lZsHLLS|XbR zN2a5SXf}7p!yVs~RFZY3pB~KD<|Lsh7C!P!3xCT*PkmGI%SsLf;{U>Ii$CRK*3t|jF0x8xQNz*ecM|E zOQGEb@91iI4)1;Nk5&iu02@gI6f@7TbWys~${cck`1E3nU`6o`JsoPU6$}2&locaZ zABR9QHRD#ggq=`7$F)m|}t>B$klcZ7N6SRzVHY7y-0)Z)tnG}ph*J2=iDnGYZ`ApK`jHSR2aK;*s52}yF} zPZW~~$DvsVuS?ay_fXEV(TB|i%`et99`^SPg%#j64dOkAQjHH8-K{-ZwE^zcf)q3UTDT)GT@xb{-A zMIqk?lUxOUAmZ^xF5>Qn!jlY3;9#&Me{Wv&`xow}RTJPg3m1cx)i}PIs zPf_gFZ}noWm?xd^ri-d3KkYAlk7s3Im{A>bCfo)FK*hmu5Afc6<4#2Is;;7I$MU=y zP>5VLshiG>qP~caqo4Wkq52fJNwxTxsO{?_EQ(;mJ93~XH&dAadWE+?6aT$_5mv4! zr=<79QN?<;4gN-JDRC>&pv>~np}0CAuOp~duhot=3%Aj0H9uaJ@&bdJ+KG8!D4Ujn z%un!79glDP$4k{H3n(xIy711`p}QM+}nlmz?BtnaSi+hFOQg`Y(o z|0V&R2A08fyieQlHKU7_M}Qv8R3v_0{(~B}T3pWWX~M`W#df?@E{m;v@tt@%+ys6u z4$Y~oqNJplDcbRSz5y9o!#4cDcuLa1K(7w-hDAKbwMg@%B4GpKcb_&_3)Ia>$`QFH ze`x<9y!X((-SnD!_-T}VGLd>{>Yt%-m)VX-FtBad(87gO&olA!<`y`402OZb_)FzA@66<+c)*mXLhyvpvYez$bGFSRW%Y3cuK8UEwi>|*f(C#UDGSzG;fTRt zGPw^gFFfClpIy;3tI!w}!3P8=kcQZ~Xf{3~WIzH?;mK~>O82J_k44XXp%oUlJokR> zJ>P(UHgI)9)1BmrvS>jb*hJ767duM&dxLvDEomD*7L&aj7^_g={hB3sgOZ|Zwo(+( zj!!65a|-dvb5{)WmH@y~3+Y##`62wL=W0cQ-36{h+wcIgtcieZoBdLsI^5(vwgExz zP9sS9F$(E_qd+ha^o1N>c;CLGF3>>sxt`M&>TR0GqH+y#Mr{qd((DPW4er^;Xc0oi zn-Nz)XHl?;6UFTbuH+l@4H&9Slz^Dwux_jEGZYJiML-w+bVchzc?4|^2()fV#h;w9 z?8=$J{Yb61tzJ)vb%FQTHxEX4GejvE$~X_>c%RPB*3vxh$Wxj6BBTj@4S!e!ydp9yw0w4z zfEeq}^9is)l6xgj%$iD7=U-JbSZl{W%#lWmROpv=UxZ2(bW6g-fiB}JUhb9Rw;k_- ztCLjPYRA{IXts*h6F+&Nrc2uEP_q3jj&V>>u_w?s;XO+v8cWGnpyMjVi`SuG?uiZV p>FxNrTGdpXdppJ)xalr<0Q9(*TOk{Oe*g~nP8E=-&iv2f{{#Qw6(axu literal 0 HcmV?d00001 diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java index 65fb92fc..69ee70b6 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java @@ -4,11 +4,9 @@ import static org.oscim.core.MercatorProjection.latitudeToY; import static org.oscim.core.MercatorProjection.longitudeToX; import android.os.Build; -import android.util.Log; import androidx.annotation.RequiresApi; -import com.navinfo.collect.library.data.entity.GeometryFeatureEntity; import com.navinfo.collect.library.data.entity.RenderEntity; import org.locationtech.jts.geom.Coordinate; @@ -20,8 +18,6 @@ import org.locationtech.jts.geom.MultiPoint; import org.locationtech.jts.geom.MultiPolygon; import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Polygon; -import org.locationtech.jts.io.ParseException; -import org.locationtech.jts.io.WKBReader; import org.oscim.core.MapElement; import org.oscim.core.Tag; import org.oscim.core.Tile; @@ -144,7 +140,7 @@ public class OMDBDataDecoder extends TileDecoder { int length = removeLast ? coordinates.length - 1 : coordinates.length; for (int i = 0; i < length; i++) { mMapElement.addPoint((float) ((longitudeToX(coordinates[i].x) - mTileX) * mTileScale), - (float) ((latitudeToY(coordinates[i].y) - mTileY) * mTileScale)); + (float) ((latitudeToY(coordinates[i].y) - mTileY) * mTileScale), (float)coordinates[i].z); } // int length = removeLast ? coordinates.length - 1 : coordinates.length; diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java index d859fde9..075f465c 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java @@ -140,7 +140,7 @@ public class OMDBReferenceDecoder extends TileDecoder { int length = removeLast ? coordinates.length - 1 : coordinates.length; for (int i = 0; i < length; i++) { mMapElement.addPoint((float) ((longitudeToX(coordinates[i].x) - mTileX) * mTileScale), - (float) ((latitudeToY(coordinates[i].y) - mTileY) * mTileScale)); + (float) ((latitudeToY(coordinates[i].y) - mTileY) * mTileScale), (float)coordinates[i].z); } // int length = removeLast ? coordinates.length - 1 : coordinates.length; diff --git a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java index 44271835..3086ee49 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java @@ -222,9 +222,7 @@ public class GeometryTools { Geometry geometry; try { - geometry = reader.read(wkt); - if (geometry != null) { return geometry; } diff --git a/vtm b/vtm index c6ba77aa..24467eb5 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit c6ba77aa0eb90a84fb19377706eb6792ec4a42b6 +Subproject commit 24467eb56e3a4eafe8a5747bec7590ab234569fb From 1a19dc1cfae73b001e30ebb6471010d3c6f2f090 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Wed, 26 Jul 2023 14:45:16 +0800 Subject: [PATCH 03/12] =?UTF-8?q?feat:=20=E6=9D=86=E7=8A=B6=E7=89=A9?= =?UTF-8?q?=E3=80=81=E4=BA=A4=E9=80=9A=E9=9D=A2=E6=9D=BF3D=E5=8C=96?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 10 ++++++++++ .../fragment/personalcenter/PersonalCenterFragment.kt | 2 +- collect-library/src/main/assets/editormarker.xml | 10 +++++++++- .../collect/library/map/source/OMDBDataDecoder.java | 4 +++- .../library/map/source/OMDBReferenceDecoder.java | 2 ++ vtm | 2 +- 6 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 20ae5c30..7788238c 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -275,6 +275,16 @@ "table": "OMDB_AREA", "code": 5002, "name": "面测试" + }, + "3005":{ + "table": "OMDB_TRAFFIC_SIGN", + "code": 3005, + "name": "交通标牌" + }, + "3006":{ + "table": "OMDB_POLE", + "code": 3006, + "name": "杆状物" } } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index e78ff100..ffc5e1f1 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -115,7 +115,7 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) : viewModel.readRealmData() // 定位到指定位置 niMapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( 39.7991980627346, 116.50936676873703 )) + .animateTo(GeoPoint( 39.7991980627346,116.50936676873703 )) } // R.id.personal_center_menu_task_list -> { // findNavController().navigate(R.id.TaskManagerFragment) diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index f6ef4f7a..608943e6 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -2234,10 +2234,18 @@ - + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java index 69ee70b6..f125df58 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java @@ -19,6 +19,7 @@ import org.locationtech.jts.geom.MultiPolygon; import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Polygon; import org.oscim.core.MapElement; +import org.oscim.core.MercatorProjection; import org.oscim.core.Tag; import org.oscim.core.Tile; import org.oscim.tiling.ITileDataSink; @@ -139,8 +140,9 @@ public class OMDBDataDecoder extends TileDecoder { private void processCoordinateArray(Coordinate[] coordinates, boolean removeLast) { int length = removeLast ? coordinates.length - 1 : coordinates.length; for (int i = 0; i < length; i++) { + double z = longitudeToX(MercatorProjection.pixelXToLongitudeWithScale(MercatorProjection.metersToPixelsWithScale((float) coordinates[i].z, coordinates[i].y, mTileScale), mTileScale))* mTileScale/8; mMapElement.addPoint((float) ((longitudeToX(coordinates[i].x) - mTileX) * mTileScale), - (float) ((latitudeToY(coordinates[i].y) - mTileY) * mTileScale), (float)coordinates[i].z); + (float) ((latitudeToY(coordinates[i].y) - mTileY) * mTileScale), (float) coordinates[i].z); } // int length = removeLast ? coordinates.length - 1 : coordinates.length; diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java index 075f465c..ee8d2fdb 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java @@ -139,6 +139,8 @@ public class OMDBReferenceDecoder extends TileDecoder { private void processCoordinateArray(Coordinate[] coordinates, boolean removeLast) { int length = removeLast ? coordinates.length - 1 : coordinates.length; for (int i = 0; i < length; i++) { + // 将Z坐标的米转换为屏幕像素坐标 +// double z = longitudeToX(MercatorProjection.pixelXToLongitudeWithScale(MercatorProjection.metersToPixelsWithScale((float) coordinates[i].z, coordinates[i].y, mTileScale), mTileScale))* mTileScale/8; mMapElement.addPoint((float) ((longitudeToX(coordinates[i].x) - mTileX) * mTileScale), (float) ((latitudeToY(coordinates[i].y) - mTileY) * mTileScale), (float)coordinates[i].z); } diff --git a/vtm b/vtm index 24467eb5..ee931403 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit 24467eb56e3a4eafe8a5747bec7590ab234569fb +Subproject commit ee9314039e20ccdec4c126353e6136903ba01d08 From 1188e470bb0dc4660a14cddf5e22f5c402b85972 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Thu, 27 Jul 2023 15:53:24 +0800 Subject: [PATCH 04/12] =?UTF-8?q?fix:=20=E8=A7=A3=E6=9E=90omdb=E9=AB=98?= =?UTF-8?q?=E7=A8=8B=E6=95=B0=E6=8D=AE-=E9=81=93=E8=B7=AF=E6=A0=87?= =?UTF-8?q?=E7=89=8C=E5=92=8C=E6=9D=86=E7=8A=B6=E7=89=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 25 +++- .../com/navinfo/omqs/bean/ImportConfig.kt | 4 + .../com/navinfo/omqs/db/ImportPreProcess.kt | 121 ++++++++++++++---- .../personalcenter/PersonalCenterFragment.kt | 2 +- .../main/res/menu/personal_center_menu.xml | 2 +- .../src/main/assets/editormarker.xml | 11 +- 6 files changed, 136 insertions(+), 29 deletions(-) diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 0bac6a8c..f976ac8f 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -342,12 +342,33 @@ "3005":{ "table": "OMDB_TRAFFIC_SIGN", "code": 3005, - "name": "交通标牌" + "name": "交通标牌", + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "normalizationTrafficSignHeight()" + },{ + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateDirectReferenceLine('', 0.2)" + } + ] }, "3006":{ "table": "OMDB_POLE", "code": 3006, - "name": "杆状物" + "name": "杆状物", + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "normalizationPoleHeight()" + } + ] } } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt index 4cbbb603..3d25f18e 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt @@ -1,5 +1,6 @@ package com.navinfo.omqs.bean +import com.google.gson.annotations.Expose import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.omqs.db.ImportPreProcess import kotlin.reflect.KFunction @@ -8,8 +9,11 @@ import kotlin.reflect.full.declaredMemberFunctions class ImportConfig { + @Expose var tableMap: MutableMap = mutableMapOf() + @Expose val tableGroupName: String = "OMDB数据" + @Expose var checked : Boolean = true val preProcess: ImportPreProcess = ImportPreProcess() diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index 92c807f1..67a28e29 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -10,7 +10,9 @@ import org.json.JSONObject import org.locationtech.jts.algorithm.Angle import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.Geometry +import org.locationtech.jts.io.WKTWriter import org.oscim.core.GeoPoint +import kotlin.math.min class ImportPreProcess { @@ -208,7 +210,7 @@ class ImportPreProcess { /** * 生成与对应方向相同的方向线,用以绘制方向箭头 * */ - fun generateDirectReferenceLine(renderEntity: RenderEntity, direction: String = "") { + fun generateDirectReferenceLine(renderEntity: RenderEntity, direction: String = "", distance: String = "") { // 根据数据或angle计算方向对应的角度和偏移量 val geometry = renderEntity.wkt var isReverse = false // 是否为逆向 @@ -219,13 +221,11 @@ class ImportPreProcess { } } var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向 - var point = Coordinate(geometry?.coordinate) + var pointStartArray = mutableListOf() if (Geometry.TYPENAME_POINT == geometry?.geometryType) { - point = Coordinate(geometry?.coordinate) + val point = Coordinate(geometry?.coordinate) + pointStartArray.add(point) var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! -// if (isReverse) { -// angle += 180 -// } // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角 angle=(450-angle)%360 radian = Math.toRadians(angle) @@ -238,27 +238,48 @@ class ImportPreProcess { val p2: Coordinate = coordinates.get(coordinates.size - 1) // 计算线段的方向 radian = Angle.angle(p1, p2) - point = p1 + pointStartArray.add(p1) + } else if (Geometry.TYPENAME_POLYGON == geometry?.geometryType) { + // 记录下面数据的每一个点位 + pointStartArray.addAll(geometry.coordinates) + // 获取当前的面数据对应的方向信息 + var angle = if(renderEntity?.properties?.get("angle") == null) { + if (renderEntity?.properties?.get("heading") == null) { + 0.0 + } else { + renderEntity?.properties?.get("heading")?.toDouble()!! + } + } else renderEntity?.properties?.get("angle")?.toDouble()!! + + angle=(450-angle)%360 + radian = Math.toRadians(angle) } // 计算偏移距离 - val dx: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.cos(radian) - val dy: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.sin(radian) + var dx: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.cos(radian) + var dy: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.sin(radian) + if (distance.isNotEmpty()) { + dx = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.cos(radian) + dy = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.sin(radian) + } - val coorEnd = Coordinate(point.getX() + dx, point.getY() + dy) + for (pointStart in pointStartArray) { + val coorEnd = Coordinate(pointStart.getX() + dx, pointStart.getY() + dy, pointStart.z) + + val angleReference = ReferenceEntity() + angleReference.renderEntityId = renderEntity.id + angleReference.name = "${renderEntity.name}参考方向" + angleReference.table = renderEntity.table + angleReference.zoomMin = renderEntity.zoomMin + angleReference.zoomMax = renderEntity.zoomMax + angleReference.taskId = renderEntity.taskId + // 与原有方向指向平行的线 + angleReference.geometry = WKTWriter(3).write(GeometryTools.createLineString(arrayOf(pointStart, coorEnd))) + angleReference.properties["qi_table"] = renderEntity.table + angleReference.properties["type"] = "angle" + Realm.getDefaultInstance().insert(angleReference) + } - val angleReference = ReferenceEntity() - angleReference.renderEntityId = renderEntity.id - angleReference.name = "${renderEntity.name}参考方向" - angleReference.table = renderEntity.table - angleReference.zoomMin = renderEntity.zoomMin - angleReference.zoomMax = renderEntity.zoomMax - angleReference.taskId = renderEntity.taskId - // 与原有方向指向平行的线 - angleReference.geometry = GeometryTools.createLineString(arrayOf(point, coorEnd)).toString() - angleReference.properties["qi_table"] = renderEntity.table - angleReference.properties["type"] = "angle" - Realm.getDefaultInstance().insert(angleReference) } fun addAngleFromGeometry(renderEntity: RenderEntity): String { @@ -428,4 +449,60 @@ class ImportPreProcess { } } } + + /** + * 处理杆状物的高程数据 + * */ + fun normalizationPoleHeight(renderEntity: RenderEntity) { + // 获取杆状物的高程数据 + val geometry = renderEntity.wkt + if (geometry!=null) { + var minHeight=Double.MAX_VALUE + var maxHeight=Double.MIN_VALUE + for (coordinate in geometry.coordinates) { + if (coordinate.zmaxHeight) { + maxHeight = coordinate.z + } + } + for (coordinate in geometry.coordinates) { + if (coordinate.z == minHeight) { + coordinate.z = 0.0 + } + if (coordinate.z == maxHeight) { + coordinate.z = 40.0 + } + } + renderEntity.geometry = WKTWriter(3).write(GeometryTools.createLineString(geometry.coordinates)) + } + } + + /** + * 处理交通标牌的高程数据 + * */ + fun normalizationTrafficSignHeight(renderEntity: RenderEntity) { + // 获取交通标牌的高程数据 + val geometry = renderEntity.wkt + if (geometry!=null) { + // 获取所有的高程信息,计算高程的中位数,方便对高程做定制化处理 + var midHeight=0.0 + var countHeight = 0.0 + for (coordinate in geometry.coordinates) { + countHeight+=coordinate.z + } + midHeight = countHeight/geometry.coordinates.size + + // 对高程数据做特殊处理 + for (coordinate in geometry.coordinates) { + if (coordinate.z>=midHeight) { + coordinate.z = 40.0 + } else { + coordinate.z = 30.0 + } + } + renderEntity.geometry = WKTWriter(3).write(GeometryTools.getPolygonGeometry(geometry.coordinates)) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index a2a7e4ad..f9451430 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -126,7 +126,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit? //116.25017070328308 40.061730653134696 // 定位到指定位置 niMapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( 39.7991980627346,116.50936676873703 )) + .animateTo(GeoPoint( 40.055878135289966, 116.3011588289057 )) } // R.id.personal_center_menu_task_list -> { // findNavController().navigate(R.id.TaskManagerFragment) diff --git a/app/src/main/res/menu/personal_center_menu.xml b/app/src/main/res/menu/personal_center_menu.xml index 07e15bcc..506d3830 100644 --- a/app/src/main/res/menu/personal_center_menu.xml +++ b/app/src/main/res/menu/personal_center_menu.xml @@ -17,7 +17,7 @@ + + @@ -2134,15 +2136,18 @@ - + - + + + + - + \ No newline at end of file From 1d258c4b8e6503dee54a9ec262285c8e92fe7772 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Thu, 27 Jul 2023 16:35:15 +0800 Subject: [PATCH 05/12] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B7=B2=E7=9F=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=982.=E8=B0=83=E6=95=B4=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E5=9B=BE=E5=B1=82=E7=AD=96=E7=95=A5=E5=8F=8A=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainActivity.kt | 43 +++--- .../omqs/ui/fragment/tasklist/TaskAdapter.kt | 6 + .../res/drawable-xhdpi/icon_add_road_n.png | Bin 0 -> 539 bytes .../res/drawable-xhdpi/icon_add_road_p.png | Bin 0 -> 544 bytes .../res/drawable-xxhdpi/icon_add_road.png | Bin 0 -> 950 bytes .../res/drawable-xxhdpi/icon_add_road_n.png | Bin 0 -> 763 bytes .../res/drawable-xxhdpi/icon_add_road_p.png | Bin 0 -> 798 bytes .../res/drawable-xxhdpi/icon_add_task_n.png | Bin 0 -> 1090 bytes .../res/drawable-xxhdpi/icon_add_task_p.png | Bin 0 -> 1098 bytes .../res/drawable/selector_add_taskline.xml | 4 +- .../drawable/selector_task_head_add_link.xml | 5 + app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/layout/fragment_task.xml | 3 +- .../src/main/assets/editormarker.xml | 75 ++++++----- .../src/main/assets/omdb/icon_4002_0.svg | 44 +++++- .../src/main/assets/omdb/icon_4022_0.svg | 127 +++++++++++++++++- vtm | 2 +- 17 files changed, 252 insertions(+), 59 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/icon_add_road_n.png create mode 100644 app/src/main/res/drawable-xhdpi/icon_add_road_p.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_add_road.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_add_road_n.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_add_road_p.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_add_task_n.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_add_task_p.png create mode 100644 app/src/main/res/drawable/selector_task_head_add_link.xml diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index 5d08ab26..7457dbf9 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -465,7 +465,7 @@ class MainActivity : BaseActivity() { if (leftFragment != null) { supportFragmentManager.beginTransaction().remove(leftFragment!!).commit() leftFragment = null - binding.mainActivityBottomSheetGroup.visibility = View.GONE + hideMainActivityBottomSheetGroup() binding.mainActivityLeftFragment.visibility = View.GONE } // binding.mainActivityDrawer.open() @@ -767,19 +767,10 @@ class MainActivity : BaseActivity() { binding.mainActivityLeftFragment.visibility = View.GONE } - binding.mainActivityBottomSheetGroup.visibility = View.GONE - - mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 5) + hideMainActivityBottomSheetGroup() } else { - binding.mainActivityBottomSheetGroup.visibility = View.VISIBLE - mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 65) + showMainActivityBottomSheetGroup() } - mapController.mMapView.vtmMap.animator().animateTo( - GeoPoint( - mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude, - mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude - ) - ) } private fun voiceOnTouchStart() { @@ -800,7 +791,7 @@ class MainActivity : BaseActivity() { fun onClickTaskFragment() { if (leftFragment !is TaskManagerFragment) { if (leftFragment == null) { - binding.mainActivityBottomSheetGroup.visibility = View.VISIBLE + showMainActivityBottomSheetGroup() binding.mainActivityLeftFragment.visibility = View.VISIBLE } leftFragment = TaskManagerFragment { @@ -820,7 +811,7 @@ class MainActivity : BaseActivity() { fun onClickResFragment() { if (leftFragment !is QsRecordListFragment) { if (leftFragment == null) { - binding.mainActivityBottomSheetGroup.visibility = View.VISIBLE + showMainActivityBottomSheetGroup() binding.mainActivityLeftFragment.visibility = View.VISIBLE } leftFragment = QsRecordListFragment { @@ -834,6 +825,28 @@ class MainActivity : BaseActivity() { } } + private fun showMainActivityBottomSheetGroup(){ + binding.mainActivityBottomSheetGroup.visibility = View.VISIBLE + mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 65) + mapController.mMapView.vtmMap.animator().animateTo( + GeoPoint( + mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude, + mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude + ) + ) + } + + private fun hideMainActivityBottomSheetGroup(){ + binding.mainActivityBottomSheetGroup.visibility = View.GONE + mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 5) + mapController.mMapView.vtmMap.animator().animateTo( + GeoPoint( + mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude, + mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude + ) + ) + } + /** * 显示轨迹回放布局 */ @@ -868,7 +881,7 @@ class MainActivity : BaseActivity() { fun onClickOfflineMapFragment() { if (leftFragment !is OfflineMapFragment) { if (leftFragment == null) { - binding.mainActivityBottomSheetGroup.visibility = View.VISIBLE + showMainActivityBottomSheetGroup() binding.mainActivityLeftFragment.visibility = View.VISIBLE } leftFragment = OfflineMapFragment { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt index 8c164c07..1c5d8efa 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt @@ -1,5 +1,6 @@ package com.navinfo.omqs.ui.fragment.tasklist +import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup import com.navinfo.collect.library.data.entity.HadLinkDvoBean @@ -37,6 +38,11 @@ class TaskAdapter( val binding: AdapterTaskBinding = holder.viewBinding as AdapterTaskBinding val bean = data[position] + if(bean.linkStatus==1){ + binding.taskHead.background = binding.root.context.getDrawable(R.drawable.selector_task_head) + }else{ + binding.taskHead.background = binding.root.context.getDrawable(R.drawable.selector_task_head_add_link) + } binding.taskLinkPid.text = "PID:${bean.linkPid}" binding.taskMesh.text = "mesh:${bean.mesh}" binding.root.isSelected = selectPosition == position diff --git a/app/src/main/res/drawable-xhdpi/icon_add_road_n.png b/app/src/main/res/drawable-xhdpi/icon_add_road_n.png new file mode 100644 index 0000000000000000000000000000000000000000..930c217ff415eb83bd79a020f92b791e5633ebe6 GIT binary patch literal 539 zcmV+$0_6RPP)K!U{}2h58Y(U zbX__Cs}C7?>ATLJ2EYNZfA2bjxIF^CQ15!|_W>xm%ij1^%J!%b1=1v4=@t|YP_yhm zo`hA)9{A*+KHOZr{wHA}3aBHOVa1_i>amqLq3I-f{g%25Rtk`2#W6s=Zf^x;95FDt zz!*a!e(brer&*B33S$ruWMypsiC44_+a zRE#`plVA2+r>Xi*wKKZCj#EzqT^OL&uq6mbMgZY49dD$mU<{yJan(8>5onFUp8!ql zIe=89oa!4T;}#J%^C~7|0A0RV=Ctx{9;aLwpxUs9@#+$A={b;7Ga3WvRy$FadFQZw$oflUif<(AdMldRQ;?d+!X-a`*02clB dAE0mrz5ucc<1j(&j79(e002ovPDHLkV1mp4@yGxG literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/icon_add_road_p.png b/app/src/main/res/drawable-xhdpi/icon_add_road_p.png new file mode 100644 index 0000000000000000000000000000000000000000..8f901b6c24ae4e250d9ace56d97315765576fbd9 GIT binary patch literal 544 zcmV+*0^j|KP)k6vn?d?LO@Z%H#y8)SB)>ZqP_I>WY zStSbONxIh~s2t!>gr08(475j~9v_OZ5(VUwE3o3kG40r1oX~ZVvb?SCg1rLdS#b*R z?xU&2FX{b5hvtb%k_plG739sifZ7|b7Wp1nWpoUH)rzPSS7(~4bA=MQ*Y z1mO%|Td^F;Glkpi;tYI=y81HhE7BMPov5oX@<2BR@R}wdpydJ}Ir9g+%u~S`z_wz~ zpUjBph?#!@l-M%^fwXdxD`NuJK=i7tV{!(t zP7TO0Md9&_ofe^(563V|lQM!B2o&L8=lr)e5@mJ@Ad|iI&4nU-EAs&cenee;Qk1h) z1M+Pr)k~OV8xMI_WW`?7yeH->yB?AS8DEE?ZaZH_t9-jGE+7Dsol=Y$JxAZ=pVE>7 i+W>6(?g5~31^xgb!3;mJvkA5U0000X!NV#@(49JoJCaLga%evvqlE+wO52ay0W^|X9 zaQ@?~7-UI_Oc^jqV5O>DSzbni5MHaVCHZ2;83@gOOMIDRyrJ!r0HET_1_OIUSTUH? z;3mM%q#sfX2cY81ebDX46q{eb*g0v70~=dqQz!uCn*2sU)i(Hhy8!QdhoWiYr!W92 zzHEZfunBsc4FhlbEzvRcmni_csc@+BgwwQOdo2;hmsB{#><5=uSU>BCi!{H{_Cf%t z`0^Np&9p!b0Z4t7GH$%71E6vR4j|Jeui8xk05IsagwXMw%Q2|41uENe7al(81Ze>P z0>=7DTb$|m&-@h70if*5E)ibq1ZV?5+T*PFxS4JNom9B&%TuENDXt2L8Q(z|c^Ni* zkrws)K){&mAX5u6t5pl!JIw-HF-e5 zI~}lWL=c8)@zep>@MYa2?B@jlc@QRd2AKk&a}0)c|1%!MbzmGIrVKC@z|2np9RSpz z<(k|h;6oY}#F!LVLUvaCE<6MN Y0Wg@DZq+$+*Z=?k07*qoM6N<$g4oHn5&!@I literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/icon_add_road_n.png b/app/src/main/res/drawable-xxhdpi/icon_add_road_n.png new file mode 100644 index 0000000000000000000000000000000000000000..fd11684a74ed5de38522e8a733fbffec83f0975d GIT binary patch literal 763 zcmV4j|Z@kHyHW)*%5$J>e^a+Re=G(4iRsgpjzwse!u@l&!vk z@w@(fHk;iEAs+vy(0l+Z#@N@|N4AK#^Z+c4G35dg(W^JWK#J3A||y zoEu}Voe7cI9kr7-p%^=!03xK6>;n;Vvy;|<)|z~v+%FLEesn&dwVw8Y7&8owN%n!) zpn+*02$@Grf3gY1On%Z~bo2mP>oaTZM*>+a7TcD6;2?G8oZpV>JP@O$p<|MLASR3s zU0lrjZyI23jQQ?zp`#;bNP3h@2_gQ3#)bNmH4vJ(*J0YyK8!6@I5NXw)4Zxijbi-U?*R@8(o0!4L z0HH8SMXffosp>;YDca~h`4$>mL&^f+OoycJZ7~4W+K0A^UwzUn07@weuV01$(7T-T z5247E3!v3B+``HdW0wgz_!~rAclkmxK-Z+HX|z(RS(m*>L~qe7YZQ7708~ORQ*CP2 zTKfM~{jbXG!FhLa@ddy6Gg1y!TA7v(~Ppl$*YjzxX{d`9{O;ANxqW3Hagw teI*Wvi6#gFh*)}(5rWYuc8q;0L4X9L5cO@q%IYG$@nx3F6D;%lZAjz(VN`VthdV{Pf z@l-R!V2te<4>gSyTVi3)@ZS60&%B=@6#Sur%a1hxM@`TsHofN?QZqw0M_*&jAx5a6NQcJ<9a;dtTqEKndveS*#^% zEiS_UyZ3SY>w;aC074pgx)ylzfgk!l+EN+AKI_KDz+-kH6F+{`F;D_9(SX4o>mYuJ z0hKR?eRfv37%20AfqR&2v38-tTcFGXCjMct$J&JqXroMI23oSVK()aS_V(~n@))`7 zI*ymqi=UOJ_jf=>m{FF#+eQ7K&*(b;^@@9gV6e|4-9rH_-X?vcL0m&1z~M45CtiKZc=5Nq_A88Jh<6q zMB}N(6To2DXYWicoErdDE8XKJi|`Af1$v&#PE0^p1JE6#YN(aqHo<&ICORU#jT6*# zhLj5c<@bb}Bn_GXfWTGK#4k)Y7XY;;KL_E{MgRa%1x$A`4 zrNx3ZfHb1EW%Sxy7C1{9ng#qz0I_9si;oHOQd>SkK)&Av@4=W|#Y$)&2#0|B%^x49 z-UUG}t27fQR}kaZ6MKQ=mrg!t{bFP7FwAZ86fm&lxm z8-@9sSis~2k~DJzke1AXm=HiUuGA2~WY}lb|5{2&=IXwU@XbV!MZg1-=@j+xfGvVP zQxMA{Y&Kh-1Vp%t3nbap@9sirDec}%^#MZki0GLPh`f)R{z1c3_*fUxF|k>fVE6aY zAtBlzdLE@AT?X@BV33vm*6)dBYzVRJ$YwK)vuHdDaO(iFYFM|w1fbJU-s`0W^4749 ce&H?f7o|qOPtG(`y#N3J07*qoM6N<$g3GsS?*IS* literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/icon_add_task_n.png b/app/src/main/res/drawable-xxhdpi/icon_add_task_n.png new file mode 100644 index 0000000000000000000000000000000000000000..77007856f8ca2fae0ec274a4a179c32e416b2ab0 GIT binary patch literal 1090 zcmV-I1ikx-P)$U=e>Ku!Qyq_T`TLCgs-Cy3c4 zg-xeMgMK4hGnSO9Xa}CpoBq6h-Gl;P*Y!3CyaP}J;5tBcfJXog03H%o`iHHpuLZ8~ zw^E)1j-Bg$CO!br(C_CFflih%KDDg9k$!!8#atj=_hRJ_7A^p6db>|7!h-5ms_cHW-VO|LC6*b1v|aB<+{Mg%vrLoSyfG%gGw?wqR}B+O zca9ch*Y%DF_!PN~Z#u2*JTVzsr|WpbAQTwt3#N zsqK0kJ{tJkv6@G@L3Z8VI|7|W2kKv~11Nqk6{PL-ERp8}1S?N(C| zc;T;PkWuUq$U3yPP6{I|)7@S7dz~=8iv{>*$7+Uztph7*hTRnT>o!KeU$(90p7?WS zc0ZTEUwJ{sE>nIOAPuTMnlGP~y| zaZ&Flc-mEACW-@a13(EQ9xh{Y8Srs7NTu2YFUxNmxpQ6*WrCE-=jmqvs;mqz6{P=a z#~Xm~S_0)^+uC0JuPiCR{EO09x+Q&}G1XFrHEpLi0?`Y}f%+n$RYB64id-|0S6Lwu z(vwj2wAkoaZ-!axjX(-w|IG`7s2$)@4U^R(l1)@J9k?iA4YNRvO|Y5Zc5laploHjHm0QV6oky$Eo1R}y~30AC3?IPu9d?82&)8NW}BLhI8-WB&HK#40avwoCy0mf>#TH5Y5XpZivU)t|xkTzg#k)RaY}XPO*Z2 zn6HkwIt(a8JbydZJQ=6OK5TI0XS1w5{ga+}W*aNic5Pt!8-Pb4x0$G1cwr z1Jxv(m(r$MGVYF9E>ZPjK+0Ke4qi0P8(EZ=0+~t<=BsvVJ0-WKyPft3d=^*ZvtsVp zy*`l2{aF=cw6-ab=~!A=okhB7xBFwi*eE8OOOxeRB+>M{5+L&swwmo>lrnB>G~URn zN>eB;>}%qQ6oO0*r3|MP>5?grHz9f{ULy5BEB-@}YQ~wUli;#rM;ZKA-@H0izE>4?vF@w*<@qESPXL z8>>IJ5Ro3GHW!2={R)g@BJ_Rd1vCh!ag2BK3w7(;U$ou`WPhk1KG?-M2nUUYF|MW) z^}O-9CYpR2>3%>s7n9n8nE4-o<{(^||4Gab?t|#ZY%lZ8bnJjc62rDWCg6$js|45G z5^sF>ctM6EeL}!*-!+Kq*+ez>NlSl&=iIcr$&kPJICCtak?T=a;(22_$IJ@4p1kKfPBOVf(_}YP*bzmSO$?k1*L>t`Bj0u zi}6V4t`cMz=_?{UTLpJ>5|?~WgrSSlP7VpbqkJ^D}hTQ+$M|{ZCZ%hAPXWrOIuZ@+ANxzCxpt}EsJ83B*C*d#s@L2 z3caH+3{ySzzq#re^BfJ{XSl83C_+1fNR;%r|#S>dRxp zkv=D^(q*0MsuZNF1#{V|z2$|W5P3kbgMBv$!bpF%Cmc2yn}V1zpH0+$Q%Qm!(yc~g-!swgc7vLHApn`NoT=6`?rns& zI?EW^8H%kuPws%Um4JIXWGIR3e&e2GwZ7IQ0$MpdpJqKr>nl4xXif3{2WAwkNR%U5 QK>z>%07*qoM6N<$f~39sl>h($ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/selector_add_taskline.xml b/app/src/main/res/drawable/selector_add_taskline.xml index 45941ce4..ec6d08b2 100644 --- a/app/src/main/res/drawable/selector_add_taskline.xml +++ b/app/src/main/res/drawable/selector_add_taskline.xml @@ -1,5 +1,5 @@ - - + + diff --git a/app/src/main/res/drawable/selector_task_head_add_link.xml b/app/src/main/res/drawable/selector_task_head_add_link.xml new file mode 100644 index 00000000..5a398fa3 --- /dev/null +++ b/app/src/main/res/drawable/selector_task_head_add_link.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 08648202..ecc86505 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -154,7 +154,7 @@ android:id="@+id/main_activity_task_line" style="@style/top_right_drawer_btns_style" android:onClick="@{()->mainActivity.onClickTaskLink()}" - android:src="@drawable/icon_calc_disance" /> + android:src="@drawable/icon_add_road" /> + app:layout_constraintTop_toBottomOf="@id/task_search" + tools:ignore="MissingClass" /> \ No newline at end of file diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index d4f29fa3..04107426 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1490,12 +1490,6 @@ - - - - - @@ -1529,19 +1523,40 @@ + + + + + + + + + + + + + + + + + + - + - + @@ -1550,14 +1565,14 @@ - + - + @@ -1566,14 +1581,14 @@ - + - + @@ -1659,20 +1674,6 @@ - - - - - - - - - - - - @@ -1689,19 +1690,19 @@ + symbol-height="56" symbol-width="56"> + src="assets:omdb/icon_4006_0.svg" symbol-height="56" symbol-width="56"> + src="assets:omdb/icon_arrow_right.svg" symbol-height="64" + symbol-width="64"> @@ -1714,7 +1715,7 @@ stroke="#ffffff" stroke-width="1.0"> + src="assets:omdb/icon_4010.svg" symbol-height="24" symbol-width="18"> diff --git a/collect-library/src/main/assets/omdb/icon_4002_0.svg b/collect-library/src/main/assets/omdb/icon_4002_0.svg index a9418b73..4f4ac0a7 100644 --- a/collect-library/src/main/assets/omdb/icon_4002_0.svg +++ b/collect-library/src/main/assets/omdb/icon_4002_0.svg @@ -1 +1,43 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_4022_0.svg b/collect-library/src/main/assets/omdb/icon_4022_0.svg index dc58b844..efaaed34 100644 --- a/collect-library/src/main/assets/omdb/icon_4022_0.svg +++ b/collect-library/src/main/assets/omdb/icon_4022_0.svg @@ -1 +1,126 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vtm b/vtm index c74bcd29..d7552c34 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit c74bcd29c24cddf395fa9654ef0b69d0c88ac3ad +Subproject commit d7552c34ffdff6724b5e4ddcec461f81f1e0b669 From 0b7b262540e223d0b056f403b6ffb762e7dc0209 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Fri, 28 Jul 2023 09:40:31 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 22 +- .../src/main/assets/editormarker.xml | 396 +++++++++--------- 2 files changed, 210 insertions(+), 208 deletions(-) diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 0d898a13..cada4484 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -5,42 +5,42 @@ "code": 1012, "name": "检查点", "zoomMin": 16, - "zoomMax": 19 + "zoomMax": 21 }, "2001": { "table": "OMDB_RD_LINK", "code": 2001, "name": "道路线", "zoomMin": 16, - "zoomMax": 17 + "zoomMax": 21 }, "2002": { "table": "OMDB_RD_LINK_FUNCTION_CLASS", "code": 2002, "name": "道路功能等级", "zoomMin": 16, - "zoomMax": 17 + "zoomMax": 21 }, "2008": { "table": "OMDB_RD_LINK_KIND", "code": 2008, "name": "道路种别", "zoomMin": 16, - "zoomMax": 17 + "zoomMax": 21 }, "2010": { "table": "OMDB_LINK_DIRECT", "code": 2010, "name": "道路方向", "zoomMin": 16, - "zoomMax": 17 + "zoomMax": 21 }, "2011": { "table": "OMDB_LINK_NAME", "code": 2011, "name": "道路名", "zoomMin": 16, - "zoomMax": 17, + "zoomMax": 21, "transformer": [ { "k": "geometry", @@ -70,21 +70,21 @@ "code": 2019, "name": "常规线限速", "zoomMin": 16, - "zoomMax": 17 + "zoomMax": 21 }, "2020": { "table": "OMDB_LINK_SPEEDLIMIT_COND", "code": 2020, "name": "条件线限速", "zoomMin": 16, - "zoomMax": 17 + "zoomMax": 21 }, "2021": { "table": "OMDB_LINK_SPEEDLIMIT_VAR", "code": 2021, "name": "可变线限速", "zoomMin": 16, - "zoomMax": 17 + "zoomMax": 21 }, "2022": { "table": "OMDB_CON_ACCESS", @@ -138,7 +138,7 @@ "code": 4001, "name": "路口", "zoomMin": 16, - "zoomMax": 17, + "zoomMax": 21, "transformer": [ { "k": "geometry", @@ -297,7 +297,7 @@ "code": 4601, "name": "车信", "zoomMin": 16, - "zoomMax": 17, + "zoomMax": 21, "transformer": [ { "k": "geometry", diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 04107426..276a60d7 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1523,158 +1523,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1687,51 +1535,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2138,5 +1941,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 3c8bf307a2de733d37c16fead8fe213b8af272fd Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Fri, 28 Jul 2023 11:04:42 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 48 +++++++++---------- .../main/java/com/navinfo/omqs/Constant.kt | 2 +- .../src/main/assets/editormarker.xml | 6 +-- .../map/source/OMDBReferenceTileSource.java | 3 +- .../library/map/source/OMDBTileSource.java | 3 +- .../library/map/source/RealmDBTileSource.java | 3 +- .../collect/library/system/Constant.java | 4 +- 7 files changed, 36 insertions(+), 33 deletions(-) diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index cada4484..5a4b1afa 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -5,42 +5,42 @@ "code": 1012, "name": "检查点", "zoomMin": 16, - "zoomMax": 21 + "zoomMax": 22 }, "2001": { "table": "OMDB_RD_LINK", "code": 2001, "name": "道路线", "zoomMin": 16, - "zoomMax": 21 + "zoomMax": 22 }, "2002": { "table": "OMDB_RD_LINK_FUNCTION_CLASS", "code": 2002, "name": "道路功能等级", "zoomMin": 16, - "zoomMax": 21 + "zoomMax": 22 }, "2008": { "table": "OMDB_RD_LINK_KIND", "code": 2008, "name": "道路种别", "zoomMin": 16, - "zoomMax": 21 + "zoomMax": 22 }, "2010": { "table": "OMDB_LINK_DIRECT", "code": 2010, "name": "道路方向", "zoomMin": 16, - "zoomMax": 21 + "zoomMax": 22 }, "2011": { "table": "OMDB_LINK_NAME", "code": 2011, "name": "道路名", "zoomMin": 16, - "zoomMax": 21, + "zoomMax": 22, "transformer": [ { "k": "geometry", @@ -54,8 +54,8 @@ "table": "OMDB_LANE_MARK_BOUNDARYTYPE", "code": 2013, "name": "车道边界类型", - "zoomMin": 18, - "zoomMax": 21, + "zoomMin": 19, + "zoomMax": 22, "transformer": [ { "k": "geometry", @@ -70,21 +70,21 @@ "code": 2019, "name": "常规线限速", "zoomMin": 16, - "zoomMax": 21 + "zoomMax": 22 }, "2020": { "table": "OMDB_LINK_SPEEDLIMIT_COND", "code": 2020, "name": "条件线限速", "zoomMin": 16, - "zoomMax": 21 + "zoomMax": 22 }, "2021": { "table": "OMDB_LINK_SPEEDLIMIT_VAR", "code": 2021, "name": "可变线限速", "zoomMin": 16, - "zoomMax": 21 + "zoomMax": 22 }, "2022": { "table": "OMDB_CON_ACCESS", @@ -110,8 +110,8 @@ "table": "OMDB_RDBOUND_BOUNDARYTYPE", "code": 2083, "name": "道路边界类型", - "zoomMin": 18, - "zoomMax": 21 + "zoomMin": 19, + "zoomMax": 22 }, "2201":{ "table": "OMDB_BRIDGE", @@ -123,7 +123,7 @@ "code": 2202, "name": "隧道", "zoomMin": 16, - "zoomMax": 21, + "zoomMax": 22, "transformer": [ { "k": "geometry", @@ -138,7 +138,7 @@ "code": 4001, "name": "路口", "zoomMin": 16, - "zoomMax": 21, + "zoomMax": 22, "transformer": [ { "k": "geometry", @@ -153,7 +153,7 @@ "code": 4002, "name": "常规点限速", "zoomMin": 16, - "zoomMax": 21, + "zoomMax": 22, "transformer": [ { "k": "maxSpeed", @@ -174,7 +174,7 @@ "code": 4003, "name": "条件点限速", "zoomMin": 16, - "zoomMax": 21, + "zoomMax": 22, "transformer": [ { "k": "maxSpeed", @@ -189,7 +189,7 @@ "code": 4004, "name": "可变点限速", "zoomMin": 16, - "zoomMax": 21, + "zoomMax": 22, "transformer": [ { "k": "location", @@ -216,7 +216,7 @@ "code": 4006, "name": "普通交限", "zoomMin": 16, - "zoomMax": 21, + "zoomMax": 22, "transformer": [ { "k": "geometry", @@ -255,7 +255,7 @@ "code": 4010, "name": "电子眼", "zoomMin": 16, - "zoomMax": 21, + "zoomMax": 22, "transformer": [ { "k": "geometry", @@ -288,7 +288,7 @@ "code": 4022, "name": "交通灯", "zoomMin": 16, - "zoomMax": 21, + "zoomMax": 22, "transformer": [ ] }, @@ -297,7 +297,7 @@ "code": 4601, "name": "车信", "zoomMin": 16, - "zoomMax": 21, + "zoomMax": 22, "transformer": [ { "k": "geometry", @@ -323,8 +323,8 @@ "table": "OMDB_LANE_LINK_LG", "code": 5001, "name": "车道中心线", - "zoomMin": 18, - "zoomMax": 21, + "zoomMin": 19, + "zoomMax": 22, "transformer": [ { "k": "geometry", diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index 30e53f7a..b4042a1f 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -67,7 +67,7 @@ class Constant { /** * 地图最多缩放级别23 */ - const val MAX_ZOOM = 23 + const val MAX_ZOOM = 22 /** * 是否自动定位 diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 276a60d7..030d0b62 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1537,7 +1537,7 @@ - + @@ -1962,7 +1962,7 @@ - + - Date: Tue, 1 Aug 2023 09:54:11 +0800 Subject: [PATCH 08/12] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt | 4 ++-- collect-library/src/main/assets/editormarker.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index 67a28e29..da2bf851 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -259,8 +259,8 @@ class ImportPreProcess { var dx: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.cos(radian) var dy: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.sin(radian) if (distance.isNotEmpty()) { - dx = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.cos(radian) - dy = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.sin(radian) + dx = GeometryTools.convertDistanceToDegree(distance.toDouble(), geometry?.coordinate?.y!!) * Math.cos(radian) + dy = GeometryTools.convertDistanceToDegree(distance.toDouble(), geometry?.coordinate?.y!!) * Math.sin(radian) } for (pointStart in pointStartArray) { diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 90bc957f..9e6befff 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -2136,7 +2136,7 @@ - + From c54cbae676b3b188af9977770fbe8425328782f6 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 1 Aug 2023 15:36:56 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=B8=8A=E4=BC=A0=E6=97=A0=E6=95=88=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/navinfo/omqs/http/taskupload/TaskUploadScope.kt | 4 ++-- .../com/navinfo/omqs/ui/activity/login/LoginViewModel.kt | 3 +++ app/src/main/res/menu/personal_center_menu.xml | 2 +- collect-library/src/main/assets/editormarker.xml | 6 +++--- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt index 41b948ef..519430d6 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt @@ -164,7 +164,7 @@ class TaskUploadScope( val objects = realm.where(QsRecordBean::class.java) .equalTo("linkId", /*"84207223282277331"*/hadLinkDvoBean.linkPid).and() - .equalTo("taskId", hadLinkDvoBean.taskId).findAll() + .equalTo("taskId", taskBean.id).findAll() if (objects != null && objects.size > 0) { val copyList = realm.copyFromRealm(objects) @@ -241,7 +241,7 @@ class TaskUploadScope( change(FileUploadStatus.ERROR) } } else { - change(FileUploadStatus.NONE) + change(FileUploadStatus.NONE,"无可上传数据") } } catch (e: Throwable) { change(FileUploadStatus.ERROR) diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt index f167d595..52582359 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt @@ -281,6 +281,9 @@ class LoginViewModel @Inject constructor( task.operationTime = DateTimeUtil.getNowDate().time } } else { + for (hadLink in task.hadLinkDvoList) { + hadLink.taskId = task.id + } //赋值时间,用于查询过滤 task.operationTime = DateTimeUtil.getNowDate().time } diff --git a/app/src/main/res/menu/personal_center_menu.xml b/app/src/main/res/menu/personal_center_menu.xml index 07e15bcc..80fd31f2 100644 --- a/app/src/main/res/menu/personal_center_menu.xml +++ b/app/src/main/res/menu/personal_center_menu.xml @@ -38,7 +38,7 @@ + android:title="版本:ONE_QE_V1.5.0_20230728_A" /> diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 030d0b62..7a772d09 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1486,9 +1486,9 @@ - + @@ -1955,7 +1955,7 @@ - + From c2d47afed756b4497dceb60b026787a24a504192 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Tue, 1 Aug 2023 16:01:39 +0800 Subject: [PATCH 10/12] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9symbol=E8=A6=81?= =?UTF-8?q?=E7=B4=A0=E5=9C=A8=E9=99=90=E5=88=B6=E5=B1=82=E7=BA=A7=E4=B8=8B?= =?UTF-8?q?=E4=BE=9D=E7=84=B6=E6=98=BE=E7=A4=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collect/library/map/handler/LayerManagerHandler.kt | 8 +++----- vtm | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt index 3fd83edb..eafd7dea 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt @@ -72,7 +72,7 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView, traceP vectorNiLocationTileLayer = VectorTileLayer(mMapView.vtmMap, mapLifeNiLocationTileSource) labelNiLocationLayer = - LabelLayer(mMapView.vtmMap, vectorNiLocationTileLayer, LabelTileLoaderHook(), 15) + LabelLayer(mMapView.vtmMap, vectorNiLocationTileLayer, LabelTileLoaderHook()) if (vectorNiLocationTileLayer != null) { addLayer(vectorNiLocationTileLayer, NIMapView.LAYER_GROUPS.BASE) @@ -110,8 +110,7 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView, traceP omdbReferenceLabelLayer = LabelLayer( mMapView.vtmMap, omdbReferenceTileLayer, - LabelTileLoaderHook(), - Constant.OMDB_MIN_ZOOM + LabelTileLoaderHook() ) if (omdbReferenceTileLayer != null) { addLayer(omdbReferenceTileLayer, NIMapView.LAYER_GROUPS.VECTOR_TILE) @@ -124,8 +123,7 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView, traceP omdbLabelLayer = LabelLayer( mMapView.vtmMap, omdbVectorTileLayer, - LabelTileLoaderHook(), - Constant.OMDB_MIN_ZOOM + LabelTileLoaderHook() ) if (omdbVectorTileLayer != null) { addLayer(omdbVectorTileLayer, NIMapView.LAYER_GROUPS.VECTOR_TILE) diff --git a/vtm b/vtm index ee931403..c74bcd29 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit ee9314039e20ccdec4c126353e6136903ba01d08 +Subproject commit c74bcd29c24cddf395fa9654ef0b69d0c88ac3ad From 09b3dd2f43b7e0610ed21f6d792f782cbc95f03c Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Tue, 1 Aug 2023 16:26:33 +0800 Subject: [PATCH 11/12] =?UTF-8?q?fix:=20=E9=80=82=E9=85=8D3D=E6=B8=B2?= =?UTF-8?q?=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- collect-library/src/main/assets/editormarker.xml | 2 +- .../navinfo/collect/library/map/source/OMDBDataDecoder.java | 6 +++--- .../collect/library/map/source/OMDBReferenceDecoder.java | 2 +- vtm | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 12dd63ab..4648923e 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1706,7 +1706,7 @@ - + diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java index 84d6f13f..d7c54a2c 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java @@ -4,6 +4,7 @@ import static org.oscim.core.MercatorProjection.latitudeToY; import static org.oscim.core.MercatorProjection.longitudeToX; import android.os.Build; +import android.util.Log; import androidx.annotation.RequiresApi; @@ -19,7 +20,6 @@ import org.locationtech.jts.geom.MultiPolygon; import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Polygon; import org.oscim.core.MapElement; -import org.oscim.core.MercatorProjection; import org.oscim.core.Tag; import org.oscim.core.Tile; import org.oscim.tiling.ITileDataSink; @@ -143,9 +143,9 @@ public class OMDBDataDecoder extends TileDecoder { private void processCoordinateArray(Coordinate[] coordinates, boolean removeLast) { int length = removeLast ? coordinates.length - 1 : coordinates.length; for (int i = 0; i < length; i++) { - double z = longitudeToX(MercatorProjection.pixelXToLongitudeWithScale(MercatorProjection.metersToPixelsWithScale((float) coordinates[i].z, coordinates[i].y, mTileScale), mTileScale))* mTileScale/8; +// double z = longitudeToX(MercatorProjection.pixelXToLongitudeWithScale(MercatorProjection.metersToPixelsWithScale((float) coordinates[i].z, coordinates[i].y, mTileScale), mTileScale))* mTileScale/8; mMapElement.addPoint((float) ((longitudeToX(coordinates[i].x) - mTileX) * mTileScale), - (float) ((latitudeToY(coordinates[i].y) - mTileY) * mTileScale), (float) coordinates[i].z); + (float) ((latitudeToY(coordinates[i].y) - mTileY) * mTileScale), 0); } // int length = removeLast ? coordinates.length - 1 : coordinates.length; diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java index c1607262..cc4d43dd 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java @@ -143,7 +143,7 @@ public class OMDBReferenceDecoder extends TileDecoder { // 将Z坐标的米转换为屏幕像素坐标 // double z = longitudeToX(MercatorProjection.pixelXToLongitudeWithScale(MercatorProjection.metersToPixelsWithScale((float) coordinates[i].z, coordinates[i].y, mTileScale), mTileScale))* mTileScale/8; mMapElement.addPoint((float) ((longitudeToX(coordinates[i].x) - mTileX) * mTileScale), - (float) ((latitudeToY(coordinates[i].y) - mTileY) * mTileScale), (float)coordinates[i].z); + (float) ((latitudeToY(coordinates[i].y) - mTileY) * mTileScale), 0); } // int length = removeLast ? coordinates.length - 1 : coordinates.length; diff --git a/vtm b/vtm index c74bcd29..4c9926d1 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit c74bcd29c24cddf395fa9654ef0b69d0c88ac3ad +Subproject commit 4c9926d105877fce305025e8f85651ccea947c4f From 0462a1682eca3869d645031c9f082f2b2d10098a Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Tue, 1 Aug 2023 17:15:40 +0800 Subject: [PATCH 12/12] =?UTF-8?q?fix:=20=E5=90=88=E5=B9=B6editormarker?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/assets/editormarker.xml | 196 ------------------ 1 file changed, 196 deletions(-) diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 708d33a7..c3f94b2d 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1520,154 +1520,6 @@ -<<<<<<< HEAD - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -======= ->>>>>>> c54cbae676b3b188af9977770fbe8425328782f6 @@ -1680,54 +1532,6 @@ -<<<<<<< HEAD - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -======= ->>>>>>> c54cbae676b3b188af9977770fbe8425328782f6