<!DOCTYPE HTML>
{% comment %}
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You 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

https://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.
{% endcomment %}
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());
    gtag('config', 'UA-141008188-1');
  </script>

  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
  <script src="https://cdn.rawgit.com/icons8/titanic/master/dist/js/titanic.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/bodymovin/4.5.9/bodymovin.min.js"></script>
  <link rel="stylesheet" href="{{ site.baseurl }}/assets/css/styles.css" />
  <link rel="shortcut icon" href="favicon.ico"/>
  <meta http-equiv="CACHE-CONTROL" content="NO-CACHE">
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />

  {% include open-graph.html %}

  <base href="{{ site.baseurl }}/" />
  <title>{{page.title}}</title>
</head>

<body class="page noscroll" id="main">
  {% include header.html %}

  <div class="toc_and_doc">
    <div class="page-content">
      <article>
        {{content}}
        <div class="bottom-links">
          <a href="https://github.com/apache/royale-docs/edit/master/{{ page.path }}" target="_blank">Edit this page</a>
        </div>
      </article>
      <div class="toc" id="toc">
        <div class="sidebar-logo">
          <a href="https://royale.apache.org/">
            <img src="https://royale.apache.org/wp-content/uploads/2018/01/apache-royale-tm-logo-light.svg"/>
          </a>
        </div>
        
        <div class="sidebar">
          {% include toc.html %}
        </div>
        <div id="sbButton" onclick="showSideBar()" role="button" tabindex="0" class="sidebar-button titanic titanic-forward-arrow"/>
        </div>
      </div>
    </div>
  </div>
  
  {% include footer.html %}
  {% include docsearch.html %}

  <script>
    var titanic = new Titanic({
      hover: false, // auto animated on hover (default true)
      click: false  // auto animated on click/tap (default false)
    });

    function showSideBar()
    {
      if(toc.classList.contains("open"))
      {
        titanic.items[0].off();
        main.classList.remove("open");
        toc.classList.remove("open");
      }
      else
      {
        titanic.items[0].on();
        main.classList.add("open");
        toc.classList.add("open");
      }
    }
  </script>
</body>


</html>
