def resolve_resource_id_refs(self, input_dict, supported_resource_id_refs):
def do_replacement(full_ref, ref_value):<EOL><INDENT>"""<STR_LIT>"""<EOL>splits = ref_value.split(self._resource_ref_separator)<EOL>if len(splits) < <NUM_LIT:1>:<EOL><INDENT>return full_ref<EOL><DEDENT>logical_id = splits[<NUM_LIT:0>]<EOL>resolved_value = supported_resource_id_refs.get(logical_id)<EOL>if not resolved_value:<EOL><INDENT>return full_ref<EOL><DEDENT>return full_ref.replace(logical_id, resolved_value)<EOL><DEDENT>return self._handle_sub_action(input_dict, do_replacement)<EOL>
Resolves reference to some property of a resource. Inside string to be substituted, there could be either a
"Ref" or a "GetAtt" usage of this property. They have to be handled differently.

Ref usages are directly converted to a Ref on the resolved value. GetAtt usages are split under the assumption
that there can be only one property of resource referenced here. Everything else is an attribute reference.

Example:

    Let's say `LogicalId` will be resolved to `NewLogicalId`

    Ref usage:
        ${LogicalId}  => ${NewLogicalId}

    GetAtt usage:
        ${LogicalId.Arn} => ${NewLogicalId.Arn}
        ${LogicalId.Attr1.Attr2} => {NewLogicalId.Attr1.Attr2}


:param input_dict: Dictionary to be resolved
:param dict supported_resource_id_refs: Dictionary that maps old logical ids to new ones.
:return: Resolved dictionary