
    Ngs                    j   d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
mZmZmZmZmZ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mZ d dlmZmZmZm Z  d dl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' d d	l(m)Z)  ej*        e+          Z,ddZ-d dZ.d!d"dZ/d#dZ0d#dZ1 eddd           G d dee                      Z2dS )$    )annotationsN)AnyCallableDictListLiteralMappingOptionalSequenceSetTupleUnioncast)
deprecated)
Embeddings)get_from_dict_or_envget_pydantic_field_namespre_init)	BaseModel
ConfigDictFieldmodel_validator)AsyncRetryingbefore_sleep_logretryretry_if_exception_typestop_after_attemptwait_exponential)is_openai_v1
embeddingsOpenAIEmbeddingsreturnCallable[[Any], Any]c           
        dd l }t          dt          | j                  t	          d| j        | j                  t          |j        j	                  t          |j        j
                  z  t          |j        j                  z  t          |j        j                  z  t          |j        j                  z  t          t          t           j                            S )Nr   T   
multiplierminmaxreraisestopwaitr   before_sleep)openair   r   max_retriesr   retry_min_secondsretry_max_secondsr   errorTimeoutAPIErrorAPIConnectionErrorRateLimitErrorServiceUnavailableErrorr   loggerloggingWARNING)r    r/   s     a/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/embeddings/openai.py_create_retry_decoratorr=   ,   s    MMM 
 677,,
 
 
 $FL$899%fl&;<<=%fl&EFFG &fl&ABBC &fl&JKK	L &fgo>>       r   c           
        dd l }t          dt          | j                  t	          d| j        | j                  t          |j        j	                  t          |j        j
                  z  t          |j        j                  z  t          |j        j                  z  t          |j        j                  z  t          t          t           j                            d
fd	}|S )Nr   Tr%   r&   r*   funcr   r"   c                     d fd}|S )Nargsr   kwargsr"   r   c                 Z   K   2 3 d {V } | i | d {V c S 6 t          d          )Nzthis is unreachable)AssertionError)rB   rC   _async_retryingr@   s      r<   	wrapped_fz7_async_retry_decorator.<locals>.wrap.<locals>.wrapped_fb   sp      ) 3 3 3 3 3 3 3a!T42622222222222 * !6777s   )rB   r   rC   r   r"   r    )r@   rH   rG   s   ` r<   wrapz$_async_retry_decorator.<locals>.wrapa   s/    	8 	8 	8 	8 	8 	8 	8
 r>   )r@   r   r"   r   )r/   r   r   r0   r   r1   r2   r   r3   r4   r5   r6   r7   r8   r   r9   r:   r;   )r    r/   rJ   rG   s      @r<   _async_retry_decoratorrK   G   s    MMM #
 677,,
 
 
 $FL$899%fl&;<<=%fl&EFFG &fl&ABBC &fl&JKK	L &fgo>>  N$      Kr>   Fresponsedict
skip_emptyboolc                    t          d | d         D                       r |sdd l}|j                            d          | S )Nc              3  H   K   | ]}t          |d                    dk    V  dS )	embeddingr%   N)len).0ds     r<   	<genexpr>z"_check_response.<locals>.<genexpr>n   s3      
>
>3q~!#
>
>
>
>
>
>r>   datar   z&OpenAI API returned an empty embedding)anyr/   r3   r5   )rL   rN   r/   s      r<   _check_responserY   m   sT    

>
>Xf-=
>
>
>>> Nz Nl##$LMMMOr>   rC   c                     t                      r  j        j        di |S t                     }|d fd            } |di |S ))Use tenacity to retry the embedding call.rC   r   r"   c                 T     j         j        di | }t          |j                  S N)rN   rI   )clientcreaterY   rN   rC   rL   r    s     r<   _embed_with_retryz+embed_with_retry.<locals>._embed_with_retry{   s4    +:$+55f55xJ4IJJJJr>   rI   rC   r   r"   r   )r   r^   r_   r=   )r    rC   retry_decoratorra   s   `   r<   embed_with_retryrd   u   s    ~~ 2'z '11&111-j99OK K K K K _K &&v&&&r>   c                    K   t                      r  j        j        di | d{V S t                     d fd            } |di | d{V S )r[   NrC   r   r"   c                 d   K    j         j        di |  d {V }t          |j                  S r]   )r^   acreaterY   rN   r`   s     r<   _async_embed_with_retryz7async_embed_with_retry.<locals>._async_embed_with_retry   sJ      2*2<<V<<<<<<<<xJ4IJJJJr>   rI   rb   )r   async_clientr_   rK   )r    rC   rh   s   `  r<   async_embed_with_retryrj      s       ~~ >3Z,3==f=========J''K K K K K ('K )(226222222222r>   z0.0.9z1.0z!langchain_openai.OpenAIEmbeddings)sinceremovalalternative_importc                  8   e Zd ZU dZ edd          Zded<    edd          Zded<   dZd	ed
<   eZ	ded<    edd          Z
ded<   	  edd          Zded<   	 dZded<   dZded<   dZded<   	  edd          Zded<   	  edd          Zded<   	  e            Zded<   dZded<   d Zded!<   	 d"Zded#<   	  edd$          Zd%ed&<   	 dZded'<   dZd(ed)<   	 dZded*<   	 d+Zd(ed,<   	  ee-          Zd.ed/<   	 d+Zd(ed0<   	 dZd1ed2<   dZd3ed4<   d5Z ded6<   	 d7Z!ded8<   	 dZ"d9ed:<   	  e#dd;d<=          Z$ e%d>?          e&dUdB                        Z'e(dVdD            Z)e*dWdE            Z+ddFdXdLZ,ddFdXdMZ-	 dYdZdOZ.	 dYdZdPZ/d[dSZ0d[dTZ1dS )\r!   aj  OpenAI embedding models.

    To use, you should have the ``openai`` python package installed, and the
    environment variable ``OPENAI_API_KEY`` set with your API key or pass it
    as a named parameter to the constructor.

    Example:
        .. code-block:: python

            from langchain_community.embeddings import OpenAIEmbeddings
            openai = OpenAIEmbeddings(openai_api_key="my-api-key")

    In order to use the library with Microsoft Azure endpoints, you need to set
    the OPENAI_API_TYPE, OPENAI_API_BASE, OPENAI_API_KEY and OPENAI_API_VERSION.
    The OPENAI_API_TYPE must be set to 'azure' and the others correspond to
    the properties of your endpoint.
    In addition, the deployment name must be passed as the model parameter.

    Example:
        .. code-block:: python

            import os

            os.environ["OPENAI_API_TYPE"] = "azure"
            os.environ["OPENAI_API_BASE"] = "https://<your-endpoint.openai.azure.com/"
            os.environ["OPENAI_API_KEY"] = "your AzureOpenAI key"
            os.environ["OPENAI_API_VERSION"] = "2023-05-15"
            os.environ["OPENAI_PROXY"] = "http://your-corporate-proxy:8080"

            from langchain_community.embeddings.openai import OpenAIEmbeddings
            embeddings = OpenAIEmbeddings(
                deployment="your-embeddings-deployment-name",
                model="your-embeddings-model-name",
                openai_api_base="https://your-endpoint.openai.azure.com/",
                openai_api_type="azure",
            )
            text = "This is a test query."
            query_result = embeddings.embed_query(text)

    NT)defaultexcluder   r^   ri   ztext-embedding-ada-002strmodelzOptional[str]
deploymentapi_version)ro   aliasopenai_api_versionbase_urlopenai_api_baseopenai_api_typeopenai_proxyi  intembedding_ctx_lengthapi_keyopenai_api_keyorganizationopenai_organizationzUnion[Literal['all'], Set[str]]allowed_specialallz.Union[Literal['all'], Set[str], Sequence[str]]disallowed_speciali  
chunk_size   r0   timeoutz0Optional[Union[float, Tuple[float, float], Any]]request_timeoutheadersrO   tiktoken_enabledtiktoken_model_nameFshow_progress_bar)default_factoryDict[str, Any]model_kwargsrN   zUnion[Mapping[str, str], None]default_headersz!Union[Mapping[str, object], None]default_query   r1      r2   zUnion[Any, None]http_clientforbidrI   )populate_by_nameextraprotected_namespacesbefore)modevaluesr"   c           
        t          |           }|                    di           }t          |          D ]S}||v rt          d| d          ||vr6t	          j        d| d| d| d           |                    |          ||<   T|                    |                                          }|rt          d| d	          ||d<   |S )
