PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 131
!^Kf \ UdZddlZddlmZ ddlmZn#e$r ddlmZYnwxYwddlZddlZddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddlm!Z"ddl#m$Z$ddl%m&Z&ddl'm(Z(dd l)m*Z*m+Z+m,Z,dd l)m-Z.dd l/m0Z0dd l1m2Z2m!Z!dd l3m4Z5ddl6m7Z7m8Z8ddl9m:Z:m;Z;mdZ?n#e(j@$rdZ?YnwxYwdZAdejBCvrede?dhdZDddhZEe0pdZFejBdvZGeHZIeJeKejLMddZNeJeKejLMddZOejPZQdZReSeTeUZVeWedZXd ZYdZZd!Z[d"Z\Gd#d$e]Z^Gd%d&e]Z_e_Z`e=eZd?Zdd@ZGdAdBe]ZddCZGdDdEe]ZdFZdGZdHZdIZdJZdKZdLZdMZdNZdOZdPZdQZGdRdSe]ZdTZddUZdVZdWZdXZdYZdZZd[ZGd\d]e]Zd^Zdd_Zd`ZdaZGdbdcebZGdddeebZdfZdgZdhZdiZdjZdkZdlZGdmdne]ZdoZdpZdqZdrZdsZdtZGdudve]ZGdwdxe]ZdyZeeQdzZe$d{ZGd|d}ezZGd~de8ZeHdzZeeZeeje<eddZeddZeddZdZGdde8ZeHdkr eeæZeeĦdSeejeHejeH<dS)z http://amoffat.github.io/sh/ N)deque)Mapping)Queuecontextmanager)partial)metadata)BytesIOStringIOUnsupportedOperation)open)getpreferredencoding)Emptyr)quote) GeneratorType ModuleType)AnyDictTypeUnionshunknownzhttps://github.com/amoffat/shwindowszsh z~ is currently only supported on linux and osx. please install pbs 0.110 (http://pypi.python.org/pypi/pbs) for windows support.>TouterrzUTF-8)AIXDarwinSH_TESTS_RUNNING0SH_TESTS_USE_SELECTcNttj|jSN)leninspectgetfullargspecargs)fns 5/opt/alt/python311/lib/python3.11/site-packages/sh.py get_num_argsr*is w%b)). / //pollc\eZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdS) PollPollercRtj|_i|_i|_dSr#)selectr,_poll fd_lookup fo_lookupselfs r)__init__zPollPoller.__init__ws![]] r+c2t|jdkSNrr$r5r7s r) __nonzero__zPollPoller.__nonzero__}s4>""a''r+c*t|jSr#r<r7s r)__len__zPollPoller.__len__s4>"""r+ct|dr*|}||j|<||j|<dS||j|<||j|<dSNfilenohasattrrBr5r6r8ffds r)_set_fileobjectzPollPoller._set_fileobjects] 1h   "B!"DN2  "DN1    !DN1  !DN1   r+ct|dr&|}|j|=|j|=dS|j|=|j|=dSrArCrEs r)_remove_fileobjectzPollPoller._remove_fileobjectsU 1h   "Br"q!!!q!q!!!r+c6|j|Sr#)r6getr8rFs r)_get_file_descriptorzPollPoller._get_file_descriptors~!!!$$$r+c6|j|Sr#)r5rL)r8rGs r)_get_file_objectzPollPoller._get_file_objects~!!"%%%r+c||||}|j||dSr#)rHrNr4register)r8rFeventsrGs r) _registerzPollPoller._registersG Q  & &q ) ) B'''''r+c`||tjtjzdSr#)rTr3POLLINPOLLPRIrMs r) register_readzPollPoller.register_reads% q&-&.899999r+cF||tjdSr#)rTr3POLLOUTrMs r)register_writezPollPoller.register_writes q&.)))))r+cz||tjtjztjzdSr#)rTr3POLLERRPOLLHUPPOLLNVALrMs r)register_errorzPollPoller.register_errors, q&.6>9FOKLLLLLr+c||}|j|||dSr#)rNr4 unregisterrJrEs r)rbzPollPoller.unregistersE  & &q ) ) b!!! """""r+c||dz}|j|}g}|D]\}}||}|tjtjzzr||tfS|tjzr||tf|tj zr||tf|tj tj zzr||tf|S)Ni)r4r,rPr3rVrWappendPOLLER_EVENT_READrZPOLLER_EVENT_WRITEr^POLLER_EVENT_HUPr]r_POLLER_EVENT_ERROR)r8timeoutchangesresultsrGrSrFs r)r,zPollPoller.polls   tOG*//'**! 8 8JB%%b))A78 8#456666&.( 8#567777&.( 8#3455556>FO;< 8#56777r+N)__name__ __module__ __qualname__r9r=r?rHrJrNrPrTrXr[r`rbr,r+r)r1r1vs (((###""""""%%%&&&((( :::***MMM### r+r1cjeZdZdZdZdZedZedZdZ dZ dZ d Z d Z d S) SelectPollerc0g|_g|_g|_dSr#)rlistwlistxlistr7s r)r9zSelectPoller.__init__s   r+ct|jt|jzt|jzdkSr;r$rsrtrur7s r)r=zSelectPoller.__nonzero__s/4:TZ03tz??BaGGr+c~t|jt|jzt|jzSr#rwr7s r)r?zSelectPoller.__len__s*4:TZ03tz??BBr+c<||vr||dSdSr#)rdrFrSs r)rTzSelectPoller._registers* F?? MM!      ?r+c<||vr||dSdSr#)removerzs r) _unregisterzSelectPoller._unregisters* ;; MM!      ;r+c<|||jdSr#)rTrsrMs r)rXzSelectPoller.register_read q$*%%%%%r+c<|||jdSr#)rTrtrMs r)r[zSelectPoller.register_writerr+c<|||jdSr#)rTrurMs r)r`zSelectPoller.register_errorrr+c|||j|||j|||jdSr#)r}rsrtrurMs r)rbzSelectPoller.unregistersP DJ''' DJ''' DJ'''''r+c$tj|j|j|j|\}}}g}|D]}||t f|D]}||t f|D]}||tf|Sr#)r3rsrtrurdrerfrh)r8ri_in_out_errrkrFs r)r,zSelectPoller.polls - DJ GTTT4 3 3A NNA01 2 2 2 2 4 4A NNA12 3 3 3 3 4 4A NNA12 3 3 3 3r+N)rlrmrnr9r=r? staticmethodrTr}rXr[r`rbr,ror+r)rqrqs HHHCCC\\&&&&&&&&&(((     r+rqPollerceZdZdZdS) ForkExceptioncndtj|dd}t||dS)Nz+ Original exception: =================== z  )textwrapindent Exceptionr9)r8orig_excmsgs r)r9zForkException.__init__sG  6""  4%%%%%r+Nrlrmrnr9ror+r)rrs#&&&&&r+rceZdZdZdZdS)ErrorReturnCodeMetaaa metaclass which provides the ability for an ErrorReturnCode (or derived) instance, imported from one sh module, to be considered the subclass of ErrorReturnCode from another module. this is mostly necessary in the tests, where we do assertRaises, but the ErrorReturnCode that the program we're testing throws may not be the same class that we pass to assertRaises cptd|jD}|j|vp|j|jkS)Ncg|] }|j Sro)rl).0bs r) z9ErrorReturnCodeMeta.__subclasscheck__..s;;;!1:;;;r+)set __bases__rl)r8o other_basess r)__subclasscheck__z%ErrorReturnCodeMeta.__subclasscheck__s;;;q{;;;<< } +JqzT]/JJr+N)rlrmrn__doc__rror+r)rrs2KKKKKr+rc0eZdZeZ dZdZdfd ZxZS)ErrorReturnCodeicD|j|j|j|j|jffSr#) __class__full_cmdstdoutstderrtruncater7s r) __reduce__zErrorReturnCode.__reduce__/s ~ t{DKWWWr+Tc |j|_||_||_||_||_|j}|rP|d|j}t |jt |z }|r|d|dz }|j}|rP|d|j}t |jt |z }|r|d|dz }d|jd|tdd|td} tt| | dS)Nz... (z more, please see e.stdout)z more, please see e.stderr)z RAN: z STDOUT: replacez STDERR: ) exit_coderrrr truncate_capr$encodedecodeDEFAULT_ENCODINGsuperrr9) r8rrrr exc_stdout out_delta exc_stderr err_deltarrs r)r9zErrorReturnCode.__init__2sy      [  X#$7d&7$78JDK((3z??:I XMyMMMUUWWW [  X#$7d&7$78JDK((3z??:I XMyMMMUUWWW  O$- O O(//0@)LL O O(//0@)LL O O ot$$--c22222r+)T) rlrmrnr __metaclass__rrr9 __classcell__rs@r)rrsa'MS(LXXX3333333333r+rceZdZdS)SignalExceptionNrlrmrnror+r)rrPDr+rc"eZdZdZfdZxZS)TimeoutExceptionzvthe exception thrown when a command is killed because a specified timeout (via _timeout or .wait(timeout)) was hitcr||_||_tt|dSr#)rrrrr9)r8rrrs r)r9zTimeoutException.__init__Xs3"   i'')))))r+)rlrmrnrr9rrs@r)rrTsB88*********r+rceZdZdS)CommandNotFoundNrror+r)rrprr+rz6(ErrorReturnCode|SignalException)_((\d+)|SIG[a-zA-Z]+) rc_exc_cachecFg|]\}}tjd|||fS)z SIG[a-zA-Z]+)rematchrkvs r)rrxs1PPP128OQ3O3OPaVPPPr+cd} t|S#t$rt|}|r|d}|d}|dkr8 t | }n5#t $rtt| }YnwxYwt |}t|}YnwxYw|S)atakes an exception name, like: ErrorReturnCode_1 SignalException_9 SignalException_SIGHUP and returns the corresponding exception. this is primarily used for importing exceptions from sh into user code, for instance, to capture those exceptionsNr-rr) rKeyError rc_exc_regexrgroupint ValueErrorgetattrsignal get_rc_exc)nameexcmbaserc_or_sig_namercs r)get_exc_from_namer|s C!D!! !!!   t $ $ !771::DWWQZZN(((:n---BB!:::!&.999BBB:((R..C! Js4 AC(A98C9 BCB!C?Cc t|S#t$rYnwxYw|dkr d|}t}n$dtt |}t }t ||fd|i}|t|<|S)aGtakes a exit code or negative signal number and produces an exception that corresponds to that return code. positive return codes yield ErrorReturnCode exception, negative return codes yield SignalException we also cache the generated exception so that only one signal of that type exists, preserving identityrErrorReturnCode_SignalException_r)rrrSIGNAL_MAPPINGabsrr)rrrrs r)rrs B       Qww&"&&;.R"9;; dTGk2-> ? ?CL Js  ceZdZdZdS) GlobResultscJ||_t||dSr#)pathlistr9)r8rrks r)r9zGlobResults.__init__s#  dG$$$$$r+Nrror+r)rrs#%%%%%r+rFcDt|t||}|S)N) recursive)r _old_glob)rrexpandeds r)globrs#449!E!E!EFFH Or+cztjtj|Sr#)osrabspath expanduser)rs r) canonicalizers& 7??27--d33 4 44r+c d}d}tj|\}}|rt|}||r|}ng}t |t t fr||nRtj ddtj }|||D]>}tj t||} || r| }n?|S)a+takes a program name or full path, plus an optional collection of search paths, and returns the full path of the requested executable. if paths is specified, it is the entire list of search paths, and the PATH env is not used at all. otherwise, PATH env is used to look for the programctj|oZtj|tjo;tjtj|Sr#)rrexistsaccessX_OKisfilerealpath) file_paths r)is_exez_which..is_exesT GNN9 % % < )RW-- <rw// ::;; r+NPATH) rrsplitr isinstancetuplerextendenvironrLpathsepjoin) programpathsr found_pathfpathfnamepaths_to_search env_pathsrexe_files r)_whichrs    J7==))LE5 w'' 6'?? ! J  eeT] + + .  " "5 ) ) ) ) vr2288DDI  " "9 - - -#  Dw||L$6$6@@Hvh %   r+c~t|}|s+d|vr#t|dd}|sdS|S)N_-)rr)rrs r)resolve_command_pathr sM '??D  '>>'//#s3344D 4 Kr+c`t|}d}|r||}|r |jdi|}|S)Nro)r bake)r command_cls baked_argsrcmds r)resolve_commandrsO  % %D C )k$  )#(((Z((C Jr+cTeZdZdZd dZdZedZdZdZ dZ d Z d Z dS) LoggeraFprovides a memory-inexpensive logger. a gotcha about python's builtin logger is that logger objects are never garbage collected. if you create a thousand loggers with unique names, they'll sit there in memory until your script is done. with sh, it's easy to create loggers with unique names if we want our loggers to include our command arguments. for example, these are all unique loggers: ls -l ls -l /tmp ls /tmp so instead of creating unique loggers, and without sacrificing logging output, we use this class, which maintains as part of its state, the logging "context", which will be the very unique name. this allows us to get a logger with a very general name, eg: "command", and have a unique name appended to it via the context, eg: "ls -l /tmp" Nc||_tjtd||_|||_dSN.)rlogging getLoggerSH_LOGGER_NAMElogsanitize_contextcontext)r8rrs r)r9zLogger.__init__-sB $%?%?%?%?@@,,W55 r+c2|jr |jd|}||zS)N: rr8ras r) _format_msgzLogger._format_msg2s* < +\**S**CQwr+c:|r|dd}|pdS)N%z%%r)rrs r)rzLogger.sanitize_context7s'  1ooc400G}"r+cV|jdz|z}|jdz|z}t||Sr)rrr)r8rrnew_name new_contexts r) get_childzLogger.get_child=s39s?T)lS(72 h ,,,r+cR|j|j|g|RdSr#)rinfor!rs r)r)z Logger.infoBs2  &d&s/Q///00000r+cR|j|j|g|RdSr#)rdebugr!rs r)r+z Logger.debugE2 't'0a00011111r+cR|j|j|g|RdSr#)rerrorr!rs r)r.z Logger.errorHr,r+cR|j|j|g|RdSr#)r exceptionr!rs r)r0zLogger.exceptionKs4 +4+C4!44455555r+r#) rlrmrnrr9r!rrr'r)r+r.r0ror+r)rrs99"6666  \ --- 11122222266666r+rc*|r d|d|d}nd|d}|S)N ro)r call_argspidss r)default_logger_strr7Os9 ! + + +S + + +   Hr+ceZdZdZhdZdZddZdZdZe dZ e d Z e d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdS)RunningCommandathis represents an executing Command object. it is returned as the result of __call__() being executed on a Command instance. this creates a reference to a OProc instance, which is a low-level wrapper around the process that was exec'd this is the class that gets manipulated the most by user code, and so it implements various convenience methods and logical mechanisms for the underlying process. for example, if a user tries to access a backgrounded-process's stdout/err, the RunningCommand object is smart enough to know to wait() on the process to finish first. and when the process finishes, RunningCommand is smart enough to translate exit codes to exceptions.> r5sidcttykillpgidr terminate kill_group signal_group bg_thread_excinput_thread_excoutput_thread_excc dd|D|_||_||_d|_d|_d}d}d|_ tjtj |_ n#t$r d|_ YnwxYwd|_ |dr#d}t||ds|ds|drd}|d rd}|d rd}|d r tj}|d }|rt#|||d <tj} |dd ks |ddur tj} n|ddkr tj} |dd ks |ddur tj} n|ddkr tj} d|_|r|dpt(} | |j|} t+d| |_|jd|rd|_t1j} | 5t||j|||||j| | |_dddn #1swxYwY| |j||jj} |j| |j_|jd|r|dSdSdS)N cFg|]}tt|Sro) shlex_quotestr)rargs r)rz+RunningCommand.__init__..ys&BBBs[S22BBBr+FTwithpipediter iter_noblockasyncbg err_to_outdonerrlog_msgcommandzstarting processzprocess started)rranr4rprocess_waited_until_completion_force_noblock_iterasyncioget_running_loopEventaio_output_complete RuntimeError_stopped_iterationget_prepend_stackrdOProcSTDOUTrSTDERR_spawned_and_waitedr7rrr+ threadingLockr5rrr)wait) r8rr4stdinrr should_wait spawn_process done_callbackpipelog_str_factory logger_strprocess_assign_locks r)r9zRunningCommand.__init__usr88BBcBBBCC" (-%  $)  7  $ & & &(/}D $ $ , , ,'+D $ $ $ ,#( V  -!M    & &t , , , W  6!2 i6O K W  K T? K \ " "\F!&)  = ' t < 1Jd1R1R
NOOJ#x88DDDH  HMM+ , , ,  A  >  s$ A99B  B 'I  IINc\|js#|d}d}d}d}|dkrtd||kr?|j\}}|rt j|||z }nn||k?|rt d|jd|_n |j}d|_|jj rt | |j| ||jj r#|jj j |j d|S)awaits for the running command to finish. this is called on all running commands, eventually, except for ones that run in the background if timeout is a number, it is the number of seconds to wait for the process to resolve. otherwise block on wait. this function can raise a TimeoutException, either because of a `_timeout` on the command itself as it was launched, or because of a timeout passed into this method. Nr皙?Fztimeout cannot be negativeTzprocess completed)rVr\rUis_alivetimesleeprrTre timed_outhandle_command_exit_code_stdin_processrSrr+)r8ri waited_for sleep_amtalivers r)rezRunningCommand.waits`,: 0"   Q;;&'CDDD !G++'+|'<'<'>'>$E9 9---"i/ !G++;*4::: 15--!L--// 04-|% ?' z48<<<--i888 <.?L/7<<>>> HNN. / / / r+c@|jdS)zUreturns whether or not we're still alive. this call has side-effects on OProcr)rUrpr7s r)rpzRunningCommand.is_alive+s|$$&&q))r+c|j}t||d|d}|r/||j|jj|jj|d}|dS)zhere we determine if we had an exception, or an error code that we weren't expecting to see. if we did, we create and raise an exception ok_coderK truncate_excN)r4get_exc_exit_code_would_raiserTrUrr)r8codeca exc_classrs r)rtz'RunningCommand.handle_command_exit_code0sh^1$9 r'{SS  )$,-t|/BB~DVCI   r+cB||jjSr#)rerUrr7s r)rzRunningCommand.stdout< |""r+cB||jjSr#)rerUrr7s r)rzRunningCommand.stderrArr+cB||jjSr#)rerUrr7s r)rzRunningCommand.exit_codeFs |%%r+c:tt|Sr#)r$rHr7s r)r?zRunningCommand.__len__Ks3t99~~r+cdS)zwe don't actually do anything here because anything that should have been done would have been done in the Command.__call__ call. essentially all that has to happen is the command be pushed on the prepend stack.Nror7s r) __enter__zRunningCommand.__enter__Ns r+c|Sr#ror7s r)__iter__zRunningCommand.__iter__Us r+c|jrt|jj}|j } |||jd}|)|d|_t ||jd|jdS#t$r|cYSwxYw#t$r%|jds|jrtj cYSYnwxYw)z2allow us to iterate over the output of our commandTiter_poll_timeNencoding decode_errorsrM) r] StopIterationrU _pipe_queuerWrLr4rerUnicodeDecodeErrorrerrno EWOULDBLOCK)r8pq block_pq_readchunks r)__next__zRunningCommand.__next__Xs#  " "// ! \ %!44  ! !}dn=M.NOO =IIKKK.2D+'//)! <<z2DN?4S*!!! LLL! - - ->.1-T5M- ,,,,-- - !s#!B79+B%% B43B47*C&%C&cFfd}|S)NcdKjd{VtSr#)r[rerHr7sr)wait_for_completionz5RunningCommand.__await__..wait_for_completion}s:*//11 1 1 1 1 1 1 1t99 r+) __await__)r8rs` r)rzRunningCommand.__await__|s9     #"$$..000r+ctd_d_fd}tj|}|_S)Nr-)maxsizeTc:K D]M}|tjkrtjdd{V-j|d{VN jdd{VdS#jdd{VwxYw)Ng{Gz?)rrrXrr _aio_queueput)rr8s r)queue_connectorz1RunningCommand.__aiter__..queue_connectors 0"99E 111%mD1111111111"o11%8888888888 9o))$///////////do))$//////////s AA88"B)AQueuerrWrX create_task _aio_task)r8rtasks` r) __aiter__zRunningCommand.__aiter__s^ !+++#' 0 0 0 0 0"??#4#455 r+cK|jd{V}||S|j}||tr#)rrLrr0StopAsyncIteration)r8rrs r) __anext__zRunningCommand.__anext__sYo))++++++++  L.**,,C $ $r+c|jdr0tr$tdSdSdS)NrJ)r4r^popr8exc_typeexc_valexc_tbs r)__exit__zRunningCommand.__exit__sQ >& ! &&7&9&9 &    # # % % % % % & & & &r+c|jr8|jr1|j|jd|jdSdS)Nrrr)rUrrr4r7s r)__str__zRunningCommand.__str__sI < DK ;%%z*DN?,K rr+cBt|t|kSr#)idr8others r)__eq__zRunningCommand.__eq__s$xx2e99$$r+c$|t|vSr#rH)r8items r) __contains__zRunningCommand.__contains__ss4yy  r+c||jvr#|jrt|j|St|tvrtt ||Str#)_OProc_attr_allowlistrUrAttributeError_unicode_methodsrH)r8ps r) __getattr__zRunningCommand.__getattr__s\ * * *| %t|Q///$$  3t99a(( (r+c t|S#t$r6|jr|jrt |jcYSt dcYSwxYwNr)rHrrUrreprr7s r)__repr__zRunningCommand.__repr__sg t99 !   | -;- ,,,,,88OOO  s,AAAc^tt|Sr#rrHstripr7s r)__long__zRunningCommand.__long__ 3t99??$$%%%r+c^tt|Sr#)floatrHrr7s r) __float__zRunningCommand.__float__s SYY__&&'''r+c^tt|Sr#rr7s r)__int__zRunningCommand.__int__rr+r#)rlrmrnrrr9rerprtpropertyrrrr?rrrrrrrrrrrrrrrror+r)r9r9Ws     lll\FFFFP***   ##X###X#&&X&   "!"!"!H111:%%%&&&%%%!!!   &&&(((&&&&&r+r9cLt|tpt|dS)N __fspath__)rrHrD)rs r)output_redirect_is_filenamers! c3   =73 #=#==r+cVtj}t|dsg|_|jS)N_prepend_stack)Command thread_localrDr)tls r)r^r^s.  B 2' ( ( r+ct|}g}|D]f}t|r$|}|||}||5|\}}||r|||fg|Sr#)rkeyscallabler issupersetrd) passed_kwargs merged_kwargs invalid_lists1 invalid_argselemr(ret error_msgs r)special_kwarg_validatorrs ]   ! ! " "BL 7 7 D>> 7B"]M22C    $ $ $ $#OD)}}T"" 7##T9$5666 r+ct|dd}d}|r |}n.#t$rYn"wxYwt|tfr|dkr|}|S)NrBr)rr rr)ob fileno_methrBs r) get_filenorsz"h--K F  []]FF#    D  B  B!GG Ms " //c$t|duSr#)r)rs r)ob_is_fd_basedr s b>> %%r+cTt|}d}|tj|}|S)z7checks if an object (like a file-like object) is a tty.F)rrisatty)rrBis_ttys r) ob_is_ttyrs, ^^F F 6"" Mr+ct|}d}|r-tj|}tj|j}|SNF)rrfstatstatS_ISFIFOst_mode)rrBis_pipefd_stats r) ob_is_pipers? ^^FG 1(6""-00 Nr+cg}|dr0|ddvrd}|d|f|S)Nno_outrL)Trz4You cannot iterate over output if there is no output)rrL)rLrd)rrinvalidr.s r)output_iterator_validatorr#sWG""4}'8'8'@'@M'Q'QF*E2333 Nr+c d}g}|D]N\}}||vrEt||dr"d|d|d}|||f|fO|dr%|dr|ds|d|S) N))tty_inin)tty_outrz`_zG` is a TTY already, so so it doesn't make sense to set up a TTY with `_` unify_ttysrr))rrrzC`_tty_in` and `_tty_out` must both be True if `_unify_ttys` is True)rrLrd)rrpairsrtty_typestdr.s r)tty_in_validatorr+s 3EG55 # } $ $=3D3DS$3O3O)P)P $+S++'+++  NNXsOU3 4 4 4\" h $1)$<       Nr+cg}d}hd}t||z }d|vr!|dr|r|d|f|S)z1fg is not valid with basically every other optionz_fg is invalid with nearly every other option, see warning and workaround here: https://amoffat.github.io/sh/sections/special_arguments.html#fg>fgcwdenvr{r)rrrd)rrrr allowlist offendings r) fg_validatorr FsqG GC0//IM&&(())I5I }t!4c{### Nr+cg}|dd}|dd}|dd}|dd}t|}t|}d} |r-|+|d| df|r-|+|d | df|S) a;a validator to prevent a user from saying that they want custom buffering when they're using an in/out object that will be os.dup'ed to the process, and has its own buffering. an example is a pipe or a tty. it doesn't make sense to tell them to have a custom buffering, since the os controls this.rNr in_bufsize out_bufsizezICan't specify an {target} bufsize if the {target} target is a pipe or TTY)rr)target)rr)rLrrdformat) rrrin_obout_obin_bufout_buf in_no_buf out_no_bufrs r)bufsize_validatorrVs G   dD ) )E   ud + +F   |T 2 2F t44Gu%%I''J UCHV',cjjj.E.EFGGGKg). % 0H0HIJJJ Nr+c g}|dd}||St|ts|dd|f|S|dD]h\}}t|t s|dd|dft|t s|dd|d|dfi|S)za validator to check that env is a dictionary and that all environment variable keys and values are strings. Otherwise, we would exit with a confusing exit code 255.r Nzenv must be dict-like. Got zenv key z must be a strzvalue z of env key )rLrrrditemsrH)rrrr rrs r) env_validatorrrsG   E4 ( (C { c7 # #DSDDEFFFe$**,,SS1!S!! D NNE#Aa#A#A#AB C C C!S!! S NNE#PA#P#PQ#P#P#PQ R R R Nr+c eZdZUdZejZeZidddddddddd d d d d d d d ddddddddd dd dd dd ddidddd ddddd dd!dd"dd#e d$d%d&d d'e j d(dd)dd*dd+d d,d d-d.dd d ddd d de ddd/ Z eeefed0<d1d2d3ed4eeeef Zd?d5Zd6Zed7Zd8Zd9Zd:Zd;Zd<Z d=Z!d>Z"d S)@rarepresents an un-run system program, like "ls" or "cd". because it represents the program itself (and not a running instance of it), it should hold very little state. in fact, the only state it does hold is baked arguments. when a Command object is called, the result that is returned is a RunningCommand object, which represents the Command put into an execution state.rFrObg_excTrJrNrrrPrrrr- err_bufsizeinternal_bufsizei0r rKrLrMrror{rlong_sep= long_prefixz--rrrrrstrictritimeout_signalrno_errno_pipeteerQtty_sizeP) r| preexec_fnuid new_session new_grouparg_preprocessrR close_fdspass_fds return_cmdrN _call_args))rrPz"Stderr is already being redirected))rKrLz3You cannot iterate when this command is being piped))rKr&z;Using a pipe doesn't make sense if you've disabled the pipe))r1r2z0Passing `pass_fds` forces `close_fds` to be Truect||}d|_d|_g|_i|_t ||_|st|||_t ||_dS)NrF)r_path_partial_partial_baked_args_partial_call_argsrHrlr)r8r search_pathsfounds r)r9zCommand.__init__ spt\**  #% "$D   (!$'' ' D  r+cttj|}d}|dr ||}n1|dkr |d}n|dr |dd}||d|}|S)Nrr )robject__getattribute__ startswithendswith)r8rget_attrvals r)r?zCommand.__getattribute__$s62D99 ??3   (4..CC V^^(6""CC ]]3   9D ;"((6""4((C r+c|}i}|jD]\}}d|z}||vr||||<||=|j}||t |||j}|rMg}|D] \} } |d| d| !d|}td|d||fS)ztakes kwargs that were passed to a command's __call__ and extracts out the special keyword arguments, we return a tuple of special keyword args, and kwargs that will go to the exec'ed commandrz rrzInvalid special arguments: ) copyr4rupdater_kwarg_validatorsrdr TypeError) clskwargsr4pargdefaultkey merged_argsinvalid_kwargsexc_msgkwargrs r)_extract_call_argszCommand._extract_call_args:s   ^1133  MD'*Cf}}"(+ $3Kn))++ 9%%%0 {C$9    JG$2 < < y:E::y::;;;;ii((GHWHHHII I&  r+ct||j}d|_||\}}|j|j|j||j|j|d|j d}|d|j d}|jt|||||S)a.returns a new Command object after baking(freezing) the given command arguments which are used automatically when its exec'ed special keyword arguments can be temporary baked and additionally be overridden in __call__ or in subsequent bakes (basically setting defaults)Tr r") typer6r7rRr9rFr8rrLr4 compile_args)r8r'rJr(r4sepprefixs r)r z Command.bakeXsT$ZZ # #  33F;; 6 $$T%<=== $$Y/// %%d&>???mmJ (CDD}dom.LMM %%l4f&M&MNNN r+cXd|j}|rd|z}|j|zS)NrE)rr8r6)r8rs r)rzCommand.__str__ns5XXd677  *z)JzJ&&r+cBt|t|kSr#rrs r)rzCommand.__eq__ts4yyCJJ&&r+c(dt|dS)Nr2r3rr7s r)rzCommand.__repr__ws)3t99))))r+c|ddS)NT)_withror7s r)rzCommand.__enter__zs 4r+cFtdSr#)r^rrs r)rzCommand.__exit__}s !!!!!r+c6|}t|}g}|jj}t D]v}|j}|dd|||dds| |j w| |j |j dd}|r|||\}}||\}}||j |||dd|d<t|ddds |dg|d<|d} t!| t"r!| jd r| j} n | jj} t)|||d |d } |j| z} | } | | |d r|d pt-j} t1| 5|d't-jt,j|d|}n-t-jt,j|d||d}dddn #1swxYwYt9||d|d }|r+d|}||dd|d}|dS|d}t=|rt?tA|d}|d}t=|rt?tA|d}|j!||| ||}|j"r|dstA|S|S)NrJr\Fr0r{rrrrKr r"rrr rEr+r|rwbrr3)#rErrr4r^r4rrFrLrrrdr6r9rRrrr9rUrrUr8rgetcwdpushdspawnvP_WAITspawnver}rrr rHRunningCommandClsrb)r8r'rJrr4prepend pcall_args preprocessorextracted_call_argsrfprocessed_args split_args final_argsrrrrTrrrrs r)__call__zCommand.__call__sDzzN-2244 )** ( (G *//11J NN64 ( ( (   Z ( ( (::gu-- ( 7;''' 4:.223CTJJ  6'<f55LD&'+&=&=f&E&E#V0111,--- Y  '#$Ii y+Z>> :$-i$8#9Ii $ e^ , , 2w' 2  1% &)J/=1I   ->   : T? E"1bikkCs U UU#+ " ")SVS A AII " 29c!fc9UCS T TI  U U U U U U U U U U U U U U U 69Y/71CI hhsmmiS#y/HII 45! &v . . -#f++t,,F5! &v . . -#f++t,,F ^ - -c9eVV T T ! )L*A r77NIs5AJJ"%J"r#)#rlrmrnrrclocalrr9rerrSIGKILLrr4rrHr__annotations__rrrrr rGr9r? classmethodrRr rrrrrrmror+r)rrsh#9?$$L&c" ec" e c" $c" c" dc" tc" tc" dc" ac"" q#c"$ q%c"8 K9c": t;c"< =c"> ?c"@ Ac"D #Ec"c"F 1Gc"H tIc"R CSc"V tWc"\ %]c"^ 4_c"` eac"b $cc"d ec"h 4ic"j &.kc"v %wc"x %yc"z 5{c"D tEc"H Ic"N HOc"c"RCEEEc"c"c"JS#XcccP FR  "W """"0,!![!:,''' '''***"""hhhhhr+rcg}|D]}t|ttfr:t|tr |s|jg}|D]}||Xt|t r|t|||dz }||dur|t||t|||z }|S)atakes args and kwargs, as they were passed into the command instance being executed with __call__, and compose them into a flat list that will eventually be fed into exec. example: with this call: sh.ls("-l", "/tmp", color="never") this function receives args = ['-l', '/tmp'] kwargs = {'color': 'never'} and produces ['-l', '/tmp', '--color=geneticnever'] T)rawNF) rrrrrrddict_aggregate_keywordsrH)r rJrVrWrjrIsub_args r)rUrUs&N,, cD%= ) ) ,#{++ !C !xj / /%%g.... / T " " , 1#sFMMM MNN[C5LL   ! !#c(( + + + +)&#v>>>N r+crg}|D]\}}|g}t|ttfr|}|D]}t |dkrC|dur>|d|z|dur"|t |X|s|dd}|dur|||z|dur||dkr;|||z|t |||||} ||  |S)atake our keyword arguments, and a separator, and compose the list of flat long (and short) arguments. example {'color': 'never', 't': True, 'something': True} with sep '=' becomes ['--color=never', '-t', '--something'] the `raw` argument indicates whether or not we should leave the argument name alone, or whether we should replace "_" with "-". if we pass in a dictionary, like this: sh.command({"some_option": 12}) then `raw` gets set to True, because we want to leave the key as-is, to produce: ['--some_option=12'] but if we just use a command's kwargs, `raw` is False, which means this: sh.command(some_option=12) becomes: ['--some-option=12'] essentially, using kwargs is a convenience, but it lacks the ability to put a '-' in the name, so we do the replacement of '_' to '-' for you. but when you really don't want that to happen, you should use a dictionary instead with the exact names you want r-Fr TrNrE)rrrrr$rdrHr) keywordsrVrWrs processedrmaybe_list_of_v list_of_vrrIs r)rurusFI&nn..#*#*?%% oe} 5 5 ('I * *A1vv{{E>>$$S1W---}}!((Q000, #s++A99$$VaZ0000%ZZ[C3JJ$$VaZ000$$SVV,,,,$0Q00Q00C$$S))))9 *< r+czfd}tj|||}d|_||S)Ncj |i|dS#t$r}|d}~wwxYwr#)rr)rgsrJe exc_queuer(s r)wrapz"_start_daemon_thread..wrapesW  B v         MM!     s 2-2)rrr'T)rcThreaddaemonstart)r(rrr rthreads` ` r)_start_daemon_threadrdsT T1 = = =FFM LLNNN Mr+c|\}}ttdd}tjd||dd}t j|||dS)zSset the terminal size of a tty file descriptor. borrowed logic from pexpect.py TIOCSWINSZigtHHHHrN)rtermiosstructpackfcntlioctl)rG rows_colsrowscolswinsizer6s r) setwinsizerrsOJD$g|[99G FD$1--A KGQr+cd}d}}ttrtj}j}t j|rd}t|}n:t j|rt|}nd}t|j }||z |z }d|dkrd|dkr |j fn!|dkr|j tj |ffd}|S)a^here we're constructing a closure for our streamreader callback. this is used in the case that we pass a callback into _out or _err, meaning we want to our callback to handle each bit of output we construct the closure based on how many arguments it takes. the reason for this is to make it as easy as possible for people to use, without limiting them. a new user will assume the callback takes 1 argument (the data). as they get more advanced, they may want to terminate the process, or pass some stdin back, and will realize that they can pass a callback of more argsrr-rorcp}t|dkrddf}|g|RS)Nrrr-)r$)rr handler handler_argss r)r(z+construct_streamreader_callback..fnsK  q66Q;;a/,q/"3"34Awu!q!!!!r+) rrr$r'funcr%ismethodr* isfunctionrmrfweakrefref) rUr implied_arg partial_argshandler_to_inspectnum_argsnet_argsr(rs ` @r)construct_streamreader_callbackr|s+KL '7##*7<(( $\*++ A  233  0 1 1 A#$677HHK#$6$?@@H+% 4HL1}} 1}} '  Q w{7';';< """""" Ir+czd}||v}| tv}|r| tjkrd}d}|r|rt|}|S)NFT)#SIGNALS_THAT_SHOULD_THROW_EXCEPTIONrSIGPIPEr)rok_codes sigpipe_okrsuccessbad_sigs r)r}r}sa C8#Gj??G yjFN22 $g$## Jr+ctj|rtj| }n8tj|rtj|}nt d|S)z;this should only ever be called once for each child processzUnknown child exit status!)r WIFSIGNALEDWTERMSIG WIFEXITED WEXITSTATUSr\)rs r)handle_process_exit_codersb ~i  9[+++ i 9N9-- 7888 r+czd} ||i|}n-#t$r }|jtjkrYd}~/d}~wwxYw|S)z0a helper for making system calls immune to EINTRN)OSErrorrEINTR)syscallr'rJrrs r) no_interruptrso C  '4*6**C     w%+%%   Js 8338ceZdZdZdZdZdZdZdZdZ dZ d Z e d Z e d Zd Zd ZdZdZdZdZdZdZdZdZdZdS)r_a"this class is instantiated by RunningCommand for a command to be exec'd. it handles all the nasty business involved with correctly setting up the input/output to the child process. it gets its name for subprocess.Popen (process open) but we're calling ours OProc (open process)r)r=c $# =>|_|_j==dPtjdkrt d=d} t j=d} | j} nd\} } =drd=d<d_t|} t|}t|}t=d tttfs=d  =d h}nt=d }t|}t"|}=d o=do=d }|rt%j\__tjj_tjj_tjj_tjj_nt|t6r(|jdr|j_d_|_ny| r.tjt;|_d_nI=d r!t%j\__n tj\__|r0|s.tjt;|_d_nI=dr!t%j\__n tj\__|t6jurI|r |sd_ntjj_tjj_nR|r0|s.tjt;|_d_n tj\__=d}d_|r-j}|d krj}tj|_=d }=d}=d }|rd}d_ |rtj!j_ tEj#}|rtEj$tj\}}tj\}}tJrtj\}}nd\}}d_&d_'tj(_)j)dkrtJr=tj*|dtj+|tj+|tYj,|tXj-} | tXj.z} tYj,|tXj/|  =ddur)taj0t`j1t`j2taj0t`j3t`j4|rtj5n|rtj6ddtj7d}!tj8d}"|!d|"9tt}#tj;||#=dr|s|styj=jjrtj+jjrtj+jjrtj+jtj+|tj+|=d}$|$rtj>|$tj?jdtj?jdtj?jd|rEtj@tj!dtjA}%tj+|%=dr|std=d=d(tjC| tjD| =d}&t|&r |&=d}'=drd}'|'rddd|h}(|(F=d tjGd})n+#ttf$rtjGd})YnwxYwtd|)D|(z })|)D]'}* tj+|*#t$rY$wxYw=fd|D}+=dtjJ|+d|+n$tjK|+d|+=ddSdS#t$rtjN9dd}, tj;||,n:#t$r-}-tjP;d |-d!Yd}-~-nd}-~-wwxYwtjQd"n#tjQd"wxYwYdSwxYw|rtEjRtj+jtj+jtj+jtJrbtj+|tj;|td9tttj+|tj+|tj*|d#}.tj+||.r)|.Stt}.t|.tj+|tj*|d$SttUd\}!}"tj+|t|!_&t|"_'d_VtjW_X|_Yd_Z|_[t=d%rj[t_[t_]tj__`t=d&'_bt=d&'_c=d r| stj=d|dd(t_fjfgd)=d r[| sYtjij}/|/d*xxtjjzcc<tjkjtjl|/d_mjrPjfdd+d,}0t|0jj[=d-=d.=d _md}1|t6jur=d/sj]}1=d0 o|p|du}2=dd1v}3=dd2v}4d_o|3syjrrt|rt|}tjfdd3d4j|jb=d5=d.=d6|1|27 _on jrtj+jd_r|t6jur|s|4sjrd}5|t6jsur=d/sj]}5=d8 o|p|du}6t|rt|}ttd3j|jc=d9=d.=d6|5|67 _rn jrtj+j=fd:}7d_ud_v=d;r[tjw_utjx=d;juj_vjvyd}8jjzs=d<r=d=s fd>}9|9}8tjw_{d?j)}:td_|tt|:j||7ju|8jj{_d_td_jmrG| };d@j)}:tt|:jjfjmjj{|;_tjw_ t j>>fdA}z!OProc.__init__..0s('H'HBB'H'H'H'H'H'Hr+cFg|]}|dS)r)r)rcrs r)rz"OProc.__init__..:s)CCC!QXXbn55CCCr+r utf8ignorez FATAL SH ERROR: rirrmaxlenrUzstarted processr streamwriterrfrrr&r)rT)r streamreaderrrr) save_datar%rcLd_ddS)NTr$)rsr)rr8sr) timeout_fnz"OProc.__init__..timeout_fns(!% B/011111r+rirrNcp5j|cdddS#1swxYwYdSr#)rSrt)rrmr8s r)r(zOProc.__init__..fn s,PP#|DDYOOPPPPPPPPPPPPPPPPPPs +//zbackground thread for pid zSTDIN thread for pid cPjjjdSr#)call_soon_threadsaferSr[r)loopr8sr)output_completez'OProc.__init__..output_completeV s%--dl.N.RSSSSSr+cdSr#roror+r)rz'OProc.__init__..output_completeQ sDr+zSTDOUT/ERR thread for pid )rSr4rgetuidr\pwdgetpwuidpw_gidrurrrHboolrr TEE_STDOUT intersection TEE_STDERRptyopenpty_stdin_parent_fd_stdin_child_fddup_stdout_parent_fd_stdout_child_fd_stderr_parent_fd_stderr_child_fdr__pipe_fdrrjr`r;ttynamegc isenableddisableIS_MACOSr:r=forkr5readcloserF_GETFD FD_CLOEXECF_SETFDrSIGHUPSIG_IGNrSIG_DFLsetsidsetpgidgetsidgetpgidrrwritettysetrawchdirdup2r O_RDWRrsetgidsetuidrrFlistdirIOErrorrexecvexecver traceback format_excsysr_exitenablerrrrsrqstartedrrrfrrrcrd _wait_lockr_stdout_stderrr'rrr+r tcgetattrECHO tcsetattrTCSANOW _stdin_stream StreamWriter_stdout_streamr StreamReader_stderr_streamrar_timeout_event_timeout_timerrZTimerrrb _quit_threads_bg_thread_exc_queuerbackground_threadrp_background_thread _input_thread_input_thread_exc_queue input_thread_stop_output_eventrXrY_output_thread_exc_queue output_thread_output_thread)?r8rS parent_logrrfrrr4rjrm target_uidpwrec target_gidstdin_is_fd_basedstdout_is_fd_basedstderr_is_fd_basedr'tee_outtee_err single_ttyrK fd_to_user.r/ needs_ctty gc_enabledsession_pipe_readsession_pipe_write exc_pipe_readexc_pipe_writeclose_pipe_readclose_pipe_writeflagsr:r=payloadrtmp_fdr,r1r2 inherited_fdsrG bytes_cmdtbrfork_excattrr stdout_pipe save_stdoutpipe_outpipe_err stderr_pipe save_stderrrhandle_exit_coder( thread_nameclose_before_termrrrs?` ` @@r)r9zOProc.__init__s* "^ e9 y{{a"#IJJJEJLE++EJJ%/ "J  g; "!ByM" +511+F33+F33 bi#tS!1 2 2 !bi6Ge9+CCbi..C))#..))#..\HbmH<8H Q J;>+-- 7D !4#7 &(VD,A%B%BD " %'F4+?$@$@D !%'VD,A%B%BD "$&F4+?$@$@D ! !%'' HEOG,D H',~$(,%&+##" H')vj.?.?'@'@$(,%%H H>Akmm;%t';';?Agii;$d&;! J' J(*z&/A/A(B(B%)-&&I J@C =&(=(=AC =&(=%% &LgL-1D**-/VD4J-K-KD*(*t/D(E(E%%# JG J(*z&/A/A(B(B%)-&&AC =&(=7   ..I~~ 2 F9--DM' {O \  K  9 4#788DI\^^   JLLL13 --(* % ~  ;02 -O--0: -O- 799 8q== ++++))))***K >>E U% %E K u = = =@ "d8t##M&-@@@ fnfn=== %IKKKK%Jq!$$$illz!}}!??D??223CDD+W555i=6);6J6Jt4555(4HT2333)5HT3444)5HT3444*+++'''i"HSMMM,a000-q111-q111%WRZ]]BI>>FHV$$$i=2);2q"Z.111e9(Ij)))Ij))) - J''!JLLL{O j>% $I! !1a8HOOBzN333D(* 9(=(= #W-DDD)+ ?(C(C D %('H'H-'H'H'H$H$H8$SM+!!!HRLLLL&!!! D! DCCCsCCC e9$HYq\95555IilIr%yAAAAA65 " " ")++2268DD"H^R0000 AAAJ$$%?!%?%?%?@@@@@@@@A HSMMMMBHSMMMMMMM "   HT) * * * HT* + + + HT* + + +  +))))3q66==9I+J+JKKK)*** H^ $ $ $w}g66H H] # # # .#??+;<<#H--- H' ( ( ()400778HIIOOPSTT C H& ' ' '3xxDHD DI #DN9;;DLDH"DNDJ 5 "" %tz'9"WW %wwD  (n..DO!+=(>???DL +=(>???DL(| B$5 B40"Z.AAA!++ItDzzBBDH HNN, - - -(| P$5 P()>??QGL=(!$"7$OOO"&D $ h((AA%1)J|$zNxL &&"Ku|##ByM#". !l*J0I6T>K'{m3H'{h.H #'D  1 6 1F##K***L}%zN') ' ' '##' 1/000 2 2 2 2 2 2#'D "&D )} ,&/o&7&7#&/oyM4#6#:''##))+++ $ L4 &xL & 7 &PPPPPP$& !*!2!2D AtxAAK(-aD %&:!)#  " ' 'D #"&D +088D (! (2N!@dh@@ %9 0H&M&% & &" '0o&7&7D # T/11TTTTTTT     -2!HHD )AtxAAK"6-### "' # #D   sK+e2be%b/,e.b//#ec('e( c52e4c55Ae1hfg' g"#g g' gg'h'g==hhC8ADD AD#D"AD#c8d|jd|jdddS)Nz zOProc.terminate s0 }%%% FN#####r+c|j d|jfS|jd}|s|j d|jfSd|jfSd} ttj|jtj\}}||jkrOt||_d}d|jf|j |r| SS d|jf|j |r| SS#t$r<d|jfcY|j |r| SSwxYw#|j |r| wwxYw)zpolls if our child process has completed, without blocking. this method has side-effects, such as setting our exit_code, if we happen to see our child exit while this is runningNFgh㈵>)riT) rracquirerrwaitpidr5WNOHANGrrelease_process_just_endedr)r8acquired witnessed_endr5rs r)rpzOProc.is_alive s > %$.( ( ?**7*;; (~)dn,,' '  + *"*dh KKNCdh!9)!D!D $ dn, O # # % % % +((**** +' O # # % % % +((**** +  ) ) )$.( ( ( O # # % % % +((**** +  ) O # # % % % +((**** +s+ AD E EEEE2Fc|jr|j|jd}|r%|j|jdv}|||j|jr"|jst j|jdSdSdS)NrQr{)rcancelr4rrr rr)r8rirs r)rgzOProc._process_just_ended s   )   & & ( ( (v.  3ny(AAG M'4> 2 2 2   ,); , HT* + + + + + , , , ,r+c|jd|j5|jdd}|jT|jdt t j|jd\}}t||_d}n |jd|jdddn #1swxYwY| | |jS) z8waits for the process to complete, handles the exit codez*acquiring wait lock to wait for completionz got wait lockFNz!exit code not set, waiting on pidrTz+exit code already set (%d), no need to wait)ri) rr+rrrrrdr5r_process_exit_cleanup)r8rir5rs r)rez OProc.wait s CDDD_   HNN? + + +!M~%BCCC!-bj$(A!F!FY!9)!D!D $ A4>                """???~sBCC  C c|j|jr|jt jd|jj}||j| |j |r| dSdS)Ng@) rrrrrcrrrrrkrrg)r8ritimers r)rmzOProc._process_exit_cleanup s       &   # # % % % T%<%@AA    """  $$&&&  '  $ $ & & & & & ' 'r+N)rlrmrnr_default_window_sizer`rar9rrIrKrNrrrrTrVr@rr?r<r>rprgrermror+r)r_r_snBB $F Fk k k Z:::AAABBBBBBHHXHHHXH$$$ ### (((***$$$$$$1+1+1+f,,, .'''''r+r_c d}d}t}|||r|r|d}|D]p\} } | ttzzrY|d||} | r-|||r|d}q|\}} |r||r$| d|\}} |$|s|dSdS)zthis is run in a separate thread. it writes into our process's stdin (a streamwriter) and waits the process to end AND everything that can be written to be writtenFTr-z%r ready for more inputN) rr[r,rfrgr+rrbrre) rrfrp quit_threadrBclosedrxpollerchangedrGrSrQrs r)rr sE F E XXF %    U ++a..! & &JB+.>>? & 3U;;;{{}}&%%e,,,(& !%8::q  U  8::q   r+c0||}|Sr#)re)evri triggereds r) event_waitry1 s  I r+c|rE|s1t|d}|r |n|1|r>ts9d}d}|r$|d|\}}|$||dSdSdS)zhandles the timeout logicroTNr-)is_setry RUNNING_TESTSre)r timeout_eventr@rprrrsrxrs r)rr6 s $$&& "=#66I   $$&& $ $  *   Q   'xzz E9 * #####$$$$r+ct}|||||||rt|jd} | D]d\} } | tt zzrB|d| | } | r|| Y| tzr e|r| rn| rn||\} }| r$| d|\} }| $|r| |r| |dS)zthis function is run in a separate thread. it reads from the process's stdout stream (a streamreader), and waits for it to claim that its doneNroz%r ready to be read fromr-) rrXrr,rergr+rrbrhr{rer)rrrr}rprrstop_output_eventrrtrurFrSrQrxrs r)rrT sXXF V$$$ V$$$ v{C00  IAv*-==>  4a888vvxx)%%a(((,,   ]1133    # # % %  % ,xzzHE1 8::q    Or+ceZdZdS)DoneReadingForeverNrror+r)rr rr+rceZdZdS)NotYetReadyToReadNrror+r)rr rr+rcvt|trd}t|}nt|rd}t |}nt |drd}t |}nt|trd}t|}nt|trd}t|}n}t|trd}tt|}nI|d }d }|}n? t|}d }t|}n#t$rtd wxYw||fS) agiven some kind of input object, return a function that knows how to read chunks of that input object. each reader function should return a chunk and raise a DoneReadingForever exception, or return None, when there's no more data to read NOTE: the function returned does not need to care much about the requested buffering type (eg, unbuffered vs newline-buffered). the StreamBufferer will take care of that. these functions just need to return a reasonably-sized chunk of data.queuerrzfile descriptorstringbytes generatorNNonectr#rror+r)raise_z+determine_how_to_read_input..raise_ s$ $r+zgeneral iterablezunknown input object)rrget_queue_chunk_readerrget_callable_chunk_readerrDget_file_chunk_readerrHget_iter_string_readerrrget_iter_chunk_readerrLrHr) input_objrR get_chunkrits r)determine_how_to_read_inputr sp)U##(2*955 )  $2-i88  F # #2#))44 Is # #2*955 Iu % %2*955 I} - -2)$y//::   % % %  2iB)G-b11II  4 4 4233 3 4 g s 9DD4cfd}|S)Nct dd}n#t$rtwxYw|t|S)NTro)rLrrrrrfs r)r(z"get_queue_chunk_reader..fn sN $IIdC((EE $ $ $# # $ =$ $ s,rorfr(s` r)rr s# Ir+cfd}|S)NcP }n#t$rwxYw|st|Sr#r)datarfs r)r(z%get_callable_chunk_reader..fn sH 577DD!      %$ $ s  rors` r)rr s#      Ir+c~dfdtdtD}t|S)a+return an iterator that returns a chunk of a string every time it is called. notice that even though bufsize_type might be line buffered, we're not doing any line buffering here. that's because our StreamBufferer handles all buffering. we just need to return a reasonable-sized chunk.rc32K|]}||zVdSr#ro)ribufsizerfs r)rz)get_iter_string_reader.. s0NN1a!g+o&NNNNNNr+r)ranger$r)rfiter_strrs` @r)rr sG GNNNNNaUW0M0MNNNH  * **r+cfd}|S)Nc\ }|S#t$rtwxYwr#)rrrrs r)r(z!get_iter_chunk_reader..fn s= %NN$$EL % % %$ $ %s+rors` r)rr s#%%%%% Ir+cdfd}|S)Nrczd} n#t$rd}YnwxYw|rotdr_t}||d}d}|D]\}}|t tzzrd}|st }|st|S)NTFrBro) rBr rDrrXr,rergrrr) is_real_filertrureadyrGrSrrrfs r)r(z!get_file_chunk_reader..fn s  ! LLNNNN# ! ! ! LLL !  (GE844 (XXF   ' ' 'kk#&&GE% ! ! F.1AAB! E ('' 7## $ $Ls  ))ro)rfr(rs` @r)rr s.G: Ir+c.|dkrd}n |dkrd}n|}|S)afor a given bufsize type, return the actual bufsize we will read. notice that although 1 means "newline-buffered", we're reading a chunk size of 1024. this is because we have to read something. we let a StreamBufferer instance handle splitting our chunk on newlinesr-rrro)bf_typers r)bufsize_type_to_bufsizer& s0!|| A Nr+c*eZdZdZdZdZdZdZdS)r zStreamWriter reads from some input (the stdin param) and writes to a fd (the stream param). the stdin may be a Queue, a callable, something with the "read" method, a string, or an iterablec||_||_||_||_||_t ||j|_t|\|_}|j d|dS)Nzparsed stdin as a %s) streamrfrrrStreamBuffererrErrr+)r8rrrf bufsize_typerrrRs r)r9zStreamWriter.__init__> sj     -lDMJJ"=e"D"D -w77777r+c|jSzGdefining this allows us to do poll on an instance of this classrr7s r)rBzStreamWriter.filenoJ {r+c |}|tn#t$r|jd|jr t j|jdt j}n(#td }YnxYwtj |j|tj |j|YdSt$r|jdYdSwxYwt|ts| |j}|j|D]}|jdt'||dd |jd  tj |j|i#t($r|jd YdSwxYwdS) zattempt to get a chunk of data to write to our child process's stdin, then write it. the return value answers the questions "are we done writing forever?" Nz done readingr.Tzreceived no dataFgot chunk size %d: %rzwriting chunk to processzOSError writing stdin chunk)rrrr+rrrrVEOFchrrrrrrrrrErUr$r)r8rchar proc_chunks r)rzStreamWriter.writeO s% NN$$E}(("    HNN> * * *{ ,+",T[99!.process sur+cdSr#roror+r)finishz,determine_how_to_feed_output..finish tr+) rget_callback_chunk_consumerrr get_cstringio_chunk_consumerr get_stringio_chunk_consumerrDget_file_chunk_consumerrget_fd_chunk_consumerrrHrrrrUrs r)determine_how_to_feed_outputr s$L5gxWW GW % %L6w?? GX & &L5gxWW ' " "L1'=II L'llG4G]KKOGVVI&              F?sB??CCcFt|dd}t||S)NwF)closefd)fdopenr)rrs r)rr s&Wc5111G "7M : ::r+ctddrfdndtdrjndfd}fd}||fS)Nrc:|jSr#)rr)rrrs r)rz'get_file_chunk_consumer..encode s<< 0-@@ @r+c|Sr#rors r)rz'get_file_chunk_consumer..encode sLr+rcdSr#roror+r)rz&get_file_chunk_consumer..flush s4r+cX|dSrr)rrrrs r)rUz(get_file_chunk_consumer..process s/ ffUmm$$$ ur+cdSr#ro)rsr)rz'get_file_chunk_consumer..finish s r+)rrDr)rrrUrrrs`` @@r)rr sw D)) A A A A A A A    w       F?r+c$fd}d}||fS)Ncj |}n#t$rYnwxYw|Sr#)rrrrrrs r)rUz,get_callback_chunk_consumer..process sK LL=99EE!    D wu~~s  ''cdSr#roror+r)rz+get_callback_chunk_consumer..finish  r+rors``` r)rr sC    F?r+cfd}d}||fS)Nc2|dSrr)rrs r)rUz-get_cstringio_chunk_consumer..process s eur+cdSr#roror+r)rz,get_cstringio_chunk_consumer..finish rr+ro)rrUrs` r)rr s7    F?r+c$fd}d}||fS)NcZ|dSr)rrrs r)rUz,get_stringio_chunk_consumer..process s( ell8];;<<<ur+cdSr#roror+r)rz+get_stringio_chunk_consumer..finish rr+rors``` r)rr sC    F?r+c6eZdZdZ d dZdZdZdZdZdS) rzSreads from some output (the stream) and sends what it just read to the handler.NTc P||_||_| |_||_||_d|_|rt j||_||_t||j|j|_ t||_ t|||\|_|_d|_dSr)rbufferrrr pipe_queuerrrrrErrr process_chunkfinish_chunk_processor should_quit) r8rrrrrrrrrs r)r9zStreamReader.__init__ s  "  *  6%k*55DO- $-);  /|<< :V X}; ; 7D7!r+c|jSrrr7s r)rBzStreamReader.fileno+ rr+c|j}|jdt ||dd|r||||jr.|jr'| dtj |j dS)Nrr) rErrr+r$ write_chunkrrrrrrrrs r)rzStreamReader.close0 s$**,, 7UU3B3ZPPP  $   U # # # ##%%% ? (t~ ( OO   ! !$ ' ' ' r+c4|js|||_|jrm|j||jrN|jd|dd||dSdSdS)Nzputting chunk onto pipe: %rr) rrrrrdrrr+rrs r)rzStreamReader.write_chunk= s 9#11%88D  > - K  u % % % -)>)O&( ./+!'A+--0E")).999 :6K&&u---''3u::5''%(  ( ( * * * HNNN     #"$ "1CJJ>JG!|| ii 66;;DKHH5P),[ty[)9 #DIKK 0&--n===&( ./++ **5111++s5zz9++ &  ( ( * * * HNNN       ( ( * * * HNNN     s =L<L<C!L<)CL<<;M7c|jd|j|jd d|j|j}g|_||j|jdS#|j|jdwxYw)Nz,acquiring buffering lock for flushing bufferz&got buffering lock for flushing bufferrz+released buffering lock for flushing buffer) rr+rrcrrrrrf)r8rs r)rzStreamBufferer.flush s EFFF $$&&& ?@@@ J))DM**// <>.>X----* M M MDDDL J J J J Jr+rcfd}|S)NcNttfd}|S)Nc?K5|i|5dVdddn #1swxYwYddddS#1swxYwYdSr#ro)r'rJr(locks r)wrapped2z,with_lock..wrapped..wrapped2 s  R(((EEE                  s$ 8  8$ 8$ 8<<r)r(rrs` r)wrappedzwith_lock..wrapped s@ B           r+ro)rrs` r) with_lockr  s#      Nr+c#Ktj}tj| dVtj|dS#tj|wxYw)zpushd changes the actual working directory for the duration of the context, unlike the _cwd arg this will work with other built-ins such as sh.glob correctlyN)rr`r)r orig_paths r)rara sZ  IHTNNN  s AAc dd|D}td|d|d)zZallows us to temporarily override all the special keyword parameters in a with contextrc"g|] \}}|d| S)r!rors r)rz_args.. s&CCCDAqa<rrrarcontrib__file__ __version__rr9rrrr__project_url__rrrrruNcvtt|||_|pi|_dS)zbaked_args are defaults for the 'sh' execution context. for example: tmp = sh(_out=StringIO()) 'out' would end up in here as an entry in the baked_args dictN)rrtr9globsr)r8rrrs r)r9zEnvironment.__init__2 s8 dD""$$$ $*r+c|dkrd}||jvr |j|S|dkrtjdgSt |}|r|S|dr|drtt||jtj |j }|r|St|d|zd}|r|S tj|S#t$rYnwxYwt!|)Nr'r__all__zJCannot import * from sh. Please import sh or import programs individually.__b_)r rwarningswarnrr@rArrrrlrrrrrr)r8rrrbuiltins r) __getitem__zEnvironment.__getitem__= s2 ;;A   :a=  >> M    I ""  J <<   !!**T"2"2 ! aG,.wrapper1..cmd_getter{ s:%dG440)$///"S''r+)rsetattr)r(r)rIrs` r)wrapper1z"Contrib.__call__..wrapper1z sE      X  Cz * * *Ir+ro)rIrr+s`` r)rmzContrib.__call__x s)      r+N)rlrmrnrqrmror+r)r$r$w s-[r+r$z.contribgitc2|d}|S)z*most git commands play nicer without a TTYF)_tty_out)r )origrs r)r,r, s ))U) # #C Jr+sudoczdtjdfdfd}|d|}|S)zya nicer version of sudo that uses getpass to ask for a password, or allows the first argument to be a string passwordz[sudo] password for rc3DKtjdz}|VdS)Npromptrgetpass)pwr4s r)rfzsudo..stdin s+ _F + + +d 2r+c|dd}| }n|ddz}||d<||fS)Npasswordrr)rrstrip)r rJr9 pass_getterrfs r)rUzsudo..process sR::j$//  %''KK"//$//$6K#u &yr+z-S)_arg_preprocess)r6getuserr )r/rUrr4rfs @@r)r0r0 sl :GO$5$5 9 9 9F      ))D') 2 2C Jr+sshcGddtGfddtfd}|ddd|}|S) z+An ssh command for automatic password loginc0eZdZdZdZedZdS)ssh..SessionContentctd|_td|_g|_d|_d|_dS)NiPrir)rcharslines line_chars last_linecur_charr7s r)r9z$ssh..SessionContent.__init__ s?e,,,DJd+++DJ DODNDMMMr+c|dkr0|j}||_|j|g|_n|j||j|||_dSNr)cur_linerFrDrdrErCrG)r8rlines r) append_charz'ssh..SessionContent.append_char sot||}!% !!$'''"$&&t,,, J  d # # # DMMMr+c:d|j}|Sr)rrE)r8rKs r)rJz$ssh..SessionContent.cur_line s774?++DKr+N)rlrmrnr9rLrrJror+r)SessionContentrA sM    ! ! !       r+rNc eZdZfdZdZdS)ssh..SSHInteractcz||_||_||_||_|_d|_d|_dSr) prompt_matchr; out_handler login_successcontent pw_enteredr)r8rRr;rSrTrNs r)r9z!ssh..SSHInteract.__init__ sF ,D *D *D !.D )>++DL$DO DLLLr+cv|j||jr&|js||j|_|jr||j|S||jr5|}||dzd|_dSdS)NrT) rUrLrVrrTrSrRr;r)r8rrfr9s r)rmz!ssh..SSHInteract.__call__ s L $ $T * * * @t| @#11$,?? | ='' e<<<  .. '++-- (T/***"& ' 'r+N)rlrmrnr9rm)rNsr) SSHInteractrP s= ! ! ! ! ! ' ' ' ' 'r+rXc|d}|dd|dd}|dd}d|d}fd}nfd}|d }|||||d <||fS) Ninteractr9rTr4zPlease enter SSH password: c6|jdS)Nz password: )rJrArUs r)rRz*ssh..process..prompt_match s'00>>>r+c.tjS)Nr3r5r3sr)r;z)ssh..process..pass_getter sf5555r+c.dSrI)r:)r9sr)r;z)ssh..process..pass_getter st,,,r+cdSrror\s r)rTz+ssh..process..login_successrr+r)r) r rJreal_out_handlerrTrRr;r9r4rXs @@r)rUzssh..process s!::j11::j$// ?D99 zz(D11 .   ? ? ?   6 6 6 6 6 6  - - - - -     % +'7  v&yr+rT) _out_bufsize_tty_in _unify_ttysr<)r>r )r/rUrrXrNs @@r)r>r> s2'''''''f'''4@ ))$   C Jr+cPtdtd td}n#ttf$rYnYwxYw t t |dd||n2#t$rYn'ttj YnxYw}tddS)Nz >> sh vz" >> https://github.com/amoffat/sh Tzsh> zsingler) printrinputrEOFErrorexeccompile SystemExitrr)r rKs r)run_replrls Gk G G GHHH * ==DDH%    E  * y(33S# > > > >    E * )&(( ) ) ) ) ) * "IIIIIs+?? A$$ B0!Bc,eZdZdfd ZdZdZxZS) SelfWrapperNc tt|t|ddt|dddD]"}t ||t||d#g|_||_t}|j }| dd|rP| |\}}|d |d<|d |t }t|j|j|||j<t#|||_dS)Nrlr)rdoc) __builtins__r __package____dict__r4)r)rrnr9rr*__path___SelfWrapper__self_modulerrsrErrRrFglobalsrTrlrr_SelfWrapper__env) r8 self_modulerr9r  cls_attrsr4rrrs r)r9zSelfWrapper.__init__(sc k4  ))j$77 Y55 *   @ B BD D$ T4 @ @ A A A A ( (--//  j$'''  6&99*EELIq&/ &=&B&B&D&DIl # l # * *9 5 5 5   &*  +"7' ' k"#!:>>> r+c|j|Sr#)rw)r8rs r)rzSelfWrapper.__getattr__Hsz$r+c |jj}||||j|}|Sr#)rwrrErFrru)r8rJrnew_shs r)r zSelfWrapper.bakeKsGZ*//11 &!!! 2J?? r+r#)rlrmrnr9rr rrs@r)rnrn's\??????@   r+rn__main__)Fr#)rrX collectionsrcollections.abcr ImportErrorrrrr6r glob_moduler%rrplatformrrrr3rrrrrrrcrqrrrrrr contextlibr functoolsr importlibr ior r r r rlocalerrrshlexrrGtypesrrtypingrrrrversionrPackageNotFoundErrorrsystemlowerrrrrrlrrrrrLr|FORCE_USE_SELECTr PUSHD_LOCKr*rdirrHrrDHAS_POLLrerfrgrhr>r1rqrrprrrTrrrrSIGABRTSIGBUSSIGFPESIGILLSIGINTrorSIGQUITSIGSEGVraSIGSYSrrrrjrrrtrsrrrrrrrrrr rrr7r9rr^rrrrrrrr rrrrUrurrrr}rrr_rryrrrrrrrrrrrr rrrrrrrrr rarrr$mod_namermodulesr,r0r>rlrnrvr ror+r)rs 0$'''''''$$$########$     ######%%%%%%6666666666''''''&&&&&&++++++++))))))))))))"("4((KK$KKK1 !!'')))) + k         QZ ''))4W 8?   1 1SS(:C@@AABB 4BJNN+@#FFGGHH Y_   0003ss3355zz?? 766 " "IIIIIIIIX-----6---j7Cd< $z"223BBB $ F & & & & &I & & & K K K K K$ K K K7373737373i737373t     o   *****y*** N M M M M N N N N N M '#$     n   rzSTT 13 d3_--.333PP--//PPP @N   %%%%%$%%%   555((((V   1616161616V161616h    B&B&B&B&B&VB&B&B&J >>>&&&&&6    8._____f___D )))XJJJJZ      @@@F"   $] '] '] '] '] 'F] '] '] '@B $$$<:::z                666r      +++   F&^^^^^6^^^B@;;; >    T$T$T$T$T$6T$T$T$n{J{J{J{J{JV{J{J{J|    :   2e&e&e&e&e&$e&e&e&Pj( j  '(   H   2 YYYx2(((((*(((V z +ggii C HSMMMMM(K H(=>>CKs $$C-- C<;C<