public class GridCacheFilterEvaluationEntry<K,V> extends Object implements GridCacheEntry<K,V>
| Constructor and Description |
|---|
GridCacheFilterEvaluationEntry(K key,
V val,
GridCacheEntryEx<K,V> impl) |
GridCacheFilterEvaluationEntry(K key,
V val,
GridCacheEntryEx<K,V> impl,
boolean allowTx) |
| Modifier and Type | Method and Description |
|---|---|
<V> V |
addMeta(String name,
V val)
Adds a new metadata.
|
<V> V |
addMetaIfAbsent(String name,
Callable<V> c)
Adds given metadata value only if it was absent.
|
<V> V |
addMetaIfAbsent(String name,
V val)
Adds given metadata value only if it was absent.
|
<V> Map<String,V> |
allMeta()
Gets all metadata in this entry.
|
boolean |
backup()
Gets the flag indicating if current node is backup for this entry.
|
boolean |
clear()
This method has the same semantic as
GridCacheProjection.clear(Object) method. |
boolean |
compact()
Optimizes the size of this entry.
|
void |
copyMeta(GridMetadataAware from)
Copies all metadata from another instance.
|
void |
copyMeta(Map<String,?> data)
Copies all metadata from given map.
|
boolean |
evict()
This method has the same semantic as
GridCacheProjection.evict(Object) method. |
long |
expirationTime()
Gets expiration time for this entry.
|
V |
get()
This method has the same semantic as
GridCacheProjection.get(Object) method. |
GridFuture<V> |
getAsync()
This method has the same semantic as
GridCacheProjection.getAsync(Object) method. |
K |
getKey() |
V |
getValue()
This method has the same semantic as
GridCacheEntry.get() method, however it
wraps GridException into GridRuntimeException if failed in order to
comply with Map.Entry interface. |
boolean |
hasMeta(String name)
Tests whether or not given metadata is set.
|
<V> boolean |
hasMeta(String name,
V val)
Tests whether or not metadata with given name and value is set.
|
boolean |
isCached()
Checks whether entry is currently present in cache or not.
|
boolean |
isLocked()
This method has the same semantic as
GridCacheProjection.isLocked(Object) method. |
boolean |
isLockedByThread()
This method has the same semantic as
GridCacheProjection.isLockedByThread(Object) method. |
boolean |
lock(long timeout,
GridPredicate<GridCacheEntry<K,V>>... filter)
Synchronously acquires lock on a cached object associated with this entry
only if the passed in filter (if any) passes.
|
GridFuture<Boolean> |
lockAsync(long timeout,
GridPredicate<GridCacheEntry<K,V>>... filter)
Asynchronously acquires lock on a cached object associated with this entry
only if the passed in filter (if any) passes.
|
int |
memorySize()
Gets size of serialized key and value in addition to any overhead added by
GridGain itself. |
<V> V |
meta(String name)
Gets metadata by name.
|
int |
partition()
Gets affinity partition id for this entry.
|
V |
peek()
This method has the same semantic as
GridCacheProjection.peek(Object) method. |
V |
peek(Collection<GridCachePeekMode> modes)
This method has the same semantic as
GridCacheProjection.peek(Object, Collection) method. |
boolean |
primary()
Gets the flag indicating current node's primary ownership for this entry.
|
GridCacheProjection<K,V> |
projection()
Cache projection to which this entry belongs.
|
<V> V |
putMetaIfAbsent(String name,
Callable<V> c)
Adds given metadata value only if it was absent.
|
<V> V |
putMetaIfAbsent(String name,
V val)
Adds given metadata value only if it was absent.
|
V |
reload()
This method has the same semantic as
GridCacheProjection.reload(Object) method. |
GridFuture<V> |
reloadAsync()
This method has the same semantic as
GridCacheProjection.reloadAsync(Object) method. |
V |
remove(GridPredicate<GridCacheEntry<K,V>>... filter)
This method has the same semantic as
GridCacheProjection.remove(Object, GridPredicate[]) method. |
boolean |
remove(V val)
This method has the same semantic as
GridCacheProjection.remove(Object, Object) method. |
GridFuture<V> |
removeAsync(GridPredicate<GridCacheEntry<K,V>>... filter)
This method has the same semantic as
GridCacheProjection.removeAsync(Object, GridPredicate[]) method. |
GridFuture<Boolean> |
removeAsync(V val)
This method has the same semantic as
GridCacheProjection.removeAsync(Object, Object) method. |
<V> V |
removeMeta(String name)
Removes metadata by name.
|
<V> boolean |
removeMeta(String name,
V val)
Removes metadata only if its current value is equal to
val passed in. |
boolean |
removex(GridPredicate<GridCacheEntry<K,V>>... filter)
This method has the same semantic as
GridCacheProjection.removex(Object, GridPredicate[]) method. |
GridFuture<Boolean> |
removexAsync(GridPredicate<GridCacheEntry<K,V>>... filter)
This method has the same semantic as
GridCacheProjection.removexAsync(Object, GridPredicate[]) method. |
V |
replace(V val)
This method has the same semantic as
GridCacheProjection.replace(Object, Object) method. |
boolean |
replace(V oldVal,
V newVal)
This method has the same semantic as
GridCacheProjection.replace(Object, Object, Object) method. |
GridFuture<V> |
replaceAsync(V val)
This method has the same semantic as
GridCacheProjection.replaceAsync(Object, Object) method. |
GridFuture<Boolean> |
replaceAsync(V oldVal,
V newVal)
This method has the same semantic as
GridCacheProjection.replaceAsync(Object, Object, Object) method. |
<V> boolean |
replaceMeta(String name,
V curVal,
V newVal)
Replaces given metadata with new
newVal value only if its current value
is equal to curVal. |
boolean |
replacex(V val)
This method has the same semantic as
GridCacheProjection.replacex(Object, Object) method. |
GridFuture<Boolean> |
replacexAsync(V val)
This method has the same semantic as
GridCacheProjection.replacexAsync(Object, Object) method. |
V |
set(V val,
GridPredicate<GridCacheEntry<K,V>>... filter)
This method has the same semantic as
GridCacheProjection.put(Object, Object, GridPredicate[]) method. |
GridFuture<V> |
setAsync(V val,
GridPredicate<GridCacheEntry<K,V>>... filter)
This method has the same semantic as
GridCacheProjection.putAsync(Object, Object, GridPredicate[]) method. |
V |
setIfAbsent(V val)
This method has the same semantic as
GridCacheProjection.putIfAbsent(Object, Object) method. |
GridFuture<V> |
setIfAbsentAsync(V val)
This method has the same semantic as
GridCacheProjection.putIfAbsentAsync(Object, Object) method. |
V |
setValue(V val)
This method has the same semantic as
GridCacheEntry.set(Object, GridPredicate[]) method, however it
wraps GridException into GridRuntimeException if failed in order to
comply with Map.Entry interface. |
boolean |
setx(V val,
GridPredicate<GridCacheEntry<K,V>>... filter)
This method has the same semantic as
GridCacheProjection.putx(Object, Object, GridPredicate[]) method. |
GridFuture<Boolean> |
setxAsync(V val,
GridPredicate<GridCacheEntry<K,V>>... filter)
This method has the same semantic as
GridCacheProjection.putxAsync(Object, Object, GridPredicate[]) method. |
boolean |
setxIfAbsent(V val)
This method has the same semantic as
GridCacheProjection.putxIfAbsent(Object, Object) method. |
GridFuture<Boolean> |
setxIfAbsentAsync(V val)
This method has the same semantic as
GridCacheProjection.putxIfAbsentAsync(Object, Object) method. |
long |
timeToLive()
Gets time to live, i.e.
|
void |
timeToLive(long ttl)
Sets time to live, i.e.
|
String |
toString() |
void |
transform(GridClosure<V,V> transformer)
This method has the same semantic as
GridCacheProjection.transform(Object, GridClosure) method. |
GridFuture<?> |
transformAsync(GridClosure<V,V> transformer)
This method has the same semantic as
GridCacheProjection.transformAsync(Object, GridClosure) method. |
void |
unlock(GridPredicate<GridCacheEntry<K,V>>... filter)
Unlocks this entry only if current thread owns the lock.
|
Object |
version()
Gets current version of this cache entry.
|
public GridCacheFilterEvaluationEntry(K key, V val, GridCacheEntryEx<K,V> impl, boolean allowTx)
key - Key.val - Value.impl - Entry implementation.allowTx - Whether value access is allowed in transactional mode.public GridCacheFilterEvaluationEntry(K key, V val, GridCacheEntryEx<K,V> impl)
key - Key.val - Value.impl - Entry implementation.public V getValue()
GridCacheEntry.get() method, however it
wraps GridException into GridRuntimeException if failed in order to
comply with Map.Entry interface.getValue in interface Map.Entry<K,V>getValue in interface GridCacheEntry<K,V>GridCacheEntry.get()public V setValue(V val)
GridCacheEntry.set(Object, GridPredicate[]) method, however it
wraps GridException into GridRuntimeException if failed in order to
comply with Map.Entry interface.setValue in interface Map.Entry<K,V>setValue in interface GridCacheEntry<K,V>GridCacheEntry.set(Object, GridPredicate[])@Nullable public V peek()
GridCacheProjection.peek(Object) method.peek in interface GridCacheEntry<K,V>GridCacheProjection.peek(Object).@Nullable public V peek(@Nullable Collection<GridCachePeekMode> modes)
GridCacheProjection.peek(Object, Collection) method.peek in interface GridCacheEntry<K,V>modes - See GridCacheProjection.peek(Object, Collection).GridCacheProjection.peek(Object, Collection).@Nullable public V get() throws GridException
GridCacheProjection.get(Object) method.get in interface GridCacheEntry<K,V>GridCacheProjection.get(Object).GridException - See GridCacheProjection.get(Object).public GridFuture<V> getAsync()
GridCacheProjection.getAsync(Object) method.getAsync in interface GridCacheEntry<K,V>GridCacheProjection.getAsync(Object).public GridCacheProjection<K,V> projection()
projection in interface GridCacheEntry<K,V>@Nullable public V reload() throws GridException
GridCacheProjection.reload(Object) method.reload in interface GridCacheEntry<K,V>GridCacheProjection.reload(Object).GridException - See GridCacheProjection.reload(Object).public GridFuture<V> reloadAsync()
GridCacheProjection.reloadAsync(Object) method.reloadAsync in interface GridCacheEntry<K,V>GridCacheProjection.reloadAsync(Object).public boolean isLocked()
GridCacheProjection.isLocked(Object) method.isLocked in interface GridCacheEntry<K,V>GridCacheProjection.isLocked(Object).public boolean isLockedByThread()
GridCacheProjection.isLockedByThread(Object) method.isLockedByThread in interface GridCacheEntry<K,V>GridCacheProjection.isLockedByThread(Object).public Object version()
version in interface GridCacheEntry<K,V>public long expirationTime()
expirationTime in interface GridCacheEntry<K,V>public long timeToLive()
timeToLive in interface GridCacheEntry<K,V>public void timeToLive(long ttl)
When called outside the transaction, this method will have no effect until the next update operation.
timeToLive in interface GridCacheEntry<K,V>ttl - Time to live value for this entry.public boolean primary()
Note, that this value is dynamic and may change with grid topology changes.
primary in interface GridCacheEntry<K,V>True if current grid node is the primary owner for this entry.public boolean backup()
Note, that this value is dynamic and may change with grid topology changes.
backup in interface GridCacheEntry<K,V>True if current grid node is the backup for this entry.public int partition()
partition in interface GridCacheEntry<K,V>@Nullable public V set(V val, @Nullable GridPredicate<GridCacheEntry<K,V>>... filter) throws GridException
GridCacheProjection.put(Object, Object, GridPredicate[]) method.set in interface GridCacheEntry<K,V>val - See GridCacheProjection.put(Object, Object, GridPredicate[])filter - See GridCacheProjection.put(Object, Object, GridPredicate[]).GridCacheProjection.put(Object, Object, GridPredicate[]).GridException - See GridCacheProjection.put(Object, Object, GridPredicate[]).public GridFuture<V> setAsync(V val, @Nullable GridPredicate<GridCacheEntry<K,V>>... filter)
GridCacheProjection.putAsync(Object, Object, GridPredicate[]) method.setAsync in interface GridCacheEntry<K,V>val - See GridCacheProjection.putAsync(Object, Object, GridPredicate[])filter - See GridCacheProjection.putAsync(Object, Object, GridPredicate[]).GridCacheProjection.putAsync(Object, Object, GridPredicate[]).@Nullable public V setIfAbsent(V val) throws GridException
GridCacheProjection.putIfAbsent(Object, Object) method.setIfAbsent in interface GridCacheEntry<K,V>val - See GridCacheProjection.putIfAbsent(Object, Object)GridCacheProjection.putIfAbsent(Object, Object).GridException - See GridCacheProjection.putIfAbsent(Object, Object).public GridFuture<V> setIfAbsentAsync(V val)
GridCacheProjection.putIfAbsentAsync(Object, Object) method.setIfAbsentAsync in interface GridCacheEntry<K,V>val - See GridCacheProjection.putIfAbsentAsync(Object, Object)GridCacheProjection.putIfAbsentAsync(Object, Object).public boolean setx(V val, @Nullable GridPredicate<GridCacheEntry<K,V>>... filter) throws GridException
GridCacheProjection.putx(Object, Object, GridPredicate[]) method.setx in interface GridCacheEntry<K,V>val - See GridCacheProjection.putx(Object, Object, GridPredicate[])filter - See GridCacheProjection.putx(Object, Object, GridPredicate[]).GridCacheProjection.putx(Object, Object, GridPredicate[]).GridException - See GridCacheProjection.putx(Object, Object, GridPredicate[]).public GridFuture<Boolean> setxAsync(V val, @Nullable GridPredicate<GridCacheEntry<K,V>>... filter)
GridCacheProjection.putxAsync(Object, Object, GridPredicate[]) method.setxAsync in interface GridCacheEntry<K,V>val - See GridCacheProjection.putxAsync(Object, Object, GridPredicate[])filter - See GridCacheProjection.putxAsync(Object, Object, GridPredicate[]).GridCacheProjection.putxAsync(Object, Object, GridPredicate[]).public boolean setxIfAbsent(@Nullable V val) throws GridException
GridCacheProjection.putxIfAbsent(Object, Object) method.setxIfAbsent in interface GridCacheEntry<K,V>val - See GridCacheProjection.putxIfAbsent(Object, Object)GridCacheProjection.putxIfAbsent(Object, Object).GridException - See GridCacheProjection.putxIfAbsent(Object, Object).public GridFuture<Boolean> setxIfAbsentAsync(V val)
GridCacheProjection.putxIfAbsentAsync(Object, Object) method.setxIfAbsentAsync in interface GridCacheEntry<K,V>val - See GridCacheProjection.putxIfAbsentAsync(Object, Object)GridCacheProjection.putxIfAbsentAsync(Object, Object).public void transform(GridClosure<V,V> transformer) throws GridException
GridCacheProjection.transform(Object, GridClosure) method.transform in interface GridCacheEntry<K,V>transformer - Closure to be applied to the previous value in cache. If this closure returns
null, the associated value will be removed from cache.GridException - If cache update failed.GridCacheProjection.transform(Object, GridClosure)public GridFuture<?> transformAsync(GridClosure<V,V> transformer)
GridCacheProjection.transformAsync(Object, GridClosure) method.transformAsync in interface GridCacheEntry<K,V>transformer - Closure to be applied to the previous value in cache. If this closure returns
null, the associated value will be removed from cache.@Nullable public V replace(V val) throws GridException
GridCacheProjection.replace(Object, Object) method.replace in interface GridCacheEntry<K,V>val - See GridCacheProjection.replace(Object, Object)GridCacheProjection.replace(Object, Object).GridException - See GridCacheProjection.replace(Object, Object).public GridFuture<V> replaceAsync(V val)
GridCacheProjection.replaceAsync(Object, Object) method.replaceAsync in interface GridCacheEntry<K,V>val - See GridCacheProjection.replaceAsync(Object, Object)GridCacheProjection.replaceAsync(Object, Object).public boolean replacex(V val) throws GridException
GridCacheProjection.replacex(Object, Object) method.replacex in interface GridCacheEntry<K,V>val - See GridCacheProjection.replacex(Object, Object)GridCacheProjection.replacex(Object, Object).GridException - See GridCacheProjection.replacex(Object, Object).public GridFuture<Boolean> replacexAsync(V val)
GridCacheProjection.replacexAsync(Object, Object) method.replacexAsync in interface GridCacheEntry<K,V>val - See GridCacheProjection.replacexAsync(Object, Object)GridCacheProjection.replacexAsync(Object, Object).public boolean replace(V oldVal, V newVal) throws GridException
GridCacheProjection.replace(Object, Object, Object) method.replace in interface GridCacheEntry<K,V>oldVal - See GridCacheProjection.replace(Object, Object, Object)newVal - See GridCacheProjection.replace(Object, Object, Object)GridCacheProjection.replace(Object, Object).GridException - See GridCacheProjection.replace(Object, Object).public GridFuture<Boolean> replaceAsync(V oldVal, V newVal)
GridCacheProjection.replaceAsync(Object, Object, Object) method.replaceAsync in interface GridCacheEntry<K,V>oldVal - See GridCacheProjection.replaceAsync(Object, Object, Object)newVal - See GridCacheProjection.replaceAsync(Object, Object, Object)GridCacheProjection.replaceAsync(Object, Object).@Nullable public V remove(@Nullable GridPredicate<GridCacheEntry<K,V>>... filter) throws GridException
GridCacheProjection.remove(Object, GridPredicate[]) method.remove in interface GridCacheEntry<K,V>filter - See GridCacheProjection.remove(Object, GridPredicate[]).GridCacheProjection.remove(Object, GridPredicate[]).GridException - See GridCacheProjection.remove(Object, GridPredicate[]).public GridFuture<V> removeAsync(@Nullable GridPredicate<GridCacheEntry<K,V>>... filter)
GridCacheProjection.removeAsync(Object, GridPredicate[]) method.removeAsync in interface GridCacheEntry<K,V>filter - See GridCacheProjection.removeAsync(Object, GridPredicate[]).GridCacheProjection.removeAsync(Object, GridPredicate[]).public boolean removex(@Nullable GridPredicate<GridCacheEntry<K,V>>... filter) throws GridException
GridCacheProjection.removex(Object, GridPredicate[]) method.removex in interface GridCacheEntry<K,V>filter - See GridCacheProjection.removex(Object, GridPredicate[]).GridCacheProjection.removex(Object, GridPredicate[]).GridException - See GridCacheProjection.removex(Object, GridPredicate[]).public GridFuture<Boolean> removexAsync(@Nullable GridPredicate<GridCacheEntry<K,V>>... filter)
GridCacheProjection.removexAsync(Object, GridPredicate[]) method.removexAsync in interface GridCacheEntry<K,V>filter - See GridCacheProjection.removexAsync(Object, GridPredicate[]).GridCacheProjection.removexAsync(Object, GridPredicate[]).public boolean remove(V val) throws GridException
GridCacheProjection.remove(Object, Object) method.remove in interface GridCacheEntry<K,V>val - See GridCacheProjection.remove(Object, Object).GridCacheProjection.remove(Object, Object).GridException - See GridCacheProjection.remove(Object, Object).public GridFuture<Boolean> removeAsync(V val)
GridCacheProjection.removeAsync(Object, Object) method.removeAsync in interface GridCacheEntry<K,V>val - See GridCacheProjection.removeAsync(Object, Object).GridCacheProjection.removeAsync(Object, Object).public boolean evict()
GridCacheProjection.evict(Object) method.evict in interface GridCacheEntry<K,V>GridCacheProjection.evict(Object).public boolean clear()
GridCacheProjection.clear(Object) method.clear in interface GridCacheEntry<K,V>GridCacheProjection.clear(Object).public boolean compact()
throws GridException
compact in interface GridCacheEntry<K,V>true if entry was cleared from cache (if value was null).GridException - If failed to compact.public boolean lock(long timeout,
@Nullable
GridPredicate<GridCacheEntry<K,V>>... filter)
throws GridException
GridCacheTxConcurrency.PESSIMISTIC concurrency control for transaction
which will acquire explicit locks for relevant cache operations.
GridCacheFlag.LOCAL, GridCacheFlag.READ.lock in interface GridCacheEntry<K,V>timeout - Timeout in milliseconds to wait for lock to be acquired
('0' for no expiration).filter - Optional filter to validate prior to acquiring the lock.True if all filters passed and lock was acquired,
false otherwise.GridException - If lock acquisition resulted in error.public GridFuture<Boolean> lockAsync(long timeout, @Nullable GridPredicate<GridCacheEntry<K,V>>... filter)
GridCacheTxConcurrency.PESSIMISTIC concurrency control for transaction
which will acquire explicit locks for relevant cache operations.
GridCacheFlag.LOCAL, GridCacheFlag.READ.lockAsync in interface GridCacheEntry<K,V>timeout - Timeout in milliseconds to wait for lock to be acquired
('0' for no expiration).filter - Optional filter to validate prior to acquiring the lock.true
whenever all filters pass and locks are acquired before timeout is expired,
false otherwise.public void unlock(GridPredicate<GridCacheEntry<K,V>>... filter) throws GridException
GridCacheTxConcurrency.PESSIMISTIC concurrency control for transaction
which will acquire explicit locks for relevant cache operations.
GridCacheFlag.LOCAL, GridCacheFlag.READ.unlock in interface GridCacheEntry<K,V>filter - Optional filter that needs to pass prior to unlock taking effect.GridException - If unlock execution resulted in error.public boolean isCached()
false is returned. In this case all
operations on this entry will cause creation of a new entry in cache.isCached in interface GridCacheEntry<K,V>True if entry is in cache, false otherwise.public int memorySize()
throws GridException
GridGain itself.memorySize in interface GridCacheEntry<K,V>GridException - If failed to evaluate entry size.public void copyMeta(GridMetadataAware from)
copyMeta in interface GridMetadataAwarefrom - Metadata aware instance to copy metadata from.public void copyMeta(Map<String,?> data)
copyMeta in interface GridMetadataAwaredata - Map to copy metadata from.@Nullable public <V> V addMeta(String name, V val)
addMeta in interface GridMetadataAwareV - Type of the value.name - Metadata name.val - Metadata value.null if there was none.@Nullable public <V> V putMetaIfAbsent(String name, V val)
putMetaIfAbsent in interface GridMetadataAwareV - Type of the value.name - Metadata name.val - Value to add if it's not attached already.null if new value was put, or current value if put didn't happen.@Nullable public <V> V putMetaIfAbsent(String name, Callable<V> c)
putMetaIfAbsent in interface GridMetadataAwareV - Type of the value.name - Metadata name.c - Factory closure to produce value to add if it's not attached already.
Not that unlike GridMetadataAware.addMeta(String, Object) method the factory closure will
not be called unless the value is required and therefore value will only be created
when it is actually needed.null if new value was put, or current value if put didn't happen.public <V> V addMetaIfAbsent(String name, V val)
GridMetadataAware.putMetaIfAbsent(String, Callable), this method always returns
the latest value and never previous one.addMetaIfAbsent in interface GridMetadataAwareV - Type of the value.name - Metadata name.val - Value to add if it's not attached already.@Nullable public <V> V addMetaIfAbsent(String name, @Nullable Callable<V> c)
addMetaIfAbsent in interface GridMetadataAwareV - Type of the value.name - Metadata name.c - Factory closure to produce value to add if it's not attached already.
Not that unlike GridMetadataAware.addMeta(String, Object) method the factory closure will
not be called unless the value is required and therefore value will only be created
when it is actually needed. If null and metadata value is missing - null
will be returned from this method.public <V> V meta(String name)
meta in interface GridMetadataAwareV - Type of the value.name - Metadata name.null.public <V> V removeMeta(String name)
removeMeta in interface GridMetadataAwareV - Type of the value.name - Name of the metadata to remove.null.public <V> boolean removeMeta(String name, V val)
val passed in.removeMeta in interface GridMetadataAwareV - Value type.name - Name of metadata attribute.val - Value to compare.True if value was removed, false otherwise.public <V> Map<String,V> allMeta()
allMeta in interface GridMetadataAwareV - Type of the value.public boolean hasMeta(String name)
hasMeta in interface GridMetadataAwarename - Name of the metadata to test.public <V> boolean hasMeta(String name, V val)
true if
attachment with given name it set and its value is equals to provided value. Otherwise returns
false.hasMeta in interface GridMetadataAwareV - Type of the value.name - Name of the metadata.val - Value to compare. Cannot be null.true if metadata with given name is set and its value is equals to provided value -
otherwise returns false.public <V> boolean replaceMeta(String name, V curVal, V newVal)
newVal value only if its current value
is equal to curVal. Otherwise, it is no-op.replaceMeta in interface GridMetadataAwarename - Name of the metadata.curVal - Current value to check.newVal - New value.true if replacement occurred, false otherwise.Copyright © 2014. All rights reserved.