Add archives versions of documentation in asciidoc

Project: http://git-wip-us.apache.org/repos/asf/incubator-unomi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-unomi/commit/b077d27b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-unomi/tree/b077d27b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-unomi/diff/b077d27b

Branch: refs/heads/master
Commit: b077d27bb86335e81c9b7b07c28adeea840c031b
Parents: 837c462
Author: Francois Papon <[email protected]>
Authored: Wed Sep 5 17:50:56 2018 +0400
Committer: Francois Papon <[email protected]>
Committed: Fri Sep 7 11:46:22 2018 +0400

----------------------------------------------------------------------
 manual/src/archives/1.1/asciidoc/apache.css     | 2448 ++++++++++++++++++
 .../1.1/asciidoc/building-and-deploying.adoc    |  225 ++
 .../src/archives/1.1/asciidoc/clustering.adoc   |  103 +
 manual/src/archives/1.1/asciidoc/concepts.adoc  |  234 ++
 .../archives/1.1/asciidoc/configuration.adoc    |  296 +++
 .../archives/1.1/asciidoc/getting-started.adoc  |  461 ++++
 .../1.1/asciidoc/images/asf_logo_url.png        |  Bin 0 -> 21121 bytes
 .../1.1/asciidoc/images/incubator-logo.png      |  Bin 0 -> 8923 bytes
 .../1.1/asciidoc/images/unomi-request.png       |  Bin 0 -> 132731 bytes
 manual/src/archives/1.1/asciidoc/index.adoc     |   55 +
 manual/src/archives/1.2/asciidoc/apache.css     | 2448 ++++++++++++++++++
 .../1.2/asciidoc/building-and-deploying.adoc    |  268 ++
 .../src/archives/1.2/asciidoc/clustering.adoc   |   84 +
 manual/src/archives/1.2/asciidoc/concepts.adoc  |  234 ++
 .../archives/1.2/asciidoc/configuration.adoc    |  345 +++
 .../1.2/asciidoc/connectors/connectors.adoc     |   23 +
 .../connectors/salesforce-connector.adoc        |  234 ++
 .../1.2/asciidoc/custom-extensions.adoc         |  413 +++
 .../archives/1.2/asciidoc/getting-started.adoc  |  122 +
 .../1.2/asciidoc/images/asf_logo_url.png        |  Bin 0 -> 21121 bytes
 .../1.2/asciidoc/images/incubator-logo.png      |  Bin 0 -> 8923 bytes
 .../1.2/asciidoc/images/unomi-request.png       |  Bin 0 -> 132731 bytes
 manual/src/archives/1.2/asciidoc/index.adoc     |   75 +
 .../1.2/asciidoc/samples/login-sample.adoc      |   74 +
 .../archives/1.2/asciidoc/samples/samples.adoc  |   20 +
 .../1.2/asciidoc/samples/twitter-sample.adoc    |  433 ++++
 .../asciidoc/samples/weather-update-sample.adoc |   15 +
 manual/src/main/asciidoc/apache.css             |   10 +-
 manual/src/theme/apache-theme.yml               |   27 +-
 manual/src/theme/fonts/SourceSansPro-Black.ttf  |  Bin 288824 -> 0 bytes
 .../theme/fonts/SourceSansPro-BlackItalic.ttf   |  Bin 102944 -> 0 bytes
 manual/src/theme/fonts/SourceSansPro-Bold.ttf   |  Bin 290916 -> 0 bytes
 .../theme/fonts/SourceSansPro-BoldItalic.ttf    |  Bin 103200 -> 0 bytes
 .../theme/fonts/SourceSansPro-ExtraLight.ttf    |  Bin 291112 -> 0 bytes
 .../fonts/SourceSansPro-ExtraLightItalic.ttf    |  Bin 104304 -> 0 bytes
 manual/src/theme/fonts/SourceSansPro-Italic.ttf |  Bin 103828 -> 0 bytes
 manual/src/theme/fonts/SourceSansPro-Light.ttf  |  Bin 292680 -> 0 bytes
 .../theme/fonts/SourceSansPro-LightItalic.ttf   |  Bin 104156 -> 0 bytes
 .../src/theme/fonts/SourceSansPro-Regular.ttf   |  Bin 293516 -> 0 bytes
 .../src/theme/fonts/SourceSansPro-SemiBold.ttf  |  Bin 291864 -> 0 bytes
 .../fonts/SourceSansPro-SemiBoldItalic.ttf      |  Bin 103556 -> 0 bytes
 manual/src/theme/fonts/SourceSansPro_OFL.txt    |   93 -
 42 files changed, 8635 insertions(+), 105 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/b077d27b/manual/src/archives/1.1/asciidoc/apache.css
