Skip to content

Commit 3b58cca

Browse files
authored
Merge pull request #62 from jdkent/fix/new_source_tests
[FIX] new source tests
2 parents 2556190 + 9dfd929 commit 3b58cca

8 files changed

Lines changed: 58264 additions & 6 deletions

ace/ingest.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ def _parse_article(args):
5454
return f, None
5555

5656
article = source.parse_article(html, pmid, metadata_dir=metadata_dir, **kwargs)
57+
if not article:
58+
return f, None
5759
return f, article
5860
except Exception as e:
5961
logger.info("Error parsing article %s: %s", f, str(e))
@@ -63,13 +65,41 @@ def _parse_article(args):
6365
def add_articles(db, files, commit=True, table_dir=None, limit=None,
6466
pmid_filenames=False, metadata_dir=None, force_ingest=True, num_workers=None,
6567
use_readability=None, **kwargs):
66-
''' Process articles and add their data to the DB. '''
68+
''' Process articles and add their data to the DB.
69+
70+
Args:
71+
files: The path to the article(s) to process. Can be a single
72+
filename (string), a list of filenames, or a path to pass
73+
to glob (e.g., "article_ls dir/NIMG*html")
74+
commit: Whether or not to save records to DB file after adding them.
75+
table_dir: Directory to store downloaded tables in (if None, tables
76+
will not be saved.)
77+
limit: Optional integer indicating max number of articles to add
78+
(selected randomly from all available). When None, will add all
79+
available articles.
80+
pmid_filenames: When True, assume that the file basename is a PMID.
81+
This saves us from having to retrieve metadata from PubMed When
82+
checking if a file is already in the DB, and greatly speeds up
83+
batch processing when overwrite is off.
84+
metadata_dir: Location to read/write PubMed metadata for articles.
85+
When None (default), retrieves new metadata each time. If a
86+
path is provided, will check there first before querying PubMed,
87+
and will save the result of the query if it doesn't already
88+
exist.
89+
force_ingest: Ingest even if no source is identified.
90+
num_workers: Number of worker processes to use when processing in parallel.
91+
If None (default), uses the number of CPUs available on the system.
92+
use_readability: When True, use readability.py for HTML cleaning if available.
93+
When False, use fallback HTML processing by default. If None (default),
94+
uses the value from config.USE_READABILITY.
95+
kwargs: Additional keyword arguments to pass to parse_article.
96+
'''
6797
manager = sources.SourceManager(
68-
table_dir,
98+
table_dir,
6999
use_readability=use_readability if use_readability is not None
70100
else get_config('USE_READABILITY')
71101
)
72-
102+
73103
# Prepare source configurations for parallel processing
74104
source_configs = {name: source.identifiers for name, source in manager.sources.items()}
75105

ace/sources.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,14 +203,14 @@ def parse_article(self, html, pmid=None, metadata_dir=None):
203203

204204
# did our best to find PMID, but failed
205205
if not pmid:
206-
return False
206+
return None
207207

208208
metadata = scrape.get_pubmed_metadata(pmid, store=metadata_dir, save=True)
209209

210210
# Remove all scripts and styles
211211
for script in soup(["script", "style"]):
212212
script.extract()
213-
213+
214214
# Get text using readability
215215
text = self._clean_html_with_readability(str(soup))
216216

@@ -2230,4 +2230,4 @@ def extract_pmid(self, soup):
22302230
return scrape.get_pmid_from_doi(doi)
22312231

