prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Add 'PermissionsBoundary' properties to AWS::IAM::Role and AWS::IAM::User
  This property has been released on November 9 by AWS.
  https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/ReleaseHistory.html
  ```
  PermissionsBoundary
  
      The ARN of the policy that is used to set the permissions boundary for the role. Minimum length of 20. Maximum length of 2048.
  
      Required: No
  
      Type: String
  
      Update requires: No interruption
  
  ```
  
  </issue>
  <code>
  [start of troposphere/iam.py]
  1 # Copyright (c) 2012-2013, Mark Peek <mark@peek.org>
  2 # All rights reserved.
  3 #
  4 # See LICENSE file for full license.
  5 
  6 from . import AWSObject, AWSProperty
  7 from .validators import integer, boolean, status
  8 from .validators import iam_path, iam_role_name, iam_group_name, iam_user_name
  9 
  10 try:
  11     from awacs.aws import Policy
  12     policytypes = (dict, Policy)
  13 except ImportError:
  14     policytypes = dict,
  15 
  16 
  17 Active = "Active"
  18 Inactive = "Inactive"
  19 
  20 
  21 class AccessKey(AWSObject):
  22     resource_type = "AWS::IAM::AccessKey"
  23 
  24     props = {
  25         'Serial': (integer, False),
  26         'Status': (status, False),
  27         'UserName': (basestring, True),
  28     }
  29 
  30 
  31 class PolicyType(AWSObject):
  32     resource_type = "AWS::IAM::Policy"
  33 
  34     props = {
  35         'Groups': ([basestring], False),
  36         'PolicyDocument': (policytypes, True),
  37         'PolicyName': (basestring, True),
  38         'Roles': ([basestring], False),
  39         'Users': ([basestring], False),
  40     }
  41 
  42 
  43 class Policy(AWSProperty):
  44     props = {
  45         'PolicyDocument': (policytypes, True),
  46         'PolicyName': (basestring, True),
  47     }
  48 
  49 
  50 PolicyProperty = Policy
  51 
  52 
  53 class Group(AWSObject):
  54     resource_type = "AWS::IAM::Group"
  55 
  56     props = {
  57         'GroupName': (iam_group_name, False),
  58         'ManagedPolicyArns': ([basestring], False),
  59         'Path': (iam_path, False),
  60         'Policies': ([Policy], False),
  61     }
  62 
  63 
  64 class InstanceProfile(AWSObject):
  65     resource_type = "AWS::IAM::InstanceProfile"
  66 
  67     props = {
  68         'Path': (iam_path, False),
  69         'Roles': (list, True),
  70         'InstanceProfileName': (basestring, False),
  71     }
  72 
  73 
  74 class Role(AWSObject):
  75     resource_type = "AWS::IAM::Role"
  76 
  77     props = {
  78         'AssumeRolePolicyDocument': (policytypes, True),
  79         'ManagedPolicyArns': ([basestring], False),
  80         'MaxSessionDuration': (integer, False),
  81         'Path': (iam_path, False),
  82         'Policies': ([Policy], False),
  83         'RoleName': (iam_role_name, False),
  84     }
  85 
  86 
  87 class ServiceLinkedRole(AWSObject):
  88     resource_type = "AWS::IAM::ServiceLinkedRole"
  89 
  90     props = {
  91         'AWSServiceName': (basestring, True),
  92         'CustomSuffix': (basestring, False),
  93         'Description': (basestring, False),
  94     }
  95 
  96 
  97 class LoginProfile(AWSProperty):
  98     props = {
  99         'Password': (basestring, True),
  100         'PasswordResetRequired': (boolean, False),
  101     }
  102 
  103 
  104 class User(AWSObject):
  105     resource_type = "AWS::IAM::User"
  106 
  107     props = {
  108         'Path': (iam_path, False),
  109         'Groups': ([basestring], False),
  110         'ManagedPolicyArns': ([basestring], False),
  111         'LoginProfile': (LoginProfile, False),
  112         'Policies': ([Policy], False),
  113         'UserName': (iam_user_name, False),
  114     }
  115 
  116 
  117 class UserToGroupAddition(AWSObject):
  118     resource_type = "AWS::IAM::UserToGroupAddition"
  119 
  120     props = {
  121         'GroupName': (basestring, True),
  122         'Users': (list, True),
  123     }
  124 
  125 
  126 class ManagedPolicy(AWSObject):
  127     resource_type = "AWS::IAM::ManagedPolicy"
  128 
  129     props = {
  130         'Description': (basestring, False),
  131         'Groups': ([basestring], False),
  132         'ManagedPolicyName': (basestring, False),
  133         'Path': (iam_path, False),
  134         'PolicyDocument': (policytypes, True),
  135         'Roles': ([basestring], False),
  136         'Users': ([basestring], False),
  137     }
  138
  [end of troposphere/iam.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/troposphere/iam.py b/troposphere/iam.py
  --- a/troposphere/iam.py
  +++ b/troposphere/iam.py
  @@ -79,6 +79,7 @@
           'ManagedPolicyArns': ([basestring], False),
           'MaxSessionDuration': (integer, False),
           'Path': (iam_path, False),
  +        'PermissionsBoundary': (basestring, False),
           'Policies': ([Policy], False),
           'RoleName': (iam_role_name, False),
       }
  @@ -105,10 +106,11 @@
       resource_type = "AWS::IAM::User"
   
       props = {
  -        'Path': (iam_path, False),
           'Groups': ([basestring], False),
  -        'ManagedPolicyArns': ([basestring], False),
           'LoginProfile': (LoginProfile, False),
  +        'ManagedPolicyArns': ([basestring], False),
  +        'Path': (iam_path, False),
  +        'PermissionsBoundary': (basestring, False),
           'Policies': ([Policy], False),
           'UserName': (iam_user_name, False),
       }
  
