Ë
    :vžjŠ  ã                   ó^  — d Z ddlZddlZddlmZmZmZmZm	Z	 ddlm
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  ej0                  d
«      Zdej4                  _         G d„ de«      Z G d„ d«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z  G d„ de«      Z! G d„ de«      Z"y)zÑ
primitives.py
----------------

Subclasses of Trimesh objects that are parameterized as primitives.

Useful because you can move boxes and spheres around
and then use trimesh operations on them at any point.
é    Né   )ÚcreationÚinertiaÚsampleÚ	trianglesÚutil)Útransformations)ÚTrimesh)Úcache_decorator)ÚlogÚtol)Ú	ArrayLikeÚIntegerÚNumberÚSeedé   Fc                   ó  ‡ — e Zd ZdZdZdZˆ fd„Zd„ Zed„ «       Z	e	j                  d„ «       Z	ed„ «       Zej                  d„ «       Zed	„ «       Zej                  d
„ «       Zed„ «       Zej                  d„ «       Zdd„Zd„ Zd„ Zd„ Zˆ xZS )Ú	Primitivez‚
    Geometric Primitives which are a subclass of Trimesh.
    Mesh is generated lazily when vertices or faces are requested.
    Nc                 ó†   •— t         ‰| �  «        | j                  j                  «        d| _        d| j
                  _        y )NFT)ÚsuperÚ__init__Ú_dataÚclearÚ	_validateÚ_cacheÚforce_immutable)ÚselfÚ	__class__s    €úc/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/trimesh/primitives.pyr   zPrimitive.__init__%   s5   ø€ ä‰ÑÔð 	�
‰
×ÑÔØˆŒð '+ˆ�‰Õ#ó    c                 ó4   — dt        | «      j                  › d�S )Nz<trimesh.primitives.Ú>)ÚtypeÚ__name__©r   s    r   Ú__repr__zPrimitive.__repr__1   s   € Ø%¤d¨4£j×&9Ñ&9Ð%:¸!Ð<Ð<r    c                 óŽ   — | j                   d   }t        j                  |d«      r|S | j                  «        | j                   d   S )NÚfaces©éÿÿÿÿé   ©r   r   Úis_shapeÚ_create_mesh©r   Ústoreds     r   r(   zPrimitive.faces4   s>   € à—‘˜WÑ%ˆÜ�=‰=˜ Ô)ØˆMØ×ÑÔØ�{‰{˜7Ñ#Ð#r    c                 ó   — |�t        d«      ‚y )Nz+primitive faces are immutable: not setting!©Ú
ValueError©r   Úvaluess     r   r(   zPrimitive.faces<   s   € àÐÜÐJÓKÐKð r    c                 óŽ   — | j                   d   }t        j                  |d«      r|S | j                  «        | j                   d   S )NÚverticesr)   r,   r/   s     r   r7   zPrimitive.verticesA   s>   € à—‘˜ZÑ(ˆÜ�=‰=˜ Ô)ØˆMà×ÑÔØ�{‰{˜:Ñ&Ð&r    c                 ó   — |�t        d«      ‚y )Nz.primitive vertices are immutable: not setting!r2   r4   s     r   r7   zPrimitive.verticesJ   s   € àÐÜÐMÓNÐNð r    c                 ó<  — d| j                   vr| j                  «        | j                   d   }t        j                  |d«      r|S t	        j
                  | j                  «      \  }}t        j                  t        |«      df«      }|||<   || j                   d<   |S )Nr7   Úface_normalsr)   r+   )	r   r.   r   r-   r   ÚnormalsÚnpÚzerosÚlen)r   r0   ÚunitÚvalidr;   s        r   r:   zPrimitive.face_normalsO   s‹   € ð
 ˜TŸ[™[Ñ(Ø×ÑÔð —‘˜^Ñ,ˆÜ�=‰=˜ Ô)ØˆMô  ×'Ñ'¨¯©Ó7‰ˆˆeÜ—(‘(œC ›J¨˜?Ó+ˆØˆ�‰à&-ˆ�‰�NÑ#Øˆr    c                 ó4   — |�t        j                  d«       y y )Nz%Primitive face normals are immutable!)r   Úwarningr4   s     r   r:   zPrimitive.face_normalsf   s   € àÐÜ�K‰KÐ?Õ@ð r    c                 ó.   — | j                   j                  S )z¬
        The transform of the Primitive object.

        Returns
        -------------
        transform : (4, 4) float
          Homogeneous transformation matrix
        ©Ú	primitiveÚ	transformr%   s    r   rF   zPrimitive.transformk   s   € ð �~‰~×'Ñ'Ð'r    c                 ó   — t        «       ‚)z:
        Should be implemented by each primitive.
        )ÚNotImplementedErrorr%   s    r   Úto_dictzPrimitive.to_dictw   s   € ô
 "Ó#Ð#r    c                 óœ  — |j                  | j                  «       «       |j                  d«        t        | «      di |¤Ž}|r| j                  j                  «       |_        | j                  j                  «       |_        | j                  j                  j                  «       D ]#  \  }}||j                  vsŒ||j                  |<   Œ% |S )z›
        Return a copy of the Primitive object.

        Returns
        -------------
        copied : object
          Copy of current primitive
        Úkind© )
ÚupdaterI   Úpopr#   ÚvisualÚcopyÚmetadatar   ÚdataÚitems)r   Úinclude_visualÚkwargsÚprimitive_copyÚkÚvs         r   rP   zPrimitive.copy~   s©   € ð 	�‰�d—l‘l“nÔ%à�
‰
�6Ôà#œ˜d›Ñ- fÑ-ˆáà$(§K¡K×$4Ñ$4Ó$6ˆNÔ!ð #'§-¡-×"4Ñ"4Ó"6ˆÔà—J‘J—O‘O×)Ñ)Ö+‰DˆAˆqØ˜×,Ñ,Ò,Ø*+�×$Ñ$ QÒ'ð ,ð Ðr    c           
      óÖ   — t        d| j                  j                  «       | j                  j                  «       | j                  j                  «       |j                  dd«      dœ|¤Ž}|S )a,  
        Return a copy of the Primitive object as a Trimesh.

        Parameters
        -----------
        kwargs : dict
          Passed to the Trimesh object constructor.

        Returns
        ------------
        mesh : trimesh.Trimesh
          Tessellated version of the primitive.
        ÚprocessF)r7   r(   r:   rZ   rL   )r
   r7   rP   r(   r:   rN   )r   rU   Úresults      r   Úto_meshzPrimitive.to_mesh›   sb   € ô ð 
