#
#
#    Licensed to the Apache Software Foundation (ASF) under one
#    or more contributor license agreements. See the NOTICE file
#    distributed with this work for additional information
#    regarding copyright ownership. The ASF licenses this file
#    to you under the Apache License, Version 2.0 (the
#    "License"); you may not use this file except in compliance
#    with the License. You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing,
#    software distributed under the License is distributed on an
#    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#    KIND, either express or implied. See the License for the
#    specific language governing permissions and limitations
#    under the License.
#
#
NoEndpointsFound = No endpoints found in the domain that match the reference {0}
EndpointReferenceCantBeMatched = Unable to match the endpoint reference {0} with the policy of the service to which it refers, matching process was {1}
# Single quote (we'll) needs to be escaped as we''ll 
ComponentReferenceTargetNotFound = Component reference target not found at deployment time, it might be a remote service elsewhere in the SCA Domain so we''ll try and resolve it again at runtime: {0} 
TooManyTargetServices = [ASM60048] A component reference {0} with only the target component service name specified {1} matches more than one service
UnableToBind = Unable to bind