aws-sdk-iot 1.54.0 → 1.55.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -899,6 +899,11 @@ module Aws::IoT
899
899
  # check.
900
900
  # @return [Integer]
901
901
  #
902
+ # @!attribute [rw] suppressed_non_compliant_resources_count
903
+ # Describes how many of the non-compliant resources created during the
904
+ # evaluation of an audit check were marked as suppressed.
905
+ # @return [Integer]
906
+ #
902
907
  # @!attribute [rw] error_code
903
908
  # The code of any error encountered when this check is performed
904
909
  # during this audit. One of "INSUFFICIENT\_PERMISSIONS" or
@@ -915,6 +920,7 @@ module Aws::IoT
915
920
  :check_compliant,
916
921
  :total_resources_count,
917
922
  :non_compliant_resources_count,
923
+ :suppressed_non_compliant_resources_count,
918
924
  :error_code,
919
925
  :message)
920
926
  SENSITIVE = []
@@ -964,6 +970,11 @@ module Aws::IoT
964
970
  # A code that indicates the reason that the resource was noncompliant.
965
971
  # @return [String]
966
972
  #
973
+ # @!attribute [rw] is_suppressed
974
+ # Indicates whether the audit finding was suppressed or not during
975
+ # reporting.
976
+ # @return [Boolean]
977
+ #
967
978
  class AuditFinding < Struct.new(
968
979
  :finding_id,
969
980
  :task_id,
@@ -974,7 +985,8 @@ module Aws::IoT
974
985
  :non_compliant_resource,
975
986
  :related_resources,
976
987
  :reason_for_non_compliance,
977
- :reason_for_non_compliance_code)
988
+ :reason_for_non_compliance_code,
989
+ :is_suppressed)
978
990
  SENSITIVE = []
979
991
  include Aws::Structure
980
992
  end
@@ -1133,6 +1145,43 @@ module Aws::IoT
1133
1145
  include Aws::Structure
1134
1146
  end
1135
1147
 
1148
+ # Filters out specific findings of a Device Defender audit.
1149
+ #
1150
+ # @!attribute [rw] check_name
1151
+ # An audit check name. Checks must be enabled for your account. (Use
1152
+ # `DescribeAccountAuditConfiguration` to see the list of all checks,
1153
+ # including those that are enabled or use
1154
+ # `UpdateAccountAuditConfiguration` to select which checks are
1155
+ # enabled.)
1156
+ # @return [String]
1157
+ #
1158
+ # @!attribute [rw] resource_identifier
1159
+ # Information that identifies the noncompliant resource.
1160
+ # @return [Types::ResourceIdentifier]
1161
+ #
1162
+ # @!attribute [rw] expiration_date
1163
+ # The expiration date (epoch timestamp in seconds) that you want the
1164
+ # suppression to adhere to.
1165
+ # @return [Time]
1166
+ #
1167
+ # @!attribute [rw] suppress_indefinitely
1168
+ # Indicates whether a suppression should exist indefinitely or not.
1169
+ # @return [Boolean]
1170
+ #
1171
+ # @!attribute [rw] description
1172
+ # The description of the audit suppression.
1173
+ # @return [String]
1174
+ #
1175
+ class AuditSuppression < Struct.new(
1176
+ :check_name,
1177
+ :resource_identifier,
1178
+ :expiration_date,
1179
+ :suppress_indefinitely,
1180
+ :description)
1181
+ SENSITIVE = []
1182
+ include Aws::Structure
1183
+ end
1184
+
1136
1185
  # The audits that were performed.
1137
1186
  #
1138
1187
  # @!attribute [rw] task_id
@@ -2416,6 +2465,74 @@ module Aws::IoT
2416
2465
  include Aws::Structure
2417
2466
  end
2418
2467
 
