From f9081cfcf7814e624f4df9a575c292bd4b605220 Mon Sep 17 00:00:00 2001 From: kutesir Date: Sun, 7 Jun 2026 15:47:49 +0300 Subject: [PATCH] Workout: auto-switch to today's program + Rest Day state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Workout tab kept showing the last-used program (with its old completion) regardless of the weekly schedule, so a rest day still displayed a stale, fully-checked workout. - On a new day, the active program now follows the weekly schedule (applyScheduledProgramForToday in resetSetsForNewDayIfNeeded). - Add isRestDayToday + a Rest Day card shown when today has no scheduled program, with a "Work out anyway" override. Header reads "Rest Day". - Daily set reset (KC-1) unchanged — no day starts pre-checked. Co-Authored-By: Claude Opus 4.8 --- KisaniCal.xcodeproj/project.pbxproj | 26 +++++++-- .../UserInterfaceState.xcuserstate | Bin 50613 -> 50094 bytes .../xcshareddata/xcschemes/KisaniCal.xcscheme | 16 ++---- KisaniCal/Models/ExerciseModels.swift | 24 +++++++- KisaniCal/Views/WorkoutView.swift | 54 +++++++++++++++++- 5 files changed, 100 insertions(+), 20 deletions(-) diff --git a/KisaniCal.xcodeproj/project.pbxproj b/KisaniCal.xcodeproj/project.pbxproj index 502dc89..9bec8be 100644 --- a/KisaniCal.xcodeproj/project.pbxproj +++ b/KisaniCal.xcodeproj/project.pbxproj @@ -80,7 +80,7 @@ 0506183945D16EC443A69651 /* LiveActivityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveActivityManager.swift; sourceTree = ""; }; 0513EB8C7F6B6853B9E93E09 /* TaskLiveActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskLiveActivity.swift; sourceTree = ""; }; 0C96EC00F6B021DBA3CC1A79 /* ProfileSetupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileSetupView.swift; sourceTree = ""; }; - 0D6D6740721F01A74E404EB9 /* KisaniCalWidgets.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = KisaniCalWidgets.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 0D6D6740721F01A74E404EB9 /* KisaniCalWidgets.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = KisaniCalWidgets.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 106EEF572C6F8990408329F0 /* OnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingView.swift; sourceTree = ""; }; 1AA7498EFED7692022F3E7E1 /* KisaniCal.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = KisaniCal.entitlements; sourceTree = ""; }; 208F82348DEBD9FF7B0DCF17 /* MyTasksWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyTasksWidget.swift; sourceTree = ""; }; @@ -104,7 +104,7 @@ 9100804DB1E61EA882CC54DA /* FloatingTabState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FloatingTabState.swift; sourceTree = ""; }; 92824ED40ECD41EFD4F78BEC /* ISSUES.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = ISSUES.md; sourceTree = ""; }; 93D045FE3DEB1D22D908A29F /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = ""; }; - 9BD1F84B4F45B12CB9B9F1B2 /* KisaniCal.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = KisaniCal.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 9BD1F84B4F45B12CB9B9F1B2 /* KisaniCal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = KisaniCal.app; sourceTree = BUILT_PRODUCTS_DIR; }; ADF6CCD95A587E26E30F5712 /* CalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarView.swift; sourceTree = ""; }; AF905C574F34B4EE51A8D21E /* AppGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppGroup.swift; sourceTree = ""; }; BC5E179A9189B0A8C3F856F6 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -289,7 +289,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1500; + LastUpgradeCheck = 2620; TargetAttributes = { 28B43516AD88946E21D9BFE0 = { DevelopmentTeam = K8BLMMR883; @@ -423,6 +423,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MARKETING_VERSION = 2; PRODUCT_BUNDLE_IDENTIFIER = com.kutesir.KisaniCal; SDKROOT = iphoneos; SWIFT_VERSION = 5.9; @@ -469,6 +470,7 @@ DEVELOPMENT_TEAM = K8BLMMR883; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -483,6 +485,7 @@ MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; @@ -498,7 +501,12 @@ GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = KisaniCalWidgets/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 18.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 2; PRODUCT_BUNDLE_IDENTIFIER = com.kutesir.KisaniCal.KisaniCalWidgets; SDKROOT = iphoneos; SWIFT_VERSION = 5.9; @@ -545,6 +553,7 @@ DEVELOPMENT_TEAM = K8BLMMR883; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -566,6 +575,7 @@ ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -581,7 +591,12 @@ GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = KisaniCalWidgets/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 18.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 2; PRODUCT_BUNDLE_IDENTIFIER = com.kutesir.KisaniCal.KisaniCalWidgets; SDKROOT = iphoneos; SWIFT_VERSION = 5.9; @@ -615,6 +630,7 @@ "$(inherited)", "@executable_path/Frameworks", ); + MARKETING_VERSION = 2; PRODUCT_BUNDLE_IDENTIFIER = com.kutesir.KisaniCal; SDKROOT = iphoneos; SWIFT_VERSION = 5.9; diff --git a/KisaniCal.xcodeproj/project.xcworkspace/xcuserdata/kutesir.xcuserdatad/UserInterfaceState.xcuserstate b/KisaniCal.xcodeproj/project.xcworkspace/xcuserdata/kutesir.xcuserdatad/UserInterfaceState.xcuserstate index bcd630905d0deec367bdd4159b7fc288afb7c399..a7eebe03c5fa5d9303784b8af98daece42534c46 100644 GIT binary patch delta 25872 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%0ABnCokXgeP#2D57xG|z`5 z=!B@}d0%${Gd{S3^$=nNT1OH?iDATWhz)}nI*w>Yr=36~vL`+gVu{Rw;7q*~v|uGt zA(lW#XvQ{*3F~gJ$|7=5zbJx#Y$S3ami+UgL=+Gzj`K>QkQhT05yeCaQA(5%!PyeiCYAPi!LoV7+iNv4z+Qu`v)Uf>?1gv5k-t zJ0MnqTo7WV$P2Nc803kLUc^3Rv;9QJ;b`GjSeULzE-6sv_t(+UncHn-CzE~;TDm>C z<&!u9V;z(@gvuU9zWBGy9L?qMpEq)CzIco{sqw`VYG15q!gdpDX%u3Z)8o3Ri1S=4 zj`LcbDB=Qfk+?)$Caw@yiNA0r8M{L_8**5KoC` z#B<^W@sfB&ye8fdZ;5xrd*TD}k@!S>CcY3~iEqSr;s=+*#ke>Za0xD#%j5F7Bv-%{ zaz$J*SHhKYsoq>2t}a)PtIsvycHnm8cH(yCcHtUwjkv~K6Rs)OjBC!d;G$Wif*6EY zHNjBE%*`Y$`exh|OSbhaCdwM40HXDJpITHJ z!&dL-I)YoKQB^T}dkoML(;9J&y2iks+BIr5syel5OFPv#jjBPdGU=sVYqCZ)POYkL zr<$%&O+Z6%WbU<7&C#ePF`)xonZA)WS|ePjQB6@dxGqw=uV#&Enp)MVx3+4zMm1gC zS4lh7YK>|psuio%&w7n`wz{#1KH80K(WvG!NpY^ssy^DI+o4g-SN9|7t6giaMzxU9 z?dQrA^wq9)NTXV;?(0gsTE{f1CR9s%bf-1q7Ilp!{j~eJpiwPlUJZ9;#8EcXFQZ>& zRSX^J&g4dESGl37vQpjJrFN>j8r3SsJ=T>8?yue2BXw(Qdb=~t{k2)UM3Jfm;3W_!`wV zb*&%mYKb+f9qMycMr${yt5NMzTj+SS*17UJvMMGd%AIkK(XL{osj^Sq+N^debB*eN zdJLc1scbZ=LrCT1>lWti;o%wX;w6*$yLkC~___G``bW5U_UPds>h9y`?%@`ywdmzJ zYU&VX`L)gGglMs-}RavG$q^4F+NG8Tz$3^PazJTF+II<2ntpHsl3Ub|M3Ms;0XYj3=EtrU&wrdnk;L|Zjlqq?nDO&p>)s)vY>wvkjC@ndxjn_=2DYBZ{+YTuhMO#6h!YE;kFj`XZu ztw|cyOSL6philhjG^*F?zWx}leL}NY6*DE?oiQ7sJ%$CED(}@*YTK!rG^&qk)suFr zWg69IwQAr>V7sQYWH(gqaxKRqaN@?g}ZpWhxvJh`S?c2JljqAJDSRR z>Ml1VYY+6HMrELO07JQUm(Mh+j?6&0HjvjEacA|+x!5-A^BdlL_xL?@PPe zQQmhx2Q8U-KOkcWYn3laDeMY}$#*R+y>O<8S0xvpJsDB`ZIa zFKb^Vg5RUPAd=s^y`UdIs=Z(!A7%Trl3V;i{K4%7L-;5?!8j@1R4MHh>HJac1)2P; z_JUk~e%m?z&(Mqb#qEoh@hjS_^gl%*ze-b7)pp*s{JQp)$MVOu7fj?&YA=||Xa1j& z%;L}ae>4mDC<~#5M#XRBH?@=Sm++Ui7p&l~Y%f^NU(;T&j^93;$lt`@+`hyg{B7+8 zJNdgBCXAJ5PTypnc_TWN>>yC@E_%h#-5k7etb1YOmGNA$#MW$-ZPiG75i7 z4j>1T(PRu6OAaCjlW}A`IRxUF^n0knvmuUd6Z7fE5HEyy5yVR%UIy_Bh^rtDAzlsf zT8P)PEe<1xlOxEHWCEE;CXvacoK%oXGKEYf)5vsk6vW3ud?CbthxlHI{|)i45Qrc! zgun@+oGXZeAOV7G2viVEhJa1JV;z3p6_DAQu%DHn6Ru9LWMm4M&!hBzEyBqHO^F6*_z)Ye**lS?%PYnZ64K3esE(}?TZ&fY!slnX_fQ1TCQTU$01r3S{SbE4{mC_WzI6Mm*e zSCYFmNhfkYd4N2~u_q6sq!T`|HR*&;h4@^E&qMhqd_J=yJ3sm)$~cjyAbRej$&Hd{ zQErqxN1kVY5T6Y3DVih7jymY*v|cI5zsTz-sY6~Pk%vu#IMYPlAa6o^I>cu&FelQT zyhlFzm&7Oen0$f~pZE-jqs%l)e4Zs=a47O6N*{gBF-KYW@U!F_BzTJiHo4|DNYK{f z2l6xO5qu{ zvtHnYQqFiIN;%_ADEpVB%l%82d#&{(1?~bbbQS^+0ZRF_KzvD)z*~TlK1(6K0;QdM zrv(av)er>T)DV`TT$&&R<9N6!Ac|;QfO|6!0TkT4RnoQod);sYTSER+%s4o*v8^k2(}2&5@w}ftKbj8Ho<79k>@N28VQYsCPGu8nb2Hl z0rBe)zX5R+7;i!RHpK5h{4T`rLHs_%AFLEwX?P3mg!V!Qj=j){<^8aY_fv>}g!m`c zy+0%1gRp3S#9N5+zK>dY3(=F97GbckJNtt;;`l^!M8t>d=(aK!_7I}U-z4lQL@hmo z`12-VZ($#Zzkv8_^|LJD0AUPUU?A(-FIm?X#-e9g_$%g0nW^1S;Yef=;V|KF;RuMo zf%sd9ziSpI2oqV0yodOQ_7)MQBFbt1w8+RQ9aqmal1-Tye>tXZQ}HpiMMk5t8OS0h z%FWTm3`G}5O?1(TZyS8Bus}l}J=Z|v|H9IbWsUPn9bAN^!rK29T!eM4^v4P9*{3tY zNi6+ut@Hs0(MPU}b^-`~#uni;)&LB|zqc8nJ9=Q#BA|t{*`GSF{Lmbc1&rEGVWF^* z#k)wj7y=9eyh+$3Y=!_pz+?HVgv*7$p#sPOSF#QW2sERGtI>=G+<%4^+ih*lt`}}* zLko)N#1`~8NAp~#S-3^G6&VKbAt2R;IV;?OAn*LAK?Woh9qP6~R>Ul*B-K}5;T}|Q zFS5qa%69YPfbg)!1cz7?0O7CUX-sfJco~`CKde=RS6WT*H+evK1DW6!G64{`nE<)h zTnIX`Ht77z2KQJS+=oEYYJ(u*BV+^e9A`cILu(Z_>Y&5V%{;=FLKIV)gs+6JA)p}8 zX%fB_zJov)0t1cze-@%mR87J!$p3+!+W)^J{|EYvGi~Zdh)5Rm|2)AJ2}D8`a|Z}I zYA}n?b50S3=#|i#2rkk?0(~TCp*0b_Q>*1fokWIeprS5npj}v>{*HVa^~hc@Mdl)> z{{~d#tN|)=6PSoRIQAkh7N}7hP&0O|0_<6!4nKj4{18x)KLp0DKxLvJ1XR>b6wLl0 zFoD2Sb3{%(OGnUl77?Oe=qyA%L_Hxehrpsq6e;Qrfh7bsEY?&}e^E4BU;vBNip465 zVX<1%iT`x#g_5>rhlob}8}E^#1eUig1n6qWE*wR2gja#^=2W%vMuA6!0uM8nztk3Es9}zTWfe1is=8y8@BSU71fFA5$~}qZ|64Nt`PV^;Lq|7_{Do7 z%X<<8F0H&nL{nMb)5wGD4}z{}eXcno-d)D(Z2ZxSsKErh@W0&n$# zThuIC_HW#li&n7QJR$IE<+d7OT7xjT)wFV3hXm`9U|5azv=?m>ZACqT?;;dkP*n0^ zscmDa`7#S@>M+CK-j$Rwq7oyiJ)|aAJ5Xc}1 zYZAQ?y@engf}R?zpF}7&{L9K&^h3-+Kp}{LfOSVP;80?M#agGqD&`{r$zrY3#wr$x zrKm@-n4J}97eKcrF@@HVAQC;RUsz{n*h#F34Ps4f=!b%>m}0L5k;qrOsLaJ|X!sAC z5yY*bLF^`W7o*T1R)>cEZB(Nn7zV*`mgeMHBZyLy+<-oQqUQ4pY=ENb`Og2-=0_CF?a*0kl!lnKU$29i!{-V(GD zLB3Y0rDh|s#6*J9qyOcGP~xBgE^!gsOI$hj5_c9j-3Gjxy+HvJSpR18OB(-{cq8Hx z9|&M8@n8wMZE2ANaMrUw2&&Nfj6ERUQ(I|ELM7qo3?wp17z8yC)HX>XB&bv!1Y^~- zC4D6Q5$*rIEtCw93}k87L(tGldk`Wx_@A`nFJ{cn@$B8QR=l8_nd(-!n)VP>b||9V zZBjehBP59$+6ijf<5--@EbZ|OJ;~HCO)^?T8*TGKXFf?wt)`tTDMz&b!|kA?qLnt3 zR7t84?OK-hls4K71oI(Sz|vm$i}qNS_BaTp{-llKON(R@qK$qKOk-)I1EMW&qdh}1 zo25NdG7Ey~5X@+j%#oml_Dl%ou%X0AvPjaTA<(EMFpE9K7M8$l=EY=Vw-u7r$Qb{7 zM<`h%S<4y&wKT8Q7#k4ajR+PO%>+N1l+t_wW_Gsv$?Q7^v z7io2^rh7OjM7|>; zU#DsiNihy3#gV{nnzmC)xl(i&g065yria5^e|)UE-si(B{F|0a6D)mLMrG60nK_{J;2BO!U&`VF!AZa&gu(bP- zd}Rh|8NH_j!48Oa7^BUnV6WC5dS|Q9!;cTf9@w^~t@SV|dL+{%4VR+z*-i*{HA#C) zkwc-C)*fc(bQ|M;dErXEe^uIFI)HgH-4YCxMl(7yLR7KRLG7OHNaLjmXty-l^^f-a zqjvy4;P23Ge|E3`9JJ^E=~8K;G)bB)l}i;;B?Jc`I10fjh;}i9OAuW91wKuR9`ZIy z(;+z6C>;&KA$E6oml*YlDiuH9&tk64kgBp-HaQR+{+IW803|J=m$2JnUqEo==W99A z5-c8qKU?3zk(T2fWWbefX~UzE!e6~tL2#@!d`oNDu2A4TuGN*Q?cE{JMLJQ_7rGXn z_|?~Bwy%?IeN97s;gP@knjvMkqPL#uYzR)b^)-*}3k9_^T7CWO%2e8{>FOO+fwRB* zTEg~quC1@-?0ISR^_z6{ufEnmaG|ZQb!=bAsW1LZUsx?J*7Q|LH?iy+6Tdve`yLBNdMF{g>ERW{u=c$cGQ2hjrt@@$o&_gGtzTyeKksvr~KX4 z)g`v8%jlYa{onc$wpsoeYkAH47}8tPJ7~|g6s>t~HcIb8aEqBY+df%}k|d2BT^j$H z7Lh)azCfL_vPLOd<=k!S^9|Y{tu7hS*5n827ZlB;AElq9pCPyp(O!D+uvz+5`c3*B zf=3Xb>K_=JITNf23Oy2TrnnT3a~guj5Imtnn<)V$q|h_Srx2hZ`GUDH$3dmTp(tHS zk9{+&AU#uwrtjVDZ+u6g1?MyMG^7lu4w_fNlueWY+D1;XH9Apx>_k7%ZM<7PTT(4F zY!i;#z7h#r2Thq!Xro9oWlEW`LqXPf%?`zqvZ7Gj=Oh1p2f=$Z7W)pUVF${QavFjL zlV6aRo|Ov0TW0TEcXt=6tNPWp*4NZx)XHYcg>vQ8#z)0y{{L)ieGj%)*1YcGHi5TB z(9_kI3PSIMQGS#^6+i_-@DYMf5FnIaTBvSRFx8z3f#53y-ynNa_=CAS@1hz|PtBPf zELeIFU8-A8w|A?sjz1gSnY9Z0wF(R0L=OEa9H0?yIkx7qmll{93ME)pP_fh?YA_W? z#ZyD5q0}&HI3zGg;E({2AfPY7g#-^0d`OUx5Uk)>Qwbbxz&im?=v-8hCI5IG!9gb63s)PCxY}kUGq4TVkx* zO722mJ~&5SN6%0nlTXnX58jaP$PeTvfw{mJeb-Dg`1>(_11XQAFqD7+h=t}_?M7KqEMfXuk zxb$xaHbz^n2bQ^S=b=T{j)jh9!OZTzvQ{CsfFLht* ze$oA=`$G@Y11dePo{3(VUXk8xy+*wjy`_4~_15cc*E^zjO7DW+4ZVkYkMy4Cz10W$ zLVZ1b1AS+G7yTIhME!LA(fXPC+4{NqrTXRimHM=Pm41!>3jGuM?+n}x1{mZUtT5PY zu-jm-!G42-28Rt!8=N&bZ*bAzvcXk@2L_J~o*KL`cxCXWlPa*&;7;;RDV@?fjqa4$ zDZ5i~r_xU4ogZ|5+xbK1Po2MZ{@#VtMbJgmMPle_7-Se}7-cxXFxoKAaEReB!x4t{ zhQAqZG~8sk#c+?|LBo@Vrwq>+UNwAR_|@>c5yuEOB8+%Oq><1_Y$P?(F|skTGjcF; zGIB9;HF7udH1am`RT=pk1saVs8gDe$Xo=A=qdP{QjE#-mjAM)wjSGzHjmH{~H=b_1 z*m#NYI^zw-n~YBy-!gt_LYf$v_?q~e1e$a+>24Bg5@u3lLYvf@)SHYo8E-P%q}gPJ z$!{jBP1c%hGTCMFx5;f&%v5TsW2$FrU}|UTX4=g((lo|&kZGK$YKZA1(^;mgP1lB#&V)1V>#P$x8)t8}Y{R=-*8wAyX8*XpR%S*r_Hm#l7DJ-2#i_0^hdZE9^}9c&$IooPMYdV%#u z>p!edTVJuhYJJW6k@aiqx7P2iKU#mb0XAG4zKy^}WFxWZXk%{UWD{mHz-EZeFq;uJ z2{uVKqiiy4vTSl}@@xuhrrE4j*_^d`V)M~fU@Nkf*iyE-w)(amY&+R@v30a{w(V-` zX6s?=W$R<>XB%J}WIM`suI*vl_jVR`1MRBq*4yp2+h=#c?y%jTcE{{)*gdp+X7|GG zmE9Zk78KuJU@x+l*c;e)wC`+hXm4!qXzy#^+djsAxP7{Pj(whef&Cc!3VW5x9@<`!pJ-(jFbjDyl4%c0Dn+@Zoj|rG1M{4F~YH@W29pr$9|6e9S1tb zIA%HKIOaJPIu<#WIF>tBIzq=9$9l(cjuRaxJ5F_6<@l%LMaOSWHcq}y{hUTQRXWXZ zI^uNI>6O!GXUbXES>L&Xb0_C6&PL8A&SuUQ&Q{Jg&K}NQ&OXk5&RNc7&K1rol{0ic z<$TTgy7Nuv+b*44tX*tf>|GpP5?nG|vRrap@?4g=Y;@V|vejjq%L|vUF5kOyy5e1Z zyM}k|(Y06C-d!hjozrz**9Bb{xpr~2b@g@icMWvy=Gxsg)HU3-r)#9^P}dQziLP?j z6xVdu4A*SeJl6u(MXs;hjNIbgCb;cTxxIG>?mTyayV#v_*L62_H+Q#mw{cH$&vI9} zSGm`^H@J^?pX5H(eY*QB_vP-txvz0w=f2T>i~BbBo$hx30I!`R`qcQ;`Hb}$?=#V7ozF?1m%awRp1#q(*}lcTWxkcZwC`Bo zX}&XjXZg2Kt3>Tl=Y)!)-U$UoA5 zxPO9wnt!2xsegq(?O*F(??29eg8wxCM*lYfoB(bB86XPK3D6Jd7|=PuF~BzMJ<1!V^11my>f2`ULH4^jnH1E^a zv@mFKP;=1Ipyfd;gH{Kv4O$m;GU!=1-EN-U;<{CIYwWhC+l_8tgSo+Euqap(+%ecJ z*do{}*e2L6*df>_I50RkI5fCNaAa`b;Hcoy!IOgL1uqV64qh7kTkx9T--Fi&?+rc> zd?xsE@L$2#gKq^t41N;)Jor`co9;H03srfB`h@z228DJHm4!xx_6qG28WlP)G&VFYbZF>^(8N%AXi8{$XhvvuXkKVx zXmMy+Xk{o2tqH9U9Tz$=bV?`_Ix}>R%ug053zmh-!eu>Wy=DDm17tC>!LlK;;j#o- zvP>yUlZ}>T$#P`{vLacjtU^Z1s%3Suv9bv&*<{%?*$mli**w`oS);5)woJBCwp#YP zY=dmG><`%v*>2fB*+JP6*)iEk*%{e+*(KRk+2698vOBW-vPZI~vKO+~vUjqNvM;jl zVOSUu#t##QNy2o(^us!abqO;LGYhi}vkr3)^9=J2^9vgnHY;pS*u1cXVNb(8g?$NA zeGBJ=M~5ebCxy$yQ^L1~9}GVn{%82{2-66s2$u-g2#<)Gh^Y}w#Egj95%(kBM7)dm z5b?Q3-yTDH4C^tXM`DllJ$Col+hc!^Lp?k9wCQQr)1jwx&(fatJ;(MO-*ZyWn?0ZP ze9`k&&$qpL^or>I3^!_o?f1 zxzD{m5Bfan^R#bp-#&f&_3hs`x^GM0b$vJV-PCt$KViR4{krrs>Sx+7r(Z=sRX^CT zrr*VWclzDy_n_b7D3xDSL{!hH$f&+i3!{FES{=1EYJGoBe@TC;zixkn{we+Q`xo{v z>R;Obc>gQ?|LXsD|C<9m26P_~Iv{L7j{&m>EE%wDz={E@27DgKA1D|o8Ymq&d|>*( z(E~FF<_z37@YKLF1J4b-7;PWz9qk+K9~~4uDSBS?g6KujP0?>-uow`-RmG4oLt|27 z(ql%)WX0@>IT3Rz=1k1_Sld|7SnpWh*nrpxv2$YQ#V&|l9Q!)<#~^GF7{nVCKS((! zbx``Cj6u5w9UF9F(5XRZ2U`zzAM82Ud$8Z&af4?Ko-=sf;Dv)<4*oXyM;sPM#0`#< z$0_4d<3`2pi2F0{Slo%Y)A5$^uJJ1Oc+YsB_=fly@w4LR#Ltg^9{(l&Tl|k9_>ciZ zMhr<9k~BmyWb=^yLk=hpN4)N z7By_xuo1%&h9wW%IBf5*{lg9pJ2KpGxZQAv;ZDQ54yT7t96ovY)Zx>I-yi;F_`BgB zhJPN>S2beDh+!i}j7S`@e#Gt(dq?aaacE@ckv1dkMmmgi9$7hZ{K$zTCy$&q^6to2 zBj1dCH}Ydb?}WI7Aqm40Mkf58urpzI!rp`fiF%1ZlN6QoB$tt;0o+ck9&ybhMOXX$q3i&wsc=-hRB>6n~eE9 zEK;metX8a1{I1xk*rnL5*sD0HIHNePxTLtE_)GCn@kH@l@k;SV@lJ^=fs#=2l=?~o zWd~&^rM1#VX{)qXdMkaDzDj>(4`okfFJ*6KoHAZHL^({Erc76kLW$QBWvQ}ErL0hn zQ;t_oP)<_LQ_fc|P%cugQm$66QU0#nsobU9t=y|TsXV1Ttvsu|p}eWQrM#njseGk; zt$dq;rQj(bg`1+6qMu@r(lNy<#X7|%#V*Aw#XH3(#V;iyrB_Oyl&F*eDbXnjDTygb zDe{z@l-!iOl!6qPQk7DjQk$Zhmcpb=Pnnt0oYIoABxPC3#*|Gdn^U%?985WsayaGB zl#3~sQZA=lO?i;=Fy&Fola!AspHe=jd`%Uk3R6X?l2pS~qg3Nm(^RKa=Tw(e*VLfY zZmGekA*uaRqf+~)4on@Hnvj~9nw*-QnwMIbTAW&%TAn&KbzJKB)QPEcQ|GBt=cg`A z{VjD>>gv?BsXJ14rtV7JlX@ccWa_EZGpX0purwl#mnKLPr%`FTX$EPX(hSo~(#+GW z(rnWl(wx&=)1uP`rNyTWOBNjfWsNthV zj!GKUGHTtZ4Wl-V+B)jTXz^(2Xr0meqZ3AFjLsUJGdh3t?$O6bpB#O9^tlY94Eqen z4Cf5jjI4~ZjEW3ZMpeeKjLR8UGp=Ra$h6FK&2-Q7%=F2u$()+GG;>Afs?4>S>oYg0 zGPh=K&)k){H}gQ|mCS3I*E4Ts-p;(2`7rZI=CjO~nXfb7X6a}7XN|~8$x6@4$jZtp z%A&KXv+A#{dy@66tveLVY2 z_WA5f+1IkKXWz=cll?mTM~*>GryRo^lN|FLs~p=LhaBe|*BppQ^S8ku&sN8|M@wvltN9HEw%5yVv zOL8aVPR^a3yCipO?)KaRxrcMl=U&OZmU|=jZtnfuN4ZaOKj-oDjPuO$Ec0yg?DL%R zy5_m(dFA=$1?2V5i_VM98=M!PH!N>tUQ(VsFC|ZvmNzOdKW|K4NnTlAP2R-3DS1rZ z%)B{y^YRwtEy`P!w=QpE-j=)_dAsxWi-XqJ{#E#Q;f=yuh0hD$ z6uvL~RQP=iHij6(8{;sh$C#KgL&uC5lQ>2`X4II>F*##Y`C|&lEF5!s%&Re`HiXw{!7Y!>KS(H?iQj}ISx+t@#yhv3vp=fH+^rBfs^NSW1H5N4&tuNYL zbiU|P(bb~Ai*6R(DY{?usOV|Yi=x-X{9<9TxL8`OQ>zhq&_;*zG4wIv%%wv=ou z*gL z7+R4~kyN3mNU12SsH&J%F}Gqt#o~(Qilr4RDppmjtyo{Nsp4qGiHcJdXDZHBT&%cK zajoKd#jT1v756HhSG=ltTk*c)MbNj<1|lIkj?T<($fSl?y6YRj#evQMteJQ01SM$1BfOUaY)Qd9Ct#<%7z%D!xjn z(pQU=(CHzp-Rs?yFg2vDldO$B23VXmv*cT3jF>o-9hpJRq0LQ`!a59_*XTaHT9$W|;VGCRa zcfj3nFWe6g!Xxk)JPA+3bMOMZ1aHDS@IHJ9U%}7tTNS4YRPn0FDq&TpD&s1%D$6Rn zD#t39D%Yy$s_d%rs_Lq`se%YR)kCU>RgbDJs-93ixq4dljOy9d z^QsqCH&(Y)FRNZzy}No}^?~X`)kmt2RiCUrQ+=-bV)fNexwFTw_sVU1L|Ha;|Z$@u=~tiK{87fi(>^<7+0>Os$z+Gp}Z0O=C@S z&8nI|YL3^Os<~WqujXUTms+w`Qma#|U)#CXsMe&`thQ^ddu>2%P;F#wRPDgp*xDhr z!)iy?Ce~)xme)?LonAYuc5dy0+QqfawM%PP)UK*sTYI4PaP6P9$7)a1o~}Kos=Ziy zx%RKxziV&QKCFFG`@HsL?Wa1tj$238iRz?vI(2$=W_8wec6E+*u5})D-gUlpL+gs_ zYU;+rd97u0L0QvHnW^U-j4PZ`R+ge^URv{#E^(`mYV#2C_laAZ^fX&~ND2 zVAWvX;MCBy!Lz}q!M`D}A-wQ`XlMmSi3z@cdoXih08g1m=F!S_P;ZoRs$2*K!O0{#td!UUKEQ(zj*ggszS_yEj-L*OtN z84gFm(Qqt$2F`(R!SxV90vY5`!vJoCAHYhu6IR0}coMe2OYk5RE-XxL+CK7L-nWu z9gm!8Uu}NBi9&eJZ6kAMj8diQsW(C zow457U_gTz+;9xn@Qh7Hl~HHZ8($c$#t+6doQP9!8qUPMaBtiX_s7HVaQp=R8J>VA z;ur8scnW?Q7vRV|yacbq>+uE*F~%mgvBWX#;d1;5{xjZ-_u>8cAU=$b;(FYG8*vjp zi(7CjZo}>PD!z_y;tt%2?~(+PMIIo1Nq>?}a>=7)D9I;_$REjDvljhLDbOaqq$I)NXd^(9vrc>#3I)l!q zOKB-Bqfv?|p^S3sP?!3&g6^h!=x4N=*3d)r2t7*cX#;JfP4p~np{=xyw$rQh8ofbp z(GJ>arkOp=US=P2fH}yFI+re6`ENgtkT5Q?YcB|HEvQAiESk2bg*59pvTIa3nR+rt) zPPS9+411zI*`8(p#-3*{u#4@*_EP%~_DcI*+p;&=JM823Y5O|Q;QjdkK9CRMkMlhK zEFZ^z&L{Bacs`%bU*Uy(Hh-PZx=Ut7?{-uZql9SBk}6amsqJc)s#1GZwK||`)e&_@wX3VDQ+36L zM`BOMCdH=43S)C)MX`$5me{t~zhbxCM7O(ppPTMxx&7P$?jSeE9qbNqi`)vg!M)*j z=~SJe`{-<)s~^{+^;kVYzo;kcS$eTvs!Q~8y;85zYji}H>N2ggt9@Or<9d_ctheeN zdY7)!`}HaPofk>)9`v5@^1PS5Vz0!j^mco-UZeMw_l@zdBp$%-G2&QFVKGVlM*OX$_ zSPfQ>L2NkIh_zyqu*ukTY!)^fTY!CyEyK2A+pz7}4s0j33;Pz^jqSm{$Btshuph9K z*iGy{_7r=G{f7O8y~8ma$N9Jb7vk2q9PfqO;I_COZjU?Qj<^%cHq!*}C*@PqgX{73vG{uBN)ehR;WU&XKC*YUgfFZd(; zSNu2pcl;y%3Ge^`L_iFTfeGjaG<|?K@BzNS5A+58pdSbT{XrlI0>NMa7z*M*JQxOs zgOMN=q=O8g0@)xBj0HuY7?gtwPy@z+DPSs?2Bw1sI5-7PgLB{lxTpbF!EJC4+y_s=Gw>_;jQ|8e@CgASBuIiH z3<)E`m@p?S2us49@E|-1FQO0OP52PLL_Z>g2qgv+Lx?CMkw_wj5$Qw*F^0$_a)_}+ z8BtDD5cNa@(M+@utwb9!iI_r6CuS3Kh`GdKqMcYqtS2-Zh>gT1VjHoO*hTCoE)tiB z%fuDpDshdtPTU}F61Rxk#699E@f-0w@dxpN_(*)>Q+yF$%$M*D_$K^rd`rF+e>Zw?>YJA(Uy2ZASpr-GM)SAyRKe+b?P-U>bnJ_&)45RyVl zC>6?tMnYp@4`ENCh0s#iOK2l>5IPE7g$kjE&{OCm^cD6K4iJWDgyF(S;ZR|maJVp8 zm?}&cW(o6zV}(V+GGUdlUI>LP!mosrh0}$zg!6=pgiD1hglmNBgw75NRhj@(3UCbyG2$lc@~ z@&I{|JVJg?9w$$bKa;1(bL4sQGI@o(LEa?)B>y7+Cf|@BD1zcs0!l{FlmTT%Sy48W z3*|~FC^xD%0cQL0EYN;F!OCQ27&h{lLAMLD8EQIV)v zR4u9zjT1GBnncZ_DWa*OX`<<(S)zHO`J#5wGSME<0nt&>&!SVJ)1s@Qo1(j-C!(jK z-$cKQC1L|{53#jaF773E7Q2XD#Xe$xaiBOz93dVkP7`N}^TcDt`QmbMg}74OAl7Ka zjCg{0ig<>Y6)zAk6mJvn5+4vB6#pPTE#7bfSjhs(LdiDCF3ADOL5b!E$#KaE$yv!c$$805$z90<$wSFY$tx)-l}L@HCem(F zOR1IATIwuylX^=1rTwG<(lDt~nkr3~=16m;#nKXKskBbYNSmdTq?4snq*JAHq;sX4 zq}!x>q=BTPRlOJuE?&-?#dp>p2=RyewF<#dr#vuNmI0l zmeD4(rYCJf+tPNlJ?&0=(4Mpp-IoragXlqYBt4jprsL@(I+@O*RdhC;L+8?C=|Z}M zE~h8Z6X{9xWO@ocm7YdVr)SVCJ(HeA&!*?lbLr*u3VJ2Iie62xq1V#i(3|N!^j>-& zy`MfnAEZyvKhh`ZQ}iwRwuHVz-=%+{@6iwGN9-;#2>X5OU!)x8zhnk6ueVx=ckyjK zB7A)MM)Y;_j0p8`^NtAX6qetby>NG$9W6~ z1Yclg&Q9+U#6J?6e9)ae-y?*7BygppKWo<0HhAYjZ=*?PNvgY~-KfX#gerA*c~azA zOlB(S6LRbc$DO&P-NL%v(#n?C@ju&xa@~Km%X_h9JqNnq=H21l<2~fP;=SR$$M`xX zj&)?W>G<362a~Z6d)8>%lDAc5`V%Jnp1H@|XI^aeH)k=Nw}t)LqFfV^X5gNjS(K&f z9jOeD&Zt!9WQ@sIMV6}yltl#@>cZZ`i%Q3q6=!6s63R;}GRrGURcCoJ9*q@XuFJ4O ztOzS+Dw!Ilj>$NOm0{(GQ^DJURi#8`sS3;0*=kj3Qe@ zC@jw^s_I@iT%DDpD(_v!0dkfHd5zdOtd`wx*$b;A{%IB#WpFTC|zMwu&Hd2U3buqO=CA%S@36IEH;xpW2H2i zgUubO9F`cN&R4}|l;;IhW*Ren8FmOejD5$NZ>>PF; ztH3T|m$1u7<|=j#yN=ypt$Q8QEMmT9W}*_lV-7L%nZ*~ebSwiKgM>1%EbJC`8_U6R zF*R=sGmn|YFiaCu&P3=m_kh#fL+laun3>JYVdnmi=5&hcRHhbqW*k$?!K~GV4*3E9 z0zK2fXc*o(>^*A52W%qt3Fi%uPUt-*qf9jt{Vi4HXOyceRSb_=$Sh!?BHBf(BOKsF zQglL6d{jFQcr9rL#>Ew5^3|C-n{X>DswmA=v6DPJGCDMXlejUj`&yjBMYtH3;8I+M z)3^a{h#N6Wn59fRvy55JtYB6$tC-cynzgtI&yMHBbHaP#ro1iauLaMJS<6V#fFHzc zVD=#!8pP~JX@{+w`^RE~aTlZy+?Dx;$S*Ai(5hL6SGTOa zxkt$C(190^Ck#X2B}FRR@pxX#Sv(2J55r?w>w38pv%_{k))K8l=xk{UK8kDUNIaF< z&FpE%M`L!(Ue>;^e6+)E+W{`xyu8lL*|?g^oP*~w2bhEHm>oWvNoV#l4oTTX`B`P7 zvx+h+3ea$lQWfTu=c2)#iFB=0mlfw{)WoZbOI2lviIiScSjHCExq(u=j9p}B3d(sc z=x-19w4K1G5_4UGOi(wt@EW{%fQ%GHx zS+V_q?qA_kxV#haiTEUZGV>#IlKF}Gna!}D;V=(x=P6d>^YI1vLVOXv82=hyf-hxG zGiR8y%sJ*fbAh?YT-s{tuoR=W<2!kZrT7l!%2Iq6bCo^rXyLP$ceNeghwo>uF?T+X zeEbmpJ*UXS_;>gb<~nnOxw#BK%Cp0NU~VDnxy_n64YodwpZ`am3&`d!F?W%b{lYdm zdC@oUTU?DdnFmYp+ss3*M$J90#{2jK<`MJsOO225=l>|}1*-8C^BC3mgmD;w+;(`D zy1b~=cECiki>Cj;-~2=NEs}lDJVUb2IkTgYv{E&uA}5DUbM9^dFo5$EOO`Nh9qIsl zAVe(%0_GJv-C02c37~n3b|3{Z=2zx7_M~%^26P8@JjHs@1M~!@zzmoJ3t$PXfHjbV zUcd&}GJi0CGJi3DGjEu;%sb{i^MU!ue1aGcV%U0M4;+9aH!6V(dKAD7^ak$0gJ%aZ z9Ae!dc+3q?2%d4T=McPvga{I*knl#Ga7#1T%DQA?F(3qUU5i}@VL%DOK?E2G27yR0 z7z|2LcD2Rz6CWROcF++$MbDr-DS99}XacNPW zey${4E&+R2;b-(kI7LS$Sr<2ba+;1TVoSS_vvgz$ySocnts~1=ytiMsFJ%|%$OdT! z!Kh&_?8bZnTi@GIul6!s4kPyK-nHHJx>T*Bo1_^;BFR4Nnz21Hbps95f@U;AKpm(D z4L}1J06`;Yf>?Km^?+DUh?zpn3}WUGvw)c8YS02&K^qtkz5)}#L@)_rRuJ=nSP{f( zAT}G~4G`>x;Ac)HPV7_<7CCdR&Yw`OnJ7`cKuU>;{kb0KEE6d;}SLN=z?(64n3 zm8Ti_Yr7cl*<*M+K=bTsuna5*E5J&y3akcez*>meK+G0m$Uf{L<^VBAh&e&bc{NxE z)`JaTBiIBsgDqey#9Sce3NZ!5+#uE)V(t*@12J#*pywj#e%_fSOsLkogF|edmv7Wj zaICB8p8zMh7XJt_kEP%zhk#u@3T{HIZ&wI@(LvzH4(O9;_y9cO@;-!^|5ET6V*S_^edLDE z!Ap+%0%8G6!7GUMXD{}#3jQ6uL+cUn2lx~G1^xzaz*~p~LM#Yk!4Mk&u@H!bt_1JF z2h0w9B6u8fVGvU@=@83uqNb0FT#efCF}^KpurFu0aPO@aj z2Dy$NO2l%xqVZISC8K$eh~sb>fo3;{|C!YcZNo4V8LWO4IcYWnzG-VUHD6K~6{{C`%W=Chi`9u+F4W2_3G6x`* zfhJlaj?>Qw)Z!WbYV%5>hHGsV2Y!|o{BcAr#8eQ=Mc|v5c9x?dAg}vUf`M4}Qlb%J zIc!+J1kHHNwVjX<$n_yeluQO%S`w2XHdbq|#8hG$T0lfs=qcf>;^E${|*<4E1^~@eSASN{CgnUj-BxZAPna0x7zR3D-4j zJ4^O=(tJzo;RXUSF2kk7UWkqRJYx|Dh!Z@;TH+vah&W7qM;sx(Cyo-wh#!dK5JQmF zL98BP4G_~n48a5;hG0T&uX!!;qi&T*oFdS-1+vX^+#J+`>=7*!A=U;lRyz}6GnuVp z$`i1m#2wB!??SA#(>U)V<3ys`e<-i+U+2<>ct*VBl=z%L<99s7zG^345w9UO0b-NC z7^dl;1e&$miN83*oX8pGTkJcCO+sG^n}W>k`8+;>OpuT9aXx_96o^fQ*tBJQK0b&q zgxGXu7sO_;uY)usU&^ETGGuAh!CK4X8=|xkN-qzVE6}>|pj@ZW4%6Xx=bLIxkl&Lt z!CCFtcf?!f2&$RAQ`FOtZ_Ur=DK;8J@#Xwpd>g(kyD(%Ldv3r{4aChMZV7Q~i1&iH zEyV31?g(*bh`U1Ejgu(g7xIhv#rzU}DZh+g&adEC@~imO{2Kl^el5R_U(avgYxoQw z@*DY0{APX&zm?y{AJ6}aKY>4yKZ!q?KZQS)KaD?~KZDQmXYyz9XY=Rq=kn+A=kphg zk`$lt`@%-_P_%HPJ{ z&fme`$=?NWcZhpH+zaA;AnpxuABg)xyf4K4A>I$-0qm^M$&nDxhj;2OAzlUXYKYfBd>q7UAzla3!c~8Eqt*_rc%G4GrHVMW+;2JZ@X|V>NxEjCp}zW z=9-SPTwD3!F09)+)=EyuDMDZ9zK*k+O^-;_>&O!wc`YaKdl!M1I?g(6EyD&n=ym3I zj>X1Ad9r&4>eul`C$fnv%w~{2=cA6Zg}oi)&VDt>{!0r4K*!pK>WS4OlREMauB_Nd zy|M&S9cLHE+0lh#q~q-7I2METS}f?naah9`PquNeepwbeiT$iciaYywuztIG=~xF@ z`4Bz81P(g#VXlsCL-fmX)p3rn#c}Sed6a%x9y-=hPKb%pZP`a|+qV-!4sbihy${QE0UtYA1b5^V8>(Tm+ zOW;`SnFKF3EJnYuWSz)GuCUcH`h|_saV{f0>w`8%N50All*j4|*($Z8$qPfjGe3unEK^EbyiIZPjxEgXkU8|le<4c9Mgr%vKM zCo#7RXRnU)kv%3p%RJj^kWGC%SNc)Nu%{;uRzGg-+{O0xk6H z2z}@;=vX9I-rpniyK!pW79|J zjUu5?N4DSue(xe6(Q&LePReNgq6~E$IkGzs_V8#uZz1fiW7%**4r%&A<~oiY$C=cH zBiC^pI8I`^zKp$&30-t77fwi?p)cgF<0v>zYZs2Uj?7}J#yFHA%$QDFka{kSsOtC>Dj4oAs` zcz=$f$rl!M6)6^$bS0DvE4mV@h2yv)xP~s}*>Q1>j#ZklL8$4PwNcpAmC!0|>q5{7 zCkQ8Yp$Ml4r*$gujJvx)R<9Y5#QW_2N5yApbn?p+C9WS_1CU(&BDp&uF0NziCFZO9-p zxRatIgpyqcKN&#|?3!aRIixEgn(R9G$#^oMYmQ;$@UDauQZuqEWi*-Al`w|P>`KTc zbGj1p$gy1sg=A4zLMd6+l~74mbr3YVcpo{AoXCB^8IZLglB_2iNDX$Kgk&SxL^gvV zWGmT5jwin&CqNv18PgDl5O0Eb3yPoOZ4mzo;u9f`f(FJAp9=Bm5N9Di3*vLQ5+{+9 z$tmPiavC|EoI$eWOmY@Eo18<=CFhazhmZ>(J`ds>Abt?yry>3f0ucl~AaH=d4+0d` zO@Ux61ho)MgkS*#>$-eAkxO(woJliKYGar`=Nf;Bjgl*L+(un&)Rpa}?ykpOtK&AO z8H9e0oYtvL^m1&}#9$ zpe+6^ikpz{AilUGZbE)UaTD?r#p51`e+}^^x;F~zIU5*s%zc!Q5}^nMMN$;R+abQJ zof1Q41Q;W>N-#8-0RxwDixkESe8B*eW)8yTUjQCg1D zBa7s=pJQ^AErsHl?RY9>&+LKtY7~>BoKS2EU&Agbax`_PytLsG$`gf4@b!A!J4L3N zz7%pU|0M`TDRod%gQ!SqFwcpK;-K8v3FTIZ?}hk24oYsn(oGu^qhb-BR2;-Nb>K;b zB_cqnB;FQkIEs?un^BY$-@-*n4f)p$`PVxE9Yv*cfR3ipAifRa+uNxOY7E48K>XX! z0Vx+VDu>F`0iouA*oh)TR6dFf;k#I?5-ax-s)7qhp>Px*9ckpEQ7A063?D>QQPn6K zh3|&=9uD+c1ach$Iln{)I+~X$2Bqhg$lbYZN)uf;%8-Agvw1Dlcpb!T9K;9o>g6Dw zLZJ;4u}_%uc##m;&u+=L!A(#jv;IPiG%p(FA%TfAYKLW!<`TZujL^A26yKk zh=0ed)4q_!PU>v`7HT^O?^X(7`#r>uwo^N(oe)0;@e^O*)lhq>16;O!DBy=S68E%I z2T{NeKh7NaXC&GY>n!^yb>iPqKS}+>q5dPpPjaZAMkt^8=VtQ6N$iV_1u;{Xml^J; z8&q`T4-}fF&ZE2+kVY1laiM90g3h|GP}g;OxW?(>6sL!Soc@oa$e?NFT?#E+)>6Mv z_o(~S1L`65hQ8F-|F57(^Lb)PE<=o`%zBMH;ll0(h+BI4kEC(N`Sqt)e#3cnEL^(Doy-Of*3>5#bK_ z5bZes5AHJ%&MdcDoJ?hJ`&7s3{ZJFo>(-6;|Xx_$N;qP-lt2y#g$x(6}8e>+Fg+45r|G^X1{ zKZuS)AcKHz7yT$Y34s9w#@hK!bVhW68}t}*wYWC+k6i84Wul9sOB`s15EyCaH_C-Bb`C7mt#Mf8Ac$vvbwV1hJ<4vBn+PJJBVAnf@}#BF2X zIieRFz}=BMK!-w(pfe;KzJG{$9KQemYX~u>!&l5FUx|f0Co#q0+p`m2GtMicqXej* z+V5fQ#3z;_gvAId(+-5ifriL{$xpm3+=JE-oJ&Bj&&Nx|J;mmz@nTc483g7KShR~R z#Fh}C|I77ES8OA;=d#&y09YXa#15S4TC?*StlSl152S_v-2@bSioG~3^n$=fs|B$y zj~4qOEj(gJE|zwd4aF`0ri)f_8>b5|2>R%BF%e-u>7UqNc-qhP z{O|#72f7q&FIB9ZPFxT{FdVbjp~`DZ`gjMlGid51ld=iP4tk ze^SPp4rQztZxC-p%Gk^)qi?4&0w7RA5Y8zh;)^o2bIRBOfq#cG28h4ql(Cz9%{>tG zLkn)*8!4l6dsuu(e1yaJu=qO&`a=-dF8*G86oMcKLbM)6{G<5Pzu|dWe1^j_7=i&h zJTD-OE+ULpHOiwo%&wsH)qmpq_qO2vAMwx!?Y(H57Nt$_=f$=7hWIuIW~%rWnjb+Z z2j*Q4%rLfRlcVWl@iQINPdTUu>T$Jp|En0qIsVJiPyA5_wFH*{3Bhxc2so%CJE0y5 z!7vDhb5JLLhFT&*P)o!R4DNtBR3bxAOK6D!_dqZNf+*b^K^8x$3;R@so(gkHilxBS8{!+LkSjroj@OCy{79$q3}MC4OiP2a?!~ zHdDVgIvj~4Su#R`9En8hNJe%7IvRo;2y!_<)n5SR9Ek)ulGF}BC4rnH zk*IJF?tx$wvtIi`aQ5j0Ghf0TkdPEe3L!{?AiZ5uEGdBim6D|cvr>ZG$3OPPCAIh< zNj(H(I6N~sFc}0MMBr^~)q&ZJ(k&=`tyLe)@sf$00j5eOaOSDv;F`?AmCefA98G6R zbe=$>^#pl(Tn@}dlK3_(e|u~sq!=VffM9FDxn3l7P##^{wkX-o}Zy~uVxyE^mN(id7-a>-b9}=|wU>}dyVg3tB z-$UtcUvVDR5EFK`>XGCrS6z>U7>Mpm1AO%vS1E;Xm5Ly!@4!_Wf)*Rgr7|haJrFcNpwYdNneq)BJGvn4F6E9< zNP9?oLIBZ`x^}6V)EuINb)Xd)>R@-d)b3v}liEuiILw+MXwhOOb>Y!cSI$l+Xfc!a zMrn7>PABNusnkpAqt%bpo6}Dl0!-@1>1RAEpJ-v)UmC21QyRpm`gy!^4EY;F{4$D00SO}&;Fuh$`AVrou1Aad)_VL4xq ztHpAjbUDKEKYX)ES9D;xM!Ht|4Z?CghvmXfEWd_eH3VxoFu4Qkx`2;#GY2LDZBYl9 z1Ek0eESK&;V4??t#T=OEg}}`01aqJCAP44tDQf-_2$r@>4@nP0&dZl@P4bDFS_%NYRJM{~m2m z7$mhkay#VFx_Cne)AKv~y+%t4DRLT8&S`v_BJa(`hZMT_kU>IcrT3+ebQ*ccY2=$P zE!D2aq%WjscjUjU$E4_tG#8hUe$;sj8O~{BeWyk?e)bl-J}X2fKnjrwA=uEN5Sc$( zHT>U4!DNOq6V!H@k<1u^O%QBumvxhMhXAQ=yLLL0naiyI#ZAcMvR<5NZ-ro+7Ezf! zkCr(gl;%y-nzqatrCm_^`)PWnEpwBhPZp$98CqCFumeFQ^Wv1clNC+3F!hsZ?=IxX z{5c@M)#D=5PLd6fg`%w+5QffCFO`Ksu;=rJo-9HZ#Z#=14U`R%Mal-t&`M}81ZeQ@ zhX9pyaD{BBELs*LiebWBKuA82TDcH@^joG*v=Io~FCM+{U*gdpD zou8GUDlbE`I*TdQo=4}ekhRL%WaDLD$tFN>3W7@zoe&0hAb9Wv=gG3ENCmPf5S(5r zL!R&q!`9EV)y(9Om<7RECIcs~k=F8B(8*FRrOUKVwm!|E zJGycZRg|Obyg5>osl6YvOtwL`k+rq+{EX~o+14+e-Uh+t4(})1$#om8=dS!)x3gr( z@^n3uKydX-&kkY95M1l*#}V1eP&^Vfzf+ILWXE;2X*i5eKyah8x}Uh}eum)Yzg4G} zUFfV%2EnZ_)m`GMyWLscRa70&ukMEI)|bxRhTv{zZNF%^>h3}C%fD5ZCVSdh9a@{* z`%>L=uDbi3)xF|+=c(7b-(+a-xYL0Cgy3Okb#J)Z-a_!`b8UU}Y$!>#xU)I|XC}I> zL>kb1bjp|}Ab7HrMvSNImDx@?v>27eGi313(H5Gf(bln+wv;x4;6+ERbT@RWSDUl* zP91GZTOxl)o6+X91w=>N!D|S9T}E5c*0dag-yk~EPN3jont>I2XpRY6H>b?bfp$S> zh-pXKi5s)OL+}R^vW#}66|@@!sE>a`@P;*>>#XtO(R3f$o3q<;b%Dw@E@@xdPiLp9cG?%6fTlSKf7%=6d~zgkqDL8*Q%mgMNu01}Eh2UT5=^7*o@Mj^ zI)rP=I|$x$O;OU}bOegHet_T;BzUMTPTf$!L+B`a=m^x9vhq^o=OFmVewyp)8AHcv zM_$JmLbojua~T~&$MIT{qZ4%LvmNq@oK(iVFp?{5xGoXw*V&vA^k{T1icX2wA?1`+~D2q8g2f?{pvU(|x6*7lAAr;z>J<^0YrFZ?0)GqFfV zWDYdV^8HLK)e(38xZ$$59yk@WhSz-!T}fBb)pQL#j;^Ka=z6*Vq66vZwgDl9gbezj z%Lar2Bn%;81PNpGB}7A>6AkHRx`l3~+jve4%4dSsL4*k;xH^7R?P^$Gf_WUQchJ zH$uV&5>Aj%e7<%?Z=rW^3f)R?qqjrC77})luwO>+q<7I@L&5~8ridz` z%BTvo|5rmzKtCxkg_=gqpk`9DskzjAY9X}^{iwiiB5%?IBtC!_oP8gzYsrFg6OD7voy zSp28>Z}D64d+|pJPlJLxw8T(ijBf1rkeH&Ni=||Mq*5|VvPQB;a!2w)@|Wa|@5b);CBs=xTkVbfR>&^lRxl>1OF}=>>F&{=W2~^a;8~ z{{mg2H4u$v7|%4GZ9La_pYa_N z$|T$*%cRX@pUDZ6b0!x|E}2|0xn^?D5iq|=H}*>=GNxD%x%r>%^l61&0Wpi z%-zkE<`L$D%miO1jRkA5 z(qgs6T8pg~2Q(H(EKXaTwK#9_+>&QWTRK|yvm9obY?)%2YB}06-ExfOOv^=<%Pm)0 zuC`ojxz6%i%OjR2EKgegY z46q5cQQAb<4AR&Pwu!Qdwu!Y-+l;j-uqm=Bu_?2uuxYSqv1zmU%4VX?WSjXm3vCwL zEU{T{v(aX=%~qR(HivDF*c`PvXLG^klFb#H2R1Kk-rBsk`Dn|tjkXy=nWK?H{&(*}k!TXZyic^T`g~GqdB{3GFC5 z2fJ`PwcSL!jdmC8-q`oF_p?v5A7!6zKgK@GzQDfHzS@4AeVu)SJ!9W!-)ukKezyHw z`}y`?+b^|WX1~Jz2mAZ>zuLdCe`o)}{*!~ifpic#NE~DiehzAf2@b5o5{Io0+a2~h zeD83=;he*5hu<9jaQLWk6gwI?8abLcnmU?0S~^-g_IB*&80Z+`nBbV~nBth~nBkb| zsB+A4EO4xIoacDZ@wnq{$NP@&o%l`yC(@~#la-U)$;Qdf$-&9p$~qQI!$((?KIbEzSBad#ZF6{_B&m3`sm!lS!3ty5BP^Rf^S$HHvQ( zyA*pA`xFNihZRQ@cNH%czbpP!{H^$)_~eGU0XK8EK)1neDmP7zo7!!xTY+1VTZvnl zTZLPdTa8<-TZ0>PTj=(+Tf5r|w^eRy+}62maNF#*&26XKZnu4I2iy+1U3YuaThQCB zcT(@1-u1ob_ukO^``&-Mi`;v;ySN9thqx=<2f7b-AL<_Kp5Q*reS~|e`)K#E?gj2e z?xpUl-M72%bpO_Uuls9_`$rF+2kyc5=;txeBhq7tN3=(i$25-_9y2}Wc%1aO;&IL6 zhR1EsZk{%tcAgHN&YojEt3Ahg)_H0?-*^eUNH39>)N6!SwpW$cIInsy#;eJz)$1#- zNnTUEmUu1mTIsdMYn|6duPt8Ny>@x+_PXE4uTMsw#eL3tZkUr^sDi!^V9e>`nC9t_nYN6*KdK}BEKbm z%luaOt@1nM_e)=1Ux&WoeN+3Y`xf>s>092nrf*$eO<&merT-}ZJpUqpO{sr{|2Y48 zf5yMjf2RLh|DFCv{g3;f^grc)*8hV4W&dmbPyC`G4rwt6xyR z^nT6#mi0T_?^eG@{hs!F(eG8iHvxD6KR_5D3XlZI0t^By18f591Dpcf0z3lx1o#BR z2UG+!2DAlC2$&QwJz!?Q?0~ret26;?19k@N4>%NXB;Z)U&jDuw&Ieo!xZEG>-=}|K z|55$(`q%f@^dH}UR{z!g*Y@Ape{cW&{SWm&+W&|CKlcBr|MkG$fdPR70>c6$0*3@f z2gU^^1gZi{11kcn18V~t0-3bR_6# z(8FLd*frQY*e|$WaR1=&;E3Qs!I{Cu!DYdf!8O5k!41I^gO>y^3tkz#CU{-&#^5c% z+kX(67yKaju_pLw@bdwp0nP)44k#MH4)}J!jREgN z%tQKygoG$V28Kk2#D|Ow85NQik`a;_q6#SusR|hvQXkS7(h@R0WJ1WQkP{)7LavA0 z3b_;VAmnk#(~##O??XO?NoB`8hcM?b*RXzJ1HoT zQv#(xNhu{tT4|*0rtGOSS6V51DeaVwN*AS@(nHxt>8tct_E!cgL(xwa3{nnJMl0i# ziOS*16y+#ox-wIltyC-Xl|{-@Wrea@S*uYtD50`h*`}PJoUELtWR{ zE0n91-zYaIH!HU(cPe))_bCr5zf&F!&j`;7&k4^9F9uL-XU*Mv8Qw}g)m zpBO$Re0uoI@Hyf0!xx1w311ezGJH+=y6}zRTf(=8?+V`&zCZj>_>u5q;U~g>3O^mL zITwC0{7U%s@LS<`!|#Vb3V#~@BK&pu@8N%izYYHo!HWP9f(R-?5S;f%HI& zfmQ?M18oOZ3~U_OJg{}(R|BsNd^GUMz-I$rY6gW2iXId@D1K1VpjCsm4caki*PuO- zRAl$ao{?semXSq~b&(B`Ok`8!g~+>+_aYxeJ{}w}c+lX%gQEt=3|=&N?cjBTHw@l9 z1Pn14Vl>2LNRJ`vA(ca_hm0FiKjhSq>qBl1xjp2UD9@;%r~y%-QQ=W@qLxRkj9MM_ zP1J{>qM?$Z8re|8p_xOAhn5a4A6hl^_|S_(FAu#s^hUIMbpPm}=mF7T(X*o4qnAgo zj9wG{E{2Q|#Ykf4n2eahnBthyn2MNVG3R40#$1lM7V8$^T3 ziH{TiO#D0XZQ_Tdn55LC(Mjn^nMvD|4ksN+I+}ERnE5cLVJ^cI!`z3#VN-@p8#ZIu ztYHs_{XXo^VSf*MH(WDxc*^k9;iHFV4BtBZ;PAu4j|@MSY?|zl?3C=1?3S!ao|HT# zd0H}?d_Vcub1-V*iMPBMy)FKBY&BU5Z1BQ;KU!eaeKC zNhwoOrlwNI@| zZBA`X9iKWe^+xKG)Mu$LQeTe>8x=b$epKS9;iJ}!+A(U^sNJLXjiyIijJ6srA8k9j zVszu^=FzRAzZ!jQ^rO*FMn4<t3aGW|?JK zW))@CWz}ajWHDKjv!-RSS+ld|X3fu9pS3${PuAY7{aHU|oy__v>r~eDtQ%Q3vu!S)&5h|gIQi)YoDp!?4<)(61^;ZR|f>Z-kLsikL7*(8Vv?@cDrOHvM zRby2Rs)?#es>!OUs)edWs>P}$s`aW3s*S46s{N`%sw1jns^h93RhLy)R998kRgYCq zR8LjURc}@ARPR+Ev(a{Iwltg0w#e34W?N;;v)!_LXS-*6W(Q>lXAj5@&5p^A&5p}X z$WG7B$R3lOm0glunq8J%k=>Zxl--=&n$2d<%$}7!CwqDJs_eDd>$5jzZ_eJIeIWZ_ z_TlVP*=MsaWM9s{nteU{arTq!r`gZ5-)6tdexLm@N1P+ck>=1j7CDwVRypz67D|(>JGI&cK{OIgvR-a*}gKa>nKqyYb|>yzu7tMSYA&yC0(m^&zUaPIKjvJdMPR^Z{%jV9?os+vfcSY{X+|{|;b9dzK%>6d^XzsDxA97FRUdp|k zdnNZ;?xWntxleMR<-W;%oBJ;JgIc5(t0iig+FWg+wp3fI6>2wiZ?%UyP#vTWR)=WR z(drm=tU6wurcPI9s58~Y>JoLSx?By_jp`Lsy?PZuD+o0qpR@9VtwycKz?^S;U3 zkhdvsU*3VdLwQHWipTaGYc|$mto7K8v4vxc$Ci$*7`uDyv9ZU;{y6sM{O?hmdql$)g^07zAZUga;@ZM$(@pWB@auUlsqqaRq|WOpCxZfWu=Ct#--g#dz6}$ zT9(Q+r8cGZrH-Y}rCy~zrF~2Lm4=l@mBy6Dl_r)BD@`sPSvtCOY-w?6S!rcyZD~U( zENv=XQuCy|OmrAde-YUIQdav|B=^v$U%YHvL0ntW%4rHGKVs!GS9N0 zvbeH@veYtlSzTE}SzFnJvN>f7%NCa{En8W(x=iy;+4{1*Wyi~Imfb14SN5>%N!jzV zS7pDI{aN;=?0vamxk-8V@}A{p<(B30a@%tIa;I{aaz(jMdEfGY^1$+l@|g1Y^2GAt z>go>#Z(<^3H%&S;XvAAMM z#m0)g6=y2WS6r&NT5+S|cEv9h4=Ns4JgazFNmL3esY-FBw9=r`xUySik4m#ji%P4? zfXbB0hRP+CM=GCG$*SC{qN>zYrBxMG)m7uFnyMyMX{J_9ubNpkyJ~LL{Hj$|>#8K>wYzFx)q$$JRiCOQ)yCD`t4*sds%@(ss-3G{tKF)HRgbS;Q@y47K=s+`^VK)1 zpHzRS{!}BWF|0AJ>0V=AV_74wv8nN_@vaG}iKrP=Go&WACcY-AW_V3@OA3I5-Kzz)@>=IwMXh_SXKlaQu-b^)$l9pdnA*77gxaLqF||3hd9?+#rL`5c z)wSbl=hW`5Jyv_N_Ehbe+KaVUYOmGasC`!Zvi5x)s1wvtbs9;Xab5R1(>n7y%esiV z>biM#?R6XL4%Z#2`>F0~-SfJab+79_)`NO}Jy|cUr|XUCP3mpyJ?g{j2h|U$kFJla zPpltapHe@nKD|D(zPi4)zP?^l59^!jTkFTyPpF?%XbrR==Zu zSN-n#z4iO+f2=>PsXteLvHn{9&H6j_zcdIMY#Tfp{2KZ-1U3w47}zklVQ524LtH~j zLr%lEhPsB9h8Ybj8df!IYxuTdZ^QnE?;5^uIM#5y;c~v-ZRB387jhYtC zc+CV2t68Y|TC-HMT(eTMTC-iVTeDAdQ1iX!2hER~pEOU~)W zNwlZTTMZOK3up~(pgnYguCO=sgx=5(_Jc7n9wx$JFd2@7qhSWjgxN3`=D{*p32R_2 zY=)EJG|0l)a2{L$7s0RLI=C5bgFE3~cmN)TN8p`CqS3Iid!uQid8541w$Z-PvC+5D zzcHe5Xk%<+LgTQ;QH`4P#>_@lV@_jnV}0Ya#u<$Z8do>&Y24R%pz&nmnZ|RC7aOlN z-e|ntc(?I&6`h&Zcjht~b4D z7Bown4VsOcyEj`l%bRVR?VBB&J(>fXW1HifM>gj+*EZKTPiUUnJiU2l^StH-&5N6t zG;eI)(!8g6U-OCPQ_W|Z&o^IbzSexR`F8Wm=JzdzEha5JTFhE3TjVXaEee%Yh8rT}!8s9py zHMh04wZ3&i>(tg6tutHawJvO3+`6Q7W9ydIJ+1p%PqdzDJ=1!=^-Alt)|;Bv+pRBK z-?tgInY8t2Gi$SKlegKnIkY*qDcaoIlx+jsBHMJA-wzpkw`(r#lo*FM1Pmebm zZ#v#$yw&(#<88+)#`}+t8XrA=`2VZX+~0Jn69A6fud`#BXZCU1$tA)th;6a%Gi*vO zgF%KRlWR>vE8cNG-}~h~=X}5CocEmb%6UbzBSn%LVHnD#*rd{yM(atVCbxDxEZg(+ z>@T0s|L}P}Mr@w3(sA81EXD#!2I}@riNXxL|x~d}UM{ zwV(w^1Fb<@kO|s>jvxzk0gr%3!7wlqj0U-2EO-Ju1tx;YU@DjnW`KEM0ayqYgO|Ws zunuelTL1(YFpvOSK?Gilfq#HEz*}H1I16sUy09T^44c6;m=4>(4A>QRhmXM_a2Om3 z$H4J$0-OY=z^SkhE`cR*Jw#B$QdkCe!*X~89)-u@DR>5+h5v+Aum;sfjZjn60;QqW zs4dDw?NCRQg$AO>(O@(b4MQW*7!=Dx9`Hfz?nD;XX6og6dsQY@DjWXzk=7{ z4R|v~m|%`2-ijmqCfPl`yZAn-OX`zGq$z1Z(nxF4mOM&& zlRhMe^d|$!pU7Y`lnf^$$!PKt6h8_^~-opz)-v_Bm}$I;jKuCzi!Jv#zW=>&dcN zU)G;J#s;zBY!u67W7$MDgFV9v+27cFwtzjyR+x#d$%dhaO{2H&}H~4K{%kT30qOPbfGDSPlL39#XqKkM$^bo%`<80Aa^b>={ zU&IJ8N{kozVwxxrGsQEaP%II};w7<4tPv$*gV-c?h-2cM_(FUoz7bX8s<=dYJJ~^Yll^6`94qtX3^_{{%K37ETqqaI)pD&wl1nKq>B@u*oN%j{$JGY6Ps z%n9ZsGvAzU&NQXznLErfbGNz2+;6^TmYW}#mF8))%B;4US?N}em1j+{@~x@Xbn97b zfmLKJv{qW{t=J~Zu#iP9VI{24deur{cPQ|Zre@m z_I5YBhuzceW%sfB*~9FK_7r=nU1%5Ci|nQLN_&%y?YNz=-?rbk&)d~@t$o+Nuj;D$ zs-bG7(p4Lkp?a!p)mP=H0cuc8jaGSToSLNa)pYf&dQL4?%T%#iuGXj$wLxuCuJTo= zl4_gUuJ)*XYQH+Hj;iD8Q*}Xoss5!dsVY^iep1)fP2E^G(=BvM{X6}8{YTwdch%WC zM-R{=^k|)@|EizV6ZCXFQ_t3O^a}m5Uae!V=$KxwnU>npT6@~prTU;gu0PVJ^cj6o zf2}X+%leA`USHR@^e?*BY2Y+>S~=-X8>gMq(aCbUINh8)r^MOm>~qSULr#Tr%sJ(J z?3{DXI~Sa*&ONt*+rn+@X1ZB!cel4Y&>iNEbf0jixYOMEF?X@M%q@18yQ|%`?mBm) zyV=!lsk_%b=pJ^jxwpMWUP~{->*PJ`&Gi;}OT9AhfLGyFdLMeHypO%ly^G%0-nZU& z-j&3|iMa`q*q=C@_$YBY@mb=VL{*|XaVzm3zmDI;Z|-OMJ^gGy#~p diff --git a/KisaniCal.xcodeproj/xcshareddata/xcschemes/KisaniCal.xcscheme b/KisaniCal.xcodeproj/xcshareddata/xcschemes/KisaniCal.xcscheme index 9db359c..675309e 100644 --- a/KisaniCal.xcodeproj/xcshareddata/xcschemes/KisaniCal.xcscheme +++ b/KisaniCal.xcodeproj/xcshareddata/xcschemes/KisaniCal.xcscheme @@ -1,11 +1,10 @@ + LastUpgradeVersion = "2620" + version = "1.3"> + buildImplicitDependencies = "YES"> + shouldUseLaunchSchemeArgsEnv = "YES"> - - - - - - diff --git a/KisaniCal/Models/ExerciseModels.swift b/KisaniCal/Models/ExerciseModels.swift index 9bdd888..51603d1 100644 --- a/KisaniCal/Models/ExerciseModels.swift +++ b/KisaniCal/Models/ExerciseModels.swift @@ -313,10 +313,32 @@ class WorkoutViewModel: ObservableObject { let today = iso.string(from: Date()) let last = UserDefaults.kisani.string(forKey: kLastActiveDay) guard last != today else { return } - if last != nil { clearAllDoneSets() } // skip the wipe on the very first launch + if last != nil { + clearAllDoneSets() // skip the wipe on the very first launch + applyScheduledProgramForToday() // follow the weekly schedule on a new day + } UserDefaults.kisani.set(today, forKey: kLastActiveDay) } + /// The program assigned to today in the weekly schedule (nil = rest day). + var todaysScheduledProgram: WorkoutProgram? { program(for: Date()) } + + /// True when a schedule exists but today has no program — a rest day. + var isRestDayToday: Bool { + let weekday = Calendar.current.component(.weekday, from: Date()) + return !schedule.isEmpty && schedule[weekday] == nil + } + + /// On a new day, make the active program match the day's schedule so the + /// Workout tab shows today's workout instead of yesterday's. Rest days leave + /// the active program untouched (the view shows a rest state instead). + private func applyScheduledProgramForToday() { + guard let scheduled = todaysScheduledProgram, scheduled.id != activeProgramId else { return } + activeProgramId = scheduled.id + activeSections = scheduled.sections + save() + } + /// Unchecks every set across all programs and clears the in-progress session. private func clearAllDoneSets() { for pi in programs.indices { diff --git a/KisaniCal/Views/WorkoutView.swift b/KisaniCal/Views/WorkoutView.swift index bdcb8a6..8214164 100644 --- a/KisaniCal/Views/WorkoutView.swift +++ b/KisaniCal/Views/WorkoutView.swift @@ -62,6 +62,7 @@ struct WorkoutView: View { @State private var showManage = false @State private var showAddSection = false @State private var isReordering = false + @State private var trainAnyway = false // override the rest-day state for today @ObservedObject private var tm = TutorialManager.shared private let restTick = Timer.publish(every: 1, on: .main, in: .common).autoconnect() @@ -70,6 +71,10 @@ struct WorkoutView: View { return f.string(from: Date()) } + /// Show the rest-day state when today has no scheduled program and the user + /// hasn't chosen to train anyway. + private var isRestState: Bool { vm.isRestDayToday && !trainAnyway } + var body: some View { ZStack(alignment: .bottomTrailing) { if isReordering { @@ -85,8 +90,8 @@ struct WorkoutView: View { HStack { VStack(alignment: .leading, spacing: 2) { HStack(spacing: 6) { - ProgramIcon(name: vm.workoutEmoji, size: 14, color: AppColors.accent) - Text(vm.workoutTitle) + ProgramIcon(name: isRestState ? "moon.zzz.fill" : vm.workoutEmoji, size: 14, color: AppColors.accent) + Text(isRestState ? "Rest Day" : vm.workoutTitle) .font(AppFonts.sans(15, weight: .semibold)) .foregroundColor(AppColors.text(cs)) } @@ -102,6 +107,15 @@ struct WorkoutView: View { .listRowInsets(EdgeInsets(top: 8, leading: 18, bottom: 4, trailing: 18)) .moveDisabled(true) + if isRestState { + // ── Rest Day ── + RestDayCard(onTrain: { withAnimation(KisaniSpring.snappy) { trainAnyway = true } }) + .listRowBackground(Color.clear) + .listRowSeparator(.hidden) + .listRowInsets(EdgeInsets(top: 16, leading: 14, bottom: 6, trailing: 14)) + .moveDisabled(true) + } else { + // ── Dot Grid Progress ── DotProgressCard(progress: vm.progress, done: vm.doneSets, total: vm.totalSets) .listRowBackground(Color.clear) @@ -200,6 +214,7 @@ struct WorkoutView: View { .listRowSeparator(.hidden) .listRowInsets(EdgeInsets(top: 4, leading: 14, bottom: 100, trailing: 14)) .moveDisabled(true) + } // end non-rest content } .listStyle(.plain) .scrollContentBackground(.hidden) @@ -537,6 +552,41 @@ struct DotProgressCard: View { } } +// MARK: - Rest Day Card +struct RestDayCard: View { + @Environment(\.colorScheme) private var cs + let onTrain: () -> Void + + var body: some View { + VStack(spacing: 12) { + Image(systemName: "moon.zzz.fill") + .font(.system(size: 30, weight: .light)) + .foregroundColor(AppColors.accent) + VStack(spacing: 4) { + Text("Rest Day") + .font(AppFonts.sans(17, weight: .bold)) + .foregroundColor(AppColors.text(cs)) + Text("No workout scheduled today. Recover and come back stronger.") + .font(AppFonts.sans(12)) + .foregroundColor(AppColors.text3(cs)) + .multilineTextAlignment(.center) + } + Button(action: onTrain) { + Text("Work out anyway") + .font(AppFonts.sans(13, weight: .semibold)) + .foregroundColor(AppColors.accent) + .padding(.horizontal, 16).padding(.vertical, 9) + .background(AppColors.accentSoft) + .clipShape(Capsule()) + } + .buttonStyle(PressButtonStyle(scale: 0.96)) + } + .frame(maxWidth: .infinity) + .padding(.vertical, 28).padding(.horizontal, 16) + .cardStyle() + } +} + // MARK: - Streak Banner struct StreakBannerView: View { @Environment(\.colorScheme) private var cs