    <footer class="footer">
      <div class="container">
        <div class="row">
          <div class="col-lg-12">
            <p class="text-muted">&copy; {{ 'now' | date: "%Y" }} Google</p>
          </div>
        </div>
      </div>
    </footer>

    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="/assets/js/bootstrap.min.js"></script>

    <!-- Anchor JS -->
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.2.0/anchor.min.js"></script>
    <script>
      // Automatically add anchors and links to all header elements that don't already have them.
      anchors.add();
    </script>

    <script>
      var shiftWindow = function() {
        if (location.hash.length !== 0) {
          window.scrollBy(0, -50);
        }
      };
      window.addEventListener("hashchange", shiftWindow);

      var highlightCurrentSidebarNav = function() {
        var href = location.pathname;
        var item = $('#sidebar-nav [href$="' + href + '"]');
        if (item) {
          var li = item.parent();
          li.addClass("active");

          if (li.parent() && li.parent().is("ul")) {
            do {
              var ul = li.parent();
              if (ul.hasClass("collapse")) {
                ul.collapse("show");
              }
              li = ul.parent();
            } while (li && li.is("li"));
          }
        }
      };

      $(document).ready(function() {
        // Scroll to anchor of location hash, adjusted for fixed navbar.
        window.setTimeout(function() {
          shiftWindow();
        }, 1);

        // Flip the caret when submenu toggles are clicked.
        $(".sidebar-submenu").on("show.bs.collapse", function() {
          var toggle = $('[href$="#' + $(this).attr('id') + '"]');
          if (toggle) {
            toggle.addClass("dropup");
          }
        });
        $(".sidebar-submenu").on("hide.bs.collapse", function() {
          var toggle = $('[href$="#' + $(this).attr('id') + '"]');
          if (toggle) {
            toggle.removeClass("dropup");
          }
        });

        // Highlight the current page on the sidebar nav.
        highlightCurrentSidebarNav();
      });
    </script>

    <!-- Google Analytics tracking code -->
    <script>
      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
      (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
      m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
      })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

      ga('create', 'UA-61082125-1', 'auto');
      ga('send', 'pageview');
    </script>