2468
+ # @note When making an API call, you may pass CreateAuditSuppressionRequest
2469
+ # data as a hash:
2470
+ #
2471
+ # {
2472
+ # check_name: "AuditCheckName", # required
2473
+ # resource_identifier: { # required
2474
+ # device_certificate_id: "CertificateId",
2475
+ # ca_certificate_id: "CertificateId",
2476
+ # cognito_identity_pool_id: "CognitoIdentityPoolId",
2477
+ # client_id: "ClientId",
2478
+ # policy_version_identifier: {
2479
+ # policy_name: "PolicyName",
2480
+ # policy_version_id: "PolicyVersionId",
2481
+ # },
2482
+ # account: "AwsAccountId",
2483
+ # iam_role_arn: "RoleArn",
2484
+ # role_alias_arn: "RoleAliasArn",
2485
+ # },
2486
+ # expiration_date: Time.now,
2487
+ # suppress_indefinitely: false,
2488
+ # description: "AuditDescription",
2489
+ # client_request_token: "ClientRequestToken", # required
2490
+ # }
2491
+ #
2492
+ # @!attribute [rw] check_name
2493
+ # An audit check name. Checks must be enabled for your account. (Use
2494
+ # `DescribeAccountAuditConfiguration` to see the list of all checks,
2495
+ # including those that are enabled or use
2496
+ # `UpdateAccountAuditConfiguration` to select which checks are
2497
+ # enabled.)
2498
+ # @return [String]
2499
+ #
2500
+ # @!attribute [rw] resource_identifier
2501
+ # Information that identifies the noncompliant resource.
2502
+ # @return [Types::ResourceIdentifier]
2503
+ #
2504
+ # @!attribute [rw] expiration_date
2505
+ # The epoch timestamp in seconds at which this suppression expires.
2506
+ # @return [Time]
2507
+ #
2508
+ # @!attribute [rw] suppress_indefinitely
2509
+ # Indicates whether a suppression should exist indefinitely or not.
2510
+ # @return [Boolean]
2511
+ #
2512
+ # @!attribute [rw] description
2513
+ # The description of the audit suppression.
2514
+ # @return [String]
2515
+ #
2516
+ # @!attribute [rw] client_request_token
2517
+ # The epoch timestamp in seconds at which this suppression expires.
2518
+ #
2519
+ # **A suitable default value is auto-generated.** You should normally
2520
+ # not need to pass this option.
2521
+ # @return [String]
2522
+ #
2523
+ class CreateAuditSuppressionRequest < Struct.new(
2524
+ :check_name,
2525
+ :resource_identifier,
2526
+ :expiration_date,
2527
+ :suppress_indefinitely,
2528
+ :description,
2529
+ :client_request_token)
2530
+ SENSITIVE = []
2531
+ include Aws::Structure
2532
+ end
2533
+
2534
+ class CreateAuditSuppressionResponse < Aws::EmptyStructure; end
2535
+
2419
2536
  # @note When making an API call, you may pass CreateAuthorizerRequest
2420
2537
  # data as a hash:
2421
2538
  #
@@ -4669,6 +4786,47 @@ module Aws::IoT
4669
4786
 
4670
4787
  class DeleteAccountAuditConfigurationResponse < Aws::EmptyStructure; end
4671
4788
 
4789
+ # @note When making an API call, you may pass DeleteAuditSuppressionRequest
4790
+ # data as a hash:
4791
+ #
4792
+ # {
4793
+ # check_name: "AuditCheckName", # required
4794
+ # resource_identifier: { # required
4795
+ # device_certificate_id: "CertificateId",
4796
+ # ca_certificate_id: "CertificateId",
4797
+ # cognito_identity_pool_id: "CognitoIdentityPoolId",
4798
+ # client_id: "ClientId",
4799
+ # policy_version_identifier: {
4800
+ # policy_name: "PolicyName",
4801
+ # policy_version_id: "PolicyVersionId",
4802
+ # },
4803
+ # account: "AwsAccountId",
4804
+ # iam_role_arn: "RoleArn",
4805
+ # role_alias_arn: "RoleAliasArn",
4806
+ # },
4807
+ # }
4808
+ #
4809
+ # @!attribute [rw] check_name
4810
+ # An audit check name. Checks must be enabled for your account. (Use
4811
+ # `DescribeAccountAuditConfiguration` to see the list of all checks,
4812
+ # including those that are enabled or use
4813
+ # `UpdateAccountAuditConfiguration` to select which checks are
4814
+ # enabled.)
4815
+ # @return [String]
4816
+ #
4817
+ # @!attribute [rw] resource_identifier
4818
+ # Information that identifies the noncompliant resource.
4819
+ # @return [Types::ResourceIdentifier]
4820
+ #
4821
+ class DeleteAuditSuppressionRequest < Struct.new(
4822
+ :check_name,
4823
+ :resource_identifier)
4824
+ SENSITIVE = []
4825
+ include Aws::Structure
4826
+ end
4827
+
4828
+ class DeleteAuditSuppressionResponse < Aws::EmptyStructure; end
4829
+
4672
4830
  # @note When making an API call, you may pass DeleteAuthorizerRequest
