dfns-sdk 0.0.0.dev0__py3-none-any.whl

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 (69) hide show
  1. dfns_sdk/__init__.py +24 -0
  2. dfns_sdk/_internal/__init__.py +5 -0
  3. dfns_sdk/_internal/http_client.py +395 -0
  4. dfns_sdk/auth.py +137 -0
  5. dfns_sdk/base_auth_api.py +129 -0
  6. dfns_sdk/client.py +81 -0
  7. dfns_sdk/delegated_client.py +97 -0
  8. dfns_sdk/generated/__init__.py +47 -0
  9. dfns_sdk/generated/agreements/__init__.py +7 -0
  10. dfns_sdk/generated/agreements/client.py +55 -0
  11. dfns_sdk/generated/agreements/delegated_client.py +95 -0
  12. dfns_sdk/generated/agreements/types.py +20 -0
  13. dfns_sdk/generated/allocations/__init__.py +7 -0
  14. dfns_sdk/generated/allocations/client.py +118 -0
  15. dfns_sdk/generated/allocations/delegated_client.py +187 -0
  16. dfns_sdk/generated/allocations/types.py +69 -0
  17. dfns_sdk/generated/auth/__init__.py +7 -0
  18. dfns_sdk/generated/auth/client.py +1215 -0
  19. dfns_sdk/generated/auth/delegated_client.py +1825 -0
  20. dfns_sdk/generated/auth/types.py +702 -0
  21. dfns_sdk/generated/exchanges/__init__.py +7 -0
  22. dfns_sdk/generated/exchanges/client.py +209 -0
  23. dfns_sdk/generated/exchanges/delegated_client.py +341 -0
  24. dfns_sdk/generated/exchanges/types.py +96 -0
  25. dfns_sdk/generated/fee_sponsors/__init__.py +7 -0
  26. dfns_sdk/generated/fee_sponsors/client.py +161 -0
  27. dfns_sdk/generated/fee_sponsors/delegated_client.py +287 -0
  28. dfns_sdk/generated/fee_sponsors/types.py +89 -0
  29. dfns_sdk/generated/keys/__init__.py +7 -0
  30. dfns_sdk/generated/keys/client.py +310 -0
  31. dfns_sdk/generated/keys/delegated_client.py +518 -0
  32. dfns_sdk/generated/keys/types.py +229 -0
  33. dfns_sdk/generated/networks/__init__.py +7 -0
  34. dfns_sdk/generated/networks/client.py +176 -0
  35. dfns_sdk/generated/networks/delegated_client.py +274 -0
  36. dfns_sdk/generated/networks/types.py +77 -0
  37. dfns_sdk/generated/permissions/__init__.py +7 -0
  38. dfns_sdk/generated/permissions/client.py +185 -0
  39. dfns_sdk/generated/permissions/delegated_client.py +344 -0
  40. dfns_sdk/generated/permissions/types.py +107 -0
  41. dfns_sdk/generated/policies/__init__.py +7 -0
  42. dfns_sdk/generated/policies/client.py +187 -0
  43. dfns_sdk/generated/policies/delegated_client.py +311 -0
  44. dfns_sdk/generated/policies/types.py +70 -0
  45. dfns_sdk/generated/signers/__init__.py +7 -0
  46. dfns_sdk/generated/signers/client.py +45 -0
  47. dfns_sdk/generated/signers/delegated_client.py +56 -0
  48. dfns_sdk/generated/signers/types.py +13 -0
  49. dfns_sdk/generated/staking/__init__.py +7 -0
  50. dfns_sdk/generated/staking/client.py +142 -0
  51. dfns_sdk/generated/staking/delegated_client.py +211 -0
  52. dfns_sdk/generated/staking/types.py +64 -0
  53. dfns_sdk/generated/swaps/__init__.py +7 -0
  54. dfns_sdk/generated/swaps/client.py +118 -0
  55. dfns_sdk/generated/swaps/delegated_client.py +157 -0
  56. dfns_sdk/generated/swaps/types.py +99 -0
  57. dfns_sdk/generated/wallets/__init__.py +7 -0
  58. dfns_sdk/generated/wallets/client.py +805 -0
  59. dfns_sdk/generated/wallets/delegated_client.py +1231 -0
  60. dfns_sdk/generated/wallets/types.py +534 -0
  61. dfns_sdk/generated/webhooks/__init__.py +7 -0
  62. dfns_sdk/generated/webhooks/client.py +193 -0
  63. dfns_sdk/generated/webhooks/delegated_client.py +320 -0
  64. dfns_sdk/generated/webhooks/types.py +101 -0
  65. dfns_sdk/types.py +72 -0
  66. dfns_sdk-0.0.0.dev0.dist-info/METADATA +191 -0
  67. dfns_sdk-0.0.0.dev0.dist-info/RECORD +69 -0
  68. dfns_sdk-0.0.0.dev0.dist-info/WHEEL +4 -0
  69. dfns_sdk-0.0.0.dev0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,191 @@
