/opt/imunify360/venv/lib/python3.11/site-packages/clcommon/__pycache__
NameSizeModeActions
clcagefs.cpython-311.pyc172630644editdlrm
clcaptain.cpython-311.pyc44100644editdlrm
clconfig.cpython-311.pyc32630644editdlrm
clconfpars.cpython-311.pyc191050644editdlrm
clcustomscript.cpython-311.pyc18970644editdlrm
cldebug.cpython-311.pyc13250644editdlrm
clemail.cpython-311.pyc24730644editdlrm
clexception.cpython-311.pyc17360644editdlrm
clfunc.cpython-311.pyc122330644editdlrm
clhook.cpython-311.pyc112290644editdlrm
cllog.cpython-311.pyc28500644editdlrm
cloutput.cpython-311.pyc8460644editdlrm
clproc.cpython-311.pyc91410644editdlrm
clpwd.cpython-311.pyc122610644editdlrm
clquota.cpython-311.pyc18290644editdlrm
clsec.cpython-311.pyc15890644editdlrm
clwpos_lib.cpython-311.pyc236420644editdlrm
const.cpython-311.pyc2930644editdlrm
evr_utils.cpython-311.pyc51310644editdlrm
features.cpython-311.pyc62330644editdlrm
group_info_reader.cpython-311.pyc66150644editdlrm
lock.cpython-311.pyc20190644editdlrm
mail_helper.cpython-311.pyc73770644editdlrm
mysql_lib.cpython-311.pyc102460644editdlrm
php_conf_reader.cpython-311.pyc115570644editdlrm
sysctl.cpython-311.pyc106710644editdlrm
ui_config.cpython-311.pyc47990644editdlrm
utils.cpython-311.pyc464610644editdlrm
utils_cmd.cpython-311.pyc42920644editdlrm
__init__.cpython-311.pyc15720644editdlrm
Edit: /opt/imunify360/venv/lib/python3.11/site-packages/clcommon/__pycache__/utils.cpython-311.pyc (46461B)
§ ë­¸•î¶€ûã óú—ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddlm Z m Z ddl mZddlmZmZmZmZmZmZddlZddlZddlmcmZddlmZmZmZmZdZ dZ!dZ"d Z#d Z$d „Z%dQd „Z&d „Z'd„Z(d„Z)d„Z* dRd„Z+d„Z,dee-fd„Z.d„Z/de0fd„Z1de-dzfd„Z2de-dzfd„Z3edee-fd„¦«Z4de5fd„Z6de-de0fd„Z7de0fd „Z8de0fd!„Z9de0fd"„Z:d#„Z;d$e-de0fd%„Zd(„Z?d)„Z@d*„ZAd+e-de0fd,„ZBd-e5de0fd.„ZCd/edee0fd0„ZDde5fd1„ZEd2e-dee0e0ffd3„ZFd2e-dee0e0ffd4„ZGd2e-dee0e0ffd5„ZHd6e-d7e0de0fd8„ZId9eejejJfde-fd:„ZK dQd;e-de5dee5e-ff d?„ZLde-fd@„ZMde0fdA„ZNdBe-dee5fdC„ZOdBe-fdD„ZPdBe-fdE„ZQdF„ZRdGe-de-fdH„ZSde0fdI„ZTdJe-de-fdK„ZUdeVe-dze-dzffdL„ZWde0fdM„ZXde0fdN„ZYdO„ZZdP„Z[dS)SéN)Ú ConfigParserÚError)Úcache)ÚAnyÚAnyStrÚDictÚOptionalÚTupleÚUnion)ÚExternalProgramFailedÚ check_commandÚ exec_utilityÚ run_commandz/etc/sysconfig/rhn/systemid)ÚMonÚTueÚWedÚThuÚFriÚSatÚSunz /opt/cloudlinux/litespeed_statusz/opt/cloudlinux/nginx_statusz/opt/apache2nginx/statecó—d}tj |¦«r& tj|¦«}n#t$rYnwxYw||kr= tj|¦«n#t$rYnwxYwtj||¦«dSdS)a Create symlink link_path -> link_value if it does not exist or points to different location :param link_value: path that symlink should point to (symlink value) :type link_value: str :param link_path: path where to create symlink :type link_path: str N)ÚosÚpathÚislinkÚreadlinkÚOSErrorÚunlinkÚsymlink)Ú link_valueÚ link_pathÚlink_tos ún/builddir/build/BUILD/imunify360-venv-2.6.3/opt/imunify360/venv/lib/python3.11/site-packages/clcommon/utils.pyÚcreate_symlinkr#1s¸€ð€GÝ „w‡~‚~�iÑ Ô ðð Ý”k )Ñ,Ô,ˆGˆGøÝð ð ð Ø ˆDð øøøà�WÒÐð Ý ŒI�iÑ Ô Ð Ð øÝð ð ð Ø ˆDð øøøå Œ �:˜yÑ)Ô)Ð)Ð)Ð)ð Ðs!£8¸ AÁAÁA$Á$ A1Á0A1cóÄ—g}tj |¦«r>t|d|¬¦«5}| ¦«}ddd¦«n #1swxYwY|S)a Read file and return file's lines errors param may be passed to define how handle unicode errors, errors=None is default value of open() :param path: path to file :param unicode_errors_handle: how to handle unicode errors :return: list of file's lines úutf-8)ÚencodingÚerrorsN)rrÚisfileÚopenÚ readlines)rÚunicode_errors_handleÚcontentÚfs r"Úget_file_linesr.Hs™€ð€GÝ „w‡~‚~�dÑÔð$Ý �$ Ð1FÐ GÑ GÔ Gð $È1Ø—k’k‘m”mˆGð $ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $à €Ns´AÁAÁAcó†—t||d¬¦«5}| |¦«ddd¦«dS#1swxYwYdS)zž Write lines to file :param content: list of lines for writing to file :param path: path to file :param mode: open mode :return: None r%©r&N)r)Ú writelines)rr,Úmoder-s r"Úwrite_file_linesr3XsŒ€õ ˆd�D 7Ð +Ñ +Ô +ð¨qØ � Š �WÑÔÐðððñôðððððððøøøððððððs “6¶:½:c󤇗t|¦«}ˆfd„|D¦«}t|¦«t|¦«k}t||d¦«|S)a Delete line from file. Return True when line(s) have been deleted, False otherwise (specified line is not found) :param path: path to file :type path: string :param line: line to delete without EOL ('\n') :type line: string :rtype bool cóF•—g|]}‰| d¦«k¯|‘ŒS)ú )Úrstrip)Ú.0ÚitemÚlines €r"ú z)delete_line_from_file..ps/ø€ÐOÐOÐO˜t°T¸T¿[º[ÈÑ=NÔ=NÒ5NÐ5N�dÐ5NÐ5NÐ5Nóúw+)r.Úlenr3)rr:Ú file_linesÚout_file_linesÚfounds ` r"Údelete_line_from_filerBdsZø€õ  Ñ%Ô%€JØOÐOÐOÐO zÐOÑOÔO€NÝ � ‰OŒO�s >Ñ2Ô2Ò 2€EÝ�T˜>¨4Ñ0Ô0Ð0à €Lr<cóL—tj¦«}|dkrŠ tjd¦«j}|tj¦«vstj¦«|krdSn#t$rYnwxYwtdtj ¬¦«tj d¦«dSdS)zH Check whether current user is effectively root and exit if not rÚ clsupergidNz'Error: root privileges required. Abort.)Úfileéÿÿÿÿ) rÚgeteuidÚgrpÚgetgrnamÚgr_gidÚ getgroupsÚgetegidÚKeyErrorÚprintÚsysÚstderrÚexit)ÚeuidrJs r"Úis_root_or_exitrSws«€õ Œ:‰<Œ<€DØ ˆq‚y€yð õ”\ ,Ñ/Ô/Ô6ˆFØ�œ™œÐ'Ð'­2¬:©<¬<¸6Ò+AÐ+AØ�ð,Bøåð ð ð Ø ˆDð øøøå Ð7½c¼jÐIÑIÔIÐIÝ Œ�‰ Œ ˆ ˆ ˆ ð€ys›AA#Á# A0Á/A0có@—tj d¦«S)z^ Detect whether EA4 is installed. :return: True - EA4 present; False - EA4 absent z/etc/cpanel/ea4/is_ea4)rrr(©r<r"Úis_ea4rV‰s€õ Œ7�>Š>Ð2Ñ 3Ô 3Ð3r<FTc#ójK—|€t|¦«}d}|s1| d¦«s|sd|›�}tj|¦«}nd}|D]]}|r3|r| |¦«dks| |¦«r|}n| |¦«r|}|r|�|V—n|�nd}Œ^|�|V—dSdS)a Grep pattern in file :param multiple_search: if True - search all match, False - search first match :param pattern: pattern for search :param path: path to file :param data_from_file: read data from file for parsing :param fixed_string: if True - search only fixed string, False - search by regexp :param match_any_position: if True - search any match position, False - search only from string begin :return: Generator with matched strings Nú^rF)r.Ú startswithÚreÚcompileÚfindÚsearch) ÚpatternrÚ fixed_stringÚmatch_any_positionÚmultiple_searchÚdata_from_fileÚresultÚ pattern_compr:s r"Úgrepre‘sèè€ð*ÐÝ'¨Ñ-Ô-ˆØ €FØ ðð×!Ò! #Ñ&Ô&ð $Ð/Að $Ø#˜'�m�mˆGÝ”z 'Ñ*Ô*ˆ ˆ àˆ Øð ð ˆØ ð Ø"ð  t§y¢y°Ñ'9Ô'9¸RÒ'?Ð'?ÀDÇOÂOÐT[ÑD\ÔD\Ð'?Ø�øØ × Ò  Ñ &Ô &ð ØˆFØ ð ˜vÐ1؈LˆLˆLˆLØ Ð Ø ˆE؈ˆØ ÐØˆ ˆ ˆ ˆ ˆ ðÐr<có4—tjt¦«S)z- :rtype: lxml.etree._ElementTree obj )ÚetreeÚparseÚRHN_SYSTEMID_FILErUr<r"Ú_parse_systemid_filerjÀs€õ Œ;Õ(Ñ )Ô )Ð)r<Úreturncó(— t¦«}| d¦«D]B}| d¦«j|kr"| d¦«djcSŒCn)#tt t tjf$rYdSwxYwdS)z` find a member in xml by name and return value :type name: str :rtype: str|None ÚmemberÚnameÚvaluerN) rjÚiterr\ÚtextrÚ IndexErrorrMrgÚ ParseError)rnÚrhn_systemid_xmlrms r"Úget_rhn_systemid_valueruÇs©€ð Ý/Ñ1Ô1ÐØ&×+Ò+¨HÑ5Ô5ð 4ð 4ˆFØ�{Š{˜6Ñ"Ô"Ô'¨4Ò/Ð/Ø—{’{ 7Ñ+Ô+¨AÔ.Ô3Ð3Ð3Ð3ð0ð 4øõ •Z¥­5Ô+;Ð <ððð؈tˆtðøøøà ˆ4s‚A$A)Á'A)Á)"BÂBcó&—dd|›d�dœ}tj |¦«s|S tjd|gdd¬¦«}| ¦« ¦«d ¦«d}tjd gdd¬¦«}d }d |›d �}| ¦«D] }||vr|}nŒ |r d|d <||d<n d|›d|›d�|d<n/#tjtf$r}d|›d|›d�|d<Yd}~nd}~wwxYw|S)aG Detect the file system on which a given file is stored. E.g., the file can be stored in NFS and this can affect the normal operation of the file. We want to receive information about FS in emergency situations during reading or writing :param file_path: path to file, for which we want to detect file system :return: dict, which contains two keys: key 'success' can be equals to False if we got error or True if we got normal result key 'details' can contais error string if key 'success' is False or result if key 'success' is True FzFile "z" isn't exists)ÚsuccessÚdetailsÚdfT)ÚshellrqrFÚmountÚz on z type rwrxz#We can't get file system for file "z". Mount point "z" not found in mount output.z". Exception "ú"N) rrÚexistsÚ subprocessÚ check_outputÚstripÚ splitlinesÚsplitÚCalledProcessErrorr) Ú file_pathrcÚ df_outputÚ mount_pointÚ mount_outputÚdataÚneedler:Úerrs r"Ú*get_file_system_in_which_file_is_stored_onrŒ×s¾€ðØ6˜IÐ6Ð6Ð6ðð€Fõ Œ7�>Š>˜)Ñ $Ô $ðØˆ ðcÝÔ+Ø �9Ð ØØð ñ ô ˆ ð  —o’oÑ'Ô'×2Ò2Ñ4Ô4°RÔ8×>Ò>Ñ@Ô@ÀÔDˆ Ý!Ô.Ø ˆIØØð ñ ô ˆ ð ˆØ+˜ Ð+Ð+Ð+ˆØ ×+Ò+Ñ-Ô-ð ð ˆDؘˆ~ˆ~Ø�Ø�ðð ð Ø $ˆF�9Ñ Ø $ˆF�9Ñ Ð ðJ°yðJðJØ +ðJðJðJð �9Ñ øøõ Ô )­7Ð 3ðcðcðcØbÀ9ÐbÐbÐ\_ÐbÐbÐbˆˆyÑÐÐÐÐÐøøøøðcøøøð €Ms¬B5C"Ã"DÃ8 D Ä Dcó¦—tdd¬¦«} | d¦«| dd¦«}n#t$rd}YnwxYw|S)z‚ Check if testing is enabled in /etc/yum.repos.d/cloudlinux.repo config :return: bool value if testing enabled or not NF)Ú interpolationÚstrictz /etc/yum.repos.d/cloudlinux.repozcloudlinux-updates-testingÚenabled)rÚreadÚ getbooleanr)ÚparserÚress r"Úis_testing_enabled_repor•so€õ ¨°UÐ ;Ñ ;Ô ;€FðØ� Š Ð6Ñ7Ô7Ð7Ø×ÒÐ <¸iÑHÔHˆˆøå ðððØˆˆˆðøøøà €Js“+?¿ AÁ Acó¶—dddœ}td¦«}|r ||vr||St¦«d}|r | d¦«d}d|›�Sd S) ax Return the CloudLinux OS version. Ubuntu + CL Extension is a separate case from normal CL variants. The string returned is based on /etc/os-release and contains the major version of the Ubuntu system. Previously Ubuntu 20.04 identified itself as "cl8" in this scenario. :return: Appropriate version string or None if the version is not recognized. Úubuntu22Úubuntu20)ÚjammyÚfocalÚ os_releaseéú.rÚubuntuN)ruÚget_os_versionrƒ)Ú ubuntu_mapÚreleaseÚ version_ids r"Úget_cl_version_ubuntur£s‡€ðØðð€Jõ % \Ñ2Ô2€GØð#�7˜jÐ(Ð(ؘ'Ô"Ð"õ Ñ!Ô! !Ô$€JØð%Ø×%Ò% cÑ*Ô*¨1Ô-ˆ Ø$˜ Ð$Ð$Ð$Ø ˆ4r<có@—t¦«rt¦«Sddddddddœ}tj¦«}| ¦«D]\}}|r||vr|cSŒt d ¦«}|€d St d d ¦«}|D]}t|¦«|vrd |›�cSŒd S)ab Return the CloudLinux OS version taking into account the release version from `platform.release()` or the RHN systemid file. E.g: release = 2.6.32-896.16.1.lve1.4.54.el6.x86_64 5.14.0-162.6.1.el9_1.x86_64 The release string is converted to return the appropriate version string: el6 = cl6 el8 = cl8 Úcl6Úcl6hÚcl7Úcl7hÚcl8Úcl9Úcl10)zel6.zel6h.zel7.zel7h.zel8.z.el9z.el10r›Néé Úcl)Ú is_ubuntur£Úplatformr¡ÚitemsruÚrangeÚstr)Úcheck_vals_decoderr¡Ú check_valÚ cl_versionÚaccepted_cl_versionsÚvers r"Úget_cl_versionr¹<sò€õ�{„{ð'Ý$Ñ&Ô&Ð&ðØØØØØØððÐõÔÑ Ô €GØ!3×!9Ò!9Ñ!;Ô!;ððш �:Ø ð �y GÐ+Ð+ØÐ Ð Ð øå$ \Ñ2Ô2€G؀؈tå   FÑ+Ô+ÐØ#ððˆÝ ˆs‰8Œ8�wРРؘ�:�:Ð Ð Ð ð à ˆ4r<cóΗ tdg¦« ¦«}n#tjtf$rYdSwxYw|dkr| dd¬¦«dSdS) aœ Return virtualization type on current system. It is reachable via virt-what utility. E.g.: 'kvm', 'bhyve', 'openvz', 'qemu' All acceptable outputs are listed here: https://people.redhat.com/~rjones/virt-what/virt-what.txt Output will be returned with at least two rows Sample: > kvm > Furthermore, there is a possibility for multiple text rows Sample: > xen > xen-domU That's why, the result will be taken from a first row. If the output is empty, and there were no errors, the machine is either non-virtual, or virt-what tool isn't familiar with it's hypervisor. But the list of supported hypervisors and containers covers all popular VMs types. :return: virt_type - Optional[AnyStr] - appropriate virtualization type string, - 'physical' if there is no virtualization, - None if there was an error z/usr/sbin/virt-whatNr|r6rœ)ÚmaxsplitrÚphysical)rr�rr„ÚFileNotFoundErrorrƒ)Úvirt_what_outputs r"Ú get_virt_typer¿hsƒ€ð:Ý&Ð(=Ð'>Ñ?Ô?×EÒEÑGÔGÐÐøÝ Ô )Õ+<Ð =ððð؈tˆtðøøøð˜2ÒÐØ×%Ò% d°QÐ%Ñ7Ô7¸Ô:Ð:Ø ˆ:s ‚"%¥?¾?ÚpidcóT— tj|d¦«dS#t$rYdSwxYw)zõ Check for a process existence by os.kill command If os.kill will be used as os.kill(pid, 0), it will just check for a presence of such PID And if such pid can't be reached with kill method, there will be raised OSError rTF)rÚkillr)rÀs r"Ú check_pidrÃ�sA€ðÝ Œ��Q‰Œˆðˆtøõ ððð؈uˆuðøøøs ‚™ '¦'Ú pid_file_pathcóÈ— tj|tjtjz¦«}n#t$rYdSwxYw tj|¦«}t j|j¦«s1 |dkr( tj |¦«dS#t$rYdSwxYwdStj |d¬¦«5}d}tt|  ¦« ¦«¦«¦«cddd¦«|dkr& tj |¦«S#t$rYSwxYwS#1swxYwYnF#ttf$r2Y|dkr( tj |¦«dS#t$rYdSwxYwdSwxYw |dkr( tj |¦«dS#t$rYdSwxYwdS#|dkr& tj |¦«w#t$rYwwxYwwxYw)z¢ Check if process running using pid file Arguments: pid_file_path: path to the pid file of service Returns: bool: True or False Frr%r0rFN)rr)ÚO_RDONLYÚ O_NOFOLLOWrÚfstatÚstatÚS_ISREGÚst_modeÚcloseÚfdopenrÃÚintr‘r�Ú ValueError)rÄÚfdÚstr-s r"Úis_process_runningrÒ s•€ðÝ ŒW�]¥B¤Kµ"´-Ñ$?Ñ @Ô @ˆˆøÝ ððð؈uˆuðøøøðÝ ŒX�b‰\Œ\ˆÝŒ|˜BœJÑ'Ô'ð Øð �Š7ˆ7ð Ý”˜‘ ” � � � øÝð ð ð Ø��ð øøøð ˆ7õ ŒY�r GÐ ,Ñ ,Ô ,ð 4°ØˆBÝ�S §¢¡¤§¢Ñ!1Ô!1Ñ2Ô2Ñ3Ô3ð 4ð 4ð 4ð 4ñ 4ô 4ð 4ð �Š7ˆ7ð Ý”˜‘ ” � � øÝð ð ð Ø�ð øøøð ð  4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð 4øõ �Ð ðððØà �Š7ˆ7ð Ý”˜‘ ” � � � øÝð ð ð Ø��ð øøøð ˆ7ðøøøð 4ð �Š7ˆ7ð Ý”˜‘ ” � � � øÝð ð ð Ø��ð øøøð ˆ7øˆ2�Š7ˆ7ð Ý”˜‘ ” � � øÝð ð ð Ø�ð øøøð øøøsÍ‚,/¯ =¼=Á-D<Á6B  BÂBÂD<Â5AD0Ã7 D<Ä DÄ D,Ä+D,Ä0D4Ä4D<Ä7D4Ä8D<Ä;F3Ä<E?Å F3ÅE+Å+ E9Å8E9Å>E?Å?F3Æ F Æ F.Æ-F.Æ3G!Æ;GÇG!Ç GÇG!ÇGÇG!cót—tj¦«dkr"d}d}t|¦«pt|¦«Stj t ¦«sdSt t d¬¦«5}| ¦« ¦«}ddd¦«n #1swxYwY|dkS) a  Detect that server works under Litespeed. Note: be careful when modifying this method. It is used in X-Ray, ask @dkavchuk or someone else from C-Projects team for details. return: True - LS working; False - LS not running (stopped or absent) rz/tmp/lshttpd/lshttpd.pidz/var/run/openlitespeed.pidFr%r0NÚ0) rrGrÒrr~ÚLITESPEED_STATUS_FOR_USERSr)r‘r�)Úlitespeed_pid_pathÚopenlitespeed_pid_pathr-Ústatuss r"Úis_litespeed_runningrÙ¿sâ€õ „z�|„|�qÒÐØ7ÐØ!=ÐÝ!Ð"4Ñ5Ô5ÐcÕ9KÐLbÑ9cÔ9cÐcÝ Œ7�>Š>Õ4Ñ 5Ô 5ð؈uÝ Õ(°7Ð ;Ñ ;Ô ;ð"¸qØ—’‘”—’Ñ!Ô!ˆð"ð"ð"ñ"ô"ð"ð"ð"ð"ð"ð"øøøð"ð"ð"ð"à �SŠ=ÐsÁ6'B)Â)B-Â0B-cóR—tj¦«dkrd}t|¦«Stj t ¦«sdSt t d¬¦«5}| ¦« ¦«}ddd¦«n #1swxYwY|dkS)a  Detect that server works under nginx. Note: be careful when modifying this method. It is used in X-Ray, ask @dkavchuk or someone else from C-Projects team for details. return: True - nginx working; False - nginx not running (stopped or absent) rz/run/nginx.pidFr%r0NrÔ) rrGrÒrr~ÚNGINX_STATUS_FOR_USERSr)r‘r�)rÄr-rØs r"Úis_nginx_runningrÜÓsË€õ „z�|„|�qÒÐØ(ˆ Ý! -Ñ0Ô0Ð0Ý Œ7�>Š>Õ0Ñ 1Ô 1ð؈uÝ Õ$¨wÐ 7Ñ 7Ô 7ð"¸1Ø—’‘”—’Ñ!Ô!ˆð"ð"ð"ñ"ô"ð"ð"ð"ð"ð"ð"øøøð"ð"ð"ð"à �SŠ=ÐsÁ%'BÂBÂBcó—tj t¦«sdSt td¬¦«5}| ¦« ¦«}ddd¦«n #1swxYwY|dkS)a" Detect that server works under apache2nginx. Note: be careful when modifying this method. It is used in X-Ray, ask @dkavchuk or someone else from C-Projects team for details. return: True - apache2nginx working; False - apache2nginx not running (stopped or absent) Fr%r0NÚon)rrr~ÚAPACHE2NGINX_STATEr)r‘r�)r-rØs r"Úis_apache2nginx_runningràås§€õ Œ7�>Š>Õ,Ñ -Ô -ð؈uÝ Õ ¨7Ð 3Ñ 3Ô 3ð"°qØ—’‘”—’Ñ!Ô!ˆð"ð"ð"ñ"ô"ð"ð"ð"ð"ð"ð"øøøð"ð"ð"ð"à �TŠ>Ðs½'A0Á0A4Á7A4có&—t¦«rdSdS)zU Return proper passenger package according to apache version :rtype: str zapache24-passengerzalt-mod-passenger)rVrUr<r"Úget_passenger_package_namerâôs€õ �x„xð$ð $Ð#Ø Ð r<Ú package_namecó — t¦«rtddd|g¦«}d|vrdSntdd|g¦«n#t$rYdSwxYwdS) z¯ Check that the given package is installed on the server. :param package_name: Package name to check. :return: True if package is installed, False otherwise. z dpkg-queryz-Wz-f='${Status} 'zinstall ok installedFÚrpmz-qT)r¯rr )rãÚ pkg_statuss r"Úis_package_installedrçs‚€ð Ý ‰;Œ;ð 5õ% l°DÐ:LÈlÐ%[Ñ\Ô\ˆJð&¨ZÐ7Ð7Ø�uð8õ ˜  lÐ3Ñ 4Ô 4Ð 4øøÝ ððð؈uˆuðøøøà ˆ4s‚%=©=½ A Á A cóV—t¦«rt¦«St¦«S)z® Pick the package manager to check depending on the OS. If we're not on Ubuntu, assume a CL variant with RPM. :return: Error string, if any, None otherwise. )r¯Úget_apt_db_errorsÚget_rpm_db_errorsrUr<r"Úget_package_db_errorsrës(€õ�{„{ð#Ý Ñ"Ô"Ð"Ý Ñ Ô Ðr<cóT— tjddgdtjtjd¬¦«5}| ¦«\}}|jdkrd|›d|›d �cd d d ¦«S d d d ¦«n #1swxYwYn&#t $r}t |¦«cYd }~Sd }~wwxYwd S) z¤ Check the dpkg DB as described in https://man7.org/linux/man-pages/man1/dpkg.1.html See `--audit`. :return: Error string, if any, None otherwise. Údpkgz--auditFT)rzÚstdoutrPrqrzdpkg audit error: r6r�N©rÚPopenÚPIPEÚ communicateÚ returncoderr³)ÚprocÚstd_outÚstd_errr‹s r"réré'sH€ðÝ Ô Ø �YÐ ØÝ”?Ý”?Øð  ñ ô ð Bð Ø#×/Ò/Ñ1Ô1Ñ ˆG�WàŒ !Ò#Ð#àA¨GÐAÐA°wÐAÐAÐAð Bð Bð Bð Bñ Bô Bð Bð Bð$ð Bð Bð Bñ Bô Bð Bð Bð Bð Bð Bð Bøøøð Bð Bð Bð Bøøõ ðððÝ�3‰xŒxˆˆˆˆˆˆøøøøðøøøð ˆ4sF‚/B±+A6Á BÁ* BÁ6A:Á:BÁ=A:Á>B B% B ÂB% B%cóZ—d} tjgd¢tjtjd¬¦«5}| ¦«\}}|jdkrd|›d|›d|›�cd d d ¦«S d d d ¦«n #1swxYwYn&#t $r}t |¦«cYd }~Sd }~wwxYwd S) zx Check RPM DB consistency. :return: None - No RPM DB errors string_message - Error description zjhttps://cloudlinux.zendesk.com/hc/en-us/articles/115004075294-Fix-rpmdb-Thread-died-in-Berkeley-DB-library)z/bin/rpmz--dbpathz /var/lib/rpmz --verifydbT)rîrPrqrzRPM DB check error: r6z . See doc: Nrï)Údoc_linkrôrõrör‹s r"rêrêAsV€ð uð ð Ý Ô Ø BÐ BÐ BÝ”?Ý”?Øð  ñ ô ð Yð Ø#×/Ò/Ñ1Ô1Ñ ˆG�WØŒ !Ò#Ð#àX¨gÐXÐX¸ÐXÐXÈhÐXÐXð Yð Yð Yð Yñ Yô Yð Yð Yð$ð Yð Yð Yñ Yô Yð Yð Yð Yð Yð Yð Yøøøð Yð Yð Yð Yøøõ ðððÝ�3‰xŒxˆˆˆˆˆˆøøøøðøøøð ˆ4sF„.B²-A9Á BÁ- BÁ9A=Á=BÂA=ÂB B(ÂB#ÂB(Â#B(cóz—tj¦«t_tj¦«t_dS)a( Upon process exit, Sentry sometimes prints: Sentry is attempting to send 1 pending error messages Waiting up to 10 seconds Press Ctrl-C to quit This causes broken JSON in output. See also this issue: https://github.com/getsentry/raven-python/issues/904 N)ÚioÚStringIOrOrîrPrUr<r"Ú!silence_stdout_until_process_exitrü\s"€õ”‘”…C„JÝ”‘”…C„J€J€Jr<cóš—d|dzz }tj|¦«5tj||¦«ddd¦«dS#1swxYwYdS)a Create directories with desired permissions Changed in version 3.7: The mode argument no longer affects the file permission bits of newly-created intermediate-level directories. Because it we use umask while creating dirs :param mod: desired permissions iÿN)ÚsecureioÚ set_umaskrÚmakedirs)rÚmodÚ inverted_mods r"Ú mod_makedirsrks™€ð˜C %™KÑ(€LÝ Ô ˜LÑ )Ô )ððÝ Œ �D˜#ÑÔÐðððñôðððððððøøøððððððs�AÁAÁAÚusernamecóT— tj|¦«n#t$rYdSwxYwdS)z, Check user existence in the system FT)ÚpwdÚgetpwnamrM)rs r"Úis_user_presentrzsA€ðÝ Œ �XÑÔÐÐøÝ ððð؈uˆuðøøøà ˆ4ó ‚— %¤%ÚuidcóT— tj|¦«n#t$rYdSwxYwdS)z+ Check uid existence in the system FT)rÚgetpwuidrM)r s r"Úis_uid_presentr …sA€ðÝ Œ �SÑÔÐÐøÝ ððð؈uˆuðøøøà ˆ4r rcó”— tj|¦«j}n#ttf$rYdSwxYwt j|¦«}|S)z+ Check that file by path is socket N)rÚlstatrËr½rrÉÚS_ISSOCK)rr2Ú is_sockets r"Úis_socket_filer�sU€ðÝŒx˜‰~Œ~Ô%ˆˆøÝ �wÐ 'ððð؈tˆtðøøøå” ˜dÑ#Ô#€Ià Ðs ‚œ1°1có¼—tjdddd¬¦«}| ¦« ¦«d}|dkrdnt |¦«}|S)z? Get number of system run level by command `runlevel`. z/sbin/runlevelTú /bin/bash)rzÚ executablerqrœÚS)rr€r�rƒrÎ)ÚoutputrcÚlevels r"Úget_system_runlevelr�sc€õÔ $ØØØØ ð ñô€Fð�\Š\‰^Œ^× !Ò !Ñ #Ô # AÔ &€Fà˜3’�ˆAˆA¥C¨¡K¤K€EØ €Lr<Ú service_namecó—t¦«} tjdd|gitj¥ddi¥d¬¦«}n#tjt f$rYdSwxYw| ¦« ¦«}|dd …D]V}| ¦« d ¦«}|dd k}t|d ¦«}||krd|fcSŒWd S)zý Return state of a service (present and enabled) for init.d system. Returns False, False if a service doesn't exist Returns True, False if a service exists and it's not enabled Returns True, True if a service exists and it's enabled z/sbin/chkconfigz--listÚLANGÚCT)Úenvrq©FFrœNú:rÞr©TF) rrr€rÚenvironr„r½r�rƒrÎ)rÚrunlevelrÚ output_listÚ state_infoÚ state_listÚ is_activeÚstate_runlevels r"Ú#_get_service_state_on_init_d_systemr)¯s€õ#Ñ$Ô$€HðõÔ(à  ¨,Ð 7Ø+•2”:Ð+˜v sÐ+Ð+Øð  ñ ô ˆˆøõ Ô )Õ+<Ð =ððð؈|ˆ|ðøøøð—,’,‘.”.×&Ò&Ñ(Ô(€KØ! ! " "”oð#ð#ˆ Ø×%Ò%Ñ'Ô'×-Ò-¨cÑ2Ô2ˆ ؘq”M TÒ)ˆ ݘZ¨œ]Ñ+Ô+ˆØ �~Ò %Ð %ؘ�?Ð "Ð "Ð "ð &à ˆ;s�*;»AÁAcóÆ— tjdd|gtjtj¬¦«dS#tjtf$r˜ tjdd|gtjtj¬¦«5}| ¦«|jdvr ddd¦«Yd S ddd¦«Yd S#1swxYwYYdS#tjtf$rYYd SwxYwwxYw) zû Return state of service (present and enabled) for systemd system Returns False, False if a service doesn't exist Returns True, False if a service exists and it's not enabled Returns True, True if a service exists and it's enabled z/usr/bin/systemctlz is-enabled)rîrP)TTrØ)rPrî)réNr!r)rÚ check_callÚDEVNULLr„r½rðròró)rrôs r"Ú$_get_service_state_on_systemd_systemr.Òs�€ð ÝÔð" <°Ð >ÝÔ%ÝÔ%ð  ñ ô ð ðˆzøÝ Ô )Õ+<Ð =ð ð ð ð ÝÔ!à(ØØ ðõ "Ô)Ý!Ô)ðñôð $ðØ× Ò Ñ"Ô"Ð"ð”? fÐ,Ð,Ø&ð $ð $ð $ñ $ô $ð $ð $ð $ð $ð$ð $ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð $ð $ð $øõ Ô-Õ/@ÐAð ð ð Ø�<�<�<ð øøøð% øøøsW‚.2²C Á .CÁ7B3 CÂ$B3Â% CÂ3B7 Â7CÂ:B7 Â;CÃCÃC ÃCÃC có€—t¦«}|rd|vrt|¬¦«\}}nt|¬¦«\}}||fS)zb Return state of service (present and enabled) :param service_name: name of a service r¥)r)r¹r)r.)rÚcl_verÚ is_presentÚ is_enableds r"Úservice_is_enabled_and_presentr3øsi€õ Ñ Ô €FØ ð �%˜6�/�/Ý!DØ%ð" ñ" ô" ш �J�Jõ"FØ%ð" ñ" ô" ш �Jð �zÐ !Ð!r<Úprocess_file_pathÚ strict_matchcóV—tj |¦«std|›d�¦«‚t jdg¦«D]`} |s|| ¦«vs-|r.|d | ¦«¦«krdSŒL#tj$rYŒ]wxYwdS)aä Check that a file in path is running. You can get false-postive if parameter `strict_match` == False, process is not running, but someone on server open file by path `process_file_path` in an editor :param process_file_path: path to a file which is run :param strict_match: we use parameter `process_file_path` as full cmd line with args for comparing if `strict_match` == True. :return: True if it's running, False - is not, zProcess file in path "ú" does not existÚcmdlineú TF) rrr~r½ÚpsutilÚ process_iterr8ÚjoinÚ NoSuchProcess)r4r5Úprocesss r"Úprocess_is_runningr? sÏ€õ Œ7�>Š>Ð+Ñ ,Ô ,ð^ÝÐ \Ð9JÐ \Ð \Ð \Ñ]Ô]Ð]ÝÔ&¨  {Ñ3Ô3ððˆð Ø ð Ð%6¸'¿/º/Ñ:KÔ:KÐ%KÐ%KØð&LØ!2°c·h²h¸w¿ºÑ?PÔ?PÑ6QÔ6QÒ!QÐ!Qà�t�tøøÝÔ#ð ð ð Ø ˆHð øøøà ˆ5sÁ ABÂB&Â%B&ÚdtcóÊ—t|tjtjf¦«stdt |¦«›�¦«‚t | ¦«S)z� Get string representation of weekday from datetime.datetime or datetime.date. Returns shortened version of weekday from WEEK_DAYS. zFRequire object of type datetime.datetime or datetime.date, but passed )Ú isinstanceÚdatetimeÚdateÚ TypeErrorÚtypeÚ WEEK_DAYSÚweekday)r@s r"Ú get_weekdayrI!sU€õ �r�HÔ-­x¬}Ð=Ñ >Ô >ðmÝÐkÕaeÐfhÑaiÔaiÐkÐkÑlÔlÐlÝ �R—Z’Z‘\”\Ô "Ð"r<Ú config_pathÚapache_module_nameÚ param_nameÚdefaultc󬇗d|›d�}g}t|¦«}d}|D]@}| ¦«}||krd}Œ|r|dkrn|r| |¦«ŒAtt ‰dd|¬¦«¦«} ˆfd„| D¦«} | s|�|d fS| s |€ d d |›d |›�fS| d  d¦«} t | d ¦«} | d fS)a Parse httpd config for details about the mpm module used. :param config_path: path for configuration file with modules :param apache_module_name: expected mpm module. Can be `event`, `worker`, `prefork` :param param_name: name of parameter to find :param default: default value for parameter, if there won't be record :return: tuple with param value and text result of operation Example of config file content: ................. MaxRequestWorkers 450 -- ................. MaxRequestWorkers 300 -- ................. MaxRequestWorkers 2048 zFTz )rar_rbc󆕗g|]=}| ¦« ‰¦«¯)| ¦«‘Œ>SrU)r�rY)r8Ú directiverLs €r"r;z/find_module_param_in_config..bsAø€ÐpÐpÐp iÀyÇÂÑGXÔGX×GcÒGcÐdnÑGoÔGoÐp� —’Ñ!Ô!ÐpÐpÐpr<NÚOKrz.MaxRequestWorkers directive not found for mpm_z_module module in rFr9)r.r�ÚappendÚlistrerƒrÎ) rJrKrLrMÚif_module_lineÚ section_linesÚ mpm_linesÚis_section_foundr:Úgrep_result_listÚmrw_listÚpartsÚmax_request_workerss ` r"Úfind_module_param_in_configr\+s\ø€ð@CÐ&8ÐBÐBÐB€NØ€Mݘ{Ñ+Ô+€IØÐØð 'ð 'ˆØ�zŠz‰|Œ|ˆØ �>Ò !Ð !Ø#Ð Ø Ø ð  ¨ Ò 5Ð 5à ˆEØ ð 'Ø × Ò  Ñ &Ô &Ð &øåÝ Ø Ø ØØ(ð  ñ ô ñôÐðqÐpÐpÐpÐ3CÐpÑpÔp€Hð ð˜Ð+à˜ˆ}ÐØ ð ˜˜ð Ø pÐ=OÐ pÐ pÐcnÐ pÐ pð ð ð �RŒL× Ò ˜sÑ #Ô #€Eݘe Bœi™.œ.ÐØ  Ð $Ð$r<cóP—d}tj |¦«sdS t|d¬¦«5}| ¦« ¦«}ddd¦«n #1swxYwY| dd¦«\}}n#ttf$rYdSwxYw|S)zp Return kmodlve module's version. Content of '/sys/module/kmodlve/version' looks like '2.0-30.el8'. z/sys/module/kmodlve/versionr|r%r0Nr�rœ) rrr(r)r‘r�ÚrsplitrrÏ)Úkmodlve_module_file_pathr-ÚmoduleÚmodule_versionÚ_s r"Úget_kmodlve_module_versionrcusï€ð =ÐÝ Œ7�>Š>Ð2Ñ 3Ô 3ð؈rðÝ Ð*°WÐ =Ñ =Ô =ð &ÀØ—V’V‘X”X—^’^Ñ%Ô%ˆFð &ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &à"ŸMšM¨#¨qÑ1Ô1ш˜˜øÝ •ZÐ ððð؈rˆrðøøøà Ðs4¥B¶'A)Á BÁ)A-Á-BÁ0A-Á1BÂB#Â"B#cór—ddi}t¦«}||vrdS||}t¦«}||krdSdS)a Find out if system has version of the kernel (according to kmodlve module's version) where fs.proc_can_see_other_uid and hidepid options are synchronized. They are only synchronized if kmodlve module's version is equal to version in synced_kmodlve_versions. r©z2.0-30FT)r¹rc)Úsynced_kmodlve_versionsr¶Úsynced_versionÚcurrent_versions r"Ú)proc_can_see_other_uid_and_hidepid_syncedrh†sU€ð % hÐ/ÐÝÑ!Ô!€JØÐ0Ð0Ð0؈uØ,¨ZÔ8€NÝ0Ñ2Ô2€Oؘ.Ò(Ð(؈tØ ˆ5r<Ú pid_filenamecó— t|d¬¦«5}t| ¦« ¦«¦«}t j|d¦«ddd¦«n #1swxYwYn#t tf$rd}YnwxYw|S)z– Detrmines working daemon process pid :param pid_filename: PID filename :return: PID from file or None if error (file not found, etc) r%r0rN)r)rÎr‘r�rrÂrrÏ)riÚpfrÀs r"Úget_process_pidrl™sË€ð Ý �,¨Ð 1Ñ 1Ô 1ð °RÝ�b—g’g‘i”i—o’oÑ'Ô'Ñ(Ô(ˆCå ŒG�C˜‰OŒOˆOð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øøõ •ZÐ ðððØˆˆˆðøøøà €Js5‚A4“A A(Á A4Á(A,Á,A4Á/A,Á0A4Á4B  B cóª—t|dd¬¦«5}| tj¦«›¦«ddd¦«dS#1swxYwYdS)z Writes pid file r=r%r0N)r)ÚwriterÚgetpid)rirks r"Úwrite_pid_filerp©s•€õ ˆl˜D¨7Ð 3Ñ 3Ô 3ð#°rØ �Š•B”I‘K”KÐ!Ñ"Ô"Ð"ð#ð#ð#ñ#ô#ð#ð#ð#ð#ð#ð#ð#øøøð#ð#ð#ð#ð#ð#s“(AÁA ÁA cóR— tj|¦«dS#t$rYdSwxYw)z Remove PID file N)rÚremover)ris r"Úremove_pid_filers±s?€ð Ý Œ �,ÑÔÐÐÐøÝ ð ð ð Ø ˆˆð øøøs ‚˜ &¥&c󇇗ˆˆfd„}|S)a Set user's real uid and gid to specified ones. Checking equality of real and effective uids is needed because this function may be used by root with effective uid dropped to user's uid. In that case it is needed to set effective uid back to 0 first. cóØ•—tj¦«}tj¦«}||krtj|¦«tj‰¦«tj‰¦«dS©N)rÚgetuidrGÚseteuidÚsetgidÚsetuid)Úreal_uidÚeff_uidÚgidr s €€r"Úfunczdemote..funcÄsRø€Ý”9‘;”;ˆÝ”*‘,”,ˆà �wÒ Ð Ý ŒJ�xÑ Ô Ð å Œ �#‰ŒˆÝ Œ �#‰Œˆˆˆr<rU)r r}r~s`` r"Údemoter»s)øø€ððððððð €Kr<ÚdirpathcóL—tj |¦«std|›d�¦«‚dd|g}t |¦«} | d¦«d}| d¦«d}n%#t $r}td |›�¦«|‚d }~wwxYw|S) zK Get mount point for dirpath directory from output of `df` utility z Directory "r7z/bin/dfz-hr6rœr9rFz)Utility "df" returned unexpected output: N)rrÚisdirrrrƒrr)r€Ú fs_info_cmdÚfs_infoÚmountpoint_infoÚ mounted_onÚes r"Úget_mount_pointrˆÑsÈ€õ Œ7�=Š=˜Ñ !Ô !ð?ÝÐ= GÐ=Ð=Ð=Ñ>Ô>Ð>à˜d GÐ,€Kݘ+Ñ&Ô&€Gð UØ!Ÿ-š-¨Ñ-Ô-¨aÔ0ˆØ$×*Ò*¨3Ñ/Ô/°Ô3ˆ ˆ øÝ ðUðUðUÝÐLÀ7ÐLÐLÑMÔMÐSTÐTøøøøðUøøøð ÐsÁ6A?Á? B! BÂB!có —d}tj |¦«st¦«dkSt |d¬¦«5}t | ¦«¦«}|dkcddd¦«S#1swxYwYdS)z’ Detect if 'may_detach_mounts' kernel option is enabled. More info on the option: https://cloudlinux.atlassian.net/browse/KMODLVE-512 z/proc/sys/fs/may_detach_mountsr¥r%r0rœN)rrr(r¹r)rÎr‘)Úmay_detach_mounts_filer-Úvals r"Úis_may_detach_mounts_enabledrŒçsÁ€ð >Ðå Œ7�>Š>Ð0Ñ 1Ô 1ð)åÑÔ 5Ò(Ð(å Ð$¨wÐ 7Ñ 7Ô 7ð¸1Ý�!—&’&‘(”(‰mŒmˆØ�aŠxððððñôððððððøøøððððððsÁ'A9Á9A=ÂA=Údevicecó^—tj¦«}|D]}|j|kr |jcSŒdS)z; Return the file system type for the given device. r|)r:Údisk_partitionsr�Úfstype)r�Ú partitionsÚ partitions r"Úget_filesystem_typer“÷sH€õÔ'Ñ)Ô)€JØð$ð$ˆ Ø Ô ˜vÒ %Ð %ØÔ#Ð #Ð #Ð #ð &à ˆ2r<có— d}d}tj¦«}t|d¬¦«5}| d|›d�| ¦«z¦«ddd¦«n #1swxYwY| |d¦« d ¦«}| |d ¦« d ¦«}n#ttjf$rYd SwxYw|d kr|  d ¦«rd}||fS)zN Detect system name and version. :return: tuple (os_name, os_ver) z/etc/os-releaseÚtopr%r0ú[z] NÚNAMEr}Ú VERSION_ID)NNÚ AlmaLinuxÚ10Ú CloudLinux) Ú configparserrr)Ú read_stringr‘Úgetr�rrrY)Úos_release_filenameÚ section_nameÚconfigÚstreamÚos_nameÚos_vers r"rŸrŸs`€ð Ø/ÐØˆ ÝÔ*Ñ,Ô,ˆå Ð%°Ð 8Ñ 8Ô 8ð F¸FØ × Ò Ð4 <Ð4Ð4Ð4°v·{²{±}´}ÑDÑ EÔ EÐ Eð Fð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Føøøð Fð Fð Fð Fà—*’*˜\¨6Ñ2Ô2×8Ò8¸Ñ=Ô=ˆØ—’˜L¨,Ñ7Ô7×=Ò=¸cÑBÔBˆˆøÝ •\Ô'Ð (ððð؈zˆzðøøøð �+ÒР&×"3Ò"3°DÑ"9Ô"9ÐØˆØ �Fˆ?Ðs5‚(Cª/A%Á CÁ%A)Á)CÁ,A)Á-ACÃCÃCcó0—t¦«\}}|dkS)z~ Determine whether this system is Ubuntu. Reads /etc/os-release file to do so. :return: bool flag is_ubuntu ÚUbuntu)rŸ)r£rbs r"r¯r¯!s€õ Ñ!Ô!�J€GˆQØ �hÒ Ðr<cóª—d}tj d¦«r1tjdddtjtj¬¦«dk}|S)z\ Determine if secure boot is turned on :return: bool flag is_secureboot_enabled Fz/sys/firmware/efiz!mokutil --sb-state | grep enabledTr)rzrrîrPr)rrr~rÚcallr-)r�s r"Úis_secureboot_enabledr©-s_€ð €GÝ „w‡~‚~Ð)Ñ*Ô*ð  å ŒOØ3ØØ&Ý!Ô)Ý!Ô)ð  ñ ô ðò ð ð €Nr<có|— tjtj¦«¦«dS#t$rYdSwxYw)z' Get username of current user. rN)rr rrwÚ ExceptionrUr<r"Ú get_usernamer¬AsD€ðÝŒ|�BœI™KœKÑ(Ô(¨Ô+Ð+øÝ ððð؈tˆtðøøøs ‚*-­ ;º;có&—t¦«rdSdS)z- It differs on Ubuntu and CloudLinux z%usr/lib/x86_64-linux-gnu/php/modules/zusr/lib64/php/modules/)r¯rUr<r"Úget_modules_dir_for_alt_phpr®Ks€õ�{„{ð7Ø6Ð6Ø #Ð #r<rv)NFTFN)\rœrCrHrúrr°rrZrÉrrOrrÚ functoolsrÚtypingrrrr r r r:rþÚxml.etree.ElementTreergÚ ElementTreeÚclcommon.utils_cmdr r rrrirGrÕrÛrßr#r.r3rBrSrVrerjr³rurŒÚboolr•r£r¹r¿rÎrÃrÒrÙrÜràrârçrërérêrürrr rrr)r.r3r?rDrIr\rcrhrlrprsrrˆrŒr“ÚtuplerŸr¯r©r¬r®rUr<r"úr¶sñððÐÐÐØ€€€Ø € € € Ø € € € Ø € € € Ø€€€Ø € € € Ø € € € Ø € € € ØÐÐÐØ € € € Ø,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÐÐÐÐÐØ<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<à € € € Ø€€€Ø%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ð ðððððððððððð2ÐØ =€ Ø?ÐØ7ÐØ.Ðð*ð*ð*ð. ð ð ð ð ð ð ðððð&ððð$4ð4ð4ð ØØØØð ,ð,ð,ð,ð^*ð*ð*ð  H¨S¤Mð ð ð ð ð 6ð6ð6ðr  ð ð ð ð ð˜s T™zððððð:)˜˜d™ ð)ð)ð)ð)ðXð#�x ”}ð#ð#ð#ñ„ð#ðL�3ððððð" cð¨dððððð>˜dððððð(˜$ððððð$  ð ð ð ð ð ð ð ð sð¨tððððð0 ð ð ðððð4ððð6 ð ð ð ð ð ð˜cð dððððð˜ð ððððð ˜ð  H¨T¤Nð ð ð ð ð˜Sððððð$ °cð ¸eÀDÈ$ÀJÔ>Oð ð ð ð ðF# °sð# ¸uÀTÈ4ÀZÔ?Pð# ð# ð# ð# ðL"°ð"¸¸tÀT¸zÔ9Jð"ð"ð"ð"ð"¨#ð¸TðÀdððððð0#�E˜(Ô+¨X¬]Ð:Ô;ð#Àð#ð#ð#ð#ðð G%ðG%ØðG%àðG%ððG%ðð G%ð  ˆ3�ˆ8„_ð G%ðG%ðG%ðG%ðT Cððððð"°4ððððð&  #ð ¨(°3¬-ð ð ð ð ð # ð#ð#ð#ð#ð  #ð ð ð ð ðððð,˜Sð Sððððð,  dð ð ð ð ð  ð¨ððððð˜˜c D™j¨#°©*Ð4Ô5ððððð> �4ð ð ð ð ð˜tððððð(ððð$ð$ð$ð$ð$r<