
    Xh	h                     D   d Z ddlZddlZddlmZmZmZmZ ddlm	Z	 ddl
mZmZ ddlZddlmZ ddlmZ ddlmZmZ dd	lmZmZmZmZmZ d
dddZd Z ej:                  d       ej:                  d       ej:                  d      dZd Z ed       G d d             Z  ed       G d d             Z! ed       G d d             Z" ed       G d de"             Z# ed       G d d             Z$e G d  d!             Z% G d" d#e      Z& G d$ d%e&      Z'y)&z'Base classes for the extension manager.    N)	dataclassfieldfieldsreplace)Path)OptionalUnion)
translator)Enum)ConfigurableLoggingConfigurable)_AppHandler_ensure_optionsdisable_extensionenable_extensionget_app_infoz-alpha.z-beta.z-rc.)abrcc                 @    t        |      }|j                         | d<   y)z0Ensure that the app info has compat_errors fieldcompat_errorsN)r   _get_extension_compat)infoapp_optionshandlers      Q/var/www/html/myenv/lib/python3.12/site-packages/jupyterlab/extensions/manager.py_ensure_compat_errorsr      s    +&G#99;D    z*(?P<name>.*) needs to be included in buildz+(?P<name>.*) needs to be removed from buildz:(?P<name>.*) changed from (?P<oldver>.*) to (?P<newver>.*)install	uninstallupdatec                     t        |       }|j                  d      }g g g d}|D ]U  }t        j                         D ]<  \  }}|j	                  |      }|s||   j                  |j                  d             > W |S )z8Get info about packages scheduled for (un)install/updateT)fastr   name)r   build_check_message_mapitemsmatchappendgroup)r   r   messagesstatusmsgkeypatternr)   s           r   _build_check_infor1   )   s    +&G"""-H";F 8(..0 	8LCMM#&Es""5;;v#67	88
 Mr   T)frozenc                   P   e Zd ZU dZeed<   eed<   eed<   eed<   dZeed<   dZeed	<   d
Z	e
e   ed<   dZeed<   dZeed<   d
Ze
e   ed<   d
Ze
e   ed<   dZeed<   dZeed<   dZeed<   d
Ze
e   ed<   d
Ze
e   ed<   d
Ze
e   ed<   d
Ze
e   ed<   d
Ze
e   ed<   d
Ze
e   ed<   y
)ExtensionPackagea  Extension package entry.

    Attributes:
        name: Package name
        description: Package description
        homepage_url: Package home page
        pkg_type: Type of package - ["prebuilt", "source"]
        allowed: [optional] Whether this extension is allowed or not - default True
        approved: [optional] Whether the package is approved by your administrators - default False
        companion: [optional] Type of companion for the frontend extension - [None, "kernel", "server"]; default None
        core: [optional] Whether the package is a core package or not - default False
        enabled: [optional] Whether the package is enabled or not - default False
        install: [optional] Extension package installation instructions - default None
        installed: [optional] Whether the extension is currently installed - default None
        installed_version: [optional] Installed version - default ""
        latest_version: [optional] Latest available version - default ""
        status: [optional] Package status - ["ok", "warning", "error"]; default "ok"
        author: [optional] Package author - default None
        license: [optional] Package license - default None
        bug_tracker_url: [optional] Package bug tracker URL - default None
        documentation_url: [optional] Package documentation URL - default None
        package_manager_url: Package home page in the package manager - default None
        repository_url: [optional] Package code repository URL - default None
    r%   descriptionhomepage_urlpkg_typeTallowedFapprovedN	companioncoreenabledr    	installed installed_versionlatest_versionokr-   authorlicensebug_tracker_urldocumentation_urlpackage_manager_urlrepository_url)__name__
__module____qualname____doc__str__annotations__r8   boolr9   r:   r   r;   r<   r    dictr=   r?   r@   r-   rB   rC   rD   rE   rF   rG    r   r   r4   r4   7   s    2 IMGTHd#Ix}#D$GT"GXd^" $Ix~$sNCFC FHSM !GXc]!%)OXc])'+x}+)-#-$(NHSM(r   r4   c                   R    e Zd ZU dZeed<   dZee   ed<    ee	      Z
e	e   ed<   y)ActionResultzAction result

    Attributes:
        status: Action status - ["ok", "warning", "error"]
        message: Action status explanation
        needs_restart: Required action follow-up - Valid follow-up are "frontend", "kernel" and "server"
    r-   Nmessagedefault_factoryneeds_restart)rH   rI   rJ   rK   rL   rM   rS   r   r   listrV   rP   r   r   rR   rR   h   s/     K!GXc]!$T:M49:r   rR   c                   B    e Zd ZU dZ ee      Zee   ed<   dZ	e