4673
4831
  # data as a hash:
4674
4832
  #
@@ -5479,6 +5637,79 @@ module Aws::IoT
5479
5637
  include Aws::Structure
5480
5638
  end
5481
5639
 
5640
+ # @note When making an API call, you may pass DescribeAuditSuppressionRequest
5641
+ # data as a hash:
5642
+ #
5643
+ # {
5644
+ # check_name: "AuditCheckName", # required
5645
+ # resource_identifier: { # required
5646
+ # device_certificate_id: "CertificateId",
5647
+ # ca_certificate_id: "CertificateId",
5648
+ # cognito_identity_pool_id: "CognitoIdentityPoolId",
5649
+ # client_id: "ClientId",
5650
+ # policy_version_identifier: {
5651
+ # policy_name: "PolicyName",
5652
+ # policy_version_id: "PolicyVersionId",
5653
+ # },
5654
+ # account: "AwsAccountId",
5655
+ # iam_role_arn: "RoleArn",
5656
+ # role_alias_arn: "RoleAliasArn",
5657
+ # },
5658
+ # }
5659
+ #
5660
+ # @!attribute [rw] check_name
5661
+ # An audit check name. Checks must be enabled for your account. (Use
5662
+ # `DescribeAccountAuditConfiguration` to see the list of all checks,
5663
+ # including those that are enabled or use
5664
+ # `UpdateAccountAuditConfiguration` to select which checks are
5665
+ # enabled.)
5666
+ # @return [String]
5667
+ #
5668
+ # @!attribute [rw] resource_identifier
5669
+ # Information that identifies the noncompliant resource.
5670
+ # @return [Types::ResourceIdentifier]
5671
+ #
5672
+ class DescribeAuditSuppressionRequest < Struct.new(
5673
+ :check_name,
5674
+ :resource_identifier)
5675
+ SENSITIVE = []
5676
+ include Aws::Structure
5677
+ end
5678
+
5679
+ # @!attribute [rw] check_name
5680
+ # An audit check name. Checks must be enabled for your account. (Use
5681
+ # `DescribeAccountAuditConfiguration` to see the list of all checks,
5682
+ # including those that are enabled or use
5683
+ # `UpdateAccountAuditConfiguration` to select which checks are
5684
+ # enabled.)
5685
+ # @return [String]
5686
+ #
5687
+ # @!attribute [rw] resource_identifier
5688
+ # Information that identifies the noncompliant resource.
5689
+ # @return [Types::ResourceIdentifier]
5690
+ #
5691
+ # @!attribute [rw] expiration_date
5692
+ # The epoch timestamp in seconds at which this suppression expires.
5693
+ # @return [Time]
5694
+ #
5695
+ # @!attribute [rw] suppress_indefinitely
5696
+ # Indicates whether a suppression should exist indefinitely or not.
5697
+ # @return [Boolean]
5698
+ #
5699
+ # @!attribute [rw] description
5700
+ # The description of the audit suppression.
5701
+ # @return [String]
5702
+ #
5703
+ class DescribeAuditSuppressionResponse < Struct.new(
5704
+ :check_name,
5705
+ :resource_identifier,
5706
+ :expiration_date,
5707
+ :suppress_indefinitely,
5708
+ :description)
5709
+ SENSITIVE = []
5710
+ include Aws::Structure
5711
+ end
5712
+
5482
5713
  # @note When making an API call, you may pass DescribeAuditTaskRequest
5483
5714
  # data as a hash:
5484
5715
  #
@@ -6756,9 +6987,11 @@ module Aws::IoT
6756
6987
  # @!attribute [rw] principal
6757
6988
  # The principal.
6758
6989
  #
6759
- # If the principal is a certificate, specify the certificate ARN. If
6760
- # the principal is an Amazon Cognito identity, specify the identity
6761
- # ID.
6990
+ # Valid principals are CertificateArn
6991
+ # (arn:aws:iot:*region*\:*accountId*\:cert/*certificateId*),
6992
+ # thingGroupArn
6993
+ # (arn:aws:iot:*region*\:*accountId*\:thinggroup/*groupName*) and
6994
+ # CognitoId (*region*\:*id*).
6762
6995
  # @return [String]
