<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Framework-based Approach to Implementation of High-Performance Image Processing Library</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author role="corresp">
							<persName><forename type="first">Evgeny</forename><forename type="middle">V</forename><surname>Rusin</surname></persName>
							<email>rev@ooi.sscc.ru</email>
							<affiliation key="aff0">
								<orgName type="department">Institute of Computational Mathematics and Mathematical Geophysics SB RAS</orgName>
								<address>
									<settlement>Novosibirsk</settlement>
									<country key="RU">Russia</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Framework-based Approach to Implementation of High-Performance Image Processing Library</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">C490D059777C3457C6A15114B6151626</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T07:50+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>remote sensing</term>
					<term>image processing</term>
					<term>high-performance computing</term>
					<term>parallel computing</term>
					<term>computational cluster</term>
					<term>GPGPU</term>
					<term>library of subprograms</term>
					<term>framework</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Framework-based approach to the implementation of high-performance image processing library is suggested. The implementation of prototype libraries for doing processing on computational cluster and GPU is described.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Introduction</head><p>In recent years, the characteristics of remote sensing of the Earth from space are, on the one hand, the increase in spatial resolution of satellite images, and on the other, the use of hyper spectral survey with a large number of spectral bands. The multispectral data composed of the images obtained from several spectral channels can be hundreds of megabytes in size. While the data from relatively small areas can be handled by the average desktop computers, the solution of large-scale and global tasks of geodata analysis demands the approaches based on high-performance technologies <ref type="bibr" target="#b0">[1]</ref> such as parallel, cluster, and distributed computing or calculations on GPU or Intel Xeon Phi. Today, there are a large number of the libraries of image processing subroutines <ref type="bibr">[2]</ref><ref type="bibr" target="#b1">[3]</ref><ref type="bibr" target="#b2">[4]</ref><ref type="bibr" target="#b3">[5]</ref>, some of which support the use of modern facilities of high-performance computing. All of them, however, have one limitation which is significant from our point of view, the lack of extensibility, i.e. impossibility to introduce additional algorithms to the library; the set of the algorithms provided by a typical library is limited to the set implemented by the developer. This circumstance strongly limits the possibility of using existing libraries in the research projects aimed at the creation of new methods and algorithms for satellite data processing. In the present work, we discuss the "framework" approach to the architecture of image processing library allowing to avoid the limitation.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">Framework Approach</head><p>Extensibility is one of the main advantages of the program systems based on framework architecture: image processing library constructed in the form of a framework consists of generic subroutines each of which implements its family of processing algorithms (for example, the family of "pixel-to-pixel" algorithms); such a generic subroutine contains the code common for all the algorithms of the family. The specific algorithm of the family is implemented by the class/subroutine called by the generic subroutine and does, for example, calculation of value of one pixel of result. By parametrizing the corresponding generic subroutine with different classes/subroutines of specific algorithms, a user gets ready implementations of processing algorithms of the family. And, if the interface between the generic subroutine and class/subroutine of a specific algorithm is known (published), then the user of the library can create specific classes/subroutines extending the library. An important issue in the design of such a system is performance, because the overhead of growth of the abstraction level of calculations should not be significant.</p><p>Based on the reasoning above, two prototype libraries for high-performance image processing were created.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">ParImProLib Library</head><p>ParImProLib <ref type="bibr" target="#b4">[6]</ref> is the library for doing image processing on the cluster multiprocessor systems. When designing the library, the following methodological principles and caused by them technical solutions were used:</p><p>1. Maximum hiding the use of parallelism from library users. The program using the library should look like average "sequential" program: all the code dealing with parallel environment (initialization/deinitialization of the environment, node self-identification among all executing nodes, internodal transfers and synchronization) should be encapsulated in the library. At the same time, full hiding parallelism from user would result in potential inefficiency of the program systems based on the composition of algorithms (algorithm A requires one way of parallelization; B, other; and the composition of A and B, the third, perhaps the same as the first or second). Besides, a user, as a rule, has some general thoughts on how to parallelize an algorithm efficiently; for example, if the algorithm to parallelize is the composition of three filters with the kernel of 5×5 pixels, then the best parallelization is cutting an image onto strips with six-pixel overlapping. Therefore, to provide the most efficient parallelization of an algorithm, the library allows user to specify how the image will be represented on the set of processing nodes:</p><p>-Full copy of the image on each processing node.</p><p>-Cutting image on horizontal non-overlapping strips: each node stores "its" strip for processing.</p><p>-Cutting on horizontal strips overlapping in given number of pixels. 2. Framework architecture which allows both to avoid duplication of the program code implementing parallel algorithms and to provide extensibility of the library.</p><p>3. The code of the library has to minimize the inevitable overhead due to the growth of the abstraction level of the computational model. For this purpose, C++ language was chosen for implementation which provides the possibility of efficient generalization by means of the templates' mechanism.</p><p>4. Portability of the library to the wide range of the cluster computers which is provided by the choice of C++ and MPI (the standard of parallel programming for the computers with distributed memory) as development tools.</p><p>Basic elements of the library are the following classes: Image is the class implementing the abstraction of image. As one of its responsibilities, it (transparently for user) guarantees that the distributed representation of image data on the set of processing nodes is consistent and up-todate.</p><p>NeighborhoodManipulator is the class implementing the abstraction of the manipulator with the neighborhood of pixel. Allows to implement processing algorithms in isolation from concrete parameters of the image (the physical sizes, representation on the processing nodes and so forth), in the terms of the neighborhood of pixel being processed. The use of this abstraction provides the extensibility of the library by means of the creation of new processing functions compatible with the library. The following fragment of the C++ code shows SobelFilter class, implementation of the well-known Sobel filter which is compatible with the library: -2 * n.PixelRelativeToCurrent( 0, 1) 22.</p><p>-1 * n.PixelRelativeToCurrent( 1, 1))); 23. } 24. }; -Lines 3-6 define the size of the neighborhood affecting the result at a pixel; the library needs it to calculate the result at the pixels on the margins of image and on the margins of strips for "distributed" representation of image. For Sobel filter, all four sizes are ones as the filter accounts only the closest neighbors.</p><p>-Lines 8-23 describe the filter in the terms of the processing of single pixel. The parameter of this operation is the neighborhood manipulator which, by means of the PixelRelativeToCurrent(i, j) method, provides the access to the neighbor pixels (that is, displaced by i pixels horizontally and j pixels vertically from the pixel being processed).</p><p>The following fragment of code shows how the filter can be applied to image:</p><p>-Line 1 reads the image from disk file and distributes it among processing nodes as strips overlapping in one pixel.</p><p>-Line 2 applies to the image generic neighborhood-to-pixel operation parameterized with the object of the class implementing Sobel filter. The generic operation, simultaneously for all strips, will call processing operator consequently for each pixel.</p><p>-Generally speaking, the overlapping of strips specified in line 1 is not strictly obligatory as the code of line 2, if necessary, will load to each node the missing data from neighbor nodes. However, it does make sense as the code optimization which the user of the library can perform, having knowledge what operations he/she wants to apply.</p><p>Distinctive and important point in using and extending the library is that a user does not need to know the MPI model and to understand the details of internodal exchange in a cluster. The given approach showed its efficiency:</p><p>1. The performance of library-compatible implementation of the algorithm for circle structure detection on aerospace images <ref type="bibr" target="#b5">[7]</ref> is about 10 percent less compared to the implementation "from scratch" (that is in pure C++ and MPI, with the direct access to image data). At the same time, the creation itself of parallel program with the use of the developed framework is much simpler than the one "from scratch".</p><p>2. The efficiency of library-compatible implementation of the algorithm for circle structure detection is about 95% when executing on 8 nodes of NKS-30T+GPU cluster of the Siberian Supercomputer Center (SSCC) hosted in ICM&amp;MG SB RAS <ref type="bibr" target="#b6">[8]</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">SSCCIPGPU Library</head><p>In recent years, there is a great practical interest to the use of modern graphic processors (Graphics Processing Unit, GPU) as the general-purpose calculator. Generally speaking, GPU is oriented to the efficient solution of the tasks of computer graphics, in particular it contains the hardware functions allowing to do mass calculations (same operations over the large volume of data) efficiently (with the productivity of hundreds of gigaflops). These opportunities allow to use GPU in the tasks which are unrelated to visualization but also based on mass calculations, for example in image processing and analysis. In a number of practical problems, GPU calculations provided 70-fold acceleration compared to CPU calculations, which corresponds to the performance typical for supercomputers. The concept of general-purpose calculations in GPU also received the support of GPU vendors (e.g. CUDA technology from NVIDIA) which makes available the creation of GPU programs in high level languages without the knowledge of coprocessor architecture. This fact, as well as the low cost of modern GPUs, make them popular equipment of the modern supercomputer centers; thus, the main computing power at the moment of the SSCC SB RAS is the hybrid cluster NKS-30T+GPU which includes 40 nodes, each is equipped with three GPU NVIDIA Tesla M 2090 with Fermi architecture (compute capability 2.0), 512 kernels, and 6 Gbytes of GDDR5 memory. All of this makes important the development of software for the GPU involvement in the processing and the analysis of remote sensing data.</p><p>The principles on which the development of SSCCIPGPU <ref type="bibr" target="#b7">[9]</ref> library was based have much in common with the above-stated principles on which the earlier ParImProLib library was created. We will add only that:</p><p>1. C++ and CUDA was chosen as the development tools, which made the library portable and allowed to implement efficiently the extensible architecture of framework.</p><p>2. The multilevel hierarchy of GPU memory makes desirable the possibility to choose how to store images and algorithm parameters: in global, textural, or constant memory of GPU.</p><p>3. The complexity of the programming model of graphic processor makes desirable the possibility to choose between the use of synchronous and asynchronous CUDA API, and also to choose how to distribute calculations between several GPUs of single computing node (multi-GPU processing).</p><p>The following fragment of the code shows the SobelFilter_GPU class, GPU implementation of the Sobel filter: -The implementation of the class for GPU is very similar to the corresponding implementation for cluster with the difference of the use of CUDA directives (__host__ for the code for CPU; __device__, for GPU).</p><p>-Line 7 defines the ExportParamsForDevice method providing the serialization (translation to block of memory) algorithm parameters. The method is called by the framework to when copying algorithm parameters to GPU memory. In the case of the Sobel filter, the implementation of the method is trivial as the filter has no parameters.</p><p>-Line 10, to the described above neighborhood manipulator parameter of the operator of single pixel processing, adds params parameter which is a serialized form of algorithm parameters (memory block) copied by a framework to GPU memory.</p><p>-The implementation of the operator of processing (line 10-25), as a rule, deserializes (restores) algorithm parameters from params memory block (the step is absent for the trivial Sobel filter) and performs the processing of single pixel using the manipulator of the neighborhood.</p><p>The following fragment of code shows how the filter can be applied to image:</p><p>which is very similar to the corresponding code for cluster, except that line 2 specifies the "one-dimensional" access to image data in global GPU memory and the use of synchronous CUDA API for processing. Again, we specially note that the user of the library does not need to have deep knowledge in GPU programming to use and extend the library. Similar approach was also used for the implementation of multi-GPU processing. Here, the user has to specify the strategy of parallelization of calculation between several graphic accelerators (using OS multi-threading versus switching active GPUs in single OS thread context).</p><p>The following tells about the efficiency of the approach:</p><p>1. The performance of the library-compatible implementation of the algorithm for circle structure detection is the same as the one of the implementation "from scratch" (that is in pure C++ and CUDA). At the same time, the creation itself of parallel program with the use of the developed framework is much simpler than the one "from scratch".</p><p>2. The library-compatible implementation of the algorithm for circle structure detection, when running on single GPU NVIDIA Tesla M 2090 of NKS-30T+GPU cluster, is about 90 times faster than similar CPU implementation running on single Intel Xeon X5670 (2.93 GHz) processor of the cluster.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">Conclusion</head><p>The results obtained demonstrate that the framework approach to the implementation of high-performance image processing libraries is promising. Currently, the created prototype libraries are used when developing an experimental framework of high-performance image processing SSCCIP <ref type="bibr" target="#b8">[10]</ref>, a part of an experimental cloud framework <ref type="bibr" target="#b9">[11]</ref>. In further plans of the authors is the propagation of the approach to the image processing on Intel Xeon Phi processors with which the new NKS-1P cluster of SSCC SB RAS is equipped.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_0"><head>.PixelRelativeToCurrent(-1, -1) 18. + 2 * n.PixelRelativeToCurrent( 0, -1) 19. + 1 * n.PixelRelativeToCurrent( 1, -1) 20. -1 * n.PixelRelativeToCurrent(-1, 1) 21.</head><label></label><figDesc></figDesc><table><row><cell cols="2">1. class SobelFilter {</cell><cell></cell></row><row><cell cols="2">2. public:</cell><cell></cell></row><row><cell>3.</cell><cell>unsigned LeftMargin()</cell><cell>const { return 1; }</cell></row><row><cell>4.</cell><cell cols="2">unsigned RightMargin() const { return 1; }</cell></row><row><cell>5.</cell><cell>unsigned TopMargin()</cell><cell>const { return 1; }</cell></row><row><cell>6.</cell><cell cols="2">unsigned BottomMargin() const { return 1; }</cell></row><row><cell>7.</cell><cell></cell><cell></cell></row><row><cell>8.</cell><cell cols="2">unsigned operator()(const NeighborhoodManipulator&amp; n) {</cell></row><row><cell>9.</cell><cell>return abs(</cell><cell></cell></row><row><cell>10.</cell><cell cols="2">1 * n.PixelRelativeToCurrent(-1, -1)</cell></row><row><cell>11.</cell><cell cols="2">+ 2 * n.PixelRelativeToCurrent(-1, 0)</cell></row><row><cell>12.</cell><cell cols="2">+ 1 * n.PixelRelativeToCurrent(-1, 1)</cell></row><row><cell>13.</cell><cell cols="2">-1 * n.PixelRelativeToCurrent( 1, -1)</cell></row><row><cell>14.</cell><cell cols="2">-2 * n.PixelRelativeToCurrent( 1, 0)</cell></row><row><cell>15.</cell><cell cols="2">-1 * n.PixelRelativeToCurrent( 1, 1))</cell></row><row><cell>16.</cell><cell>+ abs(</cell><cell></cell></row><row><cell>17.</cell><cell>1 * n</cell><cell></cell></row></table></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_1"><head>1. class SobelFilter_GPU { 2. public: 3. __host__ unsigned LeftMargin() const { return 1; }</head><label></label><figDesc></figDesc><table><row><cell>4.</cell><cell cols="2">__host__ unsigned RightMargin() const { return 1; }</cell></row><row><cell>5.</cell><cell>__host__ unsigned TopMargin()</cell><cell>const { return 1; }</cell></row><row><cell>6.</cell><cell cols="2">__host__ unsigned BottomMargin() const { return 1; }</cell></row><row><cell>7.</cell><cell></cell><cell></cell></row><row><cell>8.</cell><cell cols="2">__host__ ParamsForDevice ExportParamsForDevice() const { return ParamsForDevice(); }</cell></row><row><cell>9.</cell><cell></cell><cell></cell></row><row><cell>10.</cell><cell cols="2">__device__ unsigned operator()(const NeiborhoodManupulator&amp; n, const byte* /*params*/) {</cell></row><row><cell>11.</cell><cell>return abs(</cell><cell></cell></row><row><cell>12.</cell><cell cols="2">1 * n.PixelRelativeToCurrent(-1, -1)</cell></row><row><cell>13.</cell><cell cols="2">+ 2 * n.PixelRelativeToCurrent(-1, 0)</cell></row><row><cell>14.</cell><cell cols="2">+ 1 * n.PixelRelativeToCurrent(-1, 1)</cell></row><row><cell>15.</cell><cell cols="2">-1 * n.PixelRelativeToCurrent( 1, -1)</cell></row><row><cell>16.</cell><cell cols="2">-2 * n.PixelRelativeToCurrent( 1, 0)</cell></row><row><cell>17.</cell><cell cols="2">-1 * n.PixelRelativeToCurrent( 1, 1))</cell></row><row><cell>18.</cell><cell>+ abs(</cell><cell></cell></row><row><cell>19.</cell><cell cols="2">1 * n.PixelRelativeToCurrent(-1, -1)</cell></row><row><cell>20.</cell><cell cols="2">+ 2 * n.PixelRelativeToCurrent( 0, -1)</cell></row><row><cell>21.</cell><cell cols="2">+ 1 * n.PixelRelativeToCurrent( 1, -1)</cell></row><row><cell>22.</cell><cell cols="2">-1 * n.PixelRelativeToCurrent(-1, 1)</cell></row><row><cell>23.</cell><cell cols="2">-2 * n.PixelRelativeToCurrent( 0, 1)</cell></row><row><cell>24.</cell><cell cols="2">-1 * n.PixelRelativeToCurrent( 1, 1)));</cell></row><row><cell>25.</cell><cell>}</cell><cell></cell></row><row><cell cols="2">26. };</cell><cell></cell></row></table></figure>
		</body>
		<back>

			<div type="acknowledgement">
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Acknowledgements. This work was conducted within the framework of the budget project 0315-2016-0003 for ICM&amp;MG SB RAS with the supercomputer facilities provided by Siberian Supercomputer Center SB RAS.</p></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<monogr>
		<title level="m" type="main">Software Technologies for Processing of Earth Remote Sensing Data // Pattern Recognition and Image Analysis</title>
		<author>
			<persName><forename type="first">A</forename><surname>Buchnev</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Pyatkin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><forename type="middle">V</forename><surname>Rusin</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2013">2013</date>
			<biblScope unit="volume">23</biblScope>
			<biblScope unit="page" from="474" to="480" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<monogr>
		<ptr target="https://www.tensorflow.org" />
		<title level="m">TensorFlow</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<monogr>
		<ptr target="https://www.mathworks.com/help/vision" />
		<title level="m">Computer Vision Toolbox</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<monogr>
		<ptr target="https://software.intel.com/intel-ipp" />
		<title level="m">Intel® Integrated Performance Primitives (Intel® IPP</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Object-Oriented Parallel Image Processing Library // Parallel Computing Technologies</title>
		<author>
			<persName><forename type="first">E</forename><forename type="middle">V</forename><surname>Rusin</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="s">Lecture Notes in Computer Science</title>
		<imprint>
			<biblScope unit="volume">5698</biblScope>
			<biblScope unit="page" from="344" to="349" />
			<date type="published" when="2009">2009. 2009</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Crater Detection in Aero-space Imagery Using Simple Nonparametric Statistical Tests</title>
		<author>
			<persName><forename type="first">Alekseev</forename><forename type="middle">A S</forename><surname>Pyatkin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><forename type="middle">P</forename><surname>Salov</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><forename type="middle">I</forename></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Lecture Notes in Computer Science</title>
		<imprint>
			<biblScope unit="volume">179</biblScope>
			<biblScope unit="page" from="793" to="799" />
			<date type="published" when="1993">1993</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<monogr>
		<title/>
		<author>
			<persName><surname>Sscc</surname></persName>
		</author>
		<author>
			<persName><surname>Ras</surname></persName>
		</author>
		<ptr target="http://www.sscc.icmmg.nsc.ru/hardware.html" />
		<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Tehnologii obrabotki dannyh distancionnogo zondirovanija Zemli na gibridnom klastere NKS-30T+GPU [Technologies for processing Earth remote sensing data on the NKS-30Т+GPU hybrid cluster</title>
		<author>
			<persName><forename type="first">E</forename><forename type="middle">V</forename><surname>Rusin</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">// Interekspo Geo-Sibir</title>
		<imprint>
			<biblScope unit="volume">4</biblScope>
			<biblScope unit="issue">1</biblScope>
			<biblScope unit="page" from="46" to="49" />
			<date type="published" when="2016">2016</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">SSCCIP -A Framework for Building Distributed High-Performance Image Processing Technologies // Parallel Computing Technologies</title>
		<author>
			<persName><forename type="first">E</forename><forename type="middle">V</forename><surname>Rusin</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="s">Lecture Notes in Computer Science</title>
		<imprint>
			<biblScope unit="volume">6873</biblScope>
			<biblScope unit="page" from="467" to="472" />
			<date type="published" when="2011">2011. 2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<monogr>
		<title level="m" type="main">Framework of cloud web services for processing remote sensing data // E3S Web of Conferences</title>
		<author>
			<persName><forename type="first">A</forename><surname>Buchnev</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Kim</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Pyatkin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Pyatkin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Rusin</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2019">2019</date>
			<biblScope unit="volume">75</biblScope>
			<biblScope unit="page">3001</biblScope>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