ed<   y)PluginManagerOptionsal  Plugin manager options.

    Attributes:
        lock_all: Whether to lock (prevent enabling/disabling) all plugins.
        lock_rules: A list of plugins or extensions that cannot be toggled.
            If extension name is provided, all its plugins will be disabled.
            The plugin names need to follow colon-separated format of `extension:plugin`.
    rT   
lock_rulesFlock_allN)rH   rI   rJ   rK   r   	frozensetrZ   rL   rM   r[   rN   rP   r   r   rY   rY   y   s&     "'y!AJ	#AHdr   rY   c                       e Zd ZU dZ ee      Zee   ed<    ee      Z	ee   ed<   dZ
eed<    ee      Zeed<   y)	ExtensionManagerOptionsa  Extension manager options.

    Attributes:
        allowed_extensions_uris: A list of comma-separated URIs to get the allowed extensions list
        blocked_extensions_uris: A list of comma-separated URIs to get the blocked extensions list
        listings_refresh_seconds: The interval delay in seconds to refresh the lists
        listings_tornado_options: The optional kwargs to use for the listings HTTP requests as described on https://www.tornadoweb.org/en/stable/httpclient.html#tornado.httpclient.HTTPRequest
    rT   allowed_extensions_urisblocked_extensions_urisi  listings_refresh_secondslistings_tornado_optionsN)rH   rI   rJ   rK   r   setr_   rL   rM   r`   ra   intrO   rb   rP   r   r   r^   r^      sL     ).c(BSXB(-c(BSXB$+c+%*4%@d@r   r^   c                   >    e Zd ZU dZeed<   dZeed<   dZe	e   ed<   y)ExtensionManagerMetadataa#  Extension manager metadata.

    Attributes:
        name: Extension manager name to be displayed
        can_install: Whether the extension manager can un-/install packages (default False)
        install_path: Installation path for the extensions (default None); e.g. environment path
    r%   Fcan_installNinstall_path)
rH   rI   rJ   rK   rL   rM   rg   rN   rh   r   rP   r   r   rf   rf      s&     IK"&L(3-&r   rf   c                   V    e Zd ZU dZ ee      Zeeeee	e
f      f   ed<   dZeed<   y)ExtensionsCachez{Extensions cache

    Attributes:
        cache: Extension list per page
        last_page: Last available page result
    rT   cache   	last_pageN)rH   rI   rJ   rK   r   rO   rk   rd   r   rL   r4   rM   rm   rP   r   r   rj   rj      s>     ?DTX>YE4Xd3(8#89::;YIsr   rj   c            	            e Zd ZdZ eg ddd      j                  d      Z	 	 	 dd	ee   d
ee   dee	   ddf fdZ
defdZdee   dee   fdZdeeee   f   defdZdeeee   f   defdZ xZS )PluginManagera  Plugin manager enables or disables plugins unless locked.

    It can also disable/enable all plugins in an extension.

    Args:
        app_options: Application options
        ext_options: Plugin manager (subset of extension manager) options
        parent: Configurable parent

    Attributes:
        app_options: Application options
        options: Plugin manager options
    )
sys_prefixusersystemrp   z:Level at which to manage plugins: sys_prefix, user, system)valuesdefault_valuehelpT)configNr   ext_optionsparentreturnc                    t         	|   |       | j                  j                  d| j                  j
                   d| j                   d       t        |      | _        t        t              D ch c]  }|j                   }}|xs i j                         D ci c]  \  }}||v r|| }}}t        di || _        y c c}w c c}}w )N)rx   zPlugins in z will managed on the z levelrP   )super__init__logdebug	__class__rH   levelr   r   r   rY   r%   r(   options)
selfr   rw   rx   fplugin_options_fieldoptionvalueplugin_optionsr   s
            r   r|   zPluginManager.__init__   s     	'$..1122G

|SYZ	
 +;7067K0LM1MM #."3!:!:!<
-- EM
 

 ,=n=  N
s   3CC	c                 v   K   t        | j                  j                        | j                  j                  dS w)z8Get information about locks on plugin enabling/disabling)	lockRules	allLocked)rW   r   rZ   r[   r   s    r   plugin_lockszPluginManager.plugin_locks   s1      dll556..
 	
s   79plugins_or_extensionsc                 h   | j                   j                  rt        |      S t               }| j                   j                  D ch c]  }|j	                  d      d    }}|D ]G  }d|v r+|| j                   j                  v s |j                  |       2||v s7|j                  |       I |S c c}w )z9Find a subset of plugins (or extensions) which are locked:r   )r   r[   rc   rZ   splitadd)r   r   locked_subsetpluginextensions_with_locked_pluginss        r   _find_lockedzPluginManager._find_locked   s    <<  ,--/3||/F/F*
%+FLLa *
& *
 , 	*Ff}T\\444!%%f-99 !!&)	* *
s   B/pluginsc                   K   t        |t              r|n|g}| j                  |      }t        j                  d      }|r.t        d|j                  d      dj                  |      z         S 	 |D ]$  }t        || j                  | j                         & t        ddg	      S # t        $ r }t        dt        |            cY d
}~S d
}~ww xY ww)zDisable a set of plugins (or an extension).

        Args:
            plugins: The list of plugins to disable
        Returns:
            The action result
        
jupyterlaberrorz=The following plugins cannot be disabled as they are locked: , r-   rS   r   r   rA   frontendr-   rV   N)
isinstancerW   r   r
   loadrR   gettextjoinr   r   r   	Exceptionreprr   r   lockedtransr   errs         r   disablezPluginManager.disable   s      (6'WI""7+-S ))F#$ 	C! Z!&d6F6FdjjYZtJ<HH 	CwS	BB	C6   A,C/6B& %C&	C/C
CC
CCc                   K   t        |t              r|n|g}| j                  |      }t        j                  d      }|r.t        d|j                  d      dj                  |      z         S 	 |D ]$  }t        || j                  | j                         & t        ddg	      S # t        $ r }t        dt        |            cY d
}~S d
}~ww xY ww)zEnable a set of plugins (or an extension).

        Args:
            plugins: The list of plugins to enable
        Returns:
            The action result
        r   r   z<The following plugins cannot be enabled as they are locked: r   r   r   rA   r   r   N)r   rW   r   r
   r   rR   r   r   r   r   r   r   r   r   s         r   enablezPluginManager.enable  s      (6'WI""7+-R ))F#$ 	C! Y T5E5ETZZXYtJ<HH 	CwS	BB	Cr   NNN)rH   rI   rJ   rK   r   tagr   r   rO   r   r|   r   rW   rL   r\   r   r	   rR   r   r   __classcell__r   s   @r   ro   ro      s     /"I 
cc	 
 '+&*)-	>d^> d^> &	>
 
>&
D 
$s) 	# &CU3S	>%: C| C4CE#tCy.$9 Cl Cr   ro   c                       e Zd ZdZ	 	 	 ddee   dee   dee   ddf fdZd Ze	de
fd	       Zd
edee   fdZdedededeeeef   ee   f   fdZd d
edee   defdZd
edefdZededefd       Zd
edefdZ	 d!dee   dededeee   ee   f   fdZdee   dededdfdZd"dZ	 d#deeef   fdZdedee   fdZdee   fdZdedefdZ	 d!dee   dededdfdZ  xZ!S )$ExtensionManagera  Base abstract extension manager.

    Note:
        Any concrete implementation will need to implement the five
        following abstract methods:
        - :ref:`metadata`
        - :ref:`get_latest_version`
        - :ref:`list_packages`
        - :ref:`install`
        - :ref:`uninstall`

        It could be interesting to override the :ref:`get_normalized_name`
        method too.

    Args:
        app_options: Application options
        ext_options: Extension manager options
        parent: Configurable parent

    Attributes:
        log: Logger
        app_dir: Application directory
        core_config: Core configuration
        app_options: Application options
        options: Extension manager options
    Nr   rw   rx   ry   c                 `   t         |   |||       | j                  j                  | _        t        | j                  j                        | _        | j                  j                  | _        t        di |xs i | _	        i | _
        d | _        d| _        d | _        t        | j                  j                        st        | j                  j                         rt        | j                  j                        dk(  | _        | j                  s=t        | j                  j                         dkD  r| j                  j#                  d       t$        j&                  j)                  | j*                  | j                  j,                  dz  d      | _        | j                  j/                          y y )	N)r   rw   rx   Tr   zqYou have define simultaneously blocked and allowed extensions listings. The allowed listing will take precedence.i  g?)callback_timejitterrP   )r{   r|   r   loggerr}   r   app_dircore_configr^   r   _extensions_cache_listings_cache_listings_block_mode_listing_fetchlenr_   r`   warningtornadoioloopPeriodicCallback_fetch_listingsra   start)r   r   rw   rx   r   s       r   r|   zExtensionManager.__init__H  s\    	[kRXY##**D,,445++77.E+2CEGI/3$(!IMt||334DLL<`<`8a(+DLL,P,P(QUV(VD%,,T\\5Y5Y1Z]^1^   H #*.."A"A$$"llCCdJ #B #D
 %%' 9br   c                 R    | j                   | j                   j                          y y N)r   stopr   s    r   __del__zExtensionManager.__del__f  s%    *$$& +r   c                     t               )zExtension manager metadata.NotImplementedErrorr   s    r   metadatazExtensionManager.metadataj  s     "##r   	extensionc                    K   t               w)zReturn the latest available version for a given extension.

        Args:
            pkg: The extension name
        Returns:
            The latest available version
        r   r   r   s     r   get_latest_versionz#ExtensionManager.get_latest_versiono  s      "##   querypageper_pagec                    K   t               w)ab  List the available extensions.

        Args:
            query: The search extension query
            page: The result page
            per_page: The number of results per page
        Returns:
            The available extensions in a mapping {name: metadata}
            The results last page; None if the manager does not support pagination
        r   r   r   r   r   s       r   list_packageszExtensionManager.list_packagesy        "##r   versionc                    K   t               w)a  Install the required extension.

        Note:
            If the user must be notified with a message (like asking to restart the
            server), the result should be
            {"status": "warning", "message": "<explanation for the user>"}

        Args:
            extension: The extension name
            version: The version to install; default None (i.e. the latest possible)
        Returns:
            The action result
        r   )r   r   r   s      r   r    zExtensionManager.install  s      "##r   c                    K   t               w)aj  Uninstall the required extension.

        Note:
            If the user must be notified with a message (like asking to restart the
            server), the result should be
            {"status": "warning", "message": "<explanation for the user>"}

        Args:
            extension: The extension name
        Returns:
            The action result
        r   r   s     r   r!   zExtensionManager.uninstall  r   r   c           	      b    t        j                  dd t        j                  dd|       d         S )a;  Convert a Python version to Semver version.

        It:

        - drops ``.devN`` and ``.postN``
        - converts ``aN``, ``bN`` and ``rcN`` to ``-alpha.N``, ``-beta.N``, ``-rc.N`` respectively

        Args:
            version: Version to convert
        Returns
            Semver compatible version
        z(a|b|rc)(\d+)$c                 X    t         | j                  d          | j                  d       S )Nrl      )PYTHON_TO_SEMVERr+   )ms    r   <lambda>z5ExtensionManager.get_semver_version.<locals>.<lambda>  s&    )!''!*56qwwqzlC r   z\.(dev|post)\d+r>   r   )resubsubn)r   s    r   get_semver_versionz#ExtensionManager.get_semver_version  s1     vvCGG&G4Q7
 	
