From fae46080c7c692e2db22aacff45fde9236c6787c Mon Sep 17 00:00:00 2001 From: Joshua Pirihi Date: Mon, 17 Jan 2022 14:03:48 +1300 Subject: [PATCH] Local MBTiles source --- Meshtastic Client.xcodeproj/project.pbxproj | 33 ++++++++ .../xcshareddata/swiftpm/Package.resolved | 9 +++ .../UserInterfaceState.xcuserstate | Bin 67549 -> 100418 bytes MeshtasticClient/Info.plist | 41 +++++++++- MeshtasticClient/MTAppDelegate.swift | 28 +++++++ MeshtasticClient/MeshtasticClientApp.swift | 2 + .../Views/Map/LocalMBTileOverlay.swift | 72 ++++++++++++++++++ .../Views/Map/MapViewModule.swift | 18 +---- MeshtasticClient/Views/Nodes/NodeMap.swift | 2 +- 9 files changed, 188 insertions(+), 17 deletions(-) create mode 100644 MeshtasticClient/MTAppDelegate.swift create mode 100644 MeshtasticClient/Views/Map/LocalMBTileOverlay.swift diff --git a/Meshtastic Client.xcodeproj/project.pbxproj b/Meshtastic Client.xcodeproj/project.pbxproj index 1a2e70d0..84f3004b 100644 --- a/Meshtastic Client.xcodeproj/project.pbxproj +++ b/Meshtastic Client.xcodeproj/project.pbxproj @@ -8,6 +8,10 @@ /* Begin PBXBuildFile section */ C9483F6D2773017500998F6B /* MapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9483F6C2773017500998F6B /* MapView.swift */; }; + C9697F9B2793366500250207 /* offline_map.mbtiles in Resources */ = {isa = PBXBuildFile; fileRef = C9697F9A2793366500250207 /* offline_map.mbtiles */; }; + C9697F9D279336B700250207 /* LocalMBTileOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9697F9C279336B700250207 /* LocalMBTileOverlay.swift */; }; + C9697FA527933B8C00250207 /* SQLite in Frameworks */ = {isa = PBXBuildFile; productRef = C9697FA427933B8C00250207 /* SQLite */; }; + C9697FA72793F9FB00250207 /* MTAppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9697FA62793F9FB00250207 /* MTAppDelegate.swift */; }; C9A7BC1027759A9600760B50 /* PositionAnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A7BC0F27759A9600760B50 /* PositionAnnotationView.swift */; }; C9A88B55278B503C00BD810A /* MapViewModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A88B54278B503C00BD810A /* MapViewModule.swift */; }; C9A88B57278B559900BD810A /* apponly.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A88B56278B559900BD810A /* apponly.pb.swift */; }; @@ -74,6 +78,9 @@ /* Begin PBXFileReference section */ C9483F6C2773017500998F6B /* MapView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapView.swift; sourceTree = ""; }; + C9697F9A2793366500250207 /* offline_map.mbtiles */ = {isa = PBXFileReference; lastKnownFileType = file; path = offline_map.mbtiles; sourceTree = ""; }; + C9697F9C279336B700250207 /* LocalMBTileOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalMBTileOverlay.swift; sourceTree = ""; }; + C9697FA62793F9FB00250207 /* MTAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MTAppDelegate.swift; sourceTree = ""; }; C9A7BC0F27759A9600760B50 /* PositionAnnotationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PositionAnnotationView.swift; sourceTree = ""; }; C9A88B54278B503C00BD810A /* MapViewModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewModule.swift; sourceTree = ""; }; C9A88B56278B559900BD810A /* apponly.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = apponly.pb.swift; sourceTree = ""; }; @@ -132,6 +139,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + C9697FA527933B8C00250207 /* SQLite in Frameworks */, DD5394FC276993AD00AD86B1 /* SwiftProtobuf in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -159,6 +167,7 @@ C9A7BC0E27759A6800760B50 /* Custom */, C9483F6C2773017500998F6B /* MapView.swift */, C9A88B54278B503C00BD810A /* MapViewModule.swift */, + C9697F9C279336B700250207 /* LocalMBTileOverlay.swift */, ); path = Map; sourceTree = ""; @@ -258,6 +267,7 @@ DDC2E18826CE24EE0042C5E4 /* Model */, DDC2E18926CE24F70042C5E4 /* Resources */, DDC2E15726CE248E0042C5E4 /* MeshtasticClientApp.swift */, + C9697FA62793F9FB00250207 /* MTAppDelegate.swift */, DDC2E16526CE248F0042C5E4 /* Info.plist */, DDC2E15D26CE248F0042C5E4 /* Preview Content */, ); @@ -316,6 +326,7 @@ DDC2E18926CE24F70042C5E4 /* Resources */ = { isa = PBXGroup; children = ( + C9697F9A2793366500250207 /* offline_map.mbtiles */, DDC2E15B26CE248F0042C5E4 /* Assets.xcassets */, ); path = Resources; @@ -383,6 +394,7 @@ name = MeshtasticClient; packageProductDependencies = ( DD5394FB276993AD00AD86B1 /* SwiftProtobuf */, + C9697FA427933B8C00250207 /* SQLite */, ); productName = MeshtasticClient; productReference = DDC2E15426CE248E0042C5E4 /* MeshtasticClient.app */; @@ -435,6 +447,7 @@ TargetAttributes = { DDC2E15326CE248E0042C5E4 = { CreatedOnToolsVersion = 12.5.1; + LastSwiftMigration = 1320; }; DDC2E16926CE248F0042C5E4 = { CreatedOnToolsVersion = 12.5.1; @@ -457,6 +470,7 @@ mainGroup = DDC2E14B26CE248E0042C5E4; packageReferences = ( DD5394FA276993AD00AD86B1 /* XCRemoteSwiftPackageReference "swift-protobuf" */, + C9697FA327933B8C00250207 /* XCRemoteSwiftPackageReference "SQLite.swift" */, ); productRefGroup = DDC2E15526CE248E0042C5E4 /* Products */; projectDirPath = ""; @@ -476,6 +490,7 @@ files = ( DDC2E15F26CE248F0042C5E4 /* Preview Assets.xcassets in Resources */, DDC2E15C26CE248F0042C5E4 /* Assets.xcassets in Resources */, + C9697F9B2793366500250207 /* offline_map.mbtiles in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -551,10 +566,12 @@ DDAF8C6326ED0A230058C060 /* admin.pb.swift in Sources */, C9483F6D2773017500998F6B /* MapView.swift in Sources */, DDAF8C5826ED07FD0058C060 /* mesh.pb.swift in Sources */, + C9697FA72793F9FB00250207 /* MTAppDelegate.swift in Sources */, DD8169FB271F1F3A00F4AB02 /* MeshLog.swift in Sources */, DD2E65262767A01F00E45FC5 /* NodeDetail.swift in Sources */, C9A88B57278B559900BD810A /* apponly.pb.swift in Sources */, DD47E3D926F3093800029299 /* MessageBubble.swift in Sources */, + C9697F9D279336B700250207 /* LocalMBTileOverlay.swift in Sources */, DD8169F9271F1A6100F4AB02 /* MeshLogger.swift in Sources */, DD539502276DAA6A00AD86B1 /* MapLocation.swift in Sources */, DDAF8C6726ED0C8C0058C060 /* remote_hardware.pb.swift in Sources */, @@ -720,6 +737,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MeshtasticClient/MeshtasticClient.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 15; @@ -737,6 +755,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2,6"; }; @@ -748,6 +767,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MeshtasticClient/MeshtasticClient.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 15; @@ -896,6 +916,14 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ + C9697FA327933B8C00250207 /* XCRemoteSwiftPackageReference "SQLite.swift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/stephencelis/SQLite.swift.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 0.9.2; + }; + }; DD5394FA276993AD00AD86B1 /* XCRemoteSwiftPackageReference "swift-protobuf" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/apple/swift-protobuf.git"; @@ -907,6 +935,11 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + C9697FA427933B8C00250207 /* SQLite */ = { + isa = XCSwiftPackageProductDependency; + package = C9697FA327933B8C00250207 /* XCRemoteSwiftPackageReference "SQLite.swift" */; + productName = SQLite; + }; DD5394FB276993AD00AD86B1 /* SwiftProtobuf */ = { isa = XCSwiftPackageProductDependency; package = DD5394FA276993AD00AD86B1 /* XCRemoteSwiftPackageReference "swift-protobuf" */; diff --git a/Meshtastic Client.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Meshtastic Client.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 1cb05e42..c0572681 100644 --- a/Meshtastic Client.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Meshtastic Client.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,6 +1,15 @@ { "object": { "pins": [ + { + "package": "SQLite.swift", + "repositoryURL": "https://github.com/stephencelis/SQLite.swift.git", + "state": { + "branch": null, + "revision": "60a65015f6402b7c34b9a924f755ca0a73afeeaa", + "version": "0.13.1" + } + }, { "package": "SwiftProtobuf", "repositoryURL": "https://github.com/apple/swift-protobuf.git", diff --git a/Meshtastic Client.xcodeproj/project.xcworkspace/xcuserdata/joshuapirihi.xcuserdatad/UserInterfaceState.xcuserstate b/Meshtastic Client.xcodeproj/project.xcworkspace/xcuserdata/joshuapirihi.xcuserdatad/UserInterfaceState.xcuserstate index 85e4e4d5c2962ae21b71d9d554869200c1036c6e..66abbf05c5972d37806bdf97770f5cc0336576e2 100644 GIT binary patch literal 100418 zcmeEv2YeJ&*Z15zb$51mW?ObcGZ+vA(mO>+g-8n|p+gMG0)ZqOvI#{+=VC8_pokrl z&_TeCVDAMBU<11%_TEM1J9lO$g~Z77KKMTG_xuEQ*_pZh{!h8*oO@?xO=U%>E3Q^C|T3z&t>B4#nOgt>sZkhz?>f?2^_ z#jIwoV>U6HnJvs#W*c)Gvz^(&Jit82Jj6WAJiuaU71v$v7Qn;2}60=i%YF6wkzExEu%Y zEIb>}!4-Heo`)-O4PJ;B;l=oTtl>-XW%zQu3@^tk@b&lxd?UUI-;8g;Yw{0j_z->@zk@%(hw;ZO!y*>5EX%PxE3hIfu@=_KI#@3o z!FFT2v%T5V*gkAu_H;IZO=OeUWOfLf!;WGL*l}zzJDHu%ma;S1S?p|f9$U%Qv*)rG zvX`=#vCG)y>A@*(d z9rgqEDEk}xJNpNFjAJ;&VUFcEj^`|#$~ie7=jWohp4_QiG}nt8z{PN}Tq2js4dwE< zG2D1=0yl-5!Oi5#xY^wKoW>DuDR%*PA$JjXF?R`fDR&vSjJt-rfxD4w;?{B7xZAkf zxjVS~xJS7sxo5c-xc%I#+#&7_?o;k7?kM*g_dE9ocZ`>L8*k?wyuy3=2)--dn?H^3 z!zb{Gd=j6*59H6_v-oU&I6smv>~COdyA)ueZ>A^tQaR|hy%qz;$U%@m?@4D z$BKnwkvK`5ES898iKSvdoF&c^YsHXQC!Q^yBVHh0B3>$9DJ~P&iyOp^;wEvkxJBG5 zZWC`4w~IT(JH_4N9_~Z&e(_Q9G4VNZulT(9g7~WVn)sFYwfK$rt@xezz4(Lpqxh5f zv-pd6OkyNSvPd?`E_tO0sjoCZijfkeL@8BDlLkqHrD0O0lq=;)XG$Zbang8ck~Bjq zk;4wD)&bTSYpgZS8gEUoCR&rM z$<`EWhIN=V&pO;X)>>d4XPs=FVy(4?taa9U>jLXS>muu7>)Fm}A@*5%e~ zt!u2;S+BP?SR1Xot$VEZTOY7KXnn}~u=Nq^qt?f)k6WL%zG!{L`l|J9>pRwWtsh%I zk&%pLR_0`07GzPDWQ%N-Wm%CUWS{Jpd&sBAedNCK>2iXcD36jy%VXrRa)CTf9xoTl zMRKt`L7pg2m1oLja)mrsu9ZV_om?-UFKaT9m&zB&SIAe&>*V$F26>~rN!~1Pk+;g* zt+iSMBZHH|i+P<)TY5U6di|tq2QQL2J&d%Gr+k4ng zu}9f^+E2Ad+k4r2+fTFivG=zp+SBbB_Dp-0J=>mRA7vkH57=kfXWQr4E9`Ua^X!%O zDtom(Xb;)Xwrh4`zs!EQ{R;cl_G|3h?6=vs+jrP^+HbetVZYOUm;G-0J@(!9N9<48 zpSHhb-)G-%KV*Ny{+<1M`w#XX?LXOnw*O-P)qd3eoBekOa!3w`Lvi>Ven+IEr{h$| zK*u1*V8;;08IGZjVUA2kmLuDd;~3!>>nL_iaLjO&IL>m+aa1^nW2xf;$AylI92Yw- zaa`)S%yGHn3dah^wT_z{H#^olHaIpqHaT`WZg)K6c-HZpW3S_R#|w@Z9WOcdIrcja zI9_wS?RdxWuH%T~Bga>cuN~hwzIFWSII6f6kK$D#6rbW(B9$&mSEZZMUFoUxRZdsp zlz1gw$xsF=SxUAtRhgztS7skrlzYI>OggnI#?a14p&F3W7G-iM0Jun zQ!P`=)qq;1R;!n)m#LSlSEyI2%hcuS3iT>=rMgPJT3w^wqOMcdtGB7!)g9`6>TY$9 zdcXR(`h@zH`nLLx`mXw(`o8*sdRYBXJ)(Z3ex`n_ey9GT{_4a|*2y_}r{Hur6=xr3 zU+3x0e$M{R0nQj_tTWCT?@Vx}I0rkkoY~Hi&QZ?M&SK{TXSFlvtZ~kF);dGZI%mCe zfpejAk@H;V1A^ocB3*JNG#6cRt{J(D{(_G3T?+ zmz?{Y2c3tUZ#X}29(Mlb{N4G7^O%cqAs2SBF3!cf1eew2bh%u9SEQ?_>r_`iSASQM zE6tVe8tfY4Dt1k9O>|9iO?FLjO?6FkO?S<3mAJ}Wb6wT0plhLPk!!JQrE8VzYS%Tc z)vjw@Yh2g4u6Nzwy3w`PwZXOBwZpa3wcGWe>mk=;uE$+_T`##_cfIL4?E2XCrR!VQ zcW%)wxh-z1TXx&rcDKW=xZQ4#+wYEacX4-hpW^QAKF!_F-QPXH9q&$c4|ET54|k7n z=ey5zk93c6k9Lo9PjpXmpXDxf&vci$=eR4~weFC+&V8kOnR~f=h5IV^O7|-F)$VKD ztKHYS*SN29U+=!beWUv(_a^sd_ZIh7_cr%!?(Oa!?z`O&xgT~v;(pZqnEQG63+{dH z_uTKhKX4y*f9O8q{?z@2`%CwC?xXHw9@Zmx+#a9D@9F31?-}5U@x*%KJn^0cPoigp zC*O0XXQXG8XS8RGXRN2dGtN`uIm=V(ndvF>lzVDC^F6hmkf+X5?>WbFu1E6_&q~iK z&()r5JgYs|de(T>dp3ABdNz4Bd$xGCdv&BbDq7P=RGfYUiTdI z9P+&3dDHW==NHefo}-@MJimMX@Er3pUgX7I*2{TCujF-j6|c+d_C|WUcu)04dwY4$ z@DBA3^JaRpyxHCyZ>~4bJKQ_Mo9`X%o$j6Co#Uh}99-M%)l_W5i7nH%DxUxGmz& zhR%SL&PTo8_zWg?x3s zbA3yE7x^ysUE;gSx5l^D*W_F0+vMBk+v&T@cen38-#*`d-vQstzE^y&`d;(B?mOr^ zS`#{RjL9{cri-^MB|+;{P-fN3xMzBp)e6ijh*JCDIxx zN7^FQNMB_4$R3fWMfQn|i;Ry2Y$&qD|<&o8q!N^eL`H@;A ziCh-BJaR?kRgo(r*F;_yc}wKl$aRt1BX>mJ7rDE*S9N`5B>cx(?-I3FR%%vydTMff zOhRHpVoY*oYD!FIUS>v2e0q9%d`5gyYGP_aiR#JE$(;BZ)ap_9bIyTT zN=_aSl@Om2zhpqvISCnw@%mNDk|pLar!kpK%w{H?$zTRDgP6h05atYKC^Jk`G*xqI zF3qiZG_Mw+`8LBKXEQlWE|bR$XGXx)nJ~_gT2QOeLRy`+0In8m14>jC+Eh3vxNuDA zf{NLt&|~9P^JQjj0Q&8ORK;}_l@)arfzZT?^13-jvi#~$4cKjhwJph-bLz>aO{fSg z%n8h_pFJBUPIZqCR0V4n53en)nbUIDY(sMm)1kWD@``Y|7PI>kndwZ-dS((cnVG^& zWu|Few60n=t-ID^Ju`zTVa{SonVH%tT8uV9o2X5v-HV!37Az0MLU|)A>SCMQ7TY|1 zC2F@nNusw8x?UKlgf0fkn=^xbYItq1zQ%X})~ry8+Wk)o$q$9<10k~mbD1C$vyPd^ zR5DdewHBrI)K1l+*D*EBe5RJE(Ryj8X?@@u8t%!fsH_Xr>e$O#JQ_Ly7BOhesM1hf zb4%#$5;dZ@dRB*t{YDvq^5Xoq<(Ta`n>mN^-+HUodp~m?b3UUnWQxIBs(}P289xJ| zX=4g=DggAs>eAZ9jgV^Tq%nnKb%ULO={D^t3<63Zp;^a8%q5J!fw@@g+rV6^olY4O zrGpOh><6ZIC9{lKUZQq^d85QvKuw9`12wgQ5U{0E+6t||)^Ds+aLqK$j0m$FUmdKU zTu~RO(t8T%1P)o3SymPZg#zV3ynz{^GRi&*f*}BLuzGqZJgxbVC$vNL3l4Wgms6tq z4oFPR7?PEjKYILx$%daCSxMRmG5YFJ=VO=&f?it0^I%6#le_JPq$M3sT6J+20C zM>XyD`6Exfu&iECR9E}DZgTe?9hFv0sWenP2H+IhAJy~J6EFF85lZgmTHjmlep;W7 ziY^>oS~DTL9(ZZh{?q&QKk<^UI}=KdNob0Vi|?ph7|7#?dTIeRE{Ey@)nx${?N3Th z0qNEr2OSOfboWfCEzPwq9s1Exb^8Yn8hqkyUwsTpJ0r7cXxy-l3Y%O|8>|b?te+K9 z@&4?b+!HUjhJ%8KCp3#xqF9nvwzCeX(wLVx@(}c8Kvt=3c8=wQNt${2I}fSyoXd_ ze_46p#0$P}3KTrMqG^uYy`yqfZvVW>suM46*-%Q$W30z6Jlt4Q+cQ7^;gN zR-@`y(ZiPQ(tk88fZ7)(tX~w@y$9v=E$|L=m+6!~ft+GP3oB;TflI^*?vGf|0Y-vb zV;%^Rvw@4RV%CG(Vh3{<^Az(cxG3IZjxZlHzafM?C>jkw2`ClZ3F7w&`sJRmYc;HN07RQ>`4H8Hxy%>r|Hd)+E z_Gp8kM}BRXR!IBgH5(42TnYlaTo>>qYH#y?W+kY!<%?-UtMh`jV*(2cO6x&M(EC@S zCP2Cor3(W2)u1PoR#q-H%gHV%HdI#H&^Z;A<+TArVwb2r%(C0+iZE;8%A+Acc6}}6 zs2f#UUtKn*&=~CTfmzUZkXNAG?bp|Qk14s zrZ)an=4Iv;U?mFk8uL1HkU0dOH<`DXx1n9;YH?JsOxMh2w1Bt(6eeh9vz|R3qz0&? z0pmX8tSYUjZb@DO3n!{wjh$td+44+dv~2i{)3USzn4e}%+W=vBkYjTf1+6Zl=Hd-5d0GQ(^(6>*S&zR4rwA5Lww?@m= z^0eWAorKh=5LG_QqK+Tm%$l0mUbHWLPX`rGSEIjXzJXN*%yI=VE zn9lmLy82q+lc#o;&RG4Gs69JN6kcckyDQZ&%S5N5I3{Kr$ogKWH#!aVL4DEbs2}PN zvOfmJYBRJF?JTWSo2iv)%S@ui%lD*PC0Ko1_%O!8V|Bz=~Y?-Tviu{hIlaE-nq5G&0L{10M#+qFdsE2itiEiXZfDX(6MY!UT1=Z}v^IPL zWLRAVwMDsF_dtih@!g`V4eqsvWx|prI{!f{#9LK-4yDY^h%h%SO(m!M0v zi-6y))K+O%Yu6A|Nzg)V6+u@Lw4CSz~B)P7k3V1@w-i_+SPP_SCp zVv1pa!y{pspbXtc39CH%GJSDnU`p$UQ8|HGrS+9{%?r@uEEa$aZ;L%kZ-S{!Mc33; zRDrp~e5^-BmA7T3pauc}!*%E#q2{(3qe~Z6R8^eathq#)#AlWjDAlV9iybPDqr$C* zwpP@DWs?p@fzg0brHh00b>_5Oi>{+US)*OtfUegrF@|tLQS<2OdW`|Ko0m}?6KX>1(0c7M?Q-pkCbSXQ%4Y3Kz}+&f_jJ&oTjcFDdevenRpF9O z(&*CJpoZ0#2PVS+7;TRpcG*>JsN{BZce|SIftq${E1;&UsKH6mhtDuV(xHnUR&}dh z#+0!&f$IEfu;GTN_|(nr=ppnl69ZPU0Y?8G162q;uB~qA+f(QT(70i-^bC3yJ%{$9 z=e29KHQIIB_1X>EjT_L5=q0odz7GJI+@#%1&`9kjg62_zX#*Rl(IcoG%+q1@({0=v z0d@=^Y`6*P^Yrkn0iR4r>OYl^{m6>ya@`=<9jL6nvYgUd0k{sv2j+vlu?{dz^&hZ0 znVotYy+=v-9rUhti?+5Ay^qqhTY;GaZMbOnGehAj!y2n5!5H1*-*Xl)QEF$Wj5s!=t4zlef)b)ZfGukw;9u3c8!fbhb%vR$x2{m`Fcix6hKU2X zAEV&@cmR%J4z?cO$y9v8j8)ZWw`+H3Oo=*`&hfywxH!sYLveG1p*i)XH5IiLb1LGf zr9SR>{kr`Py$5l+ty2GPwutER6er+B;FrKZ%!P!xIBCR5R3Yu?5!jt^3K%-lrcgVt zp{#3nYj>5Xx&M=fhV3=6i)fE(YJ+o)mJP&%rb4@@sz6skjd(D#wDpYx_zY;rQ05@c z!~>|?Z)RyIFcto<4OGI~V?h8GLHBC68-?ZITv)FGh8uB?-mRMYnUxh~hHWS&6s)f; z3xsJOkHAGBV{tw{6OY8B@MtjSjKu|b93GDgwcXkt?SAb6?LqA!?P2W^?NRM9?eVR+ zm#XUefkyuff&pz+-`jbSczp%!Upd%qljd+t)!{ z!aAq@Lts~uTCwa}*agF{i17pyD?)wiR8T?o#zQBbm>>ESBoNCU3cp47$~jATBnb8#&W(U10& z_O$*P3!yj}CLGSj=YmHDpQAn7fR|{`Q32T{Cs0{eYINFA1e%A<%ti2pjK2{t#TRIM zwdWi0MfhUv1?@$x_f*8_-4_#aH2L zU>$~6;#K%+ZNGLvd$|d(2B@vkUIA#mstYHbn}#PM6gwpttb#FXdy@)3$`!JL_0{Dt zq+Q!SE~u!k4wQ$Bh#nfYA{MAwX4h`TO|)wbxKTT(9ctCJ;#n{a$9JkkjnT_Dor=b& zncOC}ATYZ$R3B+5YC-{3NW()ol ze+CxuFYuT6EBrP727imc)4tTc(!SQd(Z1Eb)4tb!(0%{GvrSe8w#nMGU&3sYRe)`>DoUpx?N$1zIh^w{WO9)mfm9<$DV zY>dvA*a6x>g4jRL{;#s6iD6*3<1B0n`k6V%rlX_mKz0!NgCHxg7C@p%d5fDM*Kukv zdj>nyjr&vH zVlt5q_)05vHk^u`L750a%3p91wv2KSf}92$nfy1fk#L7v7zkTN83@$bk+-k?+*Ijv zQ-hAe429_2_>H;o!U6@R=+xt`$DYq>;G|nhkdL59 zg1QmZouD2qQ&VM(pFcc)VDAPef$m;yGePX->=ksJyAaeBEY)TjRruFt>pG*hQ~qkU zZZ>ACr!iYIPu6Ui&5mo|%~sQPvoUQw+fUI3^fSAO-3;Wj0eqgf5!6T9MNkq!y(sfLsh?qQB>VDDvjvG=jN**)z21f51uUxNA()SsXM1WdZ7 z6NBAg3|=2&@Vc3yE}7NUK_ha83huVEruz>FI-O<-hiRA-)=HY2x7t%2yU(E9n9fBx z`>N5jxWAg$H;j2rFy=LQvgVZvb0Y{PuG3LzHOX%nlbm2OfAzRq54LQ$#&;G#v$n<4@W?<&d zFa$k8nFQq#G@MHM5&uYfJ?Jks1PcAhS|D)(NP12rXlPi}b5;=boXj-Q4?)AUQTi7M zdw+PYITr_kw+$S~yQ~JzOHlTSiF+=R>jnaw>wcm1C&Z(0tJOw0BUfVZqvF5dN4VA6!knZzTnHEe zSHaEY=5du=6<5s#A#`OvS4+?&f+iC*g`lYfO(SSJK{E&{A?PfEO1E%z1|#4W845pl zE@cEWO-4}OqVmuAhY|b@jNo$02(BQg%wz=1JJk8jd0x$}p-kXff&vZPbp*{iK_+k$ zx0W)2n<*2R4NQQI#utIg-<}7U6|Lts8C1WKQhmjrtNFSS0pg-|7*Q^5=oKtZW%C-j zoz#jz9kJ~nQa4E0b5LSDZKH^AcXD?bL`p?iJwa7rBCR%f$8JzWxINtc5RvsD_Yn6m zLDd8W392DzK0$!}Pz$BrZBQ3asmmnQR#pV_*8iA#Uo*Z@kbKy_E3n%dvM z+uZ7=vusXjZ7IZp*N!i(o*e)i7ud`pz)6pN$*l&voo=#Ijl9%G*Ib-gOY57*7Z)tk zK7(y`Aa53^vc|Z>!57DjY5$D-oW@>FC@Kmpg1{DIn}%uIZsNY+zNAzCX9+sCdz%RS zn)?Cb(z$QAZ@KTd?+IE&&|-qlCg_}X+>abM9=Kl!I+q}#!JJ>N4VW}4Fe~gt)t&yP zPqo=MImIv{Qp4%w@fEY@=!wI%@eI#HZ9L*J&+;5WO9(oTpz{gR)&YZT!WV%ZgfiwA z3@+Gp0(fU>1OT`P0}H9GFEqY%p&q6Nw!SWHpN50F3(JDkmmk&Up`JZhTbC06YePj1 z_}3tRM4Kdf>D2vXwpHa_;0NWM;B0Q-K_9rF6Hh4b15YUL=OYQa5M0vD{zASRA9cKk zlJCj%=c5U_Nb?hPvDUkJM5BjYbgQlwm@Vkb4``P;1~SJH@OeY#%e3AtLkzh$waJ~# zr_%PP5OhTYII2eJ%?E#cC|DWD(>D#!IXb`(;s=A%ZanilKLi$|V+xyn#)csmaNg>k zKK2AH(}Bqk<%fZjqB%n&p9yY_RyTl{3^bHb)D#7EJnZLl7=_Q}^QfPr9DIIbo&3(W z0sVq_+W+*tkatu?vOtW!-9cmS-5zfQgv)p7+O2z!Qy{uMx>xV%V+vbsHi9-3Rn%1i zV4Se=$9Q0D|Dmh^Mx!`iw;l)ULwe8%Y{jBJTN)-Xfj-R7(Z?sRqLyw|2-O53&Z`!N zAe-*eGJKnAbHT<~gy3;u9mElgE)C5Cw`lWY$PX_4;el#!e9&k%AY8La&9M{tIYtYH z*Vg3cz+MdMqAgzpaZ^Uq4W^?Z*cK*eehK!6F&d|dPEAo+jn{lC>>6Wdj@+R}_UQ{D z`2%8NGlmY!96oZ?=%QlS^Dv`iW|^@M4MHUJO-cHmq$s)}iT+B7>hNYUbYWn6Q0)U} zuLPJ7Gl!{z?KmO$u3*ZTDAIhqq^`y)xnxvyyY;(_%8Sl3;gQW*+QqOU_A+$e|199;Qi7Dw6dh;D=x8qvOmgc6H0I0(aNI|o&iLj;aPai?k|6PYw7pP36M4QUW(zKOXL0+yeL2-?q?pCSCPA4-9jgODJp}Le`cc!2-3eCPWyQPJqD-roDN>wIXDRC?JR|JcCLg| zcCLbO{MC33oV9Z+-UFxU?8h(TS0NPN$|`IZHX6>yNdXgWE*N0*Atb*RtbLcVTiEBo zgz*WOFTUXHaB58=m&xUDqq(u%I0(eAg!5@G=hncvG@Erv0&xz;|3IB>{%}tdbd@0j zM)3K-QO!Vg;O0&I2>wiFDR4&`&tZzPQTznhzQ~W}$M9qM0)8Ano-gE!_+o-q5p*>{ z5Vy6OAW*p15Of_u*AsLD>|^97@ss%}{8WA#Kb@b!mr$X1BjN8L{N03qlJM^m{yoAU zCj5s~xOuW5zGq%d5O!&W^qrdE*@e(SaB%7oT884QyJtfX{0;u|&@^L1XJOf#0FCwY z7?%+H2YLc1hG8xoPdDDtP_fDY6xb5zWn{|&Pkp(bv7&A<#Grtd0qVA?r5V_#%8K!e z#Q-(PBqmgDrqoxPVTt+in4j5g28!4`(us& z{-Truy4}xAIk2<(!hY5lV-&a+O)AcW^85Nvuj_1E>Nhwi>bk?kvCbYyA zhMQ`3E2Xpi&7;7X1KG~elz@rbazq{;9UgmBIqfCfUP}4Z#+vOA5R;kgPLw&2+u_G zJy0oTRm`q8G&OUYdNn^b?wDjvmmhR#p=-*3&*PG1mX~MM*VTb)9^NPt4ygcQGD|S$ z%v|*WM~P`JrK9%c1?tM?=;fG=OX)Pd0p3wSg0!(M3KImib(&AFCmecc*3{Cnw!<(2 zb~u&7xqc9C+-5uyI;|lWBC+ch(-zUNMx#U%2KVy27(HIoys?LW5DY5({rm$2-A&Lv zjr>FWLj>Im|ELW|DJ?HI$}lPdLbejkN1lUVK#Gw1M@h|hwK!h8_ zx$)2P&+&Wt=jooNoYBVAfSyj!{RHhHXg5Jm{)fmSI`gqzui4Ic?E?sBa~N1FJz`FB9l zqDKjOj6gJO??TX=i|97-$z|p$XA(?}en7ws8k|RknlZ{C8Aj_QWGD-t@Sh$xc8&aJ z%+llT8EL=ZzXV;2j7b#&=IH#y z|J?S*QU15KH;xIIiD?uV0m9OsBWQ14DpJvs9og+|d zQqzfM%c&@x4d-XHArQeLIKbc{SOrjXtm1=veZ(0+nGCJ5|2 zztU!A{7FNaZ)es)eD2Kpx5jfqPikkM>`!}a+ zlig6uTIvb2(P15@ZW&0OH_`AfoxI`risRZFo>?JM=tk$Qi_n#z0|dR?D0CNk5cCQ` zuh9W%VP`ERwKS%g4Ky?DmR@v}UT=eLkD`%>`-N!Og7&-63zi+aWicB9+3E;-RVM=B zG@%cy_w|y&Kiw$wWtO(OHrwA%h=;9`LVsa^5F^A2U>?+d@ov?kRBm_DFM3#eW@wdI1Q&9_A1h6`IC=8+86x#A|cpHq62{(i+g5J@_7f#MC)LD{{M{f=%=sj&b#8;Lq zDlY@w8qOJ^8(e4*ELb-JwH0NCdK4IFWP;5#jlw7a+*KbCbXXfdEwd=98KD#5f(l+E z>3Ev7P$(kk2tgldd9%e_H)CM|H9=tsN?6=&1OlnJEaR!fZP9Glept+!*># z3Hpqn&&{EqBUA`;g?U0HL0=H`B|%>i^bJ8jP+*;`p*MP0d;AzLXc=Q8#o6@6IRt(E zuZ-{c%>E`p6Ns>spl=EKj-c;pc4d4~RBK|M0oScoO;g|!LUbX}J3RK6(qb+XE*GvK z=tqKnBIsv*0@9l&AR)EoXIl7Y^EO0tQdSA8+f52A8G%%fwoJ+m0&I(3FWe~HB;0IF z%5MbyPH5bWK@SZ=qtGO*6V?-Sj9`XfL@-ORaPlW*>+zGaIrlis+CVEnI4$}WoJ z`-I&Da|H7=rz@`@sx7};JPmGv@v^)EycFSCc!=hESa^hBkzffXAThp~0+JFF!=r8v z_LIU>Z3LX~tN^=TnuO zUVuY};G~yY08QM&g$v_mmDX0pR?XD!wpxJ*Msx;tl&F*bs>GJ{g|Sn*{f+`KUg^>6 zp+BweU84hFv^oj#r7hJ##5oO~E~$b;9n4M|YMAhWaD-y~u<#+lE`r_Q6%;;(SODyy z`26!F!E|%6PyliBVaEFfXnDHv-&FF1Zv@b5jw}5~T6#oy*OTx|yF9;(%<*|dO!L47 z0G+jn{PB52i)e#9qE!T#bRoD~qi7c$1ot4gcN>I=ZexJEo|FMTe#T>U#k5j4xP)4v zNc0=E!f79){(Tftg*O&FVIgx9o!C`81t>-ACUzI0$EOe+MQ~5>Z;3s{Q|Z8+O0a&` z6Foklq+nEjVNpqLPJYqY@g;@1qjIy0^2d%T8JRoTIA5S`g4{_3nV=Jx38LDSFd@G% zKWkL(cqoRJVN6h8=BWnpbb_O`p~j5?`ZiI}jawN>lhRXRKXp88Tn)1TF7|QEU@E{7y|Fw<`0i=m%5Zq523tTTdFADcG+~$GqWmgqX)!iC=LBGZWLOBosi%Mx6eoz&#OaWO z;6#FxwDIG>sH_$j(LzD3gng-1p`xJCjG46bGJ;c#((@rU5qA3McF986@eD4c>WW!l zt29#22JTKvH_8sHT4E)$f1O@uP^>X)O(!^m78zkwTU0u`5Ds&LBS?(0fy;#V6j9os zOT8HIJRAFrjjHO+js%;F)JLi{m{I{usfn$?bgpj3tTK|mkfmp^)>J_|!D!Jb+V3@>b&Ycax&3O|S~ zq#G4ZGx&TA?a&Y!<7tj#D717iz; z(2ZNIQWfTm3^gZ6NQq614VBM}Gc1#Fqbg>C*<*2>?mk&ak6SeRFpHjdNbkgrfWsZ= zuDEcoV&|NuZ?A}HP7y=5r-g=ev?t9hzopT-VGo*D3raIR0j;!^;43jiVN6+B<@~u- ziz{l&7X)UPm(|o%)znv%SC^H8RXR>zal~cS!%-)3u!t##BM(AQ9z2SvsG-9U48;{d z)Cr7xORst-#{b`GUU>ZG=;Qi-Zt%jb1CR_c$CIKad>g`2W(Vqqfc}%390Rzl48&9f zLy#c;G&q5)5<*cbszXD{f>p8l!`Sk=*yj6&Q8(=JXf5!rFlcI6i4$Mcj;0F7jjE^% zB%L@hQIh%xoc~kW`3IbE3W2F&EElf_PnNhsyh>att`e^nuMt;^*NSVz>j=&wIGf-c zf^!MZBX~H$BM8nX7-ad#E#eJ~zEM@YMO+I}VSU9$2&%-R!arJTQlm8(4q3~8uv(^{I{d%CK zxDNs?@uW_2n>k(=KcKKYC>|2u5Z@Hv65kfz5#JTx6W=Fz3c*te20aVZxETbO5PTNF zr3B9;xNHkv6Ncr-VOV|+L2a*^s4Qt|G2%tvgzJ_Zl2eD7q*9p8>#Phji%)`; z;zr3YMM_(la>S;MsiwuLQHy2W_(O; zYI0U`UUqJ3dR{^+-9d^s3aV*WP+D?&W_&_YQcPk>Rzgg2MpjZxR$dBRrl+K&B`4

$Z&Pd8kPfblsY2BisMnMbO6_lHum75t4 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 J3>`e=e*n6&!Il63 delta 25388 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

r$IgOl7&LC$3P7gM9@%0?sbwdKHcvD zy^Y+V1O1~2`hkdImk9cycH|!8e&l}gFjQdj0C|vv()a}+j{)*TJ7LdwBk~M+UWfmj zi2vz7T8aux{zSrIXcu{vyhdIpZ;&_1TjXu>4tbY^J%0v}=Ky&Dke2{?1(4SOc>|E& z0rD0g@4CqQJD+qlz_AVR03xYl#=QLP$@u> z|GLD!Cf%bH%20BDktW(Y#NuD>kus$$x*4L(Aw#HaG1Z4s!u!CxiB2$&vZFj8MU*|| zK=r2_DJROAa-m!)H_9ELI6w)2k^rRuN&}PuC<{;ypgcf@E=r}Nh#Ek|P`(leY9OQt zmG@AD_7UR*YA8}<1Sv|C4h@G4QNsbM=w)amWQdBCED<+=Dm8HI0C$j|bG`f|P)Q;` z@E(0Tsbqlm(bTS^?A=pf&)t1*jcB?N?Jx zJ-9XGW2%Lk2$8pm$Q^o-!($YnkUlRFymzlz45Q|V1k43!|6T&-i3H4-JQg>AI%-0@ zcaVV5y#y?x7K;RQ0@S&af+V?g6JS8Cpt?i_St%-rtEeEWkv4$3X$Aj2<_2hQ>-E$R z&~T^?)JE!ifO-H_1yE0DI9b+0Zf~7k)LtD|dql1Vh+M4}sdN+7!;(5oofFmL2z8V? zMjfY4P$#KV)M@Grbrzt$0QJ)@oNnOMMV;^Ahncn!F(>z89`zUI^llF^h*m++v?oAQ zdO*_yAZW>B=vU#U35A+3ZoN}zI*=A;eRL2&M|aX803D+fJw22bXMOZAQS_-$^mMo= z`ZQ7W)>uXlS#%T~t3w?lqRtRehl`}7bz421OlOOzQ|M9jXnG8tN~h83bOxPCX8{!c z&jx4?Kyv|_2hgzq9S6|y0L=$zK^L9VgL)i2p3avz(1jxE!d}!R0IdXQm8kgD-LQwz z^&)I&S4F+BCqUSAv*fY30kl}udbop#| zbQm8O)3ZglSn+?lMR}2R2%&R@f_3kW=h0v3Sou<9r3N}fdUm%ntPp9*r90_0A}x#Q zCG=8y8NHldL9e7&(OvXvfYt%D9-t6NBS4z~Isu@~096B215nUKf7?UL`W|KYL8PUn zmzLJQlwnFYD@uBw$jW|zPV8mnPSiUPkP3VgCo;1B7SBC<#HFZ5&j3H>Yml>Uu=Mn9)t z0CYM)X8?32KxY9I((xHUKL@B5pmP8^w~Kz&gX}H+j(!gX{y{|cMK7{>0R0-E-H~v? z#@iiWCXBh*`xeGb zwBfHhI+apm?bay@fw5;CyKyo7MO+JYB``IX%eXWC5EA3Ts2ESii}7X#Fg}bgLkucn^g*t2_sCtx*$zZZXteF5^*U3POTHlS; zh#AXtN2eBMyohxJloV4aN@}Ba=X_hka;8d$w^GEr=^v#~Lra(jrX9vErjco4CNRy6 zn$Zx$m=rsecL8)aK=-U>CiNhnhMO}p#1S1c zTg1M%7yEvgvjXUm?hze&LMPA#BK(B_-Pa3$akr{6tC-ayzAk_s=w#La^k6r>2xc9# zQ76j{BECZ+f*(YDhyOcvvGD69Ya6o@hAL(|^CPnZphp3E44}v1EH2;h5OY*V$Ptl{ zlYif?+hm#3%vDhf&M;@0bIf_>0&|hM#9U^sFh2qGG(e#VodxJQfSw2F1%O@z=p}$& z2I!S8=2{OIw{#}U{46r@Q!f*6G~5%jZtG}xA=2;?pjUfoc%!4?BlAh5;ZJ~G?_?za zz0plWG>fr#Hw~y8nA|} z5o^qvu%@gTYtCA*mH_=3p!WcJAD|Ba`VgRx0Qw6+9|QCWK!5FGt#x2odm;ugmN>9Z zBG{+BU}4N{*FXaR=xd#SV*Mam78=rTJ!sj$ZnW%BHWZ>|hXM3?CmROP7u{$L*a$WX zcAOn4`lpxBKe5rGe|pvJpLVVyjo3ssMTaa|MD|8R7A?~8s@p%Y>1@7;EQ8Htv)F7l zhs|a4*s<(576zWT0DTA0_W=C^pdSDV2j7tFPXLnuOxnd3^dKuCV%Rc>tO6p#kRD_h zE)GL68bZUEZfGM}jR*|@4DE&13eA~qW82|28DJQ|WZio`O|)D(UEl@tUg^waVLqXg zodqzWll=@}WHlP_l1u-^hq2{4;~Wz*OV-5DVaE**&pvA^?B z>}FkoLYFG?*DgJ8qCI(v%VW2(2SmEJvp=#s*q!Vyb~n3+-OKJ{_XDgC!1@BLAHehh zW&kilfEfYI7+@vpNcVMsnfKCt zOVlJ+_5u4)Vz6kD##Tt{rQ`|wn~svFA|=-U8=l$MoJ8#P8}@hhE&Gmr&;G%FU_Y{d zvQQap0cHm-o3vk^O}f*s`S#qk5?spZcb2XoGxJM?0D$2eEc4X&~P%o|`n zOE?cs#d!kE4`BWP3;dVtIA5KJ24o1!pzK5uRWn?m?xJso;0rH`OEJ7Q;ew#%LbxIS zyAZ<-gJy&c)Hruf137V)1&5P=4grUPuG7F;r-xY^<67jswO5*e1S`Bvkcqpj5@1yTs|HvNz@SRi0j$1@`^fz%agsQ2fAR>A@)$1@ zJwXG&8et|IdaXu)H34h_z?uQ3hL>zdRds`j9~zM%^wAv;)vmpIQtg*pQit>=NFEcjesxHU(fa0rr_DuJ@KIegO1IyeIF)LvJ({VAB9LeF^=J z_vOvS!8V zGJc55$zc!e^$X}DVEaNZnm-#FFPyAJYZ2{O; zfNcZVc7Xl3jK9v`;BWG`_}c*60kA^=y9coQ0DB_ptA)1nfxb4<(m}i9L8LqXh<_@Y z&M*99{t5ppz;*&`7rQD$ksdT6EK-}BIybn>u+ z`#brM06U;P_0U33kV<9aoz%Zl4g@#3HogWS4*XnUf zLsJVI2WJm&zrexT6Mcf2#H9SZ+DZXC%L{Vtp1yYS!%+h*;wB1`vpCVmU`gM8`dSa~ zKH7JEl)|XEyvow*ik!SkLGP@Qv58onJu=U7$^B?p*-X)CE>^|PT3T6)MS^%IvJ4j4 zDwf*OjJ;SAb8o$c@F^jD3H!?1>n`%+h$aT9AWiBT{(R0`->m8X|jixclt?h0!S z@LlXfi*+F2vjhDD#8O@?b$bX)g9a@L?iV5!Yv=vi7acNmm{=ZsWS)hcqm3uD%lUl| z)e4KlM=Tyb{I9i%#StT|Ln;<^=U%KsW@L6BbVkA3MaM0R=?6Q#USD6Wgq;?7iY(2o zF3NMQtj!-=B_I+)B9|CTTqS{$2+3$kh9p-~BB_wHOXf=!!m0Xl$yUi>$r-r(aanRr z@=S_KSt&2=Bej2ULb~ zsDSoGjZrsrST`gIBGvts#P|H|`Gbb__+CLzV4*XFt9S%_pMw%;fdSZIfE|H@Td0i3 z0CpT;CzeYb1Rl=CodkuXQ;b0;;ph#T&Cgo)`BGoOM1XU?WrC?-CYTErf+fIC0qiuu z&H(Hzz|Jibtf5Ui33h@#z|O;n1zTPQ*j?=}&rP&*O_ui&+$4vV2=0Q1paK~5-4_9N zNxSYvUu~AD|3LV1kKhZvn*hhAS2S@KCFdm| zCl+8o0qjnO;GzBG&`(=sX5l0Zh0`Ztm=G$232>Np4PZ9_b`xN?M34JW@(4a50%ka& zBfPFXX66jXJ>3^2uOzP}Pc*|dBQ%gMT|IZm0<3od;{WSfitgHN?Id$2QmOu=`=?E? zut9rWz=T&2eU^|1Lza*&iMjnJ_`(vPLKuDuha*N~jiUgj%6as23W9Mga~6pf7m}u-^do3}DXz_5xrp0rm=D zuL1T3V7~+G?HZ{{P)k)(xFRBM5+^BK4}sUFXo>*#PE!PbiQSulrbIjf*n5rhM%in9 zDI(0%n!V9C^YieSFrim#z7`h1!KCmFz&>;e3jy{~n{4fb2urk@H+>mlg#gE%ox(~W zlW05NILn2#!g?6bgztoPK!yMrs=aAF(p1=1SeyM*1s9$~Mr zPkVg7nKzK}tEH19OQafTE|Z0$!ZG2va6&jK1wc9-O5iii=Ri6W$OIr;2xO~)Y(0=| z*!bn|o>H}NT~wJHKqmidm?7L29zs=@9+n=F9+e)G9+#fbe4**k%+t)*e5v_rx$sE% zMR+VclAeR{N2UNWC6KAb1F4uhb{2Y9G=&$!YZ1*$;T4ee0kXb}g*R}FAnOO2gFau8 zkd-gay>aN{XE4e zv}yfqwVoj^q};Vzvt^drXm@ip{~6*Ufpf}58aSEnQ3Sb1AHJ7dSTBAB~m{9tEcg^3g!%)-&ss!`18mGgaT)!Cd)R7&_&7K<3dY9|vTr z?u3Yuyii^u&XZf@#W43J^MuJBdbXJC=}xnI%B$qH-P34!4V*^H#8=aLivN=uOBMqc zj1<~vx4!w3D{>(H1HP-c3BD$9N3#VwC7G}0I&@1<{v)(W^2vV-Ed^MX-0M{ zj(nylwOR7n^3UX-%e6o@5Xk(2EC9#?fhQCLYV5{0$`q$fA3o`1JA%v!%=A zFXgY~ujOy#zXMqeki`L6Jdh;-S<>H7?&$g++d*^EFj9f*kR^7c2~sms!RShpMP#Hx z-i=H)N?SOf3Z8WjhT&Pcr+Y^-FO{nm#?rS6Q-zuI4~4P9QUNVBQ?%_uAWIWPk_lu5 zK-T;(910tS?cX@Y16lgNMWS$$++VJ6R=6l!6>bW5g$Iyj09h80Wdm6bkmUl|*uSul z3S(V&GdrH~(p*w8Oa~^f2h0dv={OyjXdRgRjx~Z5I4PoaX!3guOOc|;ftIfrr5LRk zqexYxDbf`gicCe8B3tWl*1|DYXWokO=xg+i#6eLcns-gFdDj7HD3FGUmfo~+&}q0P z(*O-y(FkOLIc3}g-6M$9RuE5y|{g}B-#YwRdiN^Jzi zT!onFL^>56qUBByS7Ty~6$@cFP%Hv64V)BVo)TWM1SY;@Fpd<6c3Y@esaOStvbxu9 zfovL(wTLoV@L$VSe5Y9Vw@9V}*~I@5$tI{-ip`2Gimi%mitRww3S@0S275mV$R>AN zuHvMQ>M5e-7WGnkNpVM{^s?fL;wQyb#Wlrs#SO(x#Vy5cAe#RyIDXs8^}Hb zvd@7GdWAVaHn&T0w}{uEz!V?;*2VfNX(iX~NR_PUNWX%f@*i)9_f_^$!sRq54rM=49N+v^ ztgjY^R99A&7DLw=U6WT)lvV#Py;qtk&3j1h1hOt5ThvRkSGRjq+Dh)PP}(W&l@7}O zN=K!W5{4C669&MgK(-9XmIK)eAY1vD@+(#=-No>>0LT_=!UTQoyWnx8GF&HzRZtEF zS`eb2Aby}C`6&5_-DjstuCPmYiLz zOi_*kvTuRxyT3*q%2Z`$N34OgkGV2OGaU|nWotFI)*e#R*0D8GRClyiY> zd&eb1sg*+cl~PPND!&G@9i2)@-%jnd!NxJl#UkJ(O33yuAlvgd;1x=^=(a?UNU$4a>s4)nxId&Np~y6Z@~vp32e zve0O`-XELS7)kS`>6Y*{S%lQ!8cajUHM}6v$TSuT37S3PJHg7)$=Su#&E3P-FE}DL zE08ml+m}tz;jf_-9MaOhxm`XiljE2>~ub;xa ztq1xiB&J8j$LCb!<&})gsxPgsTAUChR!&Zd(Fhv3hU=irq}~j?l9nE$QEK|YD-rMt zk&~;+8*4jmymoh3rc56W*7|8Z!5OUv)h0%uj!FK!GXp*9(o53oh$}J#DL`7_qt43W_?R>sTZGDq1E z*+^NGEJhY5E0fKXX=RIKOJo~#D*o3zU9CIs-OH{6>1>#BFqBwHoFyKTfs$ZJtRzX2 zDoKa0Nj#%J!p{Z;MxQZbEEp^Jxu6r{0$)1tRKr&dQkhEl<=+Zs6a3h38(g#A$?RtK z!cYFr!3F3`aPj#XbA!3X++luZUcyiL(%8u?TsdQJb5i(qoh4_@*>d*qi#jLHg>!?e zL!MkH7tW1YGE3>U{Ga7kPWHyVCbr-2{Ot>Cu9kK=B@ocAYQ0zZIL8^HXq32z3| z!B#Nq>jpn{^MsjJAKs5oQ)@2{`YAETeGKTZFc z{yPKs{C)=32JQwb122OC2EGOZ4FU{?8$=jH8blk!8pInU8YCN37)&=qfDc5M#V-oM)gLGMiY#_Fj{4_#YlbH=&sQxW2rG}EHlQ9Nn_eL*f`uc z);Qic(Ky+7l<^qj@y3Q)i^DMr!*kEzq;vaYtSv97ZQ)~(j<)|0L0 zS}(RB$ zVr=4Ul5IxWjIl|xsjz9YnQ1fM<|~_TY!=xpu~}}j(&mWGJzLV&*w)WB(sq<>t!=$+ zqwNG+wJornXxnBx$##+LV%w#*%WYTMcG<46y$+c&mvZQt8|u>I4Hwqxyh zJGq^?+RoX|)y~~cW#?-*%r4AsxLt%@tX;fard_sOuH9I>db@VJ$#zrirrRyD`_^u& z-9Ebmc8Bba*xTE?+lSgm*k{=n*jL-v+Sl9fu|H~m(f+Fa1N&F@9~=k=%7Jm<9P}Mb z9jqLD9fmoiI;1;fI%GTKI*fG~?@-`SbTc&pW^|?!;WVh zZ#dp_eBk&Ydb1 zGo5xi?Q=Trbl2&j(MXoew)7b-v_$#rdl9b?0Z! zADutBNL^4DeHR-SI~NBRN0;d?^Ig7j`Nn0T%NmzGF8f>#xEyjh;&RO8gv%+HGcM;` zF1Y;S^2Ft-%QKf3F0WjEcX{vf!R3>y)D?BLa1D0Nacy&5<$B8XrJKUd!!61!*=@92 zs$06-IJYvl3b!h?Ta8#P0Mb)O7q?)4oM%AVIR<%yG zLA71ALv>VjT&+5(I<2~{x~aOYx~qDodZ~J?`rVWEH1IU`H1#z1Z1w!iQ|md`bDrl` z&mTQ^dhYSu?|IPki05(7Q=Sh!AA3IaeCGMW^Offt&re>A7w@I;>g#3TW$b0w(tR?0a(wc9#;JYseQJE_eVTmKJ}o}2KAk>meKz`R^4a3E!)Le8UZ4Fw=X@^u z-1NEa^VH|1&ugEzJ|BHP`69lUuhMsj??~Th-#Fg{-!$Jk-$vhN--W)NzDsyg` z?Yq`@o$p59TkE&p?|Z+^ ze%t(Z`0e)F=XcQWs^1O2TYh)^e)fCd_lw`Je!uy>@O$O=W}tGQYGBg9x`AI0+&l2T zzs%ppe~|wO|49EB|2Y3K{<&)ZvHs)z3;c`xOZ*%CoBe@*tN$ebDgMj-H~Me!-{!x= zf3N?3|AYRA{V)0d?ElFBvHw&5m;SH)fA@bEKm^DG`UkiMga)Jplm}D=)CSZCGzLrv zPzOv7m>V!J;H!WI0i6L$16BmA3fL5|HDG(dj)0>9#{*6VoDR4ia5La`z}*1#vw#-? zuL9l#qJgqNJdh0R7ibu09B3No5jZ-qJg`0R%fN2~cL!bwd=&UN@YlfK0$&8a3Vajz zDToNN3hEy;BxqF7*r3v&ilFMCx}e6O)}Tp2Q-h`l%?kP~=*yrDK|6vD1)UGN9&{_{ zZqWUpM?o)wUIo1gdK>gU=tHnkuut%4b#P^{CU|0Sd+?Ot>A^FD7YDBnUKhMEcvJ9} z-~++OgHHyZ4n7-vCHPwKjo{nCcY~hp^rkJg#H%#BJ_3W+t5G4xG*718P+e%Fw7*(Jj^Q0Hq0T+F>Fv+dRSptOV|%# zhr)gidlN1XHw*U+9}w;r9uOWJJ~(_>czAe3cvN_7_}K9L@S^b2@QU#2@VfBE@aAw3 z-WuK>zApTD_?zLL!_$V(7=B`eY=rxWf)Taq5e*|IjL?jjIHGOD=OgBf_+rHT2qD5W z!ac$>VnBpnL_kDv#Ndcw5#bRL5$O?G5jhcKBl07PB1$7FBB~;4BkCj8M4XHGIMQ(B z@R4BT#*ud;^&@Q}Z6oa>9U{FW2Sx@)hC~jF43CV6jEu~Ptc+}mR7bW%wnom4TpGC| zvMW;kZRENr`zZG)zo@9F*r_=*`jFqIX2^jXn^4IQnReG{!e(SWHw*Y)pbWCOKwwOis+$nEaTcn9`W?m~UgA z#2Uq>#TLYt##Y2u$2P=Hh}Fcl#BPYa75gamP3*fkB#w7+>N-~ad+b$#66398TTgc zZM;dmZM@ns-X-2WUKJl49~K`IpBSGKKPEmcetdjoye7UaescV@_}TH=_%Gt;#V?Cr z7r!xnQ~cKWALDn$AB{f|e>(nL{Kfby@mJ%YCC~}B39bnq30?^U5`q&3Ck#snONdE` zPe@8gNoY!FOPHQ8E8+8mxd|N!s}i;(>`OSFa4z9u!WDJGwS*f9j}l%bd`ct|`z9JC znkHH#+9o?LrQbtliQgu>G z(!`|Jr1m6jlKP9J`AJ_VEllc6TAQ>kX+zQvNiUNn$+Bc3nNAjx70G>*^^-l52PKb4 zj!ceDj!jNa&PvWr9+zB@T$Eg&+?YHeS(AJx`M2aZ$?uXsB!5cLOCeI|6fQ+b@kohF zsZME50V%C1?J2WTW~Y3f(v`9~Wn0RQl-()&QVyh?O*yYlxtMY#)iBjA)ju^Tbx`Wi z)UebMsgbEMsqv{vsiRU$Qp-~-Q>#;JQyWqzq^eUvYHMnH>g3dAsryqOrcr6GX$fg{ zX&q^s($1w_OS_qNC++97U(?>Cy-WL$_9-1n$I|uEiS)kd2IX6csc*6AVXk?C>i z3F*n{sp;wI>a6sf^osQA^yc(w>9f;6PoJCqW%}3Y3)4H(*QM`BKbn3b{dD@d^o!|N z(yygIN`I36Tl$Oi*XeK5|49FsL1i!*T!uU&G$TGEF(Wx+bjGZVuQL{8EXr7taXI5& z#)FJU8Ba1TGhH*?GgX=1nFX1(ne~~Cna!CSGk0h1%RHEQM4fpo^F-#O%r}|uGCyQ~ z%93WGSwfaFt6!F3mT{J8mSdJnmV1_GmUos<*3hi5tPxp}Sut60StVJuSq)hevea2~ zvQ}iR&-y-VQ`Y9JZCN|Aj%FRtI+b-f>v`7OYfaW7EcF zjLjZ?uW@f-4O@;&lB^S$$Z^E>jF<}c4*nZLS#EifuDDKIOrENCv6RxqPrR>9{5FAF7w z`h`Y?riB)T)`fP3{R^E7-3ryJLhnM~!sx=d!i2)4!j!@>h3SP^g}H@e3-b#L3yTY< z7OpBhQTSVtvdFI}w`g+FilT!>cZ;4B{Z{m%=vC3jV!dLrm?`Fq6~%puEsJf6?Ta0Y zU5ed`M;4DNPA|?Z&M6*WTu@wGTw2^*42q`~cN8xu?krwfyrOt*@w(y->f-N`D>0jbhGO#49B)uf7B)4Q-NkK_*Nm)r{Nli(8NmGfs>p@DP3K9s`P0YTjp5iSvH`| zugt$}Xjx=gbXiT`ap>_Dk8XWzWi9mc1|gQ1)lJq#P-?C=V`AC{HTSDIZ^6P+nYKQC?ME zTV7v2xqNPUSNXT)>&iElZz|tf{$u&B^1bB;$`6-cFTYiOr~K#g`{j?ypOpVr{#;%D zs{Bp)+lsywUKJ@74HXM2_E$Wt#4GJ8hg6QNjINBUOsGt&99ucQvY@i4vZS)Cazdr1 za$;qB<&?^4l`AWMsN7chW96>O{gnqRk5nG3{HgMK<^9Tsm9Hz`SAMAcRE1UPRgqP6 zl~I*_RX|m6)!?dORpC_;RZ&&3RS8weRqD}IrBxMGRaG@rbyba3%~hJJma4X@NmWy- zmRB99dQ?qUyHzJv*H_Q0-dugY`g--P>buqVs-IT>Uj456kLr)rpK7EvT#dY@PmO+! zQH@EBUrlIDL``H(Oif}w9mniDmr z)ivj8F4kPBxmI(t=1$GMnuj%yYo6B1YKdB^mZ{}x<+Xik^=l1ljcd(nEo!Z5gKN`k zTWXiq9a=>>bBSIsM}Syr*2=}fx5GG7wRt8U9G!O zcdPDWJyp-w%j^5p8`c}wo7G#?yVa}egX`6y^~38&)<@ST)u+^tu1~E`udl5CynbE% zj{3dz`|A(YAFn@If2RIi{hj*X8n6bufofnIga&0pzXrnwlLqq!s|KHjfeir-K@A}d zLmEOGhBrhsL^Z@T#5I&Q%xu`uaK7PfqgmtN#;it7<2Q}V8&@^1XHDV5P1~AwH0^HM*L1MyYSWFTTTOSG zer|fu^h?vPO}{n0XnNK3W`c5pYC_V4x(Q!T*gHXezggC7(>$noL~~?wOmkfGnC9H( zan1S7Ma?D6Wz7}M>gJZ_w&uyr)0$^AcQtQr{;_#y^Pc8|&4-(hHJ@m{)_k-1cJtHb zm(8!6-!^}2{-j3Km|Cf}Q2VF{ssq&_>LKb-^>Fn_b+kH8ov2Pxm#Qn&Rq7gbow`xo ztOjaztGZo1MLkVDL*1o5qW%?T!96vjG_9JInnN1+0SaIM4-}veFa>s?KX3xBz#XW7 z7Z?PFf-o=wM1p8g1nNOE0AM1R45on@U=~;aI>B1-1K0w#gPq_2I0TM>W8eh1(;{s# zZ?SA~ZSidJZt-nV2et&a3~m|P65o>9Qr%M5(%9160$N&ICbdj$nb9)4MccBnWp&H9 zE#I}QZ~4AubIaD2?JYZ7cDL+px!LmPM5~EICyt*ubK-`HXC^*tWn25T8n&9Wnzh=u zy0?0^4rujj4QLH&4QY*RjcJW-5%Ht#ewxP`A!+{i?OA_1o5M zt-D(HwC-;`(t51*Wb5hHo2^gUq-|Im-bS^tZ9CRIfFTyxq!KdxsF=m39Vy2l{=F{SK#UqQC7Z(;Qi^IkBKy#o6FaY=o$ODD~ zKLfu4(}9`590o8CSO6>n)&T2)O~9YPc3>v}0AfG}lmX>{8qfj;;4I(*yg&pX02;Ug zTmx;646|6s4Ygp@9 z8(EuKTUpy#J6Qlr%ZjlcvA<@IVXtBrvKdl#72C%SvN3jqonrsZzQVr7zQL|z*R!9n zpR-@F-?HDcKZ0Gr0pMV8C^#G(1C9eHfRn)a;39AhxDnh8ZUuLNd%*o*K6n!3fof0- z8o+a)8MJ{_;3d!v`oJKV122PD!Rz2nupYb%Hh>Sn$KVt2SxH+)NnXj4l7l61iMQky zrx~XwXCh|?XEtXZX94GT&U(%!&KAx#&JNBl&Jj)#=NRWC=M1NqqvlvRRh)|)7st;D zaxhMWLvwC$>Nt-%&p9tSZ#W;gO}NduEw~-HJ-MT}W4YtGleoWdr*UU;=Wyq97jc(z zw{drJcXRi08T+{hxdq%K+@o9u_c-??x18(c-r}|34d5-{9pLeKW?q6v^Zw>t+<-O;9gqlLlp|((as3Y_p)CKAWje}-F^PmOLVrV(E0$K&Ffp$TAp~KJ_ zhz*rMJV*pdASon=4A2EA36W41%0ZVI&^72LR1e*S8lZ0bd{#hy|qrsX#8! z35Iqq6GLnjJH!{oPH|3rTihUiAbu=nb zEEyu1B$+E&FWDsdQ?gyMOR`sTKypZOSaMXtkO(Cb2`rIG6q0fYDp5-+C3=Zba!wMJ zG?ca}9a6fq^hjx0sk`(_=^MBi+yed#ZUwi88C~FRa1Xc_+z0Ll4~Iv=W8v}eBzOwE z2HpYhg%7|7;UjPn%z%%>JXipi!)mw^*2CvvGi-w$a2O`xyKn>i5N?E@!7t%A@W1d! zX)|dHX=iCyX?JN)X>Vyi=>X|Z(!tW9(&5sP(#6t!QjxSudRf*~)>k%_A=@ZBCIe)k zj4Oj=QW+}K$aFHJ?7Yk@v&kH?3$m~*B8$orvXm?>Ym~j0H(5hRKvkQ8zU`3Jd=JVYKNPmveME94FGFY=+h zNqN`u@#X8vPn2uQW95y?uatw8bCgS!%atpYtCX9SyOn#D`<401L&^f>X(dYuD!EFb zQlgY9&np(fO-YN_g=>Z|In8mJnq8mbzh8m;ZG-lK_N}h9uCp#rH%vEDH%2#3H&Hi5H&r)-p_{Fnr`w?0 ztlO&FuG^{GquZ}Ls4LJF>WXv>9iS`M8FV2Xt$U6Lno{+!;a z59zD*gg&mX(bwv)=&$SR^tbhQ4NVN+8%7zn8TJ?s843)?4aEkwfn$IS0z(x5k- zHJA)lhD!#wf#EX*4EK%S8K)U%7?&FVFs?DKH*PZSFzzz$H6Ab?G#)jcHmx?TGwm`R zF%_APnNFI{m;e)Kf=zN$nMr93MZPuOE-PV29eCr`=f%S+LuoBj1wr;k`wpF(O*hIDpo888^U~}3$ zHoq-otF{rgxUI%^%XZs#&(>gjXlt}Rv%R#vw!O2xx3{(TwvV>Ywy&}8uphSz?G^U( z_DgoR-DeNlF*|P0*lGLU_N(?A_FMMbj?WxFIL0~VId(aYI8HjwH~n@TyT&W2?qhEvs5vb+qcQs^d<+6LA`y=baX(-Fd<3 zbb6doXWUuiB%K*2?W}cPcD{3cFnM>o+xeTteE|bgZ zvb*B07w!S>+3vmW!|r45lkPKaz|D4-xgBoW&A8#d<-X&-=V|I`?)lX7nWvSfwWqCT zs%M^OnP-J(m1nJIgJ+XxpC{jQ$W!1c_nh^d_n19akIxhIggw=sjEDBrdM z^5%ILd)Iomc(-|XdiQt_c@KM!dKup1UY$4Led_z#H`F)Lx7@eVx7xSPx6!x7w~gW3 z>D%Mm?>p!#@D=)mKCut>$$SbQ;#2xipW0XH)And;9cNDuxapY!9l^i;Lzak z;Hco(;P~LA;4i^x!5P6>!JR=kXb3ujwZSK$Z$kq^^Fy0L2SP_fjL?bDsSp$@3zdf| zLaLA^qz&mqRiR5EcgPnChOkg1M1*3Y+R(Mo%}{;lA4cdw=uxOK+#=j5+%x=BI4?Xb zJTg2cJT5#Tye7OpyfM5bye+&VygR%voF6U;^TL9#C@cv}!}4$^x?{?AQg&iFq(T7Q(7A0=tgYVfEM@>>hR>dxSl~o?$Ps*VxvXDudF^= zU0#hrBc6ya z5{yJ5L?j+bMy^HfM;aNCr;!(tw~>D%AMvJmTf7rK79WRCz$f9q;8XGG_)L5bz6t*m z-;VFZcjNo;1Nc##iL>w$oQDf=FSaf7` zbaZTVVRTgyT zt&7%2??m6mTE<$%TF1VMb%}M0^@#O~<;8}@M#M(NX2q7pR>b~@t&Z)B{S`YNI~hA2 zYlyvyy@|bxeTWZ^FNiOWFO4scuZ*vXuZ?erZ;t;JKOR37KNByGv*RUkaU6|n;<~so zem-uA+v8PnMkrn#$K%m>L;O|zZT#Q(hr}0&)`_nY?GoJ*JrcbVeG)?xBNC$$V-j-` zzbF1ktWK;=97r5XoJ^cfFcWW*pC&&`wo0~6c24Fchb2cQ$0WxkCnl#PrzU44XD8<+ zHzYSF|4eR6?nv%V?n~w;4g!ZqYJ6%+YHDhFYEEi?YGG<|YJF;V>OksX zsvuRAVx&%_PNf8?U@DeMrpQz#bv1P(b&LFj{FMBR{DN#lwk6w>-;kZiq2vg1G&z=J zj3XzKlgU}+QgS)Dl3Y!$BR7(p$^B$Ld5A0^Pm@d%AlYOoDJA7(8EGKTlIKY?=^_1O zkPMTxlYNkVoMk-8KBJmY&8ZetOR59ak?KTs zrhcFXPy?w!)X&s-Y9ck6nnx|57Ew#6b<{>`GxaA`NU10drK1eg1Av zQxsK8U8e3)kEtirGwKEPFZF?LLN}*d&~51N>0Wdnx*y%2&ZCFY!|74<7Ku`ahxH10!!e6uh+TQ#B)$hOF GnDjsN6@gU% diff --git a/MeshtasticClient/Info.plist b/MeshtasticClient/Info.plist index b5b09295..74217155 100644 --- a/MeshtasticClient/Info.plist +++ b/MeshtasticClient/Info.plist @@ -2,10 +2,27 @@ + UISupportsDocumentBrowser + + LSSupportsOpeningDocumentsInPlace + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName Meshtastic + CFBundleDocumentTypes + + + CFBundleTypeName + MBTiles Map + LSHandlerRank + Default + LSItemContentTypes + + gvh.MeshtasticClient.mbtiles + + + CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -29,7 +46,7 @@ NSBluetoothAlwaysUsageDescription We use bluetooth to connect to nearby Meshtastic Devices NSBluetoothPeripheralUsageDescription - Bluetooth is used to connect an iPhone to a user's meshtastic device to allow text messaging and location data for the mesh network. + Bluetooth is used to connect an iPhone to a user's meshtastic device to allow text messaging and location data for the mesh network. NSLocationWhenInUseUsageDescription We use your location to center maps of the mesh Privacy – Bluetooth Always Usage Description @@ -65,5 +82,27 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UTImportedTypeDeclarations + + + UTTypeConformsTo + + public.data + + UTTypeDescription + MBTiles Map + UTTypeIconFiles + + UTTypeIdentifier + gvh.MeshtasticClient.mbtiles + UTTypeTagSpecification + + public.filename-extension + + mbtiles + + + + diff --git a/MeshtasticClient/MTAppDelegate.swift b/MeshtasticClient/MTAppDelegate.swift new file mode 100644 index 00000000..a59f9b27 --- /dev/null +++ b/MeshtasticClient/MTAppDelegate.swift @@ -0,0 +1,28 @@ +// +// AppDelegate.swift +// MeshtasticClient +// +// Created by Joshua Pirihi on 16/01/22. +// + +import Foundation +import UIKit + +class MTAppDelegate: NSObject, UIApplicationDelegate { + + func applicationDidFinishLaunching(_ application: UIApplication) { + } + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + // ... + return true + } + + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { + print("We received a file") + return true + } +} diff --git a/MeshtasticClient/MeshtasticClientApp.swift b/MeshtasticClient/MeshtasticClientApp.swift index f7222a60..5f99066d 100644 --- a/MeshtasticClient/MeshtasticClientApp.swift +++ b/MeshtasticClient/MeshtasticClientApp.swift @@ -4,6 +4,8 @@ import CoreData @main struct MeshtasticClientApp: App { + @UIApplicationDelegateAdaptor var delegate: MTAppDelegate + let persistenceController = PersistenceController.shared @ObservedObject private var bleManager: BLEManager = BLEManager.shared diff --git a/MeshtasticClient/Views/Map/LocalMBTileOverlay.swift b/MeshtasticClient/Views/Map/LocalMBTileOverlay.swift new file mode 100644 index 00000000..2b967097 --- /dev/null +++ b/MeshtasticClient/Views/Map/LocalMBTileOverlay.swift @@ -0,0 +1,72 @@ +// +// LocalMBTileOverlay.swift +// MeshtasticClient +// +// Created by Joshua Pirihi on 16/01/22. +// + +import UIKit +import MapKit +import SQLite + +class LocalMBTileOverlay: MKTileOverlay { + + var path: String! + + var mb: Connection! + + init(mbTilePath path: String) { + + super.init(urlTemplate: nil) + self.path = path + + do { + self.mb = try Connection(self.path, readonly: true) + let metadata = Table("metadata") + + let name = Expression("name") + let value = Expression("value") + + let minZQuery = try mb.pluck(metadata.select(value).filter(name == "minzoom")) + self.minimumZ = Int(minZQuery![value])! + + let maxZQuery = try mb.pluck(metadata.select(value).filter(name == "maxzoom")) + self.maximumZ = Int(maxZQuery![value])! + + self.isGeometryFlipped = true + + //let boundingBoxString = try mb.pluck(metadata.select(value).filter(name == "bounds")) + //let boundCoords = boundingBoxString![value].split(separator: ",") + //self.boundingMapRect = MKMapRect(coordinates: [CLLocationCoordinate2D(latitude: Double(boundCoords[0]) ?? 0, longitude: Double(boundCoords[1]) ?? 0), CLLocationCoordinate2D(latitude: Double(boundCoords[2]) ?? 0, longitude: Double(boundCoords[3]) ?? 0)]) + + + } catch { + + } + + + } + + override func loadTile(at path: MKTileOverlayPath) async throws -> Data { + + let tileX = Int64(path.x) + let tileY = Int64(path.y) + let tileZ = Int64(path.z) + + let tileData = Expression("tile_data") + let zoomLevel = Expression("zoom_level") + let tileColumn = Expression("tile_column") + let tileRow = Expression("tile_row") + + if let dataQuery = try self.mb.pluck(Table("tiles").select(tileData).filter(zoomLevel == tileZ).filter(tileColumn == tileX).filter(tileRow == tileY)) { + + let data = Data(bytes: dataQuery[tileData].bytes, count: dataQuery[tileData].bytes.count)//dataQuery![tileData].bytes + + return data + + } else { + return Data() + } + } + +} diff --git a/MeshtasticClient/Views/Map/MapViewModule.swift b/MeshtasticClient/Views/Map/MapViewModule.swift index dddcc826..570da564 100644 --- a/MeshtasticClient/Views/Map/MapViewModule.swift +++ b/MeshtasticClient/Views/Map/MapViewModule.swift @@ -97,7 +97,7 @@ public struct MapView: UIViewRepresentable { //self.annotations = annotations - self.locationNodes = locationNodes + //self.locationNodes = locationNodes self.overlays = overlays @@ -135,22 +135,10 @@ public struct MapView: UIViewRepresentable { if self.customMapOverlay != self.presentCustomMapOverlayHash { mapView.removeOverlays(mapView.overlays) if let customMapOverlay = self.customMapOverlay { - let overlay = CustomMapOverlaySource( - parent: self, - mapName: customMapOverlay.mapName, - tileType: customMapOverlay.tileType, - defaultTile: customMapOverlay.defaultTile - ) - if let minZ = customMapOverlay.minimumZoomLevel { - overlay.minimumZ = minZ - } + let overlay = LocalMBTileOverlay(mbTilePath: Bundle.main.path(forResource: "offline_map", ofType: "mbtiles")!) - if let maxZ = customMapOverlay.maximumZoomLevel { - overlay.maximumZ = maxZ - } - - overlay.canReplaceMapContent = customMapOverlay.canReplaceMapContent + overlay.canReplaceMapContent = false//customMapOverlay.canReplaceMapContent mapView.addOverlay(overlay) } diff --git a/MeshtasticClient/Views/Nodes/NodeMap.swift b/MeshtasticClient/Views/Nodes/NodeMap.swift index b9cc26b1..280fb2d0 100644 --- a/MeshtasticClient/Views/Nodes/NodeMap.swift +++ b/MeshtasticClient/Views/Nodes/NodeMap.swift @@ -49,7 +49,7 @@ struct NodeMap: View { )*/ @State private var customMapOverlay: MapView.CustomMapOverlay? = MapView.CustomMapOverlay( - mapName: UserDefaults.standard.string(forKey: "meshMapCustomTileServer"), + mapName: "offlinemap", tileType: "png", canReplaceMapContent: true )