<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Analyzing Technical Lag in Docker Images</article-title>
      </title-group>
      <contrib-group>
        <aff id="aff0">
          <label>0</label>
          <institution>Ahmed Zerouali University of Mons</institution>
        </aff>
      </contrib-group>
      <abstract>
        <p>-Packaging software into containers is becoming a common practice when deploying services in cloud and other environments. Docker is currently one of the most popular container technologies for building and deploying containers. A key part of this technology is the concept of registry, where container images are stored and shared. The largest one of these registries is Docker Hub, with hundreds of thousands of public Docker images ready for deployment. A container image includes usually a collection of software packages, in many cases corresponding to a Linux-based distribution. By analyzing packages in images, we can learn to which extent those images offer packages that have newer versions available. To measure how “outdated” a container image is, we introduce the concept of “technical lag” for the container, as the difference between a given image, and the most updated image that is possible with the same collection of packages. Using this concept as the framework for the analysis, we empirically measure and study technical lag for 2,245 Docker Hub official images based on the Alpine Linux distribution, with a total of 63,581 packages. Our results show a strong presence of technical lag inside of those images, indicating that even well-maintained containers could benefit of better procedures for updating. Index Terms-Empirical analysis, Docker containers, technical</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>lag</p>
    </sec>
    <sec id="sec-2">
      <title>I. INTRODUCTION</title>
      <p>
        In order to reduce conflicts between computing
environments and increase development productivity, packaging
software into isolated and executable containers has become
a common practice. Docker [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] containers emerged as a
lightweight approach to provision multiple applications on a
single host, sharing and wrapping system libraries,
configuration files, and code of the same operating system.
      </p>
      <p>
        As an open source and Linux-based platform, Docker
provides support for Linux and non-Linux operating systems.
This led to the creation of registries that provide a common
place for users willing to build, update and share their Docker
images with others. One of the largest registries is Docker Hub
[
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], which distributes a large number of public images.
      </p>
      <p>Docker Hub images are distributed using repositories
allowing users to develop and maintain versioned images. A
public repository can be an official or a community repository.
Community repositories can be created by any other user
or organization. An official repository contains public and
certified images from official companies (e.g., ElasticSearch,
Debian Alpine, etc.). Official repositories can be an essential
base operating system that serve as the starting point for other
users, thus they are more secure and well maintained.</p>
      <p>
        Docker Hub images, and Linux-based images in particular,
usually include a collection of software packages
corresponding to the used Linux distribution. Once an image is built, its
packages remain frozen until the image is updated, rebuilt and
re-uploaded to the registry. Such images provide interesting
datasets from which one can gather information about how
maintained these images are, or how outdated and vulnerable
their contained packages are. Gummaraju et al. already
observed that about one third of the official images in Docker
Hub contain high priority security vulnerabilities [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ],
demonstrating a strong need for more automated and systematic
methods of applying security updates.
      </p>
      <p>
        In this paper, we focus on Docker images by studying
