
    .`iz                        d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	 d dl
mZ d dlmZmZmZmZmZ d dl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! d dl"m#Z#m$Z$ d dl%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l0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;m<Z< d dl=m>Z>m?Z? d dl@mAZA d dlBmCZC d dlDmEZE  eeF          ZG G d d          ZHdS )    N)Mapping)AnyLiteralcast)
VllmConfig)VLLMValidationError)ProcessorInputs
PromptTypeSingletonInputsSingletonPrompt
TextPrompt)"is_explicit_encoder_decoder_promptsplit_enc_dec_inputs)InputPreprocessor)init_logger)LoRARequest)MULTIMODAL_REGISTRYMultiModalRegistry)MultiModalDataDictMultiModalFeatureSpecMultiModalUUIDDict)ModalityDataItemsMultiModalDataItems)set_request_id)argsort_mm_positions)PoolingParams)RendererLike)_SAMPLING_EPSSamplingParams)TokenizerLike)MistralTokenizer)&length_from_prompt_token_ids_or_embedsrandom_uuid)set_default_torch_num_threads)EngineCoreRequest)MultiModalCacheStats)&has_guidance_unsupported_json_featuresvalidate_guidance_grammar)5validate_structured_output_request_lm_format_enforcer)+validate_structured_output_request_outlines)validate_xgrammar_grammarc                   p   e Zd ZefdededdfdZededz  fd            Z	defdZ
edefd            Zd	eddfd
Zd	eddfdZd	eddfdZd	eddfdZd	eez  fdZdedefdZdeddfdZdeddfdZdedz  ddfdZd	eddfdZdededz  fdZdededz  fdZde dede!dz  fdZ"de dedz  de fdZ#e$de%fd            Z&	 	 	 	 	 	 	 d2de ded	eez  d!e'dz  dedz  d"e(e e)f         dz  d#e*e e f         dz  d$e+d%e+dz  d&e,de%fd'Z-d(e.dz  d)e.fd*Z/d+e.d,e0d-         fd.Z1de2dz  fd/Z3d3d0Z4d3d1Z5dS )4InputProcessorvllm_configmm_registryreturnNc                 @   || _         |j        | _        |j        | _        |j        | _        |j        | _        | j                                        | _        || _        |                    |          | _	        t          | j        |j        || j	                  | _        d S )N)mm_processor_cache)r.   model_configcache_configlora_configstructured_outputs_configtry_get_generation_configgeneration_config_fieldsr/   processor_cache_from_configr2   r   observability_configinput_preprocessor)selfr.   r/   s      r/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/v1/engine/input_processor.py__init__zInputProcessor.__init__8   s    
 ''4'4&2)4)N&(,(9(S(S(U(U%&"-"I"I+"V"V"3,#6	#
 #
 #
    c                     | j         j        S N)r;   	tokenizerr<   s    r=   rB   zInputProcessor.tokenizerO   s    &00r?   c                 4    | j                                         S rA   )r;   get_tokenizerrC   s    r=   rE   zInputProcessor.get_tokenizerS       &44666r?   c                     | j         j        S rA   )r;   rendererrC   s    r=   rH   zInputProcessor.rendererV   s    &//r?   paramsc                    | j         j        }|dk    r| j                                         }|j        rD|j        }|dk    r| j                                         }||k    rt	          d| d| d|          |j        rD|j        }|dk    r| j                                         }||k    rt	          d| d| d|          d S d S )NzRequested sample logprobs of z%, which is greater than max allowed: logprobs	parametervaluezRequested prompt logprobs of prompt_logprobs)r3   max_logprobsget_vocab_sizerL   r   rP   )r<   rI   rQ   num_logprobsnum_prompt_logprobss        r=   _validate_logprobsz!InputProcessor._validate_logprobsZ   s?    (52,;;==L ? 
	!?Lr!!#0??AAl**)IL I I:FI I(&	    ! 
	"("8"b((&*&7&F&F&H&H#"\11)I4G I I:FI I/-	   
	 
	 21r?   c                 2   |                      |           |                     |           |j        d S |j        st          d          | j        d S t          | j                  t          fd|j        D                       st          d          d S )Nz(allowed_token_ids is not None and empty!c              3   8   K   | ]}d |cxk    ok     nc V  dS )r   N ).0tid
vocab_sizes     r=   	<genexpr>z;InputProcessor._validate_sampling_params.<locals>.<genexpr>   s?      MMS1((((j((((MMMMMMr?   z1allowed_token_ids contains out-of-vocab token id!)_validate_structured_output_validate_logit_biasallowed_token_ids
ValueErrorrB   lenall)r<   rI   r[   s     @r=   _validate_sampling_paramsz(InputProcessor._validate_sampling_params|   s     	((000!!&)))#+F' 	IGHHH>! F((
MMMMF4LMMMMM 	RPQQQ	R 	Rr?   c                     |j         sdS | j                                        }g }|j         D ]#}|dk     s||k    r|                    |           $|rt	          d| d| d|          dS )z:Validate logit_bias token IDs are within vocabulary range.Nr   ztoken_id(s) z@ in logit_bias contain out-of-vocab token ids. Vocabulary size: 
logit_biasrM   )re   r3   rR   appendr   )r<   rI   r[   invalid_token_idstoken_ids        r=   r^   z#InputProcessor._validate_logit_bias   s    
   	F&5577
) 	3 	3H!||x:55!((222 	%I0 I I<FI I&'	   	 	r?   c                     |j         rt          d          | j        j        1|j        dk    s|j        t          k    s|j        rt          d          d S d S )NzEvLLM V1 does not support per request user-provided logits processors.   zjThe min_tokens, min_p, and logit_bias sampling parameters are not yet supported with speculative decoding.)logits_processorsr`   r.   speculative_config
min_tokensmin_pr   re   r<   rI   s     r=   #_validate_supported_sampling_paramsz2InputProcessor._validate_supported_sampling_params   sz    
 # 	W  
 .:!!V\M%A%AVEV%AC   ;:%A%Ar?   c                     t          |t                    rdS |                     |           |                     |           |                     |           dS )zr
        Validate supported SamplingParam.
        Should raise ValueError if unsupported for API Server.
        N)
isinstancer   rU   rc   rp   ro   s     r=   _validate_paramszInputProcessor._validate_params   s]     fm,, 	F'''&&v...0088888r?   mm_datac                 h    | j                                         }|j                            |          S rA   )r;   _get_mm_processordata_parserparse_mm_data)r<   rt   mm_processors      r=   _parse_mm_itemszInputProcessor._parse_mm_items   s-    .@@BB'55g>>>r?   promptc                    t          |t                    rt          |          }t          t          |                    d          pi           }t          t          |                    d          pi           }|s|sd S |                     d |                                D                       }d |                                D             }|	                                |	                                z  }|D ]s}t          t          t          t                   z  |                    |g                     }t          t          t          d z           |                    |g                     }	t          |          dk    rt          |	          dk    rVt          |          t          |	          k    r6t          d|d|d	t          |	           d
t          |           d	          t          |          D ]F\  }
}|?|	st          d|d|
 d|d          |	|
         t          d|d|
 d|d|
 d	          GJt          |	          dk    rt          d|d|d          ud S )N)r{   multi_modal_datamulti_modal_uuidsc                     i | ]
\  }}|||S rA   rX   rY   kvs      r=   
<dictcomp>z?InputProcessor._validate_singleton_mm_uuids.<locals>.<dictcomp>       ???daQr?   c                 N    i | ]"\  }}||t          |t                    r|gn|#S rA   )rr   strr   s      r=   r   z?InputProcessor._validate_singleton_mm_uuids.<locals>.<dictcomp>   s@     
 
 
1} jC((/ssa}}r?   r   zIf given, multi_modal_uuids[z,] must have same length as multi_modal_data[z], but got z vs .zmulti_modal_data[z][z!] is empty but multi_modal_uuids[z] is missing.)rr   r   r   r   r   getr   rz   itemskeysr   listr   ra   r`   	enumerate)r<   r{   rt   mm_uuidsmm_data_parsedmm_uuids_parsed
modalitiesmodality
data_items
uuid_itemsiitems               r=   _validate_singleton_mm_uuidsz+InputProcessor._validate_singleton_mm_uuids   s+   fc"" 	/v...F)6::6H+I+I+ORPP*FJJ7J,K,K,QrRR 	x 	F--??gmmoo???
 

 
 ((
 
 
 \\^^hmmoo5
"  	  	H!DI-~/A/A(B/O/O J d3:.0C0CHb0Q0QRRJ:""z??Q&&3z??c*oo+M+M$Gx G G;CG G":G G47
OOG G G    )44  GAt|) ",!OH !O !O! !O !O5=!O !O !O# # 
 &a=0",!TH !T !T! !T !T5=!T !TCD!T !T !T# #  z??a''$GH G G-5G G G   (9 	  	r?   c                     t          |          r>|                     |d                    |d         x}|                     |           dS dS |                     |           dS )z
        Validate that user-provided multi_modal_uuids align with
        multi_modal_data in the incoming request prompt(s).
        Only checks lengths; `None` entries are allowed and will be
        auto-hashed downstream.
        encoder_promptdecoder_promptN)r   r   )r<   r{   
dec_prompts      r=   _validate_mm_uuidsz!InputProcessor._validate_mm_uuids  s~     .f55 	6--f5E.FGGG$%566
C11*===== DC --f55555r?   lora_requestc                     |d S | j         st          d| d          | j        t                              d           d S d S )NzGot lora_request z but LoRA is not enabled!zvLLM has deprecated support for supporting different tokenizers for different LoRAs. By default, vLLM uses base model's tokenizer. If you are using a LoRA with its own tokenizer, consider specifying `--tokenizer [lora_path]` to use the LoRA tokenizer.)r5   r`   rB   loggerwarning_once)r<   r   s     r=   _validate_lorazInputProcessor._validate_lora  ss    F  	KLKKK   >%:     &%r?   c                    |j         r| j        sd S | j        j        r|j         rt	          d          | j        j        }|j         j        x}r/||k    r(|dk    r|j         j        st	          d| d| d          n||j         _        t          |j         j	        t                    r)|j         j	        st	          d|j         j	         d          t          |j         j        t                    r1|j         j                                        dk    rt	          d	          |                    d
          rt          |           n|                    d          r<t          | j        t"                    rt	          d          t%          |d            nC|dk    rt'          |           n,|dk    r9t          | j        t"                    rt	          d          t)          |           n	 t          |           d
|j         _        n# t          $ r |j         }d}|j        rOt          |j        t                    rdd l}|                    |j                  }n|j        }t/          |          }t          | j        t"                    s|rt'          |           d|j         _        nt%          |d            d|j         _        Y nw xY wd|j         _        |j                                          d S )NzVStructured outputs requires a tokenizer so it can't be used with 'skip_tokenizer_init'autoz[Request-level structured output backend selection is not supported. The request specified 'z"', but vLLM was initialised with 'zF'. This error can be resolved by removing '_backend' from the request.zChoice 'z' cannot be an empty list z4structured_outputs.grammar cannot be an empty stringxgrammarguidancezMistral tokenizer is not supported for the 'guidance' structured output backend. Please use ['xgrammar', 'outlines'] backends or tokenizer_mode='hf' instead.rB   outlineszlm-format-enforcerzMistral tokenizer is not supported for the 'lm-format-enforcer' structured output backend. Please use ['xgrammar', 'outlines'] backends or tokenizer_mode='hf' instead.Fr   T)structured_outputsr6   r3   skip_tokenizer_initr`   backend_backend_backend_was_autorr   choicer   grammarr   strip
startswithr+   rB   r!   r(   r*   r)   jsonloadsr'   __post_init__)r<   rI   r   r   	so_paramsskip_guidancer   schemas           r=   r]   z*InputProcessor._validate_structured_output'  s   ( 	0N 	F0 	V5N 	h   080998 	9 (""6!!f&?&Q! H9AH H-4H H H   29F%. v07>>	-4	
 V64;VVV  
 v08#>>	U)17799R??STTTj)) @	?%f----
++ =	?
 $.*:;;  ?  
 &f=====
""7????,,,$.*:;;  ?  
 B&IIIID)&1115?)22 D D D #5	 %> S!).#66 0#!%IN!;!;!*$J6$R$RMdn.>?? D= D @GGG9CF-66 .fEEEE9CF-63D6 ;?F%7 	!//11111s   .H
 
B>K
Kc                 Z    t          |t                    rd S |                    d          S )Nr}   )rr   r   r   r<   r{   s     r=   _extract_singleton_mm_dataz)InputProcessor._extract_singleton_mm_data  s.     fc"" 	4zz,---r?   c                     t          |          r|                     |d                   S |                     |          S )Nr   )r   r   r   s     r=   _extract_mm_datazInputProcessor._extract_mm_data  s@    -f55 	;226:J3KLLL226:::r?   
request_idc                     |                      |          }|sdS |                     d |                                D                       }fd|                                                                D             S )aH  Build per-item multimodal hash overrides when enabled. In this case,
        multimodal data items are identified by their request id, modality and
        index rather than their content.

        Returns a dictionary of modality -> list[str] of overrides, or None if
        disabled or no multimodal data is present.
        Nc                     i | ]
\  }}|||S rA   rX   r   s      r=   r   z8InputProcessor._maybe_build_mm_uuids.<locals>.<dictcomp>  r   r?   c                 R    i | ]"\  }fd t          |          D             #S )c                 $    g | ]} d  d | S )-rX   )rY   r   r   r   s     r=   
<listcomp>zCInputProcessor._maybe_build_mm_uuids.<locals>.<dictcomp>.<listcomp>  s/    QQQ!*55x55!55QQQr?   )range)rY   
data_countr   r   s     @r=   r   z8InputProcessor._maybe_build_mm_uuids.<locals>.<dictcomp>  sP     
 
 
$* QQQQQuZ?P?PQQQ
 
 
r?   )r   rz   r   get_all_counts)r<   r   r{   rt   mm_itemss    `   r=   _maybe_build_mm_uuidsz$InputProcessor._maybe_build_mm_uuids  s     ''// 	4''??gmmoo???
 

 
 
 
(0(?(?(A(A(G(G(I(I
 
 
 	
r?   mm_hashc                 H    || j         | j         j        s|S |j         d| S )z
        When enable_tower_connector_lora is True, multi-modal embeddings
        vary depending on the LoRA request. Therefore, the mm_hash must be
        generated based on the LoRA request to prevent incorrect cache hits.
        N:)r5   enable_tower_connector_lora	lora_name)r<   r   r   s      r=   _get_mm_identifierz!InputProcessor._get_mm_identifier  s?      '#? ( N(447444r?   requestc                     | j         t          d          | j        | _         | j          dt                      d| _        dS )zReplace the externally supplied request ID with an internal request ID
        that adds 8 random characters in order to ensure uniquness.
        NzkThe external_req_id field should not be set on EngineCoreRequests passed to vLLM; use the request_id field.r   z.8)external_req_idr`   r   r#   )r   s    r=   assign_request_idz InputProcessor.assign_request_id  sW    
 ".=   #*"4 ' 7LL+--LLLr?   r   Farrival_timetokenization_kwargstrace_headersprioritydata_parallel_rank	resumablec                    |                      |           |                     |           | j        j        }|j        }|j        }|j        r|n|}|	%d|	cxk    r|k     sn t          d|	 d| d          |t          j                    }| j	        j
        r8| j	        j
        j        dk    r#| j        j        s|                     ||          }nX|                     |           t!          |t"                    r,t%          t&          d z  |                    d                    }nd }t+          t,          j                            dd                    }dt,          j        vrt0                              d|           t5          |          5  t7          |          5  | j                            |||	          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   dd
lm} |                     |||           | j        !                                }tE          |          \  }}| #                    ||           |d         dk    rd }|d         }n
|d         }d }d }d }t!          |tH                    r||%                                }|j&        $tO          ||          }| j	        j(        |z
  |_&        |)                    | j*        |           | j+        |,                    | j+                   n|%                                }d }|d         dk    r|d         }|d         }|d         }t[          |          }g }|D ]f\  } }!||          |!         }"|.                    t_          ||          |!         | | 0                    |"|          ||          |!         |"                     gtc          ||||||||||                    d          ||	||
          S )Nr   zdata_parallel_rank z is out of range [0, z).r~   OMP_NUM_THREADS1zSOMP_NUM_THREADS is not set; defaulting Torch threads to %d for input preprocessing.)r   r   )current_platform)r{   rI   processed_inputstypeembedsprompt_embedsprompt_token_ids
multimodal	mm_kwargsmm_placeholders	mm_hashes)datar   
identifiermm_positionr   
cache_salt)r   r   r   mm_featuressampling_paramspooling_paramseos_token_idr   r   r   r   r   r   r   )2r   rs   r.   parallel_configdata_parallel_sizedata_parallel_size_locallocal_engines_onlyr`   timer3   multimodal_configmm_processor_cache_gbr4   enable_prefix_cachingr   r   rr   dictr   r   r   intosenvironr   
debug_oncer   r$   r;   
preprocessvllm.platformsr   validate_requestget_eos_token_idr   _validate_model_inputsr   clone
max_tokensr"   max_model_lenupdate_from_generation_configr8   rB   update_from_tokenizerr   rf   r   r   r%   )#r<   r   r{   rI   r   r   r   r   r   r   r   r   dp_sizedp_local_size	num_ranksr   num_threadsr   r   r   encoder_inputsdecoder_inputsr   r   r   r   seq_lenr   decoder_mm_inputsdecoder_mm_positionsdecoder_mm_hashessorted_mm_idxsr   idxbase_mm_hashs#                                      r=   process_inputszInputProcessor.process_inputs  s(    	L)))f%%%*:!4'@%4%GTMMW	)18J3V3V3V3VY3V3V3V3V5&8 5 5'05 5 5  
 9;;L /	 !3IQNN%; O 11*fEEHH ##F+++&$''  &-vzz:M/N/N    "*..):C@@AABJ..'   J'' 	 	)F{)S)S 	 	040G0R0R$7! 1S 1 1	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	433333))- 	* 	
 	
 	
 .??AA)=>N)O)O&##NNCCC &!X--#*?;MM-.@A Mfn-- 	,$llnnO)1@$m  .2->-Lw-V*99-|   ~)55dnEEE#\\^^N ;?&!\11 .{ ;#12C#D  .{ ;
 22FGGNK!/  #0:3?"").x8=!)#'#:#:(($ $ %9$B3$G ,	 	 	    !!-'#+)%%%%)),771'
 
 
 	
s6   GG;GG	GG	GG"%G"r  r	  c                 f    ||                      |d           |                      |d           d S )Nencoder)prompt_typedecoder)_validate_model_input)r<   r  r	  s      r=   r   z%InputProcessor._validate_model_inputs~  sB     %&&~9&MMM"">y"IIIIIr?   prompt_inputsr  )r  r  c          
      v   | j         }|d         dk    rd n|d         }|d         dk    r|d         nd }t          ||          }|s.|dk    r|j        rn |d         dk    rnt          d| d          | j        }|Yt          |pdd	
          }|t          |j        | j                                         dz
            k    rt          d| d          | j         j        }	||	k    r|j        r]| j	        j
        }
|
                    |          }|j        }|
                    ||          }|                    |          }|j        rd S |j        rd}nd}t          d| d| d|	 d|           ||	k    r:|dk    r6|j        s1| j         j        dk    r#d}t          d| d| d|	 d|           d S d S d S d S )Nr   r   r   r   r  zThe z prompt cannot be emptyrX   r   )defaultrj   z	Token id z is out of vocabularyr   zMake sure that `max_model_len` is no smaller than the number of text tokens plus multimodal tokens. For image inputs, the number of image tokens depends on the number of images, and possibly their aspect ratios as well.zLMake sure that `max_model_len` is no smaller than the number of text tokens.z prompt (length z-) is longer than the maximum model length of z. r  poolingzoMake sure that `max_model_len` is no smaller than the number of text tokens (prompt + requested output tokens).ze) plus the number of requested output tokens (at least 1) is longer than the maximum model length of )r3   r"   is_multimodal_modelr`   rB   maxmax_token_idrR   r  r;   r/   _get_model_cls_processor_factory_create_processing_ctxinfoskip_prompt_length_checkrunner_type)r<   r  r  r3   
prompt_idsr   
prompt_lenrB   max_input_idmax_prompt_lenr/   	model_cls	factoriesctxmm_info
suggestions                   r=   r  z$InputProcessor._validate_model_input  s    ( V$00 D12 	 V$00 /** 	
 <JVV
 	Ni''L,L'v&(22 !L!L!L!LMMMN	 z/R;;;L c&(9(H(H(J(JQ(N    !!P\!P!P!PQQQ*8&&/ "5A'66|DD	%8	!88 ' 9   $..--3 F/ K 
- 
  {    J    ;I         .((y(( 4 )!-::L  B{ B BJ B B#1B B5?B B   )(((((::r?   c                 4    | j                                         S rA   )r;   stat_mm_cacherC   s    r=   r.  zInputProcessor.stat_mm_cache  rF   r?   c                 8    | j                                          d S rA   )r;   clear_mm_cacherC   s    r=   r0  zInputProcessor.clear_mm_cache  s    ..00000r?   c                 J    | j         | j                                          d S d S rA   )r2   closerC   s    r=   r2  zInputProcessor.close  s.    ".#))+++++ /.r?   )NNNNr   NF)r0   N)6__name__
__module____qualname__r   r   r   r>   propertyr    rB   rE   r   rH   r   rU   rc   r^   rp   r   rs   r   r   rz   r   r   r
   r   r   r   r]   r   r   r   r   r   r   staticmethodr%   r   floatr   r   r   r   boolr  r   r   r   r  r&   r.  r0  r2  rX   r?   r=   r-   r-   7   s        +>
 

 (
 
	
 
 
 
. 1=4/ 1 1 1 X17} 7 7 7 7 0, 0 0 0 X0   
       DRR 
R R R R& 
   . 
   &9.9 9 9 9 ?'9 ?>Q ? ? ? ?5? 5t 5 5 5 5n6 6 6 6 6 6 ;+= $    &p2. p2T p2 p2 p2 p2d.%.	d	". . . .;z ;6H46O ; ; ; ;

 
 
d	"	
 
 
 
255 "D(5 
	5 5 5 5$ 
M#4 
M 
M 
M \
M" &*+/5926)-]
 ]
]
 ]
 .	]

 dl]
 "D(]
 "#s(^d2]
 sCx(4/]
 ]
  $J]
 ]
 
]
 ]
 ]
 ]
~J-4JFUJ J J Jb&b 12	b b b bH73d: 7 7 7 71 1 1 1, , , , , ,r?   r-   )Ir   r   collections.abcr   typingr   r   r   vllm.configr   vllm.exceptionsr   vllm.inputsr	   r
   r   r   r   vllm.inputs.parser   r   vllm.inputs.preprocessr   vllm.loggerr   vllm.lora.requestr   vllm.multimodalr   r   vllm.multimodal.inputsr   r   r   vllm.multimodal.parser   r   "vllm.multimodal.processing.contextr   vllm.multimodal.utilsr   vllm.pooling_paramsr   vllm.renderersr   vllm.sampling_paramsr   r   vllm.tokenizersr    vllm.tokenizers.mistralr!   
vllm.utilsr"   r#   vllm.utils.torch_utilsr$   vllm.v1.enginer%   vllm.v1.metrics.statsr&   *vllm.v1.structured_output.backend_guidancer'   r(   4vllm.v1.structured_output.backend_lm_format_enforcerr)   *vllm.v1.structured_output.backend_outlinesr*   *vllm.v1.structured_output.backend_xgrammarr+   r3  r   r-   rX   r?   r=   <module>rU     s   
			  # # # # # # % % % % % % % % % % " " " " " " / / / / / /              W V V V V V V V 4 4 4 4 4 4 # # # # # # ) ) ) ) ) ) C C C C C C C C         
 I H H H H H H H = = = = = = 6 6 6 6 6 6 - - - - - - ' ' ' ' ' ' > > > > > > > > ) ) ) ) ) ) 4 4 4 4 4 4 J J J J J J J J @ @ @ @ @ @ , , , , , , 6 6 6 6 6 6                  Q P P P P P	X		{
, {
, {
, {
, {
, {
, {
, {
, {
, {
,r?   