z>Build extra kwargs from additional params that were passed in.r   zFound z supplied twice.z	WARNING! z/ is not default parameter.
                    zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.zParameters za should be specified explicitly. Instead they were passed in as part of `model_kwargs` parameter.)	r   getlist
ValueErrorwarningswarnpopintersectionkeys)clsr   all_required_field_namesr   
field_nameinvalid_model_kwargss         r<   build_extrazOpenAIEmbeddings.build_extra  s2    $<C#@#@ 

>2..v,, 		; 		;JU"" !F*!F!F!FGGG!999N* N NN N)3N N N  
 %+JJz$:$:j!7DDUZZ\\RR 	T2 T T T  
 "'~r>   r   c           	        t          |dd          |d<   |d         pt          j        d          |d<   t          |ddd          |d<   t          |d	d
d          |d	<   |d         dv rd}t          |d         d          |d<   nd}t          |dd|          |d<   |d         p't          j        d          pt          j        d          |d<   	 ddl}t                      r|d         dv rt          j        d           |d         |d         |d         |d         |d         |d         |d         |d         d}|                    d          s |j	        d i |j
        |d<   |                    d          s |j        d i |j
        |d<   n>|                    d          s|j        |d<   nn# t          $ r t          d          w xY w|S )!z?Validate that api key and python package exists in environment.r~   OPENAI_API_KEYrx   OPENAI_API_BASEry   OPENAI_API_TYPE )ro   rz   OPENAI_PROXYazureazure_adazureadz
2023-05-15r   i   rv   OPENAI_API_VERSIONr   OPENAI_ORG_IDOPENAI_ORGANIZATIONr   NzfIf you have openai>=1.0.0 installed and are using Azure, please use the `AzureOpenAIEmbeddings` class.r   r0   r   r   r   )r}   r   rw   r   r0   r   r   r   r^   ri   TCould not import openai python package. Please install it with `pip install openai`.rI   )r   osgetenvr(   r/   r   r   r   r   OpenAIr    AsyncOpenAI	EmbeddingImportError)r   r   default_api_versionr/   client_paramss        r<   validate_environmentz%OpenAIEmbeddings.validate_environment   s    $8$&6$
 $
  %++<$= %
B
 B
 ! %9	%
 %
 %
 ! "6	"
 "
 "
~ #$(HHH". $'vl';T#B#BF<  "$';  '	(
 (
 (
#$ () 0y))0y.// 	$%
!	MMM ~~ +,0PPPMH  
  &&67$*+@$A &'8 9%&78#)-#8'-.?'@%+O%<#)-#8	! 	! zz(++ Q'4v}'E'E}'E'E'PF8$zz.11 !-?V-? . .'. .  >* ZZ)) #)#3x  ?  	 	 	?  	@ s   F3 3Gc           	     Z   t                      rd| j        i| j        }n| j        | j        | j        | j        | j        | j        | j        | j	        d| j        }| j        dv r
| j
        |d<   | j        r7	 dd l}n# t          $ r t          d          w xY w| j        | j        d|_        |S )Nrr   )rr   r   r   r}   r   api_baseapi_typert   r   enginer   r   )httphttps)r   rr   r   r   r   r~   r   rx   ry   rv   rs   rz   r/   r   proxy)selfopenai_argsr/   s      r<   _invocation_paramsz#OpenAIEmbeddings._invocation_paramsm  s    >> 	!($* J8I JKK #'#7<. $ 8 0 0#6
 
 #
K #'GGG(,H%  !MMMM"   %G   !-!.    s   5A: :B)r   texts	List[str]r   Optional[int]List[List[float]]c          	     T
   g }g }| j         p| j        }|p| j        }| j        s	 ddlm} n# t          $ r t          d          w xY w|                    |          }	t          |          D ]\  }
}|		                    |d          }t          dt          |          | j                  D ]S}|||| j        z            }|	                    |          }|                    |           |                    |
           TnB	 ddl}n# t          $ r t          d          w xY w	 |                    |          }nA# t"          $ r4 t$                              d	           d
}|                    |          }Y nw xY wt          |          D ]\  }
}| j                            d          r|                    dd          }|	                    || j        | j                  }t          dt          |          | j                  D ]<}|                    |||| j        z                       |                    |
           =| j        r]	 ddlm}  |t          dt          |          |                    }nL# t          $ r! t          dt          |          |          }Y n"w xY wt          dt          |          |          }g }|D ]o}