Ø—]‘]×'Ñ'Ó)Ø—*‘*—/‘/Ó#Ø×*Ñ*×/Ñ/Ó1Ø—J‘J˜y¨%Ó0ñ	
ð
 ñ
ˆð ˆr    c                 óœ  — t        j                  |dt         j                  ¬«      }|j                  dk7  rt	        d«      ‚t        j                  |t        d«      r| S | j                  }|j                  j                  «       }t         j                  j                  |dd…dd…f   «      dz  }t        t        t        t         f}t#        | |«      r´t%        |d	z
  «      dkD  r£t'        |d
«      r|xj(                  |z  c_        t'        |d«      r|xj*                  |z  c_        t'        |d«      r|xj,                  |z  c_        |dd…dfxx   |z  cc<   t        j.                  |t1        j2                  d	|z  «      |g«      }nt        j4                  ||«      }t1        j6                  |«      st	        d«      ‚|| j                  _	        | S )at  
        Apply a transform to the current primitive by
        applying a new transform on top of existing
        `self.primitive.transform`. If the matrix
        contains scaling it will change parameters
        like `radius` or `height` automatically.

        Parameters
        ------------
        matrix: (4, 4) float
          Homogeneous transformation
        ÚC)ÚorderÚdtype©r   r   zmatrix must be `(4, 4)`!g:Œ0âŽyE>Nr+   gUUUUUUÕ?ç      ð?ÚheightÚradiusÚextentsz!Couldn't produce rigid transform!)r<   Ú
asanyarrayÚfloat64Úshaper3   r   ÚallcloseÚ	_IDENTITYrE   rF   rP   ÚlinalgÚdetÚBoxÚCylinderÚCapsuleÚSphereÚ
isinstanceÚabsÚhasattrrc   rd   re   Ú	multi_dotÚtfÚscale_matrixÚdotÚis_rigid)r   ÚmatrixÚprimÚcurrentÚscaleÚkindsÚupdateds          r   Úapply_transformzPrimitive.apply_transform²   sr  € ô —‘˜v¨S¼¿
¹
ÔCˆØ�<‰<˜6Ò!ÜÐ7Ó8Ð8Ü�=‰=˜¤¨DÔ1àˆKà�~‰~ˆà—.‘.×%Ñ%Ó'ˆä—	‘	—‘˜f R a R¨¨!¨ V™nÓ-°)Ñ<ˆô ”h¤¬Ð0ˆÜ�d˜EÔ"¤s¨5°3©;Ó'7¸$Ò'>ä�t˜XÔ&Ø—’˜uÑ$•Ü�t˜XÔ&Ø—’˜uÑ$•Ü�t˜YÔ'Ø—’ Ñ%•à�B�Q�B˜�E‹N˜eÑ#‹Nä—n‘n f¬b¯o©o¸cÀE¹kÓ.JÈGÐ%TÓU‰Gô —f‘f˜V WÓ-ˆGô �{‰{˜7Ô#ÜÐ@ÓAÐAð $+ˆ�‰Ô àˆr    c                 ó   — t        d«      ‚)Nz'Primitive doesn't define mesh creation!r2   r%   s    r   r.   zPrimitive._create_meshè   s   € ÜÐBÓCÐCr    ©T)r$   Ú
__module__Ú__qualname__Ú__doc__Ú__copy__Ú__deepcopy__r   r&   Úpropertyr(   Úsetterr7   r:   rF   ÚabcÚabstractmethodrI   rP   r\   r   r.   Ú__classcell__©r   s   @r   r   r      sî   ø„ ñð €HØ€Lô
+ò=ð ñ$ó ð$ð ‡\�\ñLó ðLð ñ'ó ð'ð ‡_�_ñOó ðOð ñó ðð, ×ÑñAó ðAð ñ	(ó ð	(ð 	×Ññ$ó ð$óò:ò.4ölDr    r   c                   óJ   ‡ — e Zd ZdZdd„Zed„ «       Zˆ fd„Zˆ fd„Zd„ Zˆ xZ	S )ÚPrimitiveAttributesz:
    Hold the mutable data which defines a primitive.
    c                 ób  — |j                   | _         || _        || _        | j                   j                  |«       || _        |j                  «       D ]=  \  }}|j                  |d«      }|€Œt        j                  ||«      | j                   |<   Œ? | j                  sd| j                   _	        yy)a5  
        Hold the attributes for a Primitive.

        Parameters
        ------------
        parent : Primitive
          Parent object reference.
        defaults : dict
          The default values for this primitive type.
        kwargs : dict
          User-passed values, i.e. {'radius': 10.0}
        NF)
r   Ú	_defaultsÚ_parentrM   Ú_mutablerS   Úgetr   Úconvert_likeÚmutable)r   ÚparentÚdefaultsrU   r•   ÚkeyÚdefaultÚvalues           r   r   zPrimitiveAttributes.__init__ñ   s—   € ð —\‘\ˆŒ
à!ˆŒàˆŒà�
‰
×Ñ˜(Ô#àˆŒð %ŸN™NÖ,‰LˆC�Ø—J‘J˜s DÓ)ˆEØÑ ä"&×"3Ñ"3°E¸7Ó"C�—
‘
˜3’ð	 -ð �}Š}Ø!&ˆD�J‰JÕð r    c                 ó¬   — dd l }dj                  | j                  j                  j                  |j                  | j                  d¬«      dd ¬«      }|S )Nr   a'  Store the attributes of a {name} object.

When these values are changed, the mesh geometry will 
automatically be updated to reflect the new values.

Available properties and their default values are:
 {defaults}

Example
---------------
p = trimesh.primitives.{name}()
p.primitive.radius = 10

r*   )Úwidthr   )Únamer—   )ÚpprintÚformatr‘   r   r$   Úpformatr�   )r   rž   Údocs      r   r„   zPrimitiveAttributes.__doc__  sW   € ó
 	ð÷ ‰&Ø—‘×'Ñ'×0Ñ0Ø—^‘^ D§N¡N¸"�^Ó=¸aÀÐCð ó 