22322232
logger.warning("AmPsychSource could not extract PMID.")
2233-
return None
2233+
return None
Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept:
6+
- '*/*'
7+
Accept-Encoding:
8+
- gzip, deflate
9+
Connection:
10+
- keep-alive
11+
User-Agent:
12+
- Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML,
13+
like Gecko) Chrome/124.0.6367.78 Safari/537.36
14+
method: GET
15+
uri: https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=21078707&retmode=xml&rettype=medline
16+
response:
17+
body:
18+
string: !!binary |
19+
H4sIAAAAAAAAAHRTUW/aMBB+36+4+XnESSpKN5lUDDKJqlA0WCWeJhMfxFViR45Dy7/fBShNkfYS
20+
ny/ffb7vO1vcv5UF7NHV2pohi4KQwX3yRXydPI1X60UKi2ZToho5r7MCl+hh8efn43QMrMf5/HHG
21+
+WQ1aUGzC+gbRLWHB2ka6Q4Qh3Gf83TOgOXeV/UPzpVXgSnKwOg82Nk9N9lG8+p4DreNP4d/434Y
22+
hVFAaEYNXfdxnUoEdVBog2PtpScxsKS1qYdslk4ep/OUwdOrQTdk1DWDqVH4ps1uhj63ikBtuwVL
23+
xGI2ncDzxQ+WxFE4uBuEA8HbX4mYSI9jW1YFelSJWKN0SRxGkeDHUMys8XkS3gh+iqjgkMSx4O3a
24+
fj+Vt9vfuNd1hyvuX3H1P3N973Jdis8+HGdhFRZDtnDa+F5aYOadNTojdQ+2cUYWiZgul3OY1rVZ
25+
HSocsi4o6t/0e4M4vhO8RV2KCN0gkL2oyGrdlEM2NR6dQU/Mz7ZoSkyiWyo7x+JYkZD0U9AOrG35
26+
v6b9ws1FKb+Aeff8RKy0p2mvcoRRiU5n0sDLCQB2C1V9yHItvTsIfkKS1KfRZuPIp+O9SEYlPMCi
27+
g7sGXE68mHpimujaNRXJB4fabK3LsETjodY7AtNlAm3AU2PWbbS3W/LTU1eZdR7fQBoFmWwUaWpx
28+
B7rpeQ2v2ueEMKrJPChdW6fQEQHYqrK1bvshCoVbLU0H0JJJyPUuhwL3+CHdVtLnOgPvpPZ1IPgn
29+
BWIhd9qcVdL7cJ4SNLQ+zehjK1KjTvlbyr9v3t/XYmfagl77r5OigXW400ebHUN6TOlUnS6ZsprB
30+
Mzml1vMhW9NNC4MoGtxyWVU6kC9VEP8DAAD//2yUTU7EMAyFr5IDgDQnYMHAAoRgM2LvNp5ORP4U
31+
J0N7e57TIoo0u+opsV/9vfig0kHfvaZ8VwUoBsFPjfXv68RzNW80aNY/Hl+fj6eXTzzzdx+OGPKU
32+
yrLXH54WObc49t2wgaKwTJY89XnepHYhMQNzBPKsit2x6xBs83XDeAuA0aBK5tGdIWI8rbDC0u6/
33+
btDNlcJT81RAnNdyq0XB7VoQDtwTmAjkopicUvGLaVhiRWpKdu1DsJWKmIaFgHhkEnFXyNfkLMWR
34+
TSX5MjUZnimAW3eBujlFPRhZZPOmbRepHKQfJ+0m1YXmm9z/Tz/PCCrc3ZnvC+aUC3bDDwAAAP//
35+
pJVRS8MwFIX/yvB5iiC+7smBgmPQdvicstul0i4lWRfx13tOYseaVSj4ssGlyc35cs5NhCzW8jQK
36+
ig9WcCV4FsiswX5HxqVVX3Vbf8t+GeroZMUru0/zMQE2xglzFMicGT6n36/MMW2Vzbp43b4kPonF
37+
/G71oWsM0U4sFLY8JBndkrxoIFK8eM//DHQHsHMSHXSjmxbVnDQupS8/MbpdYBHeFOzy9PB4Xyyq
38+
Tfa2cJiPs6hk63z3XuQJlqG6yqRBEoEAl0QiN+iXoXwNQVEdByaXlaLVuQaGseIphU4bL3QJ3TjK
39+
ZGLV0qDLXHuOHYbjIthemob/odUwm3+byOydQ/bQwPPnaOB103fQWVUowCuOdr5MmkRDxMlu3sR4
40+
tqK4K05Y9qe/12l0OWjgDtzDSk8pYGeH8TaVoR8AAAD//6xX0W6CMBT9FT6AwA8QM8YwMSomI2bP
41+
V6jQrNClFRf39TttxYGy6JK9aCmE23vuveccrtThbl8kmyxZbfPFJrvujeGdmbE0SjbGiniatabR
42+
j/xw+gFxjJ1dNzTk4ruiOaYIpIYeZA+/CeP0DxM62a9dVYHaTE3IVQO2i1WKzDD2HG+o4kz7fUn9
43+
PjP/d/lp6ITR6QeJWZ7nOIaSR14ywxgDEWlZp/C3I41HgAoI2RBEUV8ECw3aSPwI/s7EyaH5AWY2
44+
Aag8Il8ovUSeJQTLOGAIWMY+kSkesoUDQprvuHA6ZV4IELRlcByrJpSikEJWgKeR0EZbGKsqmil5
45+
MEDYbEuAaCXI+DfCqBQGOnfuxjzeE+xNk4YDI2D1bsWhK72lPjuL862R24hWpA8ZwZjO8V6movCy
46+
Ec2Bil2lgn+h8dEhSRRedqNFi4RJ6FmK7ctFFO/3gMJZFPThaGP2wsCQDjXkk8AowawK4NkphxAu
47+
8oJbivCxqjvBUSsspLT0b1x2AYx8b9ty+4mGgcL+G7oNttvboFyKS99LqKWSAo/1hw/2NsMnUesi
48+
kG1QEGAbHG105U4eOsTuILcmpetJ4OIdr4gLL56ELY6HsD0W61kQny7SEmm35OWToZb530O9Ml5O
49+
RkK+VYevDNBPOhltnd5E+wYAAP//nFhdb4IwFP0rDS97USwiThNGQjQRzCTGj2TZG0Pi2AY4Ppbw
50+
73cKRWDWuO2Fprf0nn7c3vacm2jbIEyFaDPQjizyCyHS7O9AzlEIs8bnwxWCrP8OskaECmHmbhTg
51+
HSPepfk/dul6QGzIEkVKNkKszVKINWjSBwOJjjmjOX5ULhqv6YsESVGYYcoWXoCfPFOFrCxKh5Mx
52+
1Qe1VTc9JPQiNOzQsS1A8qpuHnHuCwMEOnHDMm2jnVgWloU36YgGtBYGDj+7SZic4SNuajMHqctq
53+
GiDNSCLlsWacS2gke/tBmlNlPBpOJINTXcJ5Ysm7239f664N6Ziyd2GKRM3SVn5iBKlHHNmWLblH
54+
mqn92qeijiaa0Gcc9ffyViaL+OsuE/j7aakmzufEZATCPpdax1mJoF0lgikTLclF0WrJpeWyqZ25
55+
ca1UlBn11v7xPjvzUpFomnQ8ueDgM/cRTVS9p5oC3t02llLOYxC9I+UbFAHYn2rqU6Xd1Oazx+4A
56+
uVK2zV9SPzPsFQbXNWGM6avluwc4qZa0ZcDS+KmXBKcsTtiJ45uIEUxViazctzjZxafAYwfGkQzz
57+
EOOd7eE6xFp2OpbDa7m9ifENAAD//+xYyw6CMBD8FT/BlkfpEeRIjBw9Gnz10pDQHvx7p1AkhkXR
58+
cPDglYSd6XbanSkwYiEpDG+txgilxZVyVqehSokq0ZpiWl9v8D7O5Lk5je14+vkbtjIRFFttYC4r
59+
XEurHaa783Buwufecc5dBBMRUfyoDhcNO9uM6M9uxf59KyZqcbKtrXdepqOMh9Si06btZxsGCm8g
60+
52uBT2phEdJMyiihSBuDQ+Eo58gcleoeSfIhO2d9du6V0fyl8UIaQUxtZPp4uvk5YUAZASMgMkQr
61+
jc91TbL9GIaHnILZ+Hy9tRhlttPWHQAA//8ir+wkIlWQk2mwpWFnaP99tLAkHO/GZqbYqh8XaB8f
62+
KJM9mLKDsYGhCbZ06paampKUmJytA2kqwfrQVMgYpkbApiw2C3MTQS1iys03M8KW6tygYz0++UlY
63+
bBnIXGdgZmGALQo8SnMT87CUECSbb25giWE+0B+eucBOl0JAUX5yanExULsOuNdVWpJapAus2oEN
64+
0NQUKlhuYYTZeARa7gssA1KB7XkFAAAAAP//AvY/gG0xUFUBcg91yl4LI0tsedCXOgnM0sAElikB
65+
AAAA//9CMT0f2H4At4aoYYeJIbZE7JdaBGyi+KViadXTts0NAAAA//8iUG+AIBZ7/Csqgd1rYLLK
66+
Ky7NLcAeNESXe5HUbR8CC2oTLE4OSCwBD/cFpSbnp+eBx6d1FMIyi0uxlX0D1bY1NMWaviEldW4+
67+
UDWojwMeqgdmrMHjbmDX3wyLFUGp0Mkb0FBUaSoVijygTaYYsRsJsglpXgSpaqukgpWmxpbYOhzB
68+
4PUKCiFFwLIc1IiiXyZA5kHGE/TRVu3YQVf1uCSWJNrZeADV5IPGSiALjKBLQkBLXGCLe4CBVpRa
69+
RfxAjjl0IMcjv7TIzsxGH0zb+GbmASsZO6BeKAs8oISwEY8DIIuVSHAAAAAA//+itgNyIQGohHNV
70+
DdpKJGOiHQAAAAD//6Sa8U+CQBTH/5W3tbXaEIGDJN3alCxt0Vr6DxBcykKODm3SX987jhO0Uqvf
71+
FB4c7/PYHfe+32MJLMIWpwkN8uZD2DsYth6CmKqftjNIu1lx1dCTA11lmTgk5Iev51Srbxxtdf7G
72+
ESjziapTbefaxHwXvogx9mE88ieW4xJR1L3hyAAnO98jl4Zru4eihRHmoPll/3gx3uGIK9s7XDbz
73+
2s7fuhl4NV3xWVBAX4f+bMbFdxirJLs9an6pcYfzOInwdpUxRrX7ch2G64zyJa5g71L+Ws4p18Ey
74+
DLtndy8scnqyxhxI74JYet2E/EVVTcd1iOOae5NvN9L9LvNBwHkB3lSDGx6Hr/B4p8E1ncyDDwZT
75+
XwM/9FgB/q0GwwRfRMBD9yylBQyepP8mXoh2dfnlyF4A9yYJW+WtVUpxAZQSbSUZC3GWrpc0jZTD
76+
JGR4Vbbcdn2UCq2iqsMd9J9TIY9Wi0RJ0MDpuOiZxuWZdd4lxFEoiW38EaXh4pa7Y/0LZQ3QYzwV
77+
Nov+SIMa8IBh5jC5RsBBSmE01MH7GZf0+sgNf8bZcyJ8SZXY3/AbCebbUZDTd6HeFRoEm5dZyu05
78+
TV5a0tQFEcUZ9G0lZBekXJsJJW787YkaNNbmkjwyNru201HE7c6viX8CAAD//6Ra226CQBD9lXlq
79+
NNFGQOT2ZEVrbE0M9qWPCKsQgTVcYvz7ziyXoqkxlbf1FuHMOWeHnVMhLqPDyIrSCXHb9X2kpEPk
80+
RSdOYUUrnuUwHcDSPbMM7NUrnZegJN3kENXMEyGy6EIv/TCm6EY1sG/z8F4FBDkDzn0TXMoExUVC
81+
R9hZXvjXUIqGO8rpX17c+GT9zsNvUFUtTekpfXM8GjXASs8Cqxq6LCl6NyojQwKYzgfwwTPKO9lb
82+
AjRl4Nil7DctoGYB845oDrkJ3xS6qKPE+E1Oj/t8cDu2N2FNwAyXItEF2zJ2ZxEW2tVtP7pQh5/x
83+
mtCm3OIQuAm84ZJjjwcbZAK6NJDu0jA7YgtO7HjHstGyMq8U/bplW6Lkf2ixkl1zYtZWXb0bkFVd
84+
SaY13BJFNtBXPZB066mykvYMw1A7lfXzkrgx2A6VITuFpJI13+/DPIevORk726GI8ONtTnXEZjYd
85+
Vm+uX8n3DyGSPCRkGGVxRLySAkBt2WQeT8v8VxmCajZFrzGuMkHa/tUdo9dgwXaWJE16Ut+U1Mbo
86+
pYn6T3XUvQruFspYf9Rp1FrSFHk8kiedQBfxEZgi1mUEB+YzhD3MvYC2CBt3VoaA4P06DAnFfKgH
87+
enQm06TyFgjmvoioq6gsXUA8a7cf9bTxBwAA//+km1FPgzAUhf9KH/VloYx2wJ6WaWZwvhiM8bFT
88+
Fg0qBDIj/95zC7SAThJ4Htvo7eGer7tnwA/2SIGv1l4eOpKOrb38O24BCvUntHpDfNoQxsU0EXPf
89+
9bnH59lsBPwo2QYP+F6d8GLJbqHYm6Q4KLa904abosq7iH4w0KxxvbA1fa3yTD3boN6xqetRNaHF
90+
Q1YN4nKm99fBvHOOvbDZ/I4HDJsApCvDwArZmQp/fuAunZUzr813BGlU+pc0DRR80dkzwx3QABdK
91+
HET3ullzQ8Zn48wvp4K2pyBeKfEhJv7GNpSE2OG9v+RH4CfFhbgMhS/bKorAm9gOuONJZ/SgY2ru
92+
CXjrvJrvqzTFwq5irLJmBpKJ+vx+S6DIxmlootsWK7dj8h5dqHZPNNnVI/W8wxU8EKu1EKG0Wpso
93+
taUnXSnmPbUGHjrgEJIH4+CrV9AGYOrw5VNWpCGa2HtSrbGSAWWOHmooNMXuo8ble/94GFEwNuAD
94+
AKFDCXR5z6NifBGAc5v9AAAA//+sm8tugzAQRX+FZVdVeRmbrEgWWbWKlEpd8yqxBDYCWqn9+t4x
95+
j4BEu4Au4yCMDzP4XmumUFTFOGxR17zGFvUgYEX4JIxdsTWxAxh1xvfRngGYdYAY3TKs3PQkxF1O
96+
VVirVbgAsVh7pBB3Y6vE9I6sKI2zvDIxPNZ19liAxIFVYPbdKoitRJjge6UPHthIwMtM0iIYf+9x
97+
WKwfaUjAlFaLMWinXPWb5ZqDuiyykbOD8EPHd0Ygjs+2AXEDz2de8F883mSmK+sEhf+CZWFwFQx4
98+
tF8qo9QxUQDdK9VNJuZsPlz4AUIFp9/En6MPmG+Is6ofuvA6FAMtWfkHj4e2a98/Xq4TbKQlKHr2
99+
5VNUJY0uJCQw/vmGibNOZ1IaZSYtCOfjR0rdEGWJcYjnOMXPrpPkRl5jCjZpnR/NKRCpBV3roonr
100+
0WHekHdm4X12VvRBhPRodQnyPdyI9kiJlMMV8wYqZZRMX/rzLs3BStvPoxM53XOs/TDTPZsJiLEQ
101+
h8AOp/S0+Ta8gnPxxP4+gduA9wcAAP//pFvLDoIwEPwVPsAYKNhSOHrwaMIfAGmARBF5fb+7bIGS
102+
YBQ4cxt2Z2emu9vhjbSXGwge0MmLqnql4Ls7OkZJ313R6JekBb4DLrVq60L1VKN13BIsMmxW7qCm
103+
axn9t3AzX50tWl2Z5xhALEKg8oB5c897e2F2uXTZsawPt+xVmcTd0wJ4oxd4hRyN3X2F//G2Qe+V
104+
9TMrnnRvVyrFyK9QY7mVlGPgLLQcoHoUaNw1Ms6tVKcFGuPM9+2fyfA4KbjDpCuPhUpLlMBgga9A
105+
XXwD5R9nOXnhK/BkRobBaEgoq1KN5gI+fT3vSWIoPz19J3Wi5fDDbNdJG6NkJm1scOkAfUNjl4LR
106+
kNnBxRFyUsbgE/Yhz4VgTP6NvO1zT4pjM9pAGIPnDwAAAP//8k0EVUZB4eB9IvAowZ5coYEF6huD
107+
hvpgQ6OZeaDeMCgFl4GmNMHlAJZkjSdQweWkoaWVmZkhfGwOyCazv2FmDlqHYUh0oJoYmgDLV4Ry
108+
AAAAAP//pFtda8JAEPwr96hQSvPh5cOHgm2hVUsLAd9rTZu0kYNeRPz3nd27S9RakeQxhKDM7u3O
109+
TDIdQN0z8CabFRAtBW/6b/CX50bg7Zthf0LC5Khyp1LynUyCd2BGMScGFL+nWGabsZA3MTV93NF2
110+
VpT0wQu3q3Rugp8MwmHqeS1b9LyoK4GWoOEjehfXAzU3HMkLwz8vjI+otlCk8ysyLyuKJGcPx725
111+
sMsHgKHHbD6NmDejZMLHphUt0Hhak33TyGbsHhNFY0yXeb2lJLZLVtbVjpz7tx3B/CM0BYldvPP8
112+
aEgAMhhVIFvvIQiirmM5imN5c7GNlsShjPx+FTGSZpYdWBU4+4p9XdvGd4VS2pn8lHClkOMH50xB
113+
oCob2AWodXvjU6mVTkXGefWde5gOg27oxP960eT6eESfOB6tllIcWaZyl1SQc5WSY18OQj4PQTvJ
114+
cRF3rJaUEAz+6NJqQX8mUvYzPWflWjzicBTlWn0pmjgvjlHdK0x47Mfp67V40oZWmXUnjGDAYHZB
115+
V9PZuHvr2LPecBKyNsU5rduofgV9tSeWtDWhZuYqE5PSmspSTDfVOBzEwzT3g+AQ018AAAD//6Rc
116+
S26DMBS8ii8QqRBI7HYViUXV7KqoXbsKC0vGRC5Qcfu+sY1NlaSKYMsCycNjZt7Pj2KaFbwgwXvY
117+
mPCnnJfrML2BoPfG0tBRT9DJemwosGCMK/IXJJ5vdPjQLCRYw7Js4GsYXb9XjLAOoz/KDK0ewN3K
118+
C+WXTobX+R2P7OSyG3V2IKfaSmS/vvljDne4HodRYid8MX+fivkL82DH9GsT4Vdpe9NCCo/yR3Yt
119+
3F01sW1CzFpcBuCjLqAWbPAshbh67G6DiF3bvpNuM3a+4G38APoklXHt3gvCJrxTznY87puWNJIU
120+
eESUaJCLgk9Qi3JpDWaXCfpX1lmRmwFcyTG06yzGYAw7kum2qEHregSHpEg+1Zg1wJ56vGcAC9e1
121+
/p7hv/Ef6vw/I8zicssOF8vy4mXL3ThBHimX9HFpc3ufkUCuc8OUSFLYoQ1ESveJOV3LDu+oGne+
122+
aopiihx0Oyg6F5oVKizdP7MPiR9Q/QIAAP//gk4SgXyfCt5ujnTgCerZBNDRLRRBYPGcZ6UArHeT
123+
s8ErGQKK8rMTiysVwt2A9S3QsnzQuJdzDqh7DJrTdkZygYKnJ9ChBaC9o6DxC2egaaVFlbrORflp
124+
JQAAAAD//6ycwW6CQBCGX2WPeMAUkGWhJ6i9VA9EDz2TsphNpCUqpvHpOzO7LGqCUexNEzeacZiZ
125+
/b+Z2ZOg609Z00wZn1nXjB+TePtadqU0r0A7dcIn/Pa6gZfy7AqFqyUU5G7kj70YkBDfKXC8Hx6+
126+
r/5yb8+VekJJqwgELlFqOaqyRUH0im4MkUzO0nYDSTxEzh/2ImAYjhQEIKVwHj6pij7MJq9Xc8hz
127+
hiYv2eRQa5Sha7dbX242Xg2xyY/2G9GwwydJ5FkTR/5Y8PEfuJJ2HBxO7BMfIIj04BFVRUEO8TqY
128+
/M0a+f232dIsnMk6escWbkCqcHxXszLKBy18x+4AkQyZUA52/tnr1la2QkEVUX3JMip5LKgQrwEP
129+
kkC82DtWIDxvZP0fCi+K7hYHhPDj2ZO9PouirUwTR6Z2dYEyQYaXMgxfc2tDMDe4KtQs2G6WdkGv
130+
x9pacwa3OUG6hLOqoE/qBRRuupEWqbu5FhPoxFJVElKz7FpbmLNw1+l87ebLSQLOToP28O9sFUUS
131+
o20fcaQf30CqLygw1ARMTKOI4fUXfoyiIdWnAXciyN3Cqg6xuDdS/AEAAP//pFzLboMwEPwVPqBC
132+
NiVRU24NUaQ0laoi9Y4MamkTEkGiqn/f3VmMnb4DNxQuxF7Pzu6M93PrMFJUfo1jSc7bduICyt1t
133+
3r1cYAla01DBCmcVlVxc0nQmoF88P/os6F8ULPqvKAtlr2VJQLBmxkB4XsIJMKdAQaSw7E8VYNva
134+
cSSykiZ5OVIaxMQrB9vyrkiwbwAhj3IBsAiCNvwlcH3xzDKDHee+fCj+CT5qwTp/w3HTiQbRnfRN
135+
0KuhMKSjmNB+XO/37tg0FZ2DuXMnpssTNdbbOemc5cQDZKCPXbC2c7zZKVgQLGRyU9jbnmTNsQYR
136+
W54SHXNz53KmnDY6lPDzeMzJdFwj4ZtQ9i+ld2Gc9YuR/ieMiSqZAaHssRjHXB6+MBDRiX62U7AI
137+
iW78NY8+wvdX/pwkjCIiLCqtS5f+COf72rwHBp3sP91raO0n8ZRlbmJvDpTOzSCuoFAzpcZ5KR7p
138+
gY7xanEReHrmDeo0/pHdfnX19HzgrJHuCkL3W+I696weHYJlFna3zxkfLMuArmZ1TaEu9W6bwx7Y
139+
lhvJJx8AAAD//6RcvW6DMBB+FT9AI2FMbIeMlSo1UjtkSGcPbYXUQBRFSpqnz31nYyAFtS4TiAGJ
140+
M2fffT8nXPSvoyjsq0AdJqYwNnFf8UxNtvtqzotW/9FKiWINOViUsBKoJJVCUg3o9dTtJWJ5S1Wo
141+
BIpFzqZTg7x0XF3KN6Py0sW4uvSXjCySMnK8Dt49CC87e+kSdcvC4g4jaQHDABUy90PXn7IK34g2
142+
h3eMsAFRXoUsncTJ7bpQpenaeLP8r/xxRSfJ30kda1bKqJmkY015d6TTVGyondg56CWohj0BZ4EA
143+
ih4A4rvyDD0+pnOdiUPlp3+WAlngzQM1TFnuk/Zlbxvj+PQffLg95nsF7TvqLzYMhjGRl3sBFRs0
144+
oP4+DfQHpWDH7xRtbrO1LqWJfWsuU9ciRNcoqEvnISqPzUVs3yiQT6/PtPdTd31G9iBajr7yG1rl
145+
LhDVNRJjPdJy31qAj9ECXMffDx1+cCP7N1FLgR8ctc+A6dZML+h4MEiTCqyGsFgr80zbGwAAAP//
146+
orCvAIw2D2fQ6GhReinQ1a7ADoJPaXpikYKHL7j8B3oHWJVC529yEtNBUk4+EM8iGjdIoYS80gKY
147+
5bH0b8Fn4paCZx8gFQJQKejMutR80JADMHyLC8DLBNDytjG0nYhY6mJE7oiAkTmwV0bpNAtSiMGD
148+
0RtYClaCalQAAAAA//9Cni4E9vqhpyJCVjDi9jM4PWILLdDsOfjAVtCqcuiyItA5sPkFkPEntKAy
149+
AqYqcFBZIHKfAdn7T0wsjAzMKRuRD0kE1QWJyRmg9kUIqGTJL61QCAAlI92CHGAOLIKHRgVoCVlJ
150+
TiJ8BR3KcGRwSWlJCTANloCWRGYCizPQGBlaf4/oNX/oNZdPKjAFF6WA6luk9mYAaIITKFwCnlOD
151+
Np+cCS2JwzfyZYV0+qVCUiVsrAI07JaXX6IAAAAA//8CihQA20jFGZC4RV8H5gk3GT78DltLaGJt
152+
bG5laIg8F4a2upIqazqgM0zw+WxyF3Dk56QBEz9ohDYlE7S/OBd6QjjyyD181g+ywgA0p6kA7jGa
153+
gpK3OWLZm4UFBUsNDM2JnqIFnZRjbE7N9UXBqSXAli1ojCY4MSUlvwi0eTAALchdYWEN3RiCWDwA
154+
KSZAw7SgMVz46g2sEQIN92SgEnDzGzL4UABeq1taAG6jA2swUEssF2vEoU8HlKYrGFkAe6mgyLBA
155+
bDqxMCN7OsDSxMLElKjABQAAAP//5F27DoJAEPwVShsSIdHjyjPEGDUU+AU+KEjgMCoWfr03J/dC
156+
0QClLQXFZp8zO3s/w/tvV5rzCzxL+E0i2shMzG8pFEu3R2atsZhxDnoZl5LIubt7zrylKe/dd1CQ
157+
m6Hr65IkzIDWididh8DrCKUG7hnYGAYzSsk0HGeuNC9kHKw3IuSKjHOPbcUQg3JVyrWWxmLJJ4Kz
158+
wUKOlRxS9CDMK+4739oYg+NZEnxuGQvQJoexgkmAQi5afZ3pQjIUSiDAN8faqz7ke8DyuxJljS0w
159+
keJtAs/YSoHIvn7bQJHkygBuejq5jy8YZdEZt9nfrnFrOcyL8tWBrdKVFdnf/8ziVawJ5foKngDU
160+
jYIsegiVIg1e9lbY2Nh/NLKwWCO3zNR+cxTmrvlfNKCW2BkNVtelyScAAAD//6RdW27CMBC8ig/Q
161+
RqSNY+gnovxAJERPQNtIRMoDqeWD2zPr9doOaSuaHCAf2cQ7szuz654SsOsJdzd6OlWDDw6pQYtL
162+
IDrP8d7EKiUjtXnyiRIl80hTCWrC/H6jDsj+c7qYFtpNVR5rtaHNBypEtY08SXYA6eT6Xl3bZ3yv
163+
MgZKFB+VE2LcvBPvt02Y+D9NoqhRlnWqaHG4qNT8c5zQd65yPU/vDlduAMR6Wnk0tDBEDgaR+uwK
164+
herjCEbdqn3P2RDMDD/2jsRAE7nKxEvD7JvuRXEdi1jxT2T4RvjyLHvJgsic6bGnV8/mRutpXVp+
165+
5wJ15PoM7teo/VsymBf5pSFxcmBcOTBe1l33qXihFWfdLRWMjytL9wj4+aGS73DxyrIf7xQVBz/r
166+
dxV6s1+xIsjY5bbVD/Ii0qI2Hra0GUsKFxlQa6J+L6fXw1bhG6ketbZ8ImUqiS8xQCSCOBp2z6nl
167+
hcw3jR3xDp+I1DBaZFIeagAJCrm/mdMVAAD//7ydTQ6CMBCFr8IBNGmxFgorXAsLNDEsCRoxhkCI
168+
Sry9nQKlCCH8RJcsIcw3b95MO5VyGvqM2N4iixoSmXRymdNAEBFkLIvqRiD5kCuhUoZYvmq+U8rt
169+
3jGwpJxFqm6UXCfiRsnOuTmX/28RbDnqjCvYmFiyuJjbEWOIUbIwQHtePxAoB6wd4IG/VwDjQFEO
170+
Nx5xYSKWndVWhoqoVpNDcQt69CCMA3IpKCwdZSBmqvslkwEjTB99lJdRc2OgZfbP7hnd41QQ/7SC
171+
Sio8FzyduUfosRbA+b2MQvcCB45EJMo1IJXSq3Jl/M6EKynXyAzbLcq6LS98KH6Ck+U2LrtDWBYj
172+
RJ876cEwxXSsjaDzssU00d+gFn5DLZRQyxqocWBFNdSyNtRyBWrDnvhNhVoHZ5qXvjSAGtTMv+fa
173+
BwAA//+knU2OgkAQha/C0sUkCjRIXA7+xaQ3eAKNOCbDiGlsjLe3Xok0EIkM7EhIWFQqzeuqr151
174+
TdD0msNx5teSEjmJXWWbORAJBQA+3KJSeT4msOT4IyFxTdWr4dEKs88AausL4NWyegAjilI71pVI
175+
MLIdQBBmIkn0Peo8z/MnzjCKaJ0mKr0frPAb8YDqkivSYp8B/mK5UdbgJk9P6zaIjR9NUphPRnjd
176+
3MuGMmKMj1QMDIRgAwPT0PN6c7kBhl2CYXBPpLPTjVuycvkFlEUBsIEjTKQP8T4GLrEGg5pAxcoF
177+
Zw0dPtkTSeMwHmtha93tRJlSrlmqGhcUwdKqrSLFp5rNU0J+YJpMfXNp6rp0eRoYNjMjFO4Sbc1J
178+
9y8ymOWsouZc0NsyS16jdOOcd02ZY6s5D4iL/tvqZbWazANVU7oAoBrlCMPXOuLf9ZXXL4ByjALW
179+
+Rdg+8J1uysS81y8q5phjuv7bh8AAAD//0Ljg67EBQAAAP//AwAPc5hAzXcAAA==
180+
headers:
181+
Access-Control-Allow-Origin:
182+
- '*'
183+
Access-Control-Expose-Headers:
184+
- X-RateLimit-Limit,X-RateLimit-Remaining
185+
Cache-Control:
186+
- private
187+
Connection:
188+
- Keep-Alive
189+
Content-Security-Policy:
190+
- upgrade-insecure-requests
191+
Content-Type:
192+
- text/xml; charset=UTF-8
193+
Date:
194+
- Thu, 23 Oct 2025 06:16:37 GMT
195+
Keep-Alive:
196+
- timeout=4, max=40
197+
NCBI-PHID:
198+
- 1D32657F51122B1500006019D0393D58.1.1.m_4
199+
NCBI-SID:
200+
- 824B7691162ABEAC_BFDFSID
201+
Referrer-Policy:
202+
- origin-when-cross-origin
203+
Server:
204+
- Finatra
205+
Set-Cookie:
206+
- ncbi_sid=824B7691162ABEAC_BFDFSID; domain=.nih.gov; path=/; expires=Fri, 23
207+
Oct 2026 06:16:37 GMT
208+
Strict-Transport-Security:
209+
- max-age=31536000; includeSubDomains; preload
210+
Transfer-Encoding:
211+
- chunked
212+
X-RateLimit-Limit:
213+
- '3'
214+
X-RateLimit-Remaining:
215+
- '1'
216+
X-UA-Compatible:
217+
- IE=Edge
218+
X-XSS-Protection:
219+
- 1; mode=block
220+
content-encoding:
221+
- gzip
222+
status:
223+
code: 200
224+
message: OK
225+
version: 1

0 commit comments

Comments
 (0)