6763
6996
  #
6764
6997
  class DetachPrincipalPolicyRequest < Struct.new(
@@ -7337,7 +7570,11 @@ module Aws::IoT
7337
7570
  # }
7338
7571
  #
7339
7572
  # @!attribute [rw] principal
7340
- # The principal.
7573
+ # The principal. Valid principals are CertificateArn
7574
+ # (arn:aws:iot:*region*\:*accountId*\:cert/*certificateId*),
7575
+ # thingGroupArn
7576
+ # (arn:aws:iot:*region*\:*accountId*\:thinggroup/*groupName*) and
7577
+ # CognitoId (*region*\:*id*).
7341
7578
  # @return [String]
7342
7579
  #
7343
7580
  # @!attribute [rw] cognito_identity_pool_id
@@ -8784,7 +9021,12 @@ module Aws::IoT
8784
9021
  # }
8785
9022
  #
8786
9023
  # @!attribute [rw] target
8787
- # The group or principal for which the policies will be listed.
9024
+ # The group or principal for which the policies will be listed. Valid
9025
+ # principals are CertificateArn
9026
+ # (arn:aws:iot:*region*\:*accountId*\:cert/*certificateId*),
9027
+ # thingGroupArn
9028
+ # (arn:aws:iot:*region*\:*accountId*\:thinggroup/*groupName*) and
9029
+ # CognitoId (*region*\:*id*).
8788
9030
  # @return [String]
8789
9031
  #
8790
9032
  # @!attribute [rw] recursive
@@ -8847,6 +9089,7 @@ module Aws::IoT
8847
9089
  # next_token: "NextToken",
8848
9090
  # start_time: Time.now,
8849
9091
  # end_time: Time.now,
9092
+ # list_suppressed_findings: false,
8850
9093
  # }
8851
9094
  #
8852
9095
  # @!attribute [rw] task_id
@@ -8885,6 +9128,13 @@ module Aws::IoT
8885
9128
  # not both.
8886
9129
  # @return [Time]
8887
9130
  #
9131
+ # @!attribute [rw] list_suppressed_findings
9132
+ # Boolean flag indicating whether only the suppressed findings or the
9133
+ # unsuppressed findings should be listed. If this parameter isn't
9134
+ # provided, the response will list both suppressed and unsuppressed
9135
+ # findings.
9136
+ # @return [Boolean]
9137
+ #
8888
9138
  class ListAuditFindingsRequest < Struct.new(
8889
9139
  :task_id,
8890
9140
  :check_name,
@@ -8892,7 +9142,8 @@ module Aws::IoT
8892
9142
  :max_results,
8893
9143
  :next_token,
8894
9144
  :start_time,
8895
- :end_time)
9145
+ :end_time,
9146
+ :list_suppressed_findings)
8896
9147
  SENSITIVE = []
8897
9148
  include Aws::Structure
8898
9149
  end
@@ -9050,6 +9301,82 @@ module Aws::IoT
9050
9301
  include Aws::Structure
9051
9302
  end
9052
9303
 
