func (mem *cache) CandidateLocations(transport types.ImageTransport, scope types.BICTransportScope, primaryDigest digest.Digest, canSubstitute bool) []types.BICReplacementCandidate {
	mem.mutex.Lock()
	defer mem.mutex.Unlock()
	res := []prioritize.CandidateWithTime{}
	res = mem.appendReplacementCandidates(res, transport, scope, primaryDigest)
	var uncompressedDigest digest.Digest // = ""
	if canSubstitute {
		if uncompressedDigest = mem.uncompressedDigestLocked(primaryDigest); uncompressedDigest != "" {
			otherDigests := mem.digestsByUncompressed[uncompressedDigest] // nil if not present in the map
			for d := range otherDigests {
				if d != primaryDigest && d != uncompressedDigest {
					res = mem.appendReplacementCandidates(res, transport, scope, d)
				}
			}
			if uncompressedDigest != primaryDigest {
				res = mem.appendReplacementCandidates(res, transport, scope, uncompressedDigest)
			}
		}
	}
	return prioritize.DestructivelyPrioritizeReplacementCandidates(res, primaryDigest, uncompressedDigest)
}
func (mem *cache) CandidateLocations(transport types.ImageTransport, scope types.BICTransportScope, primaryDigest digest.Digest, canSubstitute bool) []types.BICReplacementCandidate {
	mem.mutex.Lock()
	defer mem.mutex.Unlock()
	res := []prioritize.CandidateWithTime{}
	res = mem.appendReplacementCandidates(res, transport, scope, primaryDigest)
	var uncompressedDigest digest.Digest 
	if canSubstitute {
		if uncompressedDigest = mem.uncompressedDigestLocked(primaryDigest); uncompressedDigest != "" {
			otherDigests := mem.digestsByUncompressed[uncompressedDigest] 
			for d := range otherDigests {
				if d != primaryDigest && d != uncompressedDigest {
					res = mem.appendReplacementCandidates(res, transport, scope, d)
				}
			}
			if uncompressedDigest != primaryDigest {
				res = mem.appendReplacementCandidates(res, transport, scope, uncompressedDigest)
			}
		}
	}
	return prioritize.DestructivelyPrioritizeReplacementCandidates(res, primaryDigest, uncompressedDigest)
}
func ( mem * cache ) CandidateLocations ( transport types . ImageTransport , scope types . BICTransportScope , primaryDigest digest . Digest , canSubstitute bool ) [ ] types . BICReplacementCandidate { mem . mutex . Lock ( ) defer mem . mutex . Unlock ( ) res := [ ] prioritize . CandidateWithTime { } res = mem . appendReplacementCandidates ( res , transport , scope , primaryDigest ) var uncompressedDigest digest . Digest // = "" if canSubstitute { if uncompressedDigest = mem . uncompressedDigestLocked ( primaryDigest ) ; uncompressedDigest != " " { otherDigests := mem . digestsByUncompressed [ uncompressedDigest ] // nil if not present in the map for d := range otherDigests { if d != primaryDigest && d != uncompressedDigest { res = mem . appendReplacementCandidates ( res , transport , scope , d ) } } if uncompressedDigest != primaryDigest { res = mem . appendReplacementCandidates ( res , transport , scope , uncompressedDigest ) } } } return prioritize . DestructivelyPrioritizeReplacementCandidates ( res , primaryDigest , uncompressedDigest ) }
// CandidateLocations returns a prioritized, limited, number of blobs and their locations that could possibly be reused
// within the specified (transport scope) (if they still exist, which is not guaranteed).
//
// If !canSubstitute, the returned cadidates will match the submitted digest exactly; if canSubstitute,
// data from previous RecordDigestUncompressedPair calls is used to also look up variants of the blob which have the same
// uncompressed digest.
CandidateLocations returns a prioritized limited number of blobs and their locations that could possibly be reused within the specified ( transport scope ) ( if they still exist which is not guaranteed ) . If !canSubstitute the returned cadidates will match the submitted digest exactly ; if canSubstitute data from previous RecordDigestUncompressedPair calls is used to also look up variants of the blob which have the same uncompressed digest .