cybersource_rest_client 0.0.86 → 0.0.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. checksums.yaml +4 -4
  2. data/lib/AuthenticationSDK/util/CertificateUtility.rb +14 -6
  3. data/lib/cybersource_rest_client/api/agent_capabilities_api.rb +24 -24
  4. data/lib/cybersource_rest_client/api/bin_lookup_api.rb +3 -3
  5. data/lib/cybersource_rest_client/api/create_new_webhooks_api.rb +6 -6
  6. data/lib/cybersource_rest_client/api/foreign_exchange_rates_api.rb +3 -3
  7. data/lib/cybersource_rest_client/api/manage_webhooks_api.rb +9 -9
  8. data/lib/cybersource_rest_client/api/merchant_boarding_api.rb +3 -3
  9. data/lib/cybersource_rest_client/api/offers_api.rb +3 -3
  10. data/lib/cybersource_rest_client/api/search_transactions_api.rb +2 -2
  11. data/lib/cybersource_rest_client/api/transaction_details_api.rb +1 -1
  12. data/lib/cybersource_rest_client/api/transaction_query_api.rb +3 -3
  13. data/lib/cybersource_rest_client/api/visa_protect_risk_insights_api.rb +104 -0
  14. data/lib/cybersource_rest_client/models/inline_response_200_16.rb +2 -2
  15. data/lib/cybersource_rest_client/models/inline_response_200_17.rb +5 -5
  16. data/lib/cybersource_rest_client/models/inline_response_200_18.rb +5 -5
  17. data/lib/cybersource_rest_client/models/inline_response_200_4.rb +1 -1
  18. data/lib/cybersource_rest_client/models/inline_response_200_5.rb +1 -1
  19. data/lib/cybersource_rest_client/models/inline_response_201_10.rb +18 -93
  20. data/lib/cybersource_rest_client/models/inline_response_201_11.rb +103 -8
  21. data/lib/cybersource_rest_client/models/{inline_response_201_12_client_reference_information.rb → inline_response_201_11_client_reference_information.rb} +1 -1
  22. data/lib/cybersource_rest_client/models/{inline_response_201_12_error_information.rb → inline_response_201_11_error_information.rb} +1 -1
  23. data/lib/cybersource_rest_client/models/{inline_response_201_12_order_information.rb → inline_response_201_11_order_information.rb} +2 -2
  24. data/lib/cybersource_rest_client/models/{inline_response_201_12_order_information_currency_conversion.rb → inline_response_201_11_order_information_currency_conversion.rb} +2 -2
  25. data/lib/cybersource_rest_client/models/{inline_response_201_12_order_information_currency_conversion_offer.rb → inline_response_201_11_order_information_currency_conversion_offer.rb} +1 -1
  26. data/lib/cybersource_rest_client/models/{inline_response_201_12_processor_information.rb → inline_response_201_11_processor_information.rb} +1 -1
  27. data/lib/cybersource_rest_client/models/inline_response_201_12.rb +110 -89
  28. data/lib/cybersource_rest_client/models/{inline_response_201_13_fulfillment_address.rb → inline_response_201_12_fulfillment_address.rb} +1 -1
  29. data/lib/cybersource_rest_client/models/{inline_response_201_13_fulfillment_options.rb → inline_response_201_12_fulfillment_options.rb} +1 -1
  30. data/lib/cybersource_rest_client/models/{inline_response_201_14_item.rb → inline_response_201_12_item.rb} +20 -20
  31. data/lib/cybersource_rest_client/models/inline_response_201_12_line_items.rb +256 -0
  32. data/lib/cybersource_rest_client/models/{inline_response_201_13_links.rb → inline_response_201_12_links.rb} +1 -1
  33. data/lib/cybersource_rest_client/models/{inline_response_201_13_messages.rb → inline_response_201_12_messages.rb} +1 -1
  34. data/lib/cybersource_rest_client/models/{inline_response_201_13_payment_provider.rb → inline_response_201_12_payment_provider.rb} +1 -1
  35. data/lib/cybersource_rest_client/models/{inline_response_201_13_totals.rb → inline_response_201_12_totals.rb} +1 -1
  36. data/lib/cybersource_rest_client/models/inline_response_201_13.rb +61 -67
  37. data/lib/cybersource_rest_client/models/{inline_response_201_14_discounts.rb → inline_response_201_13_discounts.rb} +1 -1
  38. data/lib/cybersource_rest_client/models/{inline_response_201_14_fulfillment.rb → inline_response_201_13_fulfillment.rb} +1 -1
  39. data/lib/cybersource_rest_client/models/inline_response_201_13_item.rb +19 -19
  40. data/lib/cybersource_rest_client/models/inline_response_201_13_line_items.rb +20 -51
  41. data/lib/cybersource_rest_client/models/{inline_response_201_14_order.rb → inline_response_201_13_order.rb} +1 -1
  42. data/lib/cybersource_rest_client/models/{inline_response_201_14_payment.rb → inline_response_201_13_payment.rb} +1 -1
  43. data/lib/cybersource_rest_client/models/{inline_response_201_14_ucp.rb → inline_response_201_13_ucp.rb} +2 -2
  44. data/lib/cybersource_rest_client/models/{inline_response_201_14_ucp_capabilities.rb → inline_response_201_13_ucp_capabilities.rb} +1 -1
  45. data/lib/cybersource_rest_client/models/inline_response_201_3.rb +82 -39
  46. data/lib/cybersource_rest_client/models/{inline_response_201_5_error_information.rb → inline_response_201_3_error_information.rb} +3 -3
  47. data/lib/cybersource_rest_client/models/{inline_response_201_5_error_information_details.rb → inline_response_201_3_error_information_details.rb} +2 -2
  48. data/lib/cybersource_rest_client/models/{inline_response_201_5_order_information.rb → inline_response_201_3_order_information.rb} +2 -2
  49. data/lib/cybersource_rest_client/models/inline_response_201_3_order_information_amount_details.rb +315 -0
  50. data/lib/cybersource_rest_client/models/inline_response_201_3_processing_information.rb +189 -0
  51. data/lib/cybersource_rest_client/models/{inline_response_201_4_processing_information_routing.rb → inline_response_201_3_processing_information_routing.rb} +1 -1
  52. data/lib/cybersource_rest_client/models/inline_response_201_3_processor_information.rb +213 -0
  53. data/lib/cybersource_rest_client/models/inline_response_201_4.rb +41 -30
  54. data/lib/cybersource_rest_client/models/{inline_response_201_5__links.rb → inline_response_201_4__links.rb} +2 -2
  55. data/lib/cybersource_rest_client/models/{inline_response_201_5__links_self.rb → inline_response_201_4__links_self.rb} +1 -1
  56. data/lib/cybersource_rest_client/models/{inline_response_201_5_acquirer_information.rb → inline_response_201_4_acquirer_information.rb} +1 -1
  57. data/lib/cybersource_rest_client/models/{inline_response_201_5_client_reference_information.rb → inline_response_201_4_client_reference_information.rb} +1 -1
  58. data/lib/cybersource_rest_client/models/inline_response_201_4_error_information.rb +1 -1
  59. data/lib/cybersource_rest_client/models/inline_response_201_4_error_information_details.rb +1 -1
  60. data/lib/cybersource_rest_client/models/{inline_response_201_5_merchant_information.rb → inline_response_201_4_merchant_information.rb} +1 -1
  61. data/lib/cybersource_rest_client/models/inline_response_201_4_order_information_amount_details.rb +46 -97
  62. data/lib/cybersource_rest_client/models/{inline_response_201_5_payment_information.rb → inline_response_201_4_payment_information.rb} +2 -2
  63. data/lib/cybersource_rest_client/models/{inline_response_201_5_payment_information_card.rb → inline_response_201_4_payment_information_card.rb} +1 -1
  64. data/lib/cybersource_rest_client/models/inline_response_201_4_processing_information.rb +59 -8
  65. data/lib/cybersource_rest_client/models/{inline_response_201_5_processing_information_payouts_options.rb → inline_response_201_4_processing_information_payouts_options.rb} +1 -1
  66. data/lib/cybersource_rest_client/models/inline_response_201_4_processor_information.rb +342 -7
  67. data/lib/cybersource_rest_client/models/{inline_response_201_5_processor_information_card_verification.rb → inline_response_201_4_processor_information_card_verification.rb} +1 -1
  68. data/lib/cybersource_rest_client/models/{inline_response_201_5_transactions.rb → inline_response_201_4_transactions.rb} +7 -7
  69. data/lib/cybersource_rest_client/models/inline_response_201_5.rb +35 -68
  70. data/lib/cybersource_rest_client/models/{inline_response_201_6_payout_information.rb → inline_response_201_5_payout_information.rb} +3 -3
  71. data/lib/cybersource_rest_client/models/{inline_response_201_6_payout_information_pull_funds.rb → inline_response_201_5_payout_information_pull_funds.rb} +1 -1
  72. data/lib/cybersource_rest_client/models/{inline_response_201_6_payout_information_push_funds.rb → inline_response_201_5_payout_information_push_funds.rb} +1 -1
  73. data/lib/cybersource_rest_client/models/inline_response_201_6.rb +59 -26
  74. data/lib/cybersource_rest_client/models/{inline_response_201_7_integration_information.rb → inline_response_201_6_integration_information.rb} +2 -2
  75. data/lib/cybersource_rest_client/models/{inline_response_201_7_integration_information_tenant_configurations.rb → inline_response_201_6_integration_information_tenant_configurations.rb} +1 -1
  76. data/lib/cybersource_rest_client/models/{inline_response_201_7_organization_information.rb → inline_response_201_6_organization_information.rb} +1 -1
  77. data/lib/cybersource_rest_client/models/{inline_response_201_7_product_information_setups.rb → inline_response_201_6_product_information_setups.rb} +2 -2
  78. data/lib/cybersource_rest_client/models/{inline_response_201_7_registration_information.rb → inline_response_201_6_registration_information.rb} +1 -1
  79. data/lib/cybersource_rest_client/models/{inline_response_201_7_setups.rb → inline_response_201_6_setups.rb} +4 -4
  80. data/lib/cybersource_rest_client/models/{inline_response_201_7_setups_commerce_solutions.rb → inline_response_201_6_setups_commerce_solutions.rb} +1 -1
  81. data/lib/cybersource_rest_client/models/{inline_response_201_7_setups_risk.rb → inline_response_201_6_setups_risk.rb} +1 -1
  82. data/lib/cybersource_rest_client/models/{inline_response_201_7_setups_value_added_services.rb → inline_response_201_6_setups_value_added_services.rb} +1 -1
  83. data/lib/cybersource_rest_client/models/inline_response_201_7.rb +19 -78
  84. data/lib/cybersource_rest_client/models/{inline_response_201_8_key_information.rb → inline_response_201_7_key_information.rb} +2 -2
  85. data/lib/cybersource_rest_client/models/{inline_response_201_8_key_information_error_information.rb → inline_response_201_7_key_information_error_information.rb} +2 -2
  86. data/lib/cybersource_rest_client/models/{inline_response_201_8_key_information_error_information_details.rb → inline_response_201_7_key_information_error_information_details.rb} +1 -1
  87. data/lib/cybersource_rest_client/models/inline_response_201_8.rb +117 -25
  88. data/lib/cybersource_rest_client/models/inline_response_201_9.rb +68 -105
  89. data/lib/cybersource_rest_client/models/{inline_response_201_10_payloads.rb → inline_response_201_9_payloads.rb} +2 -2
  90. data/lib/cybersource_rest_client/models/{inline_response_201_10_payloads_test_payload.rb → inline_response_201_9_payloads_test_payload.rb} +1 -1
  91. data/lib/cybersource_rest_client/models/inline_response_400_3.rb +1 -1
  92. data/lib/cybersource_rest_client/models/inline_response_400_4.rb +1 -1
  93. data/lib/cybersource_rest_client/models/invoicing_v2_invoices_post201_response_merchant_defined_field_values_with_definition.rb +11 -1
  94. data/lib/cybersource_rest_client/models/ucv1sessions_complete_mandate.rb +16 -5
  95. data/lib/cybersource_rest_client/models/ucv1sessions_data.rb +11 -1
  96. data/lib/cybersource_rest_client/models/ucv1sessions_data_acquirer_information.rb +196 -0
  97. data/lib/cybersource_rest_client/models/ucv1sessions_data_aggregator_information.rb +1 -1
  98. data/lib/cybersource_rest_client/models/ucv1sessions_data_consumer_authentication_information.rb +16 -5
  99. data/lib/cybersource_rest_client/models/{inline_response_201_14_line_items.rb → unified_risk_post201_response.rb} +28 -42
  100. data/lib/cybersource_rest_client/models/{inline_response_201_3_results.rb → unified_risk_post201_response_results.rb} +3 -3
  101. data/lib/cybersource_rest_client/models/unified_risk_post201_response_results_risk_insights.rb +291 -0
  102. data/lib/cybersource_rest_client/models/unified_risk_post201_response_results_risk_insights_client.rb +208 -0
  103. data/lib/cybersource_rest_client/models/unified_risk_post201_response_results_risk_insights_error.rb +202 -0
  104. data/lib/cybersource_rest_client/models/unified_risk_post201_response_results_risk_insights_packages.rb +190 -0
  105. data/lib/cybersource_rest_client/models/unified_risk_post201_response_results_risk_insights_packages_transaction_insights.rb +250 -0
  106. data/lib/cybersource_rest_client/models/unified_risk_post201_response_results_risk_insights_packages_transaction_insights_insights.rb +219 -0
  107. data/lib/cybersource_rest_client/models/unified_risk_post201_response_transaction_insights_insights_warnings.rb +214 -0
  108. data/lib/cybersource_rest_client/models/{unified_risk_labels_post400_response.rb → unified_risk_post400_response.rb} +2 -2
  109. data/lib/cybersource_rest_client/models/{unified_risk_labels_post400_response_errors.rb → unified_risk_post400_response_errors.rb} +1 -1
  110. data/lib/cybersource_rest_client/models/unifiedrisk_account.rb +190 -0
  111. data/lib/cybersource_rest_client/models/unifiedrisk_acquirer.rb +302 -0
  112. data/lib/cybersource_rest_client/models/unifiedrisk_acquirer_merchant_account.rb +234 -0
  113. data/lib/cybersource_rest_client/models/unifiedrisk_acquirer_merchant_account_security_amount.rb +246 -0
  114. data/lib/cybersource_rest_client/models/unifiedrisk_authentication.rb +402 -0
  115. data/lib/cybersource_rest_client/models/unifiedrisk_authentication_challenge.rb +202 -0
  116. data/lib/cybersource_rest_client/models/unifiedrisk_authorization.rb +212 -0
  117. data/lib/cybersource_rest_client/models/unifiedrisk_browser.rb +420 -0
  118. data/lib/cybersource_rest_client/models/unifiedrisk_customer.rb +403 -0
  119. data/lib/cybersource_rest_client/models/unifiedrisk_customer_address.rb +279 -0
  120. data/lib/cybersource_rest_client/models/{inline_response_201_5_processing_information.rb → unifiedrisk_customer_personal_identification.rb} +99 -42
  121. data/lib/cybersource_rest_client/models/unifiedrisk_device.rb +681 -0
  122. data/lib/cybersource_rest_client/models/unifiedrisk_device_point_of_sale.rb +344 -0
  123. data/lib/cybersource_rest_client/models/unifiedrisk_initiating_party.rb +223 -0
  124. data/lib/cybersource_rest_client/models/unifiedrisk_merchant.rb +326 -0
  125. data/lib/cybersource_rest_client/models/unifiedrisk_merchant_address.rb +328 -0
  126. data/lib/cybersource_rest_client/models/unifiedrisk_merchant_merchant_descriptor.rb +389 -0
  127. data/lib/cybersource_rest_client/models/unifiedrisk_merchant_merchant_descriptor_expected_annual_sales.rb +268 -0
  128. data/lib/cybersource_rest_client/models/unifiedrisk_merchant_merchant_descriptor_expected_average_ticket_size.rb +246 -0
  129. data/lib/cybersource_rest_client/models/unifiedrisk_merchant_merchant_descriptor_expected_monthly_sales.rb +268 -0
  130. data/lib/cybersource_rest_client/models/unifiedrisk_merchant_merchant_descriptor_hierarchy.rb +224 -0
  131. data/lib/cybersource_rest_client/models/unifiedrisk_merchant_merchant_descriptor_limit_value.rb +257 -0
  132. data/lib/cybersource_rest_client/models/unifiedrisk_merchant_trading_address.rb +301 -0
  133. data/lib/cybersource_rest_client/models/{label_request.rb → unifiedrisk_order.rb} +60 -72
  134. data/lib/cybersource_rest_client/models/unifiedrisk_order_billing.rb +360 -0
  135. data/lib/cybersource_rest_client/models/unifiedrisk_order_line_items.rb +262 -0
  136. data/lib/cybersource_rest_client/models/unifiedrisk_order_shipping.rb +464 -0
  137. data/lib/cybersource_rest_client/models/unifiedrisk_order_shipping_store.rb +251 -0
  138. data/lib/cybersource_rest_client/models/unifiedrisk_order_shipping_store_address.rb +191 -0
  139. data/lib/cybersource_rest_client/models/{inline_response_201_3_results_risk_insights.rb → unifiedrisk_order_shipping_store_store_address.rb} +43 -43
  140. data/lib/cybersource_rest_client/models/unifiedrisk_partner.rb +214 -0
  141. data/lib/cybersource_rest_client/models/unifiedrisk_payment.rb +423 -0
  142. data/lib/cybersource_rest_client/models/unifiedrisk_payment_approvals.rb +193 -0
  143. data/lib/cybersource_rest_client/models/unifiedrisk_payment_bank_account.rb +451 -0
  144. data/lib/cybersource_rest_client/models/{inline_response_201_5_order_information_amount_details.rb → unifiedrisk_payment_bank_account_balance_before.rb} +49 -56
  145. data/lib/cybersource_rest_client/models/unifiedrisk_payment_bank_account_branch_address.rb +328 -0
  146. data/lib/cybersource_rest_client/models/unifiedrisk_payment_bank_account_credit_limit.rb +257 -0
  147. data/lib/cybersource_rest_client/models/unifiedrisk_payment_bank_account_financial_institution.rb +212 -0
  148. data/lib/cybersource_rest_client/models/unifiedrisk_payment_batch.rb +323 -0
  149. data/lib/cybersource_rest_client/models/unifiedrisk_payment_card.rb +461 -0
  150. data/lib/cybersource_rest_client/models/unifiedrisk_payment_card_par_details.rb +196 -0
  151. data/lib/cybersource_rest_client/models/unifiedrisk_payment_card_token_details.rb +380 -0
  152. data/lib/cybersource_rest_client/models/unifiedrisk_payment_check.rb +289 -0
  153. data/lib/cybersource_rest_client/models/unifiedrisk_payment_check_deposit_location.rb +279 -0
  154. data/lib/cybersource_rest_client/models/unifiedrisk_payment_counterparty.rb +287 -0
  155. data/lib/cybersource_rest_client/models/unifiedrisk_payment_counterparty_address.rb +279 -0
  156. data/lib/cybersource_rest_client/models/unifiedrisk_payment_counterparty_branch_address.rb +279 -0
  157. data/lib/cybersource_rest_client/models/unifiedrisk_payment_sdk.rb +268 -0
  158. data/lib/cybersource_rest_client/models/unifiedrisk_payment_token.rb +213 -0
  159. data/lib/cybersource_rest_client/models/unifiedrisk_payment_verification.rb +230 -0
  160. data/lib/cybersource_rest_client/models/unifiedrisk_payment_verification_additional.rb +256 -0
  161. data/lib/cybersource_rest_client/models/unifiedrisk_payment_verification_authentication.rb +232 -0
  162. data/lib/cybersource_rest_client/models/unifiedrisk_payment_verification_authentication_pin.rb +201 -0
  163. data/lib/cybersource_rest_client/models/unifiedrisk_payment_verification_authentication_three_ds.rb +190 -0
  164. data/lib/cybersource_rest_client/models/unifiedrisk_payment_verification_card_security.rb +199 -0
  165. data/lib/cybersource_rest_client/models/unifiedrisk_payment_verification_card_security_avs.rb +218 -0
  166. data/lib/cybersource_rest_client/models/unifiedrisk_payment_verification_card_security_cvv.rb +196 -0
  167. data/lib/cybersource_rest_client/models/unifiedrisk_payment_verification_digital.rb +212 -0
  168. data/lib/cybersource_rest_client/models/unifiedrisk_payment_wallet.rb +201 -0
  169. data/lib/cybersource_rest_client/models/unifiedrisk_payment_wire.rb +364 -0
  170. data/lib/cybersource_rest_client/models/unifiedrisk_risk_assessment.rb +308 -0
  171. data/lib/cybersource_rest_client/models/unifiedrisk_risk_assessment_buyer_history.rb +276 -0
  172. data/lib/cybersource_rest_client/models/unifiedrisk_risk_assessment_buyer_history_account_history.rb +207 -0
  173. data/lib/cybersource_rest_client/models/unifiedrisk_risk_assessment_buyer_history_customer_account.rb +273 -0
  174. data/lib/cybersource_rest_client/models/{inline_response_201_14.rb → unifiedrisk_risk_assessment_buyer_history_customer_account_alertnate_authentication.rb} +59 -114
  175. data/lib/cybersource_rest_client/models/unifiedrisk_risk_assessment_vital4.rb +191 -0
  176. data/lib/cybersource_rest_client/models/unifiedrisk_session.rb +202 -0
  177. data/lib/cybersource_rest_client/models/unifiedrisk_terminal.rb +238 -0
  178. data/lib/cybersource_rest_client/models/unifiedrisk_terminal_address.rb +301 -0
  179. data/lib/cybersource_rest_client/models/unifiedrisk_terminal_capabilities.rb +234 -0
  180. data/lib/cybersource_rest_client/models/unifiedrisk_third_party_risk.rb +708 -0
  181. data/lib/cybersource_rest_client/models/unifiedrisk_third_party_risk_raw_data.rb +189 -0
  182. data/lib/cybersource_rest_client/models/unifiedrisk_transaction.rb +305 -12
  183. data/lib/cybersource_rest_client/models/unifiedrisk_transaction_additional_fees.rb +257 -0
  184. data/lib/cybersource_rest_client/models/unifiedrisk_transaction_amount.rb +257 -0
  185. data/lib/cybersource_rest_client/models/unifiedrisk_transaction_batch_details.rb +220 -0
  186. data/lib/cybersource_rest_client/models/unifiedrisk_transaction_batch_details_batch_credits_amount.rb +246 -0
  187. data/lib/cybersource_rest_client/models/unifiedrisk_transaction_batch_details_batch_debits_amount.rb +246 -0
  188. data/lib/cybersource_rest_client/models/unifiedrisk_transaction_batch_details_file_credits.rb +246 -0
  189. data/lib/cybersource_rest_client/models/unifiedrisk_transaction_batch_details_file_debits.rb +246 -0
  190. data/lib/cybersource_rest_client/models/unifiedrisk_transaction_check_details.rb +190 -0
  191. data/lib/cybersource_rest_client/models/unifiedrisk_transaction_check_details_deposited_cash_amount.rb +246 -0
  192. data/lib/cybersource_rest_client/models/unifiedrisk_transaction_recurring_details.rb +341 -0
  193. data/lib/cybersource_rest_client/models/unifiedrisk_travel.rb +279 -0
  194. data/lib/cybersource_rest_client/models/vpri_request.rb +505 -0
  195. data/lib/cybersource_rest_client/models/vpri_transaction_insights_additional_data.rb +190 -0
  196. data/lib/cybersource_rest_client/models/vpri_transaction_insights_additional_data_card_bin_data.rb +357 -0
  197. data/lib/cybersource_rest_client.rb +153 -61
  198. metadata +155 -63
  199. data/lib/cybersource_rest_client/api/transaction_risk_labeling_api.rb +0 -104
  200. data/lib/cybersource_rest_client/models/inline_response_201_5_processor_information.rb +0 -548
