<!--
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License. See accompanying LICENSE file.
-->
{{partial "header.html" .}}

    <!-- Main jumbotron for a primary marketing message or call to action -->
    <div class="jumbotron">
      <div class="container">
        {{range where .Site.Pages "Title" "Description"}}
        {{.Content}}
        {{end}}
        <p>
          <a class="btn btn-primary btn-lg" href="https://hadoop.apache.org/docs/stable" role="button">Learn more &raquo;</a>
          <a class="btn btn-warning btn-lg" href="/releases.html" role="button">Download &raquo;</a>
          <a class="btn btn-success btn-lg" href="https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html" role="button">Getting started &raquo;</a>
        </p>
      </div>
    </div>

    <div class="container">
      <!-- Example row of columns -->
      <div class="row">
        <div class="col-md-4">
          <h2>Latest news</h2>
            <div class="col-md-12">
            {{range first 5 (where (where .Site.Pages "Section" "in" (slice "release" "news")) ".Name" "not in" (slice "News" "Releases")) }}
            <div class="panel panel-default">
               <div class="panel-heading clearfix"><a class="pull-left" href={{.RelPermalink}}>{{.Title}}</a> <small class="pull-right">{{dateFormat "2006 Jan 2 " .Date}}</small></div>
               <div class="panel-body">
                  {{.Content}}
               </div>
              </div>
            {{end}}
            <p><a class="next" href="/release.html">Release archive &rarr;</a></p>
            <p><a class="next" href="/news.html">News archive &rarr;</a></p>
          </div>
       </div>
        <div class="col-md-4">
          {{range where .Site.Pages "Title" "Modules"}}
          <h2>{{.Title}}</h2>
          {{.Content}}
          {{end}}
          <h2>Who Uses Hadoop?</h2>
          <p>
            A wide variety of companies and organizations use Hadoop for both research and production.
             Users are encouraged to add themselves to the Hadoop <a href="https://wiki.apache.org/hadoop/PoweredBy">PoweredBy wiki page</a>.</p>
       </div>
       <div class="col-md-4">
         {{range where .Site.Pages "Title" "Related projects"}}
         <h2>{{.Title}}</h2>
         {{.Content}}
         {{end}}
        </div>
      </div>

      <hr>


    </div> <!-- /container -->

{{partial "footer.html" .}}
