From 92b24e596e1308006bf1623c42b83fecf0400890 Mon Sep 17 00:00:00 2001 From: Wolfgang Baird Date: Sat, 26 Mar 2016 18:33:21 -0700 Subject: [PATCH] 0.2.0 - added a bunch of functionality --- mySIMBL.xcodeproj/project.pbxproj | 34 + .../UserInterfaceState.xcuserstate | Bin 71716 -> 101759 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 126 +- mySIMBL/AppDelegate.h | 75 +- mySIMBL/AppDelegate.m | 662 ++++------ mySIMBL/Base.lproj/Appliaction.xib | 1063 +++++++++++------ mySIMBL/Changelog.rtf | 112 +- mySIMBL/Credits.rtf | 7 +- mySIMBL/Info.plist | 9 +- mySIMBL/bundlePage.m | 260 ++++ mySIMBL/loading_mini.gif | Bin 0 -> 4342 bytes mySIMBL/pluginTable.m | 255 ++++ mySIMBL/repopluginTable.m | 152 +++ mySIMBL/shareClass.h | 15 + mySIMBL/shareClass.m | 136 +++ mySIMBL/sourcesTable.m | 161 +++ 16 files changed, 2105 insertions(+), 962 deletions(-) create mode 100644 mySIMBL/bundlePage.m create mode 100644 mySIMBL/loading_mini.gif create mode 100644 mySIMBL/pluginTable.m create mode 100644 mySIMBL/repopluginTable.m create mode 100644 mySIMBL/shareClass.h create mode 100644 mySIMBL/shareClass.m create mode 100644 mySIMBL/sourcesTable.m diff --git a/mySIMBL.xcodeproj/project.pbxproj b/mySIMBL.xcodeproj/project.pbxproj index 04c6437..7f32b91 100644 --- a/mySIMBL.xcodeproj/project.pbxproj +++ b/mySIMBL.xcodeproj/project.pbxproj @@ -23,6 +23,8 @@ FB0CF6AE1C61D314002CF3DE /* injectPROC.sh in Resources */ = {isa = PBXBuildFile; fileRef = FB0CF6AD1C61D314002CF3DE /* injectPROC.sh */; }; FB0CF6B01C61D617002CF3DE /* SIMBL.osax in Resources */ = {isa = PBXBuildFile; fileRef = FB0CF6951C61D13F002CF3DE /* SIMBL.osax */; }; FB0CF6B11C61D625002CF3DE /* SIMBL_Install.sh in Resources */ = {isa = PBXBuildFile; fileRef = FB0CF6931C61D133002CF3DE /* SIMBL_Install.sh */; }; + FB24B09E1C952FF700443CA0 /* pluginTable.m in Sources */ = {isa = PBXBuildFile; fileRef = FB24B09D1C952FF700443CA0 /* pluginTable.m */; }; + FB24B0A21C955D2C00443CA0 /* shareClass.m in Sources */ = {isa = PBXBuildFile; fileRef = FB24B0A11C955D2C00443CA0 /* shareClass.m */; }; FB3E55971C82EE4C006B4A54 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB5F44DE1C43A5AF00DE80B4 /* Sparkle.framework */; }; FB4F45701C8FD4C3004AAE68 /* icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = FB4F456F1C8FD4C3004AAE68 /* icon.icns */; }; FB57D2F31C4BAFB20077F91C /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FB5F44DE1C43A5AF00DE80B4 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -33,6 +35,10 @@ FB5F44C01C41EA4000DE80B4 /* Appliaction.xib in Resources */ = {isa = PBXBuildFile; fileRef = FB5F44BE1C41EA4000DE80B4 /* Appliaction.xib */; }; FB5F44E61C44BFF100DE80B4 /* SCEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = FB5F44E41C44BFF100DE80B4 /* SCEvent.m */; }; FB5F44E71C44BFF100DE80B4 /* SCEvents.m in Sources */ = {isa = PBXBuildFile; fileRef = FB5F44E51C44BFF100DE80B4 /* SCEvents.m */; }; + FB790FE81CA447AD00BE3B59 /* repopluginTable.m in Sources */ = {isa = PBXBuildFile; fileRef = FB790FE71CA447AD00BE3B59 /* repopluginTable.m */; }; + FB790FED1CA4BC0900BE3B59 /* bundlePage.m in Sources */ = {isa = PBXBuildFile; fileRef = FB790FEC1CA4BC0900BE3B59 /* bundlePage.m */; }; + FB9BF36A1CA6801F00A63718 /* loading_mini.gif in Resources */ = {isa = PBXBuildFile; fileRef = FB9BF3691CA6801F00A63718 /* loading_mini.gif */; }; + FBA9EB341C965E9F00511BE3 /* sourcesTable.m in Sources */ = {isa = PBXBuildFile; fileRef = FBA9EB331C965E9F00511BE3 /* sourcesTable.m */; }; FBB7934F1C7AB6C3006BF301 /* injectPROC.sh in Resources */ = {isa = PBXBuildFile; fileRef = FBB7934D1C7AB6C3006BF301 /* injectPROC.sh */; }; FBB793501C7AB6C3006BF301 /* SIMBL_Install.sh in Resources */ = {isa = PBXBuildFile; fileRef = FBB7934E1C7AB6C3006BF301 /* SIMBL_Install.sh */; }; FBB793521C7AB7BC006BF301 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = FBB793511C7AB7BC006BF301 /* dsa_pub.pem */; }; @@ -80,6 +86,9 @@ FB0CF6A61C61D1E9002CF3DE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; FB0CF6A81C61D1E9002CF3DE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; FB0CF6AD1C61D314002CF3DE /* injectPROC.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = injectPROC.sh; sourceTree = ""; }; + FB24B09D1C952FF700443CA0 /* pluginTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = pluginTable.m; sourceTree = ""; }; + FB24B0A11C955D2C00443CA0 /* shareClass.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = shareClass.m; sourceTree = ""; }; + FB24B0A31C955EEC00443CA0 /* shareClass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shareClass.h; sourceTree = ""; }; FB4F456F1C8FD4C3004AAE68 /* icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = icon.icns; sourceTree = ""; }; FB5F44B31C41EA4000DE80B4 /* mySIMBL.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = mySIMBL.app; sourceTree = BUILT_PRODUCTS_DIR; }; FB5F44B61C41EA4000DE80B4 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -95,6 +104,10 @@ FB5F44E31C44BFF100DE80B4 /* SCEvents.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SCEvents.h; sourceTree = ""; }; FB5F44E41C44BFF100DE80B4 /* SCEvent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SCEvent.m; sourceTree = ""; }; FB5F44E51C44BFF100DE80B4 /* SCEvents.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SCEvents.m; sourceTree = ""; }; + FB790FE71CA447AD00BE3B59 /* repopluginTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = repopluginTable.m; sourceTree = ""; }; + FB790FEC1CA4BC0900BE3B59 /* bundlePage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = bundlePage.m; sourceTree = ""; }; + FB9BF3691CA6801F00A63718 /* loading_mini.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = loading_mini.gif; sourceTree = ""; }; + FBA9EB331C965E9F00511BE3 /* sourcesTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = sourcesTable.m; sourceTree = ""; }; FBB7934D1C7AB6C3006BF301 /* injectPROC.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = injectPROC.sh; sourceTree = ""; }; FBB7934E1C7AB6C3006BF301 /* SIMBL_Install.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = SIMBL_Install.sh; sourceTree = ""; }; FBB793511C7AB7BC006BF301 /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dsa_pub.pem; sourceTree = ""; }; @@ -194,6 +207,7 @@ FB57959C1C4DCFA2001A76AC /* Icons */ = { isa = PBXGroup; children = ( + FB9BF3691CA6801F00A63718 /* loading_mini.gif */, FB4F456F1C8FD4C3004AAE68 /* icon.icns */, FB09A4FA1C4B85250072C553 /* brick.png */, FB09A4F61C4B64F80072C553 /* webicon.png */, @@ -242,6 +256,9 @@ FB5F44BE1C41EA4000DE80B4 /* Appliaction.xib */, FB5F44B61C41EA4000DE80B4 /* AppDelegate.h */, FB5F44B71C41EA4000DE80B4 /* AppDelegate.m */, + FB790FEB1CA4AA8600BE3B59 /* Tables */, + FB24B0A31C955EEC00443CA0 /* shareClass.h */, + FB24B0A11C955D2C00443CA0 /* shareClass.m */, FB09A4F41C4B5FEF0072C553 /* Changelog.rtf */, FB5F44C11C41EA4000DE80B4 /* Info.plist */, ); @@ -273,6 +290,17 @@ name = SCEvent; sourceTree = ""; }; + FB790FEB1CA4AA8600BE3B59 /* Tables */ = { + isa = PBXGroup; + children = ( + FB24B09D1C952FF700443CA0 /* pluginTable.m */, + FBA9EB331C965E9F00511BE3 /* sourcesTable.m */, + FB790FE71CA447AD00BE3B59 /* repopluginTable.m */, + FB790FEC1CA4BC0900BE3B59 /* bundlePage.m */, + ); + name = Tables; + sourceTree = ""; + }; FBB7934C1C7A9748006BF301 /* Scripts */ = { isa = PBXGroup; children = ( @@ -404,6 +432,7 @@ FBB7934F1C7AB6C3006BF301 /* injectPROC.sh in Resources */, FBC54D6F1C4C33030021517C /* Credits.rtf in Resources */, FB4F45701C8FD4C3004AAE68 /* icon.icns in Resources */, + FB9BF36A1CA6801F00A63718 /* loading_mini.gif in Resources */, FB0CF6941C61D133002CF3DE /* SIMBL_Install.sh in Resources */, FB0CF6961C61D13F002CF3DE /* SIMBL.osax in Resources */, FB09A4F51C4B5FEF0072C553 /* Changelog.rtf in Resources */, @@ -448,11 +477,16 @@ buildActionMask = 2147483647; files = ( FB09A4C61C4B26AD0072C553 /* INWindowButton.m in Sources */, + FB24B09E1C952FF700443CA0 /* pluginTable.m in Sources */, FB09A4C51C4B26AD0072C553 /* INAppStoreWindow.m in Sources */, FBC54D8B1C4C454E0021517C /* PFMoveApplication.m in Sources */, FB5F44E71C44BFF100DE80B4 /* SCEvents.m in Sources */, + FBA9EB341C965E9F00511BE3 /* sourcesTable.m in Sources */, FB09A4C71C4B26AD0072C553 /* WAYAppStoreWindow.m in Sources */, + FB24B0A21C955D2C00443CA0 /* shareClass.m in Sources */, + FB790FE81CA447AD00BE3B59 /* repopluginTable.m in Sources */, FB5F44BB1C41EA4000DE80B4 /* main.m in Sources */, + FB790FED1CA4BC0900BE3B59 /* bundlePage.m in Sources */, FB5F44B81C41EA4000DE80B4 /* AppDelegate.m in Sources */, FB5F44E61C44BFF100DE80B4 /* SCEvent.m in Sources */, FB09A4C81C4B26AD0072C553 /* WAYWindow.m in Sources */, diff --git a/mySIMBL.xcodeproj/project.xcworkspace/xcuserdata/w0lf.xcuserdatad/UserInterfaceState.xcuserstate b/mySIMBL.xcodeproj/project.xcworkspace/xcuserdata/w0lf.xcuserdatad/UserInterfaceState.xcuserstate index 43acdd584d1758c4c6b3f1dbb559b294090b612b..275e8e756545d59f50e9e37392bef551582d784e 100644 GIT binary patch literal 101759 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 Ib$jIh0Gg930{{R3 literal 71716 zcmd441z;7&_BgyFclXNfHCiZ?LeN4>Lhg;Xg%X88tPvpCZR7$eAqf$rK)Z*!Qg^}I zQg?TEq3-VPeYNk*?%gXP!Cv0~_m%eu**$aS%$Z|zX7)^dTXR!KXKL!p5|OCHBre$` zxu3V6Z|2CQ;r5QE)|QzgTkDSqH*|K?j;w2MSlEP*t4DUWw)rJ;{JQIXwpK}z>{35z zFKKUSe`$;~RysgBP#PyCODWQLDNV|e4wEXSDydqkk)}&Cq?uB!G)tN-&5`Cx^Q1;8 zEFB@WOC3_D)FmyIR!AVNk&cs2l+KgRmoAVllrEAkmadkrk*<}lldhL;kZzQ2m+p}6 zlkS(El%A5FmY$KGm9|N5NbgCXNS{idN#9665Jot$5t%5&P8`HZG~y;cGK>r-BgjZH zii{@dB!gs#GKu7pLQ+hsNHv*F>PS6lAPdMM(o7bUC8V8nkY!{!SwU8l zqsY-jC+Cs#$pz#>auK(~~y zm0iuQXE(E3*d6Rnb{D&kJ;WYnPqSCpTkHe&3HyS5!@gxdvftRB>|f5fhkLn?`*}Y; zlqd0Fd^jJ$$MO`O$+LJipTu){9-qRCc`2{r)x4J1@p|6C7x8Akm;+zKkKxDim{678=e~LfPxAE8cyZk-=5&wdJ zZIf+Io6F|0d2M^y_O=bQ4YCcf4YiH1jkJxijkP7)Qfxt6nk~zgZ9Bv^!Ip0;uuZX* z*~)Ddwi?@PTgcXE3)|+~nr(}1OKeMR%WTVSN7>fcPOzP5JIS`zcDC&T+l97^Z0l^B zY**Q~+OD?UXuH*Rm+fxbJ+_BzkJ+BKJ!5;;w$1jk?RDEbws&ps**>v-YWvdmo$Y(u z54PWIf69_fWGXvlx9pMo$$QB|49r7}Hxx7X`Mm|8a+ls}R`lYf$bmVc3dm4B1}l>bs>MN#aE zL(vqU;#YKG{CaUShAXA7-zyPq)vq z&$fr`hua(NVSAJP2z!gY)!t$6v@f@>u&=fsWnW`I#(skRMEj}s)9h#3&$6FqKi___ z{Sx~+`+ECk`xg6F`_=aA?KjwOvEORH(|(uzKKuRlhwYEppRhk^f7bq-{U!T0`)l^s z?Qh%Pv43Fy(Eh3YGy7NeukGL4f3W{z|JD8<`=9oI9g>4PYz~LR>2Nzdj((249Q!y1 zI`(r6aSV5iaP03G;~3{ib_5(jN2Vjok?$yQ6gm!bR6430A;;m4X2)Vji=)-i=2+rr zcO2z7+Hs2GRL5zK(;XK%E_PhvxYTi(<8sG3$2E>?9oISTa@_5>$8oRYKF9rzryb8Y zo^?Fuc;4}X<3-0yj&~jJIo@}C;P}Szt>Zh#_m00De>?th{OgpQ#7UjZ>2Z3UKBwQA zD=Er#yQq`fHTvX<;-^$I18Oc&dJUx&T40kbGmbev%%TuY;!JgwmUnV zoz5;NIM+CjaUSbD!+ECjQs-sP%bnLcZ*bn|yvcd9^M2<8&S#v@I-hgC>3qxine%h! z7tSx8zdC<&{_f%~n@e^nuDxCTT?1W%T>H8PyT-W2x(;w#8t*$oL5?8yc!`12PaxHbOaUJ7Y>pH`AiR)6=Wvo=9DT(zk_)vpdwhpI{HFmM9k~HR>_y z3F;~8TJ>!8eDzZGGWBxxDs`)RwR(+ut$L$+t9qCEfcl{NkovItqWY4$O?_E?MSWF$ zO?^jwSN%x+O8r{>M*UX(RsBuQGAu>1o%=@jE$-Xhce(F%Kj41Y{h0en_cQM2-7mRcalh_< z%l)qV1NX=7&)i?Szj1%>{>lBT`w#bD?teYhWAoTOE|1&e^X%mr;2GrE&y(aC;Ti22 z>lx=6?+JP`JlURuJrg~-o&wKg&s0yTr@~X^neM6e%<+Ug^`5Y2p=Xh&#k0iI=~?DE z(zDv5dyerO?>WhHs%Nd|EYG=~3p^KlF7vGSZ1P;;+3LC0bA#t*&uyMNJ@7dXM{y%%{e^{(@7^ltH9<-Nvx zz4s>Xt=>DlcYE*iKInbK`?&Wh@3Y<)yxY95df)KA?S0Stq4yK-=iaZp-+F)W{_OqD z`ycP$KFP;?vd`gDeIB3Rx3_N}-@d*fzG1$RzWsd%_>z68zBFH^FUNO??@(W!uh2Ke zH_cb(JIq(@o8g<~o9jE=*WjD)Yw|VwT7B)lF5e2@DxdB<*>}2ct?z8#Ilc>g7y7R9 zZS`I4yT*5|?>gW0z8icu`|kAJ<-6B+zwaU6W4@<+Z~ETyz3qF)_pa|f-}}Cgd|&v! z^nK&|!S{>b=9m2rzsK+Q_xBI-C;5l@hx;@AS^jK)j{hM4!Tv-16Z{kXhx#Y^bNzY# ze1EC`Fn^_gx_^d$wttSl(I58D_b>1-^tbt!``7r7@gM6y&VQQ!eE$Xh3;h@QFZN&J zztn$)|4RQ={;mF7{I~jV^WW}&(EpJCG5=HkH~nw<-}b-bf7kz^{}cbG{?GiM`@i=8 z?*GgGcR$k4)=%!|?C0v|sTtYQ)!e*Ia!5|eC8?4}^3N!%N?82uMq=aXBO99Q zIyyE;n&j50&NfJ1$)|H5bM;Xn@5uZ>QCeYcZXmfRD?2MWJvAdQIX9SEkX)Fanw622 zmX(*0Srqc_Ra{UwqqTieM_XM(xS+M6YjL=x)9SguG(;MGg)~6gM;a&%lJ=DbOZ(|I zUDg%dt~+$6?z%!6DkVw7kc5HKNNJR=>YDCBVibK}y-*)JPhf9qX>46q)LyqZ9P$ps z2j%UJ;r4K2wAbpo`ux_G&i2;kW{mzr-ih%fCA!7BkX-QYOxDkihG`}g_9`X)F@Z5$@Tx9f2Qph_{ zAT)+i-P+n*U)NsTF}UPxtHn^u6@G_5S(*eII?`R;dW5X^K=V zO_ioeCHU_$sazj~lQmf1Pd`9ESw9#5eSv$JL-&ceo~&eryhlDZYG zU7aDX7l&N6uyt8k-O{E7b@*mBKER18sjCk+hrG#xBbG=d%wJ7sQ*%@2irn^aT@|hY zJEu2=mzn6IsKmQ&Gnjy)Al%Wkpd|sr9D$}FT;H`|ftXHoNp;fb_0r+`ko8i%K2$KoS1`RgN_TN* zcyWh0k@Kad4blQ>p`N6V*2h=~7D+9Ve}mL4E!KzW!#7B+Qky34B>po6W0|ykPFYn!6Uu07OIgGskb+>Mg#%}i4 zM~#@&vMvtEG19T~%Bo7cI_pqu4T0Jy9V0}_?BjUpgpjvi6d=~wM(OzY?oN`{N~1SR zCrhVDr%Ir@KyBa#X+EI!2>kVYZ;`&w;slmOxH)b6trYhWw*@AFm6nXC`i#s~H!W|a( zE|E4$qqj(xN|#BOOY5Zd(gr=C2lX^PUC+=nw@90$&C(WWlyoK9wk-WneG*!=B4OD~ z%UQU*t*)gp+-L|xb$d80WG!MEDv_d)*Mko%>I49eMLfwbt?I1n?CL z;-=R%BR_IG1Ud`!PU&tT`*-OFt(Wf657x)dSiGXDxHPZC0(d}rL>j$OdQf^udRRY1 zpP)|^zu+JIMf@3CF|(q*wGpSc!)l5QTe&iIT#{i6gMlnGg{i^St1XPrNiRgHdr{BT zM_DgkmR^n0@|vEfkF{RBDZMRTJgiS#FTJDZ$6mZIeJEahpckw+2pXHH;C2ha=hBza zF2B+z$GZGh`c4|XZe0xHkJ5jHAN)!BS^7o#Rr*c(UHU^W)~D*z^b);PFVoAfKvOzW z`WyfMFOg7I_QgLH`2WN7N>f@!h*>wJIXbz*ghuUTc}w#O(-rjqH3j{Y$b%t-ux<%b zVfxe_8s&@NAlzXh9u(L8VqpeR>RM0%QSy355K$--FFNIsaR?$-U(hf7YF$$c`fbsV zVGfB)YFej{sW5->NWpcwJHm3}Cj(L4NI$X{*_-s2E+hNs)q0ISU7vwUHxm_&>`MmY z-$TeyWLvGi1pi*DFB9svpCABx6#W#pAo<~rPNZHCfWja04#4+@IjC;0Yw2jhXF|im zNcw<+yvb3fN8n4*BALG1!dcnX(t`N%np+zdVI$$z5kbSE{MN;7*q6vk8meLqWq*>4 zhLDUQW61&JKr&9BrO(#q=yUaXn@I{8FXVv)^^ktJAq$OS2>T<>!sX$HE@8(DTb4Gp zx3-9IE4Q&x^k7cMv@p){-qv8cP4y`2d2TcMuErID_?Dv9_OkG@in^|jaHBEikT-yE zQ|gw6i_xJp)ipP-u<+zp)R>-9ux?>fGj@z(fP4yhhgi5Rb7k@jt&(Bg=A|yrn%|He z4mJjZX*sFp>>f-eZXkz{33{DguQ$v#Y{ZmsbDQCZ<9Acv7kR07M^m9#e031-fV z`BUNI4T!}km$Anph(k-gynMdZHug@J^aXmCK3_*M3Pe3k!thginzw>h(T7QMjTGEO zrjr?DCaKjI>dktq-i~rl=8(Ba|2z^RhtG=jSYyzlH|a;{i)I9ZNdk{oH5t@MB2FUL z$b1X8U`mG3rlPK?eFK>FurX= zJzEq%d0xo^=rjO21OQs6LmEYtm4sGBs6!IEqolY=p4ji`f6f2QfgDLzhP-2t$OKNt zD6R|(#X|Wvrf>sUB?h(2@ICmG?9|n(y>u4>4oioDoFa|BimX9HbSycJ98XRlCz6xM z$@-CKj#lcc^ws)N`q8?s!&PXMP9vw2wfOT)au)u54w|Ml`Z4xJY zp!iHIRLp2#`|kbtE($-ny|t?i8+7-{Sy^e30mez>_gWpT(`VZGiZ9K~h1 zZEaP!z6hI(ukqa3*O)?^H ztG6e~GYO5KCC}++=x5?m0Gr0vA|oc9c}7CJZRFL2cCV4w^|SSJtWKjV9JAB5#7^HK z?@OaMkax*@`g!{K8-znLToDTCP(#4Fc~Y?iG1rzT7yCvbBGGKZ+tgi?f#R0=ttrM{ zpT&sJ$xpaiC0~#)$yelS@(uZxd`G?~Kad~wi}Z{2OY}?i%k<0jb^3aJgT8Sq`I-De zenm$*82|i-{7L@8F>C_j0d%eVqET7`LpF3*%+GB01eVKnocul zCe6}s)Nj&n)^E{o)o;^pzk=q_gXqEZ5d1Td9;)A=->JW*e~Ev-(!bWn&JmWlpsuq{ zn9$iKO_7LbpWb{GPGW*jD>HIi1FguShj;s0?+TZrPzdiC3kGIe?`kSba3UL87pK&< zwKe04S%kUsF)x?bg^^mgJuM}_wV|~xWoB`nH78SPx#ZtOr_mBxO3U=S^t<(Y^m{ka z3VIkVqgDES`UCpC`r~4523k&}G`zSz+#c&6=VEAa-jo&f?M)azM%Ls)-(yKL9I)9M z3CD%q(k7%vs8wEmUCYusOoqh+8>W=b!t55Et>3S^XDy!*Om1G3ym-YDi|i0>!1W_N zoYv8L{XzX9{o#$Yk%sAf{Sp09{V}1+1B&y?yE>b3ZIOswD0v=oY*F{e154^UI;XW@ zKpfX@MpI+wLaWzix;SB7N89KU^TCKoZSTihUfM;Eltyo&OX)JYoUYKH(4W+w(x2W$ zSJG8J>*Aui29X8JM|BUkSF|=6>k%PJ;l}FLwvzDDaC3y| z1<34?rj;!&sBVptZ1T}k=hC{i5r=+n5G2i8nVg=TIW8$VBQ+x>!%Q906Qtl3^hA0R zJ(-?DPo<~P)Ai@|7xWkPm-KD=%la$G^z7=2!l(LRo}*BB}Ss2Zm<^6 zE%a6ddRKoB!|F(=;UyOJchP%=y}O&YB}fKBgHV zufN5}aYhzFA(5C3dB^v>Mlf5aM3?kYU9t#xls=9@2YpQcWIcUC{}hD>^(dN#9v;Oi z(qyLV%10Z#ptXHPN~uBLHu|jOqR-Li=?kQ6c4H)4k7lE`vuQD|hwB!%>7VOg=u*f# zc|Mx8gT{~FHBT)#ozmRa-g?CNZk#njdHOPa1+#;gr?gC!weZ?NUlmb%Pp?D*xyKm| zc~cXH+TF~hm`2#@$}o5IO&s`Jq>R2ppBGyp^+@n+{MjCE#?`~pFiPDw`sXIG@6!)( zHHlo=K;IYXP25AF9|_0tvHqPt1|3W+4;4twK-EeMq(>7`^mF?4c3$oq^m5Wx+RU8H#Z;y-xBiR%tNxq*yZ*;!=4C!<6zj+K(*L9X zg^QBE^?&qHwfPvm6ty-tqV?IQqP=M`CXp@nR$G!YcM3{lZgaD_3_&y14KNZ2VzRs) zl{DO5DU#;sueyO*UM3OlCCSAGv;EkRTAZ{FBk!dD8S>G(mChvmuOVrI_>nZm_|5od z~TpM z>8X8#E-f_+Go=|BeS* zEeC@cm{N`iMMN0TVdCBzOJc*&YsB(Sh6HZJ$HR?1H8a67BKMvn^)JT#^W5x}fwW-y zxTLJ?wAHg#2GVnaXeClt$9X-rKN~|T*a2iP5IYc}cL71ixBI@qFeWSovqx+^OJxBT z1VVvuATki#8jN^0#>h}|INAwJhAx_mcC`TGW!!rUr!2N04icFjAU2WenNb?dO|F+nf74dYjT~~HGI}U&;NCbOqlFHS+H)OV zF9kQU4QwOB1jYV9#sWDYs=hcSS7Km_^DstV6S8M`(?laBR^xB17l-md8heipEff{+3ppP zgLMf=8jy*vvS%2E!|XZsJVU$19%tL=9qeV&J`)d&8yg$b+v;$8qjPqHxkqHCQ|ORAkW3(1K(c!l zgB=LLm!=Tp>`Vv}SipWlCTzoF<7M;?AcqLjC+K*B0K;GQyO^{mk#CW+ChRZvx49n` zU9BXXvPhh%4eTEg&>dE|)k7dBv{h&YEoCRAAo~(8xlHbMC;^Ik$0{D;(YL zBp|s!@_^)T;!f@&L%9Y7m91D`2IMe(?97tz{K#PwBb#oWJ&7jnW|;#PNyFO8rUeTP zV5_&iIBr^Q;(PP{d;mwQTL`2G$YdZ>HsL18 zdDP0fW#%?}$U7+Ut+mbC&?-{>NeM4Sf}^Un9n*^)4ed>B;slN`blYJUa&6H%l8;6g zXXLdx8lkC?#5O+wkErkiIhwg?K+2-&Gd`XN<1@@Wji&=C0aB`uiZX4)q!kIt5uU>j zNoX{IPXtm9qykqOQSM=@2aF7cMOr?`lS=D3PD|x_OcpE=YaJhIeMf6^A)pR5-APpS2d>3geu`e!SyvA6r*+eUH35^C~JnDtn zZ$%ogFE2rg~;3;adQghiWd;4ewp@efR>mpNwe#6DP@cv}P7$Y15J2_M|c z`=0ZA7W3ZVZwcnT31roJ{x*=+yTZKp1@k@ta#T;uyOn=#@uvgG(J}sf$)EG$l4ga~ z^*8(vY4p|nTmBvYp8vpqhBqjRQF!$Ynq_0=WvvbwF+gg7MV7Kpq0}1mMnXydc{g zrXa6DHQTNAGH$jsEJ|r=Xz7TPW}Dl@c5KL-xm(zpFvQ&sSw9om@w-dff~L-eUG*t# zEeqmF+sDLq;_i}W4zwGx{Y+#hhrBhrHO@kj^l0hq6z;1dIWJs?N2%s_H76Hg7C70= zHf+a+;bvc_hP=C%(dZQC$PjP1J16!x5uU!gd|eo>Ywrwp$2QKyc1FmXy<4nU7OppD zy&Go(Cc3kBm$*heS-kyFGfiygguDmu7I6!jTkFHgJ<*5DH<8vkZ+GbvxPs=~nx943 zCfX*U-LV}C`PTOryV8%FOJ>F$?p#kiG%D@ZcfHqBOID>dz3)Z16o zEeMx&iLFwR{<#DQh7_0XF4-|P$K>ML*KT@aV69<~ZHL+L9Gf`7745IPo7rfqvQ-PK zyhErR+Gg8y+sqh`YJprHSr6Fe2tLdOf@d@1`A}!8x0Q1!Swmu%iVj7*1ZDNXoIc<4jVn1#-^m-By@}I3X{;=f!t;g`d`>(gKc+?y*)aC*VwL$$=UTl?zE`6Nl=5n{H{c5ZnxcG zQgaUwjQn<6!DB|3q}nmPzO1Kpxuz zmc?8Rl3CK$a^3~cSS)+rCXVjgJ^=FMdfP`pp4t^MKNDnP#Q1a~nP1z!G0A)u$TJ3+ z|BVkrQm2L8OAilOr2c68S&(YFpI?AHZ_TdAwb}jv@xya5Ck6mM;m2g&=&gMqvaS&; zChk-j`SJ9e*iMx^UQQE3PL%_45Xgr>P~tz{NF+H!&eSV`d;$ayiS#s}ZX@35fO^8w zjVarmipa>azEqSai1AGX@|iWhTw{Ee{1wQ>m>`u46o<+J3ofl5FLP%Mzc@BpEFo_xN1f&L6o4%7zJ`M*0uICo_* z9k)M|)6z4olY{a)JZT`Wmp8~8*ZT;=(PKJRQXox2T&ELTYnHJZoZqg^KLQY_W;#;obd-_@u6YDK~ecp`7t^l zs0XN592K=_c}jjdk(TG==Mx{iB)=wz+x}3e{D%Cd{Fay#KhSDxRr^Q&S3&U|0(2Tzy zn1XUU4Crv6BmOt4rZ^Q>0y7o2;xQkLnABwKtzhvjqc(!lPr)MQm7U%&$)Bbm=HhX1qMnD`&ON+>hGExd&sfyvvRZCm)fM+*#EaufE&K zr;?@MG5NSpT9tzp%${sg4pAm36O}`OW&q6unguj_laj0CDTgWrKy!c|j8A~({=b(` zWg5z-QUdg#o)k{0P^wWrmBW-ur3&aFKqmm5xKXK5rVHDE1Df=|I!3O{Rpuq~vQDW_ zd=OTS5X_ygEKn9IO+fR2<^x5B77D3sRu(HQLMn@ZP6j&VeitSF-t79;B(W!zjlPTW~06o9Hl6w|g0bhWN8DabcEn zfr+qucM&EWrin**sfqBg-9>0pSW-T@`;a%72&+QgjNJ+Z3u{VpOG!hhdJfR@fL;LfBA}N5y$t9&pc{a00=fn0l|WI#t^s--&>Mi>1oRf5C=7Q1y$k3) zK<@+k08pH?M}R&C^a-F(;kfNyyU*^o_p|S1-`n2bKES?@eV~1ieP8=v`+oKz_M!G9 z`!M@(`w06;`zZTp`~LPZ_ObQ@><8M%*^})l_VM;qd%zyFr`gl(8TL$jmOa~^V?W4# zu>BDG1p7q$q4r5YamJqq`V!EWfxZRw9iSfo{T%35Krt%AnCNd{1egPu2CP4@eSi%C zHXPVUUD0;>R41#AYe*}&!jI~>?Tz*D5G8CV;z z4q#otRsdTC>}X)e13L*Aet#NgMeK#9(&Kk7yOySjU%HAf$?;5Z%xc=Fn%MB`+f~+9 zdt+0Fs132WzIg?1x#M>u4U0naMS-S6o9nt-8WvWWA9z=W=T9)c`Om6roL`@vI@*9V z&Vx*;>sUA;ClJWOx>DIWnc2bY^o*>G%s2?EabtQme!rBO8c$NWNmA>clhhcGcUDRhuN?frLrBWoRpkN?VtPjSpSSQUr<2uQk!)@q|5Peq&Z@eRfWG z4@a7rot<5mmN3$JCP`f(Z_e(G)Huv-e#sp_nGGgBEabFjLk!nvhVf)aAbqDpOwEp) zZd1O(^=TPd!K}1E!VnjlBw-u)}+5s&gd}X7hUQ}a`~;FNGD$jZhfdQH5bI|= z&l6<%aueIyJsn^}c4Jl`BPVPAP6ybd(+oFcHP#0+69%}+BG=0o2k6RM0nvI3u}UbxYxvX@qfXw?D?pUb$iG$v<{8P?syCP zkVz8ma_(TMZb^joGf^@UE$ibZ!prw`jD`Sb&Cf{NlQ9a_scXy*B#!YJlce<_?}Xls zy)`!LCziP~zEBc}`wuK=Z*5DA7hg1SZrm-w=vB;KHL-0Dc@Nng3Jw1jBQU`*zGb4k zVuuskgX@g9v(j*Y~rHSg=z6cZ&5PxSPzJ5=|xiN^9 zyc!yN^66=TH2l6dBbXKpV4=3m^z=BdZwAec=m#Dl$coCK2oFiE<3cZIE~MVxW3s4UM<=|~Wbe@uk8{ug7!iUHyI!9B4e=vx}Y z={bP}wmX`1$aYM?-6||5qG34^HKzS^Mn@RvD?ncb`Wn#J zH#rtK7MfJN0rbrX6+5VfvWwMEx|dAZwOT0R)MMd;=S}mwFbJC+s>~Jjaar`T+ z@xR?|{9nHE?Q(1Uy5qQB$A7%z1Zk85ckA8-`koj+9;Fj>%z?`fc)^&#R$UGm5ilSM_B4BSf03S^p6ZWMH}IP{_8vtH4D z?)U=H;?B@NK>tOwOfu0f4W2o+uy$oSZcJuo<%lvdIasMD4G&FPSbuQ*DzN_O_{s6J z;}>8Q7z4(E*)}b zSj)<}x3j-%zRA(Bjmc7Kqxl+Fu!gAletK53>{EdMr1Ufn~_7hE}yHl=x#Fn0j&5@3U8C z2GGXfqBa{f36Bw?Uqz*g*aqi;&eYy4jx!K(CJfKB#YId7_h;OEwRP~#ne7xon={9G zkn>>YA;1O#8w6}$V1qX~Ct3*baG`}@2kP>_cFfbRUw!zJN3D?;JIi_#4Vmejizv4XV4d?UK8%R*0Vn9lwL_j= z@}Nae*eT9xIp;eUI2SsxM!+awqk-)YY|JL-A`8LT7=r&pM%KM@>1HRh2w&>NLt8zE zX3ka4)yPOZUvMC>ae|S_1|xI7E=ebwV4=q|E zWw7$RwHFSyC_2k|zM!Zlhv&S&d7%+&u>i0jQWRNCO#SVluOI%%q$nHDPFkqeIWcTQ zw}6r7Sr~hsjc!52o)~yy`1#3Z=M_#2-JDyUR|882mLZ0i2`oz-DmDrYI~WYz7sQ_w>a3QeNh^c2o{E9`&!~|06UU~G`tab~*+s+SqCFMisM`$lT0X7L( zuCNw(kr3Li$*27B`O8~P=A;F)M0lF$TE23A-z&}^oIjewD*#p)8(zWvZ}i`*czcuf zhZD=g_F}L9b>XE!E?gi?1~x^IS8S4Z!ot8iEs@|kO;8tzkH=khmm965%YkdVhjDfH z2(W3!@($N_xWfBov&-Z1B3{3%AFvW&r2=yquyQQ%F3K$$6=5R=)3uKkXj(80gN42-@0y;Pi3X{!d_y{(pF`h}-A6-B&q+n%`fMqX zk)4Xv_1#h+%WyVn89R-(cg@#i<5mii*H_HT&Jy(tu>ft~2yq~YCxdZmfvJH$@vP{y z#9BN(&{w5^(=tS&ETgYHe;_>|zBS9r?jz41$P5~ph`yTM0Q!F99~#g;T8ZMZ_Z$rD z`b_=;*@n91^ci_M0YP4RAB8%BoYZWbUli&-lII-5mjzP$D9;ecNfU{s0G4v^8-2^c zLvv!hX?=tc_v3|^3}oi?k%k2ETXKv(v-&ES4Q6CzBEAg#LcLEo7|aTYSSr|e_|io! z^uAJ%AdXfT{ER+wzCm0J2!o0RaQlXRSnN)OL1K@sZxH5WW{JgApA~;kLz^I65?;I3 zCj_E`h^6w**FU=!A7DJ6gC01oj|^a1Fh{TtqlBG}w#Vfe<`mMSraf+Xw)T^!2b8Xy zizzMqi~?r|zttA`!VJ8jJ8q5U+Rrt-x5a~NglnX^4mk`M-ZpBbR`QqTzc#tUTs+_n z)R9$^>p)kpnMYT^6~yHNCRD0{)riFc7FoqrQo#eZqDcYFXr_sjW)6;{c4cO^aQ88^ z2e}Rv1opHw;F{#hMYQ;V%uHal0_`jVZONRI*3G+l&PrUB;;KBDilI^@A(a{Z9LiPf z66wMo^PH}77p4nw|BlT8Ha9l#X*aI^a__t5AWH>DG5!xk2S39#2eECJDRj-X)|dGG zSi(~G>f7#o*y3EHOH@yAg)wg@J+nycWG&!}CYn1Y;dkWul!2_wsCZoGy1B=Z-C~WbGjU{Ve}Cnj8?BMu z?ZPh-d(nUgT@T^NaDBcM*fKG)Uv1xkBg%u1o;nvsy+#JJ? z&~Rf6cg1jT%(uz)g6lyNv0$^w&F82eeoz3zHPVCreR!1b={JrmPv zU`NF;O}pWmVQU{X@)&8U7^YdMK6QPCs9c}9K6icL`VyE941lcxcFZQ%*RF3&RL254 zE`sX+Fk!xC+YfUq3QT5T9A}N-ch}!y1U)M9Kdyhx5u5-FFZHyH>6$a=_8b4T!Hi%a zBg$7*R?Ll18b6ft?EMG^B-{ zZtBAc9jBhO))-Yf&I?M7h>N09qYhU`;fJT{2z4ajH45yk4eDqW_cP7`_F%$yhN@Y5 zlHnHxJ2+rwoso+COfib}ikqV1j(e+S)k%gQ0_@rsi`yX^Z}B5tJqS};YKEGrW~td~ z4zP29od@iEU>5+paI<=_dWbqfov0oP3@yb*U^fE07uW;B-kSA_t@_20a?R%5NhMg0 zIi*7seqV|wuS4Dgjnc-6pds^_aob+SLM&t5VHI#5*8{Y56-D>Djrgr!au49~$nmCQ zad-6&(O0yGmo~L_;m1bp3&N2~(#DnE7N;hw#ZsiyyNaKkUK}Z?qLyOqbG1w@2X+at z_0ihrYNc9(Rm{~Y6`lK~z%JXMPFL|O)ysjc(?`w4LhAANo_X^flA1H(^@@qAizVz-;b zf~Jm!=2k3CE-q{Az+1M1DXD0hit;jw($jN`0{Q8I!rb)K)YO8)?9{yU=&QWc-d_cK ze-+sN)#ydN$d`3z3D$8(x{R_o>T0}wS3OF_Ej--fx<=f;>k$>#@lv-W^S&Guvq2?I zEsK)!ux@+%iliA>wKu7xsU9zi$Llq%88}wOGhuO+9n=$5bl&j~PE}7!d~k+(ruo1m zV@h>>c#3MwH?O&1$bc}uv>xM0_~vE{r<;0WUH+W5 z-TYg{u90s8dYK1vz}JZZqd?sqy@N-+NyWH8FwLmls@|sJY3=@kq9$=|D@ssRT|3H4Z=~@+h#!HmgsoF;&#BJ?dmPvkz+MFQ67b&y6+Kxv z%VI@J%$xIKn5^Bh%sts!3-xx!Fy!qCybn$Dz&Ke+WVgk~*VQ-0EWH8j$@S`6z>J!e zzMe0pP~Q{A`F-^RU{3>kK4zRhRzDM#@)Pw_V9x-1c7yu4FwW2QopH9v{Z9Qcu_v_2 zKMR}ug0RV_Txl3^tbX6?xJ@njLuko=fNhI63xBKssQ;?yc3uVc3b2en^@uvkA+3}(l{h0x3Ku-^*-X)#%ak~iZ)(L)dE^jOViS| z3@ua3(z3N2?I7)7?GSB(Hc>lNo22Dxd0M_!pcQIG+GK5tR;*3crfDTwsaB?yYZcmI zTBTN{RckfcbZv$)cxX|uIC+FWg(7Saya>a=>TL2J~)+I($+woq%*j?flq&DvtE zMQhdCv?W@*)}eK3UD{G@nYLV8p&hBM)K+P$wWGA7HC+R3jdqN7tahAsymo?iqIQyY zvUZAgs&<-oy0%t3LpxJDOFLUTM>|(LPdi_`K)X=8NV{0OM7vbGOuJlLr>)mEXdAUn z+GcHwc7=AOc9phOyIQ+OyH>kSyI#9NyHUGIyIH$MyH&eQyIs3OyHmSMyIZ?QyH~qU zyI*@idr*5wdsur!dsKT&dt7@$ds2H!ds=%&dscf+dtQ4%dr^By+orv&y`sIUy{5gc zy`jCSy`{aay`#OWy{EmeeV~1)eWZP?eWHD;eWrb`eW87+eWiV^eWQJ=eW!h|{hFx}7raQ}>?apx@=R&U_&x*n zIj}E);i~d0U|$3K2H3a2z616>upfZ^2<#_dKLh&(*ss8T1NJ+xKY*bf`V-h+!2SmI z53qlMOTYez15X7W03HOM26)2~&j6kYJPUX>@EqU=0Y4b{A;2d9UZunj1wILQF7Q0y`G7Yj z@j~E5z$XKr0=yXbRN&KqmjEvXUIut460ZQf6Ny&>uL52TyaxDm!0V6rOyIS^X91rL zd=Burz~=$pdBhI~UI)A$cmwc8;9=nNfiD2Q5b$mzegyDEz?*?D2Hpa^6?hx)CBWN( zcL47M-UWDr5nl#;Iq((0j|9FF_$uJ5fgc6@Xy7_<0KNwJF~E-nejM=Qfu8{UMBpa@ zKNBJz@GsAB=Dzz zKMnjD;Lieo4*2uHUjY6h@RxvZ1O77bSAf3?{59aO1AhbXZWR6&;N2+v9pLW*e-HTk zfVZFU4}pIK{A1vs0RI&DXMh)<@GpRW3H&SIUjzRJ__x5n1O7emAAtV|{3qZ)>tiB^ zHr%;*Xu~^{7+2YK;wO(??ct79t8xplE;3d-&MgU56-=wLfC~ih-rE6J=1+-&Oco#m zx`QB+%JTAR3(r&mG-5lTnu?0@%Id-btj(NTT~uCK8pT>F8tmJ>!Svjc;(}0aeD@Us zaDQUlEF{KJRaICWs>scs7AnmxD=sR;lFxWURH&k|u&8*ZMNXAyG%nhxurv>8h&8PW z6_;U)@`4(y?VMLrR!~xCwVWOqh`7iIyDKcq#Tw8dtP)*Ni2W6WDhsR1Ybx^#qXVfG z4Fb`wdVs{vkoCy;;(+|b?)S7^EsmVfjew2hE`aeKP6ONSx{JM5gHN=2NE+% zh{iChR#nxO#!pOrFJR?)Q{%zH0&G+d*rw!Gis{2D*yW`aRiT37C;s#V9GLqEu}lQ+zPBso}X)!BQKnZBQWZY z=T;P>V3pKbV?R=~4R&u^m7iM{5>jKzT?mIzh-6@i^9X5CCa)Ille)JzR4OujA@5di zx_}-<#F?+8swT|nv@BS)N-!o=RXn*Ygj_DJE-5UA$952Af z^$KojQmC> zS6rGqIR?I7fF~t@7Zg^Ml-G)h50#XgLTe%4B%nw423=8JRgGLm+gODRx7u7G+6+o) zW7)w34sPuoE`fj73b-LX;uG8pi3zm&zCpn5l>l3SvmEEQZWa&&6Cf<=;sx?H0X8ZD ztTZ>jylN)8g($bGb1NqoM)m8??VCgl2DT|OTmt$ECCWb_$nd4gVtn zG%5yEP+L-*hvu>r<+wNx{a$r#cW3*lXfkxWCN-6nLixK9@r3~1FAf+TV#FE?v8jkt z`L6}&{xMMWxzo^e7Zg`v7+6~+0=LN}C_jS5(aHEuG#VFcgdVu6uyT4K%DdH(P@1Zc zh{DhY$3n>;yA1>54|DLACdW_ZF9LX2tefp2LwTqR7FU1oh8r))Fauf)v+~MIOyg?- z|0#g`#c(4bW#yrY;wZL%1VH~7fEZ8+-AFZ>=LixH5ip};FoJoZ8O7C8P(5+zxs?SW zoY+bXu%f*4aM5P(SR1rW7%hgXYb&B?6#=qW48({f4cB3H>=Y1#;~)%wi+xp>mzTu5 zMUN&RLw3>Phi_t?Um;o3y_Q9Fkh zJ}Ww`F#zUAvfEl@!M&#H{uqO$yI6fg;<7BoXfr5MiJBn0bG2OZahV2$hf!avOi;Gahsl^9y zo+8mCCB8|1WuXw-;y$Z7ts6l0*x~tTX%aZ1?YkCpfReAyM+pjwNn8KU^N=O=rY(- zBN`5iZy4oi#k9!+NdjMIZbwo~#}fUPXSM)M;7N?6c%w2;z$NfK24@;L9BL%I#l=^G zq}PeIBjTx#YgDp`LTJ=0 zLtCtV3d?X^AB)dCr-)Vw3O%C|?Go~RJKaBBfbLJK@S56&g-I27OSQDurXBwFxkpj%G!K4+2rg0sGs%r8uIcE5*xX5f>PnaT!o87~-QD7R}jV9!M zL_AQLEiKz3AiK|*F-tpO=vAUoKT;j;5T}qR5*)WZCr zfF0I59Y#hqW~&|%;N!=%bTv1RO-fFRPhb^SOerrbEJvH$OH#t~xM+M}kBzIR@2KHZ zqG3vp4QJ$HZhA*;pA~Hn#bTd$PN}41dTCNtN-9!rWF9AnTf*&iB6o}n{1RLjBJFuK zlZ^=$4pW3VC56)qqqFwHZXuhQor&vM5l13MG>w@56e%-{_1grpLw1$2$XI zQN%==h3Qp+DP!lDM9N#3Xk5|YR!44JqRjJ#Krw08P(*_xgIgFM3869;q!vMM3v7A2 ziOo=4YiNdkMOpQpz?Z&j_zGQbiX7QguxMIY|Q_=?LS#-viD?c*117Pe1zV|?b+ z8yQVBHIs2QhT+@)*V=UlG?g^*pvHzm@<2d(ReJBeBtR$$kWdAw5kg520w>{AqNns; z)Fgm(5kXY!y?3!!6s3f!pq_f3dVc#7f_S#`?)xhwWPdwvc4lXGW_CjGhx1I6&o>C; z{R1I|7jQxlKuiOV^#B43#FO9!!wZNTfx$F?%q&Sg5e9` z;a@KA=fj;sVLRmuHvh?poM5~ZJYM?;(>sBU2TV;2#FHEZ32T%LJW}TeBXM}%sR5iI zrbPBo^6*g09}I;fS^OxXU~}d>%b#3TloE{drJ{cR@DscP77T2oUX!sVlqx*zN>IqDi7Xb$+nRwC6z)&ZU=5uz5P&G{#!DGOl@Lw&gy z3rK+dLM<(UFX$8y@NH$YgOR?itY1Om3z|S#9pUlc)*Hcic+Z(w87D64`AO@Ji>b#jQ0SB#(VUZy^zlPea~uYuYnxT=c?oYl|j zY)~{982@j89UMVu5kCF{g9uPDUmB4l7~A6~u=!%hTN@0)iI)fCJNxkA0i1az*^vSx zf2l0rX2%p{tfv=9PdgGYfda`{@w0ToGRmXU8Pw(3uV+f2lg( zrgIV*_!Jm|zktG3Fb?+Lancc_RAI_Kk9eV&FeL8ZK?VR>O^riIgis?x zkZ0l*-TjT;%>Tdw*unS;tvN6x=HIaZ_9nk%YCeqkGukvoE^(f4;U0K)UQOJW*hMfl z>EBU{_x14LCENgqfhmXIeuer{cn0E6%rGgf6IG|UAfN>B9_2f-~vjC1UhpJ26X-j229Zz5YfYe$|~Nb zJ*9*kb@D$D$@82AizguR3=H_M^u-s?0|bU;GG&4~52O8zNu9z&9vWPo=?QGcWSH&J zf29u;rTb3mbLW3$AMdsSxTYas-*p)9%X97&p_vk6;0ZT4`vD^lAJ%~W@bg4d9Q|8A zd|V#hB-`MFxgXAl{<9%16Kc|jwwsCm= zT^oY4GpNNOID@delaC+~fqDdEei^0t4hKP~MnB+F{lFx3Phh0)n!c|bq4}o`UN#-B z|8oNIUI%c-{FHA)^}(>;b!oo^8;bGeU&g?O0-1ItVBmyS#z4&=p=fun?*t0@puH-cFg&4750mW&Mw_z-Hsa-v@x9 z#1Tn255Z=GmV}Z1^(suwnhI!>h7nDFOxtJc3J%WTvW;MGMa#h$WlRnTybAnQ3PU%)%&vmdSrcJc*xNfT?L62Sp<5>J0&R4`s1BNmFIhfDltY~c*!Q|%<{o%=LAzGfaOW!1nvFQIrvV}J>`mF8>^o?^Fu>?Wv(L zG!X`O`7iVW4;A+Nrle%ielV!(e*v91M}x|<$$Sqw@ISK_c9nRcM*(Yt|1+TzPM8w` z4L|J$-oWs(ml)evxIISl$Z1UEbS82J6Nzj@*P`pt_2>q4Bf5!+oXJGaVj^cVk@J|y`Ann; z-0}<+MW%;S;+<$zdJ-)@o}2`37V>*YlA}KFB?{U!qWBF*b>czmR-N!9a`+Pd2k;k@ zLqIoAP)|UO=KUvxmP$^78@uw}feSC7uE1&HKu4JP*QZJO0<}ZPc5_CgKsY+kdq5XI z^lm0{P7Qi56FCjf!_fxd~pg}#lxgTBi| zE?^=hm`F(`av>8b%|y!lceeg_RzCUcvHQ?mn3erZq|}dCIr7=SXXvrd+4BPZ^79W~ zqe189AM)!j^hXE*2|?2!AenMZq&yR;z(guCkxERYGR&`kARf@HsiZ-3p?QCQCfl zkP4)YfVM!YkQ%fIS`4W}8jvQW#Y8SnZn8mZ4j8ZeQDOr#NbuNFw>wG{@Poq{OI*mz1bB_ba5_?6&)i~+5O zBgwdAe@YT)@R|&CQGDt@1RaP%Q4s&*sr{!WKjecrhbK_t)4+}OsQ_?8L9hwHU4{QP zBT&-FBr=`6Bq2PKmb}71U)R6@To#K;rAP5-(ut=mR1ZULl_0k&ZN49OzJJrfnc#A_j5=J3WMjoFNw`(u9dLVG0W34|(x+P^9TkwzSs6QJ2wlL7(Yl`jq_`^5vs}hOn03-sk^rH}C}FFBE!YjAII& zPNV9^Oa%<$16qC;@Rx|tzhi=sAO@^ybU2-?n;>9M2owf-fA~8%Pwhmeat%fp~NM|MzkQNE6u|7~72e`x!xVJv!L|PIZKCZ`;;VVYO zl!OG(7MZV8L~=CT_6NwZ)E7f0PV_($zxWr4LXRi&)qFjI(g0;bSx`2V1LZQ2K#K58 zqz@D6$3zBAwsD0Dpc0t$LZ}ETW+GjgNE{RCRtJ?rWl%X22}I3JGj90{VzI#+vY@aVmP>0MFYlE<{hZ>kj0u$-QM0$gE^!9udgtwxvV+ticO0d!`(Dtv5Z-;h3JDEr#6G>tsec|ya zK7fzq7bNV14t)h;S~_$DI+}5biS%b812Qxw=)Vq~L_*8M(=z5|Ob;Zc zL`IUyz-zdHhUSV%EQBeFBc~+?f!B#yYsD92%*a62N=jwS%$SoQ?1v{h1D^FzYhj%?|J$wiGJ%i}+ka&qrm<%9ss=SC<#-C#EF>=g1ca zgE`XTqpmMntgaEnCzT2Y2JrtRCr?aRtF8&K`C*3}+B$P}_4EM^{xK9f89W(}7GffZ zTRQ3^z&A)(`ZE>9EUzas1=UMF6J zPBM|;O4(2y?(^_?1$`YK;yIC&l-SULcc?=pw~Gl&z~MDB{*7wHmtBr+m0 zF7iU;cagUu??gU`d=#B8swk=?swrwDYA=cv^%38YUVc8YQ|+lqR}DG*h%d zbc1NCXou)=(MzINM6Zfo7riNZTl9%&uV}yMfas9ui0D%k3Z;)CpdwLgQAMaqR5hvw zRflRoHKCeOdrfT+bf5UJP%PTS4s z7IYiB9laBM0DTsmB(I{cgCpYu^h0zv`U$!h-G_dPeg(~g7DBR+JfsB96l&mfU;>#z zmXI}M3%Nsh$O|GuzK}l@1w})^mxHKKBG2W@1G`l*@LwvRjZg#B2sJ^?&>rYCyuCpe z!9LarU4w2wJy0LSg$AKvXcT$|jYBWQq{J-6JjIra6^QK=yC>Eo)+^R8#uXbA8y9;a z_ECJExQIAP91<57mk^f{R})_>t|6`^t|P7|ZXj+XP83fN&lIl}KP-Mh{Fe9~@q6MA z#2<=xiw}#Bia!${7k?rCyZGw`iVMsage@pruzSI&1(z3GUvP85?FDxi^euQJfsmLl zAub^;p(3$JLR~^r!cM|RB3yzlQ6y0!Q6^C#u~C90aYf>e#AAsbi9QLg#Gu5m#2d+J zlCve}O3srMk(7{>l2nqkm&8g&NiLU6mQ0cSMKVKjjbx!@v1F-axnzxGon*V@PRS0* zJ(71NpGXc%Es&Cy!b$~8EtO(Q6-d=c)k!r-HAyu~wMex}ZI{|1wM*)Z)H$gOQkSHz zNL`h>E_GAtw$xpz`%P2MZ^fBoZ z(r2a5OJ9_}Ed5w|Ncy$(JLwP7A7y69%#@ieGgn4RMoC6j#z@9Q#!SXq##Y8&#!<#s zW~oe^OrlJZ3|%HoCS7Kw%xak$nWHiJSwGnTS(^|9(viD@)%c0~{a6`a^-R?IgVVF+-AA0a@*w&$(@utEq7M#yxdi}>vA{cZp+=3 zpCKJJg0a;@si>l#a_h^N~%gaO4dqPC6bb#Qh-vBQn1oer7)!k zr6?tu5<_X7Qjro{sZnW%(h;SjO2?E=DBV%Ir}RMSp;EWf6QyCLS4wY`-YUIQ`k?et zSx8w#8Kn#E>dn* zKB7FX{6PhwGED`kGD~HSinxk}inEH3O0ddOl`xeEm2E1!RW7PrRpF|9R5et!Q*}`# zs`{$>s|Kn@sK%%!sHUo>siv#0R4rGnRc%&nQEgS-uDVBcpXveC!>UJBKiy{y`) z+NC<8`c!pH^||Ux)mN%-RNt!2R-3CfPfbJ(ttPG}sV1!^t7fi-Rr6BwQ6s7OsRgJ7 zsgc#9)hKFlY6)sIwdHE*Y87hrY8TaBs=Z${bJ1+|1oc$)EcHV5jp{Y(t?K*KFRNcw zzoC9h{jU0bjd>aiG~_juG*mSfYiMd{YglMlYuIYoYv47OXe`wT(}>WB)%ZmtO(R`n zrACfMo<@O2kw&G)W{p~ndW|O<iSW|d}*X1!*UW}D^?&0U&%H1}!tX};GI*OJpx)Kbw>(=ya@ z(86fBXt`;5YI$i9wfwZmS}|I2T2!q>tt71!trc1ftxT;_tv0O_T935eYtPme(^k}0 z(^l8k($?2D(l*sL*Y?(q)lSy_Rl8WbOnZa&CT)&(mG)Kbd)kk+d$qaRL)s(Se`x=y z{XzSqj*yOs4oU~o5!X@DQPo+bqpqW`W20lQCoA$b4=%?&KaF^ zI*)ap>(10w)V0#J)wS1k(skAi)s4}m>89&e>2B5Crn_Btr|xdu3%Zweuj*dcy`_6c z_p$DP?y&At-ErL)x*zp~^k(SI)DzQNpeL!fP;Zf*hMtz5j-H90qaIezMGvPJp-0w> z){E7P*Gth`p_i_=Qg6LpyWVcSZoNT$5q&Xz3w>vOg1(QwuYQ3368$LsX#H6Iczv4w za(#w=iGHPilYWQ(Vf|zJC-u+hpVz;xe^dXq{$2h1`d#{e8b}&g8W0V_3?dE41~CS4 z1_=hK2I&T?444LM4T=oP4K^5TGN>}BF{n3aG}vyi&)~Gd1%pclR}5|#+%~vp@W7zo z;F-ZYgTD-g3}+b5G@NZHYp7wUX{cqWV`yn;V`y*aWaw<@Y8Y%tHjFh)FibQ|GF)x= zo8fxHEW>=mBEwR{a>HuFErz=d4;UUYJYsm#@QmSk!;6Lw4Y`Idjb<3lGMZ~N-w0(S zW+Y*>&`8!u$4C$S#H5LlxsjETt&xKf#>m+y#E4;(X;fu&#OS&4bYppAEn{nAJ7Y&< ztg)-HyD{F_+n8ibHjXilGo~6ZH>Ml^V$3jJX}sFF+4!{an2E9p#w5X{$>h38w@IJL zfXT4Qn8^#1S0-;vXPC}3ooy;?YH#XkN-*^{C7EWMR+w%w<(O8R)|%Fv9y2{}ddalY z^qMKx^sU)+vzcbI&E}ZRGZQtFHPbh9GQ*m=nt7Xrm_?XT&3-W}GTUI*Zg$4(hS_bi zduCl`-DXeBKA6umpJP7HT*O?(e37}jxrVv6xt_VTxvjZ_Io_OX9%CM7PBmX{PB;I> zoMFDwJi~mg`Fit8^UdaU=8fjf=G)A-o9{H=ZNAU^p!pH=W9FC5JI$||-?R|1kg<@n zP_R(8SYi=l5o-}|L9=MK*kiHJ;(*0ri`SOZEs>V9EazHASkf$)TP9nkTJEwuW_iN$ zl;v3~AuACploe#Pz{<-i#46M(+$zed%Bsbx)oQ!dPOEXN4^|(og{)^-+giI@fz~P3tE`#Uzge%h-eBEsz0-QP^*-x^)~~GpvYBPG$VSJ;!zRLpW|L%-Vza^~ z-DaiDdYf#UJevZWYMUCHdYdMjtv0e$;-<{)PQ3 z`#5Q32!}X_6%OeRs~ngPzd5XTsC8&@Xmi-%u*>0; z!x@M34woD{9p^YgjtY*-j%tqTj#`d7j^GltqpxFtV~}H;sz**Up7`8owTg*b&dk)2|k;+ztk7*4-B zt#V>I9dtV9biwJ8QzvFVMjE4pQN=9AXkrX7#uzhPzqMPTP+#j%oDX{;Pp6}t$lfz`(9VhPwJY$>({+kxGSJ%BxgJ&iqs zJ%_!8eT032?ZXaWhp{iQud#2j@39}9g`7p4QO=O_0_Q;IWzI3qvCaw3`bl6)z}40j>+0(2?uvKybq#P`;=0r|%$4C+h~_T>r#P$02dEal$we9116cTa0tS#o$tLt8rPlTwDRJ7*~d?z}4Wk;r8NA z;5uBGvHAg`)*xsLvAnJUb+3@_Rj4u_gU_9-RHZb+{N4%xEr_=-J{(z z+_T;D+zZ`{-8t^f?(Oco-1oTecR%KS(*2D4dH0L%{qFBQq&(C-7I`f8(C{$zF!M0? zu=H^90F5y{f%_H4oy+?`1Hjf(~-5!G;Z#~|7eDs{=iS(T9 zDeNiYiS`upl=sx|H1@Rfbo2D}4D*chT;ZAK$?*KuGuyMov)pr|C)=~iv&nO-XRBws z=Pu9Pp4U8I;%DI%@fvt-ydK^FZw;#Ryg(4m4I6pug|LFaB>YCmBxDmR z2pb3+2`oYrVJBfXVIScj;RxY4;S!;faGh|AaF_6a@Q^S}7$rO-JonP}vhcFw(upuWqj%Zv}5{Z(VPFZzJzG?-kxFy)(SmdS`j(dKY*Xc{h8X z@ILQ--Mibn&wIdo*n7=Wt}?i1^i?33ZM z&L_(!*Qdy*)ThE{qt6bX3qCh}9{G&;jQhOwdF}Jg=P#lVaXL|$xPYik%p~Rz^NB^o zQep*h6Olu#Ce{)gh+Bv)#5Up%Vh3?A@c{8K@fh(W@eJ`i@e;9I?ab`zraW_^SD;`$qWEe3$zs`=I+az>L8Bz{0@dz_P%Lfp-J%2X+N^2gwC# z25ATB1{nmU1g#1BEogmEcF>ie2SE>mx`TR_s4UT6Vz|V3iP@4pOHM91z2xkY3&FTx zzuJ4!doAc`859E0xlFlF>812j1}H<65z6nB zHam)!+OfK^`mq+V*0FZ64zZY6=U75)a4b1CCN?gX8oNA} z5xX)rBX&*fy4cLv+Sv24cVa)r&5ncO6ynt5G~=}6bmR2nEaI%=?BX2aFmcXtgt*{1 za$HPYTpTrSc^o5dWn4zwnz(gwnQ=vNo8s!?+T-@e9f~^|cOvd|+?BX%aW~^`$K8v2 z5cfJ>E?z617#|!T6~8>55x+7%BYtiC`uM{5lKArY4e_jaPJBarTl~TJQ}JixFT`Jt zzZ!opzAL^v{z-gaJU2loK|R4VVQE5i0zF}6LPo;cg!Kv82_*^T2^$kw36%-e2?r9M zB#codsftt$sv*^m>PmH|;;G(L5;cSxMvbJBsWH@8YBF^-HJe&Nt)|ve8>m~TEz}O` zUg`nrA?i`;aq0!?O=>rFl=_PL2lXBGFPac-E^R&yMT2MyXp%HTS|BZ&R!G}OYozU< z9ig42U7%g2U8UWibuNDN!|XaiV6TNuqh8RiaIz zeWFt$HZd%bnpmEAIPpy4xuge4eM#dn0l{8zoyO zceHVQX zeINZG{V@G5{bS1f6q6L&6!#QTihoK_N=Qmr3MC~zg_g2Bg`Sd{vN|O@r8H%8N^?p} zN^8pYlpQGtQVypaOF5BpI^}H2)s%-R+?1h|(Uh^27b)*j{z?@}ot`=~b#^K`RVGzE z)hN{@)jZWI)i%{3)gzUV>XS-J^-m2-4NfHk)rd_?PFtClnO2ronO2=vlUA43kk*#A zBdsHCPul*pgK4MIuBF{idzkh(tv8LEHkS4x?N!>Fv_I3{Gms1sh73cMv6!LB&|&B^ zEEv`dJB9-T!*FI07{LrOBZd*jpfZ*-7>t#S48|J9Iz}d=h{0miG1?jX8HX5087CO0 z8CMwB7&jTW8TS|u7=4UqjCbiX(r2a5O`o5RN?({Ro34_8Pl&P4hm1&;okcr83$#l!~%=F6) z%nZ(4ni-xMnHis%lDQ@`H?ttKII}EsL+0kpy3EGREtxHut(ki=Ph?)oyqDRN*`GO> zIgk#Cd)p{Da$#FkmZx*o8_Mslogys&PvK! zot2f9la-fMkX4kmDT|X;omG=npVgSPJ?l``>8x{E7qhNpUCX+k^)TykR!>%c)jNQ?9l9(?B&^v?9A+j@~KIRJL&d8maE1D~ntCXvoYnE%7Ym;lA>y+z}OUU)fCFT0(2IfZO z#^tWaW#;~to0*%Fo1a^eyD68GTa{arTbH{ncTeug+)KHgxz}@V<=)MGlG~R%kUNw+ zn)@toPM&_AZQimxTHcDhb$JDO#d&3U8}e9rb$N|>&3P?(ZF%i^`}0obUCq0f*Ok|u z*OS+u_bl&u-tT#@^WNsY%b$^t&X>-Y%U8@-$zPPOmv5MFl5du8nQxts&By2a=SSsJ z^5gSq`Sko>@)`NR=4a>U=I7@Z<)6vFk$)@yPX7G@@dBj+?E<|5!vd26^8%{^=K@@T zM**S0r@*(szhF&4dqH=hXrXPPdm+BitB_deR~S$jUbw7~QW#%IEle-WC|p~(zA(42 zps={Gw6LbIqwsFwlfq|(FAHB6zAgN#2vIb>2w5ajBvYhbq*bI_WKd*WWL9KZE?<#d^ht#m2?X#gWB{#mkG6is{A7;x)x< zi`NyG6qgp46;~A371tLx6gL&O7w;`B?HvcJlwm(MJpQ!ZRCRW4VqSgum8UanQHTdrSjTkc(+Qog1< zvplCfzr3Wptb9ZHrt;eIBjsnyFO**{?<{{@-doNsA1WWMSX7}`VO`-=;aq{M@TeeG z_*Dc}1XnDrSX)tD(NfV-vA5zt#i5Gx6}KzyRdiK!SM*f$R}5CXs`#VgUB!orj~j$G zOy7XqptZqe19d~$hK>#QHuSLOvgWf;EHRb@YavUPrNB~Vsj<{qS}a|b0n3ly1g>vz^0)}O2oYy^8cdnS7hdmdYq4Y3!nrPwlTdA1T;mA#m)$<|@( zvyIrMYzwwE+m7wX#@apDdl{R;j%U-@N$eE%3U)es6`RTa zjh)HPVdt}p*rn_W_9ixmUCpj#H?X&`Ti9*v9qbPFUiJa@VfHchN%k4`dG;lCC;K}4 z7W*#y0s9gA3A>Lyz#e8lWskF8vR|{`vfr~ma;9;RoY@>ke+mdU=$v0T z49-eU24^j2Jtv!!$0_8LaLPFwIc!c9r-oC{Y2s|!`rr#a_1 z7dclr*ElyhcR2Ss4>^xHy&NuQh%?F=TT7#YK>~cYU66J>cHwH)xT6{ zRIjPtTD_}!clGV+?&>GiA2-k5Ja@D8X6$B{&C544HvhW$=;m{qFKm8SGoxl^ja3b% z#<_-4lT<^m;nXzLG}TfuNwXb!ojj3H;n_Qb;TT#2Qc5m&m+7q=; zYKLn_>*m&p)h(#Aufx^3*U{=$)G_KR>l*8})LpB)U)NRlwtiaujC!Sd&3f&6&w9W5 zfO=Z}ih4$UMSXRBP5t@$>-9J5-!~u|W;K{K*f%&fENzHxpfqGRlr)qz9Beq%aHio& z!*IiB<>OHy&*~*Lb0Eu$Axh91sizde= zOjCSQO4Bb*o0@8y>YGkAU2f`Zdb?%XmKj@&wpeem-4eEivL$Xy;g*eCSX&NlIlblV zmWNxoTLznjn&&ppYc^@NZMJU?Xbx|VY-TjCZC=-0-`v`~z4?6e_2!$+&zt{je!o?9 ztIk%vt*%?Ww-UF~x31i}dh7nJC$^s2I@wQjqz?asD)twODH zTj#afv^uxCwvt<^t%-4@gq+?Lk1rtP=3 z-EBwOjy#@e25SKh9*U1vLSd+_$9+tauIwtfBf=IuMTcWi&Sox6Ro9cq_pmuq)y zcW?J>PibG(p3z?0-qPOMey;sm`;GQLcTC@b+@ZU}Y=^~;s2vGAXgdmbY}~=xacalq z9i2Pg>_qIGwsY}L{hfw819pb*jNG|yXTi>*ot-=H?!3Qi;V$J}s=J(adF;aPTCt0{ zYwfO0yJ~mU@4C0EXIEc`aEEw@M2A_2eTQR5Y)5iOO2@{InvS}TGaa2B*E(KwyzBU| zTWPoEZtdMmcSrB0?B1|@^X}T+H+FaJezZq%kH#LYJqdeK_pI2nch9jsC-(fgcluuB zUe~?edx?8D?ycEdxA*?u-o5?%)b|`o{hy646&)#pl-(^2; z|C;@|`}6l-+kbz5*8!0Ok_Q$ZARP!f5PG2MK+}Qd1CI_292h#NebD5f*+J^TUk;`n z+;{N!!IKByA3`3Qb;$OR%OTvMm50_J$~tuT(3wN$4!t>yI6UpJ;bE)8HisF9*B)MX zc<`25B&XI;AO-F7Y=|1x0sLWB-ql=D)99?!a=4koRs-v5a zK0Z2hbmW-kF{5K9$6}8qA4@s5^Vq>-hmZY!?8C8-$AgcPk4GQhc6|5oy~kf3e}DY1 z6V@lNCtObCpQt#o@x+4@eJ8jl7oXHWX?T)$a>Yr;$tx%CoV<5R_LSPG#iy2@iatd- z)pDxi)SlBbPR~CrdOGYh<#gQX1E)`(K7D5P8T1*kGZAOv&Lo`KdS=&|-Df_Woq2Zl zS<=~%v!Q2O&+a+9?;PUXoO8nGe9kR77jmxc+}?Bh&!f&SJTG&8`FY0qU(cU9fBAgp zg@qTCFQ{Hfzwq0I^%rhkcy!_MMeU0w7tJoFU;ORj`ir+NKDzk$lFB9ROS+fVT`IU# zbm{j?A1-~o9C|tCa_r>;mrq_keMR(&)D`I~VOJ!UXuZ@Ay^yurRvf1~ln`HJ4tua@2tFY zC5o1GNWH4-y{G9vpvg;lZV@d0h*-B)gV& zMR!rU+Pe03?e7}zdfWBxq5VVLL-&WJ4>=F39*#eJ`|#Z(>?8amuSe`h^^Y1KJ$v-# z(c5lJw`Vt@ySjTz_tx&$-5(zdJq~_MejNSy@Z&R&&pnZOqWWaflhh}xpD>@?c+&Oc zQIB4ad5=|(ZI68quE)KH*7Ix6%AQp{89n(uWj(-Q>8b3g?`i7U+SA&zz2{KRk)C5c zCwo5j&g&KFMfHmH`u9flF6)iyjq7dc-Pe1%_gwGA-YdP=dT;jL>Fw(s=pF8T+B@F+ zviEiGAAQ1oYJKK?m_DDru)d7G?7p17yuM9+oWAP5+P;RqroR1sC;CqIo$2fByV>`! z?@{05zNdZ9`o{X6_x;uPu^-VttzWcXwqK!NxnHecy0+2XF%(1B3ye z0pEdufh7a+1GItV1IYua18D=l4y+zv4y+x>AJ{msW8mDt!+{rra|cxh^#)0UO9q1n zV+Vg3Ts6oX{B1CEuwbxwuxxO{;HJUG!7YPZ2U`aR27e!XJ^07qyCL%-?2yY4ZpdRO zd#GZFJybPRGt@ZLJhW}7ZKz}D;Lxd|%R~2vx`%p(`iF*xo(_!>1fVa%|+}$eEGzBNs<* zj@%yU8W|cHA9*?QdgSdWVs!fG%+Wcc!lUA&lA{Wv+M`CJrlS_4)}v0N*iqL}_fgML z(rCyi`PqeMm!I8!*7t1W*^6f%$L5WRjzMD!#-zq%#^lGe#&pN@$Bf2I$IQnp$E?S~ z$JURvkKG^Z9UB?@eeBIRVtm&4ym7^G<#Ek%qjA%5^Kr{@r*XgW!13Vm(D8_I@_5X6 z+&Fc7`FQep#`v1?-^Me?kB?s&zdC+>{MLBSc;7g8eCWCIbG_#V&yAj&K41QP)$@$! hYo4!re)xIk^PA7_^GhhFP2<0ciBFVNPP{zt`X5|1Kc)Zx diff --git a/mySIMBL.xcodeproj/xcuserdata/w0lf.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/mySIMBL.xcodeproj/xcuserdata/w0lf.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index e5126bb..8f94031 100644 --- a/mySIMBL.xcodeproj/xcuserdata/w0lf.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/mySIMBL.xcodeproj/xcuserdata/w0lf.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -4,131 +4,13 @@ version = "2.0"> + BreakpointExtensionID = "Xcode.Breakpoint.ExceptionBreakpoint"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - + scope = "0" + stopOnStyle = "0"> diff --git a/mySIMBL/AppDelegate.h b/mySIMBL/AppDelegate.h index 72af8c9..3e20c21 100644 --- a/mySIMBL/AppDelegate.h +++ b/mySIMBL/AppDelegate.h @@ -14,14 +14,83 @@ #import "WAYAppStoreWindow.h" #import "SCEventListenerProtocol.h" #import "PFMoveApplication.h" +#import "shareClass.h" @interface AppDelegate : NSObject { SCEvents *_events; + shareClass *_sharedMethods; } +@property IBOutlet WAYAppStoreWindow *window; +@property IBOutlet NSWindow *srcWin; +@property IBOutlet SUUpdater *updater; +@property IBOutlet NSTabView *tabView; + +// Tab views +@property IBOutlet NSView *tabAbout; +@property IBOutlet NSView *tabPlugins; +@property IBOutlet NSView *tabSIMBL; +@property IBOutlet NSView *tabPreferences; +@property IBOutlet NSView *tabSIP; +@property IBOutlet NSView *tabSources; +@property IBOutlet NSView *tabDiscover; + +// Plugins view +@property IBOutlet NSTableView *tblView; +@property IBOutlet NSTableView *sourcesAllTable; +@property IBOutlet NSTableView *sourcesRepoTable; + +// Add source +@property IBOutlet NSButton *addsourcesAccept; +@property IBOutlet NSTextField *addsourcesTextFiled; + +// Sources view +@property IBOutlet NSView *sourcesRoot; +@property IBOutlet NSView *sourcesBundle; +@property IBOutlet NSScrollView *sourcesURLS; +@property IBOutlet NSScrollView *sourcesPlugins; +@property IBOutlet NSButton *sourcesPush; +@property IBOutlet NSButton *sourcesPop; +@property IBOutlet NSButton *sourcestoRoot; +@property IBOutlet NSButton *sourcesAdd; +@property IBOutlet NSButton *sourcesRefresh; + +// Tab bar items +@property IBOutlet NSButton *viewPlugins; +@property IBOutlet NSButton *viewPreferences; +@property IBOutlet NSButton *viewSources; +@property IBOutlet NSButton *viewDiscover; +@property IBOutlet NSButton *viewAbout; +@property IBOutlet NSButton *donateButton; + +// About view +@property IBOutlet NSTextField *appName; +@property IBOutlet NSTextField *appVersion; +@property IBOutlet NSTextField *appCopyright; +@property IBOutlet NSButton *gitButton; +@property IBOutlet NSButton *sourceButton; +@property IBOutlet NSButton *emailButton; +@property IBOutlet NSButton *webButton; +@property IBOutlet NSButton *showCredits; +@property IBOutlet NSButton *showChanges; +@property IBOutlet NSButton *showEULA; + +// Preferences view +@property IBOutlet NSButton *prefVibrant; +@property IBOutlet NSButton *prefTips; +@property IBOutlet NSButton *prefDonate; +@property IBOutlet NSButton *prefWindow; +@property IBOutlet NSPopUpButton *prefUpdateAuto; +@property IBOutlet NSPopUpButton *prefUpdateInterval; +@property IBOutlet NSPopUpButton *prefStartTab; +@property IBOutlet NSPopUpButton *SIMBLLogging; +@property IBOutlet NSTextView *changeLog; + - (void)setupEventListener; -- (void)installBundles:(NSArray*)pathArray; ++ (AppDelegate*) sharedInstance; +- (IBAction)pushView:(id)sender; +- (IBAction)popView:(id)sender; @end @@ -31,8 +100,4 @@ } + (id)sharedToolTipManager; - (void)setInitialToolTipDelay:(double)arg1; -@end - -@interface CustomTableCell : NSTableCellView - @end \ No newline at end of file diff --git a/mySIMBL/AppDelegate.m b/mySIMBL/AppDelegate.m index fa051d0..325c32f 100644 --- a/mySIMBL/AppDelegate.m +++ b/mySIMBL/AppDelegate.m @@ -8,68 +8,12 @@ #import "AppDelegate.h" +AppDelegate* myDelegate; NSMutableDictionary *myPreferences; -NSMutableArray *tableArray; +NSMutableArray *pluginsArray; NSMutableArray *confirmDelete; - -@interface AppDelegate () - -@property (nonatomic, strong) IBOutlet WAYAppStoreWindow *window; -@property (nonatomic, strong) IBOutlet NSTableView *tblView; -@property (nonatomic, strong) IBOutlet NSTabView *tabView; - -@property (nonatomic, strong) IBOutlet NSTextField *appName; -@property (nonatomic, strong) IBOutlet NSTextField *appVersion; -@property (nonatomic, strong) IBOutlet NSTextField *appCopyright; - -@property (nonatomic, strong) IBOutlet NSView *tabAbout; -@property (nonatomic, strong) IBOutlet NSView *tabPlugins; -@property (nonatomic, strong) IBOutlet NSView *tabSIMBL; -@property (nonatomic, strong) IBOutlet NSView *tabSIMBLInstalled; -@property (nonatomic, strong) IBOutlet NSView *tabPreferences; -@property (nonatomic, strong) IBOutlet NSView *tabSIP; -@property (nonatomic, strong) IBOutlet NSView *tabSources; -@property (nonatomic, strong) IBOutlet NSView *tabDiscover; - -@property (nonatomic, strong) IBOutlet NSButton *viewPlugins; -@property (nonatomic, strong) IBOutlet NSButton *viewPreferences; -@property (nonatomic, strong) IBOutlet NSButton *viewSources; -@property (nonatomic, strong) IBOutlet NSButton *viewDiscover; -@property (nonatomic, strong) IBOutlet NSButton *viewAbout; -@property (nonatomic, strong) IBOutlet NSButton *showCredits; -@property (nonatomic, strong) IBOutlet NSButton *showChanges; -@property (nonatomic, strong) IBOutlet NSButton *showEULA; -@property (nonatomic, strong) IBOutlet NSButton *donateButton; -@property (nonatomic, strong) IBOutlet NSButton *gitButton; -@property (nonatomic, strong) IBOutlet NSButton *emailButton; -@property (nonatomic, strong) IBOutlet NSButton *webButton; -@property (nonatomic, strong) IBOutlet NSButton *translateButton; - -@property (nonatomic, strong) IBOutlet NSPopUpButton *SIMBLLogging; - -// App preferences -@property (nonatomic, strong) IBOutlet NSButton *prefVibrant; -@property (nonatomic, strong) IBOutlet NSButton *prefTips; -@property (nonatomic, strong) IBOutlet NSButton *prefDonate; -@property (nonatomic, strong) IBOutlet NSButton *prefWindow; - -@property (nonatomic, strong) IBOutlet NSPopUpButton *prefUpdateAuto; -@property (nonatomic, strong) IBOutlet NSPopUpButton *prefUpdateInterval; - -@property IBOutlet NSTextView *changeLog; - -@end - -@interface CustomTableCell () - -@property (nonatomic, strong) IBOutlet NSButton* pluginDelete; -@property (nonatomic, strong) IBOutlet NSButton* pluginWeb; -@property (nonatomic, strong) IBOutlet NSButton* pluginStatus; -@property (nonatomic, strong) IBOutlet NSTextField* pluginName; -@property (nonatomic, strong) IBOutlet NSTextField* pluginDescription; -@property (nonatomic, strong) IBOutlet NSImageView* pluginImage; - -@end +NSArray *tabs; +NSArray *sourceItems; @implementation AppDelegate @@ -80,22 +24,29 @@ - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theAppl // Install bundle files - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames { - [self installBundles:filenames]; + [_sharedMethods installBundles:filenames]; } // App opened - (void)applicationWillFinishLaunching:(NSNotification *)aNotification { + myDelegate = self; + + tabs = [NSArray arrayWithObjects:_viewPlugins, _viewDiscover, _viewSources, _viewPreferences, _viewAbout, nil]; + sourceItems = [NSArray arrayWithObjects:_sourcesURLS, _sourcesPlugins, _sourcesBundle, nil]; + [_sourcesPush setEnabled:true]; + [_sourcesPop setEnabled:false]; myPreferences = [self getmyPrefs]; + _sharedMethods = [shareClass alloc]; + + [_sourcesRoot setSubviews:[[NSArray alloc] initWithObjects:_sourcesURLS, nil]]; [self setupWindow]; [self setupPrefstab]; - [self readPlugins]; + [_sharedMethods readPlugins:_tblView]; [self addLoginItem]; [self launchHelper]; // Setup plugin table - [_tblView setHeaderView:nil]; -// [_tblView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone]; [_tblView registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; [_donateButton setImage:[NSImage imageNamed:@"heart2.png"]]; @@ -103,6 +54,8 @@ - (void)applicationWillFinishLaunching:(NSNotification *)aNotification { PFMoveToApplicationsFolderIfNecessary(); [self setupEventListener]; + + [self.window makeKeyAndOrderFront:self]; } - (void)applicationWillTerminate:(NSNotification *)aNotification { @@ -210,32 +163,6 @@ - (NSMutableDictionary *)getmyPrefs { // return [NSMutableDictionary dictionaryWithContentsOfFile:plist_Dock]; } -- (IBAction)changeAutoUpdates:(id)sender { - int selected = (int)[(NSPopUpButton*)sender indexOfSelectedItem]; - if (selected == 0) - [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:false] forKey:@"SUEnableAutomaticChecks"]; - if (selected == 1) - { - [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:true] forKey:@"SUEnableAutomaticChecks"]; - [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:false] forKey:@"SUAutomaticallyUpdate"]; - } - if (selected == 2) - { - [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:true] forKey:@"SUEnableAutomaticChecks"]; - [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:true] forKey:@"SUAutomaticallyUpdate"]; - } -} - -- (IBAction)changeUpdateFrequency:(id)sender { - int selected = (int)[(NSPopUpButton*)sender selectedTag]; - [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:selected] forKey:@"SUScheduledCheckInterval"]; -} - -- (IBAction)changeSIMBLLogging:(id)sender { - NSString *logLevel = [NSString stringWithFormat:@"defaults write net.culater.SIMBL SIMBLLogLevel -int %ld", [_SIMBLLogging indexOfSelectedItem]]; - logLevel = [self runCommand:logLevel]; -} - - (void)setupWindow { if ([[NSProcessInfo processInfo] operatingSystemVersion].minorVersion < 10) { @@ -246,6 +173,14 @@ - (void)setupWindow { [_window setTitlebarAppearsTransparent:true]; } + if (![[myPreferences objectForKey:@"sources"] containsObject:@"https://w0lfschild.github.io/repo"]) + { + NSMutableArray *newArray = [NSMutableArray arrayWithArray:[myPreferences objectForKey:@"sources"]]; + [newArray addObject:@"https://w0lfschild.github.io/repo"]; + [[NSUserDefaults standardUserDefaults] setObject:newArray forKey:@"sources"]; + [myPreferences setObject:newArray forKey:@"sources"]; + } + if ([[myPreferences valueForKey:@"prefVibrant"] boolValue]) { Class vibrantClass=NSClassFromString(@"NSVisualEffectView"); @@ -262,15 +197,23 @@ - (void)setupWindow { [_window setMovableByWindowBackground:YES]; // Setup tab view - [self selectView:_viewPlugins]; + if ([[myPreferences valueForKey:@"prefStartTab"] integerValue] >= 0) + { + NSInteger tab = [[myPreferences valueForKey:@"prefStartTab"] integerValue]; + [self selectView:[tabs objectAtIndex:tab]]; + [_prefStartTab selectItemAtIndex:tab]; + } else { + [self selectView:_viewPlugins]; + [_prefStartTab selectItemAtIndex:0]; + } + [[_tabView tabViewItemAtIndex:0] setView:_tabPlugins]; [[_tabView tabViewItemAtIndex:1] setView:_tabDiscover]; [[_tabView tabViewItemAtIndex:2] setView:_tabSources]; [[_tabView tabViewItemAtIndex:3] setView:_tabPreferences]; [[_tabView tabViewItemAtIndex:4] setView:_tabAbout]; - NSTabViewItem* tabItem1 = [_tabView tabViewItemAtIndex:1]; - [tabItem1 setView:_tabSIMBLInstalled]; + NSTabViewItem* tabItem1 = [_tabView tabViewItemAtIndex:0]; if (![[NSFileManager defaultManager] fileExistsAtPath:@"/System/Library/ScriptingAdditions/SIMBL.osax"]) { if ([[NSProcessInfo processInfo] operatingSystemVersion].minorVersion >= 11) @@ -286,7 +229,7 @@ - (void)setupWindow { [task launch]; NSData *data = [file readDataToEndOfFile]; NSString *output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; -// NSLog(@"%@", output); + // NSLog(@"%@", output); if ([output containsString:@"Operation not permitted"]) [tabItem1 setView:_tabSIP]; else @@ -304,73 +247,6 @@ - (void)setupWindow { [[_changeLog textStorage] setAttributedString:[[NSAttributedString alloc] initWithPath:[[NSBundle mainBundle] pathForResource:@"Changelog" ofType:@"rtf"] documentAttributes:nil]]; } -- (IBAction)toggleVibrancy:(id)sender { - NSButton *btn = sender; - [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefVibrant"]; - Class vibrantClass=NSClassFromString(@"NSVisualEffectView"); - if (vibrantClass) - { - if ([btn state]) - { - NSVisualEffectView *vibrant=[[vibrantClass alloc] initWithFrame:[[_window contentView] bounds]]; - [vibrant setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; - [vibrant setBlendingMode:NSVisualEffectBlendingModeBehindWindow]; - if (![[_window.contentView subviews] containsObject:vibrant]) - [[_window contentView] addSubview:vibrant positioned:NSWindowBelow relativeTo:nil]; - } else { - for (NSVisualEffectView *v in (NSMutableArray *)[_window.contentView subviews]) - if ([v class] == vibrantClass) { - [v removeFromSuperview]; - break; - } - } - } -} - -- (IBAction)toggleTips:(id)sender { - NSButton *btn = sender; -// [myPreferences setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefTips"]; - [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefTips"]; - NSToolTipManager *test = [NSToolTipManager sharedToolTipManager]; - if ([btn state]) - [test setInitialToolTipDelay:0.1]; - else - [test setInitialToolTipDelay:2]; -} - -- (IBAction)toggleSaveWindow:(id)sender { - NSButton *btn = sender; -// [myPreferences setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefWindow"]; - [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefWindow"]; - if ([btn state]) - { - [[_window windowController] setShouldCascadeWindows:NO]; // Tell the controller to not cascade its windows. - [_window setFrameAutosaveName:[_window representedFilename]]; - } else { - [_window setFrameAutosaveName:@""]; - } -} - -- (IBAction)toggleDonateButton:(id)sender { - NSButton *btn = sender; -// [myPreferences setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefDonate"]; - [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefDonate"]; - if ([btn state]) - { - [NSAnimationContext beginGrouping]; - [[NSAnimationContext currentContext] setDuration:1.0]; - [[_donateButton animator] setAlphaValue:0]; - [[_donateButton animator] setHidden:true]; - [NSAnimationContext endGrouping]; - } else { - [NSAnimationContext beginGrouping]; - [[NSAnimationContext currentContext] setDuration:1.0]; - [[_donateButton animator] setAlphaValue:1]; - [[_donateButton animator] setHidden:false]; - [NSAnimationContext endGrouping]; - } -} - - (void)addLoginItem { dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(myQueue, ^{ @@ -417,10 +293,10 @@ - (void)setupPrefstab { if ([[NSUserDefaults standardUserDefaults] boolForKey:@"SUAutomaticallyUpdate"]) { [_prefUpdateAuto selectItemAtIndex:2]; - SUUpdater *myUpdater = [SUUpdater alloc]; - [myUpdater checkForUpdatesInBackground]; + [self.updater checkForUpdatesInBackground]; } else if ([[NSUserDefaults standardUserDefaults] boolForKey:@"SUEnableAutomaticChecks"]) { [_prefUpdateAuto selectItemAtIndex:1]; + [self.updater checkForUpdatesInBackground]; } else { [_prefUpdateAuto selectItemAtIndex:0]; } @@ -428,22 +304,16 @@ - (void)setupPrefstab { [_prefUpdateInterval selectItemWithTag:[[myPreferences objectForKey:@"SUScheduledCheckInterval"] integerValue]]; [[_gitButton cell] setImageScaling:NSImageScaleProportionallyUpOrDown]; -// [[_translateButton cell] setImageScaling:NSImageScaleProportionallyUpOrDown]; + [[_sourceButton cell] setImageScaling:NSImageScaleProportionallyUpOrDown]; [[_webButton cell] setImageScaling:NSImageScaleProportionallyUpOrDown]; [[_emailButton cell] setImageScaling:NSImageScaleProportionallyUpOrDown]; + [_sourceButton setAction:@selector(visitSource)]; [_gitButton setAction:@selector(visitGithub)]; -// [_translateButton setAction:@selector(translate)]; [_webButton setAction:@selector(visitWebsite)]; [_emailButton setAction:@selector(sendEmail)]; } -- (IBAction)inject:(id)sender { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - [self runScript:[[NSBundle mainBundle] pathForResource:@"injectPROC" ofType:@"sh"]]; - }); -} - - (void)donate { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://goo.gl/DSyEFR"]]; } @@ -461,6 +331,10 @@ - (void)visitGithub { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://github.com/w0lfschild"]]; } +- (void)visitSource { + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://github.com/w0lfschild/mySIMBL"]]; +} + - (void)visitWebsite { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://w0lfschild.github.io/app_SIMBL.html"]]; } @@ -492,211 +366,133 @@ - (void)setupEventListener { - (void)pathWatcher:(SCEvents *)pathWatcher eventOccurred:(SCEvent *)event { // NSLog(@"%@", event); - [self readPlugins]; + [_sharedMethods readPlugins:_tblView]; } -- (void)readFolder:(NSString *)str :(NSMutableDictionary *)dict { - - NSArray *appFolderContents = [[NSArray alloc] init]; - appFolderContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:str error:nil]; - - for (NSString* fileName in appFolderContents) { - if ([fileName hasSuffix:@".bundle"]) { - NSString* path=[str stringByAppendingPathComponent:fileName]; - NSString* name=[fileName stringByDeletingPathExtension]; - //check Info.plist - NSBundle* bundle = [NSBundle bundleWithPath:path]; - NSDictionary* info=[bundle infoDictionary]; -// NSDictionary* info=nil; - NSString* bundleIdentifier=[bundle bundleIdentifier]; - if(![bundleIdentifier length])bundleIdentifier=@"(null)"; - - NSString* bundleVersion=[bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; - if(![bundleVersion length])bundleVersion=[bundle objectForInfoDictionaryKey:@"CFBundleVersion"]; - - NSString* description=bundleIdentifier; - if([bundleVersion length]){ - description=[NSString stringWithFormat:@"%@ - %@", bundleVersion, description]; - } - - NSArray *components = [path pathComponents]; - NSString* location= [components objectAtIndex:1]; - NSString* endcomp= [components objectAtIndex:[components count] - 2]; - if([location length]){ - if ([endcomp containsString:@"Disabled"]) - { - description=[NSString stringWithFormat:@"%@ - %@ (Disabled)", description, location]; - } else { - description=[NSString stringWithFormat:@"%@ - %@", description, location]; - } - } - - NSMutableDictionary* itm=[NSMutableDictionary dictionaryWithObjectsAndKeys: - name, @"name", path, @"path", description, @"description", - bundleIdentifier, @"bundleId", bundleVersion, @"version", - info, @"bundleInfo", - [NSNumber numberWithBool:YES], @"enabled", - [NSNumber numberWithBool:NO], @"fileSystemConflict", - nil]; - - NSString* nameandPath = [NSString stringWithFormat:@"%@ - %@", name, path]; - - [dict setObject:itm forKey:nameandPath]; - } +- (IBAction)changeAutoUpdates:(id)sender { + int selected = (int)[(NSPopUpButton*)sender indexOfSelectedItem]; + if (selected == 0) + [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:false] forKey:@"SUEnableAutomaticChecks"]; + if (selected == 1) + { + [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:true] forKey:@"SUEnableAutomaticChecks"]; + [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:false] forKey:@"SUAutomaticallyUpdate"]; } -} - -- (void)readPlugins { - tableArray = [[NSMutableArray alloc] init]; - confirmDelete = [[NSMutableArray alloc] init]; - NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init]; - - NSArray* libDomain = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSLocalDomainMask]; - NSArray* usrDomain = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask]; - - NSString* libSupport = [[libDomain objectAtIndex:0] path]; - NSString* usrSupport = [[usrDomain objectAtIndex:0] path]; - - NSString* libPathENB = [NSString stringWithFormat:@"%@/SIMBL/Plugins", libSupport]; - NSString* libPathDIS = [NSString stringWithFormat:@"%@/SIMBL/Plugins (Disabled)", libSupport]; - - NSString* usrPathENB = [NSString stringWithFormat:@"%@/SIMBL/Plugins", usrSupport]; - NSString* usrPathDIS = [NSString stringWithFormat:@"%@/SIMBL/Plugins (Disabled)", usrSupport]; - - NSString* OpeePath = [NSString stringWithFormat:@"/Library/Opee/Extensions"]; - - [self readFolder:libPathENB :myDict]; - [self readFolder:libPathDIS :myDict]; - - [self readFolder:usrPathENB :myDict]; - [self readFolder:usrPathDIS :myDict]; - - [self readFolder:OpeePath :myDict]; - - NSArray *keys = [myDict allKeys]; - NSArray *sortedKeys = [keys sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; -// sortedKeys = [[sortedKeys reverseObjectEnumerator] allObjects]; - - for (NSString *app in sortedKeys) + if (selected == 2) { - [tableArray addObject:[myDict valueForKey:app]]; - [confirmDelete addObject:[NSNumber numberWithBool:false]]; + [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:true] forKey:@"SUEnableAutomaticChecks"]; + [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:true] forKey:@"SUAutomaticallyUpdate"]; } +} - [[self tblView] reloadData]; +- (IBAction)changeUpdateFrequency:(id)sender { + int selected = (int)[(NSPopUpButton*)sender selectedTag]; + [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:selected] forKey:@"SUScheduledCheckInterval"]; } -- (void)installBundles:(NSArray*)pathArray { -// NSLog(@"%@", pathArray); - NSArray* libDomain = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSLocalDomainMask]; - NSString* libSupport = [[libDomain objectAtIndex:0] path]; - for (NSString* path in pathArray) { - if ([[path pathExtension] isEqualToString:@"bundle"]) +- (IBAction)changeSIMBLLogging:(id)sender { + NSString *logLevel = [NSString stringWithFormat:@"defaults write net.culater.SIMBL SIMBLLogLevel -int %ld", [_SIMBLLogging indexOfSelectedItem]]; + logLevel = [self runCommand:logLevel]; +} + +- (IBAction)toggleVibrancy:(id)sender { + NSButton *btn = sender; + [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefVibrant"]; + Class vibrantClass=NSClassFromString(@"NSVisualEffectView"); + if (vibrantClass) + { + if ([btn state]) { - NSArray* pathComp=[path pathComponents]; - NSString* name=[pathComp objectAtIndex:[pathComp count] - 1]; - NSString* libPath = [NSString stringWithFormat:@"%@/SIMBL/Plugins/%@", libSupport, name]; - // NSLog(@"\n%@\n%@", libPath, path); - [self replaceFile:path :libPath]; + NSVisualEffectView *vibrant=[[vibrantClass alloc] initWithFrame:[[_window contentView] bounds]]; + [vibrant setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + [vibrant setBlendingMode:NSVisualEffectBlendingModeBehindWindow]; + if (![[_window.contentView subviews] containsObject:vibrant]) + [[_window contentView] addSubview:vibrant positioned:NSWindowBelow relativeTo:nil]; + } else { + for (NSVisualEffectView *v in (NSMutableArray *)[_window.contentView subviews]) + if ([v class] == vibrantClass) { + [v removeFromSuperview]; + break; + } } } - [self readPlugins]; } -- (void)replaceFile:(NSString*)start :(NSString*)end { - NSError* error; - if ([[NSFileManager defaultManager] fileExistsAtPath:end]) { - // NSLog(@"File Exists"); - [[NSFileManager defaultManager] replaceItemAtURL:[NSURL fileURLWithPath:end] withItemAtURL:[NSURL fileURLWithPath:start] backupItemName:nil options:NSFileManagerItemReplacementUsingNewMetadataOnly resultingItemURL:nil error:&error]; +- (IBAction)toggleTips:(id)sender { + NSButton *btn = sender; + // [myPreferences setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefTips"]; + [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefTips"]; + NSToolTipManager *test = [NSToolTipManager sharedToolTipManager]; + if ([btn state]) + [test setInitialToolTipDelay:0.1]; + else + [test setInitialToolTipDelay:2]; +} + +- (IBAction)toggleSaveWindow:(id)sender { + NSButton *btn = sender; + // [myPreferences setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefWindow"]; + [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefWindow"]; + if ([btn state]) + { + [[_window windowController] setShouldCascadeWindows:NO]; // Tell the controller to not cascade its windows. + [_window setFrameAutosaveName:[_window representedFilename]]; + } else { + [_window setFrameAutosaveName:@""]; + } +} + +- (IBAction)toggleDonateButton:(id)sender { + NSButton *btn = sender; + // [myPreferences setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefDonate"]; + [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:[btn state]] forKey:@"prefDonate"]; + if ([btn state]) + { + [NSAnimationContext beginGrouping]; + [[NSAnimationContext currentContext] setDuration:1.0]; + [[_donateButton animator] setAlphaValue:0]; + [[_donateButton animator] setHidden:true]; + [NSAnimationContext endGrouping]; } else { - // NSLog(@"File Doesn't Exist"); - [[NSFileManager defaultManager] moveItemAtURL:[NSURL fileURLWithPath:start] toURL:[NSURL fileURLWithPath:end] error:&error]; + [NSAnimationContext beginGrouping]; + [[NSAnimationContext currentContext] setDuration:1.0]; + [[_donateButton animator] setAlphaValue:1]; + [[_donateButton animator] setHidden:false]; + [NSAnimationContext endGrouping]; } - // NSLog(@"%@", error); +} + +- (IBAction)inject:(id)sender { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [self runScript:[[NSBundle mainBundle] pathForResource:@"injectPROC" ofType:@"sh"]]; + [[NSSound soundNamed:@"Blow"] play]; + }); } - (IBAction)showAbout:(id)sender { - NSArray *tabs = [NSArray arrayWithObjects:_viewPlugins, _viewDiscover, _viewSources, _viewPreferences, _viewAbout, nil]; [_tabView selectTabViewItemAtIndex:4]; for (NSButton *g in tabs) { if (![g isEqualTo:_viewAbout]) - [g setState:NSOffState]; + g.layer.backgroundColor = [NSColor clearColor].CGColor; else - [g setState:NSOnState]; + g.layer.backgroundColor = [NSColor colorWithCalibratedRed:0.121f green:0.4375f blue:0.1992f alpha:0.2578f].CGColor; } } - (IBAction)showPrefs:(id)sender { - NSArray *tabs = [NSArray arrayWithObjects:_viewPlugins, _viewDiscover, _viewSources, _viewPreferences, _viewAbout, nil]; [_tabView selectTabViewItemAtIndex:3]; for (NSButton *g in tabs) { if (![g isEqualTo:_viewPreferences]) - [g setState:NSOffState]; + g.layer.backgroundColor = [NSColor clearColor].CGColor; else - [g setState:NSOnState]; + g.layer.backgroundColor = [NSColor colorWithCalibratedRed:0.121f green:0.4375f blue:0.1992f alpha:0.2578f].CGColor; } } -- (IBAction)pluginWebpage:(id)sender { - long selected = [_tblView rowForView:sender]; - NSDictionary* obj = [tableArray objectAtIndex:selected]; - NSDictionary* info = [obj objectForKey:@"bundleInfo"]; - NSString* webURL = [info objectForKey:@"DevURL"]; - [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:webURL]]; -} - - (IBAction)donate:(id)sender { [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://goo.gl/DSyEFR"]]; } -- (IBAction)newView:(id)sender { - long selected = [_tblView rowForView:sender]; - NSDictionary* obj = [tableArray objectAtIndex:selected]; - NSLog(@"%@", [obj valueForKey:@"name"]); -} - -- (IBAction)deletePlugin:(id)sender { - long selected = [_tblView rowForView:sender]; - if ([[confirmDelete objectAtIndex:selected] boolValue]) - { - NSDictionary* obj = [tableArray objectAtIndex:selected]; - NSString* path = [obj objectForKey:@"path"]; - NSURL* url = [NSURL fileURLWithPath:path]; - NSURL* trash; - NSError* error; - [[NSFileManager defaultManager] trashItemAtURL:url resultingItemURL:&trash error:&error]; - } - [self readPlugins]; - [confirmDelete setObject:[NSNumber numberWithBool:true] atIndexedSubscript:selected]; -} - -- (IBAction)togglePlugin:(id)sender { - long selected = [_tblView rowForView:sender]; - NSDictionary* obj = [tableArray objectAtIndex:selected]; - NSString* name = [obj objectForKey:@"name"]; - NSString* path = [obj objectForKey:@"path"]; - - NSArray* libDomain = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSLocalDomainMask]; - NSArray* usrDomain = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask]; - - NSString* libSupport = [[libDomain objectAtIndex:0] path]; - NSString* usrSupport = [[usrDomain objectAtIndex:0] path]; - - NSString* disPath = [NSString stringWithFormat:@"%@/SIMBL/Plugins (Disabled)/%@.bundle", libSupport, name]; - NSString* libPath = [NSString stringWithFormat:@"%@/SIMBL/Plugins/%@.bundle", libSupport, name]; - NSString* usrPath = [NSString stringWithFormat:@"%@/SIMBL/Plugins/%@.bundle", usrSupport, name]; - - if ([[obj objectForKey:@"path"] isEqualToString:disPath]) { - [self replaceFile:path :usrPath]; - } else if ([[obj objectForKey:@"path"] isEqualToString:usrPath]) { - [self replaceFile:path :libPath]; - } else { - [self replaceFile:path :disPath]; - } - - [self readPlugins]; -} - - (IBAction)aboutInfo:(id)sender { if ([sender isEqualTo:_showChanges]) { @@ -736,124 +532,112 @@ - (IBAction)aboutInfo:(id)sender { } } -- (IBAction)selectView:(id)sender { - NSArray *tabs = [NSArray arrayWithObjects:_viewPlugins, _viewDiscover, _viewSources, _viewPreferences, _viewAbout, nil]; - if ([tabs containsObject:sender]) - [_tabView selectTabViewItemAtIndex:[tabs indexOfObject:sender]]; - for (NSButton *g in tabs) { - if (![g isEqualTo:sender]) - [g setState:NSOffState]; - else - [g setState:NSOnState]; - } +- (IBAction)toggleStartTab:(id)sender { + NSPopUpButton *btn = sender; + [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInteger:[btn indexOfSelectedItem]] forKey:@"prefStartTab"]; } -- (IBAction)showInFinder:(id)sender { - long selected = [_tblView rowForView:sender]; - NSDictionary* obj = [tableArray objectAtIndex:selected]; -// NSLog(@"%@", [obj valueForKey:@"path"]); - NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:[obj valueForKey:@"path"]]; -// NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; -// [pasteboard writeObjects:[NSArray arrayWithObject:fileURL]]; - [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:[NSArray arrayWithObject:fileURL]]; +- (IBAction)pushView:(id)sender { + long cur = [sourceItems indexOfObject:[_sourcesRoot.subviews objectAtIndex:0]]; + if ([_sourcesAllTable selectedRow] > -1) + { + [_sourcesPop setEnabled:true]; + if ((cur + 2) >= [sourceItems count]) + [_sourcesPush setEnabled:false]; + else + [_sourcesPush setEnabled:true]; + + if ((cur + 1) < [sourceItems count]) + { + [[_sourcesRoot animator] replaceSubview:[_sourcesRoot.subviews objectAtIndex:0] with:[sourceItems objectAtIndex:cur + 1]]; + [self.window makeFirstResponder: [sourceItems objectAtIndex:cur + 1]]; + } + } + // [_sourcesRoot setSubviews:[[NSArray alloc] initWithObjects:_sourcesPlugins, nil]]; } -- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { - return [tableArray count]; +- (IBAction)popView:(id)sender { + long cur = [sourceItems indexOfObject:[_sourcesRoot.subviews objectAtIndex:0]]; + + [_sourcesPush setEnabled:true]; + if ((cur - 1) <= 0) + [_sourcesPop setEnabled:false]; + else + [_sourcesPop setEnabled:true]; + + if ((cur - 1) >= 0) + { + [[_sourcesRoot animator] replaceSubview:[_sourcesRoot.subviews objectAtIndex:0] with:[sourceItems objectAtIndex:cur - 1]]; + [self.window makeFirstResponder: [sourceItems objectAtIndex:cur - 1]]; + } +// [[_sourcesRoot animator] replaceSubview:[_sourcesRoot.subviews objectAtIndex:0] with:_sourcesURLS]; +// [_sourcesRoot setSubviews:[[NSArray alloc] initWithObjects:_sourcesPlugins, nil]]; } -//- (BOOL)tableView:(NSTableView *)tv writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard*)pboard -//{ -// return YES; -//} - -- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id )info proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)op { - return NSDragOperationCopy; +- (IBAction)rootView:(id)sender { + [_sourcesPush setEnabled:true]; + [_sourcesPop setEnabled:false]; + [[_sourcesRoot animator] replaceSubview:[_sourcesRoot.subviews objectAtIndex:0] with:_sourcesURLS]; + // [_sourcesRoot setSubviews:[[NSArray alloc] initWithObjects:_sourcesPlugins, nil]]; } -- (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id )info row:(int)row dropOperation:(NSTableViewDropOperation)operation { - NSPasteboard *pboard = [info draggingPasteboard]; - if ([[pboard types] containsObject:NSURLPboardType]) { - NSArray* urls = [pboard readObjectsForClasses:@[[NSURL class]] options:nil]; - NSMutableArray* sorted = [[NSMutableArray alloc] init]; - for (NSURL* url in urls) - { - if ([[url.path pathExtension] isEqualToString:@"bundle"]) - { - [sorted addObject:url.path]; -// NSLog(@"%@", url.path); - } - } - if ([sorted count]) - { -// NSLog(@"%@", sorted); - NSArray* installArray = [NSArray arrayWithArray:sorted]; - [self installBundles:installArray]; - } +- (IBAction)selectView:(id)sender { + if ([tabs containsObject:sender]) + [_tabView selectTabViewItemAtIndex:[tabs indexOfObject:sender]]; + for (NSButton *g in tabs) { + if (![g isEqualTo:sender]) + g.layer.backgroundColor = [NSColor clearColor].CGColor; + else + g.layer.backgroundColor = [NSColor colorWithCalibratedRed:0.121f green:0.4375f blue:0.1992f alpha:0.2578f].CGColor; } - return YES; } -- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { - CustomTableCell *result = (CustomTableCell*)[tableView makeViewWithIdentifier:@"MyView" owner:self]; - NSDictionary* item = [tableArray objectAtIndex:row]; - NSDictionary* info = [item objectForKey:@"bundleInfo"]; - NSString* iconPath = [NSString stringWithFormat:@"%@/Contents/icon.icns", [item objectForKey:@"path"]]; - NSImage* icon = [[NSImage alloc] initWithContentsOfFile:iconPath]; +- (IBAction)sourceAddorRemove:(id)sender { + NSMutableArray *newArray = [NSMutableArray arrayWithArray:[myPreferences objectForKey:@"sources"]]; + NSString *input = _addsourcesTextFiled.stringValue; + NSArray *arr = [input componentsSeparatedByString:@"\n"]; - result.pluginName.stringValue = [item objectForKey:@"name"]; - if([[item objectForKey:@"path"] length]){ - NSString *path = [item objectForKey:@"path"]; - NSArray *components = [path pathComponents]; - - if ([[components objectAtIndex:1] isEqualToString:@"Library"]) +// NSLog(@"%@", arr); +// NSLog(@"%@", newArray); + + for (NSString* item in arr) + { + if ([item length]) { - [result.pluginStatus setImage:[NSImage imageNamed:@"NSStatusAvailable"]]; - } else { - [result.pluginStatus setImage:[NSImage imageNamed:@"NSStatusPartiallyAvailable"]]; + if ([newArray containsObject:item]) + { + [newArray removeObject:item]; + } else { + NSString* content = [item stringByAppendingString:@"/resource.plist"]; + NSURL *theURL = [NSURL fileURLWithPath:content + isDirectory:NO]; + + NSLog(@"%@", theURL); + NSError *err; + if ([theURL checkResourceIsReachableAndReturnError:&err] == NO) + [[NSAlert alertWithError:err] runModal]; + else + [newArray addObject:item]; + } } - - if ([path containsString:@"Disabled"]) - [result.pluginStatus setImage:[NSImage imageNamed:@"NSStatusUnavailable"]]; } - result.pluginDescription.stringValue = [item objectForKey:@"description"]; - - if ([[confirmDelete objectAtIndex:row] boolValue]) - [result.pluginDelete setImage:[NSImage imageNamed:@"NSTrashFull"]]; - else - [result.pluginDelete setImage:[NSImage imageNamed:@"NSTrashEmpty"]]; - -// [result.pluginBlackList setEnabled:true]; -// NSNumber* n = [info objectForKey:@"SupportsBlackList"]; -// BOOL value = [n boolValue]; -// if (!value) -// [result.pluginBlackList setEnabled:false]; + [[NSUserDefaults standardUserDefaults] setObject:newArray forKey:@"sources"]; + [myPreferences setObject:newArray forKey:@"sources"]; + [_srcWin close]; + [_sourcesAllTable reloadData]; +} - if (icon) { - result.pluginImage.image = icon; - } else { -// result.pluginImage.image = [NSImage imageNamed:@"brick.png"]; - result.pluginImage.image = [[NSImage alloc] initWithContentsOfFile:@"/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/KEXT.icns"]; - } - - [result.pluginWeb setImage:[NSImage imageNamed:@"webicon.png"]]; - [[result.pluginWeb cell] setImageScaling:NSImageScaleProportionallyUpOrDown]; - - [result.pluginWeb setEnabled:true]; - [result.pluginWeb setHidden:false]; - NSString* webURL = [info objectForKey:@"DevURL"]; - if (![webURL length]) { - [result.pluginWeb setEnabled:false]; - [result.pluginWeb setHidden:true]; - } - - - // Return the result - return result; +- (IBAction)sourceAddNew:(id)sender { + NSRect newFrame = _window.frame; + newFrame.origin.x += (_window.frame.size.width / 2) - (_srcWin.frame.size.width / 2); + newFrame.origin.y += (_window.frame.size.height / 2) - (_srcWin.frame.size.height / 2); + newFrame.size.width = _srcWin.frame.size.width; + newFrame.size.height = _srcWin.frame.size.height; + [_srcWin setFrame:newFrame display:true]; + NSWindowController *vc = [[NSWindowController alloc] initWithWindow:_srcWin]; + [vc showWindow:nil]; } -@end -@implementation CustomTableCell @end \ No newline at end of file diff --git a/mySIMBL/Base.lproj/Appliaction.xib b/mySIMBL/Base.lproj/Appliaction.xib index 005a95d..651486a 100644 --- a/mySIMBL/Base.lproj/Appliaction.xib +++ b/mySIMBL/Base.lproj/Appliaction.xib @@ -1,8 +1,9 @@ - + + @@ -12,214 +13,43 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + @@ -227,8 +57,8 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + + @@ -476,14 +540,8 @@ - - - - - - - + @@ -509,7 +567,7 @@ - + @@ -549,44 +607,32 @@ - + - - + + - - - - - - - - - - - + + @@ -612,7 +658,7 @@ - + @@ -669,26 +715,26 @@ - - + + - - - - - + + + + + - + - + @@ -706,7 +752,7 @@ - + @@ -714,7 +760,7 @@ - + @@ -722,7 +768,7 @@ - + @@ -730,7 +776,7 @@ - + @@ -746,18 +792,8 @@ - - + @@ -765,7 +801,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + - + + - + diff --git a/mySIMBL/Changelog.rtf b/mySIMBL/Changelog.rtf index 8630953..6699df2 100755 --- a/mySIMBL/Changelog.rtf +++ b/mySIMBL/Changelog.rtf @@ -1,31 +1,72 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf450 -{\fonttbl\f0\fswiss\fcharset0 Helvetica-Light;\f1\fswiss\fcharset0 Helvetica;\f2\fnil\fcharset204 LucidaGrande; -} -{\colortbl;\red255\green255\blue255;} -{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1} +{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf460 +{\fonttbl\f0\fswiss\fcharset0 Helvetica-Light;\f1\fnil\fcharset204 LucidaGrande;\f2\fnil\fcharset0 Menlo-Regular; +\f3\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;\red196\green26\blue22;} +{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid2\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid3\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid4\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid5\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li3600\lin3600 }{\listname ;}\listid1} {\list\listtemplateid2\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid101\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid2} {\list\listtemplateid3\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid201\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid3} {\list\listtemplateid4\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid301\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid4} {\list\listtemplateid5\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid401\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid5} {\list\listtemplateid6\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid501\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid6} {\list\listtemplateid7\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid601\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid602\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid7} -{\list\listtemplateid8\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid701\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid702\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid8} -{\list\listtemplateid9\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{square\}}{\leveltext\leveltemplateid801\'01\uc0\u9642 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid802\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid9} +{\list\listtemplateid8\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{square\}}{\leveltext\leveltemplateid701\'01\uc0\u9642 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid702\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid8} +{\list\listtemplateid9\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid801\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid802\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid9} {\list\listtemplateid10\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid901\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{hyphen\}}{\leveltext\leveltemplateid902\'01\uc0\u8259 ;}{\levelnumbers;}\fi-360\li1440\lin1440 }{\listname ;}\listid10}} {\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}{\listoverride\listid7\listoverridecount0\ls7}{\listoverride\listid8\listoverridecount0\ls8}{\listoverride\listid9\listoverridecount0\ls9}{\listoverride\listid10\listoverridecount0\ls10}} \margl1440\margr1440\vieww15040\viewh13640\viewkind0 \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 -\f0\fs22 \cf0 0.1.6\ +\f0\fs22 \cf0 0.2.0\ \ \pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 -\ls1\ilvl0\cf0 {\listtext \'95 }UI adjustments\ +\ls1\ilvl0\cf0 {\listtext \'95 }Sources view implemented \ +\pard\tx940\tx1440\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li1440\fi-1440\pardirnatural\partightenfactor0 +\ls1\ilvl1\cf0 {\listtext +\f1 \uc0\u8259 +\f0 }One repo included\ +{\listtext +\f1 \uc0\u8259 +\f0 }Basic repo implementation\ +{\listtext +\f1 \uc0\u8259 +\f0 }Structure\ +\pard\tx1660\tx2160\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li2160\fi-2160\pardirnatural\partightenfactor0 +\ls1\ilvl2\cf0 {\listtext +\f1 \uc0\u8259 +\f0 }Source View (Root)\ +\pard\tx2380\tx2880\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li2880\fi-2880\pardirnatural\partightenfactor0 +\ls1\ilvl3\cf0 {\listtext +\f1 \uc0\u8259 +\f0 }Source Bundles\ +\pard\tx3100\tx3600\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li3600\fi-3600\pardirnatural\partightenfactor0 +\ls1\ilvl4\cf0 {\listtext +\f1 \uc0\u8259 +\f0 }Bundle Page\ +\pard\tx560\tx1120\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 +\cf0 \ +\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 +\ls2\ilvl0\cf0 {\listtext \'95 }UI adjustments\ +{\listtext \'95 }Code refactoring\ +{\listtext \'95 }Startup tab preference\ +{\listtext \'95 }Bundles use icon of first application in SIMBLTargetApplications +\f2 \cf2 \CocoaLigature0 +\f0 \cf0 if no icon provided +\f2 \cf2 \ +\ls2\ilvl0 +\f0 \cf0 \CocoaLigature1 {\listtext \'95 }View source button in about page\ +{\listtext \'95 }Cells selectable in tables\ +\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 +\cf0 \ +0.1.6\ +\ +\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 +\ls3\ilvl0\cf0 {\listtext \'95 }UI adjustments\ \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0 \cf0 \ 0.1.5\ \ \pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 -\ls2\ilvl0\cf0 {\listtext \'95 }UI adjustments\ +\ls4\ilvl0\cf0 {\listtext \'95 }UI adjustments\ {\listtext \'95 }Changed fonts\ {\listtext \'95 }Almost all preferences working\ {\listtext \'95 }Updated about page\ @@ -34,7 +75,7 @@ 0.1.4\ \ \pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 -\ls3\ilvl0\cf0 {\listtext \'95 }UI adjustments\ +\ls5\ilvl0\cf0 {\listtext \'95 }UI adjustments\ {\listtext \'95 }Inject into apps button\ {\listtext \'95 }Preferences mostly complete\ {\listtext \'95 }Delete bundle requires two clicks\ @@ -51,53 +92,56 @@ \cf0 0.1.2\ \pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 \cf0 \ + \'95 Helper agent\ \pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 -\ls4\ilvl0\cf0 {\listtext \'95 }System Integrity Protection warning\ -{\listtext \'95 }Helper agent\ +\ls6\ilvl0\cf0 {\listtext \'95 }System Integrity Protection warning\ {\listtext \'95 }Inject into specified system apps\ {\listtext \'95 }Offers to move self to /Applications\ \pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 -\ls5\ilvl0\cf0 {\listtext \'95 }Drag and drop install bundles in /Library/Application Support/SIMBL/Plugins\ -\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 -\ls6\ilvl0\cf0 {\listtext \'95 }Open bundles with app to install in /Library/Application Support/SIMBL/Plugins\ -\pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 \cf0 \'95 Show bundle in Finder (Magnifying Glass)\ \pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 -\ls7\ilvl0\cf0 {\listtext \'95 }Toggle bundles between (Colored Circle Icon)\ +\ls7\ilvl0\cf0 {\listtext \'95 }Bundles will display custom icon if located in /Contents/icon.icns\ +{\listtext \'95 }Easy bundle installation\ \pard\tx940\tx1440\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li1440\fi-1440\pardirnatural\partightenfactor0 \ls7\ilvl1\cf0 {\listtext \f1 \uc0\u8259 -\f0 }/Library/Application Support/SIMBL/Plugins\ +\f0 }Drag and drop install bundles in /Library/Application Support/SIMBL/Plugins\ {\listtext \f1 \uc0\u8259 -\f0 }/Library/Application Support/SIMBL/Plugins (Disabled)\ -{\listtext -\f1 \uc0\u8259 -\f0 }~/Library/Application Support/SIMBL/Plugins\ +\f0 }Open bundles with app to install in /Library/Application Support/SIMBL/Plugins\ \pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 -\ls8\ilvl0\cf0 {\listtext \'95 }Bundles will display custom icon if located in /Contents/icon.icns\ +\ls8\ilvl0\cf0 {\listtext +\f1 \uc0\u9642 +\f0 }Show bundle developer page (Globe Icon)\ \pard\tx940\tx1440\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li1440\fi-1440\pardirnatural\partightenfactor0 \ls8\ilvl1\cf0 {\listtext -\f1 \uc0\u8259 -\f0 }Otherwise bundles display default bundle icon\ +\f3 \uc0\u8259 +\f0 }plist value is string 'DevURL'\ \pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 -\ls9\ilvl0\cf0 {\listtext -\f2 \uc0\u9642 -\f0 }Show bundle developer page (Globe Icon)\ +\ls9\ilvl0\cf0 {\listtext \'95 }Toggle bundles between (Colored Circle Icon)\ \pard\tx940\tx1440\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li1440\fi-1440\pardirnatural\partightenfactor0 \ls9\ilvl1\cf0 {\listtext -\f1 \uc0\u8259 -\f0 }Must have url included in /Contents/Info.plist\ +\f3 \uc0\u8259 +\f0 }/Library/Application Support/SIMBL/Plugins\ {\listtext -\f1 \uc0\u8259 -\f0 }plist value is string 'DevURL'\ +\f3 \uc0\u8259 +\f0 }/Library/Application Support/SIMBL/Plugins (Disabled)\ +{\listtext +\f3 \uc0\u8259 +\f0 }~/Library/Application Support/SIMBL/Plugins (User only)\ \pard\tx220\tx720\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li720\fi-720\pardirnatural\partightenfactor0 \ls10\ilvl0\cf0 {\listtext \'95 }Watch for changes to\ \pard\tx940\tx1440\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li1440\fi-1440\pardirnatural\partightenfactor0 \ls10\ilvl1\cf0 {\listtext \f1 \uc0\u8259 \f0 }/Library/Application Support/SIMBL/Plugins\ +\pard\tx940\tx1440\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li1440\fi-1440\pardirnatural\partightenfactor0 +\ls10\ilvl1 +\f3 \cf0 {\listtext \uc0\u8259 +\f0 } +\f3 /Library/Application Support/SIMBL/Plugins (Disabled)\ {\listtext \f1 \uc0\u8259 -\f0 }~/Library/Application Support/SIMBL/Plugins\ +\f0 } +\f3 ~/Library/Application Support/SIMBL/Plugins\ } \ No newline at end of file diff --git a/mySIMBL/Credits.rtf b/mySIMBL/Credits.rtf index 1caf786..8d0c06d 100755 --- a/mySIMBL/Credits.rtf +++ b/mySIMBL/Credits.rtf @@ -1,4 +1,4 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf450 +{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf460 {\fonttbl\f0\froman\fcharset0 TimesNewRomanPSMT;} {\colortbl;\red255\green255\blue255;\red0\green0\blue255;} \margl1440\margr1440\vieww9000\viewh8400\viewkind0 @@ -7,7 +7,10 @@ {\field{\*\fldinst{HYPERLINK "http://www.iconarchive.com/"}}{\fldrslt \f0\fs24 \cf2 \ul \ulc2 iconarchive.com/}} \f0\fs24 \cf2 \ul \ulc2 \ -{\field{\*\fldinst{HYPERLINK "http://www.culater.net/software/SIMBL/SIMBL.php"}}{\fldrslt culater.net/software/SIMBL/SIMBL.php}}\ +\pard\pardeftab720\partightenfactor0 +{\field{\*\fldinst{HYPERLINK "http://www.culater.net/software/SIMBL/SIMBL.php"}}{\fldrslt \cf2 culater.net/software/SIMBL/SIMBL.php}}\ +\pard\pardeftab720\partightenfactor0 +{\field{\*\fldinst{HYPERLINK "https://github.com/bfolder/BFNavigationController"}}{\fldrslt \cf2 github.com/bfolder/BFNavigationController}}\ \pard\pardeftab720\partightenfactor0 {\field{\*\fldinst{HYPERLINK "https://github.com/mz2/SCEvents"}}{\fldrslt \cf2 github.com/mz2/SCEvents}}\ \pard\pardeftab720\partightenfactor0 diff --git a/mySIMBL/Info.plist b/mySIMBL/Info.plist index dbe54e0..4505aac 100644 --- a/mySIMBL/Info.plist +++ b/mySIMBL/Info.plist @@ -2,6 +2,11 @@ + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + SUFeedURL https://github.com/w0lfschild/app_updates/raw/master/mySIMBL/appcast.xml CFBundleDevelopmentRegion @@ -36,11 +41,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.1.6 + 0.2.0 CFBundleSignature ???? CFBundleVersion - 6 + 11 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright diff --git a/mySIMBL/bundlePage.m b/mySIMBL/bundlePage.m new file mode 100644 index 0000000..959741b --- /dev/null +++ b/mySIMBL/bundlePage.m @@ -0,0 +1,260 @@ +// +// bundlePage.m +// mySIMBL +// +// Created by Wolfgang Baird on 3/24/16. +// Copyright © 2016 Wolfgang Baird. All rights reserved. +// + +@import AppKit; +@import WebKit; +#import "shareClass.h" +#import "AppDelegate.h" + +@interface bundlePage : NSView + +@property IBOutlet NSTextField* bundleName; +@property IBOutlet NSTextField* bundleVersion; +@property IBOutlet NSTextField* bundleSize; +@property IBOutlet NSTextField* bundleID; +@property IBOutlet NSTextField* bundleDev; +@property IBOutlet NSTextField* bundleTarget; +@property IBOutlet NSTextField* bundleDescription; +@property IBOutlet NSImageView* bundleImage; +@property IBOutlet NSButton* bundleInstall; +@property IBOutlet NSButton* bundleDelete; +@property IBOutlet NSButton* bundleContact; +@property IBOutlet NSButton* bundleDonate; +@property IBOutlet WebView* bundleWebView; + +@end + +extern AppDelegate* myDelegate; +extern NSString *repoPackages; +extern NSMutableArray *pluginsArray; +extern long selectedRow; + +@implementation bundlePage +{ + bool doOnce; + NSMutableDictionary* installedPlugins; + NSDictionary* item; +} + +-(void)viewWillDraw +{ + [self setWantsLayer:YES]; + self.layer.masksToBounds = YES; + self.layer.borderWidth = 1.0f; + [self.layer setBorderColor:[NSColor grayColor].CGColor]; + + NSURL *dicURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/packages.plist", repoPackages]]; + NSArray *allPlugins = [[NSArray alloc] initWithContentsOfURL:dicURL]; + item = [[NSMutableDictionary alloc] initWithDictionary:[allPlugins objectAtIndex:selectedRow]]; + + NSString* newString; + + newString = [NSString stringWithFormat:@"%@", [item objectForKey:@"name"]]; + self.bundleName.stringValue = newString; + + newString = [NSString stringWithFormat:@"Version : %@", [item objectForKey:@"version"]]; + self.bundleVersion.stringValue = newString; + + newString = [NSString stringWithFormat:@"Size : %@", [item objectForKey:@"size"]]; + self.bundleSize.stringValue = newString; + + newString = [NSString stringWithFormat:@"Description : %@", [item objectForKey:@"description"]]; + self.bundleDescription.stringValue = newString; + self.bundleDescription.toolTip = newString; + + newString = [NSString stringWithFormat:@"Bundle ID : %@", [item objectForKey:@"package"]]; + self.bundleID.stringValue = newString; + + newString = [NSString stringWithFormat:@"Target : %@", [item objectForKey:@"apps"]]; + self.bundleTarget.stringValue = newString; + + newString = [NSString stringWithFormat:@"Author : %@", [item objectForKey:@"author"]]; + self.bundleDev.stringValue = newString; + + if ([[item objectForKey:@"webpage"] length]) + { + // NSURL*url=[NSURL URLWithString:@"http://w0lfschild.github.io/app_cDock"]; + NSURL*url=[NSURL URLWithString:[item objectForKey:@"webpage"]]; + NSURLRequest*request=[NSURLRequest requestWithURL:url]; + [[self.bundleWebView mainFrame] loadRequest:request]; + if (!doOnce) + { + doOnce = true; + // [[[[[self.bundleWebView mainFrame] frameView] documentView] superview] scaleUnitSquareToSize:NSMakeSize(.5, .5)]; + } + } else { + [[self.bundleWebView mainFrame] loadHTMLString:nil baseURL:nil]; + } + + + installedPlugins = [[NSMutableDictionary alloc] init]; + for (NSDictionary* dict in pluginsArray) + { + NSString* str = [dict objectForKey:@"bundleId"]; + [installedPlugins setObject:dict forKey:str]; + } + + [self.bundleContact setTarget:self]; + [self.bundleDonate setTarget:self]; + + [self.bundleContact setAction:@selector(contactDev)]; + [self.bundleDonate setAction:@selector(donateDev)]; + + [self.bundleInstall setTarget:self]; + [self.bundleDelete setTarget:self]; + [self.bundleDelete setAction:@selector(pluginDelete)]; + if ([installedPlugins objectForKey:[item objectForKey:@"package"]]) + { + // Pack needs update + if (![[[[installedPlugins objectForKey:[item objectForKey:@"package"]] objectForKey:@"bundleInfo"] objectForKey:@"CFBundleShortVersionString"] isEqualToString:[item objectForKey:@"version"]]) + { + [self.bundleInstall setEnabled:true]; + self.bundleInstall.title = @"Update"; + [self.bundleInstall setAction:@selector(pluginUpdate)]; + } else { + [self.bundleInstall setEnabled:false]; + self.bundleInstall.title = @"Up to date"; + } + } else { + // Package not installed + [self.bundleInstall setEnabled:true]; + self.bundleInstall.title = @"Install"; + [self.bundleInstall setAction:@selector(pluginInstall)]; + } + + self.bundleImage.image = [self getbundleIcon:item]; + [self.bundleImage.cell setImageScaling:NSImageScaleProportionallyUpOrDown]; +} + +- (void)keyDown:(NSEvent *)theEvent +{ + NSString* const character = [theEvent charactersIgnoringModifiers]; + unichar const code = [character characterAtIndex:0]; + bool specKey = false; + switch (code) + { + case NSLeftArrowFunctionKey: + { + [myDelegate popView:nil]; + specKey = true; + break; + } + case NSRightArrowFunctionKey: + { + [myDelegate pushView:nil]; + specKey = true; + break; + } + case NSCarriageReturnCharacter: + { + [self.bundleInstall performClick:nil]; +// [myDelegate pushView:nil]; + specKey = true; + break; + } + } + + if (!specKey) + [super keyDown:theEvent]; +} + +- (void)contactDev +{ + NSURL *mailtoURL = [NSURL URLWithString:[NSString stringWithFormat:@"mailto:%@", [item objectForKey:@"contact"]]]; + [[NSWorkspace sharedWorkspace] openURL:mailtoURL]; +} + +- (void)donateDev +{ + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:[item objectForKey:@"donate"]]]; +} + +- (void)pluginInstall +{ + NSURL *installURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", repoPackages, [item objectForKey:@"filename"]]]; + NSData *myData = [NSData dataWithContentsOfURL:installURL]; + NSString *temp = [NSString stringWithFormat:@"/tmp/%@_%@", [item objectForKey:@"package"], [item objectForKey:@"version"]]; + [myData writeToFile:temp atomically:YES]; + NSArray* libDomain = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSLocalDomainMask]; + NSString* libSupport = [[libDomain objectAtIndex:0] path]; + NSString* libPathENB = [NSString stringWithFormat:@"%@/SIMBL/Plugins", libSupport]; + NSTask *task = [NSTask launchedTaskWithLaunchPath:@"/usr/bin/unzip" arguments:@[@"-o", temp, @"-d", libPathENB]]; + [task waitUntilExit]; + [self.bundleInstall setEnabled:false]; + self.bundleInstall.title = @"Up to date"; + shareClass* t = [[shareClass alloc] init]; + [t readPlugins:nil]; +} + +- (void)pluginUpdate +{ + NSURL *installURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", repoPackages, [item objectForKey:@"filename"]]]; + NSData *myData = [NSData dataWithContentsOfURL:installURL]; + NSString *temp = [NSString stringWithFormat:@"/tmp/%@_%@", [item objectForKey:@"package"], [item objectForKey:@"version"]]; + [myData writeToFile:temp atomically:YES]; + NSArray* libDomain = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSLocalDomainMask]; + NSString* libSupport = [[libDomain objectAtIndex:0] path]; + NSString* libPathENB = [NSString stringWithFormat:@"%@/SIMBL/Plugins", libSupport]; + NSTask *task = [NSTask launchedTaskWithLaunchPath:@"/usr/bin/unzip" arguments:@[@"-o", temp, @"-d", libPathENB]]; + [task waitUntilExit]; + [self.bundleInstall setEnabled:false]; + self.bundleInstall.title = @"Up to date"; + shareClass* t = [[shareClass alloc] init]; + [t readPlugins:nil]; +} + +- (void)pluginDelete +{ + int pos = 0; + bool found = false; + for (NSDictionary* dict in pluginsArray) + { + if ([[dict objectForKey:@"bundleId"] isEqualToString:[item objectForKey:@"package"]]) + { + found = true; + break; + } + pos += 1; + } + + if (found) + { + NSDictionary* obj = [pluginsArray objectAtIndex:pos]; + NSString* path = [obj objectForKey:@"path"]; + NSURL* url = [NSURL fileURLWithPath:path]; + NSURL* trash; + NSError* error; + [[NSFileManager defaultManager] trashItemAtURL:url resultingItemURL:&trash error:&error]; + } + + [self.bundleInstall setEnabled:true]; + self.bundleInstall.title = @"Install"; + [self.bundleInstall setAction:@selector(pluginInstall)]; +} + +- (NSImage*)getbundleIcon:(NSDictionary*)plist +{ + NSImage* result = nil; + NSArray* targets = [plist objectForKey:@"targets"]; + NSString* iconPath = @""; + for (NSDictionary* targetApp in targets) + { + iconPath = [targetApp objectForKey:@"BundleIdentifier"]; + iconPath = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:iconPath]; + if ([iconPath length]) + { + result = [[NSWorkspace sharedWorkspace] iconForFile:iconPath]; + if (result) return result; + } + } + + result = [[NSImage alloc] initWithContentsOfFile:@"/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/KEXT.icns"]; + return result; +} + +@end \ No newline at end of file diff --git a/mySIMBL/loading_mini.gif b/mySIMBL/loading_mini.gif new file mode 100644 index 0000000000000000000000000000000000000000..74bc2ea6c12aaf05a2b274ad3a70c6422816bcbc GIT binary patch literal 4342 zcmdUzSyU5g8bCu;rIJcA1d|Y!BoJ(tfV7iQb{z*0Xm$gn1%*~nK)@iYY$A}b$PR)i zh#-ro>?neuh!KQ_h-|V5BAWq0Z5zdQLsAbnH~0U(`p(M2 zz|g}TWr=!%LVf=H8HGZ1cXuZwBs4cSpFMk4Pfu_6?%fX`J`{_^ZEbBzN=gs}Nj~_o<-Q-cDdkB6d5VN3*oFIVu)E{w(0)yL4YAzX1Rbfb<@a4VNw3rEm@dc3Le0jYU9T?<&;HyeGnulAQE{+7iKW8Yv?^;jY|iKl6jr;$hG z4W(D60QNhT^VH&g#4Psz>7zjD2hp|42bVbI)H@rS8${>7dkSi1yEpOs#WS8bT2`<16}kkR0uHT^Sr=a6XkN>kzI|n4<=1av z&2p|1gQvANNkdkfa_*g6P#rtRVPCWYZ~;4vnU1vUxIV|V5#ze0;s3E$!nZS3mm;+; zeGu?xm$eAEJb=Gu#ng&tFSxTM1_K^O2vI%Z>W4lDGRgl+0#7)skM+Yv1`yF+m{rgaBmo)Jpv<6Be4-m)aN75h9Du3Er^Hr<0jFs< z;qq7{J&b`ay>f=scwG_f7$EN(Gax*g!pGS6go%`=76{zl`EL3mVVXPlY(jr{^{xES zD)9q-88;d_zd;@{r_+pXkI?VxThIPgy%EOUJm@iI3Z=uNDKYUX8N+0UhsSnA({PIQ$ zPPXgRGb^5kvvve~HjD%b;z-5J9W>8OCxs=+ z`uK+VL!JltFboCz?4ME{dr81`Y6|W7XWw&@Sb%X*~DtqoT(%=O*T-9_WJi2Vcrb{uDtE`WUOL_+IbH zSO!24A9P2JH|r{XjN6l4zi*QfE@HGG4=#lw2|YmtV%9k2h;3*@Z8du1fSAuOJIYXGr37nM zJk11l3uo4}6KHS|Fv)#IY!9uIyRc%N=y>eG=Z67LuVeJx(Eczaem^-hk%9y}g$d9B zWE==)aC2})fJYH8gjZM?>vlXQH0OeB+GQ{yuq+tJQfxezO>_v(rva7il$r+li`^%C z``GZ%Fs8#!cxRM8{0Qcrc*vZBM~Y{{26Vw21N~Gq9uF?{FjiLJ3GZ=d1{U)UFHO0T z=-r8eqpK`WC<{O#%X&pt40nrkK+vp23! zhkxaKSK={KD}im!Tnr|8NU7Q8m((vxAN#xeu9}2^FPzoFh{pqu(IcY50-#V*dSXV% z(F5^*cBh4jdw0PuYeT$Ce}hgz8vpz7O|Wk?NM<({+7bt>m|a@ zEnrVCIXS#~ z^Po2i{RM_^Q>orbI_TwDej^$!Lojog@G9WHn;A^N88giVgtA`$e&Y#wB0r@LTHobol>HxGAR5 zsF;sm_TA{#Nt>i}$pIi3+kKlczcjO}PppWbmq2uVQ=S4OG56I^yDp6p zA-24`N1POhVXIHnXMYw3stkZwywBMNQ^FT4} z59;#ok?xozVKGX#A4@6>GKR;pApF7try(y0eo25|OMZf~;VxV80+q6&J_zuoKzQ%f zGM*Jb_^CSGrD66QKdnVZdPVNX4ck(=PMa08ONW4n9{(XzQ#NCjhcUTNk7<{az|oZSV!9+oLp} z5@wBknqw?F17_ZM!E{I6uK4fG`?!ZNq4CX(_`0mi=alwl$zh8`1~+4FS>0|fWDdq~M=Qq%9l0Z;{RX{H zj@+krE)vl&T$99`$--e?zT{l-O?>wrbC%N*8hdHK(jK`a zkj>Q{=(G9V?QXo@b^R6AB>Z~p5t8^Mbz720O+l`Ai`q{qd2#t6urHo0+3JE~7pbH&Y&(E2m{Z~F(*&#ntOU!S?qXzX6d2+$O +@property (weak) IBOutlet NSButton* pluginDelete; +@property (weak) IBOutlet NSButton* pluginWeb; +@property (weak) IBOutlet NSButton* pluginStatus; +@property (weak) IBOutlet NSTextField* pluginName; +@property (weak) IBOutlet NSTextField* pluginDescription; +@property (weak) IBOutlet NSImageView* pluginImage; +@end + +@implementation pluginTable + +- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { + if (_sharedMethods == nil) + _sharedMethods = [shareClass alloc]; + return [pluginsArray count]; +} + +- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id )info proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)op { + return NSDragOperationCopy; +} + +- (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id )info row:(int)row dropOperation:(NSTableViewDropOperation)operation { + NSPasteboard *pboard = [info draggingPasteboard]; + if ([[pboard types] containsObject:NSURLPboardType]) { + NSArray* urls = [pboard readObjectsForClasses:@[[NSURL class]] options:nil]; + NSMutableArray* sorted = [[NSMutableArray alloc] init]; + for (NSURL* url in urls) + { + if ([[url.path pathExtension] isEqualToString:@"bundle"]) + { + [sorted addObject:url.path]; + } + } + if ([sorted count]) + { + NSArray* installArray = [NSArray arrayWithArray:sorted]; + [_sharedMethods installBundles:installArray]; + } + } + return YES; +} + +-(NSColor*)inverseColor:(NSColor*)color +{ + CGFloat r,g,b,a; + [color getRed:&r green:&g blue:&b alpha:&a]; + return [NSColor colorWithRed:1.-r green:1.-g blue:1.-b alpha:a]; +} + +-(void)tableChange:(NSNotification *)aNotification +{ + id sender = [aNotification object]; + NSInteger selectedRow = [sender selectedRow]; + if (selectedRow != -1) { + if (selectedRow != previusRow) + { + NSColor *aColor = [[NSColor selectedControlColor] colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; + if (aColor) { + CustomTableCell *ctc = [sender viewAtColumn:0 row:selectedRow makeIfNecessary:YES]; + aColor = [self inverseColor:aColor]; + // [ctc.pluginName setFont:[NSFont boldSystemFontOfSize:13]]; + [ctc.pluginName setTextColor:aColor]; + [ctc.pluginDescription setTextColor:aColor]; + if (previusRow != -1) + { + CustomTableCell *ctc = [sender viewAtColumn:0 row:previusRow makeIfNecessary:YES]; + // [ctc.pluginName setFont:[NSFont systemFontOfSize:13]]; + [ctc.pluginName setTextColor:[NSColor blackColor]]; + [ctc.pluginDescription setTextColor:[NSColor grayColor]]; + } + previusRow = selectedRow; + } + + } + } + else { + // No row was selected + } +} + +- (void)tableViewSelectionDidChange:(NSNotification *)aNotification +{ + [self tableChange:aNotification]; +} + +- (void)tableViewSelectionIsChanging:(NSNotification *)aNotification +{ + [self tableChange:aNotification]; +} + +- (NSImage*)getbundleIcon:(NSDictionary*)plist +{ + NSImage* result = nil; + NSDictionary* info = [plist objectForKey:@"bundleInfo"]; + + NSString* iconPath = [NSString stringWithFormat:@"%@/Contents/icon.icns", [plist objectForKey:@"path"]]; + if ([iconPath length]) + { + result = [[NSImage alloc] initWithContentsOfFile:iconPath]; + if (result) return result; + } + + NSArray* SIMBLTargets = [info objectForKey:@"SIMBLTargetApplications"]; + for (NSDictionary* targetApp in SIMBLTargets) + { + iconPath = [targetApp objectForKey:@"BundleIdentifier"]; + iconPath = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:iconPath]; + if ([iconPath length]) + { + result = [[NSWorkspace sharedWorkspace] iconForFile:iconPath]; + if (result) return result; + } + } + + result = [[NSImage alloc] initWithContentsOfFile:@"/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/KEXT.icns"]; + return result; +} + +- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { + + CustomTableCell *result = (CustomTableCell*)[tableView makeViewWithIdentifier:@"MyView" owner:self]; + + NSDictionary* item = [pluginsArray objectAtIndex:row]; + NSDictionary* info = [item objectForKey:@"bundleInfo"]; + + result.pluginName.stringValue = [item objectForKey:@"name"]; + if([[item objectForKey:@"path"] length]){ + NSString *path = [item objectForKey:@"path"]; + NSArray *components = [path pathComponents]; + + if ([[components objectAtIndex:1] isEqualToString:@"Library"]) + { + [result.pluginStatus setImage:[NSImage imageNamed:@"NSStatusAvailable"]]; + } else { + [result.pluginStatus setImage:[NSImage imageNamed:@"NSStatusPartiallyAvailable"]]; + } + + if ([path containsString:@"Disabled"]) + [result.pluginStatus setImage:[NSImage imageNamed:@"NSStatusUnavailable"]]; + } + + result.pluginDescription.stringValue = [item objectForKey:@"description"]; + result.pluginImage.image = [self getbundleIcon:item]; + + if ([[confirmDelete objectAtIndex:row] boolValue]) + [result.pluginDelete setImage:[NSImage imageNamed:@"NSTrashFull"]]; + else + [result.pluginDelete setImage:[NSImage imageNamed:@"NSTrashEmpty"]]; + + // [result.pluginBlackList setEnabled:true]; + // NSNumber* n = [info objectForKey:@"SupportsBlackList"]; + // BOOL value = [n boolValue]; + // if (!value) + // [result.pluginBlackList setEnabled:false]; + + [result.pluginWeb setImage:[NSImage imageNamed:@"webicon.png"]]; + [[result.pluginWeb cell] setImageScaling:NSImageScaleProportionallyUpOrDown]; + + [result.pluginWeb setEnabled:true]; + [result.pluginWeb setHidden:false]; + NSString* webURL = [info objectForKey:@"DevURL"]; + if (![webURL length]) { + [result.pluginWeb setEnabled:false]; + [result.pluginWeb setHidden:true]; + } + + // Return the result + return result; +} + +- (IBAction)pluginWebpage:(id)sender { + NSTableView *t = (NSTableView*)[[[sender superview] superview] superview]; + NSDictionary* obj = [pluginsArray objectAtIndex:[t rowForView:sender]]; + NSString* webURL = [[obj objectForKey:@"bundleInfo"] objectForKey:@"DevURL"]; + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:webURL]]; +} + +- (IBAction)pluginFinder:(id)sender { + NSTableView *t = (NSTableView*)[[[sender superview] superview] superview]; + NSDictionary* obj = [pluginsArray objectAtIndex:[t rowForView:sender]]; + NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:[obj valueForKey:@"path"]]; + [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:[NSArray arrayWithObject:fileURL]]; +} + +- (IBAction)pluginToggle:(id)sender { + NSTableView *t = (NSTableView*)[[[sender superview] superview] superview]; + long selected = [t rowForView:sender]; + NSDictionary* obj = [pluginsArray objectAtIndex:selected]; + NSString* name = [obj objectForKey:@"name"]; + NSString* path = [obj objectForKey:@"path"]; + + NSArray* libDomain = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSLocalDomainMask]; + NSArray* usrDomain = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask]; + + NSString* libSupport = [[libDomain objectAtIndex:0] path]; + NSString* usrSupport = [[usrDomain objectAtIndex:0] path]; + + NSString* disPath = [NSString stringWithFormat:@"%@/SIMBL/Plugins (Disabled)/%@.bundle", libSupport, name]; + NSString* libPath = [NSString stringWithFormat:@"%@/SIMBL/Plugins/%@.bundle", libSupport, name]; + NSString* usrPath = [NSString stringWithFormat:@"%@/SIMBL/Plugins/%@.bundle", usrSupport, name]; + + if ([[obj objectForKey:@"path"] isEqualToString:disPath]) { + [_sharedMethods replaceFile:path :usrPath]; + } else if ([[obj objectForKey:@"path"] isEqualToString:usrPath]) { + [_sharedMethods replaceFile:path :libPath]; + } else { + [_sharedMethods replaceFile:path :disPath]; + } + + [_sharedMethods readPlugins:_tblView]; +} + +- (IBAction)pluginDelete:(id)sender { + NSTableView *t = (NSTableView*)[[[sender superview] superview] superview]; + long selected = [t rowForView:sender]; + if ([[confirmDelete objectAtIndex:selected] boolValue]) + { + NSDictionary* obj = [pluginsArray objectAtIndex:selected]; + NSString* path = [obj objectForKey:@"path"]; + NSURL* url = [NSURL fileURLWithPath:path]; + NSURL* trash; + NSError* error; + [[NSFileManager defaultManager] trashItemAtURL:url resultingItemURL:&trash error:&error]; + } + [_sharedMethods readPlugins:_tblView]; + [confirmDelete setObject:[NSNumber numberWithBool:true] atIndexedSubscript:selected]; +} + +@end + +@implementation CustomTableCell +@end + diff --git a/mySIMBL/repopluginTable.m b/mySIMBL/repopluginTable.m new file mode 100644 index 0000000..0f1d690 --- /dev/null +++ b/mySIMBL/repopluginTable.m @@ -0,0 +1,152 @@ +// +// repopluginTable.m +// mySIMBL +// +// Created by Wolfgang Baird on 3/24/16. +// Copyright © 2016 Wolfgang Baird. All rights reserved. +// + +@import AppKit; +#import "shareClass.h" +#import "AppDelegate.h" + +extern AppDelegate* myDelegate; +extern NSString *repoPackages; +long selectedRow; + +@interface repopluginTable : NSTableView +{ + shareClass *_sharedMethods; +} +@end + +@interface repopluginTableCell : NSTableCellView +@property (weak) IBOutlet NSTextField* bundleName; +@property (weak) IBOutlet NSTextField* bundleDescription; +@property (weak) IBOutlet NSTextField* bundleInfo; +@property (weak) IBOutlet NSTextField* bundleRepo; +@property (weak) IBOutlet NSImageView* bundleImage; +@property (weak) IBOutlet NSImageView* bundleIndicator; +@end + +@implementation repopluginTable +{ + NSArray *allPlugins; +} + +- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { + if (_sharedMethods == nil) + _sharedMethods = [shareClass alloc]; + + NSURL *dicURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/packages.plist", repoPackages]]; + allPlugins = [[NSArray alloc] initWithContentsOfURL:dicURL]; + + return [allPlugins count]; +} + +- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { + repopluginTableCell *result = (repopluginTableCell*)[tableView makeViewWithIdentifier:@"psView" owner:self]; + NSDictionary* item = [[NSMutableDictionary alloc] initWithDictionary:[allPlugins objectAtIndex:row]]; + result.bundleName.stringValue = [item objectForKey:@"name"]; + result.bundleDescription.stringValue = [item objectForKey:@"description"]; + NSString *bInfo = [NSString stringWithFormat:@"%@ - %@ - %@", [item objectForKey:@"version"], [item objectForKey:@"package"], [item objectForKey:@"homepage"]]; + result.bundleInfo.stringValue = bInfo; + result.bundleDescription.toolTip = [item objectForKey:@"description"]; + result.bundleImage.image = [self getbundleIcon:item]; + [result.bundleImage.cell setImageScaling:NSImageScaleProportionallyUpOrDown]; + return result; +} + +- (void)keyDown:(NSEvent *)theEvent +{ + NSString* const character = [theEvent charactersIgnoringModifiers]; + unichar const code = [character characterAtIndex:0]; + bool specKey = false; + switch (code) + { + case NSLeftArrowFunctionKey: + { + [myDelegate popView:nil]; + specKey = true; + break; + } + case NSRightArrowFunctionKey: + { + [myDelegate pushView:nil]; + specKey = true; + break; + } + case NSCarriageReturnCharacter: + { + [myDelegate pushView:nil]; + specKey = true; + break; + } + } + + if (!specKey) + [super keyDown:theEvent]; +} + +-(void)tableChange:(NSNotification *)aNotification +{ + id sender = [aNotification object]; + selectedRow = [sender selectedRow]; +// if (selectedRow != -1) { +// sourceTableCell *ctc = [sender viewAtColumn:0 row:selectedRow makeIfNecessary:YES]; +// repoPackages = [sourceURLS objectAtIndex:selectedRow]; +// if (selectedRow != previusRow) +// { +// NSColor *aColor = [[NSColor selectedControlColor] colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; +// if (aColor) { +// aColor = [self inverseColor:aColor]; +// [ctc.sourceName setTextColor:aColor]; +// [ctc.sourceDescription setTextColor:aColor]; +// if (previusRow != -1) +// { +// [ctc.sourceName setTextColor:[NSColor blackColor]]; +// [ctc.sourceDescription setTextColor:[NSColor grayColor]]; +// } +// previusRow = selectedRow; +// } +// } +// } +// else { +// // No row was selected +// } +} + +- (void)tableViewSelectionDidChange:(NSNotification *)aNotification +{ + [self tableChange:aNotification]; +} + +- (void)tableViewSelectionIsChanging:(NSNotification *)aNotification +{ + [self tableChange:aNotification]; +} + +- (NSImage*)getbundleIcon:(NSDictionary*)plist +{ + NSImage* result = nil; + NSArray* targets = [plist objectForKey:@"targets"]; + NSString* iconPath = @""; + for (NSDictionary* targetApp in targets) + { + iconPath = [targetApp objectForKey:@"BundleIdentifier"]; + iconPath = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:iconPath]; + if ([iconPath length]) + { + result = [[NSWorkspace sharedWorkspace] iconForFile:iconPath]; + if (result) return result; + } + } + + result = [[NSImage alloc] initWithContentsOfFile:@"/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/KEXT.icns"]; + return result; +} + +@end + +@implementation repopluginTableCell +@end \ No newline at end of file diff --git a/mySIMBL/shareClass.h b/mySIMBL/shareClass.h new file mode 100644 index 0000000..601eccb --- /dev/null +++ b/mySIMBL/shareClass.h @@ -0,0 +1,15 @@ +// +// shareClass.h +// mySIMBL +// +// Created by Wolfgang Baird on 3/13/16. +// Copyright © 2016 Wolfgang Baird. All rights reserved. +// + +@interface shareClass : NSObject + +- (void)readPlugins:(NSTableView *)pluginTable; +- (void)replaceFile:(NSString*)start :(NSString*)end; +- (void)installBundles:(NSArray*)pathArray; + +@end diff --git a/mySIMBL/shareClass.m b/mySIMBL/shareClass.m new file mode 100644 index 0000000..15cd443 --- /dev/null +++ b/mySIMBL/shareClass.m @@ -0,0 +1,136 @@ +// +// shareClass.m +// mySIMBL +// +// Created by Wolfgang Baird on 3/13/16. +// Copyright © 2016 Wolfgang Baird. All rights reserved. +// + +@import AppKit; +#import "shareClass.h" + +extern NSMutableArray *pluginsArray; +extern NSMutableArray *confirmDelete; + +@implementation shareClass + +- (void)installBundles:(NSArray*)pathArray { + // NSLog(@"%@", pathArray); + NSArray* libDomain = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSLocalDomainMask]; + NSString* libSupport = [[libDomain objectAtIndex:0] path]; + for (NSString* path in pathArray) { + if ([[path pathExtension] isEqualToString:@"bundle"]) + { + NSArray* pathComp=[path pathComponents]; + NSString* name=[pathComp objectAtIndex:[pathComp count] - 1]; + NSString* libPath = [NSString stringWithFormat:@"%@/SIMBL/Plugins/%@", libSupport, name]; + // NSLog(@"\n%@\n%@", libPath, path); + [self replaceFile:path :libPath]; + } + } +} + +- (void)replaceFile:(NSString*)start :(NSString*)end { + NSError* error; + if ([[NSFileManager defaultManager] fileExistsAtPath:end]) { + // NSLog(@"File Exists"); + [[NSFileManager defaultManager] replaceItemAtURL:[NSURL fileURLWithPath:end] withItemAtURL:[NSURL fileURLWithPath:start] backupItemName:nil options:NSFileManagerItemReplacementUsingNewMetadataOnly resultingItemURL:nil error:&error]; + } else { + // NSLog(@"File Doesn't Exist"); + [[NSFileManager defaultManager] moveItemAtURL:[NSURL fileURLWithPath:start] toURL:[NSURL fileURLWithPath:end] error:&error]; + } + // NSLog(@"%@", error); +} + +- (void)readFolder:(NSString *)str :(NSMutableDictionary *)dict { + + NSArray *appFolderContents = [[NSArray alloc] init]; + appFolderContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:str error:nil]; + + for (NSString* fileName in appFolderContents) { + if ([fileName hasSuffix:@".bundle"]) { + NSString* path=[str stringByAppendingPathComponent:fileName]; + NSString* name=[fileName stringByDeletingPathExtension]; + //check Info.plist + NSBundle* bundle = [NSBundle bundleWithPath:path]; + NSDictionary* info=[bundle infoDictionary]; + // NSDictionary* info=nil; + NSString* bundleIdentifier=[bundle bundleIdentifier]; + if(![bundleIdentifier length])bundleIdentifier=@"(null)"; + + NSString* bundleVersion=[bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; + if(![bundleVersion length])bundleVersion=[bundle objectForInfoDictionaryKey:@"CFBundleVersion"]; + + NSString* description=bundleIdentifier; + if([bundleVersion length]){ + description=[NSString stringWithFormat:@"%@ - %@", bundleVersion, description]; + } + + NSArray *components = [path pathComponents]; + NSString* location= [components objectAtIndex:1]; + NSString* endcomp= [components objectAtIndex:[components count] - 2]; + if([location length]){ + if ([endcomp containsString:@"Disabled"]) + { + description=[NSString stringWithFormat:@"%@ - %@ (Disabled)", description, location]; + } else { + description=[NSString stringWithFormat:@"%@ - %@", description, location]; + } + } + + NSMutableDictionary* itm=[NSMutableDictionary dictionaryWithObjectsAndKeys: + name, @"name", path, @"path", description, @"description", + bundleIdentifier, @"bundleId", bundleVersion, @"version", + info, @"bundleInfo", + [NSNumber numberWithBool:YES], @"enabled", + [NSNumber numberWithBool:NO], @"fileSystemConflict", + nil]; + + NSString* nameandPath = [NSString stringWithFormat:@"%@ - %@", name, path]; + + [dict setObject:itm forKey:nameandPath]; + } + } +} + +- (void)readPlugins:(NSTableView *)pluginTable { + pluginsArray = [[NSMutableArray alloc] init]; + confirmDelete = [[NSMutableArray alloc] init]; + NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init]; + + NSArray* libDomain = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSLocalDomainMask]; + NSArray* usrDomain = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask]; + + NSString* libSupport = [[libDomain objectAtIndex:0] path]; + NSString* usrSupport = [[usrDomain objectAtIndex:0] path]; + + NSString* libPathENB = [NSString stringWithFormat:@"%@/SIMBL/Plugins", libSupport]; + NSString* libPathDIS = [NSString stringWithFormat:@"%@/SIMBL/Plugins (Disabled)", libSupport]; + + NSString* usrPathENB = [NSString stringWithFormat:@"%@/SIMBL/Plugins", usrSupport]; + NSString* usrPathDIS = [NSString stringWithFormat:@"%@/SIMBL/Plugins (Disabled)", usrSupport]; + + NSString* OpeePath = [NSString stringWithFormat:@"/Library/Opee/Extensions"]; + + [self readFolder:libPathENB :myDict]; + [self readFolder:libPathDIS :myDict]; + + [self readFolder:usrPathENB :myDict]; + [self readFolder:usrPathDIS :myDict]; + + [self readFolder:OpeePath :myDict]; + + NSArray *keys = [myDict allKeys]; + NSArray *sortedKeys = [keys sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; + // sortedKeys = [[sortedKeys reverseObjectEnumerator] allObjects]; + + for (NSString *app in sortedKeys) + { + [pluginsArray addObject:[myDict valueForKey:app]]; + [confirmDelete addObject:[NSNumber numberWithBool:false]]; + } + + [pluginTable reloadData]; +} + +@end \ No newline at end of file diff --git a/mySIMBL/sourcesTable.m b/mySIMBL/sourcesTable.m new file mode 100644 index 0000000..cdbb952 --- /dev/null +++ b/mySIMBL/sourcesTable.m @@ -0,0 +1,161 @@ +// +// sourcesTable.m +// mySIMBL +// +// Created by Wolfgang Baird on 3/13/16. +// Copyright © 2016 Wolfgang Baird. All rights reserved. +// + +@import AppKit; +#import "shareClass.h" +#import "AppDelegate.h" + +extern AppDelegate* myDelegate; +NSString *repoPackages = @""; +NSArray *sourceURLS; + +@interface sourcesTable : NSTableView +{ + shareClass *_sharedMethods; +} +@end + +@interface sourceTableCell : NSTableCellView +@property (weak) IBOutlet NSTextField* sourceName; +@property (weak) IBOutlet NSTextField* sourceDescription; +@property (weak) IBOutlet NSImageView* sourceImage; +@property (weak) IBOutlet NSImageView* sourceIndicator; +@end + +@implementation sourcesTable +{ + NSInteger previusRow; + NSDictionary* item; +} + +- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { + if (_sharedMethods == nil) + _sharedMethods = [shareClass alloc]; + +// [self setTarget:self]; +// [self setDoubleAction:@selector(doubleClickInTable:)]; + + item = [[NSMutableDictionary alloc] initWithDictionary:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]]; + sourceURLS = [item objectForKey:@"sources"]; + + return [sourceURLS count]; +} + +- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { + sourceTableCell *result = (sourceTableCell*)[tableView makeViewWithIdentifier:@"sView" owner:self]; + + result.sourceIndicator.animates = YES; + result.sourceIndicator.image = [NSImage imageNamed:@"loading_mini.gif"]; + result.sourceIndicator.canDrawSubviewsIntoLayer = YES; + [result.superview setWantsLayer:YES]; + + dispatch_queue_t backgroundQueue = dispatch_queue_create("com.w0lf.mySIMBL", 0); + dispatch_async(backgroundQueue, ^{ + NSArray* sourceURLS = [item objectForKey:@"sources"]; + NSString* source = [sourceURLS objectAtIndex:row]; + NSURL* data = [NSURL URLWithString:[NSString stringWithFormat:@"%@/resource.plist", source]]; + NSMutableDictionary* dic = [[NSMutableDictionary alloc] initWithContentsOfURL:data]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [result.sourceIndicator setImage:[NSImage imageNamed:NSImageNameRightFacingTriangleTemplate]]; + + if ([source length]) + result.sourceDescription.stringValue = source; + + if (dic) + { + if ([dic objectForKey:@"name"]) + result.sourceName.stringValue = [dic objectForKey:@"name"]; + result.sourceImage.image = [[NSImage alloc] initByReferencingURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/icon.png", source]]]; + } + }); + }); + + return result; +} + +-(NSColor*)inverseColor:(NSColor*)color +{ + CGFloat r,g,b,a; + [color getRed:&r green:&g blue:&b alpha:&a]; + return [NSColor colorWithRed:1.-r green:1.-g blue:1.-b alpha:a]; +} + +- (void)keyDown:(NSEvent *)theEvent +{ + NSString* const character = [theEvent charactersIgnoringModifiers]; + unichar const code = [character characterAtIndex:0]; + bool specKey = false; + switch (code) + { + case NSLeftArrowFunctionKey: + { + [myDelegate popView:nil]; + specKey = true; + break; + } + case NSRightArrowFunctionKey: + { + [myDelegate pushView:nil]; + specKey = true; + break; + } + case NSCarriageReturnCharacter: + { + [myDelegate pushView:nil]; + specKey = true; + break; + } + } + + if (!specKey) + [super keyDown:theEvent]; +} + +-(void)tableChange:(NSNotification *)aNotification +{ + id sender = [aNotification object]; + NSInteger selectedRow = [sender selectedRow]; + if (selectedRow != -1) { + sourceTableCell *ctc = [sender viewAtColumn:0 row:selectedRow makeIfNecessary:YES]; + repoPackages = [sourceURLS objectAtIndex:selectedRow]; + if (selectedRow != previusRow) + { + NSColor *aColor = [[NSColor selectedControlColor] colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; + if (aColor) { + aColor = [self inverseColor:aColor]; + [ctc.sourceName setTextColor:aColor]; + [ctc.sourceDescription setTextColor:aColor]; + if (previusRow != -1) + { + [ctc.sourceName setTextColor:[NSColor blackColor]]; + [ctc.sourceDescription setTextColor:[NSColor grayColor]]; + } + previusRow = selectedRow; + } + } + } + else { + // No row was selected + } +} + +- (void)tableViewSelectionDidChange:(NSNotification *)aNotification +{ + [self tableChange:aNotification]; +} + +- (void)tableViewSelectionIsChanging:(NSNotification *)aNotification +{ + [self tableChange:aNotification]; +} + +@end + +@implementation sourceTableCell +@end \ No newline at end of file