From 50d2acc31dfb7249ffbf50f91ead0f8f6396b0b1 Mon Sep 17 00:00:00 2001 From: Eric Chamberlain Date: Fri, 25 Apr 2014 23:52:23 -0700 Subject: [PATCH 1/6] Added comments regarding checking if a directory exists. Better logging. --- .../project.xcworkspace/xcshareddata/FTPKit.xccheckout | 2 +- FTPKit/FTPClient.m | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout b/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout index 7204b8a..3ce52ad 100644 --- a/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout +++ b/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout @@ -5,7 +5,7 @@ IDESourceControlProjectFavoriteDictionaryKey IDESourceControlProjectIdentifier - 540164E0-A7B5-4DAB-B0C4-5F108479B2B0 + E93B999A-D4E3-4A79-B06B-F1C6CD684017 IDESourceControlProjectName FTPKit IDESourceControlProjectOriginsDictionary diff --git a/FTPKit/FTPClient.m b/FTPKit/FTPClient.m index a8a53d7..8259758 100644 --- a/FTPKit/FTPClient.m +++ b/FTPKit/FTPClient.m @@ -97,8 +97,7 @@ - (long long int)fileSizeAtPath:(NSString *)path int stat = FtpSize(cPath, &bytes, FTPLIB_BINARY, conn); FtpQuit(conn); if (stat == 0) { - FKLogError(@"SIZE %@", path); - self.lastError = [NSError FTPKitErrorWithCode:451]; + FKLogError(@"File most likely does not exist %@", path); return -1; } FKLogDebug(@"%@ bytes %d", path, bytes); @@ -602,6 +601,8 @@ - (NSDate *)lastModifiedAtPath:(NSString *)remotePath - (BOOL)directoryExistsAtPath:(NSString *)remotePath { + // @note this is a hack until I can implement CWD. You must make sure that + // the directory testing is not the current working directory. NSArray *contents = [self listContentsAtPath:remotePath showHiddenFiles:NO]; if (contents) return YES; From 62a3881e4737930f71f89d9d77c8dcada563a3d6 Mon Sep 17 00:00:00 2001 From: Eric Chamberlain Date: Sat, 26 Apr 2014 22:35:46 -0700 Subject: [PATCH 2/6] New: Added command to change working directory Fix: No longer fails to detect if a directory exists when there are no contents in the directory --- .../xcshareddata/FTPKit.xccheckout | 2 +- .../UserInterfaceState.xcuserstate | Bin 70465 -> 70687 bytes FTPKit/FTPClient.h | 11 ++++++++ FTPKit/FTPClient.m | 24 ++++++++++++++++-- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout b/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout index 3ce52ad..60b92d3 100644 --- a/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout +++ b/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout @@ -5,7 +5,7 @@ IDESourceControlProjectFavoriteDictionaryKey IDESourceControlProjectIdentifier - E93B999A-D4E3-4A79-B06B-F1C6CD684017 + 0D43D20B-7C29-40D3-AB6D-C88835E14C15 IDESourceControlProjectName FTPKit IDESourceControlProjectOriginsDictionary diff --git a/FTPKit.xcodeproj/project.xcworkspace/xcuserdata/eric.xcuserdatad/UserInterfaceState.xcuserstate b/FTPKit.xcodeproj/project.xcworkspace/xcuserdata/eric.xcuserdatad/UserInterfaceState.xcuserstate index 396038cdfd5c0410b76ede77d9fe82f95a1473b7..5c1d30aa91202a8d751e7123c119a64d53732bc0 100644 GIT binary patch delta 22310 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 Date: Sat, 26 Apr 2014 22:37:35 -0700 Subject: [PATCH 3/6] =?UTF-8?q?Fix:=20Somewhat=20better=20logic=20used=20t?= =?UTF-8?q?o=20determine=20if=20a=20remote=20handle=20exists=20or=20not.?= =?UTF-8?q?=20It=20now=20checks=20if=20there=20is=20a=20remoteHandle=20on?= =?UTF-8?q?=20the=20file.=20If=20there=20is=20no=20remoteHandle=20on=20the?= =?UTF-8?q?=20file=20it=20=5Fassumes=5F=20that=20the=20file=20doesn?= =?UTF-8?q?=E2=80=99t=20exist=20on=20the=20server.=20I=20also=20made=20sur?= =?UTF-8?q?e=20all=20FMs=20associate=20the=20remoteHandle=20to=20new=20fil?= =?UTF-8?q?es=20AFTER=20it=20is=20known=20that=20the=20file=20addition=20s?= =?UTF-8?q?ucceeded.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 70687 -> 70687 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/FTPKit.xcodeproj/project.xcworkspace/xcuserdata/eric.xcuserdatad/UserInterfaceState.xcuserstate b/FTPKit.xcodeproj/project.xcworkspace/xcuserdata/eric.xcuserdatad/UserInterfaceState.xcuserstate index 5c1d30aa91202a8d751e7123c119a64d53732bc0..9dde9e4af6f293b95188f30b5b353134293cb782 100644 GIT binary patch delta 31 ncmbQgf@S^+mJOHIu%6peF|Bj+^)uYXV1DQLx*f(!`k*N&;5%&=I From f2adb5508578e35f5c818e810dd292901b7c9d9e Mon Sep 17 00:00:00 2001 From: Eric Chamberlain Date: Wed, 30 Apr 2014 10:08:23 -0700 Subject: [PATCH 4/6] Described how the lib currently works in regards to a connection being made for every command issued to the server. Added new API command printWorkingDirectory. This is currently not useful because the connection is not saved between commands AND the cwd is not being tracked. Cleaned up logic to check for existing directory. Updated unit tests for all new commands. --- FTPKit Tests/FTPKit_Tests.m | 27 ++++++++- .../xcshareddata/FTPKit.xccheckout | 2 +- .../UserInterfaceState.xcuserstate | Bin 70687 -> 70461 bytes FTPKit/FTPClient.h | 23 ++++++++ FTPKit/FTPClient.m | 53 ++++++++++++++++-- Libraries/include/ftplib/src/ftplib.c | 2 +- 6 files changed, 98 insertions(+), 9 deletions(-) diff --git a/FTPKit Tests/FTPKit_Tests.m b/FTPKit Tests/FTPKit_Tests.m index 661e416..88de5ab 100644 --- a/FTPKit Tests/FTPKit_Tests.m +++ b/FTPKit Tests/FTPKit_Tests.m @@ -42,6 +42,10 @@ - (void)testFtp { FTPClient * ftp = [[FTPClient alloc] initWithHost:@"localhost" port:21 username:@"unittest" password:@"unitpass"]; + // Sanity. Make sure the root path exists. This should always be true. + BOOL success = [ftp directoryExistsAtPath:@"/"]; + XCTAssertTrue(success, @""); + NSArray *contents = [ftp listContentsAtPath:@"/test" showHiddenFiles:YES]; //XCTAssertNil(contents, @"Directory should not exist"); XCTAssertEqual(0, contents.count, @""); @@ -56,7 +60,7 @@ - (void)testFtp NSURL *localUrl = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"ftplib.tgz"]; // Download 'ftplib.tgz' - BOOL success = [ftp downloadFile:@"/ftplib.tgz" to:localUrl.path progress:NULL]; + success = [ftp downloadFile:@"/ftplib.tgz" to:localUrl.path progress:NULL]; XCTAssertTrue(success, @""); // Upload 'ftplib.tgz' as 'copy.tgz' @@ -80,7 +84,7 @@ - (void)testFtp XCTAssertTrue(exists, @""); exists = [ftp directoryExistsAtPath:@"/badpath"]; - XCTAssertTrue(exists, @""); + XCTAssertFalse(exists, @""); bytes = [ftp fileSizeAtPath:@"/badpath.txt"]; XCTAssertEqual(-1, bytes, @""); @@ -107,6 +111,25 @@ - (void)testFtp success = [ftp createDirectoryAtPath:@"/test/test2"]; XCTAssertTrue(success, @""); + NSString *cwd = [ftp printWorkingDirectory]; + XCTAssertTrue([cwd isEqualToString:@"/"], @""); + + // Change directory to /test + success = [ftp changeDirectoryToPath:@"/test"]; + XCTAssertTrue(success, @""); + + /** + Currently the connection is not left open between calls and therefore we + will always be put back to the root directory when each command is sent. + + Uncomment this when the same connection is used between commands. + + // Make sure we are still in /test. + cwd = [ftp printWorkingDirectory]; + NSLog(@"cwd is %@", cwd); + XCTAssertTrue([cwd isEqualToString:@"/test"], @""); + */ + // List contents of 'test' contents = [ftp listContentsAtPath:@"/test" showHiddenFiles:YES]; diff --git a/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout b/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout index 60b92d3..345ad3f 100644 --- a/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout +++ b/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout @@ -5,7 +5,7 @@ IDESourceControlProjectFavoriteDictionaryKey IDESourceControlProjectIdentifier - 0D43D20B-7C29-40D3-AB6D-C88835E14C15 + FFB1D962-3AFB-47F5-90AC-92CAB51F481A IDESourceControlProjectName FTPKit IDESourceControlProjectOriginsDictionary diff --git a/FTPKit.xcodeproj/project.xcworkspace/xcuserdata/eric.xcuserdatad/UserInterfaceState.xcuserstate b/FTPKit.xcodeproj/project.xcworkspace/xcuserdata/eric.xcuserdatad/UserInterfaceState.xcuserstate index 9dde9e4af6f293b95188f30b5b353134293cb782..fd867cf0d10d1db9d9b7b8644652b548e404f40b 100644 GIT binary patch delta 23969 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 z�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 KfBpY7fBX-1xw9+) diff --git a/FTPKit/FTPClient.h b/FTPKit/FTPClient.h index 88b8226..c90892b 100644 --- a/FTPKit/FTPClient.h +++ b/FTPKit/FTPClient.h @@ -4,6 +4,10 @@ Consider implementing more of the commands specified at: http://en.wikipedia.org/wiki/List_of_FTP_commands + Currently this creates a new connection to the FTP server for every command + issued. This means the state of the current working directory is NOT kept and. + therefore, some commands are not of use. + */ #import "FTPHandle.h" @@ -428,9 +432,28 @@ /** Change the working directory to remotePath. + @note This is currently used ONLY to determine if a directory exists on the + server. The state of the cwd is not saved between commands being issued. This + is because a new connection is created for every command issued. + + Therefore, in its current state, it is used in a very limited scope. Eventually + you will be able to issue commands in the cwd. Not right now. + @param remotePath Remote directory path to make current directory @return YES if the directory was successfully changed. */ - (BOOL)changeDirectoryToPath:(NSString *)remotePath; +/** + Returns the current working directory. + + @note Currently this will always return the root path. This is because the + lib creates a new connection for every command issued to the server -- and + therefore the command will always being in the root path when issuing the + command. + + @return The current working directory + */ +- (NSString *)printWorkingDirectory; + @end \ No newline at end of file diff --git a/FTPKit/FTPClient.m b/FTPKit/FTPClient.m index ae222b9..288ad16 100644 --- a/FTPKit/FTPClient.m +++ b/FTPKit/FTPClient.m @@ -140,7 +140,7 @@ - (NSArray *)listContentsAtHandle:(FTPHandle *)handle showHiddenFiles:(BOOL)show } /** Please note: If there are no contents in the folder OR if the folder does - not exist data.bytes _will_ 0. Therefore, you can not use this method to + not exist data.bytes _will_ be 0. Therefore, you can not use this method to determine if a directory exists! */ [[NSFileManager defaultManager] removeItemAtPath:tmpPath error:&error]; @@ -606,12 +606,40 @@ - (NSDate *)lastModifiedAtPath:(NSString *)remotePath - (BOOL)directoryExistsAtPath:(NSString *)remotePath { - // @note this is a hack until I can implement CWD. You must make sure that - // the directory testing is not the current working directory. + /** + Test the directory by changing to the directory. If the process succeeds + then the directory exists. + + The process is to get the current working directory and change _back_ to + the previous current working directory. There is a possibility that the + second changeDirectoryToPath: may fail! This is really the price we pay + for this command as there is no other accurate way to determine this. + + Using listContentsAtPath:showHiddenFiles: will fail as it will return empty + contents even if the directory doesn't exist! So long as the command + _succeeds_ it will return an empty list. + + // Get the current working directory. We will change back to this directory + // if necessary. + NSString *cwd = [self printWorkingDirectory]; + // No need to continue. We already know the path exists by the fact that we + // are currently _in_ the directory. + if ([cwd isEqualToString:remotePath]) + return YES; + // Test directory by changing to it. BOOL success = [self changeDirectoryToPath:remotePath]; + // Attempt to change back to the previous directory. if (success) - return YES; - return NO; + [self changeDirectoryToPath:cwd]; + return success; + */ + + /** + Currently the lib creates a new connection for every command issued. + Therefore, it is unnecessary to change back to the original cwd. + */ + BOOL success = [self changeDirectoryToPath:remotePath]; + return success; } - (BOOL)changeDirectoryToPath:(NSString *)remotePath @@ -629,4 +657,19 @@ - (BOOL)changeDirectoryToPath:(NSString *)remotePath return YES; } +- (NSString *)printWorkingDirectory +{ + netbuf *conn = [self connect]; + if (conn == NULL) + return NO; + char cPath[kFTPKitTempBufferSize]; + int stat = FtpPwd(cPath, kFTPKitTempBufferSize, conn); + FtpQuit(conn); + if (stat == 0) { + self.lastError = [NSError FTPKitErrorWithCode:450]; + return NO; + } + return [NSString stringWithCString:cPath encoding:NSUTF8StringEncoding]; +} + @end diff --git a/Libraries/include/ftplib/src/ftplib.c b/Libraries/include/ftplib/src/ftplib.c index d651e44..c2318ff 100644 --- a/Libraries/include/ftplib/src/ftplib.c +++ b/Libraries/include/ftplib/src/ftplib.c @@ -1359,7 +1359,7 @@ GLOBALDEF int FtpPwd(char *path, int max, netbuf *nControl) int l = max; char *b = path; char *s; - if (!FtpSendCmd("PWD",'2',nControl)) + if (!FtpSendCmd("PWD", '2', nControl)) return 0; s = strchr(nControl->response, '"'); if (s == NULL) From 414a19028d2403263515a9ceb12dc6969f0fc829 Mon Sep 17 00:00:00 2001 From: Eric Chamberlain Date: Wed, 30 Apr 2014 10:39:54 -0700 Subject: [PATCH 5/6] lastModifiedAtPath can now be called asynchronously. directoryExistsAtPath can now be called asynchronously. Fix: When returning error back to callee it no longer nils out the _lastError before the callee has a chance to read the error. Instead, before the error is returned to the callee, the _lastError is copied and then sent back to the callee. --- .../xcshareddata/FTPKit.xccheckout | 2 +- .../UserInterfaceState.xcuserstate | Bin 70461 -> 71101 bytes FTPKit/FTPClient.h | 32 +++++++- FTPKit/FTPClient.m | 76 ++++++++++++------ README.md | 18 ++++- .../UserInterfaceState.xcuserstate | Bin 30681 -> 32565 bytes .../FTPKitSample/Tests/GeneralTest.m | 28 ++++++- 7 files changed, 127 insertions(+), 29 deletions(-) diff --git a/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout b/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout index 345ad3f..f9cdbd2 100644 --- a/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout +++ b/FTPKit.xcodeproj/project.xcworkspace/xcshareddata/FTPKit.xccheckout @@ -5,7 +5,7 @@ IDESourceControlProjectFavoriteDictionaryKey IDESourceControlProjectIdentifier - FFB1D962-3AFB-47F5-90AC-92CAB51F481A + 318C0C2B-1164-4EF8-AF86-3CEB547A24B6 IDESourceControlProjectName FTPKit IDESourceControlProjectOriginsDictionary diff --git a/FTPKit.xcodeproj/project.xcworkspace/xcuserdata/eric.xcuserdatad/UserInterfaceState.xcuserstate b/FTPKit.xcodeproj/project.xcworkspace/xcuserdata/eric.xcuserdatad/UserInterfaceState.xcuserstate index fd867cf0d10d1db9d9b7b8644652b548e404f40b..0a180f5bcf6aeb1a5c2c4d89f19dc10cc1d2fb81 100644 GIT binary patch delta 23258 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 Ksm+>Q@9;mq;EhTE delta 23047 zcmZ^K2S8NE^Z%Xioub^`D+lP&d#?%zVgaRy(gdU(C!&C&2#O#m=&|;W@MzL|m)?t1 zK?T7c6OA>-5{)Lt7^Bhu-aFBJzrXKa6z9!+W_EUVW_MrN-Ws&G96cq6l=CW5_g=5*ebDWWmf?OfHjT$}wj*{x-@)D$yFMciIvbmqoJVnwf|SD#F9=3>mjD4Jaf_;*m&CX%xvMbqD>}qxmyPe&^?qqkdN7$q6^Xv=k8|<6x@7Ryn zKd~RPe`f#Ae#8Dl#D2?Ra;9+*4#vSb1c&4(b5uC097B!~$CzWnvEeM_EaEtGR&Z8w zd^vs`e@*}=jI)8WkrU2|0=oN;svQGEO6>iPOyK zv$)dS+1xo?K3ATr z&DG)Ra`m_tTubhJt`*mw>%ev7I&r=1SsJAxg>(y(+a1Ixtnu}Z88tHx@uTI>u~hjn0`SQplf zox?`3QEUtoO=9=3``82QA@&IS344nDg1x|AV!vX)W1n#ZM{y~9CeFdtaCKY**Tl7O zZCnS}#r1G~+!nXPm*UHCd)xtc#GUZvxHG;2UyBFh>+tn>2p)=u;T!OccsL$~Z^d`u zaX7&D;`{LZ_+dO7&%tx?JUm~77vP0>5nhZp;Ei|_-i-I+XYpbDJbnScgkQ$5;n(q7 z`1kma_yhbQ{s@19|AN23|H9wnf8!tUkAxI4lbA(F6KsMccm$u2CsYU>LYL4Z^a%rE z9$`*c5Z1&J!j^C#TnRVAo$w|62!A4&*i39A;t0_$VmFaQ0O9~~lsHMG5*b7;QAAV` z)kF=^OtcW^i3`L^HgY+U-i^u>{KyD+W$?aqe z8B6XUDg(o2S9kXZy)a%?>O%SFP)dc%j6aC z3VB7mVrrZ866PMNQ97AO@&TwjKs^EK3(z=##y5MimojJa0P2vW9fa#pOs-;cCufk! zRHqU#Eou-`qYB`^N0<$jh|34gVn{P~Fyf0CaY-6UT2~q3>s^e5!X(YB41Y!dV>e^Z z8aFT3*qGpT5utX`(ZM@QATOG+Mj}pPfWWU}uh5thMiOH$W6f$eFL=?MhVPojPAF!y zG1`+XlNKgvHp}xYrm>T}l6>eN-z04clhdLO${wTE$!hB0OxgjaG$Wyi$xiYXJ0Z=) zm^hR0ck?pd9uplNxglvaRUof8A3De6F=c{q>|6V^yacjk8EgEY3-mS4kQklANT|mj zHwVhqF%_AwnZGfAXTD+n!FDq`I!)t{R#s4@X&$5< z6jW!4b>)&)2jNVL=DCrIq&-Zcg z^m2B0n^F{sC9|0>;gOqRekUd_UF~M?;t=HGZfE~3zXH;lgS3o>#9$_*?Y_|2kdD+) zqK)T4I#t6+Uu?WkY+Ux6aaX%#%Y)p5y!}1CnlFLyXBrB$YB{8(H6@u;1!+@FNfy>Z zI!M#dKy0#JY*Oxu5=Ac0<}n zON&mIv;P&?DVvTic1~Z74nTzpElElYLwe$ip;1Wx^M!vA(wf?mhA%h0E% zbmSqVYjref8;`|Mc^dj!N0QY~q4=|o1ugzXEY_gK-ns;B=~r6Jrw-^U(vaV#ApAMd zg`njQ|IV#H#6nf5uPQy|+&id0Lr+qqe?!_vPm=imKzgelT_^|x(iwVm0U-#a&r9&g zbVz^HqYEFI3F*1|bb2CeNDK98I|v5pRDC*f2np$P`g&r&5m`vT)u)ROnFDEU13D`a z1xR}tETb{Xkk0!;t3mpSfyAaJq!kS%zUe@EsiDL-eMp-a&8ChSa%p`dcwJ~HY1V!}d(!c1hTFcUg8kyVg) z!i1jT5$`YZS0;42A-?eXvXK_$VM@=ONPyU+KBa1`PUV@hX_G<-X)s+t(`zC9o9QCD z_4Q(?3Elb{GY-uP6SE}U%Q2IqS>a;VLK^kJOrB;%h*@)Kmcd+{wi`v;)uJ}cokK&S z#Sn99Y_19Z?}|fWA@2NK$ymnIIElQJhX$o6{wN9D+@+GB>APKMLt! z3w5f_T!mISAyzT@q9RX2PC*D^;Y`yM4Y#A|44T%aCN1d64ml04fBS;Vg|waJV%lWE ze|k}ADeIPdVQd_OGX#Mu7mKCXPD|%OhbV0~nD_dIJ zD;C>8TLzSuwG7>QKNLq=ub}B6NcUMwQhG!TT}*AW)}yQ!&@&ry0gC+>_|cZe#bR6P zH=8-swFQPWYf{p-geAlCaIm*?^LAb~nv1T5lt%>KkI-auurIb`CXe zBZ>Vj$oti1HSN&tuX2ovTr5rPTPR7RyW*x?VCx1n`_4j1K0lapO2W2W#HAhkX$oyl z?Oh}Z$`fcf7*^+6TMg>YqFFTTxftf~)u{GjNu9rhP}{{GH01SvLM|`n(d;*3w*6O4 zjU|#P;7__I#IvbCe9FH{POZ5JC;leV*E-5h-3!aKE&qtf5dzkNY-A)33Co{CU{ zHZ1WoeJQNW3$ETLTX^CB^9>JfM&^yS+1~sb82!Ky|+M>pvIKT`u23y zqN-xpG8!hbr(=a`d}Cey!qOJA#JOZnUACXWbFo|M;PNGFP(86s99mj7+r!Qi?$*4& zZmCei|J3!db6Neh+a~{RY6j28&ePd$smoXKTOy49kqwNZ7%xMJtqz|xq?NlSWa)RP^bUm*L>lxplx{41K=ud!jB@B>ro$<&!pBk z)5|UD@h{a8XL_%XdO_Z6XE$2SN37=XRc+S_$vF9o*~=i?dX9J_9<J*{@Klj*4`(EE~U&o6{s8!H5of^FMqeG$q79u7CKA`sdjgI8AXqX+3sK2 zvpgi>Ixc2AePwU(z~~l|#q8x@*k&{<^*`*+_HuA>403jJp1RdR)BmlaMuo1zX|*gd z+Z9?`MD?tap;$ z0LcMJ0YFLsQVx)6fYbq`5g@Gq=>SL%K>7eONL>-i=>7Yz(crg=}Q4qnDrS2wsH$OPNnskwJ zlk$*qms$mo2r$hPO!EfQyuh^8W$fwf84P{)O!h2*Yyn6lnC1wOD1dBD()M2#6%y(g z6%n%i%TTZ}+Uj0tbzZa4884<@XhfRo4PnAuGjl6TLsheRb1ioVB+Q*_VLjha^=ky# zGHgDzt%1*zXDh&_lmHS9knMCsG1QGZeMEz;OHJm?kzwnx^&!9zAUgmOM+4$1<9a>4 zx$OB2!&3GP|#+t@oKfH-zM1VDFA0OTYMNTyaa>LE$&1JtQ<=)ytvAqar#DF8{O0Tfl- zXow`U)2J(rd|tYg50qyCBppoiqvaXYKaI*r9=n*9m#|Br9Ht6{oTla3)QTn}q?X-C zccF>h4COF=asiS@%k!!7CVixv-A~I0*n?0$43I*A6w&fx>T{C;a*;hL3HfE(folLM zopPXz@^4n1c8g8z&fv?i@3QYf0}lXF0gy`CKowQlY=AsrzmW9sCHq$hcny#mfYj1} zGt{&eZRAh(2f7Cz=>|Rnq<*S_2FkZZ89_NSX#<>D9BGC=hXar%fHczvTBy<%eT2uE zLtSa%bNC#2$pE(jq@8-#qK>F>;N}KZS)*v(WZ$A zIBRKnFlQZM(0;0J&_2FTAe;0dMDsfXO>Jf;eI zU=u%coln=jBS2~qY&Oh8~;s`C|B3zWA z&z%ksm{-5iCVo%S*0Ad&LUtXz=iw)wp{*^=cl#yGoA>XThRfy>lv>st87|4?K?AY? z`2!$tX#;;!JG(Ry1+JH_%4{#514{;B3k8qE2k8zI!R0g1O0G$I+d4MVc zR2iVE09CK#p5!KTPjOSYsa%Si#!UyPCO{1UY7EeM0JQ|DH9!{wxGRK9peKA>@5S(D ztmbAXF_QQIm8F7v?W77M7qh8qcu^|3;8SnlMU~`2fm(Rhj#)>&=$%7loHdndmatW* z3CQlC_MGKYdVMBRy%M$twYF~&(a#-Z7#48{0IF5Q9RjE}RoAEKGs=i6;+_YnPLk>k z=*%td7~^~HIQJ66TgsA~&Ak$YR#hs<6ei4`)6`*aBot&{RVD&^g9ObE$;UMH!tTYonr0}j5YseNKkjUKf>pS z&h`#2Q5)=|*2jvU4!cCH4~_|siY(#Y<=&%;`mKov+(+U*JOn8G{S!cq#C=eC%7`jV zQvI@_;QqpWDaO12s7Vp`SAd#|F{0na{d@yZv;Wo4QtsbVU4dgT_ghy!a&O`oK=r0< zf5w9G>=UO@CM?4gt3bIw`j_~g4n)fFN9$j@y!|u(D_r=WX0BC zZdv^=Yjxk8Rr;4P6-*5p!(a+7D8keMygz~OkN94p5uxj2LPMzTJ~y{$ScJj%Y0Lkk#IQg~ zH8_c%&lK%fPK}#IO$^BpL0GU@3r-x)Mc6uku7LTXVULB0o8JJ?l}W1Cu}zFyjPGH2 zXkroA7A#VdsjFhc*Kc--irVZEydl&rcFVfZXz}YjSAefriB5W_iuoz3i06@I}>RpWO!}bFd zcFu=#Klhu~F)W#3Sb`nLPGBbi>IYDNfCiLcr?3<(6`%ru#sYK)6*>~-l*LFW#ZF_{ zSPqs8&_IB$2Po`VM3Uyz7!+V7Vq1k+5mpRPAwbsvG^hkC#mca9fWpWG19TmwFq*Gb zk2U`Y4u?J{|h;Q4PtQefm25~KsQmU=VfM`XGmigu#3$$ z=eJA~ZKkIKY#h5J{Q6?hJ~$@01hOU=Ykb_i#8*>}U&g*;7?wlFuVUA*V(bQXlXia# zKqFxf017Ajt>xG)#z*W2>^9>g<0C+~CBc`i(EyD}@`OLIM%3Y?W4Asgd`Ec9PEX2x zjHDKh9Tq)?PW_BM@rCa#W5TzDidV}}x%ugEFyQ_jzP!YqVb3Mbgcf7Z7;A!X!aFJ? zc&BP`jH;RG0#i#>J6HUYxfM*42WSF7cZ-MZ>$-tYlO**n>eMzl zs$l~`B@@zA+4y3q84^Jv6};Yox*N%+o=gxPTzocM%5V(FaRMiC9xj8+;&K3m(^C>a zVdwS&bRR%ro*e+_!Ag7%&d1??k-^1r23+9*dI+G00ZY8SPePzh^YY21OpyT&Cxj~8 z5I4e&aTDAWH^b-R^Kf&39s%f4fF1+rae$rxC`{C3fSv+qN)>L&P{*xsYkUE2!_dbU zF*E_13X>hB01Bt+zX5BPcnM}5Nb*V27Qi9$4qoRHye>2XE=cgoYhzTLTkwwX4Z$%{ zWV8@+974ilqN44hLxY2GBPw{3Pc6L?PjRmBMFKbo%Ob+zf?~YoOXA=w@zr9NU2s?2 z4R^;q@Kv}c?uB~;G!3BX0L=hsCP1?QdK#eF0L=ktZWVOc7e+yop@|FdKwOBg5&N5$ zgh3a50D2CfcL4e$Kz|lz6)yJBK6G8|h8Y_|X}72aS2HvNB7%2D#m0C?hlWnMvI&oX z<&SR$Xnqk6Gq-@cbaSr#HhjC73lp`l2#*11QIfW|YjAkvlvX^R$RJDbo%k*sCIzh8 z5`dPL;Jcx7a4^fn4h>QE--WC_0Ov9MAVAB%u8{Z;m7e4_(?n&hhtI! z&`N+-0kj&RH2|#z=$Q&U6{qktJRQ%#GjSM=I)K&#v>BlN0Br~806+&Rsawq=yacae zkY#Mf|Nq7quYtpS28Va(u#XM&_Noz}O-VL%X+@;v>HdH3d~e__cq>C1Z^PU14!jfZ z!n+xoFvMT?3Do!3oY*}8Z3So_KwFZ0D5L9E_I-?~61*QDzy|@^2GCA`b|tA^#m_-Y z8Te>`a|q0c@UZYu7-QI%j(?{KUE=sfe2ltuT?Hw|$EmUF8a7Z9OT|awyb9qGLs!I? z-SF~DrC+0$iCg#${3Zh?Q!hZzCNY9=Q)=LtF108@YNo{U5BP1$h76;Tty6RDcVewXX091{L(foOx48_zy8nZ2A-anP3o1 zfQ|ul9H5r~Isxyq8JgUm80zAg0_LI-)&Ijj_>~$4lbYZH^l}kH6AqK!9c4m>kP|ay z0eZEFm<`Zt)N4|~oKRpS6cdVs5hkraBfn9wA&0Qwz3 zZ&B7f4bfNkHEh9shWO7HZwW)fHs3l6^*a7T&ys-8OaAr9idaA_ z6nks~(7Q#%B7oi#7d&C_=7gQt`K81%fZhk_qi@bT63+kS!U|#~Kpz0~ zA=Pn5Nx_5g`Y*XRu^OO10rWBT`i>HDod_TVL?A<&5Hh@pAYv``$5j{gSMW0)^a((J zze%hk)MMGD?e-#C>M_d#y|GOw${;Mkf!&%}WbT^zS$M9y# z0ra)FL%$_SzWgDM!F(oyU=LyI;-!~JCQebzn+7P60!xK?Q(sb41VyA#CvR#a#Y8%F z{HBR3kx88XmRWEX|KrQnlE@PePd-rq(6<2n>)Y@Y6J`Gu{&J!Mps+sPQNcgTh-!)Y z|09Q!7?i(<^O$Xv>VM=-D{&SswnQ7zPIM5RL>JLb^bl}H_yAD25BUe6p8)z9uo!^F z1gvS5L?6*l3=o6F5HU=gBSruV0W3CP832|cU@Zi!rPBdxHDE05a*cCE!%@|H8GUxzvo8n zy{9FTWXf~;i?gXZdrADoFsvqiC0-G)iQkCdi8sU_#9QJ|;vHad0E-J)&;cB<2*4r% ziw9UTfF%o9a@E9ph9>a={`-gcBwl72>f|)QnhoafTE(U&vwk|d%bUR=v0G1|TDSml?OR6QU_KgmW4BiszIMs>< zsSPuP)Fh#=N`R$YOzM!jfTaRhYDqS5$#V1Z2#yZk5FNaAqgTw%2R{;4%Gce z7Mq-s7kMmG}n z9d=uDDpH(=`s7A3oZJNek09X_ zA2N#GNLm8ce894zX=}h*Koj&$@*HuJM@L6RJBCNZgo?jWq^uv0iV_*|gmVZ>ys6LwH&aV#hn%Jrah9h*TCNTgl`Xr--CL>y#=NE zgioz}qC)L_qDT?XWT;2a6-lyzY!VksBVes4BAWqgC0#7-WG9?Y$qvABDI&W7%QZKzKVCsW>?CE=}K5!nY=Zbjq(V7Y(A1<^QJ-8ItQ z^QQ4;h?8c3?7&iaa1wWikrwYZS!*GaHGU>4*(&fc$^igq;YB*%}eP?n``mCOosR5#YhP4F4Jdo(0d6ig=+VTEJWQ z4FW48;v2-4xAbd}crdBAd>vb!BX2nriJxxlDB?K-R^&I43(pOT@C>*qnHu&fcRYE% z;_iC!ym_m6aGbZoxnmn(MFZCMQl1|}pBKOr09FiL9mwmtSXsv z<{jo80j%ACwTI%q)K)mjOZf_r$WwU~U?l+-pxj@oDP-|-{!5n7<{fg9>lN(~XFH&zsJZhG!Hoo(w#tFo!44)8*N~;|Lph+ju+R5ro6Mqwo+y3Xg)v z5HfjL@CZULZ-jS&H^#ffyUTmZ`dL>9RaoS=rgLc6?a{StVH&SwmT4SyS1$vgWdu zvR1MSWP@ZAWQ%3b%RZIk%HeW+IYl{TIaN75xp{IHa_(||a+~C~$?cL$lsnKI^_s^N zh491p8~K~~5&TI0R(>=;hQEU!&)>yQ@oFYhG3Lf%#0L*7f?N8VpvARi(hCVyByMV^wck#CW2lfNwgz5Hzj zrot=*wt~LGJOvAdRSE$LfeP^oKw+OkjY5k;o5FVr_Z1#0G8AVjN-J6_ik2waDQ;Gb zQQV=}sW_-OtoUAOni8sHsAQouUrC@8q75nL|I8$TUl4x zN!df$Q+b>6F6Bh!Y~>Q=GUdz4-z(o%{-iQPWv0qp6&saBDgi3%RYFzvsvJ`}p;D*P zuF|P;S>=0`+bZu=8LHD%^;PGIR4r6jsRpP9s_s)gu6k0nO0`L~MfC^ON2-t25H+?M zSItVzPHmZ5u-YcI2(@EsX=)j2Eo!}LeQNjBo~iw!&Qj;9aWy)(@@pW(=gC*)$q~q)7Yi4Pvd|_zD9*cmBv+#+Zv)DHQs7` zg1i3NnyQ-WnhP}@G@UdzYsP5q(9GAY(5%uN)Ev{ir1`7nJI(i6^RyOfE!JA6wOMP6 z)=8~Qt+$py^_2CT^gQ%D^%C_C=pE84)~nGwqjz2JN45GPk*t# zlfJWlxPG*LjDEg;g?^R(75yLd?-(!*W*M*z<{H=-EHVf(*l4iHpvs`hpv6G+#^9sD zCqrFBGsAg?Zic>w{)S10M+}b{)*7}Nwj16vd}{dIh+`yYG{?xs$ll1&XoJyKqiCZH zqXMHMqdP{Ajh-0m8P7E~H{M|^G6u$-#)HPgCNoTM6Vk-l#M8vvm}G z-RAnv^`DzMH)n3%-0O3HoO^Gc@;se+dh^!J+dOZ}ywZ7R=GD)8H1EZ{U(Gel4b6?s zh2~-A8_l!Ki_A;R@0&j}|HVSdLfb;uVvEHNi+GDxi?bH}7XMgIx0JGUwe+#{vrM%V zIMg5d?17EIcZHVQUM zHr_Tun;@Gan`)a{o4*$#3t0<&76vU0URb}dL$t7K(ac5UBAG?Li`Fh$x2SPZ*P@<9 z?-x&7j4pOryn3hZfvRiQjMirOE)gvwsiZ_i%YL9y|K)C+0te9%SxA> zSysR7v%QqPXqLUVz0f|$zRbSPzQO)a`_B$c2YUxs2X}`IhXRKpho2l?I=phUa9r$Y z>v+KNq~j^aYmRpu?>cEX89Es|#W^K8?R6S(y67~%TzNE_E(<{l)V$uHmkgu8pqEZY(#h8}8=e=IKI@2B3+z2B{#wwkqCYPIxg?rLJS;%b%E>Z`R@>#jCfZM0gr z`ta(u)sKB-e2jf;d=~rI`Pln7`8fLseZqV;`$YO|^VtrcCmirO>~l=ybIOPE$?(bY zDfj90`O)WRpEo{#`F!yCATw3 z&sX5P#&@mnN#82ptG+M&r2I7e4E@af%>Cy3S^KT@^YL5n7vdM{x4|#UFVSze-yXjt zzY~5Z{gVAs{PO(@{0jYw{X{i>b$*S0&3?mvqkb3tF8N*dpXM*^KgVCiU(H|BU&r6r z-^}0Kf4;x9zpejz|K0xk{ZIIx@~8aM{fqre{7e1I{rmkd1r!IA1ylyq1k?pI2DAjU z2XqDW2J{CE1&jn-2pA8T47eI_Bj8rR?SQ)h4+4G)coOhD;AOz;fHwhuiUQsTd<^(3 zm?mHeqy*9eu7D882xbf91xf-{frda^peHaCmJE6?h1| z1U>?PL7*T=uuc#v*eKX6h!kuS#0cU9y9B!hNrHWXgMuT1Z&m;IDzd1^yBEF7WTbe}oJnBAhOqDP#*V zAt{s<&JijIm4#|TO`(oZUuYyW70we{3ay0;g-e7>g$^R&a^Xs$n{buTTj(nc5DJBB zh3kc3!f;`PFiIFLj1|TU6NGz&K)7FcNO)9uLU>9@2{VMJg}K54VX?4GSShR#)(IPh zEy8wTm#|mZFB}q%2rmf7g_FXo!W+U{!rQ{T!Uw{iginOeg)fD#gdc^U)-cu}Yu2pU zyhgNTP1Ks`HPvg{*L1GwUUPQMyC5`ZdXQ9*bWmAPQ&3A#TTtg(m9>Uzjn|s4owxSN z+PiD-uYI`oaqzz2Q^BdhX~CK6{MLo8+prGa*{{2`?(w=O>z=K9v0i`u{PouBZPqVd zzkhwodTM?8`mFVTgfK&p5LSp(h)0MpBq$^}BqZdPDCBX-laOa2FG5{I1408s*MtU# z)`oV5c8B(c_J?VQ%?q;#n;*6y>~vUpSY=ps*qN|bVIRXjZD4FbHmu*Ubwl)qm<@3o zYBqFi=-SY;p>Lz=Mx%`;8_hPFZ`{4{=*Ht4Pi{=vcy8m>jn_Bc-1vR?&hUfbhr^GC zp9uf7NqQ4!6Shf2Zfe@pw`pM0(58{i+|3G`l{TwvR^J@9dHd$r&2gJ|ZGN%&{pJsw z|A}Bk_(g<9Y={Vth={lx@ngijhzAirZHe8ocgy}Q2e%yA@^s7FE$_Cx-|{hXU1U_` zw#e;~J0g1`FGP+-UW&XNbs{P|DmN-WswnDd)Z3_cQSYNZZnfR&y478@b=6kyt&g|< zzV(l-e{Oxh&3{|iwvF31ZQHW#%C@`P?r(dz?Qyh!bXfGp=uOdEq8p-nqx+%dRlFd6WBjK0i1?`ZTk((MpTs|lf3b7rPQRT2I|FwH z?JV2bw6kSr+s@8iF1!4933ds0t=)Bd*VA3kcfHv4DnUKLB*83UUV>#pT*Cf@g9(Qd zj)@YUCcI5}m+(H}W8&JxEs0Ty+Y)0EuO~i8e3bY&@#${;-Sc-_@3z^!cz5;g_T8Pk zyLX@6!{4L5M|Y3@9-}?K?fE2Ph^C2Hq6|@qs7zELs!p;^a!qniS_RJmrzaIBl_r%Z zRe>#F7f1wq0N87{*KM!IUeCR&_vY-a+*`d@RJ*r+?~}cM?EQ1^Uwc37JFzc&U+%vA zeMS2>?2p;MV}Jbqg#Cm2C--03e{KKG14|CL9B@0}alq?9%YlIdLkG?sIDg>7L8*hY z4zdqo2R#o49SlCW{$SX_ii0f&+YWXd>^>xSNaK*!A)Q0|hawLp9NK+IbZGCPi9@#! z{dnl!p@)aH4$l=GHa~26*!pnI;f}*yhkFk99q~D`{z&MN4M#Q|Id|mhk?Tip9{K+0 zf}>7HosX_O>UQ+R(d?tSNAr&s9kV^=dd&UUs$<^A4joH7mT@fWSkAGrW4Dg|aO}>p zd&gCe8yz<}Zg$-K__^a(k6%B2^Z55C7MyT8;e2A{3AYnB%#b*~wV4e6muqYO+SMcCucwL9#`%NAjBF z1IcHS+mbs@tvwZfYSXFhr*@w@dWt%gaq9G`+*1XoDo@p%syo$qs^wJMsVk@cN|~Nw zoH9SfE@efEZ_3(~^(kQ~;VBU*u_^JQl!TN$DIjHEN`A_@lxry;QqfdSs!Xa{s(z|b zs%h%HRLj&QsY_EGQkSQ$Om$7&n3|lLmwGOBBK3Ca-xKc;@Brco?PiXtc(YBnWL zDN!oa0xFn_qB5yMs)}l&`l$2N7&Sp%p{`Ru!Vd!rER;yOMS{?Md46w3lhG)83?gO#7TZEuEDv zl|Cz7E8QhMAboH8vGmjFW$8`n-RWo32hxYrN7FB-UrWE4{(btL^tUA$Sm0`$?2 z&RITLL0RjvLbEnzZO)3xip$!SwL2>*Yj0Lw)^OIPHUYuJw5NVbJa*c8=bC={g=lbLZ<*v&O&E1&0IX5OZE_YY%?%br@ zy}5b0!?{;;|IUNodFRRIsplEw8Rwbhndi;Vv&~zU=a}c5=aT1^=bN`KFDfrSFClMF z9?09DcOvgp9+j7ocRDX8uQczBD6cDTC~qY1Lf&}ZWZtd3+j)2M9_0O$_jBH>y!ZKN zK9Mh{9XC`@(<=8$v>W- zoS%}PonMk)o8Or~n13$+eEwMeME-aAKjiw={PD+{~|))s^pL=;37L>I&s>?r^R`wI>g94$CrkY12qP*KoQ z&|A=7FjO#7aG~I8!Ht4j1-A?C7Thm*R`9lPTA_3yw~#25DV$xXTBuQ|U8q-RSZG{0 zztFbOxzMLDsBm3jXyL}f&4n?AaiYRqg}V!r3ilQsD@-rUFRUqSDQqw7D(o%nFT7AV zUN~8JweUvacZI(f@r!hd+>88*LW`n`5{nKL9WFXnbh0R=D7z@HsIaJ{sJy7MsIjQK z=v>j&qT5AxiyjpHRP?0ibx(@SQSuuEi1=9DOuD3_>}Xp|V1SeMwB ztSSj85tghiSzi)X5>*mi5?c~ql2Ed{U{$=Q<8l8YsmN-mdN zE4fi}x8zC5tCEkUtWv2`=~8YfQ7SJgRVr02)hN|2)h#tEU0CW+>RBo%T~iud8dAEU zbZhDM(jBEcOA|}?l%6i_FP$j;v-EQryG*W3qs*|(q-<`PMVVEZU73BEQ`w3#*E07q zzp~)6O=WRqNoD)W4wfA$J6@JvmQ|KhmS0v>R#H}5)=_q@Y@+N++4ZvT%6=$&R3`el z>{;21vR7rlmHl1LD(99flxvpjlt5qujrIU3pY_e0f6o zo^nvWzx+h`sdB13qx^JvPI+m0V|h>ch4QQAH_C67-!8vf{-peQ`OEUx-XXs%oq1 zt2(N>tIk#pR1H^+R83ahs(M)Us_L(*4^^M4nbl}Dry8&3Rm)ZLs}-s>t4*sHR6A9B zRC`tXRQp#4R)g&}%R{vc6rut*`=bC9XtQx5rqDH1>c8z?EQjJQ@f|}r(sG7{0!kX%u_L}~hp_-AJ z3pL|4H)?Lx+^)G>^PuKY&5N4%wMZ>qt5B<4t5&O7t5d6AYf)=eYg47l^D}?dA$52izfQ4ErB1z0tIoL2tj@e{e%*q)g>?>ftLg&l!t0{zV(a4T z66*HU9jZH8ccSi89aWcJmtR+1*HSl7cd_nL-Q~J#bvNto)jh0xT=%r@m%5krQuQYF zi|Rw`BkOn6@2fvvpIo0>pI)C;UsPXOUm>cmu0K;>U*AzbP(N0GtNua#PxVjgpVz;v z|Fiym{m1&x4bvLX22O)~gJy$S!-9rI4Ym!-8XOzk8$26UH~2LO8iWmD4N(p84F?)d zHl#G9HDoqqH2XALhJUN!vQ@S)*TBeM~0oY6S5 zQA9SXG#WHoHQF`WH##-0XmoA#Y4mRlYz%5#*BH{cr7^zoK;y~Al*Y8i%*O1-lE(7J zs>a&J`o_k_uEz6?*Bc)+K5u;4_`2~;bB!P3lcXO$(ZqH90mp zH@P&qH~BRQn$|Q0H-$8XHAOWgHXUk8YswQf6*iSLl{Zy2H8r(1bu@K1oo(uGy3lm9 z=~2^*rdLhBH@$88tC`u1HqU6D)y!$en&&iYHJdgsYIbaPZgy#QZ}w~!G_Pq6ZVqYQ z&>Y?z-JIBbpgFZUr#Zj5sJXPcqPd~Dxw);mv$?1FZ1ZUI)#iK6Pn&;f{{{$woLW}2xVHGT__qYM1huSd32E8VvZG~R%kh@v zmeiK?maLYdmeQ7rmg<%>E%hxOEdwnVTfS?#-}0#C=ay$JFIwKV{MGWInzfp@&TqACUDoQ@>fGwm>elKjYF*#DwRLA}VymciZ|i~9ldUPOX|0*9 z*{!*)Wvz9sZLLGC7 z8*dX$wq0$z(RQotLEBGlPuiZhy=;5c_E$TzU8-HSUAbMYU9(-MUB7)^yJfp|`@;4m z?RM=e+P&M?wr^?Q(Y~`iv0c=@xBXcA$@Y}?wD!#Q)9uCW)$Q%={p~~TBkdR3$J=kT z-)g_zez*NW`=j<3?e99!4o(N&!RwIg;CHBZXo)&>I}AFEJ4`#QJC=30b_8^+?+EJ% z?}+G#>WJ@1=-AT%I`(%Q>`3m&=_u=H>get`+cD5F+%ej5x#L>L&5rLo?sVMkc+&Al z$LCIVr)=k(PK8e8PPI<`PNPoK&Uu}domQQ8oi3gJo$ES7J2!T2?u_h=>)h43yECbC zU*~~N(aFxt&ceor9fYofDl`I6c- z>9*>&>t50A+r74XeRo)Qcy~m1Yhg9->F4N2y1(N25o(N3X}A$Gpe3XGM>1&&Hn3 zJ&`@4Z9OqPaXq_wcK0Opr1YfqWcFnDr-XW#TO`jEcqeKY&mecV3%zImcP%RcKqn?8@e^?h6Vw)RE$ZSULB zx3lkHUv}S_zWTnVzV5!!zVW_WeGmHn?q~MP_nY=F>bLD**6-Nw+`qDaL;u$PZT;K( zllu4dAM8KUf4u)>e|3Lze_MZNe|P`o{%id=`fv7s-+!n7S^qEnzxIFV|1`iHKnG?F z%!KdUWd}ra2IL1!2IdZ!4_FLX4cH7UA6PlyHn3{Id%$NPXkgty=)i`7!~xL&7}z^- zVBqjT`asq|&OrV^(Ll*S-@y5Sv4M$!%L9)Go(?=8_+{YNf!_u`4KfCiL41%mC^yI- zR2)$XDbRJwW=sM^zC>&fnxPCB9G#Ea(c`#-$ZgAIN;$X^P+F-_D z=3w?<-r&{2dxH-L9}hkq{AKXv;NOEE2R{ulhpdJihL#Vl9C904HRLrEH55OTFtleV zX((l=dZ>1&eyC}vb?C*=+o4axO2eAN%ZB}j!-m6$BZi}fqlaUL_YNN!&KS-a&L1us zE+4KMt{oQD4G#|gaPH)}^mE1Ms?OD(t3TItuJc^axxRCQ=Z4R{8zDywM$AVRjo6MX z8*vNx5=>M<%D4H?}qx@mOFXv}Eb=&sS-qaxAh;nC#LtkJ@Y$i?Xwv5QI< zH7^=mw7TeUarwoS7u_zdy6An;_hQJ!4Hv^NMqG@#xb5Qhi?J88FZNx0HpUxM9Mc*z z8nYa;9$Px*JmxmGZY*SM^H|JS+}O^sgt7f&r^j-~3dV}Z%El_kYR2lu8pm43+Q&M_ zM#j#MT^zeKZZ_IU1i!FcU>?|A?C(D=ysh4Jz6$?>b>H^zS+ ze>VPN{MGpHb-RD(uWDT3A2gC6RRe?CwwOYCWI4f zC)Q7dO@vQGOo%4-PVApJG;ws|#KfryY9eDIYa)B1e4=w=bmE<8a@M5vq|2mWGG;Pq z^2B7}WXWXtWYuKtWc_5*Wb0(dWcTF6`KwLU38w)j=8lmR*+&|}YKIfe8 zxqi;)^EpK@?4ncJ^Q>pTykGysJ1R!yD2T$S9*sqvs2>fY_qY^pA~%zp!!6>fx&7Qb zTr+ouJIl3lA8;RXCKqzuTrYQr`-Z#A_4AML$^2vd5BM>BDxb!u^BMd!ej&e(kG#nr z;A{CK{4xGr{sP~|xAT|z4*nY7$=~21uk$h9;eDR)A>YmS@DGF}VX`n&cu9C&*e1L! zGzsU03qqUFE?gEmgj+&X5CmCJ1tb^(7VZe&i6g~yF-x2){#L9MSBY!I_2LGxQ9LVN z5ZlCd@p44GB6f+A2t-Z9;+N8+Qi_x*JtxhQW=n-qu{2LAlPaVY(n@Ky^jE1_x-4Cl zpybFy1F`3Ar+%5OWeezdwzmlk= zC{HOfmDx(ZQlJzn#Y$v>vPfB?EK^=lURAa$b;=b5Dp;Y)=gOB#uhItwgOOkq7!95T z6F@4+0(l@G6o5id1Qvm1pd3_y--FfQHLxB;z(Md1XaKF?L-0><5p;lSpc8Zf5$J#d z214)!xCb7nacaDppeCwg)igCDqE1(zQ8U#%HD4`I3)K>JzFMl5spaZQb)#CXM$|v4 ze^&RXHR?X~q}rmktDMT zE&4J2qHgQm`U4}*h&K|9Bx8s%%t$sS8k3APV~UYsOf#M~GL0F=Vx!vFXS{E4#vOBv zIoV7z)6E&?T(ih5G3T45=0bCcxy&p#E6f#UwHYyYm^;l~=5BMZ`4=;?-#lo(Wgam< zHM?V@V?T*4jqQ!q$F9b7E8ZGzrC5(!PgrBEan>_dt~JZbvu0brvdXLqYlXGaT4PmN zo2>0tjdjp^%Q|Y+StqP|tI=w+KDKUIz;Z3$B37?G&`z?)+SBbBcCMXo7u)mfU)u}p zN_)M%DPnK6ciE@x)An^+vt7H#?z8VZgPkGHC})B*$@!u4wDV&p(|OLB)?3TOh z+&A6hZkzj=>$zXJ-ENP2*NxnB?|Xy11TWDW;U#+`y(hhK-UM&Dm*r)9IbNRky!V1v z?9KD$d!=5Px7OS3)q7XH>z?2lp5?h7_Ne!{_l6b|Gxhn9)Jhp5jYu-$Ei3CPr*;&>G)Zk zi+_ga;9uZh;!?a2FTu-jIbM#};SIP7Z^qSl8{UNv;S;zXzl%@fzu|NEJpLH}3tz{d z;+yz3=CO!b@I;Usyd10wwg!8GnqYr$C^#G(4H|>y;7o8fh_nXp2OkBU0T+mY62L$Y z{D1^u&>i#!eL+8YgbXJs*p81e!#LMChY*3>`-&(#bTP zPNi8io956w`aI32FVdH28C^`5(%;b4^bNX+ZlT-g4!Vcd(EaofJxq_%CK{zS{gw@5 zW7&9?%F@^rmceq^Tvo_lV8v`PTgqNx%h~T(C3}Nav5jmq+r@UXy=)&l$ZFZfI@Z9N zSPOfPonseS2fM~P*)0}j0+U$4df0<-KsYE&42Oop!<6u`a8fue%noOTv%~ywZdeqS ogfE5_;hOMRcq(iRo5PmyV%QOO{%^^T8!+H|Q(C_F{|&qT3(;$NZU6uP diff --git a/FTPKit/FTPClient.h b/FTPKit/FTPClient.h index c90892b..a99779a 100644 --- a/FTPKit/FTPClient.h +++ b/FTPKit/FTPClient.h @@ -418,6 +418,20 @@ */ - (NSDate *)lastModifiedAtPath:(NSString *)remotePath; +/** + Refer to lastModifiedAtPath: + + This adds the ability to perform the operation asynchronously. + + @param remotePath Remote path to check + @param success Method called when process succeeds. 'lastModified' is the + last modified time. + @param failure Method called when process fails. + */ +- (void)lastModifiedAtPath:(NSString *)remotePath + success:(void (^)(NSDate *lastModified))success + failure:(void (^)(NSError *error))failure; + /** Check if a remote directory exists. @@ -429,6 +443,20 @@ */ - (BOOL)directoryExistsAtPath:(NSString *)remotePath; +/** + Refer to directoryExistsAtPath: + + This adds the ability to perform the operation asynchronously. + + @param remotePath Remote path to check + @param success Method called when process succeeds. 'exists' will be YES if the + directory exists. NO otherwise. + @param failure Method called when process fails. + */ +- (void)directoryExistsAtPath:(NSString *)remotePath + success:(void (^)(BOOL exists))success + failure:(void (^)(NSError *error))failure; + /** Change the working directory to remotePath. @@ -439,7 +467,7 @@ Therefore, in its current state, it is used in a very limited scope. Eventually you will be able to issue commands in the cwd. Not right now. - @param remotePath Remote directory path to make current directory + @param remotePath Remote directory path to make current directory. @return YES if the directory was successfully changed. */ - (BOOL)changeDirectoryToPath:(NSString *)remotePath; @@ -452,7 +480,7 @@ therefore the command will always being in the root path when issuing the command. - @return The current working directory + @return The current working directory. */ - (NSString *)printWorkingDirectory; diff --git a/FTPKit/FTPClient.m b/FTPKit/FTPClient.m index 288ad16..86dbe54 100644 --- a/FTPKit/FTPClient.m +++ b/FTPKit/FTPClient.m @@ -57,6 +57,14 @@ - (NSArray *)parseListData:(NSData *)data handle:(FTPHandle *)handle showHiddent */ - (void)failedWithMessage:(NSString *)message; +/** + Convenience method that wraps failure(error) in dispatch_async(main_queue) + and ensures that the error is copied before sending back to callee -- to ensure + it doesn't get nil'ed out by the next command before the callee has a chance + to read the error. + */ +- (void)returnFailure:(void (^)(NSError *error))failure; + @end @implementation FTPClient @@ -161,9 +169,7 @@ - (void)listContentsAtHandle:(FTPHandle *)handle showHiddenFiles:(BOOL)showHidde success(contents); }); } else if (! contents && failure) { - dispatch_async(dispatch_get_main_queue(), ^{ - failure(_lastError); - }); + [self returnFailure:failure]; } }); } @@ -206,9 +212,7 @@ - (void)downloadHandle:(FTPHandle *)handle to:(NSString *)localPath progress:(BO success(); }); } else if (! ret && failure) { - dispatch_async(dispatch_get_main_queue(), ^{ - failure(_lastError); - }); + [self returnFailure:failure]; } }); } @@ -243,9 +247,7 @@ - (void)uploadFile:(NSString *)localPath to:(NSString *)remotePath progress:(BOO success(); }); } else if (! ret && failure) { - dispatch_async(dispatch_get_main_queue(), ^{ - failure(_lastError); - }); + [self returnFailure:failure]; } }); } @@ -285,9 +287,7 @@ - (void)createDirectoryAtHandle:(FTPHandle *)handle success:(void (^)(void))succ success(); }); } else if (! ret && failure) { - dispatch_async(dispatch_get_main_queue(), ^{ - failure(_lastError); - }); + [self returnFailure:failure]; } }); } @@ -341,9 +341,7 @@ - (void)deleteHandle:(FTPHandle *)handle success:(void (^)(void))success failure success(); }); } else if (! ret && failure) { - dispatch_async(dispatch_get_main_queue(), ^{ - failure(_lastError); - }); + [self returnFailure:failure]; } }); } @@ -389,9 +387,7 @@ - (void)chmodHandle:(FTPHandle *)handle toMode:(int)mode success:(void (^)(void) success(); }); } else if (! ret && failure) { - dispatch_async(dispatch_get_main_queue(), ^{ - failure(_lastError); - }); + [self returnFailure:failure]; } }); } @@ -422,9 +418,7 @@ - (void)renamePath:(NSString *)sourcePath to:(NSString *)destPath success:(void success(); }); } else if (! ret && failure) { - dispatch_async(dispatch_get_main_queue(), ^{ - failure(_lastError); - }); + [self returnFailure:failure]; } }); } @@ -457,9 +451,7 @@ - (void)copyPath:(NSString *)sourcePath to:(NSString *)destPath success:(void (^ success(); }); } else if (! ret && failure) { - dispatch_async(dispatch_get_main_queue(), ^{ - failure(_lastError); - }); + [self returnFailure:failure]; } }); } @@ -604,6 +596,20 @@ - (NSDate *)lastModifiedAtPath:(NSString *)remotePath return date; } +- (void)lastModifiedAtPath:(NSString *)remotePath success:(void (^)(NSDate *))success failure:(void (^)(NSError *))failure +{ + dispatch_async(_queue, ^{ + NSDate *date = [self lastModifiedAtPath:remotePath]; + if (! _lastError && success) { + dispatch_async(dispatch_get_main_queue(), ^{ + success(date); + }); + } else if (_lastError && failure) { + [self returnFailure:failure]; + } + }); +} + - (BOOL)directoryExistsAtPath:(NSString *)remotePath { /** @@ -642,6 +648,20 @@ - (BOOL)directoryExistsAtPath:(NSString *)remotePath return success; } +- (void)directoryExistsAtPath:(NSString *)remotePath success:(void (^)(BOOL))success failure:(void (^)(NSError *))failure +{ + dispatch_async(_queue, ^{ + BOOL exists = [self directoryExistsAtPath:remotePath]; + if (! _lastError && success) { + dispatch_async(dispatch_get_main_queue(), ^{ + success(exists); + }); + } else if (_lastError && failure) { + [self returnFailure:failure]; + } + }); +} + - (BOOL)changeDirectoryToPath:(NSString *)remotePath { netbuf *conn = [self connect]; @@ -672,4 +692,12 @@ - (NSString *)printWorkingDirectory return [NSString stringWithCString:cPath encoding:NSUTF8StringEncoding]; } +- (void)returnFailure:(void (^)(NSError *))failure +{ + NSError *error = [_lastError copy]; + dispatch_async(dispatch_get_main_queue(), ^{ + failure(error); + }); +} + @end diff --git a/README.md b/README.md index a645a29..7b0b0fa 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # FTPKit -Version 1.0.0b RC2 +Version 1.2.0 FTPKit is an Objective-C library providing facilities implementing the client side of the File Transfer Protocol (FTP). @@ -164,6 +164,22 @@ Please note that the `progress:` parameter has not yet been implemented. // Display an error... }]; +## Check if a directory exists + + BOOL success = [client chmodPath:@"/public/defaceme.html" toMode:777]; + if (! success) { + // Display an error... + } + + ... + + // Or, make the call asynchronous; + [client chmodPath:@"/public/defaceme.html" toMode:777 success:^(void) { + // Success! + } failure:^(NSError *error) { + // Display an error... + }]; + # Setup & Integration ## Requirements diff --git a/Sample/FTPKitSample/FTPKitSample.xcodeproj/project.xcworkspace/xcuserdata/eric.xcuserdatad/UserInterfaceState.xcuserstate b/Sample/FTPKitSample/FTPKitSample.xcodeproj/project.xcworkspace/xcuserdata/eric.xcuserdatad/UserInterfaceState.xcuserstate index ae0b7d1091660ff132fd0794df0f17f56c43639f..1dcf190f219b74bbdd1c28ec8968519bc65d5803 100644 GIT binary patch delta 16651 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 Date: Wed, 30 Apr 2014 10:42:00 -0700 Subject: [PATCH 6/6] Updated readme to include command to check if a directory exists --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7b0b0fa..e053499 100644 --- a/README.md +++ b/README.md @@ -166,7 +166,7 @@ Please note that the `progress:` parameter has not yet been implemented. ## Check if a directory exists - BOOL success = [client chmodPath:@"/public/defaceme.html" toMode:777]; + BOOL success = [ftp directoryExistsAtPath:@"/mypath"]; if (! success) { // Display an error... } @@ -174,8 +174,12 @@ Please note that the `progress:` parameter has not yet been implemented. ... // Or, make the call asynchronous; - [client chmodPath:@"/public/defaceme.html" toMode:777 success:^(void) { - // Success! + [ftp directoryExistsAtPath:@"/mypath" success:^(BOOL exists) { + if (exists) { + // The file exists. + } else { + // The file doesn't exist. + } } failure:^(NSError *error) { // Display an error... }];