how outdated their contained packages are, compared to their
latest available releases. To this extent, we rely on the notion
of technical lag, a concept first introduced by
GonzalezBarahona et al. [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. In order to estimate the effort needed
to deploy the most recent version of a deployed software,
technical lag can be used and measured as the difference (e.g.,
time, functionality, etc.) between the version of the software
deployed in production and the most recent version available
of this software.
      </p>
      <p>We analyze this technical lag for containers, as the
increasing lag between a given image and the most up-to-date
image available. More specifically, we empirically measure
and study technical lag for 2; 245 Docker Hub images based on
the Linux distribution Alpine, retained mainly from 42 official
repositories, with a total of 63; 581 package versions. We focus
on a single research question: How can we quantify technical
lag induced by packages in Docker images?</p>
    </sec>
    <sec id="sec-3">
      <title>II. RELATED WORK</title>
      <p>
        Gonza´lez-Barahona et al. [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] have proposed a theoretical
model of “technical lag” to measure how outdated software
components are. They explored many ways in which technical
lag can be measured. They also presented specific cases for
which it is useful to analyze the evolution of technical lag.
      </p>
      <p>
        Ayed et al. [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] tackled the issue of enhancing the description
and search of Docker images, proposing Docker2RDF, a
system that extracts information from the Docker Hub description
pages and builds a semantic description of Docker images. In
order to enhance the support for discovering Docker images,
Brogi et al. [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] introduced DockerFinder, a microservice-based
prototype that permits searching for images based on multiple
attributes, e.g., image name, image size, or supported software
distributions.
      </p>
      <p>
        Cito et al. [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] conducted an empirical study on a dataset
of 70,000 Dockerfiles, and contrasted this general population
with samplings containing the Top-100 and Top-1000 most To know which Docker images make use of the Alpine base
popular projects using Docker. Their goal was to characterize image, we extracted information about all available images
the Docker ecosystem, discover prevalent quality issues, and from the 122 official repositories. We found that by the end of
study the evolution of Docker images. Among other results, the year 2017 (i.e., 27 December 2017), Docker Hub contained
they found that the most popular projects change more often more than 12,840 official images. From this list of images,
than the rest of the Docker population, with on average 5.81 we searched for those tagged with the word “alpine”, as it
revisions per year and 5 lines of code changed. Furthermore, is a common practice in Docker Hub to use this word in
they found that 34% of all Docker images, from a represen- the tag of images based on Alpine, e.g., “imageRepo:alpine”,
tative sample of 560 projects, were not able to be built. “imageRepo:v1-alpine”. Out of 12,840 official images, we
      </p>
      <p>
        Shu et al. [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] performed a large scale study on the state found 2,253 images (i.e., 17.5%) from 42 official repositories
of security vulnerabilities in both community and official to be considered for our data extraction.
Docker Hub repositories. They proposed the Docker Image We locally downloaded each image, and extracted the
Vulnerability Analysis (DIVA) framework to automatically version of Alpine Linux used, as well as the name and version
discover, download, and analyze Docker images for security of all packages installed in the image. From 261 distinct used
vulnerabilities. They studied a set of 356,218 images and packages, we found 82,949 package versions installed in 2,253
found that both official and community repositories contain images, with an average of 36 package versions per image.
more than 180 vulnerabilities on average. Another finding is From the Alpine package manager we extracted the build
that many images had not been updated for hundreds of days. date for each version of each installed package in the
down
      </p>
      <p>
        Not specifically focused on Docker images, Kula et al. [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] loaded Docker images. Unfortunately, we found that the
inforstudied the impact of dependency updates in the GitHub mation of 23% of the package versions is no longer available
ecosystem. They empirically studied library migration of a set in the package manager. After discarding the images and
of 4,600 GitHub repositories and 2,700 library dependencies, package versions with incomplete information, we retained
and found that 81.5% of the studied projects keep their 2,245 Docker images and 63,581 package versions for our
outdated dependencies. Surveying developers about this, they empirical analysis.
found that 69% of the interviewees were unaware of their
vulnerable dependencies.
      </p>
      <p>IV. HOW CAN WE QUANTIFY TECHNICAL LAG INDUCED BY</p>
      <p>PACKAGES IN DOCKER IMAGES?</p>
    </sec>
    <sec id="sec-4">
      <title>III. METHOD</title>
      <sec id="sec-4-1">
        <title>A. Choice of the base image</title>
        <p>While it is possible to create Docker images from scratch,
most Docker images are based on so-called parent images.
These parent images are mostly base images that do not rely
on any other image, except for the Docker-reserved minimal
image “scratch”. In order to find publicly available information
about system packages installed in Docker images, we chose
a base image that is based on a Linux-distribution.</p>
        <p>
          One of the most popular base images is Alpine1. It is a
minimal image based on the security-oriented, lightweight
Alpine Linux distribution2 with a complete package index that
is no more than 8MB in size. Because of Alpine’s widespread
use in Docker Hub we chose to locally mirror and analyze
Docker images that rely on Alpine’s lightweight base image3.
Alpine has a quite simple and good package manager that is
attracting people to migrate their images to it [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ].
        </p>
      </sec>
      <sec id="sec-4-2">
        <title>B. Data extraction</title>
        <p>Our empirical analysis will only focus on official
repositories, as they are supposed to be more secure and well
maintained. A Docker repository can have many images, or
so called tags. A maintainer can create an image repository
“imageRepo” and then upload tagged images to it, e.g.,
“imageRepo:debian”, “imageRepo:v1”, etc.</p>
        <p>1https://hub.docker.com/ /alpine/
2https://alpinelinux.org/about/
3http://pkgs.alpinelinux.org/</p>
      </sec>
      <sec id="sec-4-3">
        <title>A. Measuring technical lag</title>
        <p>
          The concept of technical lag seems similar to the metaphor
of “technical debt” [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ], [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ]. Technical debt refers to the
qualitative difference between code “as it should be” and code
“as it is”. Technical lag refers to the increasing delay between
the most appropriate upstream versions of packages used by
a software system and those actually used in the deployed
system [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ].
        </p>
        <p>Technical lag of a Docker image can refer to anything
that makes an image container out-of-date with respect to the
most recent available image. For example, more recent images
may have fixed security vulnerabilities, added packages with
additional functionality, updated packages to fix bugs, made
changes to the configuration files, etc.</p>
        <p>In our analysis, we consider the technical lag of an image as
the technical lag of the collection of package versions installed
by the image. Therefore, we need to analyze the technical
lag of these installed package versions. Technical lag can be
calculated in different ways. In this paper, we will use two
different definitions:
1) package time lag is the time difference (in days) between
the release date of installed package version and the date
of the latest available package release.
2) package version lag computes the total number of
releases that the installed package version is behind the
latest available package release. In this case, we consider
all types of releases (major, minor and patch releases).</p>
        <p>For example, version 2.4.10-r0 of package icinga2 was
created on 2016-05-25. If we find it installed in a certain
image, we compare it to the latest available version before the
last update. Considering that the last update is 2017-12-01, the
latest available version would be 2.8.0-r0 that was created on
2017-11-23. The package time lag in this case would be 546
days. The package version lag would be 3, because there are
three releases between these two dates in the Alpine package
manager (i.e., 2.5.4-r2, 2.6.3-r1 and 2.8.0-r0).</p>
        <p>To calculate the impact that technical lag has on images
and repositories, we can rely on the outdated packages’ time
or version lag. However, in our case, we consider technical
lag impact as:
1) image lag impact computes the number of packages in
a Docker image that are out-of-date because they have a
non-zero package lag.
2) repository lag impact as the median number of outdated
packages per image contained in the repository.</p>
      </sec>
      <sec id="sec-4-4">
        <title>B. Package time lag</title>
        <p>For each used package version in our dataset (63,581 in
total), we searched for its build date using the name and
version number found in the image container, and compared
this to the build date of the latest available package version.
Based on this, we computed the package time lag. We found
59,693 (94% of all installed versions) of all package versions
to be out of date (i.e., package time lag&gt; 0), while the number
of images did not change. The latter implies that all 2,245
analyzed Docker images have at least one outdated package
version installed.</p>
        <p>Figure 1 shows box plots of the distribution of package
version time lag, grouped by the installed Alpine Linux version.
We notice that the time lag is related to the Alpine version: the
lag decreases as the Alpine version increases. This is expected,
since base images with newer versions of Alpine often come
with newer versions of packages. However, we observe a very
high technical lag for all distributions, as medians and means
are higher than the time difference between today and the date
of the creation of the Alpine Linux releases. Table I shows a
decreasing time lag w.r.t to the Alpine Linux releases. We also
observe an increasing difference between the mean and median
values indicating that the data distribution is becoming more
skewed over time.</p>
        <p>We checked whether we could find images based on Alpine
Linux 3.3 that are still being updated, since that version of
Alpine Linux is no supported since November 2017. We found
only one image that was updated after the end of the support,
namely the alpine:3.3 image itself.</p>
        <p>Figure 2 shows box plots of the distribution of the package
time lag for outdated packages, grouped by the year of the
last update of the image containers. As expected, the time lag
decreases, because recently updated containers have packages
with a lower time lag. The mean time lag in the distribution
of 2016 is close to two years (i.e., 663 days), while in 2017
it is close to one year and two months (i.e., 403 days).
Note, however, that the number of newly created images is
increasing, and this affects the distribution of the time lag,
since old images could have been stopped being updated. In
fact, we found that 18% (i.e., 394) of the images stopped being
updated in 2016.</p>
        <p>To investigate how images tend to update their packages,
we extracted a second snapshot of the images, 18 days after
our first data extraction. We found that 25% (i.e., 552) of
the images had been updated, and the median time difference
between the last two updates for these images is 27 days.</p>
        <p>For these images, we verified whether they updated their
packages or not. We found that from 20,785 outdated package
versions, only 595 were updated. These updates happened
to important packages such as openssl, libcrypto1.0, libssl1.0
and apk-tools. However, these updates happened in only 50%
(i.e., 278) of the re-updated images, most of them in the
images of php, tomcat and wordpress. This reveals that Docker
images based on Alpine do not tend to update most of their
outdated packages, they only update important packages such
as openssl.</p>
        <p>
          These results provide insight to maintainers and users