ð 	ð ˆ
r    c                 ó  •— |j                  d«      rt        ‰| �	  |«      S |dk(  r| j                  d   d d…df   S || j                  v r0t        j                  | j                  |   | j                  |   «      S t        d|› d�«      ‚)NÚ_ÚcenterrF   r+   z#primitive object has no attribute 'z' )Ú
startswithr   Ú__getattr__r   r�   r   r”   ÚAttributeError)r   r˜   r   s     €r   r¦   zPrimitiveAttributes.__getattr__)  s‡   ø€ Ø�>‰>˜#ÔÜ‘7Ñ& sÓ+Ð+Ø�HŠ_à—:‘:˜kÑ*¨2¨A¨2¨q¨5Ñ1Ð1Ø�D—N‘NÑ"Ü×$Ñ$ T§Z¡Z°¡_°d·n±nÀSÑ6IÓJÐJÜÐBÀ3À%ÀrÐJÓKÐKr    c                 ó  •— |j                  d«      rt        ‰| �	  ||«      S |dk(  rSt        j                  |t        j
                  ¬«      }t        j                  d«      }||d d…df<   || j                  d<   y || j                  v rH| j                  r1t        j                  || j                  |   «      | j                  |<   y t        d«      ‚t        | j                  j                  «       «      }t        d|› d	�«      ‚)