verification_info: {"golden_diff": "diff --git a/troposphere/iam.py b/troposphere/iam.py\n--- a/troposphere/iam.py\n+++ b/troposphere/iam.py\n@@ -79,6 +79,7 @@\n         'ManagedPolicyArns': ([basestring], False),\n         'MaxSessionDuration': (integer, False),\n         'Path': (iam_path, False),\n+        'PermissionsBoundary': (basestring, False),\n         'Policies': ([Policy], False),\n         'RoleName': (iam_role_name, False),\n     }\n@@ -105,10 +106,11 @@\n     resource_type = \"AWS::IAM::User\"\n \n     props = {\n-        'Path': (iam_path, False),\n         'Groups': ([basestring], False),\n-        'ManagedPolicyArns': ([basestring], False),\n         'LoginProfile': (LoginProfile, False),\n+        'ManagedPolicyArns': ([basestring], False),\n+        'Path': (iam_path, False),\n+        'PermissionsBoundary': (basestring, False),\n         'Policies': ([Policy], False),\n         'UserName': (iam_user_name, False),\n     }\n", "issue": "Add 'PermissionsBoundary' properties to AWS::IAM::Role and AWS::IAM::User\nThis property has been released on November 9 by AWS.\r\nhttps://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/ReleaseHistory.html\r\n```\r\nPermissionsBoundary\r\n\r\n    The ARN of the policy that is used to set the permissions boundary for the role. Minimum length of 20. Maximum length of 2048.\r\n\r\n    Required: No\r\n\r\n    Type: String\r\n\r\n    Update requires: No interruption\r\n\r\n```\n", "before_files": [{"content": "# Copyright (c) 2012-2013, Mark Peek <mark@peek.org>\n# All rights reserved.\n#\n# See LICENSE file for full license.\n\nfrom . import AWSObject, AWSProperty\nfrom .validators import integer, boolean, status\nfrom .validators import iam_path, iam_role_name, iam_group_name, iam_user_name\n\ntry:\n    from awacs.aws import Policy\n    policytypes = (dict, Policy)\nexcept ImportError:\n    policytypes = dict,\n\n\nActive = \"Active\"\nInactive = \"Inactive\"\n\n\nclass AccessKey(AWSObject):\n    resource_type = \"AWS::IAM::AccessKey\"\n\n    props = {\n        'Serial': (integer, False),\n        'Status': (status, False),\n        'UserName': (basestring, True),\n    }\n\n\nclass PolicyType(AWSObject):\n    resource_type = \"AWS::IAM::Policy\"\n\n    props = {\n        'Groups': ([basestring], False),\n        'PolicyDocument': (policytypes, True),\n        'PolicyName': (basestring, True),\n        'Roles': ([basestring], False),\n        'Users': ([basestring], False),\n    }\n\n\nclass Policy(AWSProperty):\n    props = {\n        'PolicyDocument': (policytypes, True),\n        'PolicyName': (basestring, True),\n    }\n\n\nPolicyProperty = Policy\n\n\nclass Group(AWSObject):\n    resource_type = \"AWS::IAM::Group\"\n\n    props = {\n        'GroupName': (iam_group_name, False),\n        'ManagedPolicyArns': ([basestring], False),\n        'Path': (iam_path, False),\n        'Policies': ([Policy], False),\n    }\n\n\nclass InstanceProfile(AWSObject):\n    resource_type = \"AWS::IAM::InstanceProfile\"\n\n    props = {\n        'Path': (iam_path, False),\n        'Roles': (list, True),\n        'InstanceProfileName': (basestring, False),\n    }\n\n\nclass Role(AWSObject):\n    resource_type = \"AWS::IAM::Role\"\n\n    props = {\n        'AssumeRolePolicyDocument': (policytypes, True),\n        'ManagedPolicyArns': ([basestring], False),\n        'MaxSessionDuration': (integer, False),\n        'Path': (iam_path, False),\n        'Policies': ([Policy], False),\n        'RoleName': (iam_role_name, False),\n    }\n\n\nclass ServiceLinkedRole(AWSObject):\n    resource_type = \"AWS::IAM::ServiceLinkedRole\"\n\n    props = {\n        'AWSServiceName': (basestring, True),\n        'CustomSuffix': (basestring, False),\n        'Description': (basestring, False),\n    }\n\n\nclass LoginProfile(AWSProperty):\n    props = {\n        'Password': (basestring, True),\n        'PasswordResetRequired': (boolean, False),\n    }\n\n\nclass User(AWSObject):\n    resource_type = \"AWS::IAM::User\"\n\n    props = {\n        'Path': (iam_path, False),\n        'Groups': ([basestring], False),\n        'ManagedPolicyArns': ([basestring], False),\n        'LoginProfile': (LoginProfile, False),\n        'Policies': ([Policy], False),\n        'UserName': (iam_user_name, False),\n    }\n\n\nclass UserToGroupAddition(AWSObject):\n    resource_type = \"AWS::IAM::UserToGroupAddition\"\n\n    props = {\n        'GroupName': (basestring, True),\n        'Users': (list, True),\n    }\n\n\nclass ManagedPolicy(AWSObject):\n    resource_type = \"AWS::IAM::ManagedPolicy\"\n\n    props = {\n        'Description': (basestring, False),\n        'Groups': ([basestring], False),\n        'ManagedPolicyName': (basestring, False),\n        'Path': (iam_path, False),\n        'PolicyDocument': (policytypes, True),\n        'Roles': ([basestring], False),\n        'Users': ([basestring], False),\n    }\n", "path": "troposphere/iam.py"}]}