@@ -0,0 +1,380 @@
1
+ =begin
2
+ #CyberSource Merged Spec
3
+
4
+ #All CyberSource API specs merged together. These are available at https://developer.cybersource.com/api/reference/api-reference.html
5
+
6
+ OpenAPI spec version: 0.0.1
7
+
8
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
9
+ Swagger Codegen version: 2.4.38
10
+ =end
11
+
12
+ require 'date'
13
+
14
+ module CyberSource
15
+ class UnifiedriskPaymentCardTokenDetails
16
+ # Token provider type: network_token or merchant_token Possible values: - network_token - merchant_token
17
+ attr_accessor :provider_type
18
+
19
+ # Type of payment credential being used. Visa, MasterCard, AMEX
20
+ attr_accessor :type
21
+
22
+ # Transient Token JWT ID
23
+ attr_accessor :jti
24
+
25
+ # Token number replacing PAN
26
+ attr_accessor :number
27
+
28
+ # Token expiration month
29
+ attr_accessor :expiration_month
30
+
31
+ # Token expiration year
32
+ attr_accessor :expiration_year
33
+
34
+ # BIN from underlying card
35
+ attr_accessor :bin
36
+
37
+ # Last 4 digits of card
38
+ attr_accessor :last4
39
+
40
+ # Combined expiration date of the network token in MMYYYY format, used when the token's lifecycle is managed separately from the underlying PAN
41
+ attr_accessor :expiration_date
42
+
43
+ # Unique identifier of the token requestor (e.g., merchant or PSP) registered with the token service provider for DPAN provisioning and lifecycle management
44
+ attr_accessor :requestor_id
45
+
46
+ # A cryptographic value generated during tokenization (TAVV or CAVV) that authenticates the token for a specific transaction, preventing token replay attacks
47
+ attr_accessor :cryptogram
48
+
49
+ # Current lifecycle status of the network token (e.g., ACTIVE, SUSPENDED, DEACTIVATED). Tokens that are not ACTIVE should not be used for payment
50
+ attr_accessor :status
51
+
52
+ # Indicates the validity or expiry state of the cryptogram, helping detect stale or replayed token authentication attempts
53
+ attr_accessor :cryptogra_validity
54
+
55
+ # Indicates the authentication assurance level of the token provisioning process (e.g., APP_VERIFIED, CARDHOLDER_VERIFIED), impacting liability shift decisions
56
+ attr_accessor :assurance_method
57
+
58
+ # Supplementary data associated with the network token, such as merchant category restrictions, wallet provider metadata, or tokenization service payload extensions
59
+ attr_accessor :additional_data
60
+
61
+ # Attribute mapping from ruby-style variable name to JSON key.
62
+ def self.attribute_map
63
+ {
64
+ :'provider_type' => :'providerType',
65
+ :'type' => :'type',
66
+ :'jti' => :'jti',
67
+ :'number' => :'number',
68
+ :'expiration_month' => :'expirationMonth',
69
+ :'expiration_year' => :'expirationYear',
70
+ :'bin' => :'bin',
71
+ :'last4' => :'last4',
72
+ :'expiration_date' => :'expirationDate',
73
+ :'requestor_id' => :'requestorId',
74
+ :'cryptogram' => :'cryptogram',
75
+ :'status' => :'status',
76
+ :'cryptogra_validity' => :'cryptograValidity',
77
+ :'assurance_method' => :'assuranceMethod',
78
+ :'additional_data' => :'additionalData'
79
+ }
80
+ end
81
+
82
+ # Attribute mapping from JSON key to ruby-style variable name.
83
+ def self.json_map
84
+ {
85
+ :'provider_type' => :'provider_type',
86
+ :'type' => :'type',
87
+ :'jti' => :'jti',
88
+ :'number' => :'number',
89
+ :'expiration_month' => :'expiration_month',
90
+ :'expiration_year' => :'expiration_year',
91
+ :'bin' => :'bin',
92
+ :'last4' => :'last4',
93
+ :'expiration_date' => :'expiration_date',
94
+ :'requestor_id' => :'requestor_id',
95
+ :'cryptogram' => :'cryptogram',
96
+ :'status' => :'status',
97
+ :'cryptogra_validity' => :'cryptogra_validity',
98
+ :'assurance_method' => :'assurance_method',
99
+ :'additional_data' => :'additional_data'
100
+ }
101
+ end
102
+
103
+ # Attribute type mapping.
104
+ def self.swagger_types
105
+ {
106
+ :'provider_type' => :'String',
107
+ :'type' => :'String',
108
+ :'jti' => :'String',
109
+ :'number' => :'String',
110
+ :'expiration_month' => :'String',
111
+ :'expiration_year' => :'String',
112
+ :'bin' => :'String',
113
+ :'last4' => :'String',
114
+ :'expiration_date' => :'String',
115
+ :'requestor_id' => :'String',
116
+ :'cryptogram' => :'String',
117
+ :'status' => :'String',
118
+ :'cryptogra_validity' => :'String',
119
+ :'assurance_method' => :'String',
120
+ :'additional_data' => :'String'
121
+ }
122
+ end
123
+
124
+ # Initializes the object
125
+ # @param [Hash] attributes Model attributes in the form of hash
126
+ def initialize(attributes = {})
127
+ return unless attributes.is_a?(Hash)
128
+
129
+ # convert string to symbol for hash key
130
+ attributes = attributes.each_with_object({}) { |(k, v), h| h[k.to_sym] = v }
131
+
132
+ if attributes.has_key?(:'providerType')
133
+ self.provider_type = attributes[:'providerType']
134
+ end
135
+
136
+ if attributes.has_key?(:'type')
137
+ self.type = attributes[:'type']
138
+ end
139
+
140
+ if attributes.has_key?(:'jti')
141
+ self.jti = attributes[:'jti']
142
+ end
143
+
144
+ if attributes.has_key?(:'number')
145
+ self.number = attributes[:'number']
146
+ end
147
+
148
+ if attributes.has_key?(:'expirationMonth')
149
+ self.expiration_month = attributes[:'expirationMonth']
150
+ end
151
+
152
+ if attributes.has_key?(:'expirationYear')
153
+ self.expiration_year = attributes[:'expirationYear']
154
+ end
155
+
156
+ if attributes.has_key?(:'bin')
157
+ self.bin = attributes[:'bin']
158
+ end
159
+
160
+ if attributes.has_key?(:'last4')
161
+ self.last4 = attributes[:'last4']
162
+ end
163
+
164
+ if attributes.has_key?(:'expirationDate')
165
+ self.expiration_date = attributes[:'expirationDate']
166
+ end
167
+
168
+ if attributes.has_key?(:'requestorId')
169
+ self.requestor_id = attributes[:'requestorId']
170
+ end
171
+
172
+ if attributes.has_key?(:'cryptogram')
173
+ self.cryptogram = attributes[:'cryptogram']
174
+ end
175
+
176
+ if attributes.has_key?(:'status')
177
+ self.status = attributes[:'status']
178
+ end
179
+
180
+ if attributes.has_key?(:'cryptograValidity')
181
+ self.cryptogra_validity = attributes[:'cryptograValidity']
182
+ end
183
+
184
+ if attributes.has_key?(:'assuranceMethod')
185
+ self.assurance_method = attributes[:'assuranceMethod']
186
+ end
187
+
188
+ if attributes.has_key?(:'additionalData')
189
+ self.additional_data = attributes[:'additionalData']
190
+ end
191
+ end
192
+
193
+ # Show invalid properties with the reasons. Usually used together with valid?
194
+ # @return Array for valid properties with the reasons
195
+ def list_invalid_properties
196
+ invalid_properties = Array.new
197
+ invalid_properties
198
+ end
199
+
200
+ # Check to see if the all the properties in the model are valid
201
+ # @return true if the model is valid
202
+ def valid?
203
+ true
204
+ end
205
+
206
+ # Custom attribute writer method with validation
207
+ # @param [Object] jti Value to be assigned
208
+ def jti=(jti)
209
+ @jti = jti
210
+ end
211
+
212
+ # Custom attribute writer method with validation
213
+ # @param [Object] number Value to be assigned
214
+ def number=(number)
215
+ @number = number
216
+ end
217
+
218
+ # Custom attribute writer method with validation
219
+ # @param [Object] expiration_month Value to be assigned
220
+ def expiration_month=(expiration_month)
221
+ @expiration_month = expiration_month
222
+ end
223
+
224
+ # Custom attribute writer method with validation
225
+ # @param [Object] expiration_year Value to be assigned
226
+ def expiration_year=(expiration_year)
227
+ @expiration_year = expiration_year
228
+ end
229
+
230
+ # Custom attribute writer method with validation
231
+ # @param [Object] bin Value to be assigned
232
+ def bin=(bin)
233
+ @bin = bin
234
+ end
235
+
236
+ # Custom attribute writer method with validation
237
+ # @param [Object] last4 Value to be assigned
238
+ def last4=(last4)
239
+ @last4 = last4
240
+ end
241
+
242
+ # Checks equality by comparing each attribute.
243
+ # @param [Object] Object to be compared
244
+ def ==(o)
245
+ return true if self.equal?(o)
246
+ self.class == o.class &&
247
+ provider_type == o.provider_type &&
248
+ type == o.type &&
249
+ jti == o.jti &&
250
+ number == o.number &&
251
+ expiration_month == o.expiration_month &&
252
+ expiration_year == o.expiration_year &&
253
+ bin == o.bin &&
254
+ last4 == o.last4 &&
255
+ expiration_date == o.expiration_date &&
256
+ requestor_id == o.requestor_id &&
257
+ cryptogram == o.cryptogram &&
258
+ status == o.status &&
259
+ cryptogra_validity == o.cryptogra_validity &&
260
+ assurance_method == o.assurance_method &&
261
+ additional_data == o.additional_data
262
+ end
263
+
264
+ # @see the `==` method
265
+ # @param [Object] Object to be compared
266
+ def eql?(o)
267
+ self == o
268
+ end
269
+
270
+ # Calculates hash code according to all attributes.
271
+ # @return [Fixnum] Hash code
272
+ def hash
273
+ [provider_type, type, jti, number, expiration_month, expiration_year, bin, last4, expiration_date, requestor_id, cryptogram, status, cryptogra_validity, assurance_method, additional_data].hash
274
+ end
275
+
276
+ # Builds the object from hash
277
+ # @param [Hash] attributes Model attributes in the form of hash
278
+ # @return [Object] Returns the model itself
279
+ def build_from_hash(attributes)
280
+ return nil unless attributes.is_a?(Hash)
281
+ self.class.swagger_types.each_pair do |key, type|
282
+ if type =~ /\AArray<(.*)>/i
283
+ # check to ensure the input is an array given that the the attribute
284
+ # is documented as an array but the input is not
285
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
286
+ self.send("#{self.class.json_map[key]}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
287
+ end
288
+ elsif !attributes[self.class.attribute_map[key]].nil?
289
+ self.send("#{self.class.json_map[key]}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
290
+ end # or else data not found in attributes(hash), not an issue as the data can be optional
291
+ end
292
+
293
+ self
294
+ end
295
+
296
+ # Deserializes the data based on type
297
+ # @param string type Data type
298
+ # @param string value Value to be deserialized
299
+ # @return [Object] Deserialized data
300
+ def _deserialize(type, value)
301
+ case type.to_sym
302
+ when :DateTime
303
+ DateTime.parse(value)
304
+ when :Date
305
+ Date.parse(value)
306
+ when :String
307
+ value.to_s
308
+ when :Integer
309
+ value.to_i
310
+ when :Float
311
+ value.to_f
312
+ when :BOOLEAN
313
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
314
+ true
315
+ else
316
+ false
317
+ end
318
+ when :Object
319
+ # generic object (usually a Hash), return directly
320
+ value
321
+ when /\AArray<(?<inner_type>.+)>\z/
322
+ inner_type = Regexp.last_match[:inner_type]
323
+ value.map { |v| _deserialize(inner_type, v) }
324
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
325
+ k_type = Regexp.last_match[:k_type]
326
+ v_type = Regexp.last_match[:v_type]
327
+ {}.tap do |hash|
328
+ value.each do |k, v|
329
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
330
+ end
331
+ end
332
+ else # model
333
+ temp_model = CyberSource.const_get(type).new
334
+ temp_model.build_from_hash(value)
335
+ end
336
+ end
337
+
338
+ # Returns the string representation of the object
339
+ # @return [String] String presentation of the object
340
+ def to_s
341
+ to_hash.to_s
342
+ end
343
+
344
+ # to_body is an alias to to_hash (backward compatibility)
345
+ # @return [Hash] Returns the object in the form of hash
346
+ def to_body
347
+ to_hash
348
+ end
349
+
350
+ # Returns the object in the form of hash
351
+ # @return [Hash] Returns the object in the form of hash
352
+ def to_hash
353
+ hash = {}
354
+ self.class.attribute_map.each_pair do |attr, param|
355
+ value = self.send(attr)
356
+ next if value.nil?
357
+ hash[param] = _to_hash(value)
358
+ end
359
+ hash
360
+ end
361
+
362
+ # Outputs non-array value in the form of hash
363
+ # For object, use to_hash. Otherwise, just return the value
364
+ # @param [Object] value Any valid value
365
+ # @return [Hash] Returns the value in the form of hash
366
+ def _to_hash(value)
367
+ if value.is_a?(Array)
368
+ value.compact.map { |v| _to_hash(v) }
369
+ elsif value.is_a?(Hash)
370
+ {}.tap do |hash|
371
+ value.each { |k, v| hash[k] = _to_hash(v) }
372
+ end
373
+ elsif value.respond_to? :to_hash
374
+ value.to_hash
375
+ else
376
+ value
377
+ end
378
+ end
379
+ end
380
+ end
@@ -0,0 +1,289 @@
1
+ =begin
2
+ #CyberSource Merged Spec
3
+
4
+ #All CyberSource API specs merged together. These are available at https://developer.cybersource.com/api/reference/api-reference.html
5
+
6
+ OpenAPI spec version: 0.0.1
7
+
8
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
9
+ Swagger Codegen version: 2.4.38
10
+ =end
11
+
12
+ require 'date'
13
+
14
+ module CyberSource
15
+ # Container for check-specific payment details including MICR line data, deposit location, and split deposit information
16
+ class UnifiedriskPaymentCheck
17
+ # Serial number printed on the physical check, used for duplicate detection, check fraud prevention, and reconciliation
18
+ attr_accessor :check_number
19
+
20
+ # Unique identifier for the deposit slip associated with the check deposit, used for linking deposited checks to branch transactions
21
+ attr_accessor :deposit_slip_id
22
+
23
+ attr_accessor :deposit_location
24
+
25
+ # Account number encoded in the MICR (Magnetic Ink Character Recognition) line at the bottom of the check, used for automated account identification
26
+ attr_accessor :micr_account_number
27
+
28
+ # Bank routing and transit number (RTN) encoded in the MICR line of the check, identifying the financial institution on which the check is drawn
29
+ attr_accessor :routing_transit_number
30
+
31
+ # Indicates whether the check deposit has been split across multiple accounts. Split deposits may indicate structuring or kiting attempts
32
+ attr_accessor :split_deposit_flag
33
+
34
+ # First destination account ID in a split check deposit, used for tracking the allocation of funds across multiple accounts
35
+ attr_accessor :split_account_id1
36
+
37
+ # Second destination account ID in a split check deposit
38
+ attr_accessor :split_account_id2
39
+
40
+ # Third destination account ID in a split check deposit
41
+ attr_accessor :split_account_id3
42
+
43
+ # Fourth destination account ID in a split check deposit
44
+ attr_accessor :split_account_id4
45
+
46
+ # Attribute mapping from ruby-style variable name to JSON key.
47
+ def self.attribute_map
48
+ {
49
+ :'check_number' => :'checkNumber',
50
+ :'deposit_slip_id' => :'depositSlipId',
51
+ :'deposit_location' => :'depositLocation',
52
+ :'micr_account_number' => :'micrAccountNumber',
53
+ :'routing_transit_number' => :'routingTransitNumber',
54
+ :'split_deposit_flag' => :'splitDepositFlag',
55
+ :'split_account_id1' => :'splitAccountId1',
56
+ :'split_account_id2' => :'splitAccountId2',
57
+ :'split_account_id3' => :'splitAccountId3',
58
+ :'split_account_id4' => :'splitAccountId4'
59
+ }
60
+ end
61
+
62
+ # Attribute mapping from JSON key to ruby-style variable name.
63
+ def self.json_map
64
+ {
65
+ :'check_number' => :'check_number',
66
+ :'deposit_slip_id' => :'deposit_slip_id',
67
+ :'deposit_location' => :'deposit_location',
68
+ :'micr_account_number' => :'micr_account_number',
69
+ :'routing_transit_number' => :'routing_transit_number',
70
+ :'split_deposit_flag' => :'split_deposit_flag',
71
+ :'split_account_id1' => :'split_account_id1',
72
+ :'split_account_id2' => :'split_account_id2',
73
+ :'split_account_id3' => :'split_account_id3',
74
+ :'split_account_id4' => :'split_account_id4'
75
+ }
76
+ end
77
+
78
+ # Attribute type mapping.
79
+ def self.swagger_types
80
+ {
81
+ :'check_number' => :'String',
82
+ :'deposit_slip_id' => :'String',
83
+ :'deposit_location' => :'UnifiedriskPaymentCheckDepositLocation',
84
+ :'micr_account_number' => :'String',
85
+ :'routing_transit_number' => :'String',
86
+ :'split_deposit_flag' => :'BOOLEAN',
87
+ :'split_account_id1' => :'String',
88
+ :'split_account_id2' => :'String',
89
+ :'split_account_id3' => :'String',
90
+ :'split_account_id4' => :'String'
91
+ }
92
+ end
93
+
94
+ # Initializes the object
95
+ # @param [Hash] attributes Model attributes in the form of hash
96
+ def initialize(attributes = {})
97
+ return unless attributes.is_a?(Hash)
98
+
99
+ # convert string to symbol for hash key
100
+ attributes = attributes.each_with_object({}) { |(k, v), h| h[k.to_sym] = v }
101
+
102
+ if attributes.has_key?(:'checkNumber')
103
+ self.check_number = attributes[:'checkNumber']
104
+ end
105
+
106
+ if attributes.has_key?(:'depositSlipId')
107
+ self.deposit_slip_id = attributes[:'depositSlipId']
108
+ end
109
+
110
+ if attributes.has_key?(:'depositLocation')
111
+ self.deposit_location = attributes[:'depositLocation']
112
+ end
113
+
114
+ if attributes.has_key?(:'micrAccountNumber')
115
+ self.micr_account_number = attributes[:'micrAccountNumber']
116
+ end
117
+
118
+ if attributes.has_key?(:'routingTransitNumber')
119
+ self.routing_transit_number = attributes[:'routingTransitNumber']
120
+ end
121
+
122
+ if attributes.has_key?(:'splitDepositFlag')
123
+ self.split_deposit_flag = attributes[:'splitDepositFlag']
124
+ end
125
+
126
+ if attributes.has_key?(:'splitAccountId1')
127
+ self.split_account_id1 = attributes[:'splitAccountId1']
128
+ end
129
+
130
+ if attributes.has_key?(:'splitAccountId2')
131
+ self.split_account_id2 = attributes[:'splitAccountId2']
132
+ end
133
+
134
+ if attributes.has_key?(:'splitAccountId3')
135
+ self.split_account_id3 = attributes[:'splitAccountId3']
136
+ end
137
+
138
+ if attributes.has_key?(:'splitAccountId4')
139
+ self.split_account_id4 = attributes[:'splitAccountId4']
140
+ end
141
+ end
142
+
143
+ # Show invalid properties with the reasons. Usually used together with valid?
144
+ # @return Array for valid properties with the reasons
145
+ def list_invalid_properties
146
+ invalid_properties = Array.new
147
+ invalid_properties
148
+ end
149
+
150
+ # Check to see if the all the properties in the model are valid
151
+ # @return true if the model is valid
152
+ def valid?
153
+ true
154
+ end
155
+
156
+ # Checks equality by comparing each attribute.
157
+ # @param [Object] Object to be compared
158
+ def ==(o)
159
+ return true if self.equal?(o)
160
+ self.class == o.class &&
161
+ check_number == o.check_number &&
162
+ deposit_slip_id == o.deposit_slip_id &&
163
+ deposit_location == o.deposit_location &&
164
+ micr_account_number == o.micr_account_number &&
165
+ routing_transit_number == o.routing_transit_number &&
166
+ split_deposit_flag == o.split_deposit_flag &&
167
+ split_account_id1 == o.split_account_id1 &&
168
+ split_account_id2 == o.split_account_id2 &&
169
+ split_account_id3 == o.split_account_id3 &&
170
+ split_account_id4 == o.split_account_id4
171
+ end
172
+
173
+ # @see the `==` method
174
+ # @param [Object] Object to be compared
175
+ def eql?(o)
176
+ self == o
177
+ end
178
+
179
+ # Calculates hash code according to all attributes.
180
+ # @return [Fixnum] Hash code
181
+ def hash
182
+ [check_number, deposit_slip_id, deposit_location, micr_account_number, routing_transit_number, split_deposit_flag, split_account_id1, split_account_id2, split_account_id3, split_account_id4].hash
183
+ end
184
+
185
+ # Builds the object from hash
186
+ # @param [Hash] attributes Model attributes in the form of hash
187
+ # @return [Object] Returns the model itself
188
+ def build_from_hash(attributes)
189
+ return nil unless attributes.is_a?(Hash)
190
+ self.class.swagger_types.each_pair do |key, type|
191
+ if type =~ /\AArray<(.*)>/i
192
+ # check to ensure the input is an array given that the the attribute
193
+ # is documented as an array but the input is not
194
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
195
+ self.send("#{self.class.json_map[key]}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
196
+ end
197
+ elsif !attributes[self.class.attribute_map[key]].nil?
198
+ self.send("#{self.class.json_map[key]}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
199
+ end # or else data not found in attributes(hash), not an issue as the data can be optional
200
+ end
201
+
202
+ self
203
+ end
204
+
205
+ # Deserializes the data based on type
206
+ # @param string type Data type
207
+ # @param string value Value to be deserialized
208
+ # @return [Object] Deserialized data
209
+ def _deserialize(type, value)
210
+ case type.to_sym
211
+ when :DateTime
212
+ DateTime.parse(value)
213
+ when :Date
214
+ Date.parse(value)
215
+ when :String
216
+ value.to_s
217
+ when :Integer
218
+ value.to_i
219
+ when :Float
220
+ value.to_f
221
+ when :BOOLEAN
222
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
223
+ true
224
+ else
225
+ false
226
+ end
227
+ when :Object
228
+ # generic object (usually a Hash), return directly
229
+ value
230
+ when /\AArray<(?<inner_type>.+)>\z/
231
+ inner_type = Regexp.last_match[:inner_type]
232
+ value.map { |v| _deserialize(inner_type, v) }
233
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
234
+ k_type = Regexp.last_match[:k_type]
235
+ v_type = Regexp.last_match[:v_type]
236
+ {}.tap do |hash|
237
+ value.each do |k, v|
238
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
239
+ end
240
+ end
241
+ else # model
242
+ temp_model = CyberSource.const_get(type).new
243
+ temp_model.build_from_hash(value)
244
+ end
245
+ end
246
+
247
+ # Returns the string representation of the object
248
+ # @return [String] String presentation of the object
249
+ def to_s
250
+ to_hash.to_s
251
+ end
252
+
253
+ # to_body is an alias to to_hash (backward compatibility)
254
+ # @return [Hash] Returns the object in the form of hash
255
+ def to_body
256
+ to_hash
257
+ end
258
+
259
+ # Returns the object in the form of hash
260
+ # @return [Hash] Returns the object in the form of hash
261
+ def to_hash
262
+ hash = {}
263
+ self.class.attribute_map.each_pair do |attr, param|
264
+ value = self.send(attr)
265
+ next if value.nil?
266
+ hash[param] = _to_hash(value)
267
+ end
268
+ hash
269
+ end
270
+
271
+ # Outputs non-array value in the form of hash
272
+ # For object, use to_hash. Otherwise, just return the value
273
+ # @param [Object] value Any valid value
274
+ # @return [Hash] Returns the value in the form of hash
275
+ def _to_hash(value)
276
+ if value.is_a?(Array)
277
+ value.compact.map { |v| _to_hash(v) }
278
+ elsif value.is_a?(Hash)
279
+ {}.tap do |hash|
280
+ value.each { |k, v| hash[k] = _to_hash(v) }
281
+ end
282
+ elsif value.respond_to? :to_hash
283
+ value.to_hash
284
+ else
285
+ value
286
+ end
287
+ end
288
+ end
289
+ end