Package | Description |
---|---|
com.aquenos.epics.jackie.client.io |
Client I/O utilities.
|
com.aquenos.epics.jackie.client.resolver |
Channel name resolver.
|
com.aquenos.epics.jackie.common.exception |
Exceptions used by the Jackie library.
|
com.aquenos.epics.jackie.common.protocol |
Classes for encoding and decoding the Channel Access (v4) protocol.
|
Modifier and Type | Method and Description |
---|---|
protected ChannelAccessVersion |
ChannelAccessServerConnection.getVersion()
Returns the Channel Access protocol version supported by the server.
|
Constructor and Description |
---|
ChannelAccessServerConnection(BeaconDetector beaconDetector,
java.nio.charset.Charset charset,
CommunicationController communicationController,
ErrorHandler errorHandler,
int maxReceiveSize,
int maxSendSize,
java.net.InetSocketAddress serverAddress,
ChannelAccessVersion version)
Creates a connection.
|
Modifier and Type | Method and Description |
---|---|
void |
ChannelNameResolver.ChannelNameSearchResultProcessor.processChannelLocation(java.lang.String channelName,
int cid,
java.net.InetSocketAddress serverAddress,
ChannelAccessVersion serverVersion)
Processes the results of a successful channel name lookup.
|
Modifier and Type | Method and Description |
---|---|
ChannelAccessVersion |
UnsupportedInThisVersionException.getOffendingVersion()
Returns the Channel Access version that was requested and caused this
exception.
|
Constructor and Description |
---|
UnsupportedInThisVersionException(ChannelAccessVersion offendingVersion,
ChannelAccessCommand offendingCommand)
Constructs a new exception with the specified Channel Access version and
command.
|
UnsupportedInThisVersionException(java.lang.String message,
ChannelAccessVersion offendingVersion,
ChannelAccessCommand offendingCommand)
Constructs a new exception with the specified detail message.
|
Modifier and Type | Field and Description |
---|---|
static ChannelAccessVersion |
ChannelAccessVersion.NEWEST_SUPPORTED_VERSION
Newest version supported by this library.
|
protected ChannelAccessVersion |
ChannelAccessVersionMessage.version
Channel Access version as enum.
|
Modifier and Type | Method and Description |
---|---|
static ChannelAccessVersion |
ChannelAccessVersion.forMinorVersion(int minorVersion)
Returns the version object for the specified minor version, assuming
major version 4.
|
static ChannelAccessVersion |
ChannelAccessVersion.forMinorVersion(short minorVersion)
Returns the version object for the specified minor version, assuming
major version 4.
|
static ChannelAccessVersion |
ChannelAccessVersion.forVersion(int majorVersion,
int minorVersion)
Returns the version object for the specified major and minor version.
|
ChannelAccessVersion |
ChannelAccessVersionMessage.getVersion()
Returns the Channel Access version supported by the peer sending this
message.
|
ChannelAccessVersion |
ChannelAccessSearchUDPServerMessage.getVersion()
Returns the Channel Access version supported by this server.
|
ChannelAccessVersion |
ChannelAccessSearchClientMessage.getVersion()
Returns the Channel Access version supported by this client.
|
ChannelAccessVersion |
ChannelAccessConnectChannelClientMessage.getVersion()
Returns the Channel Access version supported by this client.
|
ChannelAccessVersion |
ChannelAccessBeaconMessage.getVersion()
Returns the most recent Channel Access version supported by the server.
|
static ChannelAccessVersion |
ChannelAccessVersion.valueOf(java.lang.String name)
Returns the enum constant of this type with the specified name.
|
static ChannelAccessVersion[] |
ChannelAccessVersion.values()
Returns an array containing the constants of this enum type, in
the order they are declared.
|
Modifier and Type | Method and Description |
---|---|
ChannelAccessMessage |
ChannelAccessMessageCodec.decodeMessageFromRepeater(ByteSource byteSource,
ChannelAccessVersion version)
Decodes a message that has been sent from a repeater to a client via UDP.
|
ChannelAccessMessage |
ChannelAccessMessageCodec.decodeMessageToRepeater(ByteSource byteSource,
ChannelAccessVersion version,
java.net.Inet4Address originAddress)
Decodes a message that has been sent to a repeater via UDP (from a client
or a server).
|
ChannelAccessMessage |
ChannelAccessMessageCodec.decodeMessageToTCPClient(ByteSource byteSource,
ChannelAccessVersion version,
java.net.Inet4Address serverAddress,
int serverPort)
Decodes a message that has been sent from a server to a client via TCP.
|
ChannelAccessMessage |
ChannelAccessMessageCodec.decodeMessageToTCPServer(ByteSource byteSource,
ChannelAccessVersion version)
Decodes a message that has been sent from a client to a server via TCP.
|
protected static ChannelAccessMessage |
ChannelAccessMessageCodec.decodeMessageToTCPServer(ChannelAccessMessageHeader messageHeader,
ByteSource byteSource,
boolean headerOnly,
java.nio.charset.Charset charset,
int maxPayloadSize,
ChannelAccessVersion version)
Decodes a message that has been sent from a client to a server via TCP.
|
ChannelAccessMessage |
ChannelAccessMessageCodec.decodeMessageToUDPClient(ByteSource byteSource,
ChannelAccessVersion version,
java.net.Inet4Address serverAddress,
int serverPort)
Decodes a message that has been sent to a client via UDP (most likely by
a server).
|
ChannelAccessMessage |
ChannelAccessMessageCodec.decodeMessageToUDPServer(ByteSource byteSource,
ChannelAccessVersion version)
Decodes a message that has been sent to a server via UDP (most likely by
a client).
|
protected static ChannelAccessMessage |
ChannelAccessMessageCodec.decodeMessageToUDPServer(ChannelAccessMessageHeader messageHeader,
ByteSource byteSource,
boolean headerOnly,
java.nio.charset.Charset charset,
int maxPayloadSize,
ChannelAccessVersion version)
Decodes a message that has been sent to a server via UDP (most likely by
a client).
|
protected static ChannelAccessErrorMessage |
ChannelAccessErrorMessage.deserialize(ChannelAccessMessageHeader messageHeader,
ByteSource byteSource,
java.nio.charset.Charset charset,
ChannelAccessVersion version,
boolean isTCP)
Constructs a message from a header and a byte source.
|
void |
ChannelAccessMessageCodec.encodeMessageFromRepeater(ByteSink byteSink,
ChannelAccessMessage message,
ChannelAccessVersion version)
Encodes a message that shall be sent from a repeater to a client via UDP.
|
void |
ChannelAccessMessageCodec.encodeMessageToRepeater(ByteSink byteSink,
ChannelAccessMessage message,
ChannelAccessVersion version)
Encodes a message that shall be sent from a server or a client to a
repeater via UDP.
|
void |
ChannelAccessMessageCodec.encodeMessageToTCPClient(ByteSink byteSink,
ChannelAccessMessage message,
ChannelAccessVersion version)
Encodes a message that shall be sent from a server to a client via TCP
Only messages of type
ChannelAccessVersionTCPServerMessage ,
ChannelAccessSubscriptionServerMessage ,
ChannelAccessCancelSubscriptionServerMessage ,
ChannelAccessReadServerMessage ,
ChannelAccessReadSyncMessage , ChannelAccessErrorMessage ,
ChannelAccessDisconnectChannelMessage ,
ChannelAccessReadNotifyServerMessage ,
ChannelAccessConnectChannelServerMessage ,
ChannelAccessWriteNotifyServerMessage ,
ChannelAccessAccessRightsMessage ,
ChannelAccessEchoMessage ,
ChannelAccessConnectChannelFailedMessage ,
ChannelAccessChannelDisconnectedByServerMessage ,
ChannelAccessSearchTCPServerMessage , and
ChannelAccessNotFoundMessage can be sent via this protocol. |
void |
ChannelAccessMessageCodec.encodeMessageToTCPServer(ByteSink byteSink,
ChannelAccessMessage message,
ChannelAccessVersion version)
Encodes a message that shall be sent from a client to a server via TCP
Only messages of type
ChannelAccessVersionTCPClientMessage ,
ChannelAccessSubscriptionClientMessage ,
ChannelAccessCancelSubscriptionClientMessage ,
ChannelAccessReadClientMessage , ChannelAccessWriteMessage
, ChannelAccessEventsOffMessage ,
ChannelAccessEventsOnMessage ,
ChannelAccessReadSyncMessage ,
ChannelAccessDisconnectChannelMessage ,
ChannelAccessReadNotifyClientMessage ,
ChannelAccessConnectChannelClientMessage ,
ChannelAccessWriteNotifyClientMessage ,
ChannelAccessUserNameMessage ,
ChannelAccessHostNameMessage , ChannelAccessEchoMessage ,
and ChannelAccessSearchClientMessage can be sent via this
protocol. |
void |
ChannelAccessMessageCodec.encodeMessageToUDPClient(ByteSink byteSink,
ChannelAccessMessage message,
ChannelAccessVersion version)
Encodes a message that shall be sent from a server to a client via UDP.
|
void |
ChannelAccessMessageCodec.encodeMessageToUDPServer(ByteSink byteSink,
ChannelAccessMessage message,
ChannelAccessVersion version)
Encodes a message that shall be sent from a client to a server via UDP.
|
boolean |
ChannelAccessVersion.includes(ChannelAccessVersion otherVersion)
Returns whether this protocol version includes another protocol version.
|
protected void |
ChannelAccessWriteNotifyServerMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessWriteNotifyClientMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessWriteMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessVersionUDPMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessVersionTCPServerMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessVersionTCPClientMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessUserNameMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessSubscriptionServerMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessSubscriptionClientMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessSearchUDPServerMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessSearchTCPServerMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessSearchClientMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessRepeaterRegisterMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessRepeaterConfirmMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessReadSyncMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessReadServerMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessReadNotifyServerMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessReadNotifyClientMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessReadClientMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessReadBuildMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessNotFoundMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected abstract void |
ChannelAccessMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset)
Serializes this message to a byte sink.
|
protected void |
ChannelAccessHostNameMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessEventsOnMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessEventsOffMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessErrorMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessEchoMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessDisconnectChannelMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessConnectChannelServerMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessConnectChannelFailedMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessConnectChannelClientMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessChannelDisconnectedByServerMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessCancelSubscriptionServerMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessCancelSubscriptionClientMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessBeaconMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessAccessRightsMessage.serialize(ByteSink byteSink,
ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessMessage.serializeHeader(ByteSink byteSink,
int payloadSize,
short dataType,
int count,
int cid,
int contextSpecific,
ChannelAccessVersion version,
int maxPayloadSize)
Serializes the header of the message.
|
protected void |
ChannelAccessWriteNotifyServerMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessWriteNotifyClientMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessWriteMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessUserNameMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessSubscriptionServerMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessSubscriptionClientMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessSearchUDPServerMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessSearchTCPServerMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessSearchClientMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessRepeaterRegisterMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessReadSyncMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessReadServerMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessReadNotifyServerMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessReadNotifyClientMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessReadClientMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessReadBuildMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessNotFoundMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset)
Verifies that this message can be serialized.
|
protected void |
ChannelAccessHostNameMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessErrorMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessEchoMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessConnectChannelServerMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessConnectChannelClientMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessCancelSubscriptionServerMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessCancelSubscriptionClientMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessAccessRightsMessage.verify(ChannelAccessVersion version,
int maxPayloadSize,
java.nio.charset.Charset charset) |
protected void |
ChannelAccessMessage.verifyHeader(int payloadSize,
int count,
ChannelAccessVersion version,
int maxPayloadSize)
Verifies that the message header can be serialized.
|
void |
ChannelAccessMessageCodec.verifyMessageFromRepeater(ChannelAccessMessage message,
ChannelAccessVersion version)
Verifies a message that shall be sent from a repeater to a client via
UDP.
|
void |
ChannelAccessMessageCodec.verifyMessageToRepeater(ChannelAccessMessage message,
ChannelAccessVersion version)
Verifies a message that shall be sent from a server or a client to a
repeater via UDP.
|
void |
ChannelAccessMessageCodec.verifyMessageToTCPClient(ChannelAccessMessage message,
ChannelAccessVersion version)
Verifies a message that shall be sent from a server to a client via TCP
Only messages of type
ChannelAccessVersionTCPServerMessage ,
ChannelAccessSubscriptionServerMessage ,
ChannelAccessCancelSubscriptionServerMessage ,
ChannelAccessReadServerMessage ,
ChannelAccessReadSyncMessage , ChannelAccessErrorMessage ,
ChannelAccessDisconnectChannelMessage ,
ChannelAccessReadNotifyServerMessage ,
ChannelAccessConnectChannelServerMessage ,
ChannelAccessWriteNotifyServerMessage ,
ChannelAccessAccessRightsMessage ,
ChannelAccessEchoMessage ,
ChannelAccessConnectChannelFailedMessage ,
ChannelAccessChannelDisconnectedByServerMessage ,
ChannelAccessSearchTCPServerMessage , and
ChannelAccessNotFoundMessage can be sent via this protocol. |
void |
ChannelAccessMessageCodec.verifyMessageToTCPServer(ChannelAccessMessage message,
ChannelAccessVersion version)
Verifies a message that shall be sent from a client to a server via TCP
Only messages of type
ChannelAccessVersionTCPClientMessage ,
ChannelAccessSubscriptionClientMessage ,
ChannelAccessCancelSubscriptionClientMessage ,
ChannelAccessReadClientMessage , ChannelAccessWriteMessage
, ChannelAccessEventsOffMessage ,
ChannelAccessEventsOnMessage ,
ChannelAccessReadSyncMessage ,
ChannelAccessDisconnectChannelMessage ,
ChannelAccessReadNotifyClientMessage ,
ChannelAccessConnectChannelClientMessage ,
ChannelAccessWriteNotifyClientMessage ,
ChannelAccessUserNameMessage ,
ChannelAccessHostNameMessage , ChannelAccessEchoMessage ,
and ChannelAccessSearchClientMessage can be sent via this
protocol. |
void |
ChannelAccessMessageCodec.verifyMessageToUDPClient(ChannelAccessMessage message,
ChannelAccessVersion version)
Verifies a message that shall be sent from a server to a client via UDP.
|
void |
ChannelAccessMessageCodec.verifyMessageToUDPServer(ChannelAccessMessage message,
ChannelAccessVersion version)
Verifies a message that shall be sent from a client to a server via UDP.
|
Constructor and Description |
---|
ChannelAccessBeaconMessage(java.net.Inet4Address serverAddress,
int serverPort,
ChannelAccessVersion version,
int sequenceNumber)
Constructor for creating a
CA_PROTO_RSRV_IS_UP message. |
ChannelAccessConnectChannelClientMessage(int cid,
ChannelAccessVersion version,
java.lang.String channelName)
Creates a
CA_PROTO_CREATE_CHAN message. |
ChannelAccessSearchClientMessage(int cid,
ChannelAccessVersion version,
boolean doReply,
java.lang.String channelName)
Creates a new
CA_PROTO_SEARCH message that can be sent from
a client to a UDP or TCP server. |
ChannelAccessSearchUDPServerMessage(ChannelAccessVersion version,
int cid,
java.net.Inet4Address serverAddress,
int serverPort)
Creates a
CA_PROTO_SEARCH message that can be sent from a
server to a client via UDP. |
ChannelAccessVersionTCPClientMessage(ChannelAccessVersion version,
short priority)
Creates a
CA_PROTO_VERSION message. |
ChannelAccessVersionTCPServerMessage(ChannelAccessVersion version)
Creates a
CA_PROTO_VERSION message. |
ChannelAccessVersionUDPMessage(ChannelAccessVersion version,
boolean sequenceNumberIsValid,
int sequenceNumber)
Creates a
CA_PROTO_VERSION message. |
Copyright © 2014–2017 aquenos GmbH. All rights reserved.