r   c                     |j                   S )a  Normalize extension name.

        Extension have multiple parts, npm package, Python package,...
        Sub-classes may override this method to ensure the name of
        an extension from the service provider and the local installed
        listing is matching.

        Args:
            extension: The extension metadata
        Returns:
            The normalized name
        )r%   r   s     r   get_normalized_namez$ExtensionManager.get_normalized_name  s     ~~r   c                 &  K   || j                   vs|| j                   |   j                  vr| j                  |||       d{    | j                  .| j                  "| j                  j                          d{    | j                   |   j                  |   }|i }t        |j                               }|3| j                  &t        | j                        }g }| j                  r|j                         D ]n  \  }}||vr|j                  t        |d             '|j                  s4| j                  j                  d| d       |j                  t        |d             p n|j                         D ]n  \  }}||v r|j                  t        |d             '|j                  s4| j                  j                  d| d       |j                  t        |d             p || j                   |   j                  fS 7 7 w)aL  List extensions for a given ``query`` search term.

        This will return the extensions installed (if ``query`` is None) or
        available if allowed by the listing settings.

        Args:
            query: [optional] Query search term.

        Returns:
            The extensions
            Last page of results
        NT)r8   zBlocked extension 'z' is installed.FzNot allowed extension ')r   rk   refreshr   r   callbackrW   rs   r   r(   r*   r   r?   r}   r   rm   )	r   r   r   r   rk   