9304
+ # @note When making an API call, you may pass ListAuditSuppressionsRequest
9305
+ # data as a hash:
9306
+ #
9307
+ # {
9308
+ # check_name: "AuditCheckName",
9309
+ # resource_identifier: {
9310
+ # device_certificate_id: "CertificateId",
9311
+ # ca_certificate_id: "CertificateId",
9312
+ # cognito_identity_pool_id: "CognitoIdentityPoolId",
9313
+ # client_id: "ClientId",
9314
+ # policy_version_identifier: {
9315
+ # policy_name: "PolicyName",
9316
+ # policy_version_id: "PolicyVersionId",
9317
+ # },
9318
+ # account: "AwsAccountId",
9319
+ # iam_role_arn: "RoleArn",
9320
+ # role_alias_arn: "RoleAliasArn",
9321
+ # },
9322
+ # ascending_order: false,
9323
+ # next_token: "NextToken",
9324
+ # max_results: 1,
9325
+ # }
9326
+ #
9327
+ # @!attribute [rw] check_name
9328
+ # An audit check name. Checks must be enabled for your account. (Use
9329
+ # `DescribeAccountAuditConfiguration` to see the list of all checks,
9330
+ # including those that are enabled or use
9331
+ # `UpdateAccountAuditConfiguration` to select which checks are
9332
+ # enabled.)
9333
+ # @return [String]
9334
+ #
9335
+ # @!attribute [rw] resource_identifier
9336
+ # Information that identifies the noncompliant resource.
9337
+ # @return [Types::ResourceIdentifier]
9338
+ #
9339
+ # @!attribute [rw] ascending_order
9340
+ # Determines whether suppressions are listed in ascending order by
9341
+ # expiration date or not. If parameter isn't provided,
9342
+ # `ascendingOrder=true`.
9343
+ # @return [Boolean]
9344
+ #
9345
+ # @!attribute [rw] next_token
9346
+ # The token for the next set of results.
9347
+ # @return [String]
9348
+ #
9349
+ # @!attribute [rw] max_results
9350
+ # The maximum number of results to return at one time. The default is
9351
+ # 25.
9352
+ # @return [Integer]
9353
+ #
9354
+ class ListAuditSuppressionsRequest < Struct.new(
9355
+ :check_name,
9356
+ :resource_identifier,
9357
+ :ascending_order,
9358
+ :next_token,
9359
+ :max_results)
9360
+ SENSITIVE = []
9361
+ include Aws::Structure
9362
+ end
9363
+
9364
+ # @!attribute [rw] suppressions
9365
+ # List of audit suppressions.
9366
+ # @return [Array<Types::AuditSuppression>]
9367
+ #
9368
+ # @!attribute [rw] next_token
9369
+ # A token that can be used to retrieve the next set of results, or
9370
+ # `null` if there are no additional results.
9371
+ # @return [String]
9372
+ #
9373
+ class ListAuditSuppressionsResponse < Struct.new(
9374
+ :suppressions,
9375
+ :next_token)
9376
+ SENSITIVE = []
9377
+ include Aws::Structure
9378
+ end
9379
+
9053
9380
  # @note When making an API call, you may pass ListAuditTasksRequest
9054
9381
  # data as a hash:
9055
9382
  #
@@ -9959,7 +10286,11 @@ module Aws::IoT
9959
10286
  # }
9960
10287
  #
9961
10288
  # @!attribute [rw] principal
9962
- # The principal.
10289
+ # The principal. Valid principals are CertificateArn
10290
+ # (arn:aws:iot:*region*\:*accountId*\:cert/*certificateId*),
10291
+ # thingGroupArn
10292
+ # (arn:aws:iot:*region*\:*accountId*\:thinggroup/*groupName*) and
10293
+ # CognitoId (*region*\:*id*).
9963
10294
  # @return [String]
9964
10295
  #
9965
10296
  # @!attribute [rw] marker
@@ -10580,8 +10911,8 @@ module Aws::IoT
10580
10911
  # @return [Array<Types::GroupNameAndArn>]
10581
10912
  #
10582
10913
  # @!attribute [rw] next_token
10583
- # The token used to get the next set of results, or **null** if there
10584
- # are no additional results.
10914
+ # The token used to get the next set of results. Will not be returned
10915
+ # if operation has returned all results.
10585
10916
  # @return [String]
10586
10917
  #
