# Path: stacker_blueprints/util.py
# def merge_tags(left, right, factory=Tags):
#     """
#     Merge two sets of tags into a new troposphere object
# 
#     Args:
#         left (Union[dict, troposphere.Tags]): dictionary or Tags object to be
#             merged with lower priority
#         right (Union[dict, troposphere.Tags]): dictionary or Tags object to be
#             merged with higher priority
#         factory (type): Type of object to create. Defaults to the troposphere
#             Tags class.
#     """
# 
#     if isinstance(left, Mapping):
#         tags = dict(left)
#     elif hasattr(left, 'tags'):
#         tags = _tags_to_dict(left.tags)
#     else:
#         tags = _tags_to_dict(left)
# 
#     if isinstance(right, Mapping):
#         tags.update(right)
#     elif hasattr(left, 'tags'):
#         tags.update(_tags_to_dict(right.tags))
#     else:
#         tags.update(_tags_to_dict(right))
# 
#     return factory(**tags)


from troposphere import ec2, efs
from troposphere import Join, Output, Ref, Tags
from stacker.blueprints.base import Blueprint
from stacker.blueprints.variables.types import TroposphereType
from stacker.exceptions import ValidatorError
from stacker_blueprints.util import merge_tags
            'type': str,
            'description': 'VPC ID to create resources'
        },
        'PerformanceMode': {
            'type': str,
            'description': 'The performance mode of the file system',
            'default': 'generalPurpose'
        },
        'Tags': {
            'type': dict,
            'description': 'Tags to associate with the created resources',
            'default': {}
        },
        'Subnets': {
            'type': list,
            'description': 'List of subnets to deploy private mount targets in'
        },
        'IpAddresses': {
            'type': list,
            'description': 'List of IP addresses to assign to mount targets. '
                           'Omit or make empty to assign automatically. '
                           'Corresponds to Subnets listed in the same order.',
            'default': []
        },
        'SecurityGroups': {
            'type': TroposphereType(ec2.SecurityGroup, many=True,
                                    optional=True, validate=False),
            'description': "Dictionary of titles to SecurityGroups "
                           "definitions to be created and assigned to this "
                           "filesystem's MountTargets. "

# Path: stacker_blueprints/util.py
# def merge_tags(left, right, factory=Tags):
#     """
#     Merge two sets of tags into a new troposphere object
# 
#     Args:
#         left (Union[dict, troposphere.Tags]): dictionary or Tags object to be
#             merged with lower priority
#         right (Union[dict, troposphere.Tags]): dictionary or Tags object to be
#             merged with higher priority
#         factory (type): Type of object to create. Defaults to the troposphere
#             Tags class.
#     """
# 
#     if isinstance(left, Mapping):
#         tags = dict(left)
#     elif hasattr(left, 'tags'):
#         tags = _tags_to_dict(left.tags)
#     else:
#         tags = _tags_to_dict(left)
# 
#     if isinstance(right, Mapping):
#         tags.update(right)
#     elif hasattr(left, 'tags'):
#         tags.update(_tags_to_dict(right.tags))
#     else:
#         tags.update(_tags_to_dict(right))
# 
#     return factory(**tags)


# Path: stacker_blueprints/efs.py
from troposphere import ec2, efs
from troposphere import Join, Output, Ref, Tags
from stacker.blueprints.base import Blueprint
from stacker.blueprints.variables.types import TroposphereType
from stacker.exceptions import ValidatorError
from stacker_blueprints.util import merge_tags

            'type': str,
            'description': 'VPC ID to create resources'
        },
        'PerformanceMode': {
            'type': str,
            'description': 'The performance mode of the file system',
            'default': 'generalPurpose'
        },
        'Tags': {
            'type': dict,
            'description': 'Tags to associate with the created resources',
            'default': {}
        },
        'Subnets': {
            'type': list,
            'description': 'List of subnets to deploy private mount targets in'
        },
        'IpAddresses': {
            'type': list,
            'description': 'List of IP addresses to assign to mount targets. '
                           'Omit or make empty to assign automatically. '
                           'Corresponds to Subnets listed in the same order.',
            'default': []
        },
        'SecurityGroups': {
            'type': TroposphereType(ec2.SecurityGroup, many=True,
                                    optional=True, validate=False),
            'description': "Dictionary of titles to SecurityGroups "
                           "definitions to be created and assigned to this "
                           "filesystem's MountTargets. "

                           "The VpcId property will be filled automatically, "