extensionslistingr%   exts	            r   list_extensionsz ExtensionManager.list_extensions  s     ...$d>T>TUZ>[>a>a2a,,udH555 'D,?,?,K%%..000&&u-33D9=E%,,.)
!5!5!A4//0GJ((!& GID#7*"))'#t*DE..((+>tfO)TU"))'#u*EFG "' GID#w"))'#t*DE..((+B4&)XY"))'#u*EFG 411%8BBBB9 6 1s3   A HH9H<H=B3H1BH3AHHc                    K   || j                   v rd| j                   |   j                  |<   | j                  |||       d{    y7 w)zRefresh the list of extensions.N)r   rk   _update_extensions_listr   s       r   r   zExtensionManager.refresh  sG     D***8<D""5)//5**5$AAAs   AAA	Ac                   K   g }t         j                  j                         }| j                  rt	        | j
                  j                        r| j                  j                  d| j
                  j                          | j
                  j                  D ]q  } |j                  |fi | j
                  j                   d{   }t        j                  |j                        }|j                  |j                  dg              s nt	        | j
                  j                         r| j                  j                  d| j
                  j                           | j
                  j                   D ]q  } |j                  |fi | j
                  j                   d{   }t        j                  |j                        }|j                  |j                  dg              s |D ci c]  }|d   |
 c}| _        y7 =7 cc c}w w)z-Fetch the listings for the extension manager.z!Fetching blocked extensions from Nblocked_extensionsz!Fetching allowed extensions from allowed_extensionsr%   )r   