10587
10918
  class ListThingGroupsResponse < Struct.new(
@@ -10761,8 +11092,8 @@ module Aws::IoT
10761
11092
  # @return [Array<Types::ThingTypeDefinition>]
10762
11093
  #
10763
11094
  # @!attribute [rw] next_token
10764
- # The token for the next set of results, or **null** if there are no
10765
- # additional results.
11095
+ # The token for the next set of results. Will not be returned if
11096
+ # operation has returned all results.
10766
11097
  # @return [String]
10767
11098
  #
10768
11099
  class ListThingTypesResponse < Struct.new(
@@ -10806,8 +11137,8 @@ module Aws::IoT
10806
11137
  # @return [Array<String>]
10807
11138
  #
10808
11139
  # @!attribute [rw] next_token
10809
- # The token used to get the next set of results, or **null** if there
10810
- # are no additional results.
11140
+ # The token used to get the next set of results. Will not be returned
11141
+ # if operation has returned all results.
10811
11142
  # @return [String]
10812
11143
  #
10813
11144
  class ListThingsInBillingGroupResponse < Struct.new(
@@ -10919,8 +11250,8 @@ module Aws::IoT
10919
11250
  # @return [Array<Types::ThingAttribute>]
10920
11251
  #
10921
11252
  # @!attribute [rw] next_token
10922
- # The token used to get the next set of results, or **null** if there
10923
- # are no additional results.
11253
+ # The token used to get the next set of results. Will not be returned
11254
+ # if operation has returned all results.
10924
11255
  # @return [String]
10925
11256
  #
10926
11257
  class ListThingsResponse < Struct.new(
@@ -14181,7 +14512,11 @@ module Aws::IoT
14181
14512
  # }
14182
14513
  #
14183
14514
  # @!attribute [rw] principal
14184
- # The principal.
14515
+ # The principal. Valid principals are CertificateArn
14516
+ # (arn:aws:iot:*region*\:*accountId*\:cert/*certificateId*),
14517
+ # thingGroupArn
14518
+ # (arn:aws:iot:*region*\:*accountId*\:thinggroup/*groupName*) and
14519
+ # CognitoId (*region*\:*id*).
14185
14520
  # @return [String]
14186
14521
  #
14187
14522
  # @!attribute [rw] cognito_identity_pool_id
@@ -15500,6 +15835,66 @@ module Aws::IoT
15500
15835
 
15501
15836
  class UpdateAccountAuditConfigurationResponse < Aws::EmptyStructure; end
15502
15837
 
15838
+ # @note When making an API call, you may pass UpdateAuditSuppressionRequest
15839
+ # data as a hash:
15840
+ #
15841
+ # {
15842
+ # check_name: "AuditCheckName", # required
15843
+ # resource_identifier: { # required
15844
+ # device_certificate_id: "CertificateId",
15845
+ # ca_certificate_id: "CertificateId",
15846
+ # cognito_identity_pool_id: "CognitoIdentityPoolId",
15847
+ # client_id: "ClientId",
15848
+ # policy_version_identifier: {
15849
+ # policy_name: "PolicyName",
15850
+ # policy_version_id: "PolicyVersionId",
15851
+ # },
15852
+ # account: "AwsAccountId",
15853
+ # iam_role_arn: "RoleArn",
15854
+ # role_alias_arn: "RoleAliasArn",
15855
+ # },
15856
+ # expiration_date: Time.now,
15857
+ # suppress_indefinitely: false,
15858
+ # description: "AuditDescription",
15859
+ # }
15860
+ #
15861
+ # @!attribute [rw] check_name
15862
+ # An audit check name. Checks must be enabled for your account. (Use
15863
+ # `DescribeAccountAuditConfiguration` to see the list of all checks,
15864
+ # including those that are enabled or use
15865
+ # `UpdateAccountAuditConfiguration` to select which checks are
15866
+ # enabled.)
15867
+ # @return [String]
15868
+ #
15869
+ # @!attribute [rw] resource_identifier
15870
+ # Information that identifies the noncompliant resource.
15871
+ # @return [Types::ResourceIdentifier]
15872
+ #
15873
+ # @!attribute [rw] expiration_date
15874
+ # The expiration date (epoch timestamp in seconds) that you want the
15875
+ # suppression to adhere to.
15876
+ # @return [Time]
15877
+ #
15878
+ # @!attribute [rw] suppress_indefinitely
15879
+ # Indicates whether a suppression should exist indefinitely or not.
15880
+ # @return [Boolean]
15881
+ #
15882
+ # @!attribute [rw] description
15883
+ # The description of the audit suppression.
15884
+ # @return [String]
15885
+ #
15886
+ class UpdateAuditSuppressionRequest < Struct.new(
15887
+ :check_name,
15888
+ :resource_identifier,
15889
+ :expiration_date,
15890
+ :suppress_indefinitely,
15891
+ :description)
15892
+ SENSITIVE = []
15893
+ include Aws::Structure
15894
+ end
15895
+
15896
+ class UpdateAuditSuppressionResponse < Aws::EmptyStructure; end
15897
+
15503
15898
  # @note When making an API call, you may pass UpdateAuthorizerRequest
15504
15899
  # data as a hash:
15505
15900
  #