t9          | fd||
|
|z            i| j        }t=          |t>                    s|                                }|                     d |d         D                        pd t          t          |                    D             }d t          t          |                    D             }t          t          |                    D ]~}
| j!        rt          ||
                   dk    r#|||
                                      ||
                    |||
                                      t          ||
                              d t          t          |                    D             }t          t          |                    D ]}
||
         }t          |          dk    rRt9          | fddi| j        }t=          |t>                    s|                                }|d         d         d         }ntE          j#        |d||
                   }|tD          j$        %                    |          z  &                                ||
<   |S )al  
        Generate length-safe embeddings for a list of texts.

        This method handles tokenization and embedding generation, respecting the
        set embedding context length and chunk size. It supports both tiktoken
        and HuggingFace tokenizer based on the tiktoken_enabled flag.

        Args:
            texts (List[str]): A list of texts to embed.
            engine (str): The engine or model to use for embeddings.
            chunk_size (Optional[int]): The size of chunks for processing embeddings.

        Returns:
            List[List[float]]: A list of embeddings for each input text.
        r   AutoTokenizerzCould not import transformers python package. This is needed in order to for OpenAIEmbeddings without `tiktoken`. Please install it with `pip install transformers`. pretrained_model_name_or_pathFadd_special_tokensNCould not import tiktoken python package. This is needed in order to for OpenAIEmbeddings. Please install it with `pip install tiktoken`.5Warning: model not found. Using cl100k_base encoding.cl100k_base001
 textr   r   )tqdminputc              3  &   K   | ]}|d          V  dS rR   NrI   rT   rs     r<   rV   z<OpenAIEmbeddings._get_len_safe_embeddings.<locals>.<genexpr>  &      %O%Oan%O%O%O%O%O%Or>   rW   c                    g | ]}g S rI   rI   rT   rF   s     r<   
<listcomp>z=OpenAIEmbeddings._get_len_safe_embeddings.<locals>.<listcomp>      +J+J+J1B+J+J+Jr>   c                    g | ]}g S rI   rI   r   s     r<   r   z=OpenAIEmbeddings._get_len_safe_embeddings.<locals>.<listcomp>      /N/N/Nq/N/N/Nr>   r%   c                    g | ]}g S rI   rI   r   s     r<   r   z=OpenAIEmbeddings._get_len_safe_embeddings.<locals>.<listcomp>      (G(G(G(G(G(Gr>   r   rR   axisweights)'r   rr   r   r   transformersr   r   from_pretrained	enumerateencoderangerS   r|   decodeappendtiktokenencoding_for_modelKeyErrorr9   warningget_encodingendswithreplacer   r   r   	tqdm.autor   rd   r   
isinstancerM   extendrN   npaveragelinalgnormtolist)r   r   r   r   tokensindices
model_name_chunk_sizer   	tokenizerir   	tokenizedjtoken_chunk
chunk_textr   encodingrr   tokenr   _iterbatched_embeddingsrL   resultsnum_tokens_in_batchr    _resultaverage_embeddedr  s                                 r<   _get_len_safe_embeddingsz)OpenAIEmbeddings._get_len_safe_embeddings  s   & -;
 3DO $ 9	&6666666   !V   &55.8 6  I %U++ & &4%,,Te,LL	 q#i..$2KLL & &A"+AD4M0M,M"NK "+!1!1+!>!>JMM*---NN1%%%%&&   !E  8#66zBB 8 8 8VWWW%#00778 %U++ & &4:&&u-- 3  <<c22D $($8'+'> (   q#e**d.GHH & &AMM%A0I,I(I"JKKKNN1%%%%& ! 	7;******U1c&kk;??@@ ; ; ;aVk::; !S[[+66E02 	P 	PA' Q[01 ) H
 h-- +#==??%%%O%Ohv>N%O%O%OOOOO+J+Jc%jj8I8I+J+J+J/N/NE#e**<M<M/N/N/Ns7||$$ 	C 	CA 3'9!'<#=#=#B#BGAJ&&'9!'<===
+223vay>>BBBB(G(GU3u::5F5F(G(G(G
s5zz"" 	I 	IAajG7||q  #3$ $$ -$ $ 
 ""2D99 ?'7'<'<'>'>$*6215kB*W1>QRS>TUUU$ry~~g'>'>>FFHHJqMMs9   + AD	 	D#'D= =;E;:E;-I; ;(J&%J&c          	     t	  K   g }g }| j         p| j        }|p| j        }| j        s	 ddlm} n# t          $ r t          d          w xY w|                    |          }	t          |          D ]\  }
}|		                    |d          }t          dt          |          | j                  D ]S}|||| j        z            }|	                    |          }|                    |           |                    |
           TnB	 ddl}n# t          $ r t          d          w xY w	 |                    |          }nA# t"          $ r4 t$                              d	           d
}|                    |          }Y nw xY wt          |          D ]\  }
}| j                            d          r|                    dd          }|	                    || j        | j                  }t          dt          |          | j                  D ]<}|                    |||| j        z                       |                    |
           =g }|p| j        }t          dt          |          |          D ]u}