httpclientAsyncHTTPClientr   r   r   r`   r}   r   fetchrb   jsonloadsbodyextendgetr_   r   )r   rulesclientblocked_extensions_urirjallowed_extensions_uris          r   r   z ExtensionManager._fetch_listings  s    ##335$$4<<77878\8\7]^ /3ll.R.R B**fll.,,?? A 

166*ALL';R!@AB 556HHMM3DLL4X4X3YZ +/,,*N*N >&&&,,*ll;;  JJqvv&QUU#7<=> 7<<&	1<%  =s8   CHHCH H!A
H+H8
HHHc                 d	  K   | j                   }t        |      }t        |      }t        ||       i }|d   j	                         D ]  \  }}d}|}	|d   j                  |d      rd}| j                  |      }
t        d)i d|
d|	j                  dd	      d
|j                  dd	      d||d   vdddt        j                  |d         dddt        j                  |d         d|d|j                  di       ddd| j                  |      d|j                  di       j                  d|j                  d            d|j                  d      d|j                  di       j                  d      d|j                  di       j                  d|j                  d            }|r.t        || j                  |j                         d{          }|||
<    |d!   j	                         D ]  \  }}||d"   v rd}|d   j                  |d      rd}n|j                         D ]	  }||v sd#} | j                  |      }
t        |
|j                  dd	      |d   ||d   vdt        j                  |d         dt        j                  |d         |d$| j                  |      |j                  di       j                  d|j                  d            |j                  d      |j                  di       j                  d      |j                  di       j                  d|j                  d            %      }|r.t        || j                  |j                         d{          }|||
<    |d&   D ]  }| j                  |      }|| j                  |      }
t        |
|j                  dd	      |j                  d'd	      dddt        j                  |d         t        j                  |d         d#d|j                  di       j                  d|j                  d            |j                  d      |j                  di       j                  d      |j                  di       j                  d|j                  d            (      }|||
<   ! |S 7 7 >w)*zGet the installed extensions.

        Args:
            get_latest_version: Whether to fetch the latest extension version or not.
        Returns:
            The installed extensions as a mapping {name: metadata}
        )r   federated_extensionsrA   r   Nr   r%   r5   r>   r6   urlr<   disabledr;   Fr@   r   r=   Tr?   r-   r    r7   prebuiltr:   rB   rC   rD   bugsrG   
repository)r@   r   shadowed_extsr   source)r%   r5   r6   r<   r;   r@   r=   r?   r-   r7   r:   rB   rC   rD   rG   r!   homepage)r%   r5   r6   r=   r<   r;   r@   r?   r-   r7   rB   rC   rD   rG   rP   )r   r   r1   r   r(   r   _normalize_namer4   r   r   _get_companionr   r   r%   rs   _get_scheduled_uninstall_info)r   r   r   r   build_check_infor   r%   datar-   pkg_infonormalized_namepkgpackagess                r   _get_installed_extensionsz*ExtensionManager._get_installed_extensions  s     &&4,[9dK0
 56<<> 	.JD$FHO$((t4 "2248O" $$LL; "XXeR0 T*%55	
   0BB4	?S  #3"E"Ed9o"V  B/ $ --d3 xx"-11&$((8:LM + !% 4 8 8 ?   $xxb9==eTXXlE[\!C& "c8O8OPSPXPX8Y2YZ*-J';	.> |,224  	.JD$tO,,FO$((t4  0 7 7 9 +Hx'!*+ #2248O"$ HH]B7!%[T*%55/BB4	?S"2"E"Ed9o"V!--d3xx"-11&$((8:LM+ $ 4 8 8 ?#xxb9==eTXXlE[\C" "c8O8OPSPXPX8Y2YZ*-J'A 	.D %[1 	2D55d;D"&"6"6t"<&( $ ;!%*b!9#!#3#F#FtI#W&6&I&I$y/&Z$'88Hb155fdhhx>PQ HHY/$(HHVR$8$<$<U$C#'88L"#=#A#A%R^I_#`  /2