Nr£   r¤   ©r`   r   r+   rF   z;Primitive is configured as immutable! Cannot set attribute!zOnly default attributes z can be set!)r¥   r   Ú__setattr__r<   Úarrayrg   Úeyer   r�   r’   r   r”   r3   ÚlistÚkeys)r   r˜   rš   rF   r®   r   s        €r   rª   zPrimitiveAttributes.__setattr__3  sà   ø€ Ø�>‰>˜#ÔÜ‘7Ñ& s¨EÓ2Ð2Ø�HŠ_Ü—H‘H˜U¬"¯*©*Ô5ˆEÜŸ™˜q›	ˆIØ$ˆI�b�q�b˜!�eÑØ&/ˆD�J‰J�{Ñ#ØØ�D—N‘NÑ"Ø�}Š}Ü"&×"3Ñ"3°E¸4¿>¹>È#Ñ;NÓ"O�—
‘
˜3’ä ØQóð ô ˜Ÿ™×+Ñ+Ó-Ó.ˆDÜÐ7¸°v¸\ÐJÓKÐKr    c                 óˆ   — t        t        t        | «      «      t        | j                  j                  «       «      z   «      }|S ©N)ÚsortedÚdirr#   r­   r�   r®   )r   r[   s     r   Ú__dir__zPrimitiveAttributes.__dir__G  s0   € ÜœœD ›J›¬$¨t¯~©~×/BÑ/BÓ/DÓ*EÑEÓFˆØˆr    r�   )
r$   r‚   rƒ   r„   r   r‡   r¦   rª   r³   r‹   rŒ   s   @r   rŽ   rŽ   ì   s3   ø„ ñó 'ðD ñó ðô*LôLö(r    rŽ   c                   óˆ   ‡ — e Zd Zdˆ fd„	Zed„ «       Zedefd„«       Zed„ «       Zed„ «       Z	e
d„ «       Zd„ Zd	„ Zd
„ Zˆ xZS )rn   c           	      óˆ   •— t         ‰| �  «        ddt        j                  d«      ddœ}t	        | |||||dœ|¬«      | _        y)a´  
        Create a Cylinder Primitive, a subclass of Trimesh.

        Parameters
        -------------
        radius : float
          Radius of cylinder
        height : float
          Height of cylinder
        transform : (4, 4) float
          Homogeneous transformation matrix
        sections : int
          Number of facets in circle.
        mutable : bool
          Are extents and transform mutable after creation.
        ç      $@rb   r   é    ©rc   rd   rF   Úsections©r—   rU   r•   N©r   r   r<   r¬   rŽ   rE   ©r   rd   rc   rF   r¹   r•   r—   r   s          €r   r   zCylinder.__init__M  sO   ø€ ô" 	‰ÑÔà"¨cÄÇÁÀqÃ	ÐWYÑZˆÜ,ØØà Ø Ø&Ø$ñ	ð ô

ˆ�r    c                 ó„   — t         j                  | j                  j                  dz  z  | j                  j                  z  S )z›
        The analytic volume of the cylinder primitive.

        Returns
        ---------
        volume : float
          Volume of the cylinder
        é   )r<   ÚpirE   rd   rc   r%   s    r   ÚvolumezCylinder.volumem  s1   € ô —‘˜Ÿ™×-Ñ-¨qÑ0Ñ0°D·N±N×4IÑ4IÑIÐIr    Úreturnc                 óÀ   — | j                   j                  | j                   j                  }}t        j                  dz  |z  |z  dt        j                  z  |dz  z  z   S )z?
        The analytical area of the cylinder primitive
        r¾   ©rE   rd   rc   r<   r¿   ©r   rd   rc   s      r   ÚareazCylinder.areay  sO   € ð Ÿ™×.Ñ.°·±×0EÑ0E�ˆÜ—‘˜‘	˜FÑ" VÑ+°´B·E±E±	¸FÀA¹IÑ0EÑFÐFr    c                 óÄ   — t        j                  | j                  | j                  j                  | j                  j
                  | j                  j                  ¬«      }|S )z¥
        The analytic inertia tensor of the cylinder primitive.

        Returns
        ----------
        tensor: (3, 3) float
          3D inertia tensor
        )Úmassrd   rc   rF   )r   Úcylinder_inertiarÀ   rE   rd   rc   rF   )r   Útensors     r   Úmoment_inertiazCylinder.moment_inertia‚  sI   € ô ×)Ñ)Ø—‘Ø—>‘>×(Ñ(Ø—>‘>×(Ñ(Ø—n‘n×.Ñ.ô	
ˆð ˆr    c                 ód   — t        j                  | j                  j                  g d¢«      dd }|S )z’
        The direction of the cylinder's axis.

        Returns
        --------
        axis: (3,) float, vector along the cylinder axis
        ©r   r   r   r   Nr+   ©r<   rw   rE   rF   ©r   Úaxiss     r   Ú	directionzCylinder.direction•  s*   € ô �v‰v�d—n‘n×.Ñ.²Ó=¸b¸qÐAˆØˆr    c           
      óî   — | j                   j                  dz  }t        j                  | j                   j                  t        j
                  dd| dgdd|dgg«      «      j                  dd…dd…f   }|S )zï
        A line segment which if inflated by cylinder radius
        would represent the cylinder primitive.

        Returns
        -------------
        segment : (2, 3) float
          Points representing a single line segment
        ç       @r   r   Nr+   )rE   rc   r<   rw   rF   Ú	transposeÚT)r   ÚhalfÚpointss      r   ÚsegmentzCylinder.segment¡  sr   € ð �~‰~×$Ñ$ sÑ*ˆä—‘Ø�N‰N×$Ñ$¤b§l¡l°Q¸¸D¸5À!Ð4DÀqÈ!ÈTÐSTÀoÐ3VÓ&Wó
ç
‰!ŠAˆr�ˆrˆEñˆð ˆr    c                 óÈ   — d| j                   j                  j                  «       t        | j                   j                  «      t        | j                   j
                  «      dœS )a   
        Get a copy of the current Cylinder primitive as
        a JSON-serializable dict that matches the schema
        in `trimesh/resources/schema/cylinder.schema.json`

        Returns
        ----------
        as_dict : dict
          Serializable data for this primitive.
        Úcylinder)rK   rF   rd   rc   )rE   rF   ÚtolistÚfloatrd   rc   r%   s    r   rI   zCylinder.to_dict´  sK   € ð ØŸ™×1Ñ1×8Ñ8Ó:Ü˜DŸN™N×1Ñ1Ó2Ü˜DŸN™N×1Ñ1Ó2ñ	
ð 	
r    c                 óÞ   — t        |«      }t        | j                  j                  |dz  z   | j                  j                  |z   | j                  j
                  j                  «       ¬«      }|S )a—  
        Return a cylinder primitive which covers the source
        cylinder by distance: radius is inflated by distance
        height by twice the distance.

        Parameters
        ------------
        distance : float
          Distance to inflate cylinder radius and height

        Returns
        -------------
        buffered : Cylinder
         Cylinder primitive inflated by distance
        r¾   )rc   rd   rF   )rÛ   rn   rE   rc   rd   rF   rP   )r   ÚdistanceÚbuffereds      r   ÚbufferzCylinder.bufferÆ  s\   € ô  ˜“?ˆÜØ—>‘>×(Ñ(¨8°a©<Ñ7Ø—>‘>×(Ñ(¨8Ñ3Ø—n‘n×.Ñ.×3Ñ3Ó5ô
ˆð
 ˆr    c                 ó–  — t        j                  d«       t        j                  | j                  j
                  | j                  j                  | j                  j                  | j                  j                  ¬«      }|j                  | j                  d<   |j                  | j                  d<   |j                  | j                  d<   y )Nz$creating mesh for Cylinder primitive)rd   rc   r¹   rF   r7   r(   r:   )r   Údebugr   rÙ   rE   rd   rc   r¹   rF   r7   r   r(   r:   ©r   Úmeshs     r   r.   zCylinder._create_meshÞ  s�   € Ü�	‰	Ð8Ô9Ü× Ñ Ø—>‘>×(Ñ(Ø—>‘>×(Ñ(Ø—^‘^×,Ñ,Ø—n‘n×.Ñ.ô	
ˆð #'§-¡-ˆ�‰�JÑØ#Ÿz™zˆ�‰�GÑØ&*×&7Ñ&7ˆ�‰�NÒ#r    )rb   rb   Nr·   T)r$   r‚   rƒ   r   r   rÀ   rÛ   rÅ   rÊ   rÐ   r‡   r×   rI   rß   r.   r‹   rŒ   s   @r   rn   rn   L  sˆ   ø„ õ
ð@ ñ	Jó ð	Jð ðG�eò Gó ðGð ñó ðð$ ñ	ó ð	ð ñó ðò$
ò$ö08r    rn   c                   óz   ‡ — e Zd Z	 d	ˆ fd„	Zed„ «       Zedefd„«       Zedefd„«       Z	d„ Z
ed„ «       Zd„ Zˆ xZS )
ro   c           	      óˆ   •— t         ‰| �  «        ddt        j                  d«      ddœ}t	        | |||||dœ|¬«      | _        y)a£  
        Create a Capsule Primitive, a subclass of Trimesh.

        Parameters
        ----------
        radius : float
          Radius of cylinder
        height : float
          Height of cylinder
        transform : (4, 4) float
          Transformation matrix
        sections : int
          Number of facets in circle
        mutable : bool
          Are extents and transform mutable after creation.
        rb   r   r·   r¸   rº   Nr»   r¼   s          €r   r   zCapsule.__init__í  sO   ø€ ô& 	‰ÑÔà!¨S¼r¿v¹vÀa»yÐVXÑYˆÜ,ØØà Ø Ø&Ø$ñ	ð ô

ˆ�r    c                 ó.   — | j                   j                  S r°   rD   r%   s    r   rF   zCapsule.transform  ó   € à�~‰~×'Ñ'Ð'r    rÁ   c                 ó˜   — | j                   j                  | j                   j                  }}t        j                  |dz  z  d|z  |z   z  S )z™
        The analytic volume of the capsule primitive.

        Returns
        ---------
        volume : float
          Volume of the capsule
        r¾   gUUUUUUõ?rÃ   rÄ   s      r   rÀ   zCapsule.volume  sC   € ð Ÿ™×.Ñ.°·±×0EÑ0E�ˆÜ—‘˜ ™	Ñ! y°FÑ&:¸VÑ&CÑDÐDr    c                 óÀ   — | j                   j                  | j                   j                  }}dt        j                  z  |z  |z  dt        j                  z  |dz  z  z   S )z“
        The analytic area of the capsule primitive.

        Returns
        ---------
        area : float
          Area of the capsule
        r¾   r   rÃ   rÄ   s      r   rÅ   zCapsule.area   sO   € ð Ÿ™×.Ñ.°·±×0EÑ0E�ˆØ”B—E‘E‘	˜FÑ" VÑ+°´B·E±E±	¸FÀA¹IÑ0EÑFÐFr    c                 óÈ   — d| j                   j                  j                  «       t        | j                   j                  «      t        | j                   j
                  «      dœS )a  
        Get a copy of the current Capsule primitive as
        a JSON-serializable dict that matches the schema
        in `trimesh/resources/schema/capsule.schema.json`

        Returns
        ----------
        as_dict : dict
          Serializable data for this primitive.
        Úcapsule)rK   rF   rc   rd   )rE   rF   rÚ   rÛ   rc   rd   r%   s    r   rI   zCapsule.to_dict-  sK   € ð ØŸ™×1Ñ1×8Ñ8Ó:Ü˜DŸN™N×1Ñ1Ó2Ü˜DŸN™N×1Ñ1Ó2ñ	
ð 	
r    c                 ód   — t        j                  | j                  j                  g d¢«      dd }|S )z›
        The direction of the capsule's axis.

        Returns
        --------
        axis : (3,) float
          Vector along the cylinder axis
        rÌ   Nr+   rÍ   rÎ   s     r   rÐ   zCapsule.direction?  s*   € ô �v‰v�d—n‘n×.Ñ.²Ó=¸b¸qÐAˆØˆr    c                 óÈ  — t        j                  d«       t        j                  | j                  j
                  | j                  j                  | j                  j                  | j                  j                  dz  g| j                  j                  ¬«      }|j                  | j                  d<   |j                  | j                  d<   |j                  | j                  d<   y )Nz%creating mesh for `Capsule` primitiver¾   )rd   rc   ÚcountrF   r7   r(   r:   )r   rá   r   rë   rE   rd   rc   r¹   rF   r7   r   r(   r:   râ   s     r   r.   zCapsule._create_meshL  s¡   € Ü�	‰	Ð9Ô:ä×ÑØ—>‘>×(Ñ(Ø—>‘>×(Ñ(Ø—>‘>×*Ñ*¨D¯N©N×,CÑ,CÀaÑ,GÐHØ—n‘n×.Ñ.ô	
ˆð #'§-¡-ˆ�‰�JÑØ#Ÿz™zˆ�‰�GÑØ&*×&7Ñ&7ˆ�‰�NÒ#r    )rb   r¶   Nr·   T)r$   r‚   rƒ   r   r‡   rF   r   rÛ   rÀ   rÅ   rI   rÐ   r.   r‹   rŒ   s   @r   ro   ro   ì  sz   ø„ àLPõ 
ðD ñ(ó ð(ð ð
E˜ò 
Eó ð
Eð ð
G�eò 
Gó ð
Gò
ð$ ñ
ó ð
ö8r    ro   c                   óÜ   ‡ — e Zd Z	 	 	 	 	 ddededz  dedz  dedef
ˆ fd„Zed„ «       Z	e	j                  d	„ «       Z	d
„ Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zd„ Zˆ xZS )rp   Nrd   r¤   rF   Úsubdivisionsr•   c                 ó  •— t         ‰| �  «        t        |«      t        |«      dœ}|�1|�t	        d«      ‚t        j                  d«      }||dd…df<   ||d<   n|�||d<   t        | dt        j                  d«      ddœ||¬	«      | _        y)
aÑ  
        Create a Sphere Primitive, a subclass of Trimesh.

        Parameters
        ----------
        radius
          Radius of sphere
        center : None or (3,) float
          Center of sphere.
        transform : None or (4, 4) float
          Full homogeneous transform. Pass `center` OR `transform.
        subdivisions
          Number of subdivisions for icosphere.
        mutable
          Are extents and transform mutable after creation.
        )rd   rð   Nz3only one of `center` and `transform` may be passed!r   r+   rF   rb   )rd   rF   rð   rº   )	r   r   rÛ   Úintr3   r<   r¬   rŽ   rE   )	r   rd   r¤   rF   rð   r•   ÚconstructorÚ	translater   s	           €r   r   zSphere.__init__\  sŸ   ø€ ô2 	‰ÑÔä!& v£ÄÀLÓ@QÑRˆð ÐØÐ$Ü Ð!VÓWÐWÜŸ™˜q›	ˆIØ%ˆI�b�q�b˜!�eÑØ'0ˆK˜Ò$ØÐ"Ø'0ˆK˜Ñ$ô -ØØ #´"·&±&¸³)ÈQÑOØØô	
