OwlCyberSecurity - MANAGER
Edit File: cl_selector.cpython-311.pyc
� ����$_$hg����������������������������d�dl�mZ�d�dl�mZ�d�dl�mZ�d�dlZd�dlZd�dlZd�dlZd�dlm Z �d�dl Z d�dlZd�dlZd�dl Z d�dlZd�dlmZ�d�dlmZ�d�dlmZ�d�dlmZ�d�d lmZ�d�d lmZ�d�dlmZ�d�dlmZ�d�d lm Z m!Z!m"Z"�d�dl#m$Z$m%Z%�d�dl&m'Z'm(Z(�d�dl)m*Z*�d�dl+m,Z,�d�dl-m.Z.�d�dl/m0Z0�d�dl1m2Z2�d�dl3m4Z4�ddl5m6Z6m7Z7m8Z8�ddl5m9Z9�ddl:m;Z;m<Z<m=Z=�d�dl>m=Z?�dZ@d��ZA�G�d��deB������������ZCdS�)�����)�print_function)�absolute_import)�divisionN)�AnyStr)� iteritems)�ClPwd)�FormattedException)� MailHelper)�is_ascii_string)�CloudlinuxLicenseLib)�clselectctl)�get_abs_rel�mkdir_p�run_process_in_cagefs)�BaseSelectorError�AcquireApplicationLockError)�print_dictionary�replace_params)� CONFIG_DIR)� PkgManager)�is_clpassenger_active)�defaultdict)�MIMEText)�mkstemp����)�NODEJS�PYTHON�PHP)�parse_cloudlinux_selector_opts)�CloudlinuxSelectorLib�OK_RES_DICT�ClSelectExcept)r"���z.lockc������������������"�����t����������|�|������������S��N)�open)� file_name�modes��� �M/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselector/cl_selector.py�_openr)���;���s������� �4� � � �����c������������������������e�Zd�Zd��Zd��Z � �d1d�Zd��Zd��Zed����������������Z d��Z d ��Zd ��Zd��Z d��Zd ��Zd��Zd��Zd��Zd��Zd��Zd��Zd��Zd��Zd��Zd��Zd��Zd��Zd��Zd2d�Zed����������������Zd3d�Ze d ����������������Z!e d!����������������Z"d"��Z#e$j%��������d#����������������Z&d$��Z'd%��Z(d&��Z)d'��Z*d(��Z+d)��Z,d*��Z-d+��Z.d,��Z/d-��Z0d.��Z1ed/����������������Z2d0S�)4�CloudlinuxSelectorc������������������������d|�_���������i�|�_��������d�|�_��������t����������j����������������������dk����|�_��������d�|�_��������d|�_��������d|�_��������d|�_ ��������t����������j �����������������������������t����������d������������|�_ ��������d�S�)NFr���z--background��zcloudlinux-selector_bkg.pid)�_is_json�_opts� _selector_lib�os�geteuid� _is_root_user�_lock�_is_bkg_option_present�_bkg_option�_nj_ver_move_from�path�joinr����_pid_file_name��selfs��� r(����__init__zCloudlinuxSelector.__init__A���si�������� ��� �!����Z�\�\�Q�.����� �&+��#�)���!#��� �g�l�l�:�7T�U�U����r*���c����������������������|�j���������d���������t����������t����������fvrdS�t����������|�j���������d���������|�j���������d���������g������������rdS�t����������|�j���������d���������|�j���������d���������|�j���������d���������|�j���������d���������|�j���������d ���������|�j���������d ���������|�j���������d���������|�j���������d���������|�j���������d ���������|�j���������d���������|�j���������d���������|�j���������d���������|�j���������d���������|�j���������d���������|�j���������d���������g������������rdS�dS�)zx Check if cloudlinux-selector called with application operations :return: True if lock is need � --interpreterF�change-version-multiple�create�start�restart�destroy�migrate�stop�install-modules�uninstall-modules� run-script� --app-mode� --env-vars�--new-app-root�--new-domain� --new-app-uri� --new-version�--startup-fileT)r0���r���r����anyr<���s��� r(����is_app_lock_neededz%CloudlinuxSelector.is_app_lock_neededM���s�������:�o�&�v�v�.>�>�>��5��� �4�5�t�z�(�7K�L�M�M�� ��5���J�w���J�y�!��J�y�!��J�y�!��J�v���J�(�)��J�*�+��J�|�$��J�|�$��J�|�$��J�'�(��J�~�&��J��'��J��'��J�'�(�*��+��+�� � ��4��ur*���Fc����������������������|�������������������������������������sdS�|�j��������d���������|�j��������d���������}}|�j��������j�����������������������������|||�|��������������\��}}t ����������j�����������������������������|������������sdS�t ����������j�����������������������������|t����������������������} �t����������|d������������|�_��������t����������j ��������|�j�������������������������������������������t����������j��������t����������j��������z���������������dS�#�t"����������$�r<}|j��������t$����������j��������k����rd} t)����������|| ��������������t)����������|�������������d}~ww�xY�w)z[ Acquire lock for application if this lock is needed :return: None N�--user� --app-root)�chk_app_root�chk_envza+z6Disk quota exceeded. Please, free space and try again.)�reason)rS���r0���r1����apps_manager�get_app_foldersr2���r9����existsr:����LOCKr%���r5����fcntl�flock�fileno�LOCK_EX�LOCK_NB�IOError�errno�EDQUOTr���) r=����ignore_missing_app_root�ignore_missing_doc_root�username�app_root�_�app_venv� lock_file�erY���s ��� r(����acquire_app_lock_if_neededz-CloudlinuxSelector.acquire_app_lock_if_neededk���s5�������&�&�(�(�� ��F�!�Z��1�4�:�l�3K�(���(�5�E�E��h�1H�-H�/�/��F��1��1���8���w�~�~�h�'�'�� ��F��G�L�L��4�0�0� � 8��i��.�.�D�J��K�� �)�)�+�+�U�]�U�]�-J�K�K�K�K�K���� 8�� 8�� 8��w�%�,�&�&�Q��1�(�6�J�J�J�J�-�h�7�7�7����� 8���s���� AC:��: E��7D;�;E�c������������������^�����|�j���������r#|�j��������d���������r|�������������������������������������d�S�d�S�d�S�)NrP���)r4���r0����send_notificationr<���s��� r(����send_notification_if_neededz.CloudlinuxSelector.send_notification_if_needed����sG��������� %�$�*�_�"=�� %��"�"�$�$�$�$�$� %�� %�� %�� %r*���c�����������������������d�S�r$���) r���r0����cpapi�cpinfor ����sendmail� IndexError�KeyError�cpapiexceptions�NotSupported)r=����MSG_TEMP�msg�me�cp_userinfo�user_data_email� mailhelpers��� r(���rp���z$CloudlinuxSelector.send_notification����s ������� �r*���c������������������l�����|�sdS�d��|����������������������������������������������������������d������������D���������������S�)N��c�����������������������g�|�]}|�|��S�r����r����)�.0�modules��� r(���� <listcomp>z4CloudlinuxSelector.parse_modules.<locals>.<listcomp>����s������R�R�R�6�6�R��R�R�Rr*����,)�strip�split)�modules_optionss��� r(���� parse_modulesz CloudlinuxSelector.parse_modules����s=�������� ��2�R�R�_�%:�%:�%<�%<�%B�%B�3�%G�%G�R�R�R�Rr*���c����������� �������J����d|v�|�_���������|�j��������|v�|�_��������|�j��������r|���������������������|�j��������������������� �t ������������������������}|�����������������������������������sGd|�_���������|����������������������ddi������������|�j��������r" �t����������j��������|�j���������������������S�#��Y�S�xY�wS�|�� ��������������������|������������|�_ ��������t����������|�j ��������d���������������������|�_��������|�j��������� �����������������������������������|�j�����������������������������|�j ��������������������r�|������������������������������������5��t!����������|�j ��������d���������|�j��������j��������|������������}|d���������}|����������������������|d����������������������|�������������������������������������d d d �������������n#�1�swxY�w�Y���||�j��������r" �t����������j��������|�j���������������������S�#��Y�S�xY�wS�|�j�����������������������������|�j ��������������������r�d d|�j ��������d���������|�j��������j��������g|z���}|������������������������������������5��t+����������j��������|i��������������}|������������������������������������|�������������������������������������d d d �������������n#�1�swxY�w�Y���|j��������|�j��������r" �t����������j��������|�j���������������������S�#��Y�S�xY�wS�|����������������������|�j ��������d ���������|�j ��������d �����������������������|�j ��������d���������rc|����������������������|�j ��������d���������|�j ��������d���������������������\��}}|dk����r||�j ��������d<���n#|����������������������t7����������|��������������������������|�j ��������d���������r|��������������������������������������n�|�j ��������d���������r|��������������������������������������n�|�j ��������d���������r|��������������������������������������n�|�j ��������d���������r|��������������������������������������n`|�j ��������d ���������r|�� ������������������������������������n=|�j ��������d���������r|��!������������������������������������n|�j ��������d���������r|��"������������������������������������n�|�j ��������d���������r|��#������������������������������������n�|�j ��������d���������r|��$������������������������������������n�|�j ��������d���������r|��%������������������������������������n�|�j ��������d���������r|��&������������������������������������nk|�j ��������d���������r|��'������������������������������������nH|�j ��������d���������s |�j ��������d���������r|��(������������������������������������n|�j ��������d���������s |�j ��������d ���������r|��)�����������������������������������n�|�j ��������d!���������r]|��*��������������������|�j���������+��������������������|�j ��������d���������|�j ��������d"���������|�j ��������d#���������|�j ��������d$����������������������������������n|�j ��������d%���������r|��,�����������������������������������n]|�j ��������d&���������r|�j���������-�����������������������������������n6|�j ��������d'���������r|��.�����������������������������������n|��/������������������������������������n!#�t`����������j1��������t`����������j2��������t`����������j3��������f$�r;} |����������������������t7����������ti����������| ��������������������������������������Y�d } ~ �n�d } ~ wt`����������j5��������t`����������j6��������f$�rU} |�j ��������d&���������s.|����������������������t7����������| j7��������| j8���������(�������������������������ts����������d)�������������Y�d } ~ �nWd } ~ wt`����������j:��������$�r.} |����������������������t7����������| ��������������������������Y�d } ~ �nd } ~ wtv����������$�rt} | j<��������r5|����������������������t7����������| j7��������| j8��������| j<���������*�������������������������n.|����������������������t7����������| j7��������| j8���������(�������������������������Y�d } ~ n�d } ~ wtz����������$�r�} t}����������j?����������������������}t}����������j@��������t�����������| ������������| ������������}t�����������|t�����������������������rd+�D��������������������|������������} n|} |����������������������t7����������| |�,�������������������������Y�d } ~ nd } ~ ww�xY�w|�j��������r" �t����������j��������|�j���������������������n6#��Y�n2xY�wn.#�|�j��������r" �t����������j��������|�j���������������������w�#��Y�w�xY�ww�xY�wd)S�)-z$ Run command action �--jsonT�resultzCloudlinux license isn't validr@���rU���� returncode�outputNz /usr/bin/sudoz-u)�envrE���)rf���rg����--passenger-log-file�OK�r�����setrF����import-applicationsrB���rC���rD���rG���zread-configzsave-configrH���rI����install-versionzuninstall-version�enable-versionzdisable-versionrJ���rV���z --script-namez <script_args>rA���zmake-defaults-config�setup�r�����contextr���)r����r�����details� )r����r����)Er/���r7���r6����remover����get_license_status�_error_and_exitr2���r;����_parse_argsr0���r ���r1����check_selector_is_available�should_be_runned_as_user�_lock_interpreter_if_neededr����CLOUDLINUX_SELECTOR_UTILITY�_print_raw_datarq����should_run_user_without_cagefs� subprocess�Popen�communicater����rn����!_passenger_log_filename_validator�dict�run_set�run_migrate_application�run_import_applications� run_create�run_destroy� run_start�run_restart�run_stop�run_read_config�run_save_config�run_install_modules�run_uninstall_modules�run_manage_version�run_disable_or_enable_version�_print_data� run_script�_start_change_all_apps_versions�replace_mysqli� run_setup�run_get�ClSelectExcept_old�ConfigNotFound� WrongData�NoSuchAlternativeVersion�str�NativeNotInstalled�MissingCagefsPackage�messager�����exit�FileProcessErrorr ���r����� Exception� traceback� format_exc�format_exception_only�type� isinstance�listr:���)r=����argv�licencer����r�����user_run_cmd�processr�����log_filenamerm����errr{����list_err_msg�err_msgs��� r(����runzCloudlinuxSelector.run����s� ������!�D�(�� �&*�&6�$�&>��#��&�� *��K�K��(�)�)�)�{ �*�,�,�G��-�-�/�/�� Z� $�� ��+�+�X�7W�,X�Y�Y�d��*�� ���I�d�1�2�2�2�2����D���� �_��)�)�$�/�/�D�J�!6�t�z�/�7R�!S�!S�D����:�:�<�<�<��!�:�:�4�:�F�F�� *��5�5�7�7��7��7�2�� �8�,��*�F�����F� �"(��!5�J��(�(���)9�:�:�:��4�4�6�6�6�7��7��7��7��7��7��7��7��7��7��7�����7��7��7��7��"�B��*�� ���I�d�1�2�2�2�2����D���� �A��#�B�B�4�:�N�N�� *� /��t�z�(�7K� $� 2� N� P�RV� W���5�5�7�7��7��7�(�.�|��D�D�D�G��'�'�)�)�)��4�4�6�6�6�7��7��7��7��7��7��7��7��7��7��7�����7��7��7��7���)�r��*�� ���I�d�1�2�2�2�2����D���� �o� �+�+�(,� �9�(=�(,� �9�(=�� ,�� �� �� � ��z�0�1�� ?�(,�(N�(N�t�z�Zb�Oc�OS�z�Zp�Oq�)s��)s�%����d�?�?�9E�D�J�5�6�6��(�(��W�)=�)=�)=�>�>�>��z�%� ��* ����������I�&��( ��,�,�.�.�.�.���1�2��& ��,�,�.�.�.�.���H�%��$ ����!�!�!�!���I�&��" �� � �"�"�"�"���G�$�� ���� � � � ���I�&�� �� � �"�"�"�"���F�#�� �� � �������M�*�� ��$�$�&�&�&�&���M�*�� ��$�$�&�&�&�&���-�.�� ��(�(�*�*�*�*���/�0�� ��*�*�,�,�,�,���-�.�� �$�*�=P�2Q�� ��'�'�)�)�)�)���,�-�� ���<M�1N�� ��2�2�4�4�4�4���L�)�� �� � ��&�1�1�� �8�,�d�j��.F�� �?�3�T�Z��5P��������������5�6�� ��4�4�6�6�6�6���2�3�� ��"�1�1�3�3�3�3���G�$�� ���� � � � ���������"�1�"�,�"�;�=�� 6�� 6�� 6�� � � ��S��V�V�!4�!4�!4�5�5�5�5�5�5�5�5�����"�5�"�7�9�� �� �� ��:�4�5�� P��$�$�T���A�I�%N�%N�%N�O�O�O�� ��G�G�G�G�G�G�G�G�����!�2�� 1�� 1�� 1�� � ��Q����0�0�0�0�0�0�0�0�����!�� P�� P�� P��y�� P��$�$�T���A�I�WX�W`�%a�%a�%a�b�b�b�b��$�$�T���A�I�%N�%N�%N�O�O�O������������ �� �� ��&�(�(�C�$�:�4��9�9�c�J�J�L��,��-�-�� %�� � �,�/�/�g�g�$�g�� � ����"��"��"�� �� �� �� �� �� �� �� ����� ������*�� ���I�d�1�2�2�2�2����D���� ��t�*�� ���I�d�1�2�2�2�2����D���� ������qs ���?X*��B�B�#BX*��(AF�X*��F�X*��F�X*��&G���G�AX*��?I$�X*��$I(�(X*��+I(�, X*��=J�J�N X*��(a5��*&a�0Z��a5��a�$A [4�.a5��4a�#\/�)a5��/ a�<A*^+�&a5��+ a�8Ba�>a5��a�a5��a-��-a1�5b �>b�b �b�b c�����������������������|�j���������d����������:|����������������������|�j�����������������������������|�j���������d����������������������������������d�S�|�j���������d����������:|����������������������|�j�����������������������������|�j���������d����������������������������������d�S�|�j���������d���������r:|����������������������|�j�����������������������������|�j���������d����������������������������������d�S�|�j���������d����������:|����������������������|�j�����������������������������|�j���������d����������������������������������d�S�|�j���������d����������:|����������������������|�j�����������������������������|�j���������d����������������������������������d�S�|�j���������d����������S|�j���������d����������F|����������������������|�j�����������������������������|�j���������d���������|�j���������d����������������������������������d�S�|�j���������d����������S|�j���������d����������F|����������������������|�j��������� ��������������������|�j���������d���������|�j���������d����������������������������������d�S�|�j ��������s|�j��������r�|����������������������|�j���������d ���������|�j���������d ���������|�j���������d���������|�j���������d���������|�j���������d ���������|�j���������d���������|�j���������d���������|�j���������d���������|�j���������d���������|�j���������d���������|�j���������d���������|�j���������d���������|�j���������d���������� ��� ���������d�S�d�S�)Nz--default-versionz--current-versionz--reset-extensions� --versionz--selector-statusz--supported-versionsz--extensionsz --optionsrU���rV���rK���rL���rM���rN���rO���rP���rQ����--skip-web-check� --entry-pointz--config-filesr����) r0���r����r1����set_default_version�set_current_version�reset_extensions�set_selector_status�set_supported_versions�set_extensions�set_options� _is_nodejs� _is_python� run_changer<���s��� r(���r����zCloudlinuxSelector.run_set8��s�������:�)�*�6����T�/�C�C�D�J�Ob�Dc�d�d�e�e�e�e�e� �Z�+� ,� 8����T�/�C�C�D�J�Ob�Dc�d�d�e�e�e�e�e� �Z�,� -�� @����T�/�@�@���K�AX�Y�Y�Z�Z�Z�Z�Z� �Z�+� ,� 8����T�/�C�C�D�J�Ob�Dc�d�d�e�e�e�e�e� �Z�.� /� ;����T�/�F�F�t�z�Rh�Gi�j�j�k�k�k�k�k� �Z�� '� 3�� �;�8O�8[����T�/�>�>�t�z�.�?Y�[_�[e�fq�[r�s�s�t�t�t�t�t� �Z�� $� 0�T�Z��5L�5X����T�/�;�;�D�J�{�<S�UY�U_�`k�Ul�m�m�n�n�n�n�n� �_�� @���� @��O�O�D�J�x�0�$�*�\�2J� �J�|�4� �J�|�4�d�j�AQ�6R�TX�T^�_m�Tn� �J��7���O�9T�VZ�V`�aq�Vr� �J�'9�:�D�J��<W�Y]�Yc�dt�Yu� �J�'=�>� @�� @�� @�� @�� @� @�� @r*���c������������������8�����|�j���������������������������������������������d�S�r$���)r1����setup_selectorr<���s��� r(���r����zCloudlinuxSelector.run_setupP��s��������)�)�+�+�+�+�+r*���c����������� �����������|�|�����������������������ddi�������������|�e|�j�����������������������������|||������������}|}|d��������������������������������������������dk����r)|����������������������|�������������t����������j��������d�������������|�|�d|�j�����������������������������||||������������}|d��������������������������������������������dk����r)|����������������������|�������������t����������j��������d�������������t����������||| ||du| duf������������r�|�d��|� ��������������������d������������D���������������}|�j��������� ��������������������||||| ||| ������������}|d��������������������������������������������dk����r)|����������������������|�������������t����������j��������d�������������|�d|�j�����������������������������|||| ������������}|d��������������������������������������������dk����r)|����������������������|�������������t����������j��������d�������������|����������������������i��������������dS�) a��� Call selectorctl to change application parameter :param config_files: names of config files (such as requirements.txt or etc) (only for python) :param entry_point: the specified entrypoint for application (only for python) :param user: application owner :param app_root: application main directory (application name) :param app_mode: application mode :param env_vars: dict with environment variables :param new_app_root: new application main directory (new application name) :param new_domain: new application domain :param new_app_uri: new application uri :param new_version: new version for nodejs interpreter :param startup_file: new startup file for application :param skip_web_check: skip check web application after change it's properties :param passenger_log_file: Passenger log filename :return: None Nr����zERROR: User is not specified�statusr����r���c�����������������������g�|�] }|d�k�����|��S�)r.���r����)r�����items��� r(���r����z1CloudlinuxSelector.run_change.<locals>.<listcomp>|��s������W�W�W��D�TV�J�J��J�J�Jr*���r����)r����r1����relocate�upperr�����sysr�����transitrR���r����� set_variables�change_version)r=����userri����app_mode�env_vars�new_app_root� new_domain�new_app_uri�new_version�startup_file�skip_web_check�entry_point�config_files�passenger_log_file�rs��� r(���r����zCloudlinuxSelector.run_changeS��s(�����(��<�� � ��8�":�� ;�� ;�� ;��#��"�+�+�D�(�L�I�I�A�#�H���{� � �"�"�d�*�*�� � ��#�#�#��������"�j�&<��"�*�*�4��;� �S�S�A���{� � �"�"�d�*�*�� � ��#�#�#���������(�L�+�|�SW�?W�"�$�.�0��1��1�� ���'�W�W��1C�1C�C�1H�1H�W�W�W���"�0�0��x��8�1=�{�L�Zl�n��n�A���{� � �"�"�d�*�*�� � ��#�#�#��������"��"�1�1�$��+�~�^�^�A���{� � �"�"�d�*�*�� � ��#�#�#���������������r*���c������������������^�����|�����������������������|�j��������������������������������������������������������d�S�r$���)r����r1���r����r<���s��� r(���r����z*CloudlinuxSelector.run_import_applications���s+����������+�C�C�E�E�F�F�F�F�Fr*���c�����������������������|�����������������������|�j�����������������������������|�j��������d���������|�j��������d����������������������������������d�S�)NrU���rV���)r����r1���r����r0���r<���s��� r(���r����z*CloudlinuxSelector.run_migrate_application���sL����������+�C�C��J�x� �$�*�\�":�<��<�� =�� =�� =�� =�� =r*���c����������������������|�j���������d���������r.|����������������������|�j��������������������������������������������������������d�S�|�j���������d���������r.|����������������������|�j��������������������������������������������������������d�S�|�j���������d���������r.|����������������������|�j��������������������������������������������������������d�S�|�j���������d���������r:|����������������������|�j�����������������������������|�j���������d����������������������������������d�S�|�j���������d���������t����������k����r.|����������������������|�j��������������������������������������������������������d�S�dt������������������������i}|�j���������d���������t����������k����r^|���������������������|�j�����������������������������|�j���������d����������������������������������|�� ����������������������������������\��}}|�|� ||d<���||d <���nN|�j���������d���������t����������k����r8|���������������������|�j�����������������������������|�j���������d����������������������������������d |v�r|����������������������||d �����������������������d�S�|����������������������|�������������d�S�)Nz--get-default-versionz--get-selector-statusz--get-supported-versionsz--get-current-versionrU���r@����passenger_active�remaining_apps_count�total_apps_countr����r����)r0���r����r1����get_default_version�get_selector_status�get_supported_versions�get_current_versionr����get_fullr���r����update�get_apps_users_info�_get_apps_count_from_pid_filer���)r=����resr��r��s��� r(���r����zCloudlinuxSelector.run_get���s4������:�-�.�� &����T�/�C�C�E�E�F�F�F�F�F� �Z�/� 0�� &����T�/�C�C�E�E�F�F�F�F�F� �Z�2� 3�� &����T�/�F�F�H�H�I�I�I�I�I� �Z�/� 0�� &����T�/�C�C�D�J�x�DX�Y�Y�Z�Z�Z�Z�Z� �Z�� (�C� /� /����T�/�8�8�:�:�;�;�;�;�;�%�'<�'>�'>�?�C��z�/�*�f�4�4�� � �4�-�A�A�$�*�X�BV�W�W�X�X�X�9=�9[�9[�9]�9]�6�$�&6�'�3�8H�8T�2F�C�.�/�.>�C�*�+����O�,��6�6�� � �4�-�A�A�$�*�X�BV�W�W�X�X�X��3���� � ��S��]� �;�;�;�;�;�� � ��%�%�%�%�%r*���c������������������^����|�����������������������|�j��������d���������������������r%|����������������������dd|�j��������d���������id��������������t������������������������s5|�j��������d���������t����������k����rd}nd}|����������������������dd |id��������������|����������������������|�j�����������������������������|�j��������d ���������|�j��������d���������|�j��������d���������|�j��������d���������|�j��������d ���������|�j��������d���������|�j��������d���������|�j��������d���������|�j��������d���������|�j��������d���������� ��� ���������������������d�S�)Nr����zTCan't create application: Nodejs version %(version)s is locked by background process�versionr����r@���z9https://docs.cloudlinux.com/python_selector/#installationz8https://docs.cloudlinux.com/index.html?installation.htmlz`Application creation not allowed, Phusion Passenger seems absent, please see %(url)s for details�urlrV���z --app-urirU����--domainrK���rQ���rL���r����r����)�(_is_version_locked_by_background_processr0���r����r���r���r����r1���� create_app)r=���r��s��� r(���r����zCloudlinuxSelector.run_create���sU������8�8���K�9P�Q�Q�� �� � �q�%�t�z�+�'>�?�"��"�� �� �� ��%�&�&�� ��z�/�*�f�4�4�Q���P��� � �[���3��"��"�� �� �� �� �����)�)�� �<�(�� �;�'�� �;�'�� �8�$�� �:�&�� �<�(�� �+�,�� �<�(�� �?�+�� �1�2� �� � �� �� �� �� r*���c�����������������������|�����������������������|�j�����������������������������|�j��������d���������|�j��������d����������������������������������d�S��NrV���rU���)r����r1����destroy_appr0���r<���s��� r(���r����zCloudlinuxSelector.run_destroy����S����������+�7�7�� �<�8P�8<� �8�8L�N��N�� O�� O�� O�� O�� Or*���c�����������������������|�����������������������|�j�����������������������������|�j��������d���������|�j��������d����������������������������������d�S�r��)r����r1���� start_appr0���r<���s��� r(���r����zCloudlinuxSelector.run_start���sS����������+�5�5�d�j��6N�6:�j��6J�L��L�� M�� M�� M�� M�� Mr*���c�����������������������|�����������������������|�j�����������������������������|�j��������d���������|�j��������d����������������������������������d�S�r��)r����r1����restart_appr0���r<���s��� r(���r����zCloudlinuxSelector.run_restart���r��r*���c�����������������������|�����������������������|�j�����������������������������|�j��������d���������|�j��������d����������������������������������d�S�r��)r����r1����stop_appr0���r<���s��� r(���r����zCloudlinuxSelector.run_stop���sS����������+�4�4�T�Z��5M�59�Z��5I�K��K�� L�� L�� L�� L�� Lr*���c�����������������������|�����������������������|�j�����������������������������|�j��������d���������|�j��������d���������|�j��������d����������������������������������d�S�)NrV���� --config-filerU���)r����r1����read_app_configr0���r<���s��� r(���r����z"CloudlinuxSelector.run_read_config���sX�����������.�.�� �<�(�� �?�+�� �8�$� &�� &� '�� '�� '�� '�� 'r*���c����������� ������������|�����������������������|�j�����������������������������|�j��������d���������|�j��������d���������|�j��������d���������|�j��������d����������������������������������d�S�)NrV���r!��z --contentrU���)r����r1����save_app_configr0���r<���s��� r(���r����z"CloudlinuxSelector.run_save_config���sb�����������.�.�� �<�(�� �?�+�� �;�'�� �8�$� &�� &� '�� '�� '�� '�� 'r*���c����������� �����������|�����������������������|�j�����������������������������|�j��������d���������|�j��������d���������|�j��������d���������|�j��������d���������|�j��������d���������|����������������������|�j��������d�����������������������������������������������d�S�)NrV���rU���r��r����z--requirements-file� --modules)r�����domainr����� spec_file�modules)r����r1����install_modulesr0���r����r<���s��� r(���r����z&CloudlinuxSelector.run_install_modules���s������������.�.�� �<�(��Z��)��z�*�-�#�z�*<�=��*�%:�;��*�*�4�:�k�+B�C�C� � /�� �� � �� �� �� �� r*���c����������� ������������|�����������������������|�j�����������������������������|�j��������d���������|����������������������|�j��������d���������������������|�j��������d���������|�j��������d���������|�j��������d�����������������������������������d�S�)NrV���r&��rU���r��r����)r)��r����r'��r����)r����r1����uninstall_modulesr0���r����r<���s��� r(���r����z(CloudlinuxSelector.run_uninstall_modules���s������������0�0�� �<�(��*�*�4�:�k�+B�C�C��Z��)��z�*�-�#�z�*<�=�� 1�� �� � �� �� �� �� r*���c����������������������|�j���������d���������}|�j���������d���������} �|����������������������|�j�����������������������������||�������������������������dS�#�t����������$�r/}|����������������������dt ����������|������������i�������������Y�d}~dS�d}~ww�xY�w)zM Disable or enable interpreter version :return: None r����r����r����N)r0���r����r1����set_version_statusr���r����r����)r=���r���target_version_statusrm���s��� r(���r����z0CloudlinuxSelector.run_disable_or_enable_version��s���������*�[�)�� $� �+;� <�� ����T�/�B�B�CX�Za�b�b�c�c�c�c�c�� �� �� �� �� � ��#�a�&�&�"�� �� �� �� �� �� �� �� �� ����� ���s����.A�� B�$B���Bc�����������������������t����������|�j��������d���������������������} �|�j��������d���������r |�j��������j�����������������������������|������������}n|�j��������j�����������������������������|������������}n&#�t����������$�r}t����������|������������}Y�d�}~nd�}~ww�xY�w|�|����������������������t�����������������������d�S�t����������|t����������������������r|����������������������|�������������d�S�|����������������������d|i�������������d�S�)Nr����r����r����)r����r0���r1����selector_manager�install_version�uninstall_versionr����r����r!���r����r����r����)r=����verr��rm���s��� r(���r����z%CloudlinuxSelector.run_manage_version��s��������$�*�[�)�*�*�� ��z�+�,�� Q��(�9�I�I�#�N�N����(�9�K�K�C�P�P������ �� �� ��a�&�&�C�C�C�C�C�C����� �����;����[�)�)�)�)�)� ��T� "� "�� 2�� � ��%�%�%�%�%�� � �(�C��1�1�1�1�1s����AA)��) B�3B�Bc����������� �������|����t����������||�j��������|�j���������������������\��}}|s"|����������������������t ����������|�������������������������|d���������dk����rb|d���������rX �t������������������������}|���������������������|d����������������������n-#�t ����������j��������$�r�t����������dd|d���������id��������������w�xY�w|S�t����������j �����������������������������d������������s(|d ���������s|d ���������r|����������������������ddd ��������������t����������j ��������|d���������|d���������������������\��|d<���}dD�]�}|���������������������|������������s�t����������|d���������||���������������������\��}} �t!����������j��������|�������������nG#�t$����������$�r:}|����������������������t'����������t)����������|��������������������������������������Y�d}~nd}~ww�xY�w|||<�����|S�)z% Parse CLI arguments )�as_from_rootr@����phprU���zNo such user (%s)r����)r����r����z/usr/local/cpanelr����rF����successz?Import/migrate of Python Selector applications is not supported)r�����warningr��)rV���rM���r����N)r���r/���r4���r����r���r����get_pw_by_name�NoSuchUserExceptionr"���r2���r9����isdirr ����$safely_resolve_username_and_doc_root�getr���r ����check_directory� ValueErrorr����r����) r=���r����r�����data�pwdrj����app_root_arg� directoryrm���s ��� r(���r����zCloudlinuxSelector._parse_args&��sS������6��$�-�d�.@�B��B��B������ 7�� � ���!5�!5�6�6�6���� �E�)�)��H�~�� ���'�'�C��&�&�t�H�~�6�6�6�6���0�������(�':� &��X��(���������������K� ��w�}�}�0�1�1�� q�t�<Q�7R�� q�VZ�[d�Ve�� q�� � �I�-n�"p��"p�� q�� q�� q��2�V���N�D��,�.��.���X��� �=�� +�� +�L��8�8�L�)�)�� ��&�t�H�~�t�L�7I�J�J�L�A�y� ���+�I�6�6�6�6���� �� �� ��$�$�T��q�6�6�&��&��&��������������������� �����"+�D�����s$����)B��*B-�E/�/ F3�90F.�.F3r���c����������������������d|v�r|d���������|d<���|d=�|�j���������r9|���������������������dt����������j����������������������i�������������t����������|d�������������n] �t ����������t����������|d���������������������|���������������������di�������������z���������������n"#�t����������$�r�t ����������d|z���������������Y�nw�xY�wt����������j ��������|�������������dS�)z� Print error and exit :param dict message: Dictionary with keys "result" as string and optional "context" as dict r����r����� timestampTr����z Error: %sN) r/���r���timer����printr����r>��rw���r����r����)r=���r����� error_codes��� r(���r����z"CloudlinuxSelector._error_and_exita��s������� ��w��� '�� 1�G�H����!��=�� -��N�N�K�����5�6�6�6��W�d�+�+�+�+� -��c�'�(�+�,�,�w�{�{�9�b�/I�/I�I�J�J�J�J���� -�� -�� -��k�G�+�,�,�,�,�,� -�����������s����9B��B-�,B-c������������������$�����t����������|��������������dS�)z� Print raw data. Function should be used in case if you want to print a json string as an output from other utilities N)rH��)rA��s��� r(���r����z"CloudlinuxSelector._print_raw_datas��s������� �d�����r*���r8��c������������������,����t����������|t����������������������r�|�����������������������������������}d|v�r#t����������|d���������t����������������������r|d���������}|���������������������d|�������������|d��������������������������������������������dk����r:d|d<���|�j��������d���������t����������k����r|�j�������������������������������������������rd|d<���nd|vrd|v�r|d���������|d<���|d=�|� ��������������������d t����������j ����������������������i�������������t����������||�j��������p|�������������d S�)z� Output data wrapper :param: `dict` data - data for output to stdout :param: `bool` force_json - always output json format rA��r�����okr8��r����r@���zbMultiPHP system default PHP version is alt-php. PHP Selector does not work and should be disabled!r9��rF��N) r����r�����copy� setdefault�lowerr0���r���r1����check_multiphp_system_defaultr��rG��r���r/���)r=���rA��� force_jsonr����s��� r(���r����zCloudlinuxSelector._print_data~��s�������d�D�!�!�� 4��9�9�;�;�D���~�~�*�T�&�\�4�"@�"@�~��F�|���O�O�H�f�-�-�-���H�~�#�#�%�%��-�-�!*��X���:�o�.�#�5�5�$�:L�:j�:j�:l�:l�5�'[�D��O�����%�%�(�d�*:�*:�!%�h���X���X���K�K��d�i�k�k�2�3�3�3���t�}�:� �;�;�;�;�;r*���c������������������R�����|�j���������d��������������������������������������������t����������k����S��Nr@���)r0���rO��r���r<���s��� r(���r����zCloudlinuxSelector._is_nodejs���� �������z�/�*�0�0�2�2�f�<�<r*���c������������������R�����|�j���������d��������������������������������������������t����������k����S�rS��)r0���rO��r���r<���s��� r(���r����zCloudlinuxSelector._is_python���rT��r*���c������������������t�����|�j���������d���������t����������t����������fv�r|�j���������d���������}t����������|������������S�dS�)Nr@���rP���F)r0���r���r����bool)r=���r����s��� r(����_is_interpreter_lock_neededz.CloudlinuxSelector._is_interpreter_lock_needed���s:�������:�o�&�6�6�*:�:�:���*�_�5�K���$�$�$��ur*���c��������������#��������K����|�������������������������������������rK|�j��������j��������}|���������������������|�j��������d���������������������5��dV���ddd�������������dS�#�1�swxY�w�Y���dS�dV���dS�)z{ Wrapper over contextmanager of PkgManager in order not to try acquire lock when it is not needed. rP���N)rX��r1���rZ����acquire_interpreter_lockr0���)r=����mgrs��� r(���r����z.CloudlinuxSelector._lock_interpreter_if_needed���s�������������+�+�-�-�� ���$�1�C��-�-�d�j��.I�J�J�� �� ����� �� �� �� �� �� �� �� �� �� �� �� ����� �� �� �� �� �� �� �E�E�E�E�Es����A�A�Ac������������������������|�j���������d���������}|�j���������d���������}|�j�����������������������������|������������}|�j�����������������������������|������������}||k����r|����������������������ddi�������������||fS�)z� Retrives NodeJS versions from arguments and converts them to major versions :return: Cortege (from_version, to_version) z--from-versionrP���r����z4--from-version and --new-version should be different)r0���r1����get_major_version_from_shortr����)r=����from_version� to_versions��� r(����_get_nj_versionsz#CloudlinuxSelector._get_nj_versions���sy������ ��z�"2�3���Z��0� ��)�F�F�|�T�T���'�D�D�Z�P�P� ��:�%�%�� � �(�,b�!c�d�d�d��Z�'�'r*���c����������������������|�������������������������������������\��}}t������������������������}|j��������}||vr|����������������������dd|id��������������|�j��������s+|������������������������������������r|����������������������ddi�������������||fS�)z� Checks arguments and environment before start group applications move :return: Cortege (from_version, to_version) zXCan't move NodeJS applications to Nodejs version %(version)s. No such version installed.r��r����r����z+Another background process already started.)r`��r����installed_versionsr����r6����&_is_background_process_already_running)r=���r^��r_���pkg_manager�installed_nj_versionss��� r(���� _check_environment_for_move_appsz3CloudlinuxSelector._check_environment_for_move_apps���s������� �$(�#8�#8�#:�#:� ��j� �l�l�� +� >���2�2�2�� � �u�%�z�2�"��"�� �� �� � ��*�� \�t�/Z�/Z�/\�/\�� \�� � �(�,Y�!Z�[�[�[��Z�'�'r*���c����������������������|�������������������������������������\��}}|�j��������sP|�j��������j���������d|�d|�d|�j���������d�}t����������j��������|dd��������������|����������������������t�����������������������dS�|�� ��������������������|������������\��}}|r|d k����rdS�|�� ��������������������|||�������������|����������������������|||�������������dS�) zM Change all applications all users versions :return: zD change-version-multiple --json --interpreter=nodejs --from-version=z --new-version=� z >/dev/null &Tz /bin/bash)�shell� executableNr���)rf��r6���r1���r����r7���r����r����r����r!����_get_all_apps_by_version�_write_pid_file�_move_apps_by_list)r=���r^��r_���command�users_apps_listr��s��� r(���r����z2CloudlinuxSelector._start_change_all_apps_versions���s������� �$(�#H�#H�#J�#J� ��j��*�� � ��)�E�E�E�|�|�|�U_�U_�U_�ae�aq�aq�aq�s�G��N�7�$�;�G�G�G�G����[�)�)�)��F��-1�,I�,I�,�,W�,W�)��)��� �"2�a�"7�"7��F����\�:�7G�H�H�H������=M�N�N�N�N�Nr*���c����������� �����������t����������|������������D�]|\��}}|D�]t}|�j��������j��������dddt����������d|d|d|g}t ����������j��������|������������}|������������������������������������|dz��}|����������������������|�������������t����������j ��������d��������������u�}d S�) a��� Move applications from list from one NodeJS version to another :type dict :param apps_dict: Application list. List example: {'cltest1': [u'modjsapp_root'], 'cltest2': [u'app2', u'main_app']} :param to_version: Move applications to this version :param total_apps_count: Total applications count for move :return: None r����r����r@���rU���rV���rP���r�������N) r���r1���r����r���r����r����r�����_change_pid_filerG���sleep) r=���� apps_dictr_��r��� user_name� user_app_listri����cmdr����s ��� r(���rm��z%CloudlinuxSelector._move_apps_by_list���s��������)2�)�(<�(<�� �� �$�I�}�)�� �� ���*�F��x�Yh�jp� �)�\�8�_�V`�c��$�*�3�/�/���#�#�%�%�%� �A�%� ��%�%�&6�7�7�7�� �2����� � �� r*���c�����������������������t����������t����������������������}|�j��������j�������������������������������������������}d}t����������|������������D�]�\��}} �|�j��������j�����������������������������|j��������|j��������|j ��������������������}t����������|������������D�]1\��}} | d���������|k����r ||���������� ��������������������|�������������|dz ��}�2�x#�t����������t����������t����������t����������f$�r�Y���w�xY�w||fS�)aB�� Retrives list of all NodeJS applications for all users, which uses supplied version of NodeJS :param from_version: Required NodeJS version :return: Cortege: (application_list, application_count). Example: ({'cltest1': [u'modjsapp_root'], 'cltest2': [u'app2', u'main_app']}, 3) r����nodejs_versionr���)r���r����r1���rZ����get_users_dictr����read_user_selector_config_json�pw_dir�pw_uid�pw_gid�appendr���� TypeErrorrw����AttributeError) r=���r^���users_apps_dict� user_infor��ru��� user_pw_entry� user_app_datari����app_infos ��� r(���rk��z+CloudlinuxSelector._get_all_apps_by_version ��s������&�d�+�+���&�3�B�B�D�D� ���(1�)�(<�(<�� �� �$�I�}� � $� 2� ?� ^� ^�!�(�!�(�!�(�!��!� ��+4�M�*B�*B��.��.�&�H�h�� 0�1�\�A�A�'� �2�9�9�(�C�C�C�(�A�-�(�� .�� �&�y�(�N�K�� �� �� ��� ������ 0�0�0s���� A1B<�<C�Cc����������������������� �t����������j��������t����������|�j��������d������������������������}|d���������|�_��������dS�#��Y�nxY�wdS�)z] Determine is background process already working :return: True|False r���r^��TF)�json�loadr)���r;���r8���)r=���rA��s��� r(���rc��z9CloudlinuxSelector._is_background_process_already_running-��sH������ ��9�U�4�#6��<�<�=�=�D�%)�.�%9�D�"��4�� ��D�����us����48��<c������������������������|�j���������d���������t����������k����rdS�|�j�����������������������������|������������}|�j�����������������������������|������������}|������������������������������������}|r ||�j��������k����rdS�dS�)z� Checks if NodeJS version blocked by background operation :param nj_version: NodeJS version to check :return: True - version is locked, False - not locked r@���FT)r0���r���r1����resolve_versionr]��rc��r8���)r=���� nj_version�is_bkg_process_presents��� r(���r��z;CloudlinuxSelector._is_version_locked_by_background_process;��sx��������:�o�&�&�0�0��5��'�7�7� �C�C� ��'�D�D�Z�P�P� �!%�!L�!L�!N�!N��!�� �j�D�4J�&J�&J��4��ur*���c������������������*����t����������j��������t����������j����������������������t ����������|������������t ����������|������������||t����������t ����������j����������������������������������d�t����������|�j��������d�������������������������t����������j ��������|�j��������d�������������dS�)a�� Creates pid file for background process move version from version to version :param from_version: Move from NJ version :param to_version: Move to NJ version :param total_apps_count: Total application count to move :return: None )�pidr^��r_��r��r��rG���w���N) r����dumpr2����getpidr�����floatrG��r)���r;����chmod)r=���r^��r_��r��s��� r(���rl��z"CloudlinuxSelector._write_pid_fileK��s�������� � ��9�;�;���-�-��j�/�/� 0�$4��$�)�+�+�&�&� �� ����$�c�*�*� ,�� ,�� ,�� ���$�e�,�,�,�,�,r*���c�����������������������t����������|�j��������d������������}t����������j��������|������������}|������������������������������������|S�)zc Reads pid file and returns it's content as dictionary :return: Dictionary r���)r)���r;���r���r����close�r=����f�pid_datas��� r(����_read_pid_filez!CloudlinuxSelector._read_pid_file^��s5������ � �$�%�s�+�+���9�Q�<�<�� ��� � � ��r*���c������������������T���� �|�������������������������������������}||d<���t����������t�����������������������\��}}t����������j��������|t����������|d�������������������������t ����������j��������||�j���������������������t ����������j ��������|�j��������d�������������dS�#�t����������t����������t����������f$�r�Y�dS�w�xY�w)z� Creates pid file for background process move version from version to version :param remaining_apps_count: Remaining application count to move :return: None r��)�dirr���r���N) r���r���r���r���r���r)���r2����renamer;���r����OSErrorrc���rw���)r=���r��r���rj����temp_file_names��� r(���rr��z#CloudlinuxSelector._change_pid_fileh��s������� ��*�*�,�,�H�/C�H�+�,� '�J� 7� 7� 7��A�~��I�h��n�c� :� :�;�;�;��I�n�d�&9�:�:�:��H�T�(�%�0�0�0�0�0����(�+�� �� �� ��6�6� ���s����BB��B'�&B'c������������������������ �t����������|�j��������d������������}t����������j��������|������������}|������������������������������������|d���������|d���������fS�#�t ����������t����������t����������f$�r�Y�dS�w�xY�w)z� Retrieves application counts from pid file :return: Cortege (remaining_apps_count, total_apps_count) If no background process started, returns None, None r���r��r��)NN)r)���r;���r���r���r���r���rc���rw���r���s��� r(���r��z0CloudlinuxSelector._get_apps_count_from_pid_filez��ss������ ��d�)�3�/�/�A��y��|�|�H� �G�G�I�I�I��2�3�X�>P�5Q�Q�Q����(�+�� �� �� ��:�:� ���s����AA��A*�)A*c�����������������������t������������������������}|���������������������|�������������} �t����������|������������sdS�t����������j�����������������������������|������������rdS�|���������������������t����������j��������j��������������������s t����������j�����������������������������||������������}t����������j��������� ��������������������|������������}|���������������������|t����������j��������z���������������rQt����������j��������� ��������������������|������������}t����������j�����������������������������|������������st����������|�������������d|fS�n2#�t����������t����������f$�r}dt����������|������������z��dfcY�d}~S�d}~ww�xY�wdS�)a��� Validates passenger log file name :param username: User's name :param log_filename: passenger log file name to validate :return: tuple: (message, log_filename). message: "OK" - filename is valid, any other string - invalid, error text log_filename: corrected log filename - simlink dereferencing, appends user's homedir for relative paths, etc )zAERROR: Passenger log filename should contain only english lettersN)zDERROR: Passenger log file should be a filename, not a directory nameNr����z%sN)z9ERROR: Passenger log file should be placed in user's homeN)r����get_homedirr���r2���r9���r<��� startswith�sepr:����realpath�dirnamer\���r���r���rc���r����)rh���r����rB���user_homedir�log_realpathr����excs��� r(���r����z4CloudlinuxSelector._passenger_log_filename_validator���sP�������g�g�����x�0�0�� )�"�<�0�0�� a�`�`��w�}�}�\�*�*�� d�c�c��*�*�2�7�;�7�7�� H�!�w�|�|�L�,�G�G���7�+�+�L�9�9�L��&�&�|�B�F�':�;�;�� *��'�/�/�,�7�7���w�~�~�g�.�.��%��G�$�$�$��\�)�)� *�� ���!�� )�� )�� )��#�c�(�(�?�D�(�(�(�(�(�(�(����� )����P�Ps)����D.��D.��CD.��.E�?E�E�EN)FF)r���)Fr8��)3�__name__� __module__�__qualname__r>���rS���rn���rq���rp����staticmethodr����r����r����r����r����r����r����r����r����r����r����r����r����r����r����r����r����r����r����r����r����r����r�����propertyr����r����rX��� contextlib�contextmanagerr����r`��rf��r����rm��rk��rc��r��rl��r���rr��r��r����r����r*���r(���r,���r,���?���s5������������� V�� V�� V������@�%*�$)�8��8��8��8�8%��%��%������@��S��S���\�S� E��E��E�N@��@��@�0,��,��,�7��7��7�rG��G��G�=��=��=�&��&��&�6!��!��!�FO��O��O�M��M��M�O��O��O�L��L��L�'��'��'�'��'��'� �� �� � �� �� � �� �� �2��2��2� 9��9��9�v�������$�������\��<��<��<��<�:��=��=���X�=���=��=���X�=����������������(��(��(�(��(��(�$O��O��O�8�����,1��1��1�@���������� -��-��-�&����������$�������Q��Q���\�Q��Q��Qr*���r,���)D� __future__r���r���r���r^���r����rG��rd����clcommon.cpapirs���r���r���r2���r����r�����typingr����future.utilsr����clcommonr����clcommon.clexceptionr ����clcommon.mail_helperr ����clcommon.clfuncr���� cllicenser����clselectr ����clselect.utilsr���r���r����clselect.baseclselectr���r���� cli_utilsr���r����clselect.clselectnodejsr����"clselect.clselectnodejs.pkgmanagerr���� clselector.clpassenger_detectlibr����collectionsr����email.mime.textr����tempfiler����cl_selector_arg_parser���r���r���r����selectorlibr ���r!���r"����clselect.clselectexceptr����r]���r)����objectr,���r����r*���r(����<module>r������s������&��%��%��%��%��%��&��&��&��&��&��&������������������� � � � ������������������������������������� � � � ������������������������������"��"��"��"��"��"��������������3��3��3��3��3��3��+��+��+��+��+��+��+��+��+��+��+��+��*��*��*��*��*��*�� �� �� �� �� �� ��F��F��F��F��F��F��F��F��F��F��P��P��P��P��P��P��P��P��6��6��6��6��6��6��6��6��.��.��.��.��.��.��9��9��9��9��9��9��B��B��B��B��B��B��#��#��#��#��#��#��$��$��$��$��$��$��������������6��6��6��6��6��6��6��6��6��6��A��A��A��A��A��A��K��K��K��K��K��K��K��K��K��K��H��H��H��H��H��H����!��!��!�d Q��d Q��d Q��d Q��d Q���d Q��d Q��d Q��d Q��d Qr*���