1
+ Metadata-Version: 2.4
2
+ Name: dfns_sdk
3
+ Version: 0.0.0.dev0
4
+ Summary: Dfns Python SDK - Auto-generated from OpenAPI specification
5
+ Project-URL: Documentation, https://docs.dfns.co
6
+ Project-URL: Repository, https://github.com/dfns/dfns-sdk-python
7
+ License-Expression: MIT
8
+ License-File: LICENSE
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Typing :: Typed
18
+ Requires-Python: >=3.10
19
+ Requires-Dist: cryptography>=41.0.0
20
+ Requires-Dist: httpx>=0.25.0
21
+ Provides-Extra: dev
22
+ Requires-Dist: mypy>=1.5.0; extra == 'dev'
23
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
24
+ Requires-Dist: pytest>=7.0.0; extra == 'dev'
25
+ Requires-Dist: ruff>=0.1.0; extra == 'dev'
26
+ Description-Content-Type: text/markdown
27
+
28
+ # Dfns Python SDK
29
+
30
+ Auto-generated Python SDK for the Dfns API.
31
+
32
+ ## Installation
33
+
34
+ ```bash
35
+ pip install dfns_sdk
36
+ ```
37
+
38
+ Or install from source:
39
+
40
+ ```bash
41
+ pip install -e .
42
+ ```
43
+
44
+ ## Quick Start
45
+
46
+ ```python
47
+ from dfns_sdk import DfnsClient, DfnsClientConfig
48
+
49
+ # Configure the client
50
+ config = DfnsClientConfig(
51
+ auth_token="your-auth-token",
52
+ base_url="https://api.dfns.io", # Optional, this is the default
53
+ )
54
+
55
+ # Create the client
56
+ client = DfnsClient(config)
57
+
58
+ # Use the client
59
+ wallets = client.wallets.list_wallets()
60
+ print(wallets)
61
+
62
+ # Clean up
63
+ client.close()
64
+ ```
65
+
66
+ ## Using as a Context Manager
67
+
68
+ ```python
69
+ from dfns_sdk import DfnsClient, DfnsClientConfig
70
+
71
+ config = DfnsClientConfig(
72
+ auth_token="your-auth-token",
73
+ )
74
+
75
+ with DfnsClient(config) as client:
76
+ wallets = client.wallets.list_wallets()
77
+ print(wallets)
78
+ ```
79
+
80
+ ## User Action Signing
81
+
82
+ Some operations (like creating wallets or signing transactions) require user action signing.
83
+ Configure a signer to enable these operations:
84
+
85
+ ```python
86
+ from dfns_sdk import DfnsClient, DfnsClientConfig, KeySigner
87
+
88
+ # Load your private key
89
+ with open("private_key.pem") as f:
90
+ private_key = f.read()
91
+
92
+ # Create a signer
93
+ signer = KeySigner(
94
+ credential_id="cr-xxx-xxx", # Your credential ID
95
+ private_key=private_key,
96
+ app_origin="https://app.dfns.io",
97
+ )
98
+
99
+ # Configure the client with the signer
100
+ config = DfnsClientConfig(
101
+ auth_token="your-auth-token",
102
+ signer=signer,
103
+ )
104
+
105
+ with DfnsClient(config) as client:
106
+ # Operations requiring signatures will automatically sign
107
+ wallet = client.wallets.create_wallet({
108
+ "network": "EthereumSepolia",
109
+ })
110
+ print(wallet)
111
+ ```
112
+
113
+ ## Delegated Client (External Signing)
114
+
115
+ For service accounts that orchestrate signing externally (e.g., using a separate signing service),
116
+ use the `DfnsDelegatedClient`. This client separates user action signing into `*_init()` and
117
+ `*_complete()` method pairs:
118
+
119
+ ```python
120
+ from dfns_sdk import DfnsDelegatedClient, DfnsDelegatedClientConfig
121
+
122
+ # Configure the delegated client (no signer needed)
123
+ config = DfnsDelegatedClientConfig(
124
+ auth_token="service-account-token",
125
+ )
126
+
127
+ with DfnsDelegatedClient(config) as client:
128
+ # Step 1: Initialize the action (returns challenge)
129
+ challenge = client.wallets.create_wallet_init(
130
+ body={"network": "EthereumSepolia"}
131
+ )
132
+
133
+ # Step 2: Sign challenge externally (your signing system)
134
+ # The challenge contains everything needed to sign:
135
+ # - challenge["challenge"]: The challenge string to sign
136
+ # - challenge["challengeIdentifier"]: Unique ID for this challenge
137
+ signed_assertion = your_external_signer.sign(challenge)
138
+
139
+ # Step 3: Complete the action with signed challenge
140
+ wallet = client.wallets.create_wallet_complete(
141
+ body={"network": "EthereumSepolia"},
142
+ signed_challenge={
143
+ "challengeIdentifier": challenge["challengeIdentifier"],
144
+ "firstFactor": signed_assertion,
145
+ },
146
+ )
147
+ print(wallet)
148
+ ```
149
+
150
+ ### When to Use Delegated vs Regular Client
151
+
152
+ | Use Case | Client Type |
153
+ |----------|-------------|
154
+ | Single application with embedded signing | `DfnsClient` |
155
+ | Mobile app with local key storage | `DfnsClient` |
156
+ | Backend service with external HSM | `DfnsDelegatedClient` |
157
+ | Multi-step approval workflows | `DfnsDelegatedClient` |
158
+ | Service account orchestrating user actions | `DfnsDelegatedClient` |
159
+
160
+ ## Available Domains
161
+
162
+ The client provides access to the following API domains:
163
+
164
+ - `client.auth` - Authentication and user management
165
+ - `client.wallets` - Wallet operations
166
+ - `client.policies` - Policy management
167
+ - `client.permissions` - Permission management
168
+ - `client.webhooks` - Webhook subscriptions
169
+ - And more...
170
+
171
+ Each domain provides typed methods for all available API endpoints.
172
+
173
+ ## Error Handling
174
+
175
+ ```python
176
+ from dfns_sdk import DfnsClient, DfnsClientConfig, DfnsError
177
+
178
+ config = DfnsClientConfig(auth_token="your-auth-token")
179
+ client = DfnsClient(config)
180
+
181
+ try:
182
+ wallet = client.wallets.get_wallet(wallet_id="invalid-id")
183
+ except DfnsError as e:
184
+ print(f"Error: {e.message}")
185
+ print(f"Status: {e.status_code}")
186
+ print(f"Code: {e.error_code}")
187
+ ```
188
+
189
+ ## License
190
+
191
+ MIT License - See LICENSE file for details.
@@ -0,0 +1,69 @@
1
+ dfns_sdk/__init__.py,sha256=r713JvK6MpdhbwWtHAfUboXWvkYbikWGGR8Ak7gaS_8,633
2
+ dfns_sdk/auth.py,sha256=tnFisi-CS4brELaF_ijQw1EMpLI7KSw0yGRSxEHHH88,4070
3
+ dfns_sdk/base_auth_api.py,sha256=eYkbuo-Nqsnjw9x08aZ8jJXCrV1cZudrwKf9tcm3ono,4081
4
+ dfns_sdk/client.py,sha256=5cub7coYVmQNryNCyfMmlRNyr9JYtAYiofAma7fQ28w,2722
5
+ dfns_sdk/delegated_client.py,sha256=jqhmNGoBlXd_D7FzHdeVa4Y9iPaUWTu-jifYQM7ZGgs,4037
6
+ dfns_sdk/types.py,sha256=YwCItuhDMZOHAh2NqBN1vIVLtYA2-GZEIHFsJQDz25o,1980
7
+ dfns_sdk/_internal/__init__.py,sha256=3bjrRUeJFrYtJyP_jzLY96Vz7GaWksUAl4e7TSU12u8,123
8
+ dfns_sdk/_internal/http_client.py,sha256=J1Trm_w0TRdq3vNoUhFYJvOcD2NR5t67kE3emc9okt4,12459
9
+ dfns_sdk/generated/__init__.py,sha256=8soAjjLI61cxiaUXxrR4HUuHLmAsHixTuKF3bfp0Apw,1649
10
+ dfns_sdk/generated/agreements/__init__.py,sha256=Ydmb2bw1Z1HLdXkMjRG5TgjatPYCZVAvOeom8QQv7ls,216
11
+ dfns_sdk/generated/agreements/client.py,sha256=kwnsjzi1GEgNmDJUg5VrRUO7ZNGnAEtZ8Z8QF1Q27kg,1605
12
+ dfns_sdk/generated/agreements/delegated_client.py,sha256=Pp-g5bjhZbDz-tGeyEDZs3GfAUsWtOX9WSU5cr9YViQ,3001
13
+ dfns_sdk/generated/agreements/types.py,sha256=wt_ExoYCEaEXxXT0B7czbM2EP2RW1YqzxYHu6f9l5FY,673
14
+ dfns_sdk/generated/allocations/__init__.py,sha256=c_LvEK60ZcAHMF6grw5lXCItLaaaenwuc2P8Oh4Mf_0,221
15
+ dfns_sdk/generated/allocations/client.py,sha256=oKiyIJhmLIJKeSl5cPQDl1ttcgKszzltc4sJeyseDTs,3424
16
+ dfns_sdk/generated/allocations/delegated_client.py,sha256=rETRLOkGT9SBs828-Bs0Rri6XcA2SMFfVrtB2Ka20X8,6030
17
+ dfns_sdk/generated/allocations/types.py,sha256=XJtjQcAET6ysF2q8jR6fhTy5RXpnqduSFtrtwAvgyZA,1811
18
+ dfns_sdk/generated/auth/__init__.py,sha256=A97NTPmfMWtXNKKPhCL9c_SDQFvawRVaxko0SIamW-w,186
19
+ dfns_sdk/generated/auth/client.py,sha256=ajsQR9kLgn2fiH684CWyc51XrcTf20MTAZ2FVFj4D1g,41659
20
+ dfns_sdk/generated/auth/delegated_client.py,sha256=JOBP14seTHQEOD1Hu9GIreeKZcCxq3Ly02NWzvyDM2g,62964
21
+ dfns_sdk/generated/auth/types.py,sha256=6gneh7R4QoR6MDmu-23WWgMm2EXmP08yjgAT0cx192w,19804
22
+ dfns_sdk/generated/exchanges/__init__.py,sha256=XRKSeUE26Mt-CWLPx3I9Ysq-DsXAN7bcXb7d_Yd9UgU,211
23
+ dfns_sdk/generated/exchanges/client.py,sha256=WpvQ7Ybehtn1RMZqlMEZ0VjqinizS6Kc1XjFJhkYoKI,6486
24
+ dfns_sdk/generated/exchanges/delegated_client.py,sha256=GWvn4TyMyDDv5_kehIh_TN1lBR6G6VnIGdj-K_jyLFI,11720
25
+ dfns_sdk/generated/exchanges/types.py,sha256=icihRKgXr9m_PrvPw2tB3GTYt4Grrb4znUL7ckaElic,2634
26
+ dfns_sdk/generated/fee_sponsors/__init__.py,sha256=vjcT_ERyboUq94nh50aa5B3CrEcSVcenHyBdrn590fU,221
27
+ dfns_sdk/generated/fee_sponsors/client.py,sha256=_pVFu9rBFWn3N0QSZG5IQ_LFERRaOa0jZ6O4nqMUaYw,4925
28
+ dfns_sdk/generated/fee_sponsors/delegated_client.py,sha256=FzcytCZpOgPD6cxt0CxYjYD6NaiRF48o68nlorJT0K0,9343
29
+ dfns_sdk/generated/fee_sponsors/types.py,sha256=axa7P5FhFM9QAivcRts0656pCquDYpWrYwQ5HDz5ecc,2422
30
+ dfns_sdk/generated/keys/__init__.py,sha256=PX2cpn59WkzBIgg5GCD0CFI1efR3kZO8LK1I2c0ikDo,186
31
+ dfns_sdk/generated/keys/client.py,sha256=c71COrVoHv4ZICBvGPFrMmFa9s-hdEadaKU8umH5cy4,12266
32
+ dfns_sdk/generated/keys/delegated_client.py,sha256=wRsU-2e8wvDzo-fJNq7l1CYpLc0MNE3SBjXTUp8OaMI,16030
33
+ dfns_sdk/generated/keys/types.py,sha256=yh75Oqr5BOba9QyqP3OxuxHuCcLAJh_521UxWRhOvMg,9630
34
+ dfns_sdk/generated/networks/__init__.py,sha256=9_DAHLxDJ49h3rEdcY90mVHHNTCSwloS1AyHWDusWmU,206
35
+ dfns_sdk/generated/networks/client.py,sha256=3YWJOCsvkPebPZNSW6BoPHIqK_ppx2OgJH73IzHqjWE,5838
36
+ dfns_sdk/generated/networks/delegated_client.py,sha256=h-FykEl2Id_WfEbIaQKFoSmGVB9kaOk1kRyHF8Ju8qM,9477
37
+ dfns_sdk/generated/networks/types.py,sha256=PbTE5uFFgIekvabntZM7LnGcpKny_5fBlhxcRs9wOCE,2944
38
+ dfns_sdk/generated/permissions/__init__.py,sha256=GOqAukp6nloLUpTsIb2yf_nVLMXCKvf0uNNsLgVerrU,221
39
+ dfns_sdk/generated/permissions/client.py,sha256=2ssMzoUHilr4B5eiia9suEYxf_uA-iKpmekPsXAxDmU,5784
40
+ dfns_sdk/generated/permissions/delegated_client.py,sha256=rrzJorRzppQCYOjPOdbAdEB073m2zCMeATaMnJCUXLY,11662
41
+ dfns_sdk/generated/permissions/types.py,sha256=nGBc2LG5vgxr3JKqQeqzLUgY1UFwvsXdY73c-FQ7u50,8316
42
+ dfns_sdk/generated/policies/__init__.py,sha256=qO6-1InMycXnFWsDBt_PMOVglybZjVNBA2twd4tBiBY,206
43
+ dfns_sdk/generated/policies/client.py,sha256=p6UnzNuu0_g5ofh78F0W0GJm7-P619wVRY8w3TZ3vB4,5472
44
+ dfns_sdk/generated/policies/delegated_client.py,sha256=dBjaDWc1MEsfd3cLQ7DKGciMvU6dW3wQF4G6N1lcvI8,9550
45
+ dfns_sdk/generated/policies/types.py,sha256=3NY_0ZGpBpBZfBXq9BNqNzraTH5xmusv_KyqqevEM7g,2090
46
+ dfns_sdk/generated/signers/__init__.py,sha256=qgXrd3jln5xLeLarvZvS7m9uL8XVauZejk8Fyg3R750,201
47
+ dfns_sdk/generated/signers/client.py,sha256=LhJr_szT2AlNE50Sl0nt4yac9U0VpfIXSnNkgTMFFpY,1102
48
+ dfns_sdk/generated/signers/delegated_client.py,sha256=dCBtk4Uw6LH0bfHqhqdeHgsSs9eQvz4eFOggffTLbkg,1423
49
+ dfns_sdk/generated/signers/types.py,sha256=BIPiPiUtaYSJIhEOJkgMHx72CR2A6jt4uVzl2cWmx10,341
50
+ dfns_sdk/generated/staking/__init__.py,sha256=a7PWHFgvXixvn5zK9C2vXX0iLoIRnvqDH78fYMtxhVE,201
51
+ dfns_sdk/generated/staking/client.py,sha256=L29rubkabhRt83gdfS5pOGIjBiTzI5zxw4_g12L6yQ8,3818
52
+ dfns_sdk/generated/staking/delegated_client.py,sha256=iPYARaGWgzxyVwdMxlg2NXRvje6YJlNHxv8_lk1N81A,6363
53
+ dfns_sdk/generated/staking/types.py,sha256=2yVvckLrQzGX0cDXX_w6BujhZQGjXs5GgEvm_FGixPs,1625
54
+ dfns_sdk/generated/swaps/__init__.py,sha256=r4CZwNFnQp37K-rQDgieehsXih7ULY54Avb-IkHubhA,191
55
+ dfns_sdk/generated/swaps/client.py,sha256=9Rf_J40WX2R7s_MmT4l_okOH6J1OjAjOLwgtEA7qM_8,3190
56
+ dfns_sdk/generated/swaps/delegated_client.py,sha256=Kh8e4WryOUqZfm5IOhIt2jHLaHF9sFmqaT0lrMKEwfY,4425
57
+ dfns_sdk/generated/swaps/types.py,sha256=9bQ5UGlM7VYLuqTymI5mjrPU89WDZis-1YNAhrKCsYc,2735
58
+ dfns_sdk/generated/wallets/__init__.py,sha256=uagPUuhF3qCwDwbacg692s9waP80Bpkpyh0Msc_CgP8,201
59
+ dfns_sdk/generated/wallets/client.py,sha256=59O6S7881gWrZ6Az7ZdGuBIur8tmTom8KEk2R028KhM,28770
60
+ dfns_sdk/generated/wallets/delegated_client.py,sha256=HMYOAA9jD-9Y1oGvSa5B3z2rNuCXkCrwlI8CBc2te-o,40604
61
+ dfns_sdk/generated/wallets/types.py,sha256=4SOqIZaC2c9xDqeb_qAbIiWe9sGYRGqF9ZKYHwwpYR0,49586
62
+ dfns_sdk/generated/webhooks/__init__.py,sha256=emS73MMdbYNzeeTqneszCPM8DrBkoMQ8QzhZVvHtd6o,206
63
+ dfns_sdk/generated/webhooks/client.py,sha256=SYamVxkblk0zNpBNCrxmOSC_upoaqnGmdAHrHBxf8_k,5962
64
+ dfns_sdk/generated/webhooks/delegated_client.py,sha256=pkT9s5re4jSZlpzhm3rbJaAtPT6bg6RBCEgCU9qskgk,10373
65
+ dfns_sdk/generated/webhooks/types.py,sha256=MwiHLPQNyGc1A41q2ubaPweRz0FmLTbjLBSjCzQMZqQ,8036
66
+ dfns_sdk-0.0.0.dev0.dist-info/METADATA,sha256=bipnMFaTyYlQgLdK714YaMymtPvXllDp12iKGyQwY2Y,5211
67
+ dfns_sdk-0.0.0.dev0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
68
+ dfns_sdk-0.0.0.dev0.dist-info/licenses/LICENSE,sha256=CN73yx-Wis-FNVmAWjK1BbzjuHDJ6ityv6RtszrZj_I,1061
69
+ dfns_sdk-0.0.0.dev0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.28.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Dfns
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.