t3          | fd||
|
|z            i| j         d{V }t7          |t8                    s|                                }|                    d |d         D                        vd t          t          |                    D             }d t          t          |                    D             }t          t          |                    D ]]}
|||
                                      ||
                    |||
                                      t          ||
                              ^d t          t          |                    D             }t          t          |                    D ]}
||
         }t          |          dk    rXt3          | fddi| j         d{V }t7          |t8                    s|                                }|d         d         d         }nt=          j        |d||
                   }|t<          j         !                    |          z  "                                ||
<   |S )a  
        Asynchronously generate length-safe embeddings for a list of texts.

        This method handles tokenization and asynchronous embedding generation,
        respecting the set embedding context length and chunk size. It supports both
        `tiktoken` and HuggingFace `tokenizer` based on the tiktoken_enabled flag.

        Args:
            texts (List[str]): A list of texts to embed.
            engine (str): The engine or model to use for embeddings.
            chunk_size (Optional[int]): The size of chunks for processing embeddings.

        Returns:
            List[List[float]]: A list of embeddings for each input text.
        r   r   zCould not import transformers python package. This is needed in order to for OpenAIEmbeddings without  `tiktoken`. Please install it with `pip install transformers`.r   Fr   Nr   r   r   r   r   r   r   r   c              3  &   K   | ]}|d          V  dS r   rI   r   s     r<   rV   z=OpenAIEmbeddings._aget_len_safe_embeddings.<locals>.<genexpr>u  r   r>   rW   c                    g | ]}g S rI   rI   r   s     r<   r   z>OpenAIEmbeddings._aget_len_safe_embeddings.<locals>.<listcomp>w  r   r>   c                    g | ]}g S rI   rI   r   s     r<   r   z>OpenAIEmbeddings._aget_len_safe_embeddings.<locals>.<listcomp>x  r   r>   c                    g | ]}g S rI   rI   r   s     r<   r   z>OpenAIEmbeddings._aget_len_safe_embeddings.<locals>.<listcomp>}  r   r>   r   rR   r   )#r   rr   r   r   r   r   r   r   r   r   r   rS   r|   r   r   r   r   r   r9   r   r   r   r   r   r   rj   r   r   rM   r   r   r  r  r  r  )r   r   r   r   r  r  r  r  r   r	  r
  r   r  r  r  r  r   r  rr   r  r  rL   r  r  r    r  r  r  s                               r<   _aget_len_safe_embeddingsz*OpenAIEmbeddings._aget_len_safe_embeddings  s     & -;
 3DO $ 9	&6666666   !V   &55.8 6  I %U++ & &4%,,Te,LL	 q#i..$2KLL & &A"+AD4M0M,M"NK "+!1!1+!>!>JMM*---NN1%%%%&&   !E  8#66zBB 8 8 8VWWW%#00778 %U++ & &4:&&u-- 3  <<c22D $($8'+'> (   q#e**d.GHH & &AMM%A0I,I(I"JKKKNN1%%%%& 13 3DOq#f++{33 		P 		PA3 Q[01 )       H h-- +#==??%%%O%Ohv>N%O%O%OOOOO+J+Jc%jj8I8I+J+J+J/N/NE#e**<M<M/N/N/Ns7||$$ 	C 	CAGAJ&&'9!'<===