?+)	2, y 3ZF 3Zs3   GR0R*A$R0;D4R0/R-0-R0DR0-R0r  c                 L    d }d|d   v rd|d   d   v rd}|S d|d   d   v rd}|S )N	discoveryr   serverkernelrP   )r   r  r:   s      r   r  zExtensionManager._get_companion  sR    	$|,,4-k::$	  T,/<<$	r   c                     | j                   dz  dz  |z  dz  }|j                         r/|j                         5 }t        j                  |      cddd       S y# 1 sw Y   yxY w)zDGet information about a package that is scheduled for uninstallationstagingnode_moduleszpackage.jsonN)r   existsopenr   r   )r   r%   targetfids       r   r  z.ExtensionManager._get_scheduled_uninstall_info  s]    	)N:TANR==? &#yy~& & & &s   AA"r%   c                     |S )zNormalize extension name; by default does nothing.

        Args:
            name: Extension name
        Returns:
            Normalized name
        rP   )r   r%   s     r   r  z ExtensionManager._normalize_name  s	     r   c                 N  K   d}|| j                  |||       d{   \  }}n| j                          d{   }|| j                  v r5|| j                  |   j                  |<   |xs d| j                  |   _        yt        ||i|xs d      | j                  |<   y7 7 iw)zUpdate the list of extensionsNrl   )r   r  r   rk   rm   rj   )r   r   r   r   rm   r   s         r   r   z(ExtensionManager._update_extensions_list  s      	*.*<*<UD(*S$S!J	  $==??JD***8BD""5)//56?n1D""5)3,;T:<NPYP^]^,_D""5) %T @s    B%B!B%B#A(B%#B%r   r   )Nrl      )ry   N)T)"rH   rI   rJ   rK   r   rO   r   r|   r   propertyrf   r   rL   r   rd   tupler4   r   rR   r    r!   staticmethodr   r   rW   r   r   r   r  r  r  r  r   r   r   s   @r   r   r   ,  s0   : '+&*)-	(d^( d^( &	(
 
(<' $2 $ $$# $(3- $$$ #$/2$	tC))*HSM9	:$$s $Xc] $l $ $ $ $ 
C 
C 
 
&-= #   KM,Cc],C14,CDG,C	t$%x}4	5,C\B8C= B Bs Bt B=> "&h	c##	$hT4 HSM Xd^ C C  KM`c]`14`DG`	`r   r   )(rK   r   r   dataclassesr   r   r   r   pathlibr   typingr   r	   r   #jupyterlab_server.translation_utilsr
   	traitletsr   traitlets.configr   r   jupyterlab.commandsr   r   r   r   r   r   r   compiler'   r1   r4   rR   rY   r^   rf   rj   ro   r   rP   r   r   <module>r.     sY   -
  	 9 9  "  :  >  #@ < rzzGHJKbjjVW $-) -) -)` $; ; ;  $   $A2 A A  $' ' ' 	 	 	tC' tCnF`} F`r   