----------------------------------------------------------------------
diff --git a/manual/src/archives/1.1/asciidoc/apache.css 
b/manual/src/archives/1.1/asciidoc/apache.css
new file mode 100644
index 0000000..e66d1fa
--- /dev/null
+++ b/manual/src/archives/1.1/asciidoc/apache.css
@@ -0,0 +1,2448 @@
+
+@import 
"https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,700%7cDroid+Serif:400,700";;
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+    display: block
+}
+
+audio,
+canvas,
+video {
+    display: inline-block
+}
+
+audio:not([controls]) {
+    display: none;
+    height: 0
+}
+
+script {
+    display: none !important
+}
+
+html {
+    font-family: "Droid Serif";
+    -ms-text-size-adjust: 100%;
+    -webkit-text-size-adjust: 100%;
+}
+
+a {
+    background: transparent
+}
+
+a:focus {
+    outline: thin dotted
+}
+
+a:active,
+a:hover {
+    outline: 0
+}
+
+h1 {
+    font-size: 2em;
+    margin: .67em 0
+}
+
+abbr[title] {
+    border-bottom: 1px dotted
+}
+
+b,
+strong {
+    font-weight: bold
+}
+
+dfn {
+    font-style: italic
+}
+
+hr {
+    -moz-box-sizing: content-box;
+    box-sizing: content-box;
+    height: 0
+}
+
+mark {
+    background: #ff0;
+    color: #000
+}
+
+code,
+kbd,
+pre,
+samp {
+    font-family: monospace;
+    font-size: 1em
+}
+
+pre {
+    white-space: pre-wrap
+}
+
+q {
+    quotes: "\201C" "\201D" "\2018" "\2019"
+}
+
+small {
+    font-size: 80%
+}
+
+sub,
+sup {
+    font-size: 75%;
+    line-height: 0;
+    position: relative;
+    vertical-align: baseline
+}
+
+sup {
+    top: -.5em
+}
+
+sub {
+    bottom: -.25em
+}
+
+img {
+    border: 0
+}
+
+svg:not(:root) {
+    overflow: hidden
+}
+
+figure {
+    margin: 0
+}
+
+fieldset {
+    border: 1px solid silver;
+    margin: 0 2px;
+    padding: .35em .625em .75em
+}
+
+legend {
+    border: 0;
+    padding: 0
+}
+
+button,
+input,
+select,
+textarea {
+    font-family: inherit;
+    font-size: 100%;
+    margin: 0
+}
+
+button,
+input {
+    line-height: normal
+}
+
+button,
+select {
+    text-transform: none
+}
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+    -webkit-appearance: button;
+    cursor: pointer
+}
+
+button[disabled],
+html input[disabled] {
+    cursor: default
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+    box-sizing: border-box;
+    padding: 0
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+    border: 0;
+    padding: 0
+}
+
+textarea {
+    overflow: auto;
+    vertical-align: top
+}
+
+table {
+    border-collapse: collapse;
+    border-spacing: 0
+}
+
+*,
+*::before,
+*::after {
+    -moz-box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box
+}
+
+html,
+body {
+    /*font-size: 100%*/
+}
+
+body {
+    background: #fff;
+    color: #333;
+    padding: 0;
+    margin: 0;
+    font-family: "Droid Serif", "DejaVu Serif", serif;
+    font-size: 14px;
+    font-style: normal;
+    line-height: 1.42857143;
+    position: relative;
+    cursor: auto;
+    tab-size: 4;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased
+}
+
+a:hover {
+    cursor: pointer
+}
+
+img,
+object,
+embed {
+    max-width: 100%;
+    height: auto
+}
+
+object,
+embed {
+    height: 100%
+}
+
+img {
+    -ms-interpolation-mode: bicubic
+}
+
+.left {
+    float: left !important
+}
+
+.right {
+    float: right !important
+}
+
+.text-left {
+    text-align: left !important
+}
+
+.text-right {
+    text-align: right !important
+}
+
+.text-center {
+    text-align: center !important
+}
+
+.text-justify {
+    text-align: justify !important
+}
+
+.hide {
+    display: none
+}
+
+img,
+object,
+svg {
+    display: inline-block;
+    vertical-align: middle
+}
+
+textarea {
+    height: auto;
+    min-height: 50px
+}
+
+select {
+    width: 100%
+}
+
+.center {
+    margin-left: auto;
+    margin-right: auto
+}
+
+.stretch {
+    width: 100%
+}
+
+.subheader,
+.admonitionblock td.content>.title,
+.audioblock>.title,
+.exampleblock>.title,
+.imageblock>.title,
+.listingblock>.title,
+.literalblock>.title,
+.stemblock>.title,
+.openblock>.title,
+.paragraph>.title,
+.quoteblock>.title,
+table.tableblock>.title,
+.verseblock>.title,
+.videoblock>.title,
+.dlist>.title,
+.olist>.title,
+.ulist>.title,
+.qlist>.title,
+.hdlist>.title {
+    line-height: 1.45;
+    color: #585ac2;
+    font-weight: 400;
+    margin-top: 0;
+    margin-bottom: .25em
+}
+
+div,
+dl,
+dt,
+dd,
+ul,
+ol,
+li,
+h1,
+h2,
+h3,
+#toctitle,
+.sidebarblock>.content>.title,
+h4,
+h5,
+h6,
+pre,
+form,
+p,
+blockquote,
+th,
+td {
+    margin: 0;
+    padding: 0;
+    direction: ltr
+}
+
+a {
+    color: #585ac2;
+    text-decoration: underline;
+    line-height: inherit
+}
+
+a:hover,
+a:focus {
+    color: #373997;
+}
+
+a img {
+    border: none
+}
+
+p {
+    font-family: inherit;
+    font-weight: 400;
+    font-size: 1em;
+    line-height: 1.6;
+    margin-bottom: 1.25em;
+    text-rendering: optimizeLegibility
+}
+
+p aside {
+    font-size: .875em;
+    line-height: 1.35;
+    font-style: italic
+}
+
+h1,
+h2,
+h3,
+#toctitle,
+.sidebarblock>.content>.title,
+h4,
+h5,
+h6 {
+    font-family: "Source Sans Pro", "DejaVu Sans", sans-serif;
+    font-weight: bold;
+    /*font-style: bold;*/
+    color: #303284;
+    text-rendering: optimizeLegibility;
+    margin-top: 1em;
+    margin-bottom: .5em;
+    line-height: 1.0125em;
+    text-transform: uppercase;
+}
+
+h1 small,
+h2 small,
+h3 small,
+#toctitle small,
+.sidebarblock>.content>.title small,
+h4 small,
+h5 small,
+h6 small {
+    font-size: 60%;
+    color: #303284;
+    line-height: 0
+}
+
+h1 {
+    font-size: 2.125em
+}
+
+h2 {
+    font-size: 1.6875em
+}
+
+h3,
+#toctitle,
+.sidebarblock>.content>.title {
+    font-size: 1.375em
+}
+
+h4,
+h5 {
+    font-size: 1.125em
+}
+
+h6 {
+    font-size: 1em
+}
+
+hr {
+    border: solid #dddddd;
+    border-width: 1px 0 0;
+    clear: both;
+    margin: 1.25em 0 1.1875em;
+    height: 0
+}
+
+em,
+i {
+    font-style: italic;
+    line-height: inherit
+}
+
+strong,
+b {
+    font-weight: bold;
+    line-height: inherit
+}
+
+small {
+    font-size: 60%;
+    line-height: inherit
+}
+
+code {
+    font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace;
+    font-weight: 400;
+    color: #585ac2;
+}
+
+ul,
+ol,
+dl {
+    font-size: 1em;
+    line-height: 1.6;
+    margin-bottom: 1.25em;
+    list-style-position: outside;
+    font-family: inherit
+}
+
+ul,
+ol {
+    margin-left: 1.5em
+}
+
+ul li ul,
+ul li ol {
+    margin-left: 1.25em;
+    margin-bottom: 0;
+    font-size: 1em
+}
+
+ul.square li ul,
+ul.circle li ul,
+ul.disc li ul {
+    list-style: inherit
+}
+
+ul.square {
+    list-style-type: square
+}
+
+ul.circle {
+    list-style-type: circle
+}
+
+ul.disc {
+    list-style-type: disc
+}
+
+ol li ul,
+ol li ol {
+    margin-left: 1.25em;
+    margin-bottom: 0
+}
+
+dl dt {
+    margin-bottom: .3125em;
+    font-weight: bold
+}
+
+dl dd {
+    margin-bottom: 1.25em
+}
+
+abbr,
+acronym {
+    text-transform: uppercase;
+    font-size: 90%;
+    color: rgba(0, 0, 0, .8);
+    border-bottom: 1px dotted #ddd;
+    cursor: help
+}
+
+abbr {
+    text-transform: none
+}
+
+blockquote {
+    margin: 0 0 1.25em;
+    padding: .5625em 1.25em 0 1.1875em;
+    border-left: 1px solid #ddd
+}
+
+blockquote cite {
+    display: block;
+    font-size: .9375em;
+    color: rgba(0, 0, 0, .6)
+}
+
+blockquote cite::before {
+    content: "\2014 \0020"
+}
+
+blockquote cite a,
+blockquote cite a:visited {
+    color: rgba(0, 0, 0, .6)
+}
+
+blockquote,
+blockquote p {
+    line-height: 1.6;
+    color: rgba(0, 0, 0, .85)
+}
+
+@media screen and (min-width:768px) {
+    h1,
+    h2,
+    h3,
+    #toctitle,
+    .sidebarblock>.content>.title,
+    h4,
+    h5,
+    h6 {
+        line-height: 1.2
+    }
+
+    h1 {
+        font-size: 2.75em
+    }
+
+    h2 {
+        font-size: 2.3125em
+    }
+
+    h3,
+    #toctitle,
+    .sidebarblock>.content>.title {
+        font-size: 1.6875em
+    }
+
+    h4 {
+        font-size: 1.4375em
+    }
+
+}
+
+table {
+    background: #fff;
+    margin-bottom: 1.25em;
+    border: solid 1px #dddddd;
+}
+
+table thead,
+table tfoot {
+    background: #f7f8f7
+}
+
+table thead tr th,
+table thead tr td,
+table tfoot tr th,
+table tfoot tr td {
+    padding: .5em .625em .625em;
+    font-size: inherit;
+    color: rgba(0, 0, 0, .8);
+    text-align: left
+}
+
+table tr th,
+table tr td {
+    padding: .5625em .625em;
+    font-size: inherit;
+    color: rgba(0, 0, 0, .8)
+}
+
+table tr.even,
+table tr.alt,
+table tr:nth-of-type(even) {
+    background: #f8f8f7
+}
+
+table thead tr th,
+table tfoot tr th,
+table tbody tr td,
+table tr td,
+table tfoot tr td {
+    display: table-cell;
+    line-height: 1.6
+}
+
+h1,
+h2,
+h3,
+#toctitle,
+.sidebarblock>.content>.title,
+h4,
+h5,
+h6 {
+    line-height: 1.2;
+    word-spacing: -.05em
+}
+
+h1 strong,
+h2 strong,
+h3 strong,
+#toctitle strong,
+.sidebarblock>.content>.title strong,
+h4 strong,
+h5 strong,
+h6 strong {
+    font-weight: 400
+}
+
+.clearfix::before,
+.clearfix::after,
+.float-group::before,
+.float-group::after {
+    content: " ";
+    display: table
+}
+
+.clearfix::after,
+.float-group::after {
+    clear: both
+}
+
+*:not(pre)>code {
+    font-size: .9375em;
+    font-style: normal !important;
+    letter-spacing: 0;
+    padding: .1em .5ex;
+    word-spacing: -.15em;
+    background-color: #f7f7f8;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    line-height: 1.45;
+    text-rendering: optimizeSpeed;
+    word-wrap: break-word
+}
+
+*:not(pre)>code.nobreak {
+    word-wrap: normal
+}
+
+*:not(pre)>code.nowrap {
+    white-space: nowrap
+}
+
+pre,
+pre>code {
+    line-height: 1.45;
+    color: #585ac2;
+    font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace;
+    font-weight: 400;
+    text-rendering: optimizeSpeed
+}
+
+em em {
+    font-style: normal
+}
+
+strong strong {
+    font-weight: 400
+}
+
+.keyseq {
+    color: rgba(51, 51, 51, .8)
+}
+
+kbd {
+    font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace;
+    display: inline-block;
+    color: rgba(0, 0, 0, .8);
+    font-size: .65em;
+    line-height: 1.45;
+    background-color: #f7f7f7;
+    border: 1px solid #dddddd;
+    -webkit-border-radius: 3px;
+    border-radius: 3px;
+    -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em white inset;
+    box-shadow: 0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em #fff inset;
+    margin: 0 .15em;
+    padding: .2em .5em;
+    vertical-align: middle;
+    position: relative;
+    top: -.1em;
+    white-space: nowrap
+}
+
+.keyseq kbd:first-child {
+    margin-left: 0
+}
+
+.keyseq kbd:last-child {
+    margin-right: 0
+}
+
+.menuseq,
+.menuref {
+    color: #000
+}
+
+.menuseq b:not(.caret),.menuref {
+    font-weight: inherit
+}
+
+.menuseq {
+    word-spacing: -.02em
+}
+
+.menuseq b.caret {
+    font-size: 1.25em;
+    line-height: .8
+}
+
+.menuseq i.caret {
+    font-weight: bold;
+    text-align: center;
+    width: .45em
+}
+
+b.button::before,
+b.button::after {
+    position: relative;
+    top: -1px;
+    font-weight: 400
+}
+
+b.button::before {
+    content: "[";
+    padding: 0 3px 0 2px
+}
+
+b.button::after {
+    content: "]";
+    padding: 0 2px 0 3px
+}
+
+p a>code:hover {
+    color: #585ac2;
+}
+
+#header,
+#content,
+#footnotes,
+#footer {
+    width: 100%;
+    margin-left: auto;
+    margin-right: auto;
+    margin-top: 0;
+    margin-bottom: 0;
+    max-width: 62.5em;
+    *zoom: 1;
+    position: relative;
+    padding-left: .9375em;
+    padding-right: .9375em
+}
+
+#header::before,
+#header::after,
+#content::before,
+#content::after,
+#footnotes::before,
+#footnotes::after,
+#footer::before,
+#footer::after {
+    content: " ";
+    display: table
+}
+
+#header::after,
+#content::after,
+#footnotes::after,
+#footer::after {
+    clear: both
+}
+
+#content {
+    margin-top: 1.25em
+}
+
+#content::before {
+    content: none
+}
+
+#header>h1:first-child {
+    color: #303284;
+    margin-top: 2.25rem;
+    margin-bottom: 0
+}
+
+#header>h1:first-child+#toc {
+    margin-top: 8px;
+    border-top: 1px solid #dddddd
+}
+
+#header>h1:only-child,
+body.toc2 #header>h1:nth-last-child(2) {
+    border-bottom: 1px solid #dddddd;
+    padding-bottom: 8px
+}
+
+#header .details {
+    border-bottom: 1px solid #dddddd;
+    line-height: 1.45;
+    padding-top: .25em;
+    padding-bottom: .25em;
+    padding-left: .25em;
+    color: rgba(0, 0, 0, .6);
+    display: -ms-flexbox;
+    display: -webkit-flex;
+    display: flex;
+    -ms-flex-flow: row wrap;
+    -webkit-flex-flow: row wrap;
+    flex-flow: row wrap
+}
+
+#header .details span:first-child {
+    margin-left: -.125em
+}
+
+#header .details span.email a {
+    color: rgba(0, 0, 0, .85)
+}
+
+#header .details br {
+    display: none
+}
+
+#header .details br+span::before {
+    content: "\00a0\2013\00a0"
+}
+
+#header .details br+span.author::before {
+    content: "\00a0\22c5\00a0";
+    color: rgba(0, 0, 0, .85)
+}
+
+#header .details br+span#revremark::before {
+    content: "\00a0|\00a0"
+}
+
+#header #revnumber {
+    text-transform: capitalize
+}
+
+#header #revnumber::after {
+    content: "\00a0"
+}
+
+#content>h1:first-child:not([class]) {
+    color: rgba(0, 0, 0, .85);
+    border-bottom: 1px solid #dddddd
+;
+    padding-bottom: 8px;
+    margin-top: 0;
+    padding-top: 1rem;
+    margin-bottom: 1.25rem
+}
+
+#toc {
+    border-bottom: 1px solid #dddddd;
+    padding-bottom: .5em
+}
+
+#toc>ul {
+    margin-left: .125em
+}
+
+#toc ul.sectlevel0>li>a {
+    font-style: italic
+}
+
+#toc ul.sectlevel0 ul.sectlevel1 {
+    margin: .5em 0
+}
+
+#toc ul {
+    font-family: "Droid Serif", "DejaVu Sans", sans-serif;
+    list-style-type: none
+}
+
+#toc li {
+    line-height: 1.3334;
+    margin-top: .3334em
+}
+
+#toc a {
+    text-decoration: none
+}
+
+#toc a:active {
+    text-decoration: underline
+}
+
+#toctitle {
+    color: #303284;
+    font-size: 1.2em
+}
+
+@media screen and (min-width:768px) {
+    #toctitle {
+        font-size: 1.375em
+    }
+
+    body.toc2 {
+        padding-left: 15em;
+        padding-right: 0
+    }
+
+    #toc.toc2 {
+        margin-top: 0 !important;
+        background-color: #eee;
+        position: fixed;
+        width: 15em;
+        left: 0;
+        top: 0;
+        border-right: 1px solid #dddddd;
+        border-top-width: 0 !important;
+        border-bottom-width: 0 !important;
+        z-index: 1000;
+        padding: 1.25em 1em;
+        height: 100%;
+        overflow: auto
+    }
+
+    #toc.toc2 #toctitle {
+        margin-top: 0;
+        margin-bottom: .8rem;
+        font-size: 1.2em
+    }
+
+    #toc.toc2>ul {
+        font-size: .9em;
+        margin-bottom: 0
+    }
+
+    #toc.toc2 ul ul {
+        margin-left: 0;
+        padding-left: 1em
+    }
+
+    #toc.toc2 ul.sectlevel0 ul.sectlevel1 {
+        padding-left: 0;
+        margin-top: .5em;
+        margin-bottom: .5em
+    }
+
+    body.toc2.toc-right {
+        padding-left: 0;
+        padding-right: 15em
+    }
+
+    body.toc2.toc-right #toc.toc2 {
+        border-right-width: 0;
+        border-left: 1px solid #dddddd;
+        left: auto;
+        right: 0
+    }
+
+}
+
+@media screen and (min-width:1280px) {
+    body.toc2 {
+        padding-left: 20em;
+        padding-right: 0
+    }
+
+    #toc.toc2 {
+        width: 20em
+    }
+
+    #toc.toc2 #toctitle {
+        font-size: 1.375em
+    }
+
+    #toc.toc2>ul {
+        font-size: .95em
+    }
+
+    #toc.toc2 ul ul {
+        padding-left: 1.25em
+    }
+
+    body.toc2.toc-right {
+        padding-left: 0;
+        padding-right: 20em
+    }
+
+}
+
+#content #toc {
+    border-style: solid;
+    border-width: 1px;
+    border-color: #dddddd;
+    margin-bottom: 1.25em;
+    padding: 1.25em;
+    background: #f8f8f7;
+    -webkit-border-radius: 4px;
+    border-radius: 4px
+}
+
+#content #toc>:first-child {
+    margin-top: 0
+}
+
+#content #toc>:last-child {
+    margin-bottom: 0
+}
+
+#footer {
+    max-width: 100%;
+    background-color: #303284;
+    padding: 1.25em
+}
+
+#footer-text {
+    color: #fff;
+    line-height: 1.44
+}
+
+#content {
+    margin-bottom: .625em
+}
+
+.sect1 {
+    padding-bottom: .625em
+}
+
+@media screen and (min-width:768px) {
+    #content {
+        margin-bottom: 1.25em
+    }
+
+    .sect1 {
+        padding-bottom: 1.25em
+    }
+
+}
+
+.sect1:last-child {
+    padding-bottom: 0
+}
+
+.sect1+.sect1 {
+    border-top: 1px solid #dddddd;
+}
+
+#content h1>a.anchor,
+h2>a.anchor,
+h3>a.anchor,
+#toctitle>a.anchor,
+.sidebarblock>.content>.title>a.anchor,
+h4>a.anchor,
+h5>a.anchor,
+h6>a.anchor {
+    position: absolute;
+    z-index: 1001;
+    width: 1.5ex;
+    margin-left: -1.5ex;
+    display: block;
+    text-decoration: none !important;
+    visibility: hidden;
+    text-align: center;
+    font-weight: 400
+}
+
+#content h1>a.anchor::before,
+h2>a.anchor::before,
+h3>a.anchor::before,
+#toctitle>a.anchor::before,
+.sidebarblock>.content>.title>a.anchor::before,
+h4>a.anchor::before,
+h5>a.anchor::before,
+h6>a.anchor::before {
+    content: "\00A7";
+    font-size: .85em;
+    display: block;
+    padding-top: .1em
+}
+
+#content h1:hover>a.anchor,
+#content h1>a.anchor:hover,
+h2:hover>a.anchor,
+h2>a.anchor:hover,
+h3:hover>a.anchor,
+#toctitle:hover>a.anchor,
+.sidebarblock>.content>.title:hover>a.anchor,
+h3>a.anchor:hover,
+#toctitle>a.anchor:hover,
+.sidebarblock>.content>.title>a.anchor:hover,
+h4:hover>a.anchor,
+h4>a.anchor:hover,
+h5:hover>a.anchor,
+h5>a.anchor:hover,
+h6:hover>a.anchor,
+h6>a.anchor:hover {
+    visibility: visible
+}
+
+#content h1>a.link,
+h2>a.link,
+h3>a.link,
+#toctitle>a.link,
+.sidebarblock>.content>.title>a.link,
+h4>a.link,
+h5>a.link,
+h6>a.link {
+    color: #ba3925;
+    text-decoration: none
+}
+
+#content h1>a.link:hover,
+h2>a.link:hover,
+h3>a.link:hover,
+#toctitle>a.link:hover,
+.sidebarblock>.content>.title>a.link:hover,
+h4>a.link:hover,
+h5>a.link:hover,
+h6>a.link:hover {
+    color: #a53221
+}
+
+.audioblock,
+.imageblock,
+.literalblock,
+.listingblock,
+.stemblock,
+.videoblock {
+    margin-bottom: 1.25em
+}
+
+.admonitionblock td.content>.title,
+.audioblock>.title,
+.exampleblock>.title,
+.imageblock>.title,
+.listingblock>.title,
+.literalblock>.title,
+.stemblock>.title,
+.openblock>.title,
+.paragraph>.title,
+.quoteblock>.title,
+table.tableblock>.title,
+.verseblock>.title,
+.videoblock>.title,
+.dlist>.title,
+.olist>.title,
+.ulist>.title,
+.qlist>.title,
+.hdlist>.title {
+    text-rendering: optimizeLegibility;
+    text-align: left;
+    font-family: "Droid Serif", "DejaVu Serif", serif;
+    font-size: 1rem;
+    font-style: italic
+}
+
+table.tableblock.fit-content>caption.title {
+    white-space: nowrap;
+    width: 0
+}
+
+.paragraph.lead>p,
+#preamble>.sectionbody>[class="paragraph"]:first-of-type p {
+    font-size: 1.21875em;
+    line-height: 1.6;
+    color: rgba(0, 0, 0, .85)
+}
+
+table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p {
+    font-size: inherit
+}
+
+.admonitionblock>table {
+    border-collapse: separate;
+    border: 0;
+    background: none;
+    width: 100%
+}
+
+.admonitionblock>table td.icon {
+    text-align: center;
+    width: 80px
+}
+
+.admonitionblock>table td.icon img {
+    max-width: none
+}
+
+.admonitionblock>table td.icon .title {
+    font-weight: bold;
+    font-family: "Source Sans Pro", "DejaVu Sans", sans-serif;
+    text-transform: uppercase
+}
+
+.admonitionblock>table td.content {
+    padding-left: 1.125em;
+    padding-right: 1.25em;
+    border-left: 1px solid #dddddd;
+    color: rgba(0, 0, 0, .6)
+}
+
+.admonitionblock>table td.content>:last-child>:last-child {
+    margin-bottom: 0
+}
+
+.exampleblock>.content {
+    border-style: solid;
+    border-width: 1px;
+    border-color: #dddddd;
+    margin-bottom: 1.25em;
+    padding: 1.25em;
+    background: #fff;
+    -webkit-border-radius: 4px;
+    border-radius: 4px
+}
+
+.exampleblock>.content>:first-child {
+    margin-top: 0
+}
+
+.exampleblock>.content>:last-child {
+    margin-bottom: 0
+}
+
+.sidebarblock {
+    border-style: solid;
+    border-width: 1px;
+    border-color: #dddddd;
+    margin-bottom: 1.25em;
+    padding: 1.25em;
+    background: #f8f8f7;
+    -webkit-border-radius: 4px;
+    border-radius: 4px
+}
+
+.sidebarblock>:first-child {
+    margin-top: 0
+}
+
+.sidebarblock>:last-child {
+    margin-bottom: 0
+}
+
+.sidebarblock>.content>.title {
+    color: #303284;
+    margin-top: 0;
+    text-align: center
+}
+
+.exampleblock>.content>:last-child>:last-child,
+.exampleblock>.content .olist>ol>li:last-child>:last-child,
+.exampleblock>.content .ulist>ul>li:last-child>:last-child,
+.exampleblock>.content .qlist>ol>li:last-child>:last-child,
+.sidebarblock>.content>:last-child>:last-child,
+.sidebarblock>.content .olist>ol>li:last-child>:last-child,
+.sidebarblock>.content .ulist>ul>li:last-child>:last-child,
+.sidebarblock>.content .qlist>ol>li:last-child>:last-child {
+    margin-bottom: 0
+}
+
+.literalblock pre,
+.listingblock pre:not(.highlight),.listingblock 
pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock 
pre.CodeRay,.listingblock pre.prettyprint {
+    background: #f7f7f8
+}
+
+.sidebarblock .literalblock pre,
+.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock 
pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight 
"],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock 
pre.prettyprint {
+    background: #f2f1f1
+}
+
+.literalblock pre,
+.literalblock pre[class],
+.listingblock pre,
+.listingblock pre[class] {
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    word-wrap: break-word;
+    padding: 1em;
+    font-size: .8125em
+}
+
+.literalblock pre.nowrap,
+.literalblock pre[class].nowrap,
+.listingblock pre.nowrap,
+.listingblock pre[class].nowrap {
+    overflow-x: auto;
+    white-space: pre;
+    word-wrap: normal
+}
+
+@media screen and (min-width:768px) {
+    .literalblock pre,
+    .literalblock pre[class],
+    .listingblock pre,
+    .listingblock pre[class] {
+        font-size: .90625em
+    }
+
+}
+
+@media screen and (min-width:1280px) {
+    .literalblock pre,
+    .literalblock pre[class],
+    .listingblock pre,
+    .listingblock pre[class] {
+        font-size: 1em
+    }
+
+}
+
+.literalblock.output pre {
+    color: #f7f7f8;
+    background-color: rgba(0, 0, 0, .9)
+}
+
+.listingblock pre.highlightjs {
+    padding: 0
+}
+
+.listingblock pre.highlightjs>code {
+    padding: 1em;
+    -webkit-border-radius: 4px;
+    border-radius: 4px
+}
+
+.listingblock pre.prettyprint {
+    border-width: 0
+}
+
+.listingblock>.content {
+    position: relative
+}
+
+.listingblock code[data-lang]::before {
+    display: none;
+    content: attr(data-lang);
+    position: absolute;
+    font-size: .75em;
+    top: .425rem;
+    right: .5rem;
+    line-height: 1;
+    text-transform: uppercase;
+    color: #999
+}
+
+.listingblock:hover code[data-lang]::before {
+    display: block
+}
+
+.listingblock.terminal pre .command::before {
+    content: attr(data-prompt);
+    padding-right: .5em;
+    color: #999
+}
+
+.listingblock.terminal pre .command:not([data-prompt])::before {
+    content: "$"
+}
+
+table.pyhltable {
+    border-collapse: separate;
+    border: 0;
+    margin-bottom: 0;
+    background: none
+}
+
+table.pyhltable td {
+    vertical-align: top;
+    padding-top: 0;
+    padding-bottom: 0;
+    line-height: 1.45
+}
+
+table.pyhltable td.code {
+    padding-left: .75em;
+    padding-right: 0
+}
+
+pre.pygments .lineno,
+table.pyhltable td:not(.code) {
+    color: #999;
+    padding-left: 0;
+    padding-right: .5em;
+    border-right: 1px solid #dddddd;
+}
+
+pre.pygments .lineno {
+    display: inline-block;
+    margin-right: .25em
+}
+
+table.pyhltable .linenodiv {
+    background: none !important;
+    padding-right: 0 !important
+}
+
+.quoteblock {
+    margin: 0 1em 1.25em 1.5em;
+    display: table
+}
+
+.quoteblock>.title {
+    margin-left: -1.5em;
+    margin-bottom: .75em
+}
+
+.quoteblock blockquote,
+.quoteblock blockquote p {
+    color: rgba(0, 0, 0, .85);
+    font-size: 1.05rem;
+    line-height: 1.75;
+    word-spacing: .1em;
+    letter-spacing: 0;
+    font-style: italic;
+    text-align: justify
+}
+
+.quoteblock blockquote {
+    margin: 0;
+    padding: 0;
+    border: 0
+}
+
+.quoteblock blockquote::before {
+    content: "\201c";
+    float: left;
+    font-size: 2.75em;
+    font-weight: bold;
+    line-height: .6em;
+    margin-left: -.6em;
+    color: #303284;
+    text-shadow: 0 1px 2px rgba(0, 0, 0, .1)
+}
+
+.quoteblock blockquote>.paragraph:last-child p {
+    margin-bottom: 0
+}
+
+.quoteblock .attribution {
+    margin-top: .5em;
+    margin-right: .5ex;
+    text-align: right
+}
+
+.quoteblock .quoteblock {
+    margin-left: 0;
+    margin-right: 0;
+    padding: .5em 0;
+    border-left: 3px solid rgba(0, 0, 0, .6)
+}
+
+.quoteblock .quoteblock blockquote {
+    padding: 0 0 0 .75em
+}
+
+.quoteblock .quoteblock blockquote::before {
+    display: none
+}
+
+.verseblock {
+    margin: 0 1em 1.25em
+}
+
+.verseblock pre {
+    font-family: "Source Sans Pro", "DejaVu Sans", sans;
+    font-size: 1.15rem;
+    color: rgba(0, 0, 0, .85);
+    font-weight: 300;
+    text-rendering: optimizeLegibility
+}
+
+.verseblock pre strong {
+    font-weight: 400
+}
+
+.verseblock .attribution {
+    margin-top: 1.25rem;
+    margin-left: .5ex
+}
+
+.quoteblock .attribution,
+.verseblock .attribution {
+    font-size: .9375em;
+    line-height: 1.45;
+    font-style: italic
+}
+
+.quoteblock .attribution br,
+.verseblock .attribution br {
+    display: none
+}
+
+.quoteblock .attribution cite,
+.verseblock .attribution cite {
+    display: block;
+    letter-spacing: -.025em;
+    color: rgba(0, 0, 0, .6)
+}
+
+.quoteblock.abstract {
+    margin: 0 1em 1.25em;
+    display: block
+}
+
+.quoteblock.abstract>.title {
+    margin: 0 0 .375em;
+    font-size: 1.15em;
+    text-align: center
+}
+
+.quoteblock.abstract blockquote,
+.quoteblock.abstract blockquote p {
+    word-spacing: 0;
+    line-height: 1.6
+}
+
+.quoteblock.abstract blockquote::before,
+.quoteblock.abstract p::before {
+    display: none
+}
+
+table.tableblock {
+    max-width: 100%;
+    border-collapse: separate
+}
+
+p.tableblock:last-child {
+    margin-bottom: 0
+}
+
+td.tableblock>.content {
+    margin-bottom: -1.25em
+}
+
+table.tableblock,
+th.tableblock,
+td.tableblock {
+    border: 0 solid #dddddd;
+}
+
+table.grid-all>thead>tr>.tableblock,
+table.grid-all>tbody>tr>.tableblock {
+    border-width: 0 1px 1px 0
+}
+
+table.grid-all>tfoot>tr>.tableblock {
+    border-width: 1px 1px 0 0
+}
+
+table.grid-cols>*>tr>.tableblock {
+    border-width: 0 1px 0 0
+}
+
+table.grid-rows>thead>tr>.tableblock,
+table.grid-rows>tbody>tr>.tableblock {
+    border-width: 0 0 1px
+}
+
+table.grid-rows>tfoot>tr>.tableblock {
+    border-width: 1px 0 0
+}
+
+table.grid-all>*>tr>.tableblock:last-child,
+table.grid-cols>*>tr>.tableblock:last-child {
+    border-right-width: 0
+}
+
+table.grid-all>tbody>tr:last-child>.tableblock,
+table.grid-all>thead:last-child>tr>.tableblock,
+table.grid-rows>tbody>tr:last-child>.tableblock,
+table.grid-rows>thead:last-child>tr>.tableblock {
+    border-bottom-width: 0
+}
+
+table.frame-all {
+    border-width: 1px
+}
+
+table.frame-sides {
+    border-width: 0 1px
+}
+
+table.frame-topbot,
+table.frame-ends {
+    border-width: 1px 0
+}
+
+table.stripes-all tr,
+table.stripes-odd tr:nth-of-type(odd) {
+    background: #f8f8f7
+}
+
+table.stripes-none tr,
+table.stripes-odd tr:nth-of-type(even) {
+    background: none
+}
+
+th.halign-left,
+td.halign-left {
+    text-align: left
+}
+
+th.halign-right,
+td.halign-right {
+    text-align: right
+}
+
+th.halign-center,
+td.halign-center {
+    text-align: center
+}
+
+th.valign-top,
+td.valign-top {
+    vertical-align: top
+}
+
+th.valign-bottom,
+td.valign-bottom {
+    vertical-align: bottom
+}
+
+th.valign-middle,
+td.valign-middle {
+    vertical-align: middle
+}
+
+table thead th,
+table tfoot th {
+    font-weight: bold
+}
+
+tbody tr th {
+    display: table-cell;
+    line-height: 1.6;
+    background: #f7f8f7
+}
+
+tbody tr th,
+tbody tr th p,
+tfoot tr th,
+tfoot tr th p {
+    color: rgba(0, 0, 0, .8);
+    font-weight: bold
+}
+
+p.tableblock>code:only-child {
+    background: none;
+    padding: 0
+}
+
+p.tableblock {
+    font-size: 1em
+}
+
+td>div.verse {
+    white-space: pre
+}
+
+ol {
+    margin-left: 1.75em
+}
+
+ul li ol {
+    margin-left: 1.5em
+}
+
+dl dd {
+    margin-left: 1.125em
+}
+
+dl dd:last-child,
+dl dd:last-child>:last-child {
+    margin-bottom: 0
+}
+
+ol>li p,
+ul>li p,
+ul dd,
+ol dd,
+.olist .olist,
+.ulist .ulist,
+.ulist .olist,
+.olist .ulist {
+    margin-bottom: .625em
+}
+
+ul.checklist,
+ul.none,
+ol.none,
+ul.no-bullet,
+ol.no-bullet,
+ol.unnumbered,
+ul.unstyled,
+ol.unstyled {
+    list-style-type: none
+}
+
+ul.no-bullet,
+ol.no-bullet,
+ol.unnumbered {
+    margin-left: .625em
+}
+
+ul.unstyled,
+ol.unstyled {
+    margin-left: 0
+}
+
+ul.checklist {
+    margin-left: .625em
+}
+
+ul.checklist li>p:first-child>.fa-square-o:first-child,
+ul.checklist li>p:first-child>.fa-check-square-o:first-child {
+    width: 1.25em;
+    font-size: .8em;
+    position: relative;
+    bottom: .125em
+}
+
+ul.checklist li>p:first-child>input[type="checkbox"]:first-child {
+    margin-right: .25em
+}
+
+ul.inline {
+    display: -ms-flexbox;
+    display: -webkit-box;
+    display: flex;
+    -ms-flex-flow: row wrap;
+    -webkit-flex-flow: row wrap;
+    flex-flow: row wrap;
+    list-style: none;
+    margin: 0 0 .625em -1.25em
+}
+
+ul.inline>li {
+    margin-left: 1.25em
+}
+
+.unstyled dl dt {
+    font-weight: 400;
+    font-style: normal
+}
+
+ol.arabic {
+    list-style-type: decimal
+}
+
+ol.decimal {
+    list-style-type: decimal-leading-zero
+}
+
+ol.loweralpha {
+    list-style-type: lower-alpha
+}
+
+ol.upperalpha {
+    list-style-type: upper-alpha
+}
+
+ol.lowerroman {
+    list-style-type: lower-roman
+}
+
+ol.upperroman {
+    list-style-type: upper-roman
+}
+
+ol.lowergreek {
+    list-style-type: lower-greek
+}
+
+.hdlist>table,
+.colist>table {
+    border: 0;
+    background: none
+}
+
+.hdlist>table>tbody>tr,
+.colist>table>tbody>tr {
+    background: none
+}
+
+td.hdlist1,
+td.hdlist2 {
+    vertical-align: top;
+    padding: 0 .625em
+}
+
+td.hdlist1 {
+    font-weight: bold;
+    padding-bottom: 1.25em
+}
+
+.literalblock+.colist,
+.listingblock+.colist {
+    margin-top: -.5em
+}
+
+.colist td:not([class]):first-child {
+    padding: .4em .75em 0;
+    line-height: 1;
+    vertical-align: top
+}
+
+.colist td:not([class]):first-child img {
+    max-width: none
+}
+
+.colist td:not([class]):last-child {
+    padding: .25em 0
+}
+
+.thumb,
+.th {
+    line-height: 0;
+    display: inline-block;
+    border: solid 4px #fff;
+    -webkit-box-shadow: 0 0 0 1px #ddd;
+    box-shadow: 0 0 0 1px #ddd
+}
+
+.imageblock.left,
+.imageblock[style*="float:left"] {
+    margin: .25em .625em 1.25em 0
+}
+
+.imageblock.right,
+.imageblock[style*="float:right"] {
+    margin: .25em 0 1.25em .625em
+}
+
+.imageblock>.title {
+    margin-bottom: 0
+}
+
+.imageblock.thumb,
+.imageblock.th {
+    border-width: 6px
+}
+
+.imageblock.thumb>.title,
+.imageblock.th>.title {
+    padding: 0 .125em
+}
+
+.image.left,
+.image.right {
+    margin-top: .25em;
+    margin-bottom: .25em;
+    display: inline-block;
+    line-height: 0
+}
+
+.image.left {
+    margin-right: .625em
+}
+
+.image.right {
+    margin-left: .625em
+}
+
+a.image {
+    text-decoration: none;
+    display: inline-block
+}
+
+a.image object {
+    pointer-events: none
+}
+
+sup.footnote,
+sup.footnoteref {
+    font-size: .875em;
+    position: static;
+    vertical-align: super
+}
+
+sup.footnote a,
+sup.footnoteref a {
+    text-decoration: none
+}
+
+sup.footnote a:active,
+sup.footnoteref a:active {
+    text-decoration: underline
+}
+
+#footnotes {
+    padding-top: .75em;
+    padding-bottom: .75em;
+    margin-bottom: .625em
+}
+
+#footnotes hr {
+    width: 20%;
+    min-width: 6.25em;
+    margin: -.25em 0 .75em;
+    border-width: 1px 0 0
+}
+
+#footnotes .footnote {
+    padding: 0 .375em 0 .225em;
+    line-height: 1.3334;
+    font-size: .875em;
+    margin-left: 1.2em;
+    margin-bottom: .2em
+}
+
+#footnotes .footnote a:first-of-type {
+    font-weight: bold;
+    text-decoration: none;
+    margin-left: -1.05em
+}
+
+#footnotes .footnote:last-of-type {
+    margin-bottom: 0
+}
+
+#content #footnotes {
+    margin-top: -.625em;
+    margin-bottom: 0;
+    padding: .75em 0
+}
+
+.gist .file-data>table {
+    border: 0;
+    background: #fff;
+    width: 100%;
+    margin-bottom: 0
+}
+
+.gist .file-data>table td.line-data {
+    width: 99%
+}
+
+div.unbreakable {
+    page-break-inside: avoid
+}
+
+.big {
+    font-size: larger
+}
+
+.small {
+    font-size: smaller
+}
+
+.underline {
+    text-decoration: underline
+}
+
+.overline {
+    text-decoration: overline
+}
+
+.line-through {
+    text-decoration: line-through
+}
+
+.aqua {
+    color: #00bfbf
+}
+
+.aqua-background {
+    background-color: #00fafa
+}
+
+.black {
+    color: #000
+}
+
+.black-background {
+    background-color: #000
+}
+
+.blue {
+    color: #0000bf
+}
+
+.blue-background {
+    background-color: #0000fa
+}
+
+.fuchsia {
+    color: #bf00bf
+}
+
+.fuchsia-background {
+    background-color: #fa00fa
+}
+
+.gray {
+    color: #606060
+}
+
+.gray-background {
+    background-color: #7d7d7d
+}
+
+.green {
+    color: #006000
+}
+
+.green-background {
+    background-color: #007d00
+}
+
+.lime {
+    color: #00bf00
+}
+
+.lime-background {
+    background-color: #00fa00
+}
+
+.maroon {
+    color: #600000
+}
+
+.maroon-background {
+    background-color: #7d0000
+}
+
+.navy {
+    color: #000060
+}
+
+.navy-background {
+    background-color: #00007d
+}
+
+.olive {
+    color: #606000
+}
+
+.olive-background {
+    background-color: #7d7d00
+}
+
+.purple {
+    color: #600060
+}
+
+.purple-background {
+    background-color: #7d007d
+}
+
+.red {
+    color: #bf0000
+}
+
+.red-background {
+    background-color: #fa0000
+}
+
+.silver {
+    color: #909090
+}
+
+.silver-background {
+    background-color: #bcbcbc
+}
+
+.teal {
+    color: #006060
+}
+
+.teal-background {
+    background-color: #007d7d
+}
+
+.white {
+    color: #bfbfbf
+}
+
+.white-background {
+    background-color: #fafafa
+}
+
+.yellow {
+    color: #bfbf00
+}
+
+.yellow-background {
+    background-color: #fafa00
+}
+
+span.icon>.fa {
+    cursor: default
+}
+
+a span.icon>.fa {
+    cursor: inherit
+}
+
+.admonitionblock td.icon [class^="fa icon-"] {
+    font-size: 2.5em;
+    text-shadow: 1px 1px 2px rgba(0, 0, 0, .5);
+    cursor: default
+}
+
+.admonitionblock td.icon .icon-note::before {
+    content: "\f05a";
+    color: #19407c
+}
+
+.admonitionblock td.icon .icon-tip::before {
+    content: "\f0eb";
+    text-shadow: 1px 1px 2px rgba(155, 155, 0, .8);
+    color: #111
+}
+
+.admonitionblock td.icon .icon-warning::before {
+    content: "\f071";
+    color: #bf6900
+}
+
+.admonitionblock td.icon .icon-caution::before {
+    content: "\f06d";
+    color: #bf3400
+}
+
+.admonitionblock td.icon .icon-important::before {
+    content: "\f06a";
+    color: #bf0000
+}
+
+.conum[data-value] {
+    display: inline-block;
+    color: #fff !important;
+    background-color: rgba(0, 0, 0, .8);
+    -webkit-border-radius: 100px;
+    border-radius: 100px;
+    text-align: center;
+    font-size: .75em;
+    width: 1.67em;
+    height: 1.67em;
+    line-height: 1.67em;
+    font-family: "Source Sans Pro", "DejaVu Sans", sans-serif;
+    font-style: normal;
+    font-weight: bold
+}
+
+.conum[data-value] * {
+    color: #fff !important
+}
+
+.conum[data-value]+b {
+    display: none
+}
+
+.conum[data-value]::after {
+    content: attr(data-value)
+}
+
+pre .conum[data-value] {
+    position: relative;
+    top: -.125em
+}
+
+b.conum * {
+    color: inherit !important
+}
+
+.conum:not([data-value]):empty {
+    display: none
+}
+
+dt,
+th.tableblock,
+td.content,
+div.footnote {
+    text-rendering: optimizeLegibility
+}
+
+h1,
+h2,
+p,
+td.content,
+span.alt {
+    letter-spacing: -.01em
+}
+
+p strong,
+td.content strong,
+div.footnote strong {
+    letter-spacing: -.005em
+}
+
+p,
+blockquote,
+dt,
+td.content,
+span.alt {
+    /*font-size: 1.0625rem*/
+}
+
+p {
+    margin-bottom: 1.25rem
+}
+
+.sidebarblock p,
+.sidebarblock dt,
+.sidebarblock td.content,
+p.tableblock {
+    font-size: 1em
+}
+
+.exampleblock>.content {
+    background-color: #fffef7;
+    border-color: #dddddd;
+    -webkit-box-shadow: 0 1px 4px #e0e0dc;
+    box-shadow: 0 1px 4px #e0e0dc
+}
+
+.print-only {
+    display: none !important
+}
+
+@page {
+    margin: 1.25cm .75cm
+}
+
+@media print {
+    * {
+        -webkit-box-shadow: none !important;
+        box-shadow: none !important;
+        text-shadow: none !important
+    }
+
+    html {
+        font-size: 80%
+    }
+
+    a {
+        color: inherit !important;
+        text-decoration: underline !important
+    }
+
+    a.bare,
+    a[href^="#"],
+    a[href^="mailto:";] {
+        text-decoration: none !important
+    }
+
+    a[href^="http:"]:not(.bare)::after,
+    a[href^="https:"]:not(.bare)::after {
+        content: "("attr(href) ")";
+        display: inline-block;
+        font-size: .875em;
+        padding-left: .25em
+    }
+
+    abbr[title]::after {
+        content: " ("attr(title) ")"
+    }
+
+    pre,
+    blockquote,
+    tr,
+    img,
+    object,
+    svg {
+        page-break-inside: avoid
+    }
+
+    thead {
+        display: table-header-group
+    }
+
+    svg {
+        max-width: 100%
+    }
+
+    p,
+    blockquote,
+    dt,
+    td.content {
+        font-size: 1em;
+        orphans: 3;
+        widows: 3
+    }
+
+    h2,
+    h3,
+    #toctitle,
+    .sidebarblock>.content>.title {
+        page-break-after: avoid
+    }
+
+    #toc,
+    .sidebarblock,
+    .exampleblock>.content {
+        background: none !important
+    }
+
+    #toc {
+        border-bottom: 1px solid #dddddd !important;
+        padding-bottom: 0 !important
+    }
+
+    body.book #header {
+        text-align: center
+    }
+
+    body.book #header>h1:first-child {
+        border: 0 !important;
+        margin: 2.5em 0 1em
+    }
+
+    body.book #header .details {
+        border: 0 !important;
+        display: block;
+        padding: 0 !important
+    }
+
+    body.book #header .details span:first-child {
+        margin-left: 0 !important
+    }
+
+    body.book #header .details br {
+        display: block
+    }
+
+    body.book #header .details br+span::before {
+        content: none !important
+    }
+
+    body.book #toc {
+        border: 0 !important;
+        text-align: left !important;
+        padding: 0 !important;
+        margin: 0 !important
+    }
+
+    body.book #toc,
+    body.book #preamble,
+    body.book h1.sect0,
+    body.book .sect1>h2 {
+        page-break-before: always
+    }
+
+    .listingblock code[data-lang]::before {
+        display: block
+    }
+
+    #footer {
+        padding: 0 .9375em
+    }
+
+    .hide-on-print {
+        display: none !important
+    }
+
+    .print-only {
+        display: block !important
+    }
+
+    .hide-for-print {
+        display: none !important
+    }
+
+    .show-for-print {
+        display: inherit !important
+    }
+
+}
+
+@media print, amzn-kf8 {
+    #header>h1:first-child {
+        margin-top: 1.25rem
+    }
+
+    .sect1 {
+        padding: 0 !important
+    }
+
+    .sect1+.sect1 {
+        border: 0
+    }
+
+    #footer {
+        background: none
+    }
+
+    #footer-text {
+        color: rgba(0, 0, 0, .6);
+        font-size: .9em
+    }
+
+}
+
+@media amzn-kf8 {
+    #header,
+    #content,
+    #footnotes,
+    #footer {
+        padding: 0
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/b077d27b/manual/src/archives/1.1/asciidoc/building-and-deploying.adoc
----------------------------------------------------------------------
diff --git a/manual/src/archives/1.1/asciidoc/building-and-deploying.adoc 
b/manual/src/archives/1.1/asciidoc/building-and-deploying.adoc
new file mode 100644
index 0000000..04add15
--- /dev/null
+++ b/manual/src/archives/1.1/asciidoc/building-and-deploying.adoc
@@ -0,0 +1,225 @@
+//
+// 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.
+//
+
+=== Building
+
+Simply type at the root of the project:
+
+[source]
+----
+mvn clean install -P generate-package
+----
+
+The Maven build process will generate both a standalone package you can use 
directly to start the context server
+(see "Deploying the generated package") or a KAR file that you can then deploy 
using a manual deployment process into
+an already installed Apache Karaf server (see "Deploying into an existing 
Karaf server")
+
+If you want to build and run the integration tests, you should instead use : 
+
+[source]
+----
+mvn -P integration-tests clean install
+----
+
+==== Deploying the generated package
+
+The "package" sub-project generates a pre-configured Apache Karaf installation 
that is the simplest way to get started.
+Simply uncompress the `package/target/unomi-VERSION.tar.gz` (for Linux or Mac 
OS X) or
+ `package/target/unomi-VERSION.zip` (for Windows) archive into the directory 
of your choice.
+
+You can then start the server simply by using the command on UNIX/Linux/MacOS 
X : 
+
+[source]
+----
+./bin/karaf
+----
+
+or on Windows shell : 
+
+[source]
+----
+bin\karaf.bat
+----
+
+==== Deploying into an existing Karaf server
+
+This is only needed if you didn't use the generated package. Also, this is the 
preferred way to install a development
+environment if you intend to re-deploy the context server KAR iteratively.
+
+Additional requirements:
+ - Apache Karaf 3.0.2+, http://karaf.apache.org[http://karaf.apache.org]
+ - Local copy of the Elasticsearch ZIP package, available here : 
http://www.elasticsearch.org[http://www.elasticsearch.org]
+
+. 
+
+Before deploying, make sure that you have Apache Karaf properly installed. You 
will also have to increase the
+default maximum memory size and perm gen size by adjusting the following 
environment values in the bin/setenv(.bat)
+files (at the end of the file):
+
+[source]
+----
+   MY_DIRNAME=`dirname $0`
+   MY_KARAF_HOME=`cd "$MY_DIRNAME/.."; pwd`
+   export KARAF_OPTS="-Djava.library.path=$MY_KARAF_HOME/lib/sigar"
+   export JAVA_MAX_MEM=3G
+   export JAVA_MAX_PERM_MEM=384M
+----
+
+. 
+
+You will also need to have the Hyperic Sigar native libraries in your Karaf 
installation, so in order to this
+go to the Elasticsearch website 
(http://www.elasticsearch.org[http://www.elasticsearch.org]) and download the 
ZIP package. Decompress it somewhere
+on your disk and copy all the files from the lib/sigar directory into Karaf's 
lib/sigar directory
+(must be created first) EXCEPT THE SIGAR.JAR file.
+
+. 
+
+Install the WAR support, CXF into Karaf by doing the following in the Karaf 
command line:
+
+[source]
+----
+   feature:install -v war
+   feature:repo-add cxf 2.7.11
+   feature:install -v cxf/2.7.11
+----
+
+. 
+
+Create a new $MY_KARAF_HOME/etc/org.apache.cxf.osgi.cfg file and put the 
following property inside :
+
+[source]
+----
+   org.apache.cxf.servlet.context=/cxs
+----
+
+. 
+
+Copy the following KAR to the Karaf deploy directory, as in this example line:
+
+[source]
+----
+  cp kar/target/unomi-kar-1.0.0-SNAPSHOT.kar 
~/java/deployments/unomi/apache-karaf-3.0.1/deploy/
+----
+
+. 
+
+If all went smoothly, you should be able to access the context script here : 
http://localhost:8181/cxs/cluster[http://localhost:8181/cxs/cluster] .
+ You should be able to login with karaf / karaf and see basic server 
information. If not something went wrong during the install.
+
+==== JDK Selection on Mac OS X
+
+You might need to select the JDK to run the tests in the itests subproject. In 
order to do so you can list the
+installed JDKs with the following command : 
+
+[source]
+----
+/usr/libexec/java_home -V
+----
+
+which will output something like this : 
+
+[source]
+----
+Matching Java Virtual Machines (7):
+    1.7.0_51, x86_64:   "Java SE 7"   
/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home
+    1.7.0_45, x86_64:   "Java SE 7"   
/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home
+    1.7.0_25, x86_64:   "Java SE 7"   
/Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home
+    1.6.0_65-b14-462, x86_64:   "Java SE 6"   
/Library/Java/JavaVirtualMachines/1.6.0_65-b14-462.jdk/Contents/Home
+    1.6.0_65-b14-462, i386: "Java SE 6" 
/Library/Java/JavaVirtualMachines/1.6.0_65-b14-462.jdk/Contents/Home
+    1.6.0_65-b14-462, x86_64:   "Java SE 6"   
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
+    1.6.0_65-b14-462, i386: "Java SE 6" 
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
+----
+
+You can then select the one you want using : 
+
+[source]
+----
+export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_51`
+----
+
+and then check that it was correctly referenced using: 
+
+[source]
+----
+java -version
+----
+
+which should give you a result such as this: 
+
+[source]
+----
+java version "1.7.0_51"
+Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
+Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
+----
+
+==== Running the integration tests
+
+The integration tests are not executed by default to make build time minimal, 
but it is recommended to run the
+integration tests at least once before using the server to make sure that 
everything is ok in the build. Another way
+to use these tests is to run them from a continuous integration server such as 
Jenkins, Apache Gump, Atlassian Bamboo or
+ others. 
+
+Note : the integration tests require a JDK 7 or more recent !
+
+To run the tests simply activate the following profile : 
+
+[source]
+----
+mvn -P integration-tests clean install
+----
+
+==== Running the performance tests
+
+Performance tests are based on Gatling. You need to have a running context 
server or cluster of servers before
+executing the tests.
+
+Test parameteres are editable in the 
performance-tests/src/test/scala/unomi/Parameters.scala file. baseUrls should
+contains the URLs of all your cluster nodes
+
+Run the test by using the gatling.conf file in 
performance-tests/src/test/resources :
+
+[source]
+----
+    export GATLING_CONF=<path>/performance-tests/src/test/resources
+    gatling.sh
+----
+
+Reports are generated in performance-tests/target/results.
+
+==== Testing with an example page
+
+A default test page is provided at the following URL:
+
+[source]
+----
+   http://localhost:8181/index.html
+----
+
+This test page will trigger the loading of the /context.js script, which will 
try to retrieving the user context
+or create a new one if it doesn't exist yet. It also contains an experimental 
integration with Facebook Login, but it
+doesn't yet save the context back to the context server.
+
+==== Integrating onto a page
+
+Simply reference the context script in your HTML as in the following example:
+
+[source,javascript]
+----
+<script type="text/javascript">
+    (function(){ var u=(("https:" == document.location.protocol) ? 
"https://localhost:8181/"; : "http://localhost:8181/";);
+    var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0]; g.type='text/javascript'; g.defer=true; 
g.async=true; g.src=u+'context.js';
+    s.parentNode.insertBefore(g,s); })();
+</script>
+----
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/b077d27b/manual/src/archives/1.1/asciidoc/clustering.adoc
----------------------------------------------------------------------
diff --git a/manual/src/archives/1.1/asciidoc/clustering.adoc 
b/manual/src/archives/1.1/asciidoc/clustering.adoc
new file mode 100644
index 0000000..efab64e
--- /dev/null
+++ b/manual/src/archives/1.1/asciidoc/clustering.adoc
@@ -0,0 +1,103 @@
+//
+// 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.
+//
+
+=== Cluster setup
+
+Context server relies on Elasticsearch to discover and configure its cluster. 
You just need to install multiple context
+servers on the same network, and enable the discovery protocol in 
$MY_KARAF_HOME/etc/org.apache.unomi.persistence.elasticsearch.cfg file :
+
+[source]
+----
+discovery.zen.ping.multicast.enabled=true
+----
+
+All nodes on the same network, sharing the same cluster name will be part of 
the same cluster.
+
+==== Recommended configurations
+
+It is recommended to have one node dedicated to the context server, where the 
other nodes take care of the
+Elasticsearch persistence. The node dedicated to the context server will have 
node.data set to false.
+
+===== 2 nodes configuration
+
+One node dedicated to context server, 1 node for elasticsearch storage.
+
+Node A :
+
+[source]
+----
+node.data=true
+numberOfReplicas=0
+monthlyIndex.numberOfReplicas=0
+----
+
+Node B :
+
+[source]
+----
+node.data=false
+numberOfReplicas=0
+monthlyIndex.numberOfReplicas=0
+----
+
+===== 3 nodes configuration
+
+One node dedicated to context server, 2 nodes for elasticsearch storage with 
fault-tolerance
+
+Node A :
+
+[source]
+----
+node.data=false
+numberOfReplicas=1
+monthlyIndex.numberOfReplicas=1
+----
+
+Node B :
+
+[source]
+----
+node.data=true
+numberOfReplicas=1
+monthlyIndex.numberOfReplicas=1
+----
+
+Node C :
+
+[source]
+----
+node.data=true
+numberOfReplicas=1
+monthlyIndex.numberOfReplicas=1
+----
+
+==== Specific configuration
+
+If multicast is not allowed on your network, you'll need to switch to unicast 
protocol and manually configure the server IPs. This can be
+done by disabling the elasticsearch automatic discovery in 
$MY_KARAF_HOME/etc/org.apache.unomi.persistence.elasticsearch.cfg :
+
+[source]
+----
+discovery.zen.ping.multicast.enabled=false
+----
+
+And then set the property discovery.zen.ping.unicast.hosts in 
$MY_KARAF_HOME/etc/elasticsearch.yml files :
+
+[source]
+----
+discovery.zen.ping.unicast.hosts: [‘192.168.0.1:9300', ‘192.168.0.2:9300']
+----
+
+More information and configuration options can be found at :
+https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html[https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/b077d27b/manual/src/archives/1.1/asciidoc/concepts.adoc
----------------------------------------------------------------------
diff --git a/manual/src/archives/1.1/asciidoc/concepts.adoc 
b/manual/src/archives/1.1/asciidoc/concepts.adoc
new file mode 100644
index 0000000..5c1f117
--- /dev/null
+++ b/manual/src/archives/1.1/asciidoc/concepts.adoc
@@ -0,0 +1,234 @@
+//
+// 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.
+//
+
+=== Concepts
+
+Apache Unomi gathers information about users actions, information that is 
processed and stored by Unomi services. The collected information can then be 
used to personalize content, derive insights on user behavior, categorize the 
user profiles into segments along user-definable dimensions or acted upon by 
algorithms.
+
+==== Items and types
+
+Unomi structures the information it collects using the concept of `Item` which 
provides the base information (an identifier and a type) the context server 
needs to process and store the data. Items are persisted according to their 
type (structure) and identifier (identity). This base structure can be 
extended, if needed, using properties in the form of key-value pairs.
+
+These properties are further defined by the `Item`’s type definition which 
explicits the `Item`’s structure and semantics. By defining new types, users 
specify which properties (including the type of values they accept) are 
available to items of that specific type.
+
+Unomi defines default value types: `date`, `email`, `integer` and `string`, 
all pretty self-explanatory. While you can think of these value types as 
"primitive" types, it is possible to extend Unomi by providing additional value 
types.
+
+Additionally, most items are also associated to a scope, which is a concept 
that Unomi uses to group together related items. A given scope is represented 
in Unomi by a simple string identifier and usually represents an application or 
set of applications from which Unomi gathers data, depending on the desired 
analysis granularity. In the context of web sites, a scope could, for example, 
represent a site or family of related sites being analyzed. Scopes allow 
clients accessing the context server to filter data to only see relevant data.
+
+_Base `Item` structure:_
+
+[source,json]
+----
+{
+  "itemType": <type of the item>,
+  "scope": <scope>,
+  "itemId": <item identifier>,
+  "properties": <optional properties>
+}
+----
+
+Some types can be dynamically defined at runtime by calling to the REST API 
while other extensions are done via Unomi plugins. Part of extending Unomi, 
therefore, is a matter of defining new types and specifying which kind of Unomi 
entity (e.g. profiles) they can be affected to. For example, the following JSON 
document can be passed to Unomi to declare a new property type identified (and 
named) `tweetNb`, tagged with the `social` tag, targeting profiles and using 
the `integer` value type.
+
+_Example JSON type definition:_
+
+[source,json]
+----
+{
+    "itemId": "tweetNb",
+    "itemType": "propertyType",
+    "metadata": {
+        "id": "tweetNb",
+        "name": "tweetNb",
+        "tags": ["social"]
+    },
+    "target": "profiles",
+    "type": "integer"
+}
+----
+
+____
+
+Unomi defines a built-in scope (called `systemscope`) that clients can use to 
share data across scopes.
+
+____
+
+==== Events
+
+Users' actions are conveyed from clients to the context server using events. 
Of course, the required information depends on what is collected and users' 
interactions with the observed systems but events minimally provide a type, a 
scope and source and target items. Additionally, events are timestamped. 
Conceptually, an event can be seen as a sentence, the event's type being the 
verb, the source the subject and the target the object.
+
+_Event structure:_
+
+[source,json]
+----
+{
+    "eventType": <type of the event>,
+    "scope": <scope of the event>,
+    "source": <Item>,
+    "target": <Item>,
+    "properties": <optional properties>
+}
+----
+
+Source and target can be any Unomi item but are not limited to them. In 
particular, as long as they can be described using properties and Unomi’s 
type mechanism and can be processed either natively or via extension plugins, 
source and target can represent just about anything. Events can also be 
triggered as part of Unomi’s internal processes for example when a rule is 
triggered.
+
+Events are sent to Unomi from client applications using the JSON format and a 
typical page view event from a web site could look something like the following:
+
+_Example page view event:_
+
+[source,json]
+----
+{
+    "eventType": "view",
+    "scope": "ACMESPACE",
+    "source": {
+        "itemType": "site",
+        "scope": "ACMESPACE",
+        "itemId": "c4761bbf-d85d-432b-8a94-37e866410375"
+    },
+    "target": {
+        "itemType": "page",
+        "scope": "ACMESPACE",
+        "itemId": "b6acc7b3-6b9d-4a9f-af98-54800ec13a71",
+        "properties": {
+            "pageInfo": {
+            "pageID": "b6acc7b3-6b9d-4a9f-af98-54800ec13a71",
+            "pageName": "Home",
+            "pagePath": "/sites/ACMESPACE/home",
+            "destinationURL": 
"http://localhost:8080/sites/ACMESPACE/home.html";,
+            "referringURL": "http://localhost:8080/";,
+            "language": "en"
+        },
+        "category": {},
+        "attributes": {}
+      }
+    }
+}
+----
+
+==== Profiles
+
+By processing events, Unomi progressively builds a picture of who the user is 
and how they behave. This knowledge is embedded in `Profile` object. A profile 
is an `Item` with any number of properties and optional segments and scores. 
Unomi provides default properties to cover common data (name, last name, age, 
email, etc.) as well as default segments to categorize users. Unomi users are, 
however, free and even encouraged to create additional properties and segments 
to better suit their needs.
+
+Contrary to other Unomi items, profiles are not part of a scope since we want 
to be able to track the associated user across applications. For this reason, 
data collected for a given profile in a specific scope is still available to 
any scoped item that accesses the profile information.
+
+It is interesting to note that there is not necessarily a one to one mapping 
between users and profiles as users can be captured across applications and 
different observation contexts. As identifying information might not be 
available in all contexts in which data is collected, resolving profiles to a 
single physical user can become complex because physical users are not observed 
directly. Rather, their portrait is progressively patched together and made 
clearer as Unomi captures more and more traces of their actions. Unomi will 
merge related profiles as soon as collected data permits positive association 
between distinct profiles, usually as a result of the user performing some 
identifying action in a context where the user hadn’t already been positively 
identified.
+
+==== Sessions
+
+A session represents a time-bounded interaction between a user (via their 
associated profile) and a Unomi-enabled application. A session represents the 
sequence of actions the user performed during its duration. For this reason, 
events are associated with the session during which they occurred. In the 
context of web applications, sessions are usually linked to HTTP sessions.
+
+
+=== Extending Unomi via plugins
+
+Unomi is architected so that users can provided extensions in the form of 
plugins.
+
+==== Types vs. instances
+
+Several extension points in Unomi rely on the concept of type: the extension 
defines a prototype for what the actual items will be once parameterized with 
values known only at runtime. This is similar to the concept of classes in 
object-oriented programming: types define classes, providing the expected 
structure and which fields are expected to be provided at runtime, that are 
then instantiated when needed with actual values.
+
+==== Plugin structure
+
+Being built on top of Apache Karaf, Unomi leverages OSGi to support plugins. A 
Unomi plugin is, thus, an OSGi bundle specifying some specific metadata to tell 
Unomi the kind of entities it provides. A plugin can provide the following 
entities to extend Unomi, each with its associated definition (as a JSON file), 
located in a specific spot within the `META-INF/cxs/` directory of the bundle 
JAR file:
+
+|===
+|Entity |Location in `cxs` directory 
+
+|ActionType |actions 
+|ConditionType |conditions 
+|Persona |personas 
+|PropertyMergeStrategyType |mergers 
+|PropertyType |properties then profiles or sessions subdirectory then 
`&lt;category name&gt;` directory 
+|Rule |rules 
+|Scoring |scorings 
+|Segment |segments 
+|Tag |tags 
+|ValueType |values 
+|===
+
+http://aries.apache.org/modules/blueprint.html[Blueprint] is used to declare 
what the plugin provides and inject any required dependency. The Blueprint file 
is located, as usual, at `OSGI-INF/blueprint/blueprint.xml` in the bundle JAR 
file.
+
+The plugin otherwise follows a regular maven project layout and should depend 
on the Unomi API maven artifact:
+
+[source,xml]
+----
+<dependency>
+    <groupId>org.apache.unomi</groupId>
+    <artifactId>unomi-api</artifactId>
+    <version>...</version>
+</dependency>
+----
+
+Some plugins consists only of JSON definitions that are used to instantiate 
the appropriate structures at runtime while some more involved plugins provide 
code that extends Unomi in deeper ways.
+
+In both cases, plugins can provide more that one type of extension. For 
example, a plugin could provide both `ActionType`s and `ConditionType`s.
+
+==== Extension points
+
+===== ActionType
+
+`ActionType`s define new actions that can be used as consequences of Rules 
being triggered. When a rule triggers, it creates new actions based on the 
event data and the rule internal processes, providing values for parameters 
defined in the associated `ActionType`. Example actions include: “Set user 
property x to value y” or “Send a message to service x”.
+
+===== ConditionType
+
+`ConditionType`s define new conditions that can be applied to items (for 
example to decide whether a rule needs to be triggered or if a profile is 
considered as taking part in a campaign) or to perform queries against the 
stored Unomi data. They may be implemented in Java when attempting to define a 
particularly complex test or one that can better be optimized by coding it. 
They may also be defined as combination of other conditions. A simple condition 
could be: “User is male”, while a more generic condition with parameters 
may test whether a given property has a specific value: “User property x has 
value y”.
+
+===== Persona
+
+A persona is a "virtual" profile used to represent categories of profiles, and 
may also be used to test how a personalized experience would look like using 
this virtual profile. A persona can define predefined properties and sessions. 
Persona definition make it possible to “emulate” a certain type of profile, 
e.g : US visitor, non-US visitor, etc.
+
+===== PropertyMergeStrategyType
+
+A strategy to resolve how to merge properties when merging profile together.
+
+===== PropertyType
+
+Definition for a profile or session property, specifying how possible values 
are constrained, if the value is multi-valued (a vector of values as opposed to 
a scalar value). `PropertyType`s can also be categorized using tags or file 
system structure, using sub-directories to organize definition files.
+
+===== Rule
+
+`Rule`s are conditional sets of actions to be executed in response to incoming 
events. Triggering of rules is guarded by a condition: the rule is only 
triggered if the associated condition is satisfied. That condition can test the 
event itself, but also the profile or the session. Once a rule triggers, a list 
of actions can be performed as consequences. Also, when rules trigger, a 
specific event is raised so that other parts of Unomi can react accordingly.
+
+===== Scoring
+
+`Scoring`s are set of conditions associated with a value to assign to profiles 
when matching so that the associated users can be scored along that dimension. 
Each scoring element is evaluated and matching profiles' scores are incremented 
with the associated value.
+
+===== Segments
+
+`Segment`s represent dynamically evaluated groups of similar profiles in order 
to categorize the associated users. To be considered part of a given segment, 
users must satisfies the segment’s condition. If they match, users are 
automatically added to the segment. Similarly, if at any given point during, 
they cease to satisfy the segment’s condition, they are automatically removed 
from it.
+
+===== Tag
+
+`Tag`s are simple labels that are used to classify all other objects inside 
Unomi.
+
+===== ValueType
+
+Definition for values that can be assigned to properties ("primitive" types).
+
+==== Other Unomi entities
+
+===== UserList
+
+User list are simple static lists of users. The associated profile stores the 
lists it belongs to in a specific property.
+
+===== Goal
+
+Goals represent tracked activities / actions that can be accomplished by site 
(or more precisely scope) visitors. These are tracked in general because they 
relate to specific business objectives or are relevant to measure site/scope 
performance.
+
+Goals can be defined at the scope level or in the context of a particular 
`Campaign`. Either types of goals behave exactly the same way with the 
exception of two notable differences:
+ - duration: scope-level goals are considered until removed while 
campaign-level goals are only considered for the campaign duration
+ - audience filtering: any visitor is considered for scope-level goals while 
campaign-level goals only consider visitors who match the campaign's conditions
+
+===== Campaign
+
+A goal-oriented, time-limited marketing operation that needs to be evaluated 
for return on investment performance by tracking the ratio of visits to 
conversions.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/b077d27b/manual/src/archives/1.1/asciidoc/configuration.adoc
----------------------------------------------------------------------
diff --git a/manual/src/archives/1.1/asciidoc/configuration.adoc 
b/manual/src/archives/1.1/asciidoc/configuration.adoc
new file mode 100644
index 0000000..e9f4353
--- /dev/null
+++ b/manual/src/archives/1.1/asciidoc/configuration.adoc
@@ -0,0 +1,296 @@
+//
+// 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.
+//
+
+=== Configuration
+
+==== Changing the default configuration
+
+If you want to change the default configuration, you can perform any 
modification you want in the $MY_KARAF_HOME/etc directory.
+
+The context server configuration is kept in the 
$MY_KARAF_HOME/etc/org.apache.unomi.web.cfg . It defines the
+addresses and port where it can be found :
+
+[source]
+----
+contextserver.address=localhost
+contextserver.port=8181
+contextserver.secureAddress=localhost
+contextserver.securePort=9443
+contextserver.domain=apache.org
+----
+
+If you need to specify an Elasticsearch cluster name that is different than 
the default, it is recommended to do this
+BEFORE you start the server for the first time, or you will loose all the data 
you have stored previously.
+
+To change the cluster name, first create a file called 
+
+[source]
+----
+$MY_KARAF_HOME/etc/org.apache.unomi.persistence.elasticsearch.cfg
+----
+
+with the following contents:
+
+[source]
+----
+cluster.name=contextElasticSearch
+index.name=context
+elasticSearchConfig=file:${karaf.etc}/elasticsearch.yml
+----
+
+And replace the cluster.name parameter here by your cluster name.
+
+You can also put an elasticsearch configuration file in 
$MY_KARAF_HOME/etc/elasticsearch.yml ,
+and put any standard Elasticsearch configuration options in this last file.
+
+If you want your context server to be a client only on a cluster of 
elasticsearch nodes, just set the node.data property
+to false.
+
+==== Installing the MaxMind GeoIPLite2 IP lookup database
+
+The Context Server requires an IP database in order to resolve IP addresses to 
user location.
+The GeoLite2 database can be downloaded from MaxMind here :
+http://dev.maxmind.com/geoip/geoip2/geolite2/[http://dev.maxmind.com/geoip/geoip2/geolite2/]
+
+Simply download the GeoLite2-City.mmdb file into the "etc" directory.
+
+==== Installing Geonames database
+
+Context server includes a geocoding service based on the geonames database ( 
http://www.geonames.org/[http://www.geonames.org/] ). It can be
+used to create conditions on countries or cities.
+
+In order to use it, you need to install the Geonames database into . Get the 
"allCountries.zip" database from here :
+http://download.geonames.org/export/dump/[http://download.geonames.org/export/dump/]
+
+Download it and put it in the "etc" directory, without unzipping it.
+Edit $MY_KARAF_HOME/etc/org.apache.unomi.geonames.cfg and set 
request.geonamesDatabase.forceImport to true, import should start right away.
+Otherwise, import should start at the next startup. Import runs in background, 
but can take about 15 minutes.
+At the end, you should have about 4 million entries in the geonames index.
+
+==== REST API Security
+
+The Context Server REST API is protected using JAAS authentication and using 
Basic or Digest HTTP auth.
+By default, the login/password for the REST API full administrative access is 
"karaf/karaf".
+
+The generated package is also configured with a default SSL certificate. You 
can change it by following these steps :
+
+. 
+
+Replace the existing keystore in $MY_KARAF_HOME/etc/keystore by your own 
certificate :
+
+http://wiki.eclipse.org/Jetty/Howto/Configure_SSL[http://wiki.eclipse.org/Jetty/Howto/Configure_SSL]
+
+. 
+
+Update the keystore and certificate password in 
$MY_KARAF_HOME/etc/custom.properties file :
+
+[source]
+----
+    org.osgi.service.http.secure.enabled = true
+    org.ops4j.pax.web.ssl.keystore=${karaf.etc}/keystore
+    org.ops4j.pax.web.ssl.password=changeme
+    org.ops4j.pax.web.ssl.keypassword=changeme
+    org.osgi.service.http.port.secure=9443
+----
+
+You should now have SSL setup on Karaf with your certificate, and you can test 
it by trying to access it on port 9443.
+
+==== Automatic profile merging
+
+The context server is capable of merging profiles based on a common property 
value. In order to use this, you must
+add the MergeProfileOnPropertyAction to a rule (such as a login rule for 
example), and configure it with the name
+ of the property that will be used to identify the profiles to be merged. An 
example could be the "email" property,
+ meaning that if two (or more) profiles are found to have the same value for 
the "email" property they will be merged
+ by this action.
+
+Upon merge, the old profiles are marked with a "mergedWith" property that will 
be used on next profile access to delete
+the original profile and replace it with the merged profile (aka "master" 
profile). Once this is done, all cookie tracking
+will use the merged profile.
+
+To test, simply configure the action in the "login" or "facebookLogin" rules 
and set it up on the "email" property.
+Upon sending one of the events, all matching profiles will be merged.
+
+==== Securing a production environment
+
+Before going live with a project, you should _absolutely_ read the following 
section that will help you setup a proper
+secure environment for running your context server. 
+
+Step 1: Install and configure a firewall 
+
+You should setup a firewall around your cluster of context servers and/or 
Elasticsearch nodes. If you have an
+application-level firewall you should only allow the following connections 
open to the whole world : 
+
+* http://localhost:8181/context.js[http://localhost:8181/context.js]
+* http://localhost:8181/eventcollector[http://localhost:8181/eventcollector]
+
+All other ports should not be accessible to the world.
+
+For your Context Server client applications (such as the Jahia CMS), you will 
need to make the following ports
+accessible : 
+
+[source]
+----
+8181 (Context Server HTTP port) 
+9443 (Context Server HTTPS port)
+----
+
+The context server actually requires HTTP Basic Auth for access to the Context 
Server administration REST API, so it is
+highly recommended that you design your client applications to use the HTTPS 
port for accessing the REST API.
+
+The user accounts to access the REST API are actually routed through Karaf's 
JAAS support, which you may find the
+documentation for here : 
+
+* 
http://karaf.apache.org/manual/latest/users-guide/security.html[http://karaf.apache.org/manual/latest/users-guide/security.html]
+
+The default username/password is 
+
+[source]
+----
+karaf/karaf
+----
+
+You should really change this default username/password as soon as possible. 
To do so, simply modify the following
+file : 
+
+[source]
+----
+$MY_KARAF_HOME/etc/users.properties
+----
+
+For your context servers, and for any standalone Elasticsearch nodes you will 
need to open the following ports for proper
+node-to-node communication : 9200 (Elasticsearch REST API), 9300 
(Elasticsearch TCP transport)
+
+Of course any ports listed here are the default ports configured in each 
server, you may adjust them if needed.
+
+Step 2 : Adjust the Context Server IP filtering
+
+By default the Context Server limits to connections to port 9200 and 9300 to 
the following IP ranges
+
+[source]
+----
+- localhost
+- 127.0.0.1
+- ::1
+- the current subnet (i.e., 192.168.1.0-192.168.1.255)
+----
+
+(this is done using a custom plugin for Elasticsearch, that you may find here :
+https://git-wip-us.apache.org/repos/asf/incubator-unomi/context-server/persistence-elasticsearch/plugins/security[https://git-wip-us.apache.org/repos/asf/incubator-unomi/context-server/persistence-elasticsearch/plugins/security])
+
+You can adjust this setting by using the following setting in the 
$MY_KARAF_HOME/etc/elasticsearch.yml file : 
+
+[source]
+----
+security.ipranges: localhost,127.0.0.1,::1,10.0.1.0-10.0.1.255
+----
+
+Step 3 : Follow industry recommended best practices for securing Elasticsearch
+
+You may find more valuable recommendations here : 
+
+* 
https://www.elastic.co/blog/found-elasticsearch-security[https://www.elastic.co/blog/found-elasticsearch-security]
+* 
https://www.elastic.co/blog/scripting-security[https://www.elastic.co/blog/scripting-security]
+
+Step 4 : Setup a proxy in front of the context server
+
+As an alternative to an application-level firewall, you could also route all 
traffic to the context server through
+a proxy, and use it to filter any communication.
+
+==== Integrating with an Apache HTTP web server
+
+If you want to setup an Apache HTTP web server in from of Apache Unomi, here 
is an example configuration using
+mod_proxy.
+
+In your Unomi package directory, in /etc/org.apache.unomi.web.cfg for 
unomi.apache.org
+
+contextserver.address=unomi.apache.org
+ contextserver.port=80
+ contextserver.secureAddress=unomi.apache.org
+ contextserver.securePort=443
+ contextserver.domain=apache.org
+
+Main virtual host config:
+
+[source]
+----
+<VirtualHost *:80>
+        Include /var/www/vhosts/unomi.apache.org/conf/common.conf
+</VirtualHost>
+
+<IfModule mod_ssl.c>
+    <VirtualHost *:443>
+        Include /var/www/vhosts/unomi.apache.org/conf/common.conf
+
+        SSLEngine on
+
+        SSLCertificateFile    
/var/www/vhosts/unomi.apache.org/conf/ssl/24d5b9691e96eafa.crt
+        SSLCertificateKeyFile 
/var/www/vhosts/unomi.apache.org/conf/ssl/apache.org.key
+        SSLCertificateChainFile 
/var/www/vhosts/unomi.apache.org/conf/ssl/gd_bundle-g2-g1.crt
+
+        <FilesMatch "\.(cgi|shtml|phtml|php)$">
+                SSLOptions +StdEnvVars
+        </FilesMatch>
+        <Directory /usr/lib/cgi-bin>
+                SSLOptions +StdEnvVars
+        </Directory>
+        BrowserMatch "MSIE [2-6]" \
+                nokeepalive ssl-unclean-shutdown \
+                downgrade-1.0 force-response-1.0
+        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
+
+    </VirtualHost>
+</IfModule>
+----
+
+common.conf:
+
+[source]
+----
+ServerName unomi.apache.org
+ServerAdmin [email protected]
+
+DocumentRoot /var/www/vhosts/unomi.apache.org/html
+CustomLog /var/log/apache2/access-unomi.apache.org.log combined
+<Directory />
+        Options FollowSymLinks
+        AllowOverride None
+</Directory>
+<Directory /var/www/vhosts/unomi.apache.org/html>
+        Options FollowSymLinks MultiViews
+        AllowOverride None
+        Order allow,deny
+        allow from all
+</Directory>
+<Location /cxs>
+    Order deny,allow
+    deny from all
+    allow from 88.198.26.2
+    allow from www.apache.org
+</Location>
+
+RewriteEngine On
+RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
+RewriteRule .* - [F]
+ProxyPreserveHost On
+ProxyPass /server-status !
+ProxyPass /robots.txt !
+
+RewriteCond %{HTTP_USER_AGENT} Googlebot [OR]
+RewriteCond %{HTTP_USER_AGENT} msnbot [OR]
+RewriteCond %{HTTP_USER_AGENT} Slurp
+RewriteRule ^.* - [F,L]
+
+ProxyPass / http://localhost:8181/ connectiontimeout=20 timeout=300 ttl=120
+ProxyPassReverse / http://localhost:8181/
+----
\ No newline at end of file

Reply via email to