willing to create or use images on top of official repositories, about
how up-to-date are the packages installed inside these images.
Our analysis reveals that they should expect many outdated
packages, making the image vulnerable to security issues in
many cases [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ].
        </p>
        <p>To analyze the package version lag, we identified all
available versions of outdated packages used in at least one of the
analyzed Docker images of the Alpine package manager. We
calculated how many package versions were released between
the build date of the used version and the latest available
release of that package.</p>
        <p>Figure 3 shows the distribution of package version lag for
outdated packages, grouped by the year of the last update. We
notice that version lag decreased from 2016 to 2018,
corresponding to the reduction in time lag observed in Section IV-B.
This implies again that the number of newly created images
influenced the distribution of the version lag, since we can still
find a maximum version lag of 6 releases in both years 2017
and 2018.</p>
      </sec>
      <sec id="sec-4-5">
        <title>D. Image and repository lag impact</title>
        <p>To analyze the image impact lag of Docker containers we
computed the total number of outdated packages installed
within each container. Unlike our previous observations,
Figure 4 reveals that the number of outdated packages is
increasing, which means that the images are adding more packages
without upgrading them later.</p>
        <p>To calculate the repository impact lag, we relied on the
same approach as the one used for image lag impact. We
computed repository lag impact as the median number of
outdated packages per image. Figure 5(a) shows the first 5
official Docker repositories having the highest median number
of outdated packages per image, while Figure 5(b) shows the 5
official Docker repositories with the lowest median number of
outdated packages per image. A manual inspection in Docker
Hub between the repositories in the figure (a) and those in
figure (b) showed a large difference of vulnerabilities found
in their images. Nearly all scanned images of the repositories
solr, haxe and clojure have vulnerabilities.</p>
        <p>V. CONCLUSIONS, LIMITATIONS AND FURTHER RESEARCH</p>
        <p>We analyzed technical lag induced by outdated packages
installed in Docker images based on the Alpine Linux
distribution. We computed this technical lag based on the difference
in time and difference in number of releases between the
deployed package version and the latest available release of
each package. We found 94% of all package versions to be
outdated across our dataset of 2,245 analyzed Docker images,
indicating a strong presence of technical lag inside these
images. This demonstrates that even well-maintained container
images could benefit from better procedures of updating.</p>
        <p>We studied technical lag because in an ideal world, images
should depend on the most recent available version of their
used packages, in order to benefit from the latest functionality,
security updates and bug fixes. However, in many cases,
maintainers are more focused on other software characteristics
such as package stability, or they just choose not to upgrade
certain packages because of the considerable effort that may
be involved in doing so (“if it ain’t broke, don’t fix it”). It
therefore may be useful to explore more sophisticated notions
of technical lag that are able to quantify the actual effort
needed to deploy the most available stable package version.</p>
        <p>While searching the available information in the Alpine
package manager, we did not find relevant information for
some package versions. This may have led to an
underestimation of the technical lag reported in this article. However,
we are confident about our dataset, since we used 77% (i.e.,
63,581 package versions) of the original dataset.</p>
        <p>When studying the technical lag, we did not differentiate
