datamule 1.6.9__tar.gz → 1.7.1__tar.gz

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 (78) hide show
  1. {datamule-1.6.9 → datamule-1.7.1}/PKG-INFO +1 -1
  2. {datamule-1.6.9 → datamule-1.7.1}/datamule/__init__.py +2 -1
  3. datamule-1.7.1/datamule/seclibrary/datamule_lookup.py +236 -0
  4. {datamule-1.6.9 → datamule-1.7.1}/datamule/sheet.py +9 -0
  5. {datamule-1.6.9 → datamule-1.7.1}/datamule.egg-info/PKG-INFO +1 -1
  6. {datamule-1.6.9 → datamule-1.7.1}/datamule.egg-info/SOURCES.txt +1 -3
  7. {datamule-1.6.9 → datamule-1.7.1}/setup.py +1 -1
  8. datamule-1.6.9/datamule/document/mappings_new/mappings.py +0 -13
  9. datamule-1.6.9/datamule/document/mappings_new/ownership.py +0 -174
  10. datamule-1.6.9/datamule/utils/__init__.py +0 -0
  11. {datamule-1.6.9 → datamule-1.7.1}/datamule/config.py +0 -0
  12. {datamule-1.6.9 → datamule-1.7.1}/datamule/data/listed_filer_metadata.csv +0 -0
  13. {datamule-1.6.9 → datamule-1.7.1}/datamule/datamule/__init__.py +0 -0
  14. {datamule-1.6.9 → datamule-1.7.1}/datamule/datamule/sec_connector.py +0 -0
  15. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/__init__.py +0 -0
  16. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/document.py +0 -0
  17. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/__init__.py +0 -0
  18. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/atsn.py +0 -0
  19. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/cfportal.py +0 -0
  20. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/d.py +0 -0
  21. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/ex102_abs.py +0 -0
  22. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/ex99a_sdr.py +0 -0
  23. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/ex99c_sdr.py +0 -0
  24. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/ex99g_sdr.py +0 -0
  25. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/ex99i_sdr.py +0 -0
  26. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/information_table.py +0 -0
  27. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/nmfp.py +0 -0
  28. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/npx.py +0 -0
  29. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/onefourtyfour.py +0 -0
  30. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/ownership.py +0 -0
  31. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/proxy_voting_record.py +0 -0
  32. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/sbs.py +0 -0
  33. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/sbsef.py +0 -0
  34. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/schedule13.py +0 -0
  35. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/sdr.py +0 -0
  36. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/submission_metadata.py +0 -0
  37. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/ta.py +0 -0
  38. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/thirteenfhr.py +0 -0
  39. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/twentyfivense.py +0 -0
  40. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/mappings/twentyfourf2nt.py +0 -0
  41. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/processing.py +0 -0
  42. {datamule-1.6.9 → datamule-1.7.1}/datamule/document/table.py +0 -0
  43. {datamule-1.6.9 → datamule-1.7.1}/datamule/helper.py +0 -0
  44. {datamule-1.6.9 → datamule-1.7.1}/datamule/index.py +0 -0
  45. {datamule-1.6.9/datamule/document/mappings_new → datamule-1.7.1/datamule/mapping_dicts}/__init__.py +0 -0
  46. {datamule-1.6.9 → datamule-1.7.1}/datamule/mapping_dicts/html_mapping_dicts.py +0 -0
  47. {datamule-1.6.9 → datamule-1.7.1}/datamule/mapping_dicts/txt_mapping_dicts.py +0 -0
  48. {datamule-1.6.9 → datamule-1.7.1}/datamule/mapping_dicts/xml_mapping_dicts.py +0 -0
  49. {datamule-1.6.9 → datamule-1.7.1}/datamule/package_updater.py +0 -0
  50. {datamule-1.6.9 → datamule-1.7.1}/datamule/portfolio.py +0 -0
  51. {datamule-1.6.9 → datamule-1.7.1}/datamule/portfolio_compression_utils.py +0 -0
  52. {datamule-1.6.9/datamule/mapping_dicts → datamule-1.7.1/datamule/sec}/__init__.py +0 -0
  53. {datamule-1.6.9/datamule/sec → datamule-1.7.1/datamule/sec/infrastructure}/__init__.py +0 -0
  54. {datamule-1.6.9 → datamule-1.7.1}/datamule/sec/infrastructure/submissions_metadata.py +0 -0
  55. {datamule-1.6.9/datamule/sec/infrastructure → datamule-1.7.1/datamule/sec/submissions}/__init__.py +0 -0
  56. {datamule-1.6.9 → datamule-1.7.1}/datamule/sec/submissions/downloader.py +0 -0
  57. {datamule-1.6.9 → datamule-1.7.1}/datamule/sec/submissions/eftsquery.py +0 -0
  58. {datamule-1.6.9 → datamule-1.7.1}/datamule/sec/submissions/monitor.py +0 -0
  59. {datamule-1.6.9 → datamule-1.7.1}/datamule/sec/submissions/streamer.py +0 -0
  60. {datamule-1.6.9 → datamule-1.7.1}/datamule/sec/submissions/textsearch.py +0 -0
  61. {datamule-1.6.9 → datamule-1.7.1}/datamule/sec/utils.py +0 -0
  62. {datamule-1.6.9/datamule/sec/submissions → datamule-1.7.1/datamule/sec/xbrl}/__init__.py +0 -0
  63. {datamule-1.6.9 → datamule-1.7.1}/datamule/sec/xbrl/downloadcompanyfacts.py +0 -0
  64. {datamule-1.6.9 → datamule-1.7.1}/datamule/sec/xbrl/filter_xbrl.py +0 -0
  65. {datamule-1.6.9 → datamule-1.7.1}/datamule/sec/xbrl/streamcompanyfacts.py +0 -0
  66. {datamule-1.6.9 → datamule-1.7.1}/datamule/sec/xbrl/xbrlmonitor.py +0 -0
  67. {datamule-1.6.9/datamule/sec/xbrl → datamule-1.7.1/datamule/seclibrary}/__init__.py +0 -0
  68. {datamule-1.6.9 → datamule-1.7.1}/datamule/seclibrary/bq.py +0 -0
  69. {datamule-1.6.9 → datamule-1.7.1}/datamule/seclibrary/downloader.py +0 -0
  70. {datamule-1.6.9 → datamule-1.7.1}/datamule/seclibrary/query.py +0 -0
  71. {datamule-1.6.9 → datamule-1.7.1}/datamule/submission.py +0 -0
  72. {datamule-1.6.9/datamule/seclibrary → datamule-1.7.1/datamule/utils}/__init__.py +0 -0
  73. {datamule-1.6.9 → datamule-1.7.1}/datamule/utils/construct_submissions_data.py +0 -0
  74. {datamule-1.6.9 → datamule-1.7.1}/datamule/utils/format_accession.py +0 -0
  75. {datamule-1.6.9 → datamule-1.7.1}/datamule.egg-info/dependency_links.txt +0 -0
  76. {datamule-1.6.9 → datamule-1.7.1}/datamule.egg-info/requires.txt +0 -0
  77. {datamule-1.6.9 → datamule-1.7.1}/datamule.egg-info/top_level.txt +0 -0
  78. {datamule-1.6.9 → datamule-1.7.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: datamule
3
- Version: 1.6.9
3
+ Version: 1.7.1
4
4
  Summary: Work with SEC submissions at scale.
5
5
  Home-page: https://github.com/john-friedman/datamule-python
6
6
  Author: John Friedman
@@ -6,7 +6,8 @@ from .config import Config
6
6
  from .sheet import Sheet
7
7
  from .index import Index
8
8
  from .package_updater import PackageUpdater
9
-
9
+ from .utils.format_accession import format_accession
10
+ from .utils.construct_submissions_data import construct_submissions_data
10
11
 
11
12
 
12
13
  # Keep the notebook environment setup
@@ -0,0 +1,236 @@
1
+ import os
2
+ import asyncio
3
+ import aiohttp
4
+ import urllib.parse
5
+ import ssl
6
+ import json
7
+ import time
8
+ from tqdm import tqdm
9
+
10
+ class DatamuleLookup:
11
+ def __init__(self, api_key=None):
12
+ self.API_BASE_URL = "https://datamule-lookup.jgfriedman99.workers.dev/"
13
+ self._api_key = api_key
14
+ self.total_cost = 0
15
+ self.remaining_balance = None
16
+ self.start_time = None
17
+
18
+ @property
19
+ def api_key(self):
20
+ return getattr(self, '_api_key', None) or os.getenv('DATAMULE_API_KEY')
21
+
22
+ @api_key.setter
23
+ def api_key(self, value):
24
+ if not value:
25
+ raise ValueError("API key cannot be empty")
26
+ self._api_key = value
27
+
28
+ async def _fetch_page(self, session, cik=None, accession_number=None, submission_type=None,
29
+ filing_date=None, columns=None, distinct=False, page=1, page_size=25000):
30
+ params = {
31
+ 'api_key': self.api_key,
32
+ 'page': page,
33
+ 'pageSize': page_size
34
+ }
35
+
36
+ # Handle CIK parameter
37
+ if cik:
38
+ if isinstance(cik, list):
39
+ params['cik'] = ','.join(str(x) for x in cik)
40
+ else:
41
+ params['cik'] = str(cik)
42
+
43
+ # Handle accession number parameter
44
+ if accession_number:
45
+ if isinstance(accession_number, list):
46
+ params['accessionNumber'] = ','.join(str(x) for x in accession_number)
47
+ else:
48
+ params['accessionNumber'] = str(accession_number)
49
+
50
+ # Handle submission_type parameter
51
+ if submission_type:
52
+ if isinstance(submission_type, list):
53
+ params['submissionType'] = ','.join(str(x) for x in submission_type)
54
+ else:
55
+ params['submissionType'] = str(submission_type)
56
+
57
+ # Handle filing_date parameter
58
+ if filing_date:
59
+ if isinstance(filing_date, tuple):
60
+ params['startDate'] = str(filing_date[0])
61
+ params['endDate'] = str(filing_date[1])
62
+ else:
63
+ if isinstance(filing_date, list):
64
+ params['filingDate'] = ','.join(str(x) for x in filing_date)
65
+ else:
66
+ params['filingDate'] = str(filing_date)
67
+
68
+ # Handle columns parameter
69
+ if columns:
70
+ if isinstance(columns, list):
71
+ params['columns'] = ','.join(columns)
72
+ else:
73
+ params['columns'] = str(columns)
74
+
75
+ # Handle distinct parameter
76
+ if distinct:
77
+ params['distinct'] = 'true'
78
+
79
+ url = f"{self.API_BASE_URL}?{urllib.parse.urlencode(params)}"
80
+
81
+ async with session.get(url) as response:
82
+ data = await response.json()
83
+ if not data.get('success'):
84
+ raise ValueError(f"API request failed: {data.get('error')}")
85
+
86
+ # Track costs and balance
87
+ billing = data['metadata']['billing']
88
+ page_cost = billing['total_charge']
89
+ self.total_cost += page_cost
90
+ self.remaining_balance = billing['remaining_balance']
91
+
92
+ return data['data'], data['metadata']['pagination'], page_cost
93
+
94
+ async def execute_query(self, cik=None, accession_number=None, submission_type=None,
95
+ filing_date=None, columns=None, distinct=False, page_size=25000, quiet=False):
96
+ if self.api_key is None:
97
+ raise ValueError("No API key found. Please set DATAMULE_API_KEY environment variable or provide api_key in constructor")
98
+
99
+ self.start_time = time.time()
100
+ total_items = 0
101
+ pages_processed = 0
102
+
103
+ # Display query parameters
104
+ query_desc = []
105
+ if cik:
106
+ query_desc.append(f"CIK={cik}")
107
+ if accession_number:
108
+ query_desc.append(f"Accession={accession_number}")
109
+ if submission_type:
110
+ query_desc.append(f"Type={submission_type}")
111
+ if filing_date:
112
+ if isinstance(filing_date, tuple):
113
+ query_desc.append(f"Date={filing_date[0]} to {filing_date[1]}")
114
+ else:
115
+ query_desc.append(f"Date={filing_date}")
116
+ if columns:
117
+ query_desc.append(f"Columns={columns}")
118
+ if distinct:
119
+ query_desc.append("DISTINCT=True")
120
+
121
+ if query_desc and not quiet:
122
+ print(f"QUERY: {', '.join(query_desc)}")
123
+
124
+ connector = aiohttp.TCPConnector(ssl=ssl.create_default_context())
125
+ async with aiohttp.ClientSession(connector=connector) as session:
126
+ # Initialize progress bar only if not quiet
127
+ if not quiet:
128
+ pbar = tqdm(unit="page", bar_format="{desc}: {n_fmt} {unit} [{elapsed}<{remaining}, {rate_fmt}{postfix}]")
129
+ pbar.set_description("Fetching data")
130
+
131
+ current_page = 1
132
+ has_more = True
133
+ results = []
134
+
135
+ while has_more:
136
+ # Fetch page
137
+ page_results, pagination, page_cost = await self._fetch_page(
138
+ session,
139
+ cik=cik,
140
+ accession_number=accession_number,
141
+ submission_type=submission_type,
142
+ filing_date=filing_date,
143
+ columns=columns,
144
+ distinct=distinct,
145
+ page=current_page,
146
+ page_size=page_size
147
+ )
148
+
149
+ # Accumulate results
150
+ results.extend(page_results)
151
+
152
+ pages_processed += 1
153
+ total_items += len(page_results)
154
+
155
+ # Update progress bar only if not quiet
156
+ if not quiet:
157
+ pbar.set_description(f"Fetching data (page {current_page})")
158
+ pbar.set_postfix_str(f"cost=${self.total_cost:.4f} | balance=${self.remaining_balance:.2f}")
159
+ pbar.update(1)
160
+
161
+ # Check if we need to fetch more pages
162
+ has_more = pagination.get('hasMore', False)
163
+ current_page += 1
164
+
165
+ # For the first page, display record info only if not quiet
166
+ if pages_processed == 1 and not quiet:
167
+ records_per_page = pagination.get('currentPageRecords', len(page_results))
168
+ if records_per_page > 0:
169
+ pbar.write(f"Retrieved {records_per_page} records (page 1) - Fetching additional pages...")
170
+ else:
171
+ pbar.write("No records found matching criteria")
172
+ break
173
+
174
+ if not quiet:
175
+ pbar.close()
176
+
177
+ # Final summary only if not quiet
178
+ if not quiet:
179
+ elapsed_time = time.time() - self.start_time
180
+ print("\nQuery complete:")
181
+ print(f"- Retrieved {total_items} records across {pages_processed} pages")
182
+ print(f"- Total cost: ${self.total_cost:.4f}")
183
+ print(f"- Remaining balance: ${self.remaining_balance:.2f}")
184
+ print(f"- Time: {elapsed_time:.1f} seconds")
185
+
186
+ return results
187
+
188
+
189
+ def datamule_lookup(cik=None, accession_number=None, submission_type=None, filing_date=None,
190
+ columns=None, distinct=False, page_size=25000, quiet=False, api_key=None):
191
+ """
192
+ Query SEC filing data from Datamule with optional filtering
193
+
194
+ Parameters:
195
+ - cik: Company CIK number(s), can be string, int, or list
196
+ - accession_number: Accession number(s), can be string or list
197
+ - submission_type: Filing type(s), can be string or list (e.g., '10-K', ['10-K', '10-Q'])
198
+ - filing_date: Filing date(s), can be string, list, or tuple of (start_date, end_date)
199
+ - columns: Column(s) to return, can be string or list. Options: 'accessionNumber', 'cik', 'filingDate', 'submissionType'
200
+ - distinct: Boolean, whether to return distinct results only
201
+ - page_size: Number of records per page (max 25000)
202
+ - quiet: Boolean, whether to suppress progress output and summary
203
+ - api_key: Optional API key (can also use DATAMULE_API_KEY environment variable)
204
+
205
+ Returns:
206
+ - List of dictionaries containing the requested data (ready for pandas DataFrame)
207
+ """
208
+ # Create a DatamuleLookup instance for this request
209
+ dl = DatamuleLookup(api_key=api_key)
210
+
211
+ # Format dates by removing dashes if present
212
+ if isinstance(filing_date, tuple):
213
+ filing_date = (filing_date[0].replace('-', ''), filing_date[1].replace('-', ''))
214
+ elif isinstance(filing_date, str):
215
+ filing_date = filing_date.replace('-', '')
216
+ elif isinstance(filing_date, list):
217
+ filing_date = [x.replace('-', '') for x in filing_date]
218
+
219
+ # Set default columns if none specified
220
+ if columns is None:
221
+ columns = ['accessionNumber', 'cik', 'filingDate', 'submissionType']
222
+
223
+ # Validate page_size
224
+ page_size = min(max(1, page_size), 25000)
225
+
226
+ # Run the query and return results
227
+ return asyncio.run(dl.execute_query(
228
+ cik=cik,
229
+ accession_number=accession_number,
230
+ submission_type=submission_type,
231
+ filing_date=filing_date,
232
+ columns=columns,
233
+ distinct=distinct,
234
+ page_size=page_size,
235
+ quiet=quiet
236
+ ))
@@ -3,12 +3,21 @@ import csv
3
3
  import os
4
4
  from .helper import _process_cik_and_metadata_filters, load_package_dataset
5
5
  from .sec.xbrl.downloadcompanyfacts import download_company_facts
6
+ from .seclibrary.datamule_lookup import datamule_lookup
7
+
8
+ # slated for deprecation?
6
9
  from .seclibrary.bq import get_information_table, get_345, get_proxy_voting_record
7
10
 
8
11
  class Sheet:
9
12
  def __init__(self, path):
10
13
  self.path = Path(path)
11
14
 
15
+ def get_submissions(self,cik=None, accession_number=None, submission_type=None, filing_date=None,
16
+ columns=None, distinct=False, page_size=25000, quiet=False, api_key=None):
17
+
18
+ return datamule_lookup(cik, accession_number, submission_type, filing_date,
19
+ columns, distinct, page_size, quiet, api_key)
20
+
12
21
  def download_xbrl(
13
22
  self,
14
23
  cik=None,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: datamule
3
- Version: 1.6.9
3
+ Version: 1.7.1
4
4
  Summary: Work with SEC submissions at scale.
5
5
  Home-page: https://github.com/john-friedman/datamule-python
6
6
  Author: John Friedman
@@ -44,9 +44,6 @@ datamule/document/mappings/ta.py
44
44
  datamule/document/mappings/thirteenfhr.py
45
45
  datamule/document/mappings/twentyfivense.py
46
46
  datamule/document/mappings/twentyfourf2nt.py
47
- datamule/document/mappings_new/__init__.py
48
- datamule/document/mappings_new/mappings.py
49
- datamule/document/mappings_new/ownership.py
50
47
  datamule/mapping_dicts/__init__.py
51
48
  datamule/mapping_dicts/html_mapping_dicts.py
52
49
  datamule/mapping_dicts/txt_mapping_dicts.py
@@ -68,6 +65,7 @@ datamule/sec/xbrl/streamcompanyfacts.py
68
65
  datamule/sec/xbrl/xbrlmonitor.py
69
66
  datamule/seclibrary/__init__.py
70
67
  datamule/seclibrary/bq.py
68
+ datamule/seclibrary/datamule_lookup.py
71
69
  datamule/seclibrary/downloader.py
72
70
  datamule/seclibrary/query.py
73
71
  datamule/utils/__init__.py
@@ -32,7 +32,7 @@ if not os.path.exists(file_path):
32
32
  setup(
33
33
  name="datamule",
34
34
  author="John Friedman",
35
- version="1.6.9",
35
+ version="1.7.1",
36
36
  description="Work with SEC submissions at scale.",
37
37
  packages=find_packages(include=['datamule', 'datamule.*']),
38
38
  url="https://github.com/john-friedman/datamule-python",
@@ -1,13 +0,0 @@
1
- import ownership
2
-
3
-
4
- # key is document type
5
- # note: this assumes XML format.
6
- table_mappings = {
7
- '3' : ownership.mappings,
8
- '3/A' : ownership.mappings,
9
- '4' : ownership.mappings,
10
- '4/A' : ownership.mappings,
11
- '5' : ownership.mappings,
12
- '5/A' : ownership.mappings,
13
- }
@@ -1,174 +0,0 @@
1
-
2
-
3
-
4
- # Non-derivative transaction ownership mapping
5
- ownership_non_derivative_transactions_dict = {
6
- 'securityTitle_value': 'securityTitle',
7
- 'securityTitle_footnote': 'securityTitleFootnote',
8
- 'transactionDate_value': 'transactionDate',
9
- 'transactionDate_footnote': 'transactionDateFootnote',
10
- 'deemedExecutionDate_value': 'deemedExecutionDate',
11
- 'deemedExecutionDate_footnote': 'deemedExecutionDateFootnote',
12
- 'transactionCoding_transactionFormType': 'transactionFormType',
13
- 'transactionCoding_transactionCode': 'transactionCode',
14
- 'transactionCoding_equitySwapInvolved': 'equitySwapInvolved',
15
- 'transactionCoding_footnote': 'transactionCodingFootnote',
16
- 'transactionAmounts_transactionShares_value': 'transactionShares',
17
- 'transactionAmounts_transactionShares_footnote': 'transactionSharesFootnote',
18
- 'transactionAmounts_transactionPricePerShare_value': 'transactionPricePerShare',
19
- 'transactionAmounts_transactionPricePerShare_footnote': 'transactionPricePerShareFootnote',
20
- 'transactionAmounts_transactionAcquiredDisposedCode_value': 'transactionAcquiredDisposedCode',
21
- 'transactionAmounts_transactionAcquiredDisposedCode_footnote': 'transactionAcquiredDisposedCodeFootnote',
22
- 'postTransactionAmounts_sharesOwnedFollowingTransaction_value': 'sharesOwnedFollowingTransaction',
23
- 'postTransactionAmounts_sharesOwnedFollowingTransaction_footnote': 'sharesOwnedFollowingTransactionFootnote',
24
- 'ownershipNature_directOrIndirectOwnership_value': 'directOrIndirectOwnership',
25
- 'ownershipNature_directOrIndirectOwnership_footnote': 'directOrIndirectOwnershipFootnote',
26
- 'ownershipNature_natureOfOwnership_value': 'natureOfOwnership',
27
- 'ownershipNature_natureOfOwnership_footnote': 'natureOfOwnershipFootnote',
28
- 'transactionTimeliness_value': 'transactionTimeliness',
29
- 'transactionTimeliness_footnote': 'transactionTimelinessFootnote',
30
- 'postTransactionAmounts_valueOwnedFollowingTransaction_value': 'valueOwnedFollowingTransaction',
31
- 'postTransactionAmounts_valueOwnedFollowingTransaction_footnote': 'valueOwnedFollowingTransactionFootnote'
32
- }
33
-
34
- # Derivative transaction ownership mapping
35
- derivative_transaction_ownership_dict = {
36
- 'securityTitle_value': 'securityTitle',
37
- 'securityTitle_footnote': 'securityTitleFootnote',
38
- 'conversionOrExercisePrice_value': 'conversionOrExercisePrice',
39
- 'conversionOrExercisePrice_footnote': 'conversionOrExercisePriceFootnote',
40
- 'transactionDate_value': 'transactionDate',
41
- 'transactionDate_footnote': 'transactionDateFootnote',
42
- 'deemedExecutionDate_value': 'deemedExecutionDate',
43
- 'deemedExecutionDate_footnote': 'deemedExecutionDateFootnote',
44
- 'transactionCoding_transactionFormType': 'transactionFormType',
45
- 'transactionCoding_transactionCode': 'transactionCode',
46
- 'transactionCoding_equitySwapInvolved': 'equitySwapInvolved',
47
- 'transactionCoding_footnote': 'transactionCodingFootnote',
48
- 'transactionAmounts_transactionShares_value': 'transactionShares',
49
- 'transactionAmounts_transactionShares_footnote': 'transactionSharesFootnote',
50
- 'transactionAmounts_transactionPricePerShare_value': 'transactionPricePerShare',
51
- 'transactionAmounts_transactionPricePerShare_footnote': 'transactionPricePerShareFootnote',
52
- 'transactionAmounts_transactionAcquiredDisposedCode_value': 'transactionAcquiredDisposedCode',
53
- 'transactionAmounts_transactionTotalValue_value': 'transactionTotalValue',
54
- 'transactionAmounts_transactionTotalValue_footnote': 'transactionTotalValueFootnote',
55
- 'exerciseDate_value': 'exerciseDate',
56
- 'exerciseDate_footnote': 'exerciseDateFootnote',
57
- 'expirationDate_value': 'expirationDate',
58
- 'expirationDate_footnote': 'expirationDateFootnote',
59
- 'underlyingSecurity_underlyingSecurityTitle_value': 'underlyingSecurityTitle',
60
- 'underlyingSecurity_underlyingSecurityTitle_footnote': 'underlyingSecurityTitleFootnote',
61
- 'underlyingSecurity_underlyingSecurityShares_value': 'underlyingSecurityShares',
62
- 'underlyingSecurity_underlyingSecurityShares_footnote': 'underlyingSecuritySharesFootnote',
63
- 'underlyingSecurity_underlyingSecurityValue_value': 'underlyingSecurityValue',
64
- 'postTransactionAmounts_sharesOwnedFollowingTransaction_value': 'sharesOwnedFollowingTransaction',
65
- 'postTransactionAmounts_sharesOwnedFollowingTransaction_footnote': 'sharesOwnedFollowingTransactionFootnote',
66
- 'ownershipNature_directOrIndirectOwnership_value': 'directOrIndirectOwnership',
67
- 'ownershipNature_directOrIndirectOwnership_footnote': 'directOrIndirectOwnershipFootnote',
68
- 'ownershipNature_natureOfOwnership_value': 'natureOfOwnership',
69
- 'ownershipNature_natureOfOwnership_footnote': 'natureOfOwnershipFootnote',
70
- 'transactionTimeliness_value': 'transactionTimeliness',
71
- 'transactionTimeliness_footnote': 'transactionTimelinessFootnote',
72
- 'postTransactionAmounts_valueOwnedFollowingTransaction_value': 'valueOwnedFollowingTransaction',
73
- 'postTransactionAmounts_valueOwnedFollowingTransaction_footnote': 'valueOwnedFollowingTransactionFootnote',
74
- 'transactionAmounts_transactionAcquiredDisposedCode_footnote': 'transactionAcquiredDisposedCodeFootnote',
75
- 'underlyingSecurity_underlyingSecurityValue_footnote': 'underlyingSecurityValueFootnote'
76
- }
77
-
78
- # Non-derivative holding ownership mapping
79
- non_derivative_holding_ownership_dict = {
80
- 'securityTitle_value': 'securityTitle',
81
- 'securityTitle_footnote': 'securityTitleFootnote',
82
- 'postTransactionAmounts_sharesOwnedFollowingTransaction_value': 'sharesOwnedFollowingTransaction',
83
- 'postTransactionAmounts_sharesOwnedFollowingTransaction_footnote': 'sharesOwnedFollowingTransactionFootnote',
84
- 'ownershipNature_directOrIndirectOwnership_value': 'directOrIndirectOwnership',
85
- 'ownershipNature_directOrIndirectOwnership_footnote': 'directOrIndirectOwnershipFootnote',
86
- 'ownershipNature_natureOfOwnership_value': 'natureOfOwnership',
87
- 'ownershipNature_natureOfOwnership_footnote': 'natureOfOwnershipFootnote',
88
- 'postTransactionAmounts_valueOwnedFollowingTransaction_value': 'valueOwnedFollowingTransaction',
89
- 'transactionCoding_footnote': 'transactionCodingFootnote',
90
- 'transactionCoding_transactionFormType': 'transactionFormType',
91
- 'postTransactionAmounts_valueOwnedFollowingTransaction_footnote': 'valueOwnedFollowingTransactionFootnote'
92
- }
93
-
94
- # Derivative holding ownership mapping
95
- derivative_holding_ownership_dict = {
96
- 'securityTitle_value': 'securityTitle',
97
- 'securityTitle_footnote': 'securityTitleFootnote',
98
- 'conversionOrExercisePrice_value': 'conversionOrExercisePrice',
99
- 'conversionOrExercisePrice_footnote': 'conversionOrExercisePriceFootnote',
100
- 'exerciseDate_value': 'exerciseDate',
101
- 'exerciseDate_footnote': 'exerciseDateFootnote',
102
- 'expirationDate_value': 'expirationDate',
103
- 'expirationDate_footnote': 'expirationDateFootnote',
104
- 'underlyingSecurity_underlyingSecurityTitle_value': 'underlyingSecurityTitle',
105
- 'underlyingSecurity_underlyingSecurityTitle_footnote': 'underlyingSecurityTitleFootnote',
106
- 'underlyingSecurity_underlyingSecurityShares_value': 'underlyingSecurityShares',
107
- 'underlyingSecurity_underlyingSecurityShares_footnote': 'underlyingSecuritySharesFootnote',
108
- 'underlyingSecurity_underlyingSecurityValue_value': 'underlyingSecurityValue',
109
- 'underlyingSecurity_underlyingSecurityValue_footnote': 'underlyingSecurityValueFootnote',
110
- 'ownershipNature_directOrIndirectOwnership_value': 'directOrIndirectOwnership',
111
- 'ownershipNature_directOrIndirectOwnership_footnote': 'directOrIndirectOwnershipFootnote',
112
- 'ownershipNature_natureOfOwnership_value': 'natureOfOwnership',
113
- 'ownershipNature_natureOfOwnership_footnote': 'natureOfOwnershipFootnote',
114
- 'postTransactionAmounts_sharesOwnedFollowingTransaction_value': 'sharesOwnedFollowingTransaction',
115
- 'postTransactionAmounts_sharesOwnedFollowingTransaction_footnote': 'sharesOwnedFollowingTransactionFootnote',
116
- 'postTransactionAmounts_valueOwnedFollowingTransaction_value': 'valueOwnedFollowingTransaction',
117
- 'postTransactionAmounts_valueOwnedFollowingTransaction_footnote': 'valueOwnedFollowingTransactionFootnote',
118
- 'transactionCoding_transactionFormType': 'transactionFormType',
119
- 'transactionCoding_footnote': 'transactionCodingFootnote'
120
- }
121
-
122
- # Reporting owner ownership mapping
123
- reporting_owner_ownership_dict = {
124
- 'reportingOwnerAddress_rptOwnerCity': 'rptOwnerCity',
125
- 'reportingOwnerAddress_rptOwnerState': 'rptOwnerState',
126
- 'reportingOwnerAddress_rptOwnerStateDescription': 'rptOwnerStateDescription',
127
- 'reportingOwnerAddress_rptOwnerStreet1': 'rptOwnerStreet1',
128
- 'reportingOwnerAddress_rptOwnerStreet2': 'rptOwnerStreet2',
129
- 'reportingOwnerAddress_rptOwnerZipCode': 'rptOwnerZipCode',
130
- 'reportingOwnerId_rptOwnerCik': 'rptOwnerCik',
131
- 'reportingOwnerId_rptOwnerName': 'rptOwnerName',
132
- 'reportingOwnerRelationship_isDirector': 'rptOwnerIsDirector',
133
- 'reportingOwnerRelationship_isOfficer': 'rptOwnerIsOfficer',
134
- 'reportingOwnerRelationship_isTenPercentOwner': 'rptOwnerIsTenPercentOwner',
135
- 'reportingOwnerRelationship_isOther': 'rptOwnerIsOther',
136
- 'reportingOwnerRelationship_officerTitle': 'rptOwnerOfficerTitle',
137
- 'reportingOwnerRelationship_otherText': 'rptOwnerOtherText'
138
- }
139
-
140
- # Metadata ownership mapping
141
- metadata_ownership_dict = {
142
- 'periodOfReport': 'periodOfReport',
143
- 'issuer_issuerCik': 'issuerCik',
144
- 'issuer_issuerName': 'issuerName',
145
- 'issuer_issuerTradingSymbol': 'issuerTradingSymbol',
146
- 'documentType': 'documentType',
147
- 'remarks': 'remarks',
148
- 'documentDescription': 'documentDescription',
149
- 'footnotes': 'footnotes',
150
- 'notSubjectToSection16': 'notSubjectToSection16',
151
- 'form3HoldingsReported': 'form3HoldingsReported',
152
- 'form4TransactionsReported': 'form4TransactionsReported',
153
- 'noSecuritiesOwned': 'noSecuritiesOwned',
154
- 'aff10b5One': 'aff10b5One',
155
- 'dateOfOriginalSubmission': 'dateOfOriginalSubmission',
156
- 'schemaVersion': 'schemaVersion'
157
- }
158
-
159
- # Owner signature ownership mapping
160
- owner_signature_ownership_dict = {
161
- 'signatureName': 'signatureName',
162
- 'signatureDate': 'signatureDate'
163
- }
164
-
165
-
166
- mappings = {
167
- 'ownership_non_derivative_transactions' : ownership_non_derivative_transactions_dict,
168
- 'ownership_derivative_transactions' : derivative_transaction_ownership_dict,
169
- 'ownership_non_derivative_holdings' : non_derivative_holding_ownership_dict,
170
- 'ownership_derivative_holdings' : derivative_holding_ownership_dict,
171
- 'ownership_reporting_owner' : reporting_owner_ownership_dict,
172
- 'ownership_metadata' : metadata_ownership_dict,
173
- 'ownership_owner_signature' : owner_signature_ownership_dict
174
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes