diff --git a/apache_logo.png b/apache_logo.png
new file mode 100644
index 0000000..d99ecd8
Binary files /dev/null and b/apache_logo.png differ
diff --git a/blogger-icon.png b/blogger-icon.png
new file mode 100644
index 0000000..aa3c204
Binary files /dev/null and b/blogger-icon.png differ
diff --git a/grottworkshop/base.html b/grottworkshop/base.html
new file mode 100644
index 0000000..d2c3c57
--- /dev/null
+++ b/grottworkshop/base.html
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+ {{ head_title }}
+
+ {% if embed %}
+
+
+ {% else %}
+
+
+ {% endif %}
+ {% for css in user_css %}
+ {% if embed %}
+
+ {% else %}
+
+ {% endif %}
+ {% endfor %}
+
+
+ {% if embed %}
+
+ {% else %}
+
+ {% endif %}
+ {% for js in user_js %}
+ {% if embed %}
+
+ {% else %}
+
+ {% endif %}
+ {% endfor %}
+
+
+
+
+
+
+
+ {% for slide in slides %}
+
+
+
+
+ {% if slide.header %}
+
+ {% endif %}
+ {% if slide.content %}
+
+ {% endif %}
+
+
+
+
+ {% if slide.presenter_notes %}
+ {{ slide.presenter_notes }}
+ {% endif %}
+
+
+
+
+
+ {% endfor %}
+
+
+
+
+
+ {% if toc %}
+
+ {% endif %}
+
+
+
+
\ No newline at end of file
diff --git a/grottworkshop/css/print.css b/grottworkshop/css/print.css
new file mode 100644
index 0000000..dba8990
--- /dev/null
+++ b/grottworkshop/css/print.css
@@ -0,0 +1,212 @@
+* {
+margin: 0;
+padding: 0;
+}
+
+@page {
+size: landscape;
+}
+
+body {
+font: 100% "Lucida Grande", "Trebuchet MS", Verdana, sans-serif;
+padding: 0;
+margin: 0;
+}
+
+div.slide {
+min-width: 950px;
+min-height: 678px;
+padding: 1em;
+overflow: hidden;
+page-break-after: always;
+border: 1px solid black;
+border-radius: 20px;
+background: #000000 url('../img/gwslideslogo.png') no-repeat top right;
+color: #ffffff;
+}
+
+div.slide div.inner {
+width: 950px;
+height: 678px;
+margin: auto;
+display: table-cell;
+}
+
+h1 {
+font-size: 2.4em;
+}
+
+h2 {
+font-size: 1.4em;
+}
+
+h3 {
+margin: 1em 0;
+}
+
+ul {
+margin: 0;
+padding: 0;
+}
+
+p, li, pre {
+margin: 1em 0;
+}
+
+li {
+margin-left: 2em;
+}
+
+a {
+color: #ffffff;
+}
+
+pre, code {
+max-width: 950px;
+color: #BFA6A6;
+font-family: Monaco, monospace;
+font-size: 90%;
+}
+
+pre {
+padding: .2em .5em;
+overflow: hidden;
+}
+
+code {
+padding: 0 .2em;
+}
+
+.slide header:only-child h1 {
+line-height: 180%;
+text-align: center;
+display: table-cell;
+vertical-align: middle;
+height: 600px;
+width: 800px;
+font-size: 48px;
+margin-top:100px;
+margin-bottom:100px;
+}
+
+section {
+ margin-top: 50px;
+}
+
+/* title slide */
+.slide-wrapper:first-child .slide {
+ text-align: center;
+ background: #000000 url('../img/gws_title-slide.png') no-repeat top center;
+}
+.slide-wrapper:first-child header:not(:only-child) {
+ position: static;
+ padding-top: 85px;
+ color: #000000;
+ width: 770px;
+ margin: 0 auto;
+}
+.slide-wrapper:first-child section {
+ margin-top: 10px;
+ color: #000000;
+}
+.slide-wrapper:first-child .slide header:only-child h1 {
+ display: block;
+ width: auto;
+ color: #000000;
+ padding-top: 50px;
+}
+.slide-wrapper:first-child h2 {
+ font-size: 25px;
+ font-weight: normal;
+}
+
+/* Pygments solarized theme */
+pre .hll { background-color: #002B36 }
+pre { background: #002B36; color: #93A1A1 }
+pre .c { color: #859900 } /* Comment */
+pre .err { color: #d33682; background-color: #002B36 } /* Error */
+pre .k { color: #268bd2 } /* Keyword */
+pre .l { color: #6c71c4 } /* Literal */
+pre .n { color: #93a1a1 } /* Name */
+pre .o { color: #dc322f } /* Operator */
+pre .p { color: #93a1a1 } /* Punctuation */
+pre .cm { color: #859900 } /* Comment.Multiline */
+pre .cp { color: #859900 } /* Comment.Preproc */
+pre .c1 { color: #859900 } /* Comment.Single */
+pre .cs { color: #859900 } /* Comment.Special */
+pre .ge { font-style: italic } /* Generic.Emph */
+pre .gs { font-weight: bold } /* Generic.Strong */
+pre .kc { color: #268bd2 } /* Keyword.Constant */
+pre .kd { color: #268bd2 } /* Keyword.Declaration */
+pre .kn { color: #dc322f } /* Keyword.Namespace */
+pre .kp { color: #268bd2 } /* Keyword.Pseudo */
+pre .kr { color: #268bd2 } /* Keyword.Reserved */
+pre .kt { color: #268bd2 } /* Keyword.Type */
+pre .ld { color: #b58900 } /* Literal.Date */
+pre .m { color: #6c71c4 } /* Literal.Number */
+pre .s { color: #b58900 } /* Literal.String */
+pre .na { color: #2aa198 } /* Name.Attribute */
+pre .nb { color: #93a1a1 } /* Name.Builtin */
+pre .nc { color: #2aa198 } /* Name.Class */
+pre .no { color: #268bd2 } /* Name.Constant */
+pre .nd { color: #2aa198 } /* Name.Decorator */
+pre .ni { color: #93a1a1 } /* Name.Entity */
+pre .ne { color: #2aa198 } /* Name.Exception */
+pre .nf { color: #2aa198 } /* Name.Function */
+pre .nl { color: #93a1a1 } /* Name.Label */
+pre .nn { color: #93a1a1 } /* Name.Namespace */
+pre .nx { color: #2aa198 } /* Name.Other */
+pre .py { color: #93a1a1 } /* Name.Property */
+pre .nt { color: #dc322f } /* Name.Tag */
+pre .nv { color: #93a1a1 } /* Name.Variable */
+pre .ow { color: #dc322f } /* Operator.Word */
+pre .w { color: #93a1a1 } /* Text.Whitespace */
+pre .mf { color: #6c71c4 } /* Literal.Number.Float */
+pre .mh { color: #6c71c4 } /* Literal.Number.Hex */
+pre .mi { color: #6c71c4 } /* Literal.Number.Integer */
+pre .mo { color: #6c71c4 } /* Literal.Number.Oct */
+pre .sb { color: #b58900 } /* Literal.String.Backtick */
+pre .sc { color: #b58900 } /* Literal.String.Char */
+pre .sd { color: #b58900 } /* Literal.String.Doc */
+pre .s2 { color: #b58900 } /* Literal.String.Double */
+pre .se { color: #6c71c4 } /* Literal.String.Escape */
+pre .sh { color: #b58900 } /* Literal.String.Heredoc */
+pre .si { color: #b58900 } /* Literal.String.Interpol */
+pre .sx { color: #b58900 } /* Literal.String.Other */
+pre .sr { color: #b58900 } /* Literal.String.Regex */
+pre .s1 { color: #b58900 } /* Literal.String.Single */
+pre .ss { color: #b58900 } /* Literal.String.Symbol */
+pre .bp { color: #93a1a1 } /* Name.Builtin.Pseudo */
+pre .vc { color: #93a1a1 } /* Name.Variable.Class */
+pre .vg { color: #93a1a1 } /* Name.Variable.Global */
+pre .vi { color: #93a1a1 } /* Name.Variable.Instance */
+pre .il { color: #6c71c4 } /* Literal.Number.Integer.Long */
+
+pre .lineno,
+.linenodiv pre {
+ background-color: #073642;
+ padding: 0 4px 0 15px;
+ display: inline-block;
+}
+td.linenos,
+.linenodiv pre {
+ width: 22px;
+ text-align: right;
+}
+td.code pre {
+ padding: 0 5px;
+}
+.highlighttable {
+ border-collapse: collapse;
+ width: 950px;
+}
+.highlighttable td {
+ padding: 0;
+}
+
+/* hide */
+#toc, #help, .slide aside, .slide footer, .slide .notes,
+.presenter_notes, #current_presenter_notes, #presenter_note,
+#footnotes {
+display: none;
+}
\ No newline at end of file
diff --git a/grottworkshop/css/screen.css b/grottworkshop/css/screen.css
new file mode 100644
index 0000000..b8acede
--- /dev/null
+++ b/grottworkshop/css/screen.css
@@ -0,0 +1,588 @@
+body {
+ font: 14px Verdana, sans-serif;
+ background: #0E4C61;
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+}
+
+div.presentation {
+ position: absolute;
+ width: 100%;
+ display: table-cell;
+ vertical-align: middle;
+ height: 100%;
+ background: inherit;
+}
+
+div.presentation > h1 {
+ display: none;
+}
+
+div.slides, body.expose div.slides.nocontext {
+ width: 100%;
+ height: 100%;
+ left: 0;
+ top: 0;
+ position: absolute;
+ display: block;
+}
+
+div.slides.nocontext {
+ width: 900px;
+ margin: 0 auto;
+ overflow: hidden;
+ position: relative;
+ left: auto;
+ top: auto;
+}
+
+div.slide {
+ display: inline;
+ position: absolute;
+ overflow: hidden;
+ width: 900px;
+ height: 700px;
+ margin-top: -350px;
+ margin-left: -400px;
+ left: 50%;
+ top: 50%;
+ border-radius: 20px;
+ -webkit-transition: margin 0.25s ease-in-out;
+ -moz-transition: margin 0.25s ease-in-out;
+ -o-transition: margin 0.25s ease-in-out;
+ background: #000000 url('../img/gwslideslogo.png') no-repeat top right;
+}
+
+/* Expose */
+
+body.expose div.slides {
+ float: left;
+ position: relative;
+ overflow: auto;
+ margin-bottom: 10px;
+}
+
+body.expose div.slide {
+ display: block;
+ float: left;
+ position: relative;
+ left: auto !important;
+ top: auto !important;
+ margin: 10px !important;
+ -webkit-transition: none;
+ -moz-transition: none;
+ -o-transition: none;
+ -moz-transform: scale(.33, .33);
+ -moz-transform-origin: 0 0;
+ -webkit-transform: scale(.33, .33);
+ -webkit-transform-origin: 0 0;
+ -o-transform: scale(.33, .33);
+ -o-transform-origin: 0 0;
+ -webkit-transition: none;
+ -moz-transition: none;
+ -o-transition: none;
+ cursor: pointer;
+}
+
+body.expose div.slide:hover {
+ background-color: #494949;
+}
+
+body.expose .slide-wrapper {
+ float: left;
+ position: relative;
+ margin: .5%;
+ width: 300px;
+ height: 233px;
+}
+
+body.expose .slide footer {
+}
+
+body.expose .slide .inner {
+}
+
+body.expose .slide.far-past,
+body.expose .slide.past,
+body.expose .slide.future,
+body.expose .slide.far-future {
+ margin-left: 0;
+ opacity: 1;
+}
+
+body.expose .slide.current {
+ background-color: #494949;
+ border: 16px solid #fff;
+ -moz-transform: scale(.315, .315);
+ -moz-transform-origin: 0 0;
+ -webkit-transform: scale(.315, .315);
+ -webkit-transform-origin: 0 0;
+ -o-transform: scale(.315, .315);
+ -o-transform-origin: 0 0;
+}
+
+/* Presenter Mode */
+
+body.presenter_view div.slide {
+ display: inline;
+ position: absolute;
+ overflow: hidden;
+ -moz-transform: scale(.5, .5);
+ -moz-transform-origin: 0 0;
+ -webkit-transform: scale(.5, .5);
+ -webkit-transform-origin: 0 0;
+ -o-transform: scale(.5, .5);
+ -o-transform-origin: 0 0;
+ margin-top: -300px;
+}
+
+body.presenter_view .slide.far-past {
+ display: block;
+ margin-left: -1500px;
+}
+
+body.presenter_view .slide.past {
+ display: block;
+ margin-left: -975px;
+}
+
+body.presenter_view .slide.current {
+ display: block;
+ margin-left: -475px;
+ border: 8px solid maroon;
+ z-index: 2;
+}
+
+body.presenter_view .slide.future {
+ display: block;
+ margin-left: 25px;
+ z-index: 1;
+}
+
+body.presenter_view .slide.far-future {
+ display: block;
+ margin-left: 525px;
+}
+
+body.presenter_view div#current_presenter_notes {
+ visibility: visible;
+ display: block;
+ position: absolute;
+ overflow: auto;
+ vertical-align: middle;
+ left: 50%;
+ top: 50%;
+ margin-left: -475px;
+ margin-top: 100px;
+ z-index: 2;
+ width: 950px;
+ border-style: solid;
+ height: 30%;
+ background-color: silver;
+}
+
+body.presenter_view div#current_presenter_notes section {
+ font-family: Verdana, sans-serif;
+ color: black;
+ text-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px;
+ display: block;
+ overflow: visible;
+ position: relative;
+ background-color: #fffeff;
+ height: 120px;
+ margin-right: 30px;
+ margin-top: 60px;
+ margin-left: 30px;
+ padding-right: 10px;
+ padding-left: 10px;
+ padding-top: 10px;
+}
+
+body.presenter_view div#current_presenter_notes section p {
+ margin: 0;
+}
+
+body.presenter_view div#current_presenter_notes h1 {
+ font-size: 50%;
+ display: block;
+}
+
+div#current_presenter_notes {
+ display: none;
+}
+
+div.slide div.presenter_notes, div.slides div.presenter_notes {
+ display: none;
+}
+
+/* Slide styles */
+
+div.slide p {
+ font-size: 20px;
+}
+
+.slide.far-past {
+ display: block;
+ margin-left: -2400px;
+}
+
+.slide.past {
+ display: block;
+ margin-left: -1400px;
+ opacity: 0;
+}
+
+.slide.current {
+ display: block;
+ margin-left: -450px;
+}
+
+.slide.future {
+ display: block;
+ margin-left: 500px;
+ opacity: 0;
+}
+
+.slide.far-future {
+ display: block;
+ margin-left: 1500px;
+}
+
+body.three-d div.slides {
+ -webkit-transform: translateX(50px) scale(0.8) rotateY(10deg);
+ -moz-transform: translateX(50px) scale(0.8) rotateY(10deg);
+ -o-transform: translateX(50px) scale(0.8) rotateY(10deg);
+}
+
+
+/* Content */
+
+header:not(:only-child) {
+ font-family: Verdana, sans-serif;
+ font-weight: normal;
+ font-size: 65px;
+ letter-spacing: -.05em;
+ color: #ffffff;
+ text-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px;
+ position: absolute;
+ left: 30px;
+ top: 25px;
+ margin: 0;
+ padding: 0;;
+}
+
+header h1, header h2, header h3, header h4, header h5, header h6 {
+ display: inline;
+ font-size: 100%;
+ font-weight: normal;
+ padding: 0;
+ margin: 0;
+}
+
+header h2:first-child {
+ margin-top: 0;
+}
+
+section, .slide header:only-child h1 {
+ font-family: Verdana, sans-serif;
+ color: #ffffff;
+ text-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px;
+ margin-left: 30px;
+ margin-right: 30px;
+ margin-top: 100px;
+ display: block;
+ overflow: hidden;
+}
+
+img { display: block; margin: auto; }
+
+section img.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+section img.align-right {
+ display: block;
+ margin-left: auto;
+ margin-right: 0;
+}
+
+section img.align-left {
+ display: block;
+ margin-right: auto;
+ margin-left: 0;
+}
+
+a {
+ color: inherit;
+ display: inline-block;
+ text-decoration: none;
+ line-height: 110%;
+ border-bottom: 2px solid #3f3f3f;
+}
+
+pre {
+ font-size: 16px;
+ font-family: Courier, monospace;
+}
+code {
+ color: #bfa6a6;
+ font-size: 20px;
+ font-family: Courier, monospace;
+}
+
+li {
+ padding: 10px 0;
+ font-size: 20px;
+}
+
+.slide header:only-child h1 {
+ line-height: 180%;
+ text-align: center;
+ display: table-cell;
+ vertical-align: middle;
+ height: 700px;
+ width: 900px;
+ font-size: 50px;
+ margin-top:100px;
+ margin-bottom:100px;
+}
+
+.sidebar {
+ clear: both;
+ background: -webkit-gradient(linear, top right, bottom right, from(#dde), to(#fff));
+ -webkit-transition: margin 0.25s ease-in-out;
+ background-color: #eee;
+ background: -moz-linear-gradient(right, #dde, #fff);
+ border-right: 5px solid #ccd;
+ z-index: 9999999;
+ height: 100%;
+ overflow: hidden;
+ top: 0;
+ position: absolute;
+ display: block;
+ margin: 0;
+ margin-left: -400px;
+ padding: 10px 16px;
+ overflow: auto;
+ -webkit-transition: margin 0.2s ease-in-out;
+ -moz-transition: margin 0.2s ease-in-out;
+ -o-transition: margin 0.2s ease-in-out;
+}
+
+.sidebar h2 {
+ text-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px;
+ margin: 0 0 16px;
+ padding: 0;
+}
+
+.sidebar table {
+ width: 100%;
+ margin: 0;
+ padding: 0;
+ border-collapse: collapse;
+}
+
+.sidebar table caption {
+ display: none;
+}
+
+.sidebar tr {
+ margin: 2px 0;
+ border-bottom: 1px solid #ccc;
+}
+
+.sidebar th {
+ text-align: left;
+ font-weight: normal;
+ max-width: 300px;
+ overflow: hidden;
+}
+
+.sidebar tr.sub th {
+ text-indent: 20px;
+}
+
+.sidebar td {
+ text-align: right;
+ min-width: 20px;
+}
+
+.sidebar a {
+ display: block;
+ text-decoration: none;
+ border-bottom: none;
+ padding: 4px 0;
+}
+
+.sidebar tr.active {
+ background: #ff0;
+}
+
+aside {
+ display: none;
+}
+ aside.source {
+ position: absolute;
+ bottom: 35px;
+ left: 10px;
+ text-indent: 10px;
+ color: #ffffff;
+ }
+ aside.page_number {
+ position: absolute;
+ bottom: 35px;
+ right: 10px;
+ text-indent: 10px;
+ color: #ffffff;
+ }
+
+p.notes {
+ display: none;
+ padding: 10px;
+ background: #ccc;
+ color: #111;
+ border-radius: 10px;
+ -moz-border-radius: 10px;
+ -webkit-border-radius: 10px;
+}
+ div.slide p.notes {
+ font-size: 90%;
+}
+
+/* Pygments solarized theme */
+pre .hll { background-color: #002B36 }
+pre { background: #002B36; color: #93A1A1 }
+pre .c { color: #859900 } /* Comment */
+pre .err { color: #d33682; background-color: #002B36 } /* Error */
+pre .k { color: #268bd2 } /* Keyword */
+pre .l { color: #6c71c4 } /* Literal */
+pre .n { color: #93a1a1 } /* Name */
+pre .o { color: #dc322f } /* Operator */
+pre .p { color: #93a1a1 } /* Punctuation */
+pre .cm { color: #859900 } /* Comment.Multiline */
+pre .cp { color: #859900 } /* Comment.Preproc */
+pre .c1 { color: #859900 } /* Comment.Single */
+pre .cs { color: #859900 } /* Comment.Special */
+pre .ge { font-style: italic } /* Generic.Emph */
+pre .gs { font-weight: bold } /* Generic.Strong */
+pre .kc { color: #268bd2 } /* Keyword.Constant */
+pre .kd { color: #268bd2 } /* Keyword.Declaration */
+pre .kn { color: #dc322f } /* Keyword.Namespace */
+pre .kp { color: #268bd2 } /* Keyword.Pseudo */
+pre .kr { color: #268bd2 } /* Keyword.Reserved */
+pre .kt { color: #268bd2 } /* Keyword.Type */
+pre .ld { color: #b58900 } /* Literal.Date */
+pre .m { color: #6c71c4 } /* Literal.Number */
+pre .s { color: #b58900 } /* Literal.String */
+pre .na { color: #2aa198 } /* Name.Attribute */
+pre .nb { color: #93a1a1 } /* Name.Builtin */
+pre .nc { color: #2aa198 } /* Name.Class */
+pre .no { color: #268bd2 } /* Name.Constant */
+pre .nd { color: #2aa198 } /* Name.Decorator */
+pre .ni { color: #93a1a1 } /* Name.Entity */
+pre .ne { color: #2aa198 } /* Name.Exception */
+pre .nf { color: #2aa198 } /* Name.Function */
+pre .nl { color: #93a1a1 } /* Name.Label */
+pre .nn { color: #93a1a1 } /* Name.Namespace */
+pre .nx { color: #2aa198 } /* Name.Other */
+pre .py { color: #93a1a1 } /* Name.Property */
+pre .nt { color: #dc322f } /* Name.Tag */
+pre .nv { color: #93a1a1 } /* Name.Variable */
+pre .ow { color: #dc322f } /* Operator.Word */
+pre .w { color: #93a1a1 } /* Text.Whitespace */
+pre .mf { color: #6c71c4 } /* Literal.Number.Float */
+pre .mh { color: #6c71c4 } /* Literal.Number.Hex */
+pre .mi { color: #6c71c4 } /* Literal.Number.Integer */
+pre .mo { color: #6c71c4 } /* Literal.Number.Oct */
+pre .sb { color: #b58900 } /* Literal.String.Backtick */
+pre .sc { color: #b58900 } /* Literal.String.Char */
+pre .sd { color: #b58900 } /* Literal.String.Doc */
+pre .s2 { color: #b58900 } /* Literal.String.Double */
+pre .se { color: #6c71c4 } /* Literal.String.Escape */
+pre .sh { color: #b58900 } /* Literal.String.Heredoc */
+pre .si { color: #b58900 } /* Literal.String.Interpol */
+pre .sx { color: #b58900 } /* Literal.String.Other */
+pre .sr { color: #b58900 } /* Literal.String.Regex */
+pre .s1 { color: #b58900 } /* Literal.String.Single */
+pre .ss { color: #b58900 } /* Literal.String.Symbol */
+pre .bp { color: #93a1a1 } /* Name.Builtin.Pseudo */
+pre .vc { color: #93a1a1 } /* Name.Variable.Class */
+pre .vg { color: #93a1a1 } /* Name.Variable.Global */
+pre .vi { color: #93a1a1 } /* Name.Variable.Instance */
+pre .il { color: #6c71c4 } /* Literal.Number.Integer.Long */
+
+pre .lineno,
+.linenodiv pre {
+ background-color: #073642;
+ padding: 0 4px 0 15px;
+ display: inline-block;
+}
+td.linenos,
+.linenodiv pre {
+ width: 22px;
+ text-align: right;
+}
+td.code pre {
+ padding: 0 5px;
+}
+.highlighttable {
+ border-collapse: collapse;
+ width: 800px;
+}
+.highlighttable td {
+ padding: 0;
+}
+
+#blank {
+ position: absolute;
+ top: 0;
+ left: 0;
+ background-color: black;
+ width: 100%;
+ height: 100%;
+ z-index: 64;
+ display: none;
+}
+
+/* title slide */
+.slide-wrapper:first-child .slide {
+ text-align: center;
+ background: #000000 url('../imggws_title_slide.png') no-repeat top center;
+}
+.slide-wrapper:first-child header:not(:only-child) {
+ position: static;
+ padding-top: 85px;
+ color: #000000;
+ width: 770px;
+ margin: 0 auto;
+}
+.slide-wrapper:first-child section {
+ margin-top: 10px;
+ color: #000000;
+}
+.slide-wrapper:first-child .slide header:only-child h1 {
+ display: block;
+ width: auto;
+ color: #000000;
+ padding-top: 50px;
+}
+.slide-wrapper:first-child h2 {
+ font-size: 25px;
+ font-weight: normal;
+}
+
+/* fixed footer */
+#footnotes {
+ background: none repeat scroll 0 0 #3D6775;
+ border-top: 2px solid #000000;
+ bottom: 0;
+ color: #FFFFFF;
+ margin: 0;
+ padding: 0.2em 0;
+ position: fixed;
+ text-align: center;
+ width: 100%;
+}
\ No newline at end of file
diff --git a/grottworkshop/fonts/DroidSansMono.ttf b/grottworkshop/fonts/DroidSansMono.ttf
new file mode 100644
index 0000000..d604425
Binary files /dev/null and b/grottworkshop/fonts/DroidSansMono.ttf differ
diff --git a/grottworkshop/fonts/Inconsolata.otf b/grottworkshop/fonts/Inconsolata.otf
new file mode 100644
index 0000000..3488898
Binary files /dev/null and b/grottworkshop/fonts/Inconsolata.otf differ
diff --git a/grottworkshop/fonts/OpenSans-Bold.ttf b/grottworkshop/fonts/OpenSans-Bold.ttf
new file mode 100644
index 0000000..fd79d43
Binary files /dev/null and b/grottworkshop/fonts/OpenSans-Bold.ttf differ
diff --git a/grottworkshop/fonts/OpenSans-BoldItalic.ttf b/grottworkshop/fonts/OpenSans-BoldItalic.ttf
new file mode 100644
index 0000000..9bc8009
Binary files /dev/null and b/grottworkshop/fonts/OpenSans-BoldItalic.ttf differ
diff --git a/grottworkshop/fonts/OpenSans-ExtraBold.ttf b/grottworkshop/fonts/OpenSans-ExtraBold.ttf
new file mode 100644
index 0000000..21f6f84
Binary files /dev/null and b/grottworkshop/fonts/OpenSans-ExtraBold.ttf differ
diff --git a/grottworkshop/fonts/OpenSans-ExtraBoldItalic.ttf b/grottworkshop/fonts/OpenSans-ExtraBoldItalic.ttf
new file mode 100644
index 0000000..31cb688
Binary files /dev/null and b/grottworkshop/fonts/OpenSans-ExtraBoldItalic.ttf differ
diff --git a/grottworkshop/fonts/OpenSans-Italic.ttf b/grottworkshop/fonts/OpenSans-Italic.ttf
new file mode 100644
index 0000000..c90da48
Binary files /dev/null and b/grottworkshop/fonts/OpenSans-Italic.ttf differ
diff --git a/grottworkshop/fonts/OpenSans-Light.ttf b/grottworkshop/fonts/OpenSans-Light.ttf
new file mode 100644
index 0000000..0d38189
Binary files /dev/null and b/grottworkshop/fonts/OpenSans-Light.ttf differ
diff --git a/grottworkshop/fonts/OpenSans-LightItalic.ttf b/grottworkshop/fonts/OpenSans-LightItalic.ttf
new file mode 100644
index 0000000..68299c4
Binary files /dev/null and b/grottworkshop/fonts/OpenSans-LightItalic.ttf differ
diff --git a/grottworkshop/fonts/OpenSans-Regular.ttf b/grottworkshop/fonts/OpenSans-Regular.ttf
new file mode 100644
index 0000000..db43334
Binary files /dev/null and b/grottworkshop/fonts/OpenSans-Regular.ttf differ
diff --git a/grottworkshop/fonts/OpenSans-Semibold.ttf b/grottworkshop/fonts/OpenSans-Semibold.ttf
new file mode 100644
index 0000000..1a7679e
Binary files /dev/null and b/grottworkshop/fonts/OpenSans-Semibold.ttf differ
diff --git a/grottworkshop/fonts/OpenSans-SemiboldItalic.ttf b/grottworkshop/fonts/OpenSans-SemiboldItalic.ttf
new file mode 100644
index 0000000..59b6d16
Binary files /dev/null and b/grottworkshop/fonts/OpenSans-SemiboldItalic.ttf differ
diff --git a/grottworkshop/grottworkshop.cfg b/grottworkshop/grottworkshop.cfg
new file mode 100644
index 0000000..8ba9c5c
--- /dev/null
+++ b/grottworkshop/grottworkshop.cfg
@@ -0,0 +1,14 @@
+[landslide]
+source = slides.md
+
+# update the theme path with an absolute path,
+# or relative path from where you are running the landslide command
+theme = ../grottworkshop
+# css=
+# js=
+# to load user defined css and js files beyond what the theme provides
+destination = index.html
+embed = True
+relative = True
+copy-theme = True
+linenos = table
\ No newline at end of file
diff --git a/grottworkshop/img/gws_slide_logo.png b/grottworkshop/img/gws_slide_logo.png
new file mode 100644
index 0000000..a84dd91
Binary files /dev/null and b/grottworkshop/img/gws_slide_logo.png differ
diff --git a/grottworkshop/img/gws_title_slide.png b/grottworkshop/img/gws_title_slide.png
new file mode 100644
index 0000000..a1f38aa
Binary files /dev/null and b/grottworkshop/img/gws_title_slide.png differ
diff --git a/grottworkshop/js/slides.js b/grottworkshop/js/slides.js
new file mode 100644
index 0000000..cb8608b
--- /dev/null
+++ b/grottworkshop/js/slides.js
@@ -0,0 +1,578 @@
+function main() {
+ // Since we don't have the fallback of attachEvent and
+ // other IE only stuff we won't try to run JS for IE.
+ // It will run though when using Google Chrome Frame
+ if (document.all) { return; }
+
+ var currentSlideNo;
+ var notesOn = false;
+ var expanded = false;
+ var hiddenContext = false;
+ var blanked = false;
+ var slides = document.getElementsByClassName('slide');
+ var touchStartX = 0;
+ var spaces = /\s+/, a1 = [''];
+ var tocOpened = false;
+ var helpOpened = false;
+ var overviewActive = false;
+ var modifierKeyDown = false;
+ var scale = 1;
+ var showingPresenterView = false;
+ var presenterViewWin = null;
+ var isPresenterView = false;
+
+ var str2array = function(s) {
+ if (typeof s == 'string' || s instanceof String) {
+ if (s.indexOf(' ') < 0) {
+ a1[0] = s;
+ return a1;
+ } else {
+ return s.split(spaces);
+ }
+ }
+ return s;
+ };
+
+ var trim = function(str) {
+ return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
+ };
+
+ var addClass = function(node, classStr) {
+ classStr = str2array(classStr);
+ var cls = ' ' + node.className + ' ';
+ for (var i = 0, len = classStr.length, c; i < len; ++i) {
+ c = classStr[i];
+ if (c && cls.indexOf(' ' + c + ' ') < 0) {
+ cls += c + ' ';
+ }
+ }
+ node.className = trim(cls);
+ };
+
+ var removeClass = function(node, classStr) {
+ var cls;
+ if (!node) {
+ throw 'no node provided';
+ }
+ if (classStr !== undefined) {
+ classStr = str2array(classStr);
+ cls = ' ' + node.className + ' ';
+ for (var i = 0, len = classStr.length; i < len; ++i) {
+ cls = cls.replace(' ' + classStr[i] + ' ', ' ');
+ }
+ cls = trim(cls);
+ } else {
+ cls = '';
+ }
+ if (node.className != cls) {
+ node.className = cls;
+ }
+ };
+
+ var getSlideEl = function(slideNo) {
+ if (slideNo > 0) {
+ return slides[slideNo - 1];
+ } else {
+ return null;
+ }
+ };
+
+ var getSlideTitle = function(slideNo) {
+ var el = getSlideEl(slideNo);
+ if (el) {
+ var headers = el.getElementsByTagName('header');
+ if (headers.length > 0) {
+ return el.getElementsByTagName('header')[0].innerText;
+ }
+ }
+ return null;
+ };
+
+ var getSlidePresenterNote = function(slideNo) {
+ var el = getSlideEl(slideNo);
+ if (el) {
+ var n = el.getElementsByClassName('presenter_notes');
+ if (n.length > 0) {
+ return n[0];
+ }
+ }
+ return null;
+ };
+
+ var changeSlideElClass = function(slideNo, className) {
+ var el = getSlideEl(slideNo);
+ if (el) {
+ removeClass(el, 'far-past past current future far-future');
+ addClass(el, className);
+ }
+ };
+
+ var updateSlideClasses = function(updateOther) {
+ window.location.hash = (isPresenterView ? "presenter" : "slide") + currentSlideNo;
+
+ for (var i=1; i 1) {
+ currentSlideNo--;
+ }
+ updateSlideClasses(true);
+ };
+
+ var showNotes = function() {
+ var notes = getSlideEl(currentSlideNo).getElementsByClassName('notes');
+ for (var i = 0, len = notes.length; i < len; i++) {
+ notes.item(i).style.display = (notesOn) ? 'none':'block';
+ }
+ notesOn = !notesOn;
+ };
+
+ var showSlideNumbers = function() {
+ var asides = document.getElementsByClassName('page_number');
+ var hidden = asides[0].style.display != 'block';
+ for (var i = 0; i < asides.length; i++) {
+ asides.item(i).style.display = hidden ? 'block' : 'none';
+ }
+ };
+
+ var showSlideSources = function() {
+ var asides = document.getElementsByClassName('source');
+ var hidden = asides[0].style.display != 'block';
+ for (var i = 0; i < asides.length; i++) {
+ asides.item(i).style.display = hidden ? 'block' : 'none';
+ }
+ };
+
+ var showToc = function() {
+ if (helpOpened) {
+ showHelp();
+ }
+ var toc = document.getElementById('toc');
+ if (toc) {
+ toc.style.marginLeft = tocOpened ? '-' + (toc.clientWidth + 20) + 'px' : '0px';
+ tocOpened = !tocOpened;
+ }
+ updateOverview();
+ };
+
+ var showHelp = function() {
+ if (tocOpened) {
+ showToc();
+ }
+
+ var help = document.getElementById('help');
+
+ if (help) {
+ help.style.marginLeft = helpOpened ? '-' + (help.clientWidth + 20) + 'px' : '0px';
+ helpOpened = !helpOpened;
+ }
+ };
+
+ var showPresenterView = function() {
+ if (isPresenterView) { return; }
+
+ if (showingPresenterView) {
+ presenterViewWin.close();
+ presenterViewWin = null;
+ showingPresenterView = false;
+ } else {
+ presenterViewWin = open(window.location.pathname + "#presenter" + currentSlideNo, 'presenter_notes',
+ 'directories=no,location=no,toolbar=no,menubar=no,copyhistory=no');
+ showingPresenterView = true;
+ }
+ };
+
+ var switch3D = function() {
+ if (document.body.className.indexOf('three-d') == -1) {
+ document.getElementsByClassName('presentation')[0].style.webkitPerspective = '1000px';
+ document.body.className += ' three-d';
+ } else {
+ window.setTimeout('document.getElementsByClassName(\'presentation\')[0].style.webkitPerspective = \'0\';', 2000);
+ document.body.className = document.body.className.replace(/three-d/, '');
+ }
+ };
+
+ var toggleOverview = function() {
+ if (!overviewActive) {
+ addClass(document.body, 'expose');
+ overviewActive = true;
+ setScale(1);
+ } else {
+ removeClass(document.body, 'expose');
+ overviewActive = false;
+ if (expanded) {
+ setScale(scale); // restore scale
+ }
+ }
+ processContext();
+ updateOverview();
+ };
+
+ var updateOverview = function() {
+ try {
+ var presentation = document.getElementsByClassName('presentation')[0];
+ } catch (e) {
+ return;
+ }
+
+ if (isPresenterView) {
+ var action = overviewActive ? removeClass : addClass;
+ action(document.body, 'presenter_view');
+ }
+
+ var toc = document.getElementById('toc');
+
+ if (!toc) {
+ return;
+ }
+
+ if (!tocOpened || !overviewActive) {
+ presentation.style.marginLeft = '0px';
+ presentation.style.width = '100%';
+ } else {
+ presentation.style.marginLeft = toc.clientWidth + 'px';
+ presentation.style.width = (presentation.clientWidth - toc.clientWidth) + 'px';
+ }
+ };
+
+ var computeScale = function() {
+ var cSlide = document.getElementsByClassName('current')[0];
+ var sx = cSlide.clientWidth / window.innerWidth;
+ var sy = cSlide.clientHeight / window.innerHeight;
+ return 1 / Math.max(sx, sy);
+ };
+
+ var setScale = function(scale) {
+ var presentation = document.getElementsByClassName('slides')[0];
+ var transform = 'scale(' + scale + ')';
+ presentation.style.MozTransform = transform;
+ presentation.style.WebkitTransform = transform;
+ presentation.style.OTransform = transform;
+ presentation.style.msTransform = transform;
+ presentation.style.transform = transform;
+ };
+
+ var expandSlides = function() {
+ if (overviewActive) {
+ return;
+ }
+ if (expanded) {
+ setScale(1);
+ expanded = false;
+ } else {
+ scale = computeScale();
+ setScale(scale);
+ expanded = true;
+ }
+ };
+
+ var showContext = function() {
+ try {
+ var presentation = document.getElementsByClassName('slides')[0];
+ removeClass(presentation, 'nocontext');
+ } catch (e) {}
+ };
+
+ var hideContext = function() {
+ try {
+ var presentation = document.getElementsByClassName('slides')[0];
+ addClass(presentation, 'nocontext');
+ } catch (e) {}
+ };
+
+ var processContext = function() {
+ if (hiddenContext) {
+ hideContext();
+ } else {
+ showContext();
+ }
+ };
+
+ var toggleContext = function() {
+ hiddenContext = !hiddenContext;
+ processContext();
+ };
+
+ var toggleBlank = function() {
+ blank_elem = document.getElementById('blank');
+
+ blank_elem.style.display = blanked ? 'none' : 'block';
+
+ blanked = !blanked;
+ };
+
+ var isModifierKey = function(keyCode) {
+ switch (keyCode) {
+ case 16: // shift
+ case 17: // ctrl
+ case 18: // alt
+ case 91: // command
+ return true;
+ break;
+ default:
+ return false;
+ break;
+ }
+ };
+
+ var checkModifierKeyUp = function(event) {
+ if (isModifierKey(event.keyCode)) {
+ modifierKeyDown = false;
+ }
+ };
+
+ var checkModifierKeyDown = function(event) {
+ if (isModifierKey(event.keyCode)) {
+ modifierKeyDown = true;
+ }
+ };
+
+ var handleBodyKeyDown = function(event) {
+ switch (event.keyCode) {
+ case 13: // Enter
+ if (overviewActive) {
+ toggleOverview();
+ }
+ break;
+ case 27: // ESC
+ toggleOverview();
+ break;
+ case 37: // left arrow
+ case 33: // page up
+ prevSlide();
+ break;
+ case 39: // right arrow
+ case 32: // space
+ case 34: // page down
+ nextSlide();
+ break;
+ case 50: // 2
+ if (!modifierKeyDown) {
+ showNotes();
+ }
+ break;
+ case 51: // 3
+ if (!modifierKeyDown && !overviewActive) {
+ switch3D();
+ }
+ break;
+ case 190: // .
+ case 48: // 0
+ case 66: // b
+ if (!modifierKeyDown && !overviewActive) {
+ toggleBlank();
+ }
+ break;
+ case 67: // c
+ if (!modifierKeyDown && !overviewActive) {
+ toggleContext();
+ }
+ break;
+ case 69: // e
+ if (!modifierKeyDown && !overviewActive) {
+ expandSlides();
+ }
+ break;
+ case 72: // h
+ showHelp();
+ break;
+ case 78: // n
+ if (!modifierKeyDown && !overviewActive) {
+ showSlideNumbers();
+ }
+ break;
+ case 80: // p
+ if (!modifierKeyDown && !overviewActive) {
+ showPresenterView();
+ }
+ break;
+ case 83: // s
+ if (!modifierKeyDown && !overviewActive) {
+ showSlideSources();
+ }
+ break;
+ case 84: // t
+ showToc();
+ break;
+ }
+ };
+
+ var handleWheel = function(event) {
+ if (tocOpened || helpOpened || overviewActive) {
+ return;
+ }
+
+ var delta = 0;
+
+ if (!event) {
+ event = window.event;
+ }
+
+ if (event.wheelDelta) {
+ delta = event.wheelDelta/120;
+ if (window.opera) delta = -delta;
+ } else if (event.detail) {
+ delta = -event.detail/3;
+ }
+
+ if (delta && delta <0) {
+ nextSlide();
+ } else if (delta) {
+ prevSlide();
+ }
+ };
+
+ var addSlideClickListeners = function() {
+ for (var i=0; i < slides.length; i++) {
+ var slide = slides.item(i);
+ slide.num = i + 1;
+ slide.addEventListener('click', function(e) {
+ if (overviewActive) {
+ currentSlideNo = this.num;
+ toggleOverview();
+ updateSlideClasses(true);
+ e.preventDefault();
+ }
+ return false;
+ }, true);
+ }
+ };
+
+ var addRemoteWindowControls = function() {
+ window.addEventListener("message", function(e) {
+ if (e.data.indexOf("slide#") != -1) {
+ currentSlideNo = Number(e.data.replace('slide#', ''));
+ updateSlideClasses(false);
+ }
+ }, false);
+ };
+
+ var addTouchListeners = function() {
+ document.addEventListener('touchstart', function(e) {
+ touchStartX = e.touches[0].pageX;
+ }, false);
+ document.addEventListener('touchend', function(e) {
+ var pixelsMoved = touchStartX - e.changedTouches[0].pageX;
+ var SWIPE_SIZE = 150;
+ if (pixelsMoved > SWIPE_SIZE) {
+ nextSlide();
+ }
+ else if (pixelsMoved < -SWIPE_SIZE) {
+ prevSlide();
+ }
+ }, false);
+ };
+
+ var addTocLinksListeners = function() {
+ var toc = document.getElementById('toc');
+ if (toc) {
+ var tocLinks = toc.getElementsByTagName('a');
+ for (var i=0; i < tocLinks.length; i++) {
+ tocLinks.item(i).addEventListener('click', function(e) {
+ currentSlideNo = Number(this.attributes['href'].value.replace('#slide', ''));
+ updateSlideClasses(true);
+ e.preventDefault();
+ }, true);
+ }
+ }
+ };
+
+ // initialize
+
+ (function() {
+ if (window.location.hash == "") {
+ currentSlideNo = 1;
+ } else if (window.location.hash.indexOf("#presenter") != -1) {
+ currentSlideNo = Number(window.location.hash.replace('#presenter', ''));
+ isPresenterView = true;
+ showingPresenterView = true;
+ presenterViewWin = window;
+ addClass(document.body, 'presenter_view');
+ } else {
+ currentSlideNo = Number(window.location.hash.replace('#slide', ''));
+ }
+
+ document.addEventListener('keyup', checkModifierKeyUp, false);
+ document.addEventListener('keydown', handleBodyKeyDown, false);
+ document.addEventListener('keydown', checkModifierKeyDown, false);
+ document.addEventListener('DOMMouseScroll', handleWheel, false);
+
+ window.onmousewheel = document.onmousewheel = handleWheel;
+ window.onresize = expandSlides;
+
+ for (var i = 0, el; el = slides[i]; i++) {
+ addClass(el, 'slide far-future');
+ }
+ updateSlideClasses(false);
+
+ // add support for finger events (filter it by property detection?)
+ addTouchListeners();
+
+ addTocLinksListeners();
+
+ addSlideClickListeners();
+
+ addRemoteWindowControls();
+ })();
+}
\ No newline at end of file
diff --git a/gws_slide_logo.png b/gws_slide_logo.png
new file mode 100644
index 0000000..a84dd91
Binary files /dev/null and b/gws_slide_logo.png differ
diff --git a/landslide.png b/landslide.png
new file mode 100644
index 0000000..8442e76
Binary files /dev/null and b/landslide.png differ
diff --git a/me-icon.png b/me-icon.png
new file mode 100644
index 0000000..48fe1a5
Binary files /dev/null and b/me-icon.png differ
diff --git a/readme.md b/readme.md
index 871b5a5..d46dd3b 100644
--- a/readme.md
+++ b/readme.md
@@ -1,19 +1,29 @@
LandSlideThemes
---
+![landSlide](https://raw.github.com/shareme/LandSlideThemes/master/landslide.png)
+
# Introduction
-LandSlideThemes for html5 slides gneration using LandSlide.
+LandSlideThemes for html5 slides generation using LandSlide.
# License
-[Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0.html)
+
+
+
# Use
# Credits
-## Project Lead
-[Fred Grott](http://about.me/fredgrott)
+# Created By
+
+
+
+
+
+
+