Ë ¥Ð:<>¨|Òãó—dZddl­ddl­ddlZddlZej d«ZGd„de«ZGd„d e«Z Gd „d e «Z Gd „d e «Z Gd„de«Z Gd„de«Z Gd„de«ZGd„de«ZGd„de«Zy)a<This module implements all state handling during uploads and downloads, the main interface to which being the TftpState base class. The concept is simple. Each context object represents a single upload or download, and the state object in the context object represents the current state of that transfer. The state object has a handle() method that expects the next packet in the transfer, and returns a state object until the transfer is complete, at which point it returns None. That is, unless there is a fatal error, in which case a TftpException is returned instead.é)Ú*éNztftpy.TftpStatescóN—eZdZdZd„Zd„Zd„Zd„Zd„Zd d„Z d „Z d „Z d „Z d „Z y)Ú TftpStatezThe base class for the states.có—||_y)z™Constructor for setting up common instance variables. The involved file object is required, since in tftp there's always a file involved.N)Úcontext©Úselfrs ú5/usr/lib/python3.12/site-packages/tftpy/TftpStates.pyÚ__init__zTftpState.__init__s €ðˆ� ócó—td«‚)z|An abstract method for handling a packet. It is expected to return a TftpState object, either itself or a new state.zAbstract method)ÚNotImplementedError©r ÚpktÚraddressÚrports r ÚhandlezTftpState.handle"s€ô"Ð"3Ó4Ð4r cóê—t|jj««dkDrÃ|j|jj«r~t j d«|j|j_|jjD]4}t j d|›d|jj|›�«Œ6yt jd«td«‚td«‚)zRThis method handles an OACK from the server, syncing any accepted options.rz!Successful negotiation of optionsz z = úFailed to negotiate optionszNo options found in OACKN) ÚlenÚoptionsÚkeysÚ match_optionsrÚlogÚinfoÚerrorÚ TftpException)r rÚkeys r Ú handleOACKzTftpState.handleOACK's®€ô ˆs�{‰{×ÑÓ!Ó " QÒ &Ø× Ñ  §¡×!5Ñ!5Ô6Ü—‘Ð<Ô=à'*§{¡{�— ‘ Ô$ØŸ<™<×/Ô/�CÜ—H’Hªc°4·<±<×3GÑ3GÈÒ3LÐMÕNñ0ô— ‘ Ð7Ô8Ü#Ð$AÓBÐBäÐ :Ó;Ð ;r có¼—i}|D]¾}|dk(rt||«tkDr&tjdtz«t||<ŒCt||«tkr&tjdtz«t||<Œ~||||<Œ‡|dk(rtj d«d|d<Œ§tjd|z«ŒÀtj d|«|S) zjThis method takes a requested options list from a client, and returns the ones that are supported.Úblksizez;Client requested blksize greater than %d setting to maximumz8Client requested blksize less than %d setting to minimumÚtsizeztsize option is setrz Dropping unsupported option '%s'z$Returning these accepted options: %s)ÚintÚ MAX_BLKSIZErrÚ MIN_BLKSIZEÚdebug)r rÚaccepted_optionsÚoptions r ÚreturnSupportedOptionsz TftpState.returnSupportedOptions7sã€ð ÐÛˆFؘÒ"ä�w˜v‘Ó'¬+Ò5Ü—H‘Hð2Ü4?ñ@ôAä/:Ð$ VÒ,ܘ ™Ó)¬KÒ7Ü—H‘Hð2Ü4?ñ@ôAä/:Ð$ VÒ,à/6°v©Ð$ VÒ,ؘ7Ò"Ü— ‘ Ð/Ô0Ø,-Ð  Ò)ä—‘Ð;¸fÑDÕEð#ô$ � ‰ Ð8Ð:JÔKØÐr có—d}|jj}tr3t|k(r*ddl}tj d«|j d«d}|jj«}|jjj|«}tj dt|««t|«|kr.tjd|jjz«d}t«}||_||_|jj xj"t|j«z c_tj d |j«|jj$j'|j)«j*|jj,|jj.f«|jj0r|jj1|«||j_|S) z™This method sends the next DAT packet based on the data in the context. It returns a boolean indicating whether the transfer is finished.FrNz#Deliberately delaying 10 seconds...é zRead %d bytes into bufferzReached EOF on file %sTzSending DAT packet %d)rÚ next_blockÚ DELAY_BLOCKÚtimerr'ÚsleepÚ getBlocksizeÚfileobjÚreadrrÚfile_to_transferÚ TftpPacketDATÚdataÚ blocknumberÚmetricsÚbytesÚsockÚsendtoÚencodeÚbufferÚhostÚtidportÚ packethookÚlast_pkt)r Úfinishedr7r/Údatr"r=s r ÚsendDATzTftpState.sendDATRsq€ðˆØ—l‘l×-Ñ-ˆ å œ;¨+Ò5Û Ü �I‰IÐ;Ô <Ø �J‰J�rŒN؈ؗ,‘,×+Ñ+Ó-ˆØ—‘×%Ñ%×*Ñ*¨7Ó3ˆÜ � ‰ Ð-¬s°6«{Ô;Ü ˆv‹;˜Ò Ü �H‰HÐ-Ø—,‘,×/Ñ/ñ0ô 1àˆHÜ‹oˆØˆŒØ%ˆŒØ � ‰ ×Ñ×"Ò"¤c¨#¯(©(£mÑ3Õ"Ü � ‰ Ð)¨3¯?©?Ô;Ø � ‰ ×Ñ× Ñ  §¡£×!4Ñ!4Ø"&§,¡,×"3Ñ"3°T·\±\×5IÑ5IÐ!Jô Là �<‰<× "Ò "Ø �L‰L× #Ñ # CÔ (Ø #ˆ� ‰ ÔØˆr Ncó¤—tjd|«|€|jj}tj d|z«t «}||_|jjj|j«j|jj|jjf«||j_ y)z¢This method sends an ack packet to the block number specified. If none is specified, it defaults to the next_block property in the parent context.z$In sendACK, passed blocknumber is %sNzSending ack to block %d)rr'rr-rÚ TftpPacketACKr7r:r;r<r=r>r?rA)r r7Úackpkts r ÚsendACKzTftpState.sendACKqsœ€ô � ‰ Ð8¸+ÔFØ Ð ØŸ,™,×1Ñ1ˆKÜ �‰Ð*¨[Ñ8Ô9Ü“ˆØ(ˆÔØ � ‰ ×Ñ× Ñ  §¡£×!7Ñ!7Ø"&§,¡,×"3Ñ"3Ø"&§,¡,×"6Ñ"6ð"8ô 9ð!'ˆ� ‰ Õr có¢—tjd|«t«}||_|jj dk(rtjd«nh|jj j|j«j|jj|jj f«||j_ y)zgThis method uses the socket passed, and uses the errorcode to compose and send an error packet.z*In sendError, being asked to send error %dNz1Error packet received outside session. Discarding) rr'Ú TftpPacketERRÚ errorcoderr?r:r;r<r=r>rA)r rKÚerrpkts r Ú sendErrorzTftpState.sendError€s”€ô � ‰ Ð>À ÔJÜ“ˆØ$ˆÔØ �<‰<× Ñ  4Ò 'Ü �I‰IÐIÕ Jà �L‰L× Ñ × $Ñ $ V§]¡]£_×%;Ñ%;Ø&*§l¡l×&7Ñ&7Ø&*§l¡l×&:Ñ&:ð&<ô =ð!'ˆ� ‰ Õr có”—tjd|jj«t «}|jj|_|jj j |j«j|jj|jjf«||j_ y)zSThis method sends an OACK packet with the options from the current context.zIn sendOACK with options %sN) rr'rrÚTftpPacketOACKr:r;r<r=r>r?rA)r rs r ÚsendOACKzTftpState.sendOACKŽs‰€ô � ‰ Ð/°·±×1EÑ1EÔFÜӈؗl‘l×*Ñ*ˆŒ Ø � ‰ ×Ñ× Ñ  §¡£×!4Ñ!4Ø"&§,¡,×"3Ñ"3Ø"&§,¡,×"6Ñ"6ð"8ô 9ð!$ˆ� ‰ Õr có,—tjd|jj›d|›�«|jjxj t |jjj«z c_|jjj|jj«|jj}|s|jj}|jjj|jjj«j|jj|f«|jjr0|jj|jj«yy)z-Resend the last sent packet due to a timeout.zResending packet z on sessions N)rÚwarningrrAr8Ú resent_bytesrr=Úadd_dupr?Úportr:r;r<r>r@)r Ú sendto_ports r Ú resendLastzTftpState.resendLast™s €ä � Š Ø�|‰|×$Ó$¡dð,ô -à � ‰ ×Ñ×)Ò)¬S°·±×1FÑ1F×1MÑ1MÓ-NÑNÕ)Ø � ‰ ×Ñ×$Ñ$ T§\¡\×%:Ñ%:Ô;Ø—l‘l×*Ñ*ˆ ÙðŸ,™,×+Ñ+ˆKØ � ‰ ×Ñ× Ñ  §¡×!6Ñ!6×!=Ñ!=Ó!?×!FÑ!FØ"&§,¡,×"3Ñ"3°[Ð!Aô Cà �<‰<× "Ò "Ø �L‰L× #Ñ # D§L¡L×$9Ñ$9Õ :ð #r cóÒ—tjd|jz«tjd|jj «|j|jj k(�r*tjd|j«|j «|jxj dz c_tjdt|j««|jjj|j«|jjxjt|j«z c_ t|j«|jj«k�rOtjd«y|j|jj krÑ|jdk(r?tjd «|jt j"«t%d «‚tjd |jz«|jjj'|«tjd |j«|j |j«nEd |j|jj fz}tj)|«t%|«‚t+|j«S) zVThis method handles a DAT packet during a client download, or a server upload.zHandling DAT packet - block %dzExpecting block %sz#Good, received block %d in sequencerzWriting %d bytes to output filezEnd of file detectedNrzThere is no block zero!zDropping duplicate block %dz#ACKing block %d again, just in casez.Whoa! Received future block %d but expected %d)rrr7r'rr-rHrr6r2Úwriter8r9r1rRrMÚ TftpErrorsÚ IllegalTftpOprrTrÚTftpStateExpectDAT)r rÚmsgs r Ú handleDatzTftpState.handleDatªså€ô �‰Ð1°C·O±OÑCÔDÜ � ‰ Ð&¨¯ © ×(?Ñ(?Ô@Ø �?‰?˜dŸl™l×5Ñ5Ó 5Ü �I‰IÐ;¸S¿_¹_Ô Mà �L‰LŒNØ �L‰L× #Ò # qÑ (Õ #ä �I‰IÐ7¼¸S¿X¹X»Ô GØ �L‰L× Ñ × &Ñ & s§x¡xÔ 0Ø �L‰L× Ñ × &Ò &¬#¨c¯h©h«-Ñ 7Õ &ä�3—8‘8‹}˜tŸ|™|×8Ñ8Ó:Ó:Ü—‘Ð/Ô0Øà �_‰_˜tŸ|™|×6Ñ6Ò 6Ø�‰ !Ò#Ü— ‘ Ð5Ô6Ø—‘œz×7Ñ7Ô8Ü#Ð$=Ó>Ð>Ü �K‰KÐ5¸¿¹ÑGÔ HØ �L‰L× Ñ × (Ñ (¨Ô -Ü �I‰IÐ;¸S¿_¹_Ô MØ �L‰L˜Ÿ™Õ )ðCØ—?‘? D§L¡L×$;Ñ$;Ð<ñ=ˆCä �I‰I�cŒNÜ Ó$Ð $ô" $§,¡,Ó/Ð/r ©N)Ú__name__Ú __module__Ú __qualname__Ú__doc__r rr r*rDrHrMrPrWr^©r r rrs7„Ù(òò 5ò <ò  ò6ó> 'ò 'ò $ò;ó"%0r rcó—eZdZdZd„Zd„Zy)ÚTftpServerStatez!The base class for server states.có>—tj||«d|_yr_)rr Ú full_pathr s r r zTftpServerState.__init__Ôs€Ü×ј4 Ô)ðˆ�r c óz—|j}d}|jjs)||j_tj d|z«tj d«dt i|j_|rNtj d|«|j|«}|jjj|«d}|jdk7rtjd«|jj|k7s|jj|k7rk|jtj«tj!d |jj›d |jj›d |›d |›d � «|Stj d |j"«|j"j%|jj&«r |j"}nMt(j*j-|jj&|j"j/d««}t(j*j1|«|_tj d|«|j2j%t(j*j5|jj&«t(j6z«rtj d«n?tjd«|jtj8«t;d«‚|j"|j_|S)aSThis method performs initial setup for a server context transfer, put here to refactor code out of the TftpStateServerRecvRRQ and TftpStateServerRecvWRQ classes, since their initial setup is identical. The method returns a boolean, sendoack, to indicate whether it is required to send an OACK to the client.FzSetting tidport to %sz Setting default options, blksizer"zOptions requested: %sTÚoctetz=Received non-octet mode request. I'll reply with binary data.zExpected traffic from Ú:z but received it from z instead.zRequested filename is %sÚ/zfull_path is %sz+requested file is in the server root - goodz2requested file is not within the server root - badz bad file path)rrr?rrr'Ú DEF_BLKSIZEr*ÚupdateÚmoderRr>rUrMrZÚ UnknownTIDrÚfilenameÚ startswithÚrootÚosÚpathÚjoinÚlstripÚabspathrhÚnormpathÚsepr[rr4)r rrrrÚsendoackÚsupported_optionsrhs r Ú serverInitialzTftpServerState.serverInitialÛs4€ð —+‘+ˆØˆØ�|‰|×#Ò#Ø#(ˆD�L‰LÔ Ü �H‰HÐ,¨uÑ4Ô 5ä � ‰ Ð4Ô5Ø!*¬KÐ9ˆ� ‰ Ôá Ü �I‰IÐ-¨wÔ 7Ø $× ;Ñ ;¸GÓ DÐ Ø �L‰L× Ñ × 'Ñ 'Ð(9Ô :؈Hð �8‰8�wÒ ô �K‰KÐWÔ Xð �<‰<× Ñ  Ò (¨D¯L©L×,=Ñ,=ÀÒ,FØ �N‰Nœ:×0Ñ0Ô 1Ü �IŠIà#Ÿ|™|×0Ó0Ø#Ÿ|™|×0Ó0Ú'Ú$ð &ô 'ðˆKä � ‰ Ð,¨c¯l©lÔ;ð �<‰<× "Ñ " 4§<¡<×#4Ñ#4Ô 5ØŸ ™ ‰I䟙Ÿ ™  T§\¡\×%6Ñ%6¸¿ ¹ ×8KÑ8KÈCÓ8PÓQˆIô Ÿ™Ÿ™¨Ó3ˆŒÜ � ‰ Ð# YÔ/Ø �>‰>× $Ñ $¤R§W¡W×%5Ñ%5°d·l±l×6GÑ6GÓ%HÌ2Ï6É6Ñ%QÔ RÜ �H‰HÐBÕ Cä �K‰KÐLÔ MØ �N‰Nœ:×3Ñ3Ô 4Ü Ó0Ð 0à(+¯ © ˆ� ‰ Ô%àˆr N)r`rarbrcr r}rdr r rfrfÑs„Ù+òóHr rfcó—eZdZdZd„Zy)ÚTftpStateServerRecvRRQz_This class represents the state of the TFTP server when it has just received an RRQ packet.cóˆ—tjd«|j|||«}|j}tj d|z«t j j|«rt|d«|j_ �n|jjr¯tjd|«|jj|jj||¬«|j_ |jj€‘tjd«|jtj«t!d|z«‚tj#d|«|jtj«t!dj%|««‚|r¸d |jj&vr |jjj)d t j*«t-|jjj/««}|jjj)d d «||jj&d <|r|j1«nEd |j_tjd «|j5«|j_t9|j«S) z)Handle an initial RRQ packet as a server.z In TftpStateServerRecvRRQ.handlezOpening file %s for readingÚrbz'No such file %s but using dyn_file_func)rrz7dyn_file_func returned 'None', treating as FileNotFoundzFile not found: %szFile not found: {}r#rrz&No requested options, starting send...)rr'r}rhrrtruÚexistsÚopenrr2Ú dyn_file_funcr4rMrZÚ FileNotFoundrrRÚformatrÚseekÚSEEK_ENDÚstrÚtellrPr-rDÚpending_completeÚTftpStateExpectACK)r rrrr{rur#s r rzTftpStateServerRecvRRQ.handle)sû€ä � ‰ Ð4Ô5Ø×%Ñ% c¨8°UÓ;ˆØ�~‰~ˆÜ �‰Ð.°Ñ5Ô6Ü �7‰7�>‰>˜$Ô ô$(¨¨dÓ#3ˆD�L‰LÖ Ø �\‰\× 'Ò 'Ü �I‰IÐ?ÀÔ Fà— ‘ ×*Ñ*¨4¯<©<×+HÑ+HÐS[ÐchÐ*Óið �L‰LÔ ð�|‰|×#Ñ#Ð+Ü— ‘ ð)ô*à—‘œz×6Ñ6Ô7Ü#Ð$8¸4Ñ$?Ó@Ð@ä �K‰KÐ,¨dÔ 3Ø �N‰Nœ:×2Ñ2Ô 3ÜÐ 4× ;Ñ ;¸DÓ AÓBÐ Bñ ˜ 4§<¡<×#7Ñ#7Ñ7ð �L‰L× Ñ × %Ñ % a¬¯©Ô 5ܘŸ ™ ×,Ñ,×1Ñ1Ó3Ó4ˆEØ �L‰L× Ñ × %Ñ % a¨Ô +Ø,1ˆD�L‰L× Ñ  Ñ )á ð �M‰M�Oð'(ˆD�L‰LÔ #Ü �I‰IÐ>Ô ?Ø,0¯L©L«NˆD�L‰LÔ )ô" $§,¡,Ó/Ð/r N©r`rarbrcrrdr r rr&s „ñó/0r rcó—eZdZdZd„Zd„Zy)ÚTftpStateServerRecvWRQz^This class represents the state of the TFTP server when it has just received a WRQ packet.có—|jt|jj«d}tj d|«|j tj«dd}tj d|«|jj}|D]q}|sŒtjj||«}tjj|«rtj d|«Œ\tj|d«Œsy)zThe purpose of this method is to, if necessary, create all of the subdirectories leading up to the file to the written.Nzmake_subdirs: subpath is %séÿÿÿÿz dirs is %sz#%s is already an existing directoryiÀ) rhrrrsrr'ÚsplitrtrzrurvÚisdirÚmkdir)r ÚsubpathÚdirsÚcurrentÚdirs r Ú make_subdirsz#TftpStateServerRecvWRQ.make_subdirs`s¹€ð—.‘.¤ T§\¡\×%6Ñ%6Ó!7Ð!8Ð9ˆÜ � ‰ Ð/°Ô9ð�}‰}œRŸV™VÓ$ S bÐ)ˆÜ � ‰ �, Ô%Ø—,‘,×#Ñ#ˆÛˆCÚÜŸ'™'Ÿ,™, w°Ó4�Ü—7‘7—=‘= Ô)Ü—I‘IÐCÀWÕMä—H‘H˜W eÕ,ñ r cóf—tjd«|j|||«}|j}|jj rg|jj ||j«}|€-|j tj«td|z«‚||j_ nŽtjd|z«tjj|«r,tjd|jj z«|j#«t%|d«|j_ |r&tjd«|j'«n%tjd«|j)«d|j_t-|j«S) z)Handle an initial WRQ packet as a server.z In TftpStateServerRecvWRQ.handlezDynamic path %s not permittedzOpening file %s for writingz&File %s exists already, overwriting...ÚwbzSending OACK to clientz4No requested options, expecting transfer to begin...r)rr'r}rhrÚ upload_openrMrZÚAccessViolationrr2rrtrur‚rRr4r™rƒrPrHr-r\)r rrrr{ruÚfs r rzTftpStateServerRecvWRQ.handless;€ä � ‰ Ð4Ô5Ø×%Ñ% c¨8°UÓ;ˆØ�~‰~ˆØ �<‰<× #Ò #Ø— ‘ ×(Ñ(¨¨t¯|©|Ó<ˆA؈yØ—‘œz×9Ñ9Ô:Ü#Ð$CÀdÑ$JÓKÐKà'(�— ‘ Õ$ä �H‰HÐ2°TÑ9Ô :Ü�w‰w�~‰~˜dÔ#ä— ‘ ÐDØ—L‘L×1Ñ1ñ3ô4ð × Ñ Ô Ü#'¨¨dÓ#3ˆD�L‰LÔ ñ Ü �I‰IÐ.Ô /Ø �M‰M�Oä �I‰IÐLÔ MØ �L‰LŒNð#$ˆ� ‰ Ôô" $§,¡,Ó/Ð/r N)r`rarbrcr™rrdr r r�r�]s„ñò-ó&$0r r�có—eZdZdZd„Zy)ÚTftpStateServerStartzÓThe start state for the server. This is a transitory state since at this point we don't know if we're handling an upload or a download. We will commit to one of them once we interpret the initial packet.có²—tjd«t|t«r;tjd«t |j «j |||«St|t«r;tjd«t|j «j |||«S|jtj«td|z«‚)ú!Handle a packet we just received.zIn TftpStateServerStart.handlezHandling an RRQ packetzHandling a WRQ packetz'Invalid packet to begin up/download: %s) rr'Ú isinstanceÚ TftpPacketRRQrrrÚ TftpPacketWRQr�rMrZr[rrs r rzTftpStateServerStart.handle s°€ä � ‰ Ð2Ô3Ü �cœ=Ô )Ü �I‰IÐ.Ô /Ü)¨$¯,©,Ó7×>Ñ>¸sØ?GØ?DóFð Fô˜œ]Ô +Ü �I‰IÐ-Ô .Ü)¨$¯,©,Ó7×>Ñ>¸sØ?GØ?DóFð Fð �N‰Nœ:×3Ñ3Ô 4ÜÐ IÈCÑ OÓPÐ Pr Nr�rdr r r r œs„ñHóQr r có—eZdZdZd„Zy)rŒzéThis class represents the state of the transfer when a DAT was just sent, and we are waiting for an ACK from the server. This class is the same one used by the client during the upload, and the server during the download.có2—t|t«�rœtjd|jz«|j j |jk(r«|j jrtjd«ytjd«|j xj dz c_tjd|j j «|j«|j _|S|j|j j krItjd|jz«|j jj|«|Stjd«|j jxjdz c_ |St|t«r8tjd t!|«z«t#d t!|«z«‚tjd t!|«z«|S) z;Handle a packet, hopefully an ACK since we just sent a DAT.zReceived ACK for packet %dz&Received ACK to final DAT, we're done.NzGood ACK, sending next DATrzIncremented next_block to %dz#Received duplicate ACK for block %dzGOooh, time warp. Received ACK to packet we didn't send yet. Discarding.z!Received ERR packet from peer: %sz!Discarding unsupported packet: %s)r£rFrr'r7rr-r‹rrDrRr8rTÚerrorsrJrr‰rrs r rzTftpStateExpectACK.handle¶s�€ä �cœ=Õ )Ü �I‰IÐ2°S·_±_ÑDÔ Eà�|‰|×&Ñ&¨#¯/©/Ò9Ø—<‘<×0Ò0Ü—H‘HÐEÔFØä—I‘IÐ:Ô;Ø—L‘L×+Ò+¨qÑ0Õ+Ü—I‘IÐ<ØŸ ™ ×/Ñ/ô1à48·L±L³N�D—L‘LÔ1ðˆKð—‘ 4§<¡<×#:Ñ#:Ò:Ü— ‘ ÐAØ—o‘oñ&ô'à— ‘ ×$Ñ$×,Ñ,¨SÔ1ð ˆKô— ‘ ð8ô9à— ‘ ×$Ñ$×+Ò+¨qÑ0Õ+؈KÜ ˜œ]Ô +Ü �I‰IÐ9¼CÀ»HÑDÔ EÜÐ CÄcÈ#ÃhÑ NÓOÐ Oä �K‰KÐ;¼cÀ#»hÑFÔ G؈Kr Nr�rdr r rŒrŒ±s „ñór rŒcó—eZdZdZd„Zy)r\z)Just sent an ACK packet. Waiting for DAT.có$—t|t«r|j|«St|t«r*|j t j «td«‚t|t«r*|j t j «td«‚t|t«r6|j t j «tdt|«z«‚|j t j «tdt|«z«‚)z?Handle the packet in response to an ACK, which should be a DAT.z)Received ACK from peer when expecting DATz)Received WRQ from peer when expecting DATzReceived ERR from peer: z(Received unknown packet type from peer: ) r£r5r^rFrMrZr[rr¥rJr‰rs r rzTftpStateExpectDAT.handleÙsÈ€ä �cœ=Ô )Ø—>‘> #Ó&Ð &ô˜œ]Ô +à �N‰Nœ:×3Ñ3Ô 4ÜÐ KÓLÐ Lä ˜œ]Ô +Ø �N‰Nœ:×3Ñ3Ô 4ÜÐ KÓLÐ Lä ˜œ]Ô +Ø �N‰Nœ:×3Ñ3Ô 4ÜÐ :¼SÀ»XÑ EÓFÐ Fð �N‰Nœ:×3Ñ3Ô 4ÜÐ JÌSÐQTËXÑ UÓVÐ Vr Nr�rdr r r\r\×s „Ù3óWr r\có—eZdZdZd„Zy)ÚTftpStateSentWRQz&Just sent an WRQ packet for an upload.cóЗ|jjs'||j_tjd|«t |t «r…tj d« |j|«tjd«|j«|j_ tjd«t|j«St |t «råtj d«tjd«|j"dk(rstjd «tjd«|j«|j_ tjd«t|j«Stj%d |j"z«tjd «|St |t&«r-|jtj(«td |z«‚t |t*«r*|jtj(«td «‚t |t,«r*|jtj(«td«‚|jtj(«td|z«‚#t$r6tjd«|jtj«‚wxYw)r¢ú!Set remote port for session to %súReceived OACK from serverzSending first DAT packetz$Changing state to TftpStateExpectACKrzReceived ACK from serverz)Apparently the server ignored our optionsrz#Ack blocknumber is zero as expectedzDiscarding ACK to block %sz,Still waiting for valid response from serverzReceived ERR from server: %sz(Received RRQ from server while in uploadz(Received DAT from server while in uploadú,Received unknown packet type from server: %s)rr?rr'r£rOrr rDr‹rŒrrrMrZÚFailedNegotiationrFr7rRrJr[r¤r5rs r rzTftpStateSentWRQ.handleòs€à�|‰|×#Ò#Ø#(ˆD�L‰LÔ Ü �I‰IÐ9¸5Ô Aô �cœ>Ô *Ü �H‰HÐ0Ô 1ð 8Ø—‘ Ô$ô — ‘ Ð4Ô5Ø04· ± ³�— ‘ Ô-Ü— ‘ Ð@ÔAÜ)¨$¯,©,Ó7Ð7ä ˜œ]Ô +Ü �H‰HÐ/Ô 0Ü �I‰IÐAÔ Bà�‰ !Ò#Ü— ‘ Ð?Ô@Ü— ‘ Ð4Ô5Ø04· ± ³�— ‘ Ô-Ü— ‘ Ð@ÔAÜ)¨$¯,©,Ó7Ð7ä— ‘ Ð8¸3¿?¹?ÑJÔKÜ— ‘ ÐHÔIØ� ä ˜œ]Ô +Ø �N‰Nœ:×3Ñ3Ô 4ÜÐ >ÀÑ DÓEÐ Eä ˜œ]Ô +Ø �N‰Nœ:×3Ñ3Ô 4ÜÐ JÓKÐ Kä ˜œ]Ô +Ø �N‰Nœ:×3Ñ3Ô 4ÜÐ JÓKÐ Kð �N‰Nœ:×3Ñ3Ô 4ÜÐ NÐQTÑ TÓUÐ UøôO!ò Ü— ‘ Ð7Ô8Ø—‘œz×;Ñ;Ô<Øð ús Á$J&Ê&?K%Nr�rdr r r¬r¬ðs „Ù0ó6r r¬có—eZdZdZd„Zy)ÚTftpStateSentRRQzJust sent an RRQ packet.cót—|jjs)||j_tjd|z«t |t «rxtjd« |j |«tjd«|jd¬«tjd«t|j«St |t «rhtjd «|jj"r,tjd «d t$i|j_|j'|«St |t(«r*|jtj*«td «‚t |t,«r*|jtj*«td «‚t |t.«rw|jtj*«tjd|«|j0tj2k(r t5d«‚tdj7|««‚|jtj*«td|z«‚#t$rF}tjdt|«z«|jtj«‚d}~wwxYw)z6Handle the packet in response to an RRQ to the server.r®r¯zSending ACK to OACKr)r7z$Changing state to TftpStateExpectDATzFailed to negotiate options: %sNzReceived DAT from serverz0Server ignored options, falling back to defaultsr"z*Received ACK from server while in downloadz*Received WRQ from server while in downloadzReceived ERR packet: %szFile not foundzReceived ERR from server: {}r°)rr?rrr£rOr r'rHr\rrr‰rMrZr±r5rrmr^rFr[r¥rJrKr…ÚTftpFileNotFoundErrorr†)r rrrÚerrs r rzTftpStateSentRRQ.handle,sù€à�|‰|×#Ò#Ø#(ˆD�L‰LÔ Ü �H‰HÐ8¸5Ñ@Ô Aô �cœ>Ô *Ü �H‰HÐ0Ô 1ð 8Ø—‘ Ô$ô — ‘ Ð/Ô0à— ‘ ¨� Ô+ä— ‘ Ð@ÔAÜ)¨$¯,©,Ó7Ð7ä ˜œ]Ô +ô �H‰HÐ/Ô 0Ø�|‰|×#Ò#Ü—‘ÐKÔLØ)2´KÐ'A�— ‘ Ô$Ø—>‘> #Ó&Ð &ô˜œ]Ô +à �N‰Nœ:×3Ñ3Ô 4ÜÐ LÓMÐ Mä ˜œ]Ô +Ø �N‰Nœ:×3Ñ3Ô 4ÜÐ LÓMÐ Mä ˜œ]Ô +Ø �N‰Nœ:×3Ñ3Ô 4Ü �I‰IÐ/°Ô 5Ø�}‰}¤ × 7Ñ 7Ò7Ü+Ð,<Ó=Ð=ä#Ð$B×$IÑ$IÈ#Ó$NÓOÐOð �N‰Nœ:×3Ñ3Ô 4ÜÐ NÐQTÑ TÓUÐ UøôS!ò Ü— ‘ Ð;¼cÀ#»hÑFÔGØ—‘œz×;Ñ;Ô<Øûð úsÁ&I(É( J7É1AJ2Ê2J7Nr�rdr r r³r³*s „Ù"ó7r r³)rcÚ TftpSharedÚTftpPacketTypesrtÚloggingÚ getLoggerrÚobjectrrfrr�r rŒr\r¬r³rdr r Úr¼s¥ðñ=ôÜÛ Ûà€g×ÑÐ*Ó+€ô v0�ôv0ôpR�iôRôj20˜_ô20ôn:0˜_ô:0ô~Q˜9ôQô*$˜ô$ôLW˜ôWô28�yô8ôt9�yõ9r