ˆ�r    c                 ó.   — | j                   j                  S r°   ©rE   r¤   r%   s    r   r¤   zSphere.center‹  s   € à�~‰~×$Ñ$Ð$r    c                 ó&   — || j                   _        y r°   rö   )r   rš   s     r   r¤   zSphere.center�  s   € à %ˆ�‰Õr    c                 óŒ   — d| j                   j                  j                  «       t        | j                   j                  «      dœS )a  
        Get a copy of the current Sphere primitive as
        a JSON-serializable dict that matches the schema
        in `trimesh/resources/schema/sphere.schema.json`

        Returns
        ----------
        as_dict : dict
          Serializable data for this primitive.
        Úsphere)rK   rF   rd   )rE   rF   rÚ   rÛ   rd   r%   s    r   rI   zSphere.to_dict“  s9   € ð ØŸ™×1Ñ1×8Ñ8Ó:Ü˜DŸN™N×1Ñ1Ó2ñ
ð 	
r    c                 óà   — t        j                  | j                  j                  | j                  j                  z
  | j                  j                  | j                  j                  z   g«      }|S r°   )r<   r«   rE   r¤   rd   )r   Úboundss     r   rû   zSphere.bounds¤  sV   € ô
 —‘à—‘×%Ñ%¨¯©×(=Ñ(=Ñ=Ø—‘×%Ñ%¨¯©×(=Ñ(=Ñ=ðó
ˆð ˆr    c                 ó   — | j                   S r°   )Úbounding_boxr%   s    r   Úbounding_box_orientedzSphere.bounding_box_oriented±  s   € ð × Ñ Ð r    c                 ó`   — dt         j                  z  | j                  j                  dz  z  }|S )z›
        Surface area of the current sphere primitive.

        Returns
        --------
        area: float, surface area of the sphere Primitive
        ç      @r¾   ©r<   r¿   rE   rd   ©r   rÅ   s     r   rÅ   zSphere.area¹  s*   € ð ”R—U‘U‰{˜dŸn™n×3Ñ3°QÑ6Ñ7ˆØˆr    c                 óf   — dt         j                  z  | j                  j                  dz  z  dz  }|S )z‘
        Volume of the current sphere primitive.

        Returns
        --------
        volume: float, volume of the sphere Primitive
        r   r+   g      @r  ©r   rÀ   s     r   rÀ   zSphere.volumeÆ  s/   € ð œŸ™‘+ §¡×!6Ñ!6¸Ñ!9Ñ:¸cÑAˆØˆr    c                 ól   — t        j                  | j                  | j                  j                  ¬«      S )z¤
        The analytic inertia tensor of the sphere primitive.

        Returns
        ----------
        tensor: (3, 3) float
          3D inertia tensor.
        )rÇ   rd   )r   Úsphere_inertiarÀ   rE   rd   r%   s    r   rÊ   zSphere.moment_inertiaÓ  s%   € ô ×%Ñ%¨4¯;©;¸t¿~¹~×?TÑ?TÔUÐUr    c                 óp  — t        j                  d«       t        j                  | j                  j
                  | j                  j                  ¬«      }|j                  | j                  j                  z   | j                  d<   |j                  | j                  d<   |j                  | j                  d<   y )Nz"creating mesh for Sphere primitive)rð   rd   r7   r(   r:   )r   rá   r   Ú	icosphererE   rð   rd   r7   r¤   r   r(   r:   )r   r?   s     r   r.   zSphere._create_meshß  s�   € Ü�	‰	Ð6Ô7Ü×!Ñ!ØŸ™×4Ñ4¸T¿^¹^×=RÑ=Rô
ˆð
 #'§-¡-°$·.±.×2GÑ2GÑ"Gˆ�‰�JÑØ#Ÿz™zˆ�‰�GÑØ&*×&7Ñ&7ˆ�‰�NÒ#r    )rb   NNr+   T)r$   r‚   rƒ   r   r   r   Úboolr   r‡   r¤   rˆ   rI   rû   rþ   r   rÅ   rÀ   rÊ   r.   r‹   rŒ   s   @r   rp   rp   [  sð   ø„ ð Ø#'Ø&*Ø !Øñ-
àð-
ð ˜DÑ ð-
ð ˜tÑ#ð	-
ð
 ð-
ð õ-
ð^ ñ%ó ð%ð ‡]�]ñ&ó ð&ò
ð" ñ
ó ð
ð ñ!ó ð!ð ñ
ó ð
ð ñ
ó ð
ð ñ	Vó ð	Vö	8r    rp   c                   óx   ‡ — e Zd Zdˆ fd„	Zd„ Zed„ «       Zddefd„Zdd„Z	ed„ «       Z
ed„ «       Zd	„ Zd
„ Zˆ xZS )rm   c                 óæ  •— t         ‰| �  «        t        j                  d«      t        j                  d«      dœ}|�ž|€|�t        d«      ‚t        j                  |t        j                  ¬«      }|j                  dk7  rt        d«      ‚t        j                  |d	¬
«      }t        j                  d«      }t        j                  |d	¬
«      |dz  z   |dd…df<   t        | |||dœ|¬«      | _        y)a  
        Create a Box Primitive as a subclass of Trimesh

        Parameters
        ----------
        extents : ndarray (3,) float or None
          Length of each side of the 3D box.
        transform : ndarray (4, 4) float or None
          Homogeneous transformation matrix for box center.
        bounds : ndarray (2, 3) float or None
          Axis aligned bounding box, if passed extents and
          transform will be derived from this.
        mutable : bool
          Are extents and transform mutable after creation.
        r   r+   )rF   re   Nz<if `bounds` is passed `extents` and `transform` must not be!r©   ©r¾   r+   z`bounds` must be (2, 3) floatr   )rÏ   rÒ   ©re   rF   rº   )r   r   r<   r¬   Úonesr3   r«   rg   rh   ÚptpÚminrŽ   rE   )r   re   rF   rû   r•   r—   r   s         €r   r   zBox.__init__ì  sÛ   ø€ ô  	‰ÑÔÜ!#§¡¨£´r·w±w¸q³zÑBˆàÐàÐ" iÐ&;Ü ØRóð ô —X‘X˜f¬B¯J©JÔ7ˆFØ�|‰|˜vÒ%Ü Ð!@ÓAÐAä—f‘f˜V¨!Ô,ˆGô Ÿ™˜q›	ˆIÜ!Ÿv™v f°1Ô5¸À#¹ÑEˆI�b�q�b˜!�eÑä,ØØØ&°YÑ?Øô	
ˆ�r    c                 ó–   — d| j                   j                  j                  «       | j                   j                  j                  «       dœS )a  
        Get a copy of the current Box primitive as
        a JSON-serializable dict that matches the schema
        in `trimesh/resources/schema/box.schema.json`

        Returns
        ----------
        as_dict : dict
          Serializable data for this primitive.
        Úbox)rK   rF   re   )rE   rF   rÚ   re   r%   s    r   rI   zBox.to_dict  s=   € ð ØŸ™×1Ñ1×8Ñ8Ó:Ø—~‘~×-Ñ-×4Ñ4Ó6ñ
ð 	
r    c                 ó.   — | j                   j                  S r°   rD   r%   s    r   rF   zBox.transform(  rç   r    Úseedc                 óˆ   — t        j                  | j                  j                  || j                  j                  |¬«      }|S )as  
        Return random samples from inside the volume of the box.

        Parameters
        -------------
        count : int
          Number of samples to return
        seed : None or int
          Seed for deterministic results, otherwise OS entropy.

        Returns
        ----------
        samples : (count, 3) float
          Points inside the volume
        )re   rî   rF   r  )r   Úvolume_rectangularrE   re   rF   )r   rî   r  Úsampless       r   Úsample_volumezBox.sample_volume,  s;   € ô  ×+Ñ+Ø—N‘N×*Ñ*ØØ—n‘n×.Ñ.Øô	
ˆð ˆr    c                 ó~  — |�|�t        d«      ‚t        j                  | j                  j                   | j                  j                  g«      dz  }|�t        j                  ||¬«      }n%|�t        j                  ||¬«      }nt        d«      ‚t        j                  || j                  j                  ¬«      }|S )aæ  
        Return a 3D grid which is contained by the box.
        Samples are either 'step' distance apart, or there are
        'count' samples per box side.

        Parameters
        -----------
        count : int or (3,) int
          If specified samples are spaced with np.linspace
        step : float or (3,) float
          If specified samples are spaced with np.arange

        Returns
        -----------
        grid : (n, 3) float
          Points inside the box
        z$only step OR count can be specified!g      à?)Ústep)rî   z'either count or step must be specified!)ry   )r3   r<   r«   rE   re   r   Úgrid_arangeÚgrid_linspaceru   Útransform_pointsrF   )r   rî   r  rû   ÚgridÚtransformeds         r   Úsample_gridzBox.sample_gridD  sª   € ð& Ð Ð!1ÜÐCÓDÐDô —‘˜DŸN™N×2Ñ2Ð2°D·N±N×4JÑ4JÐKÓLÈsÑRˆàÐÜ×#Ñ# F°Ô6‰DØÐÜ×%Ñ% f°EÔ:‰DäÐFÓGÐGä×)Ñ)¨$°t·~±~×7OÑ7OÔPˆØÐr    c                 óæ   — t        j                  | j                  j                  d«      rGt	        j
                  | j                  j                  dd…dd…f   t	        j                  d«      «       S y)zK
        Returns whether or not the current box is rotated at all.
        ra   r   r+   F)r   r-   rE   rF   r<   ri   r¬   r%   s    r   Úis_orientedzBox.is_orientedg  sV   € ô
 �=‰=˜Ÿ™×1Ñ1°6Ô:Ü—{‘{ 4§>¡>×#;Ñ#;¸A¸a¸CÀÀ1À¸HÑ#EÄrÇvÁvÈaÃyÓQÐQÐQàr    c                 ój   — t        t        j                  | j                  j                  «      «      }|S )z€
        Volume of the box Primitive.

        Returns
        --------
        volume : float
          Volume of box.
        )rÛ   r<   ÚprodrE   re   r  s     r   rÀ   z
Box.volumeq  s&   € ô ”r—w‘w˜tŸ~™~×5Ñ5Ó6Ó7ˆØˆr    c                 ó´  — t        j                  d«       t        j                  | j                  j
                  | j                  j                  ¬«      }| j                  j                  j                  |j                  j                  «       |j                  | j                  d<   |j                  | j                  d<   |j                  | j                  d<   y )Nzcreating mesh for Box primitiver  r7   r(   r:   )r   rá   r   r  rE   re   rF   r   ÚcacherM   r7   r(   r:   )r   r  s     r   r.   zBox._create_mesh~  s’   € Ü�	‰	Ð3Ô4Ü�l‰lØ—N‘N×*Ñ*°d·n±n×6NÑ6Nô
ˆð 	�‰×Ñ× Ñ  §¡×!1Ñ!1Ô2Ø"%§,¡,ˆ�‰�JÑØ"Ÿy™yˆ�‰�GÑØ&)×&6Ñ&6ˆ�‰�NÒ#r    c                 ór   — ddl m}  || j                  j                  | j                  j                  ¬«      S )z²
        Return a Path3D containing the outline of the box.

        Returns
        -----------
        outline : trimesh.path.Path3D
          Outline of box primitive
        r   )Úbox_outliner  )Úpath.creationr(  rE   re   rF   )r   r(  s     r   Ú
as_outlinezBox.as_outline‰  s/   € õ 	/ñ Ø—N‘N×*Ñ*°d·n±n×6NÑ6Nô
ð 	
r    )NNNTr°   )NN)r$   r‚   rƒ   r   rI   r‡   rF   r   r  r   r"  r   rÀ   r.   r*  r‹   rŒ   s   @r   rm   rm   ë  sf   ø„ õ)
òV
ð" ñ(ó ð(ñ¨ó ó0!ðF ñó ðð ñ
ó ð
ò	7ö
r    rm   c            	       ó¼   ‡ — e Zd Z	 	 	 	 	 ddedz  dededefˆ fd„Zed„ «       Zed„ «       Z	ed	„ «       Z
ed
„ «       Zed„ «       Zed„ «       Zd„ Zdd„Zd„ Zd„ Zˆ xZS )Ú	ExtrusionNrF   rc   r•   Ú	mid_planec           	      óÂ   •— ddl m} t        ‰| �  «         |ddg«      j	                  d«      t        j                  d«      dddœ}t        | |||||dœ|¬«      | _        y	)
a¦  
        Create an Extrusion primitive, which
        is a subclass of Trimesh.

        Parameters
        ----------
        polygon : shapely.geometry.Polygon
          Polygon to extrude
        transform : (4, 4) float
          Transform to apply after extrusion
        height : float
          Height to extrude polygon by
        mutable : bool
          Are extents and transform mutable after creation.
        r   )ÚPointrb   r   F)ÚpolygonrF   rc   r-  )rF   r0  rc   r-  rº   N)	Úshapely.geometryr/  r   r   rß   r<   r¬   rŽ   rE   )	r   r0  rF   rc   r•   r-  r/  r—   r   s	           €r   r   zExtrusion.__init__œ  so   ø€ õ0 	+ô 	‰ÑÔñ ˜a ˜V“}×+Ñ+¨CÓ0ÜŸ™ ›ØØñ	
ˆô -ØØà&Ø"Ø Ø&ñ	ð ô

ˆ�r    c                 óÒ   — t        | j                  j                  | j                  j                  j                  z  «      }|| j                  j                  j
                  dz  z  }|S )zá
        The surface area of the primitive extrusion.

        Calculated from polygon and height to avoid mesh creation.

        Returns
        ----------
        area: float
          Surface area of 3D extrusion
        r¾   )rr   rE   rc   r0  ÚlengthrÅ   r  s     r   rÅ   zExtrusion.areaÌ  sQ   € ô �4—>‘>×(Ñ(¨4¯>©>×+AÑ+A×+HÑ+HÑHÓIˆà�—‘×&Ñ&×+Ñ+¨aÑ/Ñ/ˆØˆr    c                 ó†   — t        | j                  j                  j                  | j                  j                  z  «      }|S )z×
        The volume of the Extrusion primitive.
        Calculated from polygon and height to avoid mesh creation.

        Returns
        ----------
        volume : float
          Volume of 3D extrusion
        )rr   rE   r0  rÅ   rc   r  s     r   rÀ   zExtrusion.volumeÞ  s2   € ô �T—^‘^×+Ñ+×0Ñ0°4·>±>×3HÑ3HÑHÓIˆØˆr    c                 óÀ   — t        j                  | j                  j                  dd…dd…f   ddt        j                  | j                  j
                  «      g«      }|S )zØ
        Based on the extrudes transform what is the
        vector along which the polygon will be extruded.

        Returns
        ---------
        direction : (3,) float
          Unit direction vector
        Nr+   ç        )r<   rw   rE   rF   Úsignrc   )r   rÐ   s     r   rÐ   zExtrusion.directioní  sT   € ô —F‘FØ�N‰N×$Ñ$ R a R¨¨!¨ VÑ,¨s°C¼¿¹ÀÇÁ×AVÑAVÓ9WÐ.Xó
ˆ	ð Ðr    c                 ó<   — | j                   j                  dd…df   S )zÒ
        Based on the extrude transform what is the
        origin of the plane it is extruded from.

        Returns
        -----------
        origin : (3,) float
          Origin of extrusion plane
        Nr+   rD   r%   s    r   ÚoriginzExtrusion.originþ  s!   € ð �~‰~×'Ñ'¨¨¨¨A¨Ñ.Ð.r    c                 ó.   — | j                   j                  S r°   rD   r%   s    r   rF   zExtrusion.transform  rç   r    c                 óø  — ddl m} |j                  | j                  j                  j
                  j                  «      \  }}t        j                  |t        | j                  j                  «      «      }t        j                  j                  t        j                  |«      «      }| j                  j                  dz  |d<   t        j                  | j                  j                   |«      }t#        ||d¬«      S )Nr   )rû   rÒ   r  F)rF   re   r•   )Ú rû   Úoriented_bounds_2DrE   r0  ÚexteriorÚcoordsr<   Úappendrr   rc   rk   Úinvru   Úplanar_matrix_to_3Drw   rF   rm   )r   rû   Ú	to_originr  re   Ú
rotation_ZÚto_3Ds          r   rþ   zExtrusion.bounding_box_oriented  s±   € õ 	ð  ×2Ñ2°4·>±>×3IÑ3I×3RÑ3R×3YÑ3YÓZ‰ˆ	�3ä—)‘)˜C¤ T§^¡^×%:Ñ%:Ó!;Ó<ˆä—Y‘Y—]‘]¤2×#9Ñ#9¸)Ó#DÓEˆ
ØŸ>™>×0Ñ0°3Ñ6ˆ
�4Ñä—‘�t—~‘~×/Ñ/°Ó<ˆÜ˜U¨G¸UÔCÐCr    c                 óü   — t        |«      }t        j                  d«      }||d<   t        j                  | j                  j
                  j                  «       |j                  «       «      }|| j                  _        y)zî
        Alter the transform of the current extrusion to slide it
        along its extrude_direction vector

        Parameters
        -----------
        distance : float
          Distance along self.extrude_direction to move
        r   r  N)rÛ   r<   r¬   rw   rE   rF   rP   )r   rÝ   ÚtranslationÚnew_transforms       r   ÚslidezExtrusion.slide   s\   € ô ˜“?ˆÜ—f‘f˜Q“iˆØ$ˆ�DÑÜŸ™˜tŸ~™~×7Ñ7×<Ñ<Ó>À×@PÑ@PÓ@RÓSˆØ#0ˆ�‰Õ r    c                 ó�  — t        |«      }|€|}| j                  j                  }|t        j                  |«      dz  |z  z  } t        | «      d| j                  j                  j                  «       | j                  j                  j                  |«      |dœ|¤Ž}|j                  t        j                  |«       |z  «       |S )aò  
        Return a new Extrusion object which is expanded in profile
        and in height by a specified distance.

        Parameters
        --------------
        distance : float
          Distance to buffer polygon
        distance_height : float
          Distance to buffer above and below extrusion
        kwargs : dict
          Passed to Extrusion constructor

        Returns
        ----------
        buffered : primitives.Extrusion
          Extrusion object with new values
        rÒ   )rF   r0  rc   rL   )rÛ   rE   rc   r<   r7  r#   rF   rP   r0  rß   rI  )r   rÝ   Údistance_heightrU   rc   rÞ   s         r   rß   zExtrusion.buffer0  sº   € ô& ˜“?ˆàÐ"Ø&ˆOð —‘×&Ñ&ˆà”"—'‘'˜&“/ CÑ'¨/Ñ9Ñ9ˆð ”4˜“:ð 
Ø—n‘n×.Ñ.×3Ñ3Ó5Ø—N‘N×*Ñ*×1Ñ1°(Ó;Øñ
ð ñ	
ˆð 	�‰œŸ™ ›Ð'¨/Ñ9Ô:àˆr    c                 óÊ   — d| j                   j                  j                  | j                   j                  j	                  «       t        | j                   j                  «      dœS )a"  
        Get a copy of the current Extrusion primitive as
        a JSON-serializable dict that matches the schema
        in `trimesh/resources/schema/extrusion.schema.json`

        Returns
        ----------
        as_dict : dict
          Serializable data for this primitive.
        Ú	extrusion)rK   r0  rF   rc   )rE   r0  ÚwktrF   rÚ   rÛ   rc   r%   s    r   rI   zExtrusion.to_dict[  sL   € ð  Ø—~‘~×-Ñ-×1Ñ1ØŸ™×1Ñ1×8Ñ8Ó:Ü˜DŸN™N×1Ñ1Ó2ñ	
ð 	
r    c                 ó¸  — t        j                  d«       t        j                  | j                  j
                  | j                  j                  | j                  j                  | j                  j                  ¬«      }t        j                  r|j                  dk  rt        d«      ‚|j                  | j                  d<   |j                  | j                  d<   y )Nz%creating mesh for Extrusion primitive)r0  rc   rF   r-  r6  zmatrix inverted mesh!r7   r(   )r   rá   r   Úextrude_polygonrE   r0  rc   rF   r-  r   ÚstrictrÀ   r3   r7   r   r(   râ   s     r   r.   zExtrusion._create_meshm  s™   € Ü�	‰	Ð9Ô:ä×'Ñ'Ø—N‘N×*Ñ*Ø—>‘>×(Ñ(Ø—n‘n×.Ñ.Ø—n‘n×.Ñ.ô	
ˆô �:Š:˜$Ÿ+™+¨Ò+ÜÐ4Ó5Ð5ð #'§-¡-ˆ�‰�JÑØ#Ÿz™zˆ�‰�GÒr    )NNrb   TFr°   )r$   r‚   rƒ   r   r   r	  r   r   rÅ   rÀ   rÐ   r‡   r9  rF   rþ   rI  rß   rI   r.   r‹   rŒ   s   @r   r,  r,  ›  sÖ   ø„ ð Ø&*ØØØñ.
ð ˜tÑ#ð.
ð ð	.
ð
 ð.
ð õ.
ð` ñó ðð" ñó ðð ñó ðð  ñ
/ó ð
/ð ñ(ó ð(ð ñDó ðDò 1ó )òV
ö$*r    r,  )#r„   r‰   Únumpyr<   r<  r   r   r   r   r   r	   ru   Úbaser
   Úcachingr   Ú	constantsr   r   Útypedr   r   r   r   r¬   rj   ÚflagsÚ	writeabler   rŽ   rn   ro   rp   rm   r,  rL   r    r   Ú<module>rY     s¯   ðñó ã ç 8Õ 8Ý #Ý Ý $ß ß 3Ó 3ð ˆB�F‰F�1‹I€	Ø!€	‡�Ô ôND�ô ND÷b]ñ ]ô@]8ˆyô ]8ô@l8ˆiô l8ô^M8ˆYô M8ô`m
ˆ)ô m
ô`b*�	õ b*r    