From 868604b8486e21a701d46367af2cb0b3ec689e50 Mon Sep 17 00:00:00 2001 From: Mark Gregory Date: Tue, 8 Sep 2026 20:06:58 +0100 Subject: [PATCH] latest updates --- .gitignore | 5 + AppStore/README.txt | 12 + AppStore/Rsync Studio-AppIcon-1024.png | Bin 0 -> 161049 bytes Docs/AUDIT.md | 36 + Docs/COMMERCIAL_RELEASE_STAGE1.md | 88 ++ Docs/COMMERCIAL_RELEASE_STAGE2.md | 104 +++ Docs/RELEASE.md | 114 +++ Rsync Studio.xcodeproj/project.pbxproj | 390 +++++++++ .../contents.xcworkspacedata | 7 + .../AccentColor.colorset/Contents.json | 20 + .../AppIcon.appiconset/Contents.json | 68 ++ .../AppIcon.appiconset/appicon_128x128@1x.png | Bin 0 -> 13462 bytes .../AppIcon.appiconset/appicon_128x128@2x.png | Bin 0 -> 35707 bytes .../AppIcon.appiconset/appicon_16x16@1x.png | Bin 0 -> 596 bytes .../AppIcon.appiconset/appicon_16x16@2x.png | Bin 0 -> 1681 bytes .../AppIcon.appiconset/appicon_256x256@1x.png | Bin 0 -> 35707 bytes .../AppIcon.appiconset/appicon_256x256@2x.png | Bin 0 -> 88718 bytes .../AppIcon.appiconset/appicon_32x32@1x.png | Bin 0 -> 1681 bytes .../AppIcon.appiconset/appicon_32x32@2x.png | Bin 0 -> 4836 bytes .../AppIcon.appiconset/appicon_512x512@1x.png | Bin 0 -> 88718 bytes .../AppIcon.appiconset/appicon_512x512@2x.png | Bin 0 -> 161049 bytes Rsync Studio/Assets.xcassets/Contents.json | 6 + Rsync Studio/ContentView.swift | 233 ++++++ Rsync Studio/Models/SyncJob.swift | 110 +++ Rsync Studio/Models/SyncRun.swift | 150 ++++ Rsync Studio/Models/SyncSchedule.swift | 142 ++++ Rsync Studio/Resources/PrivacyInfo.xcprivacy | 23 + Rsync Studio/Resources/Rsync Studio Help.md | 575 +++++++++++++ Rsync Studio/Rsync StudioApp.swift | 78 ++ .../Services/BackgroundSyncCoordinator.swift | 370 +++++++++ Rsync Studio/Services/FileWatchService.swift | 94 +++ .../Services/RsyncCommandBuilder.swift | 304 +++++++ Rsync Studio/Services/RsyncLocator.swift | 29 + Rsync Studio/Services/RsyncRunner.swift | 260 ++++++ Rsync Studio/SettingsView.swift | 304 +++++++ Rsync Studio/Utilities/FilePicker.swift | 21 + Rsync Studio/Utilities/KeychainStore.swift | 55 ++ .../Views/Components/FlowLayout.swift | 36 + Rsync Studio/Views/Components/PathField.swift | 22 + .../Views/Components/SplashView.swift | 49 ++ .../Views/Components/StatusBadge.swift | 25 + Rsync Studio/Views/HelpView.swift | 220 +++++ Rsync Studio/Views/Jobs/JobDetailView.swift | 772 ++++++++++++++++++ Rsync Studio/Views/Jobs/JobEditorView.swift | 362 ++++++++ Rsync Studio/Views/Jobs/JobListView.swift | 523 ++++++++++++ Rsync Studio/Views/Runs/RunHistoryView.swift | 199 +++++ Rsync Studio/Views/Runs/RunLogView.swift | 47 ++ Rsync Studio/Views/ScheduleCalendarView.swift | 220 +++++ Scripts/release-preflight.sh | 37 + Scripts/release.sh | 206 +++++ Scripts/security-check.sh | 31 + Scripts/verify-release-config.sh | 51 ++ Scripts/verify-signed-app.sh | 44 + 53 files changed, 6442 insertions(+) create mode 100644 .gitignore create mode 100644 AppStore/README.txt create mode 100644 AppStore/Rsync Studio-AppIcon-1024.png create mode 100644 Docs/AUDIT.md create mode 100644 Docs/COMMERCIAL_RELEASE_STAGE1.md create mode 100644 Docs/COMMERCIAL_RELEASE_STAGE2.md create mode 100644 Docs/RELEASE.md create mode 100644 Rsync Studio.xcodeproj/project.pbxproj create mode 100644 Rsync Studio.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Rsync Studio/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Rsync Studio/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_128x128@1x.png create mode 100644 Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_128x128@2x.png create mode 100644 Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_16x16@1x.png create mode 100644 Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_16x16@2x.png create mode 100644 Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_256x256@1x.png create mode 100644 Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_256x256@2x.png create mode 100644 Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_32x32@1x.png create mode 100644 Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_32x32@2x.png create mode 100644 Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_512x512@1x.png create mode 100644 Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_512x512@2x.png create mode 100644 Rsync Studio/Assets.xcassets/Contents.json create mode 100644 Rsync Studio/ContentView.swift create mode 100644 Rsync Studio/Models/SyncJob.swift create mode 100644 Rsync Studio/Models/SyncRun.swift create mode 100644 Rsync Studio/Models/SyncSchedule.swift create mode 100644 Rsync Studio/Resources/PrivacyInfo.xcprivacy create mode 100644 Rsync Studio/Resources/Rsync Studio Help.md create mode 100644 Rsync Studio/Rsync StudioApp.swift create mode 100644 Rsync Studio/Services/BackgroundSyncCoordinator.swift create mode 100644 Rsync Studio/Services/FileWatchService.swift create mode 100644 Rsync Studio/Services/RsyncCommandBuilder.swift create mode 100644 Rsync Studio/Services/RsyncLocator.swift create mode 100644 Rsync Studio/Services/RsyncRunner.swift create mode 100644 Rsync Studio/SettingsView.swift create mode 100644 Rsync Studio/Utilities/FilePicker.swift create mode 100644 Rsync Studio/Utilities/KeychainStore.swift create mode 100644 Rsync Studio/Views/Components/FlowLayout.swift create mode 100644 Rsync Studio/Views/Components/PathField.swift create mode 100644 Rsync Studio/Views/Components/SplashView.swift create mode 100644 Rsync Studio/Views/Components/StatusBadge.swift create mode 100644 Rsync Studio/Views/HelpView.swift create mode 100644 Rsync Studio/Views/Jobs/JobDetailView.swift create mode 100644 Rsync Studio/Views/Jobs/JobEditorView.swift create mode 100644 Rsync Studio/Views/Jobs/JobListView.swift create mode 100644 Rsync Studio/Views/Runs/RunHistoryView.swift create mode 100644 Rsync Studio/Views/Runs/RunLogView.swift create mode 100644 Rsync Studio/Views/ScheduleCalendarView.swift create mode 100755 Scripts/release-preflight.sh create mode 100755 Scripts/release.sh create mode 100755 Scripts/security-check.sh create mode 100755 Scripts/verify-release-config.sh create mode 100755 Scripts/verify-signed-app.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..452d03b --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +build/ +DerivedData/ +*.xcuserstate +xcuserdata/ diff --git a/AppStore/README.txt b/AppStore/README.txt new file mode 100644 index 0000000..8343e42 --- /dev/null +++ b/AppStore/README.txt @@ -0,0 +1,12 @@ +Rsync Studio — App Store release assets + +Included: +- Rsync Studio-AppIcon-1024.png — 1024×1024 marketing icon master, opaque PNG. +- Xcode Assets.xcassets/AppIcon.appiconset — all required macOS icon raster sizes. +- AccentColor.colorset — native system accent used throughout the UI. + +Before App Store submission: +- Set your Apple Development/Distribution team in Xcode Signing & Capabilities. +- Review the bundle identifier and version/build number. +- Archive with the Release scheme and validate the archive in Xcode Organizer. +- Capture App Store screenshots from the final signed build on your target macOS version. diff --git a/AppStore/Rsync Studio-AppIcon-1024.png b/AppStore/Rsync Studio-AppIcon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..f11c1f35e8561fa5214e179065c83a5f9856b66a GIT binary patch literal 161049 zcmY&i9sL`nU1!)2?&IX`4tyLh>iJi2I>6_ z!UBPG)K$!07XCm@w+2l6(i6ss1`^wp3XnONnctt&k$g8^6O;EDi(kiNm0uYm5rkH+5=osd&$*VyaZ$;s=$?B92O2*nF9%x;4C4gl($NIMUy`99o zw_O5MkT=WETlx@U(|m{Dy~A8R(P1Rhkpfz9W7r)xVWC}f1O?*i@M~o+E3)K$W9N2v zZ@J}7DUi5sQ4075fzC>SNddog%(0__UoKL)mJB?$Um(ClNUf!SHZ`iIR5U@sr3%ou zUYD|;D3ntQH>X@#y{j4#^YytTyB$dDN#2w5o_X*JxcoHt<|Ka`OpFA(Jsw#0u-b@0 z_vDTVcsu?7XSkLE?w_O32RrDDZk0ejM}5swe{7TyyWrb-sOwe(9NhCkjtF(5L$ZUo z8!$y2p@}=4@oo%K?G|Cym;b<$N9n=z5Z3z9Dgar3~=3`}Zgu z{3;{gbeNVJU}I_Yvv7Ap{1w`DH$rQJHjwXI-#kz`@8du9IX!;v;r)2^32HC-Zc-GB z_3*Y8|3ls&0_W7uUia7CuYRqzyiLHhB||m&`v^je5zvJQR=5g4^HEd-*sB6?R9Hc4wI~U}UjZ6m-RC5F99N6x*h$0HksH?jlrxB7Fv_uhRd=Rn(_%XccQ3?fm=L zB8rq2V+FrxoCnA;sRO-#e!`(z`!VQhOYfp86X7rx)MB3|Yw=9Bi`q4Ff^$N*{%SU( zD^WIyjl@aSG=~}w=^q3f!p(-G0EZ?Y=0EM>0KJ3(&X{T?f+G*<3y8I4L5T*>s|2hx zptg`h%gdOvu1tKF+KiCY(csfWbZ3Aw5j#6#%T)#LDZH4EHM(1wX{n&>{^VI?01qdT z1U26^-tm)pNRbSnI{Z81?yqBaJA90{!lYq;Q&{9;sqO!Gi*z#?2IZf#U0T*K<-hXU z@UQ8iM13u1h-=Xg@M)n+V*VhxD}u>LDw1{w>CoWSyuOY3z8}w*^9MQKb}_#EHe}{O zlJZ^i@z9>~nkA!g$8lg#q?PT4HQbKG zI$C#sQ4tQkmcU;6CDPTScpQBmA4-A*IQsV35ELKZfPZDVu75;v*=lMk(juE~lm&B* zO@x$(LQ>&xmzeM=g+i{q-5y0uVxr`S(jzMyF-ZRy`ALvE;9~V}g|eeW+Wp!De_+kE zPp@0#{;dqC+4m5>oZKzAR7E{R%!OQ$T|71)z0}V(>84y&K!6p#>X&xS*VK~k4y{Y7UyI}w} zIPK6}l4FJMS8t@rU6N^pNb|Hcqlz^%E>S9tx%kaISdWbu$38fFDdvlGx}spFz@V7& zY(LygPA2-f$9Q)oA8HB?seH}&w_>_I_&0nTrDK!=)DW-AATF~`2_hN*)>jcVV3~SZ z`%YVc?q&AFg=&3aS9lbZ8ktiW^J8jZ)Q4yjJSN$|)YVNsNZH+V6Y8$u%5ly1q&@Pz z?wnbdhyoQ#?OJ>_>g*{G)p4WKFdl3H_57O@4XWvL5I5%V3pb&E4<|qov^yrsUdDDG z!l36r7)pU$&zv%d4esyAJbfYx)STvRnp~myfh<%8d1}AcFLe2*svPp9=zY>iyxfqN zTJpQEEPX8YHS)G{u*J+I_++CHYQ{|XZ=5A7 z11&+F$5t&c)=GV{%_zG!8A^TM&hAibSV=sf9yBi^7=Y9jBW_E8pyR4JyN-;rA#LdOnu&xjkjIaRpPiZ;zfO3?({5 z0-s81#m9M`{+f-O##G)DpHfVmaSK%X5&XAJg2BiG_;uDipaFwg$DrSSu!%&wgm$bJ zr#N&Oc4S&G{pekzK(c50tRln=8OL$z*XrBVh#nR!Yuocty6>KUCbc1zzC@3XO?o(iCthfOU1L>*wZ=>C+`RQZ8}@r+pE6F+Xn z+{^Mb-1Yh6zDns*n9kSFxvPE1G4(*kCBVbZCSyZjo*k!`0%=#9hUur^9IJr5e?J*4 zizEPrP@Bma!lHi{Ks#o|=*^y2B z@z$r2q%RiJ$^k3WNX3Ue>Q4P&L|?%v3$%c@KbW)tpLJ+f-ik`)JC{!lTdR$v&Y132o>Jri$G>;c+j4MM zIkLpY8vr4FsHF1SQxF_uAWi<^dptTk9)Iu>1b&KwQoOs&aE&|01*Pi ze7Cm60Uk(H+(ik#RY`!di$@>chT!8Clc-F(C38MeHU*23b?~N@J>b+PuMMXe~_H1Sk zEy~Y@%CDMvap}zL2nXkJYDkp*tpB>`1=s#8t2hRf?XkV~p+esGoe5wd{U$k)JUQ9W zRHK0$i;mDKt!tUED%*!2^Hste4PMtZP6l=%RaYObc_?bJp0bIiqAjd~{F}fMa-UES zVUU*pg?12S4_aJ`t34NyO{Gy)239=Ww>2a-5AP#HiIF9-H{3a%JE_My%o+W^vkWS} zfvJ(FAuX0$0_qhhv6mr`rbijZIZ3#dtf~sDg0+FV0cw#l_3X`#_`gxhr_be=0~wP( zm>lh|K_A%f2Ec&VO_HUcpY`tU;e&v!sz{;o$tQ0EgmH{qAUk;OS`1qVh)*#rGQV7WS1W1m&rp(ST zxAp~3xEz8)M`)d5a(Cce^kn&|NnTXKF!i75TP&!)?@(kbxxSCcXu~WcHp3p`2{8k6 z6tOv{s2UJoMZ_!+#F}EW$%1N<`UkIOV*l$JbS!-9aqCZIfT6|WRa)oj%)L{6G4r6+ z(U{UXm(I5Y^YboU0N-8cx|Gmom_Mnu{83}MC=NWooA^HD-lR^_?m3= zDWkFM%p3I`8$#=N((uUsIl{N#_7zN9Gs+Z@rtay*fLHf>e;c2no$R&R5mFbEB2}0a z8MMuMNr!;!6*;v9k|J}`My2_rZOeSL{MnJ6q0|3C`ky2KE=!|;pEd4uO@tmhao|KS*sQQNZ95qb5Zdsuo-jYXE<+vhE z@o0;wF-#TmIuzuEn%dY+5}>{!d|*(DjecB&R}p@&G@>bW;?tO$jKbJPm?o%fB;ps_ zI00s6!GPIQ7^k-g+iLuQRM8)apAmKK$}X~8QAdEG!&+H+McQN_|Bc+8>gYSkXHRdg z`c9#tg4=g6Gj~0eEghU-|PO!7ERU%QX_&;nx;UYyV!+w_n ztN&#(zH;S1mM>Eb|4~&69P>w^85H$+n|J1qvxnj#HS{uT#gm|V7S!YVp2GO!eSR0tbPwQSr=x(+9>)6Jcn^t0v$P|f~=PO}c&c;G~ zPH^@~KR9Y0$nu{r&uGC^M98ZdJM0s>e4*=7NDQVi7lpgtw$6jC&SmXF^P3GD{5OTU zAs*MloQq|fHaXkY#5*J_wQFK)PZre5jf%$axbO1Q1Qm*C0YXG2RE|0!jK;pNL3cD* zQ;P}d@o8oDbA`xHciu-K>Kx@c-1?V-MP3;<2u|hg788bGqFSM@7T+coZ4v#qH3#Va zo#R(9>;#w&NukpD7|ssY?HqSTc$oovFeov~6u$Lw+fzhT_a_r4zmOtM`a@@tN)%-G zhB&{w-}d{agQ4)EYNF3n;c8vW8RbSQdNoLzk>geE6e;UsC+8=)ZdyjbfOi@5H9gf% z5?Pcbqc?rc(&kTv+B&7F(+u~>qxA*7%pL|5dy>#Hu1yl!!tt+J22+1K^W`_C`=F-;Fqv^kQ>X_D613Z=2N^JEXqWfi;F6H=7=b%g6bt%r`0FIe}4@KAS% zE4ruzGtA`B7cq|2g7|UxY)*qTffO^oCJyJgi8~L-mmWqMWqj{6v@s&Wsn_9vZZ2ML z>s)q3Wf44mEwp7S3jM-}YzjyvD`vrju@;6pf*7fDVuk`}qr^Cd^AOo|Ku{QjV}{4Q z4Lh9GiY?g>%v^3&$!G#^uy!70Q%bI{zW_QU2RHJ59c&=IGV{|{CaUu^?x+PP`Y$xc z-^d{IJ$C{&q^M9Uv0PY+pH*Hf+rMy+`COQ&o$WV8sDQ_akGtY*S?TxTV0!y(e`Js* z#MJY%v6wi~clkil5m09tkdlPh(*_F`(o8ZXU^F^(>vxgU$lSgAs^?sUk=G3 z8F{_GG9+TBpHv{C3OwBCCXtW67NSoXaHNd`Sv>8CYGY9*Gxh)M{{pXu*(yMWeE-h# z1p2T}PX6+HoJcl=7r!t3DFUjif2%&gkc8F~``>F*I2A*#=!Y92AmRwoDcnkB;LVFr zOWT-dHd&RI``^oOA$bP+FUh1|2AtiKbUt$2O(*4dWIc3RWzpyyM|OE9tVT5Amykyc zBZ}cAI&?dRMZ5Ms>SL-(6c9arduKUS#v!n7q*x@VK4AS(qgUQj= z$$P=&f!XnuvrKLhxlfA#sasX?AMr}G7|2|V4gD$dXFY>q0#?$acp^ApOj{I7@atk^ zqw5Y%*gPEC^>^qF!01{!kLq zh!_xy)Wr(I`L=BIkr8&$4@8N9gz^z2@83OZF<4I{3{F4Tz)WY)NY5%O0LOo8L?3k( zMfe>=2`KP10lmWS!-+ht?fBzQf@q=>z3CfJV(|PjJyqxh&1*Tal`}-A?4U<$>lf4& zga`u!B?r!E;`x)%=N0d)O{;D3^mr_;;O7PNioIwI!NS8$tsI`tZhZWCB2wdQPb>M^gb{fsDnKRU|K6GF z%R9pT7A-$--@&25fdmMOY)9I7bfwgN$F`BG>WRk<7t>(nG2Ge^6Y)8uFQS*{oaQ~($%0pM|Epa7T#%&6IM-B3J=w zuzw99AK?l0?83Pw!t3F9!}r6Am9F}!&TI5ox0<6=ROy=Dl2-f~}|ng2L!ixf@P9{J^w8GDZx2W@nMNizbDG4OV(G8XP zPt;6O%ZL4mr%&tgmYC<*<3@Y$XUK(oU5aEX&yr%Z*8U^B*$XfcF*|1poUePy%p`)Nqi%AeVjx7pRedyPLVX zXnz#g{Gw4gV>fM+)RJl1CvmzRmJ8+I3&)-O8T@+8Dg}bnRal zs|&4D;kJ%ZPfK9OCn|@~NPFNhz2aNGDr{#R4v`%a;qEj zYpoFK`LWv15sOAyS9TJymdI>H?psR^Hb+r(HHf2-3=x9ZBKdqNy_SX`R?S=^0|Hje4uLK9k1Ec^+yruWght z<3Mn7dZfiMah~+N#L#2DJiNJ~dG^-%dfTr`w#AXMA9pprOUoHI?dN+%or1ncTifbw z&xEQ(>FUnag*{ZoGSmRHIO!h8SEUy>2UcLx?ak-2s%k=%_|7TM)8x71=j<81$CBO- zfkK%$5oZSm7M2UOdvut3_lWciuN-K_{~z$dz8emM*qZVq&;8P$gQ#gSEdvMXnpg+b zD^?%VBM7O-i1;v{q} z-bKH4&l?c`o88tulHD=O(z7s9O< zbwO(CodjiX?c@{Nk9wWO#HJjDCu7e24PCe#BEyM$A5F8{nKsLenvIjx`S%)YJEYI< za@jvub*96+HXQRN-Oj4ww~}C%@0#qQxs_>yi z<0XTF5(x|5(yHKLT*jZt5}d1aM3KgTORaFijl-(x>&FX`f@wcSm+JL&0*V?Zu5n5M zTKC~7+S=C{kx~Z)5+R1Z?>UyCVq(0?H66S5L6THKpYZ4?p0#g$@0Odf+Mg0DjR;Fn zwC-a}==^o#aDEQ~$#szQ|8n=@bk!5Sv)MwFgk_5#Xd8=8KGz!v7RI1W%*Jj{1$Zp| zhcZmvX72En4cGRH*3E!>iB%49qQSad3fh`RP;cKtu>w_$i>l6aMr6~ShRtOaI}8To z=W={;d{^`B_}V*JnMwX*A83R%4Y#Tc$oC)6%1<=ocIJvQC?aAa?3l!J0JWDpo<5tQ z`n-&jTwM-e=`FO(?e&n|Stp}O{>P|zw4Tvl{y!VDZot~4LZtH?=wEj`!$>vSBg5O+ z?Ql@?Fle~3w%`k(^$n$j@6=X^s4FS*{k$qH(%5I!SGViULddy25IqmvzS;IB<#Q&; zq5Apq!AsW(Uu34Q=cuuTh9Hp;HQ|uZ=Y+e@!J?$iPN$pfGG<@z3J79vZYYsC z-%J8WE(jbW-(xZZgMcyaG(p%c{B5*PPSR7+i!i$+?_e5%FoYM&?dy36x4ta7{d+$O z;=yl*p}xjq{%Zt>-!|Szzj$(Q<=6N~op`9}Q&G6Zmq%1w8zu}uDPV%|j6%k23J)u@ z)=uN&kTq9@zYv!jSGd>VX39i7{J7%!Pgd}m@GLg-bJyzFjn5}DTSI`LW;!PRwh6DrawtT_xt=(`c1URh)0}*WGS;EJ^ zq3n!2_S+)hO@bzyS6-@*J6CPiy{5`c)y*7=UC6(63gwF1kxw<3UGb3-$#oNsadMo! zueg9OV(g>)Qe`@nWLxB*hl>p~4|@q4PN{BN@(TP+FF5-+3G4^;(+e&?sH2 zMDy%Mj5FNYRR4HpBaZw9ue~&c_oYOiAW}5(F9|Dr6@ym9xV9t;T@z;W;Dx5yWbgR> z?~R%HvVn1%rE8b@W;ASF;QpS0G1Ko>-UibCIt~qe3j9n}&0Ub<^gk@;pRRN|w5KxM zsSL`p^X+|wqenvn*sb1mUr3iFR_7Dp53E*H>N4lCIL+xK;=X&V%jo?pBx5IAj04pV zv^0R2AMCXrezFg~G^;Xrs4Ki*3Namx9FfH!<50)QD@}m=?{W>g7XgEg-w?wglrM$9 zlo^JEsiu$|gm0EBo;R4)t6ZvO6gB-Oeg3(9LNy-!!Zb*K>5;w~pPB`mSxmOBC|CbA zWH3xtL(}-}oXn2vTTdyM`VXCDstbB|?*=m9gwzVXE2e6%#hG)Lzt>DwV7-Qmlr$`26fSdMT6DJGa0&n1U zL4!G^!1qb^f<6```-aOXJp4Vn|Mt@B5oHX!&T1Q7swJYpTAT9lah1x4&k@mY)-$+8 zC3H;ZA;uXz!i*a{63-NZ8ehm8w|Te@)LXu4cE5=@O2EUp1BWg|c0CjSq z#q?>&G%9KyLV*ySjJPa?#3M01SvbM6%~LxwEbVf$1NlCIajL2Tr!aI(H1l6yzQeky&vO3!x_D00wjO@e%W-N zG~*7RnUI<0;IFufWtTKof}yg*`oxDOmv=0JFzf(kgS(;z;Qd91ULV;JO&FF@xbA%p z-}WzE1V+-JM~Vtk16-gVaz{}*CRd`LccxpmSbGQ~3N^1P0P@tfG&bC&fMn2)eMlF+ zv?yhiiLwn#rY2WZpIMJ^=#IXBvAGwkWySf#M=&Gj;5EwYsR1}w zG2C;9!-EQ)&h>@V;P;B7xyb}KgvgSMry02^>6kyJc4AB=U_{!OlHVa=Lk>;Y-}ClA zy&w>2@3b>0vkB~Bi6l61e_|@7{**D2yU5K~LSKo^(rCDD6dRQ#t!f!QWft$ZUl5m} zxw3qP*-`z*q-YYFgyO#~!>(Ef4t{ZC zA|urv=$3h2nmI-ef6#G=DJuatvB=o*1FwavS3Y%)05g{io-Ab4GcOwLiS=naQ`zQ6c>OuzlDCCd86n`&^iOy8 ztRjaZ|AWB*G2$Qjg`Bcq6sK}T)rnnIcgIx#98Rf}{i{f_|DMZwSe#&eMUWIe$0^9 zt#b*vLYOA@cyZ(&W8GC4lcu;|w1YAmMinMXIw06|TSyW1D`QcCNK;!ePMW`%5>+I}+b{5O&5G5DiJiAi=vx6<~t1#*n8Q4kkqD z9lvXZLAPVjh9B<*e2a*u!a1BD6qriqib%%j$NH=2WfB{))E0GE0@?V_>>ob%f5Ap% z{Ccj6?k`cIu$tj$?H>Y=N-wOwf=+?_l(TDnj+z3fCc)(7zwW`e+T zMHbCIrVQW{22M%i|8avu+y7eUWqe=#svMyFWvafy5sZs6ibbcwl@MFM_8HJ+a(9qw zmvYhwC2$?v#E(aij1upFT5h0p&j4S8QPO!ZU9cGgYj4!O*=ZLZ9n2BoV|SP~H}Rfz zMcK*H?|!*?IMbG*G9*3uAjyfJgpvX$# z-N4#{N9i0EaN1V1^hD}pY$`_?DDKYD04j+wh1x6Q#Ecz5p$-W_Y~i6Q0hka)WA0Ld=hu$yRPvT{64?M8ghrM+r5>iKse z>Wa2Bk-anODD44a9JsT5{Mj3%_-D#Ihk@&{xqRqw4*QS&M2^-6R{OEOzeQS>ULQ9^ zKFAY~jBn&s{5lnP?ZGsiiF4ntM$^UfYu|(aat3cP;!5hioWtg`w`CBVV{D;s4Jh_B zDNJJUt6LQQwiwN=`~`!K%tNFfQiLE*mPGgvc z$K;qaV93iVqxD0Oh^-{+XD)*z4B5$t>pui~#22 zcm(tOW6VVNimc73OB>>F-0-^5Q&stw5PU8;EBcz@Cev8{B7pn1g4#RPh$f7$AnZI4 z3&hr=wB%;PcHE`kV>qm}bIJfQ*cWt9>3NH{bWJUP{YpwFC%Lqs;0YlPT>V|v!?wi<}*7IY>^FhOi8l42_6c@#3W8GXtpCjoh5I;0VK2q zV@R}B{n&S}GH~=7Bl7Fi(3a|`>9x^y+>pHL2Uv?1mlxjg6O;2$vEbduWo|mL^m)t( z6RG;(pnS)(GP{0<__mzTGEI)a5hR3N;DY5O?DXS-F)^xBLq5^OL=FZKymqnYT?JFK zQi+eT7tB<_Ll$mG;Sgp7*m<-RqGF^#fFj9ft5Sv7Mq4gR z>!Axuf19a+k#qP_Gz2|PM(N!Is3%Md^H(1YITZ1KIwVpd=Ae8&GNOZ=SZnj8AMZv+ zNwZyR)kw>ey3udBe7|cKLQ8=IGY8RCinl(&N_DP=Vn2VrX4I9UrNs8At;Z>{D)Yuo z4hGznrQOu$!9g`aZW*^x^N>6iOeR4%eS}`_d;|zk6^;zTx5o`5#V;{PEDG(a2C=Pq z95$&6ke+NUACxE8fk-rkeBbR)2xGQ#iJZ!DEQCSvxMAuZ^p3xJ+Qai`@x22SNF&#ns^?rx=E^NgMhxF!|BCrk7@o9xV~eVhwysk#i4KN0{M~9r#oBE%e#YkULcnx_PkKb zTk&OJ(ICs|0(;IAyX%gP;Ck}*aINqQjkxIKCz#@&j1e{y%&pv$=yoiSJ&&A}Zq;;r z$IXeg=LYi;AzX<|BB-y9!xDJD@SKqZCqK$Tp=RA&nWf^ZHf+N5xzSzL^?X7 zAcmKc$%nYqoyzST$Wt2ev9EW%4FB>*iT+&3l9tOYS6eVLyy-*)tHknZnv-C&7jnu#@Q0=f5poq!YA1G zt`S`c9|rEh=X7cABP7;O6ApGm(zvERRmXhu8yvfa2Ggf_8&H2IqcR|ci<^dbq_3n- zZm8xM(38R^WPfC5hvpLCsE3*c7GJNn-s4-}_uecDsm=4RQphoY$(gQGd$_D28CpDWsxRS$EXzGoJRykgv`U9d*6tuhN_dA@ z*UoGsZPh;x%d%jdm`_)4y8(1>Dem|0?=8h6Q(k!59cds`?3?$xfDRn23eM zunk{v!etS5`2Pvg^hmT|r@tUFo%SOh>g$v59de!F(eSMdovh6KP)vDselAZmm_4fk zDSBM=xgF}Hezq&Mz$|*%tR#x0NP-O%w3?G;8Kn^Wdfg&kznp#5``yxM4XN`~^o5(P zsR${b7&Sb?U>04`+#<&DO~N@q+a0H$u2h#>xCFN1f_RW&(VkS-BbP0dL-4fma#O+1 zH(wKDB7gFUD&TStGd2V2Au#CQ83N;Z?u#Fn9XaA~(Q5sC5|oAbH_CY-I8=Q_<8FHa z`LgTJyST9jiU$no=+u-H&atoT6!5_~zd-y}&NTe6x#N6l+L$p~`_bgjdReFOST0ur zu8gpBw9!%sBgY49)h}`ZoD-~z3Rc{CcZo?^36jcz;deWXrCSBHYXmSTm#o1q9O6QX zA8@}MShxcU<3xZpHYgS0cGcH#=u}?&ncdLb3)fJVSoA9c(j_0j-O#J-vWH);=R14S z>qy-lD2Q%(beVyUpcKe8hGQu*(?6w~g31QD2WH9jHhp-D0=;A)p`W91h3*W4I zKS^3fDGT3PXQ0R}i~6AnddR;|w-e?iA%ZWas1gbH!u#=XYv^|xxxi5(mVboJ)DKC? zTq(NLOC317w&9{R0-O~Ttsqe8^jFYJqk|=bdgC9Wg@8~YMEMb50;JwG6#}BHc0+BA zi_F=LGJc$Gvd?z4<+>+lkoDuf(>Ge5%16POG%yIQ63-};1P^8i(z9bjjcfGs_s*XS z;b}Qt7AeM{Q~d*$9rU%$pQ=BO{dsq!%;-&p!+>n`8jZ?C;k`03Q11uVA#>#?U2DYN z(fOrEiuioo-7kA-Cr;gy?rR8&C$)I;oHAw!+RI_IFdbUgY;dUaKWTFhv>}%RG-&}F zH`FCWsNu&#FTZWsRII?j7du)6C1Hyejv!C+o`^|sW$E!};Mq$kdnFzJ zSS))%(9bnmf#k5qzVG|8nG&&*+UP(|Z~M1GpRQYX0N@A z;ozzN5-Q+-EObVc#Gx~&K0F~sv3qVm&?G^!xAL%G<#<@kV(V9MMy$E!5u;S%Y<{~9 zcZE59S{0MyIOB#vHg9Ay*>5H1A=a5Lu1`NuX!TiY;q*(x9&k}7a7euuF&zS(eXa3j z!e%EvD!Y@GEUUA|vPGN$?jsKizaepp`x3RQY*p6xkUu=N>p{Y5qt+(}J)XOc^h)^Wy~Z5H8Fj84w_t! z66@gG*9Vs0@o>_Bj$buNHsm(W!-$t1i}U@vm%KczV@0|oWTe@5b7DZ z*5vJVGFlJb5RHLcwmdp2GEs9TfBIDtLKt>)aQRGgv;9Kybc*CzFf{yX$FVXn`j6NZ z69egRIRrR#XX|ojT!>NyxD1W>#4Pj`>(g{8c!4z*-B%rM+*qIz7?_a&$(2C9GW!{7 zobra@HT~jCL1fSugP~!;#3=4y?Y-LqrNZ4(NLzgY743SAN9#d!K5L4S5$T4^ zkvF6LIWqxb)m+(GU$TA5F>!cSq-9k+kkzeE^-kFCfy4Yn6Y=+{SKB>@j66+grGXXH$R_5C;c`HrENF*4QFv4xAVlJbKc8{x@Ah5%MEDG5$5%pu zYWqU*w1!Y#+w=Nkshz>027t1?lAede6Sl3e@cHsQ?$@xF%5&Axc&LUi?81drxb^#w zf6eJDtfMDB=2jyxRuUXlAN4KZ8)7bkm8LWLm9^STh05%L9e*9SryVpKzBB0 zaL%G?cN!VD`(VJmBTZoRKUv=oLTt6@+=RgGV$fFRSr|I{^((-IzW`hki6(>FStiSV zLguDd9H;i#5?Ov(BprdKQC#5)q|ULl-TtUn0hq&N`9g}HatNF~V<7X`aiBcs|8;?F zjGKn*ujRj=uGsI-*nH*tGx5j1Hf)^^|K2kOC~JMiK2IrEcG8#eG#np-kC_VtA=97w z86zDFs27y(3}|V=$ixRQ++VRCv-n1_87n9ZsuL63k8wy+C(7_BsB zos0gpcXccM{+f#CUwa=L!tzflM_`{C?&l!e+$?{URwvM=RzMJDcG#$cKCk@flS!|; z4Q|h0@wQH8xjc07tw}pCB!&+^-L4ED6^x0ww4o)#sWYS?qt_e~Q^uDkPB}R&T-)2O zM3zU|7khVsxi&gD!K9KY0{Ka_BHU zfc&6~xx}BYsPOP^(k#1&3=aOdm%4`tV&6#D^~Ek;Rj{}J0!bN=K$tBaVS?vz!5P@I zSUvPaVa74*2nWt+$(~D5`++h{QW+?ou#20-8sYiiHu}4*duJ_rQR& zH6R8pTabpnq9s8EDFaM!aO;`fmtZGS!sW?9kA*Z@3-7mYc9J`MAo^4G?=TTxfTi8t!%Ic2~ss~~=E0(zPX6lQ`rWe@0z1|iwszB9GMyBhnUgeWn! zctevEgMOdBB6O>Vk6|E}<>l$odc4SVHOOp6>kgVa7G31!YR;R(n31*{QB)z{{e~R_ zloBF>afMIP>vvu9`xcBoH~s2s-;Np^=E_s}bC z?D!Ja4S}4nxS8-lK5auF4RV~L4#l{!2_KF<-N-carCVXy4|E((k#5rsqnn)d=7et} zjKd`}nocmUXLP693QiWF0+`U&eR=XTYON^|-F7rZpbT7!{=z6X3JQG?O*#psz>Iqd zhKL&c{$V)z*(XgBok|_VDJNRtqYoJ6YwYU>x4nF%%A)U@h9hU69Q8|;zHs-zn_(rzspIWW&>J(^pdJ`3 zYXC*CYD0_z4RPb2 zC%HsGmhnwruyLNq*ZJ@B$EX%8;7&A-aLz2H3_7pQT<^7RuG(> z%upo{$9DMAHQHq&`!O;a|=_K$j<1c zGP7!mI2Ml#s?L*n2qPV1Ov94dquS4CPad@3!9Saa3Stb0E}(@lGUd@f+}nC^a>Q1{ ziv%T7B=m3{Vm|#7z7=sF!iu^ox^`Dr=kGZaoz+nWHf@&6Q}IS?qQ`>G{nkvs53@KR z9_o29j2hF0?>=!v%>J3&rM6h%Esqu@7kyS%S@S}Ol};Ti%J7+3|U&SZ4 zUZLen!Mk4}ToR;h7%~14@;(W-VpQ3E^6GVTJD!@b(;a!u@5DUQ9v( z#MmPm^x@;BhG!*3c$UIs@cS}jhK{SRL2&{c1H|r!3JjUS9%V;yGiRE1OMH)%7TB> z)jb_NT4<93(VenNz5ZWjlIBsZ5QJ^2GSVRATZmyGD7_qt7se=$qIV9V-u!iT{)$O6 z4EY$BI&F8PwZ_P^7Wc5&_cbM@srSf5JFgf6& zp>|>+G!#1iu|8Pdg}OzKrIEr0*O@Lj$}L?6<)hN@N&176q>$3=G|DNC40Bv3K>fdY zS>ubm{5DjnlfYO`G!Q-Gb=dClEkSX>_%-utsWb{SFuR*<-)y{H6oYJXkOt`{<%^<9 z2@W?MR=-P{a(t&oRFqWx7#8neDa$Sykj`xe43DoR!N2)(Fy<8{wMr!sy>&`hg`JTb z55-a2${+@{_0!8^YM3&Z+d3&i$2$CU`a3Z6pdir*eDtH==mMsp^3R{lBJrlgZuS7) zH~oS#F12P2vrW+_$p^A(57Q`SVOZ*HI>hygy{cOZ@Esp`J^l-2b6kCky?du8GZO?pMf`a&99eX+tJ+^BNj^n+ExjwSeL>-ocv(Sf; z&*3!{*yuXNoL5|De%SOA=rS9A!x8=R^X zD<^3FgU!W~_uRA5p1Tkeq0Zc8DSO)$=FWD;S(bi9*){k?w_^w}NGmN%lpM4PB1zOP zHag^h^MB$d`o0C+xti&jqb!TV1V2DPly!+@N+`@!U%1^O(o+`2#j}+w^8LbklJnnC z$R4gQI~80#Kk8M`tmw&_h+@-R%L4sMv0{`LNaH#pmdSNJ7i#l;^t%PAO>@9 z>acs#ciNUdAk;1GolZn^S-QSh+M#FJ+{}+(0DO(pznoA zisfBhdA)OmT-CeZ&jMfRhDx{pvo!W-eHlljGhM?q)0i)T0}!@QG*N8?S; zJ>>o(N>)_01Wxmc&A=e=dv zdN>@OOM0WI+Y@{?Al7YJ`nVQJ~9VAPB-evjlf9f zTkUN}L_D>ry;>9X+>yKM^t42zA^(n1$(sZ&;)>zbpQcOjUKEN_USz0CQd7g*{bWCs z%&HJUNEjkb`3vq5q1BLNkUH(5&=JmhEOPN=PFoxcnhn@8f^8zgHzoi7P18=J;_am! zT{Cb9=hYutg+EFPM595(p6?yIgE%qgU;iwUd`3<}3YM(H*_hZW^!X7VWEl0R;2ooF zA{Z}pJ@F$}zWTTY|7ix~lb`xY^V7dNP%4PWB7xC*k%p)*c7*7{m>4{#JTG6fWDtOv z9}+9Kh8<|JCGrH`pFew4NWR>N`qnhED`RqW*;}iwkS7R$y*V;R=}O=O+-PKnqwppY zfjE$!_YedW)Z*wwxR+tnTn($mPSwJaC3Nv(t$F1(dPc1mj@oXs(`Xge^?@Ri(#-iM5Uw_&+A0i&W z*R;|G=crbn` z_+lX{2{BB1GTAQqnUmQc00$w~&$Ec1zlj2`ltv*Tt?+-65XK1#%qxi^5a2dvsy28N zbaNF(&c*I%Vd>IX%5R5-=oTS#8^W!yA`!NtAo@Or?M<^Rz;uI--WSPEr5>DrbEF^V zO*e=zZAjAKIo7BlF3fZjy@t>sr^1b$d%OW`Gu{I*GvTjRJGG{bJJT!~#d8Xpp)H-# zh&?eg@h**gQ)nPPOu7qSrYt=W*jop+9`dGwjGSMsHD?dQU?c?s=CAfiUmsoei? zS6fwf;zE@6=PT!%CPrkURt&Oe(}I$P_;U5eB?i zrN84NC_~7o^xt?onk@@fmit)s3~jOiJ@Ru)cYm5}0w6@A@06#dZ!;M%cUk>1UQp_= zaS$Wwgj7!!F%f8T-QXpjxAa0B7Bo%@y(-c#8<_|Txjk# zzr!F)Ua9tTYh!+b^WtqSR~Gn-8C3MhruT5TqL7u0I=G;OOYec15B2j>#j%;8Dswv|L`}t9(#3U=$*m>Ri=*+nMe#0 zlSZ>dQ{aAP|IHx_Re|@Px)A^t0lNL}|qmdm0hw<(cz&`-=XlI;JGxQgxw2G=QHc3+s_X{R@`L4;^b}fKvTTTUd+N_W6x?0kanSod~4hk~=}y z8qqry(>2fVka@tux6F@F2Ac9&k<}q%QR3~1=r8Qo6To045=Nw!GKP1s@nqzrMU9<9 zW`<*mwCDUnXM>dxP7DuGZA2K*4|zAyfU>VQ#p8b=n3FunT7IGk0n@DY<);ynd2j|x83_E|^CFFz zd8-|gXq;JQ4AWXy`eYpaV7?nh(FtlQEdTuhz=XmvLDTd_r)a*+P39oL03prx*Zsxloa1x-7{4`LXV7Ri{J#lMG+SVL zq&KMM`Kwf|*I_=W7)v?t?}L4^~d)F?xzWRIeeMz&~lS`Njx#yIOW&NLU2 zG}9Q({_ps;(Owl8Xm9ltF*M>sm5-h0tR^x&p5iy5veFJX)ziKgYtqN-Fmi~uwDFpn zUG>*3^kvp)Df)uds$!@4svo>&rZ8?dZo|uZybb!aBLlaDa9Vbipb)v5kC=2^O;XegOS)<2mc}w zbI&$s(5jQ0zMe2_e9)P|8avVE_-&BDkT{o@>lk zKGQv~z9x$;4V?&SKBxSeH6`?(Ketx@M>N|2KOx!reEM%;xzjD_$q#s6EmLH^-KVN} z)>rY#W2Gk!Tfh4JFB%oE_vpKDa}8KpkQbEM4O^$~4Ow{ptojf7ia?ijKerNmkbC~j z88C6oNH7xXYmmpA5q3)RpV@{nV^0?s-mvYP>HKg9wT?vo%~kyE2}AF@;h4QXke;25 z`6~kWCN1PVx7_iya>$4rU?CO)nn~?J?ZWgSJ(9dtsu^ds{ka{c0Ed@C^#Yg)v23-I z4uWsV_&cD=$~z7U7}PC#mH=f8{pr)l^U(@$tmW*OCH6CM%7!Q9#O3XdDpi zDQE{k(2IXnP}IkM!8Atk0I1JNnDWP^5$uKPsA#=fOn9ru(3(ppkB)d~toVtKG!*qX zmxN5Il18#_o`2CT0=d%Gc~8^Ar!cGDz|T$Z(Douu=Qm%FtFQK%xVq0;lWv|k7lRBV zksRv2oE!UHWXG5uvGL}_{m;CZp8~ZyIrVjkH`=r|kMvl8&hmf&l^-)+gqqkpj~^O^ zKRFxV-c1EY_DHAqN`0co`Rxq6w5|3N88~@OQacyhPDB(3kFVL6r@EKgW>P1H z_eMj%BJRexPYoX%a2|ymn@7**l~I4g^B$j;cR?7pLfDVw{#!7XU3wh(uAz;QG9d1x z%$Lcw6n`4Jqxf7ujuadl^+<#zu#iAW-=*K*+98atFMBjXA6yKn%qQ{%e4zG0ldaE8 z_9#-od(>~9E4*F#o-I_JYYcGI#+QVmT>fbl+d&tpAzUP_C+av-P-EP)%C^lzj)|yh?bO#Ej$pXCC|!kU zke977an|TqckY_+ngA&XLyb7OtCGEnfU*222u(@6A#8FSYS?z4QKEHn~I|#wg zSwHQLGxhE;u&E9c;2-4(WROL!&c4Q~X2$9V(1s+=rVGeet94rVy_4(z7y%qR#GxgK z0vZuL2{TjvXEV7Z$VDt=MS}_5;&~f6@NC}RvqZRt5tE=js8Y5KPOrD!3e7uo_ z{Ccr}SC0ii+Z4yjfHHW9OuUm22Cb2Af!%hwrA?FiOV&M>}Z?&HhFK-{Pn=c(@SKR49-mR?VD- z08B5xENUU2CJ9nv#`M|jbVp&3Q+>P)ncRu%?Swjh{h%(iYTbGQ7*d}*2UBf1*jUmqEa8nk{KZC^oe1gxp?P9leW zZv_<=BgDJ4fQ0h zzfitE(2*t>IyI0`2nu5?QCv}wG9qFmk3>5D^rsf`nDk_@e=8mFK;Iu$zqIglF_|)* z!|NqHfHR=D+>;=-X#Us8VXIG7M8s-KfINWPiXY-A-$shwvRJTY^*noE|0uVNEjr?d&W&mGdbA(@jwm=cP;OEo@<5 z+Wt#q)>w#W9@}(Dm-JNWD5N4X2~~-Upw&dTz1_#HV4&?j=}hRyr)lDp&%wfPP#+6T z!jaFP1+-^tPtIL@5C)t@AK(po^(5Oi4joe^-Cm(fx}HiXGMNNjjJl|=I0?<>^|)Ym zqE$q>%v-xx>`o>EL{K;F%$fww-1&$AB21NSGlF?fg4EI|;3E~z3AIcPC)JH*jE{3l zprFha@mIDZecksEY-du=NMBOboWf<5j7;F{xMi+uyqkknJ2fl9ZgYqCf zpQ&M+Km_xxl*+Jex{BF6DF5a%zMJ8eD%jKj-%OAAxkQjSn?MZLaapE33Ws={+Ic#r zYr{r{Fvc|WM>i=&zd7+_D09N1nqiTnibYHff4K@h-sdU;OhN2zCh=; z;P|e4-$B5AB<_1{E*uq&&(GiC;Nr5bH{K?-El`k%Bq2MrdC!*qi;z@Q{?4*$#Y*;2 zX$b$F;MKgGtnDqpH!4NNgVH+cI!ja|PQg7^84po}X>6g*9X855La4)g~!3SI1~Ce)r-RXk~I`Gfu^#(uONa-QN7+}NOI zBIlm)EBOfpJy^+h_P{n#jQr@(uK3?2g8h>ep2YVknr#I{L>m!t(S=aK&%=?mGQ!q0 zP!zRNmLX{N*N8fD==SJxRq=R@+1`#^M|y3lWt``B8zNo02LEBmG8r8ls{5Op1xWUm z2h{YzP|=Kx^R2Gww}IzK!H0$%rU}WNBI?5QtDK$$Z7fbfnc-y{|iVAy%;>b*U*rxCElnAL+7Un==ujTQpxC$qfs6mf)r!e3iIMQ~Tr8Vj76 z!l$LFihr9C!~0q6enqv>MkBv?mia&<_ZyLnlmfyIW*?=FTkZS)d=Q32`{oc|O6fIK z+~MtGy}D7tcuN!mY!rW0tiDcs5th(cOU>+y;4=q0d0yFr?L4s+?7>fj+RLk*ta_wy zT$~gF)FSR_Zcne+?ZNe1HebSNl~Cq`QZ3FH;5Z1VlLc`11`0ww&`g6c;G)?Zgb3~h z_tGK|AzWCt1p?AWL>$aT%pc}K7_&YCx9WG&F2EIyv^iw434h)tzF=7TYE9ZkQ0^*HKZf|gsp-r!GzH1xi8P$2@)nq2kum(dxVJXr?QyQu*t_pwc59R{x=C^(wIq-^>Y?6B$#+!UNpYnwk5m*Mw!Hy z(a&+)&F+OI)y%)7JXB5;gyM#psPlg(fmb~4<2KBYQDHk0v>RTMhaFvUPD=*I+E-v!LQ7)0!t*w z16F{>^2*=Cdj490kuT{Uwym3{u6d8D=q^+5c5i~|4}aDm^<bYK*<{ZdMfls3(=pJM{ z3C5wyC>*mSoj4@^UY>P;Rp-&vuV}5GB(fm-wj@iTL`6(p*9__sg~^zJh~0*wGl!8* z)d<*q7rsGHZ&IE^zp$ZqI_Gz(z&BbAeQ)^5+%*U>2M_j4(c?4e3fkEOAXlszwax$l z_oPug>l&ksc)5yQI}tdyvWS#CBbMxUK%xOqOvJ4>`jJ9?3lDw$gqtzK&e2{z^kBl5 z6W(yDT7(+#viF8*`x}=~=NM&Vr}Dw6&O#pP>_U1Ev4w^;l}$k zhGJjWYU(pU)zY75d8RPk#%s59N%Pncix zuZrw$Wxg{)bR23<3@w9K+ulFUPepbFH|i8rhY+-)21;wlEBvpD5v=Yyo*%`Sc1$f3 z@{`wsI&l{&ofhwlyMYXoZ3CTPZ(EIE%c4)*GP=&5rFV9n7*bWgDFRw4WEAOeQ+u8| zO}x&!$!#R{(rPhyS>p(1oy4+eZ@Q1}upd(`l+ZmfLz5`<;HfwyW~$JSpHOLaF<1d5 zuk=9OWAU_f*|aoTi%a&ceoa@&&&;nbc66s0B%Zn9*XGF#({9w$)SLKF@9qlSv|3pU z9C@#*jprJr{;Q*Z&4t-=!O=HpOqNxdS4Vg%Lu1t>A=g*6{kZ=%E|+)x-qzmx70Oc| zinKv(-frf_nU5lM#u8H5_GU4``}I89RxMi=yRqLx1YVS11cL{)q5fWD*;6$G013?cr+<0+a_|?Wo zTnNbRzJRRD=#X>zO5d@O)eQ?VYgY{NcZ2$-*XVbVBgiNJN?Gh*@FU|HY{Riv#fuJ0 zx0#SN$sf2Z)*?a0a-jjSp<>@KbK&a3vR4_UmJQ2F6ehF0=i=Mp_mzE!a1oBsT2QY_ z8fd@A>r{l&T!3$J^;?P!m>{&o&NRWQ!yBGHoRLJ83He(sHUt$uNg;dYt;?!hspp|C z_Y0@V5eID^>3-Ar-S!WFxFsIA(EMfAJbU1d=v2O!-M)CU&8VgG+KYC4%PcqEBWxJ& z#s{`qf|)KIovMC=&j5VR5D>EM3Y76$Gs=F6wu9B;eJe&=(~YfpbKY|47GCa{t+<#Rd3R~-+R`;gBDo!!+d{>RgWPMNA~{r%beox zg+J8JO*Lv1)WtkEla|WVi1COaA4b{pg%#zGT$0`7^vo}Go?Mp3^dbG1-v&3QyGF1P z<U3mE+XANqL0le|xUT$S6JYoy1%G*cm&u!CYQ8w*5HR^#uRmiMr!Ju_&55OlLOQx3`) zv!yz8TgFsoK%>O~e`)oLg2L>aboizAES_r^9)fVhe$i?bv~S8*DSV~fmj4L)$r~GA z;Wh9fJ8_Wbvw2~)qE(~7)I?@bt!IWv`1Lq*R=RGHSIqz^#kw@wgs4MYz6)v>D}IHM zeI2j3TdcPd82tq#{IM>N#phum=~skmvOkVV(X~Eo2x#YYDkr@5>%v3FWLe+kX*qQF z0z=*eur;^xvge|^7_|0Jh(&9I1g70ZTyzD5KZByK(xhL^0O6acV!vm>?M$$N=1e9s98lQ2xs8cDJMH#a>lu{dQxZ%|JdZOAYgZ1jduEv##f{^Q`fY2|r5mkU#~guF zbo7#`J1m;n+Wj%9khgPG`HWXUK(G*HkW0W`vre-7lUDz)()$>!N`r<|7T0HO>?^Nx zXF3Xv8V!5Hurt2y2D*InZYt!PSFZZ<$GD$WwykSWg~-bZJ$m^)=TF4>0H>C@ z?)XHKy_r(|ttvQJK2vi`zjlwqwV(fM?zAyIP|fe~z0ZCtJ(~zawloJki7F5+%9BG0 z#UpJ~eggSrP}yba;;<=l%}J~z(~CPT8~oBRLqo;vgU{?i&LMb7drXjWM_9FOhR|&4=n+&aH3L+qXLmQi{XmBy)2O}a}UKUNHQ=D3Zk)(%Yh_psuPL?KH z^r|Ldcz0|@D$z(CfH;my4bh4?A;3sP|1m#pOJE{H3H@1JNo9pkwV|Rmv#M0tZeCGu2k6((M(%TZ*Mbgc1^6*ud?w)22gtao#+YdNz54L+$PNMaelaBb9i8#YY39hUe>u@uE?HtwH#Xf6yZk3HN1@bwqZ6Y z)pLMaWZz$|-L0lm*eITqX;aq4kiTWw&L|U5^}Lem-mEnI4@~@H!q3_J ziCBf{gX3wCX#k*J8Rg^hdDJ2G>PJTr>RGT6OdD-rgcCsvjvO!%51zM+luKsk3e`xs zy30J{T)DfJsZaQWT(yEh5VK3WW2kYiMQow_zg!H3(H=blYnuk-_LBi*fW&n+nEJM; zqE&BCsHveLg|7X((Ei=`TzS@y_9lsx<7RPH0YWtx9;Q51P69c^&x{Q(r?7-;TQkt{ z0Sv~Nn2cfj3ngnGOqOx1a~Q*r`^DOUQMrQ4@%IY-u|8GCgit|N%44t2iEs69=;dA} z@bNWfn^e@m_CkVaQ$OzJreq7z?r3wcq62Xwxe$|H2z;Ay&$S8}#0$3R`!MKky84h55T?feTj)P zSvouG9~IDVW!)bwbeu}-CDx!dqJA6Fa&`9Ujc#Ng{pZQY2QXK>-Z092R5AWBr0gY* z7b7w$Q?s(HVzHuNl@aiov!0d6MY?asz?rpU>$OKvmuJ7i5jCeT#o6-^vyo_Ky!xnKA!K8X8oZsPME-=jJC zTLt__2~0XXG7hf0`1pOP*1ZPI=!`1Tzj=6XWYBq|x{rqB~ z{Erd9f%PS7_=-2>vy;!Es}T`E@x7o-4pk!1ea0RjPOU(hS=dzTM-Y}Z0_E7N`ZsCUiZw8BjN7+$=dGUYwe z3N@=TioRsR{(b-%HoYVL;Y9yzUmu}{wlby9U80Atr13U(CB%G<5LZ10qO$Tg<7xr z0UnLQ-cIel&lI{WuUPF8L@F3D73hO1;-f;3_+?$=C4wlSh3Ah9-zh(Dn=*+baeY_} z1iPX?t2BzGM|j}av>vBzU>4TsGkXQz7w1`DV?p^lu)Tk3&?YMR9x*o53GUFP?|V&J4SKtvk0W;Za~?N4&fZ)&)Ew|wZ5oM{duJA zcA8kG9k_z)eN4yqiZHF0Y5pYHA+Yj=)rQdTkvFUU?tT_A9jM6CvHQ*R%CEF-Qp20< zj+8fLM_$v_@@L_3YU>FnUqnp5RcY1vW2PGhtsW(k%bFLPjzUh`SzdGALHd#w4@NC? zUI%8v1KSzr*nGTrKW-8LddSD;vGF7`+iFc+V@I(h)^MQ#fP3;+lV7rQ1!jEV@pvcH z{-5(HMgUt}KE8(J`3g!ASJY%Dh@*W5B=au07o&tJv|!#HNh`gG(pE-62(rVFmcJMp z!M>-P$0Nb6G|N9aO$vDg#4eYjBBJ!Viln*pN72Htzw=%s&D=^a*;~H0-q%weI2~60 zi*Rv!xMfc;NU`3OUKF>Efe*5@^j)o?-YjF_HyvW6s@eZ_>G{|E^2An#+F&7H?wlz4 zVia^lu~27te&do&AF8EILOh5SVAM6%b}+y|^$G;w)g#L@{a*SMGhHvr4ltl2KJfg- zb+$*TUwUY`%%pJB!`~-|!~v1*V2UgNlZO^6s9l1oIko(s_({sfayrTm(qp$TKJQlq z`m1uBF+eeMbIUf}1Fv(R@CmW6*`4sYp+ZW^_jbKPHTRaKqN$-u6PuBqj6Gpj9Cy4E zUIVExVY!Ah)ovlXn^BOAzkPzPT*{j(ew_jpN7mv`nlaS@f$6!W;w2X3SRJ-9rUXwr z&xt(z+6ok;4Ev513=GwcB?w@@L!R%FJnz37ULv}5?XtJ{u3JVUs2OxSYt;PZl8iwD zN5JohylGR2KJ6p72;Nz@9T+kzfVKLUH!VHY=xU9XS;q1WKqaa87VZ5cW^Fd>tfhOn znQKO4o++2EsD}_JBZ7mr%G5ix-X!kfa9~>cn?Yqh!7;JLYUO<~YD*<=Ofv`+O6{088(j!wLL`g3o%rltEgUX&nw4*Ehn0T|I`0`S_60In%~ zk$M3y`2LvmgRQ9tt@Ft;lstcENa5(v6ATrBc}}ryVEq&xC>JqN<4T2(N230EeBSP9 z2ggd&i#Ax(!84T{+~z@lhp(TCyOTGv>Sa{G5XsN>r5PBNA0J2bsevZlIv_c;m)?dS8XrmP$!PrM?^hs8})q zzI!V*Dd}dG0yp?znZ9U7oie{4vH_4?HrtrQ$jMlwb)6ZbigbfhXXZlFtiJ*Vq`#epz)R%Zq2M{ur z9*bd5rDH*Y>4h(U3SXP;C8}&_$QGH=5N8jTvF^7L#C@v2SkRwU*E1U%S=3JU%?3DT`{Jx}t^gD~F5w zSX8?n_C8fIj>kVldsYhj(=lO$Fs0L;#sL~Di^qJB<(zK4^8N1vzVI@)Qm-zIyIxk_ zoTNC`muRcPNj&gfKvNrju|ZxhVj!i0YB>#EeP41iXNlk@4}@s(vZYP@eK(+;#K2Tz zUhT&i3lyoLT(=57nkI5cWj3FXV8y9aJD7Zh9f{H05D$c3)M)DDhux8F8`BV;vABw zJvX|6XDKy{$Xro*1>00GS%{@oR@>P$qH7DhZoCU+ABUUfuMs?8r-pS|PO=a6%P zN>wiPeTudpG(63RuvH@&TOG9X=`o=TGv$ds2Ah@!?6QiPpqc5+CsdM)Sj*(;Ym(nb zd2>Eo0}3~DeZzJCIY$Vw7;Jn(7xv|lPrjF;PsDIwM2MaQfnfa2Dnfu_c(|CW0uX=Z zi{u%*5!&}uaAEgm4C1)COI~1*WLiL5Sr?bX5w?MT34Ey))9kjxOs$M_N*0r7bk0=$ zg7?5<0>|0!hD;7sYBYS2_^egdAVG##<85Y@m`xzde zLT)>fEhY5q=fv&EX=S;~>(6TQ{Mq&(X}JYT6^l&XlEodznTR5n3Nx9jai_%|koiK+ zMV-_F?<}w|HHZX5mvbZAbuzhL=1&@72p^xGMn!-eDlYiZVwM2w@6yBkgc(vfKiR=w z1q~u+{br;%Y5TbHnf)4$7u#Eb901sM*@V3w`(P zrPP54got=sZFshL4y}L3UiADD8rH!{?=AdSJnR4v zvnvd4fBsyi{EK9!t4aGh*pYKzakxY@$H(RqcVYS|eL65gVS@j8i@)UfdowncPgT-w z8-`-meLT|xO3f2D3hR4ID!LQNEZVx&5*B}`D4qr%1fZ~xT3(!yqs_R9WIm!8kuG%1 zJQvFVv&2~K5$pEvYt%MlWWSuYtMt_Xee8eP#~PVibk0;=aJL3ycLpFJT!~Yh($UR$ zByi*}+QLFupEE68HxZtQ$Yr|;c&yc-G9{s8kxBy3j8F`x<_OjhYe>c_@p6wt z{$>8H`}-L~zm85)A9FOny3hDV zY3dL@eUjXuF`VATB}Axl<(oA%Q~k%PIc(r`R&+GzYE?JDD^DW2z5$X|+PiMD)g{=auDVt8)3o`_@rKNaGU^C5gz)KRW4Ap)6rqsN}OXBD1s9s z+3i5|#7;Sz>YCDTV`RXcWXuB-OvwHu!QmWQIw#*cw;qn%75RdEMTI87!b#|>G2=%< z6&Lu6ndpr^L3>>M6{%VQy(bW|P?n$63n6IPc^~5#QIP!JfE@FUK-&# zT!<}ny;}nM+SdQHgNfkBsWU1r5s@BjC9!B(s;))%V5@hFJBaXG)ZBbdaPgOG1MhX- z4Fdl6*oa;Y#kGXDC((@($l{n0u-@af16p^kvxFKJ-V9t8lYEE>}_s~Rt){rHUtL5EmzFrt`UFji& zKCkL_xzuKvsi|3Io#ll1+DO53C3sqepYq-i0}UI}41FT|!5Q*eZ*nS%<@3`+Up(B# zxz+8wN#+=%W2=f^BjR3!K;P0;^XS?yO+i6=58v z{~Xhl4m@5+bu?BMj+~j_@n365{kY&SMAwDfLGLXXHu45>U%g@sz)C|s1;g*UY^gC2 z!<5OgJDUm5And1crmoss*#_GuIIBvuC-|;h0clOa%-yB6`Tp{~uZG8}J2U#<$PfK4 z5|4#r<7fs1@Q~8s+D*=ViBG&7mn?7&@1X$DoNSv1gVDsL8|{gt-zN+8=>UG5%F!lj z8B>?hyrrtEwUWnCsrxL_7hdd9w(R0s!~$JO{2!!?7GtD3J%z_(F}&T7@j6Nh{z{}* zuG`UOQcG&`P;1t^QP7KzuVl~7e=mqBW7T1x$)!-8&R`Wh(7;aeszGMUz~kte0h;fsABoD!O_+I#^LDxvtxywR<3EK9hfQ7 zyeR!q{bR%hc6({x?zh(;o>WqtO8%-MSzlMb96>yVxt7{QSgHR03$nH>q#bCh`8(8+ z1yP8lv(T}e8nD)j;@u95?mtmPElHK;62Uyl=fy8-DN|YFYOPz96&$M|(g%eLv5R!* zvVh*P90mM<-3@9zJxzDp@oaF#BXZRCo1Y2uI0SAq zt<6TPqx2;4w_+=)`>#jtIvsM}*b?uo&Igge(N^LDW%96OL<)Rzk(|Lg3C*O{XXzW zBQqF{vE+~vXVWS6j8N_epx@J(hnfsJ=?*fM0RDlZO8}EWf$FT8Uc}Uc8+23JI9jSH zBD4gBcFIbye{D&6?Rvb!h>swz{PYT!!z`fxlDwl~;?QT~xrm0zT_$>ko6^0cQj+qC z>ACq+X?qK2eNI@0_4!b51Gb4RgmhLmlq2QJGr73FvHvypVE}$y<04+GSmNJfq8QSv zSmf_6&8z9agRs51!rK|OKbKDn9&y$ekNVyro5flc)=%od?epzqsdcYRUdK3x|E|j@ zE14jnoJZ{{%O0+O$P=Z*JgE}Gx#M2t$D-oL`DQPe>VCjK5U{7uXC>!flVdjGV-Id( z6rm;pY~Ul5%^=2TGh_IX1>6Bz(5O)$g%4kB#zY@{bxDb&7--F;Gr#jJ?0H`*2I^2; zFhs5G6%lkeoXA9s(%#Q1>TA546s5ZDj+x{-j2kZ;5Q${ibSzHWIk{mPuX&kZVsk;A zwX@>0^x|e8QYk*6w0)6L60x3S+3R!W97Ve#ZedKgBDrdd!%g)~P!e-T>%+wMFUvtd zYek9T`z}!&mw(69HWT+5jF^R-ORa5W+myb1n8^se!n(2pzAocppX*VZ^42Tk0K_wRqRbhj75qjPvE4H%x=azdx<2><)|f+39hjNid~U7 zllY4KD*c03_5cI-1mF>!Fpj{Hi>YbwNe>bDfSGlmqEHZihtIAZtE$zBm{Gz2SaUPt zA$)yTOrh4@e^RL2zA~2tPu@J(lqoZ)8cb<;V$Iu^YaKd z_*$b`X!I{Aqqy1KF|XR!L(rUO(3%l*2^-mVg=yQWDnTIplzm0^pIv1knN;2Y>$_(B z-qR25#mnX24JY2Gedg}62R8&=qdmw46FE+zAesR1ehDagZMz8OG*9G)y8S&3>bs$w zB&LH84V)a}E_;2pzFWq?1|0rlbaf6nD%}d-Aborz&i$9Us2IY+&EO`VQf;*K)K#Cl zFo9!4f3Q~TGNn~Y^~=j%$77xo!KD0`8_StF_GQ907#Sl-7ForENHdE)t2F@7fGI+n#>-ORpttULeR@=EEDjjIy569c-ze zYvxlo$SC6>O!?Q+uEqP>%w&I~bPx%yvBTi1DP8XVZATL~?`PV6H)mpM7N~@;YO)du z`$+4TBQj-d?S};=gPoH^R*JtH()pUBgkpWV!2vJuf`M*>x!TT`;C<85r#?C3XXvx- zhe8r@_VTg$?nd^dzMn>-cwdF=N2}>tf8_e=JdJW2Lo!}cPOJ5sy*fr%JW)JZoR0;M z^9h7=+<5N9hiTxI5xZ6*2Rvhw5enD#a=^5k6c6vAy*8ep1NV7cYsyyI5-i3o8Io&VWFST60mf;k3sKBqja``NuS$vHrh`N zy#G=mUt#0^#I^|{MDV&s z+dDWA6HiBoDVsz#Pj~?N{Y4)-jn7|i`cdV`-V4Yi<_UM#-er4W-`PJIYw5s<0a4(` z$5r=))&azr#@}Im;rKd$H7 zE13gv;{3SdDQs9;@F@ZL^|t}dbtptS&%76m&E@+uYKAS5-!60r*XAX6-fWUoFxG}p zbHTN?42rI`m8bQYN0)#{jrYH5wcHJ3ISjdq#Tv6y zMtp(+N`a}0cHOd{GuqK&eeuCHdm?Ua(GN$}m4F42L#bYNLsfsRZTb7S4TH|v)349w ziC!M50MC*=qU&=9ozh{Ev^0LQ~<^>Q6pCAT_V3q;4AmGkpa`B%Gf`!XE2~D#OhZtX^^eA%?Mo;04XCI z0zyrsH@dq4RDTfO1q_ea=7QplsQS`w1sD>ExjLz0mqI0RB_KHTH^H)RfqeifMJ|W$ zA%R@)KZ?%T2f(t$mx{m)jy3_luaaWKsOjSJR*TA14Rdz!eW2l_AcW;Iid9ArC% zj{3-)1h;0C&p~?!P#)U;ul^WE`TeGKdpq24(HjF;ApB?A8F39g4aZCG-_h`DyQM11 zs(ZmElA0f=5S_mppi3=>U$W%Wk>u)ihgt3=q5AOT9FaqnQ3tSQptdW-Vt}e9JJvs4 z^if)i0kG24Jgbk8rLH&eEKXhwU?`qLjy%vJvliY7i&6~2E?|lk^N0zXvjbp^qCQCt zY2i^$owX7Wk{&AGxBQQWs^JQdkZUjg3jWi%mK)GNeioT(p~(%4)@6aYg(rAdeo?xK zhV}k%Of5}YT(a=*%%F1NUuW)v{-jh);4o_QdT>7w)CUwDKu7%HQuD8Z_Cr8FXIhFS zTrMLk6C14Ef~rD$6J@O*Xx!b1#Wpk~Dij4N;)H`Tl~yCmo4vIK1*p<(Lc4#QH-jVO zeCK!nlqIz> zfHpNw*aSf4%Qe~jxb>US?_MC;I@r-=Pp2bx4i_Gjx&vSey=Y#V)GnRu?YnL~dN=f+ zqrr>6?|}Y+!LH6m0inEjuMlt$W_O_fH*c2Kg)Iyaq@e$1tlmwAJ$(EDuGFAJ1I!RTuQIs*NS|^3Zvia68cn!k)}irqh}AC% zq-?N|9+~pmOi%ST%61oSEq1O4(UBcOTL#tI6{eFU8ccQW^d;0{4R9X9e%Nel@Ag$$W4xAOG%8VvN!D5?i zR)c_E>oNfI0*-5Ll5;gS?HO{O+zu#gbO%7eDE*SA^Oh6qBq@jf`-sd>8aJ=b(BYq* zCwTOq4TX!)f29qDD;`~j{*|?`_d)+>LU!SQ4*I|3%nuc|Hi=qXMgQGP{uN`GRTtsQ zrtRC?Zu11aBc`QT!sV{5%&vm{6M1ZZpi?+zkj`aQwEpZj)rao0+QF!4CJA$%AnhCA zexoDU*3>b3q#c!#y=xmvmE2k^*s(Xpm6_JqXka1|DJ>WFMB)*xbJikd7b*-T@1^B> zzm~prxsW^6efXZTv~7M6Skv(~0SqwR8Gt*m%|ENqy+|r6vfyNeJASZB6r6kD+}=nj zB@+OE)>JS`2Pq;VKl0ouI$R=JzGL|xjlI0NcV7Gz0cv)PMbZE6FERSJ8>vyC%%IU` z=FdH)d7o!WKm% z`5W&#ifMC<7=SCVVgRxa)ugewGeDHNE3FsUto8d;ayMTuf3L9q9ROn#^+}q}yR#20 z|3}r`f&TYQM_2mjznzQGKe4PBjiLY6E{z%mgz~xutpRW<^dBv4qkmNBn9CaUuN}`t zP=Vd|RkS-*F7bu`QRpu|VtZ)&U4mdU7^dd;vY4(~W0OJ<@lSQ}AsZ*Kgv(u7J2|YW zZRD_+u3+HM7cjCC&Myh1l+v4fJ;1b9VU?q1Zw^i1ZoE3)Dh>R5-1OQDE}qR!25>0u zwJUBGN^A2)?&hxB!G5r$VgR@dYQ_M1o1z>T1K{~r#sEhdQfKTmRYuxNz+w1q(1KB! zkgBhMW3g#NPJ3oLPv`DyX83ac6$n?(0>OZm}jcnGyTIqDrJxU7YF?( z0n;%0r{jMrH3}q5K*^3QwaB3)iT){o{?YWqKPz*Xf)H{G|4a@)M!#~vwU>*KBzA;1l(Z5WWYLORlXAw55xntQTrz0Fn^61~y ziG{UC1Fu~8mweZp`Jtjg|8hQVDCtlUY=Z$KK~V*>tmAkTbCSKD^ z<>CRVO5ic2_JV*py9xMcP*B`>7+_)OQu_@mW(jG@uB26FV{LsCukz}Aq1vf}me%-= z#ft$#!*_2p#7hO=2Ph>R0~m>7E)G3>n^--#UT_fT8{gL^XnK64)J)>CV030l>Rt4E zyMsU?TkPxt6Jmf$n<9-U@)n@m(f=54#ol}PC!y|g^dHwX8U632IGE{q?T<5yRC#m> z`VUCpvJ^>`k{tS1maDl?l~3)_O`9DRJLZ%-~uE6fqMMH1@S z1Z~#WGx^{rYK*chk(10)|1ITkB{UcT zpUB&R4&H^D$@UNsc`s1K%$kha9|<Z?n$jw-Xb*9yg#$^K&}QCSAwgB8Xm9WLLI0&{M)@x!d)V;s&H$|gLhTS`8!-9VO5YHO ziJEdKXiL%LcbNeO>Dr2hx=IN2rE)VfG5q*MKn3V(xCzaGbrGP1T8{HmY9AncCTEWV zjouP_&PJ)gL7;E2gFxxESLJaXUu=OR2Z0Xg5rUoR7oP+V0?G7&O#q~X)ox=+1OV2! z%~3`~+Mo83KENzWE&n5*<(aF&V(ah^SKh8WR3E^YqNYge`!?+BSgaDODn$Qy+P532 zam2pU56DtYsagO{3tDL#{lgOcGc{AA##-qk``C|*u{P*G^Rn*>{naHA4e=jTG6b7{Hv~T+O-UBuOcn+^!fvH}cqN zI$7K!K?d?XOXKE%e_*OlAuGOG(Vu{`=|NEQJSz;I_hM@>0fC)MV_9 zn}op2{&|*<{*|eMO`Vq>`>9!p_YbT6g3!Md2l_)jik&f)b2_Rm%>qqf-Y7+)j+DAy zi-O>xTdlM651++^1GBo81#J8C^$QGmAds{5ZcuKiUVgL0#n^{}>gAipV80{Nx=>94 zOd@UA?dOf8p+wsAw4*nBCa**sT2{>Gxtl!^4_|gv=$Lw-QgoDu^s_+A_T;%u%x4}P zZTe{(6K)MQR2!RZR~j4aMBs_<#N#(hdy}0#Qd4OMXQYIv^&pVmXS&Sr*r(z^7hZ2~ zC*CQv1E2z|G-X62)wPc&U-Sw%K8F5xmhkdFpQMuLpUzSwZS6Vw&vb8Qp={wP0?&l1 z|3Bz|`DDk=89Emta!e-zm4M6{_C=(?_c?DyI`17z4t0U!K7a4f$5<(q6 zT9x6-0xOWf7SF0|RYp`>p<@KKH|B$ts{1hN6uS;A*Kl3iiJ*u9N(%SRDjdRIv^Lq< zFLEqoAH8E&Yqm1m2=!_VK*1PbCp`urmVA2KP!EYQ8l6JM08K%%VU>5g9A}Rm1Tv?{ zWO9b!aqFPm7&Hw$$f}#|WCQ>o6#eIy|I@XLAO1mOC!r1~ir)Q&jcGZy7X6D^E<>8i z82U#gVV2rCgN{uUM>Ea(M@9ddAZHcJlnV8rZ4#i%7!ycY04UZnvRle!8|C7LjTYif1%F)m#tK<`3}dp6-XKo z?^qMnR;mqwvt+O?r2g;-N$YnTT)|Wdgyul|IiPm8eEzNKU{%N43TXZ&A2G3yQd~=K zN*-=DtBL#=pel`UEy?sXHSpS|ojL9zc3T|q!!`ko%K(mQ{$Oevi~-bPwhQ0~)nbY~ znto2PqQI<$S*#rZHo^udBVvk&j+frX-4zc9xulr68dv)8Po2Ix4XvUW{Zk_?MD>Wb zYP)vMtcr1<`F>QTe zz&6HZ_a;z!b3CDLvGc~l0L5KW{XcuQFuEX>BA46Z4{vw3jZp652r8YL{&$fO75{AoW4(c75cX(&Bv@1ORu^)rA1R*jN{mc(+6MFNZe}M(lkR9mn zJvC%zw5s|*KehjcO-r$a%iZBPFCwdTtGpm0YD#$;dC~}pFo2|3O$EJa50$`|*w`<| zRsfyVcEYB2q%v_EB_Ai!<^0Y?K2a*y4@QJ0!^lAoymU%eXPI59% z;jvAC=&j!{Wj6sT(ScV@QgmIoYtgxb^dI~))fp^HfdN4MV|il~7Lk9yBx27ziE}_r zU;am6FI>BwF?{!zNroFKt7C)51xt(mnJda+5cPCXh~M-6RDaMteH3Sbk4?gS^bcS_ z=|}(GIVgC@3;)H!!c)%tNSOq^j^O3JxCiD7nT%opD#{u6cnpx~aoX&-kre~*f+T_$DaSJ{W4eo=ER?$?Pmckp zc=NWcCwMvG;P6@aRQwL;Kd)}oI&I)O6h!|b(haNH8N+vfndB7umonI=L}-Lm?lvJ- z`ef)Iyb44}M9KWhFRLAv*?Z{!nEKC!e`QiKgb0z8IP-(1XSEh-V=RHaxL?{*X&{D> z_oT3iA!KD24wNTZMEfVoeKAx$Q8h36ygW{x+1U-w;vfuAHM5dUhB-KWE4M*#h8DU* zq{9Et@*Hg%m_7uwPDyie;wy*&tf%Q+uZpGDdKtAb06h1hM)z5(o15`@t@DKAcb+H8ccNG-w)p>Rld8ulT?w?-!*R(4GiueaK zWhzrn|Dpd~PxYiU=2%ni3;#eDcuJ(9f7RNvRFsf{A?RQDBcbzgzcuhc?*yWB+8l}% zCh*U^*IjU@J>b2(M zBfl05i~xyE41i~xRzM;KP%A|u1~@+MlhNL;sBkrNadk>FD`d16W(#iuY(=zR2I%kl zZVXU0AJ-T-R5NQ6V3tD-UQP(ld1nAXrNrYfTX}~0e)NA7ntS*Mjh#$O7`)Ntf6Wsq z+kohl+u94Jpnt4WYe~<|n!Y&L(xiT=W{!K-{+k5JiK}Cxe*@|6F7Rl4scs&t5{TMbZi2g?w=6u+A0*qW0}!G`1AQOaHwW{nOMpl*aYw| zCuF9*x5kVKp1=3$%xBliUopL%V^Z@Gk@AV(_h+0Qkc~8_yw5f`8?TQ#M&q_`-ZIFxpA?+&LL;s4=!DBx?3;&HqYfh(xC0H7T z=P+L~ozJNLtAnG{03Rl?;;CZh<4$Xjh`x*n{yT1K++&WbWw=?3Q<_WfP<0kLhW$G5 zozYe*RwWmzu%+%XfHE%~EJ*mlMZ5^m26R+5iWtDX;ayHwS?Z>&WGZGTvcl;k=EsAJ zO{Qx)ygkgB70G&fpn(K!Lf|FDl-0LMb; zBqaL;PSyOc%dR*QnyI7AR*(w*msi{?V-jI~?Ql4PfhH=LXlcIvM-1>vH<@ug^-!bw zllq1p=mi+7;&6=2I)wF@3!CxOvbn1E?PTg?B8m%?N~bzp#__{gp48hq zH9GVn86aQ~-uXxfOv;&F9pU{e>~%owBkv8}%kB1EXZzG^;80EXL7=G)^%SPrli%{* zerRla=fvfbn0!}cHO>(n*c?L0or-li2;B~!A@PV zflUB)eq5`gO(!w5?et(Z89s`+cR?L1PReWoM5bt8ilDb$_FxkvC$y_X$I4H;`+JV7 zZv3&chnN4kd{j{NPwS(WhkvM)S?C{fQ#bm@CS@mGwH$Jnn7Mkwy76FA+`csEA5Ndh zGxebVYPuA~W&Hzwr6d>rIgmp#-x4RO&slJo!r=;nQ(OB+t#;Y~v&U*DON5oZ zAE{O8l}1Ix1Fp1LjTCHesy?&>Uk5B!CuCARyVjM?a0nSY5p=4t>`0>*(L!j-ApTi# zhr4{YKAcYCWlRxf3ApZ#z=&I?G8V|Lo%A2L5(Lj2`F`h)uyyYxwu-39Bas84CoC z_*1D9+v>_dMVxds+MkLNMfA{je(z6tL5^0Bbj6tdgFum{hXWy?F&+bSG@Si#u%08> z==Wv#mw+>r(S1JnarB=pKiA*aeJC080V!R}|N1z==wEeZal7q-%hT=JL9I>wOpe&B zW2j?!MqjB~N}XdMC|tkz=wHa{zw*2P6?X<$l>*aoDfq{IF`5b`0RsZhktx z--e0hyjj&QFO+TP)MvA#CN<>wzAp{d>=nG?m` zt$_HI{Xh($9|xk-6csls_SK&h`SOEiqxz*z&paF8VK?G208y#u)4+5DCtnE1sXGR! zc<_1pZ+-L6GHz<036R(W5pflECLSXR#gh((WF3pSb>RrpPEv(wFaXHtPTJ|Qdru3N zpR@d5ciyYezog&#ZngZcjSy}2*s$ox(SOU)tkOfJT&J~uHaS9#Es>o_*pL1jKD~O@ z0e36XdeHxVJE}BBbNeS2PA%_ zRL3NJs;znPFajsX$$teWS2RMQp)%HhZv(cboX>TlBjqQ~F#1rPO4iGN$U^^e`G4<| zBZq&WLoq?#ZYWH(71;KK8k^w9CgEk#ziPNXsnpW|x0F>W;#APFABZ-PH0w-HjS{?v z%o|kY55f-pGNJ)p&W8(OLI8q=Sro<#e9L>0f!N;5h_l_>Q51W&7f`EMvw>YB3fNh@ zpYX^+T8-}|-?i9wP5@56_02!4Ld^*WfgnCnP1h&$v4cR3$PBJVbADu^PN-0*dj}w+oAG+j zH6S{AnLVX9pn|y`9@NIk7%Gs?<$oJDLG&+yOPv|$Xw~P@qyN6QHL+Nzv8_>bxJ7{e zH7U2Fe>^FBhyIsg^iM^`S*DXgyaz$QRn0FbFGdwdy0|45fLkrrfg6;#`{#s!OHv6z{6(3N_dC-Gi2?QkD$N6A@D)raoNA_FkT z`ac|&YqEz<1R3S(8$OoI)Rh3{V0`cheNt1(T9P1rGExeub40|c>i&r2b>7pmItDn3 zf@wN&A-IvC8!U2L2C?=>e8 zBLK+gPTCn`4{pJ*LW56Tx|^=M-b_}Ew&i~d?vzsa^8e|2`rrE*v2^I@Kl7kiU#h)S zPkPimf&MkKOWTlb+B>3ukgXLL7KHBmstf-G+iu?KQiC1KTPuZA<%IG9F_y$KcVJ2()1YMV6djCvQB(bL2&vuN#S0$O#rI-^fT+)vZjUH zjL9Sz!$1j1tT@ZT9s3skV3%b(@ohE$$kbKxnpVa{XVHJh!%-H?n@{8DKe_yWsEfV% zC(;;6^gsXTKLdTX&7t-NF1-1gMgQ7#h^C$O%VhMg&5xD5Dd-<)2hR%`sBuHfm8#_N z2YxCJ^jAf+fX=8TW7kbp@+nmKQX=_}P~yCQmJzqrIh^m9)>aHN+v>XO?l>dPK}7L| z!tRR!((h26UNw{{#mhIolBWu!5;wBu70Qrt$}9|1p;(ySx*%aQi~*La9!ClO#+x(! z6b+dza(W+N;4tZ1-}pW-T$&Dy6kyDw3_Il+w8`@}0i2$jQ{)diW2AJ&0I2{V1DIc8) zm(Q5x3iJ=DYSCHfp9|oVpt0~@fbFq6#5^rJsz7H-LI2WNt~MU#)r};T#VdIQk@64l z-AoKJgsdD<*VzERIaT(_7B{}HrX(8BFe~H%j$)lBf@+KKW`Z&Wv{H0uhl;m`lKdpO z34P;F4bDX9wzKxu9iuzJRBbj=rXG3tgcOtsVt}S~s8-S$0{~Cle&II(wpnZZAdu3W zO>*#^KQJ?P8#rWarfuz2)_Es?4vGf=8Qn=c!|X~^S{^z}+J&3?Q-3(I3&|}1+m#@0 zQRC4%-}@PCw*dN&C@{1|W)2|)IqO1VHNq%IuZsRjwDSo14=>U~LvR6j<_9U^Ef^iE zdA>Q+$5!uT?DvLX=Zn)*LI_^c%gRCzJ}DvZ)34 z4$Q{Y3IFGhBlNJS`XI1!tA<)t*tpgJ;(sh(4M(`T4}j+mSpld{?M3@U#zat2rUSSV z$FPF^c&&ppTFIta1p@ijH@~kGa1e+T{!P>Z;u+PllNO!Z73d+Esm}8hro{k}F`QrN z4h8_3y5h!EEgNk{%PTvo1x3(*SeR~5yh!uz|G?p&#yai2pH5$rd9X{yYH>IyO#x!? zvk)f`z9&@ZUn<8Ru?JUW+=Tx3zYhA3O!-tznLH zR(ET*L77VOEF$r5NY-T}?WC$b`>T*D>>n&iTVZiijLjCE(wGt-4g>nO0>n?N2`^|k z!;{r~PcRz0aB9{bkZ8%uG|RDR+R0n96$K71t+5VceCNq(W5xi@IU9G!0IG{+uxu*d z`Q1M;Il_i4)-^e;cbRq$91Pi}{h$Pg&F?z#2tFADL;`?}^GQ0Y414JGizw9njFDp@ z#f({G+&%~#{(-I#WaMtugwX%)ul&P5a$+%N)0j_Hgol)akJ@xgg7rU};d&m2O9+ zgewIl2acRf`yn%=cFnusr zA6w%(@Rbw(U59^U#^j5?(m`gif@cOu@P6`-}qnV7^5 z05ZChc8<r*7{Q$kPkRKqB#tEk}4gzvW=+M*;{fogx)jzIO)6fOHMrd3cQT4Cj ze^=3L(Vp>+zT~XtwGB0_ptO}>N`>6J=jRLLx@=wqKDrIj9&3+{O+%%UtRv!quw>PxBLyOgW6MZ zzec(00XU|2zf~3u zWk%xQa{au8LX>tLQJ2C7=vV*Vjc#r(BD=o5<|vN>C2&5G^Kh` z?*AiTj#ip~qXTeCSI=u|KS=#nZIyu`&Z-)17)Z_5ywD^hVgUBIlqalxuO>LgN9DW> z&@>O6pz+ZhWN(1%!O`aKn*hOsKviLVannqmaS&+Kl?7H#ePe>Eq7P9E05ZChcIK-E zgIc#xM?Xf8VR!=D1>^$FZTUZi{x?0@!#`%HH|xJUaOdz3bOeSip(gho^vkXN8}{nx z|8&ZOCx6^&$v^gU*pxr$EE1vjg!LE%4f@ToPHRc+a zB<+Dt1$n%leE_8jQWqIqu%(rk0@Y6eqT4)nQfhc4f9LnmRp9mcItPJ-H(oU8b0#Op zL7=|2#N=&Y-@LsEVq&4HP}#4b@`RdXyW|~I7X5cPdEU>^r+e@IdW6xx=}0o@Un3d9 z(scA6B5P8&billO*8XKTYjdG?s$2%HXza=_*Q;1)v#1)amR1=Mu|oDsKSCL5twcts zR##9^&jfIP8Kv+IqzUfTINjJfrQvIPOr0eTFo~pks_%PB4Or+x4*Yzzimp~iwh)!F zB$ibd^o{m~jk54l?Sh?6G>xmJh3Bo)BUKrEqN-Y{ZLn4!iHuean*Wa3f!JeLR^|dk zr7Y_sBA(hL?lx636!GTK%~|Db=?k(BCT4mq7GRXu)TITf#se9$WrAfx6h{9c-a(S9 zVDr%bDEmP9w2!yZe?RRq9DADcKY``{BCXrpm<;Gi6{XfNe)z|s4)mXDbq%$_lQvkx zORxQZMD$Or^X1V$6@>m(QC0@#YBNIH8FPuMe=5)1rTxojifmH;h08m<4Q?85RnW71 z1Hd37lOd;}d*JOQjt21+ZT>0VfMS5PpGfjZcHN7rzM^?&5SZCbzaggp=q8Z^4DFv6 z{V6Fmlu^>^+!w)F@P**f%K+-UV9=5Oo!|SDn)zGb_`Wk6ZvtpRVaT{-_t(SUpr9D$ z^sB@N)wP=dYzH9IXfAK7zRTJA=e=6$P}0P9=u;Vb25#}L<$qky+~FUstwQLZAyk$M z6vUoP>LF`b)O_s^AKUN@oNh)B`tLgTPvhvHz1#v@0OUl~xe3wHDDgnh16vB@^lj>J zq)ni)zJ0ag&SENpnzPJ~Qb2 zTLHwU^F^jxjj$B!Nwy2!l}xG^>S>8n5GIP0r#r8$Mk)Zh4RA8Ib;-8GB zq*bHyS*m<)?m>NM()8<#SxOPh|9h6Y{EvX7^)-Y3L&Oj&v<;$fRk2ntg%e3S0N*_H z&t=?={_!E|eOj?8g8oy7{!y}(5Ph1hfz;|k2H6>{D4cQMl0Q}dd=8@{jaZ;6v;QS! zvsCp?z=VqnjiK_Twh<#GThN@q93E*v#zA`_UJ{C7gT$2|Z(z^2P$O?w629rt*6#eq zTf@+8O0S!q&pCARXp)6fkbjUNxcYQPbqJ@D;8yH16bl27k0&QwMFMMl@RtFc^D+59w?;!j3Kdi>a$EI+iUQ3+GzjPCO)q~T#Ir8)xC{V;v4z12biuth`7 zr@PC}r@o7EcYOHg=GT7(=bLtrP+$HxRWkCI|8c$A@uJOPot_5WenRf}{3|^WaGugMAX6P8*gK&#nwv3Zj+b*@GS6xkUDeMb!Qqk`>e!P90HWMg{sv z2()zG1ot;HXW6osuwB$?TtJvCYDlfc+eP_!y)XtiRC!faMSE__?9=MRQZXV02c+)k zjA$;}P2sp49GQ<_259x2pLLtN&}vf#FH7bQ{g+ax2k+TM_5)$K`olLNp`1(6zobeV zcoBB6X*l{k0VJ@K0#ct-p4ne=B|W3+nQ};boJv zPn>!896DxZiFx$jY(_CQG?(N~{#26gNB;<&D7x%~5X|9tq*|>fk)M&iLMGAQH~1Ew z?|Uc&@dE04EmC{SMHF&G7pk9fEjp`oTr=n+t|Za5;Iqzz0kEfdk&(ZxSfHmnVITZy)n_vEh$Ca;61jU;`sc}db%-t z_$QQTvt5k-NzYP@vcNMoftTn)|EDCzhNgk{LH`vDusXFn2|``M3G;;1Lp+Mt37Ve| zfNS)iVRHaW`bmH@lXU`1xZIT!iZPHsEg}3l9tIHm4p^88(eZES1}Y*Iu{ASy7;YSG zil8P{-P4PTZcc1^UJE<+24dUA(V|;628i}8xaQm?uc9hBfaI*HpczpTa zHY$GjMbQclSg9a6?b}LD9dz?;Y#Z5%f>OPSxuDOA-VVFJ~d{zB4m1NRUB!(wUgV?ysIpGlG-uTpg zgI134G}L}Vj`?I~%*Y_=t1pcK;H*v|F8dU?u#E#L3XfD$1+~#?3 zA-L}{KxIB!g#-{}n5dMceCr#3R?Xc%s6AnusD0Z~NMn2xz`vaEF6aKm@uWZikhF8O zTIqfkS15o|s&rO|maW(Cw|?h)P@38#p*R1yH4MJ_N0`2+y1-JSRNG^p7)SpJb=z2} z=K+r z3pFBjvfnoGfNKs_{{rgL)qwd`5jNtELCN0V^l@x5L^o}D)Kv0 zwCz57h)jAev+XF*xJT?H=a5=NcTWYwAWrl)}t0E#Mu!PH9;L04?S87D+JfN$U z3IqdG{WHa-iD{1EkJ=CojqwDpbyNgf4)@qmJE``VEr?|x4vhc>*ZNw023 zxiob6$437)1;&ZSyjcV>H=&d~`ai!(9y#%3f9rQ=ehKt1=VxoW3_iGaZUoaYX+>0# zoJmJ@=rMRUS5{1L&jAs=TJS@>j`)Mx--sVxXP;t(hi`*Ig26!e^@2fKb!x94(6OIB z?rczN7@_kWelj-%Ozz4Jki%QmRfE&@cZ^!93R;CVg`QU6V9gYzBgxAEPKS&oc3%cK z2;vqN0~8_CEUwdce(z6lyPr)$r8MVNng`W;5C}crX(0`GF3cX)`CPLJ5ST8$ikEa0 zO+f!wEdL9j6f8H9IvUd`CBakmX&C)SDS$22VkvzP&&AQdG2vkW?Q4G+k8mGp^uLRK zZ}eYRQJZr8hb*-=pGeJ#3I(Pa4^`xP_0#@xaOH6Kc{q3H;k;BG&BSu( zOvZ&_!fu;ekbk5?N*_LILJK(COUD}-@!=iCPA9PvTXBiRm6pA+YDrD&Hl`g@mTGR# ztlo%Q7A;CXr()7QMy|`YaxJoZ+)~#?5wPr`>Akqqo-TH)P%PaCSi5Pkyfud~)B(a- zDX!0oT`D}tuLwq2&G1cxx%J#K(x9Q`f70-rm4*r9v&$O#xZG>f*z!l)VqY ze*^mFHdZOFomZfL%>qRn4R;cCc&b7zg}}{`$>3Xr^K(_U{OsXsY^WsfJ1mkn;6LoC zNngqwj9#NwjsO`rn1-kf!HU*U@KGNB*Wgsn8&i zD3kF5H^7G?5Wwfl$*Qzj@I6{TW;)*>RvXj@4z!ojQ&CaWkv z2t+*bAP$oVC6;sgL&bf2N-5<#zxSu5YRGSW+Lao9>wQ0I z`)TJBWBwwP-MQ#4oK`(+CUU} z3V%8o1MPKF${4lOEg{#oKXQgKi9$pENPWdwYm&+G7G5v z5N;r)O>Jxxi~(R9R&520v^=wS=|q1Dur}^xfU5NuAf6yRs1poxbCYh9y#7Ck^;hcK z1i)e)l&=*gw`{^k&sYSHrmYH>w*XgMd3X7_%l~NbUp|59=wH&23(ceI$79)C{bQ)8}zZlJXR;@&N(49jb{65rK96D_xl}es3hd-?6Xk-&9Lf zk+v>1OF?bA1J87J!3(6e!wTlJFS%BYyjbLn0sOH_Ehlh&t~QTbYY#9D0i$=r%vnQZ zt}U?7BgVroMoVeE2_6JOaGxcjd6#xJk)DEW>QjQxshX!&{j)a#qKsog4qKzEQ12-#t$z4>q$be^#ag!7`n^<+{?!swDa&!1pQ-*Gb^jiDsoJum{tTxvQwq%H?Mfii0THydJt@p?^{nh1 ze92NkbWpoE#*=sFV}xa2sS&B$JA(4qBIZ!BWhks6zEFlL%*-&ibSx9WaA|>~Hc4su za0rJw0(Z%}sYEuGL(V{(A#`*J8SH-LJ5!k+n1HEj@=AvFX2NMhPfmSkjyx+NkK*i! ze9j0S1ah9w`uAJk_`Xs~S^Psax~01;>uR<}xtjp3FsSZc*V*MQzY1|Bg}z^TG~n-e z3d%KJNTTn4{oUpVfYWz>FCmgIoN#r99!!9vaVzJsQ3ksY?+E~?Djw9Ny^O^j9Fx+4 z{_C#*oL-Lp+2ko^Ay~?XLyAdw-1&WmWRfk?Gc3kGNC5@bpoqYqq`FedKl^X~T!^oW ze(qQQ_&VXBMc@NXuGKK1ieCesSr=wswT#)JWUOtVEUc;8K^|(l<}i4ZL=g6!nT5YH zMzuhdCo;*CN#|@xCj#A#YTpT?$RS)qrzVQEg-`X>WI(h+S8i}Eh{Q{QsGKkAF%J>w zZG{p^z7dGZQkul$6-7%uvF&tBtjMqhrCX+BuJ8QbpMK*n{27+W@z2^qWjSA`!$`YH z!T9Ui(D^YYi)RG}yI|4mPuO6n3#M`UY6$&zEdK*_T}$sK8g4(`xco0`H)EH~9#EMF z7+n76uJS~UK9U2esV)Z5Yy$m9l^yQ0Gf zuYLWdS<$Z338_ zpKe(GX9L_6O#20ZDr-9ewDw3XW&o%EF(}k2z5HL}FT3C3OpG|K!mx5J^46i}$kBhE zAcW{x^uwZmR2R!2{s}&UfFNOu-g~0mo7mrrDWK+Ti2(CI`x}3L#GH>yTSzd7{%tZ= zVFJ8yrX3!|)#a+C&$r52wNmQH2l5v6OY?nc|3>Pex9oys0+H49weTcfO+}lm0p@Px zlES!XEx9Z_Rm|$3qb!?9@{rX6P1X`6oZS_Ha)iV;wQR7?Qm0#UuaU-&0G0BuzVn~< zPQbeIq5n)@8rzHDFZjpB+E&qr2+XhsP$B&a{Kk*~=NT5T9vY$O4#4QlI%j5fI$0O` zA0!?9OF})Tz5tMX^(VgUuh6Tae<;UC|BD2O*P;JBZ4MZuS8B2S8ov zJueFVW15s-wA|>6h5M5J>0keItU-V7*Z3~Mw5dmhmRMJ6<$ZTg$HXJoYYbH((%1DX zgQO=A3*@L+m836^^SNPNijL2HR^ZggwD_7?sm=!FsgFveU!6|ftYXE2I%z8OoxF*n~-KM?W2 zJXKM4CGe~{7;99y^cLU;LJ z!C?W)E&to_655!}QaRMhS?FKWB!mI<-+l4dd+Fz=K>uP~k(y%*ilYCh3sa!>wFIBI z(zqWJ^k3AX{W$oaRPn&fU?4-P(_C{k2)zH|ssOaZGwKfLkyI7T=)0I0p7PaxnOWsT zAe7B4eFZ~Q-`DjF-Cfd%bf+{!D}r>VA}t}^LpK6~bR*Kz4Gsth(hbrQGL&>PbKm*> zpZ6Q=d(YYX>{xp(Uo>YvtWcW#-%>(Y%wkx6dfTjDqq{TF8nUw|TJFMVHq-5?TuZ~1 zX2Jv1(fw0(Ez`tN6 zKEC7v^^BTIFzYeuYx_+~-M@)9RoKa|OlNvXJ+U{jg5Crgf_mHBSo3w8qP3q+I#AU3 zM#@;Br3GC)quqfLH9413#f25~e>83rFbH1lm;dVwP4AZCEq6m~z|e2;=T3m(So7 zwo37jsP9&ycB71%_h!xwb%?c@z4`djPbi#mmoL0b>mf;Ip`TG{ld__Wz1hcsuPnGu z4dt>yghi?G1=!uV+NRy^Imy`1pi_h_7%U#I!W`D={<5Od6;g%R8ivq>X=r>ST>b@0 z`%9pjS9+Ki8*x#`3g6KDf;Q=iBCnw6`#_}v#4BPVj9#WDz+~ajw4^2x_=a8p&;5{u zd_0nC+|KmsI~-u$L~3DPib;uMKfVb4DI@!-T>WZmr81i4ruX%sgx$Ou`i|(^s`>X{ zn3u<5Pcng@g+LdumF&bQMZ$R@vMvXKtYjxvkKJ-JKPNH4l=$Trsxa1Q* zp->q)8?EdjTM}}3l0*_1+(o+c_vUY@@F%1UlGEzR)?)1PTo%$*L4G2 zt(e934eqLEQDRdbNE6eax?;&^hErQC-wry+hySepiGX;kJd3Y5XqgyuA*BA-BI#k% z+Q1MBO!^|p-Ij)V6r3@c4YH$oW~aid|0%RS4_W>b`?4|uLR|!)`GQoVUaJDemngyR zFBhqUIhCq_q$Ulb{OLr<<%#cFJ?Tf1Py?2G?B}aCaA;Ze6qIdS0az*txnznb=6@Ct z2m#c}?94V7KZ__bLcH-C5?#u`ye2jb7g~30RelVk$u(gwEqo@7aOZ2aw`>nJ z73(x~@_DBW(ms4Wbr{}-hyMXk9K(;btI*N7UM##?ECO@~h(cNCR2pf3AZ)$lBjodEJlc-7I2O#C|YkjwM*?{ZMF@RZ;o4Y}zu8 zO`rnbpdq7u`yGT>3_&k}))oy1xLwwn2{Rz1e;ZHLUQR*}fio)BD4 z4xZXtswucC3QNVZ4O{lS#%sC;zu@|46W>z1NffGTCMf95#N3VB>#qfw;=N#6`tWC0 z;=}~PZ5HoKf-~&oNt-BjD1Msr!ewoe1ly^Sqrx<)8yzGLR+na2$OQ$8Y-@)83=;KN z)&xO`c1L@u-O!5K9Ty0uF+kt7Z#L4sDzCRYokTm!{K8>uetOM*-bVc zK?sFjd-h3SO^wmW;Y50Z>I=O|Dqh#V4LvR$s3GjMV;|Ln)c&f*p#ag#cUAOA#&h9! zlfKZFb?%GP4g`?~xt$l``fcfdU<7yKBYbrz5LT-18_>v<0EIB_h@GrNWbOdzB@+iZ z6%U+=U|jB!Niext73nbrBSxVAy)1?D!-)diflO6khvVisPDgpf&RppS?kBe`2t3#N z>B!2Djx7S%0*`6Mxxf}VmBHD+G24i+1Wq&=b?a=p8Q^xq&^{9NAzw5rn;_5rzP3)U z5Ow?6G1($R7dy@e-^g7K}4qDh#YQ4XnWmaq3 z7*s@O+6jKkg29*+-r6NWi|6tWB~^zWEJ8e64cORT%L317M*;YFWA-jUl0Q-W)0RP2 z9A_ESECVB_<)%SwZ-UkN#YDevZVBwP9%1}tVJRd=thhj*ZQ#ai5Z}lb0S25jxJMOK zd#b`8Nqa!;JAF=83?o*2Ln-jNQN9$;me)UpdRZXW(r7{;#}-CLDsRD45!ks}IVG*1 z>Tv$k3YUbp6cQ^zm79(27bywgpfu(9nk)mR3R^C-NWIKG1{X={<%1X)?z`xLUtC2R zqN9!y+-2QlbINkg$Mx+Och{*tJuErm%9mD;!~pxVxsP(>>BJx!)s{JxNRC3id4JY& zAS^#{HeW5YB3(D+!S{RlzA)hjuI5MLX;?xpf%y|cQ2M+_920K17Nu0l?>eM36Jqvz zI%d7w(NYq$v*2o$Tk7H=@VQ2s z+d{R5s9ALW5XGrJ4NHe2H^!K9%<bG?c!xM1xJA(!L z!0um^h02DJeCOQ@C8*Bd zuEC*`dap6^1*>%G0!1a_7W9Fb*t>#1#%QsI;8}tOck>in zN=O>#OQ)ADqf)#lcG$Im*nqtA7lWgu>di#g1Zyn0SKPujxu89b?q-JV9cBx|H=5H* z@5z}((=25JuShZ3A?6 zp%~bhSnj2|f182}a7KFW%0q&D=u<6`&?(saw|a4z?qZOT*LU)B3i3?;&e}?{lgk@~ z%-M5gEjB#8pD5z7&^+!+E+}(BGx08FMdKA_IlmL$a-5zvC#9E-pDbZ;I=|vWDcHQt zInxaNLCh&8RJw|>)MR_}p8e*M9rQV%2Y8%q!G-V|eQcSk-pKtr^&~OKnZNmL6sHn~ zu{sr445dr;!kf$?Y3x%4@}39)$te0mUO)f+wT+%25` zRR!4pd02cCl56ij1;l){T7Hi4HWjkhq}mqw5{=s>;DtjO`9~8oaM(k;7ysiY$F+=x z0H0mv5VPN-*I*ik6|}PSLgZ(8-o2!?Dvy@z$JCn9!EQrMu21`2r>*pLZ6Qy3rz`ZX zLVuT1k#A)C)$_w$f)>~zVzm;~H0BQqY3H67`Xjm=1uA2jAQR8;xKs7!FkF(HmxLmp zlv6>Q4Ab)F6aUKV33c=D&I|MK4Mjw67~Q0t?_jhkTWY2wgTBzg3Yl}}`(!4h&U>i@ zs}Eg!@6%;TONT%xK-szS1Ew%cJ3+wh0zNrf@*Zt!WJBKBBP()kSt2WrZ~vO z$P=bW8&J?Etb>8Ks1=E`qA)|`WFRVJtUO^MaJs3vRzgeNvwoT-@aD2tW7alze%fTh zOW3lxNrW%Z>RTX|3{HB#=B+;@&}3^yuGvqG4wmsTX=)C0mVNp@<&hQASbar9socOv z)VEY)7BYqvYjDY&VY81FSm?h(TEq|tMXVj*keHx9pIvI~k+>JAH?s1*$(#TZd~B)d zUZ?;gFDPO=kB-f*o{E5`GIqSZpIWzr5t-NEKR+WEoGPhHP++CEmjLY)Oa=}#k>R1U z%O6HbdkBgp@}u*=;5YDZVauA}GR>P26stZAuI$fPE#Zdt0LaecXjKOJOd=WV8rAH>PJuV%NEJGS81MQw8Zm8PV3hSos zvIx+6wPil_XwSEP2MQgmFeG~b&HZJ_$imn2;vFx*(nVCxNw#PlwQXIjk<8~bXFL{$ z8~{N<$bC0J;kP|CczOEOJ!SD@Cin+-77ysGz*jtc#kka4X(#JJ1-M*lKDUE;6m!=$*w4| z!oG+XVoy#fF=DL0C?dJE!+#)}hHA0K2qI|bs-9f^Da1>xDz2(aR9|!a%7oY(ex8Vo zi(<>@M2Ukw6gY*V)K)UF5m1)qLi~GQBOL4$sFa*#%w?w`H#nCP-Mug>12#}f}DRJSH{b;UHq5zKuO` zSkb$gbJ!V;HVC495Vz;Qo{WGKr*ngD@4Gh0Z(e<=nFfX4IZl=3Z@}uOzSz(?=9wA0 zV}P&+7^EIqE$74zPbV#tOZT-uCt^K5gIh(N7dJak0Vp!g^CCbXjUNv^9#7$);WJB! zTRo$O`Lh-3sYz*u@|m}j;jq2>ju;pwG7MjxZCvf$Db-UN!eip+Va&JeYwm|;owztj8UWkI7&i`^WO z&xFNE=KFroH+_C{0q~cx z#0bADR>(;#l2o@Rh2S!o=JBVy7Vtpq*NjVYkQauW?X<;mHR^t3B86HOe`QzLTm0G5 zxPoH+R|-Rkle9#`4T_U2KY@n% z8Mx<28tX=HW9|X=ICsrh4C}FCXe~S5S6c~>fDB}t;WqO|Ep^Z#5)`xcj&L6MBiNkP z#_4kVs#Y<26F!*c#G2sP`u%tY4IcK@>4_f z*Zt@QYDdceCX<)X<LrfFRruh}VFN66m1gPbtOXq=aXqT{|x+`Qt zln9vkr2z3g^uI}K1$cFZI*hAhd25dw zY_)1dpM)$r2qCv@+OWCjb7#eer_e5E=8McI2LunB{#+ZbcIH}(RGQx&JEXdND<%QD z=z><{oQXzLvhpkcpoZXr4?;}@VL)&=9CfrG4AccCI(;-047tfn_^O*z(1lPzD*yIz zPOxj#AKMF^oamS5xUUO}A-~z^O{wq6$zkb6wrCXYK~Wd)P|epC1t~6O)KmhdY`iT z5%ZLkd2c9p`%A6+VIf&R|BouQpHeQ_2CT8S8mV9NkiZ%25xpfAfs@kt$mIH9rx|)M zppFr8m&|1pQO0t);V%Bf%dj@&yc_!=209_2`Ma73c!6azFrSRJ-;|8Zh09a0Hz-^w zOap5FODc#5_oLTB_szf~f!5d0E{Z_HD)Kcmcrx%p;7Z<}){oDE?32DCu+RpCGGJ7p z5Ynmb>5|xC6?Z=O7vi>1MVD5YcTM`0-X|pIlV03qLEABa#`sV&h()1`?9-DW^}O?k z*;*G5-MUjnMm6zcM|jKE6gYdR2nU_N1GY8oeH#T&;a^?i`;CMx3n8T{l{h>fet=^N zs=S(qCc~SOC@X+eD~6n5y*l|*NPq7u6o3+=V@sG@nTCdM6r+yk@(!LEavtNlgqKB& zo+n_uWMt;&b4vZCS@aq)e+}j@u9^Uxy;b3EArCi|va)Ge9VRa=N=*xT{h3AI%+k8R zpAn;}7*1DuHdxfs>X_t3h#t8x%jSYq3zjgLv!$K!6zm3+OaIH{fSq0F3Wk7{ikLds z_Dc;?gfb$Ixo-!bgQY3x1$AtV{8lNw}sQXCyUFtql z_O@ms4aA_OQ%7eD9kn5L=coM-xYh&i&hFfh zCotmpbeCQ88g8aNpV;E?*t04~i4+ifwG-(^kFgxbgfZiWrku1#aI6WEyolEf4Mjh} z|H+-(ydN}v6=uA}4#6**Q&f|^#))JCD=M{SqCN1BO;t|<1B?M&E8;i-PNrZs5OYb{ z;}Qybng4j@3n({O1uK=gs;w#P{E^*hOqeIaYQ!+XL7W8S62u|#2|(Jp_?K4KA?Cr) zrJ%Q`$q=C8=l#@35wzD-K2v}M0Y%B_GF}2x5*9slf>h`5t^mI+s~VD^ugOi_lCLg{+`mlo%D#=56th4ZrA~0b7K_0S)oulV4O8NFxfH%ahN#3A(65I0Z&~NdHOl^bPo%U&A!$gP9w}Jq+Rd-!TEm z;|=2BcZ7}tRSDQVd^I`>ZDEvYyDrv#g3)eh?eFe>2mejY1q}#at6Vmbe_j8k7dKON zGKRD82>(1jjn+$Dzg;n;i`N5=c3c2Wb1Qe|2v0RS@LuE(=Y4C6&*?3YgKX+-vcjD>1K@G3@w(q+TBF~ z|3B^)0SxkhIscrA+QtWa=v6Xd+P~sg(ZQ?Z+3e{ zG@jE%wSMq*f$@j*w0pqPYhg{#OkY^T4BPLr()bH~M+(Sqy>knbhD=zrWO) z?Y7syc)aM0O?sURt9<^!D6S>)jlvn<&tJ+y$wSrOJO@YqvWTrAD_g4N1;j4CFZ>HD z>)+G_&3x%gcOl>8852zU0S7vZ8NaRJ@?rCNg=8p7@}^57HZ}#&g!jHbZ0sr3F4Ukv zc*R*;>FQ#OCWNS-C-o+$A+KF_(cFQ4q`L{$<&$7kBff&lG%rz zbFQD5I?)EyRYQ#~C|L+7*0VH^EL)OLaME@WCNhbVhLn-x-;F(&pKpFW>!bX%%y#vC zlzrl2P@a9j6D4uRmkdjil05BX{Q2y}Ob(Ym!edNMZ!YDt4;Tu~e=#235|?BN&y6W> z4~4RrA}0;Cp2{{A#(hXErA?_Qe)-WpK?sj+Y-rh_w-yV!{)fq+DDV%Zso$T7 z_^~?aa70Hd#)NfPFe>4bTsCR+UAVK889r+#%?QJf3G+q8@5V7Jw14H8U0CA<%J>?R zq-7UBq3Gb`m8x%3x@<291%S2!-{+>Mp(#E;&S5{Fg*=S(#>92OvZ|flaLoNct>OD| zKMozBn?k%ws4-40iB;q{?t!fTy9LsY6NaH)Ll1_aWo-Bdz$^Cg(>3^C5%*Zt1~%>c z^?XWku6e6a)dG!Um(57rvh;P$P(ebBd^*hM;E$`rsC5IJ?z5)c_RUUpxnpqe4rzu0 zKs{~lZF6r=N3S!=yx9znnlB%ob?E6RO$*+fOvX{kg^^Y-9r<$5mk z=|}g>FC$r}xmJvrIbom`(7o^b|I%aPwHLA+;qND#lD4;1;0QQuTwUPOb`lNIvnYY7 z&+m;_3;!<#J6-7T;tI0U7XO0iaHpIjEvoVQR+HURfsHAph(D6?s4%Xkz$$u>!&Iuu z2@{c4y`-d)WhPzqEf9bE)(15|``#GHC8Qx>f%HwxThJNia&0e#pUY=qy|~W1O746V zz}Vb<^wbG;Jd}AXrL*?p+9Jq_A(mlrgEpg}3r;@dz1d8Yv)bx+!~0Lw^7Fxt|A;{00FckNN zcTY7z%3B-I-l@8tuiAIIrzrz3MWEz5R@$Ydf%7MFcwGV67*)a1SVO((dGN3?;N_J0Q0`n6!x zY5{uVEPP{c@ogzKLi$qOc)K`8oy(OV<+uqYM#k1CfCXtvJa9#>*TF`(iaZ*UZ&x;u z5xOJbul*uKHvOZkVA7pFKD(6XOkvMHlB|OIO{;B;Obr96GE9|A>_$`9p*t95SF0if z@&7U&=f7OYJ1lL;B(cxWAI0qgA`B-am7@T%AWd!6y_bA5&Y@gwc!q}uu57V+Zt!XVVov|?cUrm5$s3)}n1-9_ zxMUIGpP7JC%|!-afiVUw&OiKx>pOEb$Qbi-iA$ zR;9WZK|Dp+2qUKJu-CD;_<})2BqR+Jog_8)#W&@2wH{Ojym|vUChreEY)1rm*qeq+ z2)5&rbYV5RWr%8^DjE1v-w`FM&HGzYhWWh=2r?<o5Pc>0vgEeSf&&z47fje_*1APk-xN{x6n$ZI6rZr zcD_86wUP+Fp^W43{Jb!4qnEi3F~J~t7F1JY?%r@kVG*DB@_ringa~x7{>M_gJzCs* zS`~YeHxTi>EAF$b-H$unOt*ti7L$q$G^#EjyYQDRE`B!Fu`FOH-m5tPP)oG00SHY$!YoJUbq zr)233CK)@sx;j{sGtcoCcZD}Jk@aH_hNB{DdLqb3Rg>K)hK*t7K$sQW>jJlOYy8qV zVfS7lxQ)802nhKVH46N}QtZwtoWaKPdP!KH#0T*BLdkj9S%kyUqmr1>Hwj9hB82k# zV|PVBv?aNz%w-Cy&p_Ts(|cYZmynSg2R2t6rTY+7r^4W)cnKSgTgP%ugYeRZ8A9*vLfFeBo^`+TkV{N0LUmgchF3ocO z-cpoBqYDcGjYrYBZimLlFrr<)l0Q?jq}jYa#rtM2t1p2SOCW+Ke(C`Q2490IZ5iw` z%yjaFtzF($7-D2a5ms2}gpgam!nge3MKVG3JkelN-O-60!hN)+^g`}%j2%SLqx=mY z{gdrI8YucMQ=CsV!i~vk?yf}tkPL=&UeF#LIM)+u9?klPx1=`UUbeN?`vaXSW+Z_| zcw2G$1bM&`A8Se@c1oV=q7RPBv4gQ@Y(lMx>)1iD_Qxf! zUkhVt&sh4`e7e;Z#^Q;AI(a+?r%$NMFwp9ua-WPV^&C#0GJjMYRYPRhACE<$`yJjKI``m-aX z@!&>TnFE2X_f2m@-8I)ewQu&3sG!*&YAltS2X16B7YHH}vLn}zI%NkHRyO8>l9UBn z&r-k?2kf-oVCS`F@N-*bbw7Q+vcO1bt>9PTcwtw~=hcLf8d76}G z&_Dros`NymoTf+EAWE(T2kR zT0?S7Ekj}V0k{7MQ|f$1vnAtbAPtT@)rDw{e?L}p#R|rV4RcMJ&R2f-W(tbYQQ2cK z_9TZ8>r8~JJ=eYLV^ul339F(C&E(Q~GH~}ZYkKF}i?dXN8nWMe zwwjm0N&e1Rs&N?oRx-?k$H7r;*3yf?6xkN?yyMqF&{a9LNo5Rlu8;&}u+EhH`xWN< zwq|ELo{ma3f>@;3-(=K6E)+gHBY+qn9^@!X*P{9AKw!=LVc_o{Vv%0xy%Dk~eQVNU z#R@g$3-qs-P}%&TB!qQqSi2(XkPF&I?d233j-_SI#FNTPVxk)e)ABt;Q>BxdCAtO@ zmHUB0JJt7Wj*kg{c`(||?-M-5mU89fHM)q-03sUH{fg#XSCl{7?J5Qn3V3kZiH!|> z@;B*e?Ni&zz>__LBr9U}7Ujkw(Z~L?u{c=~pT3^gBT0m<_N+K z{Q$E_d2^roT11ivS(Np%@*$Ahj}l=5wexWQg}r{R7HD@jQD)48x+sC2Ze z$9yKx9F^Mzv#ehXzIi^g5oXUAaAH4LB9}-v4WNeqyWZA)O2iiG&IG3yu(Ojl-!ML{ zX4^skVc~>Ja>Pt@P1DJt*Hip)o%LCNRsU5U!Gmg@l-QbZPBHS-Hjy>#vF5f=svVxo z@cq?t;X7xYO;8ux$cU=oZ3&IS<7-&XCjO*u^6@#t?-mfjXd~kFsV=UuOjte3}d8U9O_;8VRzl zRW0|X%<3m00;{9!x2akFGK_PGHY7%lq9B_w!ixoRTic{CWE7hQ3E`QkBo(K*?Dpg60gZ^t`$X-gq zW5KJxu>>`ez_05{8I2N?=aZ!>pnr{!+BdVV4s#P@rjp)@y}ug1)^y@90I13B>6J>Q zg@D9|s+f+(tIiFNfnTmkh-Rve8FKN1e{F@$oz;k;hsI@Hv9nu!DfVtL)P+B3=>7lxqL#*g-bLf( zXEX$|r#d$y_51ts6BxgLHXNAeb0$OOo6woc`n$8eEW$UmAwfGy*i<=i8d3_H*54@7^K_RgXVw zgv16NsV%L#KE0|q@hcuqjZXA!l=Fa~}w_Ad^Z9hS^qYcQ-ul?(rL?OP0xoo8x zamK7X%DXtYP8HdH;w;RsJUFJ~sZPhMZr7~d6TFS5wo9J%KC9ATKO_uvxF(m@X|`_sRIMqgvs(JYRmg$Ro7m|Q?_p0sZd6% z%!#9*J=qgqtA_Fg;o(rjGKGs+Ow}2jQq2;Mc)FX|%G(C5bDvH_Zn%mn8B*{^3l02jc)?>H3*#o--o3L{oX;9C zZZ?FR_PoY!wb?3vmbK?-U~;9=sTmo#ga+lC~aR$El?SG0Xh0-hkZpcr&`R}3yRD8v^ z0XauuH2lt-Jpb8QbCiL^(%$+c^=wDx5Ofwx#_IXNofOjq3X z0>)Ij-_VkMzka`10ypw=8k)Zf-T!hy)N26WD9h`_)#4|?I5dj$O>wrC1oJz`&${GvZ?p%g@fLuYF`LJEqU297S|f9*-nFkItA?pYxuX+%w;rEN{enDBPqe^zg}j+6h-HyLLf6bVSKfUohl z_3M)VWi}S=8Z$ZkWNN?}uh}G4BSYL2>DyqZIDK51+5r9$6@6=R$TI5&wrT#pELrAP zjc}}QXiDxvXNg|4mc}`i>C;y7B+UXImZDTMH!NT4l}MjF!LlUqVdakUz7z8J21GxY ztk*4Y1)|hr2$XLn6p}~4^&U>m$bOMm>)0yR`e^uaIVo5#!@QxP+}LI-l?15Ej=3iS_kVp;MA3f)M8!mVhCQ2 zYTIb!t;-SJpDY-Amn(cw05K#jZ#yZJ>%8u=E^WkO$&%`R)VgBw4jKeQM~f*8g4u+I zOwINlWtyMQ`cFpUITJK}nGSrDg}wj3>`yyym8NJ?C)a#HE>bJ)8}2J4MT)KFbHthz zqO@d^6h(-y-OIbDCi&J9ge#)f%lG~xNAl+exht__|vWQ#z= z_XFNVH6=K#+Sm1DnASpj!^3)XakHCmr_QXNsf!Q;kVmwY%WXf~CzST_b`i1rP1R@FdF4*BgSBWQyE;cn*V0 z!OxY6qhus4D2rze9gRc_O3UI+7ZkhM^)oQ(`!i{S@-afJUOKj;8}o8dXZdIUuuUpW zf6nvLj)963BG~M=oQ&-E+9iSjE`-0`{pP<^Qs{|AQFElu=~5tCJx z@Nlx|xkuUA3==y^=@FVW4~*e9vizTnGc?AjgP2W;Z|%R?y|`?V;d=E0!-Rs6eN{8Z z2E+V1N9z7HJRbeMowJP7E3Wr<@`fJ}VOZRzwgVfg)qDVUGLbAC*q)gLmWe9m-kfK1acw~o9#eo2_tl%TqBBpx0E742A@zq@P^^;Ah^ITVWg|{^DkpuALYLGauuPL z(vQ&pq~uSVqlnJW(IDCp_iV)t7gqrHeFQ{GlkDf{g?!H_@J#H~y-dLT)r#V6DbhS_ zKSMjK7#+$NI?xf~5{K#mpTRK@*unAYOrLL~xS#ojhb5~pV@*kyV?}{%n3dhxuo?3t!h6-9-K6nT(#7DgDBp$gxcWk(!~-KA>|BW%e;&z3Z&8f+S=0*?u6VH1De zYpS$cyDHsz;j(LJ4Jz?Bkp)GDk6@NqIpXU7_>^cH= z3bg*i=x?$4K0{wVf6S*lTs<|3TxNPg62vy@u|zXM7wHqpu!?~rX3X!jy_agSPagb4 z4Re!X>U*!RY5c<4*L<}2JBdRfeYi{&hs$x^8%4P-s^w4&i|>@~?50}K zo)I`;D|B7rWCSa)KK04&!%^4X$Y6Puzt!_-f2yGO05cUZ5-K$-C}|iH+{Vk;TD}+s zP@?2k31p~yLTt6KivkpCsy)*#u-+VmQv*&~1lqyg2{@J`gCO+sQ2tn9f>gY*3H)%3 zELqZs6LdcKDl{+v8wJj)?ll9Y-70{NjUt+NmA{dk{YH^f64=P5Em@`UXVLO6frqbV zb_S_xbi#Cgj@}|f-nP)=SeF+9;4O`e>Qu!m<}?^G0ZuSZH$Y6%Ae?CC+K;n$2_1VB zXa8W*`63%HNec@VF}&e>(BtG+T(SnYy`SYA=@B9Ut(cZcc{HF@bJeupGP}F`_D~n; z$Jr)ahRMCd^Q@g&Seq+Lc|cS zaOQ%V&_j8g{>8ShYGsWs2BWdkdG@{`dz2XGFWkWl-KlGdI1wk9i1mC4jnGYK)eC3P zx8Vi0$uMTR8&Q=R=JE&VelwtCm^15jX*ElZ+fBqE1d498o)<^QwJm?)ibkNV-yepQ z<rYqT!XNc16ARI}@i)xj zrysQQE!fBBl-wBmquh~eQ!sB*We088i|@a+UPkqyc2WEmDHC=47@X<*c_>_;>frn7 z51acT)dVV1v5wex|nEgzAA}3ewyx2>Ve~;7wNq?4j)t(6r|qxQ@>ciYC`?za2MdA)yroEn=u?IcdhT4 zB7ql>cGGjK%EjAceaFwPN&vPj9ooq&*sT%tl<6OK*zgAS)XegGp69nAInr?ZyQNGo z2^2;ffA4wFnWkgSs=+2sDPM8PbE75y0e}jx1dwW{aU`M2D@H`OXY?d?d^<3Yqh~{r z?ALT*Ba&0`=c8q#$hzHTy1vxll3Lf^PVA$=Bp*zRjT!s7U*U|L1MP9ss^|qzn(!it zE^uW9tDjlkqh4Tq-Ig6F>Vx;*c}+F3oLXKc15Q$xv;n8tMqka_a8H{?-pJpvW=@wn&F!T>C|BQ%79NxpGJ$aLr(iRoyG%thay`qT%jBD2 zkRT?v^R-g-%$rV!_lO=Vz{ZV7apLXXxQU4`p`7(UG08?;_u-_Tm)K9Dp_MguvhuEJ zyp*O>>=5Y=GkF})5t`W2Ss+4qs({0_<*k|4XAbs`J_Vuvk~wVASGcR-Q@G+~T^vrR z$ErG{K<$ZEnh$2RZS6J1icnkDSo;DD9 zu7$X}Il-8P&pU@_JQ|_Kh|P&6K94_Ok2ia63vynv3=bgdDDHMs>Jy4Hrg)~Z0yY+5 zsyh*9rN0N3z4g=gi_e{V%6^iCj5Jj^f38iK-#Mug<0h8}f77vt$Wnng51VkWn|}&D z2{Sx@2*~U0^;Wv}_>P2)SeLp_IE-%2%3%_Aig!gz01;p>_JQU0+JyG<;HTdY9O&0B zR`fCRraMvbN_^&j_!0aPAfiBU^EH`J=tWWKA$@y2IXeBmyu244&eX=kmAtDaC}&!M zW|ceAIORpUhV|Nwag>{5>a4XZmA6FX`@?-hP12l+V0Vpi9v?X8?qqkW9>ghz2*`0} z^0|>Ona*#ghRbcx-X8IOKbdCVZ*vhMeq8mm^S;~~@P zdvK*9fEAhqMxJ>--z37DoKxwh&;KE)dS?|<|@iw+%?WxwH)8D zD}Z$xu;EX9hM4&)e;KYK=vvGiq`LBH-1tTwm_YW|S;ywlv=ZqI(miER4ps{#pg#Go z4lO-ee`(bJ4)3ZIh{QX7?TJWz_mkAr!IITkjZ@(65caRz%@VK$w5kMeFK>i*m>QqP zkIJ$t7)2rV=Nk**E%J3Zk?7S(6n4)V4irIekFd-&Mr=WY50n2WwAW9$iZl;4H?(%!j0B6cB(l7*>NiHc0fbexH?X^g8aPY>rU2MdS!py!8=WKTCLH^a%U~&cE zaR!-k)+bHLC`UklxS3--2fqh z`v1s!%Ydl5sBL&)NI|;0B$e(OQYi@~lx|d1I;3UTx&Z4NbYL zl$&6miQ#Y3(cG01yj_&m`wF>i5u@uQ`X-EVv=hPn%P#|97MtK<+h z*BdjXpx>f@X0U9wPxAlxCR_Ou!q@f^6SZv;w_PCD1zkZ%lg#3~H;syGPk-`zG0kHS z(v9_`6C=PeME9(X_LlNMqDNDopHtMQA9MvD{8#DZ3rgbbabO7;F9c3ps?6}GJSEEY z#4?xEY%Af>LHoNvcFZpM~&Lfpbp-&-$#-J-5TNhYPfO=gkhHAURqt`@~kdy>#6`kN)|X?Pvdaxb$b#E z{q1sQ{cc1a%7|?nq5J4Usl=Tl)5R5tj;6{q@lB}S7fX((k3TnLx!l`k^}nI@E5$0y z47>V$33Pz0Tsh;z&gg-{Q?*M4&}GkcheB;E!8nv`{P*XDci^S+UA8-u)mcj)MC}80 z6Cm*sk+C>%JCDuF^`rWm%^w`^kJyH#^&DNp*q*OjlXXG!N0uy@8C)VVz>LAyF z3Z!sDrKAeJm1GrzBl?8RTW-&DEPZ`n%JQ54XeViY0ttQ>)sqp&^~>aU_^zSply-kL zaXv%oWLOH?&9t8uRKy&DSeh@X#HW$e*xqWDl&Nsqj=L+0I_R-&3Y!slDWYoL9njSI zhD2|~XTm;@J9B?TJ?*rrVs6{=}Qk8?^2nxG-Bj|4gUzHtab)#kgiibid0FuEK&kDz(UqA(eZi zxpz=wm~vcDu(-|1Br8Gj9?EYfeYZ&X&J(CCDs^FC50h*9E+8)RrD8%ID>$-)_9Urx zcAH!=c6?*#{89Z5FY2H#A^6fY3H|dhXATI(?u>m*G>_fpO8?Lf#uUz@BQ|;OZcGsU zc*1p3DEeVKyDDYf^Y~KHR&rw^+r>_nQc;)sW40sVyp?Eaw@EzlmQN9}9kCo|bj%Z) z)K-j9h6hO?nz#xw4k6H>zAqtitPNy5ieL23hVSJd-hsNLW4rN#CUaT) z+E;p4!o~FM7acKNa>Q>VyyH`r=OU)?dpH>+%<}{xVW5+Drwcy(->acJF}Bvrvrt$L zPD2(tVZk^Bhz#`$W2^KEUiL`g3)<8DlEe1?)zjAIYNC&E;ogaaX52}g${M}96R|o8 zT_0SkA3)#I>;G!&Ue83pJE_1y+szvfaoRp_+B)hh>j=>5ddLJn`VPDmqWtB^&eU0H52nKeb=vaM(OY}(#Q}*)u6mSF#dK>|UjRz{^d72OAR=R%duurDJJs_YN^EJe1j zo=%1yyJq2#Dy|Wa{J3Yw)3t~DB}jo`_DI51JUN$_$R=L9w%V4>Y>JGNBL*bAngJse z#=D41dhmFnfQ>44Mq%Z-bwIG@`nw?Oh=4ls02zk@0*87f$uy{8mnkXUIf3iB`I~j> zWiu<2tpVwx$S|UOugCz>D~gJh`^O zSlhn+Ho`L@nFLz1JhhQRS9 z&DieKCpmYIeQi*lCQlg$yUEo*y1g_ZpbN^}YC~#13P{rGF!kp1xq+&Di++}8X zV35ho`GaeW+)!=svib|>0-){>+XoWmxM6y+H#`m#Kb zmF^vzHiB?=G@pqrY*=g51||MV=y~#n-{a*b_DnK2wX+~($lP)Sr>+s4P*6}|`5sH* zO^%aj))6A9aHSm`B>RJa)s}aUCcyhHISHfPmPH4Jubp^47ZE(08V?{`S`s(CIZ(Sa z{aKyHIZi5ESbtQlkh=|skIQg8^`>fhX}IKl_I!+Ji>KKB8CCeFoU7A*Y3Z?#&7_xA-x`K0&6*bRdBhT+ zWA`CWk-a_F2Zg`v3+{f+#ke1vUwra$Wk8+dNw{yR2!l%Q-m2oDv)`)q2i@nbq`mZ_ z*oq$Khb4y`eB8YhGe^1GB5pI{ZhV#s8JcO?5((I2hhdS8F-HkC2Y)gJluKQ4;*jUf|3gm?SR=S{?2?R>N{$g{$>j6w_A>_ou20)O4B{}GDB-iMK60MinQ3t?H@!~_en~M)>iSim*L7Vvo z^B>2o`}iM?Q{Y<%gWZQQR;<#-AUuU)Py8-@0e? z)Z)HYW#M;_CwmOHp&?@o0CskZO|0Kma`-ht8H|7sfnjY)=4~Rr@+kHQrI2N?14-gO z-;`B<}U zNED#J?AV@T;MsGFt{Cztl&X12$x-Ewut2N6MKjVWgsWp5c2`Fl|N?~h7p zXx9|m$~DQ5ZroD3#|R^c9NTtQH>G-vbv@4xkm-E%njIvwdUYw%gBvX#3ZJ~fY#|=Ce#>! z|Hs1M1(LkA-5?tp_<<)E^E{=RGbhpeXSAu|Dd*HYth@KL*2`r~E~7+vZ*Jartu1>m zx#7*?YUfeg&#E+@85w)3lU3fN4D<9Zfwv3}dhM^+zEFDyCwg^Muygv=exT^hiM{Ne zH}LM(`5;Hy!MBE?_V*(bPeCUn6@;A7@t9}Z`I(nL_dtba(gVC~j+cwniRb zMXtHp&@_jGL3~IE9VL3Acn7wjR6!}+a0?YN-RFGv&{n#aqQpsRiU~b#dcU~D6YR!mCyHv!vYVcO_&)$`X)&Q)SfE~|GLkEWUr(AQ1C((XD>CSxBYl0 z@HylG{J>_Lj`S2?`HlHwHPCG?HV4`C*}SI2tV!_yITYrsEHO}wCnbzWnhfM}A4A>l z7|bp*zG}%4rgwC?7Mh74eYkdwg;pgG zeL&0Z;?Iy3WceDw^gre)%k9vyoRiT%Kn*L)qbBb zCi`(@zBOm;Sq&81S3~bTtx1v~7|+jqzY=xl?%S6H`*Zj_^_@?blfr(oO)2Y)wMyX$ ze$Ms|z{L?WYc(W7pE}R6YQ&0vUlOBuVnYx;K8gUHQFy;(Ft))1nN>nt@ezHGYkY2F zaG>MNHMJ=VIN3N);@vq4I$M-tzYpn)GBwf4EBqO^asRDgU}c$&Ke@)`?6E+&V?faH*3#=wSC^Cv z3yy#!FY3JWk9)<&bp}}PpOhm=J*MJKvMi^kSv<}cFUL@(tCt6@a!x@7_}@tQ4Hl;Z zL*{Q0%^C8duSIjI-jeTZJKtN{u?1kcZtnxQ80O#~_rA1IWVe<5khum2_eMRtfe6GW zZsN#ltD~S+Yps%7!A;c-UGsv)i!kHn!d$ALe2QoGw113aeqw+T9QnJMNTnJ&@Fr&C zI`|qfg_~q@&`grI97O9ze+)^jz@fnnu1I$LD9|70A<^5v0EEgow9cQt@C3SEq~Z@3 z=h4Qqo%$i>)++{XJp@?}Pc&v*kCIN2)0z1Rs4e`w5uOkcc7kVjXtWLVRYA!k_)w6p z1Uu7%5e)q>0}PvVopAq_yxTJoB*5IA@I8sV@U`4o8oDE@bLT~gGBX9$?+*HseA4E~ zevgaq10!DTrI7}|();|8>}viGXTWT74UDKh;ddkVCHZa^O`v|?|MHWvBGTM6{PqGs zoo|21|K`nD@-2M(lL#ZqeO*VNu2*Rx?4x~u*?9b9SU`6y&LhJ+2c9Muw#yIRJtQ_z z7S(?HVE)cC=~O3izaLe6kV`+DeBMS}T;?jibftn>PC@>axIxSJEeA`uJG$*$3vbZm z$GB4W7GObU4T8ppWWs~w`GKx}6n<$duRE$37Bilc=kLpHV{gmLjUK?T7DXT<8Ns%X z=y24C&}N{1#9+U`Co(x<TUQ@&4AmHHG9myGqTzE`yhxGg9Yn@7E6&E$sg_ zxozq{f;ej{VeWHaig^SBX)2-(U=?kzYGl7i-25x^;sdkAs|BW+s1lJr|k8{qRZ|EzBui@LIF ztnm_C5;D9x>;Z#6-cY9T7z(_SO$uT`ows*Y%!U3rS&?n5v>eMnT2W!d7IhuxZ@&h( zK~jr{SZmGPe(bJySY+oEhgjsdIlaC`27dfiIhH1aBn7lgfBfJD>L!Fi)bl$E|^qnd-sKs*M##w(5diM)m_o9wvke;2 zFDCjFe0c{k9{KskGB0IjbMO`PKTKzyV$a!lHkTk=0F!?n!}EnTI(ZE4epqXx#g zP+`=-BZ9?F?TbzsKO2}o!JliRO@_CIy*Ox7D4$%K)EPL#@c3^W4-S5i2J`8el@zdQnTpCSQX4n|i~j9CzyHv~)3^W)(p>Z&Be<4gy+|`+ zj>gQu?GT|IY6e~*_D{q~xY2g5-$52_TfiY3au=0*<(rX+eB9!91+dljInl|NBJYd- z{p;>H%SKAP7!Vf{E};|QOkmut)h21Jpv3uf2f^`?((^ulac?_WDeGW=ABaoXo3&x4 zi^i!90f^oq0_}HW7#Yedc+Vl?69{l;R~n(T2V@fOM>gAFIQwv9hS6+m+z31FqJaaA ztgt(k7GQv^!1~JgNtqqWbRjQF6|l!X6mq+DhsplqxmpD&&CzzJPfn?z)H;UyQsR3| ztG(uPiQ~7VQ(w0ZN7;8&I!SICw6D1I;e)0>uv4fuRsq&ONvIwz`zLku1zZVF0hxCC zf%PA`5*vQL(~xr`HtuEf9$4$Qu=a^t$^JjgW$E)h$?{d~ z-WtIHR(|A)({A?`>p6R1K{sLbn%7G`(@q7WGe*i95yJAn_~0@p@qgo9!zjh_%#@GW@HuYvU8lpxK9_K(BDYcd-+ zh+LwNTu0cOWV@cx6N9Xy&@udMmK0)kCR@9KzD-2$r>7SO(#-LvKQ(_im1dr^fHC$i zpTu2g#s@a|q#6R+e>lO_T_v@5HaSo7=NhzGoSz@|El+*e_^tne;VNG&&?SHN4IwIF z&EWA|55k5xi|JXK#ioTT;~rxkXt@`$bbN#3Dec;Rud+h0=ckVQt#z(FEyn`_md&gI z6s0!&c>U($iuHPcO&9;pDNxz5(7F@+FR0(dqQ^90tUtL_$WeZy1<&5TZ9d0g63&Wh zA<(5nRRl}K?Vpz3GafiYW(U_Q;%-0umLXXw?8aQTV>0h0iPIi82f?>@vd%;%qE$Mdo;|K8#k;^2KGqz5wVr!Mv5+16z zoR6?^W6t+|A5lGL>p&iJnO9hhbM>h1-uIygLX4|)LIi|)MN0WG{6ES#@5^wJWcv%F z4%&4s+x`R$ET&F1+$r&bmJd)}NARHPTu7Ks5-G>KbnEaKEI|f!8AMMhTH2Hmz6p7q_?7C~adx8|-BG zx_>et6QKRG6Z7SR)fAtbn+qrVJdTRKuZikKjW((qHhJ&)52zl3f^U|((0o1sl%7$arP;X+Rkmv<8fiL12)szWuX07D+86HS4GX-O%hxEM zJqT9nAg#Y zH;lPJJA7A#9Qs2Qs!lFz25M7hJCt|Z-)Qzk392F=>$oYw_NkHqboKGT3B>_7V(Ge3qQp@ zQPk5Uo=@j?~^7CThm2pC_-c z9i?b>AxciAOc`8Zh%zw#Gx4<7&pGxx5O7y#M3Dik7cmAM#6=udr zUf0+XDtOK}De!}$XmV^AE%GeO4Ak9PrI1}lWEMCFBx;SpXF(bW?h}&E4!(@3u$508 z-M{2mw+c3#ec17=4tDoNm%SH)A2f3RE2QjOw1Kg^1>Rwc7H)BW`eN3H;&q`MY4?`7 zO$#Lwp-($|K#K@F4a4V$@fQ{c9$q)jz?G%6c%W}G^Gk0jPOG6sjbaROyKYT-uOv;*7R z!%r*l2t_uYMOBos=sfngyL{Kt4u5Zg9GDO80+D0C36B=e#rfAUWM!ceI9pH*?bMV0 z?WGp+JB^+dC^H7bhiituj%VvP=D2in*H{Y%`6xh05zp_DI0%S8K1c_7pp#+X0O-of zULXRpoRvK)+w5b18WY|mHX)@lNhdLX(1p;ZjW>#Ut~K!lQ6WMC*56bkBN*A0{nLv2 z2e@XHK-4ozmC&j(%sXyAUV8$3o$GCfDVN{w+k5ItQw77es;EIWSgKI@@KYK5bkt_i z$i|gqU0owcrQLbSXdikwcP6*@J4-u439)`c-nxx3MXtP(pn@~aeex#;hg{6G5k%$2 zv7_QbWOz~a^sz?{Y10Fki1f@DkU}lC`vtxKp{P%Sc%~%M!M4Bo?6m0)hClgr&$rjM zh<;Go_qLPbp{xQXaS)c9*u*?)eHo5qFl_SL3a_dc=?M`IM)>kzFES3fKCB4d5_r?8>Z0#SRp0BIdo#WjgXjdK?{)ZF z;z)xzrY?-C7KF~KU~kc203E1vh7$mbdG`xDJ@i#Vs#D}eJCzu)doN_q72^2@r}#MZ z;del!!~b8bHV~qqV=*AB1l*cQ6*-LcjUqXVU;0M*+~*YzzX>3<(+-#d-Ku4A&d`b; z444-5nGI$tD}S09OqwWN>%vn@6Eqp}RoEF=p^5w%^dp~$1&?7dr*x6FL=(??Rg%J1xbb z`;-S`QHi0i@IfxXDtzEhj<`}YAq64KFt=^|>7rfH{is?o-yJD3)2AlOjnP`yxG!i0 zd`&ax#in2P>hPv}g)q1iyzD+h{7Vs6^btUIS2dCCbAypuQ^#P*Ise}m1}e5A5?YZ` zfhk2hES|4f&12acXhlB~u3_jO;euTE;q+CD32#yPMF)gSyTTI zECoY+I%>5lp~J@M=*9ySIcZ(67jQ?P2t29_!0}eo|5DSHls_RwEB`)e;83=WtI4$ zrA67GvjG`*204iExyVzxldu|wSGS&gJ(Px7Mz6y!r69FyZlB}Qdf*q>py_|rc)U0TB*wXHD=eV zS0Mf0fyb0|#2QiCUHA)!zItrb-3%Dad4nb{UlCBjwqo^P8o4(I(4SWHLT?6rvjn{c z!@erTbZWGX7YP4+YToHo>2TID;?A8JtzMFhBkAIW!d|R#3s(7QXKCKvD2HOwv}QWl zG`floRDqoqdcjv`a47Khu*wZ>xPN?rh5%NsiI%{BH@Kt+RtBoni9;;iklYBBEr@B9$j=pd%_MkB+%8E+PRc}8Jwtxj zC!ndEI5`nkqj1H!eh+?KN1@mSBhy1x2s5nqiIygzbM0St;vOI8lZFd&f2Ay?c)w#_ zgYj~+)V|HA(>VLa)4v2W7pTB*aT@t)R!_jppKA>PX&(a_5_^2W=Zi$manC{vAFc+y zAScHYT+GOSNJ(|z*yIq{|7`bjSyPPp^}>1Z5F4p~)3}E(y8+6kwd!(ICem znFT6OAqq~s`s00Bk5o)7Qlr@0F>)o$de665{b?m+k$^kfZM*g{b1s}as8s2@P=@i> zC&b(M|JfiX0#I6w>Hfv18u%6Dtf6F1MB>}F8b$HR$K@Xy1owtIW28p?W~F&mmjJ6>b+ls8r((0w;~(yk~ZR{ZDHI&s@Z~@y<5E4+P$1&|j0Iz=g5`dG55!<_$IHJ;AW>YUGhB_T7|py! z+f=R>@}0v$L?B7Tl7ct>NjC9p@%ncdxg#JyS7SDQwfBMP;@tBpo6}V&WeH#kyG44j z4Zj*8ld1ov?^}BlEH8RJX%+czCX7|m(w(-8ROOYQISt~=t9kPHA#I;mSmSO50hKR$ zx`fw`%^$wAA4KTh_$usOlAroc%gYBO%6rbPksoTXZxib}2XR>Jl8cI$2%);A` zA0w71J-z%m@9S8ub+du7lmtcLA&2to95|VN)u4MX2eCvi(v9JJ#Bz!|A1mSnNNH0t zPp=pumh#C;M(hCMZVdGyJ=fw3eRGkw#vc7U*ByK~cpLGwFuO)z{3yrFVxL`llc8r~ z%c7ED5aXusGg7fv4S5c8QUzI3zgzW2Lcv}R|M?@KYHW5*p%(+fHg8R2%eIfBBGZ(p z4|*{oZAZ+5y26Gn=KIhNW{%r+%cme%I{GJD4!sS5xhR+Gt*ZA;lqfSDRzGz*`I7LQ z{qkpw-&7utRFnA18Tf-#LjMHCSC=Ah@}9*D&BAZ-c|iXIPBa1tUWv&?1T*qO&LZdF zYZkWQ1IZ*tdW)`nw^Q<;3q3QxD`{wz9dYcYXM-R0FzLjus_e2KHTiUP&bOcY@d?&JW)HcVZc6=>DH#@sLdLVe3_22IqdkLUKxijJ#K2;T7K9nfMTc7xwO@l0m(R?P{Q&x z+!yM&N$5bkzsYiBsx#pCY>SY?=EjCJb!n}+pPphmdiS=kb4^A?!Am*tUA(?egnf9WB1vVzub z4j&I1Qs|Y`{Jb#(o#5f{j;Xcr4ya-1v$r_vJW8g*1rX2XBUF|C z-GG52jRW!UjOl#rPP&SRv1Wu?IvKIsz@Yy-?`Au|i=Ki2KlhvR*-vEx+YM6026rGm zcer@#gA*0lD3ZXKGMgPmZxUO^LsVT#5i4cR78C4xJGRei7EUgHhHzkV++!ohd-hUt zJ0-Gz=^{U|;f2KZ(K&oG6S@zrzk6 zV#R>e-NQ`^-TIHwqW**zP?+s9y2f-6jZ&Ys23e%3B%}I+r)e7Q~kqb4*LL&RPcsADJW+MbIUJhFl&fV zBc~tZlpa3I#uRrh>4cfGVPq$6(FoN4>o>7OJ%Q@vCXjPio5`WRTqCM%Ulz(bOpO!P)<+2p)QF1oU`f*oJ& zf$QFoZe*o}DhXospA1@_o`qakXoQZ*brhxcT}A%zw*(+`@FJ;_sFZlVZf8r1^fBfo zA0UA_MYR166&9qVknqRZ2!O^*-Mt{ZjpR$}Yr(*Jm$2i(<+Umau0yj3BigWn8?W}u z!{ufxrJBMCo0w%RhHzo3yDA5v=v>0z^rZ{e@9!S#H*F@rVr8+%7U0GX|4I7{#ITpM zczIEBXqlHX4L0$HIG9nC6F#c_&L@K#dozmUy?5J)3gQJASb$uL8$!wz{qdKp5Wsk{ z5{OL*M|>jqccD1eQYMvP(0-bC^hbATHh%rT8x8^4BZ0^_C8{H4s@bU2N8)D}s;(zy zOJol9EJQR~_8+Q9Xd+V*abVa&_OStTOThk8KgR0bEfGbobBK!xK6ZZXPk$QQrtVpw zSooaJ4)WQDO3ES+u$S>Pp>E=}V^)Ud;KfV_dY6^;ASLN@kp}<`62hiju>KhaG7_JI z;GuM1>!*uDj}_qCctW6Gc4lc?z0e~AxJNkS!_Dgjvo_3IPp|7;?i))ho^q&Sn+F2Z zH%k3IkPuI5)zF-eE$`4IC<&JrdLVZR(1M5Wv_4Z*(1NlGnkNo zR|N*I65MN$o@xYO$J^de0waDwvaw`f=S`aSJy+1aduAnmIH?E@&Id=hh6$b~zo?f?w?Ov)~P zkxx*rl+?=@f-|EMmUH9T7&LhQ^!8ShV?>)f-^eW3!{+3&-PPtv>Ic~hNO~_ih~wrj zsY8SF-wvSpzKnM*Jdz4)thNCiiXtIX3sDHbH`=l3!0&S2Co~WOau*;;LqP4-$RikR zef5<-^X0gSQd@aw-@$Hc{xHezo8wqEMDUJ2PP=Orpj<5C45S1BHwijiM@Al-U}yaJ zc+0k;ahx|#dj^`-gXiE%%x;c=zS=P{o}KuGN%KuqvBp6cCd>dN8jA+A<1j!AnkoV6 z-Xw)}jFey+=oca7g)Yanb-q8y7MpiQDKj{L4n{A_*}x$8oe{DFO{n2MGH35`KDy9ObGyz; za}Rw0{E;rSlVv7&6ee;-Hkkb zocw*hBon=aBDOV%L;}MLKzH{ohFLjm=IuGS8SMsJm0K?L`*OQapWQQj9h2?)MQX`; z2_BJ=)aWTm2%@hBaDsOis{q||Gu2A|{81B@h=6A8pgKw%-rh zw0?l94#WzdDRHtIf;1prls-2wvSCG$V>|R@h$V7~^NI?-eVi5bmuZbqo2*WZh%PWz zF6trhSrhBw3_3o4b9VxQG&6T{exr9c_o0(1~Cdwtji;qB?Vqo zZdwB#b_|dywO*`A?VuFO67Wsy>^o8od?;p{&*XxAwqGrp1JuBYs<&oVLC4fU>7N{v zo?{a`1{fiB$v@A}Q~{R^Fz~+kkr)ZK*95OP}m8YKOl*y{^!?@0A?ONy%38g zlmz+TK|-tK#MnA8?1`uYBed7j`JGkL1;Rcs$gBo{qklpb4N+EZ$fzh_1yFu@(ptU* zbff%9mt)#QaGQp@&jk@SDvyfZ@_IQ;FC?G|W&f-Q@dDxn**ZR9jSs)v8F2Vxu41p3 z%aay_?DR^vi+>GZf`{WwymXQ5Fsw^}mP(ec#xn2Jc>%co)c`6xTjFIGCgL{k!ulF7 zFNjnZ+rfvh@fpx>x~yTDTesC5^fMR>*RPYS-dV2u!C3mx^fKyaCBW&wos^lTf;9$z z?AebfLC)bEe@{5!yGMEB0OsCS21SP#rLA>aRG@?2pCODR|5V)`@DWz;u9X1x?xZBN zMbWxE!bU_Q{p7*XBmzpdDH8GOlJ^(3md~D$nk!sBYOarToB8Mh*xmdGJlLg$v9G*L zpWVKmb;D$qT7i};i4K*8m%0nYIM4^81FcE)IEyUzQV!93*VqzZc~3V+oyZN_i74vZ zmYrFsnS;|Fq@tG?t;E_}f~f2Jl(4{W#acznKd~sH5`aO8o>xQZ$qBGsB5p$@K>n-m z9%!G`f%H&5+iS%MYbfiLK{uAy94CfqfTTSGWCHk)x%wU1it0N9e5-3mXIIoYvU%}1 z8|#@3*v<=-CubO=>EoIIdQ3oVLm%tmc$95T^pVhvc(0NBNN8vyF?R~XG9UaT(|-ah z{C?c!Xm0U}RTV%DqQt(9m8Jmo4kbXDfDS2;><+(Nb2>3kOT3>!G7$it7j^4$7YzH* z%h=1h3c}U(Ibgt+$o1n5g<+raXA8+_h3R213|q%EM@!7Xn;WY`Pk%IpOkv^w5ql-t zPbiDp1^k=cA5Hl6i0-gsnGD!3U071uV7A>MoZpJIr1Lj_hDgun!`15r=oj+YN~#t=J;8!ulz zgcdS>;&XDIiX@})w|xqGGu2E~3xqHn3;vtr3MEY!+boc* z1($5$>4$UBDY;YWId~G`>TT9&`F*_}Zi2l0DVH2m;nyw^gWg3yopgCk|4Bl*g|V+E z34C$$?qPrJ#Dz_hsnwSv37Ky-Y((?9t0hds@8d*fRsmisUt>H0lAReCmb*t5Z(w57 z_winluBNzVQ?FA0&8eEM9f9J{Z4CD;KaS6@r_es{>Fw9uq`0jpSaYJ~kwdjIF~F4cOTmXjXM zvk!xJe^)gE9vi}=Xc7ODDOo?vg*nsqu@u6FvE@Dz`1Sut0hPUL^PocMmS4*XQ)dP* z%IwCK^^uHBoX8l)Egi*ILm_bvS4%6sB*c2LyP4E%f2)kcSU365cxfwoiP`3Q?cNg{ z3*G2ne81(B7muP7_G;cLBEuoz!nOUnSt!x(7l(|CoDKeukq4hvLLPo{*@vzW|6QiO z<6m7uW#?1810Py;)7*3b%zlxrF6FQGV#W&ne31~`GYi;lh7JB}v2WO-Mf2U*8E4>D zdw7%m=2+k><}D>SE*1mW;j4z_Ka2T#ukp2s?}K~E+hv7UT~Fe{9RtC>j{A^0x9?C* zBs&W(tns98*oiKF1-(Omjm1{=qLKZDHM%s!X@;nv;KL;D~H z6#*xlcM%>~p>M&cyZM?S4`eR=@IW)w&`-oXqnE>%M#4LGqj?{#sNI7C?qWfoeRRV` z_8+n2yZ_S>uP@b+4q{2A(qN%VPb)@$AK3^f-{IT9_EEsF%{5H6Vt>p>jX_&|Cii*{ zMkT{>7N!h?6jE($Tj=orUX5+NKQ3TW+g;AVzb4L^|0F%MqAjQ}xWMZ;g;M-;2Lkd9 zqFD^90gO&>&*Q@U`Y~s(-HXc4S zHb5TWBV+eYCI-~!w0iIo2$c80eAk7eald{Bykv*F?L)=#up>_c7^&=?S4q(jl-cWm zNv)Urn#kIOULn1SzkN@2EbWZm!M+E>A@A_B+xu!Xwv(rUFzDJP2A& zMA#JYQ+tPa%d?fIzQhNZLbe|!Hv*b1V75!UyEm&KEPMy$h%+l&y< zWZZ0~NBZCHXt?dEA=$lg+G!E&{+y*{-y#Sp7IM_&;?Tv&aYl}jTh zZH*J_I5p240rGY)KMYYpxCdhCtW?Ee%HN_n8BM4OI-FX7!sCemtw6uG2bo9PE=P}T zE;eohrr1=ph|-U`05_{a?GA)-H)XITt`t43 zyw0TFz zVm+y=bXMv{VW#Ty5dRl@hlA+VfPiwp0+UKytP9ZE8O}FW&)~BBxUETiq5E5vds0#A zwpZ^khVg7OSa>4TEbSxTKl20;*zMCyW2qa6Ebi5?dNC>9;8TO-@^2$W<8*IzJ%Q$P zqzoI=+}dFvrC2*YsNNaiR(z-ZILxSvSlVi$9pmBTn0_Vvt`hoH|0CPy-5<}bWBz|@ zFR{0IjfObU3|ve^u1H;vlB31v1s;8mOq7^uc8H;EiAEFhf*Pby5Q%fBr{psuPFogAv_o%uHU$5DLAk{$?Wp_zeOj#TJQJvhYCZVg zVC<0l_R=Ny`1YX>J6j=>MGW;v%FE0du^@ih&zH7YKBOx9HWM+W^Pgla@Nd=@)Qggsihr+o?Ku5UD z(k8pa7MW4dyU@e6icxgEh-_5e@;WvpyAL{S^Tp)VPhoe=V?5SH-3TOEqjNLW^~|Z6 z$L}gCUagL%3K$5qEZY0Fyrs@|cLBIRL)?7qKZ2o~BG+@3;n?0YoaNdNldM>XE;7tw zv45LHEVN&-BdPBIMBfwRP@UFM{cBJbFEAX-1>6XLuU+{U(>MNWI@;1g^DR zbPhH-;{q>CR5C2zMF3SI`fOxphP_I5x@~Pqi{}P5{6pTnz&yRZwM$J}u!)qB6q~2M z`NABeS-tO+X7wj_Zs!kG`8H>~}eOv%P|C{0E9#@OZ&R@@h;+LTM5qdZh*0$3!gcqd3-UiXH1!*y z$BkUv3({J|qVBVZAl5EfMbDM&KcxoJ^Q|Z6hbt3WCa7qpu2Q;NjHcB0wN+HUD6E#(jhGfDB&(4 zAuULEhe~&f(%s!ku5>TE?|nVzf9}2C__o8$yw5!Is}X$SQn0@xEq*MX$+PiQL8%(E zE67i+PEzUP>zGZIjsr6T%+H z=^L$Y#6oo>o&gu~0Am0P#vbA{J zLcYgtH{gvgtgvK~H>}rM+&nXU`${dI1q)|Y#bnavx)oaWkhB3geOq;v5bQIvXr(d` zM*25^79sr<8zKZEefXx^tVj7l{f&!DeMIv%@6Phns@}M`52NpEI8U3b98VS1q@13G zJnX1_uN{;2Z!3Dl#rlv6az{rnO~v*_i#8xVhBbGCt#;zRyFS^YDtLf2s{d};>CI*B zC#(6Y&jCAk)Fubyl+xF41A#?<9oclOC8H_ZCXnU}hSbiSo~!be8F5N12+5rF^P6v;V!AXm0Yy7Wm*YnK=16FLxCE z#W4$E4vm<}*#Yma{LQrhLJyK90UOVf`d$@FKhG@?)vCa>Eq{+h5cS7W?zo3*TB~<>c@LJCZ&lQ zs5%0$od0f)Qi9nDeen<(OA2eiQ!8*x^{O7r##gL4y1gK2PO8v!;{~x%TiS^?5$jY=fWgA{Mgj;f8#wn#qf(e)9RS3gf~aG zIb6kIp-tp8h6@w@oZ`Ht^vrf^f1}$idU?qM-X6kkeo}xDp*h~~r^REc>-Z?H1Wuj^ z=R<^ddWlU>M@9Ae0*R*+rEM!A?a3qjaLu}Zm=ya@sb`DBs5NQ>5@O8-`Lnzn!Wcfi zmrwA2LiB?ewK=V<0mF{MlWXh+7~V7i#JWS`3N}ek$v$(#uG-}1WK#c&c4;){gfwhd z(Qo86&C~i8p6RD)C}0JKCN}MP-@~K%qcrx?0zCxtkD-0NDuH|Jps!;yDObQUXLBw# z8l#>>-ooDulX$}4H$^KqE0JBS_}jgLM7`1td;N2kG!9d2GvFp+uEPxtmv~EtOld19 zdAfVd&YG7a0*qO2|KE-VK@A4|GXqj&x?8AxL0UDdQS+K+Js`|vd?rw*h0_&=vIXL z$Ja!r^v%a|Yk;^L%!n+*FLq$p>BHA$VkUof{Dj4dHLHy%P<2wr6Rhv{`mC0&7 z+ga(roQ5AROOyV2h@)OF^uR^N?Z|skPTe{XJ6@kyAVn@PxQ058oAO169lFN{jR;SJ zu;R2#oTD92=ChpfX=SfG{LMc*^{C&BtfTx8*S7l1?tt4DX{840Iu`t8Fi~l+5=Eh8N#l zi5`JJb^o3D<3E6-XYZ=8J8Q_c2|9-dtf!mcwQB3I=S zFrO}HSO0QnNo?!k-NyA%vyB^Njachix_lQU-u%iIDqmm`BjADZJbBt+>xS?e@6YdJ z^R)1~ZJ{pzKRlE?U`P%=K|yhS_DP581@iFj-ec;X{j~9B9)|Kwn(W z_X7WYynlYzdj#wU1?F82y7BDCuSm*AK6p*rS<*w&pt!+OK@Xpqfc4FF(mv+BQr|Bhf|oyKyBf?wpQCTW8GFDjkdquQygpP6_*TT_Ke`~`^jur&| zbhdv+MR9#Nr95Jvd=h{qllhjTPx()UV1s<`4s|PJu`W%1AyAI^-tdLwMFd_)_bAIk z;)5Q7F68`;m#va|*_sNPlaR6Xiyc3!^4IxJ*ZREp1mx5~8=>0+BzyhSC~%F|PYHn3Hy9pM}gIi=`ixW_;# zY0WU>#$@={FIZpd7psT*2dARcx>x++a~Z90kNL${B?iW;^;C~oQ{EH^Z289drZWTw zZG$#M;yH;0VBzT-gU**VYdN=nE$++YKvp9aSV9qe7imlTs=6tUZlyVF*OJ(#S&NM+ zyxgmdkGe`bd47rJ&faq*5gw6rWm(dlG#dmw@vHM>y77A_M%!jc8^U$omx)~UF$J_e zzkfaS8l&o9Pw7ixtd#l9h^bZk|jzc;7c!Cfu?_9xbRt$OLd&#m7a`xFMFWH)qq4QCeysx-P_(9LL z1IN_yW};FO#8Trs4KCLPqTpo1S<;$(;s1wr0m5V*7!hvepd{`Ks{tTq$AxolvR!TU zrA;Pg)+|Rf%Q75wRx_tj{HmcRT%HCZnT@KT7R~xBN-b2KmCh{I$X`nRwN;g`#lFcd zfk*VKPM_VSq$kDG?czM*=Szt(_Xrjrx*x4+aY z)1=;`vBqv$^On&k1-pbPaXjv`T9Dqu=((4aN_59koX4lJL9n@9S z4Dga%c#3{Nbgn4H3gTvB2Z>iGGdlzmE3R`$zAC%cAVslKpStBUB(ziNXfi(xrFHt> zkNb9`d3-Xb^v{=$Yb04S(VX&B?>5Xf(kZ6R__dRjI?j~Yc^O~45!}KzQBXvSp0e|= zX8%Gfr|XqRxV1=F*#ZpG#o3q*J80KdINb{Vjg^T|==2tJMWQRU_MhbLKNAX4#8u66 zVO3?CE4<~bU(KvS5`EidYei4rR%tp+x)9Ea+LKyeRE7&28i$L|=z=B?Guc4LJG#tE zAY=nlq+sbA_6gGT$F5Q?_h^jM$g|0A^Ztz=gAc$x>&M@N#btShlw2w92D)oCBa^A_N zmiJPC8Cii^w*<@@_X7EPeUkoS3}*7SU7L2E8e}Z=LGS3hcJJGQM*RN(l>Ror(GC=X zpq6PjQo6y=enENdfER?X6E6~f^Q*mitIbkQHT@T|g&NU$rO$LlmKl$FJ?6R3@&u+sM7PbPD`x#~ zqcpRnB0BXJhEb+@PJD4}lldH*de*_0UD~ZScJcZm&mr)JrUPfL7e6E^=@$Lc6>rV8dkx380j*cjPKV7@Pe-scoOjx=Zhcuz7>E`A}pCr+Ht(LpQUq zp-g()cmMk@ZGj_VqbFb9xo~AY&JMD&yhF_$v~{Y5wg;a zCH6$r0SIi}FV6vc-m?Lv714!oxWC>GLOr!YLF*(Bsn_P0ol_Ls`0Gr|a~M&ULJUdGR* ze`AA76jC!6OO8$%kHr%rkz3S?r~$P1f3_>BJ+LiBbwqkY+2!lP*SQP>Fd?3)^Dxu< zI1|o#(Gsx9YNx7umfX(*mrTDW7siI6Oe>$zK+e~=CwJJ?zbOlT*`?=5?3fzO5qaX< zEdkpv#dguW+OV_rmm5{Or8<17wMryP~!J9RO0h0M{9ykZLS=Q6vl>+?q!D%RGCnp_?Z_IL7A5}Pf&=9^Z$T|qASP5L8 zFT+rb$J&ocrojRWOSE^uUGfw*t$#ig2AVW0jfz zZxCmez|k=jPHto-*}xV&qM$IUKI*`_44Gh9l)l)w_sIGlZly+9 zI-Wm~%%)Zk`h+LP0bvE5g*V>_ z;&FYp(XQ@z|N||m&`eI%Rp8ZQC>uL zT_F?ul9J1%894hVHT>_q)7pt#0rWCcGgPl95P;S2MnmaoM;1*Wl2yg4>^bC9*-=`@ zFa;(rKyOvir$n5x)M0pv!+bHm%wh0i>q^n0L@tng8~t(Y!kBfOJfZzjvM6TaP*|^) zKkMpCg;V_C2r0I{A#vyDGN*^Q6byrI(f&A=na(G3q&5a@tpCFSo{v*S1M z%XV6|Uhyckfntw1SMJ_(nmwwyJ~V%>0Ko^r{=W_2|LAh;N@Z#CUI)(O57e8FaC?@%NQ`y$w8AkaLp-03JoR%-9s()v z|4_^z&O-~$-5S3*H(jr!l1Y=@z=V8Z5xTxT4pZbR}&8+4h zd^!&g|CBK(18t*%l$RwDNHk3>lYtC;z6%5iEOjDd{z!|(`1b77Xu+{l&O0eWv;BxW zAJzpxnkL=elqZY$KAXaXxFOa6C|rm^V*DfCH}MMp6{w6L^2iuw`9!fA>iPyN`I6r2 zBeJn6izVnMX2iB%75JXL7KXF?9XG|_d4QzddJPvkwy7@?( z3taPh&{N(@Wi=sM%r44MoBx|o$o zzlxPc)^CHXG?Pw4rMu1hWdW|5-QTv>t{~(FHsX>XyWv5P5bA36lO5kZmoANDxEp1q z$lxGQ$ zsi~cZ#de~!I!_vby{LzHRY;hUyt?thvS0%cjyq{uM+)h3T3is4`_hB_D5hzBwE00S zoP~*Y&qH`_p`<_@a%>A&pDuYnP#8A+z#A#mO-xNDg~Q5foQ1G}2iWOVcdHUJ-hEDf zD_`Jw#;kNCud+WA-g@}%UW6;Hc5^y{Bqy0`NAJZh`~Q)>{PV;7R$W617_uVs+MgFu z((_88=54(776^kcD$qHK)AOcrGbi+@hTk_HSr!Pd#||CO;!*E(U4`Cq!z6q2@N1JAjOHCm#7ELqDjFUKesZ;s%P>n|k7esHO6 zf|gHrzPQ)u?WI^GH{EfIk}iJu$lB~(^pl-4Y{-1(2kb78tc+#HN3Qv)Dh$4fhaCQq6lDGu)b?E<&@heVC;F>bVU0DRo z@tDI0OM8V58F6vA*{v@#^Qhi^&YI`9=r7B=p`ozTr04%D zoqr02jNm)HbfotbWwj@an&Ig>)QMYw?Bp?MD0(V13%F>%VrR zYN>N*VMq3`V?iJ{F)jF+6;6@ZxGsJ!{!HRHVIIenaMSH<=sTZ7X?6xH_CSX824dy>KBhRR$7022x#V&@*94Z?0o^&= z-y~dFB*iKUeWt}w|G&~#SaJueu5v+%xN%IYt$Uz7(aCG&|3nO?k5-qNF$2(_wFm`m znv8C9RshNj%=71dw)ih^(JUu_3dW-H9|{xG8!vSBh6p!B;%?>JDSj9FaJ_?Wm+58V zOz?k#9D@crAM!DOls_b|-Gu%H4vzC9AL4M1nOfPCcWwP?A~nN$+B%mU1=$~YS^7^c zmin*rX-|rA0HkjsNda5MAE;r~u#lYVk~L$rSM7ex>PfrXSg_0EJ($6P{C7J7@DI6| z8HOH$%2ey2|8rw6IE^NrLy?R)Vm84qID@4Z>?BGU0)?enazw#64d=U zo(@N@+2*2hRF#}6&|MY-T|QJXHPHAQauC6Wb-8!Xo;Ke2gXkPlOH+U;=i7Q}q$#a5 zjz?7L3>(hB8S;|<&(T2X1t`;b2q4GiDq)*B9|CX2Mli8*kSmqA8n-z?cYkvv`wv;u zy8Q$#24@P33$teV7gMB9UQ-d7%6R>BCwWazUJzxxu)f?`CEDdJD2%RRGsB^k+;+@gmU z!a}i&YAH-)7cC2RvT+}TL_hAVDHw!4wJ*l+`ASgzu*tXE^zqs&iq_1B{8 zmnuqe(UlXyBLwhFR4dV73~{&n>Kw{GB(-hR=^hay2b!Lw0%_h=}E%o-z7WoErt^(5rsRcGq_8V1!L z9i4ECWZSlplp1n<#9Hd%w~92+Y~i}* zJ(IdQ83CT7<;yTJ1V?*FpkJ{LLusX0ezqmBD%OTTa2nQ9!>bV%r7A_wrRV5&C4Z`} zNE-s%y!qAx-Au;mA5UESHHkRvb7={XEsZO@LPVZg~OmVeoI3;Wuw+6;S{e6pH- zD)oNw_izx8C*!X%uLmaR7-eqrL=C}MnFd|FHwHwz8f*&3@6x7~HF+e|Kak~?V)><_ z?m%Q`26h~{hOu|r6EiQ3Ga-fXiaWASWB17&h=3@AYOJ_kW=t|d48Kc@>?bDee9JbF zn_x&a5H8At;UA>N{BlXR1D&%V64f-$81;9M@J@bJybL96P)teTeE4xftgof{<8OYZ z_!?M<0&%wvKQd0}>jOw*KdJ&zo;~&6DN`n`tnfXZP7bm;X{+1Sndrdj%<&RvA znmHP{(teKpU`mr~#p{~0(q+x8GyMNXR+0Mxz?^Z7!+rM~EgNw704#AfTvAiOUy03p zIiofC;&#=^W#zo|eKl1#Egc(HFQCMjir#jCbqKBDP+SxticB#CKo^pQHq&jX5gyww zy2gx#+LMt50E@dqO1*er==2Y+{*Mk19gKHDy3Rs-S|)$i8fpnE5?GXfVO?I%Kt~39 zRhAP_Hn}fx?vMY?OCnqeV*!iJ+hS?$;qqo9LNy3*)Czic);H{>~zNm}o@`Z}E=W|N1 zQ|#1tH4zE6(2XOEXI^EpxE|yXA0x3c_5Z`1T6tT8QNG21v+I%*c=4f?*WK~zL|*tb zjyZH<906}sfTQP;Z)b8i^B+LR+7*wRrg2NB5|FUROZR1P-y&hpSe-vSYkTCE*Kd5W zhM+rx(o#S#E05PP4L3h6OH(-~@I5(XibHZ6{uw%P((fkvrX6in&uH1d_<74A4$Frl zjaGx<8}2jD?faqq)vzsE5*gE*&bHrJ@Rm24#qS$8`aqRtc{T#zHnxUbYh-mtXFj~q z9qU_<(>MW-)(uJyTCC6%!Gy`vwzRs&M+D#6xI!r}fy~H$_r7i|-@kFyWKp0IR&-QB z`4A?HviY z>tV9piA``4ySiHXG9~3~G|D_`Z>$wmpK{mYg+N zc+$gK0E4v>b25%TusXlPlk`8mYsdl&l%8dDBAmN+q)#@+V141zYp&#Wz_+Aqlqt@* z6iTo?K)qc2V??uYA>f7Goy3gw;}w?XMa1jA?u>wkJ_rDRT=d>Bdf^=Qb;SD#KO@9g z6Zh-ZD0&ZL(2R!eYQawN^ik@$%DpG`eWUZ((=WXvzWyM19cU#aY{nk*`hzh6<3qbv zxMAClBAgq?cu8+L;I@8(NZ_8>fAQ?v1%S>=a?}nGzkUR7ZNKSN_!zy8%Q&L1Mq*b} z%}>+48*0Be#_1_zyilyJs)J-FQ?=7^kfTfG<3E^lPN?p2WVOkbfvj(P8?`=8ASumv zO~FetmfhFJ#p}<-C>)s3wBK&YHL$LfL@aaih^_A@5Txg|mR3X1=6-Q+w*JAvO!M1CuOW>`W)?S0- z60r3Pjhk5krs5kw$SPnXpe+J-xA4yauU-mUF28<@#$c#5oU(x9Ci~R2or7DNa4`!jTXSLSj&St z^1NXsTuNIX;&U`;(`Q%%v1KEyO>%8HM!LO^hrTRXk4H=W<_h&+ir3v{YQAkI!nhQy z+7x>J`15C)+2q3fq}A)-mEcn(VPFH5RZudVLW)DPoxc2~p93XZ(EAJ(dC6Lq`f!E(l>wUY{6n&q(lO1Jo5^tRR zn6eT;=gZfycenlZ{P(gn?*mvuISu{gSmH>4!?K1Cn)hML zQ(Twa;bgfW!bm|3yky+eK&7;=_AI+4Ygg=Wdk*cj$n`l}70d+luC+~Dz{oF8e>PSu z5hV|K&NL3u)XQmavTDiOJC`=Za`|9=36wID6$2NadY-~|NU{E+SxP`XM!en33O@|a z8ozd~| zuJMD=H;8U|CzDx5?6H-$37*hL&Upk^!h2Z%cjKvL+c?&@FY@=iDDSn)$4+MQfR-yA zrLmVh>#yZUnK8T8C{}f<0Iw+^6)uH}I|QI-!_jCL;#ICV{q(85Y?-mYQP4up!zoN}V~5TUJb%YnSa7p;W6 z`94!A=2cmd0Xkb84w=LUvV$7@RGgZ%$G+*)#5o7o^!Pf-~Qnr!d_xpK%*lq z7LiDTYYBnL{WlmA3cs@!K|06l1)xScD=c7h@7>>9n&5jIO%4uGDCtN$x+0PZp}R-W z%Csei)Ysia+Z7eo?U)8&808@0QSo?dpL0L>tyC6E6OS&HGq01zi`%)F~D<@7xXCB~}cx@IHSy zuT#8!pzRamL+%*ve%Kj>Wo)z>t;B=uoFt49KBn&+{nHA`0e*#p?`JWCXZirEI*>?g zMnfMET5qal*wMwRQ~VWI$t^2IqaCbChD>7tHAD}8g!gfX>{N-D_V`$z6Ld9o$rt87 zm^wV=t?CkOPs5wz;QdT@%8NY^ONs*${8tOmKF%n}H}L?Ycol}Hd_88?NM8Yr$59aP zgOE-o#GR1vX@|e8>xuX7mISEOA35P2krG2$Y!Ir^#Vh<3e~hvyxe8+Z_!PDFY;gGU zc@yGfZ5t7b8Hj}aqTvS{nP%9`ie_fJG4xl2Qm#9pcBQY5Otp=_3btYc-6iDJHKku@ zVT+AGHS@dS(VQ2GQi~?3Egb}<>|DQR^BhP7rt%}i$VZ@qV7!_hsT+t}E}V)c1x z5V0X$`Fvz*tZ^7N4V2f$*y~^H$RRWIdUzXCowuvB&?nkMf6B<@H2YppA25-s)4VT8 zL|N>8G`{DPIZb zgCJkR`rH1KL|?fN$(u!CVB^|QUzMoctA}dxCW1&4FaLs!P#ELP2@HvxLT&Ku&cS6o zsDW+Xng`yz68yJ}IoJKC79Tv+Z&}C-7CN2ISLS4Ij)P>Hbr;3%ymUg9T7F!`-a_Gh6TMC#=dh- z@-$17aTsFT@Y1ZuddzbVF%;IlWuiY23_JBHMCIHLttk*bUU=x4(1V#W{-$ep=KO?j z2K4-wq;8#{K}1`M=n-k>Y^fF0tNP}=^J`<(9xSsgceH;a6!i?2L>%x4$>8!*C z4)Froo(JAaQ%iF}WjH^it+$``k=u+U3~2s%$)@*mJDk>CD9OyNk{fNXqz0l0%|}1Fyg0rG;7f#`e25 z_sh<$e-lP4t@@X6pM@ZAkEi=jdKRBDmt|oh-{%f9T!L3i>25j-ttkq*-<<(1Rg2nA zPR_9Y-vx-yw92>R-fBamIV842+=JARJl~{LF=Y7r@Ax{7x-nRFUT4H6j&Ne{c7uK2+(b@GMpPF7E%~SGF1!`{RMM;5R)RF%jp7x6SUnNG+SDFRt3$}ELtCEq$u;Xky# z5d2=(B6qw#B+68Crt+2ozaneM#SSzL%eLadW8ChmG+11(ciY~*rv**9Uut-&fU7ig zrHml<{P^$TlTh|VX%zb^v1`x_@A$T^EKkVb}6na0sN0TLS7YbKXq`s z%hCd+xt9PHW7Bu`SI~FYqb#KvR<1`GQsFpMF#>;Um;%DH84CpqXdBCLOfO_=Q26|z zG^`T|ij0_bd)OpAA|H8rAPc8NtZC+7PlRNy#GK#ui(zJZ_$8u-5h{sJRF;>@iE%Ct>H(wJ3I9zESujgc~*hGEN{uak;Pp5nP{eD+72Lo(|h zLLMPv$iqcQ5IL*ZzXUMwhE1;SO$1in|GSF)`0Wmsh?mnn=5lIEBvgg%{i==ij1@Gt2J85@YwHkoFF0>X#0&;G)q|ism_!Su>6LhJ& z5=m4A;(zHU*cRaY)Z4yLrdcs}Li#Y1#k0ko!%|Z+^b-yAt#j6;BIH(=+?lLo=l4+u z9$8gy8z;^>$4JmN-*q_X08*=}M{>*qSU7v**+GMw6Jxt74TByjTIqEZh}(f-u6QHI zDIg$zk}gkk4(x=pnd<*oPRuld3O*c;PWrCXVGdem6F~2|wJeU+2#Ox3p+qFOYJliL`@$-`1BI9yteMB~k88cI;pFFics7zsO3Th|6c7dGunc zmW2iRT)JWt96Q=Y@3zVAu?nY1T$NEp&ck-#4=py!_#Y6pV)NKSw2dB{`HB~~uYQ`c zQGSsolxT*KTcDZ4S|vAVr`?aK&BBQx(hywqM&sP%V42CqriKLs`Lo|Z0k9WAFt-TyP1U^Q{#9i zgFADv*}2g?M%c7!j4}l@n3yxreVzaZnN7qUQXn3(?t@svRZdR{`NhE*ZS=I83e3PK z*{GoSrWXmD<9p&)6YTk=G}VJV*La62`hDol0~%;HC1!*~i53xPiO-QI$5Fo|#d!S# zOzkFdn*K-5LLpn?8juMzx0LctX=Xi7d^w*?a+A{*OJ|*TAuT~_eV;d}ePn)0X zA5I2`bfut_zjjSz;v|W0oI)B1Reo*NY8wO|eDcZ3oXigAsg~@HbBm{_DZHLgK-Va7 zij+sxyHt?t%-C@KB-S#_}}JgYZB6>Ia`(r#WXHHS6&3tW&cLyGo4Wbw0r^0@s2Y7s(7V>J{i$k_!=bGZ*DE>aG;fP43of8 zUC*juk@(Y*ZNd*}?YD%fo^0D;PY(lX2`{7cVI(U+Eidg6fDiJ}@aYG9ecySTY=^lr zUj58DLt11ZjgByMzb`DXxd->#{;=`|G5os$vM7inwdb@zJm~!Sp?W|ha&K4>PJ?Ol zzd=nr;6_o{S>qdlfu_(5bjboN5k02tqkGR@kiw3wi->`)w)_>G#97;Yq6FB8tQ^RU z6wdv|4kBDaUHy%(`|!;5)efaqL$CL%#9!Rs5&cTeTlWslEi%0M__7kO`H`b1PTey{ z$w%2tRiiu?#gU6kYwIg`Dwiwu4`3+@55GXfWD@*-M?r8GgE*P6%lPD+B0R8JV0}Vh zxw3iat9rFN!-+Jp^ZPeI_u#w1#2*D8QDR<7pLsre<^{aSm&kgk%w6eiY%>WstPqAX zoMW@a9p#=?2A`Xg7OH9V~Z&f*=1eM+BoE%$_=36a#z)MG~_*b3*mW&XetxBk&}22&I@ zb@B+M%+R&y+#(r-s+Ssjve)v@)1U}7*BI;zd39I+w&&JcU)afpD4P_kFyF>Ox*ie4 z)rlysK{it!}aeLKCZiwEAx&IUv)!p9jfv7Y@90|N&331=NHK&Zryb@`rL zE$lr#KFx9o&eV2}lE(c7`_9tWE61lfCwnmdUjd>sFeX}>vCb!|{Tl~gb~j#H|3c@y zC|Om|g5+8OSwUemH9lmVKKL^Ww=Z4POr}_^dbf%v?<1lXaQbPW=Tt=wcZcDMB%=aIX>_O}C;IWxG_fYxO~4{H*NUtZ^u)+5ylUKz2t^jXd}ie=wNZ|)T$<+9#v z7!N27A21t!`4KLu{Ob05I0^SFg*zilZq}6~QPBywx=BH7{IjkatT?zjo3jse;dH+*I-Fx++csCNrFYM%@@i%+( zmLa!fBCfPHKzfn_&QhZ4xcwJsuF;Y(Y3L3svy*2(EtJAI!lh%F2AYdsc)!1w{kaDl zr6OCv?c6AgV%^&Yj^Hx@eH9?L@ed>cHFiO(C@sMhBgER1<9ZIfD#rjSoo5)Ug!|{x z^#n{+k=Q1sv|y8e^wDpE*?RzUX{%G6gW905MPm;ZKnX1_buQ^hJ&2kD{AU;M$f~0E zl?}Uz9^b1h=N{b;-fkNWr=N{wFn;eoKnwNg(fu^(WLZPK4mT`StHRXiImP)NF2M;+ zEdA3zEx=f-Mjsl&5NmdUMW9Fov6v&1yy_F$#@Ww6ScD9qE${;jjlr0iO!T+M>6>gztw1!!tAG!w%vxbt2*qMVrYRec@bk+bwz|jlf-$(!E}U4L_LlcFVEhE*)dLOWydq+> zP{#;s$R>%J+PfXU!9>&=9q3vo`lo`-SOAjWLn$$T=k1UAwLi^&{oeB|&Jv5_d!E{J zF;Zu!{R2gsEDyZd+{_T_dr=k^8m|fPf}9?7&||FdEffNTXr>d#&WoHX_7ox5i%e`RkFop4S^yp z;?0sVxRISg;PK6+;-)W(bkNukfuJVdu%lQM6GA-XgMUvMwVDkmQSdgs$jDOxG7dXF zy;R7>j(_-#o%9gOhAc5@ZHqLU2R;=fghJsgNMDu&1BAu2L=^+q>_=TLs%u4v@PgaH zp}xZE#8?Xr)Y7|G5i(ut7aDB|EiEXIyf(ma9|HSAW*k-=vRZ)2l+F@Vd?!w*rO@*L->G&B^J?Qkt=R)pvL}S67b5)noj$Bc<#(GVn+cMN-;_o0oOFx|sb9}` z{$z*PjWaxgO=eKztFB3Fm{v1)yzTXLJL${j%XVCs+G2I4?s&1`bYc{4kJUp z{!G%nEREy33%XcI4LGWyaEn8W2itkL`2qg-bXaVFHdTRVxD~9QLxT?$A^nWQ#s;_4 zQ4pktny$wUyG#+aQF(Q~Aa4Q5a*T5}7M@lN^w~ThP?|ao;)VYfQYfJK1<+arqiOQ- zJ0txT#$sz-z!dqSzu;Zs^!9#kM6)<};Wfb-{mL1ZoF}V=5k8t>Zeh}cMzR2Qo*+*H zl#-U^W5S_`HNq#Cf(9!OQzPHr^Y<^7IGX*tnL@tKE<;)4`?2QKpoi6%_lp3AjOTGu z)iO6cfap9Td?!A&>f^7&wPid`=!tq&CQ1;9_@`iUj|K|_QNcV&&5zX)3X9u83r(u< zn$vCSShge2VQC1SNg&2l$CBRnK7bpve)yA$@fC-NXuxysRQfz)r$;Xh3xNXPLzXVw zuogQ!&YeCS))moH;ROA0>(+eZ!yF|mr5SNcRXhL1)-9*+bV?F}_7!>0G3?C7zh@_( zum;Zw&t>i~SsSKW8|u>yj;4D+o)-LttQfyeGxtP(nNfQ>$Km)Y27JVJjY{tNWbJnA zE;kt^Xl$>1?g^SZZ6v{$N%q}CQ&A!xt69 zV<_dJ)Fl!1s~vQlL?K0V*IK>6OW&D}Q!vRPoGpyN(I`&u;^^=8em?KMBBXe#W^i2* z!YLy2)t3fa8UR1jkzhh@fBdZHFAusoe(U-ivUhPfGJoPCGPbk%8 zDl&gM@8oXJh{&NU`i>5*tIdE>d=HCc6s8!`Okc08+X;hFQ?<3bC{ViuEqc#Jaq|11@6L3r|Rgze-B6Esqk*Ru68I z-OW~HuWQb?(E5QK@?DnSxm*5zz{`J=S)_X#Dt(vs^|^IgnI2e_WX}}(=b$PoTH@Z4 zU+wEa!6Z&*;-z~V1K5q?#-4X_Ao~(UzxV`F=?v{?>fRK1zT7Du!lDT=XJl?nuQLKh zekdqeV=CNQ40rjt`*`0Gfz#X|f-f+W{5;P^K67>5MVvN&_8dEZO z`~Gp!(QUDykQLnNy%?4sff0y0D6={*EWiXR&H_nLzkLHhkqNa6qBA%awX>})s{`Kr zU+S7FWH=<+_1AXNA>F~*J%l9|TWSIv2SO6kHV4#BkVxVJ&+upKK8;|p%_o}vj;RoL&(Tm}TsYh4Q(jc^i1YmhMR+@=kl@s`Gxv;v&DX;YsW3%L zlvWL1dYTQ!Hlj9Ch*9PN~~9XP=zjN>#a5tX903`Ps@ z|9l`jfG#uD6YhPoaB@)sI*s4q2i3dM{G{0@ytH5(57%weT2YW)d_{~u`Ywu-^g&JD zmrvyft_(?a^_(Ce3pCP0*$h-KEVg$Lv|*#ZA{!^$SMa4zrN|3lMx$5Z`=ef%8b*n4JVX3s?S zF|)I?BZ(r(DkSF^SrHkLk)09QL~`t1gmCOVkH|R2anASo{+`$K{Ou3->)hY_y081X zuFvP~!Xf%riNES{0;TNAu*`64lvV^LQwMMrwR5XtJvFY*8TE4LWycZv##lhVatCmK zde7uboQPKvBPP$PQ!AO^BhtW+r@L*CedK8!&*+w4bhD#ceII@IV;1~g4<1l1;QQC_ zO#9(ww@6Wfn=D-p-g4Zh!CDq~TeGkNbRw5!%gB#<(DEdG^nB`GeoA27Vat)d^iAR`ekWA^Ewd+rm8%j+d5^AO#s; z{({>maW3=x7nz8*BTp>689xK519}3D;_>z1EZ67`k@Hm&+Z%f1qX+N1>HnpF28gv`f4)Wee8nui(s|e6{LNrI#3{B8(NE}M z@~VgGy0mum^}6R~UCK8PgBH9*@}LgOlV**z3RG3~wGuzR(3E(%!A3lvvPsho z5|XpI&;V^P`*Tig5})vtRglaqR6(60WvUg5gZ~M)(d;DL202en06zw<5>-)Cix8Vj zqQ?LH0{<=aU;?O>I5q_y%6%8YJA3e--5sNa-95YfoM~zE+;BRO%nS{ZgUoBYINigZ z{&kLE@&o$c@JR)H?Au5r{t;vaI!h1%l_M+ISsw~)2p|2P14&to(XF5_*zIDSI^Z-t zzofK=Z4CP2Q2pNnq`&P#;(uo@*2*foeYFd6f9az!Cz(76HBh}Y=mbhhg^Naf6CVJD z1oxl=;p&#mI1Xa{efMKi!QQv5#az4D&z3iTFNIby6ue{Z_`v>=5OZ@VtJ4Ur{H87H zXiA4{tE!M&>TnCDJcF7TlQ`4}2-Dzm9<8-m3CJnC<-)*w^Nf0x_I7*zCaqD*ZtH`J zcTmcM&d1ZwIX<@(1d>%=dy;f@9ri8D=hHjs*VB6EG9Ah~RSz^K%9LME>k>^%Ymqvu)$BcR|{jwQx9WlwvZyQj>FarFeA%x|)6KAQbw zfZ4SS4bSSAV~3^DjN)Uuto1p_A$Nb`yS@1PLReq*Z}3@-4~Aiav~JvK5SEqE|8!a6 zELwS_wJ81%r(cWbcumcQU1Qt%3BTy>%rY}j7dhk%2idk{VzBM@QwtGR63peVM6g8J z3_d?g?Gcg<7&!S?#ok$!8N`c$6oT*!D(c|2;c=E#s{SW@Nij=$!KUm&=;mo8hHuSs z95DNv$0kYZ#W8SIhFo8Kk}fdLQ#tOC)PD9WPsBab^$)HJY(Fg<_?~*|o9kJrJeyXk z=9q(yDLlGoXlMIN>5GB&($Hh3jw3x|z8>a>-??SqjQ!oV_qsD#hwQr?E^l%Py4O zkrtI1c!Dj3JS=%u6qkow*yS`w-eb%Eq2AdV(Ze_M>Q^O-Ba z5wXZDcz$@_xU_F>oSaQmfHfM=w1bct6gCDXyvWm``^$n(@G@4@vFVru13=slFzl#J zjKg~*q&y6Kq$K)-6vDva?30GecpJNi7LaPUY1TUxXLD(w7HoRYGm?h(7w#UYY`o7W zV9!Uh&iDAslfj%@kz_={m#A|c2uem=wEBHA%0Dp-3|P~$ASZlJAaVvl+bqND_Fkj8 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 KsvoXe1^ge`gLe1; literal 0 HcmV?d00001 diff --git a/Docs/AUDIT.md b/Docs/AUDIT.md new file mode 100644 index 0000000..2cd53b0 --- /dev/null +++ b/Docs/AUDIT.md @@ -0,0 +1,36 @@ +# Rsync Studio — Security / Release Audit + +This project targets direct macOS distribution using Developer ID signing and Apple notarisation. App Sandbox is intentionally disabled because the product launches `rsync`/SSH and operates on arbitrary user-configured filesystem paths. + +## Security controls present + +- Hardened Runtime enabled for Debug and Release target configurations. +- No shell (`/bin/sh -c`) command construction; `Process` uses an absolute executable path and argument array. +- SSH host-key checking is not disabled. +- Automated SSH uses BatchMode, timeout and keepalive limits. +- SSH password authentication/storage is not supported; legacy stored password data is deleted. +- Remote host, username, port, key path and remote destination are validated. +- Remote paths reject shell metacharacters before rsync can invoke the remote shell. +- Advanced arguments reject transport replacement, remote-command, credential, arbitrary list/log/batch path and destructive overrides. +- Malformed Advanced argument quoting/trailing escapes are rejected. +- `--` terminates rsync option parsing before source/destination operands. +- Local source/destination overlap is rejected. +- File-watch and exclusion values reject control characters. +- Scheduled/watch delete requires explicit per-job authorisation. +- Run logs are ANSI-cleaned, likely credentials redacted and size-capped before persistence. +- Run history has bounded retention. +- Privacy manifest declares no tracking/no collected data and the app-specific UserDefaults required reason. +- Launch at login uses `SMAppService` and remains user-controlled. +- No analytics/telemetry or application HTTP client code is present. + +## Required release verification on a Mac + +Run: + +```bash +./Scripts/release-preflight.sh +``` + +Then archive with Developer ID, submit with Apple `notarytool` (or Xcode Organizer), staple the ticket and run the signature/Gatekeeper checks in `Docs/RELEASE.md`. + +A Linux source audit cannot substitute for Xcode's macOS SDK typecheck, code signing, notarisation or Gatekeeper assessment. diff --git a/Docs/COMMERCIAL_RELEASE_STAGE1.md b/Docs/COMMERCIAL_RELEASE_STAGE1.md new file mode 100644 index 0000000..4cb1e70 --- /dev/null +++ b/Docs/COMMERCIAL_RELEASE_STAGE1.md @@ -0,0 +1,88 @@ +# Rsync Studio — Commercial Release Stage 1 + +This document freezes the commercial distribution identity and release-security baseline for Rsync Studio 1.0.0. + +## Product identity + +- Product: **Rsync Studio** +- Bundle identifier: **`net.absdev.RsyncStudio`** +- Marketing version: **`1.0.0`** +- Build number: **`1`** +- Minimum macOS: **14.0** +- Category: **Utilities** +- Distribution model: **Direct distribution outside the Mac App Store** + +The bundle identifier is now treated as permanent product identity. Do not change it between commercial releases. Changing it creates a different application identity for macOS, Keychain access, preferences, update logic and future licensing. + +## Apple signing baseline + +Rsync Studio must ship with: + +1. An active Apple Developer Program membership. +2. A **Developer ID Application** certificate belonging to the publisher's Apple Developer Team. +3. Hardened Runtime enabled. +4. No `get-task-allow` entitlement in a Release archive. +5. Successful Apple notarization. +6. A stapled notarization ticket before publication. +7. Successful Gatekeeper assessment of the exact artifact customers will download. + +The Apple Team ID and certificate's full identity are deliberately not committed into the repository. Select the correct team in Xcode on the controlled release Mac. This avoids embedding developer-account-specific credentials into source control. + +## App Sandbox + +The App Sandbox remains intentionally disabled. Rsync Studio launches command-line synchronization/SSH tooling and must work with arbitrary user-selected filesystem locations. This is a direct-distribution architecture decision, not an accidental security relaxation. + +Hardened Runtime remains mandatory. + +## Versioning policy + +Use semantic product versions: + +- `1.0.0`, `1.0.1`, `1.1.0`, `2.0.0` + +Increment `CURRENT_PROJECT_VERSION` for every build that may be distributed. Never publish two different binaries using the same version/build pair. + +## Required Stage 1 checks + +Run: + +```bash +./Scripts/verify-release-config.sh +./Scripts/security-check.sh +./Scripts/release-preflight.sh +``` + +`release-preflight.sh` must be run on macOS with Xcode installed. It performs a clean Release build without signing so compiler/SDK failures are caught before creating the signed archive. + +## First signed archive checklist + +On the release Mac: + +1. Open `Rsync Studio.xcodeproj` in Xcode. +2. Select the **Rsync Studio** target → **Signing & Capabilities**. +3. Select the publisher's Apple Developer Team. +4. Confirm Hardened Runtime is enabled. +5. Archive a **Release** build for macOS. +6. In Organizer choose direct/Developer ID distribution. +7. Confirm the archive is signed with **Developer ID Application**, not Apple Development. +8. Notarize the exported app/container with Apple. +9. Staple the ticket. +10. Verify the exact final artifact before uploading it anywhere. + +## Signed artifact verification + +For the exported application: + +```bash +codesign --verify --deep --strict --verbose=2 "/path/to/Rsync Studio.app" +codesign -dv --verbose=4 "/path/to/Rsync Studio.app" +codesign -d --entitlements :- "/path/to/Rsync Studio.app" +spctl --assess --type execute --verbose=4 "/path/to/Rsync Studio.app" +xcrun stapler validate "/path/to/Rsync Studio.app" +``` + +The signing output must identify a Developer ID Application certificate belonging to the intended publisher. The entitlements must not contain `com.apple.security.get-task-allow`. + +## Stage boundary + +Stage 1 does **not** add customer licensing, payment handling, trial enforcement, DMG artwork, automatic installation of updates, or a licensing server. Those are intentionally separate stages so signing/distribution identity is stable before commercial logic is introduced. diff --git a/Docs/COMMERCIAL_RELEASE_STAGE2.md b/Docs/COMMERCIAL_RELEASE_STAGE2.md new file mode 100644 index 0000000..9885e71 --- /dev/null +++ b/Docs/COMMERCIAL_RELEASE_STAGE2.md @@ -0,0 +1,104 @@ +# Rsync Studio — Commercial Release Stage 2 + +Stage 2 adds a reproducible, non-publishing direct-distribution release pipeline for macOS. + +## What the pipeline does + +`Scripts/release.sh` performs these steps in order: + +1. Runs the existing release/security preflight. +2. Creates a clean Xcode Release archive. +3. Exports the archive using Apple's `developer-id` distribution method. +4. Verifies that the exported application is signed by **Developer ID Application** and has Hardened Runtime enabled. +5. Rejects `get-task-allow` and an unexpectedly sandboxed Release app. +6. Builds a compressed drag-to-Applications DMG using `hdiutil`. +7. Validates the configured `notarytool` Keychain profile. +8. Notarizes the exported app inside a temporary ZIP, staples its ticket directly to the app, validates it, then removes the temporary ZIP. +9. Builds the final DMG from that already-notarized/stapled app and validates the DMG container. +10. Submits the final DMG to Apple's notarization service and waits for the result. +11. Staples and validates the DMG notarization ticket. +12. Re-runs Gatekeeper/signature checks after notarization. +13. Produces a SHA-256 checksum and release metadata file. +14. Stops without uploading or publishing anything. + +Existing release directories are immutable: the script refuses to overwrite `build/releases/-`. Increment the build number for a replacement build. + +## One-time Mac setup + +Install/sign into the current Xcode release and make sure a **Developer ID Application** certificate for your Apple Developer team is available in Keychain Access/Xcode. + +Store notarization credentials once: + +```bash +xcrun notarytool store-credentials "Rsync Studio Notary" +``` + +Apple will prompt for the required account/team credentials. The release script never stores those credentials in the source repository. + +If Xcode cannot infer your team, run releases with your 10-character Apple Developer Team ID: + +```bash +DEVELOPMENT_TEAM=YOURTEAMID ./Scripts/release.sh +``` + +Do not commit the Team ID solely because a local machine needs it; Xcode signing configuration can supply it. + +## Produce a commercial build + +From the repository root on the release Mac: + +```bash +./Scripts/release.sh +``` + +To use another notarization Keychain profile: + +```bash +./Scripts/release.sh --notary-profile MyNotaryProfile +``` + +For a signing/package smoke test without Apple notarization: + +```bash +./Scripts/release.sh --skip-notarization +``` + +A skipped-notarization build is **not** suitable for customer distribution. + +## Output + +For version `1.0.0`, build `1`, the output is: + +```text +build/releases/1.0.0-1/ +├── Rsync Studio.xcarchive +├── export/ +│ └── Rsync Studio.app +├── Rsync Studio-1.0.0.dmg +├── Rsync Studio-1.0.0.dmg.sha256 +└── release-info.txt +``` + +The release directory deliberately includes the archive and exported application so a shipped artifact can be traced back to the exact signed archive. + +## Mandatory clean-Mac test before publishing + +Do not publish immediately after the script succeeds. Copy or download the final DMG onto a Mac/account that has not built Rsync Studio in Xcode, then: + +1. Open the DMG. +2. Drag **Rsync Studio** into Applications. +3. Launch it from Applications. +4. Confirm Gatekeeper opens it normally with no unidentified-developer warning. +5. Create a harmless local dry-run job. +6. Verify SSH/local workflows required for the release. +7. Verify About reports the intended version/build. +8. Verify the app icon, Help menu, notifications and Launch at Login behaviour. +9. Eject/delete the DMG and repeat once from the actual hosted download before announcing the release. + +## Release artifact policy + +Never replace `Rsync Studio-1.0.0.dmg` with different bytes after it has been published. If the build changes, increment `CURRENT_PROJECT_VERSION` and create a new release artifact. Keep the published SHA-256 alongside the download. + +## What Stage 2 intentionally does not do + +It does not upload to a website/CDN, update the signed update manifest, publish release notes, create licences, take payments or activate customers. Those operations are deliberately separated so a successful local build cannot accidentally become a public release. diff --git a/Docs/RELEASE.md b/Docs/RELEASE.md new file mode 100644 index 0000000..f4cf593 --- /dev/null +++ b/Docs/RELEASE.md @@ -0,0 +1,114 @@ +# Rsync Studio — Direct Distribution Release + +Rsync Studio is designed for direct macOS distribution rather than the Mac App Store because it intentionally launches `rsync`/`ssh` and accesses user-selected arbitrary paths. + +## Release security baseline + +- Developer ID Application signing. +- Hardened Runtime enabled. +- App Sandbox intentionally disabled for this product architecture. +- No Hardened Runtime exception entitlements. +- SSH host-key verification is never disabled. +- SSH uses BatchMode, connection timeout and keepalive limits. +- Password storage/authentication is not supported; use a private key or the macOS SSH agent. +- Advanced rsync arguments that can replace the SSH transport, run remote commands, load passwords, read/write arbitrary option/list/log/batch files or bypass controlled delete handling are rejected. +- Scheduled/file-watch `--delete` requires explicit per-job authorisation. +- Run logs are sanitised and capped before storage and expire according to Settings. +- `PrivacyInfo.xcprivacy` declares no tracking/no collected data and the UserDefaults required-reason API. + +## Mandatory preflight + +Before every release archive, run on the release Mac: + +```bash +./Scripts/release-preflight.sh +``` + +This performs the static security policy checks, validates the privacy manifest, and performs a clean unsigned **Release** build with the installed macOS SDK so compiler/typecheck warnings or SDK incompatibilities are caught before signing. + +## Archive + +In Xcode select **Any Mac (Apple Silicon, Intel)**, choose **Product > Archive**, then distribute using **Developer ID**. + +Alternatively: + +```bash +xcodebuild -project "Rsync Studio.xcodeproj" -scheme "Rsync Studio" -configuration Release -archivePath "build/Rsync Studio.xcarchive" archive +``` + +Choose your Developer ID Application certificate/team in Xcode signing settings before archiving. + +## Verify signature + +```bash +codesign --verify --deep --strict --verbose=2 "/path/to/Rsync Studio.app" +codesign -d --entitlements :- "/path/to/Rsync Studio.app" +``` + +The Release build should show Hardened Runtime and should not contain `com.apple.security.get-task-allow`. + +## Notarise + +Store notarisation credentials in a Keychain profile once: + +```bash +xcrun notarytool store-credentials "Rsync Studio Notary" +``` + +Submit a signed ZIP/DMG/PKG: + +```bash +ditto -c -k --keepParent "/path/to/Rsync Studio.app" "Rsync Studio.zip" +xcrun notarytool submit "Rsync Studio.zip" --keychain-profile "Rsync Studio Notary" --wait +``` + +Staple and validate: + +```bash +xcrun stapler staple "/path/to/Rsync Studio.app" +xcrun stapler validate "/path/to/Rsync Studio.app" +spctl --assess --type execute --verbose=4 "/path/to/Rsync Studio.app" +``` + +## Pre-release functional security tests + +1. Local source nested inside destination is rejected. +2. Local destination nested inside source is rejected. +3. SSH host beginning with `-` is rejected. +4. SSH username containing spaces/control characters is rejected. +5. A `.pub` key cannot be selected as the effective private key. +6. Advanced arguments `-e`, `--rsh`, `--rsync-path`, `--password-file`, `--files-from`, `--log-file`, `--write-batch`, `--remove-source-files`, `--delete*` and `-M` are rejected, and malformed quoting is rejected. +7. Remote destination shell metacharacters are rejected before rsync is launched. +8. Scheduled/watch job using `--delete` cannot run until **Allow unattended delete** is explicitly enabled. +9. SSH to a previously unknown host does not silently bypass host-key checking. +10. Scheduled SSH job with unavailable authentication fails rather than prompting indefinitely. +11. History expiry removes old completed runs according to Settings. +12. A failed persistent SwiftData store opens Recovery Mode instead of immediately crashing. +13. `Scripts/security-check.sh` passes before every signed build. + + +## Signed update feed + +The application contains a dependency-free signed update checker. It remains disabled until these generated Info.plist values are populated in the Release configuration: + +- `RsyncStudioUpdateManifestURL`: HTTPS URL to the JSON manifest. +- `RsyncStudioUpdatePublicKey`: Base64 raw Ed25519/Curve25519.Signing public key. + +Manifest schema: + +```json +{ + "version": "1.2.0", + "build": 120, + "downloadURL": "https://example.com/releases/Rsync Studio-1.2.0.dmg", + "signature": "BASE64_ED25519_SIGNATURE" +} +``` + +The exact signed bytes are UTF-8: `version + "\n" + build + "\n" + downloadURL`. The checker refuses HTTP feeds, unsigned manifests, invalid signatures, and non-HTTPS download URLs. It opens the verified signed download location; it does not silently install software. Keep the private signing key outside the source repository and build machine where practical. + +## Automated commercial release pipeline + +Stage 2 adds `Scripts/release.sh`, which automates archive/export, signed-app verification, drag-to-Applications DMG creation, Apple notarization, stapling, Gatekeeper verification, SHA-256 generation and release metadata. It intentionally does **not** publish artifacts. + +See `Docs/COMMERCIAL_RELEASE_STAGE2.md` for first-time setup and usage. diff --git a/Rsync Studio.xcodeproj/project.pbxproj b/Rsync Studio.xcodeproj/project.pbxproj new file mode 100644 index 0000000..39be999 --- /dev/null +++ b/Rsync Studio.xcodeproj/project.pbxproj @@ -0,0 +1,390 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 60; + objects = { + +/* Begin PBXBuildFile section */ + 0AB9E3362F1DCE2312221B31 /* Models/SyncRun.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7A5B87A4971CCE37EF1B979 /* Models/SyncRun.swift */; }; + 0BBFC488F7DFF17E315AEEF2 /* Utilities/FilePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8999F614BA12AF14ACCB5E3D /* Utilities/FilePicker.swift */; }; + 1FB249F959D6825750186C76 /* Views/Runs/RunHistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD52560701DBE102AB8E8B73 /* Views/Runs/RunHistoryView.swift */; }; + 205FC2ECD561AE0B6EA8BE73 /* Models/SyncJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13136DBE7B701EB6D0CE478E /* Models/SyncJob.swift */; }; + 3D5AB53FDA192FBBA66D2CEF /* Views/Components/PathField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58B5F691C6DE4B3B7224BE4B /* Views/Components/PathField.swift */; }; + 3E6D35DAB1BD51D9E21E7B3F /* Rsync StudioApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C1944E5F7109545301358AD /* Rsync StudioApp.swift */; }; + 41CA3E36ADC08AE451912D92 /* Views/Components/FlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5790F644CCAAF49094D57D68 /* Views/Components/FlowLayout.swift */; }; + 593DB1791A00690020ADF82D /* Views/Jobs/JobEditorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCA4F1E7C15E2FC1DCC85FEE /* Views/Jobs/JobEditorView.swift */; }; + 7C32064BC9CE29F5116ADE89 /* Views/Jobs/JobListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2639D73ED1EC5C164BC46AF /* Views/Jobs/JobListView.swift */; }; + 87F3C7BF9787C5EF1DFC58CE /* Services/RsyncLocator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE0FFB276373DDA4C5A8E419 /* Services/RsyncLocator.swift */; }; + 93BD9B27AA1F883F0A05CE3A /* Services/RsyncCommandBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F618D81AA8D3052C88FDF93F /* Services/RsyncCommandBuilder.swift */; }; + AA1000000000000000000001 /* Utilities/KeychainStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA2000000000000000000001 /* Utilities/KeychainStore.swift */; }; + AA1000000000000000000002 /* Views/Components/SplashView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA2000000000000000000002 /* Views/Components/SplashView.swift */; }; + AA1000000000000000000003 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AA2000000000000000000003 /* Assets.xcassets */; }; + AB1000000000000000000001 /* Models/SyncSchedule.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB2000000000000000000001 /* Models/SyncSchedule.swift */; }; + AB1000000000000000000002 /* Services/FileWatchService.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB2000000000000000000002 /* Services/FileWatchService.swift */; }; + AB1000000000000000000003 /* Services/BackgroundSyncCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB2000000000000000000003 /* Services/BackgroundSyncCoordinator.swift */; }; + AB1000000000000000000004 /* Views/ScheduleCalendarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB2000000000000000000004 /* Views/ScheduleCalendarView.swift */; }; + AC1000000000000000000001 /* Views/HelpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC2000000000000000000001 /* Views/HelpView.swift */; }; + AC1000000000000000000002 /* Resources/Rsync Studio Help.md in Resources */ = {isa = PBXBuildFile; fileRef = AC2000000000000000000002 /* Resources/Rsync Studio Help.md */; }; + AD1000000000000000000001 /* Resources/PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = AD2000000000000000000001 /* Resources/PrivacyInfo.xcprivacy */; }; + C24299D89D285E985C089C0F /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 344231C687A1F4BDC84AE838 /* SettingsView.swift */; }; + CC02106B9AF77855935487F6 /* Services/RsyncRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F173223A0A15A648115C2B6 /* Services/RsyncRunner.swift */; }; + D2009B9542E292B66BB8A0D4 /* Views/Components/StatusBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA5919F7BA545585E4369602 /* Views/Components/StatusBadge.swift */; }; + DF2A7BB149EEC298F6207758 /* Views/Jobs/JobDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 002D9E0AA02D4B37F6BB05F6 /* Views/Jobs/JobDetailView.swift */; }; + F58FB754850EEF340B2E65FE /* Views/Runs/RunLogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39F11523D2F6BF2FBCD90FF /* Views/Runs/RunLogView.swift */; }; + FB73BE2A7887F32D512EC848 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D2D059072C1E33E64D7DCDF /* ContentView.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 002D9E0AA02D4B37F6BB05F6 /* Views/Jobs/JobDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Views/Jobs/JobDetailView.swift; sourceTree = ""; }; + 13136DBE7B701EB6D0CE478E /* Models/SyncJob.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Models/SyncJob.swift; sourceTree = ""; }; + 1F173223A0A15A648115C2B6 /* Services/RsyncRunner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Services/RsyncRunner.swift; sourceTree = ""; }; + 2C1944E5F7109545301358AD /* Rsync StudioApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Rsync StudioApp.swift"; sourceTree = ""; }; + 344231C687A1F4BDC84AE838 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; + 4D2D059072C1E33E64D7DCDF /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 5790F644CCAAF49094D57D68 /* Views/Components/FlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Views/Components/FlowLayout.swift; sourceTree = ""; }; + 58B5F691C6DE4B3B7224BE4B /* Views/Components/PathField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Views/Components/PathField.swift; sourceTree = ""; }; + 8999F614BA12AF14ACCB5E3D /* Utilities/FilePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utilities/FilePicker.swift; sourceTree = ""; }; + AA2000000000000000000001 /* Utilities/KeychainStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utilities/KeychainStore.swift; sourceTree = ""; }; + AA2000000000000000000002 /* Views/Components/SplashView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Views/Components/SplashView.swift; sourceTree = ""; }; + AA2000000000000000000003 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + AB2000000000000000000001 /* Models/SyncSchedule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Models/SyncSchedule.swift; sourceTree = ""; }; + AB2000000000000000000002 /* Services/FileWatchService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Services/FileWatchService.swift; sourceTree = ""; }; + AB2000000000000000000003 /* Services/BackgroundSyncCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Services/BackgroundSyncCoordinator.swift; sourceTree = ""; }; + AB2000000000000000000004 /* Views/ScheduleCalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Views/ScheduleCalendarView.swift; sourceTree = ""; }; + AC2000000000000000000001 /* Views/HelpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Views/HelpView.swift; sourceTree = ""; }; + AC2000000000000000000002 /* Resources/Rsync Studio Help.md */ = {isa = PBXFileReference; lastKnownFileType = text; path = "Resources/Rsync Studio Help.md"; sourceTree = ""; }; + AD2000000000000000000001 /* Resources/PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + BCA4F1E7C15E2FC1DCC85FEE /* Views/Jobs/JobEditorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Views/Jobs/JobEditorView.swift; sourceTree = ""; }; + BE0FFB276373DDA4C5A8E419 /* Services/RsyncLocator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Services/RsyncLocator.swift; sourceTree = ""; }; + C7A5B87A4971CCE37EF1B979 /* Models/SyncRun.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Models/SyncRun.swift; sourceTree = ""; }; + CA5919F7BA545585E4369602 /* Views/Components/StatusBadge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Views/Components/StatusBadge.swift; sourceTree = ""; }; + CD52560701DBE102AB8E8B73 /* Views/Runs/RunHistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Views/Runs/RunHistoryView.swift; sourceTree = ""; }; + D91517BFBDECE389497A425B /* Rsync Studio.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Rsync Studio.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + E2639D73ED1EC5C164BC46AF /* Views/Jobs/JobListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Views/Jobs/JobListView.swift; sourceTree = ""; }; + F39F11523D2F6BF2FBCD90FF /* Views/Runs/RunLogView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Views/Runs/RunLogView.swift; sourceTree = ""; }; + F618D81AA8D3052C88FDF93F /* Services/RsyncCommandBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Services/RsyncCommandBuilder.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + DAF6AA633395B1B76148E35B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 86024CAD1E83101D97359D73 /* Products */ = { + isa = PBXGroup; + children = ( + D91517BFBDECE389497A425B /* Rsync Studio.app */, + ); + name = Products; + sourceTree = ""; + }; + B60F08E1B2CF35AEB2F1DE90 /* Rsync Studio */ = { + isa = PBXGroup; + children = ( + 2C1944E5F7109545301358AD /* Rsync StudioApp.swift */, + 4D2D059072C1E33E64D7DCDF /* ContentView.swift */, + 344231C687A1F4BDC84AE838 /* SettingsView.swift */, + 13136DBE7B701EB6D0CE478E /* Models/SyncJob.swift */, + C7A5B87A4971CCE37EF1B979 /* Models/SyncRun.swift */, + AB2000000000000000000001 /* Models/SyncSchedule.swift */, + F618D81AA8D3052C88FDF93F /* Services/RsyncCommandBuilder.swift */, + 1F173223A0A15A648115C2B6 /* Services/RsyncRunner.swift */, + BE0FFB276373DDA4C5A8E419 /* Services/RsyncLocator.swift */, + AB2000000000000000000002 /* Services/FileWatchService.swift */, + AB2000000000000000000003 /* Services/BackgroundSyncCoordinator.swift */, + 8999F614BA12AF14ACCB5E3D /* Utilities/FilePicker.swift */, + CA5919F7BA545585E4369602 /* Views/Components/StatusBadge.swift */, + 58B5F691C6DE4B3B7224BE4B /* Views/Components/PathField.swift */, + 5790F644CCAAF49094D57D68 /* Views/Components/FlowLayout.swift */, + BCA4F1E7C15E2FC1DCC85FEE /* Views/Jobs/JobEditorView.swift */, + E2639D73ED1EC5C164BC46AF /* Views/Jobs/JobListView.swift */, + 002D9E0AA02D4B37F6BB05F6 /* Views/Jobs/JobDetailView.swift */, + CD52560701DBE102AB8E8B73 /* Views/Runs/RunHistoryView.swift */, + F39F11523D2F6BF2FBCD90FF /* Views/Runs/RunLogView.swift */, + AB2000000000000000000004 /* Views/ScheduleCalendarView.swift */, + AC2000000000000000000001 /* Views/HelpView.swift */, + AC2000000000000000000002 /* Resources/Rsync Studio Help.md */, + AD2000000000000000000001 /* Resources/PrivacyInfo.xcprivacy */, + AA2000000000000000000001 /* Utilities/KeychainStore.swift */, + AA2000000000000000000002 /* Views/Components/SplashView.swift */, + AA2000000000000000000003 /* Assets.xcassets */, + ); + path = "Rsync Studio"; + sourceTree = ""; + }; + FAD58DE7366495DB4650CFEF = { + isa = PBXGroup; + children = ( + B60F08E1B2CF35AEB2F1DE90 /* Rsync Studio */, + 86024CAD1E83101D97359D73 /* Products */, + ); + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 42AEFBAE01D2DFD981F7DA7D /* Rsync Studio */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1EE5970F9824F2EE5F7679D7 /* Build configuration list for PBXNativeTarget "Rsync Studio" */; + buildPhases = ( + FCA229C23F166EBB0BA5029E /* Sources */, + DAF6AA633395B1B76148E35B /* Frameworks */, + B9C6EB6F79FC54535ACB3053 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Rsync Studio"; + productName = "Rsync Studio"; + productReference = D91517BFBDECE389497A425B /* Rsync Studio.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 46F86FAA6BBF9AC94A7E4595 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1600; + LastUpgradeCheck = 2700; + TargetAttributes = { + 42AEFBAE01D2DFD981F7DA7D = { + CreatedOnToolsVersion = 16.0; + }; + }; + }; + buildConfigurationList = F0E5A3A488914D1AA34BF23A /* Build configuration list for PBXProject "Rsync Studio" */; + compatibilityVersion = "Xcode 15.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = FAD58DE7366495DB4650CFEF; + productRefGroup = 86024CAD1E83101D97359D73 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 42AEFBAE01D2DFD981F7DA7D /* Rsync Studio */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + B9C6EB6F79FC54535ACB3053 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AA1000000000000000000003 /* Assets.xcassets in Resources */, + AC1000000000000000000002 /* Resources/Rsync Studio Help.md in Resources */, + AD1000000000000000000001 /* Resources/PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + FCA229C23F166EBB0BA5029E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3E6D35DAB1BD51D9E21E7B3F /* Rsync StudioApp.swift in Sources */, + FB73BE2A7887F32D512EC848 /* ContentView.swift in Sources */, + C24299D89D285E985C089C0F /* SettingsView.swift in Sources */, + 205FC2ECD561AE0B6EA8BE73 /* Models/SyncJob.swift in Sources */, + 0AB9E3362F1DCE2312221B31 /* Models/SyncRun.swift in Sources */, + AB1000000000000000000001 /* Models/SyncSchedule.swift in Sources */, + 93BD9B27AA1F883F0A05CE3A /* Services/RsyncCommandBuilder.swift in Sources */, + CC02106B9AF77855935487F6 /* Services/RsyncRunner.swift in Sources */, + 87F3C7BF9787C5EF1DFC58CE /* Services/RsyncLocator.swift in Sources */, + AB1000000000000000000002 /* Services/FileWatchService.swift in Sources */, + AB1000000000000000000003 /* Services/BackgroundSyncCoordinator.swift in Sources */, + 0BBFC488F7DFF17E315AEEF2 /* Utilities/FilePicker.swift in Sources */, + D2009B9542E292B66BB8A0D4 /* Views/Components/StatusBadge.swift in Sources */, + 3D5AB53FDA192FBBA66D2CEF /* Views/Components/PathField.swift in Sources */, + 41CA3E36ADC08AE451912D92 /* Views/Components/FlowLayout.swift in Sources */, + 593DB1791A00690020ADF82D /* Views/Jobs/JobEditorView.swift in Sources */, + 7C32064BC9CE29F5116ADE89 /* Views/Jobs/JobListView.swift in Sources */, + DF2A7BB149EEC298F6207758 /* Views/Jobs/JobDetailView.swift in Sources */, + 1FB249F959D6825750186C76 /* Views/Runs/RunHistoryView.swift in Sources */, + F58FB754850EEF340B2E65FE /* Views/Runs/RunLogView.swift in Sources */, + AB1000000000000000000004 /* Views/ScheduleCalendarView.swift in Sources */, + AC1000000000000000000001 /* Views/HelpView.swift in Sources */, + AA1000000000000000000001 /* Utilities/KeychainStore.swift in Sources */, + AA1000000000000000000002 /* Views/Components/SplashView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 0C42D4EB6117C2B9C8008C35 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_TEAM = 39R6U3437D; + ENABLE_APP_SANDBOX = NO; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = "Rsync Studio"; + INFOPLIST_KEY_CFBundleIconName = AppIcon; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_RsyncStudioUpdateManifestURL = ""; + INFOPLIST_KEY_RsyncStudioUpdatePublicKey = ""; + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = net.absdev.RsyncStudio; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 43E6727D37020658CECE8F0C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + DEAD_CODE_STRIPPING = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 14.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 643EE4829B317660C2A7A37C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + DEAD_CODE_STRIPPING = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 14.0; + SDKROOT = macosx; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = Release; + }; + A969B6690DDF65BACEAA2A89 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = YES; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + DEVELOPMENT_TEAM = 39R6U3437D; + ENABLE_APP_SANDBOX = NO; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = "Rsync Studio"; + INFOPLIST_KEY_CFBundleIconName = AppIcon; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_RsyncStudioUpdateManifestURL = ""; + INFOPLIST_KEY_RsyncStudioUpdatePublicKey = ""; + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = net.absdev.RsyncStudio; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1EE5970F9824F2EE5F7679D7 /* Build configuration list for PBXNativeTarget "Rsync Studio" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0C42D4EB6117C2B9C8008C35 /* Debug */, + A969B6690DDF65BACEAA2A89 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F0E5A3A488914D1AA34BF23A /* Build configuration list for PBXProject "Rsync Studio" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 43E6727D37020658CECE8F0C /* Debug */, + 643EE4829B317660C2A7A37C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 46F86FAA6BBF9AC94A7E4595 /* Project object */; +} diff --git a/Rsync Studio.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Rsync Studio.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Rsync Studio.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Rsync Studio/Assets.xcassets/AccentColor.colorset/Contents.json b/Rsync Studio/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..740fb4f --- /dev/null +++ b/Rsync Studio/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors": [ + { + "idiom": "universal", + "color": { + "color-space": "srgb", + "components": { + "red": "0.078", + "green": "0.455", + "blue": "0.902", + "alpha": "1.000" + } + } + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Rsync Studio/Assets.xcassets/AppIcon.appiconset/Contents.json b/Rsync Studio/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..ccbe64b --- /dev/null +++ b/Rsync Studio/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images": [ + { + "idiom": "mac", + "size": "16x16", + "scale": "1x", + "filename": "appicon_16x16@1x.png" + }, + { + "idiom": "mac", + "size": "16x16", + "scale": "2x", + "filename": "appicon_16x16@2x.png" + }, + { + "idiom": "mac", + "size": "32x32", + "scale": "1x", + "filename": "appicon_32x32@1x.png" + }, + { + "idiom": "mac", + "size": "32x32", + "scale": "2x", + "filename": "appicon_32x32@2x.png" + }, + { + "idiom": "mac", + "size": "128x128", + "scale": "1x", + "filename": "appicon_128x128@1x.png" + }, + { + "idiom": "mac", + "size": "128x128", + "scale": "2x", + "filename": "appicon_128x128@2x.png" + }, + { + "idiom": "mac", + "size": "256x256", + "scale": "1x", + "filename": "appicon_256x256@1x.png" + }, + { + "idiom": "mac", + "size": "256x256", + "scale": "2x", + "filename": "appicon_256x256@2x.png" + }, + { + "idiom": "mac", + "size": "512x512", + "scale": "1x", + "filename": "appicon_512x512@1x.png" + }, + { + "idiom": "mac", + "size": "512x512", + "scale": "2x", + "filename": "appicon_512x512@2x.png" + } + ], + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_128x128@1x.png b/Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_128x128@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..01669453b65064bc509fcb9324ff559c2e40e519 GIT binary patch literal 13462 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%0Axq-Y$=jc1*FoYbcAC;vnNWld@?ca8KYeG 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 literal 0 HcmV?d00001 diff --git a/Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_16x16@1x.png b/Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_16x16@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..de6a01b3d815d004addfc8dbff10b138e3e332a1 GIT binary patch literal 596 zcmV-a0;~OrP)8?kcY5Ip{1<~MuM%E zC}QOWZ%GKos3$qMz4!Vpj+c5qW?*Kx_v$J|3MAZ<1kpuMpaha;GLwlC#W1AdE_#uB zkO!lQ5}a@#G4&G?D1v050Cg3xLnD&~ zD`7<*i#(PHA%qyr$;nZe96)fOh-gHQL6lAI&MqG>4($s7-fq^npZ1T8tJUzkFMG}C zo!Ui0^k^hCwI?o|8)-GQ_`JXPVla~H=IN%HHoJ_0!9co1NC-xVC#Ul_8}a7BO_Waw2>3sc!e( z2&X6oiZZoJ%pJ_0eW}hL4fAIj58qV;=BC5cnC>n29I0|RNs}Z&mdO31=1AA>Z~yG3 zOSAFfY-|tw#!~m=Rtb3Jgp4vyFKkJEpv5}XMMN|vsMVCjUjq+Bm)w)~98C?uLu#9p)=Nu?h%W&}MMMkw@>U}MM5BSU?vr!O^ncI+B71dst3(EdvZ zwCq6oA9RrrB#9CYMiK3?yb%;gK#~Fks4(*&3?Lbx5z3*YIXW^r&_whL3=0%)ZZgu0 zmebH#$Qcxv-&J5-YZl=EVW8N>lF(*M*#a1kEZW{7lffuAGou^LNWyHM0ssg>-Mbdn zr?|H*K&=l1fYhRQKD}>`FZR)dBBy~QNh2-C(dLnW0Fy!>6oLW!hwK-;wV7=w-&G>> zN=@j<5*PcZ8zo0FCa1e4XL2StlGza>NreznND&fL2dcnAiGw5F*^1QOsw`KafL?*U zLpGsga6@vYWJR)G;h=BVHVeAbja6W~rob{;;cjl@+G@cKA?)d+pP;rPka8i0Ff5P^ z5pYLxOKyc*N;a;!vd5o0TC5#P`-TSK!8l&M-@JIEzP%BJ%?$xsS@IKy ze6hzDPL_`>+4s&({(7VN=qmp3dOa#F<5=60O1ZNrS#EN`&62YUe(|aPnYB{Fl{?K( z|2e&}9*scKty*2SFP|!(JnSETEL~sk{psKJ#kcB7gTfhrnKG1eMWEvqBg|+<5dFfQ zUQGaAzT15FFXLOA8uhr`x1~N8dVKq#zJGpp`Az`%!sA5%ue=kBJ;K;J+L2gW*>jFE z(hXI^kG#LQc&q;P%d?+coNm`}Vp3sTV^U*W!^vr*pIw@5&M+u&`e*^bNNXMK7>~%8 zOexsWQ?B<<9xqNkTKxXi>c)C}>vaF%h*h*iE3q)VH_?w?oL#xwJiF@0_gmpq+r2w{ zs`ipQ>d3JKFeo_cnS^PB5H4J=7kbu6Z1=$o+qG)p_J#l~_t+~~)fp#uZp&IN7iq2o z-IH0mYGC9ON7DWw>&V3i0m-mF#oupLZjg{Ga_4lHci2t@twjJvOlv)u1mLU7M&jI? zb?MCPlv&%rMhIwFfW)}Mq*5|u8p;l4%*6kWK!Bhs^sjr(Gb_c3L$BYpw`kU-+kZ_KtTEtLGqQ)QU|V%Wp5hf&E< zK@x@Gg(r&7uBDTQ?Qgf5WSRRq-fyelj9rBSCXnRjRLA$58_vEo0r2Eu|K{_(10!zE zv@zA@RGTyHAMooRD^DIa0N37$aV2Heyje$`SAz# z`6rH*r;hlseRkz;+};cbk1pBc2Ysmr0OzhZzqm3>rlyG;K_{(*5kz9vI0$AmY|r9L zCkK!1O{3C&{?g=!=f`ht#%E6S7E3<6>VVJ7Y^%cWUaNj}t#Yb~sHH}bFlU84ZKSR@ ztPuhnl=$Q8)2sLDXI6@(J|8Qn-`x|Wf%;Koe*239rEFU<)7bs(VR8n}^~)*$6XN(f=vKxzvwfS{Fb>od-R zDYcc^b~1oO+#jo7a8!C73WX5@EEJ$cknPygiEM6~Ebs(bx{Vv&pU^#54cX2`U`OA) z{ZI#oT*7aQ+d%vEML bI*I=P7n#?=G-p5a00000NkvXXu0mjf^(8Ke literal 0 HcmV?d00001 diff --git a/Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_256x256@1x.png b/Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_256x256@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..0fce1cfd79e012452848292146263cee560b29cf GIT binary patch literal 35707 zcmV)*K#9MJP)MeK4%y0fU z+xMMwGVgoU)s1SNsCqZ^EZ^CF-*VQZTYl~p^f@X%%J{T@9GaP!Fi zVY~<_-dj%Mlqt&DaW8G@!)Y`Dn^FP};3(6)F4@nrT}m`%1<l0-{)|1hJlpl_H1) z`^#R?r2(M_7M6nddKm8p$$slf4Dg1cp9i@3wV_{#zvxW^%r;PQVvo5HAT6MB6<8pw z5UZGw%Wa&%5t^g&P+7_-{+U9le7YR5X^Dc_lJbCKioUu7Ak#y082z#9dW6t^XzmOB zC@{dyi+)x(Uy6Q4Vv$^*?03&5Ex61o_01e*WJ~YPZ$S2Qxty8R7b95+G6A62qUjKa z-Ct5!kwCvp*U$24skzYO=!FaAKdj1h!_kkF0d89KGnWdN;6bG11dHCROkFyVRg^-6 zP#R7m3{?Tq)>xv+Qty7*zwf3_kV;Z%0Axq-Y$=jc1*FoYbcAC;vnNWld@?ca8KYeG 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 literal 0 HcmV?d00001 diff --git a/Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_256x256@2x.png b/Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_256x256@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..75e61ebe4f5b5bbcde015dd4b9600a63ad8b964d GIT binary patch literal 88718 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 bI*I=P7n#?=G-p5a00000NkvXXu0mjf^(8Ke literal 0 HcmV?d00001 diff --git a/Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_32x32@2x.png b/Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_32x32@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..be6fbfa712072da60f6d08e433ffa18900b1d73a GIT binary patch literal 4836 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 KMNUMnLSTa3kXFP1 literal 0 HcmV?d00001 diff --git a/Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_512x512@1x.png b/Rsync Studio/Assets.xcassets/AppIcon.appiconset/appicon_512x512@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..75e61ebe4f5b5bbcde015dd4b9600a63ad8b964d GIT binary patch literal 88718 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%0Dp-3|P~$ASZlJAaVvl+bqND_Fkj8 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 KsvoXe1^ge`gLe1; literal 0 HcmV?d00001 diff --git a/Rsync Studio/Assets.xcassets/Contents.json b/Rsync Studio/Assets.xcassets/Contents.json new file mode 100644 index 0000000..c47b5f2 --- /dev/null +++ b/Rsync Studio/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info": { + "author": "xcode", + "version": 1 + } +} \ No newline at end of file diff --git a/Rsync Studio/ContentView.swift b/Rsync Studio/ContentView.swift new file mode 100644 index 0000000..9e86682 --- /dev/null +++ b/Rsync Studio/ContentView.swift @@ -0,0 +1,233 @@ +import SwiftUI +import SwiftData + +struct ContentView: View { + let startupStorageError: String? + @EnvironmentObject private var automation: BackgroundSyncCoordinator + @Environment(\.openWindow) private var openWindow + @State private var selectedJob: SyncJob? + @State private var section: AppSection = .jobs + @State private var showingNewJob = false + @State private var showingSplash = true + @State private var showingStorageAlert = false + + init(startupStorageError: String? = nil) { + self.startupStorageError = startupStorageError + } + + var body: some View { + ZStack { + mainContent + .opacity(showingSplash ? 0 : 1) + + if showingSplash { + SplashView() + .transition(.opacity.combined(with: .scale(scale: 1.01))) + .zIndex(10) + } + } + .sheet(isPresented: $showingNewJob) { JobEditorView() } + .alert("Storage Recovery Mode", isPresented: $showingStorageAlert) { + Button("OK", role: .cancel) {} + } message: { + Text(startupStorageError ?? "Rsync Studio is using temporary storage.") + } + .onAppear { showingStorageAlert = startupStorageError != nil } + .task { + guard showingSplash else { return } + try? await Task.sleep(for: .seconds(1.0)) + withAnimation(.easeOut(duration: 0.28)) { showingSplash = false } + } + } + + private var mainContent: some View { + VStack(spacing: 0) { + sectionHeader + Divider() + + switch section { + case .jobs: + HSplitView { + JobListView(selection: $selectedJob, showingNewJob: $showingNewJob) + .frame(minWidth: 320, idealWidth: 360, maxWidth: 390) + + Group { + if let selectedJob { + JobDetailView(job: selectedJob) + } else { + emptyJobsView + } + } + .frame(minWidth: 620, maxWidth: .infinity, maxHeight: .infinity) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + + case .calendar: + ScheduleCalendarView() + + case .history: + RunHistoryView(onBack: { section = .jobs }) + } + } + .background(Color(nsColor: .windowBackgroundColor)) + } + + private var emptyJobsView: some View { + VStack(spacing: 20) { + ZStack { + RoundedRectangle(cornerRadius: 24, style: .continuous) + .fill(Color.accentColor.opacity(0.10)) + .frame(width: 92, height: 92) + Image(systemName: "arrow.triangle.2.circlepath") + .font(.system(size: 42, weight: .medium)) + .foregroundStyle(Color.accentColor) + } + + VStack(spacing: 7) { + Text("Select a Sync Job") + .font(.title2.bold()) + Text("Choose a job from the list to review its paths, automation and recent status.") + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + .frame(maxWidth: 430) + } + + Button { + showingNewJob = true + } label: { + Label("New Sync Job", systemImage: "plus") + .frame(minWidth: 120) + } + .buttonStyle(.borderedProminent) + .controlSize(.large) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .padding(40) + } + + private var sectionHeader: some View { + HStack(spacing: 18) { + HStack(spacing: 11) { + Image(systemName: "arrow.triangle.2.circlepath.circle.fill") + .font(.system(size: 27, weight: .medium)) + .symbolRenderingMode(.hierarchical) + .foregroundStyle(Color.accentColor) + + VStack(alignment: .leading, spacing: 1) { + Text("Rsync Studio") + .font(.headline) + Text(section.subtitle) + .font(.caption) + .foregroundStyle(.secondary) + } + } + + Spacer() + + if automation.activity != .idle { + HStack(spacing: 7) { + AnimatedSyncIndicator(size: 18, lineWidth: 2.6) + Text(automation.activityDisplayTitle) + .font(.caption.weight(.medium)) + .lineLimit(1) + } + .padding(.horizontal, 10) + .padding(.vertical, 6) + .background(.thinMaterial, in: Capsule()) + } + + if let serviceError = automation.lastError { + Image(systemName: "exclamationmark.triangle.fill") + .foregroundStyle(Color.orange) + .help(serviceError) + .accessibilityLabel("Background service error") + } + + Picker("Section", selection: $section) { + Label("Jobs", systemImage: "rectangle.stack").tag(AppSection.jobs) + Label("Calendar", systemImage: "calendar").tag(AppSection.calendar) + Label("History", systemImage: "clock.arrow.circlepath").tag(AppSection.history) + } + .pickerStyle(.segmented) + .labelsHidden() + .frame(width: 390) + + Button { + openWindow(id: "help") + } label: { + Label("Help", systemImage: "questionmark.circle") + } + .buttonStyle(.bordered) + .help("Open Rsync Studio Help") + } + .padding(.horizontal, 18) + .frame(height: 70) + .background(.bar) + } +} + +enum AppSection: Hashable { + case jobs, calendar, history + + var subtitle: String { + switch self { + case .jobs: return "Jobs & Automation" + case .calendar: return "Schedule Calendar" + case .history: return "Run History" + } + } +} + + +struct AnimatedSyncIndicator: View { + let size: CGFloat + var lineWidth: CGFloat = 7 + + @State private var rotation = 0.0 + @State private var pulse = false + + var body: some View { + ZStack { + Circle() + .stroke(Color.accentColor.opacity(0.10), lineWidth: lineWidth) + + Circle() + .trim(from: 0.05, to: 0.76) + .stroke( + AngularGradient( + colors: [ + Color.accentColor.opacity(0.18), + Color.accentColor, + Color.accentColor.opacity(0.40) + ], + center: .center + ), + style: StrokeStyle(lineWidth: lineWidth, lineCap: .round) + ) + .rotationEffect(.degrees(rotation)) + + Circle() + .fill(Color.accentColor) + .frame(width: max(4, lineWidth * 1.05), height: max(4, lineWidth * 1.05)) + .offset(y: -(size / 2)) + .rotationEffect(.degrees(rotation + 18)) + + Image(systemName: "arrow.triangle.2.circlepath") + .font(.system(size: size * 0.31, weight: .semibold)) + .foregroundStyle(Color.accentColor) + .scaleEffect(pulse ? 1.04 : 0.94) + .opacity(pulse ? 1 : 0.72) + } + .frame(width: size, height: size) + .onAppear { + rotation = 0 + pulse = false + withAnimation(.linear(duration: 1.15).repeatForever(autoreverses: false)) { + rotation = 360 + } + withAnimation(.easeInOut(duration: 0.9).repeatForever(autoreverses: true)) { + pulse = true + } + } + } +} diff --git a/Rsync Studio/Models/SyncJob.swift b/Rsync Studio/Models/SyncJob.swift new file mode 100644 index 0000000..a64f6ef --- /dev/null +++ b/Rsync Studio/Models/SyncJob.swift @@ -0,0 +1,110 @@ +import Foundation +import SwiftData + +@Model +final class SyncJob { + var id: UUID + var name: String + var sourcePath: String + var destinationPath: String + var isRemote: Bool + var remoteHost: String + var remoteUser: String + var remotePort: Int + var sshKeyPath: String + var archive: Bool + var compress: Bool + var deleteExtraneous: Bool + var preservePermissions: Bool + var preserveExtendedAttributes: Bool + var showProgress: Bool + var exclusionsText: String + var additionalArguments: String + var isEnabled: Bool + var createdAt: Date + var updatedAt: Date + var lastRunAt: Date? + var lastExitCode: Int? + var scheduleEnabled: Bool = false + var scheduleKindRaw: String = SyncScheduleKind.manual.rawValue + var scheduleStartAt: Date = Date().addingTimeInterval(3600) + var scheduleIntervalMinutes: Int = 30 + var nextRunAt: Date? = nil + var watchEnabled: Bool = false + var watchPath: String = "" + var watchDebounceSeconds: Int = 3 + var lastWatchEventAt: Date? = nil + var allowUnattendedDelete: Bool = false + var retryCount: Int = 2 + var retryDelaySeconds: Int = 10 + var notifyOnFailure: Bool = true + var notifyOnSuccess: Bool = false + var requireExpectedVolume: Bool = false + var expectedVolumeIdentifier: String = "" + var minimumFreeSpaceMB: Int = 512 + + init( + name: String = "New Sync Job", + sourcePath: String = "", + destinationPath: String = "" + ) { + self.id = UUID() + self.name = name + self.sourcePath = sourcePath + self.destinationPath = destinationPath + self.isRemote = false + self.remoteHost = "" + self.remoteUser = "" + self.remotePort = 22 + self.sshKeyPath = "" + self.archive = true + self.compress = false + self.deleteExtraneous = false + self.preservePermissions = true + self.preserveExtendedAttributes = true + self.showProgress = true + self.exclusionsText = "" + self.additionalArguments = "" + self.isEnabled = true + self.createdAt = Date() + self.updatedAt = Date() + self.lastRunAt = nil + self.lastExitCode = nil + self.scheduleEnabled = false + self.scheduleKindRaw = SyncScheduleKind.manual.rawValue + self.scheduleStartAt = Date().addingTimeInterval(3600) + self.scheduleIntervalMinutes = 30 + self.nextRunAt = nil + self.watchEnabled = false + self.watchPath = "" + self.watchDebounceSeconds = 3 + self.lastWatchEventAt = nil + self.allowUnattendedDelete = false + self.retryCount = 2 + self.retryDelaySeconds = 10 + self.notifyOnFailure = true + self.notifyOnSuccess = false + self.requireExpectedVolume = false + self.expectedVolumeIdentifier = "" + self.minimumFreeSpaceMB = 512 + } + + var exclusions: [String] { + exclusionsText + .split(whereSeparator: \.isNewline) + .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) } + .filter { !$0.isEmpty } + } + + var expectedVolumeDisplay: String { + expectedVolumeIdentifier.isEmpty ? "Not pinned" : expectedVolumeIdentifier + } + + var destinationDisplay: String { + if isRemote { + let userPrefix = remoteUser.isEmpty ? "" : "\(remoteUser)@" + return "\(userPrefix)\(remoteHost):\(destinationPath)" + } + return destinationPath + } +} diff --git a/Rsync Studio/Models/SyncRun.swift b/Rsync Studio/Models/SyncRun.swift new file mode 100644 index 0000000..378c078 --- /dev/null +++ b/Rsync Studio/Models/SyncRun.swift @@ -0,0 +1,150 @@ +import Foundation +import SwiftData + +@Model +final class SyncRun { + var id: UUID + var jobID: UUID + var jobName: String + var startedAt: Date + var finishedAt: Date? + var command: String + var output: String + var errorOutput: String + var exitCode: Int? + var wasDryRun: Bool + var wasCancelled: Bool + var triggerRaw: String = SyncRunTrigger.manual.rawValue + + init(job: SyncJob, command: String, wasDryRun: Bool, trigger: SyncRunTrigger = .manual) { + self.id = UUID() + self.jobID = job.id + self.jobName = job.name + self.startedAt = Date() + self.command = command + self.output = "" + self.errorOutput = "" + self.exitCode = nil + self.wasDryRun = wasDryRun + self.wasCancelled = false + self.triggerRaw = trigger.rawValue + } + + var trigger: SyncRunTrigger { SyncRunTrigger(rawValue: triggerRaw) ?? .manual } + var succeeded: Bool { exitCode == 0 && !wasCancelled } + var isRunning: Bool { finishedAt == nil } + + var duration: TimeInterval? { + guard let finishedAt else { return nil } + return finishedAt.timeIntervalSince(startedAt) + } + + var summary: RsyncSummary { + RsyncSummary.parse(output + "\n" + errorOutput) + } + + + static func sanitizedLog(_ value: String, maxBytes: Int = 2_000_000) -> String { + let stripped = stripANSI(value) + let redacted = stripped + .replacingOccurrences(of: #"(?i)--password-file(?:=|\s+)[^\s]+"#, with: "--password-file=[REDACTED]", options: .regularExpression) + .replacingOccurrences(of: #"(?i)(password|passwd|token|secret)=([^\s]+)"#, with: "$1=[REDACTED]", options: .regularExpression) + + let data = Data(redacted.utf8) + guard data.count > maxBytes else { return redacted } + let prefix = data.prefix(maxBytes) + return String(decoding: prefix, as: UTF8.self) + "\n\n[Log truncated by Rsync Studio for safety and storage limits.]\n" + } + + private static func stripANSI(_ value: String) -> String { + value.replacingOccurrences( + of: #"\u001B\[[0-9;?]*[ -/]*[@-~]"#, + with: "", + options: .regularExpression + ) + } + + var exportText: String { + var text = "Rsync Studio Run Log\n" + text += "Job: \(jobName)\n" + text += "Started: \(startedAt.formatted(date: .complete, time: .standard))\n" + if let finishedAt { text += "Finished: \(finishedAt.formatted(date: .complete, time: .standard))\n" } + text += "Trigger: \(trigger.title)\n" + text += "Dry run: \(wasDryRun ? "Yes" : "No")\n" + text += "\nCommand\n-------\n$ \(command)\n\nOutput\n------\n" + if !output.isEmpty { text += output } + if !errorOutput.isEmpty { + if !text.hasSuffix("\n") { text += "\n" } + text += "\n--- stderr ---\n\(errorOutput)" + } + if let exitCode { + if !text.hasSuffix("\n") { text += "\n" } + text += "\nExit code: \(exitCode)\n" + } + return text + } +} + +struct RsyncSummary: Equatable { + var numberOfFiles: String? + var numberOfFilesTransferred: String? + var totalFileSize: String? + var totalTransferredFileSize: String? + var unmatchedData: String? + var matchedData: String? + var fileListSize: String? + var fileListGenerationTime: String? + var fileListTransferTime: String? + var totalSent: String? + var totalReceived: String? + var transferRate: String? + var totalSizeAndSpeedup: String? + + var hasStatistics: Bool { + [ + numberOfFiles, + numberOfFilesTransferred, + totalFileSize, + totalTransferredFileSize, + totalSent, + totalReceived + ].contains { $0 != nil } + } + + static func parse(_ text: String) -> RsyncSummary { + var result = RsyncSummary() + + for rawLine in text.components(separatedBy: .newlines) { + let line = rawLine.trimmingCharacters(in: .whitespacesAndNewlines) + guard !line.isEmpty else { continue } + + func value(after prefix: String) -> String? { + guard line.hasPrefix(prefix) else { return nil } + return String(line.dropFirst(prefix.count)).trimmingCharacters(in: .whitespaces) + } + + if let value = value(after: "Number of files:") { result.numberOfFiles = value; continue } + if let value = value(after: "Number of files transferred:") { result.numberOfFilesTransferred = value; continue } + if let value = value(after: "Total file size:") { result.totalFileSize = value; continue } + if let value = value(after: "Total transferred file size:") { result.totalTransferredFileSize = value; continue } + if let value = value(after: "Unmatched data:") { result.unmatchedData = value; continue } + if let value = value(after: "Matched data:") { result.matchedData = value; continue } + if let value = value(after: "File list size:") { result.fileListSize = value; continue } + if let value = value(after: "File list generation time:") { result.fileListGenerationTime = value; continue } + if let value = value(after: "File list transfer time:") { result.fileListTransferTime = value; continue } + if let value = value(after: "Total sent:") { result.totalSent = value; continue } + if let value = value(after: "Total received:") { result.totalReceived = value; continue } + + if line.hasPrefix("sent "), line.contains(" bytes/sec") { + result.transferRate = line + continue + } + + if line.hasPrefix("total size is "), line.contains("speedup is") { + result.totalSizeAndSpeedup = line + } + } + + return result + } +} diff --git a/Rsync Studio/Models/SyncSchedule.swift b/Rsync Studio/Models/SyncSchedule.swift new file mode 100644 index 0000000..0a13809 --- /dev/null +++ b/Rsync Studio/Models/SyncSchedule.swift @@ -0,0 +1,142 @@ +import Foundation + +enum SyncScheduleKind: String, CaseIterable, Identifiable, Codable { + case manual + case once + case hourly + case daily + case weekly + case monthly + case custom + + var id: String { rawValue } + + var title: String { + switch self { + case .manual: return "Manual only" + case .once: return "Once" + case .hourly: return "Hourly" + case .daily: return "Daily" + case .weekly: return "Weekly" + case .monthly: return "Monthly" + case .custom: return "Custom interval" + } + } + + var systemImage: String { + switch self { + case .manual: return "hand.tap" + case .once: return "calendar.badge.clock" + case .hourly: return "clock.arrow.circlepath" + case .daily: return "sun.max" + case .weekly: return "calendar" + case .monthly: return "calendar.circle" + case .custom: return "timer" + } + } +} + +enum SyncRunTrigger: String, Codable { + case manual + case scheduled + case watched + case syncAll + + var title: String { + switch self { + case .manual: return "Manual" + case .scheduled: return "Scheduled" + case .watched: return "File change" + case .syncAll: return "Sync All" + } + } + + var systemImage: String { + switch self { + case .manual: return "play.fill" + case .scheduled: return "calendar.badge.clock" + case .watched: return "eye.fill" + case .syncAll: return "arrow.triangle.2.circlepath" + } + } +} + +extension SyncJob { + var scheduleKind: SyncScheduleKind { + get { SyncScheduleKind(rawValue: scheduleKindRaw) ?? .manual } + set { scheduleKindRaw = newValue.rawValue } + } + + var effectiveWatchPath: String { + let trimmed = watchPath.trimmingCharacters(in: .whitespacesAndNewlines) + return trimmed.isEmpty ? sourcePath : trimmed + } + + var scheduleDescription: String { + guard scheduleEnabled, scheduleKind != .manual else { return "Manual" } + let time = scheduleStartAt.formatted(date: .omitted, time: .shortened) + switch scheduleKind { + case .manual: return "Manual" + case .once: return "Once · \(scheduleStartAt.formatted(date: .abbreviated, time: .shortened))" + case .hourly: return "Every hour" + case .daily: return "Daily · \(time)" + case .weekly: + return "Weekly · \(scheduleStartAt.formatted(.dateTime.weekday(.abbreviated))) · \(time)" + case .monthly: + return "Monthly · day \(Calendar.current.component(.day, from: scheduleStartAt)) · \(time)" + case .custom: + return "Every \(max(1, scheduleIntervalMinutes)) min" + } + } + + func calculateNextRun(after date: Date = Date()) -> Date? { + guard scheduleEnabled, scheduleKind != .manual else { return nil } + let calendar = Calendar.current + + switch scheduleKind { + case .manual: + return nil + case .once: + return scheduleStartAt > date ? scheduleStartAt : nil + case .hourly: + return nextInterval(after: date, seconds: 3600) + case .custom: + return nextInterval(after: date, seconds: TimeInterval(max(1, scheduleIntervalMinutes) * 60)) + case .daily: + let time = calendar.dateComponents([.hour, .minute, .second], from: scheduleStartAt) + return calendar.nextDate(after: date, matching: time, matchingPolicy: .nextTime) + case .weekly: + var components = calendar.dateComponents([.hour, .minute, .second], from: scheduleStartAt) + components.weekday = calendar.component(.weekday, from: scheduleStartAt) + return calendar.nextDate(after: date, matching: components, matchingPolicy: .nextTime) + case .monthly: + var components = calendar.dateComponents([.hour, .minute, .second], from: scheduleStartAt) + components.day = calendar.component(.day, from: scheduleStartAt) + return calendar.nextDate(after: date, matching: components, matchingPolicy: .nextTime) + } + } + + func occurrences(from start: Date, through end: Date, limit: Int = 400) -> [Date] { + guard scheduleEnabled, scheduleKind != .manual, start < end else { return [] } + var output: [Date] = [] + var cursor = start.addingTimeInterval(-1) + + if scheduleKind == .once { + return (scheduleStartAt >= start && scheduleStartAt < end) ? [scheduleStartAt] : [] + } + + while output.count < limit, let next = calculateNextRun(after: cursor), next < end { + if next >= start { output.append(next) } + cursor = next.addingTimeInterval(0.5) + } + return output + } + + private func nextInterval(after date: Date, seconds: TimeInterval) -> Date? { + guard seconds > 0 else { return nil } + if scheduleStartAt > date { return scheduleStartAt } + let elapsed = date.timeIntervalSince(scheduleStartAt) + let steps = floor(elapsed / seconds) + 1 + return scheduleStartAt.addingTimeInterval(steps * seconds) + } +} diff --git a/Rsync Studio/Resources/PrivacyInfo.xcprivacy b/Rsync Studio/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..937278f --- /dev/null +++ b/Rsync Studio/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,23 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/Rsync Studio/Resources/Rsync Studio Help.md b/Rsync Studio/Resources/Rsync Studio Help.md new file mode 100644 index 0000000..91baef3 --- /dev/null +++ b/Rsync Studio/Resources/Rsync Studio Help.md @@ -0,0 +1,575 @@ +# Rsync Studio Help + +Rsync Studio is a macOS front end for `rsync`. It can run local copies, SSH-based remote synchronisation, dry runs, scheduled jobs, and file/folder watch jobs. Every run is recorded in History with the command, result and transfer statistics. + +## 1. Before You Start + +Rsync Studio looks for rsync in this order: + +1. `/opt/homebrew/bin/rsync` +2. `/usr/local/bin/rsync` +3. `/usr/bin/rsync` + +For the best compatibility with modern Linux servers, install a current rsync using Homebrew. The macOS supplied `/usr/bin/rsync` is older and behaves differently for some extended-attribute options. + +SSH jobs also require the normal macOS `ssh` client and network access to the remote computer. + +## 2. Create a Local Sync Job + +1. Select **New Sync Job**. +2. Give the job a descriptive name, for example `Documents Backup`. +3. Choose **Local** as the destination type. +4. Select the source folder. +5. Select the destination folder. +6. Choose the required rsync options. +7. Save the job. +8. Run **Dry Run** first, then use **Run Now** when the result looks correct. + +### Example + +Source: + +`/Users/mag/Documents/` + +Destination: + +`/Volumes/Backup/Documents/` + +A typical job using Archive mode is equivalent to: + +`rsync -a --human-readable --stats /Users/mag/Documents/ /Volumes/Backup/Documents/` + +### Trailing slash behaviour + +Rsync treats these differently: + +`/Users/mag/Documents/` + +copies the **contents** of Documents into the destination. + +`/Users/mag/Documents` + +copies the **Documents directory itself** into the destination. + +Check the source carefully before enabling Delete mode. + +## 3. Create an SSH Remote Job + +1. Create or edit a job. +2. Select **SSH Remote**. +3. Enter the remote host, for example `192.168.1.2` or `pegasus.local`. +4. Enter the SSH username, for example `mag`. +5. Set the SSH port, normally `22`. +6. Select a **private** SSH key if required. +7. Enter a remote destination path such as `/home/mag/backups/Documents`. +8. Save and run a Dry Run. + +### Correct remote example + +Host: `pegasus.local` + +Username: `mag` + +Destination: `/home/mag/backups/photos` + +The resulting destination is similar to: + +`mag@pegasus.local:/home/mag/backups/photos` + +### Incorrect remote destination + +Do not put the host address in the Destination field. These are wrong: + +`192.168.1.2` + +`mag@192.168.1.2` + +The Destination field must contain a path on the remote machine. + +## 4. SSH Keys + +Use the private key, not the `.pub` file. + +Correct examples: + +`~/.ssh/id_ed25519` + +`~/.ssh/id_rsa` + +Incorrect: + +`~/.ssh/id_ed25519.pub` + +If you accidentally select a `.pub` key and the matching private key exists beside it, Rsync Studio attempts to use the private key. If only the public key exists, the run is rejected. + +### Test SSH outside the app + +Before troubleshooting rsync, verify SSH itself works: + +`ssh -p 22 -i ~/.ssh/id_ed25519 mag@pegasus.local` + +If that command cannot connect, fix SSH/network/authentication first. + +## 5. Default Connection Settings + +Open **Rsync Studio > Settings > Connections** to configure defaults for new SSH jobs: + +- Default username +- Default host +- Default SSH port +- Default private key +- Default password storage + +Passwords are stored in macOS Keychain, not SwiftData or UserDefaults. Current rsync execution is designed primarily around SSH keys or an SSH agent; a stored password is not placed on the command line. + +## 6. Rsync Options + +### Archive + +Archive mode (`-a`) is the normal choice for directory backup/synchronisation. It recursively copies files and preserves common metadata. + +### Compress + +Compress (`-z`) can help on slower network links. It is often unnecessary for local copies or already-compressed files such as JPEG, ZIP and video. + +### Delete Extraneous Files + +Delete mode (`--delete`) removes destination files that no longer exist at the source. + +**Use Dry Run before enabling a destructive sync.** A mistaken source or destination combined with Delete can remove destination data. + +### Preserve Permissions + +Preserves permissions when Archive mode is not being used. + +### Extended Attributes + +On modern rsync, Rsync Studio uses `-X`. With Apple `/usr/bin/rsync`, local jobs use the Apple-compatible `-E` form. For SSH to modern Linux rsync, the Apple-only extended attribute flag is omitted to avoid an incompatible remote option. + +### Exclusions + +Add patterns for files or directories you do not want transferred. + +Examples: + +`.DS_Store` + +`*.tmp` + +`node_modules/` + +`.git/` + +### Additional arguments + +Advanced rsync options can be entered as additional arguments. Use this only when you understand the rsync option and its effect. + +Example: + +`--max-size=2G` + +## 7. Dry Run + +Dry Run adds `--dry-run`. Rsync reports what it **would** change without transferring or deleting files. + +Use Dry Run when: + +- Creating a new job +- Changing source or destination paths +- Enabling Delete +- Changing exclusions +- Changing SSH destinations +- Testing a large sync + +The summary window shows files checked, files that would transfer, data size and transfer statistics. + +## 8. Run Now + +Select a job and choose **Run Now**. Manual runs display a progress/result sheet. The complete stdout/stderr output is retained in History. + +Only one rsync process is run by the current runner at a time. If another run is already active, a second job waits for the automation manager or is rejected for a direct manual launch depending on how it was triggered. + +## 9. Scheduling Jobs + +Edit a job and enable **Schedule**. + +Available schedule types include: + +- Once +- Hourly +- Daily +- Weekly +- Monthly +- Custom interval + +Scheduled runs execute without displaying the manual progress sheet. Results still appear in History. + +### Daily example + +Job: `Nightly Documents` + +Schedule: Daily + +Start time: `23:30` + +Result: the job runs each day at approximately the configured application schedule time while Rsync Studio is running. + +### Weekly example + +Job: `Weekly Photos` + +Schedule: Weekly + +Choose the desired start date/time. The application calculates and displays the next run. + +### Custom interval example + +Set a custom interval of `30` minutes to request a run every 30 minutes. + +Avoid extremely short intervals for large jobs. A new run should not repeatedly start before the previous transfer has finished. + +## 10. Calendar + +Select **Calendar** at the top of the main window. + +The calendar shows scheduled jobs by date and allows you to review upcoming automated work. Use it to confirm that a newly edited schedule produces the next run you expected. + +If a job does not appear: + +1. Confirm the job is enabled. +2. Confirm Schedule is enabled for that job. +3. Confirm the start date is valid. +4. Return to the job and check the displayed **Next scheduled run** value. + +## 11. Watch for File or Folder Changes + +Edit a job and enable **File Watching**. + +Rsync Studio uses macOS FSEvents rather than repeatedly scanning the whole directory tree. + +### Watch the job source directory + +Leave the custom watch path empty. The job source is watched automatically. + +Example source: + +`/Users/mag/Developer/MyProject/` + +When changes occur beneath that directory, the watch service debounces the events and triggers the configured sync. + +### Watch one specific file + +Set the watch path to a specific file, for example: + +`/Users/mag/Documents/config.json` + +The service watches the containing directory and filters events so only changes affecting that file trigger the job. + +### Debounce + +Applications often save a file several times in quick succession. The debounce period groups those events into one rsync run. + +Example: + +Debounce: `5 seconds` + +Saving 10 files over a three-second period results in a single sync after activity settles, rather than 10 separate rsync processes. + +### Good watch-job examples + +- Sync a development project to a test server after edits. +- Mirror a document directory to a local backup disk. +- Upload generated reports when files change. +- Synchronise a configuration directory to another Mac or Linux machine. + +### Avoid watch loops + +Do not configure the destination inside the watched source tree. Otherwise rsync's own writes can generate more filesystem events and repeatedly trigger the job. + +Bad example: + +Source: `/Users/mag/Data/` + +Destination: `/Users/mag/Data/Backup/` + +Prefer a destination outside the watched source hierarchy. + +## 12. Background Operation + +Scheduled and file-watch jobs run without opening the manual progress sheet. The application must still be running for its scheduler and FSEvents watchers to operate. + +Enable **Launch at Login** in Settings if you want Rsync Studio to start automatically after you sign in to macOS. You can then close or minimise the main window while the app continues running. + +Quitting Rsync Studio stops in-process schedules and file watching until the application starts again. + +## 13. Jobs Screen + +The Jobs screen is the main status dashboard. Each job shows its key automation and run state. + +Use the filters to review: + +- All jobs +- Scheduled jobs +- Watching jobs +- Jobs with issues + +Select a job to open its full detail view. The **Edit Job** button remains fixed at the top of the detail pane so it is available even after scrolling or on narrower windows. + +## 14. History + +Select **History** to review completed runs. + +History records whether the run was started by: + +- Manual action +- Schedule +- File change + +Select a run to inspect: + +- Start/end time +- Exit status +- rsync command +- Transfer summary +- stdout +- stderr +- Dry-run state + +Use **Export Log** from the run result/detail view when you need a text copy for troubleshooting or auditing. + +## 15. Common Rsync Exit Codes + +`0` — Success. + +`1` — Syntax or usage error. + +`2` — Protocol incompatibility. + +`3` — File selection/input-output errors. + +`10` — Socket I/O error. + +`11` — File I/O error. + +`12` — Error in rsync protocol data stream. + +`23` — Partial transfer due to error. + +`24` — Partial transfer because source files vanished during the run. + +`30` — Timeout in data send/receive. + +Always inspect stderr in History for the actual diagnostic message. + +## 16. Troubleshooting + +### Permission denied + +Check that the macOS user running Rsync Studio can read the source and write to the destination. For remote jobs, check permissions for the remote SSH user. + +### Host key verification failed + +Connect once using Terminal: + +`ssh mag@pegasus.local` + +Verify the host fingerprint and allow SSH to update `~/.ssh/known_hosts`. + +Do not disable host-key verification simply to hide this warning. + +### Public key authentication failed + +Check: + +- The private key path is correct. +- The remote user's `~/.ssh/authorized_keys` contains the matching public key. +- File permissions on the remote `.ssh` directory/key files are valid. +- The SSH username is correct. + +### Remote rsync option error + +If you are using `/usr/bin/rsync` on macOS against modern Linux, avoid manually adding Apple-specific rsync options. Installing Homebrew rsync provides better modern compatibility. + +### Nothing transfers + +Run a Dry Run and inspect the command and output. Check exclusions, trailing slash behaviour and whether source/destination already contain identical data. + +### Watch job does not trigger + +Check that: + +- The job is enabled. +- Global file watching is enabled in Settings. +- File Watching is enabled on the job. +- The watch path exists. +- Rsync Studio is still running. +- The change occurred beneath the watched path, or matches the selected single file. + +### Schedule does not run + +Check that: + +- Global scheduling is enabled in Settings. +- The job itself is enabled. +- Schedule is enabled for the job. +- The displayed next-run time is correct. +- Rsync Studio is running at the scheduled time. + +## 17. Recommended Backup Workflow + +For an important backup job: + +1. Create the job without Delete enabled. +2. Run a Dry Run. +3. Review the source and destination in the generated command. +4. Run the job manually. +5. Check History for exit code 0. +6. Verify several files at the destination. +7. Only then enable a schedule. +8. Enable Delete only when you specifically require a mirror and understand the deletion behaviour. + +Rsync synchronisation is not automatically a versioned backup. If the destination mirrors source deletions, it does not replace a separate versioned/offline backup strategy. + +## 18. Example Configurations + +### Local external-drive backup + +Name: `Documents to USB` + +Source: `/Users/mag/Documents/` + +Destination: `/Volumes/Backup/Documents/` + +Archive: On + +Delete: Off initially + +Schedule: Daily at 22:00 + +### Mac to Linux server + +Name: `Projects to Pegasus` + +Source: `/Users/mag/Developer/` + +Host: `pegasus.local` + +User: `mag` + +Port: `22` + +Private key: `/Users/mag/.ssh/id_ed25519` + +Remote destination: `/home/mag/backups/Developer/` + +Archive: On + +Compress: On + +Schedule: Daily + +### Live project watcher + +Name: `Website Live Sync` + +Source: `/Users/mag/Sites/MySite/` + +Remote destination: `/var/www/mysite/` + +Watch: On + +Watch path: leave empty to watch the source + +Debounce: 5 seconds + +Exclusions: `.git/`, `node_modules/`, `.DS_Store` + +Use this style only when automatic deployment to that destination is intentional. + +## 19. Safety Checklist + +Before running a new job, confirm: + +- Source is correct. +- Destination is correct. +- Remote host/user are correct. +- The selected SSH key is private, not `.pub`. +- Delete mode is intentional. +- Exclusions are correct. +- Dry Run output looks correct. +- The destination has enough free space. +- A watch destination is not inside its watched source. + +## 20. Getting Help Information from the App + +Select the **Help** button in the main Rsync Studio header. The bundled guide you are reading opens inside the application and is available without an Internet connection. + +For an rsync-specific option not documented here, run `man rsync` in Terminal for the version of rsync installed on your Mac. Behaviour can differ between the Apple-supplied rsync and current Homebrew rsync. + + +## Sync All + +Use **Sync All** in the Jobs sidebar to run every enabled job in sequence. Rsync Studio queues the jobs rather than starting several rsync processes at once. Each job creates its own History entry, and the header shows the current batch progress. Disabled jobs are skipped. + + +# Security and unattended operation + +Rsync Studio is designed for direct Developer ID distribution. It uses the macOS Hardened Runtime and intentionally does not use the App Sandbox because the utility must launch `rsync`/`ssh` and work with arbitrary user-selected paths. + +## SSH security + +SSH authentication uses a private key or your normal macOS SSH agent. Rsync Studio does not store SSH passwords and does not place passwords on a process command line. Automated SSH uses `BatchMode=yes`, a connection timeout, keepalive intervals and a finite keepalive failure count. Host-key verification is never disabled; connect to a new host once in Terminal first if SSH needs you to approve its host key. + +Example: + +```text +ssh -p 22 -i ~/.ssh/id_ed25519 mag@pegasus.local +``` + +## Protected advanced arguments + +The Advanced field is for ordinary rsync tuning only. Rsync Studio rejects arguments that can replace the SSH transport, run a different remote command, read options/file lists from other files, write logs/batches to arbitrary paths, load a password file, enter daemon mode, remove source files or bypass the app's controlled delete switch. Examples that are rejected include `-e`, `-M`, `--rsh`, `--rsync-path`, `--password-file`, `--files-from`, `--log-file`, `--write-batch`, `--remove-source-files` and `--delete*`. Unmatched quotes and trailing escape characters are also rejected. + +## Delete protection + +Manual `--delete` runs always show a destructive-operation warning. If a scheduled or file-watch job uses Delete, you must also explicitly enable **Allow unattended delete** in the job editor. This prevents a job from becoming destructively automated merely because Schedule or File Watch was enabled later. + +Run a Dry Run and review the destination before authorising unattended delete. + +## Path overlap protection + +For local jobs, source and destination must be separate directory trees. Rsync Studio rejects configurations where the destination is inside the source or the source is inside the destination. This prevents recursive backup trees and common file-watch loops. + +## History and privacy + +Rsync Studio does not include analytics or tracking. Run output is sanitised before persistence, terminal control sequences are removed, likely credential-shaped values are redacted, and each stdout/stderr log is capped at approximately 2 MB. History retention is configurable in **Settings > Automation > History & Privacy** and defaults to 90 days. + +The bundled privacy manifest declares no tracking and no collected data. + +## Release verification + +The project contains `Docs/RELEASE.md` and `Scripts/security-check.sh` with Developer ID, notarisation, signature and Gatekeeper verification steps for production builds. + + +# Production Reliability + +## Test Job / Preflight +Use **Test Job** before relying on unattended automation. Local jobs verify configuration, rsync availability, source reachability, destination volume identity, and configured free-space reserve. SSH jobs verify batch authentication, remote rsync availability, and remote destination access. + +## External volume protection +For removable drives, enable **Require this exact destination volume** and capture the mounted destination. If that volume is absent, Rsync Studio refuses to sync to another filesystem that happens to appear at the same path. + +## Retries and notifications +Scheduled and watched jobs can retry automatically with increasing delays. Per-job notifications can report failures and, optionally, successful completion. Remote queued jobs wait while the Mac is offline and resume when network connectivity returns. + +## Sync All +Sync All runs enabled jobs sequentially, displays succeeded/failed/skipped totals, and can be cancelled from the Jobs dashboard. + +## Configuration backup +Use the Jobs menu to export or import a versioned JSON job configuration. Private SSH-key paths are intentionally omitted. Imported remote jobs are disabled until authentication is confirmed on that Mac. + +## Diagnostics +Settings → General → **Export Diagnostics…** creates a redacted support report containing application, macOS and rsync versions, job status and recent failures without exporting SSH private-key paths or credentials. + +## Updates +The built-in update checker accepts only an HTTPS manifest signed with the Ed25519 public key embedded in the signed app. Until a production feed and key are configured, update checking remains safely disabled. diff --git a/Rsync Studio/Rsync StudioApp.swift b/Rsync Studio/Rsync StudioApp.swift new file mode 100644 index 0000000..d79786b --- /dev/null +++ b/Rsync Studio/Rsync StudioApp.swift @@ -0,0 +1,78 @@ +import SwiftUI +import SwiftData + +@main +@MainActor +struct RsyncStudioApp: App { + let sharedModelContainer: ModelContainer + let startupStorageError: String? + @StateObject private var runner: RsyncRunner + @StateObject private var automation: BackgroundSyncCoordinator + + init() { + let schema = Schema([ + SyncJob.self, + SyncRun.self, + ]) + let configuration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false) + KeychainStore.delete("defaultSSHPassword") + + do { + let container = try ModelContainer(for: schema, configurations: [configuration]) + sharedModelContainer = container + startupStorageError = nil + let rsyncRunner = RsyncRunner() + _runner = StateObject(wrappedValue: rsyncRunner) + _automation = StateObject(wrappedValue: BackgroundSyncCoordinator(modelContext: container.mainContext, runner: rsyncRunner)) + } catch { + let fallbackConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: true) + do { + let fallback = try ModelContainer(for: schema, configurations: [fallbackConfiguration]) + sharedModelContainer = fallback + startupStorageError = "Rsync Studio could not open its persistent database and is running with temporary in-memory storage for this session. Jobs or history created now will not persist. Original error: \(error.localizedDescription)" + let rsyncRunner = RsyncRunner() + _runner = StateObject(wrappedValue: rsyncRunner) + _automation = StateObject(wrappedValue: BackgroundSyncCoordinator(modelContext: fallback.mainContext, runner: rsyncRunner)) + } catch { + fatalError("Rsync Studio could not initialise persistent or temporary storage: \(error)") + } + } + } + + var body: some Scene { + WindowGroup { + ContentView(startupStorageError: startupStorageError) + .frame(minWidth: 1040, minHeight: 680) + .environmentObject(runner) + .environmentObject(automation) + .onAppear { automation.start() } + } + .modelContainer(sharedModelContainer) + .commands { + RsyncStudioCommands() + } + + Window("Rsync Studio Help", id: "help") { + HelpView() + } + .defaultSize(width: 940, height: 780) + + Settings { + SettingsView() + .environmentObject(automation) + } + } +} + +private struct RsyncStudioCommands: Commands { + @Environment(\.openWindow) private var openWindow + + var body: some Commands { + CommandGroup(replacing: .help) { + Button("Rsync Studio Help") { + openWindow(id: "help") + } + .keyboardShortcut("?", modifiers: [.command]) + } + } +} diff --git a/Rsync Studio/Services/BackgroundSyncCoordinator.swift b/Rsync Studio/Services/BackgroundSyncCoordinator.swift new file mode 100644 index 0000000..0920bdf --- /dev/null +++ b/Rsync Studio/Services/BackgroundSyncCoordinator.swift @@ -0,0 +1,370 @@ +import Foundation +import SwiftData +import Network +@preconcurrency import UserNotifications + +@MainActor +final class BackgroundSyncCoordinator: ObservableObject { + enum Activity: Equatable { + case idle + case waiting(String) + case running(String) + + var title: String { + switch self { + case .idle: return "Idle" + case .waiting(let name): return "Waiting · \(name)" + case .running(let name): return "Running · \(name)" + } + } + } + + @Published private(set) var activity: Activity = .idle + @Published private(set) var watchedJobCount = 0 + @Published private(set) var scheduledJobCount = 0 + @Published private(set) var isSyncAllRunning = false + @Published private(set) var syncAllCompleted = 0 + @Published private(set) var syncAllTotal = 0 + @Published private(set) var syncAllFailed = 0 + @Published private(set) var syncAllSkipped = 0 + @Published private(set) var isNetworkAvailable = true + @Published private(set) var lastError: String? + + var activityDisplayTitle: String { + if isSyncAllRunning { + return "Sync All · \(min(syncAllCompleted + 1, syncAllTotal)) of \(syncAllTotal)" + } + return activity.title + } + + private let modelContext: ModelContext + private let runner: RsyncRunner + private let watcher = FileWatchService() + private var timer: Timer? + private var pending: [(UUID, SyncRunTrigger)] = [] + private var pendingIDs = Set() + private var isProcessingQueue = false + private var watchDebounceTasks: [UUID: Task] = [:] + private var started = false + private var notificationToken: NSObjectProtocol? + private let networkMonitor = NWPathMonitor() + private let networkQueue = DispatchQueue(label: "net.absdev.RsyncStudio.network") + private var currentTrigger: SyncRunTrigger? + + init(modelContext: ModelContext, runner: RsyncRunner) { + self.modelContext = modelContext + self.runner = runner + watcher.onChange = { [weak self] jobID, path in + Task { @MainActor [weak self] in + self?.fileChanged(jobID: jobID, path: path) + } + } + networkMonitor.pathUpdateHandler = { [weak self] path in + Task { @MainActor [weak self] in + self?.isNetworkAvailable = path.status == .satisfied + if path.status == .satisfied { self?.processQueue() } + } + } + networkMonitor.start(queue: networkQueue) + notificationToken = NotificationCenter.default.addObserver( + forName: .syncJobsChanged, + object: nil, + queue: .main + ) { [weak self] _ in + Task { @MainActor [weak self] in self?.refreshConfiguration() } + } + } + + deinit { + networkMonitor.cancel() + if let notificationToken { NotificationCenter.default.removeObserver(notificationToken) } + } + + func start() { + guard !started else { return } + started = true + refreshConfiguration() + pruneHistoryIfNeeded(force: true) + checkSchedules() + timer = Timer.scheduledTimer(withTimeInterval: 20, repeats: true) { [weak self] _ in + Task { @MainActor [weak self] in + self?.refreshConfiguration() + self?.checkSchedules() + self?.processQueue() + } + } + } + + func stop() { + timer?.invalidate() + timer = nil + watcher.stop() + watchDebounceTasks.values.forEach { $0.cancel() } + watchDebounceTasks.removeAll() + started = false + } + + func syncAllEnabledJobs() { + guard !isSyncAllRunning else { return } + + let enabledJobs = fetchJobs().filter(\.isEnabled) + syncAllCompleted = 0 + syncAllTotal = 0 + syncAllFailed = 0 + syncAllSkipped = 0 + + for job in enabledJobs { + if enqueue(jobID: job.id, trigger: .syncAll) { + syncAllTotal += 1 + } + } + + isSyncAllRunning = syncAllTotal > 0 + if !isSyncAllRunning { + syncAllCompleted = 0 + } + } + + func cancelSyncAll() { + guard isSyncAllRunning else { return } + let before = pending.count + pending.removeAll { item in + if item.1 == .syncAll { + pendingIDs.remove(item.0) + return true + } + return false + } + syncAllSkipped += max(0, before - pending.count) + syncAllTotal = max(syncAllCompleted + syncAllFailed + syncAllSkipped, syncAllTotal) + if currentTrigger == .syncAll && runner.isRunning { runner.cancel() } + if currentTrigger != .syncAll { + isSyncAllRunning = false + } + } + + func refreshConfiguration() { + let jobs = fetchJobs() + scheduledJobCount = jobs.filter { $0.isEnabled && $0.scheduleEnabled && $0.scheduleKind != .manual }.count + watchedJobCount = jobs.filter { $0.isEnabled && $0.watchEnabled }.count + + if UserDefaults.standard.object(forKey: "fileWatchingEnabled") as? Bool ?? true { + watcher.update(jobs: jobs) + } else { + watcher.update(jobs: []) + } + + for job in jobs where job.scheduleEnabled && job.scheduleKind != .manual && job.nextRunAt == nil { + job.nextRunAt = job.calculateNextRun(after: Date().addingTimeInterval(-1)) + } + saveContext("refreshing automation configuration") + } + + private func checkSchedules() { + guard UserDefaults.standard.object(forKey: "backgroundSchedulesEnabled") as? Bool ?? true else { return } + let now = Date() + for job in fetchJobs() where job.isEnabled && job.scheduleEnabled && job.scheduleKind != .manual { + guard let next = job.nextRunAt, next <= now else { continue } + enqueue(jobID: job.id, trigger: .scheduled) + + if job.scheduleKind == .once { + job.scheduleEnabled = false + job.nextRunAt = nil + } else { + job.nextRunAt = job.calculateNextRun(after: now) + } + } + saveContext("updating scheduled jobs") + } + + private func fileChanged(jobID: UUID, path: String) { + guard UserDefaults.standard.object(forKey: "fileWatchingEnabled") as? Bool ?? true else { return } + guard let job = fetchJob(id: jobID), job.isEnabled, job.watchEnabled else { return } + job.lastWatchEventAt = Date() + watchDebounceTasks[jobID]?.cancel() + let delay = max(1, job.watchDebounceSeconds) + watchDebounceTasks[jobID] = Task { [weak self] in + try? await Task.sleep(for: .seconds(delay)) + guard !Task.isCancelled, let self else { return } + _ = self.enqueue(jobID: jobID, trigger: .watched) + } + saveContext("recording file-watch activity") + } + + @discardableResult + private func enqueue(jobID: UUID, trigger: SyncRunTrigger) -> Bool { + guard !pendingIDs.contains(jobID), runner.currentJobID != jobID else { return false } + pending.append((jobID, trigger)) + pendingIDs.insert(jobID) + processQueue() + return true + } + + private func processQueue() { + guard !isProcessingQueue, !runner.isRunning, !pending.isEmpty else { + if (isProcessingQueue || runner.isRunning), let first = pending.first, let job = fetchJob(id: first.0) { + activity = .waiting(job.name) + } + return + } + + let item = pending.removeFirst() + pendingIDs.remove(item.0) + guard let job = fetchJob(id: item.0), job.isEnabled else { + if item.1 == .syncAll { syncAllSkipped += 1 } + finishSyncAllItemIfNeeded(item.1, succeeded: false, skipped: true) + processQueue() + return + } + + if job.isRemote && !isNetworkAvailable { + pending.insert(item, at: 0) + pendingIDs.insert(item.0) + activity = .waiting("Network · \(job.name)") + return + } + + isProcessingQueue = true + currentTrigger = item.1 + activity = .running(job.name) + Task { [weak self] in + guard let self else { return } + let succeeded = await self.execute(job: job, trigger: item.1) + self.finishSyncAllItemIfNeeded(item.1, succeeded: succeeded, skipped: false) + self.isProcessingQueue = false + self.currentTrigger = nil + self.activity = .idle + self.processQueue() + } + } + + private func finishSyncAllItemIfNeeded(_ trigger: SyncRunTrigger, succeeded: Bool, skipped: Bool) { + guard trigger == .syncAll else { return } + if skipped { syncAllSkipped += 0 } + else if succeeded { syncAllCompleted += 1 } + else { syncAllFailed += 1 } + if syncAllCompleted + syncAllFailed + syncAllSkipped >= syncAllTotal { + isSyncAllRunning = false + sendNotification(title: "Sync All complete", body: "\(syncAllCompleted) succeeded · \(syncAllFailed) failed · \(syncAllSkipped) skipped") + } + } + + private func execute(job: SyncJob, trigger: SyncRunTrigger) async -> Bool { + let executable = RsyncLocator.locate() + let command = RsyncCommandBuilder.displayCommand(job: job, dryRun: false, executable: executable) + let run = SyncRun(job: job, command: command, wasDryRun: false, trigger: trigger) + modelContext.insert(run) + saveContext("creating run history") + + let automatic = trigger == .scheduled || trigger == .watched + let maxAttempts = automatic ? max(1, job.retryCount + 1) : 1 + var finalSuccess = false + var combinedOutput = "" + var combinedError = "" + + for attempt in 1...maxAttempts { + if attempt > 1 { + let delay = max(1, job.retryDelaySeconds) * (attempt - 1) + combinedError += "\nRetry \(attempt - 1) of \(maxAttempts - 1) after \(delay)s…\n" + try? await Task.sleep(for: .seconds(delay)) + } + do { + let preflight = await runner.preflight(job: job) + guard preflight.passed else { + combinedError += preflight.checks.filter { $0.severity == .error }.map(\.detail).joined(separator: "\n") + break + } + let result = try await runner.run(job: job, dryRun: false, trigger: trigger) + combinedOutput += result.stdout + combinedError += result.stderr + run.exitCode = Int(result.exitCode) + run.wasCancelled = result.wasCancelled + if result.exitCode == 0 { + finalSuccess = true + break + } + if result.wasCancelled { break } + } catch { + combinedError += "\n\(error.localizedDescription)\n" + run.exitCode = -1 + } + } + + run.output = SyncRun.sanitizedLog(combinedOutput) + run.errorOutput = SyncRun.sanitizedLog(combinedError) + run.finishedAt = Date() + job.lastRunAt = run.finishedAt + job.lastExitCode = run.exitCode + job.updatedAt = Date() + saveContext("saving run history") + pruneHistoryIfNeeded() + + if finalSuccess, job.notifyOnSuccess { sendNotification(title: "Sync complete", body: job.name) } + if !finalSuccess, job.notifyOnFailure { sendNotification(title: "Sync failed", body: job.name) } + return finalSuccess + } + + private func sendNotification(title: String, body: String) { + Task { @MainActor in + do { + let center = UNUserNotificationCenter.current() + let granted = try await center.requestAuthorization(options: [.alert, .sound]) + guard granted else { return } + + let content = UNMutableNotificationContent() + content.title = title + content.body = body + content.sound = .default + + let request = UNNotificationRequest( + identifier: UUID().uuidString, + content: content, + trigger: nil + ) + try await center.add(request) + } catch { + lastError = "Could not deliver notification: \(error.localizedDescription)" + } + } + } + + private func pruneHistoryIfNeeded(force: Bool = false) { + let now = Date() + if !force, let last = UserDefaults.standard.object(forKey: "lastHistoryPruneAt") as? Date, now.timeIntervalSince(last) < 3600 { return } + + let configuredDays = UserDefaults.standard.integer(forKey: "historyRetentionDays") + let days = configuredDays == 0 ? 90 : max(7, min(configuredDays, 3650)) + let cutoff = now.addingTimeInterval(-TimeInterval(days) * 86_400) + + do { + let runs = try modelContext.fetch(FetchDescriptor()) + for run in runs where run.finishedAt != nil && run.startedAt < cutoff { + modelContext.delete(run) + } + try modelContext.save() + UserDefaults.standard.set(now, forKey: "lastHistoryPruneAt") + } catch { + lastError = "Could not prune run history: \(error.localizedDescription)" + } + } + + private func saveContext(_ operation: String) { + do { + try modelContext.save() + } catch { + lastError = "Database error while \(operation): \(error.localizedDescription)" + } + } + + private func fetchJobs() -> [SyncJob] { + (try? modelContext.fetch(FetchDescriptor(sortBy: [SortDescriptor(\SyncJob.name)]))) ?? [] + } + + private func fetchJob(id: UUID) -> SyncJob? { + fetchJobs().first { $0.id == id } + } +} + +extension Notification.Name { + static let syncJobsChanged = Notification.Name("RsyncStudio.syncJobsChanged") +} diff --git a/Rsync Studio/Services/FileWatchService.swift b/Rsync Studio/Services/FileWatchService.swift new file mode 100644 index 0000000..99010b1 --- /dev/null +++ b/Rsync Studio/Services/FileWatchService.swift @@ -0,0 +1,94 @@ +import Foundation +import CoreServices + +final class FileWatchService { + typealias ChangeHandler = @Sendable (UUID, String) -> Void + + private struct WatchTarget: Equatable { + let targetPath: String + let streamRoot: String + let isDirectory: Bool + } + + private var stream: FSEventStreamRef? + private var watchedTargets: [UUID: WatchTarget] = [:] + private let queue = DispatchQueue(label: "net.absdev.RsyncStudio.fsevents", qos: .utility) + var onChange: ChangeHandler? + + deinit { stop() } + + func update(jobs: [SyncJob]) { + var targets: [UUID: WatchTarget] = [:] + for job in jobs where job.isEnabled && job.watchEnabled { + let path = (job.effectiveWatchPath as NSString).expandingTildeInPath + guard !path.isEmpty else { continue } + + var isDirectory: ObjCBool = false + let exists = FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) + let directory = exists ? isDirectory.boolValue : true + let streamRoot = directory ? path : (path as NSString).deletingLastPathComponent + targets[job.id] = WatchTarget(targetPath: path, streamRoot: streamRoot, isDirectory: directory) + } + guard targets != watchedTargets else { return } + watchedTargets = targets + rebuild() + } + + func stop() { + if let stream { + FSEventStreamStop(stream) + FSEventStreamInvalidate(stream) + FSEventStreamRelease(stream) + self.stream = nil + } + } + + private func rebuild() { + stop() + let paths = Array(Set(watchedTargets.values.map(\.streamRoot))) + guard !paths.isEmpty else { return } + + var context = FSEventStreamContext( + version: 0, + info: Unmanaged.passUnretained(self).toOpaque(), + retain: nil, + release: nil, + copyDescription: nil + ) + + let callback: FSEventStreamCallback = { _, info, count, eventPaths, _, _ in + guard let info else { return } + let service = Unmanaged.fromOpaque(info).takeUnretainedValue() + let paths = unsafeBitCast(eventPaths, to: NSArray.self) as? [String] ?? [] + for index in 0.. [String] { + var args: [String] = [] + + if job.archive { + args.append("-a") + } else if job.preservePermissions { + args.append("-p") + } + + if job.compress { args.append("-z") } + + if job.preserveExtendedAttributes { + if isAppleRsync(executable) { + if !job.isRemote { args.append("-E") } + } else { + args.append("-X") + } + } + + if job.deleteExtraneous { args.append("--delete") } + if job.showProgress { args.append("--progress") } + if dryRun { args.append("--dry-run") } + + args += ["--human-readable", "--stats"] + + for exclusion in job.exclusions { + args.append("--exclude=\(exclusion)") + } + + if !job.additionalArguments.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + args += shellSplit(job.additionalArguments) + } + + if job.isRemote { + var sshParts = [ + "ssh", + "-o", "BatchMode=yes", + "-o", "ConnectTimeout=15", + "-o", "ServerAliveInterval=30", + "-o", "ServerAliveCountMax=3", + "-p", String(job.remotePort) + ] + let keyPath = normalizedPrivateKeyPath(job.sshKeyPath) + if !keyPath.isEmpty { + sshParts += ["-o", "IdentitiesOnly=yes", "-i", keyPath] + } + args += ["-e", sshParts.map(shellEscape).joined(separator: " ")] + } + + // End option parsing before user-controlled filesystem operands. This prevents + // a local path beginning with '-' from being interpreted as another rsync option. + args.append("--") + args.append(normalizeSource(job.sourcePath)) + args.append(job.destinationDisplay) + return args + } + + static func displayCommand(job: SyncJob, dryRun: Bool, executable: String) -> String { + ([executable] + build(job: job, dryRun: dryRun, executable: executable)) + .map(shellEscape) + .joined(separator: " ") + } + + static func normalizedPrivateKeyPath(_ path: String) -> String { + let trimmed = path.trimmingCharacters(in: .whitespacesAndNewlines) + guard trimmed.hasSuffix(".pub") else { return (trimmed as NSString).expandingTildeInPath } + + let privatePath = String(trimmed.dropLast(4)) + let expandedPrivatePath = (privatePath as NSString).expandingTildeInPath + if FileManager.default.fileExists(atPath: expandedPrivatePath) { + return expandedPrivatePath + } + return (trimmed as NSString).expandingTildeInPath + } + + private static func isAppleRsync(_ executable: String) -> Bool { + executable == "/usr/bin/rsync" + } + + private static func normalizeSource(_ path: String) -> String { path } + + static func shellEscape(_ value: String) -> String { + if value.isEmpty { return "''" } + let allowed = CharacterSet.alphanumerics.union(CharacterSet(charactersIn: "-_./:@%+=,")) + if value.unicodeScalars.allSatisfy({ allowed.contains($0) }) { return value } + return "'" + value.replacingOccurrences(of: "'", with: "'\\''") + "'" + } + + static func shellSplit(_ string: String) -> [String] { + var result: [String] = [] + var current = "" + var quote: Character? + var escaping = false + + for ch in string { + if escaping { + current.append(ch) + escaping = false + continue + } + if ch == "\\" { + escaping = true + continue + } + if let q = quote { + if ch == q { quote = nil } else { current.append(ch) } + continue + } + if ch == "\"" || ch == "'" { + quote = ch + } else if ch.isWhitespace { + if !current.isEmpty { + result.append(current) + current = "" + } + } else { + current.append(ch) + } + } + if !current.isEmpty { result.append(current) } + return result + } +} + +enum RsyncSecurityValidator { + static func validationMessage(for job: SyncJob, trigger: SyncRunTrigger = .manual) -> String? { + let source = job.sourcePath.trimmingCharacters(in: .whitespacesAndNewlines) + let destination = job.destinationPath.trimmingCharacters(in: .whitespacesAndNewlines) + guard !source.isEmpty, !destination.isEmpty else { + return "Source and destination are required." + } + + if containsControlCharacters(source) || containsControlCharacters(destination) { + return "Paths may not contain control characters." + } + + if job.watchEnabled && containsControlCharacters(job.effectiveWatchPath) { + return "The file-watch path may not contain control characters." + } + + if job.exclusions.contains(where: containsControlCharacters) { + return "Exclusion patterns may not contain control characters." + } + + if let advancedError = validateAdditionalArguments(job.additionalArguments) { + return advancedError + } + + if job.isRemote { + let host = job.remoteHost.trimmingCharacters(in: .whitespacesAndNewlines) + let user = job.remoteUser.trimmingCharacters(in: .whitespacesAndNewlines) + guard isValidHost(host) else { + return "The SSH host is invalid. Use a hostname or IP address without spaces or command-line option prefixes." + } + if !user.isEmpty, !isValidUser(user) { + return "The SSH username is invalid. Use letters, numbers, '.', '_' or '-'." + } + guard (1...65535).contains(job.remotePort) else { + return "The SSH port must be between 1 and 65535." + } + if destination.hasPrefix("-") { + return "A remote destination may not begin with '-'." + } + if !isSafeRemotePath(destination) { + return "The remote destination contains characters that are unsafe for an SSH/rsync remote shell. Use a normal path containing letters, numbers, spaces, '/', '.', '_', '-', '~', '+', '@', '%' or '=' only." + } + if destination == host || destination == "\(user)@\(host)" { + return "Remote destination must be a path on the remote machine, not the host address." + } + + let keyPath = RsyncCommandBuilder.normalizedPrivateKeyPath(job.sshKeyPath) + if !job.sshKeyPath.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + if keyPath.hasSuffix(".pub") { + return "Select the private SSH key, not the .pub public key." + } + var isDirectory: ObjCBool = false + guard FileManager.default.fileExists(atPath: keyPath, isDirectory: &isDirectory), !isDirectory.boolValue else { + return "The selected private SSH key does not exist or is not a regular file." + } + } + } else { + if pathsOverlap(source: source, destination: destination) { + return "Source and destination overlap. Choose separate directory trees to prevent recursive copies or file-watch loops." + } + if let volume = SyncVolumeInspector.info(forPath: destination) { + if job.requireExpectedVolume && !job.expectedVolumeIdentifier.isEmpty && volume.identifier != job.expectedVolumeIdentifier { + return "The configured destination volume is not mounted. Rsync Studio will not use a different volume at the same path." + } + if job.minimumFreeSpaceMB > 0 && volume.freeBytes < Int64(job.minimumFreeSpaceMB) * 1_048_576 { + return "The destination does not have the configured minimum free space of \(job.minimumFreeSpaceMB) MB." + } + } else { + return "The destination volume cannot be identified." + } + } + + if job.deleteExtraneous, + (trigger == .scheduled || trigger == .watched), + !job.allowUnattendedDelete { + return "This job uses --delete but unattended destructive sync is not authorised. Edit the job and explicitly enable unattended delete." + } + + return nil + } + + private static func validateAdditionalArguments(_ raw: String) -> String? { + if !hasBalancedShellSyntax(raw) { + return "Advanced rsync arguments contain an unmatched quote or trailing escape character." + } + + let arguments = RsyncCommandBuilder.shellSplit(raw) + let blockedExact: Set = [ + "-e", "-M", "--rsh", "--rsync-path", "--remote-option", + "--password-file", "--daemon", "--config", "--port", "--address", + "--sockopts", "--remove-source-files", "--copy-as", "--files-from", + "--exclude-from", "--include-from", "--log-file", "--log-file-format", + "--backup-dir", "--temp-dir", "--partial-dir", "--chown", "--usermap", + "--groupmap", "--rsync-path", "--write-batch", "--only-write-batch", + "--read-batch" + ] + let blockedPrefixes = [ + "--rsh=", "--rsync-path=", "--remote-option=", "--password-file=", + "--config=", "--port=", "--address=", "--sockopts=", "--copy-as=", + "--delete", "--remove-source-files", "--files-from=", "--exclude-from=", + "--include-from=", "--log-file=", "--log-file-format=", "--backup-dir=", + "--temp-dir=", "--partial-dir=", "--chown=", "--usermap=", "--groupmap=", + "--write-batch=", "--only-write-batch=", "--read-batch=" + ] + + for argument in arguments { + if blockedExact.contains(argument) || blockedPrefixes.contains(where: { argument.hasPrefix($0) }) { + return "Advanced argument '\(argument)' is security-sensitive or destructive and is managed by Rsync Studio. Remove it and use the dedicated job controls instead." + } + if containsControlCharacters(argument) { + return "Advanced rsync arguments may not contain control characters." + } + } + return nil + } + + + private static func isSafeRemotePath(_ value: String) -> Bool { + guard !value.isEmpty, !containsControlCharacters(value) else { return false } + // Rsync invokes the remote side through SSH. Keep remote paths out of shell + // metacharacter territory so a configured path can never become a remote command. + let allowed = CharacterSet.alphanumerics.union(CharacterSet(charactersIn: " /._-~+@%=")) + return value.unicodeScalars.allSatisfy { allowed.contains($0) } + } + + private static func hasBalancedShellSyntax(_ value: String) -> Bool { + var quote: Character? + var escaping = false + for ch in value { + if escaping { + escaping = false + continue + } + if ch == "\\" { + escaping = true + continue + } + if let activeQuote = quote { + if ch == activeQuote { quote = nil } + continue + } + if ch == "\"" || ch == "'" { quote = ch } + } + return quote == nil && !escaping + } + + private static func isValidHost(_ value: String) -> Bool { + guard !value.isEmpty, !value.hasPrefix("-"), !containsControlCharacters(value) else { return false } + let allowed = CharacterSet.alphanumerics.union(CharacterSet(charactersIn: ".-_:[]")) + return value.unicodeScalars.allSatisfy { allowed.contains($0) } + } + + private static func isValidUser(_ value: String) -> Bool { + guard !value.hasPrefix("-"), !containsControlCharacters(value) else { return false } + let allowed = CharacterSet.alphanumerics.union(CharacterSet(charactersIn: "._-")) + return value.unicodeScalars.allSatisfy { allowed.contains($0) } + } + + private static func containsControlCharacters(_ value: String) -> Bool { + value.unicodeScalars.contains { CharacterSet.controlCharacters.contains($0) } + } + + private static func pathsOverlap(source: String, destination: String) -> Bool { + let src = canonicalLocalPath(source) + let dst = canonicalLocalPath(destination) + guard !src.isEmpty, !dst.isEmpty else { return false } + if src == dst { return true } + return dst.hasPrefix(src + "/") || src.hasPrefix(dst + "/") + } + + private static func canonicalLocalPath(_ value: String) -> String { + let expanded = (value as NSString).expandingTildeInPath + let standardized = (expanded as NSString).standardizingPath + if standardized == "/" { return standardized } + return standardized.hasSuffix("/") ? String(standardized.dropLast()) : standardized + } +} diff --git a/Rsync Studio/Services/RsyncLocator.swift b/Rsync Studio/Services/RsyncLocator.swift new file mode 100644 index 0000000..3c5d4a9 --- /dev/null +++ b/Rsync Studio/Services/RsyncLocator.swift @@ -0,0 +1,29 @@ +import Foundation + +enum RsyncLocator { + static let candidates = [ + "/opt/homebrew/bin/rsync", + "/usr/local/bin/rsync", + "/usr/bin/rsync" + ] + + static func locate() -> String { + candidates.first(where: isTrustedExecutableCandidate) ?? "/usr/bin/rsync" + } + + static func isTrustedExecutableCandidate(_ path: String) -> Bool { + let manager = FileManager.default + guard manager.isExecutableFile(atPath: path) else { return false } + + let resolved = URL(fileURLWithPath: path).resolvingSymlinksInPath().path + var isDirectory: ObjCBool = false + guard manager.fileExists(atPath: resolved, isDirectory: &isDirectory), !isDirectory.boolValue else { return false } + + do { + let attributes = try manager.attributesOfItem(atPath: resolved) + return attributes[.type] as? FileAttributeType == .typeRegular + } catch { + return false + } + } +} diff --git a/Rsync Studio/Services/RsyncRunner.swift b/Rsync Studio/Services/RsyncRunner.swift new file mode 100644 index 0000000..7b6d0cb --- /dev/null +++ b/Rsync Studio/Services/RsyncRunner.swift @@ -0,0 +1,260 @@ +import Foundation + + +@MainActor +final class RsyncRunner: ObservableObject { + @Published private(set) var isRunning = false + @Published private(set) var currentJobID: UUID? + + private var process: Process? + + struct Result { + let exitCode: Int32 + let stdout: String + let stderr: String + let wasCancelled: Bool + } + + func run(job: SyncJob, dryRun: Bool, trigger: SyncRunTrigger = .manual) async throws -> Result { + guard !isRunning else { throw RunnerError.alreadyRunning } + if let message = RsyncSecurityValidator.validationMessage(for: job, trigger: trigger) { + throw RunnerError.securityValidation(message) + } + + let executable = RsyncLocator.locate() + guard RsyncLocator.isTrustedExecutableCandidate(executable) else { + throw RunnerError.invalidExecutable(executable) + } + let arguments = RsyncCommandBuilder.build(job: job, dryRun: dryRun, executable: executable) + + isRunning = true + currentJobID = job.id + let activityToken = ProcessInfo.processInfo.beginActivity( + options: [.userInitiated, .idleSystemSleepDisabled], + reason: "Rsync Studio is synchronising \(job.name)" + ) + + defer { + ProcessInfo.processInfo.endActivity(activityToken) + isRunning = false + currentJobID = nil + process = nil + } + + let process = Process() + self.process = process + process.executableURL = URL(fileURLWithPath: executable) + process.arguments = arguments + + let stdoutPipe = Pipe() + let stderrPipe = Pipe() + process.standardOutput = stdoutPipe + process.standardError = stderrPipe + + // Keep rsync's potentially very chatty output off the MainActor. Updating a + // SwiftUI String for every rsync progress chunk makes the whole window jerk. + // These locked buffers collect every byte for history/export without causing + // any UI invalidation while the transfer is running. + let stdoutBuffer = LockedDataBuffer() + let stderrBuffer = LockedDataBuffer() + + stdoutPipe.fileHandleForReading.readabilityHandler = { handle in + let data = handle.availableData + guard !data.isEmpty else { return } + stdoutBuffer.append(data) + } + + stderrPipe.fileHandleForReading.readabilityHandler = { handle in + let data = handle.availableData + guard !data.isEmpty else { return } + stderrBuffer.append(data) + } + + return try await withCheckedThrowingContinuation { continuation in + process.terminationHandler = { proc in + stdoutPipe.fileHandleForReading.readabilityHandler = nil + stderrPipe.fileHandleForReading.readabilityHandler = nil + + // Consume anything left between the final readability callback and EOF. + let remainingOut = stdoutPipe.fileHandleForReading.readDataToEndOfFile() + let remainingErr = stderrPipe.fileHandleForReading.readDataToEndOfFile() + if !remainingOut.isEmpty { stdoutBuffer.append(remainingOut) } + if !remainingErr.isEmpty { stderrBuffer.append(remainingErr) } + + continuation.resume(returning: Result( + exitCode: proc.terminationStatus, + stdout: stdoutBuffer.stringValue, + stderr: stderrBuffer.stringValue, + wasCancelled: proc.terminationReason == .uncaughtSignal + )) + } + + do { + try process.run() + } catch { + stdoutPipe.fileHandleForReading.readabilityHandler = nil + stderrPipe.fileHandleForReading.readabilityHandler = nil + continuation.resume(throwing: error) + } + } + } + + private func remoteDestinationLooksLikeHost(_ job: SyncJob) -> Bool { + let destination = job.destinationPath.trimmingCharacters(in: .whitespacesAndNewlines) + let host = job.remoteHost.trimmingCharacters(in: .whitespacesAndNewlines) + return destination == host || destination == "\(job.remoteUser)@\(host)" + } + + func preflight(job: SyncJob) async -> JobPreflightReport { + var checks: [JobPreflightCheck] = [] + + if let message = RsyncSecurityValidator.validationMessage(for: job, trigger: .manual) { + checks.append(.init(title: "Configuration", detail: message, severity: .error)) + return JobPreflightReport(checks: checks) + } + checks.append(.init(title: "Configuration", detail: "Security and argument validation passed.", severity: .success)) + + let executable = RsyncLocator.locate() + if RsyncLocator.isTrustedExecutableCandidate(executable) { + checks.append(.init(title: "Rsync", detail: executable, severity: .success)) + } else { + checks.append(.init(title: "Rsync", detail: "No trusted rsync executable is available.", severity: .error)) + } + + if job.isRemote { + let ssh = "/usr/bin/ssh" + guard FileManager.default.isExecutableFile(atPath: ssh) else { + checks.append(.init(title: "SSH", detail: "The system SSH client is unavailable.", severity: .error)) + return JobPreflightReport(checks: checks) + } + let userHost = job.remoteUser.isEmpty ? job.remoteHost : "\(job.remoteUser)@\(job.remoteHost)" + var args = ["-o", "BatchMode=yes", "-o", "ConnectTimeout=8", "-o", "ServerAliveInterval=5", "-o", "ServerAliveCountMax=1", "-p", String(job.remotePort)] + let key = RsyncCommandBuilder.normalizedPrivateKeyPath(job.sshKeyPath) + if !key.isEmpty { args += ["-o", "IdentitiesOnly=yes", "-i", key] } + let remotePath = RsyncCommandBuilder.shellEscape(job.destinationPath) + args += [userHost, "command -v rsync >/dev/null 2>&1 && test -d \(remotePath)"] + let result = await Self.runProbe(executable: ssh, arguments: args) + if result == 0 { + checks.append(.init(title: "Remote connection", detail: "SSH authentication, remote rsync and destination directory are available.", severity: .success)) + } else { + checks.append(.init(title: "Remote connection", detail: "Could not authenticate, find remote rsync, or access the destination directory.", severity: .error)) + } + } else { + var isDir: ObjCBool = false + if FileManager.default.fileExists(atPath: (job.sourcePath as NSString).expandingTildeInPath, isDirectory: &isDir) { + checks.append(.init(title: "Source", detail: "Source exists and is reachable.", severity: .success)) + } else { + checks.append(.init(title: "Source", detail: "Source does not exist or is not reachable.", severity: .error)) + } + + let destination = (job.destinationPath as NSString).expandingTildeInPath + let volume = SyncVolumeInspector.info(forPath: destination) + if let volume { + checks.append(.init(title: "Destination volume", detail: "\(volume.name) · \(volume.freeSpaceDescription) free", severity: volume.freeBytes >= Int64(job.minimumFreeSpaceMB) * 1_048_576 ? .success : .error)) + if job.requireExpectedVolume && !job.expectedVolumeIdentifier.isEmpty && volume.identifier != job.expectedVolumeIdentifier { + checks.append(.init(title: "Volume identity", detail: "Expected \(job.expectedVolumeIdentifier), found \(volume.identifier).", severity: .error)) + } else if job.requireExpectedVolume { + checks.append(.init(title: "Volume identity", detail: "Expected destination volume is mounted.", severity: .success)) + } + } else { + checks.append(.init(title: "Destination volume", detail: "Could not identify the destination volume.", severity: .error)) + } + } + return JobPreflightReport(checks: checks) + } + + private static func runProbe(executable: String, arguments: [String]) async -> Int32 { + await withCheckedContinuation { continuation in + let process = Process() + process.executableURL = URL(fileURLWithPath: executable) + process.arguments = arguments + process.standardOutput = FileHandle.nullDevice + process.standardError = FileHandle.nullDevice + process.terminationHandler = { continuation.resume(returning: $0.terminationStatus) } + do { try process.run() } catch { continuation.resume(returning: -1) } + } + } + + func cancel() { + guard let process, process.isRunning else { return } + process.interrupt() + } + + enum RunnerError: LocalizedError { + case alreadyRunning + case securityValidation(String) + case invalidExecutable(String) + + var errorDescription: String? { + switch self { + case .alreadyRunning: + return "Another rsync job is already running." + case .securityValidation(let message): + return message + case .invalidExecutable(let path): + return "The rsync executable at \(path) is unavailable or is not a trusted regular executable file." + } + } + } +} + +private final class LockedDataBuffer: @unchecked Sendable { + private let lock = NSLock() + private var data = Data() + + func append(_ newData: Data) { + lock.lock() + data.append(newData) + lock.unlock() + } + + var stringValue: String { + lock.lock() + let snapshot = data + lock.unlock() + return String(decoding: snapshot, as: UTF8.self) + } +} + + +enum JobPreflightSeverity: Int, Comparable { + case success = 0, warning = 1, error = 2 + static func < (lhs: Self, rhs: Self) -> Bool { lhs.rawValue < rhs.rawValue } +} + +struct JobPreflightCheck: Identifiable { + let id = UUID() + let title: String + let detail: String + let severity: JobPreflightSeverity +} + +struct JobPreflightReport { + let checks: [JobPreflightCheck] + var severity: JobPreflightSeverity { checks.map(\.severity).max() ?? .success } + var passed: Bool { severity != .error } + var title: String { passed ? (severity == .warning ? "Ready with warnings" : "Ready") : "Needs attention" } +} + +struct SyncVolumeInfo { + let identifier: String + let name: String + let freeBytes: Int64 + var freeSpaceDescription: String { ByteCountFormatter.string(fromByteCount: freeBytes, countStyle: .file) } +} + +enum SyncVolumeInspector { + static func info(forPath path: String) -> SyncVolumeInfo? { + var url = URL(fileURLWithPath: path) + while !FileManager.default.fileExists(atPath: url.path), url.path != "/" { url.deleteLastPathComponent() } + do { + let values = try url.resourceValues(forKeys: [.volumeIdentifierKey, .volumeNameKey, .volumeAvailableCapacityForImportantUsageKey]) + guard let rawID = values.volumeIdentifier else { return nil } + return SyncVolumeInfo( + identifier: String(describing: rawID), + name: values.volumeName ?? url.path, + freeBytes: values.volumeAvailableCapacityForImportantUsage ?? 0 + ) + } catch { return nil } + } +} diff --git a/Rsync Studio/SettingsView.swift b/Rsync Studio/SettingsView.swift new file mode 100644 index 0000000..a4fe2c2 --- /dev/null +++ b/Rsync Studio/SettingsView.swift @@ -0,0 +1,304 @@ +import SwiftUI +import ServiceManagement +import SwiftData +import AppKit +import UniformTypeIdentifiers +import CryptoKit + +struct SettingsView: View { + @Environment(\.modelContext) private var modelContext + @Query(sort: \SyncJob.name) private var jobs: [SyncJob] + @Query(sort: \SyncRun.startedAt, order: .reverse) private var runs: [SyncRun] + @EnvironmentObject private var automation: BackgroundSyncCoordinator + @AppStorage("defaultSSHUsername") private var defaultSSHUsername = NSUserName() + @AppStorage("defaultSSHKeyPath") private var defaultSSHKeyPath = "" + @AppStorage("defaultSSHPort") private var defaultSSHPort = 22 + @AppStorage("defaultRemoteHost") private var defaultRemoteHost = "" + @AppStorage("backgroundSchedulesEnabled") private var backgroundSchedulesEnabled = true + @AppStorage("fileWatchingEnabled") private var fileWatchingEnabled = true + @AppStorage("defaultWatchDebounceSeconds") private var defaultWatchDebounceSeconds = 3 + @AppStorage("historyRetentionDays") private var historyRetentionDays = 90 + @State private var launchAtLogin = false + @State private var launchError: String? + @State private var diagnosticsMessage: String? + @State private var updateStatus: String? + @State private var isCheckingUpdates = false + + var body: some View { + TabView { + Form { + Section("Default SSH Connection") { + TextField("Username", text: $defaultSSHUsername, prompt: Text(NSUserName())) + TextField("Default host", text: $defaultRemoteHost, prompt: Text("server.local")) + Stepper("SSH port: \(defaultSSHPort)", value: $defaultSSHPort, in: 1...65535) + + HStack { + TextField("Private SSH key", text: $defaultSSHKeyPath, prompt: Text("~/.ssh/id_ed25519")) + Button("Choose…") { + if let selected = FilePicker.chooseFile() { defaultSSHKeyPath = selected } + } + } + + Label("Authentication uses an SSH private key or your macOS SSH agent. Passwords are intentionally not stored or passed on the command line.", systemImage: "lock.shield") + .font(.caption) + .foregroundStyle(.secondary) + } + + Section("New Jobs") { + Text("New SSH jobs use these values as defaults and can override them independently.") + .font(.caption) + .foregroundStyle(.secondary) + } + } + .formStyle(.grouped) + .tabItem { Label("Connections", systemImage: "network") } + + Form { + Section("Background Scheduling") { + Toggle("Run scheduled jobs", isOn: $backgroundSchedulesEnabled) + Toggle("Launch Rsync Studio at login", isOn: Binding( + get: { launchAtLogin }, + set: { setLaunchAtLogin($0) } + )) + HStack { + Label("Configured jobs", systemImage: "calendar.badge.clock") + Spacer() + Text("\(automation.scheduledJobCount)") + .foregroundStyle(.secondary) + } + Text("Scheduled jobs run without opening a modal and are written to History. Rsync Studio continues processing them while its window is hidden, minimised or closed, provided the application itself remains running.") + .font(.caption) + .foregroundStyle(.secondary) + } + + Section("History & Privacy") { + Stepper("Keep run history for \(historyRetentionDays) days", value: $historyRetentionDays, in: 7...3650, step: 7) + Text("Run output is sanitised, ANSI control sequences are removed, and individual stdout/stderr logs are capped at approximately 2 MB before storage.") + .font(.caption) + .foregroundStyle(.secondary) + } + + Section("File Watching") { + Toggle("Watch enabled jobs for changes", isOn: $fileWatchingEnabled) + Stepper("Default debounce: \(defaultWatchDebounceSeconds) seconds", value: $defaultWatchDebounceSeconds, in: 1...60) + HStack { + Label("Watched jobs", systemImage: "eye.fill") + Spacer() + Text("\(automation.watchedJobCount)") + .foregroundStyle(.secondary) + } + Text("Rsync Studio uses macOS FSEvents, so watched trees do not need to be repeatedly scanned. A short debounce combines rapid saves into a single sync.") + .font(.caption) + .foregroundStyle(.secondary) + } + } + .formStyle(.grouped) + .tabItem { Label("Automation", systemImage: "calendar.badge.clock") } + + Form { + Section("Rsync") { + LabeledContent("Detected executable", value: RsyncLocator.locate()) + LabeledContent("Executable validation", value: RsyncLocator.isTrustedExecutableCandidate(RsyncLocator.locate()) ? "Passed" : "Failed") + Text("Only executable regular-file rsync candidates are accepted. Symlinks are resolved before validation.") + .font(.caption) + .foregroundStyle(.secondary) + } + + Section("Security") { + LabeledContent("SSH mode", value: "Batch / key or agent") + LabeledContent("Host-key verification", value: "System default") + Text("SSH connections use BatchMode, connection timeouts and keepalive limits. Rsync Studio never disables SSH host-key verification.") + .font(.caption) + .foregroundStyle(.secondary) + } + + Section("Application") { + LabeledContent("Bundle identifier", value: Bundle.main.bundleIdentifier ?? "net.absdev.RsyncStudio") + LabeledContent("Version", value: Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "1.0") + LabeledContent("Background service", value: automation.activity.title) + LabeledContent("Network", value: automation.isNetworkAvailable ? "Available" : "Offline") + } + + Section("Support & Updates") { + Button("Export Diagnostics…") { exportDiagnostics() } + Text("Diagnostics contain app/macOS/rsync versions, redacted job configuration and recent failures. Private keys and credentials are never exported.") + .font(.caption) + .foregroundStyle(.secondary) + LabeledContent("Updater", value: "Signed manifest") + Button { + checkForUpdates() + } label: { + if isCheckingUpdates { ProgressView().controlSize(.small) } + else { Label("Check for Updates…", systemImage: "arrow.triangle.2.circlepath") } + } + .disabled(isCheckingUpdates) + Text("The update checker only accepts an HTTPS manifest whose payload verifies against the Ed25519 public key embedded in the signed app. It will not trust or open an unsigned update.") + .font(.caption) + .foregroundStyle(.secondary) + } + } + .formStyle(.grouped) + .tabItem { Label("General", systemImage: "gearshape") } + } + .frame(width: 650, height: 455) + .onAppear { + KeychainStore.delete("defaultSSHPassword") + launchAtLogin = SMAppService.mainApp.status == .enabled + } + .onChange(of: backgroundSchedulesEnabled) { _, _ in automation.refreshConfiguration() } + .onChange(of: fileWatchingEnabled) { _, _ in automation.refreshConfiguration() } + .alert("Launch at Login", isPresented: Binding( + get: { launchError != nil }, + set: { if !$0 { launchError = nil } } + )) { + Button("OK", role: .cancel) { launchError = nil } + } message: { + Text(launchError ?? "Unable to change the login item setting.") + } + .alert("Diagnostics", isPresented: Binding( + get: { diagnosticsMessage != nil }, + set: { if !$0 { diagnosticsMessage = nil } } + )) { + Button("OK", role: .cancel) { diagnosticsMessage = nil } + } message: { + Text(diagnosticsMessage ?? "") + } + .alert("Software Update", isPresented: Binding( + get: { updateStatus != nil }, + set: { if !$0 { updateStatus = nil } } + )) { + Button("OK", role: .cancel) { updateStatus = nil } + } message: { + Text(updateStatus ?? "") + } + } + + private func checkForUpdates() { + isCheckingUpdates = true + Task { + let result = await SecureUpdateChecker.check() + isCheckingUpdates = false + switch result { + case .upToDate(let message): updateStatus = message + case .unavailable(let message): updateStatus = message + case .available(let message, let url): + updateStatus = message + NSWorkspace.shared.open(url) + } + } + } + + private func exportDiagnostics() { + let panel = NSSavePanel() + panel.allowedContentTypes = [.plainText] + panel.nameFieldStringValue = "Rsync Studio-Diagnostics.txt" + guard panel.runModal() == .OK, let url = panel.url else { return } + let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown" + let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "Unknown" + let os = ProcessInfo.processInfo.operatingSystemVersionString + let executable = RsyncLocator.locate() + var lines = [ + "Rsync Studio Diagnostics", + "Generated: \(Date().formatted(.iso8601))", + "Version: \(version) (\(build))", + "macOS: \(os)", + "Rsync: \(executable)", + "Network: \(automation.isNetworkAvailable ? "Available" : "Offline")", + "Jobs: \(jobs.count)", + "Recent runs: \(runs.count)", + "" + ] + for job in jobs { + lines += [ + "JOB: \(job.name)", + " Type: \(job.isRemote ? "SSH" : "Local")", + " Source: \(job.sourcePath)", + " Destination: \(job.isRemote ? "" : job.destinationPath)", + " Host: \(job.isRemote ? job.remoteHost : "-")", + " SSH key: \(job.sshKeyPath.isEmpty ? "Agent/default" : "Configured (path redacted)")", + " Schedule: \(job.scheduleDescription)", + " Watching: \(job.watchEnabled ? "Yes" : "No")", + " Last exit: \(job.lastExitCode.map(String.init) ?? "Never")", + "" + ] + } + let failures = runs.filter { !$0.succeeded && !$0.isRunning }.prefix(20) + if !failures.isEmpty { + lines.append("RECENT FAILURES") + for run in failures { + lines.append(" \(run.startedAt.formatted(.iso8601)) · \(run.jobName) · exit \(run.exitCode.map(String.init) ?? "unknown") · \(SyncRun.sanitizedLog(run.errorOutput).prefix(500))") + } + } + do { + try lines.joined(separator: "\n").write(to: url, atomically: true, encoding: .utf8) + diagnosticsMessage = "Diagnostics exported successfully." + } catch { diagnosticsMessage = "Could not export diagnostics: \(error.localizedDescription)" } + } + + private func setLaunchAtLogin(_ enabled: Bool) { + do { + if enabled { + try SMAppService.mainApp.register() + } else { + try SMAppService.mainApp.unregister() + } + launchAtLogin = SMAppService.mainApp.status == .enabled + } catch { + launchAtLogin = SMAppService.mainApp.status == .enabled + launchError = error.localizedDescription + } + } +} + + +private enum SecureUpdateCheckResult { + case upToDate(String) + case available(String, URL) + case unavailable(String) +} + +private struct SecureUpdateManifest: Codable { + let version: String + let build: Int + let downloadURL: String + let signature: String + + var signedPayload: Data { + Data("\(version)\n\(build)\n\(downloadURL)".utf8) + } +} + +private enum SecureUpdateChecker { + static func check() async -> SecureUpdateCheckResult { + guard let feedString = Bundle.main.object(forInfoDictionaryKey: "RsyncStudioUpdateManifestURL") as? String, + let feedURL = URL(string: feedString), feedURL.scheme == "https", + let keyString = Bundle.main.object(forInfoDictionaryKey: "RsyncStudioUpdatePublicKey") as? String, + !keyString.isEmpty else { + return .unavailable("Signed updates are ready but not configured yet. Add RsyncStudioUpdateManifestURL and RsyncStudioUpdatePublicKey to the Release build after publishing your HTTPS update feed and Ed25519 public key.") + } + do { + let (data, response) = try await URLSession.shared.data(from: feedURL) + guard let http = response as? HTTPURLResponse, (200...299).contains(http.statusCode) else { + return .unavailable("The update server returned an invalid response.") + } + let manifest = try JSONDecoder().decode(SecureUpdateManifest.self, from: data) + guard let signature = Data(base64Encoded: manifest.signature), let keyData = Data(base64Encoded: keyString) else { + return .unavailable("The update manifest or embedded public key is malformed.") + } + let publicKey = try Curve25519.Signing.PublicKey(rawRepresentation: keyData) + guard publicKey.isValidSignature(signature, for: manifest.signedPayload) else { + return .unavailable("The update manifest signature is invalid. No update was opened.") + } + guard let downloadURL = URL(string: manifest.downloadURL), downloadURL.scheme == "https" else { + return .unavailable("The signed update contains an invalid download URL.") + } + let currentBuild = Int(Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as? String ?? "0") ?? 0 + if manifest.build > currentBuild { + return .available("Rsync Studio \(manifest.version) (build \(manifest.build)) is available. The signed download page will now open.", downloadURL) + } + return .upToDate("Rsync Studio is up to date.") + } catch { + return .unavailable("Could not securely check for updates: \(error.localizedDescription)") + } + } +} diff --git a/Rsync Studio/Utilities/FilePicker.swift b/Rsync Studio/Utilities/FilePicker.swift new file mode 100644 index 0000000..4d19593 --- /dev/null +++ b/Rsync Studio/Utilities/FilePicker.swift @@ -0,0 +1,21 @@ +import AppKit + +@MainActor +enum FilePicker { + static func chooseDirectory() -> String? { + let panel = NSOpenPanel() + panel.canChooseDirectories = true + panel.canChooseFiles = false + panel.allowsMultipleSelection = false + panel.canCreateDirectories = true + return panel.runModal() == .OK ? panel.url?.path : nil + } + + static func chooseFile() -> String? { + let panel = NSOpenPanel() + panel.canChooseDirectories = false + panel.canChooseFiles = true + panel.allowsMultipleSelection = false + return panel.runModal() == .OK ? panel.url?.path : nil + } +} diff --git a/Rsync Studio/Utilities/KeychainStore.swift b/Rsync Studio/Utilities/KeychainStore.swift new file mode 100644 index 0000000..c6f62a5 --- /dev/null +++ b/Rsync Studio/Utilities/KeychainStore.swift @@ -0,0 +1,55 @@ +import Foundation +import Security + +enum KeychainStore { + private static let service = "net.absdev.RsyncStudio" + + static func string(for account: String) -> String { + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service, + kSecAttrAccount as String: account, + kSecReturnData as String: true, + kSecMatchLimit as String: kSecMatchLimitOne + ] + var item: CFTypeRef? + guard SecItemCopyMatching(query as CFDictionary, &item) == errSecSuccess, + let data = item as? Data, + let value = String(data: data, encoding: .utf8) else { return "" } + return value + } + + @discardableResult + static func set(_ value: String, for account: String) -> OSStatus { + let base: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service, + kSecAttrAccount as String: account + ] + if value.isEmpty { return delete(account) } + + let data = Data(value.utf8) + let update: [String: Any] = [ + kSecValueData as String: data, + kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked + ] + let updateStatus = SecItemUpdate(base as CFDictionary, update as CFDictionary) + if updateStatus != errSecItemNotFound { return updateStatus } + + var add = base + add[kSecValueData as String] = data + add[kSecAttrAccessible as String] = kSecAttrAccessibleWhenUnlocked + return SecItemAdd(add as CFDictionary, nil) + } + + @discardableResult + static func delete(_ account: String) -> OSStatus { + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service, + kSecAttrAccount as String: account + ] + let status = SecItemDelete(query as CFDictionary) + return status == errSecItemNotFound ? errSecSuccess : status + } +} diff --git a/Rsync Studio/Views/Components/FlowLayout.swift b/Rsync Studio/Views/Components/FlowLayout.swift new file mode 100644 index 0000000..cc6d259 --- /dev/null +++ b/Rsync Studio/Views/Components/FlowLayout.swift @@ -0,0 +1,36 @@ +import SwiftUI + +struct FlowLayout: Layout { + var spacing: CGFloat = 8 + + func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize { + let width = proposal.width ?? .infinity + var x: CGFloat = 0, y: CGFloat = 0, rowHeight: CGFloat = 0 + for view in subviews { + let size = view.sizeThatFits(.unspecified) + if x + size.width > width, x > 0 { + x = 0 + y += rowHeight + spacing + rowHeight = 0 + } + x += size.width + spacing + rowHeight = max(rowHeight, size.height) + } + return CGSize(width: width.isFinite ? width : x, height: y + rowHeight) + } + + func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) { + var x = bounds.minX, y = bounds.minY, rowHeight: CGFloat = 0 + for view in subviews { + let size = view.sizeThatFits(.unspecified) + if x + size.width > bounds.maxX, x > bounds.minX { + x = bounds.minX + y += rowHeight + spacing + rowHeight = 0 + } + view.place(at: CGPoint(x: x, y: y), proposal: ProposedViewSize(size)) + x += size.width + spacing + rowHeight = max(rowHeight, size.height) + } + } +} diff --git a/Rsync Studio/Views/Components/PathField.swift b/Rsync Studio/Views/Components/PathField.swift new file mode 100644 index 0000000..f39100b --- /dev/null +++ b/Rsync Studio/Views/Components/PathField.swift @@ -0,0 +1,22 @@ +import SwiftUI + +struct PathField: View { + let title: String + @Binding var path: String + var canBrowse: Bool = true + + var body: some View { + VStack(alignment: .leading, spacing: 6) { + Text(title).font(.headline) + HStack { + TextField(title, text: $path) + .textFieldStyle(.roundedBorder) + if canBrowse { + Button("Choose…") { + if let selected = FilePicker.chooseDirectory() { path = selected } + } + } + } + } + } +} diff --git a/Rsync Studio/Views/Components/SplashView.swift b/Rsync Studio/Views/Components/SplashView.swift new file mode 100644 index 0000000..dd796f3 --- /dev/null +++ b/Rsync Studio/Views/Components/SplashView.swift @@ -0,0 +1,49 @@ +import SwiftUI + +struct SplashView: View { + @State private var animate = false + + var body: some View { + ZStack { + LinearGradient( + colors: [Color.accentColor.opacity(0.95), Color.accentColor.opacity(0.62), Color(nsColor: .windowBackgroundColor)], + startPoint: .topLeading, + endPoint: .bottomTrailing + ) + .ignoresSafeArea() + + VStack(spacing: 22) { + ZStack { + RoundedRectangle(cornerRadius: 30, style: .continuous) + .fill(.ultraThinMaterial) + .frame(width: 126, height: 126) + .shadow(color: .black.opacity(0.18), radius: 28, y: 14) + + Image(systemName: "arrow.triangle.2.circlepath") + .font(.system(size: 58, weight: .semibold)) + .symbolRenderingMode(.hierarchical) + .foregroundStyle(.white) + .rotationEffect(.degrees(animate ? 360 : 0)) + } + + VStack(spacing: 6) { + Text("Rsync Studio") + .font(.system(size: 32, weight: .bold, design: .rounded)) + Text("Fast, dependable file synchronisation for macOS") + .font(.headline) + .foregroundStyle(.secondary) + } + + ProgressView() + .controlSize(.small) + .padding(.top, 2) + } + .padding(48) + } + .onAppear { + withAnimation(.linear(duration: 1.25).repeatForever(autoreverses: false)) { + animate = true + } + } + } +} diff --git a/Rsync Studio/Views/Components/StatusBadge.swift b/Rsync Studio/Views/Components/StatusBadge.swift new file mode 100644 index 0000000..bd5171e --- /dev/null +++ b/Rsync Studio/Views/Components/StatusBadge.swift @@ -0,0 +1,25 @@ +import SwiftUI + +struct StatusBadge: View { + let run: SyncRun + + var body: some View { + Label(text, systemImage: icon) + .font(.caption.weight(.semibold)) + .padding(.horizontal, 8) + .padding(.vertical, 4) + .background(.quaternary, in: Capsule()) + } + + private var text: String { + if run.isRunning { return "Running" } + if run.wasCancelled { return "Cancelled" } + return run.succeeded ? "Success" : "Failed" + } + + private var icon: String { + if run.isRunning { return "arrow.triangle.2.circlepath" } + if run.wasCancelled { return "stop.circle" } + return run.succeeded ? "checkmark.circle.fill" : "xmark.circle.fill" + } +} diff --git a/Rsync Studio/Views/HelpView.swift b/Rsync Studio/Views/HelpView.swift new file mode 100644 index 0000000..533986b --- /dev/null +++ b/Rsync Studio/Views/HelpView.swift @@ -0,0 +1,220 @@ +import SwiftUI + +struct HelpView: View { + @Environment(\.dismiss) private var dismiss + @State private var blocks: [HelpBlock] = [.paragraph("Loading help…")] + + var body: some View { + VStack(spacing: 0) { + HStack(spacing: 12) { + Image(systemName: "questionmark.circle.fill") + .font(.title2) + .foregroundStyle(Color.accentColor) + + VStack(alignment: .leading, spacing: 1) { + Text("Rsync Studio Help") + .font(.headline) + Text("Instructions, examples and troubleshooting") + .font(.caption) + .foregroundStyle(.secondary) + } + + Spacer() + + Button("Done") { dismiss() } + .keyboardShortcut(.cancelAction) + } + .padding(.horizontal, 18) + .padding(.vertical, 12) + .background(.bar) + + Divider() + + ScrollView { + LazyVStack(alignment: .leading, spacing: 14) { + ForEach(Array(blocks.enumerated()), id: \.offset) { _, block in + blockView(block) + } + } + .textSelection(.enabled) + .frame(maxWidth: 900, alignment: .leading) + .padding(.horizontal, 34) + .padding(.vertical, 28) + .frame(maxWidth: .infinity, alignment: .center) + } + } + .frame(minWidth: 780, idealWidth: 940, minHeight: 640, idealHeight: 780) + .task { loadHelp() } + } + + @ViewBuilder + private func blockView(_ block: HelpBlock) -> some View { + switch block { + case .heading(let level, let text): + Text(text) + .font(headingFont(level)) + .padding(.top, level == 1 ? 4 : 10) + .frame(maxWidth: .infinity, alignment: .leading) + + case .paragraph(let text): + Text(markdown(text)) + .font(.body) + .lineSpacing(4) + .frame(maxWidth: .infinity, alignment: .leading) + + case .bullet(let text): + HStack(alignment: .firstTextBaseline, spacing: 10) { + Text("•") + .font(.body.bold()) + Text(markdown(text)) + .font(.body) + .lineSpacing(3) + } + .padding(.leading, 6) + + case .numbered(let number, let text): + HStack(alignment: .firstTextBaseline, spacing: 10) { + Text("\(number).") + .font(.body.weight(.semibold)) + .frame(width: 28, alignment: .trailing) + Text(markdown(text)) + .font(.body) + .lineSpacing(3) + } + + case .code(let text): + ScrollView(.horizontal) { + Text(text) + .font(.system(.body, design: .monospaced)) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(14) + } + .background(Color(nsColor: .textBackgroundColor).opacity(0.55), in: RoundedRectangle(cornerRadius: 10, style: .continuous)) + .overlay { + RoundedRectangle(cornerRadius: 10, style: .continuous) + .stroke(.quaternary, lineWidth: 1) + } + } + } + + private func headingFont(_ level: Int) -> Font { + switch level { + case 1: return .largeTitle.bold() + case 2: return .title2.bold() + case 3: return .title3.weight(.semibold) + default: return .headline + } + } + + private func markdown(_ text: String) -> AttributedString { + (try? AttributedString( + markdown: text, + options: AttributedString.MarkdownParsingOptions(interpretedSyntax: .inlineOnlyPreservingWhitespace) + )) ?? AttributedString(text) + } + + private func loadHelp() { + guard let url = Bundle.main.url(forResource: "Rsync Studio Help", withExtension: "md"), + let text = try? String(contentsOf: url, encoding: .utf8) else { + blocks = [.heading(1, "Help unavailable"), .paragraph("The bundled help document could not be loaded.")] + return + } + blocks = HelpMarkdownParser.parse(text) + } +} + +private enum HelpBlock { + case heading(Int, String) + case paragraph(String) + case bullet(String) + case numbered(Int, String) + case code(String) +} + +private enum HelpMarkdownParser { + static func parse(_ source: String) -> [HelpBlock] { + var result: [HelpBlock] = [] + var paragraph: [String] = [] + var codeLines: [String] = [] + var insideCode = false + + func flushParagraph() { + guard !paragraph.isEmpty else { return } + result.append(.paragraph(paragraph.joined(separator: " "))) + paragraph.removeAll(keepingCapacity: true) + } + + func flushCode() { + guard !codeLines.isEmpty else { return } + result.append(.code(codeLines.joined(separator: "\n"))) + codeLines.removeAll(keepingCapacity: true) + } + + for rawLine in source.components(separatedBy: .newlines) { + let line = rawLine.trimmingCharacters(in: .whitespaces) + + if line.hasPrefix("```") { + if insideCode { + flushCode() + insideCode = false + } else { + flushParagraph() + insideCode = true + } + continue + } + + if insideCode { + codeLines.append(rawLine) + continue + } + + if line.isEmpty { + flushParagraph() + continue + } + + if let heading = heading(from: line) { + flushParagraph() + result.append(.heading(heading.level, heading.text)) + continue + } + + if line.hasPrefix("- ") || line.hasPrefix("* ") { + flushParagraph() + result.append(.bullet(String(line.dropFirst(2)))) + continue + } + + if let numbered = numberedItem(from: line) { + flushParagraph() + result.append(.numbered(numbered.number, numbered.text)) + continue + } + + paragraph.append(line) + } + + flushParagraph() + flushCode() + return result + } + + private static func heading(from line: String) -> (level: Int, text: String)? { + let hashes = line.prefix { $0 == "#" }.count + guard hashes > 0, hashes <= 6 else { return nil } + let remainder = line.dropFirst(hashes) + guard remainder.first == " " else { return nil } + return (hashes, String(remainder.dropFirst())) + } + + private static func numberedItem(from line: String) -> (number: Int, text: String)? { + guard let dot = line.firstIndex(of: ".") else { return nil } + let numberText = line[.., + buttonTitle: String, + action: @escaping () -> Void + ) -> some View { + HStack(spacing: 12) { + ZStack { + RoundedRectangle(cornerRadius: 8, style: .continuous) + .fill(colour.opacity(0.12)) + Image(systemName: icon) + .foregroundStyle(colour) + } + .frame(width: 34, height: 34) + + VStack(alignment: .leading, spacing: 2) { + Text(title).font(.body.weight(.semibold)) + Text(subtitle) + .font(.caption) + .foregroundStyle(.secondary) + .lineLimit(1) + .truncationMode(.middle) + } + + Spacer(minLength: 12) + + Toggle("", isOn: isOn) + .labelsHidden() + .toggleStyle(.switch) + + Button(buttonTitle, action: action) + .buttonStyle(.bordered) + .controlSize(.small) + .frame(width: 88) + } + .padding(.vertical, 10) + } + + private var watchSubtitle: String { + guard job.watchEnabled else { return "Off" } + let path = job.effectiveWatchPath + return "Watching \(path) · \(job.watchDebounceSeconds)s debounce" + } + + private var optionsSection: some View { + GroupBox("Options") { + FlowLayout(spacing: 8) { + option("Archive", job.archive) + option("Compress", job.compress) + option("Delete", job.deleteExtraneous) + option("Permissions", job.preservePermissions) + option("Extended Attributes", job.preserveExtendedAttributes) + option("Progress", job.showProgress) + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.vertical, 3) + } + } + + private var scheduleBinding: Binding { + Binding( + get: { job.scheduleEnabled }, + set: { enabled in + if enabled && job.deleteExtraneous && !job.allowUnattendedDelete { + errorMessage = "This job uses --delete. Edit the job and explicitly enable unattended delete before turning on scheduling." + return + } + job.scheduleEnabled = enabled + if enabled { + if job.scheduleKind == .manual { job.scheduleKind = .daily } + if job.scheduleStartAt < Date() { job.scheduleStartAt = Date().addingTimeInterval(3600) } + job.nextRunAt = job.calculateNextRun(after: Date().addingTimeInterval(-1)) + } else { + job.nextRunAt = nil + } + persistAutomationChange() + } + ) + } + + private var watchBinding: Binding { + Binding( + get: { job.watchEnabled }, + set: { enabled in + if enabled && job.deleteExtraneous && !job.allowUnattendedDelete { + errorMessage = "This job uses --delete. Edit the job and explicitly enable unattended delete before turning on file watching." + return + } + job.watchEnabled = enabled + if enabled && job.watchPath.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + job.watchPath = job.sourcePath + } + persistAutomationChange() + } + ) + } + + private func openEditor(_ section: JobEditorSection?) { + editorSection = section + showingEditor = true + } + + private func persistAutomationChange() { + job.updatedAt = Date() + do { + try modelContext.save() + NotificationCenter.default.post(name: .syncJobsChanged, object: nil) + } catch { + errorMessage = "Could not save automation settings: \(error.localizedDescription)" + } + } + + @ViewBuilder + private func option(_ name: String, _ enabled: Bool) -> some View { + if enabled { + Label(name, systemImage: "checkmark") + .font(.caption.weight(.medium)) + .padding(.horizontal, 9) + .padding(.vertical, 5) + .background(.quaternary, in: Capsule()) + } + } + + private enum RunPresentation { + case manual + case scheduled + + var showsModal: Bool { + switch self { + case .manual: return true + case .scheduled: return false + } + } + } + + private func launch(dryRun: Bool, presentation: RunPresentation) { + let executable = RsyncLocator.locate() + let command = RsyncCommandBuilder.displayCommand(job: job, dryRun: dryRun, executable: executable) + let run = SyncRun(job: job, command: command, wasDryRun: dryRun, trigger: .manual) + modelContext.insert(run) + do { + try modelContext.save() + } catch { + errorMessage = "Could not create run history: \(error.localizedDescription)" + return + } + + if presentation.showsModal { + presentedRun = run + showingRunSheet = true + } + + Task { + do { + let result = try await runner.run(job: job, dryRun: dryRun, trigger: .manual) + run.output = SyncRun.sanitizedLog(result.stdout) + run.errorOutput = SyncRun.sanitizedLog(result.stderr) + run.exitCode = Int(result.exitCode) + run.wasCancelled = result.wasCancelled + run.finishedAt = Date() + job.lastRunAt = run.finishedAt + job.lastExitCode = Int(result.exitCode) + job.updatedAt = Date() + do { try modelContext.save() } + catch { errorMessage = "Could not save run history: \(error.localizedDescription)" } + } catch { + run.errorOutput = SyncRun.sanitizedLog(error.localizedDescription) + run.exitCode = -1 + run.finishedAt = Date() + job.lastRunAt = run.finishedAt + job.lastExitCode = -1 + do { try modelContext.save() } + catch { errorMessage = "Could not save failed run history: \(error.localizedDescription)" } + + if !presentation.showsModal { + errorMessage = error.localizedDescription + } + } + } + } +} +private struct RunProgressSheet: View { + @Environment(\.dismiss) private var dismiss + @EnvironmentObject private var runner: RsyncRunner + @Bindable var run: SyncRun + let job: SyncJob + @State private var exportError: String? + @State private var showTechnicalDetails = false + @State private var now = Date() + + private var isRunning: Bool { run.finishedAt == nil } + + var body: some View { + VStack(spacing: 0) { + header + Divider() + Group { + if isRunning { runningContent } else { completedContent } + } + } + .frame(width: 680) + .frame(minHeight: 520) + .background(Color(nsColor: .windowBackgroundColor)) + .interactiveDismissDisabled(isRunning) + .task { + while isRunning { + try? await Task.sleep(for: .seconds(1)) + now = Date() + } + } + .alert("Could Not Export Log", isPresented: Binding( + get: { exportError != nil }, + set: { if !$0 { exportError = nil } } + )) { + Button("OK", role: .cancel) { exportError = nil } + } message: { + Text(exportError ?? "Unknown error") + } + } + + private var header: some View { + HStack(spacing: 14) { + ZStack { + RoundedRectangle(cornerRadius: 12, style: .continuous) + .fill(Color.accentColor.opacity(0.12)) + .frame(width: 44, height: 44) + Image(systemName: run.wasDryRun ? "doc.text.magnifyingglass" : "arrow.triangle.2.circlepath") + .font(.system(size: 20, weight: .semibold)) + .foregroundStyle(Color.accentColor) + } + VStack(alignment: .leading, spacing: 3) { + Text(run.wasDryRun ? "Dry Run" : "Synchronisation") + .font(.title2.bold()) + Text(run.jobName) + .foregroundStyle(.secondary) + } + Spacer() + if !isRunning { + Button("Done") { dismiss() } + .buttonStyle(.borderedProminent) + .keyboardShortcut(.defaultAction) + } + } + .padding(22) + .background(.bar) + } + + private var runningContent: some View { + VStack(spacing: 26) { + Spacer(minLength: 26) + + AnimatedSyncIndicator(size: 124, lineWidth: 9) + .padding(.bottom, 2) + + VStack(spacing: 8) { + Text(run.wasDryRun ? "Checking what would change…" : "Synchronising files…") + .font(.title3.bold()) + Text(run.wasDryRun + ? "Rsync is comparing the source and destination. No files will be changed." + : "Rsync is scanning and transferring changed files. Full output is being captured without slowing the interface.") + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + .frame(maxWidth: 500) + } + + connectionCard + + HStack(spacing: 22) { + Label("Elapsed \(elapsedText)", systemImage: "timer") + Label("Log captured", systemImage: "doc.text") + } + .font(.caption.weight(.medium)) + .foregroundStyle(.secondary) + + Spacer() + + HStack { + Text("You can continue using the app while this transfer runs.") + .font(.caption) + .foregroundStyle(.secondary) + Spacer() + if runner.currentJobID == run.jobID { + Button("Cancel", role: .destructive) { runner.cancel() } + .buttonStyle(.bordered) + .controlSize(.large) + } + } + .padding(22) + .background(.bar) + } + } + + private var connectionCard: some View { + HStack(spacing: 16) { + VStack(alignment: .leading, spacing: 5) { + Label("Source", systemImage: "folder.fill") + .font(.caption.weight(.semibold)) + .foregroundStyle(.secondary) + Text(job.sourcePath) + .font(.system(.body, design: .monospaced)) + .lineLimit(2) + .truncationMode(.middle) + } + .frame(maxWidth: .infinity, alignment: .leading) + + Image(systemName: "arrow.right") + .font(.title3.weight(.semibold)) + .foregroundStyle(Color.accentColor) + + VStack(alignment: .leading, spacing: 5) { + Label("Destination", systemImage: job.isRemote ? "server.rack" : "externaldrive.fill") + .font(.caption.weight(.semibold)) + .foregroundStyle(.secondary) + Text(job.destinationDisplay) + .font(.system(.body, design: .monospaced)) + .lineLimit(2) + .truncationMode(.middle) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + .padding(16) + .background(.quaternary.opacity(0.45), in: RoundedRectangle(cornerRadius: 14, style: .continuous)) + .padding(.horizontal, 28) + } + + private var completedContent: some View { + ScrollView { + VStack(alignment: .leading, spacing: 20) { + completionHero + + if run.summary.hasStatistics { + HStack(spacing: 12) { + metricCard(title: run.wasDryRun ? "Would transfer" : "Transferred", value: run.summary.numberOfFilesTransferred ?? "—", icon: "doc.on.doc.fill") + metricCard(title: "Data", value: run.summary.totalTransferredFileSize ?? "—", icon: "arrow.down.circle.fill") + metricCard(title: "Files checked", value: run.summary.numberOfFiles ?? "—", icon: "checklist") + } + + GroupBox("Transfer Summary") { + Grid(alignment: .leading, horizontalSpacing: 34, verticalSpacing: 10) { + summaryRow("Files checked", run.summary.numberOfFiles) + summaryRow(run.wasDryRun ? "Files that would transfer" : "Files transferred", run.summary.numberOfFilesTransferred) + summaryRow("Total source size", run.summary.totalFileSize) + summaryRow(run.wasDryRun ? "Data that would transfer" : "Data transferred", run.summary.totalTransferredFileSize) + summaryRow("Unmatched data", run.summary.unmatchedData) + summaryRow("Matched data", run.summary.matchedData) + summaryRow("File list size", run.summary.fileListSize) + summaryRow("List generation", run.summary.fileListGenerationTime) + summaryRow("List transfer", run.summary.fileListTransferTime) + summaryRow("Sent", run.summary.totalSent) + summaryRow("Received", run.summary.totalReceived) + } + .padding(.vertical, 4) + .frame(maxWidth: .infinity, alignment: .leading) + } + + if run.summary.transferRate != nil || run.summary.totalSizeAndSpeedup != nil { + VStack(alignment: .leading, spacing: 6) { + if let transferRate = run.summary.transferRate { Text(transferRate) } + if let speedup = run.summary.totalSizeAndSpeedup { Text(speedup) } + } + .font(.system(.caption, design: .monospaced)) + .foregroundStyle(.secondary) + .textSelection(.enabled) + } + } + + if !run.succeeded { + DisclosureGroup("Technical Details", isExpanded: $showTechnicalDetails) { + Text(run.errorOutput.isEmpty ? "Rsync exited without additional error output." : run.errorOutput) + .font(.system(.caption, design: .monospaced)) + .textSelection(.enabled) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.top, 8) + } + .padding(14) + .background(Color.orange.opacity(0.08), in: RoundedRectangle(cornerRadius: 12)) + } + + Divider() + + HStack { + Button { exportLog() } label: { + Label("Export Log…", systemImage: "square.and.arrow.up") + } + .controlSize(.large) + + Spacer() + + if let duration = run.duration { + Label(Duration.seconds(duration).formatted(.units(allowed: [.minutes, .seconds], width: .abbreviated)), systemImage: "timer") + .foregroundStyle(.secondary) + } + + Button("Done") { dismiss() } + .buttonStyle(.borderedProminent) + .controlSize(.large) + } + } + .padding(24) + } + } + + private var completionHero: some View { + HStack(spacing: 16) { + Image(systemName: completionIcon) + .font(.system(size: 42, weight: .semibold)) + .foregroundStyle(completionColour) + VStack(alignment: .leading, spacing: 4) { + Text(completionTitle) + .font(.title2.bold()) + Text(completionMessage) + .foregroundStyle(.secondary) + if let exitCode = run.exitCode, !run.succeeded { + Text("Rsync exit code \(exitCode)") + .font(.caption.weight(.semibold)) + .foregroundStyle(.secondary) + } + } + } + .padding(18) + .frame(maxWidth: .infinity, alignment: .leading) + .background(completionColour.opacity(0.09), in: RoundedRectangle(cornerRadius: 16, style: .continuous)) + } + + private func metricCard(title: String, value: String, icon: String) -> some View { + VStack(alignment: .leading, spacing: 8) { + Image(systemName: icon) + .foregroundStyle(Color.accentColor) + Text(value) + .font(.title3.bold()) + .lineLimit(1) + Text(title) + .font(.caption) + .foregroundStyle(.secondary) + } + .padding(14) + .frame(maxWidth: .infinity, alignment: .leading) + .background(.quaternary.opacity(0.45), in: RoundedRectangle(cornerRadius: 13, style: .continuous)) + } + + private var completionIcon: String { + if run.wasCancelled { return "xmark.circle.fill" } + return run.succeeded ? "checkmark.circle.fill" : "exclamationmark.triangle.fill" + } + + private var completionColour: Color { + if run.wasCancelled { return .secondary } + return run.succeeded ? .green : .orange + } + + private var completionTitle: String { + if run.wasCancelled { return "Synchronisation Cancelled" } + if run.succeeded { return run.wasDryRun ? "Dry Run Complete" : "Synchronisation Complete" } + return "Synchronisation Failed" + } + + private var completionMessage: String { + if run.wasCancelled { return "The transfer was stopped before it completed." } + if run.succeeded && run.wasDryRun { return "No files were changed. The summary below shows what a real run would transfer." } + if run.succeeded { return "Your files were synchronised successfully." } + if !run.errorOutput.isEmpty { + return run.errorOutput.components(separatedBy: .newlines).first(where: { !$0.trimmingCharacters(in: .whitespaces).isEmpty }) ?? "Rsync reported an error." + } + return "Rsync could not complete this synchronisation." + } + + private var elapsedText: String { + let interval = max(0, now.timeIntervalSince(run.startedAt)) + return Duration.seconds(interval).formatted(.units(allowed: [.minutes, .seconds], width: .abbreviated)) + } + + @ViewBuilder + private func summaryRow(_ title: String, _ value: String?) -> some View { + if let value { + GridRow { + Text(title).foregroundStyle(.secondary) + Text(value).fontWeight(.medium).textSelection(.enabled) + } + } + } + + private func exportLog() { + let panel = NSSavePanel() + panel.title = "Export Rsync Log" + panel.prompt = "Export" + panel.canCreateDirectories = true + panel.nameFieldStringValue = defaultLogFilename + guard panel.runModal() == .OK, let url = panel.url else { return } + do { try run.exportText.write(to: url, atomically: true, encoding: .utf8) } + catch { exportError = error.localizedDescription } + } + + private var defaultLogFilename: String { + let safeName = run.jobName.replacingOccurrences(of: "/", with: "-").replacingOccurrences(of: ":", with: "-") + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd_HH-mm-ss" + return "\(safeName)-\(formatter.string(from: run.startedAt)).log" + } +} diff --git a/Rsync Studio/Views/Jobs/JobEditorView.swift b/Rsync Studio/Views/Jobs/JobEditorView.swift new file mode 100644 index 0000000..095849d --- /dev/null +++ b/Rsync Studio/Views/Jobs/JobEditorView.swift @@ -0,0 +1,362 @@ +import SwiftUI +import SwiftData + +enum JobEditorSection: Hashable { + case schedule + case fileWatch +} + +struct JobEditorView: View { + @Environment(\.dismiss) private var dismiss + @Environment(\.modelContext) private var modelContext + @AppStorage("defaultSSHUsername") private var defaultSSHUsername = NSUserName() + + let existingJob: SyncJob? + let initialSection: JobEditorSection? + + @State private var name: String + @State private var sourcePath: String + @State private var destinationPath: String + @State private var isRemote: Bool + @State private var remoteHost: String + @State private var remoteUser: String + @State private var remotePort: Int + @State private var sshKeyPath: String + @State private var archive: Bool + @State private var compress: Bool + @State private var deleteExtraneous: Bool + @State private var preservePermissions: Bool + @State private var preserveExtendedAttributes: Bool + @State private var showProgress: Bool + @State private var exclusionsText: String + @State private var additionalArguments: String + @State private var isEnabled: Bool + @State private var scheduleEnabled: Bool + @State private var scheduleKind: SyncScheduleKind + @State private var scheduleStartAt: Date + @State private var scheduleIntervalMinutes: Int + @State private var watchEnabled: Bool + @State private var watchPath: String + @State private var watchDebounceSeconds: Int + @State private var allowUnattendedDelete: Bool + @State private var retryCount: Int + @State private var retryDelaySeconds: Int + @State private var notifyOnFailure: Bool + @State private var notifyOnSuccess: Bool + @State private var requireExpectedVolume: Bool + @State private var expectedVolumeIdentifier: String + @State private var minimumFreeSpaceMB: Int + @State private var validationMessage: String? + + init(job: SyncJob? = nil, initialSection: JobEditorSection? = nil) { + self.existingJob = job + self.initialSection = initialSection + _name = State(initialValue: job?.name ?? "New Sync Job") + _sourcePath = State(initialValue: job?.sourcePath ?? "") + _destinationPath = State(initialValue: job?.destinationPath ?? "") + _isRemote = State(initialValue: job?.isRemote ?? false) + _remoteHost = State(initialValue: job?.remoteHost ?? UserDefaults.standard.string(forKey: "defaultRemoteHost") ?? "") + _remoteUser = State(initialValue: job?.remoteUser ?? UserDefaults.standard.string(forKey: "defaultSSHUsername") ?? NSUserName()) + let savedPort = UserDefaults.standard.integer(forKey: "defaultSSHPort") + _remotePort = State(initialValue: job?.remotePort ?? (savedPort == 0 ? 22 : savedPort)) + _sshKeyPath = State(initialValue: job?.sshKeyPath ?? UserDefaults.standard.string(forKey: "defaultSSHKeyPath") ?? "") + _archive = State(initialValue: job?.archive ?? true) + _compress = State(initialValue: job?.compress ?? false) + _deleteExtraneous = State(initialValue: job?.deleteExtraneous ?? false) + _preservePermissions = State(initialValue: job?.preservePermissions ?? true) + _preserveExtendedAttributes = State(initialValue: job?.preserveExtendedAttributes ?? true) + _showProgress = State(initialValue: job?.showProgress ?? true) + _exclusionsText = State(initialValue: job?.exclusionsText ?? "") + _additionalArguments = State(initialValue: job?.additionalArguments ?? "") + _isEnabled = State(initialValue: job?.isEnabled ?? true) + _scheduleEnabled = State(initialValue: job?.scheduleEnabled ?? false) + _scheduleKind = State(initialValue: job?.scheduleKind ?? .daily) + _scheduleStartAt = State(initialValue: job?.scheduleStartAt ?? Date().addingTimeInterval(3600)) + _scheduleIntervalMinutes = State(initialValue: job?.scheduleIntervalMinutes ?? 30) + _watchEnabled = State(initialValue: job?.watchEnabled ?? false) + _watchPath = State(initialValue: job?.watchPath ?? "") + let defaultDebounce = UserDefaults.standard.integer(forKey: "defaultWatchDebounceSeconds") + _watchDebounceSeconds = State(initialValue: job?.watchDebounceSeconds ?? (defaultDebounce == 0 ? 3 : defaultDebounce)) + _allowUnattendedDelete = State(initialValue: job?.allowUnattendedDelete ?? false) + _retryCount = State(initialValue: job?.retryCount ?? 2) + _retryDelaySeconds = State(initialValue: job?.retryDelaySeconds ?? 10) + _notifyOnFailure = State(initialValue: job?.notifyOnFailure ?? true) + _notifyOnSuccess = State(initialValue: job?.notifyOnSuccess ?? false) + _requireExpectedVolume = State(initialValue: job?.requireExpectedVolume ?? false) + _expectedVolumeIdentifier = State(initialValue: job?.expectedVolumeIdentifier ?? "") + _minimumFreeSpaceMB = State(initialValue: job?.minimumFreeSpaceMB ?? 512) + _validationMessage = State(initialValue: nil) + } + + var body: some View { + NavigationStack { + ScrollViewReader { proxy in + Form { + Section("Job") { + TextField("Name", text: $name) + Toggle("Enabled", isOn: $isEnabled) + } + + Section("Locations") { + PathField(title: "Source", path: $sourcePath) + Picker("Destination type", selection: $isRemote) { + Text("Local / Mounted Volume").tag(false) + Text("SSH / Remote Mac or Server").tag(true) + } + .pickerStyle(.segmented) + + if isRemote { + TextField("Remote path", text: $destinationPath, prompt: Text("/home/mag/backup or ~/backup")) + .textFieldStyle(.roundedBorder) + } else { + PathField(title: "Destination", path: $destinationPath) + } + } + + if !isRemote { + Section("Destination Safety") { + Stepper("Minimum free space: \(minimumFreeSpaceMB) MB", value: $minimumFreeSpaceMB, in: 0...1_048_576, step: 256) + Toggle("Require this exact destination volume", isOn: $requireExpectedVolume) + if requireExpectedVolume { + HStack { + Text(expectedVolumeIdentifier.isEmpty ? "No volume captured" : expectedVolumeIdentifier) + .font(.caption.monospaced()) + .lineLimit(1) + .truncationMode(.middle) + Spacer() + Button("Capture Current Volume") { + let expanded = (destinationPath as NSString).expandingTildeInPath + if FileManager.default.fileExists(atPath: expanded), let info = SyncVolumeInspector.info(forPath: expanded) { + expectedVolumeIdentifier = info.identifier + } else { + validationMessage = "Mount and select the actual destination volume before capturing its identity." + } + } + } + Text("Prevents a missing external drive from being replaced by an unintended local folder with the same path.") + .font(.caption) + .foregroundStyle(.secondary) + } + } + } + + if isRemote { + Section("SSH") { + TextField("Host", text: $remoteHost, prompt: Text("pegasus.local")) + TextField("User", text: $remoteUser, prompt: Text(defaultSSHUsername.isEmpty ? NSUserName() : defaultSSHUsername)) + Stepper("Port: \(remotePort)", value: $remotePort, in: 1...65535) + HStack { + TextField("Private SSH key", text: $sshKeyPath, prompt: Text("~/.ssh/id_ed25519 or ~/.ssh/id_rsa")) + Button("Choose…") { + if let selected = FilePicker.chooseFile() { sshKeyPath = selected } + } + } + if sshKeyPath.hasSuffix(".pub") { + Label("Select the private key, not the .pub public key.", systemImage: "exclamationmark.triangle.fill") + .font(.caption) + .foregroundStyle(.orange) + } + } + } + + Section { + Toggle("Run this job on a schedule", isOn: $scheduleEnabled) + if scheduleEnabled { + Picker("Frequency", selection: $scheduleKind) { + ForEach(SyncScheduleKind.allCases.filter { $0 != .manual }) { kind in + Label(kind.title, systemImage: kind.systemImage).tag(kind) + } + } + + DatePicker( + scheduleKind == .once ? "Run date and time" : "Starting", + selection: $scheduleStartAt, + displayedComponents: scheduleKind == .once ? [.date, .hourAndMinute] : [.date, .hourAndMinute] + ) + + if scheduleKind == .custom { + Stepper("Every \(scheduleIntervalMinutes) minutes", value: $scheduleIntervalMinutes, in: 1...525600) + } + + Label(schedulePreview, systemImage: "calendar.badge.clock") + .font(.caption) + .foregroundStyle(.secondary) + } + } header: { + Text("Schedule") + } footer: { + Text("Scheduled jobs run silently and are recorded in History. They continue while Rsync Studio is running, even when its window is in the background.") + } + .id(JobEditorSection.schedule) + + Section { + Toggle("Watch for file changes", isOn: $watchEnabled) + if watchEnabled { + HStack { + TextField("Watch path", text: $watchPath, prompt: Text(sourcePath.isEmpty ? "Uses the job source" : sourcePath)) + Menu("Choose…") { + Button("Choose Folder…") { + if let selected = FilePicker.chooseDirectory() { watchPath = selected } + } + Button("Choose File…") { + if let selected = FilePicker.chooseFile() { watchPath = selected } + } + } + } + Stepper("Wait \(watchDebounceSeconds) seconds after changes", value: $watchDebounceSeconds, in: 1...60) + Label("Changes are monitored with macOS FSEvents. Bursts of edits are combined into one sync.", systemImage: "waveform.path.ecg") + .font(.caption) + .foregroundStyle(.secondary) + } + } header: { + Text("File Watching") + } footer: { + Text("Leave the watch path empty to watch the source. If the source is a single file, only that file is synced; if it is a folder, the configured folder job runs when anything inside changes.") + } + .id(JobEditorSection.fileWatch) + + Section("Reliability & Notifications") { + Stepper("Automatic retries: \(retryCount)", value: $retryCount, in: 0...10) + Stepper("Initial retry delay: \(retryDelaySeconds) seconds", value: $retryDelaySeconds, in: 1...300) + Text("Retries apply to scheduled and file-watch runs and use an increasing delay between attempts.") + .font(.caption) + .foregroundStyle(.secondary) + Toggle("Notify when a run fails", isOn: $notifyOnFailure) + Toggle("Notify when a run succeeds", isOn: $notifyOnSuccess) + } + + Section("Rsync Options") { + Toggle("Archive mode (-a)", isOn: $archive) + Toggle("Compress during transfer (-z)", isOn: $compress) + Toggle("Delete files missing from source (--delete)", isOn: $deleteExtraneous) + if deleteExtraneous && (scheduleEnabled || watchEnabled) { + Toggle("Allow unattended delete", isOn: $allowUnattendedDelete) + Text("Required before scheduled or file-watch runs may use --delete. Enable only after validating the job with Dry Run.") + .font(.caption) + .foregroundStyle(.orange) + } + Toggle("Preserve permissions", isOn: $preservePermissions) + Toggle("Preserve extended attributes", isOn: $preserveExtendedAttributes) + Toggle("Show transfer progress", isOn: $showProgress) + } + + Section("Exclusions") { + TextEditor(text: $exclusionsText) + .font(.system(.body, design: .monospaced)) + .frame(minHeight: 90) + Text("One exclusion pattern per line.") + .font(.caption) + .foregroundStyle(.secondary) + } + + Section("Advanced") { + TextField("Additional rsync arguments", text: $additionalArguments) + .font(.system(.body, design: .monospaced)) + Text("Transport, password, remote-command and destructive options are blocked here. Use the dedicated controls above for SSH and --delete.") + .font(.caption) + .foregroundStyle(.secondary) + } + } + .formStyle(.grouped) + .navigationTitle(existingJob == nil ? "New Sync Job" : "Edit Sync Job") + .toolbar { + ToolbarItem(placement: .cancellationAction) { + Button("Cancel") { dismiss() } + } + ToolbarItem(placement: .confirmationAction) { + Button("Save") { save() } + .buttonStyle(.borderedProminent) + .keyboardShortcut(.defaultAction) + .disabled(!canSave) + } + } + .task { + guard let initialSection else { return } + try? await Task.sleep(for: .milliseconds(120)) + withAnimation { proxy.scrollTo(initialSection, anchor: .top) } + } + } + } + .alert("Invalid Sync Job", isPresented: Binding( + get: { validationMessage != nil }, + set: { if !$0 { validationMessage = nil } } + )) { + Button("OK", role: .cancel) { validationMessage = nil } + } message: { + Text(validationMessage ?? "The job configuration is invalid.") + } + .frame(width: 690, height: 820) + } + + private var canSave: Bool { + !name.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty && + !sourcePath.isEmpty && + !destinationPath.isEmpty && + (!isRemote || !remoteHost.isEmpty) + } + + private var schedulePreview: String { + let previewJob = SyncJob() + previewJob.scheduleEnabled = scheduleEnabled + previewJob.scheduleKind = scheduleKind + previewJob.scheduleStartAt = scheduleStartAt + previewJob.scheduleIntervalMinutes = scheduleIntervalMinutes + if let next = previewJob.calculateNextRun() { + return "Next run: \(next.formatted(date: .abbreviated, time: .shortened))" + } + return "No future run is currently scheduled." + } + + private func save() { + let job = existingJob ?? SyncJob() + job.name = name.trimmingCharacters(in: .whitespacesAndNewlines) + job.sourcePath = sourcePath + job.destinationPath = destinationPath + job.isRemote = isRemote + job.remoteHost = remoteHost + job.remoteUser = remoteUser + job.remotePort = remotePort + job.sshKeyPath = sshKeyPath + job.archive = archive + job.compress = compress + job.deleteExtraneous = deleteExtraneous + job.preservePermissions = preservePermissions + job.preserveExtendedAttributes = preserveExtendedAttributes + job.showProgress = showProgress + job.exclusionsText = exclusionsText + job.additionalArguments = additionalArguments + job.isEnabled = isEnabled + job.scheduleEnabled = scheduleEnabled + job.scheduleKind = scheduleEnabled ? scheduleKind : .manual + job.scheduleStartAt = scheduleStartAt + job.scheduleIntervalMinutes = scheduleIntervalMinutes + job.nextRunAt = job.calculateNextRun(after: Date().addingTimeInterval(-1)) + job.watchEnabled = watchEnabled + job.watchPath = watchPath + job.watchDebounceSeconds = watchDebounceSeconds + job.allowUnattendedDelete = deleteExtraneous ? allowUnattendedDelete : false + job.retryCount = retryCount + job.retryDelaySeconds = retryDelaySeconds + job.notifyOnFailure = notifyOnFailure + job.notifyOnSuccess = notifyOnSuccess + job.requireExpectedVolume = !isRemote && requireExpectedVolume + job.expectedVolumeIdentifier = !isRemote && requireExpectedVolume ? expectedVolumeIdentifier : "" + job.minimumFreeSpaceMB = minimumFreeSpaceMB + job.updatedAt = Date() + + let validationTrigger: SyncRunTrigger = (job.scheduleEnabled || job.watchEnabled) ? .scheduled : .manual + if let message = RsyncSecurityValidator.validationMessage(for: job, trigger: validationTrigger) { + validationMessage = message + return + } + + do { + if existingJob == nil { modelContext.insert(job) } + try modelContext.save() + NotificationCenter.default.post(name: .syncJobsChanged, object: nil) + dismiss() + } catch { + validationMessage = "Could not save the job: \(error.localizedDescription)" + } + } +} diff --git a/Rsync Studio/Views/Jobs/JobListView.swift b/Rsync Studio/Views/Jobs/JobListView.swift new file mode 100644 index 0000000..f26b695 --- /dev/null +++ b/Rsync Studio/Views/Jobs/JobListView.swift @@ -0,0 +1,523 @@ +import SwiftUI +import SwiftData +import AppKit +import UniformTypeIdentifiers + +struct JobListView: View { + @Environment(\.modelContext) private var modelContext + @EnvironmentObject private var automation: BackgroundSyncCoordinator + @Query(sort: \SyncJob.name) private var jobs: [SyncJob] + @Binding var selection: SyncJob? + @Binding var showingNewJob: Bool + @State private var searchText = "" + @State private var filter: JobFilter = .all + @State private var persistenceError: String? + @State private var transferMessage: String? + + var body: some View { + VStack(spacing: 0) { + dashboardHeader + + Picker("Filter", selection: $filter) { + ForEach(JobFilter.allCases) { item in + Text(item.title).tag(item) + } + } + .pickerStyle(.segmented) + .labelsHidden() + .padding(.horizontal, 14) + .padding(.bottom, 10) + + Divider() + + if filteredJobs.isEmpty { + emptyState + } else { + List(selection: $selection) { + ForEach(filteredJobs) { job in + JobRow(job: job, isRunning: automationActivityMatches(job)) + .tag(job) + .listRowInsets(EdgeInsets(top: 5, leading: 10, bottom: 5, trailing: 10)) + .contextMenu { + Button("Open Job") { selection = job } + Button("Duplicate") { duplicate(job) } + Divider() + Button(job.isEnabled ? "Disable" : "Enable") { + job.isEnabled.toggle() + job.updatedAt = Date() + saveAndRefresh() + } + Button("Delete", role: .destructive) { delete(job) } + } + } + } + .listStyle(.sidebar) + } + } + .alert("Database Error", isPresented: Binding( + get: { persistenceError != nil }, + set: { if !$0 { persistenceError = nil } } + )) { + Button("OK", role: .cancel) { persistenceError = nil } + } message: { + Text(persistenceError ?? "Unable to save job changes.") + } + .alert("Job Configuration", isPresented: Binding( + get: { transferMessage != nil }, + set: { if !$0 { transferMessage = nil } } + )) { + Button("OK", role: .cancel) { transferMessage = nil } + } message: { + Text(transferMessage ?? "") + } + } + + private var dashboardHeader: some View { + VStack(alignment: .leading, spacing: 12) { + HStack { + VStack(alignment: .leading, spacing: 2) { + Text("Jobs") + .font(.headline) + Text("\(jobs.count) configured job\(jobs.count == 1 ? "" : "s")") + .font(.caption) + .foregroundStyle(.secondary) + } + Spacer() + statusPill + + Menu { + Button("Import Jobs…", systemImage: "square.and.arrow.down") { importJobs() } + Button("Export Jobs…", systemImage: "square.and.arrow.up") { exportJobs() } + } label: { + Image(systemName: "ellipsis.circle") + } + .menuStyle(.borderlessButton) + .help("Import or export job configurations") + + Button { + showingNewJob = true + } label: { + Image(systemName: "plus") + } + .buttonStyle(.borderedProminent) + .help("New Sync Job") + } + + HStack(spacing: 8) { + TextField("Search jobs", text: $searchText) + .textFieldStyle(.roundedBorder) + + if automation.isSyncAllRunning { + Button(role: .destructive) { + automation.cancelSyncAll() + } label: { + Label("Cancel All", systemImage: "stop.fill") + } + .buttonStyle(.bordered) + .help("Cancel the current Sync All batch") + } else { + Button { + automation.syncAllEnabledJobs() + } label: { + Label("Sync All", systemImage: "arrow.triangle.2.circlepath") + } + .buttonStyle(.bordered) + .disabled(jobs.allSatisfy { !$0.isEnabled }) + .help("Run every enabled sync job in sequence") + } + } + + HStack(spacing: 9) { + metricCard(value: automation.scheduledJobCount, title: "Scheduled", icon: "calendar.badge.clock", colour: .blue) + metricCard(value: automation.watchedJobCount, title: "Watching", icon: "eye.fill", colour: .purple) + } + + if automation.isSyncAllRunning { + VStack(alignment: .leading, spacing: 6) { + ProgressView(value: Double(automation.syncAllCompleted + automation.syncAllFailed + automation.syncAllSkipped), total: Double(max(1, automation.syncAllTotal))) + HStack { + Text("Sync All · \(automation.syncAllCompleted + automation.syncAllFailed + automation.syncAllSkipped) of \(automation.syncAllTotal)") + Spacer() + Text("✓ \(automation.syncAllCompleted) ! \(automation.syncAllFailed) – \(automation.syncAllSkipped)") + } + .font(.caption2) + .foregroundStyle(.secondary) + } + } + } + .padding(14) + } + + @ViewBuilder + private var statusPill: some View { + if !automation.isNetworkAvailable { + Label("Offline", systemImage: "wifi.slash") + .font(.caption.weight(.semibold)) + .foregroundStyle(.orange) + .padding(.horizontal, 9) + .padding(.vertical, 5) + .background(Color.orange.opacity(0.10), in: Capsule()) + } else if automation.activity == .idle { + Label("Ready", systemImage: "checkmark.circle.fill") + .font(.caption.weight(.semibold)) + .foregroundStyle(.green) + .padding(.horizontal, 9) + .padding(.vertical, 5) + .background(Color.green.opacity(0.10), in: Capsule()) + } else { + Label(automation.activityDisplayTitle, systemImage: "arrow.triangle.2.circlepath") + .font(.caption.weight(.semibold)) + .foregroundStyle(Color.accentColor) + .padding(.horizontal, 9) + .padding(.vertical, 5) + .background(Color.accentColor.opacity(0.10), in: Capsule()) + } + } + + private func metricCard(value: Int, title: String, icon: String, colour: Color) -> some View { + HStack(spacing: 9) { + ZStack { + RoundedRectangle(cornerRadius: 8, style: .continuous) + .fill(colour.opacity(0.11)) + Image(systemName: icon) + .foregroundStyle(colour) + } + .frame(width: 30, height: 30) + + VStack(alignment: .leading, spacing: 0) { + Text("\(value)") + .font(.headline) + Text(title) + .font(.caption2) + .foregroundStyle(.secondary) + } + Spacer(minLength: 0) + } + .padding(9) + .background(Color(nsColor: .controlBackgroundColor), in: RoundedRectangle(cornerRadius: 10, style: .continuous)) + .overlay { + RoundedRectangle(cornerRadius: 10, style: .continuous) + .stroke(Color.secondary.opacity(0.10)) + } + } + + private var emptyState: some View { + ContentUnavailableView( + searchText.isEmpty ? "No Jobs" : "No Matching Jobs", + systemImage: searchText.isEmpty ? "arrow.left.arrow.right.square" : "magnifyingglass", + description: Text(searchText.isEmpty ? "Create a sync job to get started." : "Try a different search or filter.") + ) + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + + private var filteredJobs: [SyncJob] { + jobs.filter { job in + let matchesSearch = searchText.isEmpty || + job.name.localizedCaseInsensitiveContains(searchText) || + job.sourcePath.localizedCaseInsensitiveContains(searchText) || + job.destinationDisplay.localizedCaseInsensitiveContains(searchText) + + let matchesFilter: Bool + switch filter { + case .all: matchesFilter = true + case .scheduled: matchesFilter = job.scheduleEnabled && job.scheduleKind != .manual + case .watching: matchesFilter = job.watchEnabled + case .attention: matchesFilter = job.lastExitCode != nil && job.lastExitCode != 0 + } + return matchesSearch && matchesFilter + } + } + + private func automationActivityMatches(_ job: SyncJob) -> Bool { + if case .running(let name) = automation.activity { return name == job.name } + return false + } + + private func duplicate(_ job: SyncJob) { + let copy = SyncJob(name: job.name + " Copy", sourcePath: job.sourcePath, destinationPath: job.destinationPath) + copy.isRemote = job.isRemote + copy.remoteHost = job.remoteHost + copy.remoteUser = job.remoteUser + copy.remotePort = job.remotePort + copy.sshKeyPath = job.sshKeyPath + copy.archive = job.archive + copy.compress = job.compress + copy.deleteExtraneous = job.deleteExtraneous + copy.preservePermissions = job.preservePermissions + copy.preserveExtendedAttributes = job.preserveExtendedAttributes + copy.showProgress = job.showProgress + copy.exclusionsText = job.exclusionsText + copy.additionalArguments = job.additionalArguments + copy.isEnabled = job.isEnabled + copy.scheduleEnabled = job.scheduleEnabled + copy.scheduleKind = job.scheduleKind + copy.scheduleStartAt = job.scheduleStartAt + copy.scheduleIntervalMinutes = job.scheduleIntervalMinutes + copy.nextRunAt = copy.calculateNextRun(after: Date().addingTimeInterval(-1)) + copy.watchEnabled = job.watchEnabled + copy.watchPath = job.watchPath + copy.watchDebounceSeconds = job.watchDebounceSeconds + copy.allowUnattendedDelete = job.allowUnattendedDelete + copy.retryCount = job.retryCount + copy.retryDelaySeconds = job.retryDelaySeconds + copy.notifyOnFailure = job.notifyOnFailure + copy.notifyOnSuccess = job.notifyOnSuccess + copy.requireExpectedVolume = job.requireExpectedVolume + copy.expectedVolumeIdentifier = job.expectedVolumeIdentifier + copy.minimumFreeSpaceMB = job.minimumFreeSpaceMB + modelContext.insert(copy) + saveAndRefresh() + selection = copy + } + + private func exportJobs() { + let panel = NSSavePanel() + panel.allowedContentTypes = [.json] + panel.nameFieldStringValue = "Rsync Studio-Jobs.json" + guard panel.runModal() == .OK, let url = panel.url else { return } + do { + let document = JobTransferDocument(version: 1, exportedAt: Date(), jobs: jobs.map(JobTransferJob.init)) + let encoder = JSONEncoder() + encoder.outputFormatting = [.prettyPrinted, .sortedKeys] + encoder.dateEncodingStrategy = .iso8601 + try encoder.encode(document).write(to: url, options: .atomic) + transferMessage = "Exported \(jobs.count) job configuration(s). SSH private-key paths are intentionally excluded." + } catch { persistenceError = "Could not export jobs: \(error.localizedDescription)" } + } + + private func importJobs() { + let panel = NSOpenPanel() + panel.allowedContentTypes = [.json] + panel.allowsMultipleSelection = false + guard panel.runModal() == .OK, let url = panel.url else { return } + do { + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .iso8601 + let document = try decoder.decode(JobTransferDocument.self, from: Data(contentsOf: url)) + guard document.version == 1 else { throw JobTransferError.unsupportedVersion } + var count = 0 + for item in document.jobs { + let job = item.makeJob() + modelContext.insert(job) + count += 1 + } + try modelContext.save() + NotificationCenter.default.post(name: .syncJobsChanged, object: nil) + transferMessage = "Imported \(count) job configuration(s). Remote jobs are disabled until you select a private key or confirm SSH-agent access." + } catch { persistenceError = "Could not import jobs: \(error.localizedDescription)" } + } + + private func delete(_ job: SyncJob) { + if selection?.id == job.id { selection = nil } + modelContext.delete(job) + saveAndRefresh() + } + + private func saveAndRefresh() { + do { + try modelContext.save() + NotificationCenter.default.post(name: .syncJobsChanged, object: nil) + } catch { + persistenceError = error.localizedDescription + } + } +} + +private struct JobRow: View { + let job: SyncJob + let isRunning: Bool + + var body: some View { + HStack(alignment: .top, spacing: 12) { + ZStack { + RoundedRectangle(cornerRadius: 10, style: .continuous) + .fill(iconColour.opacity(0.12)) + Image(systemName: job.isRemote ? "server.rack" : "folder.fill") + .font(.system(size: 16, weight: .semibold)) + .foregroundStyle(iconColour) + } + .frame(width: 38, height: 38) + + VStack(alignment: .leading, spacing: 6) { + HStack(spacing: 7) { + Text(job.name) + .font(.body.weight(.semibold)) + .lineLimit(1) + + if isRunning { + AnimatedSyncIndicator(size: 15, lineWidth: 2.2) + } + + Spacer() + statusIcon + } + + pathSummary + + HStack(spacing: 6) { + if job.scheduleEnabled && job.scheduleKind != .manual { + miniBadge(job.scheduleKind.title, icon: "calendar.badge.clock", colour: .blue) + } + if job.watchEnabled { + miniBadge("Watching", icon: "eye.fill", colour: .purple) + } + if !job.isEnabled { + miniBadge("Disabled", icon: "pause.fill", colour: .secondary) + } + } + + Text(timingText) + .font(.caption2) + .foregroundStyle(.tertiary) + .lineLimit(1) + } + } + .padding(10) + .background(Color(nsColor: .controlBackgroundColor), in: RoundedRectangle(cornerRadius: 12, style: .continuous)) + .overlay { + RoundedRectangle(cornerRadius: 12, style: .continuous) + .stroke(Color.secondary.opacity(0.09)) + } + .opacity(job.isEnabled ? 1 : 0.62) + } + + private var pathSummary: some View { + HStack(spacing: 5) { + Text(shortPath(job.sourcePath)) + .lineLimit(1) + .truncationMode(.middle) + Image(systemName: "arrow.right") + .font(.caption2.weight(.semibold)) + .foregroundStyle(.tertiary) + Text(shortPath(job.destinationDisplay)) + .lineLimit(1) + .truncationMode(.middle) + } + .font(.caption) + .foregroundStyle(.secondary) + } + + @ViewBuilder + private var statusIcon: some View { + if isRunning { + Image(systemName: "arrow.triangle.2.circlepath.circle.fill") + .foregroundStyle(Color.accentColor) + } else if job.lastExitCode == 0 { + Image(systemName: "checkmark.circle.fill") + .foregroundStyle(.green) + } else if job.lastExitCode != nil { + Image(systemName: "exclamationmark.triangle.fill") + .foregroundStyle(.orange) + } else { + Image(systemName: "circle.dashed") + .foregroundStyle(.tertiary) + } + } + + private var timingText: String { + if let next = job.nextRunAt, job.scheduleEnabled { + return "Next run \(next.formatted(.relative(presentation: .named)))" + } + if let last = job.lastRunAt { + return "Last run \(last.formatted(.relative(presentation: .named)))" + } + return "Not run yet" + } + + private var iconColour: Color { + if !job.isEnabled { return .secondary } + return job.isRemote ? .indigo : .blue + } + + private func shortPath(_ path: String) -> String { + guard path.count > 42 else { return path } + return "…" + path.suffix(41) + } + + private func miniBadge(_ title: String, icon: String, colour: Color) -> some View { + Label(title, systemImage: icon) + .font(.system(size: 9, weight: .semibold)) + .foregroundStyle(colour) + .padding(.horizontal, 6) + .padding(.vertical, 3) + .background(colour.opacity(0.10), in: Capsule()) + } +} + +private enum JobFilter: String, CaseIterable, Identifiable { + case all, scheduled, watching, attention + + var id: String { rawValue } + + var title: String { + switch self { + case .all: return "All" + case .scheduled: return "Scheduled" + case .watching: return "Watching" + case .attention: return "Issues" + } + } +} + + +private struct JobTransferDocument: Codable { + let version: Int + let exportedAt: Date + let jobs: [JobTransferJob] +} + +private struct JobTransferJob: Codable { + let name, sourcePath, destinationPath: String + let isRemote: Bool + let remoteHost, remoteUser: String + let remotePort: Int + let archive, compress, deleteExtraneous, preservePermissions, preserveExtendedAttributes, showProgress: Bool + let exclusionsText, additionalArguments: String + let isEnabled: Bool + let scheduleEnabled: Bool + let scheduleKindRaw: String + let scheduleStartAt: Date + let scheduleIntervalMinutes: Int + let watchEnabled: Bool + let watchPath: String + let watchDebounceSeconds: Int + let allowUnattendedDelete: Bool + let retryCount, retryDelaySeconds: Int + let notifyOnFailure, notifyOnSuccess: Bool + let requireExpectedVolume: Bool + let expectedVolumeIdentifier: String + let minimumFreeSpaceMB: Int + + init(_ job: SyncJob) { + name = job.name; sourcePath = job.sourcePath; destinationPath = job.destinationPath + isRemote = job.isRemote; remoteHost = job.remoteHost; remoteUser = job.remoteUser; remotePort = job.remotePort + archive = job.archive; compress = job.compress; deleteExtraneous = job.deleteExtraneous + preservePermissions = job.preservePermissions; preserveExtendedAttributes = job.preserveExtendedAttributes; showProgress = job.showProgress + exclusionsText = job.exclusionsText; additionalArguments = job.additionalArguments; isEnabled = job.isEnabled + scheduleEnabled = job.scheduleEnabled; scheduleKindRaw = job.scheduleKindRaw; scheduleStartAt = job.scheduleStartAt; scheduleIntervalMinutes = job.scheduleIntervalMinutes + watchEnabled = job.watchEnabled; watchPath = job.watchPath; watchDebounceSeconds = job.watchDebounceSeconds + allowUnattendedDelete = job.allowUnattendedDelete; retryCount = job.retryCount; retryDelaySeconds = job.retryDelaySeconds + notifyOnFailure = job.notifyOnFailure; notifyOnSuccess = job.notifyOnSuccess + requireExpectedVolume = job.requireExpectedVolume; expectedVolumeIdentifier = job.expectedVolumeIdentifier; minimumFreeSpaceMB = job.minimumFreeSpaceMB + } + + func makeJob() -> SyncJob { + let job = SyncJob(name: name, sourcePath: sourcePath, destinationPath: destinationPath) + job.isRemote = isRemote; job.remoteHost = remoteHost; job.remoteUser = remoteUser; job.remotePort = remotePort; job.sshKeyPath = "" + job.archive = archive; job.compress = compress; job.deleteExtraneous = deleteExtraneous; job.preservePermissions = preservePermissions + job.preserveExtendedAttributes = preserveExtendedAttributes; job.showProgress = showProgress; job.exclusionsText = exclusionsText; job.additionalArguments = additionalArguments + job.isEnabled = isRemote ? false : isEnabled + job.scheduleEnabled = isRemote ? false : scheduleEnabled; job.scheduleKindRaw = scheduleKindRaw; job.scheduleStartAt = scheduleStartAt; job.scheduleIntervalMinutes = scheduleIntervalMinutes + job.nextRunAt = job.scheduleEnabled ? job.calculateNextRun(after: Date().addingTimeInterval(-1)) : nil + job.watchEnabled = isRemote ? false : watchEnabled; job.watchPath = watchPath; job.watchDebounceSeconds = watchDebounceSeconds + job.allowUnattendedDelete = allowUnattendedDelete; job.retryCount = retryCount; job.retryDelaySeconds = retryDelaySeconds + job.notifyOnFailure = notifyOnFailure; job.notifyOnSuccess = notifyOnSuccess; job.requireExpectedVolume = requireExpectedVolume + job.expectedVolumeIdentifier = expectedVolumeIdentifier; job.minimumFreeSpaceMB = minimumFreeSpaceMB + return job + } +} + +private enum JobTransferError: LocalizedError { + case unsupportedVersion + var errorDescription: String? { "This job configuration file uses an unsupported schema version." } +} diff --git a/Rsync Studio/Views/Runs/RunHistoryView.swift b/Rsync Studio/Views/Runs/RunHistoryView.swift new file mode 100644 index 0000000..a3fb1c4 --- /dev/null +++ b/Rsync Studio/Views/Runs/RunHistoryView.swift @@ -0,0 +1,199 @@ +import SwiftUI +import SwiftData +import AppKit +import UniformTypeIdentifiers + +struct RunHistoryView: View { + @Environment(\.modelContext) private var modelContext + @Query(sort: \SyncRun.startedAt, order: .reverse) private var runs: [SyncRun] + @State private var selection: SyncRun? + @State private var persistenceError: String? + @State private var searchText = "" + @State private var filter: HistoryFilter = .all + let onBack: () -> Void + + var body: some View { + HSplitView { + VStack(spacing: 0) { + HStack(spacing: 10) { + VStack(alignment: .leading, spacing: 2) { + Text("Recent Runs") + .font(.headline) + Text("\(runs.count) recorded") + .font(.caption) + .foregroundStyle(.secondary) + } + + Spacer() + + Menu { + Button("Export Selected…") { exportRuns(selection.map { [$0] } ?? []) } + .disabled(selection == nil) + Button("Export All…") { exportRuns(runs) } + .disabled(runs.isEmpty) + } label: { + Image(systemName: "square.and.arrow.up") + } + .menuStyle(.borderlessButton) + .help("Export run logs") + + Button("Clear", role: .destructive) { + runs.forEach(modelContext.delete) + selection = nil + saveHistoryChanges() + } + .buttonStyle(.bordered) + .controlSize(.small) + .disabled(runs.isEmpty) + } + .padding(14) + + VStack(spacing: 8) { + TextField("Search history", text: $searchText) + .textFieldStyle(.roundedBorder) + Picker("History filter", selection: $filter) { + ForEach(HistoryFilter.allCases) { item in Text(item.title).tag(item) } + } + .pickerStyle(.segmented) + .labelsHidden() + } + .padding(.horizontal, 14) + .padding(.bottom, 10) + + Divider() + + if filteredRuns.isEmpty { + ContentUnavailableView( + "No Run History", + systemImage: "clock.arrow.circlepath", + description: Text(runs.isEmpty ? "Completed, failed and background synchronisations will appear here." : "No runs match the current search or filter.") + ) + .frame(maxWidth: .infinity, maxHeight: .infinity) + } else { + List(selection: $selection) { + ForEach(filteredRuns) { run in + HStack(spacing: 11) { + Image(systemName: statusIcon(run)) + .foregroundStyle(statusColour(run)) + + VStack(alignment: .leading, spacing: 4) { + HStack { + Text(run.jobName) + .fontWeight(.semibold) + .lineLimit(1) + Spacer() + StatusBadge(run: run) + } + + Text(run.startedAt, format: .dateTime.day().month(.abbreviated).year().hour().minute()) + .font(.caption) + .foregroundStyle(.secondary) + + HStack(spacing: 6) { + Label(run.trigger.title, systemImage: run.trigger.systemImage) + .font(.caption2.weight(.semibold)) + .foregroundStyle(run.trigger == .watched ? Color.purple : Color.blue) + if run.wasDryRun { + Text("Dry run") + .font(.caption2.weight(.semibold)) + .foregroundStyle(.blue) + } + } + } + } + .padding(.vertical, 3) + .tag(run) + .contextMenu { + Button("Delete Log", role: .destructive) { + if selection?.id == run.id { selection = nil } + modelContext.delete(run) + saveHistoryChanges() + } + } + } + } + .listStyle(.sidebar) + } + } + .frame(minWidth: 300, idealWidth: 340, maxWidth: 390) + + Group { + if let selection { + RunLogView(run: selection) + } else { + ContentUnavailableView( + "Select a Run", + systemImage: "clock.arrow.circlepath", + description: Text("Select a completed or failed run to inspect its summary and full log.") + ) + } + } + .frame(minWidth: 620, maxWidth: .infinity, maxHeight: .infinity) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .alert("Database Error", isPresented: Binding( + get: { persistenceError != nil }, + set: { if !$0 { persistenceError = nil } } + )) { + Button("OK", role: .cancel) { persistenceError = nil } + } message: { + Text(persistenceError ?? "Unable to update run history.") + } + } + + private var filteredRuns: [SyncRun] { + runs.filter { run in + let matchesSearch = searchText.isEmpty || run.jobName.localizedCaseInsensitiveContains(searchText) || run.output.localizedCaseInsensitiveContains(searchText) || run.errorOutput.localizedCaseInsensitiveContains(searchText) + let matchesFilter: Bool + switch filter { + case .all: matchesFilter = true + case .failed: matchesFilter = !run.isRunning && !run.succeeded && !run.wasCancelled + case .successful: matchesFilter = run.succeeded + case .automatic: matchesFilter = run.trigger == .scheduled || run.trigger == .watched + } + return matchesSearch && matchesFilter + } + } + + private func exportRuns(_ items: [SyncRun]) { + guard !items.isEmpty else { return } + let panel = NSSavePanel() + panel.allowedContentTypes = [.plainText] + panel.nameFieldStringValue = items.count == 1 ? "Rsync Studio-\(items[0].jobName)-Run.txt" : "Rsync Studio-History.txt" + guard panel.runModal() == .OK, let url = panel.url else { return } + let text = items.map(\.exportText).joined(separator: "\n\n" + String(repeating: "=", count: 72) + "\n\n") + do { try text.write(to: url, atomically: true, encoding: .utf8) } + catch { persistenceError = "Could not export history: \(error.localizedDescription)" } + } + + private func saveHistoryChanges() { + do { try modelContext.save() } + catch { persistenceError = error.localizedDescription } + } + + private func statusIcon(_ run: SyncRun) -> String { + if run.isRunning { return "arrow.triangle.2.circlepath" } + if run.wasCancelled { return "xmark.circle.fill" } + return run.succeeded ? "checkmark.circle.fill" : "exclamationmark.triangle.fill" + } + + private func statusColour(_ run: SyncRun) -> Color { + if run.isRunning { return .blue } + if run.wasCancelled { return .secondary } + return run.succeeded ? .green : .orange + } +} + + +private enum HistoryFilter: String, CaseIterable, Identifiable { + case all, failed, successful, automatic + var id: String { rawValue } + var title: String { + switch self { + case .all: return "All" + case .failed: return "Failed" + case .successful: return "Success" + case .automatic: return "Automatic" + } + } +} diff --git a/Rsync Studio/Views/Runs/RunLogView.swift b/Rsync Studio/Views/Runs/RunLogView.swift new file mode 100644 index 0000000..5d80a95 --- /dev/null +++ b/Rsync Studio/Views/Runs/RunLogView.swift @@ -0,0 +1,47 @@ +import SwiftUI + +struct RunLogView: View { + let run: SyncRun + + var body: some View { + ScrollView { + VStack(alignment: .leading, spacing: 20) { + HStack { + VStack(alignment: .leading) { + Text(run.jobName).font(.title.bold()) + Text(run.startedAt.formatted(date: .abbreviated, time: .standard)) + .foregroundStyle(.secondary) + } + Spacer() + StatusBadge(run: run) + } + + if let duration = run.duration { + LabeledContent("Duration", value: Duration.seconds(duration).formatted(.units(allowed: [.minutes, .seconds], width: .abbreviated))) + } + if let exitCode = run.exitCode { + LabeledContent("Exit code", value: String(exitCode)) + } + LabeledContent("Mode", value: run.wasDryRun ? "Dry Run" : "Live Run") + + console(title: "Command", text: run.command) + if !run.output.isEmpty { console(title: "Output", text: run.output) } + if !run.errorOutput.isEmpty { console(title: "Errors", text: run.errorOutput) } + } + .padding(28) + } + .navigationTitle("Run Log") + } + + private func console(title: String, text: String) -> some View { + GroupBox(title) { + ScrollView(.horizontal) { + Text(text) + .font(.system(.caption, design: .monospaced)) + .textSelection(.enabled) + .frame(maxWidth: .infinity, alignment: .leading) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + } +} diff --git a/Rsync Studio/Views/ScheduleCalendarView.swift b/Rsync Studio/Views/ScheduleCalendarView.swift new file mode 100644 index 0000000..3b2ffa5 --- /dev/null +++ b/Rsync Studio/Views/ScheduleCalendarView.swift @@ -0,0 +1,220 @@ +import SwiftUI +import SwiftData + +struct ScheduleCalendarView: View { + @Query(sort: \SyncJob.name) private var jobs: [SyncJob] + @State private var displayedMonth = Calendar.current.date(from: Calendar.current.dateComponents([.year, .month], from: Date())) ?? Date() + @State private var selectedDay = Date() + @State private var editingJob: SyncJob? + + private let calendar = Calendar.current + private let columns = Array(repeating: GridItem(.flexible(), spacing: 6), count: 7) + + var body: some View { + HStack(spacing: 0) { + VStack(spacing: 0) { + monthHeader + Divider() + calendarGrid + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + + Divider() + + agenda + .frame(width: 320) + .background(.bar) + } + .sheet(item: $editingJob) { job in + JobEditorView(job: job) + } + } + + private var monthHeader: some View { + HStack { + Button { moveMonth(-1) } label: { Image(systemName: "chevron.left") } + .buttonStyle(.bordered) + VStack(alignment: .leading, spacing: 2) { + Text(displayedMonth.formatted(.dateTime.month(.wide).year())) + .font(.title2.bold()) + Text("\(monthOccurrences.count) scheduled runs") + .font(.caption) + .foregroundStyle(.secondary) + } + Spacer() + Button("Today") { + displayedMonth = calendar.date(from: calendar.dateComponents([.year, .month], from: Date())) ?? Date() + selectedDay = Date() + } + .buttonStyle(.borderedProminent) + Button { moveMonth(1) } label: { Image(systemName: "chevron.right") } + .buttonStyle(.bordered) + } + .padding(18) + } + + private var calendarGrid: some View { + VStack(spacing: 8) { + LazyVGrid(columns: columns, spacing: 6) { + ForEach(calendar.shortWeekdaySymbols, id: \.self) { symbol in + Text(symbol.uppercased()) + .font(.caption2.weight(.bold)) + .foregroundStyle(.secondary) + .frame(maxWidth: .infinity) + } + + ForEach(monthCells.indices, id: \.self) { index in + if let date = monthCells[index] { + dayCell(date) + } else { + Color.clear.frame(minHeight: 86) + } + } + } + } + .padding(16) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + } + + private func dayCell(_ date: Date) -> some View { + let occurrences = occurrences(on: date) + let selected = calendar.isDate(date, inSameDayAs: selectedDay) + let today = calendar.isDateInToday(date) + + return Button { + selectedDay = date + } label: { + VStack(alignment: .leading, spacing: 6) { + HStack { + Text("\(calendar.component(.day, from: date))") + .font(.body.weight(today ? .bold : .medium)) + .foregroundStyle(today ? Color.accentColor : .primary) + Spacer() + if !occurrences.isEmpty { + Text("\(occurrences.count)") + .font(.caption2.bold()) + .padding(.horizontal, 6) + .padding(.vertical, 2) + .background(Color.accentColor.opacity(0.14), in: Capsule()) + } + } + + ForEach(Array(occurrences.prefix(2)), id: \.id) { item in + HStack(spacing: 4) { + Circle().fill(Color.accentColor).frame(width: 5, height: 5) + Text(item.job.name) + .font(.caption2) + .lineLimit(1) + Spacer() + Text(item.date.formatted(date: .omitted, time: .shortened)) + .font(.caption2) + .foregroundStyle(.secondary) + } + } + Spacer(minLength: 0) + } + .padding(9) + .frame(maxWidth: .infinity, minHeight: 86, alignment: .topLeading) + .background(selected ? Color.accentColor.opacity(0.10) : Color(nsColor: .controlBackgroundColor), in: RoundedRectangle(cornerRadius: 10, style: .continuous)) + .overlay(RoundedRectangle(cornerRadius: 10, style: .continuous).stroke(selected ? Color.accentColor.opacity(0.6) : Color.secondary.opacity(0.12))) + } + .buttonStyle(.plain) + } + + private var agenda: some View { + VStack(alignment: .leading, spacing: 16) { + VStack(alignment: .leading, spacing: 3) { + Text("Agenda").font(.title3.bold()) + Text(selectedDay.formatted(date: .complete, time: .omitted)) + .font(.caption) + .foregroundStyle(.secondary) + } + + let items = occurrences(on: selectedDay) + if items.isEmpty { + ContentUnavailableView( + "No Scheduled Runs", + systemImage: "calendar", + description: Text("Select another day or add a schedule to a sync job.") + ) + } else { + ScrollView { + LazyVStack(spacing: 10) { + ForEach(items, id: \.id) { item in + VStack(alignment: .leading, spacing: 6) { + HStack { + Image(systemName: item.job.isRemote ? "server.rack" : "folder.fill") + .foregroundStyle(Color.accentColor) + Text(item.job.name).fontWeight(.semibold) + Spacer() + } + Label(item.date.formatted(date: .omitted, time: .shortened), systemImage: "clock") + .font(.caption) + .foregroundStyle(.secondary) + Text(item.job.destinationDisplay) + .font(.caption2) + .foregroundStyle(.secondary) + .lineLimit(2) + HStack { + Spacer() + Button("Edit Schedule") { editingJob = item.job } + .buttonStyle(.bordered) + .controlSize(.small) + } + } + .padding(12) + .frame(maxWidth: .infinity, alignment: .leading) + .background(.background, in: RoundedRectangle(cornerRadius: 12, style: .continuous)) + } + } + } + } + Spacer() + } + .padding(18) + } + + private var monthInterval: DateInterval { + calendar.dateInterval(of: .month, for: displayedMonth) ?? DateInterval(start: displayedMonth, duration: 2_592_000) + } + + private var monthCells: [Date?] { + let interval = monthInterval + let days = calendar.range(of: .day, in: .month, for: interval.start) ?? 1..<2 + let weekday = calendar.component(.weekday, from: interval.start) + let leading = (weekday - calendar.firstWeekday + 7) % 7 + var cells = Array(repeating: nil, count: leading) + for day in days { + if let date = calendar.date(byAdding: .day, value: day - 1, to: interval.start) { cells.append(date) } + } + while cells.count % 7 != 0 { cells.append(nil) } + return cells + } + + private var monthOccurrences: [CalendarOccurrence] { + scheduledJobs.flatMap { job in + job.occurrences(from: monthInterval.start, through: monthInterval.end).map { CalendarOccurrence(job: job, date: $0) } + }.sorted { $0.date < $1.date } + } + + private var scheduledJobs: [SyncJob] { + jobs.filter { $0.isEnabled && $0.scheduleEnabled && $0.scheduleKind != .manual } + } + + private func occurrences(on day: Date) -> [CalendarOccurrence] { + monthOccurrences.filter { calendar.isDate($0.date, inSameDayAs: day) } + } + + private func moveMonth(_ offset: Int) { + if let next = calendar.date(byAdding: .month, value: offset, to: displayedMonth) { + displayedMonth = next + selectedDay = next + } + } +} + +private struct CalendarOccurrence: Identifiable { + let job: SyncJob + let date: Date + var id: String { "\(job.id.uuidString)-\(date.timeIntervalSince1970)" } +} diff --git a/Scripts/release-preflight.sh b/Scripts/release-preflight.sh new file mode 100755 index 0000000..93d4105 --- /dev/null +++ b/Scripts/release-preflight.sh @@ -0,0 +1,37 @@ +#!/bin/bash +set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +PROJECT="$ROOT/Rsync Studio.xcodeproj" +SCHEME="Rsync Studio" + +if [[ "$(uname -s)" != "Darwin" ]]; then + echo "release-preflight.sh must run on macOS with Xcode installed." >&2 + exit 2 +fi + +for tool in xcodebuild plutil codesign spctl; do + command -v "$tool" >/dev/null || { echo "Missing required tool: $tool" >&2; exit 2; } +done + +"$SCRIPT_DIR/verify-release-config.sh" +"$SCRIPT_DIR/security-check.sh" +plutil -lint "$ROOT/Rsync Studio/Resources/PrivacyInfo.xcprivacy" + +BUILD_DIR="$ROOT/build/preflight" +rm -rf "$BUILD_DIR" + +xcodebuild \ + -project "$PROJECT" \ + -scheme "$SCHEME" \ + -configuration Release \ + -destination 'platform=macOS' \ + -derivedDataPath "$BUILD_DIR" \ + CODE_SIGNING_ALLOWED=NO \ + clean build + +APP="$BUILD_DIR/Build/Products/Release/Rsync Studio.app" +test -d "$APP" || { echo "Release app was not produced at $APP" >&2; exit 1; } + +echo "Unsigned Release build passed: $APP" +echo "Next: Archive with Developer ID, notarise, staple, then run the signed-app checks in Docs/RELEASE.md." diff --git a/Scripts/release.sh b/Scripts/release.sh new file mode 100755 index 0000000..327c28f --- /dev/null +++ b/Scripts/release.sh @@ -0,0 +1,206 @@ +#!/bin/bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +PROJECT="$ROOT/Rsync Studio.xcodeproj" +SCHEME="Rsync Studio" +CONFIGURATION="Release" +PRODUCT_NAME="Rsync Studio" +DISPLAY_NAME="Rsync Studio" +BUNDLE_ID="net.absdev.RsyncStudio" +NOTARY_PROFILE="${NOTARY_PROFILE:-Rsync Studio Notary}" +RELEASE_ROOT="${RELEASE_ROOT:-$ROOT/build/releases}" +SKIP_PREFLIGHT=0 +SKIP_NOTARIZATION=0 + +usage() { + cat <&2; exit 2; }; NOTARY_PROFILE="$2"; shift 2 ;; + --output) [[ $# -ge 2 ]] || { echo "Missing value for $1" >&2; exit 2; }; RELEASE_ROOT="$2"; shift 2 ;; + --skip-preflight) SKIP_PREFLIGHT=1; shift ;; + --skip-notarization) SKIP_NOTARIZATION=1; shift ;; + -h|--help) usage; exit 0 ;; + *) echo "Unknown option: $1" >&2; usage >&2; exit 2 ;; + esac +done + +[[ "$(uname -s)" == "Darwin" ]] || { echo "ERROR: release.sh must run on macOS." >&2; exit 2; } +for tool in xcodebuild xcrun hdiutil codesign spctl plutil shasum ditto; do + command -v "$tool" >/dev/null || { echo "ERROR: Missing required tool: $tool" >&2; exit 2; } +done + +PBX="$PROJECT/project.pbxproj" +VERSION="$(awk -F' = ' '/MARKETING_VERSION = / {gsub(/;/,"",$2); print $2; exit}' "$PBX")" +BUILD="$(awk -F' = ' '/CURRENT_PROJECT_VERSION = / {gsub(/;/,"",$2); print $2; exit}' "$PBX")" +[[ -n "$VERSION" && -n "$BUILD" ]] || { echo "ERROR: Could not determine version/build from Xcode project." >&2; exit 1; } + +RELEASE_DIR="$RELEASE_ROOT/$VERSION-$BUILD" +ARCHIVE="$RELEASE_DIR/$PRODUCT_NAME.xcarchive" +EXPORT_DIR="$RELEASE_DIR/export" +DMG_STAGING="$RELEASE_DIR/dmg-root" +DMG="$RELEASE_DIR/$PRODUCT_NAME-$VERSION.dmg" +CHECKSUM="$DMG.sha256" +METADATA="$RELEASE_DIR/release-info.txt" +EXPORT_OPTIONS="$RELEASE_DIR/ExportOptions.plist" + +if [[ -e "$RELEASE_DIR" ]]; then + echo "ERROR: Release directory already exists: $RELEASE_DIR" >&2 + echo "Refusing to overwrite an existing version/build artifact." >&2 + exit 1 +fi +mkdir -p "$RELEASE_DIR" + +cleanup() { + rm -rf "$DMG_STAGING" +} +trap cleanup EXIT + +if [[ "$SKIP_PREFLIGHT" -eq 0 ]]; then + "$SCRIPT_DIR/release-preflight.sh" +fi + +cat > "$EXPORT_OPTIONS" < + + + + method + developer-id + signingStyle + automatic + stripSwiftSymbols + + + +PLIST +plutil -lint "$EXPORT_OPTIONS" >/dev/null + +XCODE_SIGN_ARGS=() +if [[ -n "${DEVELOPMENT_TEAM:-}" ]]; then + XCODE_SIGN_ARGS+=("DEVELOPMENT_TEAM=$DEVELOPMENT_TEAM") +fi + +echo "== Archive $DISPLAY_NAME $VERSION ($BUILD) ==" +xcodebuild \ + -project "$PROJECT" \ + -scheme "$SCHEME" \ + -configuration "$CONFIGURATION" \ + -destination 'generic/platform=macOS' \ + -archivePath "$ARCHIVE" \ + clean archive \ + "${XCODE_SIGN_ARGS[@]}" + +echo "== Export Developer ID app ==" +xcodebuild \ + -exportArchive \ + -archivePath "$ARCHIVE" \ + -exportPath "$EXPORT_DIR" \ + -exportOptionsPlist "$EXPORT_OPTIONS" \ + -allowProvisioningUpdates + +APP="$EXPORT_DIR/$PRODUCT_NAME.app" +[[ -d "$APP" ]] || { echo "ERROR: Exported app not found: $APP" >&2; exit 1; } + +ACTUAL_BUNDLE_ID="$(plutil -extract CFBundleIdentifier raw -o - "$APP/Contents/Info.plist" 2>/dev/null || true)" +[[ "$ACTUAL_BUNDLE_ID" == "$BUNDLE_ID" ]] || { echo "ERROR: Exported bundle id is '$ACTUAL_BUNDLE_ID', expected '$BUNDLE_ID'." >&2; exit 1; } +"$SCRIPT_DIR/verify-signed-app.sh" "$APP" + +if [[ "$SKIP_NOTARIZATION" -eq 0 ]]; then + echo "== Validate notarization credentials ==" + xcrun notarytool history --keychain-profile "$NOTARY_PROFILE" >/dev/null + + echo "== Notarize exported app ==" + APP_ZIP="$RELEASE_DIR/$PRODUCT_NAME-$VERSION-notary.zip" + ditto -c -k --keepParent "$APP" "$APP_ZIP" + xcrun notarytool submit "$APP_ZIP" --keychain-profile "$NOTARY_PROFILE" --wait + xcrun stapler staple "$APP" + xcrun stapler validate "$APP" + rm -f "$APP_ZIP" + "$SCRIPT_DIR/verify-signed-app.sh" "$APP" +fi + +echo "== Create drag-to-Applications DMG ==" +mkdir -p "$DMG_STAGING" +ditto "$APP" "$DMG_STAGING/$PRODUCT_NAME.app" +ln -s /Applications "$DMG_STAGING/Applications" +cat > "$DMG_STAGING/README.txt" </dev/null + +hdiutil verify "$DMG" >/dev/null + +if [[ "$SKIP_NOTARIZATION" -eq 0 ]]; then + echo "== Notarize final DMG ==" + xcrun notarytool submit "$DMG" --keychain-profile "$NOTARY_PROFILE" --wait + xcrun stapler staple "$DMG" + xcrun stapler validate "$DMG" + + echo "== Final Gatekeeper verification ==" + "$SCRIPT_DIR/verify-signed-app.sh" "$APP" + spctl --assess --type open --context context:primary-signature --verbose=4 "$DMG" +else + echo "WARNING: Notarization was skipped. This output is NOT ready for public distribution." >&2 +fi + +printf '%s %s\n' "$(shasum -a 256 "$DMG" | awk '{print $1}')" "$(basename "$DMG")" > "$CHECKSUM" + +DMG_SIZE="$(stat -f '%z' "$DMG")" +DMG_SHA256="$(awk '{print $1}' "$CHECKSUM")" +cat > "$METADATA" <&2 + exit 1 +fi + +grep -q 'BatchMode=yes' "$ROOT/Rsync Studio/Services/RsyncCommandBuilder.swift" +grep -q 'allowUnattendedDelete' "$ROOT/Rsync Studio/Models/SyncJob.swift" +grep -q 'RsyncSecurityValidator' "$ROOT/Rsync Studio/Services/RsyncCommandBuilder.swift" +grep -q 'isSafeRemotePath' "$ROOT/Rsync Studio/Services/RsyncCommandBuilder.swift" +grep -q 'hasBalancedShellSyntax' "$ROOT/Rsync Studio/Services/RsyncCommandBuilder.swift" +grep -q -- '--files-from' "$ROOT/Rsync Studio/Services/RsyncCommandBuilder.swift" +grep -q -- '--log-file' "$ROOT/Rsync Studio/Services/RsyncCommandBuilder.swift" + +echo "Static policy checks passed." +echo "" +echo "After creating a signed Release app, also run:" +echo " codesign --verify --deep --strict --verbose=2 /path/to/Rsync Studio.app" +echo " spctl --assess --type execute --verbose=4 /path/to/Rsync Studio.app" +echo " xcrun stapler validate /path/to/Rsync Studio.app" diff --git a/Scripts/verify-release-config.sh b/Scripts/verify-release-config.sh new file mode 100755 index 0000000..b77f417 --- /dev/null +++ b/Scripts/verify-release-config.sh @@ -0,0 +1,51 @@ +#!/bin/bash +set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +PBX="$ROOT/Rsync Studio.xcodeproj/project.pbxproj" +EXPECTED_BUNDLE_ID="net.absdev.RsyncStudio" +EXPECTED_VERSION="1.0.0" +EXPECTED_BUILD="1" +EXPECTED_MIN_MACOS="14.0" + +fail() { echo "ERROR: $*" >&2; exit 1; } +pass() { echo "OK: $*"; } + +[[ -f "$PBX" ]] || fail "Missing Xcode project file" + +[[ $(grep -c "PRODUCT_BUNDLE_IDENTIFIER = $EXPECTED_BUNDLE_ID;" "$PBX") -ge 2 ]] || fail "Bundle identifier must remain $EXPECTED_BUNDLE_ID in all app configurations" +pass "Bundle identifier is $EXPECTED_BUNDLE_ID" + +[[ $(grep -c "MARKETING_VERSION = $EXPECTED_VERSION;" "$PBX") -ge 2 ]] || fail "Marketing version must be $EXPECTED_VERSION" +pass "Marketing version is $EXPECTED_VERSION" + +[[ $(grep -c "CURRENT_PROJECT_VERSION = $EXPECTED_BUILD;" "$PBX") -ge 2 ]] || fail "Build number must be $EXPECTED_BUILD" +pass "Build number is $EXPECTED_BUILD" + +[[ $(grep -c 'ENABLE_HARDENED_RUNTIME = YES;' "$PBX") -ge 2 ]] || fail "Hardened Runtime must be enabled" +pass "Hardened Runtime is enabled" + +[[ $(grep -c 'ENABLE_APP_SANDBOX = NO;' "$PBX") -ge 2 ]] || fail "App Sandbox baseline changed unexpectedly" +pass "App Sandbox remains intentionally disabled for direct distribution" + +[[ $(grep -c "MACOSX_DEPLOYMENT_TARGET = $EXPECTED_MIN_MACOS;" "$PBX") -ge 2 ]] || fail "macOS deployment target must remain $EXPECTED_MIN_MACOS" +pass "Minimum macOS is $EXPECTED_MIN_MACOS" + +[[ $(grep -c 'INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";' "$PBX") -ge 2 ]] || fail "Application category is missing" +pass "Application category is Utilities" + +if grep -q 'CODE_SIGN_IDENTITY = "Apple Development"' "$PBX"; then + fail "A project-level Apple Development identity is pinned; Release distribution must use Developer ID Application" +fi +pass "No development certificate is pinned into the project" + +if grep -q 'com.apple.security.get-task-allow' "$ROOT/Rsync Studio"/*.entitlements 2>/dev/null; then + fail "get-task-allow must never ship in a commercial Release build" +fi +pass "No get-task-allow entitlement is present in source entitlements" + +cat <<'MSG' + +Release identity baseline passed. +Before the first commercial archive, select your Apple Developer Team in Xcode and ensure the archived app is signed with a "Developer ID Application" certificate. The exact certificate identity is intentionally not committed to source control. +MSG diff --git a/Scripts/verify-signed-app.sh b/Scripts/verify-signed-app.sh new file mode 100755 index 0000000..a610719 --- /dev/null +++ b/Scripts/verify-signed-app.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -euo pipefail + +APP="${1:-}" +[[ -n "$APP" ]] || { echo "Usage: $0 /path/to/Rsync Studio.app" >&2; exit 2; } +[[ -d "$APP" ]] || { echo "ERROR: App not found: $APP" >&2; exit 2; } + +for tool in codesign spctl; do + command -v "$tool" >/dev/null || { echo "ERROR: Missing required tool: $tool" >&2; exit 2; } +done + +echo "== Verifying code signature ==" +codesign --verify --deep --strict --verbose=2 "$APP" + +echo "== Inspecting signing authority ==" +SIGNING_INFO="$(codesign -dvvv "$APP" 2>&1)" +printf '%s\n' "$SIGNING_INFO" +grep -q 'Authority=Developer ID Application:' <<<"$SIGNING_INFO" || { + echo "ERROR: App is not signed with Developer ID Application." >&2 + exit 1 +} + +echo "== Checking Hardened Runtime ==" +grep -Eq '^CodeDirectory .* flags=.*runtime' <<<"$SIGNING_INFO" || { + echo "ERROR: Hardened Runtime flag was not found in the signed app." >&2 + exit 1 +} + +echo "== Checking release entitlements ==" +ENTITLEMENTS="$(codesign -d --entitlements :- "$APP" 2>/dev/null || true)" +if grep -q 'com.apple.security.get-task-allow' <<<"$ENTITLEMENTS"; then + echo "ERROR: Release app contains com.apple.security.get-task-allow." >&2 + exit 1 +fi + +if grep -q '' <<<"$(printf '%s\n' "$ENTITLEMENTS" | sed -n '/com.apple.security.app-sandbox/,+1p')"; then + echo "ERROR: App Sandbox is unexpectedly enabled in the direct-distribution build." >&2 + exit 1 +fi + +echo "== Gatekeeper assessment ==" +spctl --assess --type execute --verbose=4 "$APP" + +echo "Signed Developer ID app verification passed: $APP"