+223vay>>BBBB(G(GU3u::5F5F(G(G(G
s5zz"" 	I 	IAajG7||q  )?* ** -* * $ $ $ $ $ $ 
 ""2D99 ?'7'<'<'>'>$*6215kB*W1>QRS>TUUU$ry~~g'>'>>FFHHJqMMs'   - AD D%)D? ?;E=<E=r   c                d    t          t          | j                  }|                     ||          S )aM  Call out to OpenAI's embedding endpoint for embedding search docs.

        Args:
            texts: The list of texts to embed.
            chunk_size: The chunk size of embeddings. If None, will use the chunk size
                specified by the class.

        Returns:
            List of embeddings, one for each text.
        r   )r   rq   rs   r  r   r   r   r   s       r<   embed_documentsz OpenAIEmbeddings.embed_documents  s.     c4?++,,U6,BBBr>   c                t   K   t          t          | j                  }|                     ||           d{V S )aS  Call out to OpenAI's embedding endpoint async for embedding search docs.

        Args:
            texts: The list of texts to embed.
            chunk_size: The chunk size of embeddings. If None, will use the chunk size
                specified by the class.

        Returns:
            List of embeddings, one for each text.
        r  N)r   rq   rs   r  r   s       r<   aembed_documentsz!OpenAIEmbeddings.aembed_documents  sD       c4?++33E&3IIIIIIIIIr>   r   List[float]c                :    |                      |g          d         S )zCall out to OpenAI's embedding endpoint for embedding query text.

        Args:
            text: The text to embed.

        Returns:
            Embedding for the text.
        r   )r!  )r   r   s     r<   embed_queryzOpenAIEmbeddings.embed_query  s     ##TF++A..r>   c                N   K   |                      |g           d{V }|d         S )zCall out to OpenAI's embedding endpoint async for embedding query text.

        Args:
            text: The text to embed.

        Returns:
            Embedding for the text.
        Nr   )r#  )r   r   r    s      r<   aembed_queryzOpenAIEmbeddings.aembed_query  s9        00$88888888
!}r>   )r   r   r"   r   )r   r   r"   r   )r"   r   )r   r   r   rq   r   r   r"   r   )r   )r   r   r   r   r"   r   )r   rq   r"   r$  )2__name__
__module____qualname____doc__r   r^   __annotations__ri   rr   rs   rv   rx   ry   rz   r|   r~   r   setr   r   r   r0   r   r   r   r   r   rM   r   rN   r   r   r1   r2   r   r   model_configr   classmethodr   r   r   propertyr   r  r  r!  r#  r&  r(  rI   r>   r<   r!   r!      s(        ' 'R %d333F3333dD999L9999)E)))) %J%%%%(-d-(P(P(PPPPPS%*U4z%J%J%JOJJJJ &*O))))"&L&&&& $$$$$8$)E$i$H$H$HNHHHHO).t>)R)R)RRRRRN7:suuO<<<<INNNNNJ8K<HMII I IO    G!!!!!G)-----J $####8#(5#>#>#>L>>>>VJ!6:O::::7;M;;;; 77$(K(((( :XB  L _(###   [ $#2 J J J XJX    XH MQA A A A A AL MQw w w w w wt =>C C C C C& =>J J J J J$	/ 	/ 	/ 	/
 
 
 
 
 
r>   )r    r!   r"   r#   )r    r!   r"   r   )F)rL   rM   rN   rO   r"   rM   )r    r!   rC   r   r"   r   )3
__future__r   r:   r   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r   numpyr   langchain_core._api.deprecationr   langchain_core.embeddingsr   langchain_core.utilsr   r   r   pydanticr   r   r   r   tenacityr   r   r   r   r   r    langchain_community.utils.openair   	getLoggerr)  r9   r=   rK   rY   rd   rj   r!   rI   r>   r<   <module>r<     s   " " " " " "  				                                 6 6 6 6 6 6 0 0 0 0 0 0         
 C B B B B B B B B B B B                : 9 9 9 9 9		8	$	$   6" " " "L    ' ' ' '3 3 3 3 
:  
r r r r ry* r r 
r r rr>   