summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--README.md21
-rw-r--r--css/reveal.css161
-rw-r--r--css/theme/beige.css24
-rw-r--r--css/theme/default.css24
-rw-r--r--css/theme/serif.css24
-rw-r--r--css/theme/simple.css24
-rw-r--r--css/theme/sky.css24
-rw-r--r--css/theme/template/theme.scss24
-rw-r--r--index.html13
-rw-r--r--js/reveal.js328
-rw-r--r--js/reveal.min.js165
11 files changed, 542 insertions, 290 deletions
diff --git a/README.md b/README.md
index dd7d820..91bc452 100644
--- a/README.md
+++ b/README.md
@@ -71,6 +71,9 @@ Reveal.initialize({
// Enable the slide overview mode
overview: true,
+ // Vertical centering of slides
+ center: true,
+
// Loop the presentation
loop: false,
@@ -183,6 +186,19 @@ It's easy to link between slides. The first example below targets the index of a
<a href="#/2/2">Link</a>
<a href="#/some-slide">Link</a>
```
+
+You can also add relative navigation links, similar to the built in reveal.js controls, by appending one of the following classes on any element. Note that each element is automatically given an ```enabled``` class when its a valid navigation route based on the current slide.
+
+```html
+<a href="#" class="navigate-left">
+<a href="#" class="navigate-right">
+<a href="#" class="navigate-up">
+<a href="#" class="navigate-down">
+<a href="#" class="navigate-prev"> <!-- Previous vertical slide or horizontal slide -->
+<a href="#" class="navigate-next"> <!-- Next vertical or horizontal slide -->
+```
+
+
### Fullscreen mode
Just press »F« on your keyboard to show your presentation in fullscreen mode. Press the »ESC« key to exit fullscreen mode.
@@ -203,6 +219,11 @@ The default fragment style is to start out invisible and fade in. This style can
</section>
```
+### Overview mode
+
+Press "Esc" key to toggle the overview mode on and off. While you're in this mode, you can still navigate between slides,
+as if you were at 1,000 feet above your presentation.
+
### Fragment events
When a slide fragment is either shown or hidden reveal.js will dispatch an event.
diff --git a/css/reveal.css b/css/reveal.css
index 412e8ec..7879bb6 100644
--- a/css/reveal.css
+++ b/css/reveal.css
@@ -48,7 +48,6 @@ html,
body {
width: 100%;
height: 100%;
- min-height: 600px;
overflow: hidden;
}
@@ -58,14 +57,20 @@ body {
}
::selection {
- background:#FF5E99;
- color:#fff;
+ background: #FF5E99;
+ color: #fff;
text-shadow: none;
}
-@media screen and (max-width: 900px) {
- .reveal {
- font-size: 30px;
+@media screen and (max-width: 900px), (max-height: 600px) {
+ .reveal .slides {
+ font-size: 0.82em;
+ }
+}
+
+@media screen and (max-width: 700px), (max-height: 400px) {
+ .reveal .slides {
+ font-size: 0.66em;
}
}
@@ -164,11 +169,6 @@ body {
* DEFAULT ELEMENT STYLES
*********************************************/
-.reveal .slides section {
- line-height: 1.2em;
- font-weight: normal;
-}
-
.reveal img {
/* preserve aspect ratio and scale image so it's bound within the section */
max-width: 100%;
@@ -238,6 +238,10 @@ body {
background: rgba(255, 255, 255, 0.05);
box-shadow: 0px 0px 2px rgba(0,0,0,0.2);
}
+ .reveal blockquote p:first-child,
+ .reveal blockquote p:last-child {
+ display: inline-block;
+ }
.reveal blockquote:before {
content: '\201C';
}
@@ -346,14 +350,14 @@ body {
margin-top: 1px;
}
-.reveal .controls div.left {
+.reveal .controls div.navigate-left {
top: 42px;
border-right-width: 22px;
border-right-color: #eee;
}
-.reveal .controls div.right {
+.reveal .controls div.navigate-right {
left: 74px;
top: 42px;
@@ -361,14 +365,14 @@ body {
border-left-color: #eee;
}
-.reveal .controls div.up {
+.reveal .controls div.navigate-up {
left: 42px;
border-bottom-width: 22px;
border-bottom-color: #eee;
}
-.reveal .controls div.down {
+.reveal .controls div.navigate-down {
left: 42px;
top: 74px;
@@ -495,18 +499,23 @@ body {
* SLIDES
*********************************************/
+.reveal {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ min-height: 640px; /* min height + 40 to account for padding */
+}
+
.reveal .slides {
position: absolute;
max-width: 900px;
+ min-height: 600px;
width: 80%;
- height: 60%;
left: 50%;
top: 50%;
- margin-top: -320px;
- padding: 20px 0px;
+
overflow: visible;
z-index: 1;
-
text-align: center;
-webkit-transition: -webkit-perspective .4s ease;
@@ -520,10 +529,10 @@ body {
-ms-perspective: 600px;
perspective: 600px;
- -webkit-perspective-origin: 0% 25%;
- -moz-perspective-origin: 0% 25%;
- -ms-perspective-origin: 0% 25%;
- perspective-origin: 0% 25%;
+ -webkit-perspective-origin: 0px -100px;
+ -moz-perspective-origin: 0px -100px;
+ -ms-perspective-origin: 0px -100px;
+ perspective-origin: 0px -100px;
}
.reveal .slides>section,
@@ -531,33 +540,58 @@ body {
display: none;
position: absolute;
width: 100%;
- min-height: 600px;
+ padding: 20px 0px;
z-index: 10;
+ line-height: 1.2em;
+ font-weight: normal;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
transform-style: preserve-3d;
- -webkit-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
- -moz-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
- -ms-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
- -o-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
- transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
+ -webkit-transition: -webkit-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ -webkit-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
+ -moz-transition: -moz-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ -moz-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
+ -ms-transition: -ms-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ -ms-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
+ -o-transition: -o-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ -o-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
+ transition: transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
+ opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
+}
+
+.reveal .slides>section {
+ left: -50%;
+ top: -50%;
}
-.reveal .slides>section.present {
+.reveal .slides>section.present,
+.reveal .slides>section>section.present {
display: block;
z-index: 11;
opacity: 1;
}
-.reveal .slides>section {
- margin-left: -50%;
+.reveal.center,
+.reveal.center .slides {
+ min-height: auto;
}
+
/*********************************************
* DEFAULT TRANSITION
*********************************************/
@@ -585,19 +619,19 @@ body {
display: block;
opacity: 0;
- -webkit-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0);
- -moz-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0);
- -ms-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0);
- transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0);
+ -webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
+ -moz-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
+ -ms-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
+ transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
}
.reveal .slides>section>section.future {
display: block;
opacity: 0;
- -webkit-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0);
- -moz-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0);
- -ms-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0);
- transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0);
+ -webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
+ -moz-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
+ -ms-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
+ transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
}
@@ -636,15 +670,6 @@ body {
* ZOOM TRANSITION
*********************************************/
-.reveal.zoom .slides>section,
-.reveal.zoom .slides>section>section {
- -webkit-transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
- -moz-transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
- -ms-transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
- -o-transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
- transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-}
-
.reveal.zoom .slides>section.past {
opacity: 0;
visibility: hidden;
@@ -722,11 +747,6 @@ body {
*********************************************/
.reveal.cube .slides {
- -webkit-perspective-origin: 0% 25%;
- -moz-perspective-origin: 0% 25%;
- -ms-perspective-origin: 0% 25%;
- perspective-origin: 0% 25%;
-
-webkit-perspective: 1300px;
-moz-perspective: 1300px;
-ms-perspective: 1300px;
@@ -735,6 +755,7 @@ body {
.reveal.cube .slides section {
padding: 30px;
+ min-height: 600px;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
@@ -745,6 +766,9 @@ body {
-moz-box-sizing: border-box;
box-sizing: border-box;
}
+ .reveal.center.cube .slides section {
+ min-height: auto;
+ }
.reveal.cube .slides section:not(.stack):before {
content: '';
position: absolute;
@@ -1031,8 +1055,7 @@ body {
}
.reveal.overview .slides section {
- padding: 20px 0;
- max-height: 600px;
+ height: 600px;
overflow: hidden;
opacity: 1!important;
visibility: visible!important;
@@ -1053,13 +1076,12 @@ body {
.reveal.overview .slides section:hover {
background: rgba(0,0,0,0.3);
}
-
.reveal.overview .slides section.present {
background: rgba(0,0,0,0.3);
}
.reveal.overview .slides>section.stack {
- background: none;
padding: 0;
+ background: none;
overflow: visible;
}
@@ -1099,13 +1121,22 @@ body {
overflow-y: auto;
}
+.no-transforms .slides {
+ top: 0;
+ left: 50%;
+ margin: 0;
+ text-align: center;
+}
+
.no-transforms .slides section {
display: block!important;
opacity: 1!important;
position: relative!important;
height: auto;
min-height: auto;
- margin-bottom: 100px;
+ top: 0;
+ left: -50%;
+ margin: 70px 0;
-webkit-transform: none;
-moz-transform: none;
@@ -1113,6 +1144,18 @@ body {
transform: none;
}
+.no-transforms .slides section section {
+ left: 0;
+}
+
+.no-transition {
+ -webkit-transition: none;
+ -moz-transition: none;
+ -ms-transition: none;
+ -o-transition: none;
+ transition: none;
+}
+
/*********************************************
* BACKGROUND STATES
diff --git a/css/theme/beige.css b/css/theme/beige.css
index 5e40883..c8d38f2 100644
--- a/css/theme/beige.css
+++ b/css/theme/beige.css
@@ -110,39 +110,39 @@ body {
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
-.reveal .controls div.left,
-.reveal .controls div.left.enabled {
+.reveal .controls div.navigate-left,
+.reveal .controls div.navigate-left.enabled {
border-right-color: #8b743d;
}
-.reveal .controls div.right,
-.reveal .controls div.right.enabled {
+.reveal .controls div.navigate-right,
+.reveal .controls div.navigate-right.enabled {
border-left-color: #8b743d;
}
-.reveal .controls div.up,
-.reveal .controls div.up.enabled {
+.reveal .controls div.navigate-up,
+.reveal .controls div.navigate-up.enabled {
border-bottom-color: #8b743d;
}
-.reveal .controls div.down,
-.reveal .controls div.down.enabled {
+.reveal .controls div.navigate-down,
+.reveal .controls div.navigate-down.enabled {
border-top-color: #8b743d;
}
-.reveal .controls div.left.enabled:hover {
+.reveal .controls div.navigate-left.enabled:hover {
border-right-color: #c0a86e;
}
-.reveal .controls div.right.enabled:hover {
+.reveal .controls div.navigate-right.enabled:hover {
border-left-color: #c0a86e;
}
-.reveal .controls div.up.enabled:hover {
+.reveal .controls div.navigate-up.enabled:hover {
border-bottom-color: #c0a86e;
}
-.reveal .controls div.down.enabled:hover {
+.reveal .controls div.navigate-down.enabled:hover {
border-top-color: #c0a86e;
}
diff --git a/css/theme/default.css b/css/theme/default.css
index 28ed7d3..30d7463 100644
--- a/css/theme/default.css
+++ b/css/theme/default.css
@@ -110,39 +110,39 @@ body {
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
-.reveal .controls div.left,
-.reveal .controls div.left.enabled {
+.reveal .controls div.navigate-left,
+.reveal .controls div.navigate-left.enabled {
border-right-color: #13daec;
}
-.reveal .controls div.right,
-.reveal .controls div.right.enabled {
+.reveal .controls div.navigate-right,
+.reveal .controls div.navigate-right.enabled {
border-left-color: #13daec;
}
-.reveal .controls div.up,
-.reveal .controls div.up.enabled {
+.reveal .controls div.navigate-up,
+.reveal .controls div.navigate-up.enabled {
border-bottom-color: #13daec;
}
-.reveal .controls div.down,
-.reveal .controls div.down.enabled {
+.reveal .controls div.navigate-down,
+.reveal .controls div.navigate-down.enabled {
border-top-color: #13daec;
}
-.reveal .controls div.left.enabled:hover {
+.reveal .controls div.navigate-left.enabled:hover {
border-right-color: #71e9f4;
}
-.reveal .controls div.right.enabled:hover {
+.reveal .controls div.navigate-right.enabled:hover {
border-left-color: #71e9f4;
}
-.reveal .controls div.up.enabled:hover {
+.reveal .controls div.navigate-up.enabled:hover {
border-bottom-color: #71e9f4;
}
-.reveal .controls div.down.enabled:hover {
+.reveal .controls div.navigate-down.enabled:hover {
border-top-color: #71e9f4;
}
diff --git a/css/theme/serif.css b/css/theme/serif.css
index ece6124..3d406af 100644
--- a/css/theme/serif.css
+++ b/css/theme/serif.css
@@ -97,39 +97,39 @@ body {
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
-.reveal .controls div.left,
-.reveal .controls div.left.enabled {
+.reveal .controls div.navigate-left,
+.reveal .controls div.navigate-left.enabled {
border-right-color: #51483d;
}
-.reveal .controls div.right,
-.reveal .controls div.right.enabled {
+.reveal .controls div.navigate-right,
+.reveal .controls div.navigate-right.enabled {
border-left-color: #51483d;
}
-.reveal .controls div.up,
-.reveal .controls div.up.enabled {
+.reveal .controls div.navigate-up,
+.reveal .controls div.navigate-up.enabled {
border-bottom-color: #51483d;
}
-.reveal .controls div.down,
-.reveal .controls div.down.enabled {
+.reveal .controls div.navigate-down,
+.reveal .controls div.navigate-down.enabled {
border-top-color: #51483d;
}
-.reveal .controls div.left.enabled:hover {
+.reveal .controls div.navigate-left.enabled:hover {
border-right-color: #8b7c69;
}
-.reveal .controls div.right.enabled:hover {
+.reveal .controls div.navigate-right.enabled:hover {
border-left-color: #8b7c69;
}
-.reveal .controls div.up.enabled:hover {
+.reveal .controls div.navigate-up.enabled:hover {
border-bottom-color: #8b7c69;
}
-.reveal .controls div.down.enabled:hover {
+.reveal .controls div.navigate-down.enabled:hover {
border-top-color: #8b7c69;
}
diff --git a/css/theme/simple.css b/css/theme/simple.css
index 6d0771a..cf4f042 100644
--- a/css/theme/simple.css
+++ b/css/theme/simple.css
@@ -99,39 +99,39 @@ body {
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
-.reveal .controls div.left,
-.reveal .controls div.left.enabled {
+.reveal .controls div.navigate-left,
+.reveal .controls div.navigate-left.enabled {
border-right-color: darkblue;
}
-.reveal .controls div.right,
-.reveal .controls div.right.enabled {
+.reveal .controls div.navigate-right,
+.reveal .controls div.navigate-right.enabled {
border-left-color: darkblue;
}
-.reveal .controls div.up,
-.reveal .controls div.up.enabled {
+.reveal .controls div.navigate-up,
+.reveal .controls div.navigate-up.enabled {
border-bottom-color: darkblue;
}
-.reveal .controls div.down,
-.reveal .controls div.down.enabled {
+.reveal .controls div.navigate-down,
+.reveal .controls div.navigate-down.enabled {
border-top-color: darkblue;
}
-.reveal .controls div.left.enabled:hover {
+.reveal .controls div.navigate-left.enabled:hover {
border-right-color: #0000f1;
}
-.reveal .controls div.right.enabled:hover {
+.reveal .controls div.navigate-right.enabled:hover {
border-left-color: #0000f1;
}
-.reveal .controls div.up.enabled:hover {
+.reveal .controls div.navigate-up.enabled:hover {
border-bottom-color: #0000f1;
}
-.reveal .controls div.down.enabled:hover {
+.reveal .controls div.navigate-down.enabled:hover {
border-top-color: #0000f1;
}
diff --git a/css/theme/sky.css b/css/theme/sky.css
index 18a4863..43bb4f4 100644
--- a/css/theme/sky.css
+++ b/css/theme/sky.css
@@ -103,39 +103,39 @@ body {
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
-.reveal .controls div.left,
-.reveal .controls div.left.enabled {
+.reveal .controls div.navigate-left,
+.reveal .controls div.navigate-left.enabled {
border-right-color: #3b759e;
}
-.reveal .controls div.right,
-.reveal .controls div.right.enabled {
+.reveal .controls div.navigate-right,
+.reveal .controls div.navigate-right.enabled {
border-left-color: #3b759e;
}
-.reveal .controls div.up,
-.reveal .controls div.up.enabled {
+.reveal .controls div.navigate-up,
+.reveal .controls div.navigate-up.enabled {
border-bottom-color: #3b759e;
}
-.reveal .controls div.down,
-.reveal .controls div.down.enabled {
+.reveal .controls div.navigate-down,
+.reveal .controls div.navigate-down.enabled {
border-top-color: #3b759e;
}
-.reveal .controls div.left.enabled:hover {
+.reveal .controls div.navigate-left.enabled:hover {
border-right-color: #74a7cb;
}
-.reveal .controls div.right.enabled:hover {
+.reveal .controls div.navigate-right.enabled:hover {
border-left-color: #74a7cb;
}
-.reveal .controls div.up.enabled:hover {
+.reveal .controls div.navigate-up.enabled:hover {
border-bottom-color: #74a7cb;
}
-.reveal .controls div.down.enabled:hover {
+.reveal .controls div.navigate-down.enabled:hover {
border-top-color: #74a7cb;
}
diff --git a/css/theme/template/theme.scss b/css/theme/template/theme.scss
index 6a80b62..a818ec2 100644
--- a/css/theme/template/theme.scss
+++ b/css/theme/template/theme.scss
@@ -106,39 +106,39 @@ body {
* NAVIGATION CONTROLS
*********************************************/
-.reveal .controls div.left,
-.reveal .controls div.left.enabled {
+.reveal .controls div.navigate-left,
+.reveal .controls div.navigate-left.enabled {
border-right-color: $linkColor;
}
-.reveal .controls div.right,
-.reveal .controls div.right.enabled {
+.reveal .controls div.navigate-right,
+.reveal .controls div.navigate-right.enabled {
border-left-color: $linkColor;
}
-.reveal .controls div.up,
-.reveal .controls div.up.enabled {
+.reveal .controls div.navigate-up,
+.reveal .controls div.navigate-up.enabled {
border-bottom-color: $linkColor;
}
-.reveal .controls div.down,
-.reveal .controls div.down.enabled {
+.reveal .controls div.navigate-down,
+.reveal .controls div.navigate-down.enabled {
border-top-color: $linkColor;
}
-.reveal .controls div.left.enabled:hover {
+.reveal .controls div.navigate-left.enabled:hover {
border-right-color: $linkColorHover;
}
-.reveal .controls div.right.enabled:hover {
+.reveal .controls div.navigate-right.enabled:hover {
border-left-color: $linkColorHover;
}
-.reveal .controls div.up.enabled:hover {
+.reveal .controls div.navigate-up.enabled:hover {
border-bottom-color: $linkColorHover;
}
-.reveal .controls div.down.enabled:hover {
+.reveal .controls div.navigate-down.enabled:hover {
border-top-color: $linkColorHover;
}
diff --git a/index.html b/index.html
index de0637c..799d55d 100644
--- a/index.html
+++ b/index.html
@@ -61,9 +61,9 @@
<h2>Vertical Slides</h2>
<p>
Slides can be nested inside of other slides,
- try pressing <a href="#/2/1">down</a>.
+ try pressing <a href="#" class="navigate-down">down</a>.
</p>
- <a href="#/2/1" class="image">
+ <a href="#" class="image navigate-down">
<img width="178" height="238" src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Down arrow">
</a>
</section>
@@ -181,20 +181,20 @@
will be added as a class to the document element when the slide is open. This lets you
apply broader style changes, like switching the background.
</p>
- <a href="#/7/1" class="image">
+ <a href="#" class="image navigate-down">
<img width="178" height="238" src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Down arrow">
</a>
</section>
<section data-state="blackout">
<h2>"blackout"</h2>
- <a href="#/7/2" class="image">
+ <a href="#" class="image navigate-down">
<img width="178" height="238" src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Down arrow">
</a>
</section>
<section data-state="soothe">
<h2>"soothe"</h2>
- <a href="#/7/0" class="image">
- <img width="178" height="238" src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Up arrow" style="-webkit-transform: rotate(180deg);">
+ <a href="#" class="image navigate-next">
+ <img width="178" height="238" src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Up arrow" style="-webkit-transform: rotate(-90deg);">
</a>
</section>
</section>
@@ -350,6 +350,7 @@ function linkify( selector ) {
controls: true,
progress: true,
history: true,
+ center: true,
theme: Reveal.getQueryHash().theme, // available themes are in /css/theme
transition: Reveal.getQueryHash().transition || 'default', // default/cube/page/concave/zoom/linear/none
diff --git a/js/reveal.js b/js/reveal.js
index d92ee76..0bfeef5 100644
--- a/js/reveal.js
+++ b/js/reveal.js
@@ -1,5 +1,5 @@
/*!
- * reveal.js 2.1 r37
+ * reveal.js 2.2 r44
* http://lab.hakim.se/reveal-js
* MIT licensed
*
@@ -9,7 +9,8 @@ var Reveal = (function(){
'use strict';
- var HORIZONTAL_SLIDES_SELECTOR = '.reveal .slides>section',
+ var SLIDES_SELECTOR = '.reveal .slides section',
+ HORIZONTAL_SLIDES_SELECTOR = '.reveal .slides>section',
VERTICAL_SLIDES_SELECTOR = '.reveal .slides>section.present>section',
// Configurations defaults, can be overridden at initialization time
@@ -29,6 +30,9 @@ var Reveal = (function(){
// Enable the slide overview mode
overview: true,
+ // Vertical centering of slides
+ center: true,
+
// Loop the presentation
loop: false,
@@ -150,10 +154,10 @@ var Reveal = (function(){
if( !dom.wrapper.querySelector( '.controls' ) && config.controls ) {
var controlsElement = document.createElement( 'aside' );
controlsElement.classList.add( 'controls' );
- controlsElement.innerHTML = '<div class="left"></div>' +
- '<div class="right"></div>' +
- '<div class="up"></div>' +
- '<div class="down"></div>';
+ controlsElement.innerHTML = '<div class="navigate-left"></div>' +
+ '<div class="navigate-right"></div>' +
+ '<div class="navigate-up"></div>' +
+ '<div class="navigate-down"></div>';
dom.wrapper.appendChild( controlsElement );
}
@@ -177,10 +181,14 @@ var Reveal = (function(){
if ( config.controls ) {
dom.controls = document.querySelector( '.reveal .controls' );
- dom.controlsLeft = document.querySelector( '.reveal .controls .left' );
- dom.controlsRight = document.querySelector( '.reveal .controls .right' );
- dom.controlsUp = document.querySelector( '.reveal .controls .up' );
- dom.controlsDown = document.querySelector( '.reveal .controls .down' );
+
+ // There can be multiple instances of controls throughout the page
+ dom.controlsLeft = toArray( document.querySelectorAll( '.navigate-left' ) );
+ dom.controlsRight = toArray( document.querySelectorAll( '.navigate-right' ) );
+ dom.controlsUp = toArray( document.querySelectorAll( '.navigate-up' ) );
+ dom.controlsDown = toArray( document.querySelectorAll( '.navigate-down' ) );
+ dom.controlsPrev = toArray( document.querySelectorAll( '.navigate-prev' ) );
+ dom.controlsNext = toArray( document.querySelectorAll( '.navigate-next' ) );
}
}
@@ -264,6 +272,10 @@ var Reveal = (function(){
// Updates the presentation to match the current configuration values
configure();
+ // Force an initial layout, will thereafter be invoked as the window
+ // is resized
+ layout();
+
// Read the initial hash
readURL();
@@ -301,6 +313,10 @@ var Reveal = (function(){
dom.wrapper.classList.add( config.transition );
}
+ if( config.center ) {
+ dom.wrapper.classList.add( 'center' );
+ }
+
if( config.mouseWheel ) {
document.addEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF
document.addEventListener( 'mousewheel', onDocumentMouseScroll, false );
@@ -332,6 +348,7 @@ var Reveal = (function(){
document.addEventListener( 'touchmove', onDocumentTouchMove, false );
document.addEventListener( 'touchend', onDocumentTouchEnd, false );
window.addEventListener( 'hashchange', onWindowHashChange, false );
+ window.addEventListener( 'resize', onWindowResize, false );
if( config.keyboard ) {
document.addEventListener( 'keydown', onDocumentKeyDown, false );
@@ -342,10 +359,12 @@ var Reveal = (function(){
}
if ( config.controls && dom.controls ) {
- dom.controlsLeft.addEventListener( 'click', preventAndForward( navigateLeft ), false );
- dom.controlsRight.addEventListener( 'click', preventAndForward( navigateRight ), false );
- dom.controlsUp.addEventListener( 'click', preventAndForward( navigateUp ), false );
- dom.controlsDown.addEventListener( 'click', preventAndForward( navigateDown ), false );
+ dom.controlsLeft.forEach( function( el ) { el.addEventListener( 'click', preventAndForward( navigateLeft ), false ); } );
+ dom.controlsRight.forEach( function( el ) { el.addEventListener( 'click', preventAndForward( navigateRight ), false ); } );
+ dom.controlsUp.forEach( function( el ) { el.addEventListener( 'click', preventAndForward( navigateUp ), false ); } );
+ dom.controlsDown.forEach( function( el ) { el.addEventListener( 'click', preventAndForward( navigateDown ), false ); } );
+ dom.controlsPrev.forEach( function( el ) { el.addEventListener( 'click', preventAndForward( navigatePrev ), false ); } );
+ dom.controlsNext.forEach( function( el ) { el.addEventListener( 'click', preventAndForward( navigateNext ), false ); } );
}
}
@@ -358,16 +377,19 @@ var Reveal = (function(){
document.removeEventListener( 'touchmove', onDocumentTouchMove, false );
document.removeEventListener( 'touchend', onDocumentTouchEnd, false );
window.removeEventListener( 'hashchange', onWindowHashChange, false );
+ window.removeEventListener( 'resize', onWindowResize, false );
if ( config.progress && dom.progress ) {
dom.progress.removeEventListener( 'click', preventAndForward( onProgressClick ), false );
}
if ( config.controls && dom.controls ) {
- dom.controlsLeft.removeEventListener( 'click', preventAndForward( navigateLeft ), false );
- dom.controlsRight.removeEventListener( 'click', preventAndForward( navigateRight ), false );
- dom.controlsUp.removeEventListener( 'click', preventAndForward( navigateUp ), false );
- dom.controlsDown.removeEventListener( 'click', preventAndForward( navigateDown ), false );
+ dom.controlsLeft.forEach( function( el ) { el.removeEventListener( 'click', preventAndForward( navigateLeft ), false ); } );
+ dom.controlsRight.forEach( function( el ) { el.removeEventListener( 'click', preventAndForward( navigateRight ), false ); } );
+ dom.controlsUp.forEach( function( el ) { el.removeEventListener( 'click', preventAndForward( navigateUp ), false ); } );
+ dom.controlsDown.forEach( function( el ) { el.removeEventListener( 'click', preventAndForward( navigateDown ), false ); } );
+ dom.controlsPrev.forEach( function( el ) { el.removeEventListener( 'click', preventAndForward( navigatePrev ), false ); } );
+ dom.controlsNext.forEach( function( el ) { el.removeEventListener( 'click', preventAndForward( navigateNext ), false ); } );
}
}
@@ -382,6 +404,19 @@ var Reveal = (function(){
}
/**
+ * Converts the target object to an array.
+ */
+ function toArray( o ) {
+ return Array.prototype.slice.call( o );
+ }
+
+ function each( targets, method, args ) {
+ targets.forEach( function( el ) {
+ el[method].apply( el, args );
+ } );
+ }
+
+ /**
* Measures the distance in pixels between point a
* and point b.
*
@@ -435,7 +470,7 @@ var Reveal = (function(){
*/
function linkify() {
if( supports3DTransforms && !( 'msPerspective' in document.body.style ) ) {
- var nodes = document.querySelectorAll( '.reveal .slides section a:not(.image)' );
+ var nodes = document.querySelectorAll( SLIDES_SELECTOR + ' a:not(.image)' );
for( var i = 0, len = nodes.length; i < len; i++ ) {
var node = nodes[i];
@@ -449,6 +484,71 @@ var Reveal = (function(){
}
/**
+ * Applies JavaScript-controlled layout rules to the
+ * presentation.
+ */
+ function layout() {
+
+ if( config.center ) {
+
+ // Select all slides, vertical and horizontal
+ var slides = toArray( document.querySelectorAll( SLIDES_SELECTOR ) );
+
+ // Determine the minimum top offset for slides
+ var minTop = -dom.wrapper.offsetHeight / 2;
+
+ for( var i = 0, len = slides.length; i < len; i++ ) {
+ var slide = slides[ i ];
+
+ // Don't bother update invisible slides
+ if( slide.style.display === 'none' ) {
+ continue;
+ }
+
+ // Vertical stacks are not centered since their section
+ // children will be
+ if( slide.classList.contains( 'stack' ) ) {
+ slide.style.top = 0;
+ }
+ else {
+ slide.style.top = Math.max( - ( slide.offsetHeight / 2 ) - 20, minTop ) + 'px';
+ }
+ }
+
+ }
+
+ }
+
+ /**
+ * Stores the vertical index of a stack so that the same
+ * vertical slide can be selected when navigating to and
+ * from the stack.
+ *
+ * @param {HTMLElement} stack The vertical stack element
+ * @param {int} v Index to memorize
+ */
+ function setPreviousVerticalIndex( stack, v ) {
+ if( stack ) {
+ stack.setAttribute( 'data-previous-indexv', v || 0 );
+ }
+ }
+
+ /**
+ * Retrieves the vertical index which was stored using
+ * #setPreviousVerticalIndex() or 0 if no previous index
+ * exists.
+ *
+ * @param {HTMLElement} stack The vertical stack element
+ */
+ function getPreviousVerticalIndex( stack ) {
+ if( stack && stack.classList.contains( 'stack' ) ) {
+ return parseInt( stack.getAttribute( 'data-previous-indexv' ) || 0 );
+ }
+
+ return 0;
+ }
+
+ /**
* Displays the overview of slides (quick nav) by
* scaling down and arranging all slide elements.
*
@@ -476,32 +576,40 @@ var Reveal = (function(){
hslide.style.OTransform = htransform;
hslide.style.transform = htransform;
- if( !hslide.classList.contains( 'stack' ) ) {
- // Navigate to this slide on click
- hslide.addEventListener( 'click', onOverviewSlideClicked, true );
- }
+ if( hslide.classList.contains( 'stack' ) ) {
- var verticalSlides = hslide.querySelectorAll( 'section' );
+ var verticalSlides = hslide.querySelectorAll( 'section' );
- for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) {
- var vslide = verticalSlides[j],
- vtransform = 'translate(0%, ' + ( ( j - ( i === indexh ? indexv : 0 ) ) * 105 ) + '%)';
+ for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) {
+ var verticalIndex = i === indexh ? indexv : getPreviousVerticalIndex( hslide );
- vslide.setAttribute( 'data-index-h', i );
- vslide.setAttribute( 'data-index-v', j );
- vslide.style.display = 'block';
- vslide.style.WebkitTransform = vtransform;
- vslide.style.MozTransform = vtransform;
- vslide.style.msTransform = vtransform;
- vslide.style.OTransform = vtransform;
- vslide.style.transform = vtransform;
+ var vslide = verticalSlides[j],
+ vtransform = 'translate(0%, ' + ( ( j - verticalIndex ) * 105 ) + '%)';
- // Navigate to this slide on click
- vslide.addEventListener( 'click', onOverviewSlideClicked, true );
+ vslide.setAttribute( 'data-index-h', i );
+ vslide.setAttribute( 'data-index-v', j );
+ vslide.style.display = 'block';
+ vslide.style.WebkitTransform = vtransform;
+ vslide.style.MozTransform = vtransform;
+ vslide.style.msTransform = vtransform;
+ vslide.style.OTransform = vtransform;
+ vslide.style.transform = vtransform;
+
+ // Navigate to this slide on click
+ vslide.addEventListener( 'click', onOverviewSlideClicked, true );
+ }
+
}
+ else {
+
+ // Navigate to this slide on click
+ hslide.addEventListener( 'click', onOverviewSlideClicked, true );
+ }
}
+ layout();
+
}
}
@@ -518,7 +626,7 @@ var Reveal = (function(){
dom.wrapper.classList.remove( 'overview' );
// Select all slides
- var slides = Array.prototype.slice.call( document.querySelectorAll( '.reveal .slides section' ) );
+ var slides = toArray( document.querySelectorAll( SLIDES_SELECTOR ) );
for( var i = 0, len = slides.length; i < len; i++ ) {
var element = slides[i];
@@ -533,7 +641,7 @@ var Reveal = (function(){
element.removeEventListener( 'click', onOverviewSlideClicked );
}
- slide();
+ slide( indexh, indexv );
}
}
@@ -630,6 +738,21 @@ var Reveal = (function(){
// Remember where we were at before
previousSlide = currentSlide;
+ // Query all horizontal slides in the deck
+ var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
+
+ // If no vertical index is specified and the upcoming slide is a
+ // stack, resume at its previous vertical index
+ if( v === undefined ) {
+ v = getPreviousVerticalIndex( horizontalSlides[ h ] );
+ }
+
+ // If we were on a vertical stack, remember what vertical index
+ // it was on so we can resume at the same position when returning
+ if( previousSlide && previousSlide.parentNode.classList.contains( 'stack' ) ) {
+ setPreviousVerticalIndex( previousSlide.parentNode, indexv );
+ }
+
// Remember the state before this slide
var stateBefore = state.concat();
@@ -643,6 +766,8 @@ var Reveal = (function(){
indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h );
indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v );
+ layout();
+
// Apply the new state
stateLoop: for( var i = 0, len = state.length; i < len; i++ ) {
// Check if this state existed on the previous slide. If it
@@ -665,26 +790,16 @@ var Reveal = (function(){
document.documentElement.classList.remove( stateBefore.pop() );
}
- // Update progress if enabled
- if( config.progress && dom.progress ) {
- dom.progressbar.style.width = ( indexh / ( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ).length - 1 ) ) * window.innerWidth + 'px';
- }
-
// If the overview is active, re-activate it to update positions
if( isOverviewActive() ) {
activateOverview();
}
- updateControls();
-
// Update the URL hash after a delay since updating it mid-transition
// is likely to cause visual lag
clearTimeout( writeURLTimeout );
writeURLTimeout = setTimeout( writeURL, 1500 );
- // Query all horizontal slides in the deck
- var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
-
// Find the current horizontal slide and any possible vertical slides
// within it
var currentHorizontalSlide = horizontalSlides[ indexh ],
@@ -713,6 +828,9 @@ var Reveal = (function(){
if( previousSlide ) {
previousSlide.classList.remove( 'present' );
}
+
+ updateControls();
+ updateProgress();
}
/**
@@ -731,7 +849,7 @@ var Reveal = (function(){
function updateSlides( selector, index ) {
// Select all slides and convert the NodeList result to
// an array
- var slides = Array.prototype.slice.call( document.querySelectorAll( selector ) ),
+ var slides = toArray( document.querySelectorAll( selector ) ),
slidesLength = slides.length;
if( slidesLength ) {
@@ -811,7 +929,48 @@ var Reveal = (function(){
}
/**
- * Updates the state and link pointers of the controls.
+ * Updates the progress bar to reflect the current slide.
+ */
+ function updateProgress() {
+ // Update progress if enabled
+ if( config.progress && dom.progress ) {
+
+ var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
+
+ // The number of past and total slides
+ var totalCount = document.querySelectorAll( SLIDES_SELECTOR + ':not(.stack)' ).length;
+ var pastCount = 0;
+
+ // Step through all slides and count the past ones
+ mainLoop: for( var i = 0; i < horizontalSlides.length; i++ ) {
+
+ var horizontalSlide = horizontalSlides[i];
+ var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) );
+
+ for( var j = 0; j < verticalSlides.length; j++ ) {
+
+ // Stop as soon as we arrive at the present
+ if( verticalSlides[j].classList.contains( 'present' ) ) break mainLoop;
+
+ pastCount++
+
+ }
+
+ // Stop as soon as we arrive at the present
+ if( horizontalSlide.classList.contains( 'present' ) ) break;
+
+ // Don't count the wrapping section for vertical slides
+ if( horizontalSlide.classList.contains( 'stack' ) === false ) pastCount++;
+
+ }
+
+ dom.progressbar.style.width = ( pastCount / ( totalCount - 1 ) ) * window.innerWidth + 'px';
+
+ }
+ }
+
+ /**
+ * Updates the state of all control/navigation arrows.
*/
function updateControls() {
if ( config.controls && dom.controls ) {
@@ -819,15 +978,23 @@ var Reveal = (function(){
var routes = availableRoutes();
// Remove the 'enabled' class from all directions
- [ dom.controlsLeft, dom.controlsRight, dom.controlsUp, dom.controlsDown ].forEach( function( node ) {
+ dom.controlsLeft.concat( dom.controlsRight )
+ .concat( dom.controlsUp )
+ .concat( dom.controlsDown )
+ .concat( dom.controlsPrev )
+ .concat( dom.controlsNext ).forEach( function( node ) {
node.classList.remove( 'enabled' );
} );
// Add the 'enabled' class to the available routes
- if( routes.left ) dom.controlsLeft.classList.add( 'enabled' );
- if( routes.right ) dom.controlsRight.classList.add( 'enabled' );
- if( routes.up ) dom.controlsUp.classList.add( 'enabled' );
- if( routes.down ) dom.controlsDown.classList.add( 'enabled' );
+ if( routes.left ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'enabled' ); } );
+ if( routes.right ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'enabled' ); } );
+ if( routes.up ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'enabled' ); } );
+ if( routes.down ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'enabled' ); } );
+
+ // Prev/next buttons
+ if( routes.left || routes.up ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'enabled' ); } );
+ if( routes.right || routes.down ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'enabled' ); } );
}
}
@@ -892,10 +1059,15 @@ var Reveal = (function(){
if( config.history ) {
var url = '/';
- // Only include the minimum possible number of components in
- // the URL
- if( indexh > 0 || indexv > 0 ) url += indexh;
- if( indexv > 0 ) url += '/' + indexv;
+ // If the current slide has an ID, use that as a named link
+ if( currentSlide && typeof currentSlide.getAttribute( 'id' ) === 'string' ) {
+ url = '/' + currentSlide.getAttribute( 'id' );
+ }
+ // Otherwise use the /h/v index
+ else {
+ if( indexh > 0 || indexv > 0 ) url += indexh;
+ if( indexv > 0 ) url += '/' + indexv;
+ }
window.location.hash = url;
}
@@ -922,14 +1094,14 @@ var Reveal = (function(){
var slideh = isVertical ? slide.parentNode : slide;
// Select all horizontal slides
- var horizontalSlides = Array.prototype.slice.call( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
+ var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
// Now that we know which the horizontal slide is, get its index
h = Math.max( horizontalSlides.indexOf( slideh ), 0 );
// If this is a vertical slide, grab the vertical index
if( isVertical ) {
- v = Math.max( Array.prototype.slice.call( slide.parentNode.children ).indexOf( slide ), 0 );
+ v = Math.max( toArray( slide.parentNode.children ).indexOf( slide ), 0 );
}
}
@@ -1016,28 +1188,28 @@ var Reveal = (function(){
function navigateLeft() {
// Prioritize hiding fragments
- if( availableRoutes().left && ( isOverviewActive() || previousFragment() === false ) ) {
- slide( indexh - 1, 0 );
+ if( availableRoutes().left && isOverviewActive() || previousFragment() === false ) {
+ slide( indexh - 1 );
}
}
function navigateRight() {
// Prioritize revealing fragments
- if( availableRoutes().right && ( isOverviewActive() || nextFragment() === false ) ) {
- slide( indexh + 1, 0 );
+ if( availableRoutes().right && isOverviewActive() || nextFragment() === false ) {
+ slide( indexh + 1 );
}
}
function navigateUp() {
// Prioritize hiding fragments
- if( availableRoutes().up && ( isOverviewActive() || previousFragment() === false ) ) {
+ if( availableRoutes().up && isOverviewActive() || previousFragment() === false ) {
slide( indexh, indexv - 1 );
}
}
function navigateDown() {
// Prioritize revealing fragments
- if( availableRoutes().down && ( isOverviewActive() || nextFragment() === false ) ) {
+ if( availableRoutes().down && isOverviewActive() || nextFragment() === false ) {
slide( indexh, indexv + 1 );
}
}
@@ -1056,10 +1228,10 @@ var Reveal = (function(){
}
else {
// Fetch the previous horizontal slide, if there is one
- var previousSlide = document.querySelector( '.reveal .slides>section.past:nth-child(' + indexh + ')' );
+ var previousSlide = document.querySelector( HORIZONTAL_SLIDES_SELECTOR + '.past:nth-child(' + indexh + ')' );
if( previousSlide ) {
- indexv = ( previousSlide.querySelectorAll( 'section' ).length + 1 ) || 0;
+ indexv = ( previousSlide.querySelectorAll( 'section' ).length + 1 ) || undefined;
indexh --;
slide();
}
@@ -1276,7 +1448,7 @@ var Reveal = (function(){
* ( clickX / presentationWidth ) * numberOfSlides
*/
function onProgressClick( event ) {
- var slidesTotal = Array.prototype.slice.call( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).length;
+ var slidesTotal = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).length;
var slideIndex = Math.floor( ( event.clientX / dom.wrapper.offsetWidth ) * slidesTotal );
slide( slideIndex );
@@ -1284,14 +1456,19 @@ var Reveal = (function(){
/**
* Handler for the window level 'hashchange' event.
- *
- * @param {Object} event
*/
function onWindowHashChange( event ) {
readURL();
}
/**
+ * Handler for the window level 'resize' event.
+ */
+ function onWindowResize( event ) {
+ layout();
+ }
+
+ /**
* Invoked when a slide is and we're in the overview.
*/
function onOverviewSlideClicked( event ) {
@@ -1302,10 +1479,7 @@ var Reveal = (function(){
deactivateOverview();
- indexh = this.getAttribute( 'data-index-h' );
- indexv = this.getAttribute( 'data-index-v' );
-
- slide();
+ slide( parseInt( this.getAttribute( 'data-index-h' ) ), parseInt( this.getAttribute( 'data-index-v' ) ) );
}
}
diff --git a/js/reveal.min.js b/js/reveal.min.js
index e31d807..cb7b18a 100644
--- a/js/reveal.min.js
+++ b/js/reveal.min.js
@@ -1,83 +1,96 @@
/*!
- * reveal.js 2.1 r37
+ * reveal.js 2.2 r44
* http://lab.hakim.se/reveal-js
* MIT licensed
*
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
*/
-var Reveal=(function(){var l=".reveal .slides>section",b=".reveal .slides>section.present>section",R={controls:true,progress:true,history:false,keyboard:true,overview:true,loop:false,autoSlide:0,mouseWheel:true,rollingLinks:true,theme:null,transition:"default",dependencies:[]},Y=R.autoSlide,m=0,e=0,y,G,ak=[],f={},T="WebkitPerspective" in document.body.style||"MozPerspective" in document.body.style||"msPerspective" in document.body.style||"OPerspective" in document.body.style||"perspective" in document.body.style,n="WebkitTransform" in document.body.style||"MozTransform" in document.body.style||"msTransform" in document.body.style||"OTransform" in document.body.style||"transform" in document.body.style,z=0,k=0,D=0,ac={startX:0,startY:0,startSpan:0,startCount:0,handled:false,threshold:80};
-function i(al){if((!n&&!T)){document.body.setAttribute("class","no-transforms");return;}t(R,al);d();V();}function P(){f.theme=document.querySelector("#theme");
-f.wrapper=document.querySelector(".reveal");if(!f.wrapper.querySelector(".progress")&&R.progress){var ao=document.createElement("div");ao.classList.add("progress");
-ao.innerHTML="<span></span>";f.wrapper.appendChild(ao);}if(!f.wrapper.querySelector(".controls")&&R.controls){var an=document.createElement("aside");an.classList.add("controls");
-an.innerHTML='<div class="left"></div><div class="right"></div><div class="up"></div><div class="down"></div>';f.wrapper.appendChild(an);}if(!f.wrapper.querySelector(".state-background")){var am=document.createElement("div");
-am.classList.add("state-background");f.wrapper.appendChild(am);}if(!f.wrapper.querySelector(".pause-overlay")){var al=document.createElement("div");al.classList.add("pause-overlay");
-f.wrapper.appendChild(al);}f.progress=document.querySelector(".reveal .progress");f.progressbar=document.querySelector(".reveal .progress span");if(R.controls){f.controls=document.querySelector(".reveal .controls");
-f.controlsLeft=document.querySelector(".reveal .controls .left");f.controlsRight=document.querySelector(".reveal .controls .right");f.controlsUp=document.querySelector(".reveal .controls .up");
-f.controlsDown=document.querySelector(".reveal .controls .down");}}function d(){if(navigator.userAgent.match(/(iphone|ipod|android)/i)){document.documentElement.style.overflow="scroll";
-document.body.style.height="120%";window.addEventListener("load",ad,false);window.addEventListener("orientationchange",ad,false);}}function V(){var am=[],aq=[];
-for(var an=0,al=R.dependencies.length;an<al;an++){var ao=R.dependencies[an];if(!ao.condition||ao.condition()){if(ao.async){aq.push(ao.src);}else{am.push(ao.src);
-}if(typeof ao.callback==="function"){head.ready(ao.src.match(/([\w\d_\-]*)\.?[^\\\/]*$/i)[0],ao.callback);}}}function ap(){if(aq.length){head.js.apply(null,aq);
-}H();}if(am.length){head.ready(ap);head.js.apply(null,am);}else{ap();}}function H(){P();E();K();J();O();setTimeout(function(){r("ready",{indexh:m,indexv:e,currentSlide:G});
-},1);}function K(){if(T===false){R.transition="linear";}if(R.controls&&f.controls){f.controls.style.display="block";}if(R.progress&&f.progress){f.progress.style.display="block";
-}if(R.transition!=="default"){f.wrapper.classList.add(R.transition);}if(R.mouseWheel){document.addEventListener("DOMMouseScroll",o,false);document.addEventListener("mousewheel",o,false);
-}if(R.rollingLinks){N();}if(R.theme&&f.theme){var an=f.theme.getAttribute("href");var al=/[^\/]*?(?=\.css)/;var am=an.match(al)[0];if(R.theme!==am){an=an.replace(al,R.theme);
-f.theme.setAttribute("href",an);}}}function E(){document.addEventListener("touchstart",A,false);document.addEventListener("touchmove",af,false);document.addEventListener("touchend",W,false);
-window.addEventListener("hashchange",w,false);if(R.keyboard){document.addEventListener("keydown",ah,false);}if(R.progress&&f.progress){f.progress.addEventListener("click",q(ai),false);
-}if(R.controls&&f.controls){f.controlsLeft.addEventListener("click",q(B),false);f.controlsRight.addEventListener("click",q(j),false);f.controlsUp.addEventListener("click",q(u),false);
-f.controlsDown.addEventListener("click",q(F),false);}}function U(){document.removeEventListener("keydown",ah,false);document.removeEventListener("touchstart",A,false);
-document.removeEventListener("touchmove",af,false);document.removeEventListener("touchend",W,false);window.removeEventListener("hashchange",w,false);if(R.progress&&f.progress){f.progress.removeEventListener("click",q(ai),false);
-}if(R.controls&&f.controls){f.controlsLeft.removeEventListener("click",q(B),false);f.controlsRight.removeEventListener("click",q(j),false);f.controlsUp.removeEventListener("click",q(u),false);
-f.controlsDown.removeEventListener("click",q(F),false);}}function t(am,al){for(var an in al){am[an]=al[an];}}function S(an,al){var ao=an.x-al.x,am=an.y-al.y;
-return Math.sqrt(ao*ao+am*am);}function q(al){return function(am){am.preventDefault();al.call(null,am);};}function ad(){setTimeout(function(){window.scrollTo(0,1);
-},0);}function r(am,al){var an=document.createEvent("HTMLEvents",1,2);an.initEvent(am,true,true);t(an,al);f.wrapper.dispatchEvent(an);}function N(){if(T&&!("msPerspective" in document.body.style)){var am=document.querySelectorAll(".reveal .slides section a:not(.image)");
-for(var an=0,al=am.length;an<al;an++){var ao=am[an];if(ao.textContent&&!ao.querySelector("img")&&(!ao.className||!ao.classList.contains(ao,"roll"))){ao.classList.add("roll");
-ao.innerHTML='<span data-title="'+ao.text+'">'+ao.innerHTML+"</span>";}}}}function I(){if(R.overview){f.wrapper.classList.add("overview");var al=document.querySelectorAll(l);
-for(var aq=0,ao=al.length;aq<ao;aq++){var an=al[aq],av="translateZ(-2500px) translate("+((aq-m)*105)+"%, 0%)";an.setAttribute("data-index-h",aq);an.style.display="block";
-an.style.WebkitTransform=av;an.style.MozTransform=av;an.style.msTransform=av;an.style.OTransform=av;an.style.transform=av;if(!an.classList.contains("stack")){an.addEventListener("click",C,true);
-}var au=an.querySelectorAll("section");for(var ap=0,am=au.length;ap<am;ap++){var at=au[ap],ar="translate(0%, "+((ap-(aq===m?e:0))*105)+"%)";at.setAttribute("data-index-h",aq);
-at.setAttribute("data-index-v",ap);at.style.display="block";at.style.WebkitTransform=ar;at.style.MozTransform=ar;at.style.msTransform=ar;at.style.OTransform=ar;
-at.style.transform=ar;at.addEventListener("click",C,true);}}}}function ae(){if(R.overview){f.wrapper.classList.remove("overview");var ao=Array.prototype.slice.call(document.querySelectorAll(".reveal .slides section"));
-for(var an=0,al=ao.length;an<al;an++){var am=ao[an];am.style.WebkitTransform="";am.style.MozTransform="";am.style.msTransform="";am.style.OTransform="";
-am.style.transform="";am.removeEventListener("click",C);}a();}}function X(al){if(typeof al==="boolean"){al?I():ae();}else{L()?ae():I();}}function L(){return f.wrapper.classList.contains("overview");
-}function ab(){var al=document.body;var am=al.requestFullScreen||al.webkitRequestFullScreen||al.mozRequestFullScreen||al.msRequestFullScreen;if(am){am.apply(al);
-}}function c(){f.wrapper.classList.add("paused");}function p(){f.wrapper.classList.remove("paused");}function aa(){if(ag()){p();}else{c();}}function ag(){return f.wrapper.classList.contains("paused");
-}function a(ar,aw){y=G;var ao=ak.concat();ak.length=0;var av=m,am=e;m=aj(l,ar===undefined?m:ar);e=aj(b,aw===undefined?e:aw);stateLoop:for(var ap=0,at=ak.length;
-ap<at;ap++){for(var an=0;an<ao.length;an++){if(ao[an]===ak[ap]){ao.splice(an,1);continue stateLoop;}}document.documentElement.classList.add(ak[ap]);r(ak[ap]);
-}while(ao.length){document.documentElement.classList.remove(ao.pop());}if(R.progress&&f.progress){f.progressbar.style.width=(m/(document.querySelectorAll(l).length-1))*window.innerWidth+"px";
-}if(L()){I();}s();clearTimeout(D);D=setTimeout(h,1500);var al=document.querySelectorAll(l);var au=al[m],aq=au.querySelectorAll("section");G=aq[e]||au;if(m!==av||e!==am){r("slidechanged",{indexh:m,indexv:e,previousSlide:y,currentSlide:G});
-}else{y=null;}if(y){y.classList.remove("present");}}function aj(ao,au){var am=Array.prototype.slice.call(document.querySelectorAll(ao)),at=am.length;if(at){if(R.loop){au%=at;
-if(au<0){au=at+au;}}au=Math.max(Math.min(au,at-1),0);for(var aq=0;aq<at;aq++){var ar=am[aq];if(L()===false){var al=Math.abs((au-aq)%(at-3))||0;ar.style.display=al>3?"none":"block";
-}am[aq].classList.remove("past");am[aq].classList.remove("present");am[aq].classList.remove("future");if(aq<au){am[aq].classList.add("past");}else{if(aq>au){am[aq].classList.add("future");
-}}if(ar.querySelector("section")){am[aq].classList.add("stack");}}am[au].classList.add("present");var an=am[au].getAttribute("data-state");if(an){ak=ak.concat(an.split(" "));
-}var ap=am[au].getAttribute("data-autoslide");if(ap){Y=parseInt(ap);}else{Y=R.autoSlide;}}else{au=0;}return au;}function s(){if(R.controls&&f.controls){var al=g();
-[f.controlsLeft,f.controlsRight,f.controlsUp,f.controlsDown].forEach(function(am){am.classList.remove("enabled");});if(al.left){f.controlsLeft.classList.add("enabled");
-}if(al.right){f.controlsRight.classList.add("enabled");}if(al.up){f.controlsUp.classList.add("enabled");}if(al.down){f.controlsDown.classList.add("enabled");
-}}}function g(){var al=document.querySelectorAll(l),am=document.querySelectorAll(b);return{left:m>0,right:m<al.length-1,up:e>0,down:e<am.length-1};}function J(){var aq=window.location.hash;
-var ap=aq.slice(2).split("/"),am=aq.replace(/#|\//gi,"");if(isNaN(parseInt(ap[0],10))&&am.length){var an=document.querySelector("#"+am);if(an){var ar=Reveal.getIndices(an);
-a(ar.h,ar.v);}else{a(m,e);}}else{var ao=parseInt(ap[0],10)||0,al=parseInt(ap[1],10)||0;a(ao,al);}}function h(){if(R.history){var al="/";if(m>0||e>0){al+=m;
-}if(e>0){al+="/"+e;}window.location.hash=al;}}function M(al){var ap=m,an=e;if(al){var aq=!!al.parentNode.nodeName.match(/section/gi);var ao=aq?al.parentNode:al;
-var am=Array.prototype.slice.call(document.querySelectorAll(l));ap=Math.max(am.indexOf(ao),0);if(aq){an=Math.max(Array.prototype.slice.call(al.parentNode.children).indexOf(al),0);
-}}return{h:ap,v:an};}function v(){if(document.querySelector(b+".present")){var am=document.querySelectorAll(b+".present .fragment:not(.visible)");if(am.length){am[0].classList.add("visible");
-r("fragmentshown",{fragment:am[0]});return true;}}else{var al=document.querySelectorAll(l+".present .fragment:not(.visible)");if(al.length){al[0].classList.add("visible");
-r("fragmentshown",{fragment:al[0]});return true;}}return false;}function Q(){if(document.querySelector(b+".present")){var am=document.querySelectorAll(b+".present .fragment.visible");
-if(am.length){am[am.length-1].classList.remove("visible");r("fragmenthidden",{fragment:am[am.length-1]});return true;}}else{var al=document.querySelectorAll(l+".present .fragment.visible");
-if(al.length){al[al.length-1].classList.remove("visible");r("fragmenthidden",{fragment:al[al.length-1]});return true;}}return false;}function O(){clearTimeout(k);
-if(Y){k=setTimeout(x,Y);}}function B(){if(g().left&&(L()||Q()===false)){a(m-1,0);}}function j(){if(g().right&&(L()||v()===false)){a(m+1,0);}}function u(){if(g().up&&(L()||Q()===false)){a(m,e-1);
-}}function F(){if(g().down&&(L()||v()===false)){a(m,e+1);}}function Z(){if(Q()===false){if(g().up){u();}else{var al=document.querySelector(".reveal .slides>section.past:nth-child("+m+")");
-if(al){e=(al.querySelectorAll("section").length+1)||0;m--;a();}}}}function x(){if(v()===false){g().down?F():j();}O();}function ah(an){var am=document.activeElement;
-var ao=!!(document.activeElement&&(document.activeElement.type||document.activeElement.href||document.activeElement.contentEditable!=="inherit"));if(ao||an.shiftKey||an.altKey||an.ctrlKey||an.metaKey){return;
-}var al=true;switch(an.keyCode){case 80:case 33:Z();break;case 78:case 34:x();break;case 72:case 37:B();break;case 76:case 39:j();break;case 75:case 38:u();
-break;case 74:case 40:F();break;case 36:a(0);break;case 35:a(Number.MAX_VALUE);break;case 32:L()?ae():x();break;case 13:L()?ae():al=false;break;case 66:case 190:aa();
-break;case 70:ab();break;default:al=false;}if(al){an.preventDefault();}else{if(an.keyCode===27&&T){X();an.preventDefault();}}O();}function A(al){ac.startX=al.touches[0].clientX;
-ac.startY=al.touches[0].clientY;ac.startCount=al.touches.length;if(al.touches.length===2&&R.overview){ac.startSpan=S({x:al.touches[1].clientX,y:al.touches[1].clientY},{x:ac.startX,y:ac.startY});
-}}function af(aq){if(!ac.handled){var ao=aq.touches[0].clientX;var an=aq.touches[0].clientY;if(aq.touches.length===2&&ac.startCount===2&&R.overview){var ap=S({x:aq.touches[1].clientX,y:aq.touches[1].clientY},{x:ac.startX,y:ac.startY});
-if(Math.abs(ac.startSpan-ap)>ac.threshold){ac.handled=true;if(ap<ac.startSpan){I();}else{ae();}}aq.preventDefault();}else{if(aq.touches.length===1&&ac.startCount!==2){var am=ao-ac.startX,al=an-ac.startY;
-if(am>ac.threshold&&Math.abs(am)>Math.abs(al)){ac.handled=true;B();}else{if(am<-ac.threshold&&Math.abs(am)>Math.abs(al)){ac.handled=true;j();}else{if(al>ac.threshold){ac.handled=true;
-u();}else{if(al<-ac.threshold){ac.handled=true;F();}}}}aq.preventDefault();}}}else{if(navigator.userAgent.match(/android/gi)){aq.preventDefault();}}}function W(al){ac.handled=false;
-}function o(al){clearTimeout(z);z=setTimeout(function(){var am=al.detail||-al.wheelDelta;if(am>0){x();}else{Z();}},100);}function ai(am){var al=Array.prototype.slice.call(document.querySelectorAll(l)).length;
-var an=Math.floor((am.clientX/f.wrapper.offsetWidth)*al);a(an);}function w(al){J();}function C(al){if(L()){al.preventDefault();ae();m=this.getAttribute("data-index-h");
-e=this.getAttribute("data-index-v");a();}}return{initialize:i,slide:a,left:B,right:j,up:u,down:F,prev:Z,next:x,prevFragment:Q,nextFragment:v,navigateTo:a,navigateLeft:B,navigateRight:j,navigateUp:u,navigateDown:F,navigatePrev:Z,navigateNext:x,toggleOverview:X,addEventListeners:E,removeEventListeners:U,getIndices:M,getPreviousSlide:function(){return y;
-},getCurrentSlide:function(){return G;},getQueryHash:function(){var al={};location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(am){al[am.split("=").shift()]=am.split("=").pop();
-});return al;},addEventListener:function(am,an,al){if("addEventListener" in window){(f.wrapper||document.querySelector(".reveal")).addEventListener(am,an,al);
-}},removeEventListener:function(am,an,al){if("addEventListener" in window){(f.wrapper||document.querySelector(".reveal")).removeEventListener(am,an,al);
+var Reveal=(function(){var ar=".reveal .slides section",m=".reveal .slides>section",b=".reveal .slides>section.present>section",W={controls:true,progress:true,history:false,keyboard:true,overview:true,center:true,loop:false,autoSlide:0,mouseWheel:true,rollingLinks:true,theme:null,transition:"default",dependencies:[]},ae=W.autoSlide,n=0,e=0,A,J,at=[],f={},Z="WebkitPerspective" in document.body.style||"MozPerspective" in document.body.style||"msPerspective" in document.body.style||"OPerspective" in document.body.style||"perspective" in document.body.style,p="WebkitTransform" in document.body.style||"MozTransform" in document.body.style||"msTransform" in document.body.style||"OTransform" in document.body.style||"transform" in document.body.style,B=0,l=0,F=0,aj={startX:0,startY:0,startSpan:0,startCount:0,handled:false,threshold:80};
+function j(au){if((!p&&!Z)){document.body.setAttribute("class","no-transforms");return;}v(W,au);d();ab();}function S(){f.theme=document.querySelector("#theme");
+f.wrapper=document.querySelector(".reveal");if(!f.wrapper.querySelector(".progress")&&W.progress){var ax=document.createElement("div");ax.classList.add("progress");
+ax.innerHTML="<span></span>";f.wrapper.appendChild(ax);}if(!f.wrapper.querySelector(".controls")&&W.controls){var aw=document.createElement("aside");aw.classList.add("controls");
+aw.innerHTML='<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>';f.wrapper.appendChild(aw);
+}if(!f.wrapper.querySelector(".state-background")){var av=document.createElement("div");av.classList.add("state-background");f.wrapper.appendChild(av);
+}if(!f.wrapper.querySelector(".pause-overlay")){var au=document.createElement("div");au.classList.add("pause-overlay");f.wrapper.appendChild(au);}f.progress=document.querySelector(".reveal .progress");
+f.progressbar=document.querySelector(".reveal .progress span");if(W.controls){f.controls=document.querySelector(".reveal .controls");f.controlsLeft=I(document.querySelectorAll(".navigate-left"));
+f.controlsRight=I(document.querySelectorAll(".navigate-right"));f.controlsUp=I(document.querySelectorAll(".navigate-up"));f.controlsDown=I(document.querySelectorAll(".navigate-down"));
+f.controlsPrev=I(document.querySelectorAll(".navigate-prev"));f.controlsNext=I(document.querySelectorAll(".navigate-next"));}}function d(){if(navigator.userAgent.match(/(iphone|ipod|android)/i)){document.documentElement.style.overflow="scroll";
+document.body.style.height="120%";window.addEventListener("load",ak,false);window.addEventListener("orientationchange",ak,false);}}function ab(){var av=[],az=[];
+for(var aw=0,au=W.dependencies.length;aw<au;aw++){var ax=W.dependencies[aw];if(!ax.condition||ax.condition()){if(ax.async){az.push(ax.src);}else{av.push(ax.src);
+}if(typeof ax.callback==="function"){head.ready(ax.src.match(/([\w\d_\-]*)\.?[^\\\/]*$/i)[0],ax.callback);}}}function ay(){if(az.length){head.js.apply(null,az);
+}K();}if(av.length){head.ready(ay);head.js.apply(null,av);}else{ay();}}function K(){S();G();N();T();M();R();setTimeout(function(){t("ready",{indexh:n,indexv:e,currentSlide:J});
+},1);}function N(){if(Z===false){W.transition="linear";}if(W.controls&&f.controls){f.controls.style.display="block";}if(W.progress&&f.progress){f.progress.style.display="block";
+}if(W.transition!=="default"){f.wrapper.classList.add(W.transition);}if(W.center){f.wrapper.classList.add("center");}if(W.mouseWheel){document.addEventListener("DOMMouseScroll",q,false);
+document.addEventListener("mousewheel",q,false);}if(W.rollingLinks){Q();}if(W.theme&&f.theme){var aw=f.theme.getAttribute("href");var au=/[^\/]*?(?=\.css)/;
+var av=aw.match(au)[0];if(W.theme!==av){aw=aw.replace(au,W.theme);f.theme.setAttribute("href",aw);}}}function G(){document.addEventListener("touchstart",C,false);
+document.addEventListener("touchmove",am,false);document.addEventListener("touchend",ac,false);window.addEventListener("hashchange",y,false);window.addEventListener("resize",g,false);
+if(W.keyboard){document.addEventListener("keydown",ao,false);}if(W.progress&&f.progress){f.progress.addEventListener("click",s(ap),false);}if(W.controls&&f.controls){f.controlsLeft.forEach(function(au){au.addEventListener("click",s(D),false);
+});f.controlsRight.forEach(function(au){au.addEventListener("click",s(k),false);});f.controlsUp.forEach(function(au){au.addEventListener("click",s(w),false);
+});f.controlsDown.forEach(function(au){au.addEventListener("click",s(H),false);});f.controlsPrev.forEach(function(au){au.addEventListener("click",s(af),false);
+});f.controlsNext.forEach(function(au){au.addEventListener("click",s(z),false);});}}function aa(){document.removeEventListener("keydown",ao,false);document.removeEventListener("touchstart",C,false);
+document.removeEventListener("touchmove",am,false);document.removeEventListener("touchend",ac,false);window.removeEventListener("hashchange",y,false);window.removeEventListener("resize",g,false);
+if(W.progress&&f.progress){f.progress.removeEventListener("click",s(ap),false);}if(W.controls&&f.controls){f.controlsLeft.forEach(function(au){au.removeEventListener("click",s(D),false);
+});f.controlsRight.forEach(function(au){au.removeEventListener("click",s(k),false);});f.controlsUp.forEach(function(au){au.removeEventListener("click",s(w),false);
+});f.controlsDown.forEach(function(au){au.removeEventListener("click",s(H),false);});f.controlsPrev.forEach(function(au){au.removeEventListener("click",s(af),false);
+});f.controlsNext.forEach(function(au){au.removeEventListener("click",s(z),false);});}}function v(av,au){for(var aw in au){av[aw]=au[aw];}}function I(au){return Array.prototype.slice.call(au);
+}function ah(au,aw,av){au.forEach(function(ax){ax[aw].apply(ax,av);});}function X(aw,au){var ax=aw.x-au.x,av=aw.y-au.y;return Math.sqrt(ax*ax+av*av);}function s(au){return function(av){av.preventDefault();
+au.call(null,av);};}function ak(){setTimeout(function(){window.scrollTo(0,1);},0);}function t(av,au){var aw=document.createEvent("HTMLEvents",1,2);aw.initEvent(av,true,true);
+v(aw,au);f.wrapper.dispatchEvent(aw);}function Q(){if(Z&&!("msPerspective" in document.body.style)){var av=document.querySelectorAll(ar+" a:not(.image)");
+for(var aw=0,au=av.length;aw<au;aw++){var ax=av[aw];if(ax.textContent&&!ax.querySelector("img")&&(!ax.className||!ax.classList.contains(ax,"roll"))){ax.classList.add("roll");
+ax.innerHTML='<span data-title="'+ax.text+'">'+ax.innerHTML+"</span>";}}}}function T(){if(W.center){var ax=I(document.querySelectorAll(ar));var ay=-f.wrapper.offsetHeight/2;
+for(var aw=0,av=ax.length;aw<av;aw++){var au=ax[aw];if(au.style.display==="none"){continue;}if(au.classList.contains("stack")){au.style.top=0;}else{au.style.top=Math.max(-(au.offsetHeight/2)-20,ay)+"px";
+}}}}function V(au,av){if(au){au.setAttribute("data-previous-indexv",av||0);}}function Y(au){if(au&&au.classList.contains("stack")){return parseInt(au.getAttribute("data-previous-indexv")||0);
+}return 0;}function L(){if(W.overview){f.wrapper.classList.add("overview");var av=document.querySelectorAll(m);for(var aA=0,ay=av.length;aA<ay;aA++){var ax=av[aA],aE="translateZ(-2500px) translate("+((aA-n)*105)+"%, 0%)";
+ax.setAttribute("data-index-h",aA);ax.style.display="block";ax.style.WebkitTransform=aE;ax.style.MozTransform=aE;ax.style.msTransform=aE;ax.style.OTransform=aE;
+ax.style.transform=aE;if(ax.classList.contains("stack")){var aD=ax.querySelectorAll("section");for(var az=0,aw=aD.length;az<aw;az++){var au=aA===n?e:Y(ax);
+var aC=aD[az],aB="translate(0%, "+((az-au)*105)+"%)";aC.setAttribute("data-index-h",aA);aC.setAttribute("data-index-v",az);aC.style.display="block";aC.style.WebkitTransform=aB;
+aC.style.MozTransform=aB;aC.style.msTransform=aB;aC.style.OTransform=aB;aC.style.transform=aB;aC.addEventListener("click",E,true);}}else{ax.addEventListener("click",E,true);
+}}T();}}function al(){if(W.overview){f.wrapper.classList.remove("overview");var ax=I(document.querySelectorAll(ar));for(var aw=0,au=ax.length;aw<au;aw++){var av=ax[aw];
+av.style.WebkitTransform="";av.style.MozTransform="";av.style.msTransform="";av.style.OTransform="";av.style.transform="";av.removeEventListener("click",E);
+}a(n,e);}}function ad(au){if(typeof au==="boolean"){au?L():al();}else{O()?al():L();}}function O(){return f.wrapper.classList.contains("overview");}function ai(){var au=document.body;
+var av=au.requestFullScreen||au.webkitRequestFullScreen||au.mozRequestFullScreen||au.msRequestFullScreen;if(av){av.apply(au);}}function c(){f.wrapper.classList.add("paused");
+}function r(){f.wrapper.classList.remove("paused");}function ag(){if(an()){r();}else{c();}}function an(){return f.wrapper.classList.contains("paused");
+}function a(aA,aE){A=J;var au=document.querySelectorAll(m);if(aE===undefined){aE=Y(au[aA]);}if(A&&A.parentNode.classList.contains("stack")){V(A.parentNode,e);
+}var ax=at.concat();at.length=0;var aD=n,aw=e;n=aq(m,aA===undefined?n:aA);e=aq(b,aE===undefined?e:aE);T();stateLoop:for(var ay=0,aB=at.length;ay<aB;ay++){for(var av=0;
+av<ax.length;av++){if(ax[av]===at[ay]){ax.splice(av,1);continue stateLoop;}}document.documentElement.classList.add(at[ay]);t(at[ay]);}while(ax.length){document.documentElement.classList.remove(ax.pop());
+}if(O()){L();}clearTimeout(F);F=setTimeout(i,1500);var aC=au[n],az=aC.querySelectorAll("section");J=az[e]||aC;if(n!==aD||e!==aw){t("slidechanged",{indexh:n,indexv:e,previousSlide:A,currentSlide:J});
+}else{A=null;}if(A){A.classList.remove("present");}u();o();}function aq(ax,aC){var av=I(document.querySelectorAll(ax)),aB=av.length;if(aB){if(W.loop){aC%=aB;
+if(aC<0){aC=aB+aC;}}aC=Math.max(Math.min(aC,aB-1),0);for(var az=0;az<aB;az++){var aA=av[az];if(O()===false){var au=Math.abs((aC-az)%(aB-3))||0;aA.style.display=au>3?"none":"block";
+}av[az].classList.remove("past");av[az].classList.remove("present");av[az].classList.remove("future");if(az<aC){av[az].classList.add("past");}else{if(az>aC){av[az].classList.add("future");
+}}if(aA.querySelector("section")){av[az].classList.add("stack");}}av[aC].classList.add("present");var aw=av[aC].getAttribute("data-state");if(aw){at=at.concat(aw.split(" "));
+}var ay=av[aC].getAttribute("data-autoslide");if(ay){ae=parseInt(ay);}else{ae=W.autoSlide;}}else{aC=0;}return aC;}function o(){if(W.progress&&f.progress){var aw=I(document.querySelectorAll(m));
+var av=document.querySelectorAll(ar+":not(.stack)").length;var au=0;mainLoop:for(var ay=0;ay<aw.length;ay++){var az=aw[ay];var aA=I(az.querySelectorAll("section"));
+for(var ax=0;ax<aA.length;ax++){if(aA[ax].classList.contains("present")){break mainLoop;}au++;}if(az.classList.contains("present")){break;}if(az.classList.contains("stack")===false){au++;
+}}f.progressbar.style.width=(au/(av-1))*window.innerWidth+"px";}}function u(){if(W.controls&&f.controls){var au=h();f.controlsLeft.concat(f.controlsRight).concat(f.controlsUp).concat(f.controlsDown).concat(f.controlsPrev).concat(f.controlsNext).forEach(function(av){av.classList.remove("enabled");
+});if(au.left){f.controlsLeft.forEach(function(av){av.classList.add("enabled");});}if(au.right){f.controlsRight.forEach(function(av){av.classList.add("enabled");
+});}if(au.up){f.controlsUp.forEach(function(av){av.classList.add("enabled");});}if(au.down){f.controlsDown.forEach(function(av){av.classList.add("enabled");
+});}if(au.left||au.up){f.controlsPrev.forEach(function(av){av.classList.add("enabled");});}if(au.right||au.down){f.controlsNext.forEach(function(av){av.classList.add("enabled");
+});}}}function h(){var au=document.querySelectorAll(m),av=document.querySelectorAll(b);return{left:n>0,right:n<au.length-1,up:e>0,down:e<av.length-1};}function M(){var az=window.location.hash;
+var ay=az.slice(2).split("/"),av=az.replace(/#|\//gi,"");if(isNaN(parseInt(ay[0],10))&&av.length){var aw=document.querySelector("#"+av);if(aw){var aA=Reveal.getIndices(aw);
+a(aA.h,aA.v);}else{a(n,e);}}else{var ax=parseInt(ay[0],10)||0,au=parseInt(ay[1],10)||0;a(ax,au);}}function i(){if(W.history){var au="/";if(J&&typeof J.getAttribute("id")==="string"){au="/"+J.getAttribute("id");
+}else{if(n>0||e>0){au+=n;}if(e>0){au+="/"+e;}}window.location.hash=au;}}function P(au){var ay=n,aw=e;if(au){var az=!!au.parentNode.nodeName.match(/section/gi);
+var ax=az?au.parentNode:au;var av=I(document.querySelectorAll(m));ay=Math.max(av.indexOf(ax),0);if(az){aw=Math.max(I(au.parentNode.children).indexOf(au),0);
+}}return{h:ay,v:aw};}function x(){if(document.querySelector(b+".present")){var av=document.querySelectorAll(b+".present .fragment:not(.visible)");if(av.length){av[0].classList.add("visible");
+t("fragmentshown",{fragment:av[0]});return true;}}else{var au=document.querySelectorAll(m+".present .fragment:not(.visible)");if(au.length){au[0].classList.add("visible");
+t("fragmentshown",{fragment:au[0]});return true;}}return false;}function U(){if(document.querySelector(b+".present")){var av=document.querySelectorAll(b+".present .fragment.visible");
+if(av.length){av[av.length-1].classList.remove("visible");t("fragmenthidden",{fragment:av[av.length-1]});return true;}}else{var au=document.querySelectorAll(m+".present .fragment.visible");
+if(au.length){au[au.length-1].classList.remove("visible");t("fragmenthidden",{fragment:au[au.length-1]});return true;}}return false;}function R(){clearTimeout(l);
+if(ae){l=setTimeout(z,ae);}}function D(){if(h().left&&O()||U()===false){a(n-1);}}function k(){if(h().right&&O()||x()===false){a(n+1);}}function w(){if(h().up&&O()||U()===false){a(n,e-1);
+}}function H(){if(h().down&&O()||x()===false){a(n,e+1);}}function af(){if(U()===false){if(h().up){w();}else{var au=document.querySelector(m+".past:nth-child("+n+")");
+if(au){e=(au.querySelectorAll("section").length+1)||undefined;n--;a();}}}}function z(){if(x()===false){h().down?H():k();}R();}function ao(aw){var av=document.activeElement;
+var ax=!!(document.activeElement&&(document.activeElement.type||document.activeElement.href||document.activeElement.contentEditable!=="inherit"));if(ax||aw.shiftKey||aw.altKey||aw.ctrlKey||aw.metaKey){return;
+}var au=true;switch(aw.keyCode){case 80:case 33:af();break;case 78:case 34:z();break;case 72:case 37:D();break;case 76:case 39:k();break;case 75:case 38:w();
+break;case 74:case 40:H();break;case 36:a(0);break;case 35:a(Number.MAX_VALUE);break;case 32:O()?al():z();break;case 13:O()?al():au=false;break;case 66:case 190:ag();
+break;case 70:ai();break;default:au=false;}if(au){aw.preventDefault();}else{if(aw.keyCode===27&&Z){ad();aw.preventDefault();}}R();}function C(au){aj.startX=au.touches[0].clientX;
+aj.startY=au.touches[0].clientY;aj.startCount=au.touches.length;if(au.touches.length===2&&W.overview){aj.startSpan=X({x:au.touches[1].clientX,y:au.touches[1].clientY},{x:aj.startX,y:aj.startY});
+}}function am(az){if(!aj.handled){var ax=az.touches[0].clientX;var aw=az.touches[0].clientY;if(az.touches.length===2&&aj.startCount===2&&W.overview){var ay=X({x:az.touches[1].clientX,y:az.touches[1].clientY},{x:aj.startX,y:aj.startY});
+if(Math.abs(aj.startSpan-ay)>aj.threshold){aj.handled=true;if(ay<aj.startSpan){L();}else{al();}}az.preventDefault();}else{if(az.touches.length===1&&aj.startCount!==2){var av=ax-aj.startX,au=aw-aj.startY;
+if(av>aj.threshold&&Math.abs(av)>Math.abs(au)){aj.handled=true;D();}else{if(av<-aj.threshold&&Math.abs(av)>Math.abs(au)){aj.handled=true;k();}else{if(au>aj.threshold){aj.handled=true;
+w();}else{if(au<-aj.threshold){aj.handled=true;H();}}}}az.preventDefault();}}}else{if(navigator.userAgent.match(/android/gi)){az.preventDefault();}}}function ac(au){aj.handled=false;
+}function q(au){clearTimeout(B);B=setTimeout(function(){var av=au.detail||-au.wheelDelta;if(av>0){z();}else{af();}},100);}function ap(av){var au=I(document.querySelectorAll(m)).length;
+var aw=Math.floor((av.clientX/f.wrapper.offsetWidth)*au);a(aw);}function y(au){M();}function g(au){T();}function E(au){if(O()){au.preventDefault();al();
+a(parseInt(this.getAttribute("data-index-h")),parseInt(this.getAttribute("data-index-v")));}}return{initialize:j,slide:a,left:D,right:k,up:w,down:H,prev:af,next:z,prevFragment:U,nextFragment:x,navigateTo:a,navigateLeft:D,navigateRight:k,navigateUp:w,navigateDown:H,navigatePrev:af,navigateNext:z,toggleOverview:ad,addEventListeners:G,removeEventListeners:aa,getIndices:P,getPreviousSlide:function(){return A;
+},getCurrentSlide:function(){return J;},getQueryHash:function(){var au={};location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(av){au[av.split("=").shift()]=av.split("=").pop();
+});return au;},addEventListener:function(av,aw,au){if("addEventListener" in window){(f.wrapper||document.querySelector(".reveal")).addEventListener(av,aw,au);
+}},removeEventListener:function(av,aw,au){if("addEventListener" in window){(f.wrapper||document.querySelector(".reveal")).removeEventListener(av,aw,au);
}}};})(); \ No newline at end of file