between the specific characteristics of packages or Docker
images, such as their age, size, service, targeted audience, or
functionality provided. This remains a topic of future work.
We also did not perform an analysis of Docker images that
rely on other base images such as Debian base images or other
community and official base images. Comparing the effect of
the Linux distribution (and more generally, the quality of the
base image) on technical lag also remains a topic of future
work. Finally, we aim to study snapshots of Docker images
over time to be able to carry out a more fine-grained study on
the evolution of technical lag.</p>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>Dirk</given-names>
            <surname>Merkel</surname>
          </string-name>
          .
          <article-title>Docker: lightweight linux containers for consistent development and deployment</article-title>
          .
          <source>Linux Journal</source>
          ,
          <year>2014</year>
          (
          <volume>239</volume>
          ):
          <fpage>2</fpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>Docker</given-names>
            <surname>Inc</surname>
          </string-name>
          .
          <article-title>Docker hub</article-title>
          . https://hub.docker.com/. accessed:
          <volume>01</volume>
          /01/
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>Jayanth</given-names>
            <surname>Gummaraju</surname>
          </string-name>
          , Tarun Desikan, and
          <string-name>
            <given-names>Yoshio</given-names>
            <surname>Turner</surname>
          </string-name>
          .
          <source>Over</source>
          <volume>30</volume>
          %
          <article-title>of official images in docker hub contain high priority security vulnerabilities</article-title>
          .
          <source>Technical report, Technical report, BanyanOps</source>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <surname>Jesus</surname>
            <given-names>M</given-names>
          </string-name>
          <string-name>
            <surname>Gonzalez-Barahona</surname>
            , Paul Sherwood, Gregorio Robles, and
            <given-names>Daniel</given-names>
          </string-name>
          <string-name>
            <surname>Izquierdo</surname>
          </string-name>
          .
          <article-title>Technical lag in software compilations: Measuring how outdated a software deployment is</article-title>
          .
          <source>In IFIP International Conference on Open Source Systems</source>
          , pages
          <fpage>182</fpage>
          -
          <lpage>192</lpage>
          . Springer,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>Ahmed</given-names>
            <surname>Ben</surname>
          </string-name>
          <string-name>
            <surname>Ayed</surname>
          </string-name>
          , Julien Subercaze, Frederique Laforest, Tarak Chaari, Wajdi Louati, and Ahmed Hadj Kacem.
          <article-title>Docker2rdf: Lifting the docker registry hub into rdf</article-title>
          .
          <source>In Services (SERVICES)</source>
          ,
          <source>2017 IEEE World Congress on</source>
          , pages
          <fpage>36</fpage>
          -
          <lpage>39</lpage>
          . IEEE,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>Antonio</given-names>
            <surname>Brogi</surname>
          </string-name>
          , Davide Neri, and
          <string-name>
            <given-names>Jacopo</given-names>
            <surname>Soldani</surname>
          </string-name>
          . Dockerfinder:
          <article-title>Multiattribute search of docker images</article-title>
          .
          <source>In Cloud Engineering (IC2E)</source>
          , 2017 IEEE International Conference on, pages
          <fpage>273</fpage>
          -
          <lpage>278</lpage>
          . IEEE,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7] Ju¨rgen Cito, Gerald Schermann, John Erik Wittern, Philipp Leitner, Sali Zumberi, and
          <string-name>
            <surname>Harald C Gall</surname>
          </string-name>
          .
          <article-title>An empirical analysis of the docker container ecosystem on github</article-title>
          .
          <source>In Proceedings of the 14th International Conference on Mining Software Repositories</source>
          , pages
          <fpage>323</fpage>
          -
          <lpage>333</lpage>
          . IEEE Press,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>Rui</given-names>
            <surname>Shu</surname>
          </string-name>
          , Xiaohui Gu, and
          <string-name>
            <given-names>William</given-names>
            <surname>Enck</surname>
          </string-name>
          .
          <article-title>A study of security vulnerabilities on docker hub</article-title>
          .
          <source>In Proceedings of the Seventh ACM on Conference on Data and Application Security and Privacy</source>
          , pages
          <fpage>269</fpage>
          -
          <lpage>280</lpage>
          . ACM,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>Raula</given-names>
            <surname>Gaikovina</surname>
          </string-name>
          <string-name>
            <surname>Kula</surname>
          </string-name>
          , Daniel M. German, Ali Ouni, Takashi Ishio, and
          <string-name>
            <given-names>Katsuro</given-names>
            <surname>Inoue</surname>
          </string-name>
          .
          <article-title>Do developers update their library dependencies? Empirical Software Engineering</article-title>
          , May
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>Brian</given-names>
            <surname>DeHamer</surname>
          </string-name>
          .
          <source>Docker hub top 10</source>
          . https://www.ctl.io/developers/blog/post/docker-hub-top-
          <volume>10</volume>
          /. accessed:
          <volume>01</volume>
          /01/
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>Ward</given-names>
            <surname>Cunningham</surname>
          </string-name>
          .
          <article-title>The wycash portfolio management system</article-title>
          .
          <source>ACM SIGPLAN OOPS Messenger</source>
          ,
          <volume>4</volume>
          (
          <issue>2</issue>
          ):
          <fpage>29</fpage>
          -
          <lpage>30</lpage>
          ,
          <year>1993</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>P.</given-names>
            <surname>Kruchten</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R. L.</given-names>
            <surname>Nord</surname>
          </string-name>
          ,
          <string-name>
            <surname>and I. Ozkaya.</surname>
          </string-name>
          <article-title>Technical debt: From metaphor to theory and practice</article-title>
          .
          <source>IEEE Software</source>
          ,
          <volume>29</volume>
          (
          <issue>6</issue>
          ):
          <fpage>18</fpage>
          -
          <lpage>21</lpage>
          ,
          <year>Nov 2012</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>