Skip to content

Instantly share code, notes, and snippets.

@darkmastermindz
Last active January 9, 2023 18:44
Show Gist options
  • Save darkmastermindz/626499ebaa4abf672dce28716a5b8835 to your computer and use it in GitHub Desktop.
Save darkmastermindz/626499ebaa4abf672dce28716a5b8835 to your computer and use it in GitHub Desktop.
<html doctype="html5">
<body>
<main class="relative h-full w-full transition-width flex flex-col overflow-hidden items-stretch flex-1"><div class="flex-1 overflow-hidden"><div class="h-full overflow-y-auto"><div class="flex flex-col items-center text-sm h-full dark:bg-gray-800"><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">Assume I am a senior software engineer</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>As a senior software engineer, you would be expected to have a strong foundation in computer science and a deep understanding of software development principles. You would be responsible for designing, implementing, and maintaining software systems, as well as leading the development efforts of a team. You might also be involved in mentoring junior engineers, conducting code reviews, and collaborating with other teams to ensure that the software you are developing is of high quality and meets the needs of the business. In order to be successful as a senior software engineer, you would need to have strong problem-solving skills, excellent communication skills, and the ability to work well in a team environment.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">Assume you are writing me CLI tool code to solve enterprise issues with developer experience engineering implemented with Typer in Python 3.11.1</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To write a CLI tool using Typer and Python 3.11.1 to solve enterprise issues with developer experience engineering, you would need to follow the steps below:</p><ol><li>Install Typer and any other required dependencies:</li></ol><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs">pip install typer
</code></div></div></pre><ol start="2"><li>Define the command-line interface (CLI) by creating a Python script and importing Typer. You can then use Typer's decorators and functions to define the arguments and options that your CLI will accept. For example:</li></ol><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> typer
app = typer.Typer()
<span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">greet</span>(<span class="hljs-params">name: <span class="hljs-built_in">str</span></span>):
typer.echo(<span class="hljs-string">f"Hello, <span class="hljs-subst">{name}</span>!"</span>)
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
app()
</code></div></div></pre><ol start="3"><li><p>Implement the logic of your CLI tool. This might involve calling APIs, accessing databases, or performing other operations to solve the enterprise issues you are targeting.</p></li><li><p>Test your CLI tool to ensure that it is working as expected. You can use a combination of unit tests and manual testing to verify that the tool is functioning correctly.</p></li><li><p>Deploy your CLI tool, making it available for use by developers. You might consider distributing it via a package manager such as PyPI or making it available for download from a website.</p></li><li><p>Document your CLI tool, including any installation instructions, usage examples, and API documentation. This will help developers understand how to use your tool and get the most out of it.</p></li></ol><p>By following these steps, you should be able to create a functional and user-friendly CLI tool using Typer and Python 3.11.1.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">assume requirements for this CLI is interactive </div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>If the requirements for your CLI specify that it should be interactive, you can use Typer's prompt functions to ask the user for input. For example, you could use the <code>typer.prompt</code> function to request input from the user and store the result in a variable. You can then use this variable in your CLI logic as needed.</p><p>Here's an example of how you might use the <code>typer.prompt</code> function in your CLI:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> typer
app = typer.Typer()
<span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">greet</span>():
name = typer.prompt(<span class="hljs-string">"What is your name?"</span>)
typer.echo(<span class="hljs-string">f"Hello, <span class="hljs-subst">{name}</span>!"</span>)
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
app()
</code></div></div></pre><p>In this example, the <code>greet</code> command will prompt the user to enter their name, and then it will greet the user by name.</p><p>You can also use other prompt functions, such as <code>typer.prompt_pass</code> (for requesting a password) or <code>typer.prompt_choice</code> (for presenting the user with a list of choices and requesting that they select one). These functions can be useful for building more interactive CLIs.</p><p>Keep in mind that interactive CLIs can be more difficult to test and debug, as they rely on user input. You may need to spend more time testing and debugging your interactive CLI to ensure that it is working correctly.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">Assume the need to write path manager script in python with classmethods for Windows with WinReg, Mac and Linux with Bash and ZSH implementations in separate scripts</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To write a path manager script in Python with class methods for Windows, Mac, and Linux, you can follow the steps below:</p><ol><li>Define a base class for your path manager that includes class methods for common operations such as adding and removing paths from the system path. For example:</li></ol><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">PathManager</span>:
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">raise</span> NotImplementedError
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">raise</span> NotImplementedError
</code></div></div></pre><ol start="2"><li>Implement subclasses for each operating system. These subclasses should override the class methods defined in the base class and provide the specific implementation for that operating system. For example, here is how you might implement the Windows subclass using the <code>winreg</code> module:</li></ol><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> winreg
<span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Open the HKEY_CURRENT_USER\Environment key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the current value of the PATH environment variable</span>
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Append the new path to the current value</span>
new_path = current_path + <span class="hljs-string">";"</span> + path
<span class="hljs-comment"># Set the new value of the PATH environment variable</span>
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, new_path)
</code></div></div></pre><ol start="3"><li><p>Implement the Mac and Linux subclasses using the appropriate tools for those operating systems. For example, you might use the <code>subprocess</code> module to run Bash or ZSH commands to modify the system path.</p></li><li><p>In your main script, you can use the <code>platform</code> module to determine the current operating system and instantiate the appropriate subclass of <code>PathManager</code>. For example:</p></li></ol><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> platform
<span class="hljs-keyword">if</span> platform.system() == <span class="hljs-string">"Windows"</span>:
path_manager = WindowsPathManager()
<span class="hljs-keyword">elif</span> platform.system() == <span class="hljs-string">"Darwin"</span>:
path_manager = MacPathManager()
<span class="hljs-keyword">else</span>:
path_manager = LinuxPathManager()
</code></div></div></pre><p>With this approach, you can use the same API for managing the system path on different operating systems, while still providing platform-specific implementations for each operating system.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue building your path manager script, you can use the class methods of the appropriate subclass to perform operations on the system path. For example, you might create a command-line interface (CLI) using a library like Typer that allows the user to add or remove paths from the system path.</p><p>Here's an example of how you might do this using Typer:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> typer
app = typer.Typer()
<span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add</span>(<span class="hljs-params">path: <span class="hljs-built_in">str</span></span>):
path_manager.add_path(path)
typer.echo(<span class="hljs-string">f"Added <span class="hljs-subst">{path}</span> to the system path"</span>)
<span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove</span>(<span class="hljs-params">path: <span class="hljs-built_in">str</span></span>):
path_manager.remove_path(path)
typer.echo(<span class="hljs-string">f"Removed <span class="hljs-subst">{path}</span> from the system path"</span>)
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
app()
</code></div></div></pre><p>In this example, the <code>add</code> and <code>remove</code> commands allow the user to add or remove a path from the system path, respectively.</p><p>You can also consider adding additional functionality to your path manager script, such as the ability to list the current paths in the system path, or to search for a specific path in the system path.</p><p>Remember to test your path manager script thoroughly to ensure that it is working correctly on all supported operating systems. You may also want to consider creating documentation for your script, including installation instructions and examples of how to use it.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">Please continue in adding additional functionality to your path manager script, such as the ability to list the current paths in the system path, or to search for a specific path in the system path.</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To add additional functionality to your path manager script, such as the ability to list the current paths in the system path or search for a specific path, you can add additional class methods to your <code>PathManager</code> base class and override them in your operating system-specific subclasses.</p><p>For example, you might add a <code>get_paths</code> class method that returns a list of the current paths in the system path:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">PathManager</span>:
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">raise</span> NotImplementedError
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">raise</span> NotImplementedError
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-keyword">raise</span> NotImplementedError
</code></div></div></pre><p>You can then override this method in your operating system-specific subclasses to provide the appropriate implementation for each operating system. For example, here is how you might implement the <code>get_paths</code> method for the Windows subclass using the <code>winreg</code> module:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> winreg
<span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Open the HKEY_CURRENT_USER\Environment key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the current value of the PATH environment variable</span>
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Append the new path to the current value</span>
new_path = current_path + <span class="hljs-string">";"</span> + path
<span class="hljs-comment"># Set the new value of the PATH environment variable</span>
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, new_path)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Open the HKEY_CURRENT_USER\Environment key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the current value of the PATH environment variable</span>
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Remove the path from the current value</span>
new_path = current_path.replace(path, <span class="hljs-string">""</span>)
<span class="hljs-comment"># Set the new value of the PATH environment variable</span>
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, new_path)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Open the HKEY_CURRENT_USER\Environment key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_READ) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the current value of the PATH environment variable</span>
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Split the path into a list of individual paths</span>
paths = current_path.split(<span class="hljs-string">";"</span>)
<span class="hljs-keyword">return</span> paths
</code></div></div></pre><p>You can then use the <code>get_paths</code> method in your CLI to list the current paths in</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue adding functionality to your path manager script, you can also add a search feature that allows the user to search for a specific path in the system path.</p><p>To do this, you can add a new class method to your <code>PathManager</code> base class and override it in your operating system-specific subclasses. For example:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">PathManager</span>:
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">raise</span> NotImplementedError
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">raise</span> NotImplementedError
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-keyword">raise</span> NotImplementedError
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-keyword">raise</span> NotImplementedError
</code></div></div></pre><p>You can then override the <code>search_path</code> method in your operating system-specific subclasses to provide the appropriate implementation for each operating system. For example, here is how you might implement the <code>search_path</code> method for the Windows subclass using the <code>winreg</code> module:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> winreg
<span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Open the HKEY_CURRENT_USER\Environment key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the current value of the PATH environment variable</span>
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Append the new path to the current value</span>
new_path = current_path + <span class="hljs-string">";"</span> + path
<span class="hljs-comment"># Set the new value of the PATH environment variable</span>
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, new_path)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Open the HKEY_CURRENT_USER\Environment key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the current value of the PATH environment variable</span>
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Remove the path from the current value</span>
new_path = current_path.replace(path, <span class="hljs-string">""</span>)
<span class="hljs-comment"># Set the new value of the PATH environment variable</span>
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, new_path)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Open the HKEY_CURRENT_USER\Environment key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_READ) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the current value of the PATH environment variable</span>
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Split the path into a list of individual paths</span>
paths = current_path.split(<span class="hljs-string">";"</span>)
<span class="hljs-keyword">return</span> paths
<span class="hljs-meta"> @class</span>
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue implementing the <code>search_path</code> method, you can iterate over the list of paths returned by the <code>get_paths</code> method and check if the search path is a prefix of any of the paths. If it is, you can return the matching path. If no matching path is found, you can return <code>None</code>.</p><p>Here's an example of how you might implement the <code>search_path</code> method for the Windows subclass:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> winreg
<span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Open the HKEY_CURRENT_USER\Environment key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the current value of the PATH environment variable</span>
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Append the new path to the current value</span>
new_path = current_path + <span class="hljs-string">";"</span> + path
<span class="hljs-comment"># Set the new value of the PATH environment variable</span>
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, new_path)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Open the HKEY_CURRENT_USER\Environment key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the current value of the PATH environment variable</span>
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Remove the path from the current value</span>
new_path = current_path.replace(path, <span class="hljs-string">""</span>)
<span class="hljs-comment"># Set the new value of the PATH environment variable</span>
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, new_path)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Open the HKEY_CURRENT_USER\Environment key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_READ) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the current value of the PATH environment variable</span>
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Split the path into a list of individual paths</span>
paths = current_path.split(<span class="hljs-string">";"</span>)
<span class="hljs-keyword">return</span> paths
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search_path</span>(<span class="hljs-params">cls, search_path: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment">#</span>
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue from last class method</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue implementing the <code>search_path</code> method, you can iterate over the list of paths returned by the <code>get_paths</code> method and check if the search path is a prefix of any of the paths. If it is, you can return the matching path. If no matching path is found, you can return <code>None</code>.</p><p>Here's an example of how you might implement the <code>search_path</code> method for the Windows subclass:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> winreg
<span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Open the HKEY_CURRENT_USER\Environment key</span>
<span class="hljs-keyword">with</span>
</code></div></div></pre></div></div><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>I'm sorry, it looks like my previous response was incomplete. Here is the full implementation of the <code>search_path</code> method for the Windows subclass:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> winreg
<span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Open the HKEY_CURRENT_USER\Environment key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the current value of the PATH environment variable</span>
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Append the new path to the current value</span>
new_path = current_path + <span class="hljs-string">";"</span> + path
<span class="hljs-comment"># Set the new value of the PATH environment variable</span>
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, new_path)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Open the HKEY_CURRENT_USER\Environment key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the current value of the PATH environment variable</span>
current_path, _ = winreg.QueryValueEx
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">show me the search_path method</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>Here is the <code>search_path</code> method for the Windows subclass of <code>PathManager</code>:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search_path</span>(<span class="hljs-params">cls, search_path: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the list of paths</span>
paths = cls.get_paths()
<span class="hljs-comment"># Iterate over the paths</span>
<span class="hljs-keyword">for</span> path <span class="hljs-keyword">in</span> paths:
<span class="hljs-comment"># Check if the search path is a prefix of the current path</span>
<span class="hljs-keyword">if</span> path.startswith(search_path):
<span class="hljs-comment"># Return the matching path</span>
<span class="hljs-keyword">return</span> path
<span class="hljs-comment"># If no matching path is found, return None</span>
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
</code></div></div></pre><p>This method first gets the list of paths using the <code>get_paths</code> method, and then iterates over the paths. For each path, it checks if the search path is a prefix of the current path using the <code>startswith</code> method. If it is, it returns the matching path. If no matching path is found, it returns <code>None</code>.</p><p>You can use this method in your CLI to allow the user to search for a specific path in the system path. For example, you might add a new command to your CLI like this:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search</span>(<span class="hljs-params">path: <span class="hljs-built_in">str</span></span>):
result = path_manager.search_path(path)
<span class="hljs-keyword">if</span> result:
typer.echo
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">add a new script overriding PathManager for bash and zsh implementations for Mac and Linux</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To add a new script that overrides the <code>PathManager</code> class for Bash and Zsh implementations on Mac and Linux, you can create a new subclass of <code>PathManager</code> and override the necessary class methods.</p><p>For example, here is how you might implement the <code>add_path</code>, <code>remove_path</code>, <code>get_paths</code>, and <code>search_path</code> methods for the Bash and Zsh implementations on Mac and Linux:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">BashZshPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Append the new path to the end of the .bash_profile or .zshrc file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bash_profile"</span>), <span class="hljs-string">"a"</span>) <span class="hljs-keyword">as</span> f:
f.write(<span class="hljs-string">f"\nexport PATH=\"$PATH:<span class="hljs-subst">{path}</span>\""</span>)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Remove the path from the .bash_profile or .zshrc file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bash_profile"</span>), <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
lines = f.readlines()
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bash_profile"</span>), <span class="hljs-string">"w"</span>) <span class="hljs-keyword">as</span> f:
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> line.startswith(<span class="hljs-string">f"export PATH=\"$PATH:<span class="hljs-subst">{path}</span>\""</span>):
f.write(line)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Read the .bash_profile or .zshrc file and extract the paths from the PATH environment variable</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bash_profile"</span>), <span class="hljs-string">"r
</span></code></div></div></pre></div></div><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>I apologize for the incomplete response. Here is the full implementation of the <code>get_paths</code> and <code>search_path</code> methods for the Bash and Zsh implementations on Mac and Linux:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">BashZshPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Append the new path to the end of the .bash_profile or .zshrc file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bash_profile"</span>), <span class="hljs-string">"a"</span>) <span class="hljs-keyword">as</span> f:
f.write(<span class="hljs-string">f"\nexport PATH=\"$PATH:<span class="hljs-subst">{path}</span>\""</span>)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Remove the path from the .bash_profile or .zshrc file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bash_profile"</span>), <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
lines = f.readlines()
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bash_profile"</span>), <span class="hljs-string">"w"</span>) <span class="hljs-keyword">as</span> f:
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> line.startswith(<span class="hljs-string">f"export PATH=\"$PATH:<span class="hljs-subst">{path}</span>\""</span>):
f.write(line)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Read the .bash_profile or .zshrc file and extract the paths from the PATH environment variable</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bash_profile"</span>), <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
lines = f.readlines()
paths = []
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:
<span class="hljs-keyword">if</span> line.startswith(<span class="hljs-string">"export PATH="</span>):
_, path = line.split(<span class="hljs-string">"="</span>)
paths = path.strip().split(<span class="hljs-string">":"</span>)[<span class="hljs-number">1</span>:]
<span class="hljs-keyword">return</span> paths
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search_path</span>(<span class="hljs-params">cls, search_path: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the list of paths</span>
paths = cls.get
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">split this script up into two scripts for each operating system and shell type</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To split the script for Bash and Zsh implementations on Mac and Linux into two separate scripts, one for each operating system and shell type, you can create two new subclasses of <code>PathManager</code> and override the necessary class methods in each subclass.</p><p>Here is an example of how you might implement the <code>add_path</code>, <code>remove_path</code>, <code>get_paths</code>, and <code>search_path</code> methods for the Bash implementation on Mac:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">MacBashPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Append the new path to the end of the .bash_profile file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bash_profile"</span>), <span class="hljs-string">"a"</span>) <span class="hljs-keyword">as</span> f:
f.write(<span class="hljs-string">f"\nexport PATH=\"$PATH:<span class="hljs-subst">{path}</span>\""</span>)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Remove the path from the .bash_profile file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bash_profile"</span>), <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
lines = f.readlines()
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bash_profile"</span>), <span class="hljs-string">"w"</span>) <span class="hljs-keyword">as</span> f:
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> line.startswith(<span class="hljs-string">f"export PATH=\"$PATH:<span class="hljs-subst">{path}</span>\""</span>):
f.write(line)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Read the .bash_profile file and extract the paths from the PATH environment variable</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bash_profile"</span>), <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
lines = f.readlines()
paths = []
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:
<span class="hljs-keyword">if</span> line.startswith(<span class="hljs-string">"export PATH="</span>):
_, path = line.split(<span class="hljs-string">"="</span>)
paths = path.strip().split(<span class="hljs-string">":"</span>)[<span class="hljs-number">1</span>:]
<span class="hljs-keyword">return</span> paths
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search_path</span>(<span class="hljs-params">cls, search_path: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the list of paths</span>
paths = cls.get_paths()
<span class="hljs-comment"># Iterate over the paths</span>
<span class="hljs-keyword">for</span> path <span class="hljs-keyword">in</span> paths:
<span class="hljs-comment"># Check if the search path is a prefix of the current path</span>
<span class="hljs-keyword">if</span> path.startswith(search_path):
<span class="hljs-comment"># Return the matching path</span>
<span class="hljs-keyword">return</span> path
<span class="hljs-comment"># If no matching path is found, return None</span>
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
</code></div></div></pre><p>And here is an example of how you might implement the <code>add_path</code>, <code>remove_path</code>, <code>get_paths</code>, and <code>search_path</code> methods for the Zsh implementation on Linux:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">LinuxZshPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Append the new path to the end of the .zshrc file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.zshrc"</span>), <span class="hljs-string">"a"</span>) <span class="hljs-keyword">as</span> f:
f.write(<span class="hljs-string">f"\nexport PATH=\"$PATH:<span class="hljs-subst">{path}</span>\""</span>)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Remove the path from</span>
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue implementing the <code>get_paths</code> and <code>search_path</code> methods for the Zsh implementation on Linux, you can use the following code:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">LinuxZshPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Append the new path to the end of the .zshrc file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.zshrc"</span>), <span class="hljs-string">"a"</span>) <span class="hljs-keyword">as</span> f:
f.write(<span class="hljs-string">f"\nexport PATH=\"$PATH:<span class="hljs-subst">{path}</span>\""</span>)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Remove the path from the .zshrc file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.zshrc"</span>), <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
lines = f.readlines()
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.zshrc"</span>), <span class="hljs-string">"w"</span>) <span class="hljs-keyword">as</span> f:
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> line.startswith(<span class="hljs-string">f"export PATH=\"$PATH:<span class="hljs-subst">{path}</span>\""</span>):
f.write(line)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Read the .zshrc file and extract the paths from the PATH environment variable</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.zshrc"</span>), <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
lines = f.readlines()
paths = []
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:
<span class="hljs-keyword">if</span> line.startswith(<span class="hljs-string">"export PATH="</span>):
_, path = line.split(<span class="hljs-string">"="</span>)
paths = path.strip().split(<span class="hljs-string">":"</span>)[<span class="hljs-number">1</span>:]
<span class="hljs-keyword">return</span> paths
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search_path</span>(<span class="hljs-params">cls, search_path: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the list of paths</span>
paths = cls.get_paths()
<span class="hljs-comment"># Iterate over the paths</span>
<span class="hljs-keyword">for</span> path <span class="hljs-keyword">in</span> paths:
<span class="hljs-comment"># Check if the search path is a prefix of the current path</span>
<span class="hljs-keyword">if</span> path.startswith(search_path):
<span class="hljs-comment"># Return the matching path</span>
<span class="hljs-keyword">return</span> path
<span class="hljs-comment"># If no matching path is found, return None</span>
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
</code></div></div></pre><p>You can then use these subclasses in your CLI to allow the user to add, remove, list, and search for paths in the system path on Mac and Linux.</p><p>For example, you might add a new command to your CLI like this:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search</span>(<span class="hljs-params">path: <span class="hljs-built_in">str</span>, os: <span class="hljs-built_in">str</span>, shell: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> os == <span class="hljs-string">"mac"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"bash"</span>:
path_manager = MacBashPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"linux"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"zsh"</span>:
path_manager = LinuxZshPathManager
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">"Unsupported operating system and/or shell"</span>)
<span class="hljs-keyword">return</span>
result = path_manager.search_path(path)
<span class="hljs-keyword">if</span> result:
typer.echo(<span class="hljs-string">f"Found path: <span class="hljs-subst">{result}</span>"</span>)
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">"Path not found"</span>)
</code></div></div></pre><p>This command allows the user to specify the operating system and shell type as arguments, and then uses the appropriate subclass of <code>PathManager</code> to search for the specified path</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">write the typer implementations to use add_path, remove_path, get_paths, and search_path with interactive menus</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To use the <code>add_path</code>, <code>remove_path</code>, <code>get_paths</code>, and <code>search_path</code> methods with interactive menus in your CLI implemented with Typer, you can use the <code>typer.prompt</code> function to ask the user for input and the <code>typer.echo</code> function to print the results.</p><p>Here is an example of how you might implement the <code>add_path</code> command with an interactive menu:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add</span>(<span class="hljs-params">os: <span class="hljs-built_in">str</span>, shell: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> os == <span class="hljs-string">"windows"</span>:
path_manager = WindowsPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"mac"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"bash"</span>:
path_manager = MacBashPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"linux"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"zsh"</span>:
path_manager = LinuxZshPathManager
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">"Unsupported operating system and/or shell"</span>)
<span class="hljs-keyword">return</span>
path = typer.prompt(<span class="hljs-string">"Enter the path to add:"</span>)
path_manager.add_path(path)
typer.echo(<span class="hljs-string">f"Successfully added path: <span class="hljs-subst">{path}</span>"</span>)
</code></div></div></pre><p>This command prompts the user to enter the path to add, and then calls the <code>add_path</code> method of the appropriate subclass of <code>PathManager</code> to add the path to the system path.</p><p>You can use similar approaches to implement the <code>remove_path</code>, <code>get_paths</code>, and <code>search_path</code> commands with interactive menus.</p><p>For example, here is how you might implement the <code>remove_path</code> command with an interactive menu:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove</span>(<span class="hljs-params">os: <span class="hljs-built_in">str</span>, shell: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> os == <span class="hljs-string">"windows"</span>:
path_manager = WindowsPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"mac"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"bash"</span>:
path_manager = MacBashPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"linux"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"zsh"</span>:
path_manager = LinuxZshPathManager
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">"Unsupported operating system and/or shell"</span>)
<span class="hljs-keyword">return</span>
path = typer.prompt(<span class="hljs-string">"Enter the path to remove:"</span>)
path_manager.remove_path(path)
typer.echo(<span class="hljs-string">f"Successfully removed path: <span class="hljs-subst">{path}</span>"</span>)
</code></div></div></pre><p>And here is how you might implement the <code>get_paths</code> command with an interactive menu:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">list</span>(<span class="hljs-params">os: <span class="hljs-built_in">str</span>, shell: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> os == <span class="hljs-string">"windows"</span>:
path_manager = WindowsPathManager
el
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue implementing the <code>get_paths</code> command with an interactive menu, you can use the following code:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">list</span>(<span class="hljs-params">os: <span class="hljs-built_in">str</span>, shell: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> os == <span class="hljs-string">"windows"</span>:
path_manager = WindowsPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"mac"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"bash"</span>:
path_manager = MacBashPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"linux"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"zsh"</span>:
path_manager = LinuxZshPathManager
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">"Unsupported operating system and/or shell"</span>)
<span class="hljs-keyword">return</span>
paths = path_manager.get_paths()
typer.echo(<span class="hljs-string">"Current paths:"</span>)
<span class="hljs-keyword">for</span> path <span class="hljs-keyword">in</span> paths:
typer.echo(path)
</code></div></div></pre><p>This command calls the <code>get_paths</code> method of the appropriate subclass of <code>PathManager</code> to get the list of paths in the system path, and then prints each path to the console using the <code>typer.echo</code> function.</p><p>You can use a similar approach to implement the <code>search_path</code> command with an interactive menu.</p><p>For example, here is how you might implement the <code>search_path</code> command with an interactive menu:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search</span>(<span class="hljs-params">os: <span class="hljs-built_in">str</span>, shell: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> os == <span class="hljs-string">"windows"</span>:
path_manager = WindowsPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"mac"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"bash"</span>:
path_manager = MacBashPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"linux"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"zsh"</span>:
path_manager = LinuxZshPathManager
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">"Unsupported operating system and/or shell"</span>)
<span class="hljs-keyword">return</span>
path = typer.prompt(<span class="hljs-string">"Enter the path to search for:"</span>)
result = path_manager.search_path(path)
<span class="hljs-keyword">if</span> result:
typer.echo(<span class="hljs-string">f"Found path: <span class="hljs-subst">{result}</span>"</span>)
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">"Path not found"</span>)
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue implementing the CLI tool with Typer, you can add additional functionality as needed. Some ideas for additional functionality you might consider include:</p><ul><li>Adding a command to clear the entire system path</li><li>Adding a command to set the system path to a specific list of paths</li><li>Adding a command to import paths from a file</li><li>Adding a command to export the current list of paths to a file</li><li>Adding a command to check if a specific path is in the system path</li><li>Adding support for additional operating systems and shell types</li></ul><p>Here is an example of how you might implement a command to clear the entire system path:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">clear</span>(<span class="hljs-params">os: <span class="hljs-built_in">str</span>, shell: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> os == <span class="hljs-string">"windows"</span>:
path_manager = WindowsPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"mac"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"bash"</span>:
path_manager = MacBashPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"linux"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"zsh"</span>:
path_manager = LinuxZshPathManager
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">"Unsupported operating system and/or shell"</span>)
<span class="hljs-keyword">return</span>
path_manager.clear_paths()
typer.echo(<span class="hljs-string">"Successfully cleared system path"</span>)
</code></div></div></pre><p>This command calls the <code>clear_paths</code> method of the appropriate subclass of <code>PathManager</code> to clear the entire system path.</p><p>You can use similar approaches to implement the other functionality described above.</p><p>For example, here is how you might implement a command to set the system path to a specific list of paths:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">set</span>(<span class="hljs-params">paths: <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>], os: <span class="hljs-built_in">str</span>, shell: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> os == <span class="hljs-string">"windows"</span>:
path_manager = WindowsPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"mac"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"bash"</span>:
path_manager = MacBashPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"linux"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"zsh"</span>:
path_manager = LinuxZshPathManager
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">"Unsupported operating system and/or shell"</span>)
<span class="hljs-keyword">return</span>
path_manager.set_paths(paths)
typer.echo(<span class="hljs-string">"Successfully set system path"</span>)
</code></div></div></pre><p>This command calls the <code>set_paths</code> method of the appropriate subclass of <code>PathManager</code> to set the system path to the specified list of paths.</p><p>I hope this helps! Let me know if you have any other questions or if you need further assistance.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">show me
Adding a command to import paths from a file
Adding a command to export the current list of paths to a file
Adding a command to check if a specific path is in the system path
Adding support for additional operating systems and shell typesAdding a command to import paths from a file
Adding a command to export the current list of paths to a file
Adding a command to check if a specific path is in the system path
Adding support for additional operating systems and shell types</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>Here is an example of how you might implement a command to import paths from a file:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">import_paths</span>(<span class="hljs-params">filename: <span class="hljs-built_in">str</span>, os: <span class="hljs-built_in">str</span>, shell: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> os == <span class="hljs-string">"windows"</span>:
path_manager = WindowsPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"mac"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"bash"</span>:
path_manager = MacBashPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"linux"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"zsh"</span>:
path_manager = LinuxZshPathManager
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">"Unsupported operating system and/or shell"</span>)
<span class="hljs-keyword">return</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(filename, <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
paths = [line.strip() <span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> f]
path_manager.add_paths(paths)
typer.echo(<span class="hljs-string">f"Successfully imported <span class="hljs-subst">{<span class="hljs-built_in">len</span>(paths)}</span> paths from <span class="hljs-subst">{filename}</span>"</span>)
</code></div></div></pre><p>This command opens the specified file and reads in a list of paths, one path per line. It then calls the <code>add_paths</code> method of the appropriate subclass of <code>PathManager</code> to add all of the imported paths to the system path.</p><p>Here is an example of how you might implement a command to export the current list of paths to a file:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">export_paths</span>(<span class="hljs-params">filename: <span class="hljs-built_in">str</span>, os: <span class="hljs-built_in">str</span>, shell: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> os == <span class="hljs-string">"windows"</span>:
path_manager = WindowsPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"mac"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"bash"</span>:
path_manager = MacBashPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"linux"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"zsh"</span>:
path_manager = LinuxZshPathManager
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">"Unsupported operating system and/or shell"</span>)
<span class="hljs-keyword">return</span>
paths = path_manager.get_paths()
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(filename, <span class="hljs-string">"w"</span>) <span class="hljs-keyword">as</span> f:
<span class="hljs-keyword">for</span> path <span class="hljs-keyword">in</span> paths:
f.write(<span class="hljs-string">f"<span class="hljs-subst">{path}</span>\n"</span>)
typer.echo(<span class="hljs-string">f"Successfully exported <span class="hljs-subst">{<span class="hljs-built_in">len</span>(paths)}</span> paths to <span class="hljs-subst">{filename}</span>"</span>)
</code></div></div></pre><p>This command calls the `get</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><textarea class="m-0 resize-none border-0 bg-transparent p-0 focus:ring-0 focus-visible:ring-0" style="height: 24px; overflow-y: hidden;">continue</textarea><div class="text-center mt-2 flex justify-center"><button class="btn flex justify-center gap-2 btn-primary mr-2">Save &amp; Submit</button><button class="btn flex justify-center gap-2 btn-neutral">Cancel</button></div></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue implementing the CLI tool with additional functionality, you can add a command to check if a specific path is in the system path. Here is an example of how you might implement this command:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">contains</span>(<span class="hljs-params">path: <span class="hljs-built_in">str</span>, os: <span class="hljs-built_in">str</span>, shell: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> os == <span class="hljs-string">"windows"</span>:
path_manager = WindowsPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"mac"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"bash"</span>:
path_manager = MacBashPathManager
<span class="hljs-keyword">elif</span> os == <span class="hljs-string">"linux"</span> <span class="hljs-keyword">and</span> shell == <span class="hljs-string">"zsh"</span>:
path_manager = LinuxZshPathManager
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">"Unsupported operating system and/or shell"</span>)
<span class="hljs-keyword">return</span>
<span class="hljs-keyword">if</span> path_manager.contains_path(path):
typer.echo(<span class="hljs-string">f"System path contains <span class="hljs-subst">{path}</span>"</span>)
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">f"System path does not contain <span class="hljs-subst">{path}</span>"</span>)
</code></div></div></pre><p>This command calls the <code>contains_path</code> method of the appropriate subclass of <code>PathManager</code> to check if the specified path is in the system path.</p><p>To add support for additional operating systems and shell types, you can create additional subclasses of <code>PathManager</code> for each combination of operating system and shell type you want to support.</p><p>For example, here is how you might implement a subclass of <code>PathManager</code> for the Bash shell on Linux:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">LinuxBashPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Append the new path to the end of the .bashrc file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bashrc"</span>), <span class="hljs-string">"a"</span>) <span class="hljs-keyword">as</span> f:
f.write(<span class="hljs-string">f"\nexport PATH=\"$PATH:<span class="hljs-subst">{path}</span>\""</span>)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Remove the path from the .bashrc file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bashrc"</span>), <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
lines = f.readlines()
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bashrc"</span>), <span class="hljs-string">"w"</span>) <span class="hljs-keyword">as</span> f:
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> line.startswith(<span class="hljs-string">f"export PATH=\"$PATH:<span class="hljs-subst">{path}</span>\""</span>):
f.write(line)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Read the .bashrc file and extract the paths from the PATH environment variable</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bashrc"</span>), <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
lines = f.readlines()
paths = []
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:
<span class="hljs-keyword">if</span> line.startswith(<span class="hljs-string">"export PATH="</span>):
_, path = line.split(<span class="hljs-string">"="</span>)
paths = path.strip().split(<span class="hljs-string">":"</span>)[<span class="hljs-number">1</span>:]
<span class="hljs-keyword">return</span> paths
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search_path</span>(<span class="hljs-params">cls, search_path: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the list of paths</span>
paths = cls.get_paths()
<span class="hljs-comment"># Iterate over the paths</span>
<span class="hljs-keyword">for</span> path <span class="hljs-keyword">in</span> paths:
<span class="hljs-comment"># Check if</span>
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue implementing the CLI tool with additional functionality, you can add a command to check if a specific path is in the system path. Here is an example of how you might implement the <code>search_path</code> method for the <code>LinuxBashPathManager</code> subclass:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search_path</span>(<span class="hljs-params">cls, search_path: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the list of paths</span>
paths = cls.get_paths()
<span class="hljs-comment"># Iterate over the paths</span>
<span class="hljs-keyword">for</span> path <span class="hljs-keyword">in</span> paths:
<span class="hljs-comment"># Check if the current path starts with the search path</span>
<span class="hljs-keyword">if</span> path.startswith(search_path):
<span class="hljs-keyword">return</span> path
<span class="hljs-comment"># If no matching path was found, return None</span>
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
</code></div></div></pre><p>This method searches the list of paths for a path that starts with the specified search path, and returns the first matching path it finds. If no matching path is found, it returns <code>None</code>.</p><p>You can use similar approaches to implement the other methods for the <code>LinuxBashPathManager</code> subclass, as well as for other subclasses for other operating systems and shell types.</p><p>For example, here is how you might implement the <code>clear_paths</code> method for the <code>LinuxBashPathManager</code> subclass:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">clear_paths</span>(<span class="hljs-params">cls</span>):
<span class="hljs-comment"># Remove the PATH environment variable from the .bashrc file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bashrc"</span>), <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
lines = f.readlines()
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(os.path.expanduser(<span class="hljs-string">"~/.bashrc"</span>), <span class="hljs-string">"w"</span>) <span class="hljs-keyword">as</span> f:
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> line.startswith(<span class="hljs-string">"export PATH="</span>):
f.write(line)
</code></div></div></pre><p>This method removes all lines from the .bashrc file that set the PATH environment variable, effectively clearing the system path.</p><p>I hope this helps! Let me know if you have any other questions or if you need further assistance.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue but refactor to account for variable names when searching in path</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To refactor the <code>search_path</code> method to account for variable names when searching in the path, you can use the following approach:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search_path</span>(<span class="hljs-params">cls, search_path: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the list of paths</span>
paths = cls.get_paths()
<span class="hljs-comment"># Iterate over the paths</span>
<span class="hljs-keyword">for</span> path <span class="hljs-keyword">in</span> paths:
<span class="hljs-comment"># Split the path into its components</span>
components = path.split(os.path.sep)
<span class="hljs-comment"># Check if any of the components starts with the search path</span>
<span class="hljs-keyword">for</span> component <span class="hljs-keyword">in</span> components:
<span class="hljs-keyword">if</span> component.startswith(search_path):
<span class="hljs-keyword">return</span> path
<span class="hljs-comment"># If no matching path was found, return None</span>
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
</code></div></div></pre><p>This method splits the path into its components (separated by the path separator for the current operating system) and searches each component for the search path. If any of the components starts with the search path, the method returns the path. If no matching path is found, it returns <code>None</code>.</p><p>I hope this helps! Let me know if you have any other questions or if you need further assistance.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">do the same for windows implementation</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To refactor the <code>WindowsPathManager</code> subclass to account for variable names when searching in the path, you can use the following approach:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Append the new path to the end of the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, <span class="hljs-string">f"<span class="hljs-subst">{current_path}</span>;<span class="hljs-subst">{path}</span>"</span>)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Remove the path from the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
paths = current_path.split(<span class="hljs-string">";"</span>)
paths = [p <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> paths <span class="hljs-keyword">if</span> p != path]
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, <span class="hljs-string">";"</span>.join(paths))
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_READ) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-keyword">return</span> current_path.split(<span class="hljs-string">";"</span>)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search_path</span>(<span class="hljs-params">cls, search_path: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the list of paths</span>
paths = cls.get_paths()
<span class="hljs-comment"># Iterate over the paths</span>
<span class="hljs-keyword">for</span> path <span class="hljs-keyword">in</span> paths:
<span class="hljs-comment"># Split the path into its components</span>
components = path.split(os.path.sep)
<span class="hljs-comment"># Check if any of the components starts with the search path</span>
<span class="hljs-keyword">for</span> component <span class="hljs-keyword">in</span> components:
<span class="hljs-keyword">if</span> component.startswith(search_path):
<span class="hljs-keyword">return</span> path
<span class="hljs-comment"># If no matching path was found, return None</span>
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
</code></div></div></pre><p>This implementation is similar to the one for the `LinuxB</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">account for windows variables such as `%JAVA_HOME%`, `%USERHOME%`, %PYTHON%, etc agnostically in windows path</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To account for Windows variables such as <code>%JAVA_HOME%</code>, <code>%USERHOME%</code>, and <code>%PYTHON%</code> agnostically in the Windows path, you can use the following approach:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Append the new path to the end of the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, <span class="hljs-string">f"<span class="hljs-subst">{current_path}</span>;<span class="hljs-subst">{path}</span>"</span>)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Remove the path from the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
paths = current_path.split(<span class="hljs-string">";"</span>)
paths = [p <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> paths <span class="hljs-keyword">if</span> p != path]
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, <span class="hljs-string">";"</span>.join(paths))
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_READ) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue implementing the <code>WindowsPathManager</code> subclass to account for Windows variables such as <code>%JAVA_HOME%</code>, <code>%USERHOME%</code>, and <code>%PYTHON%</code> agnostically in the Windows path, you can use the following approach:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Append the new path to the end of the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, <span class="hljs-string">f"<span class="hljs-subst">{current_path}</span>;<span class="hljs-subst">{path}</span>"</span>)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Remove the path from the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
paths = current_path.split(<span class="hljs-string">";"</span>)
paths = [p <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> paths <span class="hljs-keyword">if</span> p != path]
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, <span class="hljs-string">";"</span>.join(paths))
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_READ) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Expand any variables in the path</span>
<span class="hljs-keyword">return</span> [os.path.expandvars(p) <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> current_path.split(<span class="hljs-string">";"</span>)]
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search_path</span>(<span class="hljs-params">cls, search_path: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the list of paths</span>
paths = cls.get_paths()
<span class="hljs-comment"># Iterate over the paths</span>
<span class="hljs-keyword">for</span> path <span class="hljs-keyword">in</span> paths:
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">add classmethod to write partial path to system env variables and implement variable in PATH variable</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To add a class method to the <code>WindowsPathManager</code> subclass that writes a partial path to system environment variables and implements the variable in the PATH environment variable, you can use the following approach:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Append the new path to the end of the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, <span class="hljs-string">f"<span class="hljs-subst">{current_path}</span>;<span class="hljs-subst">{path}</span>"</span>)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Remove the path from the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
paths = current_path.split(<span class="hljs-string">";"</span>)
paths = [p <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> paths <span class="hljs-keyword">if</span> p != path]
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, <span class="hljs-string">";"</span>.join(paths))
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_READ) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Expand any variables in the path</span>
<span class="hljs-keyword">return</span> [os.path.expandvars(p) <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> current_path.split(<span class="hljs-string">";"</span>)]
<span class="hljs-meta"> @</span>
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">validate that this works for %JDK_HOME% and %JAVA_HOME% variables added to path as %JDK_HOME%/bin and %JAVA_HOME%/bin for java installations, if not correct the code</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To validate that the <code>WindowsPathManager</code> subclass works for the <code>%JDK_HOME%</code> and <code>%JAVA_HOME%</code> variables added to the path as <code>%JDK_HOME%/bin</code> and <code>%JAVA_HOME%/bin</code> for Java installations, you can use the following approach:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>(<span class="hljs-title class_ inherited__">PathManager</span>):
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Append the new path to the end of the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, <span class="hljs-string">f"<span class="hljs-subst">{current_path}</span>;<span class="hljs-subst">{path}</span>"</span>)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_path</span>(<span class="hljs-params">cls, path: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Remove the path from the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
paths = current_path.split(<span class="hljs-string">";"</span>)
paths = [p <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> paths <span class="hljs-keyword">if</span> p != path]
winreg.SetValueEx(key, <span class="hljs-string">"PATH"</span>, <span class="hljs-number">0</span>, winreg.REG_EXPAND_SZ, <span class="hljs-string">";"</span>.join(paths))
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>) -&gt; <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the PATH environment variable</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_READ) <span class="hljs-keyword">as</span> key:
current_path, _ = winreg.QueryValueEx(key, <span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Expand any variables in the path</span>
<span class="hljs-keyword">return</span> [os.path.expandvars(p) <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> current_path.split(<span class="hljs-string">";"</span>)]
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search_path</span>(<span class="hljs-params">cls, search_path: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the list of paths</span>
paths = cls.get_paths()
<span class="hljs-comment"># Iterate over the paths</span>
<span class="hljs-keyword">for</span> path <span class="hljs-keyword">in</span> paths:
<span class="hljs-comment"># Split the path into its components</span>
components = path.split(os.path.sep)
<span class="hljs-comment"># Check if any of the components starts with the search path</span>
<span class="hljs-keyword">for</span> component <span class="hljs-keyword">in</span> components:
<span class="hljs-keyword">if</span> component.startswith(search_path):
<span class="hljs-keyword">return</span> path
<span class="hljs-comment"># If no matching path was found, return None</span>
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">set_path_variable</span>(<span class="hljs-params">cls, variable: <span class="hljs-built_in">str</span>, value: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Set the specified environment variable</span>
<span class="hljs-keyword">with</span> winreg
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">implement WindowsPathManager and Typer CLI to prompt user menu options to switch between different developer tool versions such as multiple python, java, scala, and gradle installations </div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To implement the <code>WindowsPathManager</code> and <code>Typer</code> CLI to prompt the user with menu options to switch between different developer tool versions such as multiple Python, Java, Scala, and Gradle installations, you can use the following approach:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> os
<span class="hljs-keyword">import</span> typer
app = typer.Typer()
<span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">switch</span>(<span class="hljs-params">tool: <span class="hljs-built_in">str</span>, version: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Get the path for the specified tool and version</span>
path = get_tool_path(tool, version)
<span class="hljs-comment"># Check if the path is valid</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> path:
typer.echo(<span class="hljs-string">f"Error: Invalid tool or version: <span class="hljs-subst">{tool}</span> <span class="hljs-subst">{version}</span>"</span>)
<span class="hljs-keyword">return</span>
<span class="hljs-comment"># Remove the current path for the tool from the PATH environment variable</span>
current_path = os.environ[<span class="hljs-string">"PATH"</span>]
paths = current_path.split(<span class="hljs-string">";"</span>)
paths = [p <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> paths <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> p.startswith(tool)]
os.environ[<span class="hljs-string">"PATH"</span>] = <span class="hljs-string">";"</span>.join(paths)
<span class="hljs-comment"># Add the new path for the tool to the PATH environment variable</span>
os.environ[<span class="hljs-string">"PATH"</span>] = <span class="hljs-string">f"<span class="hljs-subst">{os.environ[<span class="hljs-string">'PATH'</span>]}</span>;<span class="hljs-subst">{path}</span>"</span>
typer.echo(<span class="hljs-string">f"Success: Switched to <span class="hljs-subst">{tool}</span> <span class="hljs-subst">{version}</span>"</span>)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_tool_path</span>(<span class="hljs-params">tool: <span class="hljs-built_in">str</span>, version: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Get the base path for the tool</span>
base_path = get_tool_base_path(tool)
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> base_path:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-comment"># Get the path for the specified version</span>
version_path = get_tool_version_path(base_path, version)
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> version_path:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-comment"># Return the full path for</span>
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">focus on java and gradle implementation first </div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To focus on the Java and Gradle implementation first for the <code>WindowsPathManager</code> and <code>Typer</code> CLI, you can modify the <code>switch</code> command to handle these tools specifically, like so:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> os
<span class="hljs-keyword">import</span> typer
app = typer.Typer()
<span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">switch</span>(<span class="hljs-params">tool: <span class="hljs-built_in">str</span>, version: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> tool == <span class="hljs-string">"java"</span>:
<span class="hljs-comment"># Get the path for the specified Java version</span>
path = get_java_path(version)
<span class="hljs-comment"># Check if the path is valid</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> path:
typer.echo(<span class="hljs-string">f"Error: Invalid Java version: <span class="hljs-subst">{version}</span>"</span>)
<span class="hljs-keyword">return</span>
<span class="hljs-comment"># Set the JAVA_HOME environment variable</span>
os.environ[<span class="hljs-string">"JAVA_HOME"</span>] = path
<span class="hljs-comment"># Update the PATH environment variable to include the Java bin directory</span>
os.environ[<span class="hljs-string">"PATH"</span>] = <span class="hljs-string">f"<span class="hljs-subst">{os.environ[<span class="hljs-string">'PATH'</span>]}</span>;<span class="hljs-subst">{path}</span>/bin"</span>
typer.echo(<span class="hljs-string">f"Success: Switched to Java <span class="hljs-subst">{version}</span>"</span>)
<span class="hljs-keyword">elif</span> tool == <span class="hljs-string">"gradle"</span>:
<span class="hljs-comment"># Get the path for the specified Gradle version</span>
path = get_gradle_path(version)
<span class="hljs-comment"># Check if the path is valid</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> path:
typer.echo(<span class="hljs-string">f"Error: Invalid Gradle version: <span class="hljs-subst">{version}</span>"</span>)
<span class="hljs-keyword">return</span>
<span class="hljs-comment"># Set the GRADLE_HOME environment variable</span>
os.environ[<span class="hljs-string">"GRADLE_HOME"</span>] = path
<span class="hljs-comment"># Update the PATH environment variable to include the Gradle bin directory</span>
os.environ[<span class="hljs-string">"PATH"</span>] = <span class="hljs-string">f"<span class="hljs-subst">{os.environ[<span class="hljs-string">'PATH'</span>]}</span>;<span class="hljs-subst">{path}</span>/bin"</span>
typer.echo(<span class="hljs-string">f"Success: Switched to Gradle <span class="hljs-subst">{version}</span>"</span>)
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">f"Error: Invalid tool: <span class="hljs-subst">{tool}</span>"</span>)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_java_path</span>(<span class="hljs-params">version: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Implement logic to get the path for the specified Java version</span>
<span class="hljs-keyword">pass</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_gradle_path</span>(<span class="hljs-params">version: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Implement logic to get the path for the specified Gradle version</span>
<span class="hljs-keyword">pass</span>
</code></div></div></pre><p>You can then implement the <code>get_java_path</code> and <code>get_gradle_path</code> functions to return the path for the specified Java or Gradle version. This could involve reading from a configuration file or registry key to determine the installed locations of different versions of these tools.</p><p>Once you have implemented the <code>get_java_path</code> and <code>get_gradle_path</code> functions, you can use the <code>switch</code> command to switch between different versions of Java and Gradle as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-vbnet">$ python path_manager.py switch java <span class="hljs-number">8</span>
<span class="hljs-symbol">Success:</span> Switched <span class="hljs-keyword">to</span> Java <span class="hljs-number">8</span>
$ python path_manager.py switch gradle <span class="hljs-number">6.8</span>
<span class="hljs-symbol">Success:</span> Switched <span class="hljs-keyword">to</span> Gradle <span class="hljs-number">6.8</span>
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">use winreg for implementation for windows</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To use <code>winreg</code> for the implementation of the <code>WindowsPathManager</code> and <code>Typer</code> CLI for Windows, you can modify the <code>get_java_path</code> and <code>get_gradle_path</code> functions to read from the registry to determine the installed locations of different versions of these tools.</p><p>Here is an example of how you can implement the <code>get_java_path</code> function using <code>winreg</code>:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> winreg
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_java_path</span>(<span class="hljs-params">version: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Open the Java registry key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, <span class="hljs-string">"SOFTWARE\\JavaSoft\\Java Development Kit"</span>) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the list of subkeys (i.e. versions of Java)</span>
i = <span class="hljs-number">0</span>
<span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:
<span class="hljs-keyword">try</span>:
<span class="hljs-comment"># Get the name and data of the subkey</span>
subkey_name, _, _ = winreg.EnumValue(key, i)
<span class="hljs-comment"># Check if the subkey is the desired version</span>
<span class="hljs-keyword">if</span> subkey_name == version:
<span class="hljs-comment"># Get the Java home directory</span>
_, java_home, _ = winreg.EnumValue(key, i, winreg.RegistryValueKind.REG_SZ)
<span class="hljs-keyword">return</span> java_home
<span class="hljs-keyword">except</span> OSError:
<span class="hljs-comment"># No more subkeys, exit the loop</span>
<span class="hljs-keyword">break</span>
i += <span class="hljs-number">1</span>
<span class="hljs-comment"># If the specified version was not found, return None</span>
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
</code></div></div></pre><p>You can use a similar approach to implement the <code>get_gradle_path</code> function using <code>winreg</code>.</p><p>Once you have implemented the <code>get_java_path</code> and <code>get_gradle_path</code> functions using <code>winreg</code>, you can use the <code>switch</code> command to switch between different versions of Java and Gradle as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-vbnet">$ python path_manager.py switch java <span class="hljs-number">8</span>
<span class="hljs-symbol">Success:</span> Switched <span class="hljs-keyword">to</span> Java <span class="hljs-number">8</span>
$ python path_manager.py switch gradle <span class="hljs-number">6.8</span>
<span class="hljs-symbol">Success:</span> Switched <span class="hljs-keyword">to</span> Gradle <span class="hljs-number">6.8</span>
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">add functionality in get_java_path to autodetect java version if available on path, create java_home and jdk_home if missing, and replace jre path with %JAVA_HOME%/bin. make sure to split this into multiple functions that is readable</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To add functionality to the <code>get_java_path</code> function to autodetect the Java version if it is available on the PATH, create the <code>JAVA_HOME</code> and <code>JDK_HOME</code> environment variables if they are missing, and replace the <code>JRE_HOME</code> path with <code>%JAVA_HOME%/bin</code>, you can use the following approach:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> os
<span class="hljs-keyword">import</span> subprocess
<span class="hljs-keyword">import</span> winreg
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_java_path</span>(<span class="hljs-params">version: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Check if the JAVA_HOME environment variable is set</span>
<span class="hljs-keyword">if</span> <span class="hljs-string">"JAVA_HOME"</span> <span class="hljs-keyword">in</span> os.environ:
<span class="hljs-keyword">return</span> os.environ[<span class="hljs-string">"JAVA_HOME"</span>]
<span class="hljs-comment"># Check if the JDK_HOME environment variable is set</span>
<span class="hljs-keyword">if</span> <span class="hljs-string">"JDK_HOME"</span> <span class="hljs-keyword">in</span> os.environ:
<span class="hljs-keyword">return</span> os.environ[<span class="hljs-string">"JDK_HOME"</span>]
<span class="hljs-comment"># Check if the JRE_HOME environment variable is set</span>
<span class="hljs-keyword">if</span> <span class="hljs-string">"JRE_HOME"</span> <span class="hljs-keyword">in</span> os.environ:
<span class="hljs-keyword">return</span> os.environ[<span class="hljs-string">"JRE_HOME"</span>]
<span class="hljs-comment"># If none of the above environment variables are set, try to autodetect the Java installation</span>
java_home = autodetect_java()
<span class="hljs-keyword">if</span> java_home:
<span class="hljs-keyword">return</span> java_home
<span class="hljs-comment"># If autodetection fails, try to read the Java installation from the registry</span>
java_home = get_java_path_from_registry(version)
<span class="hljs-keyword">if</span> java_home:
<span class="hljs-keyword">return</span> java_home
<span class="hljs-comment"># If the specified version was not found, return None</span>
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">autodetect_java</span>() -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Try to run the 'java' command to get the version</span>
<span class="hljs-keyword">try</span>:
output = subprocess.check_output([<span class="hljs-string">"java"</span>, <span class="hljs-string">"-version"</span>], stderr=subprocess.STDOUT)
<span class="hljs-keyword">except</span> subprocess.CalledProcessError:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-comment"># Parse the version string to get the Java home directory</span>
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> output.decode().split(<span class="hljs-string">"\n"</span>):
<span class="hljs-keyword">if</span> line.startswith(<span class="hljs-string">"Java home:"</span>):
java_home = line.split(<span class="hljs-string">":"</span>)[<span class="hljs-number">1</span>].strip()
<span class="hljs-keyword">return</span> java_home
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_java_path_from_registry</span>(<span class="hljs-params">version: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Open the Java registry key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, <span class="hljs-string">"SOFTWARE\\JavaSoft\\Java Development Kit"</span>) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get</span>
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue implementing the <code>WindowsPathManager</code> and <code>Typer</code> CLI with the added functionality to autodetect the Java version and create the necessary environment variables, you can add the following code:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> os
<span class="hljs-keyword">import</span> subprocess
<span class="hljs-keyword">import</span> winreg
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_java_path</span>(<span class="hljs-params">version: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Check if the JAVA_HOME environment variable is set</span>
<span class="hljs-keyword">if</span> <span class="hljs-string">"JAVA_HOME"</span> <span class="hljs-keyword">in</span> os.environ:
<span class="hljs-keyword">return</span> os.environ[<span class="hljs-string">"JAVA_HOME"</span>]
<span class="hljs-comment"># Check if the JDK_HOME environment variable is set</span>
<span class="hljs-keyword">if</span> <span class="hljs-string">"JDK_HOME"</span> <span class="hljs-keyword">in</span> os.environ:
<span class="hljs-keyword">return</span> os.environ[<span class="hljs-string">"JDK_HOME"</span>]
<span class="hljs-comment"># Check if the JRE_HOME environment variable is set</span>
<span class="hljs-keyword">if</span> <span class="hljs-string">"JRE_HOME"</span> <span class="hljs-keyword">in</span> os.environ:
<span class="hljs-keyword">return</span> os.environ[<span class="hljs-string">"JRE_HOME"</span>]
<span class="hljs-comment"># If none of the above environment variables are set, try to autodetect the Java installation</span>
java_home = autodetect_java()
<span class="hljs-keyword">if</span> java_home:
<span class="hljs-comment"># Set the JAVA_HOME environment variable</span>
os.environ[<span class="hljs-string">"JAVA_HOME"</span>] = java_home
<span class="hljs-comment"># Set the JDK_HOME environment variable</span>
os.environ[<span class="hljs-string">"JDK_HOME"</span>] = java_home
<span class="hljs-comment"># Set the JRE_HOME environment variable</span>
os.environ[<span class="hljs-string">"JRE_HOME"</span>] = <span class="hljs-string">f"<span class="hljs-subst">{java_home}</span>/jre"</span>
<span class="hljs-comment"># Update the PATH environment variable to include the Java bin directory</span>
os.environ[<span class="hljs-string">"PATH"</span>] = <span class="hljs-string">f"<span class="hljs-subst">{os.environ[<span class="hljs-string">'PATH'</span>]}</span>;<span class="hljs-subst">{java_home}</span>/bin"</span>
<span class="hljs-keyword">return</span> java_home
<span class="hljs-comment"># If autodetection fails, try to read the Java installation from the registry</span>
java_home = get_java_path_from_registry(version)
<span class="hljs-keyword">if</span> java_home:
<span class="hljs-comment"># Set the JAVA_HOME environment variable</span>
os.environ[<span class="hljs-string">"JAV
</span></code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">split previous code into more methods</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To split the previous code into more methods for better readability, you can use the following approach:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">import</span> os
<span class="hljs-keyword">import</span> subprocess
<span class="hljs-keyword">import</span> winreg
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_java_path</span>(<span class="hljs-params">version: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Check if the JAVA_HOME environment variable is set</span>
<span class="hljs-keyword">if</span> <span class="hljs-string">"JAVA_HOME"</span> <span class="hljs-keyword">in</span> os.environ:
<span class="hljs-keyword">return</span> os.environ[<span class="hljs-string">"JAVA_HOME"</span>]
<span class="hljs-comment"># Check if the JDK_HOME environment variable is set</span>
<span class="hljs-keyword">if</span> <span class="hljs-string">"JDK_HOME"</span> <span class="hljs-keyword">in</span> os.environ:
<span class="hljs-keyword">return</span> os.environ[<span class="hljs-string">"JDK_HOME"</span>]
<span class="hljs-comment"># Check if the JRE_HOME environment variable is set</span>
<span class="hljs-keyword">if</span> <span class="hljs-string">"JRE_HOME"</span> <span class="hljs-keyword">in</span> os.environ:
<span class="hljs-keyword">return</span> os.environ[<span class="hljs-string">"JRE_HOME"</span>]
<span class="hljs-comment"># If none of the above environment variables are set, try to autodetect the Java installation</span>
java_home = autodetect_java()
<span class="hljs-keyword">if</span> java_home:
set_java_env_variables(java_home)
<span class="hljs-keyword">return</span> java_home
<span class="hljs-comment"># If autodetection fails, try to read the Java installation from the registry</span>
java_home = get_java_path_from_registry(version)
<span class="hljs-keyword">if</span> java_home:
set_java_env_variables(java_home)
<span class="hljs-keyword">return</span> java_home
<span class="hljs-comment"># If the specified version was not found, return None</span>
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">autodetect_java</span>() -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Try to run the 'java' command to get the version</span>
<span class="hljs-keyword">try</span>:
output = subprocess.check_output([<span class="hljs-string">"java"</span>, <span class="hljs-string">"-version"</span>], stderr=subprocess.STDOUT)
<span class="hljs-keyword">except</span> subprocess.CalledProcessError:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-comment"># Parse the version string to get the Java home directory</span>
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> output.decode().split(<span class="hljs-string">"\n"</span>):
<span class="hljs-keyword">if</span> line.startswith(<span class="hljs-string">"Java home:"</span>):
java_home = line.split(<span class="hljs-string">":"</span>)[<span class="hljs-number">1</span>].strip()
<span class="hljs-keyword">return</span> java_home
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_java_path_from_registry</span>(<span class="hljs-params">version: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Open the Java registry key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, <span class="hljs-string">"SOFTWARE\\JavaSoft\\Java Development Kit"</span>) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the list of subkeys (i.e. versions of Java)</span>
i = <span class="hljs-number">0</span>
<span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:
<span class="hljs-keyword">try</span>:
<span class="hljs-comment"># Get the name and data of the subkey</span>
subkey_name, _, _ = winreg.EnumValue(key, i)
<span class="hljs-comment"># Check if the subkey is the desired version</span>
<span class="hljs-keyword">if</span> subkey_name == version:
<span class="hljs-comment"># Get the Java home directory</span>
_, java_home, _ = winreg.EnumValue(key
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue implementing the <code>WindowsPathManager</code> and <code>Typer</code> CLI with the added functionality to autodetect the Java version and create the necessary environment variables, you can add the following code:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">set_java_env_variables</span>(<span class="hljs-params">java_home: <span class="hljs-built_in">str</span></span>):
<span class="hljs-comment"># Set the JAVA_HOME environment variable</span>
os.environ[<span class="hljs-string">"JAVA_HOME"</span>] = java_home
<span class="hljs-comment"># Set the JDK_HOME environment variable</span>
os.environ[<span class="hljs-string">"JDK_HOME"</span>] = java_home
<span class="hljs-comment"># Set the JRE_HOME environment variable</span>
os.environ[<span class="hljs-string">"JRE_HOME"</span>] = <span class="hljs-string">f"<span class="hljs-subst">{java_home}</span>/jre"</span>
<span class="hljs-comment"># Update the PATH environment variable to include the Java bin directory</span>
os.environ[<span class="hljs-string">"PATH"</span>] = <span class="hljs-string">f"<span class="hljs-subst">{os.environ[<span class="hljs-string">'PATH'</span>]}</span>;<span class="hljs-subst">{java_home}</span>/bin"</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_gradle_path</span>(<span class="hljs-params">version: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Implement logic to get the path for the specified Gradle version</span>
<span class="hljs-keyword">pass</span>
<span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">switch</span>(<span class="hljs-params">tool: <span class="hljs-built_in">str</span>, version: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> tool == <span class="hljs-string">"java"</span>:
<span class="hljs-comment"># Get the path for the specified Java version</span>
path = get_java_path(version)
<span class="hljs-comment"># Check if the path is valid</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> path:
typer.echo(<span class="hljs-string">f"Error: Invalid Java version: <span class="hljs-subst">{version}</span>"</span>)
<span class="hljs-keyword">return</span>
typer.echo(<span class="hljs-string">f"Success: Switched to Java <span class="hljs-subst">{version}</span>"</span>)
<span class="hljs-keyword">elif</span> tool == <span class="hljs-string">"gradle"</span>:
<span class="hljs-comment"># Get the path for the specified Gradle version</span>
path = get_gradle_path(version)
<span class="hljs-comment"># Check if the path is valid</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> path:
typer
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue from switch</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue implementing the <code>WindowsPathManager</code> and <code>Typer</code> CLI, you can add the following code to the <code>switch</code> command to switch between different versions of Gradle:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta">@app.command()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">switch</span>(<span class="hljs-params">tool: <span class="hljs-built_in">str</span>, version: <span class="hljs-built_in">str</span></span>):
<span class="hljs-keyword">if</span> tool == <span class="hljs-string">"java"</span>:
<span class="hljs-comment"># Get the path for the specified Java version</span>
path = get_java_path(version)
<span class="hljs-comment"># Check if the path is valid</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> path:
typer.echo(<span class="hljs-string">f"Error: Invalid Java version: <span class="hljs-subst">{version}</span>"</span>)
<span class="hljs-keyword">return</span>
typer.echo(<span class="hljs-string">f"Success: Switched to Java <span class="hljs-subst">{version}</span>"</span>)
<span class="hljs-keyword">elif</span> tool == <span class="hljs-string">"gradle"</span>:
<span class="hljs-comment"># Get the path for the specified Gradle version</span>
path = get_gradle_path(version)
<span class="hljs-comment"># Check if the path is valid</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> path:
typer.echo(<span class="hljs-string">f"Error: Invalid Gradle version: <span class="hljs-subst">{version}</span>"</span>)
<span class="hljs-keyword">return</span>
typer.echo(<span class="hljs-string">f"Success: Switched to Gradle <span class="hljs-subst">{version}</span>"</span>)
<span class="hljs-keyword">else</span>:
typer.echo(<span class="hljs-string">f"Error: Invalid tool: <span class="hljs-subst">{tool}</span>"</span>)
</code></div></div></pre><p>You can then implement the <code>get_gradle_path</code> function to read from the registry to determine the installed location of different versions of Gradle, similar to the <code>get_java_path</code> function.</p><p>Once you have implemented the <code>get_gradle_path</code> function, you can use the <code>switch</code> command to switch between different versions of Gradle as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-vbnet">$ python path_manager.py switch gradle <span class="hljs-number">6.8</span>
<span class="hljs-symbol">Success:</span> Switched <span class="hljs-keyword">to</span> Gradle <span class="hljs-number">6.8</span>
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">implement get_gradle_path function</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To implement the <code>get_gradle_path</code> function to determine the installed location of different versions of Gradle, you can use the following approach:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">get_gradle_path</span>(<span class="hljs-params">version: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-type">Optional</span>[<span class="hljs-built_in">str</span>]:
<span class="hljs-comment"># Open the Gradle registry key</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, <span class="hljs-string">"SOFTWARE\\Gradle"</span>) <span class="hljs-keyword">as</span> key:
<span class="hljs-comment"># Get the list of subkeys (i.e. versions of Gradle)</span>
i = <span class="hljs-number">0</span>
<span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:
<span class="hljs-keyword">try</span>:
<span class="hljs-comment"># Get the name and data of the subkey</span>
subkey_name, _, _ = winreg.EnumValue(key, i)
<span class="hljs-comment"># Check if the subkey is the desired version</span>
<span class="hljs-keyword">if</span> subkey_name == version:
<span class="hljs-comment"># Get the Gradle home directory</span>
_, gradle_home, _ = winreg.EnumValue(key, i)
<span class="hljs-keyword">return</span> gradle_home
i += <span class="hljs-number">1</span>
<span class="hljs-keyword">except</span> OSError:
<span class="hljs-keyword">break</span>
<span class="hljs-comment"># If the specified version was not found, return None</span>
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
</code></div></div></pre><p>This function opens the <code>Gradle</code> registry key, enumerates the subkeys (i.e. versions of Gradle), and checks if the name of the subkey matches the desired version. If a match is found, the function returns the <code>Gradle_home</code> directory associated with that version. If no match is found, the function returns <code>None</code>.</p><p>You can then use the <code>get_gradle_path</code> function in the <code>switch</code> command to switch between different versions of Gradle as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-vbnet">$ python path_manager.py switch gradle <span class="hljs-number">6.8</span>
<span class="hljs-symbol">Success:</span> Switched <span class="hljs-keyword">to</span> Gradle <span class="hljs-number">6.8</span>
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">implement choice menu for all previous typer cli commands</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To implement a choice menu for all the previous <code>Typer</code> CLI commands, you can use the <code>Typer.choice</code> method to present the user with a list of options and allow them to select one.</p><p>For example, you can implement the following <code>main</code> function to present the user with a choice menu for the various path management commands:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">main</span>():
<span class="hljs-comment"># Present the user with a choice menu</span>
choice = typer.choice(<span class="hljs-string">"What do you want
</span></code></div></div></pre></div></div><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>to do?", ["Add a path", "Remove a path", "List paths", "Search for a path", "Import paths from a file", "Export paths to a file", "Switch developer tool version"])</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-comment"># Call the appropriate command based on the user's choice</span>
<span class="hljs-keyword">if</span> choice == <span class="hljs-string">"Add a path"</span>:
add_path()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Remove a path"</span>:
remove_path()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"List paths"</span>:
get_paths()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Search for a path"</span>:
search_path()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Import paths from a file"</span>:
import_paths()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Export paths to a file"</span>:
export_paths()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Switch developer tool version"</span>:
switch_tool()
</code></div></div></pre><p>if <strong>name</strong> == "<strong>main</strong>":
main()</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-css">
This `<span class="hljs-selector-tag">main</span>` function presents the user with <span class="hljs-selector-tag">a</span> choice <span class="hljs-selector-tag">menu</span> for the various path management commands, and calls the appropriate command based on the user's selection.
You can then implement the `switch_tool` function <span class="hljs-selector-tag">to</span> present the user with <span class="hljs-selector-tag">a</span> choice <span class="hljs-selector-tag">menu</span> for the various developer tools that can be switched between, such as Java and Gradle:
```python
def <span class="hljs-built_in">switch_tool</span>():
# Present the user with a choice menu
tool = typer.<span class="hljs-built_in">choice</span>(<span class="hljs-string">"Which tool do you want to switch?"</span>, [<span class="hljs-string">"Java"</span>, <span class="hljs-string">"Gradle"</span>])
# Prompt the user for the desired version of the tool
version = typer.<span class="hljs-built_in">prompt</span>(<span class="hljs-string">"Enter the desired version of the tool:"</span>)
if tool == <span class="hljs-string">"Java"</span>:
# Switch to the specified Java version
<span class="hljs-built_in">switch</span>(<span class="hljs-string">"java"</span>, version)
elif tool == <span class="hljs-string">"Gradle"</span>:
# Switch to the specified Gradle version
<span class="hljs-built_in">switch</span>(<span class="hljs-string">"gradle"</span>, version)
</code></div></div></pre><p>This <code>switch_tool</code> function presents the user with a choice menu for the various developer tools that can be switched between, and prompts the user for the desired version of the selected tool. It then calls the <code>switch</code> command to switch to the specified version of the tool.</p><p>With these changes, the <code>Typer</code> CLI will present the user with a choice menu for the various path management commands, and allow them to select and execute the desired command. It will also allow the user to switch between different versions of developer tools such as Java and Gradle.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">combine all path functions into one submenu item letting the user pick "manage path" followed by option</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To combine all the path management functions into a single submenu item, you can modify the <code>main</code> function to present the user with a choice menu for the various path management commands, and allow them to select the "Manage path" option to access a submenu with the individual path management commands.</p><p>For example, you can modify the <code>main</code> function as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">main</span>():
<span class="hljs-comment"># Present the user with a choice menu</span>
choice = typer.choice(<span class="hljs-string">"What do you want to do?"</span>, [<span class="hljs-string">"Manage path"</span>, <span class="hljs-string">"Import paths from a file"</span>, <span class="hljs-string">"Export paths to a file"</span>, <span class="hljs-string">"Switch developer tool version"</span>])
<span class="hljs-comment"># Call the appropriate command based on the user's choice</span>
<span class="hljs-keyword">if</span> choice == <span class="hljs-string">"Manage path"</span>:
manage_path()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Import paths from a file"</span>:
import_paths()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Export paths to a file"</span>:
export_paths()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Switch developer tool version"</span>:
switch_tool()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">manage_path</span>():
<span class="hljs-comment"># Present the user with a choice menu for the path management commands</span>
path_choice = typer.choice(<span class="hljs-string">"What do you want to do?"</span>, [<span class="hljs-string">"Add a path"</span>, <span class="hljs-string">"Remove a path"</span>, <span class="hljs-string">"List paths"</span>, <span class="hljs-string">"Search for a path"</span>])
<span class="hljs-comment"># Call the appropriate command based on the user's choice</span>
<span class="hljs-keyword">if</span> path_choice == <span class="hljs-string">"Add a path"</span>:
add_path()
<span class="hljs-keyword">elif</span> path_choice == <span class="hljs-string">"Remove a path"</span>:
remove_path()
<span class="hljs-keyword">elif</span> path_choice == <span class="hljs-string">"List paths"</span>:
get_paths()
<span class="hljs-keyword">elif</span> path_choice == <span class="hljs-string">"Search for a path"</span>:
search_path()
</code></div></div></pre><p>This modified <code>main</code> function presents the user with a choice menu for the various path management commands, and allows them to select the "Manage path" option to access a submenu with the individual path management commands.</p><p>With these changes, the <code>Typer</code> CLI will present the user with a choice menu for the various path management commands, and allow them to select and execute the desired command. It will also allow the user to switch between different versions of developer tools such as Java and Gradle.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">move Import and Export paths to manage_path()</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To move the <code>import_paths</code> and <code>export_paths</code> functions to the <code>manage_path</code> submenu, you can modify the <code>manage_path</code> function to present the user with a choice menu that includes the "Import paths from a file" and "Export paths to a file" options.</p><p>For example, you can modify the <code>manage_path</code> function as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">manage_path</span>():
<span class="hljs-comment"># Present the user with a choice menu for the path management commands</span>
path_choice = typer.choice(<span class="hljs-string">"What do you want to do?"</span>, [<span class="hljs-string">"Add a path"</span>, <span class="hljs-string">"Remove a path"</span>, <span class="hljs-string">"List paths"</span>, <span class="hljs-string">"Search for a path"</span>, <span class="hljs-string">"Import paths from a file"</span>, <span class="hljs-string">"Export paths to a file"</span>])
<span class="hljs-comment"># Call the appropriate command based on the user's choice</span>
<span class="hljs-keyword">if</span> path_choice == <span class="hljs-string">"Add a path"</span>:
add_path()
<span class="hljs-keyword">elif</span> path_choice == <span class="hljs-string">"Remove a path"</span>:
remove_path()
<span class="hljs-keyword">elif</span> path_choice == <span class="hljs-string">"List paths"</span>:
get_paths()
<span class="hljs-keyword">elif</span> path_choice == <span class="hljs-string">"Search for a path"</span>:
search_path()
<span class="hljs-keyword">elif</span> path_choice == <span class="hljs-string">"Import paths from a file"</span>:
import_paths()
<span class="hljs-keyword">elif</span> path_choice == <span class="hljs-string">"Export paths to a file"</span>:
export_paths()
</code></div></div></pre><p>This modified <code>manage_path</code> function presents the user with a choice menu that includes the "Import paths from a file" and "Export paths to a file" options, and allows them to select and execute the desired command.</p><p>With these changes, the <code>Typer</code> CLI will present the user with a choice menu for the various path management commands, and allow them to select and execute the desired command. It will also allow the user to switch between different versions of developer tools such as Java and Gradle.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">refactor all menus to have prompted numbers and keyboard navigation functionallity </div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To refactor all the menus to have prompted numbers and keyboard navigation functionality, you can modify the <code>typer.choice</code> calls to use the <code>prompt</code> parameter and the <code>key_binding</code> parameter.</p><p>The <code>prompt</code> parameter allows you to specify a custom prompt for the choice menu, and the <code>key_binding</code> parameter allows you to specify a key binding for each choice.</p><p>For example, you can modify the <code>main</code> function as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">main</span>():
<span class="hljs-comment"># Present the user with a choice menu with prompted numbers</span>
choice = typer.choice(<span class="hljs-string">"What do you want to do?"</span>, [<span class="hljs-string">"Manage path"</span>, <span class="hljs-string">"Import paths from a file"</span>, <span class="hljs-string">"Export paths to a file"</span>, <span class="hljs-string">"Switch developer tool version"</span>], prompt=<span class="hljs-string">"Enter a number: "</span>, key_binding={<span class="hljs-string">"1"</span>: <span class="hljs-string">"Manage path"</span>, <span class="hljs-string">"2"</span>: <span class="hljs-string">"Import paths from a file"</span>, <span class="hljs-string">"3"</span>: <span class="hljs-string">"Export paths to a file"</span>, <span class="hljs-string">"4"</span>: <span class="hljs-string">"Switch developer tool version"</span>})
<span class="hljs-comment"># Call the appropriate command based on the user's choice</span>
<span class="hljs-keyword">if</span> choice == <span class="hljs-string">"Manage path"</span>:
manage_path()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Import paths from a file"</span>:
import_paths()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Export paths to a file"</span>:
export_paths()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Switch developer tool version"</span>:
switch_tool()
</code></div></div></pre><p>This modified <code>main</code> function presents the user with a choice menu with prompted numbers, and allows them to use the keyboard to navigate the menu and select an option.</p><p>You can then modify the <code>manage_path</code> function in a similar way to add prompted numbers and keyboard navigation functionality to the submenu:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">manage_path</span>():
<span class="hljs-comment"># Present the user with a choice menu for the path management commands with prompted numbers</span>
path_choice = typer.choice(<span class="hljs-string">"What do you want to do?"</span>, [<span class="hljs-string">"Add a path"</span>, <span class="hljs-string">"Remove a path"</span>, <span class="hljs-string">"List paths"</span>, <span class="hljs-string">"Search for a path"</span>, <span class="hljs-string">"Import paths from a file"</span>, <span class="hljs-string">"Export paths to a file"</span>], prompt=<span class="hljs-string">"Enter a number: "</span>, key_binding={<span class="hljs-string">"1"</span>: <span class="hljs-string">"Add a path"</span>, <span class="hljs-string">"2"</span>: <span class="hljs-string">"Remove a path"</span>, <span class="hljs-string">"3"</span>: <span class="hljs-string">"List paths"</span>, <span class="hljs-string">"4"</span>: <span class="hljs-string">"Search for a path"</span>, <span class="hljs-string">"5"</span>: <span class="hljs-string">"Import paths from a file"</span>, <span class="hljs-string">"6"</span>: <span class="hljs-string">"Export paths to a file"</span>})
<span class="hljs-comment"># Call the appropriate command based on the user's choice</span>
<span class="hljs-keyword">if</span> path_choice == <span class="hljs-string">"Add a path"</span>:
add_path()
<span class="hljs-keyword">elif</span> path_choice == <span class="hljs-string">"Remove a path"</span>:
remove_path()
<span class="hljs-keyword">elif</span> path_choice == <span class="hljs-string">"List paths"</span>:
get_paths()
<span class="hljs-keyword">elif</span> path_choice == <span class="hljs-string">"Search for a path"</span>:
search_path()
<span class="hljs-keyword">elif</span> path_choice == <span class="hljs-string">"Import paths from a file"</span>:
import_paths()
<span class="hljs-keyword">elif</span> path_choice == <span class="hljs-string">"Export paths to a file"</span>:
export_paths()
</code></div></div></pre><p>With these changes, the <code>Typer</code> CLI will present the user with choice menus with prompted numbers and keyboard navigation functionality, and allow them to select and execute the desired command. It will also allow the user to switch between different versions of developer tools such as Java and Gradle.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">add new menu item and unimplemented class functionality to add API username and keys to windows system env variables, zsh, and bash. implement function for artifactory api user and key</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To add a new menu item and unimplemented class functionality to add API username and keys to the Windows system environment variables, ZSH, and Bash, you can modify the <code>main</code> function to include a new "Add API key" option, and implement a new <code>add_api_key</code> function to handle the API key management.</p><p>For example, you can modify the <code>main</code> function as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">main</span>():
<span class="hljs-comment"># Present the user with a choice menu with prompted numbers</span>
choice = typer.choice(<span class="hljs-string">"What do you want to do?"</span>, [<span class="hljs-string">"Manage path"</span>, <span class="hljs-string">"Import paths from a file"</span>, <span class="hljs-string">"Export paths to a file"</span>, <span class="hljs-string">"Switch developer tool version"</span>, <span class="hljs-string">"Add API key"</span>], prompt=<span class="hljs-string">"Enter a number: "</span>, key_binding={<span class="hljs-string">"1"</span>: <span class="hljs-string">"Manage path"</span>, <span class="hljs-string">"2"</span>: <span class="hljs-string">"Import paths from a file"</span>, <span class="hljs-string">"3"</span>: <span class="hljs-string">"Export paths to a file"</span>, <span class="hljs-string">"4"</span>: <span class="hljs-string">"Switch developer tool version"</span>, <span class="hljs-string">"5"</span>: <span class="hljs-string">"Add API key"</span>})
<span class="hljs-comment"># Call the appropriate command based on the user's choice</span>
<span class="hljs-keyword">if</span> choice == <span class="hljs-string">"Manage path"</span>:
manage_path()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Import paths from a file"</span>:
import_paths()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Export paths to a file"</span>:
export_paths()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Switch developer tool version"</span>:
switch_tool()
<span class="hljs-keyword">elif</span> choice == <span class="hljs-string">"Add API key"</span>:
add_api_key()
</code></div></div></pre><p>This modified <code>main</code> function presents the user with a choice menu with a new "Add API key" option, and allows them to select the option to add an API key.</p><p>You can then implement the <code>add_api_key</code> function to handle the API key management. For example:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">add_api_key</span>():
<span class="hljs-comment"># Prompt the user for the API key and username</span>
key = typer.prompt(<span class="hljs-string">"Enter the API key:"</span>)
username = typer.prompt(<span class="hljs-string">"Enter the API username:"</span>)
<span class="hljs-comment"># Add the API key and username to the Windows system environment variables</span>
WindowsPathManager.add_api_key(key, username)
<span class="hljs-comment"># Add the API key and username to the ZSH environment variables</span>
ZSHPathManager.add_api_key(key, username)
<span class="hljs-comment"># Add the API key and username to the Bash environment variables</span>
BashPathManager.add_api_key(key, username)
</code></div></div></pre><p>This <code>add_api_key</code> function prompts the user for the API key and username, and calls the <code>add_api_key</code> method of the <code>WindowsPathManager</code>, <code>ZSHPathManager</code>, and <code>BashPathManager</code> classes to add the API key and username to the appropriate environment variables.</p><p>You can then implement the <code>add_api_key</code> method of the <code>WindowsPathManager</code>, <code>ZSHPathManager</code>, and <code>BashPathManager</code> classes to add the API key and username to the appropriate environment variables for each operating system and shell type.</p><p>For example, you can implement the <code>add_api_key</code> method of the <code>WindowsPathManager</code> class as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>:
<span class="hljs-comment"># Other class methods</span>
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_api_key</span>(<span class="hljs-params">cls, key, username</span>):
<span class="hljs-comment"># Add the API key and username to the Windows system environment variables</span>
<span class="hljs-keyword">with</span> winreg.CreateKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">r"Environment"</span>) <span class="hljs-keyword">as</span> key:
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">refactor all above code to include an system env variable manager</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To refactor the above code to include a system environment variable manager, you can create a new <code>SystemEnvVariableManager</code> class that contains methods to add, remove, and get system environment variables for all operating systems and shell types.</p><p>You can then modify the <code>WindowsPathManager</code>, <code>ZSHPathManager</code>, and <code>BashPathManager</code> classes to inherit from the <code>SystemEnvVariableManager</code> class and implement the required methods for each operating system and shell type.</p><p>For example, you can create the <code>SystemEnvVariableManager</code> class as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">SystemEnvVariableManager</span>:
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_env_variable</span>(<span class="hljs-params">cls, name, value</span>):
<span class="hljs-keyword">raise</span> NotImplementedError
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_env_variable</span>(<span class="hljs-params">cls, name</span>):
<span class="hljs-keyword">raise</span> NotImplementedError
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_env_variable</span>(<span class="hljs-params">cls, name</span>):
<span class="hljs-keyword">raise</span> NotImplementedError
</code></div></div></pre><p>This <code>SystemEnvVariableManager</code> class contains abstract methods for adding, removing, and getting system environment variables. These methods will be implemented by the child classes for each operating system and shell type.</p><p>You can then modify the <code>WindowsPathManager</code> class to inherit from the <code>SystemEnvVariableManager</code> class and implement the required methods for the Windows operating system. For example:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>(<span class="hljs-title class_ inherited__">SystemEnvVariableManager</span>):
<span class="hljs-comment"># Other class methods</span>
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_env_variable</span>(<span class="hljs-params">cls, name, value</span>):
<span class="hljs-comment"># Add the environment variable to the Windows system environment variables</span>
<span class="hljs-keyword">with</span> winreg.CreateKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">r"Environment"</span>) <span class="hljs-keyword">as</span> key:
winreg.SetValueEx(key, name, <span class="hljs-number">0</span>, winreg.REG_SZ, value)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_env_variable</span>(<span class="hljs-params">cls, name</span>):
<span class="hljs-comment"># Remove the environment variable from the Windows system environment variables</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">r"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
winreg.DeleteValue(key, name)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_env_variable</span>(<span class="hljs-params">cls, name</span>):
<span class="hljs-comment"># Get the value of the environment variable from the Windows system environment variables</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">r"Environment"</span>) <span class="hljs-keyword">as</span> key:
<span class="hljs-keyword">try</span>:
value, _ = winreg.QueryValueEx(key, name)
<span class="hljs-keyword">return</span> value
<span class="hljs-keyword">except</span> WindowsError:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
</code></div></div></pre><p>This modified <code>WindowsPathManager</code> class inherits from the <code>SystemEnvVariableManager</code> class and implements the required methods for adding, removing, and getting system environment variables for the Windows operating system</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">use both os.getpath and fall back on winreg if it does not work</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To use both <code>os.getenv</code> and <code>winreg</code> to get the value of a system environment variable, you can modify the <code>get_env_variable</code> method of the <code>WindowsPathManager</code> class to first try using <code>os.getenv</code> and then fall back on <code>winreg</code> if it does not work.</p><p>For example, you can modify the <code>get_env_variable</code> method as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_env_variable</span>(<span class="hljs-params">cls, name</span>):
<span class="hljs-comment"># Try using os.getenv to get the value of the environment variable</span>
value = os.getenv(name)
<span class="hljs-comment"># If the value is not found, fall back on winreg</span>
<span class="hljs-keyword">if</span> value <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>:
<span class="hljs-keyword">with</span> winreg.OpenKey(winreg.HKEY_CURRENT_USER, <span class="hljs-string">r"Environment"</span>) <span class="hljs-keyword">as</span> key:
<span class="hljs-keyword">try</span>:
value, _ = winreg.QueryValueEx(key, name)
<span class="hljs-keyword">except</span> WindowsError:
value = <span class="hljs-literal">None</span>
<span class="hljs-keyword">return</span> value
</code></div></div></pre><p>This modified <code>get_env_variable</code> method first tries using <code>os.getenv</code> to get the value of the environment variable. If the value is not found, it falls back on using <code>winreg</code> to get the value from the Windows system environment variables. This allows you to use both <code>os.getenv</code> and <code>winreg</code> to get the value of a system environment variable, with <code>os.getenv</code> being the primary method and <code>winreg</code> being the fallback method.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">switch between user and system env variables for get_env_variable and set_env_variable</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To switch between user and system environment variables for the <code>get_env_variable</code> and <code>set_env_variable</code> methods, you can add a new parameter to these methods to specify whether to use the user or system environment variables.</p><p>For example, you can modify the <code>WindowsPathManager</code> class as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">WindowsPathManager</span>(<span class="hljs-title class_ inherited__">SystemEnvVariableManager</span>):
<span class="hljs-comment"># Other class methods</span>
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_env_variable</span>(<span class="hljs-params">cls, name, value, user=<span class="hljs-literal">True</span></span>):
<span class="hljs-comment"># Determine the registry key to use based on whether to use the user or system environment variables</span>
key = winreg.HKEY_CURRENT_USER <span class="hljs-keyword">if</span> user <span class="hljs-keyword">else</span> winreg.HKEY_LOCAL_MACHINE
<span class="hljs-comment"># Add the environment variable to the Windows system environment variables</span>
<span class="hljs-keyword">with</span> winreg.CreateKey(key, <span class="hljs-string">r"Environment"</span>) <span class="hljs-keyword">as</span> key:
winreg.SetValueEx(key, name, <span class="hljs-number">0</span>, winreg.REG_SZ, value)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_env_variable</span>(<span class="hljs-params">cls, name, user=<span class="hljs-literal">True</span></span>):
<span class="hljs-comment"># Determine the registry key to use based on whether to use the user or system environment variables</span>
key = winreg.HKEY_CURRENT_USER <span class="hljs-keyword">if</span> user <span class="hljs-keyword">else</span> winreg.HKEY_LOCAL_MACHINE
<span class="hljs-comment"># Remove the environment variable from the Windows system environment variables</span>
<span class="hljs-keyword">with</span> winreg.OpenKey(key, <span class="hljs-string">r"Environment"</span>, <span class="hljs-number">0</span>, winreg.KEY_ALL_ACCESS) <span class="hljs-keyword">as</span> key:
winreg.DeleteValue(key, name)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_env_variable</span>(<span class="hljs-params">cls, name, user=<span class="hljs-literal">True</span></span>):
<span class="hljs-comment"># Try using os.getenv to get the value of the environment variable</span>
value = os.getenv(name)
<span class="hljs-comment"># If the value is not found, fall back on winreg</span>
<span class="hljs-keyword">if</span> value <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>:
<span class="hljs-comment"># Determine the registry key to use based on whether to use the user or system environment variables</span>
key = winreg.HKEY_CURRENT_USER <span class="hljs-keyword">if</span> user <span class="hljs-keyword">else</span> winreg.HKEY_LOCAL_MACHINE
<span class="hljs-keyword">with</span> winreg.OpenKey(key, <span class="hljs-string">r"Environment"</span>) <span class="hljs-keyword">as</span> key:
<span class="hljs-keyword">try</span>:
value, _ = winreg
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue adding functionality to the path manager script, you can implement the <code>ZSHPathManager</code> and <code>BashPathManager</code> classes to handle path management for the ZSH and Bash shell types on Mac and Linux operating systems.</p><p>For example, you can implement the <code>ZSHPathManager</code> class as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">ZSHPathManager</span>(<span class="hljs-title class_ inherited__">SystemEnvVariableManager</span>):
<span class="hljs-comment"># Other class methods</span>
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">add_env_variable</span>(<span class="hljs-params">cls, name, value, user=<span class="hljs-literal">True</span></span>):
<span class="hljs-comment"># Determine the path to the ZSH environment variables file based on whether to use the user or system environment variables</span>
<span class="hljs-keyword">if</span> user:
path = os.path.expanduser(<span class="hljs-string">"~/.zshenv"</span>)
<span class="hljs-keyword">else</span>:
path = <span class="hljs-string">"/etc/zshenv"</span>
<span class="hljs-comment"># Add the environment variable to the ZSH environment variables file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(path, <span class="hljs-string">"a"</span>) <span class="hljs-keyword">as</span> f:
f.write(<span class="hljs-string">f"export <span class="hljs-subst">{name}</span>=<span class="hljs-subst">{value}</span>\n"</span>)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">remove_env_variable</span>(<span class="hljs-params">cls, name, user=<span class="hljs-literal">True</span></span>):
<span class="hljs-comment"># Determine the path to the ZSH environment variables file based on whether to use the user or system environment variables</span>
<span class="hljs-keyword">if</span> user:
path = os.path.expanduser(<span class="hljs-string">"~/.zshenv"</span>)
<span class="hljs-keyword">else</span>:
path = <span class="hljs-string">"/etc/zshenv"</span>
<span class="hljs-comment"># Read the contents of the ZSH environment variables file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(path, <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
lines = f.readlines()
<span class="hljs-comment"># Remove the environment variable from the ZSH environment variables file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(path, <span class="hljs-string">"w"</span>) <span class="hljs-keyword">as</span> f:
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> line.startswith(<span class="hljs-string">f"export <span class="hljs-subst">{name}</span>="</span>):
f.write(line)
<span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_env_variable</span>(<span class="hljs-params">cls, name, user=<span class="hljs-literal">True</span></span>):
<span class="hljs-comment"># Determine the path to the ZSH environment variables file based on whether to use the user or system environment variables</span>
<span class="hljs-keyword">if</span> user:
path = os.path.expanduser(<span class="hljs-string">"~/.zshenv"</span>)
<span class="hljs-keyword">else</span>:
path = <span class="hljs-string">"/etc/zshenv"</span>
<span class="hljs-comment"># Read the contents of the ZSH environment variables file</span>
<span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(path, <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
lines = f.readlines()
<span class="hljs-comment"># Search for the environment variable in the ZSH environment variables file</span>
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> lines:
<span class="hljs-keyword">if</span> line.startswith(<span class="hljs-string">f"export <span class="hljs-subst">{name}</span>="</span>):
<span class="hljs-comment"># Return the value of the environment variable</span>
<span class="hljs-keyword">return</span> line.split(<span class="hljs-string">"="</span>)[<span class="hljs-number">1</span>].strip()
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
</code></div></div></pre><p>This <code>ZSHPathManager</code> class inherits from the <code>SystemEnvVariableManager</code> class and implements the required methods for adding, removing, and getting system environment variables for the ZSH shell type on Mac and Linux operating systems.</p><p>Similarly, you can implement the <code>BashPathManager</code> class as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-keyword">class</span> <span class="hljs-title class_">BashPathManager</span>(<span class="hljs-title class_ inherited__">SystemEnvVariableManager</span>):
<span class="hljs-comment"># Other class methods</span>
<span class="hljs-meta"> @classmethod</span>
</code></div></div></pre></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group dark:bg-gray-800"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative flex"><span style="box-sizing: border-box; display: inline-block; overflow: hidden; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: relative; max-width: 100%;"><span style="box-sizing: border-box; display: block; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; max-width: 100%;"><img alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e" style="display: block; max-width: 100%; background-image: none; opacity: 1; border: 0px; margin: 0px; padding: 0px;"></span><img alt="Hansel Wei" srcset="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=32&amp;q=75 1x, /_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75 2x" src="/_next/image?url=https%3A%2F%2Flh3.googleusercontent.com%2Fa-%2FAD5-WCmXNNuORzOLYgemEQ-IEvGPQR0VJfaQGhoixpr4BqgkI-oqiopm_g1DdgYv3qQ8aduYf2uN_mqdjK6WJtUnDpIq3ZCOzGl00UGSzp7HPTSFSb8gENTaWktFJbN2Mh4jQYuaadcIcEFgrtCdi5AaldFVoTfwiwBJ4-O5ypW6AdSiHJ0gt9m6dU5Iae9ruo7wgedNJwcDHHlA_O6qhwM0s36cLhCPgVjbB2Ca1sJ-76TZCey1g62LYjRnawJzVCUiFF2Ia5jfZ1HwukzEjxa0M4qsxPFz34mFhWtkf5LMkSPR-yjBCV_UicKCcnBI-7JyLzlbTytRv0anrDsFn7MQI9te4ecg24XItEU588qcz80hN5ljIWEeM9p9Xd4ianxEW6oWO9cc-khHiYT_yiAPSMPjjZua0mKjZ3fSCv64wlWfvXk0p02GJdX-kHIACdc0dVsH7SWG2n9J9sF7NdQzFYTxEVL9439Bbj8vlSXHPeq_uLa5Mg2ztBmInb--4eDRgBeBA7c6ZDSAmHgEknrUX_00aqafLw950-npm-P1A8N_WuZ1OInjB9YGkXxTnOVhPqaDzCYIB-uK3ad3_1TV66Jop-7AIFAV5mr2Ti8Q7dsK4JGe486VSDQo5Y9v32mDedakOcEKDa4twPoE0SBD4e6OYmpbBype9JaWGMO9ng7FIktuLyEmY6g62tNZyGOJVL0OnQIb_wgV55L4XR3EOfwBXS5RIo2eUYL-gZkfMLwB25fIr1k8aBR8syCZDnrK1pXL5jV8WkNFf7G3cPgDI5p-x_tQzqJ-YcALfU7yQpADTIoCarexHxDuwEzo_wnl-7Ll_Vt1y5MtBka0cVvR_DFbTQtd7lLaoasq1A4aCRoBWo89Ek0MLcFSbK1CjMBE6bpOEg2-5pAA50sk5-Y8ARlywQiZem8Pjn5MK5RBSyGOinMQEPiAZgx6D6hX%3Ds96-c&amp;w=64&amp;q=75" decoding="async" data-nimg="intrinsic" class="rounded-sm" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%;"></span></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap">continue</div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400 md:invisible md:group-hover:visible"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg></button></div></div></div></div><div class="w-full border-b border-black/10 dark:border-gray-900/50 text-gray-800 dark:text-gray-100 group bg-gray-50 dark:bg-[#444654]"><div class="text-base gap-4 md:gap-6 m-auto md:max-w-2xl lg:max-w-2xl xl:max-w-3xl p-4 md:py-6 flex lg:px-0"><div class="w-[30px] flex flex-col relative items-end"><div class="relative h-[30px] w-[30px] p-1 rounded-sm text-white flex items-center justify-center" style="background-color: rgb(16, 163, 127);"><svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" class="h-6 w-6"><path d="M37.5324 16.8707C37.9808 15.5241 38.1363 14.0974 37.9886 12.6859C37.8409 11.2744 37.3934 9.91076 36.676 8.68622C35.6126 6.83404 33.9882 5.3676 32.0373 4.4985C30.0864 3.62941 27.9098 3.40259 25.8215 3.85078C24.8796 2.7893 23.7219 1.94125 22.4257 1.36341C21.1295 0.785575 19.7249 0.491269 18.3058 0.500197C16.1708 0.495044 14.0893 1.16803 12.3614 2.42214C10.6335 3.67624 9.34853 5.44666 8.6917 7.47815C7.30085 7.76286 5.98686 8.3414 4.8377 9.17505C3.68854 10.0087 2.73073 11.0782 2.02839 12.312C0.956464 14.1591 0.498905 16.2988 0.721698 18.4228C0.944492 20.5467 1.83612 22.5449 3.268 24.1293C2.81966 25.4759 2.66413 26.9026 2.81182 28.3141C2.95951 29.7256 3.40701 31.0892 4.12437 32.3138C5.18791 34.1659 6.8123 35.6322 8.76321 36.5013C10.7141 37.3704 12.8907 37.5973 14.9789 37.1492C15.9208 38.2107 17.0786 39.0587 18.3747 39.6366C19.6709 40.2144 21.0755 40.5087 22.4946 40.4998C24.6307 40.5054 26.7133 39.8321 28.4418 38.5772C30.1704 37.3223 31.4556 35.5506 32.1119 33.5179C33.5027 33.2332 34.8167 32.6547 35.9659 31.821C37.115 30.9874 38.0728 29.9178 38.7752 28.684C39.8458 26.8371 40.3023 24.6979 40.0789 22.5748C39.8556 20.4517 38.9639 18.4544 37.5324 16.8707ZM22.4978 37.8849C20.7443 37.8874 19.0459 37.2733 17.6994 36.1501C17.7601 36.117 17.8666 36.0586 17.936 36.0161L25.9004 31.4156C26.1003 31.3019 26.2663 31.137 26.3813 30.9378C26.4964 30.7386 26.5563 30.5124 26.5549 30.2825V19.0542L29.9213 20.998C29.9389 21.0068 29.9541 21.0198 29.9656 21.0359C29.977 21.052 29.9842 21.0707 29.9867 21.0902V30.3889C29.9842 32.375 29.1946 34.2791 27.7909 35.6841C26.3872 37.0892 24.4838 37.8806 22.4978 37.8849ZM6.39227 31.0064C5.51397 29.4888 5.19742 27.7107 5.49804 25.9832C5.55718 26.0187 5.66048 26.0818 5.73461 26.1244L13.699 30.7248C13.8975 30.8408 14.1233 30.902 14.3532 30.902C14.583 30.902 14.8088 30.8408 15.0073 30.7248L24.731 25.1103V28.9979C24.7321 29.0177 24.7283 29.0376 24.7199 29.0556C24.7115 29.0736 24.6988 29.0893 24.6829 29.1012L16.6317 33.7497C14.9096 34.7416 12.8643 35.0097 10.9447 34.4954C9.02506 33.9811 7.38785 32.7263 6.39227 31.0064ZM4.29707 13.6194C5.17156 12.0998 6.55279 10.9364 8.19885 10.3327C8.19885 10.4013 8.19491 10.5228 8.19491 10.6071V19.808C8.19351 20.0378 8.25334 20.2638 8.36823 20.4629C8.48312 20.6619 8.64893 20.8267 8.84863 20.9404L18.5723 26.5542L15.206 28.4979C15.1894 28.5089 15.1703 28.5155 15.1505 28.5173C15.1307 28.5191 15.1107 28.516 15.0924 28.5082L7.04046 23.8557C5.32135 22.8601 4.06716 21.2235 3.55289 19.3046C3.03862 17.3858 3.30624 15.3413 4.29707 13.6194ZM31.955 20.0556L22.2312 14.4411L25.5976 12.4981C25.6142 12.4872 25.6333 12.4805 25.6531 12.4787C25.6729 12.4769 25.6928 12.4801 25.7111 12.4879L33.7631 17.1364C34.9967 17.849 36.0017 18.8982 36.6606 20.1613C37.3194 21.4244 37.6047 22.849 37.4832 24.2684C37.3617 25.6878 36.8382 27.0432 35.9743 28.1759C35.1103 29.3086 33.9415 30.1717 32.6047 30.6641C32.6047 30.5947 32.6047 30.4733 32.6047 30.3889V21.188C32.6066 20.9586 32.5474 20.7328 32.4332 20.5338C32.319 20.3348 32.154 20.1698 31.955 20.0556ZM35.3055 15.0128C35.2464 14.9765 35.1431 14.9142 35.069 14.8717L27.1045 10.2712C26.906 10.1554 26.6803 10.0943 26.4504 10.0943C26.2206 10.0943 25.9948 10.1554 25.7963 10.2712L16.0726 15.8858V11.9982C16.0715 11.9783 16.0753 11.9585 16.0837 11.9405C16.0921 11.9225 16.1048 11.9068 16.1207 11.8949L24.1719 7.25025C25.4053 6.53903 26.8158 6.19376 28.2383 6.25482C29.6608 6.31589 31.0364 6.78077 32.2044 7.59508C33.3723 8.40939 34.2842 9.53945 34.8334 10.8531C35.3826 12.1667 35.5464 13.6095 35.3055 15.0128ZM14.2424 21.9419L10.8752 19.9981C10.8576 19.9893 10.8423 19.9763 10.8309 19.9602C10.8195 19.9441 10.8122 19.9254 10.8098 19.9058V10.6071C10.8107 9.18295 11.2173 7.78848 11.9819 6.58696C12.7466 5.38544 13.8377 4.42659 15.1275 3.82264C16.4173 3.21869 17.8524 2.99464 19.2649 3.1767C20.6775 3.35876 22.0089 3.93941 23.1034 4.85067C23.0427 4.88379 22.937 4.94215 22.8668 4.98473L14.9024 9.58517C14.7025 9.69878 14.5366 9.86356 14.4215 10.0626C14.3065 10.2616 14.2466 10.4877 14.2479 10.7175L14.2424 21.9419ZM16.071 17.9991L20.4018 15.4978L24.7325 17.9975V22.9985L20.4018 25.4983L16.071 22.9985V17.9991Z" fill="currentColor"></path></svg></div></div><div class="relative flex w-[calc(100%-50px)] md:flex-col lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3"><div class="min-h-[20px] flex flex-col items-start gap-4 whitespace-pre-wrap"><div class="markdown prose w-full break-words dark:prose-invert light"><p>To continue adding functionality to the path manager script, you can implement the <code>get_paths</code> and <code>search_path</code> methods for the <code>WindowsPathManager</code>, <code>ZSHPathManager</code>, and <code>BashPathManager</code> classes.</p><p>For example, you can implement the <code>get_paths</code> method for the <code>WindowsPathManager</code> class as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_paths</span>(<span class="hljs-params">cls</span>):
<span class="hljs-comment"># Get the value of the PATH environment variable</span>
path = cls.get_env_variable(<span class="hljs-string">"PATH"</span>)
<span class="hljs-comment"># Split the path into a list of paths</span>
paths = path.split(<span class="hljs-string">";"</span>)
<span class="hljs-keyword">return</span> paths
</code></div></div></pre><p>This <code>get_paths</code> method gets the value of the PATH environment variable using the <code>get_env_variable</code> method and then splits the path into a list of paths.</p><p>You can implement the <code>search_path</code> method for the <code>WindowsPathManager</code> class as follows:</p><pre><div class="bg-black mb-4 rounded-md"><div class="flex items-center relative text-gray-200 bg-gray-800 px-4 py-2 text-xs font-sans"><button class="flex ml-auto gap-2"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path><rect x="8" y="2" width="8" height="4" rx="1" ry="1"></rect></svg>Copy code</button></div><div class="p-4 overflow-y-auto"><code class="!whitespace-pre-wrap hljs language-python"><span class="hljs-meta"> @classmethod</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">search_path</span>(<span class="hljs-params">cls, search_path</span>):
<span class="hljs-comment"># Get the list of paths</span>
paths = cls.get_paths()
<span class="hljs-comment"># Search for the specified path in the list of paths</span>
<span class="hljs-keyword">for</span> path <span class="hljs-keyword">in</span> paths:
<span class="hljs-keyword">if</span> path == search_path:
<span class="hljs-keyword">return</span> <span class="hljs-literal">True</span>
<span class="hljs-keyword">return</span> <span class="hljs-literal">False</span>
</code></div></div></pre><p>This <code>search_path</code> method gets the list of paths using the <code>get_paths</code> method and then searches for the specified path in the list of paths. It returns <code>True</code> if the specified path is found and <code>False</code> otherwise.</p><p>You can implement the <code>get_paths</code> and <code>search_path</code> methods for the <code>ZSHPathManager</code> and <code>BashPathManager</code> classes in a similar manner, using the appropriate commands for the ZSH and Bash shell types on Mac and Linux operating systems.</p><p>Once you have implemented these methods, you can use them in the Typer CLI to provide interactive options for the user to list the current paths in the system path or to search for a specific path in the system path.</p></div></div></div><div class="text-gray-400 flex self-end lg:self-center justify-center mt-2 gap-4 lg:gap-1 lg:absolute lg:top-0 lg:translate-x-full lg:right-0 lg:mt-0 lg:pl-2 visible"><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg></button><button class="p-1 rounded-md hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200 disabled:dark:hover:text-gray-400"><svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="h-4 w-4" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"></path></svg></button></div></div></div></div><div class="w-full h-48 flex-shrink-0"></div></div></div></div><div class="absolute bottom-0 left-0 w-full border-t md:border-t-0 dark:border-white/20 md:border-transparent md:dark:border-transparent md:bg-vert-light-gradient bg-white dark:bg-gray-800 md:!bg-transparent dark:md:bg-vert-dark-gradient"><form class="stretch mx-2 flex flex-row gap-3 pt-2 last:mb-2 md:last:mb-6 lg:mx-auto lg:max-w-3xl lg:pt-6"><div class="relative flex h-full flex-1 md:flex-col"><div class="ml-1 mt-1.5 md:w-full md:m-auto md:flex md:mb-2 gap-2 justify-center"></div><div class="flex flex-col w-full py-2 flex-grow md:py-3 md:pl-4 relative border border-black/10 bg-white dark:border-gray-900/50 dark:text-white dark:bg-gray-700 rounded-md shadow-[0_0_10px_rgba(0,0,0,0.10)] dark:shadow-[0_0_15px_rgba(0,0,0,0.10)]"><textarea tabindex="0" data-id="4ff15752-863f-406e-a4c3-6d27eee81154" rows="1" placeholder="" class="m-0 w-full resize-none border-0 bg-transparent p-0 pr-7 focus:ring-0 focus-visible:ring-0 dark:bg-transparent" style="max-height: 200px; height: 24px; overflow-y: hidden;"></textarea><button class="absolute p-1 rounded-md text-gray-500 bottom-1.5 right-1 md:bottom-2.5 md:right-2 hover:bg-gray-100 dark:hover:text-gray-400 dark:hover:bg-gray-900 disabled:hover:bg-transparent dark:disabled:hover:bg-transparent"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 20 20" class="h-4 w-4 rotate-90" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M10.894 2.553a1 1 0 00-1.788 0l-7 14a1 1 0 001.169 1.409l5-1.429A1 1 0 009 15.571V11a1 1 0 112 0v4.571a1 1 0 00.725.962l5 1.428a1 1 0 001.17-1.408l-7-14z"></path></svg></button></div></div></form><div class="px-3 pt-2 pb-3 text-center text-xs text-black/50 dark:text-white/50 md:px-4 md:pt-3 md:pb-6"><a href="https://help.openai.com/en/articles/6825453-chatgpt-release-notes" target="_blank" rel="noreferrer" class="underline">ChatGPT Dec 15 Version</a>. Free Research Preview. Our goal is to make AI systems more natural and safe to interact with. Your feedback will help us improve.</div></div></main>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment