
      {{ $isChapter := .Params.chapter | default (eq .Kind "section")}}
      {{ if $isChapter }}
        </div> <!-- end chapter-->
      {{ end }}
      </div>
    </div>

    {{ if $.Site.Params.autoNav }}
    {{ $.Scratch.Set "_sectionpages" (slice) }}
    {{ if $.Site.Params.menu }}
      {{ range $sname := $.Site.Params.menu }}
        {{ $.Scratch.Add "_sectionpages" ($.Site.GetPage "section" $sname) }}
      {{ end }}
    {{ else }}
      {{ range $sname, $spages := .Site.Sections }}
        {{ $.Scratch.Add "_sectionpages" ($.Site.GetPage "section" $sname) }}
      {{ end }}
      {{ $.Scratch.Set "_sectionpages" (sort ($.Scratch.Get "_sectionpages") "Weight") }}
    {{ end }}
    {{ $.Scratch.Set "_allpages" (slice) }}
    {{ range $.Scratch.Get "_sectionpages" }}
      {{ if .Content }}
        {{ $.Scratch.Add "_allpages" . }}
      {{ end }}
      {{ range index $.Site.Sections .Section }}
        {{ $.Scratch.Add "_allpages" .Page }}
      {{ end }}
    {{ end }}
    {{ end }}

    <div id="navigation">
        {{ if $.Site.Params.autoNav }}
        {{ $allpages := $.Scratch.Get "_allpages" }}
        {{ range $index, $element := $allpages }}
          {{if eq $element.UniqueID $.UniqueID }}
            {{ if not (isset $.Params "prev") }}
              {{ with index $allpages (sub $index 1) }}
                <a class="nav nav-prev" href="{{ .URL }}"> <i class="fa fa-chevron-left"></i></a>
              {{ end }}
            {{ end }}
            {{ if not (isset $.Params "next") }}
              {{ with index $allpages (add $index 1) }}
                <a class="nav nav-next" href="{{ .URL }}" style="margin-right: 0px;"><i class="fa fa-chevron-right"></i></a>
              {{ end }}
            {{ end }}
          {{ end }}
        {{ end }}
        {{ end }}
        {{ with .Params.prev }}<a class="nav nav-prev" href="{{ . | relURL }}"> <i class="fa fa-chevron-left"></i></a>{{ end }}
        {{ with .Params.next }}<a class="nav nav-next" href="{{ . | relURL }}" style="margin-right: 0px;"><i class="fa fa-chevron-right"></i></a>{{ end }}
    </div>

    </section>
    <div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
      <div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
    </div>
    <script src="http://ovfotjrsi.bkt.clouddn.com/docs/js/clipboard.min.js"></script>
    <script src="http://ovfotjrsi.bkt.clouddn.com/docs/js/perfect-scrollbar.min.js"></script>
    <script src="http://ovfotjrsi.bkt.clouddn.com/docs/js/perfect-scrollbar.jquery.min.js"></script>
    <script src="http://ovfotjrsi.bkt.clouddn.com/docs/js/jquery.sticky-kit.min.js"></script>
    <script src="http://ovfotjrsi.bkt.clouddn.com/docs/js/featherlight.min.js"></script>
    <script src="http://ovfotjrsi.bkt.clouddn.com/docs/js/html5shiv-printshiv.min.js"></script>
    <script src="http://ovfotjrsi.bkt.clouddn.com/docs/js/highlight.pack.js"></script>
    <script>hljs.initHighlightingOnLoad();</script>
    <script src="http://ovfotjrsi.bkt.clouddn.com/docs/js/learn.js"></script>
    <script src="http://ovfotjrsi.bkt.clouddn.com/docs/js/hugo-learn.js"></script>
    {{ partial "script.html" . }}
  </body>
</html>
