Files
documentation/opensource/contribute/index.html
2021-07-12 08:10:23 +00:00

105 lines
24 KiB
HTML

<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="ie=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><link rel=stylesheet href=https://doc.kerberos.io/main.5aa8061fdddcae33bf9aae606a659f783fca649c2a6c915897a14d1088493ae547064045e7ca5a43d69061955d449757d1bcb708760ae71f478384770974e798.css integrity="sha512-WqgGH93crjO/mq5gamWfeD/KZJwqbJFYl6FNEIhJOuVHBkBF58paQ9aQYZVdRJdX0by3CHYK5x9Hg4R3CXTnmA==" crossorigin=anonymous><noscript><style>img.lazyload{display:none}</style></noscript><meta name=robots content="index, follow"><meta name=googlebot content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1"><meta name=bingbot content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1"><title>Contribute - Kerberos Docs</title><meta name=description content="We are backed up by an amazing community. Feel free the help."><link rel=canonical href=https://doc.kerberos.io/opensource/contribute/><meta name=twitter:card content="summary_large_image"><meta name=twitter:image content="/doks.png"><meta name=twitter:title content="Contribute"><meta name=twitter:description content="We are backed up by an amazing community. Feel free the help."><meta name=twitter:site content="@kerberosio"><meta name=twitter:creator content="@kerberosio"><meta property="og:title" content="Contribute"><meta property="og:description" content="We are backed up by an amazing community. Feel free the help."><meta property="og:type" content="article"><meta property="og:url" content="/opensource/contribute/"><meta property="og:image" content="/doks.png"><meta property="article:published_time" content="2020-10-06T08:49:31+00:00"><meta property="article:modified_time" content="2020-10-06T08:49:31+00:00"><meta property="og:site_name" content="Kerberos Docs"><meta property="article:publisher" content="https://www.facebook.com/"><meta property="article:author" content="https://www.facebook.com/"><meta property="og:locale" content="en_US"><script type=application/ld+json>{"@context":"http://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/doc.kerberos.io\/"},{"@type":"ListItem","position":3,"name":"Opensource","item":"https:\/\/doc.kerberos.io\/\/opensource\/"},{"@type":"ListItem","position":4,"name":"Contribute","item":"https:\/\/doc.kerberos.io\/\/opensource\/contribute\/"}]}</script><meta name=theme-color content="#fff"><link rel=apple-touch-icon sizes=180x180 href=https://doc.kerberos.io/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=https://doc.kerberos.io/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=https://doc.kerberos.io/favicons/favicon-16x16.png><link rel=manifest href=https://doc.kerberos.io/site.webmanifest><script async defer data-domain=doc.kerberos.io src=https://plausible.kerberos.io/js/plausible.js></script></head><body class="opensource single"><div class="header-bar fixed-top"></div><header class="navbar fixed-top navbar-expand-md navbar-light"><div class=container><input class="menu-btn order-0" type=checkbox id=menu-btn>
<label class="menu-icon d-md-none" for=menu-btn><span class=navicon></span></label><a class="navbar-brand order-1 order-md-0 me-auto" href=https://doc.kerberos.io/><img src=https://doc.kerberos.io/images/kerberos-logo.svg class=logo>
Kerberos Docs</a>
<button id=mode class="btn btn-link order-2 order-md-4" type=button aria-label="Toggle mode">
<span class=toggle-dark><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-moon"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg></span><span class=toggle-light><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-sun"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg></span></button><div class="collapse navbar-collapse order-4 order-md-1"><ul class="navbar-nav main-nav me-auto order-5 order-md-2"><li class=nav-item><a class=nav-link href=https://kerberos.io>Homepage</a></li></ul><div class="break order-6 d-md-none"></div><form class="navbar-form flex-grow-1 order-7 order-md-3"><input id=userinput class="form-control is-search" type=search placeholder="Search docs..." aria-label="Search docs..." autocomplete=off><div id=suggestions class="shadow bg-white rounded"></div></form></div></div></header><div class="wrap container" role=document><div class=content><div class="row flex-xl-nowrap"><div class="col-lg-5 col-xl-4 docs-sidebar"><nav class=docs-links aria-label="Main navigation"><h3>Prologue</h3><ul class=list-unstyled><li><a class=docs-link href=https://doc.kerberos.io/>Introduction</a></li><li><a class=docs-link href=https://doc.kerberos.io/prologue/how/>How it works</a></li><li><a class=docs-link href=https://doc.kerberos.io/prologue/deployments/>Deployments</a></li><li><a class=docs-link href=https://doc.kerberos.io/prologue/glossary/>Glossary</a></li></ul><h3>Opensource v2</h3><ul class=list-unstyled><li><a class=docs-link href=https://doc.kerberos.io/opensource/first-things-first/>First things first</a></li><li><a class=docs-link href=https://doc.kerberos.io/opensource/get-started/>Get started</a></li><li><a class=docs-link href=https://doc.kerberos.io/opensource/installation/>Installation</a></li><li><a class=docs-link href=https://doc.kerberos.io/opensource/installation-advanced/>Advanced Installation</a></li><li><a class=docs-link href=https://doc.kerberos.io/opensource/releases/>Release notes</a></li><li><a class=docs-link href=https://doc.kerberos.io/opensource/license/>License</a></li><li><a class=docs-link href=https://doc.kerberos.io/opensource/upgrade/>Upgrade</a></li><li><a class="docs-link active" href=https://doc.kerberos.io/opensource/contribute/>Contribute</a></li><li><a class=docs-link href=https://doc.kerberos.io/opensource/machinery/>Machinery</a></li><li><a class=docs-link href=https://doc.kerberos.io/opensource/web/>Web</a></li></ul><h3>Opensource v3</h3><ul class=list-unstyled><li><a class=docs-link href=https://doc.kerberos.io/opensourcev3/announcement/>Announcement</a></li></ul><h3>Enterprise</h3><ul class=list-unstyled><li><a class=docs-link href=https://doc.kerberos.io/enterprise/first-things-first/>First things first</a></li><li><a class=docs-link href=https://doc.kerberos.io/enterprise/get-started/>Get Started</a></li><li><a class=docs-link href=https://doc.kerberos.io/enterprise/installation/>Installation</a></li><li><a class=docs-link href=https://doc.kerberos.io/enterprise/installation-cloud/>Cloud Installation</a></li><li><a class=docs-link href=https://doc.kerberos.io/enterprise/installation-edge/>Edge Installation</a></li><li><a class=docs-link href=https://doc.kerberos.io/enterprise/releases/>Releases</a></li></ul><h3>Vault</h3><ul class=list-unstyled><li><a class=docs-link href=https://doc.kerberos.io/vault/first-things-first/>First things first</a></li><li><a class=docs-link href=https://doc.kerberos.io/vault/get-started/>Get Started</a></li><li><a class=docs-link href=https://doc.kerberos.io/vault/installation/>Installation</a></li><li><a class=docs-link href=https://doc.kerberos.io/vault/installation-cloud/>Cloud Installation</a></li><li><a class=docs-link href=https://doc.kerberos.io/vault/installation-edge/>Edge Installation</a></li><li><a class=docs-link href=https://doc.kerberos.io/vault/providers/>Providers</a></li><li><a class=docs-link href=https://doc.kerberos.io/vault/recycle/>Recycle</a></li><li><a class=docs-link href=https://doc.kerberos.io/vault/releases/releases/>Releases</a></li></ul><h3>Hub</h3><ul class=list-unstyled><li><a class=docs-link href=https://doc.kerberos.io/hub/first-things-first/>First things first</a></li></ul></nav></div><nav class="docs-toc d-none d-xl-block col-xl-4" aria-label="Secondary navigation"><div class=page-links><h3>On this page</h3><nav id=TableOfContents><ul><li><a href=#machinery>Machinery</a><ul><li><a href=#prerequisites>Prerequisites</a></li><li><a href=#installation>Installation</a></li><li><a href=#testing>Testing</a></li><li><a href=#adding-a-new-class>Adding a new class</a></li><li><a href=#compile>Compile</a></li></ul></li><li><a href=#web>Web</a><ul><li><a href=#prerequisites-1>Prerequisites</a></li><li><a href=#installation-1>Installation</a></li></ul></li></ul></nav></div></nav><main class="docs-content col-lg-11 col-xl-8"><h1>Contribute</h1><p class=lead>We are backed up by an amazing community. Feel free the help.</p><p>In this document we describe the different things you need to know if you would like to add a new feature to Kerberos Open Source, or change some of its behaviour for your own use case.</p><p>Before starting, as you might have read already, you need to know that Kerberos Open Source consists of two solutions. A front-end, also called <strong>web</strong>, which allows you to review the recordings and to configure the back-end settings. A back-end, also called <strong>machinery</strong>, which is computer vision solution that processes the video stream of surveillance camera.</p><p>Once you start changing or adding features to Kerberos Open Source, there is a big chance you will need to modify the previously mentioned solutions. That&rsquo;s why we will discuss how you can contribute to one or both solutions.</p><h2 id=machinery>Machinery<a href=#machinery class=anchor aria-hidden=true>#</a></h2><p>Contributing to the <a href=https://github.com/kerberos-io/machinery>machinery repository</a> requires C++ skills. This section describes all the technical stuff you will need to know. If you want to contribute, the first thing you will need to do is installing the source code on your working station.</p><h3 id=prerequisites>Prerequisites<a href=#prerequisites class=anchor aria-hidden=true>#</a></h3><blockquote><p>A Linux OS, or Mac OSX (Window is not supported).</p></blockquote><h3 id=installation>Installation<a href=#installation class=anchor aria-hidden=true>#</a></h3><p>The complete installation can be found on the advanced installation page, describing the complete set of instructions. However for simplicity we will give a summarized version, as probably you will already have a development environment set up.</p><p>Install development tools (C++, CMake) and V4L utils, and clone the repository. Compile the project using cmake and make.</p><pre><code class=language-ts>sudo apt-get -y update
sudo apt-get install -y git cmake subversion dh-autoreconf libcurl4-openssl-dev yasm libx264-dev pkg-config libssl-dev
cd &amp;&amp; sudo git clone https://github.com/kerberos-io/machinery
cd machinery &amp;&amp; mkdir build &amp;&amp; cd build
cmake .. &amp;&amp; make -j8 &amp;&amp; make check &amp;&amp; sudo make install
</code></pre><h3 id=testing>Testing<a href=#testing class=anchor aria-hidden=true>#</a></h3><p>We strongly recommend testing as a best practice in complex projects. Therefore the machinery uses the popular C++ test library: Google Test and Google Mock. The tests can be found in the test directory. You can run the test by executing following command:</p><pre><code class=language-ts>make check
</code></pre><h3 id=adding-a-new-class>Adding a new class<a href=#adding-a-new-class class=anchor aria-hidden=true>#</a></h3><p>This paragraph will tell you how to create a new condition, algorithm, expositor, io or capture device. For simplicity we will show how to create a new algorithm; the steps are identical if you want to create for example a new capture device; only the directory will differ.</p><h4 id=create-the-header-file>Create the header file<a href=#create-the-header-file class=anchor aria-hidden=true>#</a></h4><p>First we will need to create a new header file in the include/kerberos/machinery/algorithm directory. You can copy an existing algorithm header file, and start from there. You will end up with the following header file:</p><pre><code class=language-ts>//
// Class: AnotherAlgorithm
// Description: Another algorithm
// Created: ...
// Author: ...
// Mail: ...
// Website: ...
//
// The copyright to the computer program(s) herein
// is the property of kerberos.io, Belgium.
// The program(s) may be used and/or copied .
//
/////////////////////////////////////////////////////
#ifndef __AnotherAlgorithm_H_INCLUDED__ // if AnotherAlgorithm.h hasn't been included yet...
#define __AnotherAlgorithm_H_INCLUDED__ // #define this so the compiler knows it has been included
#include &quot;machinery/algorithm/Algorithm.h&quot;
namespace kerberos
{
char AnotherAlgorithmName[] = &quot;AnotherAlgorithm&quot;;
class AnotherAlgorithm : public AlgorithmCreator&lt;AnotherAlgorithmName, AnotherAlgorithm&gt;
{
private:
Image m_result;
int m_parameter;
public:
AnotherAlgorithm(){}
void setup(const StringMap &amp; settings);
void initialize(ImageVector &amp; images);
Image evaluate(ImageVector &amp; images, JSON &amp; data);
void setParameter(int parameter);
};
}
#endif
</code></pre><p>When creating a new class you will need to inherit from it corresponding creator, for the algorithm example: AlgorithmCreator. The creator class requires two template parameters. The first one is a unique name for the class, this name will be used to make some kind of dependency injection possible; and is used in the configurations files. The second parameter is the class itself.</p><p>The inheritance of the creator class can be a little bit strange, but it is required and needed to register the class automatically with the factory. When the code gets compiled, the classes will be automatically registered with the factory, and you can create instances of those classes by using the name we&rsquo;ve defined in the first template parameter. For example we could create a new instance of our previously created class with the following command.</p><pre><code class=language-ts>Algorithm * anotherAlgorithm = Factory&lt;Algorithm&gt;::getInstance()-&gt;create(&quot;AnotherAlgorithm&quot;);
</code></pre><h4 id=create-the-source-file>Create the source file<a href=#create-the-source-file class=anchor aria-hidden=true>#</a></h4><p>Ofcourse we also need to have an implementation file, therefore we need to create a new source file in the src/kerberos/machinery/algorithm directory. Just like the previous example, you can copy an existing class and implement the member functions you&rsquo;ve declared in the header file. An example would be:</p><pre><code class=language-ts>#include &quot;machinery/algorithm/AnotherAlgorithm.h&quot;
namespace kerberos
{
void AnotherAlgorithm::setup(const StringMap &amp; settings)
{
Algorithm::setup(settings);
int parameter = std::atoi(settings.at(&quot;algorithms.AnotherAlgorithm.parameter&quot;).c_str());
setParameter(parameter);
}
void AnotherAlgorithm::initialize(ImageVector &amp; images)
{
....
}
Image AnotherAlgorithm::evaluate(ImageVector &amp; images, JSON &amp; data)
{
Image evaluation;
... do something ..
return evaluation;
}
void AnotherAlgorithm::setParameter(int parameter)
{
m_parameter = parameter;
}
}
</code></pre><h4 id=modify-the-cmakeliststxt-file>Modify the CMakeLists.txt file<a href=#modify-the-cmakeliststxt-file class=anchor aria-hidden=true>#</a></h4><p>Open the CMakeLists.txt in the src/kerberos directory file and append the name of the algorithm class to the KERBEROS_FACTORY_ENTITIES variable; for example machinery/algorithm/AnotherAlgorithm.cpp.</p><pre><code class=language-ts># -------------------------------------------------------
# Entities that have to be registered with the factory
# - classes are registered on compile time, so they
# don't belong to a library. New algorithms, expositors
# or Io classes belong here.
set(KERBEROS_FACTORY_ENTITIES
capture/USBCamera.cpp
machinery/condition/Time.cpp
machinery/condition/Enabled.cpp
machinery/algorithm/DifferentialCollins.cpp
machinery/algorithm/DifferentialCollinsWithColor.cpp
machinery/algorithm/AnotherAlgorithm.cpp
machinery/expositor/RectangleExpositor.cpp
machinery/expositor/HullExpositor.cpp
machinery/heuristic/Sequence.cpp
machinery/io/IoDisk.cpp
machinery/io/IoTCP.cpp
machinery/io/IoMongoDB.cpp
)
</code></pre><h4 id=create-a-new-entry-in-the-config-file>Create a new entry in the config file<a href=#create-a-new-entry-in-the-config-file class=anchor aria-hidden=true>#</a></h4><p>Open the algorithm.xml file in the config directory, and add a new tag with exactly the same name you&rsquo;ve used in the header file; so in our example &ldquo;AnotherAlgorithm&rdquo;. Within the new tag we can add properties that we will be use to configure our algorithm, in our example we defined a field parameter so we can add this field in the config file.</p><p>One thing you will need to do is to attach a type to a property. The type will be used by the web to automatically render the properties. For simplicity we can use the type number, this will show an input box on the settings page of the web where we are able to add numbers.</p><pre><code class=language-ts>&lt;algorithms&gt;
&lt;AnotherAlgorithm&gt;
&lt;parameter type=&quot;number&quot;&gt;5&lt;/parameter&gt;
&lt;/AnotherAlgorithm&gt;
&lt;/algorithms&gt;
</code></pre><p>You can retrieve the parameter in the setup function with the settings parameter.</p><pre><code class=language-ts>settings.at(&quot;algorithms.AnotherAlgorithm.parameter&quot;)
</code></pre><h3 id=compile>Compile<a href=#compile class=anchor aria-hidden=true>#</a></h3><p>Hurray, we&rsquo;ve made it! So now you can compile the code again, and if you&rsquo;re using an IDE don&rsquo;t forget to include the new source file! If you are compiling from the command-line you just have to go to the build folder and write make.</p><h2 id=web>Web<a href=#web class=anchor aria-hidden=true>#</a></h2><p>Contributing to <a href=https://github.com/kerberos-io/web>the web repository</a> requires both front- and back-end skillls, more precisely BackboneJS (JavaScript) and Laravel 5.4 (PHP).</p><h3 id=prerequisites-1>Prerequisites<a href=#prerequisites-1 class=anchor aria-hidden=true>#</a></h3><p>Make sure you have following services installed on your working station.</p><blockquote><p>>= PHP 7.1.0, NodeJS and NPM and Nginx or Apache</p></blockquote><h3 id=installation-1>Installation<a href=#installation-1 class=anchor aria-hidden=true>#</a></h3><p>Clone the repository to your working station.</p><pre><code class=language-ts>git clone https://github.com/kerberos-io/web
cd web
</code></pre><p>Install the PHP libraries using the dependency mananger, <strong>Composer</strong>. If you haven&rsquo;t installed composer execute following commands.</p><pre><code class=language-ts>php -r &quot;readfile('https://getcomposer.org/installer');&quot; &gt; composer-setup.php
php -r &quot;if (hash('SHA384', file_get_contents('composer-setup.php')) === '41e71d86b40f28e771d4bb662b997f79625196afcca95a5abf44391188c695c6c1456e16154c75a211d238cc3bc5cb47') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;&quot;
php composer-setup.php
php -r &quot;unlink('composer-setup.php');&quot;
</code></pre><p>After a succesful installation, you can run composer install or composer update from the root of the project. All dependencies will be installed or updated if a newer version is detected.</p><pre><code class=language-ts>composer update
</code></pre><p>Besides PHP, the project also relies on BackboneJS (Javascript) for the front-end. Therefore a couple JavaScript dependencies should be installed.</p><pre><code class=language-ts>npm -g install bower
cd public
bower update
</code></pre><p>When everything is installed properly, you need too link the web project with your applicationn server. Read more on the <a href=https://laravel.com/docs/5.8/deployment>Laravel documentation website</a>.</p><p class=edit-page><a href=https://github.com/kerberos-io/documentation/blob/master/content/opensource/contribute/index.md><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-edit-2"><path d="M17 3a2.828 2.828.0 114 4L7.5 20.5 2 22l1.5-5.5L17 3z"/></svg>Edit this page on GitHub</a></p><div class="docs-navigation d-flex justify-content-between"><a href=https://doc.kerberos.io/opensource/upgrade/><div class="card my-1"><div class="card-body py-2">&larr; Upgrade</div></div></a><a class=ms-auto href=https://doc.kerberos.io/opensource/machinery/><div class="card my-1"><div class="card-body py-2">Machinery &rarr;</div></div></a></div></main></div></div></div><footer class="footer text-muted"><div class=container><div class=row><div class="col-lg-6 order-last order-lg-first"><ul class="navbar-nav social-nav"><li class=copyright>&copy;&nbsp;2014&ndash;2021
<a href=https://kerberos.io>Kerberos.io</a></li><li class=nav-item><a class=link href=https://twitter.com/kerberosio title=Twitter><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-twitter"><path d="M23 3a10.9 10.9.0 01-3.14 1.53 4.48 4.48.0 00-7.86 3v1A10.66 10.66.0 013 4s-4 9 5 13a11.64 11.64.0 01-7 2c9 5 20 0 20-11.5a4.5 4.5.0 00-.08-.83A7.72 7.72.0 0023 3z"/></svg><span class="ms-2 visually-hidden">Twitter</span></a></li><li class=nav-item><a class=link href=https://github.com/kerberos-io title=GitHub><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-github"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37.0 00-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44.0 0020 4.77 5.07 5.07.0 0019.91 1S18.73.65 16 2.48a13.38 13.38.0 00-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07.0 005 4.77 5.44 5.44.0 003.5 8.55c0 5.42 3.3 6.61 6.44 7A3.37 3.37.0 009 18.13V22"/></svg><span class="ms-2 visually-hidden">GitHub</span></a></li><li class=nav-item><a class=link href=https://www.reddit.com/r/kerberos_io/ title=Reddit><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-message-circle"><path d="M21 11.5a8.38 8.38.0 01-.9 3.8A8.5 8.5.0 0112.5 20a8.38 8.38.0 01-3.8-.9L3 21l1.9-5.7A8.38 8.38.0 014 11.5a8.5 8.5.0 014.7-7.6 8.38 8.38.0 013.8-.9h.5a8.48 8.48.0 018 8v.5z"/></svg><span class="ms-2 visually-hidden">Reddit</span></a></li></ul></div><div class="col-lg-10 order-first order-lg-last text-lg-end"><ul class=list-inline><li class=list-inline-item>Learn more about</li><li class=list-inline-item><a href=https://kerberos.io/product/enterprise-agent/>Enterprise Agent</a></li><li class=list-inline-item><a href=https://kerberos.io/product/hub/>Hub</a></li><li class=list-inline-item><a href=https://kerberos.io/product/open-source/>Kerberos Opensource</a></li><li class=list-inline-item><a href=https://kerberos.io/product/vault/>Vault</a></li></ul></div></div></div></footer><script src=https://doc.kerberos.io/js/highlight.min.13bf6b39f28cd07b0780c0c154bf050bad1e7b73231c15e43b993504cca3fa814222ded3c525f429528451fe039a5078c71ae4d000486d26f9b920cc7db474da.js integrity="sha512-E79rOfKM0HsHgMDBVL8FC60ee3MjHBXkO5k1BMyj+oFCIt7TxSX0KVKEUf4DmlB4xxrk0ABIbSb5uSDMfbR02g==" crossorigin=anonymous defer></script><script src=https://doc.kerberos.io/main.min.89223fc6eee34e2dc10266cff3c7fc87949c595388f775ec6e93132410cef77e5ff7f24a81db03c9b9eb6d2e6d75ea5a7d22945c574b65dfeb426f65af771230.js integrity="sha512-iSI/xu7jTi3BAmbP88f8h5ScWVOI93XsbpMTJBDO935f9/JKgdsDybnrbS5tdepafSKUXFdLZd/rQm9lr3cSMA==" crossorigin=anonymous defer></script><script src=https://doc.kerberos.io/index.min.71e05784bf5441c378e8824d18e4b5a057f28cde2bd06f927216eb278586f7ea7d96309df4600474b3b928ef2b635a64248e2cf3a7a023136087ed4050162608.js integrity="sha512-ceBXhL9UQcN46IJNGOS1oFfyjN4r0G+SchbrJ4WG9+p9ljCd9GAEdLO5KO8rY1pkJI4s86egIxNgh+1AUBYmCA==" crossorigin=anonymous defer></script></body></html>